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 H    (Y座標 1ドット下にずれます)    $01:OBJ$00 CHR  (キャラクタ)    $02:OBJ$00 ATTR (アトリビュート)    $03:OBJ$00 V    (X座標)          |    $FC:OBJ$3F H    (Y座標 1ドット下にずれます)    $FD:OBJ$3F CHR  (キャラクタ)    $FE:OBJ$3F ATTR (アトリビュート)    $FF:OBJ$3F V    (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 へ戻る