FCEU/FCEUX FCSファイルフォーマット ================================== 参考資料: FCEU/FCEUX の documentation/ ディレクトリ内の fcs.txt 特に断らない限りリトルエンディアンが使われる。 メインヘッダは16Byte: 0x00 char[3] "FCS" 0x03 U8 バージョン番号 0x04 U32 ファイルサイズ-16 0x08 U32 新バージョン番号 0x0C U8[4] 予約領域(FCEUXの場合、圧縮済みサイズ) バージョン番号が 0xFF の場合、新バージョン番号の値が使われる。 新バージョン番号はFCEUのバージョンの10進数表記(例えば、0.98.10 ならば 9810) FCEU 0.98.28 で生成したFCSファイルはバージョン番号が 0xFF FCEUX 2.0.3 で生成したFCSファイルはバージョン番号が 0x58 FCEU ---- state.c の FCEUSS_LoadFP() がステートロード処理。 新バージョン番号を使用する。 なお、バージョン番号が 0xFF でない場合、(バージョン番号)*100 を新バージョン 番号とする。 FCEU 0.98.28 で生成したFCSファイルでは新バージョン番号が 9828 (10進)となる。 メインヘッダの予約領域(オフセット 0x0C 以降)は使われていない(全て0で埋めるこ と)。 FCEUX ----- state.cpp の FCEUSS_LoadFP() がステートロード処理。 FCEUXのFCSファイルはシグネチャが "FCSX" となる(従来のFCSとして見た場合、バー ジョン番号は 0x58)。こうなっていないものは古い(FCEUの)セーブステートとして別 に扱われる(FCEUSS_LoadFP_old())。 FCEUと同様、メインヘッダのオフセット 0x08 からの U32 値が新バージョン番号と なる。FCEUX 2.0.3 では 20003 (10進)。 FCEUXのFCSファイルは圧縮に対応しており、圧縮されている場合はメインヘッダのオ フセット 0x0C からの U32 値に圧縮済みサイズが書き込まれている(実際のファイル サイズ-16)。圧縮されていない場合、0xFFFFFFFF (-1) が書き込まれている。 なお、圧縮FCSの場合、メインヘッダのオフセット 0x04 に記述されるファイルサイ ズは圧縮部を展開したFCSのファイルサイズ - 16 となる。 ステート本体 ------------ セクション番号はFCEU/FCEUX共通。FCEUのドキュメントに記述されているものにいく つか追加されている。 1 CPU 2 CPUC 3 PPU 4 CTRL 5 SND 6 MOV6 7 MOV7 8 XBB # XBackBuf 16 EXTRA FCEUのドキュメントを見るとセクションサイズはセクションヘッダの分も含むとして いるが、これは誤り。セクションヘッダを除いた分のサイズとなる。 一部のセクションはサブセクション形式ではなく、1つのデータの塊が格納されてい る。セクション 7(MOV7), 8(XBB) がこれに該当する。 その他 ------ FCEUにはバグがあり、一部のゲーム(SMB1など)ではヘッダ部のデータサイズに本来よ り小さい値が書き込まれる。これは WriteStateChunk() 内で空セクションを書き込 んだ際、セクションヘッダを含めたセクションサイズを0として返しているため。 FCEUXでは修正されている。 上記のバグのため、FCEU用のFCSファイルの終端を検出するのは少々面倒(FCMから切 り出されたFCSである可能性を考慮すると、単純にEOFイコールFCSの終端と考えるわ けにもいかない)。