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 Position   8×8モードのOBJはポート$2000 d3=1ならPPU$1000、 0ならPPU$0000のパターンデータを参照にします   8×16モードのOBJキャラクタの対応表です。 8×8モードの時と違いパターンテーブル2つ全部を使いますので OBJパターンテーブルの指定は無効になります。  OBJキャラクターが偶数ならパターンテーブル0のCHRデータを使用  OBJキャラクターが奇数ならパターンテーブル1のCHRデータを使用  
Home へ戻る