|
|
* O+ ^7 o1 y1 h+ w5 n! |# ~
很快速的整理我自己常用的指令
5 P$ q( O# s0 P9 Y% [* `1 R) Q
2 r+ I6 F: [& q8 H7 X( Q" p{:4_112:}
1 F' g) z, @. b0 H& [; H# a" [, y+ t2 `
MAME DEBUG常用指令
# e; V# o C' x9 y7 M
: V$ H5 _: `1 L4 B. G+ R1 A内存搜寻: ci, cn, cl
" n8 v, l* X+ j6 S( s. _3 j2 v3 t8 a6 I
ci
2 i% U; p9 n+ [- B+ \ [ 搜寻任务初始化, 每次搜寻一开始一定要输入这指令2 S% t" S& T; P6 M
! P, o, \3 @; _' C$ T [3 U
cn! B$ i& k* \8 B) @1 N' |) d* I- \
搜寻指令
! G( \( _) @- M- q! S- Y9 ^& F 例子:( j& ~- W: }, y( V' S& U k6 _# ~
cn eq,60
: r- k+ l% E7 a4 C0 h* ^( r( e 搜寻目标等于60 (十六进制)
: _0 t/ J, Z0 {' E' j7 Y ! n) h$ E8 i* V& T5 Y( \$ o
cn eq,#96
1 O+ \/ @9 U% a8 N6 Y2 d0 N% e 搜寻目标等于96 (十进制)$ n6 H# ^2 H1 ` s
, i: w8 E8 R' t4 h1 L- t cn eq% J; X: b( |2 C% x+ T+ o% Z3 L: W
搜寻目标的数值没有变化$ {7 Y: g6 \4 Z* z
. V( c% z- w* n1 K cn ne
9 i; q& X& C$ |6 c( s: h 搜寻目标的数值有变化0 y( g* W2 Y/ B' @/ E9 {
- `) t" B* v- F% T7 n! B( w4 \
cn +# c5 G9 n# G! N. }
搜寻目标的数值增加" `$ t& ^, y' S2 R$ W
6 [0 ~7 Q" ?% o, I: @ cn -3 O+ C9 j. W. l" f1 B
搜寻目标的数值减少
) S- q2 \' w) R1 _* `1 K' b v( s " W. l( q- L% Z3 R
cn +,3
. \8 V3 Z' e Q4 q* S& z' H, k! M! N3 d 搜寻目标的数值增加3 (十六进制)2 U' F5 s5 j7 g5 \$ V5 ^+ o& L
. N( a5 T/ p/ _2 [
cl8 x4 P6 j+ K$ f/ ?* Z: t
列出所有搜寻结果
* D; e! e) r- l6 g6 X8 C( o0 L1 x$ j7 M
cl xxx.txt
, i6 U/ O6 a6 v. M" N( D 输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式, H( n$ j4 v, q% F7 x
+ M! p$ m& o$ O# `9 I' F, I
* v r' ]0 m6 y" B& u内存监视点指令: wp, wplist, wpclear& `' ]& e0 t r
例子:
% ~ E4 O9 [* W( P5 U/ ~9 h wp 1234,1,r( t9 j2 F x; u
在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1
: d6 T& m0 J) h
8 @% e" o* f- f9 p- j0 a5 M wp 1234,2,w
1 @4 `+ U! _0 F2 i5 e5 I 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2! a- }& f& i B5 `) r
7 P- n% H& c& s0 E7 o( ~ wp 1234,6,rw9 z2 J1 n A+ O2 h: G6 U1 j0 N
在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6" ^! {1 T. t) ?1 _, y; {3 i/ M% {( [
* ~% c4 j$ N0 m# v7 h# f# m6 e
wp 23456,a,w,wpdata == 1
' T9 M: a( O$ |/ c6 G" x 在地址1234下写入监视点, 数据长度a, 且写入的数据等于17 r; G0 J0 E; a" q F( L
2 j/ }+ O+ A4 n wplist
3 T8 ^4 P7 R1 o9 p9 t+ f2 _% A 列出所有监视点
' A" p, R h1 J. A1 x, J- E0 t$ f' d& |( a& {& q) S
wpclear 3
8 L. Q' a- |$ a0 p3 p 删除编号3的监视点( K4 R5 G& f. u9 s+ R
8 d2 @ O4 f w/ z
wpclear, Y7 O7 ]1 Q$ P; u
删除所有监视点
# {- o& }5 U4 o2 U4 t& N6 d: T0 Y" e3 z
3 b) {1 N0 S+ f T& q" o
: P& n' b l: X$ w程序断点指令: bp, bplist, bpclear9 U! X0 `3 x% Q$ \, X7 W
例子:+ g3 g' w5 o/ r6 f* H/ I
bp 1234
! j" \7 B4 M+ O O+ v5 g 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断# g& i+ l# Y& u s- o
0 B: {# D8 r& T2 _/ Q( s6 K
bp 23456,a0 == 0 && a1 == 0
& F: q2 a& |+ s# a 在地址23456下断, 且中断条件为a0等于0以及a1等于0
7 V2 w7 w4 k2 w Z" _8 W3 O( [# z' n; c/ Q( b' |
bplist! x3 M P% x E" r( z7 F
列出所有断点
' q! |1 ]1 @& J; J+ V" y, P1 B' F: b/ U0 _! h
bpclear 37 k8 y) m, X, ^+ h
删除编号3的断点
; Z7 i; s8 F# j* U* `+ j c3 T% m: K* U* C1 R- ]$ B
bpclear1 J- I) { @# q; {2 V0 `
删除所有断点
% j. o u' L- n3 o1 N* e9 d, d \3 m6 L) y) K, q. k3 |
& ~1 z8 g6 W( }* d) q: V* l. D/ f q$ h( A$ Z' i4 A, J% p3 V# F
跟蹤紀錄指令: trace
5 ]" n1 k9 a' V" C" i) _8 r 例子:
4 b( Q* Q! O) D6 p5 p( W2 p trace 01.txt
- V" @) E+ J: p 跟踪当前CPU运行的所有代码, 输出至文件01.txt7 a3 a+ w8 H6 w9 |# J4 K, s' P
* h( n3 ^% B- h& p* r& Z8 J, @
trace off
( m% Q! e) s, J% a! g 停止跟踪, 并且关闭文件
3 z8 t/ c( V( Q( K) _. w9 w; z( r8 [( g
trace 01.txt,0) `1 Z1 j. v1 }
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
( ~9 _7 G0 G) ~! F$ E5 |) M! q6 t
3 b% d, Z4 Z$ S/ x/ ^ trace off,0
, ^/ E" {) ^/ _0 B 停止跟踪编号为0的CPU, 并且关闭文件! K+ I# ~, x" U$ J9 ]: n n% e
2 \! m5 j/ ^; y* t, d S
trace 01.txt,0,{tracelog "A=%02X ",a}
! \, C3 | k/ Q0 e# E! h 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt + s5 }* X' j2 p( j8 E9 |
并且在每一行的前面, 写上"A=a "
6 n' E$ o; p5 b6 { "A=%02X ",a为一个C语言printf函数常用的输出格式
$ N* Y7 J& W% M0 R5 ] 意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入; M$ a6 j5 C8 r1 z$ `) A
X表示为大写十六进制数1 B$ D) S8 ]) }5 s) e+ p4 l% ~7 ?
- z( c- d5 r5 e% b- W- s& Z. L7 H
" i( t+ `7 s$ G0 B7 j" f: D# b+ I1 V) Q! @
内存直接写入指令: maincpu* i8 Q6 u' C! H8 B. c
格式为 maincpu.[][]@地址=数据
9 E' O$ @7 G% z: a) j3 j 第一个[]:: p3 Q1 }* a' w+ f% g- Q1 P
o 表示ROM地址" o, H, B4 @# C
p 表示RAM地址
: x' C0 U8 ]1 x7 ?, B, I( Y/ H+ i( H3 X5 o# m2 V: I. [
第二个[]:
# d; z3 l c* C0 d2 D: i& g2 r d 表示4字节
2 ]8 X6 d! Y) `" g; n# L w 表示2字节$ b2 d: V l5 `: \7 M0 I
b 表示1字节( T* I; `6 f6 |2 o; m1 _
2 U" o* H3 v. w7 S; r3 u0 c 例子:
0 W1 s/ |/ K$ o! V: W maincpu.ob@1234=FF9 ~6 ^" O) i8 j2 M' L5 W( }2 D
在ROM地址1234处, 写入FF一个字节! _; V( e3 d* ~1 L
$ e, ^. S3 M/ a/ u
maincpu.ow@1234=4E71
, Z+ w/ h9 ^1 z. f* X 在ROM地址1234处, 写入4E 71两个字节
+ M; L7 h" \" M" o* i1 D J( C+ G* x+ E' t: s2 [7 {- p
maincpu.od@1234=600A4E712 x0 D M7 q8 n8 `9 J- G: p
在ROM地址1234处, 写入60 0A 4E 71四个字节
% v9 B' ?: X% u, }( a; J6 r6 ?2 B' ~+ w7 E0 a+ _3 O
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
L7 i# `1 w V4 N+ k2 W ' [6 `. s, `, O+ i# ?. J/ o& M# h
$ J( O1 z% F/ t- y9 g5 b
其他:
7 ~; K1 n: f6 e dasm 输出档案名,地址,长度4 Q' }0 o8 E+ ?: r
输出程序的反汇编代码
3 @5 C% C7 V1 e2 T% o 例子:+ s0 L2 c" {+ i* U; P1 {& P
dasm 01.txt,0,100000" s9 d4 `, n' y) e v9 j3 \# ]
将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt$ q% Q$ N o: |2 b3 Y! w; E' \% a
# `0 ^# F- M4 s7 W8 F softreset r- }. a, o- |2 _. Y
游戏重启, 但不重新载入ROM3 h9 {3 f2 Y! w1 t, B
1 f5 V9 A2 R j x/ m4 a* r hardreset v; s! U, q' s1 T/ T# H, ~
游戏重启, 且重新载入ROM
. c" {8 [5 q3 g& w$ X2 P" E
( {! p7 e1 U U; u snap xxx.png
2 E# K4 a8 i( t E7 e; D. _) P! J 截图为xxx.png" e; }7 j" l+ N
! [) z3 d; R5 @' d7 b3 ?9 G* m
" t+ @6 K1 k) ~* p ( Q" K6 b2 e9 O- M
# W* U3 p8 v, n/ P# r$ q6 |% T# x' c热键:
! n3 F/ t2 t' E* Y( H* r" n% I ~ 中断游戏
) R! k" E! L; a; V+ F6 J F5 运行游戏/ `3 S& x& [8 d0 B
F12 运行游戏且隐藏调试窗口0 ^+ `7 L8 a& s- Y0 [2 E
F11 步入, 单步执行, 会进入子程序
4 `( l2 I3 g; e1 B$ @ F10 步过, 单步执行, 不会进入子程序/ `. K, Q/ X$ I2 x5 T3 w B6 d+ ]3 x
Shift+F11 执行到子程序返回
$ I( J- k% b- n% ^' E" O Ctrl+M 内存浏览窗口6 E6 ~7 o1 `* ?. g
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
* y$ C* K+ e6 O2 [$ l) ~. c) V: b9 ~3 S7 a
{:4_94:} $ H p0 I3 G& c- |* F4 E
: H) o6 \' k& q |
评分
-
1
查看全部评分
-
|