|
|
8 |9 w" Z; }. V, a; M! v+ ^2 [0 x
很快速的整理我自己常用的指令
- [( Y2 j, g, d
4 t4 @! U" p/ I; C& z2 Y L{:4_112:}
& G) E) }' W E, t4 C4 L7 i6 ~6 y+ v, e" w* H7 H7 G: J
MAME DEBUG常用指令
3 p$ d+ I$ F5 u" F/ J
' j: A. ?* d1 v' N! A8 O内存搜寻: ci, cn, cl9 j8 K: x( _) ~7 h. U
/ z B [/ k+ B8 ~ ci
' t* r4 P$ F; j 搜寻任务初始化, 每次搜寻一开始一定要输入这指令% C* `' N. p) i j
% C0 o! h& z! h
cn
7 T! m( n, n* ?; m# c 搜寻指令1 i) R" o0 X c/ M* d6 H+ U2 Q
例子:
w ]! S# ~9 C4 J# |' s# V! K. n cn eq,60- z& M6 Y& G2 I+ _, R" S3 u
搜寻目标等于60 (十六进制)# D+ {1 T$ v5 G3 w
9 X. c. W& Z( E+ h7 ?
cn eq,#96 Y$ Q b3 }+ A ~
搜寻目标等于96 (十进制)9 ^6 ^- O) J& u( ?, i( h" z
' I% }! Y$ k& `4 C, c4 J cn eq
A# T; K [& _0 b) @; w 搜寻目标的数值没有变化
2 ~" }; i! W4 T& F" s0 s5 q; {! R. e- p- d, j
cn ne
( Z& Y, M ~3 v0 V& N: k* q! j0 k' y6 D 搜寻目标的数值有变化: G" Y0 i/ _# w. k5 J3 O
; q/ K7 w8 Z" m+ H3 w, { cn +
6 X4 }% L7 e4 ^. ?4 s& G7 r 搜寻目标的数值增加" g: V8 y4 G, P! Z% v, g
: }/ W C6 o. U1 Z' @. H cn -
2 F6 L! ^& Y2 K) @ 搜寻目标的数值减少! I7 z9 {2 k3 A! I4 L" _
4 e$ c3 b m9 B% L* e. H# N% f3 n; J; B
cn +,3& g3 L% G. V2 @4 ~4 x6 k
搜寻目标的数值增加3 (十六进制)
, o4 S( D8 W9 M$ \
. H2 x, W+ ]- A4 r1 U5 S2 F cl
) d# B4 `( S+ g: I: d0 z 列出所有搜寻结果
0 g3 B& U, r$ @; g" j0 W; K: M4 i" i/ ]; g! g7 r, T. Q# G
cl xxx.txt
* _" S" r+ K: e% b 输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式7 c/ G( @' l- x( u2 N4 G' J9 P
3 ]8 v8 o; I. b
2 N @! D' ^* x: m, Y4 f; b. ~内存监视点指令: wp, wplist, wpclear
! a4 [% a! Y2 A0 p 例子:
4 @. v2 `' \0 l6 e* F wp 1234,1,r" l. Q9 u. N% I
在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1
+ ~4 N/ @1 h3 P- }
2 \1 c9 `6 v. t) w1 { wp 1234,2,w
! {3 X' E4 i7 o! s* ?5 h* g% K 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度24 \& W6 f6 @. ?2 X
1 [ G4 x: _5 ^$ @3 \% g! ^
wp 1234,6,rw
5 v/ n/ f' z k0 y' j 在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6
6 s2 T# p0 j9 g* j, |4 s+ ?- v Q# ?! h) f
wp 23456,a,w,wpdata == 1. g; t( u: w0 `
在地址1234下写入监视点, 数据长度a, 且写入的数据等于1* t3 K" `1 }2 V0 r+ Z
. `" W1 X' r1 D0 R
wplist+ Z. h: R' k, S2 \$ h4 H Y) I+ V( J
列出所有监视点
4 q. |5 w; t! P3 g' V5 s. ?
! m' D% I0 _) [8 | wpclear 3
0 |1 p" X7 P, B5 y% b: } 删除编号3的监视点. X V. x0 X% T0 u
: e$ _. ]$ g- `, J; U9 t wpclear
* d$ A- D7 c2 Z, j 删除所有监视点% l2 F4 @ X+ z7 G( e. t
: q; ^! Y) I7 P! j g
+ F5 q5 `7 W* E3 ^* z, Y5 X) `7 z7 S& ~4 r, U. k
程序断点指令: bp, bplist, bpclear$ Y: Y- u5 F+ e% o& W$ m8 }* f
例子:
% |4 Z, @ f2 C" [1 k( v3 }' [8 | bp 1234
' s9 W. X: f/ ^ D& g8 Z- } 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断* H( Q1 c, H! g2 N2 P
7 \/ e& V! L# A3 z: ^ bp 23456,a0 == 0 && a1 == 0
! ~ J$ _+ \. [/ }6 N7 d 在地址23456下断, 且中断条件为a0等于0以及a1等于0- o( y. ?7 J2 _& e7 A5 {2 X& ]
/ U0 m# m0 r: z bplist
9 M* V$ Y& i$ x K4 Q2 ?* k 列出所有断点
- A. i% {/ \# u9 _+ Q0 v% _$ Z5 c
bpclear 3- L( V/ `$ g2 T3 s0 N$ C0 j
删除编号3的断点: k2 N( J! z1 Y9 L7 x
1 V' F3 ], `+ J r0 G bpclear
- b9 ]" Y- o& z5 @, v 删除所有断点 H4 [3 ~ Z3 Z
2 R' P2 e P! s0 w; B: n
, r5 @+ M% v8 O8 H( X
4 [) A% j- q, b3 G6 m2 w1 w, ~! S
跟蹤紀錄指令: trace
8 K, B" k' | O' z, |% L 例子:
4 O# y: h7 t# X$ ?8 w) ~9 r trace 01.txt( v3 ]! l/ y; {: [
跟踪当前CPU运行的所有代码, 输出至文件01.txt
6 [+ d" R8 F4 j* T, U7 S) E- F7 u
$ ~4 M% } }* Y6 h/ l: X trace off% E- b. s7 s: J M! v
停止跟踪, 并且关闭文件
7 I: c* b1 q3 E" M( |3 F
1 _7 o$ S" q( U1 S! } trace 01.txt,0" n+ ~4 H$ p, K5 q# Q4 N
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
4 p/ `* z' u" Y$ ~% d1 }0 m- P# k& a2 ~7 _* m
trace off,0
9 W- C! B# [% n$ ^ 停止跟踪编号为0的CPU, 并且关闭文件$ Q& q A! w- w1 ~' @5 u5 Z
8 u' v$ `% y* x* C' u( B8 a
trace 01.txt,0,{tracelog "A=%02X ",a}
2 D' o' l. ?7 T) `, I8 a 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
* `. i( j9 m( z. M1 z6 K 并且在每一行的前面, 写上"A=a "! v5 S5 F) U% X, a4 z$ |
"A=%02X ",a为一个C语言printf函数常用的输出格式- u1 ~; m/ @, O' J
意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入
- F3 o5 {+ C3 h- A1 R' A X表示为大写十六进制数
4 A: r# b; ^$ B1 T
i) G3 r. C4 g, ^7 P: g
( [5 ~( i6 C$ o4 ~, Y7 M6 a8 H- B3 u" U2 h# O! c& o. j, ~$ A
内存直接写入指令: maincpu: j3 _1 ^$ j* \7 O7 f
格式为 maincpu.[][]@地址=数据$ c, `9 l+ s3 e% h% j8 j- |) A
第一个[]:( z& i4 f' d0 O3 @/ R: T3 q
o 表示ROM地址7 o7 ~1 ?/ r# Y0 o
p 表示RAM地址9 G! F* d: ~" l4 u; M# N
4 U8 f6 _! U5 u
第二个[]:$ a/ Y" M- i) S) u) W+ X+ H
d 表示4字节2 h+ i, j: T) u; k, {) U, d
w 表示2字节
6 @, C5 i5 G. a' S% [2 ^4 N b 表示1字节" p0 \3 P# U, Z, _
+ i t( u! n' Q: V$ h8 F: I
例子:" e2 _/ v) O' }( v6 ^0 i
maincpu.ob@1234=FF. K# ^3 J/ r/ H" _- t8 x* ~
在ROM地址1234处, 写入FF一个字节+ |" W6 V2 o! z. {1 N) K
' l. F! m9 E w5 D- W maincpu.ow@1234=4E71/ I- \9 p: h" s, r' B9 B) ~+ M
在ROM地址1234处, 写入4E 71两个字节. N6 k8 u: [3 q* X2 P7 t2 n+ t8 p
; l$ e8 l7 B' A A7 T. y1 X maincpu.od@1234=600A4E71% P# G3 a8 k! G( J/ U
在ROM地址1234处, 写入60 0A 4E 71四个字节
+ O; e! S* E/ N4 y$ u* y! p- _3 T/ s
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写" X! t% _ g; j& A: Z
+ e$ j, B x( t7 U; q2 S% G
/ S+ v' ]6 l0 _# I8 I其他:# k. V' {) X0 g3 D4 J. ]4 w
dasm 输出档案名,地址,长度: J2 m/ d" c' }, m% O3 d! n
输出程序的反汇编代码& g5 m3 a" T- Q6 X) X: ~
例子:# x: Z" q8 C7 O% x! N; v
dasm 01.txt,0,1000001 {4 L$ H6 r4 I7 k' r* F
将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt
( j. q0 p4 w3 w# l
4 {/ e8 z, K4 W! E softreset
8 a- h2 w5 O! ^* k1 ~0 h5 k0 w 游戏重启, 但不重新载入ROM, A+ Z; a' m$ r; e, t _
1 n, l; e1 s) c7 S8 e
hardreset# V+ Y+ k3 j0 |$ E" I5 j! n
游戏重启, 且重新载入ROM
" Z' Z" f6 J* Z5 ~7 @! D6 m' @3 {5 s
snap xxx.png& B: P8 n7 }4 N* }$ N6 U
截图为xxx.png
3 o: y1 l/ i2 B6 r; ?: \, d! O' n3 ^$ h3 i2 @
. a: j0 p* C! g& D5 W 8 r& o& g4 t1 f8 D: J, [4 e) R8 s
6 u! T+ `7 K! [5 h& l h( z% w9 C
热键:, p6 O G5 h" k% l! x' s
~ 中断游戏5 }+ f; H8 k3 [& t& i4 N
F5 运行游戏- K- }. R2 k5 t2 A- j# z1 j* D% k
F12 运行游戏且隐藏调试窗口# [* S; L$ Q) f u
F11 步入, 单步执行, 会进入子程序
4 @7 Y0 v0 D- b s$ e F10 步过, 单步执行, 不会进入子程序
' ]& G' l* b0 c0 e' F9 @6 m9 r Shift+F11 执行到子程序返回! g: \0 b( v/ e) z" K
Ctrl+M 内存浏览窗口' `+ e, b T9 s. a: H. b
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
: P2 L; ~: V# h7 l+ V5 ~
; e p) u. \* `" X7 z) |# i{:4_94:}
1 z! w, W% M# Y" }3 K& g0 t7 \4 [
$ O$ f; M$ u9 u% d ^3 K# l |
评分
-
1
查看全部评分
-
|