|
|
. t+ V6 K, w3 `. B& c+ @很快速的整理我自己常用的指令$ ^) E& s8 J5 H& I. u8 k
5 `8 ?" _" S9 b) B. v' G{:4_112:}
: h! \# h. f' X q. @5 L3 [# z6 ^3 r" w" k( ?4 ^
MAME DEBUG常用指令4 c1 S) ], T7 Q/ H* D+ X
* I- q5 s) e0 a7 {
内存搜寻: ci, cn, cl
! N+ x( K. t5 a/ p/ q; b
0 h* h- @! P/ _/ m' b" z ci
; B K' g4 M6 d/ r 搜寻任务初始化, 每次搜寻一开始一定要输入这指令
2 ]& P5 ~* ~* \- u+ g& P2 E9 b2 c. X" |! d* ^$ p
cn
) s7 H* M& c! { u 搜寻指令
0 }. h+ s8 p! h2 D5 E% C 例子:
$ v( N; M8 C3 A cn eq,60
! B7 e" m6 b6 @2 `( b# h+ R3 ^ 搜寻目标等于60 (十六进制)
$ @8 J; a& U8 ~/ w2 H. X! b3 u' { . ?. j3 k3 s" w9 O; P
cn eq,#96
) p, B+ X( Q" l! N 搜寻目标等于96 (十进制). Y. x# d4 @& s$ [- [
9 X3 ~) p5 c ~* _/ H* P& ~
cn eq
. |7 I0 a& @- ]1 ]9 h1 ~ 搜寻目标的数值没有变化
( B: G p( v V U7 N* h% N& C9 k0 v: N8 |
cn ne. [) ^& I X& m& h6 m1 m8 M" `
搜寻目标的数值有变化; L$ m% C2 D: |. d5 }3 w
+ n9 B6 F; h* T" Q* m1 t* W. ` cn +, d8 t# f' q$ |/ }" z
搜寻目标的数值增加' l$ J% U0 t6 n% ]5 `1 `
4 E8 D5 q6 C Z m
cn -2 T1 b# P; P; w8 ]
搜寻目标的数值减少
/ |. W9 w$ Y0 ?/ K& G$ d: g8 [ $ C3 R% J( d& ?( R+ ]
cn +,3
0 [2 Y6 X" \! y- ]' P 搜寻目标的数值增加3 (十六进制)* x- j. u6 q0 ~3 ?3 }. D
$ [! Z( i, V# z6 v$ M2 P$ l, O h2 C) T2 h cl
( v; L7 Y! z5 n9 x: _3 D 列出所有搜寻结果
6 `8 F* E$ u* ]! P" h6 M( {& E5 ]( O6 ?& Q
cl xxx.txt
0 Z0 \6 P. q( m6 L+ C& f# S: ^# k7 E 输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式
' L1 k: E6 f2 S( A+ y" \3 B5 l: ^% R# B+ q, I
# A: s% ]2 p: E2 v" A# n& j% E内存监视点指令: wp, wplist, wpclear
8 x. C' z: ], O) l8 [ 例子:
3 w6 w3 y' r* a wp 1234,1,r* T G( ?4 m( X
在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1
9 O5 S! H( N! P# \# N7 Z2 ]0 \7 ?8 M% o5 m. {! ^1 B9 T9 X- n) n
wp 1234,2,w- G" f$ R$ A; O, V5 v% [; Q, U
在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2
1 W/ ?2 R7 G8 m7 N2 f
% W7 p) k7 c, ~" X wp 1234,6,rw* |! w9 x1 Q9 ?) ]1 y0 u
在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度64 I- d) u$ i+ C8 C
3 Q( j- A1 C1 J1 u: J
wp 23456,a,w,wpdata == 15 _1 p( X8 O8 N1 {1 A: s- l
在地址1234下写入监视点, 数据长度a, 且写入的数据等于1, d! l# t8 U u5 s5 |; Y: b( f
% o8 R! |9 Y k5 ^' P* ? wplist
/ Q2 p) v* p' E& V* {1 c 列出所有监视点
- G0 A- N7 u# F. M2 y2 ^' C% `. a0 q- f
wpclear 36 |3 o0 S+ e) o0 P5 l4 k
删除编号3的监视点4 g2 s& b) Y8 A' |; k0 G7 M7 d& g
0 J" |/ s/ E `# h wpclear
+ Z; e0 \5 S4 u9 Q) J 删除所有监视点
3 f* K# ` M) l5 w9 d3 {- z! ^# d/ N6 J' i& @' ]! o
+ `: W- `) V6 u# o. X3 M
: M* \6 S: Z9 G
程序断点指令: bp, bplist, bpclear$ ^, [ J/ A& e, N9 J
例子:0 [5 z; O# H0 n' z: w
bp 1234
% E/ w$ \: u7 X* t( R% e 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断
$ l8 p) ~0 j' @- e
; L2 x5 V# P0 ~5 {" q/ O" P bp 23456,a0 == 0 && a1 == 03 S3 n: B/ a0 Z" H& ^
在地址23456下断, 且中断条件为a0等于0以及a1等于0) c# `* i& Q+ F1 |# _ U- l9 w
- J$ T# ^- j' \, [* D% g bplist9 ?1 `8 A2 Q: P0 }
列出所有断点
7 r: w/ k, R3 R f! h3 P+ R! m" b; ~( Y7 u0 z3 M
bpclear 3
* x& m3 t( s* X* ~ 删除编号3的断点
, h- r* d" b7 m! x# s1 T
. b& r7 G- [- G6 ^5 O" ?( v bpclear
. u$ Z+ _" l& |- n1 J. x2 @2 E 删除所有断点- y2 I' S! g* Q
" z' @/ w& z2 d( x/ x5 e
% \2 D0 c' y& S1 p8 R8 J9 u4 J
& }( _* R. s$ H, G9 g5 x跟蹤紀錄指令: trace
8 P- A8 @. F2 {! C" P 例子:4 a+ |( w) X+ A+ J( O j' c y
trace 01.txt( Q+ \% u B$ U4 ^
跟踪当前CPU运行的所有代码, 输出至文件01.txt
5 O+ r8 K, i1 g1 S7 G' O; s& V; ~/ Q4 h% ]% [3 Q9 _
trace off/ X& d3 Z* l" U
停止跟踪, 并且关闭文件8 z' G: z; H) y
" g: U0 J- T# S; }' j2 R trace 01.txt,0! a# i! I! Y6 h2 [
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
r! f8 f w! s" O( q& w( k" o9 \
) B: u& f3 I* z trace off,0; m. o4 ]5 q. R: o
停止跟踪编号为0的CPU, 并且关闭文件
2 V. @. Y6 |( e2 i; }" s, K# E* V$ w+ P1 w9 i' }* E9 d3 P
trace 01.txt,0,{tracelog "A=%02X ",a}; ?5 U5 l" \, O
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
u( B4 @) y! K2 k- z2 M+ K 并且在每一行的前面, 写上"A=a "7 V L5 g, }7 y. Z, |
"A=%02X ",a为一个C语言printf函数常用的输出格式" m, s1 B) H9 z; I
意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入$ U/ T @$ g! s$ ?6 f/ _
X表示为大写十六进制数% e# v3 D4 T9 R$ @/ Q! E6 G
2 G4 O, l! M$ q. F; j3 o( N9 o: |
/ \' f8 ^! `6 d T
- M6 g, |/ g1 K内存直接写入指令: maincpu
/ ^; u- L5 y) n: o9 ? 格式为 maincpu.[][]@地址=数据
: l- H- Q2 Z; a) r& @& o 第一个[]:
6 p8 k: x! ^6 Y& C+ G o 表示ROM地址2 n" M; L, t8 S: R) t
p 表示RAM地址
) V3 k/ m2 G# `' d: L
* W O8 J& |" H. P7 @/ J7 ~: c# R- v0 y 第二个[]:+ @* }$ ^4 \3 w" V8 d, H
d 表示4字节0 @9 I6 @, X4 j$ u6 p6 K
w 表示2字节2 y' s0 j! B, d3 v/ O
b 表示1字节
) t9 p3 q7 ~. j$ v ?
. ?9 l* h6 ?' j 例子:: b5 \% [ ]3 }+ b
maincpu.ob@1234=FF! `" t; y. X7 b! T! @; P
在ROM地址1234处, 写入FF一个字节
9 s# @3 ]9 v" ?" K. z( ?! H' X
8 S8 t% j3 W* [1 ~6 p1 a }& a maincpu.ow@1234=4E71; ~: ~4 e' O( O
在ROM地址1234处, 写入4E 71两个字节8 z3 z' p' k7 B% Y( }( a: k
- R) \9 P, x: d' S maincpu.od@1234=600A4E71
2 k- G9 G$ g: k( E 在ROM地址1234处, 写入60 0A 4E 71四个字节) z% l, v( _5 }& h- y; C9 @
0 e$ U' }( x" K \, i
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
! N, R1 b' F; e
7 i2 Y v( @4 y6 L( L, T4 O$ M5 u. H/ f# w0 S
其他:
, t0 g& P( I0 @: k# b0 L7 j dasm 输出档案名,地址,长度' v9 g5 L* h2 K. j# F' c
输出程序的反汇编代码) c3 f4 n# n5 i" S r2 M$ S; V: K- t6 v
例子:
& }+ h& t* O! y" ]1 l dasm 01.txt,0,100000
0 D3 s/ Z. f4 F8 }3 T7 \ 将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt8 g' p" k& E' y2 U9 T* `: w
! I0 V) \4 X1 _; M' ? softreset
) t* e& ]0 c, ?+ J* G" \6 ~ 游戏重启, 但不重新载入ROM% Y6 a6 {0 S! @! M0 [2 V& m4 k$ c
/ |: [( X; `5 q* {/ c
hardreset' T* J) f' J7 V8 b; ?
游戏重启, 且重新载入ROM
$ w/ C( x- ~* d0 @" X" k. O6 f# C) ^9 Q! _% x
snap xxx.png
) j( W3 w) h7 n2 T" {9 d 截图为xxx.png" }1 b, J/ U1 V5 T6 d( W) l
2 g$ a i5 H& k8 C( u
# A7 `( k2 y: V ; o) N; q- q8 o0 F3 q. m
' \0 V) z/ R9 n热键:% L" W: E7 B! _* P; W) w
~ 中断游戏
* t, h: D6 W8 c7 ]# ]2 x F5 运行游戏3 {1 g4 h4 p& \( x$ F
F12 运行游戏且隐藏调试窗口
8 q" t9 M9 J5 r( X f# U2 M* }/ t F11 步入, 单步执行, 会进入子程序
. ^4 @& b j3 R+ U5 m2 k- E F10 步过, 单步执行, 不会进入子程序
) F8 s2 a6 c5 _/ G Shift+F11 执行到子程序返回7 L0 r( Q, h& [+ {
Ctrl+M 内存浏览窗口
! m9 S" {9 I* I; \ F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU# Y' q& X; k& C* U" Q% `, x
2 |% a0 h0 V1 b2 ?- r{:4_94:} @) O3 p( P- Y% H& i
0 F9 h: m/ J( c! M/ c
|
评分
-
1
查看全部评分
-
|