|
|
+ x3 V' U( {2 \3 O8 J/ Y; @6 T很快速的整理我自己常用的指令 u c6 _- b8 A E$ n9 y
* F! K- j) ?0 F3 {{:4_112:}
q$ Y/ N6 H" t" x& {$ c5 F- b/ O( K, H
MAME DEBUG常用指令
- o, m) L- K) n+ T, P6 `& a
" e N8 Z6 }2 g6 ^# r内存搜寻: ci, cn, cl& b4 m: j6 D( u0 o$ J9 M
; I6 Q& R9 Q* w$ V: U* ^' \4 V, o0 \ ci
0 V3 Q! W8 r( i7 ?0 x 搜寻任务初始化, 每次搜寻一开始一定要输入这指令
1 L2 N. [! H* L, D$ o ~
9 O: E2 e$ c: a2 W, R( _ o cn) c9 L- k$ p: n- _, q0 A
搜寻指令
1 A' R" |( g9 B+ s1 ~+ w. _ 例子:
3 U8 u% v8 c M cn eq,60- @' x' K& ]9 o( @2 v
搜寻目标等于60 (十六进制)
. a* U' z+ K" S& I0 V, K
) }1 A1 N: h" |4 F n) |7 Q M cn eq,#96
" m7 |* x: f- F3 U 搜寻目标等于96 (十进制)
5 b* q% y0 ~3 l& `. F
5 \7 r8 ?1 Z! h$ ~ cn eq6 ?6 x& _: C! i- v# T, ~9 m
搜寻目标的数值没有变化
8 w8 X5 `5 U! i/ j: I
# g w$ g) o- t: y0 `' R cn ne
! D+ i& h& U& A+ H' A6 Z* z6 P 搜寻目标的数值有变化4 g* d; h( o$ D$ @4 `4 O4 q1 F
- n. y; `- d) S4 [ cn +1 x3 G( n8 p. U* B) g, r6 P
搜寻目标的数值增加
d8 a$ C1 o# M V% u
6 A8 @! ^$ T3 a' O. S$ f cn -- B; b& i9 g9 U+ ?
搜寻目标的数值减少
: y5 [+ f1 f! i% g ( i4 J( T) H4 r O- A
cn +,3: ^: g9 {; s3 t( a5 n: I% K$ _
搜寻目标的数值增加3 (十六进制)) g: c% Y* ~& b- \" `
9 N# R; q' V" W+ ~6 |4 @9 B
cl
8 {: e9 ]3 o" T( ~5 X( ^, ~" L 列出所有搜寻结果& U9 O0 x4 s! g2 z" |
3 H( X) }9 w2 q+ G/ H, _5 T# w
cl xxx.txt
/ j8 H% y. X8 g+ M6 E 输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式
6 ], M' H! `+ N6 f( K3 `7 i0 k& x+ ~' N0 f5 p9 X- I( \
; e1 v* {/ l2 _8 G! u" S
内存监视点指令: wp, wplist, wpclear6 U+ y! h) e' b' L) }5 d$ F
例子:
* _2 W$ G/ x4 {1 ]4 r wp 1234,1,r) M9 Z- x9 p5 N/ R
在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1
* a/ R, D2 V; @% z2 R* a
0 P/ ~) F% a6 Q; {% X wp 1234,2,w
9 {6 F& R! Y5 b k4 E1 h! Z. Q 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度24 z4 |; M1 x2 E
6 ?' `; N: t9 t. x- d
wp 1234,6,rw( o7 S/ ?4 ^# X# \: i% u5 K
在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6
% L& Y1 a' s( _, Q5 Q7 r
8 @, v/ B9 \7 j# k- G& t) G! T wp 23456,a,w,wpdata == 1/ C4 i# e. [. s' y s- P, |1 ]2 J! j) @: ?
在地址1234下写入监视点, 数据长度a, 且写入的数据等于1
1 I7 E. K$ ~& n, t! ]" @: V ]/ `( F. z, E/ ]% e
wplist* h' x, G9 d/ ?2 n
列出所有监视点
# x e. H8 T5 e; V9 r- y
4 ~! `7 P: t- o& M% w wpclear 3
4 W( F' `$ L3 K. L6 f- g& r: K0 o1 z 删除编号3的监视点' O8 U' F& N7 x- g$ {3 M
4 i/ F2 X) A& U g; ~# S' O
wpclear
+ g; }$ a: V7 f0 T 删除所有监视点
1 w) C9 U$ q) P. V! M5 F
9 {* \( d7 ]4 r! f9 h Q $ ?/ o+ u2 R0 G" t" z/ B+ _# S) T
. }; r& T! K, f# k% i! ]$ d程序断点指令: bp, bplist, bpclear, N3 L- v @9 q
例子:
+ x! h+ C% c5 \ bp 1234) b. v4 n( @/ _6 c: y
在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断4 Z# e$ U0 z4 n/ `7 F% m
3 _9 s+ m0 s4 S& Y9 g' ]/ ?5 p6 \* t bp 23456,a0 == 0 && a1 == 0& r: V! R. j6 Q& a0 E6 f% T" X
在地址23456下断, 且中断条件为a0等于0以及a1等于0
8 t: t3 f+ v" m3 @* m& o$ S! X, f& w
bplist
) ~0 h, ]. G$ l) f) d 列出所有断点4 u* }5 ~5 _' x; B
* I. e; @+ V, b, F: L1 [
bpclear 3
8 J0 K$ { M h7 g 删除编号3的断点( l; ], u: R# U2 I9 j) c F, z
* ~6 V- b& W0 t1 b3 y+ z bpclear
" d1 Z3 \0 N! a; G7 ]: V 删除所有断点
, W4 r" C9 |$ R. M" b9 D7 f5 ~/ r/ k1 V0 h
9 ], s& D$ k g; o& ~- q ) \9 z5 H! R, v! {. Z- V" ?6 h1 [
跟蹤紀錄指令: trace" z. U9 \) t* R& G6 K5 [
例子:
) I: Q0 K( I/ ^$ I* n trace 01.txt
2 Q" v! s$ m; e5 t5 k 跟踪当前CPU运行的所有代码, 输出至文件01.txt
+ t; d2 m) _7 f! W+ {9 j( A0 J* ]5 {/ x
trace off
+ h/ l. d2 A1 r% F7 v: G. X# a; M& M 停止跟踪, 并且关闭文件
0 t- y1 v- _2 Z/ U& K6 D1 _1 d. X- `& R r
trace 01.txt,0& n1 Q4 z! W6 B* ]& F' U/ k( a
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt8 I5 x5 D; U1 [% u- [6 O
; z0 y7 y: N8 X4 Z5 q4 M/ Q% ]
trace off,02 M4 d8 Z6 n0 U" N- |! l! r
停止跟踪编号为0的CPU, 并且关闭文件0 L, i4 C6 \2 ~. _
6 ]7 n' k+ [" t& `4 W trace 01.txt,0,{tracelog "A=%02X ",a}
9 D; R o) S9 r& d0 h. | 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
( R7 V# f2 B) ~/ @( b 并且在每一行的前面, 写上"A=a " ?- B8 `+ ?; ]- ~" @, p n" h
"A=%02X ",a为一个C语言printf函数常用的输出格式9 q) A, G# u. e( {5 ?
意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入: `. I S9 z m: V0 ~. Z6 w2 b! h
X表示为大写十六进制数
) g9 ^. t. s) W) M3 ~+ W- |0 E8 s( o4 P! E
% E9 l6 Z2 r' q, J; p6 O0 p4 J7 @8 I* o" x; V
内存直接写入指令: maincpu" M! ^9 n- O; m: p4 ~, S
格式为 maincpu.[][]@地址=数据
+ r6 ^" y' X* c R7 \7 l5 Z 第一个[]:4 @% S" u# h1 P5 s4 H
o 表示ROM地址# W" ~3 ^% U0 n& M6 Q, e& A
p 表示RAM地址
2 v% R, W5 J. p/ e& r: z8 s( Y4 D8 s
2 Y/ M$ k' I5 m7 ?. S 第二个[]:
. w% q# `# K- T1 B. p: A d 表示4字节/ P( ]$ G$ @0 C' E& X
w 表示2字节! x( z& d0 R' m# J
b 表示1字节
/ t, |. K: U, \7 l/ ]3 i
6 l; K' f* N* W6 q1 d; a 例子:
! l! y$ x7 P, v maincpu.ob@1234=FF& b! T2 b4 k% o+ z# H. @
在ROM地址1234处, 写入FF一个字节 D/ z. w7 e* v9 a8 k" g9 k7 f
+ I6 m- s d( r3 h C' [! j maincpu.ow@1234=4E711 M& W k- I# K7 R
在ROM地址1234处, 写入4E 71两个字节
" I; {8 M# _( r& O. V2 `) g/ r
. [+ O' g6 ~7 V+ V/ B% D maincpu.od@1234=600A4E71
* L2 r- y% r/ I- U 在ROM地址1234处, 写入60 0A 4E 71四个字节
1 f/ [4 O* e5 b) v& D: j) A" v& ?% h0 B" F
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写, C- g1 D* ]7 ?2 S& s
" _, h5 b! o( M9 g4 W
" n: H( |% o9 l' p0 {7 a
其他:
+ J9 \( u. }. w; H3 x dasm 输出档案名,地址,长度) B E6 G9 t; [
输出程序的反汇编代码( M( ~& i7 _) t0 q3 z- w$ f
例子:: s, l- O+ B; i6 ?" }/ s' ?( z
dasm 01.txt,0,1000007 ?; o8 z2 u1 j# o- [& f" V# p
将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt P- v! v5 `, \0 v3 D
5 A7 O7 f& Q/ Q3 W softreset
) K- d$ P, \$ d6 L/ `3 S" w! U& K0 ~ 游戏重启, 但不重新载入ROM6 R) c5 z2 D! D/ e" p# y/ n! M+ q
* Z% P% J4 |. J3 _- r
hardreset
: V* t% r" m3 y6 ?! U" ]1 o 游戏重启, 且重新载入ROM
0 {; c% m. h* w4 `
: J% C: z' T$ }2 C+ M' ^ snap xxx.png" n3 i) j& D. i
截图为xxx.png j3 C* b7 ?" o( [- }
- G1 B" J7 s- ?; @$ }, P9 ?
) S" _# L9 r6 T* l2 w* }
; ]8 g' g" ]! G, Y `: O5 ^5 `' P" w; S. ]/ q
热键:
9 E @; |5 D) m, s) e! c ~ 中断游戏
3 C6 U/ }$ L* A6 j/ E F5 运行游戏
) I- f w6 Z$ A5 R9 q5 a: a2 ^ F12 运行游戏且隐藏调试窗口
2 _4 a$ C8 N$ \: H3 j* w F11 步入, 单步执行, 会进入子程序. ]0 r9 t. P, Q, A/ _* j: Y
F10 步过, 单步执行, 不会进入子程序
% ]" G0 W3 C: k# U$ W; @* o" u3 k Shift+F11 执行到子程序返回
{( B. r6 K/ p$ ]$ |# x1 f Ctrl+M 内存浏览窗口8 x5 n" r+ m) R0 M/ K7 v
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU+ ]/ N5 w% o7 W( `
7 Z7 N# [. o2 P4 e% L% f. f{:4_94:} 9 M) q9 R9 Z- L4 U
6 j: h+ P7 [/ }" n. b `; T |
评分
-
1
查看全部评分
-
|