|
|
+ G9 ~4 \5 {1 j很快速的整理我自己常用的指令1 E) h' L* o/ ^9 V
`1 _/ q0 z( h, v{:4_112:} # g( ~/ J3 \( t
& D0 _7 n5 q) r+ i X
MAME DEBUG常用指令
. J5 T; ]" \! B; H4 [2 ^: D* C2 A" B8 I9 ?9 j: a$ I' C1 Q% @/ _
内存搜寻: ci, cn, cl0 j0 n% {% Q- j% b; f
- s( l' @& I; M9 h. K' t, e8 R ci. B9 y' t r# ~, D" l
搜寻任务初始化, 每次搜寻一开始一定要输入这指令
% i' D; a' n$ q, V% j# L0 H5 V. {9 @( c8 ~& r) N
cn
- ]9 X; a4 p/ Y! f 搜寻指令. h. t& j) V: B* E
例子:
! ^- I2 ^0 C: ]+ i6 O cn eq,60
" _" R' M& Q9 v* R0 K 搜寻目标等于60 (十六进制)
$ T& c) E9 n7 K. L/ \7 ^9 \9 L. o
" g' p+ M7 F5 @0 P" E; O cn eq,#962 C% R4 c$ {0 k
搜寻目标等于96 (十进制)3 x5 _2 j7 `3 x h4 Q6 V/ p) K
) n2 f3 X4 [% x1 j cn eq0 o9 W6 m: @. t0 F* C/ w+ ^4 v
搜寻目标的数值没有变化( u$ ~4 X' R+ W6 ~4 b7 d! [
3 Y* x4 W6 l4 T2 n0 _& Z( C( ?
cn ne( Z) d8 D( z. u8 I" b% p" F; B9 e
搜寻目标的数值有变化
2 _/ X; n% Z1 q4 L. Y: x. k# `+ w5 H , y9 E& |8 Z u
cn + `: P/ j( g8 A. ], o
搜寻目标的数值增加/ s$ f6 r1 c! v2 Y. y( R: D2 P: l+ r
L Q2 s) D# D; p/ Z
cn -4 Q9 R7 d/ f( \* H8 Q8 s9 Y
搜寻目标的数值减少
7 M9 N+ Q( [: E' l4 p2 I8 Y; _: M 0 ]* { u; R" b! c
cn +,3
! l* M+ L. z( s' V 搜寻目标的数值增加3 (十六进制); u* Y; \# q" q/ o: Q2 @( T
( l5 B( \4 ~: Q+ g
cl9 C( t) o7 B% J8 a' n0 K# S
列出所有搜寻结果" G" }" V9 j O! X$ |
9 Y* T/ ?4 ^8 P! U! t( M" |" y
cl xxx.txt
* a E2 z. b( z2 ]1 O: T 输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式/ ^+ \9 W U. c
* I% @1 X. R: k- c - F& X2 a% y) I& g! I
内存监视点指令: wp, wplist, wpclear5 S6 h: h' H- I# ]# b0 n
例子:
$ O: ^: p4 Z) m S( M" P wp 1234,1,r
9 D+ G2 b" X& d, V8 h9 @* g 在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1' Q1 A4 b/ z$ _: Y' l" ?
: w$ @" t% c2 _3 C" T5 s wp 1234,2,w
7 i8 u0 z+ j) m) t 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2
$ j- y: p) Z: k" n + d& z" q" r0 V" _
wp 1234,6,rw
' e8 N& ` w) |& ^9 _2 z 在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6* r, p! ]2 _! l8 {/ l' Y; [- u
; y% S8 B. H2 {8 B
wp 23456,a,w,wpdata == 18 e h0 a" ^+ S3 E
在地址1234下写入监视点, 数据长度a, 且写入的数据等于1& c8 z. J4 m+ }$ f3 `. D
8 u: c3 r1 Z8 J# a8 [ wplist
" N; S7 V, a; y' {/ B- o8 s' G 列出所有监视点
3 x; v) \5 t( z; E; d* R9 p, g$ W* f4 f7 j- P
wpclear 3
: y) B3 o6 ]) e. R- k% m& |8 N/ d' M 删除编号3的监视点
$ r4 C/ G7 F4 _7 ?7 k1 G+ y& E3 t9 H; A0 P9 x0 _; p
wpclear& l1 @1 @4 u% N4 [- G; A
删除所有监视点5 p5 {+ v4 b/ t
1 y/ e# f) f# Q
# c& A$ J$ H; L3 N1 b
6 Z X% t5 u& e0 C& r: d
程序断点指令: bp, bplist, bpclear& g- K7 [. `3 C; p1 M
例子:
; a. D% d; j" U' T& L' R- C bp 1234
# v# P1 g7 i% r 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断
$ b% Z5 R* c8 z7 S8 h2 Z8 B% s' z( y* m2 X# i6 ]2 V$ q7 T0 E
bp 23456,a0 == 0 && a1 == 0
8 [% X: \$ G. ~8 h5 G# W 在地址23456下断, 且中断条件为a0等于0以及a1等于0
8 {. W: I" F' v' H
6 w" S+ `. k1 U3 D; I1 s7 j) V' s bplist
6 S. k4 L$ s4 m5 F1 I 列出所有断点& n* J/ P! ~2 R1 Q
F+ E- P N) |% F( e& W bpclear 30 `3 o4 X9 h: y0 L. f F# R$ N4 d
删除编号3的断点
" C7 E/ \! G( H, X/ j- W* Y. s5 { B% O0 z- d1 m8 s0 |) [& d# p
bpclear+ b; }, R! ^; d
删除所有断点( i) M7 d6 v8 O) @
. {8 v- h; K* E+ g6 I( [; y. H
/ s5 e/ X' \: ^! T/ n6 Z
3 m/ h3 N7 ^" U; g# w跟蹤紀錄指令: trace6 V ^' a# d3 u) e' b0 s
例子:; M4 L* X. T8 W k9 {+ U
trace 01.txt4 f& v- u" ~% k* B( F. h k
跟踪当前CPU运行的所有代码, 输出至文件01.txt/ K9 ^8 {- f0 M7 M c+ ?
/ B$ @7 ~2 Z4 x1 m! d trace off
! f0 }- G" B( @5 F- Z 停止跟踪, 并且关闭文件0 Y4 }2 k) P* U) W, d
" B' Y( q6 Z$ ?9 Y& [) y8 y1 q trace 01.txt,0
2 ~( ]3 Z6 a% c" N8 i 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt6 H/ @& Z/ k5 [; o
! [/ r# r2 z( u9 J0 t, m' ^ t
trace off,0# i7 B7 G# X$ u' ]0 h
停止跟踪编号为0的CPU, 并且关闭文件+ |5 S$ G4 c& {9 m" Z( L5 l
( V) \$ T+ i; J9 W& w trace 01.txt,0,{tracelog "A=%02X ",a}6 V8 C7 P; r% i: \; {
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
) X. j* G! a, V& g4 Y 并且在每一行的前面, 写上"A=a "2 ~' p9 n) e3 l) w& E
"A=%02X ",a为一个C语言printf函数常用的输出格式
* g) s" }6 Y0 h; g% l, c! d 意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入' y, W: O" l% A+ Y# }9 ?# q
X表示为大写十六进制数: i. c9 q) m7 z+ Y
* X( z* S8 d' f% `$ ?9 N
+ X; S" q) F- T7 E5 u
7 h+ x. l! }3 e1 F! g- \* j' t3 |
内存直接写入指令: maincpu
+ D. @7 G& r# R, r6 I ] 格式为 maincpu.[][]@地址=数据
. Z- {% G" V+ V* S, |; u( J 第一个[]:
a1 I% L9 o' e o 表示ROM地址9 y. D9 z4 I6 t: ]/ p4 L/ s0 J, B
p 表示RAM地址" n3 T* X3 z" ~+ Q# l [7 X- I% F
! k2 E) n$ {: V0 }3 D* l
第二个[]:
1 |; }4 h$ _( { d 表示4字节
. U# e; S- i0 n- k+ J6 { w 表示2字节
# t* S8 q0 H# V8 I5 }0 N b 表示1字节
, ]4 G1 @2 |$ G8 `. x9 k' J6 T7 B5 b+ ?( O* P
例子:, [! U+ U* ?1 M& U: a
maincpu.ob@1234=FF
" I# ^( K+ L- ?0 _ 在ROM地址1234处, 写入FF一个字节* ]' @6 x6 p* z7 e+ K& |/ _, e6 h
6 V, i9 S9 Q* [9 g) `4 @
maincpu.ow@1234=4E71
+ Y/ n. r, v8 [3 U' Z2 J 在ROM地址1234处, 写入4E 71两个字节
7 ?/ C# |: y0 B1 U) p* @+ L$ b) @5 N, f" e
maincpu.od@1234=600A4E71$ M/ c! U, `) v/ E7 }. F5 C1 m& U; D
在ROM地址1234处, 写入60 0A 4E 71四个字节
+ G" _% s7 q2 n! C9 @/ R2 e4 t* K9 n4 B
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写( s6 ~* q6 m; k: h
* T) V* h' C& b* R4 q
. ]" h. e% J, C/ a& `' y. L其他:
) k9 d9 y$ L5 e; {2 d% j( |, q dasm 输出档案名,地址,长度, `$ a8 a1 R) | [
输出程序的反汇编代码5 x. T% K' I* O/ e, S- ?
例子:3 r8 a4 I3 x# b. a) s( p
dasm 01.txt,0,100000
/ X6 S, g# v) }2 {9 _ S 将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt* l9 k+ F. g, _9 E( _+ _, c9 P* n/ r
/ U+ B' k' A% ^/ p, D/ n) L softreset: ?5 O" x0 k# F* f8 J% Q
游戏重启, 但不重新载入ROM3 F0 @% w! j2 S% f. M* E
' \) d* N6 z6 _4 N @7 J3 H
hardreset( \4 l3 f/ O0 l( r
游戏重启, 且重新载入ROM
" L# ^6 w/ j! X% c8 T+ F p; h
' c; N' w c& g1 U+ C snap xxx.png `; o Z: U& Z3 |
截图为xxx.png! M' \ r! w4 ~4 N
+ r+ E4 E; i' @) e$ L' B
: [) e# v3 l& Y, x# l
% e+ Y- E1 J1 h( V* f _$ @ # c3 \- b8 P4 t0 H
热键:
- s8 K' a/ I; w9 ?& I ~ 中断游戏/ V7 K) J6 W2 U$ R8 c
F5 运行游戏
0 n4 f4 R; |9 i0 D3 r F12 运行游戏且隐藏调试窗口
5 X) p) [' H; @6 H) [. M F11 步入, 单步执行, 会进入子程序8 K8 M, R* V& q; [
F10 步过, 单步执行, 不会进入子程序2 ]4 b" r3 r4 R5 |/ O: Z* X* h
Shift+F11 执行到子程序返回, y8 }4 g9 C2 X8 h9 x' t
Ctrl+M 内存浏览窗口, f' }8 t$ U4 u# q
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU3 N5 \$ K! z0 P" ^
" E% t* b% v, V N
{:4_94:}
+ }2 A3 u. |! J5 j# ~, ]; v: O* p; y
! a: ~5 i/ s- g |
评分
-
1
查看全部评分
-
|