ファミコン(FC)では、ゲーム画面を構成する最小単位として、タイル(tile)と呼ばれる8×8ドットの小さなグラフィックブロックが使われています。マップ、キャラクター、HUD、テキストなど、あらゆるゲーム要素は、このタイルを複数組み合わせることで表現されています。
この8×8ドットのタイルは、本質的には8×8の行列であり、各要素が1ピクセルに対応します。ROM上では、1つのタイルは2枚の8×8ビットのビットプレーンで構成され、合計16バイトの容量を占めます。
mario_face_bytes = 'c0 f8 40 40 20 78 00 c0 00 00 e0 f8 fc f8 f0 c0'
0xc0 [1 1 0 0 0 0 0 0] 0x00 [0 0 0 0 0 0 0 0]
0xf8 [1 1 1 1 1 0 0 0] 0x00 [0 0 0 0 0 0 0 0]
0x40 [0 1 0 0 0 0 0 0] 0xe0 [1 1 1 0 0 0 0 0]
0x40 [0 1 0 0 0 0 0 0] 0xf8 [1 1 1 1 1 0 0 0]
0x20 [0 0 1 0 0 0 0 0] 0xfc [1 1 1 1 1 1 0 0]
0x78 [0 1 1 1 1 0 0 0] 0xf8 [1 1 1 1 1 0 0 0]
0x00 [0 0 0 0 0 0 0 0] 0xf0 [1 1 1 1 0 0 0 0]
0xc0 [1 1 0 0 0 0 0 0] 0xc0 [1 1 0 0 0 0 0 0]
この2つのビットプレーンは、「後の平面を2倍して前の平面に加える」というルールに従って合成され、最終的に0〜3の値を持つ4値の行列に変換されます。この数値はそれぞれ、対応するピクセルの色を表します。
[2 2 0 0 0 0 0 0]
[2 2 2 2 2 0 0 0]
[1 3 1 0 0 0 0 0]
[1 3 1 1 1 0 0 0]
[1 1 3 1 1 1 0 0]
[1 3 3 3 3 0 0 0]
[1 1 1 1 0 0 0 0]
[3 3 0 0 0 0 0 0]
今回は、いわゆるレゴ風の組み立てブロックを使って、FCのタイル描画処理を実際に手で再現してみました。本動画は、そのProof of Concept(PoC)としての試みになります。
……とはいえ、7行目の前半でうっかり色を間違えて配置してしまいました。こうしたルール通りに機械的に進める作業は、やはりコンピューターのほうが得意ですね。
ちなみに、この1×1サイズのブロックは回転対称の形をしているため、わずかに角度がずれただけでも並びが歪んで見えてしまいます。几帳面な人にはちょっとしたストレスかもしれません。