tata2007
孤独之狼
级别: 火花会员
编号: 88604
精华: 6
发帖: 420
威望: 30 点
配偶: 单身
火 花 币: 20592 HHB
注册时间:2008-05-13
最后登陆:2024-09-26
|
【FC火纹外传】debug入门教程
本文以FC火纹外传的某个修改为例来演示debugger的使用方法,只要你懂得一点最基本的6502汇编指令就可以看懂,把它当一个简单的入门教程吧。
火纹外传有一个比较奇怪的设定:使用魔法会扣自己的血,哪怕是最基本的回复魔法。个人觉得这个设计有点不大合情理,这次我们的修改目的就是去掉它。下面就是以修女的回复魔法为例的修改过程。
------------------------------ 【一】找出修女mm的当前HP的内存地址
这个没什么好说的,使用任何一种模拟器的cheat功能搜索几次都可以轻松找到,过程从略。我这里修女的当前HP地址在$67d1(不同的角色其地址也不同,你找到的很可能是另外一个地址)。
---------------------------- 【二】使用debugger找出减血指令
1、载入游戏 我用的debugger是FCEUXD SP 1.07版。首先载入rom,进入战场后马上save一个即时存档(按F5键),以方便后面的反复load。
2、设置断点 接下来干啥呢?既然是要找出减血指令,所以嘛我们需要设一个断点,地址就是修女的当前HP$67d1,只要HP改变就会中断,这样就可以顺藤摸瓜找到相应的指令了。
点击Tools下面的Debug,弹出一个大的对话窗口“6502 debugger”,不用看别的,直接找到右上角的那个“BreakPoints”,点击它下面的Add按钮,又弹出来一个小窗口“Add Breakpoint”。前面已经说了修女HP地址是$67d1,所以什么也别想,直接把Adress后面的两个输入框都填上67d1,然后勾选下面的类型Write,其它的都不动。最后点最下面的OK,断点就设好了。
3、调试 回到游戏画面,下一步该做什么呢?很简单,用修女随便给某个我方角色来一次回复。然后你就会看到模拟器自动中断,debug窗口弹出来啦!左边是一大堆的汇编指令,其中最上面的一条指令就是中断发生也就是HP发生变化的地方,把它抄下来: $C213:91 02 STA ($02),Y @ $67D1 = #$16
什么意思呢?就是把A寄存器的数值写入到内存地址$67D1。为了方便分析,我们把它上下的一些程序全部复制下来: $C209:A0 00 LDY #$00 $C20B:A6 04 LDX $0004 = #$07 $C20D:F0 02 BEQ $C211 $C20F:E6 05 INC $0005 = #$01 $C211:B1 00 LDA ($00),Y @ $7492 = #$15 *** $C213:91 02 STA ($02),Y @ $67D1 = #$16 *** $C215:C8 INY $C216:D0 04 BNE $C21C $C218:E6 01 INC $0001 = #$74 $C21A:E6 03 INC $0003 = #$67 $C21C:C6 04 DEC $0004 = #$07 $C21E:D0 F1 BNE $C211 $C220:C6 05 DEC $0005 = #$01 $C222:D0 ED BNE $C211 $C224:60 RTS
注意后面带有***的两条指令,***是我自己加上去的,目的是为了醒目。这两句的意思就是:把内存单元$7492的数值复制到另外一个单元$67D1,也就是我们熟悉的修女的当前HP地址。这就是说,使用一次回复魔法之后修女mm的当前HP会被重写,而新HP数值来自于另外一个地址$7492。
很遗憾,我们在这附近没有找到减血指令,只知道修女mm的当前HP来自于另外一个地址$7492,那么这个$7492的数值又是从哪里来的呢?看来还得debug一下这个$7492。
4、继续调试 按F7读档(前面不是F5存了一个档么?),删除以前的老断点,再设定一个新断点,地址为7492。然后在游戏中重新来一次回复。这次弹出的debugger窗口第一条指令是: $AB04:91 00 STA ($00),Y @ $7492 = #$16
复制附近的程序如下: $AAF4:A2 00 LDX #$00 $AAF6:BC 11 AB LDY $AB11,X @ $AB1C = #$0E $AAF9:C0 EF CPY #$EF $AAFB:F0 0C BEQ $AB09 $AAFD:C0 FF CPY #$FF $AAFF:F0 05 BEQ $AB06 $AB01:BD 31 03 LDA $0331,X @ $033C = #$15 *** $AB04:91 00 STA ($00),Y @ $7492 = #$16 *** $AB06:E8 INX $AB07:10 ED BPL $AAF6 $AB09:AD 2A 03 LDA $032A = #$05 $AB0C:A0 0A LDY #$0A $AB0E:91 00 STA ($00),Y @ $7492 = #$16 $AB10:60 RTS
嗯...$7492的数值来自于$033C,至于减血指令还是没找到。
5、还是调试 好吧,再设断点为$033C,读档,再来一次: $8978:AC 82 03 LDY $0382 = #$00 $897B:BE 20 03 LDX $0320,Y @ $0320 = #$28 $897E:B9 0A 03 LDA $030A,Y @ $030A = #$16 *** $8981:38 SEC *** $8982:FD F4 D9 SBC $D9F4,X @ $DA1C = #$01 *** $8985:8D 3C 03 STA $033C = #$16 *** $8988:8D B1 04 STA $04B1 = #$00 $898B:B9 12 03 LDA $0312,Y @ $0312 = #$0A $898E:20 AF C9 JSR $C9AF $8991:18 CLC $8992:79 0A 03 ADC $030A,Y @ $030A = #$16 $8995:D9 0C 03 CMP $030C,Y @ $030C = #$16 $8998:90 03 BCC $899D $899A:B9 0C 03 LDA $030C,Y @ $030C = #$16 $899D:99 3C 03 STA $033C,Y @ $033C = #$16 $89A0:8D BB 04 STA $04BB = #$00
终于找到了!仔细看那几条带***的指令,大意就是——把$030A的数值(16h)减去$DA1C的数值(01h),然后写入到$033C。没错这就是我们要找的减血指令!$DA1C中的数据就是每次回复减少的HP数值。
----------------------- 【三】修改方法
要想不减血,可以有两种思路: 一种是把上面的那条减法指令nop掉,没有减法指令自然就不会减血了; 另外一种就是想办法找出$DA1C的数值来自于rom何处,把rom中的相应数值改成00也行。
一般来讲,如果能通过只修改data就达到目的那是最好的,这也是笔者的经验之谈。因为改程序总存在一定的风险,你不好确定这条指令是否只有这么一个用途,也不好确定是否只有这么一条相关指令(实际上本游戏的魔法减血指令就不止这一处),冒冒然地乱改程序往往容易导致bug,所以能不改程序就不改。
下面就根据第二种思路来修改:
点击Tools菜单下的Hex Editor,打开内存查看器,可以看到地址da1c中的数值确实等于01,再看看它附近的数据: 01 03 00 08 0c 0c 0e ... 打开rom搜索一下,还真的找到了地址3da2c,附近的数据和内存da1c附近的数据一模一样,呵呵。
这个是否就是魔法消耗HP表呢?不妨试一试,首先还是提醒一下先把原版rom备份好,然后把3da2c改为00,用模拟器载入rom测试,果然这次回复不再减血了!
同样很容易验证,3da2d是远程回复的,3da1b是火魔法的......大家可以自己一个个试,我就不罗嗦了。
***************** 后记 ***************** 以前从未玩过FE外传,今天不知道怎么地突然想起来尝试一下,然后就发现:用修女给同伴回个血居然还会掉自己的血!!!这个...这个不能忍啊...老狼很生气,后果很严重...然后果断下手。办完之后突然觉得把过程写出来也许还能当个debug入门教程,于是就整理了一下发到论坛上来了。
[ 此贴被tata2007在2011-10-02 01:50重新编辑 ]
|
圣战系谱TS改造版
|
[楼 主]
|
Posted:2011-10-01 16:11| |
顶端
| |