|
|
& o5 h1 T( q6 [1 R5 H: Q |很快速的整理我自己常用的指令
6 _% N% ~, H, @' r% |$ a! _4 P; C1 e; G' H) r/ j8 h$ t
{:4_112:} ) P9 r' h% j: Y' C+ U/ \6 S
3 t- N7 U4 g! l s1 k. O5 u: q8 c1 A
MAME DEBUG常用指令
- K+ Z' p1 ~8 k3 C+ I1 O- X& }3 o M, g$ Y7 ~4 x+ W
内存搜寻: ci, cn, cl
; X1 ]0 x$ B# |8 l( H
! ]4 ~* l0 X; ]% N7 D ci
8 q( C! s$ i9 ~3 ]3 o" i 搜寻任务初始化, 每次搜寻一开始一定要输入这指令& p4 k, w R0 r% O& t; N
: K) w6 B8 O7 ^" e+ t cn
% U5 S& V* [% g9 b 搜寻指令
& m, ?' Y$ v+ P2 c t 例子:
$ L+ W4 M; |5 {6 E( F& a cn eq,60
, h' w9 @- z* }( m 搜寻目标等于60 (十六进制)( m2 P: I' j; ]* I, P. Y, t- p
; z- D; B8 B! p1 |
cn eq,#96
9 R# i& _0 ^, z9 u {4 W/ G 搜寻目标等于96 (十进制)1 y* G, R5 ^2 g3 o' n
. H: N6 N$ Z/ A i$ I% `
cn eq3 {$ j f0 M3 T, _3 I6 @9 J" {, |+ r
搜寻目标的数值没有变化* o- [' c5 J6 ]: L7 q
* |, a8 K- P% ?# u: i- F& N
cn ne l' s, X5 X2 {' H" u* k7 U9 c) b
搜寻目标的数值有变化
8 E& Y' H" O* y5 S# h 6 c' ~, U6 V# R6 t( e
cn +
' I9 \& h/ P" V7 e* d 搜寻目标的数值增加
5 t9 A/ T4 r9 w
/ [6 z4 L, Y" e2 F9 {+ U N) q5 S5 l cn -
) C. E$ y" ^% P! O3 Q$ V6 i& t 搜寻目标的数值减少; a* e9 H q7 _/ {- W" e
6 c/ H# P1 p! C( X( w+ Q8 s( } cn +,3
3 Y6 _, d) F' `" R 搜寻目标的数值增加3 (十六进制)
# i; y# L8 B2 |8 X8 K! x% d3 E7 [% r5 e( s3 F; }9 R
cl
8 O5 ~3 h0 ]. ^; q6 N5 e 列出所有搜寻结果
3 j% u- ` k5 \$ M. u+ B5 R
2 b! ?7 ]5 y' s* ]3 s, J- J6 y c6 A& H1 \ cl xxx.txt
! F$ z0 f- U6 b5 D 输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式
( ~; ~9 V e% `7 [: R2 C
* u7 H7 H1 y3 j1 z& M1 n0 Y
W/ G$ y4 P) G4 {内存监视点指令: wp, wplist, wpclear
% j6 k% Q* C$ J; @$ ^; J 例子:4 V1 S- Q8 ~9 l& s
wp 1234,1,r! \- h* j+ \, g' W$ Z
在地址1234下读取监视点(该地址被读取的时候中断), 数据长度16 K5 _: `% N% N1 n( V. u
m. e. d! Z# M1 Y4 Z* F% c4 [" `
wp 1234,2,w
9 [9 \* d! J+ O9 Z6 u" c/ F7 y9 C 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2- l! r; O+ m* S3 U
) V; ?: l/ x* D: I wp 1234,6,rw
A% z4 m& d) J' n) m 在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度68 }1 y( S& u3 V/ g
- l U# d2 C' ] @
wp 23456,a,w,wpdata == 1
' d8 k6 z# o4 H/ t7 } 在地址1234下写入监视点, 数据长度a, 且写入的数据等于1* z3 k# v+ u; ^. S1 p6 x
9 `- k" q% w' ~! H
wplist
5 m5 K' B& L; Z% T) c0 V& _0 w& p# l) H 列出所有监视点
4 k- R4 M: r& k( k( G# W- ]3 E) M: r- a
, D. s2 Q+ q- j$ \# S; H ~ wpclear 3
3 v4 T: q5 Z+ I! A1 a# d4 _' b# n 删除编号3的监视点3 r( ^% _" Q$ T6 p
4 N# r) l4 r2 P2 Z! R wpclear) A$ U M3 g3 c" [* A( C. J
删除所有监视点
- X& ?; r. p: y4 t4 {" `) k- A a2 s$ G3 K( b, b: }* G8 N+ K# s; b
2 X' a1 c3 p5 }
" t# N+ o# p4 m/ S f, r6 j程序断点指令: bp, bplist, bpclear
6 |; ?) b& q8 S u 例子:
x/ } _" x8 w+ ~9 l, I bp 1234
0 L3 b. L' p8 s' E 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断
! K. S, ^+ ?7 g: }5 l3 [+ c
* \) N8 D% r+ ?; B6 |! c) I# V bp 23456,a0 == 0 && a1 == 0
! |* k% x( F0 i0 N9 N m 在地址23456下断, 且中断条件为a0等于0以及a1等于0/ ^, n+ z. ^% f- W% e% |' G7 c/ b
* Q7 Z3 z. v, u0 g4 }" w. c
bplist
u: j! K r* k: U 列出所有断点
0 m+ i1 M4 H" x! {. l1 i7 a6 Q+ l& ^, L! ?) q
bpclear 3/ R0 C' U8 {; |' K3 n
删除编号3的断点8 @3 h7 L% J9 q
4 d6 f. I w! p7 n! ~ bpclear; S! b4 v. L7 g3 [
删除所有断点
* p- Y2 ]# ^ i4 \% J1 g# S# f& M' `& Z5 N ^! ?& V* ^
( u" n1 J* O2 `
" I; O: X5 k, ^: i; g
跟蹤紀錄指令: trace
/ B& ^4 [/ X) l! O7 ?$ @/ i 例子:
1 h. }2 `+ N s" m3 T trace 01.txt* A! T7 R6 o% j9 \) a, ^
跟踪当前CPU运行的所有代码, 输出至文件01.txt
. S3 r7 o! F! x. f# h) l& e5 }$ z& [: a% O' m7 V
trace off
4 i5 V$ v' D$ a6 d) ] 停止跟踪, 并且关闭文件/ L! M& z/ J( z7 Z
% f* }+ w% [/ v' O$ X# [ trace 01.txt,08 f' [$ \6 E, c8 Z4 {& t2 p
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
$ Y. D1 i( M3 Y6 y2 u7 z3 E; U9 f- ~0 v9 i7 ~; b% x* b2 ]; w
trace off,0, ^* e9 J2 d0 Z$ p. a& |
停止跟踪编号为0的CPU, 并且关闭文件
! O/ F: G4 s4 H4 ]0 Y/ z7 s: ~( l5 L
% Z/ V; l5 @* Z% p trace 01.txt,0,{tracelog "A=%02X ",a}
5 L$ c! r4 \2 k# w" s, \ 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt : J8 j8 s5 O% j" @4 I7 r
并且在每一行的前面, 写上"A=a "
; C% v l9 H: A" Q. {, Y( Q0 c "A=%02X ",a为一个C语言printf函数常用的输出格式
7 j( ^* W, R+ _5 }1 W b) ~ 意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入
! A9 L L" H' P/ X# |' e. h- b7 Y X表示为大写十六进制数% m8 g0 h! O0 p+ x( j9 y5 C
@# |8 l* K" q% Y5 ]! ~. [! _/ h. C7 r7 v
- u* P9 Q- q7 I* V内存直接写入指令: maincpu. l7 T" }8 x) H# j
格式为 maincpu.[][]@地址=数据
: e" @8 r9 w- }2 A+ i 第一个[]:
2 m* ~+ r, {' \0 X+ [ o 表示ROM地址# b9 N% M9 L- x( W
p 表示RAM地址
; k; m J" V8 q% m$ a" o7 J4 ~/ L( N) G1 f: R6 v1 i
第二个[]:3 g! D7 s7 ?9 e0 \
d 表示4字节( h+ E7 U3 A- Q. L8 c( l( I
w 表示2字节7 j6 K; f! O* o$ M2 m
b 表示1字节' [" ~0 l2 C/ k& W# y3 p$ `7 D
7 F1 l4 s+ C9 J3 b' g9 q+ L0 U 例子:
% A; {/ x( D9 c. {4 {5 r. G+ U maincpu.ob@1234=FF
6 p3 J9 | r( p* |. L s 在ROM地址1234处, 写入FF一个字节# X) c% C4 j5 G1 |# F
2 @$ F, E, W: b. Q7 m/ W maincpu.ow@1234=4E715 ?! [. ~$ m, ~1 h( G
在ROM地址1234处, 写入4E 71两个字节
7 F' f: r! R6 Q0 J4 \
/ F: h- I1 G0 z- L0 O9 y2 K+ l maincpu.od@1234=600A4E714 a+ [6 `' K5 w0 R9 R
在ROM地址1234处, 写入60 0A 4E 71四个字节
5 E2 f' _7 h7 n; }
! d0 c7 @; a, f) n% J9 p1 _! E2 _9 ] 注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
7 c" s( L% U8 v( X9 X6 A4 g
5 y" v: \. U( n1 N3 X' G
2 R- A) Y$ u+ \& `0 O5 P其他:" ?* `3 U5 |6 U5 i2 F' e0 K
dasm 输出档案名,地址,长度' q( k! A8 N+ S. H# _
输出程序的反汇编代码# a3 h3 P0 F% r$ i8 q' f% O! R* E; i
例子:
: `) C' H% ~( D4 j, c dasm 01.txt,0,100000 ^* W! p; ~ P i! O8 T
将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt
* a# d. o$ Q* e+ p# t
8 b) ` y' c# v8 M7 n softreset
* K) k! I) l1 U9 c 游戏重启, 但不重新载入ROM
3 x. q) u8 x: l7 W9 @; q, M; l# ~
2 }0 R% v+ |: {0 O& ~ hardreset
7 s# e) s8 K1 z6 P4 q; }- q8 w( r 游戏重启, 且重新载入ROM
9 p: H5 v- g1 S0 n) }6 [; ~& ]9 p* [ w
snap xxx.png
/ X2 D+ f: ]9 f5 `4 y 截图为xxx.png
/ P9 c' X6 a d! S4 i3 p3 h Q; E+ x
- K7 K# w* p5 v' E# T $ X( ^- ^1 {; M9 @
7 |3 p+ g% t! _: U) i热键:4 D0 D8 J+ _1 v- f4 d8 T' z
~ 中断游戏5 w" W8 `, N P/ I6 F! q
F5 运行游戏
8 K( ~& m& w0 P/ b8 }6 y v0 S F12 运行游戏且隐藏调试窗口8 M/ F% M# g* q& w' e5 G8 m5 I$ o
F11 步入, 单步执行, 会进入子程序4 w% n# ]% @0 v( R
F10 步过, 单步执行, 不会进入子程序3 Z- |( S; i4 \: M: e; L4 g$ G
Shift+F11 执行到子程序返回- r& S9 T7 ]6 N( u; W) M6 b
Ctrl+M 内存浏览窗口4 O- o- z& X+ s
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
O) Z5 v4 e0 p% C% Z0 `9 T, W P
' Z: @- R9 j2 V$ H5 U{:4_94:} % @# ^6 o5 ^: U
' e! g' ^0 w0 q% m$ s5 ~' r |
评分
-
1
查看全部评分
-
|