字符上屏的反汇编跟踪方法

  • 复习一些知识


    Quote

    16K=4000H
    32K=8000H
    2M=200000H


    Gameboy掌机受机能限制,一次只能处理32KB(8000H)的程序代码。因此将游戏程序以4000H字节为单位分隔为若干ROM段。《铳钢战记》的ROM有2MB大小即200000H字节。以4000H字节为一个ROM段,整个游戏被分隔为80H(128)个ROM段,编号从00到7FH。
    游戏运行时,前16KB空间始终装入的是第一个ROM段,即ROM0,后16KB空间按照程序需要装入00~7F这128个ROM段中的任意一个。如,在游戏运行的某一个时刻,

    Quote

    0x0000~0x3FFF:ROM0
    0x4000~0x7FFF:ROM03


    这个时候,Gameboy读取到的0x4000~0x7FFF 实际是游戏ROM的0xC000~0xEFFF段。
    又过了一会儿,地址映射可能就会变成

    Quote

    0x0000~0x3FFF:ROM0
    0x4000~0x7FFF:ROM01


    这个时候,Gameboy读取到的0x4000~0x7FFF 实际是游戏ROM的0x4000~0x7FFF段。
    再过了一会儿,地址映射可能就会变成

    Quote

    0x0000~0x3FFF:ROM0
    0x4000~0x7FFF:ROM7D


    这个时候,Gameboy读取到的0x4000~0x7FFF 实际是游戏ROM的0x1F4000~0x1F8000段。



    关键地址
    ROM0:3D5B
    ROM3: 41AA


    基本跟踪流程
    打开BGB,载入游戏,打开BGB自带的调试器(Debugger),并打开BGB自带的显存查看器(VRAM Viewer,快捷键F5)。注意,在显存查看器中的画片(Tiles)页,取消调色板。如图1,


    图1 取消画片的调色板显示


    总体分析
    以第一个城市,酒吧旁边的路人甲(男)为例。我们和他对话。
     
    图2 选定路人甲对话


    和路人甲对话时发现显存下区(0x9000~0x97FF)储存的就是屏幕显示的字符并且不断随着对白的翻页而变化。
    我们要做的就是分析这里涉及的文本处理程序。


    逐步跟踪
    前文说到
    ROM0:3D5B
    ROM3: 41AA
    是此次分析的关键程序。现在请在调试器的主窗口浏览程序代码。你会发现地址0x0000~0x3FFF是ROM0段,0x4000~0x7FFF是ROM1段。ROM3在哪里?怎么去跟踪?


    在调试器主工作区按快捷键Ctrl+G,键入3D5B,跳转到3D5B地址。用快捷键F2打上断点标记。现在我们观察下这个断点的用处。按F9快捷键继续游戏,再次和路人甲对话(可能此时窗口下方的机器人状态栏会弹出,这同样会激活3D5B中断,现阶段请尽量避免),发现程序被中止,调试器被激活,程序运行到刚才打的中断点ROM0:3D5B。
    现在,请快捷键F8运行调试程序,发现程序会继续运行到ROM3:435A,如图3



    图3 ROM3出现!


    如果现在浏览程序代码,0x0000~0x3FFF是ROM0段,0x4000~0x7FFF是ROM3段。ROM3出现了,这发生了什么?


    ROM3的片选
    为了一探究竟,请继续按F8,直到程序运行到ROM0:3D5B。停下!!
    现在请用快捷键F3逐步跟踪程序流程,一次F3,程序执行一句指令。慢慢来。保险起见,可以在ROM0:3D6D处也用F2打上断点标记,如图4所示,



    图4


    请一步步运行指令,注意观察右边的CPU状态信息(各寄存器内容)。
    当程序运行到ROM0:3D6D时,注意看到CPU里的A寄存器已经发生了变化,变成了03。这其实是地址3D6B上的指令“LD a,03”的运行结果。将数字3放入寄存器A中。我们可以通过逐步跟踪程序代码,学习汇编指令。



    图5 注意观察右边寄存器A的值,即右边CPU状态栏的字节af=0300
     
    接下来,非常关键
    3D6D ld (C104), a
    3D70 ld (2000), a
    这两句指令将寄存器A中的值复制给内存0xC104,并将寄存器A的值写入0x2000。
    现在你可以做两件事,在调试器主工作区下方的内存查看区,用Ctrl+G跳转到C104,检查它的内容是不是03,第二浏览程序代码到0x4000~0x7FFF,现在ROM3段是不是可以在主工作去看到了。
    提示:ROM段的选择通过向0x2000~0x3FFF 任一地址写入ROM段编号即可。
    现在请将ROM3段的41AA打上断点标记。
    现在请用F8逐步运行程序,注意观察显存查看器里是不是不断地被更改,新字符不断地出现?



    如何分析?
    跟踪是唯一的办法,你既可以用F3逐步跟踪,也可以用F8大步流星的跟踪。这会给你一个初步的认识,这些程序都调用了那些代码。如果要细致分析,可以将一个代码段全部打上断点符号,一步步看,这也是学习和巩固汇编语言的一个好方法。如图6所示,


    图6 通过多个断点细致观察程序


    如果运行到RET指令,汇编代码要返回到哪里呢?
    请注意右边CPU状态区里的SP数值,它现在是C0EE。意思是目前程序会返回到0xC0EE所储存的地址。0xC0EE储存的地址在调试器右边下方的查看栏已经给出,蓝色高亮部分,423B。
    现在请给ROM3:423B打上断点,再F3逐步运行,看看程序是不是跑到了ROM3:423B呢?


    回到正题,字符是如何从ROM中储存的文本编号变成真实的字符图案储存在显存中的?
    这就需要综合参考内存中的值。


    实战举例
    调试器的内存观察区(调试器中左边下面的窗口)调整为C960附近,确保可以看到C96x这一行的数据。显存查看器(VRAM viewer,快捷键F5)中确保调色板已经关闭。和路人甲发起对话,并按前述方法给ROM0:3D5B和ROM3: 41AA用F2打上断点标记后,用F8运行程序代码。注意观察显存查看器(VRAM Viewer)中每出现一个新的字符时,内存0xC96A, 0xC96B和0xC96C这三个字节内容的变化。
    如现在内存区数据如图7所示,


    图7 内存数据
     
    0xC96A, 0xC96B和0xC96C这三个字节内容依次为16 47 60,其含义是下一个(略不严谨,自己观察便知)即将写入到显存区的字符在ROM16:6047这个地址。
    打开计算器,调整为16进制,按照下列公式计算ROM16:6047在游戏ROM中的真实地址:
    6047+(16-1)x4000
    得到5A047.
    用WinHex打开ROM,快捷键Alt+G键入5A047,查的这个字符是


    图8 游戏ROM中的数据
     
    这就是即将复制到内存的字符,编码52的る.
    如果你很细心的按F8逐步调试,并在0xC96A, 0xC96B和0xC96C这三个字节内容刚刚变化为16 47 60时观察显存区的图案,你可以发现前一个字符编码40つ和编码52的る在逐步按F8期间上屏了,如图9所示。



    图9 注意顺序观察这三幅显存区的数据,红色框圈内的字符


    《铳钢战记》的码表在下面的帖子中已给出,请对照查询。
    《铳钢战记》文本组织方式和汉化分析
    http://forum.gameboyre.com/viewtopic.php?f=5&t=26


    那么究竟是如何从Rom复制到显存的??请多设置断点,仔细跟踪。
    其实和路人甲的对话在反汇编分析日志中已有,比较详实,请对照参考。
    文末给出不完整的内存各地址定义,仅供参考


  • 关键地址
    ROM0:3D5B
    ROM3: 41AA


    这个是如何确立起来就是关键地址的,关键是指哪里比较关键
    希望尽快回复 :?:
    回复你能收到邮件么?我只收到过一次 :shock:

  • "doomsun" wrote:

    关键地址
    ROM0:3D5B
    ROM3: 41AA


    这个是如何确立起来就是关键地址的,关键是指哪里比较关键
    希望尽快回复 :?:
    回复你能收到邮件么?我只收到过一次 :shock:


    如果希望回复某帖子得到通知,请注意发帖时勾选
    有人回复时,给我发送一封Email
    或者你也可以订阅某主题,甚至某版面,订阅功能在页面左下角。订阅的电邮通知在你查看该主题或版面的新内容前只会通知一次。
    具体信息请参考我在这篇帖子里的回复
    http://forum.gameboyre.com/viewtopic.php?f=5&t=20
    如果这样设置还是不能得到电邮通知,请及时告知我,或在站务区反馈。


    关键地址是指对我们这次汉化有帮助,用来理解文字上屏过程的地址。
    你在这两个地址打上断点标记,F8调试程序,仔细观察显存区那些画片的变化。多练习几次就有感觉了,这时候再开展工作无妨。


    这样的关键地址如何找到?
    哈哈,瞎猜,感觉和经验。这种累人的工作自然是工头前期做好了的,具体内容可以参考反汇编日志。
    你也可以在跟踪过程中发现更有价值的断点,请到论坛上一起分享。

Join us

Have your own thoughts on this discussion? Wanna help others, avoid the mistakes you met before? Wanna contribute more to this or other topic? Just join us! Registration is free. Join us!