[機器][マイコン] PPU 2CO2
PPU 2C02
■画面の構成
BG画面は最大4画面分(通常2画面分)を1枚持ち、64枚のOBJ(スプライト)、バックドロップ画面を持つ
フィルタ画面はPPUによって違います。
アクセスに少しクセがあります。
バックドロップ画面
画面全体に1色の表示を行います。
BG画面
ゲームでは背景の表示を行います。
OBJ(スプライト)画面
ゲームではキャラクタの表示を行います。
BG画面の前後のどちらかに表示することが出来ます。
PPUのメモリマップ
PPUのメモリ空間は2つあると考えた方が分かりやすいかもしれません。
1つはキャラクタパターン、VRAM、カラーパレットのあるPPUメモリ
1つはOBJ表示する為のOBJRAM
$0000-$0FFF:パターンテーブル0
$1000-$1FFF:パターンテーブル1
$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
$3F00-$3F03:BG用パレットコード#0
$3F04-$3F07:BG用パレットコード#1
$3F08-$3F0B:BG用パレットコード#2
$3F0C-$3F0F:BG用パレットコード#3
$3F10-$3F13:OBJ用パレットコード#0
$3F18-$3F1B:OBJ用パレットコード#2
$3F1C-$3F1F:OBJ用パレットコード#3
OBJ(スプライト)RAM
OBJ(スプライト)を表示する為のRAMです
ポートからアドレスを指定、データを書き込む方法とVBLANKの割り込み内でDMA転送する2つの方法があります
$00:OBJ$00H(Y座標1ドット下にずれます)
$01:OBJ$00CHR(キャラクタ)
$02:OBJ$00ATTR(アトリビュート)
$03:OBJ$00V(X座標)
$FC:OBJ$3FH(Y座標1ドット下にずれます)
$FD:OBJ$3FCHR(キャラクタ)
$FE:OBJ$3FATTR(アトリビュート)
$FF:OBJ$3FV(X座標)
PPUへのデータの書き込み
ポート$2006にVRAMアドレスを設定して、ポート$2007にデータを書き込みます。
注意するのはアドレスの設定は上位アドレス、下位アドレスの順に設定する事と
VBLANK中に書き込む事、最後にポート$2005にスクロールの設定します。
また、オートインクリメントによって次からはポート$2007だけ書き込むだけです。
ポート$2000のBit2の設定によってオートインクリメントは
横方向(左から右)か、縦方向(上から下)の2通りがあります。
PPUにあるデータの読み込み
注意するのはアドレスの設定は上位アドレス、下位アドレスの順に設定する事と
一番最初の読み込みは無効で2回読む必要があります。
■パターンテーブル
キャラクタデータを格納する領域で、
1キャラクタ8*8ドットはプレーン0(8バイト)+プレーン1(8バイト)の計16バイト
それが256キャラクタ分なので256キャラ×16=$1000バイト
パターンテーブルは2つあるので$1000×2で$2000バイトになります。
キャラクタデータは1キャラクタにプレーン0とプレーン1の2つがあり
プレーン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-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のミラーイメージになります。
この領域にキャラクタコードを書く事によって文字が表示されます。(カラーの設定が必要)
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表示をしない)場合にOBJRAMをアクセスしないと
データが壊れていく?
OBJRAMは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はポート$2000Bit3=1ならPPU$1000、0ならPPU$0000の
パターンデータを参照にします。
8×16モードのOBJキャラクタの対応表です。
8×8モードの時と違いパターンテーブル2つ全部を使いますので
OBJパターンテーブルの指定は無効になります。
OBJキャラクターが偶数ならパターンテーブル0のCHRデータを使用
OBJキャラクターが奇数ならパターンテーブル1のCHRデータを使用
Enri's HP
http://www43.tok2.com/home/cmpslv/