3-1.PPUレジスタ




PPU(Picture Processing Unit)はBGやスプライトの処理を行います。
PPU用のRAM(VRAM)は64KBで、BGのキャラジェネやタイルマップを保持します。

PPUのアクセスはメモリマップドI/Oで行います。
以下にPPU関連のI/Oレジスタを示します。
詳しい使い方はBG&スプライトの項目で説明します。

アドレス 機能
$2100 スクリーン表示
bit7: 表示ON/OFF(0:ON,1:OFF)
bit3-0: 明るさ
$2101 スプライトサイズ
bit7-5: スプライトサイズ選択
000: 8x8 or 16x16
001: 8x8 or 32x32
010: 8x8 or 64x64
011: 16x16 or 32x32
100: 16x16 or 64x64
101: 32x32 or 64x64
bit4-3: スプライトパタンデータのオフセット(4KWORD単位)
bit2-0: スプライトパタンデータのアドレス(8KWORD単位)
$2102-$2103 スプライトアドレスレジスタ
スプライトメモリ(OAM-RAM)のアドレスを指定します。
bit15: 優先順位変更(1:指定アドレスのスプライトを最優先に)
bit8-0: OAMアドレス
$2104 スプライトデータレジスタ
$2102-$2103で指定したアドレスにデータを書き込みます。
このレジスタは2度書きレジスタで、最初に書いた値が下位8bit、次に書いた値が上位8bitになります。
$2105 ($3Eから転記) BGモードレジスタ
bit7: BG4のタイルサイズ(0:8x8, 1:16x16)
bit6: BG3のタイルサイズ(0:8x8, 1:16x16)
bit5: BG2のタイルサイズ(0:8x8, 1:16x16)
bit4: BG1のタイルサイズ(0:8x8, 1:16x16)
bit3: BGモード1のときのBG3の優先順位
bit2-0: BGモード選択
モード BG数 色数 パレット数 備考
0 4 4/4/4/4 8/8/8/8
1 3 16/16/4 8/8/8
2 2 16/16 8/8
3 2 256/16 1/8
4 2 256/4 1/8
5 2 16/4 8/8 インタレース
6 1 16 8 インタレース
7 1 256 1 拡張BG(拡大縮小回転)使用可能
$2106 モザイク
bit7-4: モザイクサイズ
bit3: BG4モザイク有効(1:有効, 0:無効)
bit2: BG3モザイク有効(1:有効, 0:無効)
bit1: BG2モザイク有効(1:有効, 0:無効)
bit0: BG1モザイク有効(1:有効, 0:無効)
$2107 BG1マップアドレス/サイズ
bit7-2: マップアドレス(1KWORD単位)
bit1-0: マップサイズ(00:32x32, 01:64x32, 10:32x64, 11:64x64)
$2108 BG2マップアドレス/サイズ
bit7-2: マップアドレス(1KWORD単位)
bit1-0: マップサイズ(00:32x32, 01:64x32, 10:32x64, 11:64x64)
$2109 BG3マップアドレス/サイズ
bit7-2: マップアドレス(1KWORD単位)
bit1-0: マップサイズ(00:32x32, 01:64x32, 10:32x64, 11:64x64)
$210A BG4マップアドレス/サイズ
bit7-2: マップアドレス(1KWORD単位)
bit1-0: マップサイズ(00:32x32, 01:64x32, 10:32x64, 11:64x64)
$210B BG1,BG2キャラクタアドレス
bit7-4: BG2キャラクタアドレス(4KWORD単位)
bit3-0: BG1キャラクタアドレス(4KWORD単位)
$210C BG1,BG2キャラクタアドレス
bit7-4: BG2キャラクタアドレス(4KWORD単位)
bit3-0: BG1キャラクタアドレス(4KWORD単位)
$210D BG1水平スクロール値
BG1の水平スクロール値を11bitで指定します。
このレジスタは2度書きレジスタで、最初に書いた値が下位8bit、次に書いた値が上位8bitになります。
$210E BG1垂直スクロール値
BG1の垂直スクロール値を11bitで指定します。
このレジスタは2度書きレジスタで、最初に書いた値が下位8bit、次に書いた値が上位8bitになります。
$210F BG2水平スクロール値
BG2の水平スクロール値を11bitで指定します。
このレジスタは2度書きレジスタで、最初に書いた値が下位8bit、次に書いた値が上位8bitになります。
$2110 BG2垂直スクロール値
BG2の垂直スクロール値を11bitで指定します。
このレジスタは2度書きレジスタで、最初に書いた値が下位8bit、次に書いた値が上位8bitになります。
$2111 BG3水平スクロール値
BG3の水平スクロール値を11bitで指定します。
このレジスタは2度書きレジスタで、最初に書いた値が下位8bit、次に書いた値が上位8bitになります。
$2112 BG3垂直スクロール値
BG3の垂直スクロール値を11bitで指定します。
このレジスタは2度書きレジスタで、最初に書いた値が下位8bit、次に書いた値が上位8bitになります。
$2113 BG4水平スクロール値
BG4の水平スクロール値を11bitで指定します。
このレジスタは2度書きレジスタで、最初に書いた値が下位8bit、次に書いた値が上位8bitになります。
$2114 BG4垂直スクロール値
BG4の垂直スクロール値を11bitで指定します。
このレジスタは2度書きレジスタで、最初に書いた値が下位8bit、次に書いた値が上位8bitになります。
$2115 VRAMアドレスインクリメント
bit7: インクリメントタイミング(0:BYTEアクセス毎, 1:WORDアクセス毎)
bit3-0: インクリメントサイズ
サイズ
0100 アクセス毎アドレスを+8
1000 アクセス毎アドレスを+8
1100 アクセス毎アドレスを+8
0000 アクセス毎アドレスを+1
0001 アクセス毎アドレスを+32
0010 アクセス毎アドレスを+64
0011 アクセス毎アドレスを+128
$2116-$2117 VRAMアクセスアドレス
R/Wを行うVRAMのアドレスを指定します。
$2118-$2119 VRAM書き込みデータ
VRAMアクセスアドレスで指定したアドレスにデータを書き込みます。
$211A モード7設定
bit7-6: スクリーン外の描画設定
00: スクリーン外をスクリーンパタンを繰り返して埋める
10: スクリーン外をキャラクタ0で埋める
11: スクリーン外をBG色で埋める
bit1: 垂直方向反転(1: 反転)
bit0: 水平方向反転(1: 反転)
$211B-$211E 拡大縮小回転マトリクス
モード7の拡大縮小回転変換の2x2マトリクスを設定します。
[0,0] = $211B, [0,1] = $211C, [1,0] = $211D, [1,1] = $211E([行,列])になります。
このレジスタは2度書きレジスタで、最初に書いた値が下位8bit、次に書いた値が上位8bitになります。
値は小数部8bitの固定小数になります。
$211F 拡大縮小回転の中心X位置
拡大縮小回転の中心X位置を13bitで指定します。
このレジスタは2度書きレジスタで、最初に書いた値が下位8bit、次に書いた値が上位8bitになります。
$2120 拡大縮小回転の中心Y位置
拡大縮小回転の中心Y位置を13bitで指定します。
このレジスタは2度書きレジスタで、最初に書いた値が下位8bit、次に書いた値が上位8bitになります。
$2121 カラーRAM(CG-RAM)アドレス
$2122 カラーRAM(CG-RAM)データ
CG-RAMアドレスで指定したアドレスにデータを書き込みます。
カラーは1色15bitで指定し、bit14-10が青、bit9-5が緑、bit4-0が赤になります。
このレジスタは2度書きレジスタで、最初に書いた値が下位8bit、次に書いた値が上位8bitになります。
$2123 ($41から転記) BG1,BG2ウィンドウマスク設定
ウィンドウのIN/OUTはウィンドウの内側/外側のどちらを有効にするか決めます。
bit7: BG2:ウィンドウ2有効(1:有効)
bit6: BG2:ウィンドウ2IN/OUT(0:IN, 1:OUT)
bit5: BG2:ウィンドウ1有効(1:有効)
bit4: BG2:ウィンドウ1IN/OUT(0:IN, 1:OUT)
bit3: BG1:ウィンドウ2有効(1:有効)
bit2: BG1:ウィンドウ2IN/OUT(0:IN, 1:OUT)
bit1: BG1:ウィンドウ1有効(1:有効)
bit0: BG1:ウィンドウ1IN/OUT(0:IN, 1:OUT)
$2124 ($42から転記) BG1,BG2ウィンドウマスク設定
bit7: BG4:ウィンドウ2有効(1:有効)
bit6: BG4:ウィンドウ2IN/OUT(0:IN, 1:OUT)
bit5: BG4:ウィンドウ1有効(1:有効)
bit4: BG4:ウィンドウ1IN/OUT(0:IN, 1:OUT)
bit3: BG3:ウィンドウ2有効(1:有効)
bit2: BG3:ウィンドウ2IN/OUT(0:IN, 1:OUT)
bit1: BG3:ウィンドウ1有効(1:有効)
bit0: BG3:ウィンドウ1IN/OUT(0:IN, 1:OUT)
$2125 ($43から転記) カラーウィンドウ,スプライトウィンドウマスク設定
bit7: Color:ウィンドウ2有効(1:有効)
bit6: Color:ウィンドウ2IN/OUT(0:IN, 1:OUT)
bit5: Color:ウィンドウ1有効(1:有効)
bit4: Color:ウィンドウ1IN/OUT(0:IN, 1:OUT)
bit3: スプライト:ウィンドウ2有効(1:有効)
bit2: スプライト:ウィンドウ2IN/OUT(0:IN, 1:OUT)
bit1: スプライト:ウィンドウ1有効(1:有効)
bit0: スプライト:ウィンドウ1IN/OUT(0:IN, 1:OUT)
$2126 ウィンドウ1左座標
$2127 ウィンドウ1右座標
$2128 ウィンドウ2左座標
$2129 ウィンドウ2右座標
$212A BGのウィンドウ演算マスク設定
bit7-6: BG4のパラメータ設定
bit5-4: BG3のパラメータ設定
bit3-2: BG2のパラメータ設定
bit1-0: BG1のパラメータ設定
パラメータ内容
00: OR
01: AND
10: XOR
11: XNOR
$212B カラー,スプライトウィンドウ演算マスク設定
bit3-2: カラーウィンドウのパラメータ設定
bit1-0: スプライトウィンドウのパラメータ設定
パラメータ内容
00: OR
01: AND
10: XOR
11: XNOR
$212C メインスクリーン設定
メインスクリーンに設定するBG,スプライトを選択します。
bit4: スプライト(1:設定)
bit3: BG4(1:設定)
bit2: BG3(1:設定)
bit1: BG2(1:設定)
bit0: BG1(1:設定)
$212D サブスクリーン設定
サブスクリーンに設定するBG,スプライトを選択します。
bit4: スプライト(1:設定)
bit3: BG4(1:設定)
bit2: BG3(1:設定)
bit1: BG2(1:設定)
bit0: BG1(1:設定)
$212E ウィンドウマスク設定(メインスクリーン)
bit4: スプライト(1:有効)
bit3: BG4(1:有効)
bit2: BG3(1:有効)
bit1: BG2(1:有効)
bit0: BG1(1:有効)
$212F ウィンドウマスク設定(サブスクリーン)
bit4: スプライト(1:有効)
bit3: BG4(1:有効)
bit2: BG3(1:有効)
bit1: BG2(1:有効)
bit0: BG1(1:有効)
$2130 ($44から転記) カラー演算設定
bit7-6: メインスクリーン演算設定
bit5-4: サブスクリーン演算設定
00: すべて有効
01: ウィンドウ内のみ
10: ウィンドウ外のみ
11: すべて有効
bit1: 演算カラー選択(0:固定色($2132で設定), 1:サブスクリーンの色)
bit0: ダイレクトカラー(1:有効)(モード3,4,7のみ)
$2131 ($40から転記) カラー演算式、影響スクリーン選択
bit7: カラー加算減算選択(0:加算, 1:減算)
bit6: カラー演算倍率(0:そのまま, 1:1/2の色)
bit5: BGカラー(1:有効)
bit4: スプライト(1:有効)
bit3: BG4(1:有効)
bit2: BG3(1:有効)
bit1: BG2(1:有効)
bit0: BG1(1:有効)
$2132 カラー演算固定色
カラー演算で使う色を指定します
bit7: 青
bit6: 緑
bit5: 赤
bit4-0: 色の明るさ
$2133 スクリーン設定
bit7: 外部同期有効(1: 有効)
bit6: 外部スクリーン(拡大縮小回転BG)有効(1:有効(モード7のみ)))
bit3: 水平解像度(1:512, 0:256)
bit2: 垂直解像度(1:224, 0:239)
bit1: スプライト倍率(0:1倍, 1:2倍)(インタレース時のみ)
bit0: インタレースモード(1:インタレース)
$2137 水平/垂直カウンタ取得
$2138 OAM-RAMデータ読み込み
このレジスタは2度読みレジスタで、最初に読んだ値が下位8bit、次に書いた値が上位8bitになります。
$2139-$213A VRAMデータ読み込み
$213B CG-RAMデータ読み込み
このレジスタは2度読みレジスタで、最初に読んだ値が下位8bit、次に書いた値が上位8bitになります。
$213C 水平スキャン位置取得
このレジスタは2度読みレジスタで、最初に読んだ値が下位8bit、次に書いた値が上位8bitになります。
$213D 垂直スキャン位置取得
このレジスタは2度読みレジスタで、最初に読んだ値が下位8bit、次に書いた値が上位8bitになります。
$213E PPUステータス
bit7: 1ラインに33個以上のスプライトを書こうとしたときに1になります。
bit6: 1ラインに8x8スプライト換算で35個以上のスプライトを書こうとしたときに1になります。
bit5: マスター/スレーブモード(0:マスター)0にすること。
bit3-0: バージョン番号
$213F PPUステータス
bit7: 描画中のラスタ(0:偶数, 1:奇数)(インタレース時)
bit6: 外部信号取得時に1
bit4: NTSC/PAL(0:NTSC, 1:PAL)
bit3-0: バージョン番号