|
|
" x- k" b9 r: X2 r7 ?3 _' }) w' M很快速的整理我自己常用的指令
" y3 K! j5 q$ S4 R. r, \3 k9 t/ W1 E3 ?& ^' c
{:4_112:} ) v. A& F# F+ Y8 R; K
4 L6 B" b7 b7 b( V& e D
MAME DEBUG常用指令
/ z! ~( [5 o) o* G- r; U% W
% F! d3 p3 C& ]' O5 z) N" Y* W1 h内存搜寻: ci, cn, cl
; `! m3 \7 K1 a$ R; F8 u1 \- K: H
* U" o9 b: n) v! N ci
& [$ s7 ], \' I+ n$ M 搜寻任务初始化, 每次搜寻一开始一定要输入这指令9 D% j4 m" r# C9 N8 p, N0 `
) A; y( a# [+ E; }
cn
- J M& l; q+ w4 S9 P) i$ S 搜寻指令' o: C( \( I0 k8 o' M1 x
例子:6 g1 M( v- \/ M0 E) A' g9 Q8 }3 P
cn eq,60+ i2 p% I Q2 d! a: E
搜寻目标等于60 (十六进制)
6 N* c1 I( H# d6 @* A 3 V9 U* M* u6 B, e" s3 {( x. u8 S
cn eq,#96
6 Q0 T& i3 f; p/ U0 d- @5 j1 w- o 搜寻目标等于96 (十进制)* S: q/ Z' ?: K( ~4 U4 \) s
# \, n/ L8 I, Q
cn eq
' | J1 u5 |- B; z8 N 搜寻目标的数值没有变化
$ u# `5 w) y5 n3 S5 s" |& t# n! Q# ]
cn ne
( ~) w6 z: c( c& F- L | 搜寻目标的数值有变化
. M$ n$ |" d9 o0 H
& \$ H4 w& P: P9 Z v% T/ e2 S cn +8 m1 q0 Y3 Q% l9 Q$ T" s
搜寻目标的数值增加
$ ?5 _ {9 i0 C* \7 [5 l4 L
( P1 ^ I# M$ g9 ^+ J1 F$ Q1 D cn -9 m/ e: [( }/ [1 G$ h( x
搜寻目标的数值减少( h1 D' T$ J% W* T
; B! {1 S. b, f4 G
cn +,37 I$ e# x3 l N9 p* N
搜寻目标的数值增加3 (十六进制)
) A; i7 _, U& @( ]
, V* N1 }, F& l$ j' n: K# s cl
8 i" f$ l( p6 p$ z2 W 列出所有搜寻结果
. B% I7 P1 z5 ]- P. B
9 |- p C' R- }, ?- {) Z) @7 P cl xxx.txt3 \7 }9 o; x# j2 k& S: c0 l( Q7 }2 F
输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式7 ^- {+ \! _8 z* Y" f& a( r
2 R1 {# {# `- X: z2 i
( {$ W$ v( P' j) M- g( d8 |内存监视点指令: wp, wplist, wpclear
& W" \3 \" W1 A 例子:+ k, r3 n D* g- X5 t, N
wp 1234,1,r- _/ Q, z7 t# P2 e1 o
在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1
- {6 v; F. r; ] [* g2 |2 |, s E% i+ q$ ` h
wp 1234,2,w2 P, d$ Q' F- `# w o
在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2% h7 G" G6 n- G# k. f
7 u: N" M' [- K3 d1 _ wp 1234,6,rw5 R/ e! Y% B5 g; _+ A
在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6
9 F# t3 v/ \1 `3 U+ F0 X1 S$ ~, I1 Q. h: _4 m8 Q# ~. X
wp 23456,a,w,wpdata == 1; W" g( V3 j: |# j
在地址1234下写入监视点, 数据长度a, 且写入的数据等于1
. m2 \5 a, j, W2 Z4 ~: ]6 d
8 B3 x2 f6 ~# z2 U wplist
2 z7 Y1 m7 ~. a# h+ P 列出所有监视点( ^( G+ a9 C) }0 Z7 Q5 J/ j
$ @' b0 B- s% t* ?5 w) e- j& O s
wpclear 3) B8 L' G# m- P
删除编号3的监视点- Q/ e) o9 b" T9 ] l. _- D* K
, k- U+ Q1 h8 s- K; F( h# Q5 ]
wpclear
! _: s9 \8 @# t( Z, r) Q 删除所有监视点
7 i- F: {8 U* S( G
% s2 ~5 m7 V7 f; r
7 g+ L( R- D* I3 w% R2 |9 v0 B, F0 \7 L. _4 Y3 o3 t" H: s4 r
程序断点指令: bp, bplist, bpclear7 |8 ?$ s O0 e$ ^: q8 [0 y
例子: \/ x V$ C6 f e( J8 C% R
bp 1234
* F" [% z2 Q5 d6 ^ 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断
# |* {( B- g$ h$ R- d
) s7 l& ^4 R) r# z- ~ bp 23456,a0 == 0 && a1 == 07 W5 d/ y6 N' a" Z# ?( P
在地址23456下断, 且中断条件为a0等于0以及a1等于0
2 z9 k- c2 y/ V" I
7 w$ T, u! M" e4 k0 K) y) e bplist
; ~4 u: k4 l, Y8 } 列出所有断点* U+ }1 F0 o, R
$ b" s" Y+ ^) w$ X# }: M% _- w bpclear 3
+ {( I! a0 n. o/ Z1 X1 y/ U 删除编号3的断点
. i6 }) a' ^- H T$ F
% c0 b! Z) Y% N bpclear! y. Q8 d& }* ~$ o$ `- D" a
删除所有断点% c, R: o% G) P" B; x5 {: l
- s0 ]6 l z! g/ \! @( U
8 H2 u* E, Z) h* ~% @/ l
1 Z ]1 c- N- j" _. K8 e0 L# V) w3 q跟蹤紀錄指令: trace
; t. v2 r, y- i3 R0 h 例子:
& M% v; z' X: L [2 Y; W2 q6 s trace 01.txt. H4 p' B# H* s, H
跟踪当前CPU运行的所有代码, 输出至文件01.txt
; v: ?! j8 |1 `. C# Q. V' N4 d
0 \2 z9 u' t8 X# i) B* T+ _) {+ u trace off6 o7 @0 e# h# I8 M7 ]
停止跟踪, 并且关闭文件1 p8 g) c3 v4 h0 g, F0 u5 N, C) O
* ?# ^9 b, W6 e trace 01.txt,08 N0 q# W: }' ` F/ N' T4 L
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
- Z2 G } `7 W( ~. G4 A+ N
M4 W2 @1 n7 h! m+ n j* F) ^ trace off,0
1 O* K8 }4 U& t- p& i 停止跟踪编号为0的CPU, 并且关闭文件
& k; h$ z' I7 u, l) A+ q
) U7 E1 V9 e* z. q7 ]/ m. E trace 01.txt,0,{tracelog "A=%02X ",a}
/ c4 {7 u+ t2 d8 {* L6 K 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
& J0 U0 ~6 n8 n( k0 h# }1 K) j+ ]" s 并且在每一行的前面, 写上"A=a "2 [5 P7 A/ O# i# F B' @5 h6 f
"A=%02X ",a为一个C语言printf函数常用的输出格式- r; q; z3 s4 j7 o9 C+ W* \4 m; y$ e
意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入$ p& F/ s& y! e- U
X表示为大写十六进制数
2 D' \! }7 y0 m6 n
( o; i4 w+ J* v3 ~# v
$ B& \# Z' P: J
/ J$ J$ _$ m) m内存直接写入指令: maincpu1 `& G; c# o1 S L. d5 `3 I7 F" i
格式为 maincpu.[][]@地址=数据, h8 u- P. g# q) z
第一个[]:
* m' @" b+ x! G% m/ i2 E o 表示ROM地址
7 _, O9 S# ^. M3 D! u" @" Q, B p 表示RAM地址, E" J7 Y! v3 D, m- v
2 }# \0 `0 o9 F2 X- w( Q7 I, D) l
第二个[]:3 h0 `8 w$ \$ O$ Q+ Y3 p, g, ^9 k
d 表示4字节
2 E$ o6 | i) ]4 O0 S# j! ~9 W w 表示2字节( }; e) Q; B4 u+ g* ~
b 表示1字节
5 I' B: ^9 `! {! u4 z/ A |) K# m' A; M' E# D9 ^
例子:
6 C1 b. H; a5 B: ~9 I maincpu.ob@1234=FF
0 c: N' Y! Q9 n ^ 在ROM地址1234处, 写入FF一个字节, h9 _$ m& f }, b* M
2 v1 a5 b8 @, P/ k4 j
maincpu.ow@1234=4E71
1 L: _+ N3 |" l 在ROM地址1234处, 写入4E 71两个字节# _9 G9 X/ a. A* s4 h
$ h8 Y/ V3 E! g' H0 T# e& v' { maincpu.od@1234=600A4E71
/ x, D" L2 |6 v4 ~9 O# N& u 在ROM地址1234处, 写入60 0A 4E 71四个字节
4 U3 m. Z2 H/ I7 L7 O8 L4 J2 V: [6 J6 N7 {
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写2 V P8 t2 K! z& T% I$ g
( j5 o6 f# @- ^0 V8 l/ p; {
& U1 a# J- C; @. a其他:- x$ S7 Z+ ~7 H+ d0 \" H5 a
dasm 输出档案名,地址,长度
Y( | S6 B. G& q$ J* K 输出程序的反汇编代码. @/ k; ~8 r1 N2 x9 M0 F8 L
例子: R" N% H4 L" l9 m, V
dasm 01.txt,0,100000
" m: C9 ?, s1 N 将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt
1 m1 E3 O+ \+ P; ^
6 J+ u! J/ C0 `+ H+ |3 x0 ? softreset# w$ u& c2 U) [- O& [7 c
游戏重启, 但不重新载入ROM+ A0 T4 f& |: ~
5 d, p+ W3 f: e$ e) ~
hardreset8 g1 ]0 F; f1 J- B) x4 k( q* X
游戏重启, 且重新载入ROM h/ C9 y" _3 F
% Q. [2 h& |& F5 E snap xxx.png3 O2 \% u; ?6 |3 U
截图为xxx.png
" ?+ b# ^% G% [* j: V E/ y) O: A" c2 J
l! Z# Q4 u+ {- ]5 G- g8 t
$ Y) u; S5 I- V! X" B4 v ( P( A4 ?0 h/ d8 a3 m" I
热键:; }/ C* ^; ~, r" m
~ 中断游戏4 I' |+ N2 q& i( L
F5 运行游戏
: X$ b) W! v* D" i0 {0 _ F12 运行游戏且隐藏调试窗口
0 |% Z4 v% x2 [: ~/ p" H3 b F11 步入, 单步执行, 会进入子程序4 |' p) r) y7 `0 \0 }
F10 步过, 单步执行, 不会进入子程序5 l+ U4 V# L) V' Q( i
Shift+F11 执行到子程序返回
, e" T# w- ^# Q% Y Ctrl+M 内存浏览窗口5 A- K! ^4 r) B2 F
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
/ X& K, X8 n9 s5 L8 a& g4 B& t5 p* v+ T) c
{:4_94:}
2 @+ M# ]: }6 a' ?- e
8 h; q4 q1 j/ r7 E |
评分
-
1
查看全部评分
-
|