第3章 PPU
Picture Processing Unit
ファミコンで描画を行うのは、PPU(Picture Processing Unit)です。PPUは6502とは別のメモリ空間(VRAM)を持ち、
背景やスプライトの描画を行います。PPUは6502とは独立して非同期に画面描画を行います。
6502がスプライト描画のレジスタ書き込みを行っても、画面にすぐスプライトが描画されるわけではありません。
6502からPPUを操作するには、PPUコントロールレジスタに値を設定します。
ビットフラグ
6502は8ビットCPUなので、一度に2進数で8桁の数値を処理できます。
一般にプログラムにおいては、何かの状態がONかOFFかという状態を保持するため、フラグと呼ばれる変数を用いますが、
これを1バイトの2進数で持つと、以下のように0~7の8つまで使えることになります。
アセンブラは知らなくても、C言語をやっていた人ならおなじみでしょう。
例えば以下の場合、0と5がONだと言うことができます。
ビットフラグ値 0 0 1 0 0 0 0 1
桁数 7 6 5 4 3 2 1 0
PPUの設定
PPUを仕様するに当たって、最初にPPUコントロールレジスタをこのビットフラグで初期化をする必要があります。
PPUコントロールレジスタのアドレスは$2000,$2001の二箇所で、内容は以下の通りです。
$2000 PPUコントロールレジスタ1
bit7: VBlank時にNMIを実行(0:実行しない,1:実行する)
bit6: PPUマスター/スレーブセレクト(0にしてマスターモードを選択する)
bit5: スプライトサイズ(0:8x8,1:8x16)
bit4: BGパターンテーブルアドレス(0:$0000,1:$1000)
bit3: スプライトパターンテーブルアドレス(0:$0000,1:$1000)
bit2: PPUアドレスインクリメント(0:+1,1:+32)
bit1-0: 表示するネームテーブルアドレス番号
00 = $2000 (VRAM)
01 = $2400 (VRAM)
10 = $2800 (VRAM)
11 = $2C00 (VRAM)
$2001 PPUコントロールレジスタ2
bit7-5: bit0=1のとき背景色/bit0=1のとき色強調
000:なし
001:緑
010:青
100:赤
(それ以外の数字は不可)
bit4: スプライト表示(0:非表示,1:表示)
bit3: BG表示(0:非表示,1:表示)
bit2: スプライトクリップ(0:画面の左8ドットを表示しない,1:クリップなし)
bit1: BGクリップ(0:画面の左8ドットを表示しない,1:クリップなし)
bit0: ディスプレイタイプ(0:カラー,1:モノクロ)
今回は、以下のように初期化することにします。
lda #%00001000
sta $2000
lda #%00011110
sta $2001
つまり、$2000では、
・VBlank時のNMI割り込みを実行しない
・スプライトは8x8ドット
・BGパターンテーブルは$0000から
・スプライトパターンテーブルアドレスは$1000から
・PPUアドレスは1づつ加算
・ネームテーブルアドレス番号は$2000
のように初期化します。
$2001では、
・背景無し
・スプライト表示
・BG表示
・スプライトクリップ無し
・BGクリップ無し
・カラーディスプレイ
のように初期化します。注意する点は、VRAMの初期化時はスプライトとBGの表示ビットは0にして、
初期化が終わったら1にすることです。こうしないと、VRAMが正しく初期化できない可能性があります。
トップページ
前のページ
次のページ