汉化日记(3)—-《幻想传说》片头破解记(续) by funlove
by funlove (funslove@163.com)
2004.02.08
在上篇中,漂亮的汉字终于显示了出来.不过马上又碰到了问题:我们对Rom文件作的改动,让标题画面变成了乱码!看来我们改动的地方在游戏中并不是只用这一次.怎么办呢?下面的方法是基于这样一个思路:改动这段程序,只在第一次被调用时改动Tile地址,以后就不改了.
首先对ARM汇编语言在编译时的几个问题做一点说明.
在 游戏Rom文件中,相同的汇编语句可能有两种不同的编译结果.一种是在ARM指令集中查到的,每个语句都编译成4个字节;另一种则是绝大多数语句都编译成 两个字节(某些条件跳转语句除外).在哪段内存区间采用哪种编译格式,应该是能事先声明的,不过我还没研究出来,谁能告诉我?可以确定的是,这两种格式不 能混用,如从双字节格式区跳转到4字节格式区,再跳转回来,很可能就会出错.这一点在修改,添加程序时要注意.由于我们要考察的这段程序正好是双字节格 式,下面就对这种格式下几个语句的编译结果做一点解释.
ldr r4,=2006040h ===>编译为4C09.这是我上篇日记中提出的问题,现在总算研究清楚了.这种把一个4字节立即数值赋给寄存器的指令,都以4开头.C表示寄存器 r4,类似的8表示r0,9表示r1,A表示r2…低字节数09则表示立即数的偏移.如指令地址为L1,低字节数为N,则对应的立即数地址L2= (int(L1/4)+1+N)*4.
080B43D0 bl 080B4268h ===>编译为F7FFFF4A.这是一种利用相对地址来编译的方式,具体的地址怎么计算我还没研究清楚,大家自己改几个数试试吧.偏移量可以是正 也可以是负.由于字节数的限制,偏移量的大小可能也有限制.用bl而不用b进行跳转的好处是跳转后寄存器r14中保留了返回的地址,只要用指令bx r14就可以返回.
084841E2 bne 8484212h ===>编译为D116.同上,一种利用相对地址来编译的方式.其中低字节数16表示跳转偏移.如指令地址为L1,低字节数为N,则对应的跳转地址L2=L1+4+N*2.
好了,现在开始修改程序.原先的程序有这么一段:
复制代码
|
将加了注释的两句指令用bl 84841DCh替代.这里84841DCh是游戏中原来的字库,因为扩容过,这部分空间就没用了,正好用来添加程序,如下:
复制代码
|
好了,片头破解到这里也告一段落了.No$GBA是个很强大的工具,好好利用能从根本上解决一些疑难问题.

