PONOS Advent Calendar 2022 22日目です。
昨日は@MilayYadokariさんのUnityでお手軽にスクロール実装!Simple Scroll-Snapの紹介!でした。
NESエミュレータを作る-CPUちょっと理解編の続きです。
今回はキャラクターROMの中身を見ていきます。
※市販されているゲームを使う場合は私的利用の範囲でやりましょう。
この記事の目標
キャラクターROMの仕様
キャラクターROMにはゲームの背景やキャラクターに使われる画像、スプライトの情報が入っています。
スプライトのサイズは基本的に88(816の場合もあるらしい)です。
16Byteでスプライト一つ、1ドットが2bitで表現されます。
これが256個分あり背景用とキャラクター用合わせて512個のスプライトで画面が描画されます。
例えばHello, World!のHにあたるスプライトは前回切り出したキャラクターROMの73番目に入っています。
character_rom[0x0480] # 0xe7
character_rom[0x0481] # 0xe7
character_rom[0x0482] # 0xe7
character_rom[0x0483] # 0xff
character_rom[0x0484] # 0xff
character_rom[0x0485] # 0xe7
character_rom[0x0486] # 0xe7
character_rom[0x0487] # 0xe7
character_rom[0x0488] # 0xc6
character_rom[0x0489] # 0xc6
character_rom[0x048a] # 0xc6
character_rom[0x048b] # 0xfe
character_rom[0x048c] # 0xc6
character_rom[0x048d] # 0xc6
character_rom[0x048e] # 0xc6
character_rom[0x048f] # 0x00
前半8Byte上位ビット後半8Byteを下位ビットとするとスプライトの完成です!
このように一つのドットは0〜3の数字で表され、それぞれにパレットの色が割り当てられます。
0は背景色になるので一つのスプライトは最大3色まで使えることになります。
すでにROMダンパーを持っているならいろんなゲームのスプライトを読み出して見てみましょう!
余談
初代ドラクエといえば容量問題でカタカナを全部入れていないため「ア」がなく、世界の名前「アレフガルド」がゲーム内で出てこないのは有名な話です。
ファミコンでは文字もスプライトが使われるのでキャラクターROMを見てみると本当にカタカナの「ア」がないのが確認できます。
さらにファミコンには同じ画面に表示できるスプライトは512種類のみという制約があるため、
別パターンのスプライトを用意しておいてシーンに応じてバンク切り替えというしくみで使うスプライトを切り替えていました。
初期の作品はバンク切り替えを使わずに512種類の1パターンしかスプライトが用意されていないことが多いのですが、初代ドラクエには2パターン目のスプライトが用意されています。
なにやら文字が重なったようになっています。
ここで1パターン目と同じような部分に使われている色を背景色同じにしてみましょう。
別の文字が浮かび上がってきました。
タイトル画面などではこっちのパターンに切り替えて使っているのでしょう。
ちなみに残りの部分には変身した竜王のスプライトがみっちり詰まっています。
やりくりがすごい。
おわりに
NESエミュレータを作るというタイトルで初めましたが終わりませんでした。
今後も進捗があれば続きを書いていくと思います。たぶん。
明日は@bluenova1221さんです。