|
  
- 帖子
- 679
- 精华
- 0
- 积分
- 2136
- 威望
- 44
- 金钱
- 5605
- 阅读权限
- 200
- 注册时间
- 2011-3-2
|
【原创】PS游戏汉化-活用BIOS空间
如果一个PS游戏是使用BIOS字库,那么,汉化方面也就不存在字库问题了。
这次在汉化FF8,由于原版显存字库挺小,不可能放整个汉化字库,就算把2BPP格式的字库改成1BPP,也是不够的。之前一直使用动态字库方面解决。
所谓动态字库,就是开辟一块内存,保存当前显存字库里的汉字编码,当要显示某个汉字,在表里查是否存在,如果存在,直接根据该字在表里位置,换算出在显存里的位置,从而得出动态的编码显示该字。如果表里不存在这字,计算该字在ISO里的地址,然后读碟传送到内存,把这内存数据DMA到显存字库,同时在表里做该字的标志。通常,显存字库分2块,一块固化常见字,另外一块用于动态装入字库。
通过动态字库,的确可以解决显存字库小,内存有限的情况。但这方法的不足就是:由于我们能自由使用系统内存有限,整个字库无法放内存,从而不得不频繁读碟。对于真机光头的耗损是大的,而当需动态装入显存的字多,显示前也会不流畅卡一下。特别是,在一些特殊场合,比如播放CG中,某些特效处理,这些有共同一点就是此时系统读盘中,假如这时候动态字库读碟,会出现光头无法归位问题。这也是目前FF8汉化中最容易出现Bug地方,具体要修正,需要花很多时间去研究避免这类发生。 所以,有了今天的这个BIOS活用方法介绍。
解决读盘冲突,优化显示速度,只要解决不需要频繁读盘,或者说,只要字库能常驻内存/显存就可以了。
由于我们可以方便修改BIOS文件,那么,只要能把字库放在BIOS,并知道如何调用,那么,问题就解决了。
通过查看相关文档,或分析一些使用BIOS字库的游戏,比如沙加,我们可以知道下面信息:
BIOS对应内存地址是BFC00000-BFC7FFFF
其实BIOS字库在BFC66000,这地应对应SJI编码8140,我们可以把BFC66000当作扩展Rom使用了。比如,把游戏字库放到BIOS的66000开始。
游戏中使用BIOS数据:可以直接对BIOS地址进行任何操作,和操作内存一样。(PSP和PS3不支持写操作)
比如直接把地址赋值给寄存器 li a0, 0xBFC66000
或用系统API(推荐)
bios_fnt:
li t2,0xb0
jr t2
li t1,0x51
bios_fnt这API,可直接得到某个SJI编码的BIOS字库地址v0比如8140(此时 v0=BFC66000)或889F等
jal bios_fnt
li a0,0x8140
move s0,v0
后言:
PS的模拟器PCFX/ePSXe可以对BIOS地址进行写操作,也就是说,不需要外挂BIOS字库,直接在游戏里动态把字库装入到BIOS FONT区域;而PSP对BIOS地址写无效,那么我们用CMF直接动态加载BIOS FONT文件。注意:CMF加载的BIOS FONT文件,是装入到BIOS空间的66000地址,不是装入整个BIOS文件。
警告:
PS模拟器可以直接把BIOS数据DMA到显存,但如果是PSP,千万不要直接DMA到显存,会黑屏,要先把BIOS的数据COPY到内存,然后从内存DMA到显存。
补充:刚才W酱用PS3模拟运行PS FF8中文ISO,刷系统bios文件后可以玩。但如果不先替换系统BIOS文件,而是直接游戏里用程序写BIOS区数据,会黑屏。故,游戏里写BIOS区数据的操作,请谨慎使用测试。 |
|