|
|
9 g# G4 A! U5 c3 H( g/ ~
很快速的整理我自己常用的指令4 |$ P. t" ^0 ~" N
S) b; S7 Q$ u6 @& e" T+ n
{:4_112:} 0 a' I+ f' j0 P4 B9 k3 g
, M$ n3 K3 p' [& i) E
MAME DEBUG常用指令
6 X/ R1 N& n5 F# j; m1 f, y. C. O3 |1 I2 E
内存搜寻: ci, cn, cl
! r+ Z( c- C8 m: ?9 ?3 k
7 M5 y* g" c" v# I+ H ci
- a; X9 n" e/ ~$ @ 搜寻任务初始化, 每次搜寻一开始一定要输入这指令
. I+ e2 M1 d) V' u% ~/ o6 y0 `, T" @0 p i
cn, b/ K: c y' C; a+ f
搜寻指令
% O% Y. O1 t8 |' n" e7 ~ 例子:
- j" l1 D1 s$ u& L0 ~ cn eq,60& B. X8 f' \, t6 k8 k+ P' [. d
搜寻目标等于60 (十六进制)
0 U, Z5 h y6 B9 L9 c
4 b: T8 V$ L; i: Q; t9 |" F cn eq,#96
" b Q- {* r' T 搜寻目标等于96 (十进制)
7 w1 C: t' X. e8 f. W( m
; V+ `- F; A) |: m4 p cn eq
* _ I/ l( ]; y0 W+ c4 d) D; v 搜寻目标的数值没有变化; Y, v& [* K* f- F. n6 `' T
& f, r0 [; o8 y- k# ]4 \& \# z cn ne
4 A) }) Y8 o' P7 u 搜寻目标的数值有变化
. ^9 l% Y: C4 b: ~; }+ ? 1 f4 M+ s; n5 }5 o
cn +# A H3 c9 ?0 r' k& p
搜寻目标的数值增加+ e/ u0 e+ U. l0 z
6 A3 n3 J f) q) W
cn -
$ H6 N6 ~. X3 r0 w7 i 搜寻目标的数值减少8 v+ s6 O6 B6 c. u
( ?" k. e" t# R cn +,3: S+ X* Y, u5 Y. J+ a
搜寻目标的数值增加3 (十六进制)( T$ [* Y( s; _9 Z& _; ~; Z
, m- j$ h$ b" {7 F
cl' e' q, R6 w' {5 T, `! q$ g# J
列出所有搜寻结果) k$ A& D$ T3 O9 I0 U
* V- Z8 V1 d% E% K& k
cl xxx.txt
; l3 _+ \" Y' b, T. ]& }7 I/ @ 输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式0 b3 J9 S3 I' k! k) Y
% {2 f0 ^6 T9 v& r9 Q: [8 L x' L 7 S k& s X* h5 H' a5 g
内存监视点指令: wp, wplist, wpclear! f7 H4 y0 h& I& M9 Q; w
例子:, G- h+ S" M% |% e. e' @
wp 1234,1,r0 k0 B# b H* a; T
在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1
" \4 ?6 S; J* m4 F, n- c; T! M5 V6 P* R/ U+ j9 {# c
wp 1234,2,w% w5 @. d7 v2 \! l
在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2. ~1 U. v9 S* f- X. T
. a2 B8 t) J8 z( p0 g wp 1234,6,rw
2 f9 A" B& n% N9 {/ D- H2 n 在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度62 }0 E2 M: y9 O: c. Y" ?& J
& s- Q4 b) Y" G3 Q wp 23456,a,w,wpdata == 1; `9 B$ o) x J0 r. ^
在地址1234下写入监视点, 数据长度a, 且写入的数据等于1
" Y" F ?! H" R+ F2 Z( X$ z- a* Z, b4 b2 t- c4 O2 |7 p4 @6 f
wplist
" q. A, k5 I: z* p( N0 `/ c" V0 X 列出所有监视点# s/ B9 @, ]3 t7 d' }; {4 z3 x7 [1 T6 r
3 N$ d* E, {4 o
wpclear 3
& A/ W) G) K( ^* v% i. ~& ] 删除编号3的监视点( E2 m& O9 Q" \" X6 }
5 i) X# y0 C. z! z
wpclear4 X% l. _# v' Y8 s5 g
删除所有监视点
/ p3 E# G. E5 y6 P6 L$ H3 W$ C: D5 w9 c. y; o
% Q8 A% P, K/ S5 [! ~% S' ~
- L% r5 T, V1 q4 _) z$ Z' Y6 p程序断点指令: bp, bplist, bpclear8 c* I6 }* [- [5 E
例子:
W$ j1 k3 \. N% l: Z1 y# N# F bp 1234
8 c2 C) z$ U, q 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断
$ ?; W$ C# g2 p$ U7 o5 Y
/ e4 s& a, q. F: T- Z) G bp 23456,a0 == 0 && a1 == 0( U1 o" n8 \- T. v% U
在地址23456下断, 且中断条件为a0等于0以及a1等于0* a. K. R% S: u
! p! Z% j) d( c0 C bplist
* X/ m3 A. [7 e6 C0 O$ F 列出所有断点8 p7 @2 s& s& O" J- @5 Y7 D0 o
' k3 j0 D, P& `9 o5 E8 Y3 L# n' S bpclear 3
# c) S% m3 g+ K9 c1 X' L 删除编号3的断点
6 [* a0 q2 ~3 T0 G: g8 |6 X/ u0 x+ k7 Q. N
bpclear" r5 H8 d9 M+ n J# H& @ L3 j, G
删除所有断点6 S) M& L( D+ g( G
( s. I: G0 U8 y" q ; e" @3 ^! e8 Q2 K$ g. z: x! \
- W' \& z1 y. T+ T2 a& l9 H跟蹤紀錄指令: trace
$ a8 ?' }; O) l( B$ o 例子:1 Q& N2 |* {" k: f4 K
trace 01.txt7 W8 B8 W/ t, d! J4 a* M, @$ m
跟踪当前CPU运行的所有代码, 输出至文件01.txt3 I8 D D$ q+ U' D- q
" o+ ?( v+ Z3 J. k, x
trace off$ ~4 G( \& ~- @" o2 y8 G2 o' r" v+ a
停止跟踪, 并且关闭文件
8 V- [ S" t" w7 P! c
7 k6 P" g2 `3 l$ ]! Q6 K' k trace 01.txt,0
! q7 P* }- Y2 C% ?2 K# d 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
4 s! N/ ^+ s4 }1 T4 G" z3 {* Y f$ o& y4 V- F- Z; [
trace off,01 }$ X3 Q9 H0 C( c6 q
停止跟踪编号为0的CPU, 并且关闭文件
: D& J/ r D. k7 T" z% W6 b- y
9 I% q2 h9 g7 \9 q- ~9 W trace 01.txt,0,{tracelog "A=%02X ",a}
V0 o/ p* M I7 ~; @ 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
' S i2 j8 k p5 u' g 并且在每一行的前面, 写上"A=a "8 X+ W7 l: ?9 n5 ~; W
"A=%02X ",a为一个C语言printf函数常用的输出格式: K2 ~. | w: @8 r& x. b* H% U
意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入
1 c1 H' S6 h* }! w8 O. E$ t X表示为大写十六进制数- ?1 R. F3 R( {# c" Q
2 R- `- N& W* t8 S3 {1 P
# O/ D( v( B' x8 b- |. u
% |2 [, O8 X5 z" j" g) t内存直接写入指令: maincpu, g9 w6 C( w! ~: C; B% V
格式为 maincpu.[][]@地址=数据
) C. G) m/ V# c% n. j+ Z4 y 第一个[]:
0 _4 Y% ~- Z$ A7 a/ w o 表示ROM地址
, K$ c" A& v/ c, b) i2 a; M; y p 表示RAM地址
0 h' A8 S- d8 q1 W/ c8 J+ p5 F7 ^0 h7 v2 Q2 n/ d5 j
第二个[]:' s7 E: A3 \: Y5 f4 _" [! t5 {
d 表示4字节
/ e: h0 b, G' u- ?8 J6 e, n w 表示2字节
" E# ^( z" r0 G o* `' P% M; w# m b 表示1字节! G& M" C& w0 t! U, {
, ~0 @/ m2 [" k% l5 Y" N- A
例子:
9 A; x8 v+ E( O# A maincpu.ob@1234=FF
* ]5 F" R" M4 a" N1 Z% A( p3 o- H 在ROM地址1234处, 写入FF一个字节( ^- l) C+ Y/ \ t2 O$ v3 \
9 \- ~4 n; G/ B6 O: d! A maincpu.ow@1234=4E71
* |/ ^8 d* d2 ?- W" m4 |' ^ 在ROM地址1234处, 写入4E 71两个字节
1 f/ N, S8 l3 v8 ~1 | O# L7 |! L0 @9 S3 R! M& l& ~; |8 ?' S" x; X4 n, S9 c
maincpu.od@1234=600A4E71) y- o# K! v8 }4 K0 G/ F o! {
在ROM地址1234处, 写入60 0A 4E 71四个字节
- Z1 H" _5 H# V3 m7 F8 r+ P, Q' p [' c2 {; L5 |
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
) N7 Q, M/ z2 o: Y) @$ b3 D
( \8 c# p% Q" ]
4 h) u. H3 i5 K4 r6 E$ A8 N其他:2 o. j+ ^0 u6 q) Z" F+ i% M# Q
dasm 输出档案名,地址,长度! L, X3 @& `2 `
输出程序的反汇编代码
; |7 z* x$ O% y& T5 U 例子:$ a9 D: Q# u+ X! w* L
dasm 01.txt,0,100000( v8 G# K8 a( `5 [8 Z
将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt
$ I9 f1 p/ T# i5 T8 [" {' e% E/ t# f) X( q" o9 t h$ x, }4 c2 R
softreset, y Z$ B& {& _' ]; D- w0 W; g7 S, z
游戏重启, 但不重新载入ROM2 n- s+ h) S5 ^7 `. m
8 `0 m, |2 B# T+ f hardreset
+ J. e3 b! N5 X, Y) ` 游戏重启, 且重新载入ROM
( |$ j. N, `/ w3 [/ B
- X( ~7 \$ c5 r9 D7 L5 j* C l snap xxx.png: L! Z. P' H4 ^
截图为xxx.png
3 W5 A$ Y/ C. t* f; T& ~ h1 ~' o) n3 j) L
* O" }3 @9 m0 b+ W5 @* O5 x5 b
$ X1 t" s$ ^* R9 p
2 r/ `8 J+ @% b! M# N热键:
+ x0 ?4 V& I- O O. p. z& r2 X, ^: Q ~ 中断游戏) B5 E' o8 a! Z* P
F5 运行游戏: E4 n% ?! O1 |
F12 运行游戏且隐藏调试窗口6 T( S7 n$ C3 D$ z) I0 M- s
F11 步入, 单步执行, 会进入子程序
- e! T! S$ R- U# {) `: x/ G' e F10 步过, 单步执行, 不会进入子程序
( H. ?& N* |: p, H7 t7 | Shift+F11 执行到子程序返回
# @/ B( [* }* b9 V Ctrl+M 内存浏览窗口; U" v G0 H! C5 N& M* g
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
. i/ I8 q; l7 @7 x6 l( {
9 r+ D: D6 b$ x- d" d{:4_94:}
1 b' Q# f# Y2 |' }7 u. O, g; M# c' e: l3 {6 o% m' w8 o1 ]( H0 T
|
评分
-
1
查看全部评分
-
|