13. 字库扩容和一些小的代码修改
字库我前面说过,是bin.pac的第一个子文件,bin_0000.bin,原始大小35800。要扩容的话有两个方案,一个是文件直接变大,修改ISO镜像。
但这个方案非常得不好,首先ISO镜像扇区都是连续的,如果一个文件变大,那么后面所有内容顺延,这个时候比较两文件的话几乎处处不同,补丁会和原始镜像一样大。
第二个方案就是压缩,其实原始程序打开子文件的时候本来就会先判断是不是压缩文件,如果可以压缩到35800内,那么就可以原地塞进去。牺牲得是一点时间。
但问题是原始程序处理压缩时有没有开足够的空间放这么大的压缩包,如果没有也会造成问题。
第三个方案也就是我最后选择的方案,就是删除掉bin.pac中的一个子文件,bin_0000变大,其他子文件向后挪。
首先最后的几个子文件05-0C都是一样的,感觉是为了防止光盘损坏而放的备份,一般情况下访问不到这几个文件,有这样一个先决条件在才能够删除其中一个进行腾挪。
这是扩容的一个方面,在光盘中怎么存放。另一个方面是字库扩容成多少大,我在分析中说过,由于字库前面的入口表是2byte的,数值*4就是字模入口,那么字库最大的寻址能力也就是0x40000。
也就是说如果要超过0x40000的话,我就要修改代码,把*4改成*5,或者其他。倒不是说修改这个有多少困难,只是如果字库过大的话会引发扩容的第三个问题,就是内存里面怎么放的问题。
我首先是让字库保持在40000以内不要动,然后重建bin.pac,载入游戏,靠前部分文字正常显示,靠后部分不正常。下cd-rom读取断点,可以看到字库部分后半段被占用了。
于是再下断找载入地址是什么地方定的,这时可以找到以下设定:
800C89B8
800D39BC // 字库载入位置
801091C0 // 载入BGD、SDW,图片
801311C4
801729CC
801855D0 // 载入MUS、VCE,声音
函数在80037250。
可以看到字库这里只留下35800这么大的位置,我第一次的方案是所有位置都顺移A800,但最后程序崩溃,检查下来应该是占用到了堆栈。
这就麻烦了一些,我检查了所有的BGD和SDW的子文件,确认没有超过13800的,而801091C0到801311C4之间足足有28004之大,可以借用A800。
这个问题其实也不能确定,只是最后测试下来没有发现什么大问题,所以应该是没事了。
那么下面是代码的修改,IDA其实无法修改代码。我记得哪里看到过有一个类似于Hview的软件可以修改PS exe,最后找出来是LemAsm。
这里介绍一下用法。首先open rom image,载入后会报错,不要理他。View中选择MIPS disassembly,勾上show reg names。Tools里面点一下byteswap now和wordswap now,这个时候显示就正常了。
File里面选Gote Address跳到要修改的地方,View里面点Edit mode即可。要注意的是保存的时候要Tools里面点一下wordswap now,再点保存。(为啥不要再点一下byteswap我也就不高兴去想了)
反正最后保存好之后比较一下,看看是不是byte反转了。