|
|
4 \3 U7 N S+ f( ?- r' i. t很快速的整理我自己常用的指令
+ j7 s7 O# ]) T; Y$ n" a8 }( S1 G" @$ }+ Y; T, U! f5 a
{:4_112:} 3 k" q: F8 K& U% `0 K3 m, d
: D% d, L7 w' X1 A
MAME DEBUG常用指令
+ H, I6 v. n4 P) G1 U6 Z! B. D- ]" I+ {
内存搜寻: ci, cn, cl) f/ I" A# x- B* i7 W; p. k1 c
% m' ~1 v6 {% @2 b% m
ci
! Q5 n1 J; b$ L 搜寻任务初始化, 每次搜寻一开始一定要输入这指令
8 ?. O, W) \. H. Y/ O& }0 o% ^; o1 Q- y, n9 J
cn
$ H* R( X) P8 K7 e# v 搜寻指令
0 a1 j2 K) A0 L) o( W1 r 例子:' U+ [- x9 W& h: t8 \$ V( X
cn eq,60
) `% A' t6 H* c$ @$ z 搜寻目标等于60 (十六进制), d. X# A" F t( y4 ~+ c
^! b* h4 t* v' k, @+ ?
cn eq,#96% G9 ^- T4 M; P- n. [* ]0 N$ I: @
搜寻目标等于96 (十进制): U9 {7 J: V8 {5 W- i
$ Y/ p, P4 b9 p9 Z cn eq+ o0 i8 ~4 r* J4 \2 \$ D
搜寻目标的数值没有变化
/ W2 q1 R! z5 z; |5 [. A% j6 V
! n! W. h) ?; F4 \ [ cn ne" q: V) @/ O+ O" M8 H) G+ {. c
搜寻目标的数值有变化
4 U# y# X9 X0 l6 T8 S( w8 T
5 }; B, W. S6 [' f: H3 \* K# N cn +
# V& ~4 j9 T' k 搜寻目标的数值增加) r$ R1 ?$ e7 Y+ `; c
8 I6 ~- Q6 v3 l6 q* t/ A4 [7 |2 { cn -
2 I/ M1 j# h' a" |+ l. G0 Q0 } 搜寻目标的数值减少, }& E; ]+ G, R/ U- l
( ?: S( s% Y9 ~3 u" t, o H5 p
cn +,3$ D' u. J+ W$ ]5 I' X+ M/ _( g9 H
搜寻目标的数值增加3 (十六进制)5 \: S; L! U; D0 b+ d U
3 H4 _) \5 R0 j- n/ O( N
cl* P7 ^. h/ Q- M
列出所有搜寻结果
- Z- H3 Y0 `1 s- e. T
& P6 {7 \% V% Z+ c2 [ cl xxx.txt' c) ~, Q' S+ v8 G& c2 i& G
输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式
- e# J8 u C, V! W, Y/ l( n+ f# u9 F; O7 I
# b6 @2 G7 q: {内存监视点指令: wp, wplist, wpclear' d6 F4 E. F+ P. |5 }! o* V* M
例子:
3 D4 F) U2 C; w6 `- x# |. W wp 1234,1,r
$ G8 k5 ]9 i9 j3 k) V! N# A3 T" g 在地址1234下读取监视点(该地址被读取的时候中断), 数据长度10 l) S; @: M' w
- U: h2 Z* D( ^3 r0 [
wp 1234,2,w
U+ X0 }1 L* |5 d7 g" ~1 n( q 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2
8 [8 y5 f' Q. [. f3 ]
0 i; U, J1 V* R$ c. Z wp 1234,6,rw
5 R$ f- `+ {& ~/ G/ e: j% Q: o 在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6
$ Y3 I0 r- B5 p: S' a: c
- ?4 J1 \, ?8 C6 s. Z' N X wp 23456,a,w,wpdata == 1
' k: D. b4 m/ H c0 o0 O 在地址1234下写入监视点, 数据长度a, 且写入的数据等于1
2 C9 `0 v3 k4 s- g1 N G9 W; @2 p; }; e7 r ~/ R
wplist
. u+ T4 A! p$ h: q6 v" \ 列出所有监视点
+ U$ H; H8 E C6 T7 C
$ H5 @, }! ?: L/ m wpclear 32 C7 C* n" \' z6 Q7 Q, ^+ K
删除编号3的监视点& p4 L. y1 `/ i5 d" J
6 L8 R) b1 t0 g' q4 N5 } wpclear
: I+ D" J; k4 g1 l1 h" L- U- g7 V 删除所有监视点
( |5 L! `7 ]1 b. i! I& @/ G" ^- V5 E* t" W, s N
, C3 p5 L6 x$ T! `4 e1 d2 G6 I7 p
7 h5 t+ l: z, y" b2 i( |5 V程序断点指令: bp, bplist, bpclear' f! d2 W( O; U, R- j/ _
例子:$ b- T" s: R) t" N( { i& y
bp 1234+ L$ y; t# r/ K8 D% I7 Y3 C
在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断1 n/ A* [+ L7 R3 O z% T
! X* q& @! t2 S: Y
bp 23456,a0 == 0 && a1 == 0$ D! {2 k) w0 g- ^' [4 I. k' o* Z5 w
在地址23456下断, 且中断条件为a0等于0以及a1等于0
; X2 q; \" H7 w$ T6 h1 P, |! ]+ f- E0 x H9 w
bplist
E: a, f1 ^& n2 f& _! O 列出所有断点5 s' Y) T6 M& D( O' G
: G1 T7 A' P7 x; i
bpclear 3 [! u) ~4 B$ B9 B* |. R
删除编号3的断点
$ u7 v2 r3 T& R5 y. g2 M" u/ H& r0 ]* P$ q
bpclear
, R7 v8 j6 U3 I$ c, _. s9 C, P, V 删除所有断点, m8 o& c }. v
7 u& t7 t% ^0 Y! l0 G3 q2 ^" E4 N
' N5 h/ C! `! I* b9 n) c 4 S* v3 C2 f9 A$ W3 q; g
跟蹤紀錄指令: trace
, @1 o" s, n# W) d. k, k 例子:* F1 z2 D; T+ ?: F% k0 V
trace 01.txt7 m) V: _4 F; K; y k6 [" s
跟踪当前CPU运行的所有代码, 输出至文件01.txt7 L) i8 P' d$ h4 _: {0 X7 }
0 u1 T, {3 G! j, a
trace off
, g+ F* \- L0 {$ y9 M: C( ?. r 停止跟踪, 并且关闭文件- ~; d+ `% Z. d7 a' H5 d
& G& d" d: h8 u1 h1 w trace 01.txt,0
- z8 `: O0 O( A 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt; y, r \% ^% E- J( m; b& ]# k
# \6 c) P, {2 p g
trace off,0
/ v& c: G. y' a8 s1 ^; ]; J 停止跟踪编号为0的CPU, 并且关闭文件: W) R4 W9 L4 A: g* q- J' D& ~
0 i9 N% |% r7 {- t% L8 ^ Z trace 01.txt,0,{tracelog "A=%02X ",a}; y3 b5 N$ k) b5 F3 g5 s
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt ; ~( N; R" Q5 {: _% L
并且在每一行的前面, 写上"A=a ": u& t* o- \+ R! \/ L
"A=%02X ",a为一个C语言printf函数常用的输出格式
5 p5 E' N( {* S4 M `% @- b- z L! ~ 意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入" c+ g- ^" V5 t- z6 E$ P
X表示为大写十六进制数
# {- a F) X0 D3 s) D; I3 H) }: m! Z- O
$ I" h- T1 V( w1 x5 D# h- V. T0 e8 j0 z* ~
内存直接写入指令: maincpu
# L1 a) F5 y* d; R) {1 \' ] 格式为 maincpu.[][]@地址=数据
5 |5 R7 @5 T$ X- L& s' n 第一个[]:
/ }6 W. t; l! m, H& ?6 ] B o 表示ROM地址
" k$ w' B% V. g) u5 z p 表示RAM地址
4 b3 l1 x; O- e2 Y+ q* u u. J3 U" E
第二个[]:: w9 x# |: o8 y. u! L b$ w
d 表示4字节
0 T7 Q ]& P+ r. u" e w 表示2字节3 X q. N4 O* W: o5 {% s8 _4 }
b 表示1字节) c/ ` A/ u6 W6 G' }$ x' z# j
3 l6 A7 z: N+ r2 T1 ]- [ 例子:" x$ \) w( ^5 v5 z& D
maincpu.ob@1234=FF
u8 F6 L+ s- ]# f W$ H3 _, }7 N 在ROM地址1234处, 写入FF一个字节% p1 w2 u$ J) }2 n3 H- |
7 i+ J( A5 K1 F. Q maincpu.ow@1234=4E71
8 ?3 U% {, h6 u 在ROM地址1234处, 写入4E 71两个字节 H8 P# \# v3 A' n- p4 P! ^
9 b) G7 v! {3 N& ?: S. v
maincpu.od@1234=600A4E71( ?2 _6 V; F/ w/ P
在ROM地址1234处, 写入60 0A 4E 71四个字节
6 z; j9 I& H- m3 ~( H
. x; A( s% `0 K; D 注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
: C) M& _& j ]7 s* l # j- @, e( o# j' o- g+ c( j
5 \. r, p2 L1 N8 C ]其他:
* R( ~. J/ r) h. M5 X dasm 输出档案名,地址,长度
' l$ P1 J( @. j; R 输出程序的反汇编代码
* a; S' [" y& A# [ 例子:, X b0 b! }* ]1 B' U0 n0 Z
dasm 01.txt,0,1000007 K0 b$ O/ k& W# j. z. K9 K, D' ~- `' d
将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt" C+ F% T7 f" }
0 s, Q$ ?' y5 r
softreset5 z- Y3 H# T9 D, \! w6 Y/ r
游戏重启, 但不重新载入ROM
7 z7 H) v8 U% n( N6 z7 T
! `; f$ a+ s: D) E @7 O; E hardreset
4 u/ T6 n8 ?0 L! F 游戏重启, 且重新载入ROM
& r8 x2 b7 F- e! b1 U7 |5 E( ~. \, R& |) x) ?# d5 C3 w2 |
snap xxx.png
, u6 O5 ]- E6 T: u 截图为xxx.png
1 I$ k! s: {" o* x) A r" W; |& z5 H% R/ N3 ^
1 V5 ]1 n: x" W1 t
$ B7 b# ]* h, C3 E6 g- c
, L! }: U7 P0 m; G) }. C热键:
- F. Y' q8 x) L4 P" \: u4 I" B ~ 中断游戏# X: f4 h2 i$ O4 a) C
F5 运行游戏
3 w+ G4 U, P: C F12 运行游戏且隐藏调试窗口0 l& I+ A8 a% {$ e
F11 步入, 单步执行, 会进入子程序4 O! \2 E% A; w2 \2 Q; }/ {9 [
F10 步过, 单步执行, 不会进入子程序
T' v4 g1 w8 h W0 l Shift+F11 执行到子程序返回
" V/ W6 r3 d, o9 Z ?) p3 u Ctrl+M 内存浏览窗口3 ]% G: x* e2 _$ g
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
0 Z" K1 I9 F- ]3 C
/ G: ?+ z0 h' C6 ^{:4_94:} 7 v z" g9 q- A3 k" [5 f1 X
( t. ^* F2 \) ^1 L- {& t6 T. O$ d) r
|
评分
-
1
查看全部评分
-
|