|
|
* n( Y! ?& W: w1 Y, N很快速的整理我自己常用的指令0 v, H7 Q$ u' w; V X% M
" M7 V# |8 S3 A. s4 T. c0 ^, o
{:4_112:} 2 D$ ~6 s4 ~$ u% u
" Y! v2 k: D; |+ u: N" G. i
MAME DEBUG常用指令
j& {6 Z+ B V# d' }6 q/ b! l5 E- r* r. W- E
内存搜寻: ci, cn, cl; Z) H- F) a* X; l9 X9 s0 q
7 {3 [1 _+ b& T5 C# R ci
! h( g, f( E& f* @7 x 搜寻任务初始化, 每次搜寻一开始一定要输入这指令
5 H' q& Q6 q0 k8 h+ ^* L# X: h3 s
7 `, G& r9 I, z cn
. p4 G* M; b; ]' ?' P 搜寻指令
2 L! E0 Q+ P) u5 o) s 例子:, o8 j3 E( B" b& }
cn eq,60
% b9 E0 T. Z. M B" ~3 l2 w9 u 搜寻目标等于60 (十六进制)
' W2 }3 A( s! w! L - V% G7 s& j1 c U* y
cn eq,#96
( r: z; D* u# E9 { 搜寻目标等于96 (十进制)
7 {+ E2 ^# g H# X* Z) |$ q. _8 z
4 l+ O' A! z- H cn eq& [/ j. _8 x/ u/ r8 {+ k8 m, |
搜寻目标的数值没有变化4 x0 v5 q% t) r' `0 u3 p' R
% f2 l$ f# Y; d! j7 A2 c8 _ u cn ne
/ ?: V- U1 _" ~) B% c. X 搜寻目标的数值有变化( N9 B7 ?( `! ]4 S B
; q. J2 e: D% }( `: K$ l cn +: ~( `0 S) m* X* W: M& P/ P- @' T
搜寻目标的数值增加
* `8 w6 P" B* ^3 y/ Q 3 \& |5 d* ?8 p- u8 g9 `; @3 H- ?) N! \
cn -
3 C( {7 v! E& n: O, k5 _ 搜寻目标的数值减少
" E5 j8 E. C0 O7 s
0 j$ n$ x' E( J* `- `! V- {# d4 F- j cn +,3* H" T$ q3 ]& J: y8 A
搜寻目标的数值增加3 (十六进制)
* s0 e3 a7 i/ d% H+ V: R) t
2 \6 G0 j% A( e: F5 X cl
; R" Z% P8 r1 y 列出所有搜寻结果4 X: N' g* Z% j& |
& f2 Y2 Y5 h0 ?# X
cl xxx.txt6 ^9 p5 u8 F& E5 B# @( U* x0 G p
输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式
# E5 j, F. C1 x) j. p$ a
5 D9 f) C1 T; l6 P; ? : ^5 ]4 C- ?! S' C4 |
内存监视点指令: wp, wplist, wpclear
+ g. A7 ^% a$ [, j, R* ~ 例子:
- w. n j" P% |) X/ a: h' L wp 1234,1,r5 c9 ~6 u% k" O' s
在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1) F' C8 b# m6 p- e' {, P
9 x- D4 T& M [8 z" H% Q wp 1234,2,w
# B& ~ ]# `5 {1 t' N* n 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度29 z- A" @8 j9 o& w; b
6 G4 l1 M% v$ ] wp 1234,6,rw
* e' g! C$ g4 n# G2 p) L" e 在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6
D7 ^3 _( j9 p# F& D3 q3 V7 ^9 o* g; a2 ~& v V
wp 23456,a,w,wpdata == 1
: v5 Q% G6 x9 P! v 在地址1234下写入监视点, 数据长度a, 且写入的数据等于1
Q8 {' y0 L& t" B0 @9 a+ Y! _" m" l& |4 U7 H" F# r' J7 T9 D1 A
wplist
- p) g- S" V" F" F/ x4 G% F( ^ 列出所有监视点6 _; d; P6 @( c
, x( G. W: }2 B H, J! T
wpclear 33 d9 L# P: f& m6 Q% X3 F
删除编号3的监视点
1 P% P; B' [# y5 p
& C% M: B# F/ {( b( C/ a& D wpclear/ X4 h$ Y. W" c$ o0 O0 x/ B; l
删除所有监视点
! \6 o% U+ P% D d- s% W
4 a1 i$ v y1 W; S5 a1 { / [4 @/ n+ G/ [; H
- L9 Y$ j. `/ |* `# Q+ r
程序断点指令: bp, bplist, bpclear
6 }& F$ \2 z& @) W 例子:
[, K( @' n }- m3 _ bp 1234
- ^6 Y7 I" T4 F5 f) J) u0 | 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断6 X* |4 n0 t% d2 P. ]: H5 j
) {# _/ ?% m9 \' y* v; n+ }- \ bp 23456,a0 == 0 && a1 == 01 H+ H4 [; F2 ]# Q
在地址23456下断, 且中断条件为a0等于0以及a1等于0
+ T$ A. Y$ J9 n4 }4 u7 v: s" M: e+ b+ L! Y2 Q f
bplist' Q( I$ d0 p. {# L, Q
列出所有断点& M. |$ [* \4 j; W0 j# h3 M, `
1 j& ~, t& g0 A/ ?( ]
bpclear 3
Y7 p7 H7 ^( b. y7 D+ C 删除编号3的断点7 C, u2 C6 f8 b$ ]5 l2 \2 G
6 _* b6 ^0 `& E bpclear
: {2 |7 H* R0 C4 w0 ] 删除所有断点
. `* k2 \5 F8 W4 u; g3 X2 f& w
$ K" |; V8 ^4 h; `9 G7 I ( H* A6 s5 a- u
3 I# q6 H' Z) w5 F+ o; F
跟蹤紀錄指令: trace8 G8 P! I* ^1 K( `
例子:5 w6 R3 p9 J; T4 M
trace 01.txt
5 Q7 r1 I! v7 p, q( ?" I" u) X$ Q 跟踪当前CPU运行的所有代码, 输出至文件01.txt: L& H* _& |' b: c* W' C9 O
1 U( g- o" C) a
trace off
& |9 } W1 s) V( ]$ V. f% k1 A 停止跟踪, 并且关闭文件
1 C% \% R% {1 w# b8 b. _, x' H9 F5 `! m% R. Q, E- w
trace 01.txt,0
; N+ E ]" h9 K1 e' g3 I8 k5 M, o 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
/ b6 y) c, J+ b1 g1 @; S9 e$ o$ ?0 b9 @ S- `- e% R
trace off,0
$ ^! F7 q2 Z$ C% I' v7 F 停止跟踪编号为0的CPU, 并且关闭文件$ |; K5 O( P1 v8 l, {9 M+ y# H
7 \ n/ q, z" c7 S" c3 I0 ~0 z trace 01.txt,0,{tracelog "A=%02X ",a}
% f* b' H* n+ K( p1 I8 K 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
+ S+ S# ?" \6 a: f 并且在每一行的前面, 写上"A=a "4 u- _* C: i9 P# P
"A=%02X ",a为一个C语言printf函数常用的输出格式8 e+ `1 `$ s( q* i E2 Z, b
意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入) |8 W! ~( X( t; d' y ~* ^
X表示为大写十六进制数
* N; E# E I0 w% d5 F5 ]6 R5 g! A4 b
, _, A! P' b, M' _/ }
) A" a8 N% `6 X0 A/ m! o+ n- ~内存直接写入指令: maincpu7 v) m* @& O6 S0 s) n
格式为 maincpu.[][]@地址=数据6 t& D6 g; ?4 @) g: M- p& K
第一个[]:
& w) E% H% V# b' j8 Q o 表示ROM地址
$ J- l5 K" u) x p 表示RAM地址+ p a0 N% e h( R% q
0 W0 ^( y: ~; q" X q; Z8 I, I 第二个[]:
* J+ C$ P* c: u. u7 v8 b d 表示4字节! U) e$ e) T7 G
w 表示2字节
; i' o( P6 {% s; [4 Y, H b 表示1字节% o$ I" I1 i7 m6 ^3 t6 K8 L
) R( d: M+ M% ?: O+ I4 l" ^& c 例子: \, V2 |) w: U
maincpu.ob@1234=FF
9 g" l' G6 k3 Y- d9 K% N# Q, | 在ROM地址1234处, 写入FF一个字节! |# @# e# L7 M9 `
& n+ l& d# j) s maincpu.ow@1234=4E71
2 J( m4 y: `1 e 在ROM地址1234处, 写入4E 71两个字节+ n/ O2 B( P/ n7 s0 [9 ]
% x8 r- C( B9 o8 |9 @. ~
maincpu.od@1234=600A4E71
& G/ q9 h# c% e5 h: q 在ROM地址1234处, 写入60 0A 4E 71四个字节7 V6 v, ]9 o" M
1 E! r: r0 n3 y0 z h0 `' v( S( N
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
' C% I" g# s; r; f
- E u6 N; h; L. h' J3 h* i$ o7 e1 b5 e* y4 O3 T: l9 T# \
其他:9 R) q, ]4 k ]& ]" B9 [ I9 e
dasm 输出档案名,地址,长度( p( ]+ N: z/ t' u$ e* e' _
输出程序的反汇编代码
/ Q" R- b! m, h' @0 k 例子:* }7 f4 E, i6 n5 a6 J
dasm 01.txt,0,100000
/ H" M0 Q2 k6 T7 f) H3 \ 将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt
# y1 J L! s! ~6 ^
1 k( D' O3 }+ E7 |" O) Q softreset3 r: G& e6 \& B$ }, L, @3 i1 a3 `
游戏重启, 但不重新载入ROM/ M5 H: b5 c' A+ U9 G# d, ^
2 W. T# v; u) I2 Y5 M, i5 v) H( k
hardreset- [+ v5 H$ y0 {! r& ?
游戏重启, 且重新载入ROM! o+ ~. Y7 j- G# ]* o
5 ^/ b0 j- V- c1 g9 {# e
snap xxx.png3 t, V" }( L7 Z7 N. d7 s
截图为xxx.png
( S* F6 w! {; {1 K3 e( D
G- o( x0 ~% P8 K; s) _1 h3 Z 9 N" C2 w% s' [( `& u$ `. t
0 D# Y* r. A b: R0 Y+ y- T
. ]5 t! f& p+ i/ A d
热键:
; o8 @% |+ k0 K4 p2 i) _ ~ 中断游戏
( Y2 K7 ?% w) h( j/ i6 e F5 运行游戏
, K$ `* Q; q6 A5 P' g& N4 u. c F12 运行游戏且隐藏调试窗口
U! J" K8 l% n& d1 |' J: ^% ? F11 步入, 单步执行, 会进入子程序
7 e( |. j, e# ]/ ]% M/ w; M F10 步过, 单步执行, 不会进入子程序
: U7 X0 T) w R4 F+ P Shift+F11 执行到子程序返回$ N7 u8 E! G0 k
Ctrl+M 内存浏览窗口: p8 F9 J9 T# s. u3 {+ ]2 P t
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
- S& G. d7 Q) N* y* f# w( n" P- X
{:4_94:} 8 p( r4 G+ F6 q( l; E8 @9 B: B
2 |: j7 P4 c6 n |
评分
-
1
查看全部评分
-
|