FCEU FCMファイルフォーマット ============================ TASVideos資料: http://tasvideos.org/FCM.html FCEUはムービー出力時に初期ステートと入力データのオフセットを4Byte境界に揃え ている(スキマは0でパディングする。FCEUI_SaveMovie() 参照)。このアラインメン トを行っていなくてもFCEUでの再生には支障ないようだが、TASVideosの資料でもヘッ ダは最低56Byteとなっているので、自作ツールなどでFCMを出力する際は一応同様の 処理を行っておくのが無難だろう。 ヘッダ ------ オフセット 0x08 のフラグ: bit1 ムービー開始点 (0:ステート, 1:Reset/Power) bit2 NTSC/PAL (0:NTSC, 1:PAL) bit4 MOVIE_FLAG_NOSYNCHACK (新しいFCEUではセットされている。古いムービーとの互換性に関係?) その他のbitは全て0で埋める。なお、FCEUの内部ではbit3をPower-basedフラグと して使っているが、ムービーファイルに書き出す際にはこのbitはクリアされ、 Reset-basedフラグに変換される(つまり、bit1に反映されるということ)。 初期ステート ------------ FCMは初期ステートを格納するようになっており、電源投入から開始するムービーで あってもこのステートがロードされる。しかし、初期ステートとして以下の16Byteの 文字列を用いることにより、これを無効化できる(FCMFixはこの方法で初期ステート を無効化している。一応FCEUのソースをざっと見てみたが問題はないと思われる): 46 43 4D "FCS" 00 旧バージョン番号0 00 00 00 00 ヘッダを除いたサイズ0 00 00 00 00 新バージョン番号0 00 00 00 00 予約領域。全て0で埋める いったん初期ステートを無効化すれば、その後追記を行ってもそのままになる。 なお、FCEUは FCEUSS_LoadFP() において問答無用で16Byteの読み込みを行っている ため、ステート部が16Byte未満だとまずいと思われる。 FCEUはFCSヘッダに正しいサイズを書き込まない(FCSファイルフォーマット参照)ので、 初期ステートを正しく切り出すのは少々面倒だと思われる(単純に入力データの直前 までを切り出す方法だと、パディングが存在する場合FCSファイルの末尾にゴミが付 いてしまう。大抵はFCEU上でのロードには支障ないと思われるが)。 入力データ ---------- が一つの単位。updateは1Byte, deltaは0~3Byte。 の構造: 76543210 x------- 0:パッド入力トグル, 1:コマンド -xx----- 後続のdeltaのByte数 ---xxxxx updateデータ(解釈はbit7に依存) updateデータ(パッド入力): 0 A 1 B 2 S 3 T 4 U 5 D 6 L 7 R updateデータ(コマンド): 0 NOP 1 Reset 2 Power 24 FDS Insert/Eject 26 FDS Select # FCEU 0.98.28 はFDS Insert/Ejectの両方にコマンド24を用いる。TASVideosの # 資料では25がFDS Ejectとなっているが誤り。 # VS Systemについてはよく知らないので保留。TASVideosの資料参照。 1F内に複数の が存在する場合、FCEU 0.98.28 ではまず最初にコマンドを、 次にパッド入力をABSTUDLRの順でエンコードする模様。なお、1F内に複数のコマンド を入れることも一応可能なようだが、FM2フォーマットではこれはできないようになっ ているので、避けた方がいいだろう。 ※FDSのTASにおいて、同一フレームでInsertとSelectを実行しないと遅くなるケース があるかどうかは未調査 はフレーム数。この分だけフレームを進めた後に の入力が適用さ れる。 が存在しない場合は現在のフレームに対して を適用する。 ステートベースでないムービーの場合、入力データの最初のByteは 0x81 または 0x82 であるべき(ResetまたはPowerコマンドを最初に実行する必要があるため)。厳 密に言えばこれは入力データとみなすべきではないと思われる(FCEUXとの整合性を考 慮)。 最終フレームでコマンド0(NOP)が挿入されるようになっている。実際上はこれをEOF マーカとみなして問題ない(TASVideosの資料では、現在のdeltaがオーバーフローし そうになったときにダミーコマンド0が挿入される、とあるが、deltaは最大3Byteで あり、2^24Fもの間入力が変化しないTASなど考えられないので、これは無視していい だろう)。 入力データはヘッダに書かれているフレームで終了しているとは限らない(recording 中に到達した最大フレームまでの入力が消されずに残っている)。つまり、ファイル 末尾にはゴミが付いている可能性がある。