Mapper 档案:MMC1

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  |
      +--------+           |--------|
                              ...

参考

猜你喜欢

转载自blog.csdn.net/ZML086/article/details/129197016