とりあえず調べた結果を箇条書き…。Windows 用のバイナリとソースコードをまとめた物はこちらへ。
ROFS 形式ですが、ファイルの先頭から 0x1800 バイトを消して .iso などの拡張子に変更した後、 daemon tools などで mount すると普通にファイルを見ることが出来ます。調べたりしたの意味ないですな。
先頭から 0x1800 が拡張されたヘッダで、あとは ISO9660 なファイルシステムで保存されているようです。
下のメモはむなしいのでそのまま残しておきます…。
ROFS (CVM) file format memo B = byte(8bit) W = word(16bit) L = long word(32bit) -- 0x0000-0xb7ff - ROFS version - GAME TITLE, PUBLISHER_NAME etc. offset 0xb800 1W : first data length = A 1L : start address START(little endian) 1L : start address START(big endian) 1L : FAT SIZE (little endian) 1L : FAT SIZE (big endian) 1B : 0x68 ?? 1B : data length X XB : ?? (date?) 4B : 01 00 00 01 ?? 2B : 01 00 or 01 01 01 01 だったら FAT SIZE 関連のデータは終了? 1W : next data length = B ここまでのすべてのbyte数が A になる。次に B Byte を読み込んで 処理を行う。 ただし、次に読み込む data に関しては A と全く同じ内容になって いるので、B の data に関しての意味は良く分からない。確認用? -- offset 0xb800 + A + B 1W : data length C :DATA FIRST 1L : start address START(little endian) 1L : start address START(big endian) FILE start address = 0x800*START + 0x1800 1L : file size (little endian) 1L : file size (big endian) 1B : 0x68 ?? 1B : data length Y YB : ?? (date?) 4B : 01 00 00 01 ?? 1B : file name length Z ZB : file name 2B : 3B 31 (flag?) 0 fill が行われる last 1W : 次の data の data length D 0x0000 の場合、次のデータの長さは合わせ込み(?)されたところにある。 0x00 以外のデータが出てくるまで探す必要がある。 ここまでのすべての byte 数が C になる。次に D Byte を読み込んで 処理を行う。ただし、合わせ込み(?)が行われた場合は data length は 合わなくなる。 あとは DATA FIRST に戻って FAT SIZE + 0x1800 まで処理を繰り返す。