メモリマッピング
SNESの仮想メモリ空間について説明します。

バス
バス(bus)とは、コンピュータの内外で各回路がデータをやり取りするための共通経路を指す言葉です。SNESには8ビット幅のデータバスが1つと、2つのアドレスバスがあります。アドレスバスはそれぞれアドレスバスA, Bと呼ばれます。

1. データバス
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

1. アドレスバス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

3. アドレスバス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に配置され、PPU1および2はアドレスバスBの$2100 - $213Fに配置されます。
これらを総合すると、次のようなメモリマップが導かれます。なお、この表における「速度」の列は、その領域に対するメモリアクセス速度を表します。
CPUのクロック周波数はNTSCでは21.47727MHz、PALでは21.28137MHzで、内部動作サイクルは常に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モデルの実際のメモリマッピングは次のようになります。

バンク アドレス マッピング ミラーバンク
$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 - $1FFF
下位RAM
$00 - $3F
$2000 - $7FFF
上位RAM
 
$8000 - $FFFF
拡張RAM
 
$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)
 
$FE - $FF
$8000 - $FFFF
Mode 20 ROM
 

HiROMメモリマップ
HiROMモデルの実際のメモリマッピングは次のようになります。

バンク アドレス マッピング ミラーバンク
$00 - $1F
$0000 - $1FFF
下位RAM
$7E
$2000 - $20FF
未割当
$80 - $9F
$2100 - $21FF
I/Oポート (PPU1, APU)
$80 - $9F
$2200 - $2FFF
未割当
$80 - $9F
$3000 - $3FFF
I/Oポート (SFX, DSPなど)
$80 - $9F
$4000 - $40FF
I/Oポート (PAD)
$80 - $9F
$4100 - $41FF
未割当
$80 - $9F
$4200 - $44FF
I/Oポート (PPU2, DMAなど)
$80 - $9F
$4500 - $5FFF
未割当
$80 - $9F
$6000 - $7FFF
(予約)
$80 - $9F
$8000 - $FFFF
Mode 21 ROM ($C0 - $EFから)
$80 - $9F
$20 - $2F
$0000 - $1FFF
下位RAM
$7E
$2000 - $20FF
未割当
$A0 - $BF
$2100 - $21FF
I/Oポート (PPU1, APU)
$A0 - $BF
$2200 - $2FFF
未割当
$A0 - $BF
$3000 - $3FFF
I/Oポート (SFX, DSPなど)
$A0 - $BF
$4000 - $40FF
I/Oポート (PAD)
$A0 - $BF
$4100 - $41FF
未割当
$A0 - $BF
$4200 - $44FF
I/Oポート (PPU2, DMAなど)
$A0 - $BF
$4500 - $5FFF
未割当
$A0 - $BF
$6000 - $7FFF
Mode 21 SRAM (128KB)
$A0 - $BF
$8000 - $FFFF
Mode 21 ROM ($C0 - $EFから)
$A0 - $BF
$40 - $7D
$0000 - $FFFF
Mode 21 ROM
 
$7E
$0000 - $1FFF
下位RAM
$00 - $3F
$2000 - $7FFF
上位RAM
 
$8000 - $FFFF
拡張RAM
 
$7F
$0000 - $FFFF
拡張RAM
 
$80 - $DF
$0000 - $FFFF
バンク$00 - $3Fのミラー
$00 - $3F
$C0 - $EF
$0000 - $FFFF
Mode 21 ROM