|
|
; E- Z1 J1 P, @( C8 [9 L: Q
很快速的整理我自己常用的指令( K3 ^% F& n. `! \: L, o
. o3 M* L3 b$ I, y{:4_112:}
# a$ E: W5 |" D7 K$ o; w" l* Q6 I6 i5 A0 r1 E
MAME DEBUG常用指令
* o/ R# v5 G8 s7 n3 j( P7 C; l6 J$ \) l+ U
内存搜寻: ci, cn, cl
7 |3 Z+ E$ [3 J7 b
% ~* I- D2 J4 H" Y- j8 u ci* |: w; g/ ]; V9 h
搜寻任务初始化, 每次搜寻一开始一定要输入这指令
$ N2 B$ U- |5 M' S0 N2 z! k# c
3 ` Y1 P) A6 {' d2 J9 r* f) Z cn( s; b' ~, u j2 N( o8 w8 {
搜寻指令
6 F, C2 x+ e+ ?% l) [& R 例子:, J5 S ]' V A5 s1 R9 i, r
cn eq,60
6 F1 I6 G% }* A; l6 i" ] 搜寻目标等于60 (十六进制)3 C0 d9 D# W! `4 {
+ q: ?4 h8 ?0 n, Z1 |/ c) ^% y- S
cn eq,#96% d) X; \* m0 t7 d4 V& s
搜寻目标等于96 (十进制)
) b7 w) V8 T% A; t2 { Q) e) u) ?' i% p# m
cn eq
! |, n5 p; e% J; S 搜寻目标的数值没有变化5 ]' y) o4 w, X" H
. f5 W1 Y" m L% Z3 E2 Z cn ne7 Q) F9 s# d1 P+ G, ]2 c
搜寻目标的数值有变化, A6 ^/ y$ i/ s
8 Y: W* J* o6 ^. \" C
cn +
- J$ \) @& w- Z. I6 Y 搜寻目标的数值增加
( O/ g2 ]2 `5 l# p1 n0 D , X% Q# o' C& ^
cn -8 E; b3 ]* e: K9 L" g) z/ u
搜寻目标的数值减少, m' U$ M7 G0 a- D4 q6 p; b
0 x) _$ o4 H* \: h, w2 @
cn +,3! X7 f& u( @% O4 t3 q
搜寻目标的数值增加3 (十六进制)% G+ `- J6 V" B! t7 n
& H) J+ {, @% N0 I
cl
$ Y/ }: }1 ?2 g, \' F; @ 列出所有搜寻结果; j# W2 [1 ~4 `
2 a8 h) [+ x U8 D% y9 z cl xxx.txt
' H% Z8 J( o F3 F$ F 输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式0 x: y4 ^, E2 ~+ {, W
, y# K9 H$ ]% X3 D7 c @
, i* i# D( o; V) C内存监视点指令: wp, wplist, wpclear
. M1 k1 W$ ~* ~ J3 N 例子:
3 x( N- W3 e. _2 l4 Y2 E- }" `. s wp 1234,1,r5 H7 ?# C% ]4 m; ]3 t" _! X
在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1$ R/ v- A' f/ z0 t2 m6 W) j
* W3 x8 `; t8 V% L wp 1234,2,w
" @9 q% ^1 T2 g8 ~' f6 d 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2
& J% }3 d; @6 w" u& k / y- y! N1 i! j$ w. E2 V0 f- f
wp 1234,6,rw3 W' a' t% [1 u
在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6
2 ~7 ^) X# o4 e, }6 A% E# ?. |1 e7 L4 t+ U
wp 23456,a,w,wpdata == 1. G& K) {8 r9 E2 _! S8 V/ T
在地址1234下写入监视点, 数据长度a, 且写入的数据等于1
) p' S4 E7 \! Z+ `* M$ l- ?% R( i6 |" k& G
wplist
" [7 O0 e2 C6 ~ d 列出所有监视点
( T' ?, i4 O) \- i( X1 [; j3 P% @" O5 N5 c, P4 U) h+ H
wpclear 3
( F# n0 F9 b$ C, u; { 删除编号3的监视点
* B. ?$ P$ [2 N! h; {# G# I+ A O$ U: n. p
wpclear8 V# S' S5 g* l b
删除所有监视点
0 l V6 r$ D- u# r6 }( h& u( s3 J$ }1 S! T- i# ^# v8 [, a
4 p K, s' K7 L( v8 b* ?5 n) W. w+ R- m1 B( V
程序断点指令: bp, bplist, bpclear
* u- V3 `8 j$ q5 x1 n9 c 例子:
) E5 a i4 l: v# c bp 1234: Z- l {- x3 A+ [
在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断
- T0 ~% d7 C% v |' D/ o) e6 r1 E9 K! Z: G- ?5 i2 D, E3 \
bp 23456,a0 == 0 && a1 == 0, O0 j5 c/ Q8 x- ?/ g6 h' _+ R
在地址23456下断, 且中断条件为a0等于0以及a1等于0
8 J/ o3 k7 q+ Y/ }9 U5 w8 ~
# p4 r; g1 _/ t# u$ E bplist
' I# j# F4 Y; ? 列出所有断点+ f" W8 U( E) Q6 f- A& b$ L
6 |+ j R, C3 L; x8 y0 z3 y& B bpclear 3- U5 j$ n! u: T# g& x0 p- C1 }
删除编号3的断点- E5 y: R( c' H
/ e/ D# C# ^% G- {* O bpclear/ v3 l# t: D/ \8 V
删除所有断点
5 d D+ |7 h2 r' {( M( Z+ m8 Z1 k1 z; M- e8 c( b0 S, e" X$ C
, u& P, \5 n9 X; ]' K
* I! H; ~( ]3 ]2 m* O4 o& \跟蹤紀錄指令: trace( G7 J& ^5 O4 B7 \( B3 w
例子:
& x3 P% d9 c/ Q! u9 Q* Z1 U7 }( }1 F trace 01.txt
/ c3 a% G! ?% K 跟踪当前CPU运行的所有代码, 输出至文件01.txt
D0 ?/ i1 s: f& R: q
9 x* u/ H6 t9 Q! C trace off
5 _1 Y) H3 {, O4 j g' s 停止跟踪, 并且关闭文件
! T/ @( w, J. T/ u
- k. S* h" D) j: f3 X trace 01.txt,0
4 g: k0 {5 U! a3 T 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt+ m$ J% g2 j$ g5 w B3 e
3 a& k, H; n* L8 i- X$ W+ @
trace off,0) R( @ Y7 R! O. s
停止跟踪编号为0的CPU, 并且关闭文件
' I: n0 J( e2 ?) b
# F7 @0 S$ A# l# `7 E trace 01.txt,0,{tracelog "A=%02X ",a}
3 Z4 {! R1 `3 b5 f5 z, X0 ~ 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
7 H/ y# ~- @0 U; X& B! ]' j 并且在每一行的前面, 写上"A=a "$ h6 d; o% U0 p, o7 O
"A=%02X ",a为一个C语言printf函数常用的输出格式- M8 B+ P- F0 @: b: x& ]5 K8 Q
意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入
1 P# h6 I2 G# b% [. E9 m3 B4 y X表示为大写十六进制数
" P$ m! z& P$ ?6 Y _: \ V& x' m
9 S* {% V) g m3 D. a8 A2 I# R2 w% o) A0 C" [9 \4 `- M2 U4 y5 A2 v% [
% `" v$ w1 u# d6 J; l+ J) X% Q7 Z. }内存直接写入指令: maincpu. z$ v, _+ a: ?8 f9 x3 N9 O
格式为 maincpu.[][]@地址=数据) p' p9 h/ }! d& I1 r+ C; z, q5 L
第一个[]:- p9 ~0 x. r% z v x
o 表示ROM地址
6 |( \: V) K( z, z0 p p 表示RAM地址: N# N. ~4 L0 w1 ~: |( C; h0 g
7 O# L7 j+ ~$ V# G9 e1 h4 v k
第二个[]:
; r+ \0 p9 r2 D4 Y g% r( Y/ l d 表示4字节
; N; K, S4 H8 e+ B8 N& [ w 表示2字节, Z! t/ T$ w8 g* q
b 表示1字节
3 V7 f6 s. h" ?, L! ^
/ f! B* b0 ]( h. h% | P+ E 例子:
2 g- v% h3 ?; O: B maincpu.ob@1234=FF
2 a' w$ Q+ ~& u/ H7 N) T 在ROM地址1234处, 写入FF一个字节+ I4 v- t8 a D, p) |
1 @. W; n2 v9 `. G0 T, e2 v' E# P maincpu.ow@1234=4E71# x# l: U& n# W* P8 P
在ROM地址1234处, 写入4E 71两个字节
9 H9 ^) v4 M: X
: V$ o$ f+ I& `" K( f9 ?% U( _1 W maincpu.od@1234=600A4E71. D2 I; d% a5 V" h% m3 `. w
在ROM地址1234处, 写入60 0A 4E 71四个字节
# t+ B) k; p, [* ?/ I2 @- g q% {2 H
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写5 \$ i1 N' K5 { H. M6 o9 a z* b
. a. L" ~3 i i/ ]( ^1 `6 ^
. n/ l; }: U. _$ g) X+ B" q5 v/ O, y
其他: H( D0 `$ Y$ ^; j
dasm 输出档案名,地址,长度
4 l" C0 `2 u3 a$ e8 P3 G 输出程序的反汇编代码0 p# R$ L- c0 N; \ ?" Z0 z
例子:" b3 o5 c% B( a
dasm 01.txt,0,100000! r- Q3 x7 u) d
将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt
& |& n6 K8 b9 {5 c2 |7 |6 Q
. _5 X- S) ^6 [7 F6 p softreset
# i/ j4 v! I# k: S& F { 游戏重启, 但不重新载入ROM
8 g" r# r+ m/ i T5 J( B/ {6 H5 L, S* A% k% s& I: \3 x/ u3 [8 R1 f
hardreset5 E0 t ]2 I" B, h+ N/ W/ d5 i* g
游戏重启, 且重新载入ROM3 w i1 |# t1 ]9 p; G( Y" r
: z8 }& G/ l/ e( E- o1 o) T; W snap xxx.png
4 c6 X6 @7 |1 @' M/ {" a4 r 截图为xxx.png
4 j N$ C: e, B- S/ |3 ^' t/ c' {: o% Q( A
) d! c! z9 H, `7 w* S) J9 w p9 C: x $ X& Z/ H% N' v0 {- ^* P* {3 w
8 `7 Q9 j3 j) [9 |. J! Y- `0 p
热键:/ L+ h4 [9 m7 X
~ 中断游戏# R& C+ P0 ]& V
F5 运行游戏/ {, \* U( _* \. h0 A
F12 运行游戏且隐藏调试窗口
2 } l- b6 i' l% F7 N2 H, y% f F11 步入, 单步执行, 会进入子程序
7 t1 j! I* A& o% M F10 步过, 单步执行, 不会进入子程序5 i2 O* Z- c) B- w) y
Shift+F11 执行到子程序返回6 l$ g/ T- \- w& {( }+ d% \0 _
Ctrl+M 内存浏览窗口
# h& q7 p' y" c1 E+ L F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU% B7 p. i: r7 _5 `- g0 C& h
: `5 ]. M! @2 Q* B) f
{:4_94:}
% w& r3 |' ?6 m7 D* F7 J8 H, r) n0 D3 _3 b( O: Y
|
评分
-
1
查看全部评分
-
|