PPU 2C02
画面の構成 BG画面は最大4画面分(通常2画面分)を1枚持ち、64枚のOBJ(スプライト)、バックドロップ画面を持つ。 フィルタ画面はPPUによって違います。 アクセスに少しクセがあります。バックドロップ画面 画面全体に1色の表示を行います。 BG画面 ゲームでは背景の表示を行います。 OBJ(スプライト)画面 ゲームではキャラクタの表示を行います。 BG画面の前後のどちらかに表示することが出来ます。 PPUのメモリマップ PPUのメモリ空間は2つあると考えた方が分かりやすいかもしれません。 1つはキャラクタパターン、VRAM、カラーパレットのあるPPUメモリ 1つはOBJ表示する為のOBJ RAM $0000−$0FFF:パターンテーブル0 $1000−$1FFF:パターンテーブル1 $2000−$23FF:BGネームテーブル0、アトリビュート0 $2400−$27FF:BGネームテーブル1、アトリビュート1(Hスクロール選択の場合) $2800−$2BFF:BGネームテーブル2、アトリビュート2(Vスクロール選択の場合) $2C00−$2FFF:BGネームテーブル3、アトリビュート3 $3F00−$3F1F:カラーパレット $0000−$1FFF パターンテーブル(CG領域) キャラクタジェネレータの領域です。 カセットのキャラクタROMはこの場所に配置されます。 また、RAMにしプログラムで定義する事も可能です。 領域は2つありポートでスプライトのキャラクタジェネレータか BGのジェネレータかを指定します。 $2000−$2FFF ネームテーブル、アトリビュート(VRAM) パターンテーブルで定義されたキャラクタコードを表示する場所です。 本体では2KバイトのSRAMを使用して2画面分しかありません 標準の0とスクロールを選択したVRAMアドレス1か2のどちらか1つの2画面分となります。 スクロールの選択はカセット内もPPUアドレスのショートで決ります(ポートで切り替えができるタイプも有ります) またカセットからVRAMメモリを2KBから8KBに拡張が可能です。 その場合、本体内のVRAMを使用禁止にして新たにカセットにVRAMを置く必要があります。(その場合4画面分フルに使用で出来ます) $2000−$23BF:ネームテーブル0(1画面標準) $23C0−$23FF:アトリビュート0(1画面標準) $2400−$27BF:ネームテーブル1(Hスクロール) $27C0−$27FF:アトリビュート1(Hスクロール) $2800−$2BBF:ネームテーブル2(Vスクロール) $2BC0−$2BFF:アトリビュート2(Vスクロール) $2C00−$2FBF:ネームテーブル3 $2FC0−$2FFF:アトリビュート3 $3F1F−$3F1F カラーパレット $3F00−$3F03:BG用パレットコード #0 $3F04−$3F07:BG用パレットコード #1 $3F08−$3F0B:BG用パレットコード #2 $3F0C−$3F0F:BG用パレットコード #3 $3F10−$3F13:OBJ用パレットコード #0 $3F14−$3F17:OBJ用パレットコード #1 $3F18−$3F1B:OBJ用パレットコード #2 $3F1C−$3F1F:OBJ用パレットコード #3 OBJ(スプライト)RAM OBJ(スプライト)を表示する為のRAMです。 ポートからアドレスを指定する方法とVBLANKの割り込み内でDMA転送する2つの方法があります。 $00:OBJ$00 Y座標(1ドット下にずれます) $01:OBJ$00 OBJキャラクタ $02:OBJ$00 アトリビュート $03:OBJ$00 X座標 | $FC:OBJ$3F Y座標(1ドット下にずれます) $FD:OBJ$3F OBJキャラクタ $FE:OBJ$3F アトリビュート $FF:OBJ$3F X座標
PPUへのデータの書き込み ポート$2006にVRAMアドレスを設定して、ポート$2007にデータを書き込みます。 注意するのはアドレスの設定は上位アドレス、下位アドレスの順に設定する事と VBLANK中に書き込む事、最後にポート$2005にスクロールの設定します。 また、オートインクリメントによって次からはポート$2007だけ書き込むだけです。 ポート$2000のBit2の設定によってオートインクリメントは 横方向(左から右)か、縦方向(上から下)の2通りがあります。
PPUにあるデータの読み込み ポート$2006にVRAMアドレスを設定して、ポート$2007からデータを読みます。 注意するのはアドレスの設定は上位アドレス、下位アドレスの順に設定する事と 一番最初の読み込みは無効で2回読む必要があります。
パターンテーブルキャラクタデータを格納する領域で、 1キャラクタ8*8ドットはプレーン0(8バイト)+プレーン1(8バイト)の計16バイト それが256キャラクタ分なので256キャラ×16=$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画面は最大4画面分用意されています。 本体内のRAMでは通常カセット端子の48(/VRAMCS)と49(/PA13)がショートしていて BG−A$2000−$23BFとBG−Aアトリビュート$23C0−$23FFの1KBが使用できます。 残りの1KBはカセットのスクロールのショート部分でBG−B(Hスクロール)かBG−C(Vスクロール)になります。 もしHとVのどちらも選択されない場合はBG−Aのみの使用となります。
BG−B(Hスクロール)選択をすると 使用できるのはBG−AとBG−Bとなり、 BG−CはBG−Aのミラー、BG−DはBG−Bのミラーイメージになります。
BG−C(Vスクロール)選択をすると 使用できるのはBG−AとBG−Cとなり、 BG−BはBG−Aのミラー、BG−DはBG−Cのミラーイメージになります。 BGネームテーブル
この領域にキャラクタコードを書く事によって文字が表示されます。(カラーの設定が必要) 32×30キャラクタ=$03C0 $2000−$23BF:BG−Aネームテーブル(1画面標準) $2400−$27BF:BG−Bネームテーブル $2800−$2BBF:BG−Cネームテーブル $2C00−$2FBF:BG−Dネームテーブル アトリビュート
この領域はBG画面のカラーの指定を行いますが2×2キャラクタ×4に1バイトのパレットコードを設定します。 1バイトのデータは2Bitづつ区切られ、2×2キャラクタ単位でのカラー設定しか出来ません。 $23C0−$23FF:BG−Aアトリビュート(1画面標準) $27C0−$27FF:BG−Bアトリビュート $2BC0−$2BFF:BG−Cアトリビュート $2FC0−$2FFF:BG−Dアトリビュート カラーパレットで設定したパレットコード#nを設定します。 パレットコード#nの配色番号はカラーパレット$3F00−$3F0Fで設定したカラーになります 4×4キャラクタ単位を1ブロック、8ブロック×8ブロック=$40バイト使用 Bit7:Dのパレットコード D1 Bit6:Dのパレットコード D0 Bit5:Cのパレットコード D1 Bit4:Cのパレットコード D0 Bit3:Bのパレットコード D1 Bit2:Bのパレットコード D0 Bit1:Bのパレットコード D1 Bit0:Bのパレットコード D0 ブロック7は縦半分になり、設定出来るデータはA、B部分(Bit3−0)だけとなります。
カラーパレット黒は通常$0Fを使用します。 カラーパレットアドレス $3F00:BGパレットコード 0 配色番号0(バックドロップ画面の設定) $3F01:BGパレットコード 0 配色番号1 $3F02:BGパレットコード 0 配色番号2 $3F03:BGパレットコード 0 配色番号3 $3F04:BGパレットコード 1 配色番号0(データは無効で透明になる) $3F05:BGパレットコード 1 配色番号1 $3F06:BGパレットコード 1 配色番号2 $3F07:BGパレットコード 1 配色番号3 $3F08:BGパレットコード 2 配色番号0(データは無効で透明になる) $3F09:BGパレットコード 2 配色番号1 $3F0A:BGパレットコード 2 配色番号2 $3F0B:BGパレットコード 2 配色番号3 $3F0C:BGパレットコード 3 配色番号0(データは無効で透明になる) $3F0D:BGパレットコード 3 配色番号1 $3F0E:BGパレットコード 3 配色番号2 $3F0F:BGパレットコード 3 配色番号3 $3F10:OBJパレットコード 0 配色番号0(バックドロップ画面の設定になる) $3F11:OBJパレットコード 0 配色番号1 $3F12:OBJパレットコード 0 配色番号2 $3F13:OBJパレットコード 0 配色番号3 $3F14:OBJパレットコード 1 配色番号0(データは無効で透明になる) $3F15:OBJパレットコード 1 配色番号1 $3F16:OBJパレットコード 1 配色番号2 $3F17:OBJパレットコード 1 配色番号3 $3F18:OBJパレットコード 2 配色番号0(データは無効で透明になる) $3F19:OBJパレットコード 2 配色番号1 $3F1A:OBJパレットコード 2 配色番号2 $3F1B:OBJパレットコード 2 配色番号3 $3F1C:OBJパレットコード 3 配色番号0(データは無効で透明になる) $3F1D:OBJパレットコード 3 配色番号1 $3F1E:OBJパレットコード 3 配色番号2 $3F1F:OBJパレットコード 3 配色番号3 カラーパレットはBG用、OBJ用の2種類があり、配色番号を4つで1セットをパレットコードになります。 このパレットコード nをアトリビュートに設定します。 ポート$2001でRGBそれぞれの出力にフィルタをかけます フイルタをかけると少し暗くなります またPPUの種類によってこの機能が出来ないタイプ(画面が真っ白になる)もあります。
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バイト Y座標−1(1ドット下にずれる為表示したい値−1) 第2バイト OBJキャラクタnn パターンテーブルnで設定したCGデータナンバ 第3バイト アトリビュート Bit7:垂直 1=反転 、0=通常 Bit6:水平 1=反転 、0=通常 Bit5:プライオリティ 1=BG画面より奥、0=BG画面より手前 Bit4:0 Bit3:0 Bit2:0 Bit1:OBJ用パレットコード D1 Bit0:OBJ用パレットコード D0 第4バイト X座標8×8モードのOBJはポート$2000 Bit3=1ならPPU$1000、0ならPPU$0000の パターンデータを参照にします。
8×16モードのOBJキャラクタの対応表です。 8×8モードの時と違いパターンテーブル2つ全部を使いますので OBJパターンテーブルの指定は無効になります。 OBJキャラクターが偶数ならパターンテーブル0のCHRデータを使用 OBJキャラクターが奇数ならパターンテーブル1のCHRデータを使用
Home へ戻る