第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が正しく初期化できない可能性があります。
トップページ 前のページ 次のページ
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送