|
|
4 \) `4 |. e& g* y; w! [1 U, V
很快速的整理我自己常用的指令" h0 |8 E8 v: k0 f* T; Y
& a3 r7 N, L$ s9 N8 A# ^{:4_112:} " U- z- n ?/ Y; H
: h# ?& X5 g# }; B) _ w
MAME DEBUG常用指令( _! \ I- W6 W9 Q! \! D* W
) W% ?, ~7 ^( S j5 M1 `) }* b内存搜寻: ci, cn, cl# F, N5 C* \( r7 Y* E8 X% Y( j
1 [3 Z g8 j H4 c' ?, K! t
ci
6 O4 }: H% W2 t( p 搜寻任务初始化, 每次搜寻一开始一定要输入这指令
" A( p( P* [; ^! Q5 {8 w! V: p) k; ~+ [+ A- h1 ]0 M& o
cn0 T8 H- A- @ Y5 p! ?
搜寻指令
: O2 o, u$ u* e/ u7 E, F5 X' N' _, n 例子:
+ A1 ?9 ^$ q8 `* y* v cn eq,60
6 D$ J5 J: i- n* [7 V9 ` 搜寻目标等于60 (十六进制)# C& a4 P8 Z" S( {7 { f
# l3 p" i0 [# G* p4 V# ]4 [" r cn eq,#96
9 t) R. U$ ~/ q2 X) l# M2 F* y0 d! N 搜寻目标等于96 (十进制)& a+ O8 X3 t# a9 b
' ?% Y6 R4 {( D; \) Q cn eq* S5 u- |. A9 c5 m
搜寻目标的数值没有变化6 ]& z1 M t: h8 g% ?+ M+ {8 ^
; w# k* R1 \' L+ \9 z: V
cn ne
' U1 u' { H/ d) D: [7 a 搜寻目标的数值有变化' J' F J- A5 t7 ^$ B! `
& c. f* P5 w, y. e3 q" `6 K cn +
! u' l S8 Y1 r4 \' g* a, v1 a 搜寻目标的数值增加5 w/ Q$ L+ G! {: G* q h( }+ h
' x" @+ d) T# u! ]6 l3 Y cn -8 w& j! G6 H: _4 \ Y' `
搜寻目标的数值减少
' ?( q# `: h* c) ~- F, h
: h; b$ h9 S$ m$ d! f/ Y cn +,3- ^" `, s; I) H2 U& P2 _/ S
搜寻目标的数值增加3 (十六进制)
& S/ _. z0 H2 o
& x1 w6 m; o& a9 @$ O! F1 E cl
9 r8 ^! {" Z* B 列出所有搜寻结果2 g+ N. k* H1 }6 A! Q+ w3 [& \
6 r+ }3 K; B6 L, G$ J cl xxx.txt8 b+ B- V2 [* b% j
输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式
' f( K/ W3 u. Z6 o, q( o. y l5 D9 h9 g1 L/ t: g, y
8 R/ X* X. p$ z' M内存监视点指令: wp, wplist, wpclear
1 q+ ~$ h: c9 K* \ 例子:
$ v3 k) ~/ `( E/ S7 Q! t wp 1234,1,r& W* T5 m- `8 G, j/ F3 |. v
在地址1234下读取监视点(该地址被读取的时候中断), 数据长度18 u: o5 _+ Z3 j3 t, P
+ `4 i- ~: G, H( |$ Z6 O
wp 1234,2,w
0 j1 h" n$ C0 D0 o 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2
. b3 X* v; M" Y, u) {/ W2 z; a
2 J- f5 M$ P9 J% Z! a c wp 1234,6,rw
V% h9 E4 t# [) [8 | 在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6
+ K# W9 z& [- U" Y1 |5 G. `" r2 m1 J, a) o# o
wp 23456,a,w,wpdata == 1
/ |, e: F' t) H( [3 t. S6 j 在地址1234下写入监视点, 数据长度a, 且写入的数据等于1" _( t( x Y; j* B, T7 Q. ]
* t# D p8 j* K( e) b( i
wplist& x! f( M; ]* ^8 `
列出所有监视点! q( ? P3 F" {7 r L
' M8 E" S( M9 z+ R. M! I
wpclear 35 ?$ V- V( A7 q" Y% m2 e- h* T
删除编号3的监视点0 z0 S! [" r8 \# z' I+ ^7 Z
" x. n6 l2 ~' C/ X; n: u1 X' F
wpclear
, B- Y" U- D$ I: y4 |3 l' | 删除所有监视点
8 U1 c# @6 x$ P( n w( X& E% M4 P- F8 p
6 g+ K1 H: W; r- q/ ~9 |7 |
1 ^0 x( E, T6 Y7 J程序断点指令: bp, bplist, bpclear
" D# u& S% {( X% Q& Z 例子:5 C! q. t) F: c5 j2 z5 E& E) W
bp 1234# C$ m2 G2 a2 k2 e' R0 C
在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断 y$ t, {6 U% y+ A8 t
: N6 g% q. n# b0 z- M
bp 23456,a0 == 0 && a1 == 0
, [, x& ~% \% k0 \+ C3 N" K 在地址23456下断, 且中断条件为a0等于0以及a1等于07 a7 M( A/ p2 V7 p
8 f. X. [* W3 F- K9 z0 k. _ bplist1 q. A" r) u/ G" [) @! e
列出所有断点- U1 Y8 `. z; I( Z* f. u
" |4 z2 s) q+ e0 p8 T# S bpclear 3
; i5 Y) D# Y# @! z; w, G) Q4 U) u 删除编号3的断点
- s9 R: Z( w8 q) M3 p( h) `; V+ n' \
; e1 g( I/ y- V8 j' | bpclear
" C' U" [; ^8 I6 D- T3 b) E 删除所有断点
1 z3 U0 m C4 I5 _0 }, O1 Y
" e$ j% r, M2 n
1 ]8 f- c! P, W2 ?/ t u2 S
' ]' R& ~9 U4 Y跟蹤紀錄指令: trace
; n1 k4 Y: Y" g+ | 例子:
, A7 L l+ N B1 [" ^# k trace 01.txt) K/ {! ^, d! ?% F7 x9 z' l2 n
跟踪当前CPU运行的所有代码, 输出至文件01.txt& {; G5 W/ C+ T4 w4 D
5 C \, x2 F7 M2 N! f5 v
trace off- l& S, Z6 J2 ^$ z
停止跟踪, 并且关闭文件
* n* X9 V+ @& K1 `$ q
( t- ^6 i- V1 y3 l% j trace 01.txt,01 X1 l; p8 D+ P" w0 o. v. E7 i6 y
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt& o* l1 _' w5 b& I% {. o) H
4 S$ `3 |# I# \8 @0 W trace off,0
' ?# N$ E( g9 p5 g' ^% e 停止跟踪编号为0的CPU, 并且关闭文件: B, Q1 j" t# H% X$ G
( W8 a5 l0 R( Y
trace 01.txt,0,{tracelog "A=%02X ",a}
7 I' N; d; y2 x |6 m! ] 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
* V: W9 w ?/ b 并且在每一行的前面, 写上"A=a "
& {$ Z3 j: I$ H6 s! c7 k "A=%02X ",a为一个C语言printf函数常用的输出格式
+ l5 c7 S5 M/ Z- u4 U) X$ d9 V 意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入
) `( W) Y9 V) ?5 Y0 ] X表示为大写十六进制数! L) l; P! ?4 D: c8 @5 O- z
( X0 Z4 A. L$ a
; }# r- s9 \4 Z6 u: H& i; z% R
7 s9 }+ B7 z2 o2 L, f8 Z' ?; `. Q: B内存直接写入指令: maincpu: b- o/ E% e. N3 z' L
格式为 maincpu.[][]@地址=数据3 r0 v2 Z" \# o9 R/ `
第一个[]:
! p- Z$ v& t5 m o 表示ROM地址
. n0 p* |: h/ B5 D( p4 n1 K p 表示RAM地址
9 i. c! q. N {" o
8 X& v4 b1 m+ Z; w. X/ D/ m 第二个[]:# ]+ ?; v; Q2 M% ^7 I/ F0 J% }
d 表示4字节) z4 {# k, r% k. m' D# m
w 表示2字节# c4 S5 S9 j: p$ Y0 m/ _" T
b 表示1字节
. w: m- N/ f b, K" Y+ ]2 T% J/ s2 }4 ^# f& k! ?. w) ~% W
例子:" o! I( S" Q( x) I J$ v3 I4 J
maincpu.ob@1234=FF& C D c( U: k
在ROM地址1234处, 写入FF一个字节
9 i( }' o) u( ~' e/ `
4 S- U) q/ J7 ^3 h maincpu.ow@1234=4E71- H! w ~9 C" S
在ROM地址1234处, 写入4E 71两个字节2 O3 P+ ?( X, A& P# j4 b% L
4 O: e! g6 A2 R( x: O; d
maincpu.od@1234=600A4E71, Y& p0 [! d, E( h5 K! Z/ M) C8 G
在ROM地址1234处, 写入60 0A 4E 71四个字节
2 {+ O, Z: }2 P4 {5 e: o, @( a9 y( }& I X2 z+ S- X
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写% [# M/ p: [; w3 L: p8 k! ^
" c$ [: A: J+ Z2 n
# [4 `' L2 x" D% r+ M0 C5 i6 Y其他:
7 M; S, X2 V( M* k, o9 m4 b dasm 输出档案名,地址,长度- a- u% d$ J1 ?$ V
输出程序的反汇编代码/ P! x4 r9 Y$ B( k4 p# n+ M
例子:
$ J1 w1 r0 F8 z8 N/ A' p* j0 k4 C dasm 01.txt,0,100000. J" r0 U5 P; ^! }% Y: N9 U
将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt5 s4 q' m5 q% H+ o- _
' ~" D! Y5 W& D- N5 [( ^ softreset& c! n3 |* T8 G, W6 Q
游戏重启, 但不重新载入ROM, c9 G! F( u# n
( i _8 v2 e( a" R hardreset$ R# F. R# S/ V
游戏重启, 且重新载入ROM2 I$ D* \3 \ R
3 G: W: g) p# v/ x E
snap xxx.png
: z3 [9 ?! p) P 截图为xxx.png
' W- D; I7 o& `/ ]. o
- p u/ s+ H {
# f, O% ]& l0 j
4 D" y0 `* V$ i, Y
, h4 |4 {0 ]; Z& J4 A# S热键:
4 Y3 L+ s) O6 A5 z ~ 中断游戏
, @, E6 a+ o4 O, V# S: M- Q2 A F5 运行游戏
3 [4 p1 L: D! o* U' k: h F12 运行游戏且隐藏调试窗口8 t* Q5 \6 Q8 B% G
F11 步入, 单步执行, 会进入子程序1 A: N: ]( b+ E8 ~
F10 步过, 单步执行, 不会进入子程序 s3 _, Y$ _1 n+ |. w
Shift+F11 执行到子程序返回6 S. z s! b1 b4 Z' ^$ J$ w
Ctrl+M 内存浏览窗口; s/ g; p9 [$ U$ v, h
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
0 f9 W/ y9 r, ]7 n. x h2 R- Y6 P8 U! Z
{:4_94:} 3 H; x% ?- f9 |' l) H& O
( j* w t1 h P- J |
评分
-
1
查看全部评分
-
|