|
|
1 H# y+ g1 S) g" {" X1 y4 t: i ^很快速的整理我自己常用的指令
2 `3 v1 s( K( ?7 a% ~) }7 X9 k" M* O0 [: L) Z1 L2 h$ A' c6 B
{:4_112:} , I' z5 F) X- A& [5 c% } u( V/ r
$ v1 P, t) r+ e- E4 E
MAME DEBUG常用指令
+ X' J: _6 }4 N, ?8 {
4 S! h( G0 h4 f内存搜寻: ci, cn, cl1 J$ D: T; `! S" L5 L8 x6 L- o
) @5 @8 r5 Y" }, q- Y
ci: R& n- e+ C0 Y
搜寻任务初始化, 每次搜寻一开始一定要输入这指令( f' Y/ R0 q4 V* n0 K/ S0 E7 o2 W1 c
. j& I2 H3 F+ q% o2 ~
cn! [9 N; b9 L6 b0 x" I* I) S
搜寻指令
+ D% p9 m* x& g: H 例子:
: ?' y. m) W, M- Z$ X% u; ~ cn eq,60' M" `* ~& j o' R9 H
搜寻目标等于60 (十六进制)
& x. H$ q9 |# S0 ~; v 5 G3 v" t: T4 a& z9 v E# J3 Q
cn eq,#96" m/ X& }4 e( ~, D ~
搜寻目标等于96 (十进制)
/ x T- p- @ T
) y; A$ K2 y1 Y0 Y5 E cn eq
* P$ b# ?& }& ]4 L: ?4 N( y 搜寻目标的数值没有变化7 M; H- v$ q" D
& o9 ?3 d7 \4 }/ C1 w: F( Y; ?9 ^ cn ne
/ u d5 M+ |* ~+ } C) n 搜寻目标的数值有变化
( }. E4 m H7 T 4 T4 o$ m3 C4 A1 c
cn +
6 o7 Y' P: q! n2 N 搜寻目标的数值增加
9 } r0 O# J8 R. b# o" v" } & l. p [7 g: {. t$ g2 {
cn -
9 ?- l1 u6 P& A5 K" ` 搜寻目标的数值减少7 p0 @: |1 V' |( A0 m& Z
4 Q% F4 N0 [0 T9 ]# x0 d* r( ?9 s cn +,3- {" v9 X7 K" f3 J6 A4 i# J% v3 M
搜寻目标的数值增加3 (十六进制)5 G# p5 \4 z# v. q# K9 I3 @4 Y
2 m9 N8 c+ N4 V6 X0 H cl" K1 c: C! {7 o# F6 x6 n
列出所有搜寻结果* D2 k Q+ [: b P
# e1 u4 Q6 k) [4 x$ |0 m
cl xxx.txt
% C3 l# v5 Y6 Z% F, Y 输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式0 H, t, ]& s# r& @5 ^: a# O
! r1 X2 q' u. L6 c- i
" e2 ]& ^2 E* ?7 e; `$ P
内存监视点指令: wp, wplist, wpclear
: i' E2 @& E' a 例子:
; @- |3 _2 }1 I" e7 s& |" w6 d8 I wp 1234,1,r
" e( q' S S! V. g; a C& j0 B 在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1
( o3 i; x/ ?1 Y
3 W6 S! p+ n8 t; t' n# l; V wp 1234,2,w+ k* h2 `2 G' W$ k" R$ F
在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2
3 K: U$ M. X3 p2 [; s- Q9 H8 W; l4 B. F 2 h2 E0 z- o4 F7 x2 @
wp 1234,6,rw
/ D+ I: {" P5 J5 ~ 在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6) e/ w) A- |3 {1 x2 y' P
* { o) [1 ]# D! Z2 ~- q$ h0 O- a wp 23456,a,w,wpdata == 1; C( x2 x4 P: N1 k5 ]9 A5 J
在地址1234下写入监视点, 数据长度a, 且写入的数据等于1
0 ~* q# w& _" }' x; _- Y3 K+ w7 Y. m, G0 \0 j
wplist
, g8 G( s4 `4 X- R5 @ x( m G 列出所有监视点; B9 w6 l* r0 X; m) t$ U" Y7 F' [8 D
5 }$ D; s% J/ [/ b, S( |" I% N
wpclear 30 m; r3 D F' l5 q" R: L
删除编号3的监视点
0 f( }: R: i4 E5 m! O' y! E2 z% B$ Z/ H) m! T) G+ t
wpclear
8 D' N1 d( V% J' N% d t% ]& P 删除所有监视点7 n$ k% F7 f0 i8 E
8 C; V, W, C2 B2 h$ {8 S z
! w$ X$ ^8 ?& q" q9 c4 @
9 {" x3 m L: i: w; f( s" r5 R
程序断点指令: bp, bplist, bpclear
& O! C, j- i9 A 例子:% K3 `) T9 s' v% `$ l
bp 1234
: l7 W7 I+ i/ L+ s: _( V+ v 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断3 A$ }1 Q* C3 O* e1 U, B
7 Y! V. b# d/ g; G$ J5 G bp 23456,a0 == 0 && a1 == 0
* _$ u! V7 p! ]$ A 在地址23456下断, 且中断条件为a0等于0以及a1等于0. h* p1 p* |" n& |' J+ ]
5 c; @' ]( z' [. @1 b, F2 k, k
bplist. Q6 q: P$ E5 t" j6 y
列出所有断点
4 R* m) ]/ l5 \& ^ O2 J; X; Z5 E! ]0 E+ j! ]
bpclear 32 r9 D+ w1 D% E; G/ |
删除编号3的断点( I) R3 `3 \, _ O8 W( c
: d; c, S z- {5 V% H+ p3 p+ |% i bpclear0 B" D, c7 I, g
删除所有断点2 b, V& L& c* |" ^- K3 G4 ?7 Z- A
3 b( f; R! x! y6 A! @9 e
$ I- H. m- Q* z1 L
& g+ B5 k' I- q0 e3 D跟蹤紀錄指令: trace
: @# Q ~) D1 R! L" z 例子:
2 R f1 o, ^- W0 F4 d5 d% H H. A trace 01.txt
3 v3 S1 F9 L5 P. p+ W# Q8 l 跟踪当前CPU运行的所有代码, 输出至文件01.txt
1 h9 ^* q7 z. C3 W, w! V2 ]/ |* B
7 y! e) M) z' A( z( s) b trace off1 z: R( |' |) ?. d- o0 u7 y
停止跟踪, 并且关闭文件* R; l* J! B9 O) @+ y2 g
8 e9 V: i' D6 w3 Z# G! [+ ?
trace 01.txt,0
4 U7 S! d- A6 P$ c# m$ D/ Y1 \ 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
4 N& C8 c% J7 u# |2 q7 v) T
5 s) ^% X! `9 s; h7 N9 \ trace off,0
# p- X9 Z7 T. \6 a: Y7 J 停止跟踪编号为0的CPU, 并且关闭文件
8 `- ~) n& E* {+ {. m5 A; U) w( v
9 B v0 f( b4 X9 A( C; S trace 01.txt,0,{tracelog "A=%02X ",a}
. q. C1 B- j# _ J: M 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt # [2 t/ C) z* u6 ^
并且在每一行的前面, 写上"A=a "
% n9 _1 [; p k3 h/ s "A=%02X ",a为一个C语言printf函数常用的输出格式$ E6 |0 c$ v+ V0 a
意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入4 c0 h# C6 {2 i+ B
X表示为大写十六进制数9 Z( w1 ~. W) V
3 w5 _$ h+ ]# K3 z4 }! p0 k" Z1 L% |0 [7 H7 b F
5 I( A8 b& B& P. @9 O+ w9 I' q
内存直接写入指令: maincpu
]: n0 X! C' I4 A. g ~" |. |& F 格式为 maincpu.[][]@地址=数据
( [$ D- I0 c9 @& t4 Z/ m2 a7 u 第一个[]:
# C( \, s( T% U o 表示ROM地址" a" M4 y8 F) }, \
p 表示RAM地址+ i# o( X# a r; J8 n, J* @6 F3 `
& x) b6 @: v/ W) `; b2 m G 第二个[]:
0 Y! \! }, n6 c d 表示4字节
% S. z- p) @) R w 表示2字节% D( J+ X5 g8 ?* W
b 表示1字节
# s4 S2 M! _" a o+ X. b7 {+ g; W, m7 V
例子:2 v, v$ X( \* M2 O6 h4 H9 n( a
maincpu.ob@1234=FF
- [# t0 _- k$ e$ T0 ?. C9 O* c8 B% ^ 在ROM地址1234处, 写入FF一个字节 p s) {% Z: ?% L* O8 I
5 a4 U0 i Y9 [: e4 ^: t1 n. G: K maincpu.ow@1234=4E71
% n: t8 J& |* C/ C+ i( R- D 在ROM地址1234处, 写入4E 71两个字节, f- S3 G0 p0 ~" ^* G: T/ R8 d
5 N- e0 Z( j, I$ _4 b2 v0 Y2 d
maincpu.od@1234=600A4E714 ? p/ J1 i6 |) W5 Z
在ROM地址1234处, 写入60 0A 4E 71四个字节
; q; W% }% V8 V/ v- y6 X W6 N+ T4 t K8 ^
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写# \0 @0 U1 ]* S3 D! {; M" v
, u0 J: I" ?* f* n; T: T: H
! G" t6 Z. N& R0 a4 L" \( B其他:1 {9 p1 c! }( @; x1 q' S1 P
dasm 输出档案名,地址,长度& Z" J% l3 L6 \3 L, y M# a
输出程序的反汇编代码
; `* p( z; @$ j" h4 M6 ^ 例子:- w# `) p) J( `
dasm 01.txt,0,100000
# a# U* @9 D% q$ t, V; h& k( m* { 将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt" J( y' I. A. O3 t+ \! N- v
. K, V" v( \- f; a5 }8 s
softreset
( ]! w8 l4 H8 ^" p 游戏重启, 但不重新载入ROM
8 i. \6 W4 o; }' [6 ?
: a2 P7 ?* M6 O/ r4 |6 W) r# f; Q: p hardreset* X9 {. \8 q- `$ Z
游戏重启, 且重新载入ROM
* [, s, n! f& Q: L
% g5 y& s( U, [* U6 w2 E- t# G2 j snap xxx.png
+ N6 |' E& @5 l 截图为xxx.png
# ^/ U5 ]7 b0 _/ K4 J% K
% `3 T2 Q' Z5 B" b/ G) l; Z: u. M
2 I! N# C# U" u4 [' M/ J2 A" v
: \, v, o& o, \) V , J0 W- M" z6 ~8 B9 j( b( D
热键:
0 t, ~; p8 m0 y; X2 t R: B ~ 中断游戏
# i9 ?% { `3 o- J! { F5 运行游戏
2 O1 ~- |, P# G& Y8 Z, h2 M2 k F12 运行游戏且隐藏调试窗口
4 |' z7 E2 p$ k F11 步入, 单步执行, 会进入子程序4 o: X- h9 R$ Y: C" P# E* S
F10 步过, 单步执行, 不会进入子程序+ w" b5 r- }% b" M8 z9 ?4 q
Shift+F11 执行到子程序返回
) u* j% ~2 Y0 [% ~4 | d3 o5 c* @ Ctrl+M 内存浏览窗口5 L9 H3 k% s$ L( f
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
5 l$ c. w% C. }" v- D( o
: Z/ |" K+ F8 e: b6 j9 O{:4_94:} 3 ~$ R; U+ t+ j4 i: J3 C
3 e R/ ^- K; ]6 r4 ? |
评分
-
1
查看全部评分
-
|