请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

新模拟器共享论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

1

最近看过此主题的会员

查看: 1695|回复: 6

[FC][常见mapper说明]

[复制链接]

签到天数: 348 天

[LV.8]以坛为家I

评论头像

发表于 2017-4-14 15:22:22 | 显示全部楼层 |阅读模式
本帖最后由 FlameCyclone 于 2017-4-30 14:29 编辑

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:水平镜像
        22400镜像
        32000镜像

$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

回复

使用道具 举报

签到天数: 4 天

[LV.2]偶尔看看I

评论头像

发表于 2017-4-14 19:25:53 | 显示全部楼层
很棒的说明,虽然网上有英文版,但是我英语不是很好,以后只要收藏楼主的帖子就方便查阅了!
回复 支持 反对

使用道具 举报

头像被屏蔽

签到天数: 468 天

[LV.9]以坛为家II

评论头像

发表于 2017-4-14 21:20:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

签到天数: 106 天

[LV.6]常住居民II

评论头像

发表于 2017-7-2 09:55:01 | 显示全部楼层
很详细,仔细研究一下
回复 支持 反对

使用道具 举报

签到天数: 6 天

[LV.2]偶尔看看I

评论头像

发表于 2019-8-6 13:00:19 | 显示全部楼层
很棒啊,6666
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

新模拟器共享论坛X

翻译WIKI大量成长力和金钱奖励!

访问http://wiki.nesbbs.com,翻译词条到论坛指定区,每一个完成翻译并有采纳的,有成长力等奖励哟...

点击查看详情 

QQ|申请友链|小黑屋|手机版|Archiver|新模拟器共享网 ( 辽ICP备09001055号|繁體中文   

GMT+8, 2019-10-23 17:48 , Processed in 0.156000 second(s), 37 queries , XCache On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表