はじめに
※ 初投稿かつ完全に自分のメモ的な投稿なので、不正確であったり、わかりにくかったりすると思いますがお許しください。
3DS等のバーチャルコンソールからダンプできるファミコンのROMは "TNES" というフォーマットになっており、エミュレータ等ではこの形式を読み込むことはできません。
ちなみにファミコンのROMファイルにおいて標準的なフォーマットは "iNES" というもの。TNESとiNESの差異はおそらくヘッダのみなので、ダンプしたROMの先頭をバイナリエディタなりで書き換えてやればエミュレータなどでも起動することができます。
参考資料・事前に読むべき資料
ヘッダの構造に関する情報は以下のサイトから入手しました。
iNESヘッダを書く
iNESフォーマットのヘッダの大きさは16バイトになっています。
まず、0x00から始まる4バイトは、"4E45531A"です。これは"NESの文字列+EOFコード"です。
0x04はPRG-ROMのサイズを16KB単位で表した値です。PRG-ROMのサイズはTNESヘッダの0x05に8KB単位で表されているので、これの半分の値を入れてあげればいいです。
0x05はCHR-ROMのサイズを8KB単位で表した値です。この値はTNESヘッダの0x06と等しいです。
0x06は少し複雑です。
先頭4ビットにiNES Mapperの値(このサイトのTNES MapperとiNES Mapperの対応表を参照)が入り、続く3ビットには順番に、
- TNESヘッダの0x09の値
- 0
- TNESヘッダの0x09の値
が入ります。
最後の1ビットには、TNESヘッダの0x08の値が00または01の場合は0、02の場合は1が入ります。
0x07から0x0Fまでは0で埋めておいておそらく大丈夫だと思います。
このiNESヘッダでバーチャルコンソールからダンプしたTNESフォーマットのROMの先頭16バイトを上書きしてあげればiNESフォーマットのROMになるはずです。