|
|
% u5 F. p2 p, ?; J, X1 Y很快速的整理我自己常用的指令
' h* p2 Z0 F/ Y1 V- Z6 P' h; ^% K7 y4 |% J& V5 e$ q
{:4_112:} 0 V# L$ N/ q' \7 y+ C
) R/ e1 r, B- }2 O. u/ u
MAME DEBUG常用指令
2 J9 h$ o% S: ~
; ~) d8 N$ Y4 r( ^内存搜寻: ci, cn, cl6 Z& |" z$ J j
# e/ b+ V; J' Y' _ ci1 } k5 x9 e- u6 Y
搜寻任务初始化, 每次搜寻一开始一定要输入这指令
8 m+ F8 S$ q) e; ]* E. p7 Y: Y- Z( h8 p! r: f) D R
cn* d7 _; i8 W( R* L# a' H& q
搜寻指令, }4 j9 }3 f) {% r$ c! t
例子:0 T6 S; f, Q1 q# y9 O
cn eq,60
; l* y) |0 o& d9 B+ g+ q 搜寻目标等于60 (十六进制)9 M1 Z: \* U5 d/ |1 ^$ k' x
) `( u/ v8 [3 w l9 J7 ~ cn eq,#960 D$ h& y) V) b( j# T4 F& U
搜寻目标等于96 (十进制)7 u. n% y1 \+ `1 a! f; x
" w8 J: x/ G: v, @
cn eq
8 x6 @" P0 O& N7 L6 z9 c8 V4 }$ q 搜寻目标的数值没有变化
6 J& x" t3 i( G0 p7 q( X, @6 r: ?3 P2 d- I$ i! |" c+ l3 K {$ n# N& w- G
cn ne
9 j# n3 ~4 J! [. H: E 搜寻目标的数值有变化7 z# ~) R4 ~' p' \
0 j0 C9 i* I% y$ r cn +7 Z* g. \# ]$ r j$ o I7 W
搜寻目标的数值增加
7 M# P; {/ @7 l+ D6 }$ a q3 _
3 F g3 {8 D2 P& M cn -
2 P- z( v. S0 S0 | 搜寻目标的数值减少
5 u# @: j" ]+ c, y& f 4 r) h4 |! n: [+ X: J
cn +,3& C( ~; T3 h& L0 Y7 Y
搜寻目标的数值增加3 (十六进制)
4 j( ?8 y+ D. D5 C s8 R# v% [4 |: v8 x2 y. E
cl
4 q# K. I: ]7 M; h. t6 K: a, K 列出所有搜寻结果. x/ N3 x4 n/ g# S( f% f6 u+ q
" \' x1 {& ?5 Y# j! i- v4 g: ?) A. t
cl xxx.txt# A' ^$ {7 L% g- O
输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式4 \/ Z& Z% S: g
3 C2 o5 h/ w; a5 s# K9 L& b# `4 ^
. a- i" q/ I% g, t3 E内存监视点指令: wp, wplist, wpclear
# j/ y J( t+ i0 T+ o8 {: S# j3 f 例子:
$ q* R' W0 [2 r) u4 E' h7 L! W+ ~ wp 1234,1,r6 _4 Z2 U0 C: q- F+ g1 C% e: k
在地址1234下读取监视点(该地址被读取的时候中断), 数据长度11 o/ B7 y6 ~- r& Q6 G! F
3 R: |/ |8 V- o5 F wp 1234,2,w
: O7 c$ [( W. A2 r4 H 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2
; r# `- s6 a ?9 |- O- ~
0 A, { A# c! E* b; I/ Z wp 1234,6,rw
$ D$ D/ g1 R- ~ 在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度62 t0 n0 T- | _( u5 ?; n
9 C n- `/ R+ E$ U" \5 { wp 23456,a,w,wpdata == 1
! K& T0 x7 v* N2 _% u# u7 E, F 在地址1234下写入监视点, 数据长度a, 且写入的数据等于15 e) z6 K4 l" D$ h9 _8 X
! B/ O4 D$ s% U9 J% p wplist* O8 x# U( \: v a- @
列出所有监视点5 w: S) B! D# l" [! H1 G O( q
# O/ y: s. w4 P# G0 m" n wpclear 3- y R: g+ v! ^
删除编号3的监视点- |6 I% j, G2 @& x0 [1 f4 b
2 y6 J, o$ j3 A1 B wpclear
9 e* k7 l# S7 W: R2 c 删除所有监视点; b& ]) `/ q; c; V- T
9 |! t5 T9 {3 v/ F$ ?
, {; x1 Z6 Z, f4 ~
2 c3 b7 w* o, {& \, ?; K# [程序断点指令: bp, bplist, bpclear
9 }( w$ M1 x2 ] o4 Q 例子:
, L1 }: A* ^: t; B bp 1234
( N1 I4 M- l9 J1 U 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断
% `2 | [- E( }8 Y( ^) d( R
0 `6 z/ X. \# X+ r6 _: n6 s bp 23456,a0 == 0 && a1 == 09 x0 p0 n9 E) a0 {) a1 X5 O# u8 V
在地址23456下断, 且中断条件为a0等于0以及a1等于06 p; O7 P8 K6 W* L) G) L( \) j
, A' o- Z2 V3 m1 |. v bplist
" b3 q; f+ y. {1 \1 M4 R* U9 ?2 o 列出所有断点
4 R4 w' e' q/ |% d: s3 f+ n" s9 f& G7 E! K& Z2 X7 S: L
bpclear 3
! x3 F- o4 l- y7 H( ?% A5 \: N 删除编号3的断点 ~3 M6 f) _ W) ^# S
, U; r$ j0 n4 }7 K/ v% [
bpclear
+ M9 e3 a$ v" K" G6 Y* K 删除所有断点
& @* e+ q" {8 _5 n5 K2 _
8 a5 L( a; |# g' a # [: a% g0 O! X% y( {. u
* Y+ _9 ^ t" Z7 d- J; X6 k. O
跟蹤紀錄指令: trace' L) x) z. l& J3 \- r x
例子:2 L7 f( }7 e2 U3 ]5 Y, }% P, K8 T
trace 01.txt
! ?. G# v0 U& D7 e 跟踪当前CPU运行的所有代码, 输出至文件01.txt9 f3 K; p$ K$ r3 O8 K6 t9 |
# o- L7 }: r# B7 H |3 I trace off+ V; o2 ?: n& U/ Z* j9 G
停止跟踪, 并且关闭文件5 D% a, m8 O5 `2 a7 {) V" c) P# v
" N6 z" p, M4 n& _) E+ j trace 01.txt,0
3 ?& V- s# Q4 S+ G; i& v 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
" S- j6 C$ }% K0 h0 K5 l6 N4 D) v( t8 J
trace off,0% ?6 O" b' ]; p6 U
停止跟踪编号为0的CPU, 并且关闭文件
1 O8 V' L' Q! a; h+ e3 o
3 @4 P" ^: H1 H8 R: ~5 i$ k trace 01.txt,0,{tracelog "A=%02X ",a}
* S4 A6 |9 h' B `* F5 D( H" O 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt / x' R S/ q. m/ R$ X* {4 K
并且在每一行的前面, 写上"A=a "& b5 S. G9 h. f1 l+ ?, \
"A=%02X ",a为一个C语言printf函数常用的输出格式) _7 T9 A- |! T6 E: ?- d
意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入
: }$ U6 u7 k- I- ?4 p. L X表示为大写十六进制数+ p' M9 g$ g7 o5 C/ t' _
4 R, e! O. {1 ?" H; V' T8 [/ C4 b4 W
3 z, H+ V+ S" C+ N4 w, ~; z" m
内存直接写入指令: maincpu" L! p9 m) B2 ]2 H6 o
格式为 maincpu.[][]@地址=数据$ v6 v8 x8 `- C2 N7 c# Y- x! K
第一个[]:
4 S3 v0 N% S& {* [" E5 A o 表示ROM地址
( M$ _6 g% G2 y1 R p 表示RAM地址. O/ v9 H5 V, q
/ d9 g# j' ^& O q- Y 第二个[]:8 d7 B: `4 L( I, ~" K/ Z; |
d 表示4字节
2 t1 N7 r) }' \) a) Z2 x% B w 表示2字节8 B4 q' K/ }) v. D) i+ r
b 表示1字节# X% t1 N1 k6 q& m* U1 R5 |; E
) e9 D, ]# }* B. z: h( y9 s; A6 { 例子:% N9 T) O7 h P6 N! H0 y
maincpu.ob@1234=FF# s( N# A( n- Q8 l
在ROM地址1234处, 写入FF一个字节5 m M* {: @- k7 I
0 w) t+ z0 I& D+ f$ K/ D
maincpu.ow@1234=4E71
& n. _1 {$ ?/ U 在ROM地址1234处, 写入4E 71两个字节5 s% a: ]5 j; d( ~: m( a- j" }% w, r l
$ g5 r+ y- n. {+ X maincpu.od@1234=600A4E71
2 I1 B5 B; a8 D+ y' L 在ROM地址1234处, 写入60 0A 4E 71四个字节
! @; N0 r* L1 E4 p, G, G7 r4 F- e3 T# c
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写" _' |" L6 k4 F. b' b0 u
- C4 c$ M/ Y% S! E( W! R" y9 k; W5 \9 x" z9 w
其他:1 i' D( G9 e* c" f1 N
dasm 输出档案名,地址,长度
) G7 l) z, T8 \* s# K p$ x, w 输出程序的反汇编代码
5 j! T, f; ]: Z3 E. N! c+ P1 g 例子:
H/ }2 a% s" P- F t8 D dasm 01.txt,0,100000
' B5 n# @/ A: t6 Z9 r$ s+ z 将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt* n _ Y8 R7 T* C o+ b9 G
2 t- T6 j% z* v9 @" B1 b% Z
softreset7 x8 z+ H/ e/ ]" R+ V
游戏重启, 但不重新载入ROM
6 Q3 d, X8 U V
1 c% G% n& h" g r. e% O! v x hardreset# }/ Y l/ m% H) [3 n0 N. X
游戏重启, 且重新载入ROM; x3 g& h9 V5 q+ H x& L G2 h
' _/ j$ u. G) Q! Y8 k0 t" j snap xxx.png/ u& g6 v8 [, w5 Z
截图为xxx.png
/ _6 z2 ?7 N% u5 e8 ]
5 J: p3 O- v* V; U. `2 D6 e
# y3 t4 [6 j+ s* F# Z/ x; E/ M/ {
: [- ]6 z9 Q/ F7 `6 Q T
* k3 s! Q7 A* u& p. r热键:
/ [% ~1 J3 e- K9 W ~ 中断游戏
+ o& F0 ^+ G/ b1 h# U) |: x# k F5 运行游戏
5 A9 q7 s2 a& [ F12 运行游戏且隐藏调试窗口
# o1 s p$ A) l9 F1 L# U8 M) q F11 步入, 单步执行, 会进入子程序" R$ ^: q: y8 t; h- _7 m
F10 步过, 单步执行, 不会进入子程序3 K$ D% C8 V: H) l
Shift+F11 执行到子程序返回
+ w* Z! a" h4 p0 B8 z3 ]" e; Q) O Ctrl+M 内存浏览窗口* u# i9 i0 s- W% }
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
; h0 h1 Y- e/ X9 U) ^. j% c4 Q& G* [6 [9 P; ~+ r
{:4_94:}
0 @0 E- r4 |5 ?' w
6 m% C6 A& _6 Q% Q w% i5 X: [ |
评分
-
1
查看全部评分
-
|