3-1.メモリマップ




PPUのメモリマップは下のようになっています。
アドレスサイズ内容
$0000$1000パターンテーブル0
$1000$1000パターンテーブル1
$2000$03C0ネームテーブル
$23C0$0040属性テーブル
$2400$03C0ネームテーブル
$27C0$0040属性テーブル
$2800$03C0ネームテーブル
$2BC0$0040属性テーブル
$2C00$03C0ネームテーブル
$2FC0$0040属性テーブル
$3000$0F00$2000-$2EFFのミラー
$3F00$0010BG用パレット
$3F10$0010スプライト用パレット
$3F20$00E0パレットミラー
$4000$C000$0000-$3FFFのミラー

○パレット
ファミコンは64色16色使えます。
BG、スプライトで使う色をここに格納します。
$3F00が0番パレットの色、$3F01が1番パレットの色・・・となります。
色は6bit(64色)で指定しますが、RGBでの指定ではなくあらかじめ決まっている64色の色の何番目の色を使うか指定します。

$3F20-$3FFFはパレットデータのミラーで、$3F00に書いたデータは$3F10,$3F20,$3F30...$3F08に書いたデータは$3F18,$3F28,$3F38...とミラーリングされます。

○パターンテーブル
BGやスプライトで使うパターンデータのテーブルです。
タイルパターンのサイズは8x8で、256x2個のパターンデータを持てます。
この部分は基本的にROMになっていて書き換えできません。
マッパーによってはバンク切り替えによりそれ以上のパターンを持つことができます。

パターンの色はパレット番号で指定しますが、タイルパターンには下位2bitだけ格納します。
よって1つのタイルパターンのデータは16バイトになり、
データの並びは
1ライン目の下位1bitのビットパターン
2ライン目の下位1bitのビットパターン
・・・
8ライン目の下位1bitのビットパターン
1ライン目の上位1bitのビットパターン
2ライン目の上位1bitのビットパターン
・・・
8ライン目の上位1bitのビットパターン
(例)文字”A”
アドレス(オフセット)データ(16進)データ(2進)表示データ
$0000下位1bitのデータ$1000010000
$0001$0000000000
$0002$4401000100
$0003$0000000000
$0004$FE1111111000010000
00202000
03000300
20000020
11111110
20000020
30000030
00000000
$0005$0000000000
$0006$8210000010
$0007$0000000000
$0008上位1bitのデータ$0000000000
$0009$2800101000
$000A$4401000100
$000B$8210000010
$000C$0000000000
$000D$8210000010
$000E$8210000010
$000F$0000000000

○ネームテーブル
ネームテーブルにはBGのタイルパターンの配置を格納します。
タイル番号(0-255)を32x30の配列にいれます。
この部分はRAMになっていて、CPUからI/Oレジスタを通して変更できます。

4つのネームテーブルがあり、下のような仮想BGを持っています。
ネームテーブル2ネームテーブル3
ネームテーブル0ネームテーブル1
しかし実際は2つ分のメモリしかなく、残りの2つはミラーになります。
ミラーのされ方はカードリッジの種類で変わります。カードリッジにネームテーブル用のRAMを追加し独立した4つのネームテーブルが使えるものもあります。
ミラーのタイプと各ミラーテーブルの実アドレスは下のようになります。
名前ネームテーブル0ネームテーブル1ネームテーブル2ネームテーブル3
水平ミラー$2000$2000$2400$2400
垂直ミラー$2000$2400$2000$2400
4スクリーン$2000$2400$2800$2C00
横スクロールゲームでは垂直ミラー、縦スクロールゲームでは水平ミラーを使うといいです。

○属性テーブル
属性テーブルはネームテーブルで並べられたタイルパターンのパレットの上位2bitを格納します。
1バイトに4x4タイル(32x32ドット)のデータを格納されていて、それが8x8の配列(計64バイト)で並んでいます。
各1バイトデータのビットの内容は下のようになります。
4x4タイルのデータを下のように名前をつけます。
グループ0
タイル0タイル1
タイル2タイル3
グループ1
タイル4タイル5
タイル6タイル7
グループ2
タイル8タイル9
タイルAタイルB
グループ3
タイルCタイルD
タイルEタイルF

この4x4タイルの属性データは下のようになります。
bit0-1グループ0のパレットの上位2bit
bit2-3グループ1のパレットの上位2bit
bit4-5グループ2のパレットの上位2bit
bit6-7グループ3のパレットの上位2bit

すなわち2x2タイルでは同じ4色パレットを使うことになります。