|
|
* ?# l0 {2 r: O- k4 V
很快速的整理我自己常用的指令
; P! Y' C! l+ f$ E" K! Y9 I3 V, y0 O" n0 R( F5 _) w8 n2 Y0 r$ i$ S
{:4_112:}
' V4 m- g1 c! N+ q( P- w8 ^& p2 a6 u& C6 ?1 v
MAME DEBUG常用指令
, G* ^3 P6 c# r8 E5 l1 V
4 x, T# k6 {, g内存搜寻: ci, cn, cl
& R n/ R7 @: Z" Y: N9 }& o9 ]6 R) z2 D N! P# G7 {* y" ~2 p: K: F0 B$ f
ci
+ O; U' B, k4 }1 T' I 搜寻任务初始化, 每次搜寻一开始一定要输入这指令0 @5 w/ L* D/ N7 H
8 ^" ~- D# J* m3 g
cn/ G, I4 P' p* \1 C/ D
搜寻指令
. h0 y( f( T8 t( R 例子:- x6 G; {' V+ f9 q- Q
cn eq,60
# d0 ?2 ^+ R( C+ J* u 搜寻目标等于60 (十六进制) `0 z' ^/ M; [, U. U
4 d# ^- H0 v0 O+ F) s, ?) h
cn eq,#96# u" n F t; u& n9 ?3 k, R" c! b
搜寻目标等于96 (十进制)
( P/ A! M# j& `' o* b) h
% v+ L5 g/ _: a% Y8 v cn eq% E' L& i2 u: x" m( t K) w1 V3 X
搜寻目标的数值没有变化6 L3 P! e9 `3 x! b2 c' O8 E
0 j J# ~' O' R) b cn ne" E& ?1 U0 c/ W0 c
搜寻目标的数值有变化( ^1 b9 D5 H3 a8 ^+ T! c* j1 m0 Q
% h0 I* @3 u( d2 U6 ?9 _+ M cn +& Y7 _& r, B0 R5 ^1 m
搜寻目标的数值增加3 {( L9 w$ W; M; E/ g( n
+ t- P- T$ }& d( M @" X
cn -1 S) @1 k# f6 K+ T1 {: u& ]9 ~5 ~8 r
搜寻目标的数值减少% W6 @, N+ H. |
( @" I6 D2 B7 G' A
cn +,3
$ r1 J) d: z" D6 i2 T 搜寻目标的数值增加3 (十六进制)$ y0 u W/ S) E% A( }" S4 e, Y9 e
7 ^4 p1 e. g# d- e) `) Z
cl- \2 q# u4 W* ]3 c( _2 R
列出所有搜寻结果
4 `; B( C) o$ g9 d& D7 `
. G/ r/ X- T- g8 `$ f6 v cl xxx.txt0 `4 W' Y" c* O! F
输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式
2 f+ q, o; ^2 t1 G" t# L. r
: F1 a+ K, x9 m2 j" L
- |: c3 E3 Q3 N' h0 B* }! b. I内存监视点指令: wp, wplist, wpclear
" S1 _$ }$ r( s& l4 j7 {3 A 例子:
8 E, h( X* E& V0 v% x wp 1234,1,r
/ f/ X! ]3 @: @* r! ~, v# e 在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1) f/ q' R7 y. X
) Y7 j, V' [2 ^/ z$ t% M wp 1234,2,w$ r4 C3 |* Z4 b4 f
在地址1234下写入监视点(该地址被写入的时候中断), 数据长度29 h v! ?' y4 _+ ^
- \* _6 T6 E$ U7 d wp 1234,6,rw
* z" N4 l6 O3 p& {: m c 在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6
3 I7 k' U; ?: C' @1 Z) o3 k( {+ K
+ v0 a9 |8 {: O* j# ^$ B wp 23456,a,w,wpdata == 1" w7 P; D! F- Z; X
在地址1234下写入监视点, 数据长度a, 且写入的数据等于1# r5 G" t9 C" o: E
; B) b) O( `! D! M; T( d wplist
" }- W3 t1 ?. T/ f! P 列出所有监视点' E o% n. o0 L, @6 C
0 b) s2 s {/ T) p2 c/ C! H" Z; w
wpclear 3* P U3 r3 `0 n+ I3 Y. ~
删除编号3的监视点
' E% y$ ~5 U7 w/ F. {0 k& q" H% }
. _2 _ p H2 y& f8 W# \ wpclear2 P! P8 L7 n7 Z; @
删除所有监视点+ J* `- V' W& [0 T+ c
: R) g0 S$ A- x5 P6 {, k) D
9 O& N. P; ?6 d% T6 p0 f, ?- f Y; u( R6 l* }) }& W
程序断点指令: bp, bplist, bpclear
) o1 U6 ^7 [" y' S/ }4 i( K 例子:% r0 D9 g! T d3 X
bp 1234
* g) o6 i0 ]4 T% A1 [ n- c! Q 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断
- U2 P; I" q+ m0 ?3 ^* h- B; j( n. N1 I' r5 g
bp 23456,a0 == 0 && a1 == 0
# @# _$ ~8 y) t3 C6 i: {8 d 在地址23456下断, 且中断条件为a0等于0以及a1等于0
9 Q8 X, L4 G! C! [3 e" _' r8 E" q8 v' y: W4 n" z3 i' B9 y h
bplist0 y* a- f% [9 K( V; S5 G
列出所有断点
0 j8 q5 b3 Z5 K- d8 e
) h; n# t' X4 u3 _ bpclear 3
% o C8 K: G) f% H8 \ 删除编号3的断点
1 Q- ~* l- }8 K$ R1 L6 Q3 u$ {) M* ~6 M
bpclear
: Q5 O; v( B! T! w H; } 删除所有断点$ x" G& S( w+ T- f
) C0 Q' W" @" Z8 z. B
7 f" w% @$ C# X) u* {) S* z1 l ( T) ] F. K. E+ A% H3 |, y
跟蹤紀錄指令: trace
+ ~$ b4 z9 f1 e! t 例子:1 x& x G! I6 }3 D x# U
trace 01.txt: q0 e4 N% D! X; X: G
跟踪当前CPU运行的所有代码, 输出至文件01.txt
2 o R( J1 C6 I* z) E9 p: e+ v! D) B& o# _# X. P
trace off5 E; f3 H! N" X$ K# U
停止跟踪, 并且关闭文件8 G4 K6 m& p9 o' Z* S% W+ f9 A9 V
. `) r4 j8 Y; J. e9 [, m
trace 01.txt,0- U7 v' s4 {0 M
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt: D, @( b( D% e
6 o: o. \) o0 m H3 }
trace off,0; d ~" u. h% H F6 Y# z; p
停止跟踪编号为0的CPU, 并且关闭文件
) \7 W+ V. P0 l T2 j/ E& ?3 Z1 i; P! |8 t* I* v
trace 01.txt,0,{tracelog "A=%02X ",a}
6 S; T+ s! n( J: @ 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt 9 L: c& x5 F' e4 i0 g2 i
并且在每一行的前面, 写上"A=a ". J* x; I6 C+ K9 S1 p! E) x2 q
"A=%02X ",a为一个C语言printf函数常用的输出格式
0 W- J" Z. p. O 意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入
$ F3 T6 G/ T) l9 @* ~5 q X表示为大写十六进制数
& D4 s5 `+ O8 j2 ?# E0 @0 b6 P: H' ]" W: x3 J
/ u8 ]$ s% S' c8 F1 Y6 e2 o! k7 A' |' v& H( w( k; e# p: b/ I
内存直接写入指令: maincpu
6 B, p9 ~1 G6 U! q 格式为 maincpu.[][]@地址=数据
/ b2 [: y. ~' P: D 第一个[]:; l7 Q/ o) c- i" X$ D/ T
o 表示ROM地址
% x: }! {/ C# b' }0 M$ Q p 表示RAM地址
8 l7 _* i1 x# Z; n: @/ ~) O% i! D/ \ R3 S0 ~5 J6 U& H& Z9 Q7 \) x% Y+ j) ?
第二个[]:
1 m) T6 d9 R0 Q6 `% g' Q% F d 表示4字节
' O5 Y9 p+ v+ E7 N w 表示2字节% B7 q1 |# N& W( k6 L% Z8 n0 f8 D& E
b 表示1字节
6 f/ }' Z; d# L( P- F* }5 s' _% f7 c
& t) K& Y% }6 n5 |( ^ 例子:& [8 ?0 y# i; e& _0 }2 ~
maincpu.ob@1234=FF$ K3 N1 V: Y; h" T' k
在ROM地址1234处, 写入FF一个字节
7 d. {3 p: E; m
, c) U2 `- |4 N+ [9 M) n. T4 o maincpu.ow@1234=4E71
- ^& g( i8 l9 Z6 s: N 在ROM地址1234处, 写入4E 71两个字节. Q2 S1 t; J+ _, n
$ w s' N9 C! h: D3 K9 w
maincpu.od@1234=600A4E71
+ V* Q: j3 K# a# r 在ROM地址1234处, 写入60 0A 4E 71四个字节, Q$ y2 V1 z1 q2 h8 I
8 I$ S* t: j8 {2 N9 m3 v
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
: p4 F1 ]9 M* J$ Y5 }( s : x" y" l, l1 Z. {6 C8 n/ X% x
2 X0 C ^# \( }: V- X. W' r其他:8 ^+ M. I' ?; _: ~9 ^
dasm 输出档案名,地址,长度4 n; S4 y1 m$ w$ S" T" B" l
输出程序的反汇编代码. r' d, S" k2 ^ U) z
例子:! d) _7 b, O; @* L0 G* |( D |
dasm 01.txt,0,100000
' \$ i8 O5 H2 h- | 将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt
8 u! m D6 n% ^0 j2 ]1 C
; s _8 A! e; N3 C* e8 m+ J1 _ softreset
3 Z9 H% F/ \1 |* K 游戏重启, 但不重新载入ROM* a" F3 D0 v8 c& S
2 L3 H, u+ e8 [, l8 P
hardreset
: M" O) G: t+ d& x 游戏重启, 且重新载入ROM/ _5 ~ I# |! S# I4 ?, b
% D$ @/ f; o( r9 P6 K
snap xxx.png
. |0 C5 b+ e6 I 截图为xxx.png) B# s: V4 C- D
5 v- X" [: f$ F" P* R7 V9 E
' J5 |+ t4 A, A( O# G; B
2 Y! A i; n$ u
- E# F j8 f% \: J0 T! G" b热键:: ~9 L! C+ K; Z( b- f' r6 p
~ 中断游戏
2 w: o) K8 v& y- _ F5 运行游戏
. v) L. r! B3 H1 @) F F12 运行游戏且隐藏调试窗口
$ o T8 [ J+ ~4 }: t7 w. R F11 步入, 单步执行, 会进入子程序" ]' D/ v/ u9 a0 C, j
F10 步过, 单步执行, 不会进入子程序
: g* b' q2 |: Z" r: k3 ?! ~ Shift+F11 执行到子程序返回
$ g4 ?7 p" ]% i) s: \4 h6 V Ctrl+M 内存浏览窗口
3 u2 p* R8 x: A, C F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU% O( X; O: i" J+ B+ ]
) [2 F. X# E1 M2 f{:4_94:} . ~1 V- x- @5 v' C4 m
: V8 s2 V8 f, c! j( I Y2 X1 F
|
评分
-
1
查看全部评分
-
|