|
|
/ M8 l* O5 W# l6 Z1 e- `
很快速的整理我自己常用的指令
) a' U9 b0 I0 L& W+ ~
! V8 _2 v# ?$ W Q8 H7 V{:4_112:} 4 I: o+ g9 _# v4 U0 T3 u" k
; i, Z6 f3 @* F. \9 D
MAME DEBUG常用指令
5 l1 t% A, c* M+ g0 c. g+ f% L
. r! [: F# s2 A t- i内存搜寻: ci, cn, cl6 D( o2 X+ ?, T, G3 X7 a: R5 \
6 v5 V6 O7 j: S0 p8 d ci
. i- Z" X% p) s: F: a 搜寻任务初始化, 每次搜寻一开始一定要输入这指令& [4 q0 x, ^) J3 X! Z
' D6 ^$ F8 u1 B/ @8 ]+ ], X- K6 H) w
cn. D1 @! D r% f5 X% c) `) d
搜寻指令7 k I& Y N4 D+ p: g
例子:
( o( R% q7 k" O cn eq,606 C2 M# f& L; H2 q. x
搜寻目标等于60 (十六进制): v" k( D6 u7 m# Z$ l- {( Q
, r, a+ z. F1 o7 s' V7 ~
cn eq,#96/ y8 U) [) V' x6 R3 |: y1 W
搜寻目标等于96 (十进制)
) U2 q9 h9 Y9 j- D$ ?" p' K" G- F% ?8 c& r% I$ j" J
cn eq
( k% z7 s; v2 B& p 搜寻目标的数值没有变化
7 K0 t4 O- ]& C6 V
+ F3 Q' {% _% G# n6 W& Z cn ne
% h2 Q: v$ F$ A8 R3 z/ z: x5 m+ N( S 搜寻目标的数值有变化
: l+ \: P% n+ L' ^
! X* F( ]* z$ K cn +! ]' G) l7 G5 ^- c
搜寻目标的数值增加4 {' k7 [1 }4 l7 L* ^
$ m7 w" I ]; O& T& w4 v( f: N cn -( ^, J) I: e _) R
搜寻目标的数值减少7 Q+ p& r7 y1 A3 c1 P" ~# b
9 q' i( E) i% h8 [' u# t
cn +,3. \5 Y j3 @7 i( D) @% ~# w; w" [
搜寻目标的数值增加3 (十六进制)
2 v! ^: h$ }* _4 P- n+ a) ]9 b/ L% s5 Y& r
cl
- T+ J3 y n# N4 } 列出所有搜寻结果; w ?. N* {& ^$ y# D' R
9 b" B, e* ?# R& C5 M$ L; o cl xxx.txt
+ M" K$ _& J" U0 c 输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式5 _) {" d$ P# p# l
E) J `" c9 M" a% z+ X8 F& [, D
5 y* J; @% \* G: l/ p4 m5 Z
内存监视点指令: wp, wplist, wpclear5 L7 E2 w& X& }" ]; w
例子:
2 e4 O* J+ n- n8 I wp 1234,1,r
/ A# t% A9 g% T0 R 在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1
% A+ d6 a$ }: O1 `' N/ t: D. c
( Y4 A( `: S3 w4 Q( j2 g wp 1234,2,w; u7 A2 I+ O. S& K. ~/ X0 w
在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2
$ G0 d# h8 g( n8 t ~2 C- z# z
, `7 `8 O; }# Y# D8 ^ wp 1234,6,rw
$ v4 c& k6 \5 w8 z. \& l9 h 在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6$ L( ^7 N* m4 I1 _" r* ] T
) K8 Y7 g6 g( h; g6 [0 D
wp 23456,a,w,wpdata == 1
3 u& n0 F! ^" P! l7 q( T0 h 在地址1234下写入监视点, 数据长度a, 且写入的数据等于1
3 }0 Q6 C# q0 e7 h c
/ r+ K- i) j5 R1 {9 G- S wplist
9 S0 }' o& |. g 列出所有监视点! Z; C5 b3 U. e; n
( B' a# V! o2 [6 j) ^+ {) S' ]: Y
wpclear 3
: a& j9 b$ f8 ?$ [ 删除编号3的监视点6 O+ V" V8 a. Z! H
4 ]6 r( W) P2 F' A
wpclear
* c" l1 ~$ ]" T3 T9 X0 D! r 删除所有监视点
, F: u9 V$ d- _' E
* J; W6 v: N' j ' K0 q% A6 o$ _! e) p% \" \8 `0 e
) d0 \8 `4 h6 o9 l9 H9 B3 Z程序断点指令: bp, bplist, bpclear! F3 y2 U1 K5 M6 \2 K5 Q7 p# _
例子:
$ h0 I$ ^4 T3 u9 R bp 1234
/ Z" t- U) E T: p6 K/ [ 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断
+ b3 _ E4 Z c2 g- }1 I6 ]6 H
1 N. J8 R: R, @) n9 L bp 23456,a0 == 0 && a1 == 0& s: K/ z! g( R J: X- r* ~2 y7 ?; X
在地址23456下断, 且中断条件为a0等于0以及a1等于0
' ~# y1 `+ |! E# }# [" ~0 X1 _) s) M8 o) I& e2 @/ s
bplist2 p' K, o7 M5 G% l7 X/ ^7 x' g
列出所有断点; d+ @$ \9 {/ _% J5 i5 y
% f: _) H1 u) z& k4 ^5 I
bpclear 3+ `3 u1 ^* _1 x$ s: a; M
删除编号3的断点
9 [# l, M* b" d7 c+ p# `3 q% g8 ?1 ?; ^5 a* |
bpclear9 h- C8 h" d9 ^; U2 K9 G
删除所有断点
# S1 n( s: a; n7 @! l3 M/ b; m0 V7 B: O% g+ B. v
5 C9 }8 L# w6 a3 T5 K& W. n( U' _
9 T' E! }( E/ I- b( I \1 t+ v跟蹤紀錄指令: trace
7 l7 R% \# d, O/ j1 n 例子:/ M# [# t, S0 Y; L
trace 01.txt
W8 z5 q+ a3 X: H9 L( D 跟踪当前CPU运行的所有代码, 输出至文件01.txt
6 r0 Y, G! e* ]6 x1 ^/ ^! W: ^
8 _7 i1 |2 T* m4 J( S trace off+ J- O, k# s5 ]. T8 r' {
停止跟踪, 并且关闭文件( I: ^+ X% g7 K5 W3 }
+ p6 R* B' i& {- A: P" b
trace 01.txt,0. p" C4 {0 b6 \) e6 `9 [
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt' X: g h% c; m i( y+ a
- J# s O e# J: s) i
trace off,0
0 a2 E0 v* u; W7 M ^ 停止跟踪编号为0的CPU, 并且关闭文件* F* ?5 l3 C2 x8 D
K2 z' @4 Q ^- \8 a: Z trace 01.txt,0,{tracelog "A=%02X ",a}
" F* l5 Q% ^+ N1 Y4 i' G 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
v' ]2 j5 K; q$ ]0 o& ^& ~0 G 并且在每一行的前面, 写上"A=a "
( u. l1 z. ], A9 o$ O "A=%02X ",a为一个C语言printf函数常用的输出格式
% i# i& z, F2 T! l4 ]& n( J! \ 意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入
% a9 Z- H8 u4 f" Y5 U. t) N X表示为大写十六进制数) k1 t) m- O+ [2 \
+ K0 ]" V& E- h$ T, w* r
8 e+ D. N' U2 w t. \7 h
- s" w4 N. `6 i7 m" ^8 k$ U, G内存直接写入指令: maincpu2 P& O; H+ u% V# ^8 o5 T
格式为 maincpu.[][]@地址=数据
2 Q* N4 |8 X. s) i! l9 _* X) u" S* ^ 第一个[]:
, ~7 W- C; a" ? r o 表示ROM地址4 a, [: L5 a4 J
p 表示RAM地址9 B4 [8 u, S4 \ r- W" W
( I5 s. h* S& ~: v% c2 I 第二个[]:: r" H3 P1 M: B' Y9 E& \
d 表示4字节
9 s* O& r) H0 n2 r, D P) `$ ~ w 表示2字节8 g: W+ C2 G r0 \6 I
b 表示1字节
! y/ Z5 |9 B6 m* i$ P* e8 y
0 F F4 [* P& I$ t3 H 例子:
2 N& p6 X: V; @2 ^( M& ?: [) k maincpu.ob@1234=FF
# O9 C4 |8 `6 n) y' w( v7 B 在ROM地址1234处, 写入FF一个字节
, g/ r2 y8 C3 {) u R2 p! J+ a8 B7 }# V6 w
maincpu.ow@1234=4E71, D* y* ~* D! p4 M" S8 U) E8 \
在ROM地址1234处, 写入4E 71两个字节/ N& S; _% |. b0 h
: A ~$ M5 d4 _' O, c" x9 e/ O- W
maincpu.od@1234=600A4E71- P9 c$ o/ G( d5 G- o! o# T
在ROM地址1234处, 写入60 0A 4E 71四个字节
w+ V/ k, r" _( B' i
5 E1 u7 w7 Y! m& i 注: 如果是RAM地址, 可以在内存浏览窗口中直接改写' {8 {' U$ ^" z- C/ J6 \8 U
3 |8 s0 i# E$ N
% H2 [, {+ |* D( U1 o# j" k5 t6 I
其他:
4 f& N {: o) x; }7 |+ p dasm 输出档案名,地址,长度) {/ d1 [: S0 [& l
输出程序的反汇编代码
2 d. h. t% C* C; | 例子:) p7 ?2 {0 ?9 y- [$ W; b0 B, S/ Q
dasm 01.txt,0,100000# p1 h$ _5 }% j( O8 @) X6 f
将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt; S) ^, l- e! `
4 i2 U: X+ @/ _. b4 Y& Q
softreset- f \' s- U% R1 ^/ }8 i! M. \5 Y
游戏重启, 但不重新载入ROM( S6 P7 i( L$ B8 k3 D# Y
O. e; N% Z3 i$ ]
hardreset! t* p5 l [7 t
游戏重启, 且重新载入ROM$ u5 N. p0 Z; K8 m0 S# V4 l& X
% U# |- W% u6 r3 X# u/ ?8 [
snap xxx.png; [8 Z3 e4 a) L, ~6 h% g: a
截图为xxx.png
' M, a& l$ [" V/ R9 \$ @' O
0 C4 K1 G, W! V2 d' X/ P+ c% \
# _, |% A$ z- x( q: |+ C G : v' v1 [" J/ \. C. O% y. n
" b# G1 P# F) t9 ]& t) Q
热键:
6 b% s! F& B8 i: M ~ 中断游戏
, V1 \& ~: P! y7 f/ U6 t6 m F5 运行游戏
( U! W5 ~3 M6 m. k% q4 X$ V( E& s3 F F12 运行游戏且隐藏调试窗口
3 I) M+ \% L Z! ~. ]- c. b; | F11 步入, 单步执行, 会进入子程序* G& b8 n2 N3 B2 G
F10 步过, 单步执行, 不会进入子程序
) o' W4 v/ j: I6 P' a Shift+F11 执行到子程序返回) A# H6 |* l! U2 F* j
Ctrl+M 内存浏览窗口
2 m O/ j1 W( S1 [$ P8 i F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
! |9 ` P4 \& ]( ]* o6 G* i6 E. U& j& i$ R: q2 O p. n% |
{:4_94:}
. l# m! ]- A5 ?) v0 g5 ^$ c0 D! t& l$ {3 Z: L$ P" k
|
评分
-
1
查看全部评分
-
|