MMC1
- iNES mapper IDs: 001, 105, 155
- PRG ROM 容量: 256K (512K)
- PRG ROM 页大小: 16 KiB
- PRG RAM: 8 KiB
- CHR 容量: 128 KiB ROM
- CHR 页大小: 4 KiB
- Nametable 镜像模式: 固定,水平或者垂直镜像
PRG ROM 内存映射
+-------------+--------------------------------+
| | Bank Selection |
| CPU MEM |--------------------------------|
| ADDR. | PRG Bank | PRG Bank | PRG Bank |
| | Mode 0,1 | Mode 2 | Mode 3 |
+-------------+----------+----------+----------|
| $8000-$BFFF | | 0 | R2 |
+-------------+ R2 +----------+----------+
| $C000-$FFFF | | R2 | -1 |
+-------------+----------+----------+----------+
32KB 模式下,R2 的最低位视作 0
参考实现:
int bank_no = R2;
int offset = addr & 16383;
switch(prg_bank_mode) {
case 0:
case 1: bank_no = R2 & ~1; offset = addr & 32767; break;
case 2: bank_no = addr < 0xC000 ? 0 : R2; break;
case 3: bank_no = addr < 0xC000 ? R2 : -1; break;
}
prg_addr = bank_no < 0 ? prg_rom.size() : 0;
prg_addr += bank_no * 16384 + offset;
图形化解释:
Mode 0,1
--------
...
+---------+ |---------|
$8000 | 32 KB |~~~~~~~~~~>| 32 KB |
+---------+ |---------|
...
Mode 2
------
+---------+ +---------+
$8000 | 16 KB |---------->| 16 KB |
|---------| |---------|
$C000 | 16 KB |~~~~~. ...
+---------+ | |---------|
`~~~~>| 16 KB |
|---------|
...
Mode 3
------
...
+---------+ |---------|
$8000 | 16 KB |~~~~~~~~~~>| 16 KB |
|---------| |---------|
$C000 | 16 KB |-----. ...
+---------+ | |---------|
`---->| 16 KB |
+---------+
CHR 内存映射
+-------------+---------------------+
| | Bank Selection |
| PPU MEM |---------------------|
| ADDR. | CHR Bank | PRG Bank |
| | Mode 0 | Mode 1 |
+-------------+----------+----------+
| $0000-$0FFF | | R0 |
+-------------+ R0 +----------+
| $1000-$1FFF | | R1 |
+-------------+----------+----------+
8KB 下,R0 最低位视作 0
参考实现:
int bank_no = R0;
int offset = addr & 4095;
if (chr_bank_mode0) {
bank_no = R0 & ~1;
offset = addr & 8191;
} else
bank_no = addr < 0x1000 ? R0 : R1;
prg_addr = bank_no * 4096 + offset;
图形化解释:
Mode 0
------
...
+--------+ |--------|
$0000 | 8 KB |~~~~~~~~~~>| 8 KB |
+--------+ |--------|
...
Mode 1
------
...
+--------+ |--------|
$0000 | 4 KB |~~~~~~~~~~>| 8 KB |
+--------+ |--------|
$1000 | 4 KB |~~~~~~~~~~>| 8 KB |
+--------+ |--------|
...