|
|
* t {8 c8 l8 y7 I5 E& s很快速的整理我自己常用的指令) V( H9 R: p1 r4 q. Z
2 {& m: u0 R( I4 o* W C( g
{:4_112:} 8 S' K. m' `. ~0 q
0 |. K0 C& o& y1 C5 QMAME DEBUG常用指令
' Y. i) N+ v5 {$ B
. q8 n- H( Q4 W1 ^内存搜寻: ci, cn, cl
' ]' h# \* N/ D9 m0 v9 W, l# v9 A# M% ` v+ f% |: W
ci
% h, ~4 C6 O' r/ n 搜寻任务初始化, 每次搜寻一开始一定要输入这指令7 a; V8 ?, m, I+ I7 n
3 U( Q- I. l) j" n, G) N7 }; |, j
cn
& Q6 r' F: {9 ?0 J3 `4 K+ z7 Q7 o 搜寻指令
- y! d6 r( {3 d' Y 例子:
; T3 q. p9 u) A/ q. z. Y* R" y4 { cn eq,60
$ I8 {2 J+ {* v2 @9 ]( v 搜寻目标等于60 (十六进制)/ _" g+ x* U4 p$ ?
+ D3 H( W5 M& N1 j8 X0 l cn eq,#96$ q6 I3 X9 D) W8 i5 M* i2 c
搜寻目标等于96 (十进制)7 f8 ]/ g* b. C( F j% F7 {+ ~
# e I0 ]- W8 h* a5 v" v" m6 h
cn eq& S! Y8 Z( t7 `* q4 o/ j6 q" J
搜寻目标的数值没有变化7 l% f6 W, ?' `7 g G4 \+ v2 U2 D
. o1 Z. Y* R; ]/ b cn ne
2 F5 w5 u+ B9 K5 k 搜寻目标的数值有变化
3 g3 y* Q7 `. D" a
& C* S9 x5 k' n, _, \3 Q" l cn +. Y1 q) t3 R7 q+ q
搜寻目标的数值增加
. c9 x/ N" p; z
+ E+ `9 k$ l0 g" }7 X cn -1 d0 i0 K% a6 }* Y. f, W2 C% ~! Y
搜寻目标的数值减少/ N! f- N6 B ~ N7 W @2 F/ ~' u
0 D0 E# U- h9 g6 g' {. n. P0 o
cn +,35 n4 X5 U) l) ^% z0 {+ l
搜寻目标的数值增加3 (十六进制)6 \1 q- \& u! d0 Z0 S+ t u, k- F
. H. w b9 K- N$ h! C
cl1 G6 f3 d" V) k- b/ }$ A9 W
列出所有搜寻结果
& i1 E t+ }# X4 x7 `
8 O) `& y: v4 d! S# j! `: c* ]7 c cl xxx.txt
1 p7 ~8 @& t( O9 _. `: q 输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式! j% a1 [- K' p5 G! \! A" {4 k
5 }$ @/ x- |& j; }1 ~6 @
4 B: [0 B$ Q# K
内存监视点指令: wp, wplist, wpclear
. P2 y* U- K% ?& B: \ m 例子:
! k+ j: p% S' g V wp 1234,1,r- u' y! F0 {3 [! M x( T
在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1" L1 Y! @$ L; Y5 K
% n3 ]( a8 d/ T/ V+ R ` wp 1234,2,w
$ l) L6 F I9 `2 s5 [ 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度21 F, y8 L- B9 b: a
& {) x G# D; {, d0 |2 Q
wp 1234,6,rw% S, k# {3 f( |) A$ n
在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6
4 x. d4 S* q- {) c$ l$ g
5 ~" Y$ }% K4 e, W+ q- ? wp 23456,a,w,wpdata == 15 y9 i9 K0 \% f6 j' R
在地址1234下写入监视点, 数据长度a, 且写入的数据等于1
! ^2 ?8 n0 h( l v" \9 C. Q% G
% K$ J3 j) r: E1 Y wplist2 d. _& m5 J9 x0 r6 }3 \* C* ]
列出所有监视点
& X* [5 Z7 K3 x
& q$ K: Y( H4 u5 d6 B) @( w wpclear 3
# g7 ?3 b. G8 h% `1 n 删除编号3的监视点& ]9 f! r4 r( c% ?1 C
6 l3 p! p' V, K$ B, j( \* U$ d3 {. r wpclear% B; \1 @$ Z8 ], q: G( X
删除所有监视点& [5 `/ n5 d4 Q1 {: X
0 K; P6 c \4 \' \$ @
- G: j2 ^1 i1 p# t- E0 h* R' s2 y
: b2 N: [# J% E8 ]
程序断点指令: bp, bplist, bpclear
8 G, B; V8 K" `& U2 s 例子:
, I* j# k6 p$ @" m bp 1234
2 `. | z7 L9 F, \$ x+ G 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断
# a6 N2 S( R; a; S
- ~" q0 y7 |5 p$ C1 G; _0 R5 ?1 D bp 23456,a0 == 0 && a1 == 00 I: r! s, {* a
在地址23456下断, 且中断条件为a0等于0以及a1等于0# |5 F' S: I% P1 q0 _. n5 j
* M% I N4 Y! N
bplist
* V2 i2 D1 B) @1 S& A5 { 列出所有断点
$ I6 x" h8 o6 c4 w, E( y# l' A- g( W
bpclear 3
. x. x7 j* }5 X. o4 ] 删除编号3的断点% B0 t6 t4 K, m, E- N+ ~" t
4 ]; C: f* w. t6 ^* F* K bpclear
* p* e7 I( ~' R2 }/ a, |& _7 t 删除所有断点
& c# l9 d/ V1 S0 ~3 X2 H0 Z1 i! h7 b
" A- e8 b) H9 }+ x) R
3 Q1 ^& }; Z/ o8 k: z0 J7 ^
1 ?+ |4 c1 F( ]1 w+ W跟蹤紀錄指令: trace
8 a; V; | F" P) r0 Z 例子:1 Q2 S; B1 }5 q- |" Y/ A& F1 t
trace 01.txt
9 }1 C4 x& u N1 C# ~5 L 跟踪当前CPU运行的所有代码, 输出至文件01.txt
- W! n! I) E5 o$ J k, b( K, f R8 U0 T5 S* X. B
trace off( v3 d- i6 K! f5 R5 F( X
停止跟踪, 并且关闭文件
4 j, A Y `6 b, v8 W2 ^5 f- h
0 E5 i# O C/ d' \" R, F( K trace 01.txt,0
6 n4 A7 `- |% K6 r. a. m# R6 c0 A 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt: W0 `% c! g/ ?. t" d4 v
- Q: m5 T( T$ L7 c1 M9 v trace off,0+ X4 _% l; U/ @7 z( n4 z2 P
停止跟踪编号为0的CPU, 并且关闭文件
4 A$ V: ]* Q; X$ D2 [ z2 T. x0 W! Y, o
trace 01.txt,0,{tracelog "A=%02X ",a}$ r% e7 ?4 ?) {8 `, H: t2 o: C: N) f0 V
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
' j6 s8 d! h* Z: _ 并且在每一行的前面, 写上"A=a "
, h' P W* z. B* V3 k1 F3 M! J "A=%02X ",a为一个C语言printf函数常用的输出格式
, a5 J+ ^8 Y; @* d! H 意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入
* l8 i a' c. d( M; d X表示为大写十六进制数
( B3 {) i4 f+ F8 t( m, d+ }. v8 B/ Q& o' `* t
* E. h. F6 N9 N0 B5 X- M
, G8 B9 I h' I4 ~/ `4 {% |7 P
内存直接写入指令: maincpu
) m& a- x" W; T- K8 h2 i# J' [ 格式为 maincpu.[][]@地址=数据
9 ^& y$ o6 `2 P5 a( R0 X( O 第一个[]:% X: |8 Q$ w7 n# k( {
o 表示ROM地址& u& C0 ` C T( Y7 H8 I' U
p 表示RAM地址+ i# D r0 P6 o. x. B2 ?3 \
) ^; ]) J% t+ j& C
第二个[]:1 u2 f% T& M! d% P# n- g, g
d 表示4字节8 R% {4 A5 v. U: T$ k" h
w 表示2字节) I9 G: v3 I/ k( C/ Q
b 表示1字节
( w G* ^2 @4 R. Z T, r1 C2 c; }
" g# m9 g1 K7 c7 R" U1 P 例子:
. F6 ?3 n, K. q; S4 F* }* u maincpu.ob@1234=FF
; N( c) y. o' F) @, I, C2 V6 Z 在ROM地址1234处, 写入FF一个字节! c) w1 k' E7 F9 F
& ^5 g, q, y% r/ x" D
maincpu.ow@1234=4E71
& o3 J; I6 X8 K) [' _% @ 在ROM地址1234处, 写入4E 71两个字节4 O" D' O9 L2 h w& U
r9 O6 T# Z: Y: D
maincpu.od@1234=600A4E71- A! T9 ^9 g% s% J
在ROM地址1234处, 写入60 0A 4E 71四个字节
2 q* a0 U3 D* [, D6 n4 x" z. I& O- h3 d) z- v8 Q
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
/ g L4 T# o3 l& T/ N : s# A6 V2 U6 @% t- {% U4 }
8 N$ i$ V( r/ T, ?3 X$ O4 H
其他:
+ P$ l1 ^) q0 T- g dasm 输出档案名,地址,长度
$ Z! p3 S7 R0 U 输出程序的反汇编代码
* \# ]: T; o& Q$ J# `& s 例子:
! d1 [3 D3 x0 D) B+ q5 V. I* z dasm 01.txt,0,100000
* P; k: E7 o2 x* L+ M 将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt4 W0 t, ~- r+ k& Q8 S7 L
2 m" \% y. H: x" Q" f# @' }
softreset
* l2 l2 }' e, L2 s8 D+ o 游戏重启, 但不重新载入ROM; _( V4 X* x1 n8 i" s ]2 `. r0 N% E
) e. v- j0 b* U) H hardreset J+ L0 q; b4 @+ w& z9 O
游戏重启, 且重新载入ROM) P. f R6 x2 p% t- W5 P
, [% E8 A% o% W
snap xxx.png6 _9 @: s/ r4 O
截图为xxx.png
9 ~8 `; X7 p7 K$ O- ]
) H4 w1 |3 Q8 k4 v! R! j ; x9 h6 b P, x" i; J
3 P( V/ }/ m4 |/ @0 Y6 k" b M6 Y
, p& f$ K& Q1 f! v x热键:
?/ [) E D- p" j% ?* s ~ 中断游戏
1 D# V- Y+ N# U& j7 C" @+ Z, f5 Q F5 运行游戏
5 j8 d. o/ t3 W: Y* J$ Z. p4 I F12 运行游戏且隐藏调试窗口4 C+ t& l% n$ H4 \' p
F11 步入, 单步执行, 会进入子程序
$ }( [$ K( X: M6 ]. q' i1 _ F10 步过, 单步执行, 不会进入子程序
! F' i# ]5 V6 s" `' B3 w- u Shift+F11 执行到子程序返回' \* \9 d7 u% D" B4 b
Ctrl+M 内存浏览窗口; s& D0 B4 ~+ Y- M3 o" a
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
0 J, g8 b9 m5 P$ l8 O1 w
' e0 u) r8 o, y' H4 ^2 l6 ?{:4_94:}
; y U/ v% f! ]/ c: t$ s
# W4 W5 ]3 U5 D' J6 y9 e' u: o |
评分
-
1
查看全部评分
-
|