|
|
$ |$ X% x; v& R# k/ a9 n9 Q/ f% u
很快速的整理我自己常用的指令
% b h# Z# x, f2 f a" Z! M& x: U$ t' k; i2 ^9 i5 h
{:4_112:} ) @ ~* S7 B& J& k, ~3 P2 |* |
) D7 Q5 b) n b/ |2 M/ ~9 [ S \! J
MAME DEBUG常用指令
% W5 |( D2 c" W$ t {
5 ]4 m5 ?; Q0 d$ C2 d内存搜寻: ci, cn, cl
/ B# }" K" ^" Y, g2 A* c
" R3 K% j9 {* }9 B ci* y+ a; L9 {% i* j& u
搜寻任务初始化, 每次搜寻一开始一定要输入这指令& Z* N1 |2 l1 C {: t4 E
4 b, M" k, i1 r5 R9 ^3 U' L0 D cn+ H! k6 o8 J( ?: V' ]
搜寻指令
, O0 e7 d: S- Z/ v 例子:
/ T, ^* z# p; H cn eq,60
' l: F8 `; |2 {( w/ O 搜寻目标等于60 (十六进制)* u+ z/ }. J$ P9 j/ M6 B. m% q
3 y- ^1 b. U8 B9 K6 u8 a6 M
cn eq,#96/ V H4 C0 a& c+ t" M
搜寻目标等于96 (十进制)
0 q3 v3 R, z7 T1 l0 W
1 u) r% ?# d, x/ ~& g$ T8 h S' } cn eq& ]' U0 {: Z8 x) [2 M
搜寻目标的数值没有变化4 b* N3 i2 C0 L5 a: T
2 i4 a+ Y( q8 r/ `, k1 |4 p cn ne
B0 Z/ P1 C, b' C+ T6 N( m 搜寻目标的数值有变化$ v0 s5 b$ y9 R0 X: O2 E
, G4 ~; A8 L: ^) u/ h( G
cn +5 H3 e* E# o# |- @2 W
搜寻目标的数值增加
0 V" q; r3 m1 G1 A' H3 }9 t
5 q1 B+ A2 M9 l; f! I cn -# R) [7 O( [- l) I4 o/ i" o
搜寻目标的数值减少
; m. f4 f7 l' n
* j' y$ j4 o3 ~8 z: N4 f0 ^: ]8 j cn +,3; f8 y) [- v0 g
搜寻目标的数值增加3 (十六进制). d0 }! K* F- h9 o5 i9 m/ V
/ Z& a5 `+ h( G" |1 s# ]
cl8 f, l( ?7 [* j. Z
列出所有搜寻结果
$ k& j# V# z- L. c0 t8 u1 p
& K6 Q- j: h* V8 M$ b/ p cl xxx.txt
' i1 D* U6 N5 { 输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式6 d/ L$ K, ]( }7 D0 l5 }
+ G( C4 Y+ d* X% z7 p, ]+ C
8 M- z; e1 v m1 A内存监视点指令: wp, wplist, wpclear
& x7 d, A# P A6 d0 v 例子:% P. | |2 ~( M0 F, z
wp 1234,1,r
- ?& ^8 P) E, p% o1 ^8 o 在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1/ C j0 C! l5 t- K7 g
- X+ S2 ?+ ^: k wp 1234,2,w
4 s+ }2 L5 [' R' B 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2
3 k5 A6 r/ Z4 X
2 d$ r) T: H ^" h! W; G0 ]' N wp 1234,6,rw
3 e, Q% v+ [" z. k' o) R, Y" S 在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6
5 n5 X% T7 j( M" B3 g& `7 F$ ~$ W" d( R" {- }9 M, `# ?
wp 23456,a,w,wpdata == 1
- |3 ^- Y6 }8 J- g 在地址1234下写入监视点, 数据长度a, 且写入的数据等于1
9 I# v' O u# k, w2 S; I2 P
. i# E; [/ w2 v b wplist
) P8 q$ w( t$ y6 a- c9 } 列出所有监视点( t, o/ W1 J, S7 y/ N
) h0 K: \' g' o* L0 u+ r wpclear 3
9 [1 \% C5 K* K6 U5 P 删除编号3的监视点- q8 }, |7 V9 s$ E
9 J8 J' b; G& }& H! p
wpclear
+ l- _5 R \* @: W+ v 删除所有监视点2 L- t( P+ A' D, ?' k8 x
) m9 b; Q, T. E3 J. z
$ |& L0 x8 B1 d5 g9 X% X
: G, p% r" k' ]8 [( g4 A程序断点指令: bp, bplist, bpclear
- B9 X1 i/ b F. s& q* N 例子:
' V+ ]' ]3 K8 F% Z' D bp 1234# g! I8 b( f4 n" R5 y/ |1 O
在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断
8 R! p' L4 w* k5 j3 X) a
, p% M( K1 r0 {; H# i& I2 d bp 23456,a0 == 0 && a1 == 05 l: F q3 Y- P( [! X
在地址23456下断, 且中断条件为a0等于0以及a1等于0
! P* |+ x8 w9 m2 @9 P( |
9 [9 c# F* L9 B; @8 c# w9 K8 r0 l bplist) a# b3 j6 L6 u1 }$ E
列出所有断点# w) j# G \( W# K3 |* d+ ^
- s* x. M4 C8 a5 e: ?
bpclear 35 M" r1 |; R9 D% e7 R& S" |
删除编号3的断点) X. y0 j! l, f( f t
8 c* J5 |' u# m# C
bpclear4 ] u! h6 K; m& o$ h
删除所有断点
. U( u, m3 Q0 I6 _$ ~/ ~& M R& v% J q/ H1 P4 [- K$ b" F8 s: v
7 s" ?/ B& d6 H A' e ; p& u2 ]( M8 Y( s+ N2 W
跟蹤紀錄指令: trace
( F5 X3 @* I9 {. E 例子:
/ m- M- K* R& |9 T trace 01.txt" w; N C2 d1 R# f8 S `
跟踪当前CPU运行的所有代码, 输出至文件01.txt: D1 I: {% N4 t$ s
& D l7 C9 |$ V e9 w$ L trace off) F$ l( F: v% ]* f$ Z$ m/ k( e5 I
停止跟踪, 并且关闭文件
4 p: H3 `( j, D7 n3 D9 R1 K; k' v, f; E# ]
trace 01.txt,0, m8 w& C* h" ~7 c7 {3 M
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
& {8 X1 q6 i, D: |0 j
( I. | B. p5 g. m! @ trace off,0# }$ B( O% u2 |9 {/ [3 k7 g9 C
停止跟踪编号为0的CPU, 并且关闭文件8 y& x) |$ p5 Z
( k7 h3 F6 r5 [( q) d' [ trace 01.txt,0,{tracelog "A=%02X ",a}
4 T8 P' m; M9 i! v 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
, M/ G( E* S2 c 并且在每一行的前面, 写上"A=a "
( y/ {% X- `; s' \ j1 t4 {% k "A=%02X ",a为一个C语言printf函数常用的输出格式& T; k& D2 T/ A4 k
意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入8 s$ p2 l8 a8 n
X表示为大写十六进制数& z8 }' u3 u& c; Y# V( o5 t
. E9 y9 B( M! E6 }
7 {' V- F6 b6 r, V* H. A2 d8 ~; _
6 p- a! C9 X# e8 ?% \* G5 R! ]内存直接写入指令: maincpu
? ~. t1 ^ ] 格式为 maincpu.[][]@地址=数据" [8 ^* Y- y6 G- O0 C s4 H* E# J
第一个[]:
& K" h+ m& e; J& a- W2 u6 ^5 X o 表示ROM地址( M8 l0 ~/ d" p
p 表示RAM地址
: ~2 z& z# x( s. G" E$ Z9 ?- @$ ]4 o5 a, p
第二个[]:
* M/ r2 o4 Y- K2 n+ y1 J. z d 表示4字节
|4 K& R! m6 l6 c8 Y- I w 表示2字节
, ]$ I7 X: n0 P2 V) O2 | b 表示1字节
$ o% d1 O" e9 m0 q! K, E
) ]0 F( b; C- c- D- |# B6 ^8 i+ e# l 例子:
4 T2 n: G) W0 N; q" j, s3 W maincpu.ob@1234=FF* U3 i5 R5 _: Y8 C: B% Q0 Y1 E( I
在ROM地址1234处, 写入FF一个字节
, a' ~& b/ n5 {/ c* F4 w( Z# h& j
: G& R% w u6 t7 m1 Z( O+ p maincpu.ow@1234=4E71+ r: ~' D: L3 v7 Q" j: L4 h& [* |
在ROM地址1234处, 写入4E 71两个字节# C! U. C4 M0 `) m
0 p) i) e: Z* h, P7 [9 a
maincpu.od@1234=600A4E71/ R! w/ C& x! ~9 }$ T- {
在ROM地址1234处, 写入60 0A 4E 71四个字节; ~7 L/ ^8 f2 H" J* c* M6 h8 n& V
( t+ F0 h2 J1 V! `! `( t
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
1 [2 p3 u) U- z/ B
' i' ]* C3 T" l' c# a" K( [$ Q, b; S" T& i- Y% K, n
其他:
+ Q0 o+ V: H( J& f# ]& h dasm 输出档案名,地址,长度9 b& C7 u0 y: k3 Y/ Z
输出程序的反汇编代码
8 a- X! k i) f! g2 w 例子:' @: B, K: f" l, j
dasm 01.txt,0,100000" B1 v( J5 M1 R' g0 z
将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt
( _- }+ M4 r( x
9 U0 @4 W1 B7 X2 _2 P6 R softreset
7 i Z8 \. R N0 l/ F( X0 ? 游戏重启, 但不重新载入ROM
* i7 e! U9 o: |" G0 p, {* e8 G' Y. x
hardreset
. R. H* O" P2 C' ~9 } 游戏重启, 且重新载入ROM* {8 @7 S ~ O' d0 F- i0 a3 t
; p- Z6 @% a- W8 G, Q: J+ D snap xxx.png
/ P# e# M" ?: m* i$ z6 F' W' s 截图为xxx.png2 ?, D' ]* ?, ?9 i
/ H! y5 G8 h( v/ F$ ]; v5 N
. o! e' J8 g" U- \8 N7 H - z! t: R+ W% ^# f0 b4 ~
6 z" z$ N2 v# `5 N( v( _$ G7 K! H. k) y热键:) f5 Q& [1 Z; v! d
~ 中断游戏/ I2 J: g. F2 k$ O
F5 运行游戏
' o1 o' f' N4 p: Z F12 运行游戏且隐藏调试窗口
5 j4 Y$ C$ j! r% m1 k7 V2 @6 G F11 步入, 单步执行, 会进入子程序1 ~. P& q, M6 r f9 K
F10 步过, 单步执行, 不会进入子程序3 W( B! Z; ^" e+ `5 K% {* N
Shift+F11 执行到子程序返回
0 Q3 ]8 r( K" _1 \ u Ctrl+M 内存浏览窗口* _; w r; z$ [1 d& p* x: \! q2 a" T
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
. L$ Z# ~ f9 j5 l
; A' a$ h$ F3 ~, Z1 a+ S{:4_94:}
7 k4 V0 V! D, b$ C* y9 \1 Q5 L" N+ V: l- {9 C: g( V3 q" K
|
评分
-
1
查看全部评分
-
|