|
|
1 E! b6 T: e2 L& j3 v
很快速的整理我自己常用的指令4 t: k0 M. I7 ]6 E6 o
$ h" t; F' |; Z{:4_112:} 4 ~. b8 _1 M" a z, {- M
- K9 k3 p F d( ]/ o6 K
MAME DEBUG常用指令
* q# z- p& C, C& N
z& T! y, o' U: ^% H! Y3 i' m* I; a内存搜寻: ci, cn, cl6 Q5 J2 P/ u1 R' g H/ @
7 @, K4 O6 M, y8 Z ci
* Z# g" \+ [) R0 F4 m8 G1 U7 W7 ] 搜寻任务初始化, 每次搜寻一开始一定要输入这指令/ T" P/ }) L; m; ^& R4 _
$ f. T l( i T; H: t/ a cn
3 E: I7 u( }+ l" W 搜寻指令
! ]3 ~& r6 W8 G1 z2 d* {) n 例子: `+ f0 \4 D7 C |4 I
cn eq,60
6 P8 `: b& } { 搜寻目标等于60 (十六进制)& N0 c1 Y, q6 p7 g2 a+ n
c# I% `$ d9 f+ f* ? I1 n3 z; |- v cn eq,#96
. Y: Y6 Z( U( A \$ @& j 搜寻目标等于96 (十进制)
3 _2 b+ h) G& E/ I, t! N1 S! ^7 d. q
6 G5 Z% \1 n; ? cn eq
. o, k1 t/ [5 f% l9 E- ? 搜寻目标的数值没有变化
- m/ X( y. \7 _# G# H* Z& o9 N+ G# \" n- K
cn ne: v6 e( S, ]4 p) x3 n
搜寻目标的数值有变化
$ k1 B$ N4 }% V6 r6 c6 t+ { 0 K, }5 r' v* o! q5 P- y
cn +
0 U# y- R9 S# t; { 搜寻目标的数值增加$ ^8 q! x4 v3 p: b
* ] f. W( a; b& I0 B b/ a
cn -$ Y( b& Q( e0 z! r) H z" U
搜寻目标的数值减少- }/ Z- g, ?+ m( s3 }" z: Z) n" o
( K) _8 i- ]* q( \. T! S8 g
cn +,32 y6 c. o+ d+ o/ t
搜寻目标的数值增加3 (十六进制)- f) N8 B. s/ I
8 W" r. i, P9 x# ]' K: e( `. J P
cl
; g) F( I) R: W$ c 列出所有搜寻结果/ l5 f/ i4 v) o+ E+ D
4 g: }1 c% q7 T( f7 V ?( l cl xxx.txt$ ]( D* z' H2 q# p# ~
输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式/ d: `! B0 K; K' p- l% _
2 o" Q9 C6 M8 K$ A, w" X9 H
5 X2 r0 _6 b' q; d% A# @/ M
内存监视点指令: wp, wplist, wpclear
{( `7 A6 G0 x* V& Q5 Q1 f5 [- d 例子:
( }2 [0 g0 g' ], ^2 a: _' } wp 1234,1,r
1 h/ _0 G/ W! z5 x! c 在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1$ C6 ^ {/ j7 |8 j' W
) T5 B4 U4 ~+ Z) Q+ z; p) f' b
wp 1234,2,w
2 }; ], m( E S 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2
4 w; G- x- T1 S/ g" Z$ e* E8 _
7 E! Y; {; l( G5 ?5 k: ~: M. G wp 1234,6,rw( d" ?' o* I8 m: t
在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6* A) g; a4 u- d4 l
( ~: N* S% f. Y# n, s1 h
wp 23456,a,w,wpdata == 1! e" t+ v6 k; ^
在地址1234下写入监视点, 数据长度a, 且写入的数据等于19 c9 {3 s- j, i9 x
6 P# W( ], W( L$ ]1 T" e) `# p wplist
/ A) b/ R+ q5 j8 S 列出所有监视点6 V; R) N# j2 u/ h) b0 G, P
9 p2 Q, x! V( U& b5 U
wpclear 3, \/ _1 @/ O" U* q4 P7 Z$ S
删除编号3的监视点3 Q2 W P2 Z: E' [
9 ^" _1 Z/ B, \$ z# U9 U1 m3 {
wpclear# Z( ?7 m. U- F$ K$ c% z+ [
删除所有监视点
' o/ V& J) T) p% H; R& B+ w8 a0 T
& }7 f1 [# o! l+ S* ^) R! b 1 B4 D9 M5 n5 ~9 @
/ M2 ^4 K6 V7 X7 Z% n; Z程序断点指令: bp, bplist, bpclear/ R% k9 H6 d: z4 i
例子:5 r/ {; T, G" j+ B% N8 |
bp 1234! u; J; x1 i: M8 F- M @
在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断0 j( W5 {) F$ l9 H
* g$ x) |0 D5 {+ v( d bp 23456,a0 == 0 && a1 == 0
% T7 M! z! g @ 在地址23456下断, 且中断条件为a0等于0以及a1等于08 ^ i4 I! H) f, C
8 {* g x. r3 U4 Z5 o5 R
bplist
' `" ^% E* r4 B; P' \2 g( a3 N 列出所有断点
6 [* T W% Y/ a2 [/ j) m: R1 d
( y2 g( X# z; w1 w$ \+ j; q' a3 j \ bpclear 3
* d1 D- _$ D' _; \( p K 删除编号3的断点( T0 T, n! W# b9 [) b) _1 m
5 y# Z, ?" p4 O/ _/ \1 S7 r
bpclear
2 j) A7 T T4 n4 Q3 c: A+ K 删除所有断点
! \ L; B$ U' Q& P% f
! v3 T; [3 P1 F& G0 E 3 _3 w" s: ~. X, \' x4 H a
/ L# h$ O x9 G1 r! _" F( _
跟蹤紀錄指令: trace
8 Q: X/ x7 w/ X" r/ n: e 例子:( V7 S/ w% {6 `. H# v6 t
trace 01.txt
9 e5 F' F, J, e" b 跟踪当前CPU运行的所有代码, 输出至文件01.txt
: d; `* d) |. {# H5 L+ R
3 Y8 ^0 r! k: X trace off/ f' b. S5 n- h5 o |
停止跟踪, 并且关闭文件
2 i! Y* O% F- V3 ~% x: }, D9 V- @' g( m% H
trace 01.txt,0
& j) ?* c, h) B. [, ]9 P8 H 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt2 [$ d- @$ G: ~. k! O, n8 F
9 ~* s6 g6 F/ T) E# Y, n; P3 K" D
trace off,07 B6 e5 w& p0 W
停止跟踪编号为0的CPU, 并且关闭文件6 ~% H1 ]" d' i# W9 T& D2 r
7 I4 l; W% o: [: }
trace 01.txt,0,{tracelog "A=%02X ",a}
- n+ D' _0 K0 U% b4 u 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt 8 {$ ?( D0 }) h, V4 D
并且在每一行的前面, 写上"A=a "$ ?! q* y3 c6 _
"A=%02X ",a为一个C语言printf函数常用的输出格式
0 p, I! ^) p& r 意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入+ k9 Y6 q" \3 w4 I: b
X表示为大写十六进制数' i4 t X. l( j- k
3 G; o5 Y& | y. D1 C( N; Z1 G# I g9 f: z5 y% ]5 U( ~' N4 u0 E
9 e, v- W9 R- m( }3 q2 U3 {5 s7 K( S2 h内存直接写入指令: maincpu
( J8 o$ S) \: Y) E 格式为 maincpu.[][]@地址=数据$ K6 H! ~* s& E
第一个[]:: D* U0 k2 Y1 [+ J8 H: K& U
o 表示ROM地址% _) d& R/ m8 b9 L% j: W
p 表示RAM地址: \( S9 X9 r }" ?' e# f! i
* k& o- F) x5 s5 X 第二个[]:) J- ~( |" [% ]8 L/ z, E+ T# w# ?
d 表示4字节
3 `: Q. k1 V$ D, U; I w 表示2字节
y/ z j( n) V; b( l b 表示1字节
- H: g0 k" Q/ G2 g2 y
; K4 D# V9 |3 Y8 ] 例子:) g, [- i. [1 t3 r5 [9 p) @
maincpu.ob@1234=FF
( d; @' K- U2 V, ~+ l8 x1 G7 ^ 在ROM地址1234处, 写入FF一个字节
i9 n5 z1 j9 o/ `* _/ S4 _7 i& Z" n2 S0 t; ^
maincpu.ow@1234=4E71
, F, }& n' `' h# L) ^ 在ROM地址1234处, 写入4E 71两个字节3 q" w! L2 c4 Q7 v: N
: _# @ X7 p; ~: y9 a: W
maincpu.od@1234=600A4E71+ |4 G7 z9 F" A3 W' C
在ROM地址1234处, 写入60 0A 4E 71四个字节
9 y; E0 S, ^0 e7 A
I: J8 @, H( y* B3 a3 P4 O 注: 如果是RAM地址, 可以在内存浏览窗口中直接改写! U6 \; G4 s9 c9 e$ @& Y* S' Y
9 `8 b8 l9 S3 Z8 \! N. S8 q9 L
: J: e3 r" r4 _$ R8 o
其他:. ~+ |4 P+ W# W* Y& M
dasm 输出档案名,地址,长度
I+ M b4 i( I u3 z9 I 输出程序的反汇编代码
4 j' z% i# N7 I1 y 例子:$ ^% [; A a/ `+ ?' r9 X; ?
dasm 01.txt,0,100000/ F7 s# G! v' ^
将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt9 ]+ Y2 z$ Y. P n/ V
. r) f) l, _% s. d softreset- K. S3 p& g$ U: p. s
游戏重启, 但不重新载入ROM+ z8 G L2 e U. z6 G
0 X6 U1 f2 V' P+ X5 b( _$ l: d hardreset( q0 j5 K0 \9 s) T' d5 S3 I+ }
游戏重启, 且重新载入ROM4 E# ^' Q n: k$ |; e
9 ?0 l9 ~8 u* ?. s snap xxx.png
* A0 j8 P t+ W* j% \1 p, S 截图为xxx.png" i4 s7 y6 g* e- n
( [8 m. e3 d# G; O7 d; ~& b + c+ _$ t0 v0 \5 h, A2 a, R/ f
" E/ z9 B" O: H7 ?9 \& w, k
: o, C* h+ C' {# j9 }' P4 ?
热键:
' c4 X) M$ i- ]! {7 I ~ 中断游戏
0 H2 l1 G! e- D4 t' T% Y F5 运行游戏7 j, ]+ s4 d! ~- h( u$ C
F12 运行游戏且隐藏调试窗口
0 d( O; Q, t, O- C7 @ F11 步入, 单步执行, 会进入子程序
% N- L! @1 O' G( ^4 }3 p: H0 t* X F10 步过, 单步执行, 不会进入子程序+ x$ J" O6 v( Q/ I
Shift+F11 执行到子程序返回' O# _. A* _. n; h" r+ B
Ctrl+M 内存浏览窗口" a: w6 T/ D: g
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU6 i. p. u, c4 x; q! S' p3 ]3 e
0 o( D- X* O& N
{:4_94:}
5 Y% j" o* W6 ]1 E. J
. e7 t- T) Q2 o |
评分
-
1
查看全部评分
-
|