第３章

## 第３章　PPU

### Picture Processing Unit

ファミコンで描画を行うのが、PPU(Picture Processing Unit)です。PPUはCPUとは別のメモリ空間(VRAM)を持ち、 背景やスプライトの描画を行います。PPUは6502とは独立して非同期に画面描画を行います。 6502がスプライト描画のレジスタ書き込みを行っても、画面にすぐスプライトが描画されるわけでは無いことを理解してください。 CPUからPPUを操作するには、PPUコントロールレジスタに値を設定します。

### ビットフラグ

ファミコンは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コントロールレジスタ１

    	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コントロールレジスタ２

    	bit7-5: bit0=1のとき背景色/bit0=1のとき色強調

    	000:なし
    	001:緑
    	010:青
    	100:赤
    	(それ以外の数字は不可)

    	bit4: スプライト表示(0:非表示,1:表示)
    	bit3: BG表示(0:非表示,1:表示)
    	bit2: スプライトクリップ(0:画面の左８ドットを表示しない,1:クリップなし)
    	bit1: BGクリップ(0:画面の左８ドットを表示しない,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が正しく初期化できない可能性があります。

トップページ 前のページ 次のページ

FC2 |  | キャッシング 花 | 無料 掲示板 無料ホームページ