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 へ戻る