|
|
5 r( M+ p5 ^5 a3 G2 |
很快速的整理我自己常用的指令
1 U: i& j0 d% U; Y) F) y1 h" M- q8 q
{:4_112:} $ C4 z8 ~3 a/ R: b5 E$ U0 m2 V, I
" z9 _9 S) M! Z) Z- O& B
MAME DEBUG常用指令( _/ t! T) ?; T
% W; s) e' G# [9 U4 D% h3 N
内存搜寻: ci, cn, cl
% ?6 ]' b* e$ v' n3 z9 |
% G2 R- Y% B9 g5 ] ci/ o* g/ q. C" ?3 @* h9 W
搜寻任务初始化, 每次搜寻一开始一定要输入这指令
# t7 @* \* J% `$ D) A* }0 S+ X$ Y+ ~2 D3 j! D" K
cn
: P. M! ^% [3 H" K6 V0 I5 [ 搜寻指令
0 T1 J) M" @: h& q6 Y 例子:
% T2 g! V) _8 a3 ~( a cn eq,60
% r2 Y; I6 X+ G: G; a. f6 I 搜寻目标等于60 (十六进制), a. C) @( E9 d3 W/ ?2 a+ _6 n# V" t
q5 l1 W: m4 @- d cn eq,#969 t) c6 J( V* p$ w7 Y1 z9 o5 H
搜寻目标等于96 (十进制)
* A7 p% b; u1 V* ]' i$ n2 H- y! L3 a
cn eq
3 t* q# K1 A: r7 f" V 搜寻目标的数值没有变化3 G6 S w, }7 j" Y! r8 ]6 T% E
0 J- h7 N+ ~3 k0 _
cn ne
4 B m- O8 F. i. T' A6 ? w# e+ T 搜寻目标的数值有变化5 V/ [4 Z/ x" z3 E3 M8 L
& E3 q. I8 E# N1 j5 d
cn ++ {" K+ ~& @* d, K2 u
搜寻目标的数值增加
" g: ]' b/ A- H5 z: C( G$ D( K 9 Y" l# y( z3 K' a I5 M! ^
cn -* r7 t( E3 s. r- U, d& P& C
搜寻目标的数值减少
6 v8 s- y, G; }! S+ \) G4 A( g) M 4 `9 l: s9 `: W: p8 K3 E
cn +,3
5 J+ `) g, Q$ E# ^$ d 搜寻目标的数值增加3 (十六进制)' b0 x) M M8 q- j
2 r, o, S: j0 D# W6 m- A
cl U1 ]& o! I6 B" a! y. `( N
列出所有搜寻结果
9 _2 |# U! X; X9 ^6 J2 h. Q; P* @. H2 c2 P- h) ^7 Y
cl xxx.txt
& U' k) C2 q9 x7 q1 ?' j' F1 c 输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式
) U# A" E9 U8 K. ?6 ?0 b# y- g
, F p$ r! ]; z) W( l
$ K( ?$ K9 y% o2 b8 ?内存监视点指令: wp, wplist, wpclear
7 t, p, y3 k1 l' b 例子:5 r3 ?3 p9 f0 e2 W2 @* s* g
wp 1234,1,r! G7 k9 @) q0 w. o9 b$ F6 c
在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1
7 B; a0 R: E6 U% r- G
" c1 m: l; k( z wp 1234,2,w
( q- s6 Y; g5 V6 W8 p 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2+ G' _3 V4 y2 ]. [/ O7 ]1 v
7 n- q% l2 W& O6 U( } wp 1234,6,rw2 S# Y p0 ]+ I! C
在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6, N+ Q1 s( `2 @9 X( b; ?
4 ]5 Q2 c+ x, q$ C
wp 23456,a,w,wpdata == 1
! a$ h" e2 V0 v2 ]4 i 在地址1234下写入监视点, 数据长度a, 且写入的数据等于1
2 g" j$ a$ y9 Q9 F2 y. G6 Q8 ?1 `. V- x, n
wplist
V1 b' _ g4 z9 B' A5 @ 列出所有监视点
* ]/ C# ^) s5 h
# E1 f+ e+ K7 ~ wpclear 3, O% c1 ?) H n8 O R: ~* D
删除编号3的监视点! c s4 p: l$ k0 x5 o2 E m6 m
7 b S v+ s2 c
wpclear
4 c/ l/ N( r9 J( E0 L( z 删除所有监视点
2 }4 E! q7 A4 B! i$ p* Y( {6 x! ^; x# C# n! P3 L
3 G( b) q& R. t4 e" h5 n
3 }3 M- K2 w' o2 l3 n
程序断点指令: bp, bplist, bpclear
+ L& V. i/ ~1 `1 E0 i 例子:
5 z, m* }4 ]- h) _$ x; y bp 1234
f1 e3 |. v6 f1 T3 \ 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断
* A% c7 w7 w7 N, k
" j, G" V! x# p2 c* R bp 23456,a0 == 0 && a1 == 0
6 ^$ M4 Z Y9 e1 I0 z 在地址23456下断, 且中断条件为a0等于0以及a1等于0, m/ B; h2 e' |% U: Y1 h
% Z2 i- Z$ P/ K* ], R
bplist" a0 W0 d7 a: u. G
列出所有断点
0 S, W" P1 g5 w: R2 Q( |
, X. L% B$ a& [1 ^9 s+ ^# V, [$ D bpclear 3! [2 B4 b* l' g
删除编号3的断点5 p; b/ f: P; Z( [: b& n) s
6 s. ?0 `' t- b7 V# f2 x; D
bpclear
9 C4 _4 G0 @+ Y) p9 Q w/ J0 v 删除所有断点
% A3 \% S$ u( ]) s0 ~7 Q+ a* V" F6 ^7 f+ C% g/ {3 _: X. x1 k
& S+ O4 { D B2 \8 \5 X& s6 }
/ x; i2 F6 `, R3 U T
跟蹤紀錄指令: trace
* z q; \5 i1 Y) R1 E" Y 例子:, V0 F% V) V& q7 X& {
trace 01.txt
5 H4 e. E+ |& s3 K) y4 E 跟踪当前CPU运行的所有代码, 输出至文件01.txt) R% t+ K: q$ @3 D( O
3 v& m" g, ]5 z
trace off
! k; V9 _6 [ _& | 停止跟踪, 并且关闭文件
8 y0 e( ?3 p1 v& C% p/ c
( ^1 E7 }4 K: [6 V/ ~! v trace 01.txt,0; n( l' t: t; @8 _
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt$ ]2 s* ~% }0 z' \
) t; d6 H4 n% y# _, e; A trace off,0) D& z' a2 b3 s1 z7 O& \
停止跟踪编号为0的CPU, 并且关闭文件
' ]# f2 K0 W `4 t- E* W8 U$ _* ], G4 A# I* c7 [/ O8 W
trace 01.txt,0,{tracelog "A=%02X ",a}* g" ~. ^/ m! o5 d" @1 _: z/ t7 F
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
: t7 _" ?7 @- m3 G 并且在每一行的前面, 写上"A=a "
/ b! j$ T& I, y9 M6 m "A=%02X ",a为一个C语言printf函数常用的输出格式3 O" G# g% P7 A" q g* x; A0 n5 e
意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入
: K; m. K6 \( Y) O. b; d X表示为大写十六进制数1 w1 f7 x8 s" Z
2 N6 R* Z% w- ` b
6 ~& _5 X" n5 d
- v& C, M/ L0 N( w, d, [# q7 M
内存直接写入指令: maincpu
/ @; E) q. S5 q) p/ l/ r 格式为 maincpu.[][]@地址=数据
6 I6 O, B1 K5 t8 [, O. K1 ~8 n 第一个[]: B! t" g, t% h
o 表示ROM地址; O ^8 q7 U9 ^4 m: v
p 表示RAM地址
9 b; D: n) _" Y+ l
0 o4 a! f( T9 _ 第二个[]:: j& ?- C4 b! z/ n) b! O
d 表示4字节
) O1 L6 i' x* s3 G* u w 表示2字节+ f8 ~& u) W: a5 ~+ R$ `
b 表示1字节
- j" M. N3 W- _4 L+ |6 O: B
4 {, s1 p3 g' z/ ` 例子:: e& W0 c! S. j( K4 C/ K/ ]- E
maincpu.ob@1234=FF
4 G$ x1 T' ^5 Q6 Q5 P8 O! I/ T 在ROM地址1234处, 写入FF一个字节
( D4 o; z% u) x7 O' s5 N3 U8 x8 n& ?& d( c7 v% H2 z# c6 l
maincpu.ow@1234=4E71, D% m( A$ L9 b" D0 B
在ROM地址1234处, 写入4E 71两个字节
0 ?) m: B$ N6 ~9 N3 `! P4 V, m+ m/ P! g/ u) O3 ]
maincpu.od@1234=600A4E71+ P2 L8 `: ~ A/ p U$ ^
在ROM地址1234处, 写入60 0A 4E 71四个字节8 i1 g9 ~! _4 P# R
* [" ?3 v# e/ ^% G `; V% z& J1 w 注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
3 I) `9 p2 z8 M, _" z+ n$ E ( ^! Q$ e" z" p! |
2 r; T, _4 P: x7 d; a7 V! E3 y其他:
4 n$ F3 m' r5 q+ J6 d dasm 输出档案名,地址,长度. w5 c& h; F4 `5 | n9 Q
输出程序的反汇编代码
1 ~, v5 u+ L- K3 t 例子:
$ m- }0 O& |" y) j U5 O dasm 01.txt,0,100000
5 d: |% I9 n g1 a6 n 将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt( _. c; L! d0 T7 C
! @7 g- b& Y" G* A8 t9 K softreset
: W8 O! l! ]* ]" U 游戏重启, 但不重新载入ROM
( B$ N- {2 R, Q8 k
, Y R P: P7 p- \ hardreset
* Q4 y9 g6 |) P1 y1 _! p" Z+ R 游戏重启, 且重新载入ROM; m0 v$ m: e; N& p
+ ~1 h$ @ k3 `
snap xxx.png0 v8 u4 h/ m5 j( k, Y% x
截图为xxx.png
" U# D5 ?0 H3 J. h8 r) R& d; ]6 n! z$ b% t9 k9 e" w
! j+ [0 v) L7 Z3 M7 R) I 2 E; g: _3 X# r4 Z- E, q
3 ]( {+ |3 L) M( e/ t, g
热键:
! T( q. X( ]5 ~8 p6 S ~ 中断游戏% K5 w4 T/ r1 Q# u0 Y3 n5 O
F5 运行游戏: e8 Q1 E, C; ^/ C
F12 运行游戏且隐藏调试窗口6 h! w, Y0 ^) j% T6 B% @0 l P
F11 步入, 单步执行, 会进入子程序! t! O7 P( z" p. e) H4 o. r; h
F10 步过, 单步执行, 不会进入子程序
* ^4 s7 S5 p4 h7 T1 ~( c Shift+F11 执行到子程序返回
- f1 S, t, Q7 `1 ?" B* | Ctrl+M 内存浏览窗口2 Y+ n. r, l" }3 \! a# \
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
' {2 s ?7 L" H5 {
' {! z- t/ Z" F4 U$ M- K{:4_94:}
4 l1 D5 E3 G, z3 M" ^, X7 n" A7 m1 e$ I5 J
|
评分
-
1
查看全部评分
-
|