PPU 2C02
画面の構成 BG画面は最大4画面範囲(通常2画面分)を1枚持ち、 64枚のOBJ(スプライト)、バックドロップ、全画面を持つ COLOR GENERATER(カラーパレット)は カラーコード6ビットで52通り(カラー48+モノトーン4)表示EXT(バックドロップ)画面 2つのPPUを使用する場合SLAVE画面 MASTER PPUのカラーを$00(透明)にする(未確認) 通常1つのPPUでの使用なので バックドロップ画面として全体に1色の表示を行います カラー$00(透明)は黒 BG画面 ゲームでは背景の表示を行います OBJ画面 ゲームではキャラクタの表示を行います。 BG画面の前後のどちらかに表示することが出来ます 全面着色 画面全体に色のフィルターをかけたように淡く着色されます またPPUの種類によって この機能が出来ないタイプ(画面が真っ白になる)もあります PPUのメモリマップ PPUのメモリ空間は2つあると考えた方が分かりやすいかもしれません。 1つはキャラクタ、VRAM、COLOR GENERATERのあるPPUメモリ 1つはOBJ表示する為のOAMメモリ $0000〜$0FFF:キャラクタ0 (パターンジェネレータ) $1000〜$1FFF:キャラクタ1 $2000〜$23FF:BG1.RAM+BG.COLOR1 $2400〜$27FF:BG2.RAM+BG.COLOR2 (Hスクロール選択の場合) $2800〜$2BFF:BG3.RAM+BG.COLOR3 (Vスクロール選択の場合) $2C00〜$2FFF:BG4.RAM+BG.COLOR4 $3F00〜$3F1F:COLOR GENERATER (PPU内蔵RAM) $0000〜$1FFF キャラクタ カセットのキャラクタROMはこの場所に配置されます RAMにしてプログラムで定義する事も可能です 領域は2つありポートでOBJかBGのキャラクタを指定します $2000〜$2FFF BG.RAM+BG.COLOR キャラクタで定義されたキャラクタコードを表示する場所です。 本体では2Kバイト SRAMを使用して2画面分しかありません 標準のBG1とスクロール選択したBG2かBG3のどちらかの2画面分となります。 スクロールの選択はカセット内のPPUアドレスのショートで決ります (ポートで切り替えができるタイプも有ります) またカセットからVRAMメモリを2KBから4KBに拡張が可能です。 その場合、本体内のVRAMを使用禁止にして 新たにカセットにVRAMを置く必要があります $2000〜$23BF:BG.RAM1 (1画面標準) $23C0〜$23FF:BG.COLOR1(1画面標準) $2400〜$27BF:BG.RAM2 (Hスクロール) $27C0〜$27FF:BG.COLOR2(Hスクロール) $2800〜$2BBF:BG.RAM3 (Vスクロール) $2BC0〜$2BFF:BG.COLOR3(Vスクロール) $2C00〜$2FBF:BG.RAM4 $2FC0〜$2FFF:BG.COLOR4 $3F00〜$3F1F COLOR GENERATER BGやOBJのカラーパレットの設定を行います $3F00〜$3F03:BG用パレットコード#0 $3F04〜$3F07: 〃 #1 $3F08〜$3F0B: 〃 #2 $3F0C〜$3F0F: 〃 #3 $3F10〜$3F13:OBJ用パレットコード#0 $3F14〜$3F17: 〃 #1 $3F18〜$3F1B: 〃 #2 $3F1C〜$3F1F: 〃 #3 OAM(オブジェクトアトリビュートメモリ) OBJを表示する為のPPU内蔵RAMです ポートからアドレスを指定、データを書き込む方法と VBLANKの割り込み内でDMA転送する2つの方法があります $00:OBJ$00 H POS(Y座標 1ライン下にずれます) $01:OBJ$00 CHR (キャラクタ) $02:OBJ$00 ATTR (アトリビュート) $03:OBJ$00 V POS(X座標) : : $FC:OBJ$3F H POS(Y座標 1ライン下にずれます) $FD:OBJ$3F CHR (キャラクタ) $FE:OBJ$3F ATTR (アトリビュート) $FF:OBJ$3F V POS(X座標) PPUへのデータの書き込み ポート$2006にVRAMアドレスを設定して、 ポート$2007にデータを書き込みます アドレスの設定は上位、下位アドレスの順 VBLANK中に書き込む事、 最後にポート$2005にスクロールの設定します また、オートインクリメントによって 次からはポート$2007だけ書き込むだけです。 ポート$2000のd2の設定によってオートインクリメントは 横方向(左から右)か、縦方向(上から下)の2通りがあります。 PPUにあるデータの読み込み ポート$2006にVRAMアドレスを設定して、 ポート$2007からデータを読みます アドレスの設定は上位、下位アドレスの順 一番最初の読み込みは無効で2回読む必要があります
キャラクタ(パターンテーブル)キャラクタデータを格納する領域で、 1キャラクタ8×8ドットはプレーン0(8バイト)+プレーン1(8バイト)の計16バイト 16×256キャラ=$1000バイト、2つあるので$1000×2で$2000バイトになります
キャラクタデータは1キャラクタにプレーン0とプレーン1の2つがあり その2つを重ねたのが1キャラクタのデータとなります。 プレーン0のビットデータ1が1の部分がカラー1 プレーン1のビットデータ1が1の部分がカラー2 プレーン0とプレーン1でビットデータ1が重なった部分がカラー3になります。 プレーン0とプレーン1でビットデータ0が重なった部分がカラー0(透明)になります。
BG画面ゲームにおける背景画面の場所になり、BG画面は1枚(4画面範囲) 本体内のRAMでは通常カセット端子の48(/VRAMCS)と 49(/PA13)がショートしていて BG1$2000−$23BFと BG1アトリビュート$23C0−$23FFの1KBが使用できます 残りの1KBはカセットのスクロールのショート部分でBG2(Hスクロール)かBG3(Vスクロール)になります。 もしHとVのどちらも選択されない場合はBG1のみの使用となります
BG2(Hスクロール)選択をすると 使用できるのはBG1とBG2となり、 BG3はBG1のミラー、BG4はBG2のミラーイメージになります。
BG3(Vスクロール)選択をすると 使用できるのはBG1とBG3となり、 BG2はBG1のミラー、BG4はBG3のミラーイメージになります。 BG.RAM
この領域にキャラクタコードを書く事によって文字が表示されます(カラーの設定が必要) 32×30キャラクタ=$03C0 $2000〜$23BF:BG.RAM1(1画面標準) $2400〜$27BF:BG.RAM2 $2800〜$2BBF:BG.RAM3 $2C00〜$2FBF:BG.RAM4 BG.COLOR(アトリビュート)
この領域はBG画面のカラーの指定を行いますが 2×2キャラクタに1バイトのパレットコードを設定します。 1バイトのデータは2ビットづつ区切られ、 2×2キャラクタ単位でのカラー設定しか出来ません $23C0〜$23FF:BG.COLOR1(1画面標準) $27C0〜$27FF: 〃 2 $2BC0〜$2BFF: 〃 3 $2FC0〜$2FFF: 〃 4 カラーパレットで設定したパレットコード#nを設定します。 パレットコード#nの配色番号は カラーパレット$3F00−$3F0Fで設定したカラーになります 4×4キャラクタ単位を1ブロック、8ブロック×8ブロック=$40バイト使用 d7:Dのパレットコード D1 d6: 〃 D0 d5:Cのパレットコード D1 d4: 〃 D0 d3:Bのパレットコード D1 d2: 〃 D0 d1:Aのパレットコード D1 d0: 〃 D0 ブロック7は縦半分になり、設定出来るデータはA、B部分(Bit3−0)だけとなります。
COLOR GENERATER(カラーパレット)黒は通常$0Fを使用します。 $3F00:BGパレットコード0 配色番号0(バックドロップ画面の設定) $3F01: 〃 配色番号1 $3F02: 〃 配色番号2 $3F03: 〃 配色番号3 $3F04:BGパレットコード1 配色番号0(データは無効で透明になる) $3F05: 〃 配色番号1 $3F06: 〃 配色番号2 $3F07: 〃 配色番号3 $3F08:BGパレットコード2 配色番号0(データは無効で透明になる) $3F09: 〃 配色番号1 $3F0A: 〃 配色番号2 $3F0B: 〃 配色番号3 $3F0C:BGパレットコード3 配色番号0(データは無効で透明になる) $3F0D: 〃 配色番号1 $3F0E: 〃 配色番号2 $3F0F: 〃 配色番号3 $3F10:OBJパレットコード0 配色番号0(バックドロップ画面の設定になる) $3F11: 〃 配色番号1 $3F12: 〃 配色番号2 $3F13: 〃 配色番号3 $3F14:OBJパレットコード1 配色番号0(データは無効で透明になる) $3F15: 〃 配色番号1 $3F16: 〃 配色番号2 $3F17: 〃 配色番号3 $3F18:OBJパレットコード2 配色番号0(データは無効で透明になる) $3F19: 〃 配色番号1 $3F1A: 〃 配色番号2 $3F1B: 〃 配色番号3 $3F1C:OBJパレットコード3 配色番号0(データは無効で透明になる) $3F1D: 〃 配色番号1 $3F1E: 〃 配色番号2 $3F1F: 〃 配色番号3 BG用、OBJ用の2種類があり、配色番号を4つで1セットをパレットコードになります。 このパレットコード nをBG.COLORに設定します。
OBJ(スプライト) OBJRAMは$100バイトあり1キャラクタ表示するのに4バイト必要で 最高64枚のOBJが使用できます。 アクセス方法 1.ポート$2003にOBJRAMアドレスを指定して ポート$2004にデータを書き込む方法 2.VSYNC割り込みでDMA転送する方法 の2種類があります。 またポート$2001のBit4=0(OBJ表示をしない)場合にOBJ RAMをアクセスしないと データが壊れていく? OBJ RAMは4バイトで1組になりアドレス$00〜$FFのOBJ$00から$3Fまで64個使用できます。 第1バイト V Position(1ドット下にずれる為表示したい値−1) 第2バイト キャラクタ No.nn パターンテーブルnで設定したCGデータナンバ 第3バイト アトリビュート d7:VFLIP 1=オン 、0=オフ d6:HFLIP 1=オン 、0=オフ d5:OBJ順位 1=OBJ’(後)、0=OBJ’(前) d4: − d3: − d2: − d1:COLOR1 d0:COLOR0 第4バイト H Position8×8モードのOBJはポート$2000 d3=1ならPPU$1000、 0ならPPU$0000のパターンデータを参照にします
8×16モードのOBJキャラクタの対応表です。 8×8モードの時と違いパターンテーブル2つ全部を使いますので OBJパターンテーブルの指定は無効になります。 OBJキャラクターが偶数ならパターンテーブル0のCHRデータを使用 OBJキャラクターが奇数ならパターンテーブル1のCHRデータを使用
Home へ戻る