|
|
: o' s7 T$ c' S6 K6 D6 o6 g+ F很快速的整理我自己常用的指令8 T4 p: b9 ]7 V' \# q6 T! `
9 x9 Z! b @. J7 _ O% j5 C; L
{:4_112:} 1 E- i! `/ q- l
' u2 Q+ n1 X: \$ D m( h; w- j
MAME DEBUG常用指令
! k) Y! U4 q% M, o3 ?" y
$ G1 l2 G2 ]& c内存搜寻: ci, cn, cl
5 o, T0 U9 |* W) n
; B( S2 Z2 h# G; y- A ci
" _' M4 D0 p* K" z: O0 J 搜寻任务初始化, 每次搜寻一开始一定要输入这指令
3 K4 x9 J9 z$ g! n3 J* _* G. C/ z: \
cn
- K5 f& v) ~; y; v1 f3 ]- a 搜寻指令4 ^+ E/ G( V8 {4 O
例子:
P9 l: N; V( a0 S0 H cn eq,603 c! x; I$ ]! n/ C1 T! h0 _" L$ E7 ?5 C
搜寻目标等于60 (十六进制)
; q0 |/ r7 k E/ o# E- e- G 6 a! p. l# i2 ]% A P
cn eq,#96
# A- _" o _9 |7 \ 搜寻目标等于96 (十进制)" a, r1 d. ]4 [0 `7 \# k' Z- j
3 {+ S* g8 d8 ~4 f" Y' b8 q5 z cn eq
c5 k8 w; D9 u. s1 j' Y" R4 ` 搜寻目标的数值没有变化1 h2 F" g% s. N1 c: L9 C+ p$ e1 m
, b) U1 U h$ i5 F
cn ne6 A+ V* A G. u4 M+ k( u% o; `
搜寻目标的数值有变化9 J6 B; l1 t; {1 L: w- B. A
2 ~8 D' ^. [; m6 p4 r U cn +
6 k9 K- _( j0 | 搜寻目标的数值增加
2 a3 E2 T, ^8 `) m n9 W: h) M2 z! @
* [' ~% a7 O% T8 V cn -( A' u0 s! L# i. B' W, @3 g9 [
搜寻目标的数值减少( {8 e. }) {/ q$ D0 ]7 G; ?8 }
1 h5 W; y) e o3 W9 v
cn +,3/ i. O' s7 S" _; l& f8 D0 C. B4 o* @
搜寻目标的数值增加3 (十六进制)
8 i( R) b5 a5 s) g( m0 j
* ^; `! [/ o9 ^" B/ l& h1 P# u cl
& t5 }' o# d6 u" Z5 I 列出所有搜寻结果
- ]1 E+ Y( t6 U3 q" S( b
4 w( q1 b: S# \ cl xxx.txt
4 d7 G, K2 r* U/ Z F 输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式5 z3 r& \# t7 @4 y2 G1 z$ G; b
. R" L6 O& w7 P' u
. L. o; g3 A: V0 ~. _/ b+ A' {0 t, r
内存监视点指令: wp, wplist, wpclear
% _" c3 R" U( @' \ 例子:& W& U) x- o# _7 R- @
wp 1234,1,r) |3 O9 j6 F* X1 ]6 x
在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1
4 N* o5 W7 h8 j$ x- _- N- n1 n) O- `# x, b- [. A9 C# L
wp 1234,2,w
7 m" f/ d0 e- I) I2 K 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2
k# l. R$ p" N b; g, i+ \- ~5 o
' M% m' Q! f$ S; v9 N+ N2 e wp 1234,6,rw' z6 Q# I* g1 }$ k
在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6 a1 c1 P8 k, T$ T& a
# |) b$ u3 T8 {* e$ ?
wp 23456,a,w,wpdata == 1
- e. [0 {0 P, T' l- ` 在地址1234下写入监视点, 数据长度a, 且写入的数据等于1
( H+ W" I: U/ u6 Z2 N% m/ }5 Z" Q' K+ T8 j7 `5 J. @: j8 e3 w
wplist
1 y6 w+ D( c7 V2 q2 ^* O( W0 |9 J. O0 S 列出所有监视点
5 [+ A) O) V9 s
* C' I/ l1 |) k; u; o wpclear 39 H; K1 { x" I5 K w+ \
删除编号3的监视点; G- |$ ^4 {" K* ?- @
) z( q5 L) h* F1 `
wpclear
- L2 `& _/ X3 q. q4 D 删除所有监视点
* {' e; k9 A# _3 ]% F) s4 `$ l0 t a2 O( g* {# c: m
- f- y E; e% o) q3 i& k
4 ^6 J8 D# w2 X: Q7 L( c0 G) s! k
程序断点指令: bp, bplist, bpclear
5 S" J/ ~# \' `% _2 J7 s- Q 例子:
; a3 Z- O' \% h# S bp 1234' z ^/ ~0 t/ _. m6 P& d
在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断
! q; _- o4 F# {& x# `5 ?
- P" y5 t. }/ W D5 d, M bp 23456,a0 == 0 && a1 == 0# R- t+ G4 F$ U( D0 q
在地址23456下断, 且中断条件为a0等于0以及a1等于0+ c* g# u, q: o' v& P
9 \+ }4 t/ y! o- d$ f+ r- B bplist4 H6 g C( Q5 I2 P. I/ I X
列出所有断点
U. |0 S4 U# [- j/ L) @! i) ?& y" p5 y2 \, a
bpclear 3
( q1 S2 v8 L. [# M5 M2 b 删除编号3的断点
. j$ {$ n4 x& u0 J
* Z& H. M1 Z3 L: T/ L, L; @ bpclear
G6 C- f$ \( U1 t3 K 删除所有断点2 A8 w% q& V$ C$ Q+ ^0 f: q
# V' o4 u- K* ]. [% A, S
" S! d2 g* D9 U/ u, } ) D( |) k, }# B/ l$ U& I
跟蹤紀錄指令: trace4 `8 a* h$ ?0 m7 C# L8 x
例子:
' k1 n+ r" _; H- R* P trace 01.txt
8 ^- }* _2 {+ H0 _ 跟踪当前CPU运行的所有代码, 输出至文件01.txt
8 w* N8 M$ L, A* y! e
/ G! d' v$ Z& J. c trace off
. u( [1 L: Z$ T) I. d 停止跟踪, 并且关闭文件
q8 N: O4 y3 w% A/ k/ s
. D2 I" Q7 P4 s3 O/ q6 `8 C trace 01.txt,0$ m' T u) s5 M6 y
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt3 l1 c3 j! ], S
6 H" k1 O) [* m3 t% I4 w; w9 X& O( {
trace off,0
7 n/ |0 \ S/ B) F- [ 停止跟踪编号为0的CPU, 并且关闭文件
* f& g* K5 p" O: m8 q1 r! Q8 {1 b$ O* o1 Z8 d
trace 01.txt,0,{tracelog "A=%02X ",a}
9 y2 w- y% n! m, D; i$ |6 l' X- Y 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
0 i/ t+ n" h, n 并且在每一行的前面, 写上"A=a "
& ~: ? r3 I' S# [* I" X) L5 b "A=%02X ",a为一个C语言printf函数常用的输出格式: ^3 i% C% `3 N4 t6 s7 g
意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入* S6 s: f$ I. K! j% k5 K5 f
X表示为大写十六进制数
* I( F: F6 l8 j$ d" N B, ^- \2 M' n4 u/ ?0 H! f- F" E' T
! v6 _+ _% n% G3 ^ [
b/ N# ]2 b% N3 Z+ H+ D内存直接写入指令: maincpu q$ Q( j( I0 L, z) g7 T s( f. h0 J
格式为 maincpu.[][]@地址=数据
/ @ y, ~2 l+ e 第一个[]:0 c+ @" Q l* N( x3 t8 N* I8 n' T6 P
o 表示ROM地址
( f' E4 `+ }$ @/ Y1 s) H p 表示RAM地址
3 e( K$ g2 j, y7 r* Q! H7 o { ?7 r* f# t
第二个[]:' r( j& W0 ^; @- ?; Y
d 表示4字节1 t* K% O- {' y
w 表示2字节
2 k0 S1 v- o$ x, X: D- X; ] b 表示1字节
& O% }0 g+ l9 B" n: U# J% g6 f$ }8 s+ f, {1 w0 i$ E
例子:
L: V0 P1 R! q0 ~ p maincpu.ob@1234=FF
+ y& M. U# N; n4 h+ O& i+ {+ J5 o 在ROM地址1234处, 写入FF一个字节8 X/ d- D- E' E
+ S# W9 ~3 y$ i+ i% y* C2 x6 H maincpu.ow@1234=4E71
% ` s- Y' k! H* I+ e4 c! q. N5 ? 在ROM地址1234处, 写入4E 71两个字节6 e$ Z- O: k. Z0 E# P
* l) n) \5 u3 x% P7 Y( j
maincpu.od@1234=600A4E71
5 t/ L4 b$ h8 `) q* V 在ROM地址1234处, 写入60 0A 4E 71四个字节1 U. Q2 V/ {' d. @" }7 |
y, L) i Q8 x 注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
& f1 ~+ s4 o- z" B: c1 A5 z
, n$ I4 `9 _: ~4 m
7 g; y- M+ j* ]- p其他:
4 s$ _, m2 l, ~5 x dasm 输出档案名,地址,长度
2 n) ~" x; f$ i, M5 v 输出程序的反汇编代码$ H& N5 |; n8 ^' O% b0 I k2 J
例子:7 J) i ?3 [% r0 @
dasm 01.txt,0,100000
/ } b1 u/ e) b* _# ~ p7 c 将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt
) _0 h n: V+ H9 E& o7 C: N ]3 G7 ^ N4 F# x9 n# f6 C6 {
softreset
% X. \! Y6 `) K0 ^3 r4 x+ _ 游戏重启, 但不重新载入ROM6 t% D$ J1 q. x) [9 l* v
. s; {; G0 s; l& `; z
hardreset3 h8 _( e, U* `
游戏重启, 且重新载入ROM
! C. r0 o# {0 `3 y! G8 e& x5 Q+ t; s/ R3 k3 ~$ L2 D
snap xxx.png( }1 b9 V$ f: Z" P. p
截图为xxx.png
2 X! `. q% p4 B2 ?: D0 [! |5 ]# I! D+ ]+ i5 B& y8 s5 x
+ M0 c7 f" _. e
/ ?3 q% h. q( Z3 [( o- ^# Z3 N
1 d7 u. f+ K' G( U$ e热键: f* {7 }% M0 L6 [" |% u9 A8 q
~ 中断游戏/ i) [8 L) C: x
F5 运行游戏0 p! d& c( T2 d9 E5 b7 @
F12 运行游戏且隐藏调试窗口/ z$ d) j- n5 }. n9 l
F11 步入, 单步执行, 会进入子程序2 _0 N! K- o) F9 S- N: T: y' ^ |
F10 步过, 单步执行, 不会进入子程序4 q$ h" d2 p6 C( H; }+ H4 B# B, y, F
Shift+F11 执行到子程序返回* T. N) p$ y& @8 ~. a0 g
Ctrl+M 内存浏览窗口
/ Q4 A7 P6 ]% z0 U( z7 w F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
5 _9 ]" s/ R- R* _5 d
; g/ y) o$ _/ T! H1 f" ?{:4_94:} ! u+ N* O; I- o# s3 f; }
% b( |' M1 I7 x7 p- [
|
评分
-
1
查看全部评分
-
|