|
|
5 g! R8 `6 h& U0 ]! t很快速的整理我自己常用的指令- w/ x0 y% u$ _. y3 y7 V
" F$ [1 L7 y7 B8 c7 Y/ x/ l{:4_112:} 9 M1 k1 c+ p' ^- \' |/ K
) D) _4 i. T ^8 L; y5 b
MAME DEBUG常用指令
* h+ v4 k" H9 {% o& Y/ g0 `3 b
6 x4 B& S9 P4 W7 C内存搜寻: ci, cn, cl
, V# k' j1 |" |8 Z$ p
4 U/ Y @$ t0 D ci
5 F, f7 H: V! h- G/ V9 V 搜寻任务初始化, 每次搜寻一开始一定要输入这指令
0 j. T% ^- ^: u$ I) m8 }5 G6 z" [3 l6 s/ Q& J) [7 f
cn
$ V% i/ Y; s U: [- _ 搜寻指令
i- l5 |2 \; }! X 例子:1 g x! f; K _) a1 j) R0 J' O
cn eq,609 I+ G" A5 O6 |$ @0 [" ^6 u
搜寻目标等于60 (十六进制)7 w! C s4 q' C( s V' G2 h
: b: z: Z* o) x+ ]9 C cn eq,#96& W( o# u! k/ c: H. n
搜寻目标等于96 (十进制)8 ^/ d* h' _$ d6 A0 P
& U& V* E {& w* k8 Y- t
cn eq
6 C+ G* D; L/ t5 _4 f! X2 i 搜寻目标的数值没有变化
" A0 A+ n; j* m; X2 V: q3 z2 |8 D- u1 P
cn ne
) Z7 A* f m4 J: g9 A 搜寻目标的数值有变化5 E- n' w9 U" N8 ^. R. D
/ F9 l2 W9 z2 _ cn +
2 q+ B1 T, L0 _, \% v" C' J 搜寻目标的数值增加
. \# } q2 P7 f% i+ |: G
) h! Q4 ]& }- g, C! \% n7 B cn -5 S5 N' z& G& {+ M1 q6 F' |7 s
搜寻目标的数值减少9 G& E! d) z- O D) [4 O
' x/ e3 V: Z% h cn +,3
: O: j% k2 b4 M& t9 @( z 搜寻目标的数值增加3 (十六进制)7 A, I9 O: n' ^/ ]7 U6 j b, N* v- I
( j! o) L7 k2 x* C1 f
cl
& j4 e7 W+ } {2 _, ]# e/ H6 s 列出所有搜寻结果
4 e" ^( P# }/ ], t
: Q+ u( f( C1 L# T( i. l" F' [( d cl xxx.txt
@: k8 L# D( g' L1 V 输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式8 S: F5 m" o. B2 I5 M, Y8 Q1 Z
3 k9 o1 O5 C6 ]
$ u( m( T# t6 R# f! q/ k6 J内存监视点指令: wp, wplist, wpclear* C7 u/ B2 Q/ H. P9 y8 M: I# z) I
例子:% g: _8 x: G$ ]. ~* Y
wp 1234,1,r
8 W! A, U5 |7 L$ c r2 b 在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1
$ [! S9 P/ R) ?6 G6 f8 b$ O! I2 L- E( |% Z# h1 E6 L
wp 1234,2,w
, j+ T- y; r8 r; z# X 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2
! m. |, ?3 e) y$ O2 r
2 s. ?% e0 d o( q) p ~. @. N wp 1234,6,rw
9 Y; x0 V' Z0 a1 {; f, g 在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6
# ^" x+ U- _7 @& q: f! i) r6 D' e3 [9 w. X' Z+ R' l6 H
wp 23456,a,w,wpdata == 1 Q* D% E+ {* h
在地址1234下写入监视点, 数据长度a, 且写入的数据等于1; o3 `7 w/ o6 Z
1 \4 Z$ f' }6 M0 @+ }; P5 S
wplist
8 E3 t3 ^" M9 I$ |& { 列出所有监视点
* B5 j: G V: _& _3 n% b6 a2 F- q6 L- j* G% A3 k: k! h0 G3 |" A4 A
wpclear 3
8 F5 i1 l# G- _1 \% v 删除编号3的监视点$ Y4 H( c+ p& X
4 T6 A& c6 L+ G, F" M/ z* {& l7 I wpclear
6 n1 N I+ q1 z1 e 删除所有监视点
+ ~+ `" z; i& o, j2 F3 c3 t7 X: R
4 O1 X9 b' T3 Y
% |7 t; w1 U% |. U2 D
U# t" D3 e i1 m' a' x6 H程序断点指令: bp, bplist, bpclear
6 `0 p5 C# U: g$ y0 ^9 d+ a 例子:3 C2 M; k6 J. s" z
bp 1234+ X i5 ^1 h& _+ }" ]
在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断
6 d" ^( T X5 ^' N' r; B0 Q( g6 O2 l. A2 q7 \2 o
bp 23456,a0 == 0 && a1 == 0
3 D9 S; E3 f; ?- }$ N/ k* ^ 在地址23456下断, 且中断条件为a0等于0以及a1等于0( ~: p% K" b6 } `: V7 p( q4 X
1 e f- E/ i- r( Z1 `5 X bplist' F# ]3 u& {0 \5 |/ ^! d
列出所有断点/ Z: x. T1 _) Y* I
" m; T) @+ w: D3 b( E bpclear 3
$ H9 S& _ X& ?. Z& N3 O 删除编号3的断点- p2 v9 d' k# Q
6 z2 @7 O1 g/ p3 m( B bpclear( }7 E* J. B b3 {- e1 a% Y
删除所有断点; B* m7 A: v# X$ ]
0 O$ v/ Y- n* B, A* U
7 Z+ Y8 O" a4 _" Q' _5 o$ |9 o
9 B. c# w' W' J- k1 g跟蹤紀錄指令: trace) Z4 W9 T3 W* U
例子:
" U4 k( i8 E# k, g9 N' ?' ` trace 01.txt
. U; L% _" l9 W8 f% | 跟踪当前CPU运行的所有代码, 输出至文件01.txt; _" H V$ h1 y
* \' j% E [9 _# u9 z- u trace off
& a5 N# H" |+ X' h9 E) H 停止跟踪, 并且关闭文件
. I5 K3 R4 d$ C; o
' d/ e; U$ k) E* l9 e- s trace 01.txt,03 S$ ?7 o2 s5 g/ u9 x
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
8 D# C5 y: Q5 c/ J! e& }1 U* P& A( ~
trace off,00 i6 L7 l+ O8 c8 V( ~! j G+ z1 }
停止跟踪编号为0的CPU, 并且关闭文件
d0 r2 P7 Z1 ~$ r6 B5 P" p7 o! e/ x& p3 _2 l4 `# l
trace 01.txt,0,{tracelog "A=%02X ",a}6 U/ y5 ?7 }2 }% K- z
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
0 a0 t0 W& |- H. r 并且在每一行的前面, 写上"A=a "
. s8 W- I3 {, z' v9 x! N1 Q' J "A=%02X ",a为一个C语言printf函数常用的输出格式; o2 p8 N/ Z: i7 n2 ~( d3 I
意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入
1 |1 D B# T4 |9 r0 s X表示为大写十六进制数1 A( m0 Q% d4 b/ z
' F0 Y8 ?8 J: ]! f' Q; n. m; Q5 M6 z
( X7 [ ^# N) j E0 L内存直接写入指令: maincpu
( N# X9 G8 F. x @. a" g3 x 格式为 maincpu.[][]@地址=数据' L, r: u" C. J7 s- Q2 [
第一个[]:1 h6 o8 x3 H4 P y1 Z
o 表示ROM地址
( h$ F8 {+ m9 A& } p 表示RAM地址
( ?1 l) }7 [ z& D |) y+ e7 a' x5 O
第二个[]:
$ ?& V' ^4 {3 S) k5 { d 表示4字节
. r- B3 K) a( K- x3 U' `9 | w 表示2字节
, E+ e$ E+ ^: }) B: R9 O$ o b 表示1字节+ L: v/ h) A7 W' N3 j3 X8 a' n
. k6 ?+ B, @; ~# H 例子:3 a) I. N$ U' q+ }* }* F
maincpu.ob@1234=FF0 ~) G, K& Y6 z! v! n. k: Y- L( E
在ROM地址1234处, 写入FF一个字节. {7 O7 \: \1 h9 p; L9 r
# M, S% {- y. O maincpu.ow@1234=4E717 v; O) T: f! V' V+ F) Y
在ROM地址1234处, 写入4E 71两个字节# I) |& \* E% o5 A* a4 m! |
4 x; M& D3 l! n8 z2 d maincpu.od@1234=600A4E71& [7 @; z& d" X5 Z! s: K; s
在ROM地址1234处, 写入60 0A 4E 71四个字节: J4 f- L/ T7 B8 a/ _# h5 o
; K" [5 |( B3 \, `* E: @1 r3 c 注: 如果是RAM地址, 可以在内存浏览窗口中直接改写; y9 Q8 V. L$ g4 q) p5 [
+ v% c. S" ?/ |! _/ X; a
; S$ n2 u+ g/ J$ \! C- k其他:
/ i% K! F1 P3 l. i0 Z dasm 输出档案名,地址,长度8 C+ X. j; L/ n% |4 c
输出程序的反汇编代码; S" n- ^% l9 \& I
例子:
4 ^! M4 T- p% n: I2 T dasm 01.txt,0,1000007 W' J% E: o5 g$ u& I& P
将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt
- Y4 K: V: b& H& C) T1 k6 }" A3 \: l7 q4 X \+ W7 N& u
softreset6 D0 V/ p/ f: G/ X$ p
游戏重启, 但不重新载入ROM5 Z+ i. G' q0 x
8 l$ z3 @/ i4 l; p6 g$ `/ n hardreset
2 T) _' \9 N( A% `* f 游戏重启, 且重新载入ROM
$ Y1 s! s! z( Q5 B1 _! M7 j# c% H
* G$ n* F- J' u snap xxx.png4 F# ~7 @; F+ O/ s0 _% p ~' [; t
截图为xxx.png0 N3 u7 d+ g9 t" ]
3 d- T, y Q7 y
. L& t* @" Y- s. D) ]2 p, V4 z" x 7 r2 a6 M/ N, j" E0 @
' d8 m% f& |% L9 F6 }7 S+ H' t热键:
7 z5 z& g# c; G ~ 中断游戏
" M" C9 [9 h/ P2 e F5 运行游戏2 v5 |6 ]; S7 K" v& V7 A
F12 运行游戏且隐藏调试窗口" j) z# ^ @$ m( h9 K, {
F11 步入, 单步执行, 会进入子程序
% k, \$ v9 \ J1 c- ~4 N F10 步过, 单步执行, 不会进入子程序
" Y- Y# O- L% M. n* }+ P" c: J* j' ~ Shift+F11 执行到子程序返回# x J: D0 j% c" `, M6 I! |- t$ `
Ctrl+M 内存浏览窗口
4 P$ C8 g* n' Z. B F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU" o) D! ~- r! U# F% j$ B
5 e3 S! w P$ v$ G* o. R1 O! @
{:4_94:} 0 O6 L% j$ F% j+ ]9 o
0 E, k! t& T; c& Y8 n4 f |
评分
-
1
查看全部评分
-
|