|
|
; W+ Y4 m/ t' \: t& g* e
很快速的整理我自己常用的指令
6 b& h5 G+ W. ^& g5 b' x0 c1 y- p7 `7 p5 z! O& J" c
{:4_112:} 6 \: m) s8 X) A5 j, A7 K0 e5 m
+ T. p! x9 o5 y2 o2 e! `MAME DEBUG常用指令5 @8 u$ H; ?$ P: {
; y* o: D8 i% g( P( ~内存搜寻: ci, cn, cl
9 }$ A* E* J! }0 Y/ ]; B A# \& M; o: X
2 R5 T' i$ n! ` o/ P( b/ ?. } ci) s: a0 _7 P* n4 v# b
搜寻任务初始化, 每次搜寻一开始一定要输入这指令
0 Z& r1 c' G1 ]+ a
3 v9 m0 f5 S3 f! V1 V cn/ a% R7 ` C- [6 ^) O! l
搜寻指令( M" o, ^* f* h+ t% @# I# ~0 S
例子:& }4 ]; P5 d( c
cn eq,60 z3 F& G5 M7 Y# K
搜寻目标等于60 (十六进制)1 `& E F, k8 S" Z( i" K
$ c( {8 |: I m+ j
cn eq,#969 a- U; \ n- N' i3 f7 \0 O4 b5 N/ i2 O+ r
搜寻目标等于96 (十进制)
( F5 ?! g6 q: W6 F: n$ Z2 |( a" ~! W3 s0 x# d
cn eq/ b, j/ u' T( J
搜寻目标的数值没有变化* g) P! X' l5 I3 `) k! H$ t
, \. i s- \9 L3 E8 r3 z O cn ne
! {. ?4 O% t7 Q! f d1 _0 ~ 搜寻目标的数值有变化
6 i" H+ w# X# R& V5 { " a9 Z4 }+ R% @4 `* d+ q
cn +
. T4 l2 e# e9 F# y& J5 j: L 搜寻目标的数值增加# O4 A6 @" N) | i9 U; `
6 n* d7 J8 P0 w8 G0 @: U0 X cn -
; P, g' \+ B, M0 K/ |- S7 `& G3 ^ 搜寻目标的数值减少# O0 h: p( W& D& F
9 M$ @) E/ N! r4 J1 ]8 H) ~ cn +,31 h2 P3 t# S" F" r" c
搜寻目标的数值增加3 (十六进制)
- Z, e3 b& l7 @
9 d v% G9 |$ ^( Z! N5 L! u cl
: b; `6 | j5 y- | 列出所有搜寻结果- Z; H: ?/ N6 X0 F1 G3 c
4 l4 Q# u- P5 l0 m# _& `8 `) q
cl xxx.txt
4 |5 C9 D2 k8 K" |% ?' B" ^ 输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式
& n$ e: Z, K# E) b6 X& w
" Z2 |5 M: @! g. d7 d0 T6 U. S" e
) v$ A w" G+ g, H3 E* B7 b+ }内存监视点指令: wp, wplist, wpclear* b" X4 B% U. g( q# K
例子:; S# q7 N) l6 n+ r
wp 1234,1,r
: u* ]6 G+ Z1 ` 在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1% M [; a9 d! r/ B& c0 y
J2 C7 b: T) t l) W& K
wp 1234,2,w
0 n/ x9 F" V" P& K, O 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2
2 B2 `9 n; M* R9 W+ N( F
E5 T6 X, s, K* I; } wp 1234,6,rw
1 }8 N* k; Y9 [" I 在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6
0 N; R8 c5 Q5 u, H" T& p/ \( U( n" c( `7 d
wp 23456,a,w,wpdata == 1! k7 R. I- Z# \9 R7 Q
在地址1234下写入监视点, 数据长度a, 且写入的数据等于1; w" j9 d4 J. r
h, T7 o" K! W5 R5 J: Q wplist
0 R/ [7 D) x& ]. E% @$ Y d A 列出所有监视点# G" q- N) s! J! k# r& p6 f
& M2 m$ B# R# E/ F" P) j
wpclear 3$ ?; z% R, f" C+ H3 S3 u3 b1 i$ C$ h
删除编号3的监视点
% I0 s" \3 I0 {$ S: E8 Y
; g6 Y* |9 L( C4 m& U wpclear
2 {: ]* v1 L, u: e- e% u2 ` 删除所有监视点 }3 v) Z4 z/ A5 x+ i2 s. o
0 z' y1 c+ d: I6 h! `! A/ g7 {3 \
5 c) d; m' U. c9 c% y$ u
+ k& s0 i; z, s9 y- |/ S程序断点指令: bp, bplist, bpclear3 j6 K3 e, v# G: u# e: k6 W& w2 C6 E
例子:
3 E- G- A& @9 m2 S bp 1234
. @" J% m0 Q& d6 w; P 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断# @, _( D, u5 {' \: Z7 H$ Z
3 Z2 N' C1 x3 m# U bp 23456,a0 == 0 && a1 == 0' A5 z% g$ H- b
在地址23456下断, 且中断条件为a0等于0以及a1等于0
. v* l8 x Q- X2 K; Q1 j8 U. h2 G9 [4 [9 s; D" \2 E
bplist# G7 @+ ]2 P) R: u
列出所有断点7 Z; Q8 b7 Z: Z
( n) T6 {6 ~3 e8 f) ~1 z( ~
bpclear 35 B) D7 k5 j1 _* p/ _4 h
删除编号3的断点
, F! G$ C4 G" v9 N8 x& A( \3 e
% I, ]) \! ^7 e6 B9 a! T4 Z bpclear% N5 c8 b4 b9 k: _: c
删除所有断点
7 n o1 E" n1 I6 W& J& `- K( F5 y) a E- P
) ?# d1 R1 ^0 U, H; L
( e8 j; W" D6 _跟蹤紀錄指令: trace
) U1 u# I& R" d, ` 例子:& t$ v9 i8 x7 r) f# T
trace 01.txt
- s+ q @. i& s: _ 跟踪当前CPU运行的所有代码, 输出至文件01.txt8 e4 Z! E1 |) u' [1 C. d
r' z! l2 @/ r4 _
trace off
% \7 `0 G W5 q; m( _' G 停止跟踪, 并且关闭文件
f3 i9 E p: \: J# I E- R, P- A, ~
trace 01.txt,01 ]3 j( m) J: Y
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
0 }. j7 r" E: z; X0 S& d" k9 Z' S5 n# X g
trace off,0
% V8 M% [' m# b 停止跟踪编号为0的CPU, 并且关闭文件
6 s: l2 Y( H3 |7 S5 `) o* e# k4 C3 ~: C3 B- b L
trace 01.txt,0,{tracelog "A=%02X ",a}
. o1 W% ^$ _" E$ @! b, n2 Q- T 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
5 r" X$ n4 ~ G4 k* f 并且在每一行的前面, 写上"A=a "2 d0 w) ~5 b( o) B6 D. f; }$ W
"A=%02X ",a为一个C语言printf函数常用的输出格式2 m, E7 L: q! Z& d+ l- M; r# M7 B2 g
意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入/ J: V8 \) _& |. i" F
X表示为大写十六进制数; E9 ]4 h- _6 P8 V
* `8 K- ]3 z- _6 G2 ? i4 H T
0 \3 }+ f! o$ N0 ~/ m
4 U. S# E, f8 S* S" k h# w内存直接写入指令: maincpu/ ~" @: r8 w/ m! E9 u
格式为 maincpu.[][]@地址=数据0 R1 u7 ^- B5 g3 o9 U( {1 g
第一个[]:. f+ S! X. W& d4 X- U. E
o 表示ROM地址8 r6 x' p/ m: g3 l, T7 e
p 表示RAM地址* O9 g1 y2 e. H" F0 ?# N: o! J
" R$ R# h0 W7 R% N9 K5 ], f6 Z
第二个[]:% j# R! N- I& k# C
d 表示4字节) G0 b; x8 d6 [# j( e
w 表示2字节
, w1 o/ _7 ]% M3 m. n) @ b 表示1字节
! P1 s- q: I x7 p. t1 \7 d2 Q. x4 M3 z
例子:/ E+ Z0 m9 }6 `0 K) ?9 C6 U
maincpu.ob@1234=FF
, j" p" D* P9 i3 k3 O 在ROM地址1234处, 写入FF一个字节
! O. W0 A$ O0 `& x0 }9 }. N0 I! @/ p" ^! E
maincpu.ow@1234=4E71- m: v) N1 C+ ^
在ROM地址1234处, 写入4E 71两个字节
! [+ e2 }6 y2 Y. J/ m* X& P1 p' l1 ]" b- Z+ x* e
maincpu.od@1234=600A4E71! D. N4 o. C+ k0 Y/ Z8 {
在ROM地址1234处, 写入60 0A 4E 71四个字节
" r0 C2 q1 P8 A' o8 B! n) \6 U5 m& s! Y" P% J# D* t
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
3 w7 v0 h1 K. B! V ~3 ^ / ` ? ~& ^! S+ @. W: |' R4 @
) N8 I! v+ d* v$ y其他:
7 C6 g1 b! T* P1 \ dasm 输出档案名,地址,长度' T6 d) t8 l% g0 a3 q& r
输出程序的反汇编代码
$ q0 `- O! M( \# H: G c 例子:+ j; Y% D4 r, F, Q+ E) T2 S
dasm 01.txt,0,1000001 L" M' _/ M4 K) U0 e
将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt* N* J* j# k( }" n- i9 J/ v
! @+ f9 l" R' D5 {, X, V: K5 s/ L softreset; N3 g8 G8 Y7 H9 S) \6 V9 x
游戏重启, 但不重新载入ROM
; K3 C' h% p U" P
. }" u& Y+ e, V8 c( X( D4 O8 [; g hardreset$ i3 s: c1 U* o. F3 v% e
游戏重启, 且重新载入ROM
* @ [ B: z5 {- ]: q7 Y; E5 W O8 \% Y0 n* [
snap xxx.png
* R. X, g3 k. F 截图为xxx.png# }! ~ B# V9 c+ @ z- W
0 x; x+ ?6 {/ @0 J
7 G) v1 ^$ k; ~- s6 q g8 w1 ?; O- M2 h8 ~# W& ^
/ }7 ^2 N4 N: ~. ]) K# J( }+ Y1 A* {1 J热键:2 O8 y, ?! j$ O8 L
~ 中断游戏! Z4 z5 a# q7 _7 z
F5 运行游戏
- T3 a- q4 C1 K8 W$ c' i F12 运行游戏且隐藏调试窗口: o, T- N0 ~) D- }. U$ z
F11 步入, 单步执行, 会进入子程序
: a h3 M& u; |1 r3 }5 l F10 步过, 单步执行, 不会进入子程序
! |7 a& r5 E e4 l Shift+F11 执行到子程序返回
+ G! x. x; U/ z+ `& f7 u C) C1 f5 O6 i Ctrl+M 内存浏览窗口# x7 C9 D" s5 W f
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU {) L, h5 H+ D, [6 q- y% H
2 a8 ]0 D( v9 u. s( C
{:4_94:} , k* u, |8 m W
3 k2 U. R" f( _$ f# w
|
评分
-
1
查看全部评分
-
|