|
|
* E' J( K! L4 P z* c很快速的整理我自己常用的指令6 C. j1 i( O% n6 l( v: D, D
$ T/ h! R. l3 F, t6 W2 t+ T t{:4_112:} & P0 O( [" ^' Z# B9 _, k x
! D9 e3 P3 l- P( }4 E: Q: \
MAME DEBUG常用指令
, j9 ]) f/ O" W0 y1 E R9 A
5 \/ r2 Y* S# I) D内存搜寻: ci, cn, cl
/ Q5 L! ^: I/ t3 x* s4 l
1 y2 l, `8 j, F9 j ci
: }' z* ^& J: r 搜寻任务初始化, 每次搜寻一开始一定要输入这指令
6 C2 t7 \2 g3 O9 }& {. |+ b4 z2 R _& o( s1 V" i
cn# }8 Q. p1 z! _5 v! |, l
搜寻指令
* B# v, C8 S* H 例子:
/ l) y0 h6 p/ T/ ~- Y7 w9 l cn eq,604 c; z6 a* d+ {% Y
搜寻目标等于60 (十六进制)
& x* h% V* v/ M. T# k: y6 i# h 5 I* U# i/ H- S
cn eq,#96
0 D1 L3 ?6 t9 h( E& z: R 搜寻目标等于96 (十进制)
1 v0 ?6 d9 Y/ ?& K R1 k6 V3 p( N/ Z; ~# d* u: B3 F! [
cn eq
1 q% G- @: w$ d/ |0 z3 V 搜寻目标的数值没有变化# k$ d/ M9 p- o3 H2 I3 P
- D8 R2 M" _0 m1 l, y$ C cn ne
$ R1 e0 S( G' r% W, S& R 搜寻目标的数值有变化% o$ S: _' V# J# ~
) j' t; P. N+ D" a& \: D cn +
) \5 g1 j/ |: D1 o1 n* R8 c" i 搜寻目标的数值增加
+ U M0 l- t5 E9 T8 X# } : d. J% z. @& N# |
cn -9 b9 {: P2 C' [7 [: B# }/ C
搜寻目标的数值减少& ?: }2 a" g8 G# @* z3 s& b# Y2 ^' M
1 F1 j. C* X- b
cn +,3, u* B; F9 P* E2 f
搜寻目标的数值增加3 (十六进制)
0 E4 D, E; N& P9 E. ~4 y1 T5 o; i/ d9 u8 z/ j8 \
cl% Y) D: Y7 Y, A
列出所有搜寻结果
8 _" _0 ]$ b9 k( @8 O* l' V- t& j' ^6 f6 Z
cl xxx.txt: r' [& g0 H1 m; l! {' h
输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式+ _& N# ]8 h+ u4 K' a
2 R/ B; Z! b% }! @4 K7 g$ \5 H
; r3 p# ~ F- Z) G5 H
内存监视点指令: wp, wplist, wpclear& l n e5 M+ U+ U8 L" K1 ` D
例子:
( \* t r7 h4 z wp 1234,1,r8 X4 j3 U- r7 D; G* a) x: b
在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1
, P- @% I: ~, P& @
; K9 T) ]8 h/ c5 P0 I wp 1234,2,w
8 X9 O7 i4 l5 }5 n8 C6 ^ 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2
5 D; Q$ I. j' y F0 J# |( D8 A
) h* S- `0 b1 H6 p wp 1234,6,rw
2 z4 T8 G8 \7 u. E; r' t8 \ 在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6! x( i/ q: ]( b! T( G; \. \
. O4 ^# I# k& V+ I+ i4 m! I% o wp 23456,a,w,wpdata == 1
: z/ \, ~# f' `4 `2 k6 ` 在地址1234下写入监视点, 数据长度a, 且写入的数据等于1
- p& i& F" v- P* Q3 Q, H3 s7 Y: o# E" }3 V" O& T+ c
wplist
8 i. \2 U, r$ s" \, C& K, A 列出所有监视点1 F+ p8 O2 A5 X5 |; Y
' r) E1 x, L8 ~2 M0 L7 d' B
wpclear 3
5 {7 k- `3 B/ u& a+ A9 A 删除编号3的监视点
6 {) u/ \8 T# t+ I* _, k9 o$ O, J0 p* j
wpclear
4 F/ r: O$ {8 V0 r% J; X 删除所有监视点
% R. ~4 r: m5 }/ {2 B2 B" z* L, f4 a& ^, d
3 Y" q: q; o5 c) M6 M
. {& l& i) `% G- @9 z7 c9 Z
程序断点指令: bp, bplist, bpclear
3 z$ B3 |- q/ ], X4 m `7 r" ? ? 例子:
+ P" U4 W" g7 s& Y/ P" P bp 1234
1 F9 f. }# \1 k9 [ 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断: ~* t5 P/ `8 e0 F
6 b7 \+ Y4 t" {( L4 H3 X. p. R) w bp 23456,a0 == 0 && a1 == 0
+ N2 Y$ C. M) z K B 在地址23456下断, 且中断条件为a0等于0以及a1等于0* A: C7 X* g" e, T; V) p5 U" M
0 [/ s( R3 L5 J
bplist
! H C7 O% d/ Q: Y0 ? 列出所有断点
) o7 [) E, _0 M6 a: u. A; p8 l! k* K' \# K
bpclear 31 V$ Y/ R; ~) Q: h8 I/ ^: L# Q
删除编号3的断点( C- V- U8 q1 @. V; O! L! `
# l) K) j0 r* I: U: d8 K7 n
bpclear
7 }& v T' a4 L% k) z5 s: [. V 删除所有断点2 z4 y% x2 t% R4 @: m" }0 D
9 f, M4 j4 p$ ~( u: w5 c' V
# ~* {- m# l) A2 h: [% e; h
% w7 b' P9 Q$ K5 Y3 g: C
跟蹤紀錄指令: trace' Q4 C: H- G9 ]
例子:5 f1 d& _! f$ |8 x( ~
trace 01.txt
N/ |; G3 t8 c( v 跟踪当前CPU运行的所有代码, 输出至文件01.txt
/ ` G1 }" D5 M4 w# x$ e6 I* g- `. i
C: a/ O( W8 H trace off
/ [4 S5 Q7 Q; [( ~9 ? d7 X/ h 停止跟踪, 并且关闭文件
! d9 }# H: ]3 J" R+ r3 J
8 j8 }; r$ L* K" X8 V# n trace 01.txt,0 {8 c% a+ ^& S( @; {
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt0 d: s. L4 c! q4 t
) F3 c( O) E) R6 d0 z0 T1 K# t( Z
trace off,0/ n; p( v/ |, L: ~/ t h6 C
停止跟踪编号为0的CPU, 并且关闭文件
( a4 G. P: Y" V+ S X% U) y# I( ]7 ^8 R: n2 p% u p
trace 01.txt,0,{tracelog "A=%02X ",a}
" ], z( P( m1 {( b$ }) V4 F& h7 q 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt b2 v1 c) d' d1 S2 V. K$ B
并且在每一行的前面, 写上"A=a "
7 p8 R5 r" |9 |+ a "A=%02X ",a为一个C语言printf函数常用的输出格式
/ I4 L) F+ k0 z% Z! J- l 意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入
+ H6 m1 }4 I7 ~9 _/ T2 s7 v X表示为大写十六进制数4 H n# m4 Z1 N
+ m$ Z3 z4 t0 h
& E; b- L) j3 B8 A5 _" Z8 V
/ T- l3 r; G( `内存直接写入指令: maincpu3 [7 D+ o* `9 f; p* s
格式为 maincpu.[][]@地址=数据
4 e% U1 O! S/ p: [# X 第一个[]:' f2 P! |* z# f- G! Y6 X
o 表示ROM地址5 W. e/ H$ }0 |6 I" O
p 表示RAM地址
3 d# x' i9 N% v! S" @* I
4 a6 b p9 c5 {, j7 `: C: C$ P4 n 第二个[]:/ Y6 M* V9 C* j/ W
d 表示4字节
/ z$ Y7 W' A0 S* u' z w 表示2字节
' d" ~. g/ q8 M2 }# o2 D4 W9 R9 M b 表示1字节
. ?3 d) D, ?/ b9 W2 z" j9 _+ a' r
例子:
1 W$ W# U: d! [2 J, o" v maincpu.ob@1234=FF& S) K" V3 Z0 O+ {' |
在ROM地址1234处, 写入FF一个字节. N# k+ `+ S# A& s
& H. H8 B! @& Z) w1 h maincpu.ow@1234=4E71
! [4 x: ?; Z4 T9 Q& n: d 在ROM地址1234处, 写入4E 71两个字节
$ |+ ^' |8 y4 n/ Q% `% [
, l0 G; Q% F3 [4 W/ q, `; }; u4 h maincpu.od@1234=600A4E71
V: X) {* v+ P0 @& r4 t 在ROM地址1234处, 写入60 0A 4E 71四个字节7 ]0 d# y; }/ |: U
$ Y; j/ A2 d/ q. d2 U; O( v* W8 M
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
; ]7 U7 Q1 O* t6 u3 e
* o- n6 j& J/ ?4 D3 `9 i5 Y3 w) h
其他:4 Z4 K n G" t Z! R
dasm 输出档案名,地址,长度. n" y& V% A* {
输出程序的反汇编代码+ ?* K. n/ d( z0 d: V
例子:
6 m' L9 H2 L8 H2 |6 {$ N! _ dasm 01.txt,0,100000& G; g& n( x) B& J( J: _
将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt. F# A9 B4 U: @, O; X; D
1 j& X# X2 x- ]1 P6 F. m) C" b
softreset5 k5 ^$ u0 R) d
游戏重启, 但不重新载入ROM8 S5 J* y3 v* ~: d, \+ {- ]- i
4 l; ~7 Z+ F3 l/ U( u hardreset# G8 b* C$ l. P4 k# w: f
游戏重启, 且重新载入ROM
* P" ?/ V# `# d" A. K( w: W
" d6 g: q' P d- c# ^* t0 | snap xxx.png* v8 w4 f u. Q6 D: @2 l
截图为xxx.png$ ]" V# {. W, Z9 }& z! E$ q: T
( \$ i+ r n" y) k! ?
$ ~) m7 n" T& l' v. E' h
0 `4 r# r7 z d5 A
w8 N1 R/ O/ [5 L热键:4 v6 o* [/ K3 Z
~ 中断游戏& z- K6 D- C( G! H
F5 运行游戏
( K8 N7 f) m: k! y& z) A: I; |, D F12 运行游戏且隐藏调试窗口
2 l! g, a8 U! c2 l& D& {) }5 |$ u5 j F11 步入, 单步执行, 会进入子程序
( O9 n8 S3 Q ` F10 步过, 单步执行, 不会进入子程序
" k* v6 V2 ?! o& a Shift+F11 执行到子程序返回
' N$ q, t9 C5 G+ z. i Ctrl+M 内存浏览窗口
g0 V. e+ L% S6 X' x F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
8 g& r* D9 t. I# Y+ W- T( R. s% }8 f/ k/ C
{:4_94:} 9 r4 ^/ H" U$ h: |4 K# T/ V
1 R% E, }: k, B% m7 W
|
评分
-
1
查看全部评分
-
|