メモリマッピング
SNESの仮想メモリ空間について説明します。
バス
バス(bus)とは、コンピュータの内外で各回路がデータをやり取りするための共通経路を指す言葉です。SNESには8ビット幅のデータバスが1つと、2つのアドレスバスがあります。アドレスバスはそれぞれアドレスバスA, Bと呼ばれます。
- データバス
8ビット幅で、データのやり取りをするために使用します。データバスに値が書き込まれていないときに読み込むと、最後にバスに書き込まれた値が代わりに返ります。これはオープンバスと呼ばれます。
| ライン | カートリッジ | 拡張 |
|---|---|---|
| D0 | 19 | 11 |
| D1 | 20 | 12 |
| D2 | 21 | 13 |
| D3 | 22 | 14 |
| D4 | 50 | 15 |
| D5 | 51 | 16 |
| D6 | 52 | 17 |
| D7 | 53 | 18 |
- アドレスバスA
24ビット幅で、読み込み/書き込みライン(/RDおよび/WR)と、2つの補助ラインを併用します。このバスはカートリッジとWRAMの両方に接続されます。
| ライン | カートリッジ | ライン | カートリッジ |
|---|---|---|---|
| A0 | 17 | A14 | 39 |
| A1 | 16 | A15 | 40 |
| A2 | 15 | A16 | 41 |
| A3 | 14 | A17 | 42 |
| A4 | 13 | A18 | 43 |
| A5 | 12 | A19 | 44 |
| A6 | 11 | A20 | 45 |
| A7 | 10 | A21 | 46 |
| A8 | 9 | A22 | 47 |
| A9 | 8 | A23 | 48 |
| A10 | 7 | /RD | 23 |
| A11 | 6 | /WR | 54 |
| A12 | 37 | /CART | 49 |
| A13 | 38 | /WRAM | 32 |
- アドレスバスB
8ビット幅で、読み込み/書き込みライン(/PARDおよび/PAWR)と併用します。
このバスはカートリッジと拡張ポートだけではなく、WRAM, PPU1, PPU2, APUにも接続されています。PPUやAPUとの通信はこのバスを通して行います。
| ライン | カートリッジ | 拡張 |
|---|---|---|
| PA0 | 28 | 1 |
| PA1 | 59 | 2 |
| PA2 | 29 | 3 |
| PA3 | 60 | 4 |
| PA4 | 30 | 5 |
| PA5 | 61 | 6 |
| PA6 | 3 | 7 |
| PA7 | 34 | 8 |
| /PARD | 4 | 10 |
| /PAWR | 35 | 9 |
メモリマップ
アドレスバスAにはLoROMやHiROMなどの異なる種類のカートリッジが配置されます。カートリッジは/CART信号がアクティブなときにだけ反応し、また、アドレスバスA, Bどちらの信号にも反応できますが、片方は無視されます。同様に、拡張ポートにデバイスが接続された場合には、アドレスバスBのマップされていないレジスタに反応します。
WRAMは/WRAM信号がアクティブなときはアドレスバスAに配置され、同時にレジスタ$2180 - $2183を通じてアドレスバスBに配置されます。
APUはアドレスバスBの$40 - $7F(CPUからは$2140 - $217F)に配置され、PPU1および2はアドレスバスBの$00 - $3F(CPUからは$2100 - $213F)に配置されます。
これらを総合すると、次のようなメモリマップが導かれます。なお、この表における「速度」の列は、その領域に対するメモリアクセス速度を表します。
マスタークロックの周波数はNTSCでは21.47727MHz、PALでは21.28137MHzで、CPUの内部動作サイクルは常に6マスターサイクルとなります。
Fastメモリアクセスは6マスターサイクル(3.58MHz/ 3.55MHz)、Slowメモリアクセスは8マスターサイクル(2.68MHz/ 2.66MHz)、XSlowメモリアクセスは12マスターサイクル(1.79MHz/ 1.77MHz)の時間をそれぞれ要します。
| バンク | アドレス | 速度 | マッピング |
|---|---|---|---|
| $00 - $3F | $0000 - $1FFF | Slow | アドレスバスA + /WRAM (ミラーバンク: $7E) |
| $2000 - $20FF | Fast | アドレスバスA | |
| $2100 - $21FF | Fast | アドレスバスB | |
| $2200 - $3FFF | Fast | アドレスバスA | |
| $4000 - $41FF | XSlow | 内部CPUレジスタ[*1] | |
| $4200 - $43FF | Fast | 内部CPUレジスタ[*1] | |
| $4400 - $5FFF | Fast | アドレスバスA | |
| $6000 - $7FFF | Slow | アドレスバスA | |
| $8000 - $FFFF | Slow | アドレスバスA + /CART | |
| $40 - $7D | $0000 - $FFFF | Slow | アドレスバスA + /CART |
| $7E - $7F | $0000 - $FFFF | Slow | アドレスバスA + /WRAM |
| $80 - $BF | $0000 - $1FFF | Slow | アドレスバスA + /WRAM (ミラーバンク: $7E) |
| $2000 - $20FF | Fast | アドレスバスA | |
| $2100 - $21FF | Fast | アドレスバスB | |
| $2200 - $3FFF | Fast | アドレスバスA | |
| $4000 - $41FF | XSlow | 内部CPUレジスタ[*1] | |
| $4200 - $43FF | Fast | 内部CPUレジスタ[*1] | |
| $4400 - $5FFF | Fast | アドレスバスA | |
| $6000 - $7FFF | Slow | アドレスバスA | |
| $8000 - $FFFF | Slow/ Fast[*2] | アドレスバスA + /CART | |
| $C0 - $FF | $0000 - $FFFF | Slow/ Fast[*2] | アドレスバスA + /CART |
補注
[1] 内部CPUレジスタ用のアドレスはアドレスバスAの外にあり、CPUはデータバスを無視する。
[2] CPUレジスタ $420D のビット0がセットされているときはFast、クリアされている場合はSlowとなる。
LoROMメモリマップ
LoROMモデルではバスのA15ピンおよびA23ピンはROMに接続されず、また、バスのA16~A22ピンがROMのA15~A21ピンに接続されます。
ROMに接続されないA15ピンは、通常/CARTピンおよび/WRピンと組み合わされ、A15ピンがHighのときにROMを、A15ピンがLowのときにSRAMを選択します。
したがって、LoROMモデルでは原則としてバスの下位バンクにはROMがマッピングされません。その分、大容量SRAMを搭載することが可能です。
アドレスピンが最大22ビットであることから分かる通り、ROM容量は最大4MBです。
LoROMモデルの標準的なメモリマッピングは次のようになります。
| バンク | アドレス | マッピング | ミラーバンク |
|---|---|---|---|
| $00 - $3F | $0000 - $1FFF | 下位RAM | $7E |
| $2000 - $2FFF | I/Oポート (PPU1, APU) | $80 - $BF | |
| $3000 - $3FFF | I/Oポート (SFX, DSPなど) | $80 - $BF | |
| $4000 - $41FF | I/Oポート (PAD) | $80 - $BF | |
| $4200 - $5FFF | I/Oポート (PPU2, DMAなど) | $80 - $BF | |
| $6000 - $7FFF | (予約) | $80 - $BF | |
| $8000 - $FFFF | Mode 20 ROM | $80 - $BF | |
| $40 - $6F | $0000 - $7FFF | Mode 20 ROM MAD-1チップの場合は未割当 | $C0 - $EF |
| $8000 - $FFFF | Mode 20 ROM | $C0 - $EF | |
| $70 - $7D | $0000 - $7FFF | Mode 20 SRAM (448KB) | $F0 - $FD |
| $8000 - $FFFF | Mode 20 ROM | $F0 - $FD | |
| $7E | $0000 - $FFFF | 拡張RAM | $00 - $3F |
| $7F | $0000 - $FFFF | 拡張RAM | |
| $80 - $BF | $0000 - $FFFF | バンク$00 - $3Fのミラー | $00 - $3F |
| $C0 - $EF | $0000 - $FFFF | バンク$40 - $6Fのミラー | $40 - $6F |
| $F0 - $FD | $0000 - $FFFF | バンク$70 - $7Dのミラー | $70 - $7D |
| $FE - $FF | $0000 - $7FFF | Mode 20 SRAM (64KB) | |
| $8000 - $FFFF | Mode 20 ROM |
HiROMメモリマップ
HiROMモデルでは、バスのA0からA21ピンがそのままの順序でROMに接続され、64KBバンクをリニアにアクセスすることができます。
A22ピンおよびA23ピンはROMに接続されません。
アドレスピンが最大22ビットであることから分かる通り、ROM容量は最大4MBです。
HiROMモデルの標準的なメモリマッピングは次のようになります。
| バンク | アドレス | マッピング | ミラーバンク |
|---|---|---|---|
| $00 - $2F | $0000 - $1FFF | 下位RAM | $7E |
| $2000 - $20FF | 未割当 | $80 - $AF | |
| $2100 - $21FF | I/Oポート (PPU1, APU) | $80 - $AF | |
| $2200 - $2FFF | 未割当 | $80 - $AF | |
| $3000 - $3FFF | I/Oポート (SFX, DSPなど) | $80 - $AF | |
| $4000 - $40FF | I/Oポート (PAD) | $80 - $AF | |
| $4100 - $41FF | 未割当 | $80 - $AF | |
| $4200 - $44FF | I/Oポート (PPU2, DMAなど) | $80 - $AF | |
| $4500 - $5FFF | 未割当 | $80 - $AF | |
| $6000 - $7FFF | (予約) | $80 - $AF | |
| $8000 - $FFFF | Mode 21 ROM ($C0 - $EFから) | $80 - $AF | |
| $30 - $3F | $0000 - $1FFF | 下位RAM | $7E |
| $2000 - $20FF | 未割当 | $B0 - $BF | |
| $2100 - $21FF | I/Oポート (PPU1, APU) | $B0 - $BF | |
| $2200 - $2FFF | 未割当 | $B0 - $BF | |
| $3000 - $3FFF | I/Oポート (SFX, DSPなど) | $B0 - $BF | |
| $4000 - $40FF | I/Oポート (PAD) | $B0 - $BF | |
| $4100 - $41FF | 未割当 | $B0 - $BF | |
| $4200 - $44FF | I/Oポート (PPU2, DMAなど) | $B0 - $BF | |
| $4500 - $5FFF | 未割当 | $B0 - $BF | |
| $6000 - $7FFF | Mode 21 SRAM (128KB) | $B0 - $BF | |
| $8000 - $FFFF | Mode 21 ROM ($F0 - $FFから) | $B0 - $BF | |
| $40 - $7D | $0000 - $FFFF | Mode 21 ROM | $C0 - $FD |
| $7E | $0000 - $1FFF | 下位RAM | $00 - $3F |
| $2000 - $7FFF | 上位RAM | ||
| $8000 - $FFFF | 拡張RAM | ||
| $7F | $0000 - $FFFF | 拡張RAM | |
| $80 - $BF | $0000 - $FFFF | バンク$00 - $3Fのミラー | $00 - $3F |
| $C0 - $FF | $0000 - $FFFF | Mode 21 ROM |
ExHiROMメモリマップ
ExHiROMモデルは、4MBのROMチップに加え、最大4MBの追加のROMチップを搭載することができます。
バスのA22ピンは依然としてROMに接続されませんが、A23ピンはカートリッジ基板上の2つのROMチップのどちらをアクティブにするかを選択するために使用されます。
A23ピンがHighのとき、ROM1が選択され、Loのとき、ROM2が選択されます。また、ROM1はFastROMにすることができますが、ROM2はSlowROMに制限されます。
ただし、メモリマップの関係上、カートリッジヘッダはROM2に置かれ、また、ROM2の末尾2バンクの各々下位32KB(物理アドレス$7E:0000 - 7FFF および $7F:0000 - 7FFF)はアクセスすることができません。
ROM2の末尾2バンクの各々上位32KB(物理アドレス$7E:8000 - FFFF および $7F:8000 - FFFF)はバスのバンク$3Eおよび$3Fにマッピングされます。
ExHiROMモデルの標準的なメモリマッピングは次のようになります。
| バンク | アドレス | マッピング | ミラーバンク |
|---|---|---|---|
| $00 - $2F | $0000 - $1FFF | 下位RAM | $7E |
| $2000 - $20FF | 未割当 | $80 - $AF | |
| $2100 - $21FF | I/Oポート (PPU1, APU) | $80 - $AF | |
| $2200 - $2FFF | 未割当 | $80 - $AF | |
| $3000 - $3FFF | I/Oポート (SFX, DSPなど) | $80 - $AF | |
| $4000 - $40FF | I/Oポート (PAD) | $80 - $AF | |
| $4100 - $41FF | 未割当 | $80 - $AF | |
| $4200 - $44FF | I/Oポート (PPU2, DMAなど) | $80 - $AF | |
| $4500 - $5FFF | 未割当 | $80 - $AF | |
| $6000 - $7FFF | (予約) | $80 - $AF | |
| $8000 - $FFFF | Mode 25 ROM2 | $40 - $6F | |
| $30 - $3F | $0000 - $1FFF | 下位RAM | $7E |
| $2000 - $20FF | 未割当 | $B0 - $BF | |
| $2100 - $21FF | I/Oポート (PPU1, APU) | $B0 - $BF | |
| $2200 - $2FFF | 未割当 | $B0 - $BF | |
| $3000 - $3FFF | I/Oポート (SFX, DSPなど) | $B0 - $BF | |
| $4000 - $40FF | I/Oポート (PAD) | $B0 - $BF | |
| $4100 - $41FF | 未割当 | $B0 - $BF | |
| $4200 - $44FF | I/Oポート (PPU2, DMAなど) | $B0 - $BF | |
| $4500 - $5FFF | 未割当 | $B0 - $BF | |
| $6000 - $7FFF | Mode 25 SRAM (128KB) | $B0 - $BF | |
| $8000 - $FFFF | Mode 25 ROM2 | $70 - $7D | |
| $40 - $7D | $0000 - $FFFF | Mode 25 ROM2 | |
| $7E | $0000 - $1FFF | 下位RAM | $00 - $3F |
| $2000 - $7FFF | 上位RAM | ||
| $8000 - $FFFF | 拡張RAM | ||
| $7F | $0000 - $FFFF | 拡張RAM | |
| $80 - $BF | $0000 - $7FFF | バンク$00 - $3Fのミラー | $00 - $3F |
| $8000 - $FFFF | Mode 25 ROM1 | $C0 - $FF | |
| $C0 - $FF | $0000 - $FFFF | Mode 25 ROM1 |
ExLoROMメモリマップ
ExLoROMモデルは非標準のマッピングです。ExHiROMと同様、4MBのROMチップに加え、最大4MBの追加のROMチップを搭載することができます。
バスのA15ピンは依然としてROMに接続されませんが、A23ピンはカートリッジ基板上の2つのROMチップのどちらをアクティブにするかを選択するために使用されます。
A23ピンがHighのとき、ROM1が選択され、Loのとき、ROM2が選択されます。また、ROM1はFastROMにすることができますが、ROM2はSlowROMに制限されます。
ただし、メモリマップの関係上、カートリッジヘッダはROM2に置かれ、また、ROM2の最後のバンク(物理アドレス$7F:0000 - FFFF)はアクセスすることができません。
ExLoROMモデルの標準的なメモリマッピングは次のようになります。
| バンク | アドレス | マッピング | ミラーバンク |
|---|---|---|---|
| $00 - $3F | $0000 - $1FFF | 下位RAM | $7E |
| $2000 - $2FFF | I/Oポート (PPU1, APU) | $80 - $BF | |
| $3000 - $3FFF | I/Oポート (SFX, DSPなど) | $80 - $BF | |
| $4000 - $41FF | I/Oポート (PAD) | $80 - $BF | |
| $4200 - $5FFF | I/Oポート (PPU2, DMAなど) | $80 - $BF | |
| $6000 - $7FFF | (予約) | $80 - $BF | |
| $8000 - $FFFF | Mode 26 ROM2 | ||
| $40 - $6F | $0000 - $7FFF | Mode 26 ROM2? | |
| $8000 - $FFFF | Mode 26 ROM2 | ||
| $70 - $7D | $0000 - $7FFF | Mode 26 SRAM (448KB) | $F0 - $FD |
| $8000 - $FFFF | Mode 26 ROM2 | ||
| $7E | $0000 - $FFFF | 拡張RAM | $00 - $3F |
| $7F | $0000 - $FFFF | 拡張RAM | |
| $80 - $BF | $0000 - $7FFF | バンク$00 - $3Fのミラー | $00 - $3F |
| $8000 - $FFFF | Mode 26 ROM1 | ||
| $C0 - $EF | $0000 - $FFFF | Mode 26 ROM1? | |
| $8000 - $FFFF | Mode 26 ROM1 | ||
| $F0 - $FF | $0000 - $7FFF | Mode 26 SRAM (512KB) | |
| $F0 - $FF | $8000 - $FFFF | Mode 26 ROM1 |