[心得] FC中文化经验谈(二)—扩充ROM容量—

楼主: ADHI   2024-11-18 23:49:43
【前言】
即便是文字不多的动作游戏,也很常会遇到刻好的中文字无法全部塞进去的窘境,
这时就得将游戏占用容量扩大,并且游戏程式码还要认识扩大后的区域,
这就是扩容。
【正文】
本篇以光神话欧美版为例来说明如何扩充容量
==========================================================================
一、查询ROM的规格
最主要是要知道ROM的Mapper和PRG、CHR的大小,
我们不可能记住Header每个byte的定义,所以使用工具查看才是正确方式
图中可知光神话是Mapper1,PRG-ROM有128KB,没有CHR-ROM
https://meee.com.tw/sirFyzT
==========================================================================
二、查询该规格的规格书
推荐到下列网站查询
https://www.nesdev.org/wiki/Mapper
https://problemkaputt.de/everynes.htm#cartridgesandmappers
光神话使用MMC1这个芯片做辅助,
之所以叫Mapper1是做出nes格式的模拟器作者所做的编号,
他将MMC1编号成1号,其他常见的还有MMC3(Mapper4)
https://meee.com.tw/f6hFWvT
图中为nesdev查到的Mapper1规格,PRG-ROM最大到512KB,
这代表只使用128KB的光神话还可以扩容,
如果遇到原游戏已经使用到该Mapper的上限,
要嘛看看程式中是否有空白区段,
要嘛看有没有其他可以相容的Mapper,
要嘛放弃 XD
==========================================================================
三、扩大ROM前的注意事项
1.区块编号
每一区块的PRG或CHR都会有编号,依序由前到后从编号0开始递增
2.默认映射的PRG区块
每个ROM在执行前就会有固定某一段PRG由卡带中被映射到主机里,
依照每个Mapper规范,会默认的区块不一定是哪一块,
但我看到的基本上都是最后一个PRG会被预映射。
3.编号不可异动
增大档案后,除预映射(最后的区块)外不可导致原本区块编号有所更动,
也就是区块顺序须不变
4.异动后的PRG/CHR总大小各自都得是2的某次方KB
例如原ROM是PRG(32KB)+CHR(16KB),两种区块都想增大,
那最后ROM得要是PRG(64KB)+CHR(32KB),
即使中文化的需要量没那么多也得扩充这么大,
PRG没照这规则应该会不能跑,
CHR没照这规则可能会影响实机或部分模拟器不能跑。
==========================================================================
四、实作
以光神话所属的Mapper1来说,PRG一个区块16KB,
光神话PRG有128KB,故光神话共有编号0~7共8个区块的PRG,
又Mapper1固定是最后一个区块(编号7)在开机时会被映射到0xC000~0xFFFF,
依照规则,
原编号0~6须保持在0~6不可变,
原编号7也须保持是最后一个区块,
所以我们要安插的地方就落在6、7之间,
这样可以保持0~6还在原位且原本的7还是最后一块;
要插入的大小则须是128KB(总大小256KB,是2的8次方),
这样一来就多了编号7~14(0xE)的区块可用了。
喔,对了,
之前有提到模拟器要辨识ROM size是透过Header,
所以要记得修改Header中size的定义,
否则会发现此时ROM无法执行,
Mesen有提供Header Edit,很方便;
该功能位于Debug -> Edit iNES Header
https://meee.com.tw/dWW9ExP
改成256KB后,模拟器就能正常执行了
==========================================================================
五、程式中如何使用扩充的区段(需6502组合语言)
要使用新增的区块,就得将其映射进CPU,
这牵涉到各Mapper的定义,依照Mapper1的定义,
是将要切换的编号写入到$E000~$FFFF(这区段任意挑一个即可),
图为nesdev查到的Mapper1切RPG ROM的位置定义
https://meee.com.tw/BnBjvXW
图为Mapper1切换的程式码范例
https://meee.com.tw/1WVdppw
可以看到写入的方法不是很直觉,需连续写五次,且每次写完后需做bit shift,
感觉很麻烦,但照抄即可 XD
举例说明,如果要将编号12映射到CPU RAM,程式码如下
LDA #$C (0xC(16进位) = 12(10进位))
STA $E123
LSR
STA $E123
LSR
STA $E123
LSR
STA $E123
LSR
STA $E123
作者: if4 (if)   2024-11-19 00:34:00
作者: kenu1018 (断指小宇)   2024-11-19 01:55:00
太专业了 纯推看不懂...
作者: Jay915 (平静的心…看世界)   2024-11-19 07:56:00
作者: kashin (小户长日记)   2024-11-19 08:26:00
推推
作者: protect6090 (山茶花)   2024-11-19 09:27:00
顶个
作者: bgworld (Solid)   2024-11-19 15:55:00
推,谢谢
作者: djboy (雞尾酒)   2024-11-20 00:37:00
作者: picefun (帆)   2024-11-20 01:53:00
必须推
作者: samyes (不买最赚)   2024-11-20 15:54:00
推推~
作者: ijwbg (~{..}~)   2024-11-20 22:22:00
作者: aoirx (漩涡鸣人)   2024-11-21 09:38:00
大推
作者: sdbsy14242 (あやめづきの子)   2024-11-21 09:40:00
推好文,感谢分享
作者: articlebear (政治真的满狗屁的)   2024-11-21 20:49:00
好强
作者: tinyfan (小风扇)   2024-11-22 11:48:00
看不懂,但还是要大推
作者: kf0916 (kf0916)   2024-11-23 16:03:00
不明觉厉
作者: tonybin (Courage)   2024-11-24 00:37:00
推 这些都是计算机的硬功夫 组合语言
作者: ksntw (ksn)   2024-11-24 08:16:00

Links booklink

Contact Us: admin [ a t ] ucptt.com