ファイル読み書き

PSPではGBAなどとは違い汎用外部メディアであるメモリースティック(以下MS)を使用できます。
最近は2GのMSも発売されているので,これだけあればゲームでは容量はほぼ使い放題ですね。^^

と言う事でこれを活用して色々な動作をさせる方法を説明します。

まず,PSPはファイルシステムを持っています。
これはWindowsでマイコンピュータを開いてそれぞれのファイルを見れるように
PSPでもいくつかのファイルでデータを管理しています。

c:/windowsと言うようにPSPもドライブ\フォルダ名の管理となっています。
例えばms0:/psp/game/sampleとすると
MS内のpspフォルダのgameフォルダのsampleフォルダを指定している事になりますね。


◆前準備

 startup.sに今回も記述を追加してください。

STUB_START "IoFileMgrForUser",0x40010000,0x000D0005
 STUB_FUNC 0xb29ddf9c,sceIoDopen
 STUB_FUNC 0xe3eb004c,sceIoDread
 STUB_FUNC 0xeb092469,sceIoDclose
 STUB_FUNC 0x6a638d83,sceIoRead
 STUB_FUNC 0x42ec03ac,sceIoWrite
 STUB_FUNC 0x27eb27b8,sceIoLseek
 STUB_FUNC 0x810c4bc3,sceIoClose
 STUB_FUNC 0x109f50bc,sceIoOpen
 STUB_FUNC 0xF27A9C51,sceIoRemove
 STUB_FUNC 0x6A70004,sceIoMkdir
 STUB_FUNC 0x1117C65F,sceIoRmdir
 STUB_FUNC 0x54F5FB11,sceIoDevctl
 STUB_FUNC 0x779103A0,sceIoRename
STUB_END


 まだ使用法がはっきりとわかっていない命令もありますが
 一通りあげると以上のように用意されているようです。

おなじく定数もわかりやすく定義しておきます。
 #define O_RDONLY 0x0001 //読み込み専用
 #define O_WRONLY 0x0002 //書き込み専用
 #define O_RDWR 0x0003 //読み書き
 #define O_NBLOCK 0x0010
 #define O_APPEND 0x0100
 #define O_CREAT 0x0200 //新規作成
 #define O_TRUNC 0x0400
 #define O_NOWAIT 0x8000



◆ファイルのオープン

 まずは操作する為にファイルを開く命令が必要です。
 sceIoOpen("ms0:/psp/game/sample7/test.d",O_CREAT|O_WRONLY|O_TRUNC, 0777);

 この場合はms0:/psp/game/sample7フォルダのtest.dのファイルを書き込み専用で開くと言う事になります。
 O_CREATを付ける事によりファイルが無ければ新規作成されます。
 最後の777はどうやらUNIX等であるファイル権限の設定のようですね。


◆ファイルの書き込み

 int fd;//通常のC言語のファイルポインタ代わりです
 sceIoWrite(fd, &c, sizeof(c));

 後の引数はCの標準ライブラリにあるfwriteとほぼ同じですね。
 書き込む変数のアドレスと書き込む容量を記入してください。

◆ファイルの読み込み

 fd = sceIoOpen("ms0:/psp/game/sample7/test.d",O_RDONLY|O_NOWAIT,0644);
 sceIoRead(fd, &c, sizeof(c));

 こちらも書式はfreadとほぼ同等です。
 C言語をまったく知らない人が手を出すとも考えられないので
 関数の呼び出し方さえわかれば大丈夫ですね?^^;

◆ファイルを閉じる
 sceIoClose(fd);
 使い終わったらしっかりと閉じておきましょう。
 そうしないと何かと不都合が起きる可能性が高いので要注意です。