hack游戏吧 关注:13,883贴子:89,104
  • 1回复贴,共1

[FC][常见mapper说明]

只看楼主收藏回复

Mapper 0
不能切换PROM和CHR ROM;
ROM最大为2x16KB PROM + 1x8KB CHR ROM = 40KB;
ROM载入模拟器时PROM装载到内存的$8000-$FFFF(32KB);
CHR ROM装载到PPU的$0000-$1FFF;
Mapper 1
$8000-$9FFF: 寄存器0(设置寄存器1-3的PROM/VROM模式,状态)
位0-1: 命名表镜像
0:水平镜像
1:垂直镜像
2:双屏幕垂直镜像
3:双屏幕水平镜像
位2: bank地址控制
0:切换bank到$C000
1:切换bank到$8000
位3: bank容量控制
0:bank容量为32KB
1:bank容量为16KB
位4: VROM模式控制
0:8KB的VRAM映射到$0000(通过寄存器1-2 写入VROM页码)
1:4KB的VRAM映射到$0000和$1000(通过寄存器1-2 写入VROM页码)
$A000-$BFFF: 寄存器1(设置VROM的4KB/8KB模式)
位4-0:
选择4K或8K VROM映射到PPU的$0000(4K和8K模式,受寄存器0的位4影响)
$C000-$DFFF: 寄存器2(设置VROM的4KB模式)
位4-0:
选择4K VROM映射到PPU的$1000(只使用在4K模式,受寄存器0的位4影响)
$E000-$FFFF: 寄存器3(写入PROM的编号,只使用位0-位3(00-0F))
位3-0:
选择16KB或32KB(受寄存器0的位3-2影响)映射到$8000-$BFFF/$8000-$FFFF
注:向mapper1的寄存器写入数据时一次只能写入一位,所有寄存器只是用了8位中的5位(D4-D0),所以向寄存器写入数据时需要写5次,写完一次逻辑右移一次。
比方向寄存器0写入0x1E(二进制00011110):
LDA #$1E(二进制00011110)
STA $9FFF
LSR 右移后得(二进制00011110)
STA $9FFF
LSR 右移后得(二进制00001111)
STA $9FFF
LSR 右移后得(二进制00000111)
STA $9FFF
LSR 右移后得(二进制00000011)
STA $9FFF
LSR 右移后得(二进制00000001)
STA $9FFF
例子:忍者龙剑传1代日版
81E9:8D FF 9F STA $9FFF 设置镜像 水平/垂直镜像
81EC:4A LSR
81ED:8D FF 9F STA $9FFF 设置镜像 双屏幕水平/垂直镜像
81F0:4A LSR
81F1:8D FF 9F STA $9FFF 设置bank地址控制
81F4:4A LSR
81F5:8D FF 9F STA $9FFF 设置bank容量控制
81F8:4A LSR
81F9:8D FF 9F STA $9FFF 设置VROM模式控制
81FC:60 RTS
F985:A5 56 LDA $0056
F987:8D FF BF STA $BFFF
F98A:4A LSR
F98B:8D FF BF STA $BFFF
F98E:4A LSR
F98F:8D FF BF STA $BFFF
F992:4A LSR
F993:8D FF BF STA $BFFF
F996:4A LSR
F997:8D FF BF STA $BFFF 设置VROM的4KB/8KB模式
F99A:A5 59 LDA $0059
F99C:8D FF DF STA $DFFF
F99F:4A LSR
F9A0:8D FF DF STA $DFFF
F9A3:4A LSR
F9A4:8D FF DF STA $DFFF
F9A7:4A LSR
F9A8:8D FF DF STA $DFFF
F9AB:4A LSR
F9AC:8D FF DF STA $DFFF 设置VROM的4KB模式
C028:85 5C STA $005C
C02A:8D FF FF STA $FFFF
C02D:4A LSR
C02E:8D FF FF STA $FFFF
C031:4A LSR
C032:8D FF FF STA $FFFF
C035:4A LSR
C036:8D FF FF STA $FFFF
C039:4A LSR
C03A:8D FF FF STA $FFFF 写入PROM的编号
C03D:60 RTS
Mapper 2
可切换PROM,没有CHR ROM;
CHR混合在PROM中,取出PROM中的CHR数据写入到PPU的$0000-$1FFF。
$8000-$FFFF: 选择16KB存储体映射到$8000-$BFFF
向$8000-$FFFF写入一个bank号,将该16KB存储体映射到$8000-BFFF.
例子:魂斗罗1代美版
C13F:B9 D0 FF LDA $FFD0,Y 读取bank号
C142:99 D0 FF STA $FFD0,Y 映射到$8000-BFFF
C145:60 RTS 返回
Mapper 3
可切换CHR ROM但不可切换PROM,CHR寄存器2位宽;
ROM最大为2x16KB PROM + 4x8KB = 64KB。
$8000-$FFFF: PPU页面号(CHR寄存器2位宽,最大支持32KB的CHR ROM)
选择8KB CHR ROM映射到PPU的$0000-$1FFF
向$8000-$FFFF写入一个数据,将该8KB的CHR ROM映射到PPU的
例子:冒险岛1代
B7B1:BD FF B7 LDA $B7FF,X 读取CHR ROM号
B7B4:9D FF B7 STA $B7FF,X 映射到PPU的$0000-$1FFF
Mapper 4
可切换PROM和CHR ROM。
$8000: 模式号
位D0-D2:
0:选择2KB的VROM存储体映射到PPU的$0000
1:选择2KB的VROM存储体映射到PPU的$0800
2:选择1KB的VROM存储体映射到PPU的$1000
3:选择1KB的VROM存储体映射到PPU的$1400
4:选择1KB的VROM存储体映射到PPU的$1800
5:选择1KB的VROM存储体映射到PPU的$1C00
6:选择8KB的ROM存储体映射到$8000
7:选择8KB的ROM存储体映射到$A000
位D6:
0:允许擦写$8000和$A000
1:允许擦写$A000和$C000
位D7:
0:模式号D0-D2使用普通地址
1:模式号D0-D2地址异或$1000
$8001: 模式页面号
写入一个数(00-07),切换存储体到对应地址
$A000: 镜像选择
0:垂直镜像
1:水平镜像
$A001: SaveRAM 切换
0:禁用$6000-$7FFF
1:启用$6000-$7FFF
$C000: IRQ计数器
IRQ计数器的值存储在此处
$C001: IRQ暂存器
IRQ暂存器的值存储在此处
$E000: IRQ控制计数器0
向这里写入任何数来关闭IRQ,并从暂存器中拷贝数据开始计数,进入IRQ
$E001: IRQ控制计数器1
向这里写入任何数,允许IRQ(退出IRQ,允许下一个IRQ进来)
例子:超级魂斗罗2代日版
FED3:A5 26 LDA $0026
FED5:8D 00 A0 STA $A000 设置镜像
FED8:A0 00 LDY #$00
FEDA:8C 00 80 STY $8000 设置映射到PPU的 $0000-$07FF
FEDD:AD F0 07 LDA $07F0
FEE0:8D 01 80 STA $8001 将CHR ROM映射到PPU的 $0000-$07FF
FEE3:C8 INY
FEE4:8C 00 80 STY $8000 设置映射到PPU的 $0800-$0FFF
FEE7:AD F1 07 LDA $07F1
FEEA:8D 01 80 STA $8001 将CHR ROM映射到PPU的 $0F00-$0FFF
FEED:C8 INY
FEEE:8C 00 80 STY $8000 设置映射到PPU的 $1000-$13FF
FEF1:AD F2 07 LDA $07F2
FEF4:8D 01 80 STA $8001 将CHR ROM映射到PPU的 $1000-$13FF
FEF7:C8 INY
FEF8:8C 00 80 STY $8000 设置映射到PPU的 $1400-$17FF
FEFB:AD F3 07 LDA $07F3
FEFE:8D 01 80 STA $8001 将CHR ROM映射到PPU的 $1400-$17FF
FF01:C8 INY
FF02:8C 00 80 STY $8000 设置映射到PPU的 $1800-$1EFF
FF05:AD F4 07 LDA $07F4
FF08:8D 01 80 STA $8001 将CHR ROM映射到PPU的 $1800-$1EFF
FF0B:C8 INY
FF0C:8C 00 80 STY $8000 设置映射到PPU的 $1C00-$1FFF
FF0F:AD F5 07 LDA $07F5
FF12:8D 01 80 STA $8001 将CHR ROM映射到PPU的 $1C00-$1FFF
FF15:60 RTS
FD35:8E ED 07 STX $07ED
FD38:A2 06 LDX #$06
FD3A:86 25 STX $0025
FD3C:8E 00 80 STX $8000 设置映射到 $8000-$9FFF
FD3F:8D 01 80 STA $8001 bank映射到 $8000-$9FFF
FD42:E8 INX
FD43:86 25 STX $0025
FD45:8E 00 80 STX $8000 设置映射到 $A000-$BFFF
FD48:8C 01 80 STY $8001 bank映射到 $A000-$BFFF
FD4B:AE ED 07 LDX $07ED
FD4E:60
FC04:A5 45 LDA $0045
FC06:8D 00 C0 STA $C000 设置IRQ计数器
FC09:8D 01 C0 STA $C001 设置IRQ暂存器
FC0C:9D 00 E0 STA $E000,X 设置IRQ控制计数器
Mapper 23
$8000: 选择8KB的ROM存储体映射到$8000
$9000: 0:垂直镜像
1:水平镜像
2:$2400镜像
3:$2000镜像
$A000: 选择8KB的ROM存储体映射到$A000
$B000: 选择1KB的VROM存储体映射到PPU的$0000(低4位)
$B001: 选择1KB的VROM存储体映射到PPU的$0000(高4位)
$B002: 选择1KB的VROM存储体映射到PPU的$0400(低4位)
$B003: 选择1KB的VROM存储体映射到PPU的$0400(高4位)
$C000: 选择1KB的VROM存储体映射到PPU的$0800(低4位)
$C001: 选择1KB的VROM存储体映射到PPU的$0800(高4位)
$C002: 选择1KB的VROM存储体映射到PPU的$0C00(低4位)
$C003: 选择1KB的VROM存储体映射到PPU的$0C00(高4位)
$D000: 选择1KB的VROM存储体映射到PPU的$1000(低4位)
$D001: 选择1KB的VROM存储体映射到PPU的$1000(高4位)
$D002: 选择1KB的VROM存储体映射到PPU的$1400(低4位)
$D003: 选择1KB的VROM存储体映射到PPU的$1400(高4位)
$E000: 选择1KB的VROM存储体映射到PPU的$1800(低4位)
$E001: 选择1KB的VROM存储体映射到PPU的$1800(高4位)
$E002: 选择1KB的VROM存储体映射到PPU的$1C00(低4位)
$E003: 选择1KB的VROM存储体映射到PPU的$1C00(高4位)
例子:魂斗罗1代日版
F989:AD 00 80 LDA $8000 读取bank号
F98C:8D EC 07 STA $07EC 保存到$07EC
F98F:8C 00 80 STY $8000 bank映射到$8000-9FFF
F992:C8 INY
F993:8C 00 A0 STY $A000 bank映射到$A000-BFFF
F996:60 RTS
FACE:AD F0 07 LDA $07F0
FAD1:8D 00 B0 STA $B000 将CHR ROM(低4位)映射到PPU的 $0000-$03FF
FAD4:4A LSR
FAD5:4A LSR
FAD6:4A LSR
FAD7:4A LSR
FAD8:8D 01 B0 STA $B001 将CHR ROM(高4位)映射到PPU的 $0000-$03FF
FADB:AD F1 07 LDA $07F1
FADE:8D 02 B0 STA $B002 将CHR ROM(低4位)映射到PPU的 $0400-$07FF
FAE1:4A LSR
FAE2:4A LSR
FAE3:4A LSR
FAE4:4A LSR
FAE5:8D 03 B0 STA $B003 将CHR ROM(高4位)映射到PPU的 $0400-$07FF
FAE8:AD F2 07 LDA $07F2
FAEB:8D 00 C0 STA $C000 将CHR ROM(低4位)映射到PPU的 $0800-$0BFF
FAEE:4A LSR
FAEF:4A LSR
FAF0:4A LSR
FAF1:4A LSR
FAF2:8D 01 C0 STA $C001 将CHR ROM(高4位)映射到PPU的 $0800-$0BFF
FAF5:AD F3 07 LDA $07F3
FAF8:8D 02 C0 STA $C002 将CHR ROM(低4位)映射到PPU的 $0C00-$0FFF
FAFB:4A LSR
FAFC:4A LSR
FAFD:4A LSR
FAFE:4A LSR
FAFF:8D 03 C0 STA $C003 将CHR ROM(高4位)映射到PPU的 $0C00-$0FFF
FB02:AD F4 07 LDA $07F4
FB05:8D 00 D0 STA $D000 将CHR ROM(低4位)映射到PPU的 $1000-$13FF
FB08:4A LSR
FB09:4A LSR
FB0A:4A LSR
FB0B:4A LSR
FB0C:8D 01 D0 STA $D001 将CHR ROM(高4位)映射到PPU的 $1000-$13FF
FB0F:AD F5 07 LDA $07F5
FB12:8D 02 D0 STA $D002 将CHR ROM(低4位)映射到PPU的 $1400-$17FF
FB15:4A LSR
FB16:4A LSR
FB17:4A LSR
FB18:4A LSR
FB19:8D 03 D0 STA $D003 将CHR ROM(高4位)映射到PPU的 $1400-$17FF
FB1C:AD F6 07 LDA $07F6
FB1F:8D 00 E0 STA $E000 将CHR ROM(低4位)映射到PPU的 $1800-$1BFF
FB22:4A LSR
FB23:4A LSR
FB24:4A LSR
FB25:4A LSR
FB26:8D 01 E0 STA $E001 将CHR ROM(高4位)映射到PPU的 $1800-$1BFF
FB29:AD F7 07 LDA $07F7
FB2C:8D 02 E0 STA $E002 将CHR ROM(低4位)映射到PPU的 $1C00-$1FFF
FB2F:4A LSR
FB30:4A LSR
FB31:4A LSR
FB32:4A LSR
FB33:8D 03 E0 STA $E003 将CHR ROM(高4位)映射到PPU的 $1C00-$1FFF
FB36:A9 00 LDA #$00
FB38:8D 00 90 STA $9000 设置镜像
FB3B:60 RTS


IP属地:广东1楼2017-04-30 14:32回复
    支持大神发教程,


    IP属地:安徽来自Android客户端2楼2017-04-30 15:53
    回复