|
|
% G" j/ E8 v7 e2 O$ Y3 e& O; t
很快速的整理我自己常用的指令5 s9 m; u1 O/ O: F. F
- f) U' A8 J0 A2 s, G
{:4_112:}
+ G( W6 N- F' t8 R: m& a' v2 T& c2 b) n( `* u5 v
MAME DEBUG常用指令
' m2 o0 @+ b5 x- \& e$ ~( _3 ]: A% I) E0 S
内存搜寻: ci, cn, cl6 D6 L4 W5 W& K0 |
2 @1 b7 X5 M, `
ci+ y% d/ M5 X* c' c4 D
搜寻任务初始化, 每次搜寻一开始一定要输入这指令2 i1 T3 t- p( Q' V3 b; v, P
. y. v6 j8 Y" {6 u9 n( u
cn
( i, ?2 |; I5 a& g/ n4 v 搜寻指令
6 c8 @# x6 I$ _0 W$ @ 例子:% l8 n q5 f- M$ H2 M2 \; l" A
cn eq,60
; w, ^5 J$ w. T1 ~2 Z) x 搜寻目标等于60 (十六进制); ^; ^. y5 i+ k8 V
k! v V) h$ M% [5 N
cn eq,#969 E, R* u' k" c/ m o$ H
搜寻目标等于96 (十进制)
- \) X6 N( R, t8 {
4 P2 d( H" \4 Y+ r. V U- A$ L* H cn eq4 a% s8 J$ s3 v2 \+ D
搜寻目标的数值没有变化) B9 X/ n; ]% Y$ v( ]* t/ p
& X' S) s5 {$ ~% }9 K
cn ne
/ P1 c% z' L; B; E. u! n% r% H& K 搜寻目标的数值有变化
5 u/ N# l" x4 o4 `" K
7 n/ H7 S/ n0 b5 N- \1 l9 k0 y; U% M cn +& p& Y0 P; r, m% v. [) P
搜寻目标的数值增加5 x" R3 L3 t; O+ h, H: Z4 H
5 W& K+ D! z# K
cn -
8 S/ z h* |9 z2 v) Y 搜寻目标的数值减少
9 J8 i, y1 b& \' Z& S b- d2 F ) S( y8 v% F5 a3 e7 d
cn +,3/ t1 u% u- _ r6 R, {% H+ J" s
搜寻目标的数值增加3 (十六进制)8 G) t$ {8 r" T0 ~
8 W1 K" e' F) I) ` cl3 [9 z% g6 Q9 x
列出所有搜寻结果
' d- G! k2 m5 u: }6 h' F
+ B1 q$ r6 J! r. {& C cl xxx.txt Q j8 l9 J) s& o6 h- i3 T
输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式
1 L' d9 f e( `% d5 d# u6 O* U3 O# N3 ^. j& m2 c) X4 {
/ U+ U# {& J2 w& e2 ~5 z0 g9 P内存监视点指令: wp, wplist, wpclear
# w9 e) _$ l) I0 M6 p/ q( x 例子:
* j4 k+ k0 D$ C# r; s4 A- p9 k wp 1234,1,r' L& x' W) K, L0 v; @
在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1+ d( ]1 J k$ T. _, J
/ f; l6 E4 S& h3 O$ u" h5 w2 {
wp 1234,2,w
$ n) _" `' |; k6 z3 N6 L 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度26 W$ J1 N/ K1 c& r
2 i( S: l% b! V: L) M% v3 W) }
wp 1234,6,rw) ^* N/ j, y1 k I' @
在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6# m: f4 L* m6 S- ]+ I
- g [$ p" [( m0 ` F* _ wp 23456,a,w,wpdata == 1
9 i+ ^8 d6 e/ t: b% t# [1 z 在地址1234下写入监视点, 数据长度a, 且写入的数据等于1
* s# l% e) u1 `: U4 S0 J8 o5 T/ Z- t4 m2 i/ \
wplist
1 I B$ d7 H! n* p 列出所有监视点
# F) G2 c% Q; p( h% [# |; n. y# u" A$ p2 w
wpclear 3$ v. v4 d! _ V
删除编号3的监视点
( S4 c- O, h6 d' q
9 z% \% A8 K/ B wpclear$ w+ o9 L8 a) Y! U8 ^: m- Q
删除所有监视点* M+ D1 i* C9 ]
- J3 h7 |( w2 z8 y3 p
5 L5 y r) O( z7 _ X( ^1 w1 V8 Q* N- R5 c) Q
程序断点指令: bp, bplist, bpclear4 f$ A" H, p. Z
例子:
+ w" T F2 q3 h3 g bp 1234
9 W2 J$ Y, G7 B$ q9 X 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断" O1 E: P* M" A; U k2 H
1 N- l# j; G+ d8 y) _. z bp 23456,a0 == 0 && a1 == 0
, M4 w" J: a' t+ A, W 在地址23456下断, 且中断条件为a0等于0以及a1等于0% \% P8 q: D8 _, l+ Q
% M: `- Y/ n/ }+ A. I8 v bplist6 e8 Z; m' U" U4 x( z6 f
列出所有断点$ J, c- I% L2 `/ M2 B* i% S" b
0 @0 y/ l$ `8 P0 Q
bpclear 3
% a8 M6 p" k* A0 \, |# _ 删除编号3的断点
, @! E3 F/ O- q5 B9 Z; I7 W z p' |
3 c; n' B% \# ~; [4 n& p bpclear$ l# ]; }. ^1 ~+ _
删除所有断点
3 L8 H* l! C* q C' b; f7 M% R, x4 g7 q; n
2 M! l, c# }4 s$ P* i
0 D7 @, C* g/ a' [" r2 N% F% n# v4 A跟蹤紀錄指令: trace: H& z$ j. _. H( ]$ \5 c4 b$ G
例子:/ f4 y2 i8 b4 U% F
trace 01.txt6 x) x' a- T% C- l: I- e
跟踪当前CPU运行的所有代码, 输出至文件01.txt& M8 |& L( x0 L8 j2 ~ m8 b P! K
! w2 q: ^ M9 Y trace off- b9 ?/ @! z' J6 S) Y" a( \) U6 T
停止跟踪, 并且关闭文件( L5 B- P4 c# E( o( u: w0 D
2 D7 |& r% i" a
trace 01.txt,0
$ ?# k1 i5 [ I# |4 H8 f! l! g2 [ 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt& k$ o$ v& V) q( A
5 X: @! ]7 q! v
trace off,0
# y7 |5 j! V. q( l 停止跟踪编号为0的CPU, 并且关闭文件
. Y; g" s! K1 j& N
: v: s+ ]" t e9 J trace 01.txt,0,{tracelog "A=%02X ",a}
6 Z" a% Q& f. v: P- Z# B! W1 o 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt 6 Z* {( q5 a$ Y/ i6 ?. G4 E
并且在每一行的前面, 写上"A=a "
9 g/ v4 p$ P+ ]) A4 L "A=%02X ",a为一个C语言printf函数常用的输出格式
/ v# ]9 c& ^% y 意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入
% z4 n4 T. W0 k- j$ x& Y X表示为大写十六进制数# t% M& |- Q y( A% p0 K
3 A6 W3 l0 X9 B. M0 |" M. U5 D
5 `3 W: k7 F4 E, }. X Q7 [
$ J9 a" t8 w F5 e" l内存直接写入指令: maincpu
' u( n7 O: q% w! N$ m1 ?8 P( p 格式为 maincpu.[][]@地址=数据' k# p |* M! m9 b# K. X
第一个[]:( _5 [' x- c+ F! i. q
o 表示ROM地址
$ H; Q r4 A4 \5 I p 表示RAM地址, Z2 A1 {, R/ w
* ?. ~9 r9 Q# Z, m* C; C3 d
第二个[]:
0 U2 u# J5 R4 |3 c2 T: ~ d 表示4字节4 D3 T' ~( D p) W% y. B% b: R
w 表示2字节% O6 s9 G6 X, ?+ s; L& a
b 表示1字节
' A, m1 r" u% G# v. ], L1 {
' l) w( {& M8 s* `8 R- c 例子:
6 c$ z3 D9 M0 L! F* z9 X7 a. N. [6 o maincpu.ob@1234=FF
+ i# K: {" ^# \6 a, M4 n3 u9 b/ o 在ROM地址1234处, 写入FF一个字节6 m# E+ s1 W7 q' C/ q6 C# |
2 U9 |2 d9 e% L+ M0 J) h2 e
maincpu.ow@1234=4E71) s. b: s4 a/ x3 y7 J! Y
在ROM地址1234处, 写入4E 71两个字节
8 f5 `- Z" U# G
. t2 g' `. F) ^6 {, j6 c0 t4 ] maincpu.od@1234=600A4E715 q7 J9 [) O5 f3 c" m
在ROM地址1234处, 写入60 0A 4E 71四个字节
# H- `; J* o) V w7 \, V. C# d1 n+ W# |% {
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
% r8 w6 S2 e1 W w/ x
% I& E7 S: R# h* J- }
" ~" ~4 Y* \4 A) B% X8 c其他:+ F0 B# N6 @0 r' {0 k: f
dasm 输出档案名,地址,长度2 G8 C9 F& y& l- E# F6 V. _2 Y
输出程序的反汇编代码: M9 J" ]7 F g0 C- G
例子:8 j8 S9 H3 f& O: P& ^
dasm 01.txt,0,100000# @9 o: H$ u9 S
将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt0 @& {$ p8 I5 j* }+ D4 ~! f! B
0 e' \7 L7 C7 Q2 a% |
softreset
: e9 l6 h( b6 [3 l 游戏重启, 但不重新载入ROM
) {+ ^: Q9 F5 z& r+ D* {' f" H3 |
9 x' V% r9 l X hardreset+ Y3 w% a. S. N3 L* h& G
游戏重启, 且重新载入ROM3 B$ |9 L# l, S2 V1 N
1 _9 M& S% a% d4 D8 w7 T7 l; @0 t1 s
snap xxx.png
7 ]3 T: Q' o9 ]5 k 截图为xxx.png$ T x9 D5 M- q4 t# b, x* a+ q
' }5 `! G2 |4 _& s7 b9 Q; x' i
9 \4 k) }" Q% G7 D7 f
+ E& c9 J+ \6 v1 K ! c+ Q" @: k* `5 \6 \3 v
热键:
. [ B' |- g0 S B6 I ~ 中断游戏
! t* Z) R; n& B F5 运行游戏
- V$ C, [) C+ ^! ]5 f8 ]3 o F12 运行游戏且隐藏调试窗口
& [ Y6 G$ S) K F11 步入, 单步执行, 会进入子程序
: ] ^; N1 W: h4 [7 ~3 P5 `3 L F10 步过, 单步执行, 不会进入子程序
9 ]3 D- C- \8 o# y4 h Shift+F11 执行到子程序返回& x0 _6 `- x0 _3 X+ Z
Ctrl+M 内存浏览窗口
1 ?7 i* x. ~- P. C; A0 x& R j7 A F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
/ ]5 N6 ~5 B8 r- k3 C, l) ]5 {6 _; Q( e, M( H0 D" B
{:4_94:}
! t; Z& k( W. d5 v/ U# Q" k
* Z. {# d* {! e0 d! d: e/ z |
评分
-
1
查看全部评分
-
|