|
|
! O$ c6 o0 G. ]/ B! Y
很快速的整理我自己常用的指令
" V6 M- [4 O4 q' x% y8 \; F+ l1 p' n/ D( p a/ s2 Y8 Z
{:4_112:}
/ w5 s0 e i6 X: ?4 n$ p! q
) s$ y2 B. t/ Z1 e$ v HMAME DEBUG常用指令# U# a- t3 W) p7 r; x* o2 m
$ `4 k) V# Z1 m9 m- ^! c+ |7 D内存搜寻: ci, cn, cl2 O1 K) s' [$ h" _' q% B$ t6 C
6 E* B, I L. @% n, t9 E2 v. o9 k% F ci0 [8 v# Q$ J5 [- |- s3 }9 e
搜寻任务初始化, 每次搜寻一开始一定要输入这指令1 q' ]# Z7 i; y. Z+ k, e5 b* T
6 M, ~3 L3 F" i I' ~
cn: e/ n {3 @- x" N9 q2 _1 N& U* J
搜寻指令
4 R; t+ I+ ]( f, Z6 d- C) M 例子:" T! H% q) o, I
cn eq,60
) G$ w I, K! f9 v" z 搜寻目标等于60 (十六进制)2 @0 p; b) H0 H, l# e/ \1 i3 |
, U) E8 b. g# U5 o9 O$ j
cn eq,#96* W J7 O1 q/ a+ y6 s
搜寻目标等于96 (十进制)' z8 T; E; z/ p% ~! n( E1 _, ?
1 m1 ]0 \3 C. O* `
cn eq4 i4 r* E; ]' D% [! b
搜寻目标的数值没有变化
( v+ K' m' B, ^. a5 }
0 ^" e* D* |* y: w cn ne
- K- j. f2 E2 i 搜寻目标的数值有变化
# v- F: N+ l8 y! k; R; _, V* w # v* S4 q0 U3 I" r' `7 I) }
cn +
9 p' Z5 H6 T( {# S 搜寻目标的数值增加0 f+ m) C0 X! q* t
5 h; L% `+ X( Y5 x0 @ cn -% o/ }2 b* x) e, Q( M3 _6 s
搜寻目标的数值减少0 j; J9 V8 I% ?! Y5 L6 t4 Q
% R: \% O" {4 ^
cn +,3
; d3 h; R8 L$ ?2 y7 @ 搜寻目标的数值增加3 (十六进制)
8 g# G1 H' |2 Y8 H6 Q5 B2 m9 ~1 t. D: j% `5 c7 b
cl6 [; I7 Y: f* M
列出所有搜寻结果2 @* l+ H( s2 y
! R2 Y" g6 G0 U1 ?3 t0 I% x' K cl xxx.txt. O* w& ?4 Z5 I) U4 ^
输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式
. _7 ^: _7 I1 W+ P2 Y
1 Z% p, A) B% D& W" c ? 0 s! L5 D5 @# ~- G( g7 j+ y; r+ m
内存监视点指令: wp, wplist, wpclear
5 D8 ]" g& p$ K4 D, P: j! G 例子:
3 O3 c9 n' h, [8 @! R) L wp 1234,1,r
6 w( b6 \5 a, Z: L: g/ g4 e 在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1
' K* O2 K u6 Z0 q3 P/ M5 ?
; d# \1 U" }( f2 C wp 1234,2,w
9 u- ~; p- X# B8 `% J0 u1 p 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2
0 G2 g) {/ |1 l * B6 `1 k1 x B( }7 \$ D5 \
wp 1234,6,rw
7 I- G8 }2 q" C3 ` 在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6
u2 ]& O p5 x+ |7 b# `2 y3 V* M+ ?7 Y+ c9 p @
wp 23456,a,w,wpdata == 1
" N" e R$ u" u( v 在地址1234下写入监视点, 数据长度a, 且写入的数据等于19 s9 w! R0 o1 _; ~
% V6 O+ a; S9 {% ?) E" S wplist" q V' b) H5 h( A
列出所有监视点, g) K& F8 ~% K0 L
" n( _2 Y8 d- g wpclear 3, J$ D; X1 T/ T3 o- m( e J
删除编号3的监视点
) D2 F& ]- ^9 r3 ?$ g# X; N9 M) V$ s% ?# s
wpclear+ C6 w' L1 P8 i9 q2 K) Q+ c
删除所有监视点! g0 w# L& ~: \' {
4 o8 _- \7 `; t " M" q8 h# f) e+ Q7 d% S% R
- E/ E/ ^% O. V8 Z9 T& i) h7 t
程序断点指令: bp, bplist, bpclear" L6 X0 j* l8 j5 z, n- \3 a
例子:) q8 ^* K) J4 ^
bp 1234
" k. p3 y8 k& K+ l! n( B2 } 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断
8 z$ ]& W, T/ ?3 n
6 D! D% h- G8 B: j2 D: F- t bp 23456,a0 == 0 && a1 == 0
, s' [. P8 ~3 F" s5 T! H 在地址23456下断, 且中断条件为a0等于0以及a1等于06 {' y0 m; Z+ n7 ^# H0 \' e5 j
, q. E! V, ?5 P# L' n bplist3 ? y# s) T7 ?' H& ], K$ \# o
列出所有断点
! A* J0 A# w, k( a0 Z2 Q9 ~- {6 _, z5 B! f0 O7 a& @
bpclear 3
9 K# O: a# T+ U, d9 \ 删除编号3的断点$ L* {5 x+ Q( `4 }2 @$ |5 n
* C9 v ~ ~4 y% }
bpclear
8 f" p9 _6 A7 e# f" b8 e+ j& O, l 删除所有断点
) e# Y" d" k9 r3 L' f E3 V4 r
7 s3 D( ]4 e" Q$ Y/ {5 Q j. Q" x/ d / i3 m/ n4 b8 |% }3 F# n; v1 ^
. X- k- m0 ~* U1 o4 X/ G1 H3 e跟蹤紀錄指令: trace5 Q8 G" R8 w3 g& A: E/ @
例子:$ r/ l/ I. w- j8 ^" n$ Q+ j% e6 r
trace 01.txt
% [' O6 s' q( N$ b2 Z 跟踪当前CPU运行的所有代码, 输出至文件01.txt4 U) s& S* ?2 f2 q: n3 }" F6 Z
e, v- c. _: K& J) i. Y' N trace off+ I' v6 N, A6 u) W) K
停止跟踪, 并且关闭文件* h8 n) B( R' W( c- \( ^* s
1 q, ?4 \; [ k' H% s: W- v trace 01.txt,0 g$ ?, e- ^- a. i% L+ u
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
1 v* t. Y9 M" m/ G
4 v; e! B' R3 o' \! T6 A' ] trace off,0+ Z; ]+ j8 j- P/ J7 M
停止跟踪编号为0的CPU, 并且关闭文件
9 a' F2 U; W3 ]* @/ K7 ^! ^% K6 H* Z r- U& k: v4 L
trace 01.txt,0,{tracelog "A=%02X ",a}
4 Y& V7 M0 n8 F7 `1 [, x 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
1 ]/ f+ H4 @$ L# A# ^# _ 并且在每一行的前面, 写上"A=a "- E6 f5 q( ~: |$ ]
"A=%02X ",a为一个C语言printf函数常用的输出格式
7 B- \/ K% z& p/ B6 ^ 意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入
, A4 n1 Q( U* a- T. ~) S X表示为大写十六进制数( o8 K3 V8 V2 _/ `- M& X
+ v8 T% W- p' U$ x1 a1 k$ O
7 O- u4 a8 O8 ^
) ~; \8 ~" F+ {& J0 Y6 d
内存直接写入指令: maincpu
# c7 U! k7 S7 | 格式为 maincpu.[][]@地址=数据
`/ ]& @7 x. c 第一个[]:
" j) P( C+ b% F5 z: [ o 表示ROM地址0 j4 W; l3 N8 G) [* O( O3 I
p 表示RAM地址
" _3 o. }! r' @% r! ]
4 M# f" c T7 X' b 第二个[]:
; H" g8 x& L L+ g- U' ? d 表示4字节
- v* s* H! f4 B: ^ w 表示2字节
' P" T m7 q5 h1 z, v b 表示1字节: N9 b- Q6 y" f; Y, R, A2 t
( u1 b" W7 Q! _7 z) N5 D 例子:0 W7 Z j6 u- I% m6 F
maincpu.ob@1234=FF
% z( S9 e/ x+ Z5 p& g }. W 在ROM地址1234处, 写入FF一个字节& {% d' L, N* {
" }8 f! B% x' ^4 j2 q6 U" }, k
maincpu.ow@1234=4E71: @. m* I( w/ ^/ T/ s' R0 E
在ROM地址1234处, 写入4E 71两个字节5 h1 g8 F8 R$ b# {( |+ a6 @1 K
$ S+ Q7 W0 w! B! d0 L! Z
maincpu.od@1234=600A4E71( e3 ^4 x2 E" q# Q6 R
在ROM地址1234处, 写入60 0A 4E 71四个字节
& n$ V/ v/ Y0 }$ e5 Q( ~$ Q: x8 x
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
4 e6 W+ D K4 ?1 T: r: o; K, A: e3 U 2 c/ X! @8 ` s! s+ T6 {
7 L# Z0 Z& Z/ Q! [其他:
0 w& Q3 B' K l0 Y, m9 ] dasm 输出档案名,地址,长度9 Z% e# f* _* j
输出程序的反汇编代码
1 V2 e% ?' V# X 例子:+ A1 Y a( T- x3 S, \8 V1 X7 R
dasm 01.txt,0,100000- O4 X3 @' @2 L! L
将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt3 J z9 I( `2 _& d }
9 `! x! K( Z8 K# K# T7 K* `
softreset% M* T7 k6 _' G1 q( h" v% z
游戏重启, 但不重新载入ROM6 P" c* [' t. c& d, F9 S. K4 I( [
* ~3 J+ ^/ _) U' Q
hardreset
: u8 C9 O7 C! D, ^# {! ?3 Y8 u 游戏重启, 且重新载入ROM, @6 Z7 X0 o" p7 Z7 {' K4 H
w' u4 Z/ c' N/ g3 Z
snap xxx.png1 j, B& u2 o1 D% |" B
截图为xxx.png
& h/ a' q; ~, g* u5 z) E q, E! Z/ A! {; A. q* x! m/ f( b6 c
/ H, e2 a4 p. g: Q$ [$ ?
8 i/ x+ f( z7 } k
9 W* F, k: h: H+ b/ T热键:
, S5 V1 R" r: ] j- Q ~ 中断游戏% ^9 q- D3 j5 _$ _& c
F5 运行游戏
, D5 Q/ q, F- n3 r/ w+ l( h F12 运行游戏且隐藏调试窗口# ] D3 r( D) A. S. a' b' i
F11 步入, 单步执行, 会进入子程序( R B& Y% P$ [! I1 m# `
F10 步过, 单步执行, 不会进入子程序
% J4 J2 F2 ^9 } Shift+F11 执行到子程序返回
+ K/ W, E. g- Y j0 Z8 d- F9 H5 _ Ctrl+M 内存浏览窗口& t3 Y* e* S: ^# z
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU" K/ a" D% \8 V( G2 O* U6 B
Z" E1 ]! T5 N0 V% R3 e% c; j. J{:4_94:}
2 b) ?4 H( y: Q. z' U" t! q% l- S# Z ]) f( F$ D4 s" X
|
评分
-
1
查看全部评分
-
|