签到天数: 1993 天 [LV.Master]伴坛终老
|
准备东西:68K指令集资料、REGEN DEBUG、十六进制编辑器; L% o9 r3 `$ x) Y# X
- T- F& c# ?6 V- ^/ m$ b
REGEN DEBUG官网下载页面:http://aamirm.hacking-cult.org/www/regen.html
) [. a$ g: D6 W" V" w4 z3 R9 \( S( j/ r% U/ G' V. z
以前写的MD HACK教程是用MD调试器,但这MD调试器在使用过程发现有点缺点,显示机械码只显示前2位,后面地址或数值却没有显示,有可能造成后来新手在修改ROM时寻找不到要修改的数据。
9 q( K5 S7 D1 O; N
4 p# @, t) [$ }- q8 [本篇教程考虑改用REGEN 0.972 Debug版来调试跟踪,现在的REGEN DEBUG很强大,可以考虑放弃MD调试器。( G# M" c2 k8 j0 R# F* O
2 Y* t* ^% R- M. ~
以《魂斗罗:铁血军团》日版为例,修改目标:体力值不减0 M. a3 U" G/ ~, Y0 |3 n& i
, j' [3 P" X+ p) b1。先找到《魂斗罗:铁血军团》体力值存放地址,可通过REGEN自带的作弊码查找功能来找,我找到了,存放地址是0xFFFA0D。4 e! v$ a3 R8 v+ l! }. i0 i
/ _4 g% q- H& N5 P! V8 i: q. d5 k2。选择人物进入游戏后,点击Tools->68000 Debugger进入68000调试器界面,图1:
$ n: h9 r# c% y) [' H+ f0 A* b% C G+ P3 ?8 |) z: T/ k6 L
) b6 _, X. R4 G0 m左上角框是显示汇编指令,右边是寄存器显示
: r( k# A+ o9 d. u+ V8 D
$ `; d) u; Y$ fAddress Breakpoints是地址断点
8 Z8 r# |" }$ H; M" d0 @! tAddress Range是对一定范围地址设置断点
1 @3 `% C! c' ?( u& L# W' ]Register breakpoints是寄存器断点/ b2 @7 D& X* |3 z* [
VDP Breakpoint Range是对VDP一定范围地址设置断点+ v/ _) x' H) Q1 Q, l* V$ y4 B
VRAM breakpoints是VRAM断点* o" L( L1 `! s& Z& B. y' S1 E. n
Go to address是转到指定的地址
5 @% X3 W$ y2 z2 a7 Qshow disassembly是对指定的地址反汇编
. i8 W& r4 I6 d7 L. i& e& [: ]Debug step是进行单步或N步调试4 d! d- C4 R- B Q* T
ROM MEMORY是ROM Viewer _' [; R6 P% H# I" \3 g
68000 MEMORY是RAM Viewer
' {! [. n6 M9 ^% E8 F4 G, Y& l& f! M" k! bZ80 Debug是Z80调试器9 U/ u& m; w; r G8 G. v/ r3 y0 X
! j& q K' a( P: A; E6 H& ~
Read是读,Write是写,PC表示是PC地址,Trace是跟踪(选择该项会在模拟器目录下生成ASM文件)9 M5 H Q1 X2 v7 O
! I/ p& V- E& R' B% l
RESET是重启游戏,RESET68K是68K重启,RESETZ80是Z80重启
4 r2 P4 R# ~) l2 c+ F
1 v/ r5 M/ F: s3。在Address Breakpoints的Set Breakpoint右边框输入地址FFFA0D,Write选项加勾,再在Set Breakpoint左边框打勾,图2:
1 p8 z8 x. i3 M" D7 S) M. o; u6 l6 E9 b' B
( Q0 W6 d7 G Y0 m& f
4。点击OK返回游戏,当被敌人攻中时调试器发生中断,图3:" |0 U: V" I# L1 r y
9 S e" x2 V( b) c: Q3 k1 l8 K3 ]/ {
6 T: z x) J) J% u; ~& o- c指令停在011DEE 1C2A000D move.b ($d,A2),D6这一行,前面指令却没有显示,用show disassembly把11DE0~11DFA这段地址反汇编看看,图4:
# c1 Y7 t' p, r' R& G7 i% O+ d- b. B3 v
: m* B/ n/ Z8 m- g" j- m现在来分析一下:
5 n) M, O) A. _) eA2=FFFFFA00* Z( `. a! y3 q/ \# H+ r7 i C- v
D1=000000017 p4 \4 H- x2 y( r. G( E
, ^- @- v* u8 l/ y; M
011DEA 932A000D sub.b D1,($d,A2) 把$FFFA0D(A2寄存器的数据($FFFFFA00)+$d=$FFFFFA0D)的地址单字节数据减去D1寄存器的数值,结果存入$FFFA0D! Z# ]3 m3 k& g/ h7 d6 Y5 k4 _
011DEE 1C2A000D move.b ($d,A2),D6 把$FFFA0D的单字节数据存入D6寄存器, w' \3 C+ g' r' Q
( s) ?3 `$ J! z% S: _ j8 O
只要把11DEA指令NOP掉,就可以实现体力不减,NOP指令机械码是4E71
- @7 M" |- n3 @, Z. n; E }( F2 j% i: W7 G4 c
5。点击ROM MEMORY进入ROM viewer界面,来到011DE0地址,在Set new value输入11DEA和4E714E71,再点击Set 1-10 bytes写入,再点击OK退出ROM viewer,图5、图6:
0 f1 `( I1 b" I; i
% h* ?1 U6 S w d2 t1 G# v% b' E$ F: }& ^1 C) |
注意:在ROM viewer修改,修改结果是不会被写入ROM里,要修改ROM还得用16进制编辑器。
}5 K/ E' n0 T% |6 h9 |- q% L+ O
6。再对11DE0~11DFA这段地址反汇编看看,11DEA的指令被NOP掉,图7:& n- i2 m! X( Q4 l0 z
6 ~; u: J, h) C3 r2 I) Z* ]
4 A8 l8 a. @/ D& W
7。把Set Breakpoint和write的打勾去掉,再点OK回到游戏看看,体力是否不减了?体力不减说明修改成功。图8:# Q; [; o2 d2 K
w7 c8 y; ] I
/ D. j- v: Z* z! M" W9 O) p1 f. M
8。打开WINHEX或UE,载入《魂斗罗:铁血军团》日版ROM,来到0x11DEA,把93 2A 00 0D修改为4E 71 4E 71,保存。图9、图10:& S6 g# Y" \9 E
; w) f# V1 B% A8 a* ~! k8 Q- s- ]' W) J, M
疾风之狼. A7 U+ O6 R; c
2013/09/13
4 D4 J) x0 x+ k! T% [$ a2 d$ s( J* F: Q
如看不清图片请点击图片放大,或至我博客:http://zero3c.blog.163.com/blog/static/278215082013813111414953/ 观看 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|