用NO$GBA跟踪并获取字库地址
原作者:落木孤叶
该篇主要讲述如何利用NO$GBA进行跟踪并获取字库地址,找到字库的地址可以说是汉化步骤的第一步。
根据GBA的图像系统篇的介绍我们知道,游戏要显示图片或者文字,都是向VRAM区写入数据然后交给显示回路处理。要显示文字,当然就得从游戏的字库区中读取字模信息并传输进VRAM去。各种游戏都有各自不同的传输方式,有的使用CPU方式传输、有的使用DMA进行传输、有的先将字串集中传输到一个临时内存区再统一传输到VRAM。有繁杂一点的游戏还对字库信息进行压缩,在显示文字时再解压缩到一个临时内存区后传输到VRAM。
接下来我就以《阴阳大战记-零式(日)》(ROM编号1833)为例,演示如何利用NO$GBA跟踪获取字库地址:
1.首先我们启动NO$GBA主程序,并按F12打开ROM,运行到如下画面时
中断游戏的运行,并按F5打开VRAM查看器,查看BG2(背景层2),这时我们就可以只看到游戏中显示的文字,将鼠标移动到“名”字的左上角第一个TILE上,可以在Details栏中看到这个TILE的地址是06008020。
2.接下来,我们就要利用这个地址引出字模的真正地址,关闭VRAM查看器后按Ctrl+B设定内存断点 “[06008020]!” ,然后按 “*” 键重新启动。
3.在游戏运行过程中,可能会有多次中断,因为VRAM内存区是共用的,在不同的时候有不同的作用,向06008020这个地址写入数据的不只是在显示文字时,我们只要跳过,按F9让文字继续运行。
最后在我们选择了主菜单的第一个选项时,游戏会在这里中断:
ldrh r3,[r0,r5] ; 将地址r0加偏移r5的内存的半字读到r3
strh r3,[r1,r5] ; 将r3的低16位写入内存地址r1加偏移r5
从上面这段程序及寄存器r0的值我们可以知道,在显示“名”这个字时,程序从地址0821AFF4h处向06008020h传输数据。我们就可以猜测0821AFF4这个地址就是“名”字的字模地址。
4.我们用TLP打开ROM,按Ctrl+G跳转到 0021AFF4 ,就可以清楚地看到“名”的字模了。如果你有CtystalTile的话就更方便了,在导航栏中把宽度跟高度都设成16,然后点“间隔16/32”调整一下就可以非常地看清字模了。
接下来我们只要将滚动条向上滚动就可以找到字库区的首地址了001B4E74。
另一种获取字库的方法:
如果说我们是根据自己的眼睛查看判断才知道字库的地址的,那反过来想一想,游戏程序是怎么得到这个地址的呢?这个地址是以一个常量的形式存在于ROM的某个地方吗?
那么我们就来试试用另一种比较准备的方法来找出字库的首地址,也可以找出存储字库首地址的地址(会不会有点晕呢?指针,在C语言里面就是一个比较难的部分)。
从中断处开始,仔细看看指令的地址,00000B92h,回顾一下内存篇讲的,这个内存处于系统ROM区,也就是说目前在执行的是系统的一个功能调用,猜测可能是CpuSet或CpuFastSet子程序。
先在断点窗口删除掉我们刚才设定的内存断点,然后按F8跳出当前子程序,这时会回到这个地址0803A1DEh(在这行调用了0812414Ch跟踪进去可以发现其实刚才那个是CpuSet)。
我在汉化教程里有不明白的地方,所以我问了BeQ,以下是BeQ对我的详细回答。
我问;“在 “跟踪获取取字库地址”一文中,你提到
ldrh r3,[r0,r5] ; 将地址r0加偏移r5的内存的半字读到r3
strh r3,[r1,r5] ; 将r3的低16位写入内存地址r1加偏移r5
我不明白这是甚么意思。
回答;
首先r0+r5计算出一个内存地址,然后读取这个内存地址的值(半字,也就是两个字节),将这个值存入寄存器r3。当然,strh就是反过来,把寄存器的值存入内存 。
比如,当前r0的值是08004630h,r5的值是16h
r3的值是00000000h
而当前部分内存状态如下:(08004620h-0800464F)
08004620 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
08004630 6B 5E 30 31 48 FF 00 2E 26 37 45 00 00 00 00 00
08004640 18 66 41 4C 87 1A 12 34 56 78 9A CE 67 39 81 33
在执行ldrh r3,[r0,r5]的时候,首先计算r0+r5,也就是08004630h + 00000016h = 08004646h
08004646h这个说是源地址,程序会把这个地址的值读出来,你自己找找这个地址在哪里吧
是不是这里
12 34 56 78
这一段
但ldrh,注意后面的h,表示只读半字,也就是两个字节,只读出 12 34 这两个字节,
所以读出来的值就是“3412”,为什么会反过来????
这是因为存储方式都是低位在前高位在后,先34再12,组合起来就是3412h


lv43S2 I bookmarked this link. Thank you for good job!
Great work,webmaster,nice design!,
Excellent site. It was pleasant to me.,
На мой взгляд, это актуально, буду принимать участие в обсуждении.
Бесподобная фраза
Great work,webmaster,nice design!, Hire Entertainment With Monkey In Pa, [url="http://rheininfo.iespana.es/hire-entertainment-with-monkey-in-pa.html"]Hire Entertainment With Monkey In Pa[/url], http://rheininfo.iespana.es/hire-entertainment-with-monkey-in-pa.html Hire Entertainment With Monkey In Pa,