|
|
# ]- l8 m: M- r. P: v4 U. c- O
很快速的整理我自己常用的指令( A' B- w9 S6 J
+ r8 R6 r8 D5 n* o; T% w- P0 e
{:4_112:}
/ f" O, r1 E/ Z- U( e3 ~
8 Z, m9 E! m3 q0 _6 U+ s1 bMAME DEBUG常用指令
. i6 b8 D( A. `3 O+ m0 y' X
' B: Z# H( B/ }3 x内存搜寻: ci, cn, cl3 H0 ]0 |: `- ~9 t: d; U' {
3 C! ]; l. Q- H* B' F4 M8 O% q) O' ]
ci
+ y7 ^: [) R8 {( C9 I8 l* [( I 搜寻任务初始化, 每次搜寻一开始一定要输入这指令, X1 I/ G( v) L7 K- [' X+ I( [7 m
4 w$ Z+ @' E. Z' y
cn
" r- e7 h4 |* Y8 M. m 搜寻指令% V6 }& M/ H) N# D) t) q
例子:, h$ R4 g2 g- R' o0 V
cn eq,608 H! z6 q7 ]1 v. ]# `) A9 E/ X* W
搜寻目标等于60 (十六进制)
* p, {/ r7 h0 t0 |. H
7 W3 z- j t( d& s cn eq,#963 Z! d# g/ U% B, L- H, y# f7 j
搜寻目标等于96 (十进制); n! n$ v& a0 T6 s7 K
! ^/ N# U; l4 k9 Y2 h c cn eq; R4 k* k! }0 v) C( I! h
搜寻目标的数值没有变化
9 Z1 w$ y3 O) N3 M4 t6 X: h" s; [% m! F1 ?0 z/ w
cn ne8 `. O4 x8 C3 e7 F' f. @7 i2 l
搜寻目标的数值有变化) j# z! e4 b. n
% o9 w3 T! ]& R1 J9 J7 x cn +7 K1 e& O% Z% r: h3 ^* P: T0 m, h0 M
搜寻目标的数值增加( ~! L( f. a( v' o9 h
$ q6 s% W5 v0 `+ k8 ]/ ~5 `
cn -
, z2 w+ P# e4 m1 X7 P5 T/ x 搜寻目标的数值减少7 P( P' S: o+ ?8 h
! u. s0 e* [6 r$ J* t cn +,34 b" B* A" Z& k, O d% H6 \. e) Z
搜寻目标的数值增加3 (十六进制)8 j0 `1 D/ C+ M7 O9 k( g* E: l# N
7 _, s9 @7 C5 A' L# A! k! z+ `
cl) G6 |8 r7 O! b) ] T' _
列出所有搜寻结果% Y2 S8 N+ |8 V" ^. s" Q, C
9 E7 T1 Z7 j' f( L/ k
cl xxx.txt2 i; Q- `/ W; ~- r. g1 H
输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式1 I" S/ Z; f* ? ^5 b
8 L2 ?0 L8 v- T. x3 Y2 N
) K8 o& }: u/ W9 K8 |内存监视点指令: wp, wplist, wpclear
, |9 Q& i5 p* @, l- ` j. p1 p 例子:' ?$ Y, N+ U4 L- E. J% ?6 y+ S
wp 1234,1,r& I$ b8 \9 z, S3 ], G
在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1
* b4 ^! ~5 M0 p" Z& l5 e7 {! n7 ?: E1 [2 Q V3 E4 ]6 C: o
wp 1234,2,w
# O4 r. {3 K0 q W! T3 a 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2
$ _) x! E- e# Y" D3 b9 [( W0 L1 @ & V+ R: ]( W4 q
wp 1234,6,rw
, Y# p# y9 M- U' D& k+ ?9 C$ f 在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度67 q& t$ C$ k2 o
: l" p/ T& a) S0 Q8 \. } wp 23456,a,w,wpdata == 1
9 ^8 S8 Z' n6 `7 Y8 V7 K# M 在地址1234下写入监视点, 数据长度a, 且写入的数据等于1" L/ p6 Q" J* U* m- P; q
# p7 z! z1 n8 n2 C0 W8 X2 p
wplist% `4 w; O0 Y9 v2 o
列出所有监视点4 u6 U7 p+ {1 U1 c5 W; E9 o
) q, X, ]( _! \- q B* x wpclear 3
& d0 v8 F/ r. t- A& ?5 L 删除编号3的监视点
/ t6 x6 x! z! E) q9 k( j
6 X* p; ]6 c7 z wpclear
3 U: }7 ~. Q$ Z$ e 删除所有监视点+ t! W1 N" c9 ]' ~
% j9 x+ U V9 c7 H; s8 |( i
7 Z z) r* P* e/ Z, r" Y+ G
5 }. T0 C6 @" z$ J* I
程序断点指令: bp, bplist, bpclear
2 `& I3 q- W9 U( O 例子:4 o- B8 D4 g& [1 Q3 ]* u
bp 1234
+ f. p0 ~) N( _% Y2 [1 F& Q 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断1 u; b9 J7 H/ }; d6 Q' e
5 l8 f' B' \0 ^3 ?9 j9 a bp 23456,a0 == 0 && a1 == 0
7 g7 X6 {! }7 s. T# p, k4 \/ V" A 在地址23456下断, 且中断条件为a0等于0以及a1等于0 _5 I0 `% \) [3 {% u+ ]% i
. m3 R' R* `4 K9 f
bplist. y4 A; W: w- z. S5 x; V
列出所有断点
* j: x! H9 Y4 _8 E& e* D' C! U( S) D0 K& x+ k# M0 M( U0 P
bpclear 3" o, k- Z7 p" x6 f- n
删除编号3的断点. X8 M7 ^: P1 f. i
6 ^1 P1 r0 Q+ c
bpclear/ G) Q6 n: Y, t2 M- w; t
删除所有断点0 K" T+ z) f" H x& ?4 n
4 ]4 w, ~+ e8 x# b J6 x/ q, A! ^6 l* W0 d
' I1 U0 q( ?' Y" C( [跟蹤紀錄指令: trace/ K B, x0 {. \+ w+ B5 J
例子:8 @2 p* R3 R8 B* Q7 z& \
trace 01.txt
- }/ H/ _4 |( E Y2 a 跟踪当前CPU运行的所有代码, 输出至文件01.txt& t% H; p; w4 ~4 Q
1 p1 G5 i, [5 p; ?* b trace off4 F+ p4 K0 q9 d& \
停止跟踪, 并且关闭文件( }8 B' U# a2 e4 X
9 I8 C( O% ^ E2 N" x6 u
trace 01.txt,0
8 {$ n2 c' P: O" U 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
% ?9 F% J4 `' X( {
' g' G* `& l3 U trace off,0
2 [2 W' j) l" _( V 停止跟踪编号为0的CPU, 并且关闭文件
, w/ Y1 C1 y# Q7 O9 G+ Z3 Z+ d+ f) e( O9 ]4 K
trace 01.txt,0,{tracelog "A=%02X ",a}8 z- X9 L$ T! J
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt " k" J% P/ N" E0 M+ ~" J
并且在每一行的前面, 写上"A=a "
; d6 k( v, ~8 X; j$ U5 V* F, F "A=%02X ",a为一个C语言printf函数常用的输出格式
) N2 X9 ^9 g; Q' X; w1 i) J. A 意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入
7 [" n- _7 J+ r, p( a X表示为大写十六进制数$ C6 z1 C) ~: g+ \5 D( z( {
. j% G9 ?+ u/ \* m: |" B& g& p% H, m8 A# t; F) q8 X
& ]+ {- b% A7 W4 ]内存直接写入指令: maincpu) p! u0 k" [8 y: Y. o. t3 L
格式为 maincpu.[][]@地址=数据9 O1 i8 p0 r0 q/ V4 C% i0 M7 Z) Y4 C
第一个[]:
& `2 m3 l. c2 D2 h8 Q2 L: G6 C o 表示ROM地址3 f% z5 l* m1 q, C) P
p 表示RAM地址
: O7 T$ v ~4 H H9 |% Y
" U# j1 R6 w9 o: V2 F 第二个[]:: j. a$ a, H0 G8 D* v
d 表示4字节) M9 Y. H& u" n! Z
w 表示2字节( A$ O0 l+ C5 T# t& E
b 表示1字节
" Q( ?. i1 m/ H) B2 n
' v( R9 X; I+ `' j7 |8 A4 { 例子:/ X1 P: X* s+ {3 d) r
maincpu.ob@1234=FF) O7 r) d( j ~
在ROM地址1234处, 写入FF一个字节
@+ t; D, ]$ m+ g( s H* n
8 v2 @7 }& ]0 l2 Q4 y+ `8 _5 h maincpu.ow@1234=4E71
' j ?' S- L1 w 在ROM地址1234处, 写入4E 71两个字节2 F& M( D& s6 d* c$ T
# t0 ?( u* B# { Q8 {4 D. {1 J maincpu.od@1234=600A4E71
8 W3 c9 N% n) h7 X2 E4 c2 Z9 e 在ROM地址1234处, 写入60 0A 4E 71四个字节- P- Y0 _' |/ _2 P C( l2 d
- K3 `9 x( O* E5 D' O# W
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
/ [" d' A/ [* B6 C4 e2 e
" ?- r, B' ] R3 J7 F6 E$ J2 a9 Q. V j# E
其他:) ~! c/ [. r2 Q e
dasm 输出档案名,地址,长度
" c" K; `3 ]4 E2 W) e 输出程序的反汇编代码
/ \3 ]4 E' U7 u+ d 例子:' o. _: o; q2 o; ^' Z
dasm 01.txt,0,100000
. r" j- a, z: N% r 将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt
$ L5 Y1 B: d! x" ]$ q+ z
9 ?+ o7 @; S* Y- }4 ^ softreset0 [9 f' u9 h4 P1 E2 Z8 c V
游戏重启, 但不重新载入ROM
: T# J( A8 ~2 H7 I# ~" D V
" N7 C) @) `2 e hardreset" H- Q! j2 X& i/ I: Q
游戏重启, 且重新载入ROM
' l) Z" H5 n8 o7 Z6 c8 F' f* n6 W' d. q9 Q, R5 ~& F0 Z5 D
snap xxx.png
- d: W% D7 G2 L, N. z _ 截图为xxx.png, j9 U9 f) m( y
5 G' [ k; m' S6 A" P5 {: k ; q4 W& U6 V# {
( X$ H+ E/ Q2 `) V- p: P. ]* { 6 B) B$ }( f+ I2 }
热键:
, o2 Y' n' z b+ A+ n, ]; z1 M ~ 中断游戏
6 {+ I% {+ m2 [6 P6 V* r' d F5 运行游戏5 \& u( | \' E# l% n" s
F12 运行游戏且隐藏调试窗口" C0 K* @7 r% X, F4 S+ E
F11 步入, 单步执行, 会进入子程序1 ~: O0 D+ a1 U
F10 步过, 单步执行, 不会进入子程序
2 [3 _! @6 M& j0 r* w Shift+F11 执行到子程序返回* g# D/ [7 X% H+ |! L
Ctrl+M 内存浏览窗口
: K( I! o# i v# Q' J7 b1 q% G F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
. s; v m$ m0 l, s# }. Y6 X
9 w) G* J' N, p6 v; J* X{:4_94:}
, N' ~7 [1 u' r5 a& d- P/ K& \% C% G" Y+ [
|
评分
-
1
查看全部评分
-
|