MD调试的一点心得和实例

  • 内容
  • 评论
  • 相关

68000调试器,先看图,各个区域的作用看标注。

然后是一些需要注意的地方:
1.首先这个调试器有一个小问题,设置了读取或者写入的断点,调试器在断点处中断了,如果这时候点步进,那么这个断点处的这条指令会被跳过而不执行,如果是直接点OK,则会正常地回到游戏。设置PC断点没有这个问题。
2.一点基础知识,0x前缀表示后面的数值是十六进制,如0x18换算到十进制为24。调试器中美元符号$与0x的作用相同,井号#则表示后面的数值是一个常数。
3.PC断点是指令断点,在程序运行到这个地址的时候中断,读/写断点在读取/写入数据到这个地址的时候中断。
4.地址断点可以设置内存断点或者ROM断点,设置内存断点需要加FF前缀,如对内存地址630C下断点,这里要填FF630C,设置ROM断点则直接填ROM地址就可以,如对ROM地址18416A下断点,直接填18416a。
5.汇编窗口显示的指令很少,要善用Go to Adress和Show disassembly查看指令的上下文。
6.寄存器断点有时候会用到,当寄存器的数值变化成所填的数值的时候就会中断。
7.68000中的nop指令的机器码为4E71,nop指令即空指令,此指令不进行任何操作。
8.汇编指令常用的并不多,可以自己看看指令集和各种教程。这里有一个别人写的简单教程,可以看一下 http://zero3c.blog.163.com/blog/static/278215082013813111414953/

 

调试实例一:25关杰西卡传送后清空了MP (639C)
首先找到杰西卡的MP的内存地址:63D4,怎么找?603C开始是各部队的战场数据,每部队占0x60字节,找找很快就能找到。然后对63D4下写断点。

这里设置断点。

设置好之后按OK继续游戏,传送完的时候会自动中断。
这个调试器还有一个问题,设置了写断点的时候,读取这个地址的数据的时候也会中断。所以调试器会在PC=010356这里中断。
但这不是我们想要的,按OK继续游戏,直到它中断在PC=016C0A。使用show disassembly查看一下上下文的指令。

地方找到了,那么接下来就得分析,这个得靠自己的经验,这里我就简单分析一下这个问题。
这段代码实际上是使用魔法消耗掉了MP,这里剧情使用了传送魔法,这个魔法也需要消耗MP,而这个剧情传送魔法的魔法代码是0x18(保存在内存0xA958),但是设计者并没有给0x18这个剧情传送魔法加入魔法的数据,根据这段代码所获取的传送魔法的消耗MP是0x90,无论人物有多少MP,经过这么一减,自然就变0了。
另外在22关贝伦哈尔特传送的时候MP却没有变成0。原因是0x016BE6~0x016BF0,这里判断人物代码是否为0x0E,如果是,则跳过消耗MP。
综上所述,剧情中的传送魔法有BUG,如果不是贝伦哈尔特使用的话会被清空MP。
修复方法也很简单。
方法1:不判断人物,判断魔法代码,如果魔法代码是0x18则跳过消耗MP。
修改之后的代码:
016BE6:move.w $a958,D0 (3038A958)
016BEA:cmpi.b #$18,D0 (0C000018)
016BEE:nop (4E71)
方法2:粗暴一点,直接跳转,不过不知道会不会出问题。
016BF0:beq $16c20 (6700002E) -> bra $16c20 (6000002E)

调试实例二:给特定人物增加经验值
首先要找到使用了给人物增加经验值的地方,方法有几个,不过最方便的就是打开剧情编辑器查看。

可以看到,06就是代表斯科特,06在ROM的地址是19F309,下读断点。

按OK继续游戏,对话完毕的时候中断在PC=0167BE这里。

这里就是我们要找的地方了,判断人物代码是否为02、03、06,详细就自己分析吧,修改的话对照着机器码就能改,想要增加多几个?自己研究吧。下面好像还有设置标志什么的,自己研究吧。

加载中,请稍候...

评论

0条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注