下表のような形です。
Address | Usage |
---|---|
$0000〜$00FF | Zero page |
$0100〜$01FF | Stack |
$0200〜$4FFF | RAM |
$5000〜$53FF | Sprite OAM (4x256) |
$5400 | I/O port (RW): PRG Bank of $8000〜$BFFF |
$5401 | I/O port (RW): PRG Bank of $C000〜$FFFF |
$5402〜$5BFF | other I/O ports (WIP) |
$5C00〜$5FFF | Palette |
$6000〜$63FF | BG nametable 0 (LT; 左上) |
$6400〜$67FF | BG nametable 1 (RT; 右上) |
$6800〜$6BFF | BG nametable 2 (LB; 左下) |
$6C00〜$6FFF | BG nametable 3 (RB; 右下) |
$7000〜$73FF | FG nametable 0 (LT; 左上) |
$7400〜$77FF | FG nametable 1 (RT; 右上) |
$7800〜$7BFF | FG nametable 2 (LB; 左下) |
$7C00〜$7FFF | FG nametable 3 (RB; 右下) |
$8000〜$BFFF | Program 0 |
$C000〜$FFFF | Program 1 |
あと、$8000以降に16KB区切りで2つのプログラムデータを置ける点もファミコンと同じです。
それ以外はかなり弄りました。
まず、最大の違いはRAMです。
ファミコンの場合、基本マッパー(mapper0)のRAM(WRAM)は$0200〜$1FFFで、$2000〜$3FFFがI/Oやミラーですが、VGS8では$0200〜$4FFFまでの19KBを丸々RAMとして使うことができます。
そして、ファミコンの場合、OAM(スプライトのメモリ)をPPU側に持っていて、RAMの任意1ページ(256バイト)をDMA転送して使うのですが、VGS8の場合、$5000〜$53FFまでの1KBがPPUのOAMにダイレクトマップされています。つまり、スプライト描画にDMA転送しなくても良いのです。スゴイ!(なお、スプライト表示数の上限はファミコンは64個 & 水平最大8個ですが、VGS8は256個 & 水平上限が無制限です)
$5400〜$5BFFはI/Oポートとしてリザーブしました。
用途はまだ考えていません。
シンプルなPPU/APUアクセスに加えて、C言語のmemmove関数相当のメモリブロック転送機能を実装する予定です。
$5C00〜$5FFFの1KBはパレットデータです。
ファミコンの場合、スプライトとBGそれぞれに2bitカラーのパレットを4個割り当てることができますが、VGS8は旧VGSの仕様を引き継いで、256色パレット1つをBG/FG/スプライトのそれぞれで共有します。つまり、VGS8の最大同時発色数はシンプルに256色となります。
$6000〜$7FFFの8KBはドカンと全部nametableです。
ファミコンはBG4スクリーン分のnametableがあって内2スクリーンは必ずミラーですが、VGS8はBG/FGそれぞれ4スクリーンフルに利用することができます。
また、FGというファミコンには無いグラフィック機能があります。
ファミコンのBGは、「すべてをスプライトの背面」or「すべてをスプライトの前面」の何れかしか表示することができませんが、VGS8では「BGは必ずスプライト背面」「FGは必ずスプライト前面」に表示する仕様です。
しかも、I/OポートでPPUへアクセスする必要が無く、OAMと同様PPUのnametableにダイレクトマップされる仕様です。
また、ファミコンの場合、バンク切り替えをするにはMMC3やMMC5といった特殊mapperを用いる必要がありますが、VGS8は標準機能としてプログラムとCHR両方のバンク切り替えをサポートしています。
ただし、コナミのグラディウス2等で使われているCHRの部分領域単位でのバンク切り替えには対応しません。この点についてはCPUの速度がファミコン比で4倍以上ある(ファミコンは1.79MHzですがVGS8は今の所8MHzにする予定です)ので、パワーでゴリ押せば大丈夫だろうと思います。
楽しくなってきた。