|
|
( e/ u* Y* j5 t$ b5 H( E) _+ L/ v4 |很快速的整理我自己常用的指令" A2 }2 d1 B3 u4 V4 ]7 r' s, ~) i' ^
/ r( O& F# a' }& s{:4_112:} , W1 ]5 y& S5 \7 X: ?- D! [! V
J0 j( R+ c( j3 p( k: z' q0 B
MAME DEBUG常用指令+ h! }% @* K9 Q" e( P0 J# b% A
) O' q! y2 E& O9 U' R
内存搜寻: ci, cn, cl
. [. ]+ i$ A! C& l* O2 i
( Q: `, v2 Q+ B+ ~/ n* ` ci
$ Q; v" P7 E8 F1 i- M9 r( y 搜寻任务初始化, 每次搜寻一开始一定要输入这指令# K Q% J8 f: Z0 E" h; ^4 R8 \
|% ~- T( Q. d. d
cn
4 m* a- V+ h* P' t 搜寻指令
# T' u+ W5 I, Z5 j' O' o' }9 g& { u: t 例子:" G* v- X, P2 P/ C. {
cn eq,60
5 b, D9 y+ C% v7 S( J5 w- Z- _ 搜寻目标等于60 (十六进制)2 U6 |1 p7 o4 Y/ e$ ^& F
7 k1 X. k, ~& ]! J. y
cn eq,#96
0 A: i. ]- t8 J% A9 ^# h$ [! i 搜寻目标等于96 (十进制)% v* [ w' y' t- q6 _* D0 _5 W6 v- u
4 M( q% C2 W3 G- {& g0 _
cn eq# T' |8 ], y+ C) y+ L
搜寻目标的数值没有变化
0 t( l2 z2 W" F F& r3 f! V5 S; a5 \: K/ T: E
cn ne
3 C9 j+ u, I% N$ |9 l 搜寻目标的数值有变化. J0 t0 ]: w5 n4 z7 y$ e3 J
8 y/ @/ m% `6 q6 L
cn +
0 g. F1 |0 ?) P7 _' W) u 搜寻目标的数值增加
. G% c' p8 N" }5 C
, A8 A" M" ~" F b8 f% t6 Z cn -8 v& Q8 [2 B3 D1 J9 O- v# h z* Z
搜寻目标的数值减少* T& u) f5 Y7 v5 x
3 m% R+ B2 d8 d" }
cn +,3
3 o X' W* M9 c- ]! V/ |, D 搜寻目标的数值增加3 (十六进制)
% @3 I6 O8 w/ ]6 Q4 X |
7 u- w& h" @) E0 a cl4 i, W5 y7 e& D$ U
列出所有搜寻结果 s" F9 Y* i+ w- l, P8 b6 o5 ?
' _0 [5 S* w- O3 `' a2 I$ f5 E
cl xxx.txt |4 U) B2 j. u% w
输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式% c/ t9 d7 ]& N7 x; o3 v1 A
- p2 f" g* `, P, ^$ W4 c
+ Z5 h7 w9 E7 P
内存监视点指令: wp, wplist, wpclear
) U$ K' R( ?$ R1 |0 `; N 例子:0 m; X1 |! G" F- }: o3 Z
wp 1234,1,r
* ^: j- I1 l! x3 z 在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1
5 ?/ G* t* j# @* u( @% o7 }+ v q" K5 o8 g0 k1 L' E
wp 1234,2,w
: Z7 K0 W2 K9 x7 V* i* g& n; ^ 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2
# Y: }" w" V. E' N: n
5 V" A4 @! b+ [% U1 N8 F. y( _8 n* y wp 1234,6,rw+ l- v; }; q0 d! I) u( {9 O
在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6 y" g, }/ s5 x; G7 z, t
; ?, h* b* o6 ?, V% s c
wp 23456,a,w,wpdata == 1
' E# Q4 {0 b1 z* k0 V9 n5 e0 P- H 在地址1234下写入监视点, 数据长度a, 且写入的数据等于12 m0 G( J7 l- O
- ~) o* m2 D' a* v) X. \1 n0 C wplist
; N0 x; b0 U: V6 ^( Y7 z 列出所有监视点
# f. s) ~7 _" K# o! j& o. I% Q9 c9 W4 e& \8 T5 @& C
wpclear 3
0 D7 v: ?% S x) \5 L! [/ D 删除编号3的监视点
1 P. l8 q4 \5 W
0 e. I- L' V8 A: C) O wpclear
' [( S7 Z7 p: p. I) |3 r 删除所有监视点
, X. a/ I3 M. [6 a9 X/ ^0 d
& o0 V5 y D8 [3 ~
& I5 D- A# T( t) O. n: L& _+ @2 T2 ^6 T) C, x2 r9 w1 }0 t" D
程序断点指令: bp, bplist, bpclear1 |9 |1 E( s. S, `; E% F9 p' z
例子:
& W% I2 [: H- D5 A( G. | bp 1234
! r/ q, J4 A2 e: R; B: t 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断& a7 s0 a* V9 Y4 S, J- }- f
$ S% I, Q; o$ m/ l) p
bp 23456,a0 == 0 && a1 == 0" G/ C. F y+ r7 ~5 _5 g# P! }4 [
在地址23456下断, 且中断条件为a0等于0以及a1等于00 C9 w4 k& g$ I
( T: s! T2 o2 j- g% x
bplist" v0 y/ x9 R3 A* b* A# X9 P% \
列出所有断点& J$ X/ d+ X) H `, K
" h2 Q$ E* Z- c& {; w; y bpclear 3
+ D# {: N# x- F5 V 删除编号3的断点6 I1 ]0 \& u E- p
2 E% c+ t8 A5 D! ?8 c: n3 [2 N bpclear
0 N6 a! P& m& D0 U7 E: e2 A% ^; n- O 删除所有断点
+ [6 X G) K+ D. b- b$ G
% ~& [5 a& P$ D5 j
% u l. ~9 Z; m& n, m! J- e; _
( A" M$ U$ v4 S跟蹤紀錄指令: trace
% Q0 e0 T5 E% h1 X; r1 ~ 例子:
6 b @" A1 v: X8 W* T9 e trace 01.txt
' ~ _0 S8 M: E7 C 跟踪当前CPU运行的所有代码, 输出至文件01.txt
1 N2 Q. i2 S3 F5 a8 G
' g( r3 J' [# ^3 V5 ]2 E trace off2 s" A! F; O6 w N6 N5 N
停止跟踪, 并且关闭文件+ E4 T( a: N- J
" `: e% L6 u7 x% A7 F0 u- w$ w
trace 01.txt,0
) a; j2 s0 t. @, G& O9 F 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
( h2 f! @/ S4 L
( E& o7 w) I' Y: r/ ~ trace off,0
. {7 V1 g3 t- q, i& A 停止跟踪编号为0的CPU, 并且关闭文件
- q7 E) W& c& Y/ m, ^6 f& X+ ?2 r4 }2 T. @2 Q$ U. U
trace 01.txt,0,{tracelog "A=%02X ",a}
0 y' c: U3 y) _* C/ Z 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt , ^: F: b3 Y5 {7 L7 \, Z! E* W
并且在每一行的前面, 写上"A=a "
! t4 K( u- X8 i2 c6 b "A=%02X ",a为一个C语言printf函数常用的输出格式# w2 Q+ a/ ?- O3 p6 D
意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入6 E- u7 S: U, B) j
X表示为大写十六进制数/ |; B5 F: B) Z
0 s5 ^- L w9 W% w& L I' T& Z" Z; ^9 R. A
. T2 \ b3 h' ?/ ^* k内存直接写入指令: maincpu9 |$ G( S8 r" w) |7 X3 r+ H; }
格式为 maincpu.[][]@地址=数据
- Q" G+ |( @9 Y& J6 Y& i7 ^& f7 ? 第一个[]:4 O. P& B# x5 y$ W" |3 T. U
o 表示ROM地址! k$ Z8 D) @0 S3 u9 R
p 表示RAM地址
) l6 y6 h% E6 g h7 w! @$ V9 C
1 j ?- A4 r6 f. J 第二个[]:( V: _8 h: N& l0 L
d 表示4字节
, H! C1 ?" n9 j2 P w 表示2字节
) s0 s A3 Z" V# i. @ b 表示1字节
- n2 ^* s6 r. Z/ H; K2 ~* @" B0 S& m% R) T
例子:2 V7 E3 x) O6 h
maincpu.ob@1234=FF+ {; k! E9 E" b. m7 ?9 q& V- a
在ROM地址1234处, 写入FF一个字节
& d4 s1 h/ k7 I! e" g9 R* I' ~8 _7 B7 d& |" C! |
maincpu.ow@1234=4E71
% I h5 B( s& m# g+ p% q9 r1 U 在ROM地址1234处, 写入4E 71两个字节2 L+ C: y6 V R2 g, o0 i, Z
/ H% n9 @0 h" C4 d! V2 R3 f
maincpu.od@1234=600A4E714 ]9 A( t% |5 V# V
在ROM地址1234处, 写入60 0A 4E 71四个字节* }9 Y: Z. i# V
5 c7 T1 I( ~5 N5 C# H3 | x6 T- L
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
4 C3 [% }1 r$ v
* l& l+ B* r ^# F8 q7 H+ v1 r( h7 z4 E8 t% v: {
其他:
. L8 _- y+ [+ D; b4 Y dasm 输出档案名,地址,长度6 G& R; X8 B$ t" `
输出程序的反汇编代码
; p, @% c0 \* ` 例子:: V# U# R, _( Z6 r5 K* B
dasm 01.txt,0,100000
& i) z6 f" R( [! `; c, j 将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt
, a- E9 D! z( B' y3 f+ Q% K v
a2 c. G9 f% V softreset( g4 ]7 v2 m5 ]# b! q
游戏重启, 但不重新载入ROM
% o; Y# V1 i+ L- ]; Q- g! e' t
: X7 k% n9 S& X p2 e- b, n. K& y hardreset* ~* u Z2 \1 M8 _' E n. |5 j
游戏重启, 且重新载入ROM$ h y K; j. a: t0 M- S# w
7 H4 _: {3 k1 M, K2 V
snap xxx.png& {9 }! k/ C$ o0 S5 v$ x! H
截图为xxx.png
3 s, a$ x) Z3 |6 G
A% R6 f/ p7 _3 X: T / ] N: W7 N$ f/ s1 P/ r
$ l3 N: Q) t) M8 k
D# V- m0 z. K7 W$ Z" m2 F; ]) W# x. _热键:3 F7 b' e1 S; x2 b9 v$ {1 G
~ 中断游戏
9 u( K: ?: V" ]2 I8 g0 t0 }0 f8 u7 Q F5 运行游戏! Q0 c5 O9 t9 o5 g% O" r% R
F12 运行游戏且隐藏调试窗口
2 F T! W# K0 w4 e F11 步入, 单步执行, 会进入子程序2 h8 f1 }) q: }$ g' I* r
F10 步过, 单步执行, 不会进入子程序" @( E; j* N. q& l
Shift+F11 执行到子程序返回
/ }6 i9 I0 O3 r! R. i+ L Ctrl+M 内存浏览窗口% l1 t+ E2 z' U" X( b! y4 _( l
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU+ o( \: `# _7 r0 a
( U* E' s9 p/ q$ m. U
{:4_94:} " J7 o, d- E4 o2 k" z; l
, Y2 j2 }' X8 {6 E* w |
评分
-
1
查看全部评分
-
|