|
|
6 r& W7 b- {% W" ?: i
很快速的整理我自己常用的指令# }% k/ m7 F$ F& ]; g4 v
; l: V6 t8 D! \- A2 \8 p: M
{:4_112:}
& c- }/ M" c& }2 z, o* z; \6 }# \. d+ m" L: ^! c3 n
MAME DEBUG常用指令
! f3 L! f3 e- r9 S, w, W+ ^; _9 ]& ?2 |3 r2 `) ]: Q
内存搜寻: ci, cn, cl6 X% M$ V. X* H' t. X& u, Q
, b$ ?* G: D" t& k( { w) ~4 M2 D7 C: Z ci
. y m: a1 `5 z' N8 k l. H 搜寻任务初始化, 每次搜寻一开始一定要输入这指令
2 q" M7 x6 ^/ C* H0 t. c1 I3 ~9 u9 z) |
cn
5 A0 l2 W* q: L9 J4 o 搜寻指令
) H2 r: @: E+ p- k. ~ 例子:
& a- A* n9 T& e& ` cn eq,600 v, z$ d# [7 a' h2 `& ]1 H6 S, Q
搜寻目标等于60 (十六进制)* Z& A+ Q7 E; B- {; M% \6 v0 q
0 I9 T i: W1 v/ Q/ l8 D
cn eq,#96* F, \. c5 V. ]9 e
搜寻目标等于96 (十进制)
& X5 ~0 Q, F. O0 G' e9 {; ^9 B# \5 Z% h7 d/ `& x( l" n
cn eq
% U/ i3 {1 i9 _/ D$ u' w. n0 h' O 搜寻目标的数值没有变化0 t2 P; n1 k4 G" _( b
" o; h5 X( O& o0 J cn ne3 u# A) ?$ h1 V4 @
搜寻目标的数值有变化
# w' |- Y* T6 V 0 j/ P& q4 d7 u/ U
cn +
' z1 ^7 t' ?, p 搜寻目标的数值增加1 ^% i8 R# ]5 N/ |' w$ t6 M. V; d$ e
& ? R, {' C9 X. [: |9 ]: Y cn -
; G# m" J; {4 X. @, z9 @# t 搜寻目标的数值减少' U9 I5 w- M- ?$ q! _
% Z5 y4 z3 v# u4 H4 R# s
cn +,3
% K/ W& t# t, a 搜寻目标的数值增加3 (十六进制)
' E+ L- M- m7 Z; m) B& w9 Y# ^6 z0 y# [. g* c0 p- O
cl, f" }( t6 E- U6 V0 u
列出所有搜寻结果
, u3 t$ G; d2 ]/ v) D
7 \) [% i- q, J9 D cl xxx.txt
! K$ S9 z" Z8 Y8 {: Z0 r 输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式6 J n6 P" `3 ^& K" Q4 i
8 N. g7 v* W" Q1 d7 g/ A
1 d% @+ H" z- x/ c( n( `# q内存监视点指令: wp, wplist, wpclear% R. z, A8 x) j
例子:4 T" ^, k! w& k" u9 C3 I
wp 1234,1,r
; p4 }+ }6 m( y7 S% K 在地址1234下读取监视点(该地址被读取的时候中断), 数据长度16 k. B- H5 v! x# t8 j: L% C
* R& |& E+ m$ K- f wp 1234,2,w
2 _. A) F v. e! {4 a3 f" T 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度29 o, f' u c- k: c
: y( Z: z; [/ Y3 \
wp 1234,6,rw* o, U: P4 r: O5 e8 J
在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6/ y" ]3 t O* W J/ D) @3 Y+ [7 [
7 r0 H9 w0 _7 b F4 c. R& M
wp 23456,a,w,wpdata == 15 }; Q* Y% `+ f! A. {3 G
在地址1234下写入监视点, 数据长度a, 且写入的数据等于1
! W2 P7 r- G8 N. R8 {. g9 k8 h- C- _2 w
wplist
) t) L5 x/ y- @* R8 y4 h 列出所有监视点( R8 s% S8 k9 [6 w7 C& A
4 Q, K9 q' f! @& W' O/ ^
wpclear 3: S; Y* o1 o$ E) M0 E) `; z
删除编号3的监视点
" R8 V2 [6 o. v' }2 v) g2 A) g% ]6 A# Y% b
wpclear: J( I$ t/ v C% B3 x
删除所有监视点7 w9 ? a% R2 B6 E
# w8 L+ Q1 T! c, G' [
* s8 z7 `$ D* y7 U
0 N: G" q% @' R程序断点指令: bp, bplist, bpclear
7 s( b# T% Q/ C, `, L8 P- A0 g0 r8 e 例子:
7 S9 w3 H4 D0 x! U/ w" @; V* J bp 1234
! A& Y: U9 b0 r( t% [ A 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断& ?3 k" p i7 ?
7 ?, R7 }& W9 h+ O* D0 q bp 23456,a0 == 0 && a1 == 0
) C6 R( G" T2 V3 @/ s$ s 在地址23456下断, 且中断条件为a0等于0以及a1等于0% J# w9 [5 l7 V2 g8 F
D2 R6 T4 {5 U bplist
1 D+ n3 \: _3 y$ V/ \0 l% {4 ^$ D4 V" U/ A 列出所有断点
8 K: G3 @# e* ?2 b
( o% p- E3 F, |) T7 f+ }! E/ x bpclear 3
2 l2 Y2 b" d* N ` 删除编号3的断点4 C: `6 l# v% H E7 g, K! Z; c6 L
. \9 R0 L6 k( A( ^ bpclear
9 H" Q( W, v- T5 `/ Z0 I9 u- _; P 删除所有断点0 h$ s. C- J+ Y* p1 u5 M
% v" K$ k, o" G8 y; h, O2 v9 i 1 i2 @0 O4 t- c+ z# q9 G* X4 S7 w
. i- T% P Y# T/ j
跟蹤紀錄指令: trace, P& Z/ N! G. R+ I$ g$ C
例子:
6 G8 S% H9 E% `4 X trace 01.txt
: ~+ O! p, y. k9 ^+ ^ 跟踪当前CPU运行的所有代码, 输出至文件01.txt5 U3 B, p9 p+ C' `0 f
; o- c, H2 B& F; z0 M8 e6 _ trace off, b& W- _7 {- O$ Z% f1 J! b- p: F4 G
停止跟踪, 并且关闭文件3 w) \6 p S% [1 j
6 @4 P. J6 z* b, b2 k' ~% r3 t
trace 01.txt,0
3 o' D4 T! c- } y0 r! E 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt$ ]; M/ g/ v* H* ?) M# Q ~
# l8 B; z! x9 ~" Y
trace off,0% d8 ]2 I% P! _; l' N1 o5 B; h/ C
停止跟踪编号为0的CPU, 并且关闭文件4 O: L( ^: F+ H- H3 h
& W: [, t8 H% a2 Z9 d% [
trace 01.txt,0,{tracelog "A=%02X ",a}
: x& A; J4 P* W! W- x N) u, {( h 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt 3 o6 W5 f' h' J8 p% D4 M
并且在每一行的前面, 写上"A=a ") a8 w, H/ R2 |- e" f9 D/ ~
"A=%02X ",a为一个C语言printf函数常用的输出格式& l' ?3 R* u7 s G6 s
意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入
- e( O7 R6 d, M7 \ X表示为大写十六进制数
* p$ @/ T8 j4 W4 \& P& d4 f/ j4 F/ Y/ u' a0 ^- ~4 O
9 c9 D0 e* H+ V' W, a; P) a
: y# Q8 h* n: W, p5 y. N* |内存直接写入指令: maincpu) A6 e( ?! B: U9 |9 x( ^- c. K% C1 I
格式为 maincpu.[][]@地址=数据
3 N; {$ E' ~7 r$ _& K 第一个[]:
3 B4 l* W, |& p, J4 N/ m o 表示ROM地址
- b$ n, d4 I$ H p 表示RAM地址
, n7 G) A8 l6 J3 j" a) \! `+ S" h& o# c6 ]1 [0 ?, u& u
第二个[]:& ^3 ^9 e* W6 b. l0 V1 U
d 表示4字节
3 _& b! H8 Q$ I1 g3 a# C1 ^ w 表示2字节4 [& F0 x+ N5 ^
b 表示1字节" }" y0 P2 m) m3 p9 k
. Y8 M6 w3 x- b1 u$ P, D( l 例子:4 \* ~' K% ]* M% [ j, n9 q6 O; H
maincpu.ob@1234=FF& |+ x: ~$ s; }& X0 P+ e2 \
在ROM地址1234处, 写入FF一个字节
; m! B: ^8 o6 X( s, M5 o/ ?
5 t4 J7 \* q& v4 g1 o; J4 ~ maincpu.ow@1234=4E71& ]7 @) _$ P# b' A* p) }! L
在ROM地址1234处, 写入4E 71两个字节1 K! q5 ]! {) j5 W- m
5 n7 A# {' @7 ~9 r0 q maincpu.od@1234=600A4E71
j5 b" n- d/ x! B* E. X 在ROM地址1234处, 写入60 0A 4E 71四个字节
1 L7 ~8 g% F) C1 ~8 h+ t: C' d* X4 y/ b2 E( x
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
: H q$ @8 g5 n, S% k8 f1 c : A- e" S$ _& L; y4 C" A0 I# @% h& d
1 M) q0 R" v2 g/ q4 B- X其他:
$ ]; u( q! r" [ dasm 输出档案名,地址,长度
8 p9 {' p7 u3 J1 ]$ { 输出程序的反汇编代码
$ T7 C ]+ n% C5 H8 ^* y. p' P* P 例子:
& x1 ]* g- w& P dasm 01.txt,0,100000! P9 A5 a# p# y* o) D
将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt
7 m9 k+ E& \ b* N& w) W! E0 {( X/ f: g5 A6 @+ v. w
softreset
7 N' y/ V. c1 Y# y" h2 g" m% B# T 游戏重启, 但不重新载入ROM
6 _' J) a& ~2 a
5 \: W; ^6 D4 E5 f hardreset
% @/ E; x1 Y0 H8 F3 c- B# K) c 游戏重启, 且重新载入ROM/ @% _4 Q1 |1 F9 ~, {( Z
/ |6 h" d8 j7 h! s( M$ r1 a snap xxx.png
) i& W3 Q& i/ o 截图为xxx.png
! w3 M) A0 { X4 }- @, d
# f7 B/ r; L& \( Z- L7 W 3 g: ^. i9 d/ X: `2 x b
$ D( ~% I, Q/ q9 Z; S! o 4 l: p: s: A0 ~* @" D* `- l
热键:7 D1 ]! @! m5 w' }: K
~ 中断游戏& _/ A5 ?( D# ^7 e1 J5 |7 h2 X
F5 运行游戏
! L/ n# h& ?0 B# }( G F12 运行游戏且隐藏调试窗口4 u) d4 [6 k2 i$ c
F11 步入, 单步执行, 会进入子程序. h1 F; A- |1 `2 z0 R# r) P9 D( L
F10 步过, 单步执行, 不会进入子程序
9 W+ G# A8 i1 f4 T2 n8 b Shift+F11 执行到子程序返回2 [4 ]* T2 }7 m0 ~: V; S) ?
Ctrl+M 内存浏览窗口3 W P+ N1 j" T
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU- v" c. |) w/ \+ Y
B) |; t8 S* o{:4_94:} 8 `+ I$ {3 D- {9 l
% f- _5 t: d" k( s
|
评分
-
1
查看全部评分
-
|