准备东西:68K指令集资料、REGEN DEBUG、十六进制编辑器
3 m; E' T! g; m' F" J" B k X1 \/ F* q5 D' [% m$ @6 X: c5 i
REGEN DEBUG官网下载页面:http://aamirm.hacking-cult.org/www/regen.html
: z2 v8 r b& J" d
- V7 y3 z0 r& r1 ^以前写的MD HACK教程是用MD调试器,但这MD调试器在使用过程发现有点缺点,显示机械码只显示前2位,后面地址或数值却没有显示,有可能造成后来新手在修改ROM时寻找不到要修改的数据。
; c4 p6 M' \2 Q' ^# X6 A
0 K. G9 K; X1 @1 o, y# y本篇教程考虑改用REGEN 0.972 Debug版来调试跟踪,现在的REGEN DEBUG很强大,可以考虑放弃MD调试器。% w" v+ O4 }4 e+ K% c
, U- ~; h0 I- U: V3 B2 U9 D; Z
以《魂斗罗:铁血军团》日版为例,修改目标:体力值不减
0 x( e! \6 q1 Q0 Y7 }( q9 N" b" M5 }/ w% W. g% L
1。先找到《魂斗罗:铁血军团》体力值存放地址,可通过REGEN自带的作弊码查找功能来找,我找到了,存放地址是0xFFFA0D。" R" `2 Z8 K% j3 V- Y
+ r L7 G' @0 b8 V4 Y* l2 H2。选择人物进入游戏后,点击Tools->68000 Debugger进入68000调试器界面,图1:( ?8 W6 I: I/ N# R# A g
' A- t1 h3 M k' I+ v
# Y; v* V2 z- \) J9 z8 }- G" @+ s左上角框是显示汇编指令,右边是寄存器显示 w& z8 n6 P# g1 _! K0 \
$ v3 G, S* X8 L* O! J9 A) k: b2 Q
Address Breakpoints是地址断点
+ R5 Q7 g. `4 R6 u$ u2 l6 mAddress Range是对一定范围地址设置断点% V# v e6 ~$ _1 p) R
Register breakpoints是寄存器断点% P4 Z, h0 d8 x9 }( y" s. c! K
VDP Breakpoint Range是对VDP一定范围地址设置断点
2 t9 t- v& e0 r0 f; iVRAM breakpoints是VRAM断点
# T6 B {+ `! Y2 u# U' `3 `6 q5 xGo to address是转到指定的地址) m/ w: X" K% j m2 }5 t
show disassembly是对指定的地址反汇编6 P* s0 p! U2 f" O% D$ S
Debug step是进行单步或N步调试. x& \8 d; [3 t4 m+ v
ROM MEMORY是ROM Viewer, ]+ ]4 m) \) w- g0 o) A
68000 MEMORY是RAM Viewer
) Z4 y7 A* W KZ80 Debug是Z80调试器; J- E1 q: b$ [7 L3 ]: m
% J% c( T. B6 V2 {" M) \
Read是读,Write是写,PC表示是PC地址,Trace是跟踪(选择该项会在模拟器目录下生成ASM文件)
+ T' _ ]+ U; [/ p7 o
" g( S n) w* Q7 j1 N: R+ xRESET是重启游戏,RESET68K是68K重启,RESETZ80是Z80重启' x x8 U2 ~5 z# F5 ^# e4 l
9 O* y9 t1 `9 X) S1 Z6 S. B3。在Address Breakpoints的Set Breakpoint右边框输入地址FFFA0D,Write选项加勾,再在Set Breakpoint左边框打勾,图2:
" \5 ]8 z0 D$ A: x0 _" D% a( v& y4 V# {* _: Z$ }, O4 g: d( i
* |- u' l6 s. i; w( ^% q' K4。点击OK返回游戏,当被敌人攻中时调试器发生中断,图3:$ y7 [$ N9 C# I
' @( u8 Z& ~* P" a
. J$ ~) d9 h! a w1 l7 ?
指令停在011DEE 1C2A000D move.b ($d,A2),D6这一行,前面指令却没有显示,用show disassembly把11DE0~11DFA这段地址反汇编看看,图4:
) J. T0 L0 q4 d6 W: ~! R6 s
% J$ `5 @" M# P' i& u% @# X4 H- u. F( {! i
现在来分析一下:# a. g/ o" G) }4 G$ d
A2=FFFFFA005 P$ ~5 n( `" M/ ?0 }1 y
D1=00000001
$ T2 I/ d0 D0 g$ [0 e9 j! c! i1 o
) N+ h& `4 u3 v. O: d" T011DEA 932A000D sub.b D1,($d,A2) 把$FFFA0D(A2寄存器的数据($FFFFFA00)+$d=$FFFFFA0D)的地址单字节数据减去D1寄存器的数值,结果存入$FFFA0D
1 I2 h3 t6 T& v& l7 O1 t o* D011DEE 1C2A000D move.b ($d,A2),D6 把$FFFA0D的单字节数据存入D6寄存器4 \* R3 T& E' i! d. [1 F6 m
5 S+ C6 s) b l& {( U. b3 [只要把11DEA指令NOP掉,就可以实现体力不减,NOP指令机械码是4E71% N2 h; Z9 E& x' G
: W/ a4 k* s' X# s: f! e1 Z7 D5。点击ROM MEMORY进入ROM viewer界面,来到011DE0地址,在Set new value输入11DEA和4E714E71,再点击Set 1-10 bytes写入,再点击OK退出ROM viewer,图5、图6:
" K8 U. o1 N+ h( m* t* L! G! W6 M
' X& Y. t _! A4 J# X2 o5 [0 ~
" t# F+ t6 x1 e/ A: p @注意:在ROM viewer修改,修改结果是不会被写入ROM里,要修改ROM还得用16进制编辑器。. X" ]5 _! p0 ]2 F) m/ a; C' W/ z
$ W# z- i( S% q7 c. K) y# ~, O
6。再对11DE0~11DFA这段地址反汇编看看,11DEA的指令被NOP掉,图7:
2 F8 W5 x( O1 H! v. p4 D3 G% G
- O; G0 T0 l8 N) T, A
h7 m/ ~2 j5 x6 F( w7。把Set Breakpoint和write的打勾去掉,再点OK回到游戏看看,体力是否不减了?体力不减说明修改成功。图8:7 v4 A1 h; d: b8 \' L9 W2 C- I- p+ c
) V" h1 q9 `( s+ j9 o; [1 @; R
: [) N5 N5 r# ~- J* e' y# C- T
8。打开WINHEX或UE,载入《魂斗罗:铁血军团》日版ROM,来到0x11DEA,把93 2A 00 0D修改为4E 71 4E 71,保存。图9、图10:, Z6 X7 \. j4 r. N3 M
* R! ]! A7 S( p+ a8 u$ \
1 E8 ?& A8 q: X; E, J3 ?疾风之狼
2 K+ ~8 |/ J0 ?1 g' N2013/09/13 0 X( O) Q1 k+ ^7 m3 U" W
$ r" L# f3 u+ B* ^8 X; E4 ^
如看不清图片请点击图片放大,或至我博客:http://zero3c.blog.163.com/blog/static/278215082013813111414953/ 观看 |