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

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值