|
|
1 D. r, y& l+ D, B; ]1 L
很快速的整理我自己常用的指令" E& O: ^, N- J% [& i; x8 H
# ~( R0 T1 `6 q3 [. Q1 g{:4_112:}
3 Z+ b6 S7 d1 b9 f) w2 e3 V! N5 c$ }" X
0 ^9 w( f* ~: f3 k- jMAME DEBUG常用指令& Z! d0 b) x+ W9 M2 O
( e7 a& X. o" ]" ^/ H2 e3 b
内存搜寻: ci, cn, cl
0 p% {) T& y. M, I9 X; d9 |2 u3 N A2 e( U( T- f; L1 W
ci. N9 ]& v8 t% z( H
搜寻任务初始化, 每次搜寻一开始一定要输入这指令
' J, c' x7 c* n6 w) @+ a) p3 v
" s( y8 H6 C' ~ Q; C cn4 Z0 g' d" `1 \. s$ Z" z
搜寻指令* |% i& \, A/ P/ B* z
例子:9 y: S( t. L7 ^; v# S3 c: |
cn eq,60/ b7 x" S$ h4 x$ l% I" E
搜寻目标等于60 (十六进制)8 C9 _' g2 g: b" C x2 W7 {" S
+ N3 E* t& W% V+ U- S, { cn eq,#96* \2 A* z1 G, o- E% h0 N& A7 H; E m
搜寻目标等于96 (十进制); _4 ?2 g; v$ D/ o
! u& ?: \$ \! z) G# Q! ?8 x
cn eq* H! Y2 z- n0 _+ ^( W
搜寻目标的数值没有变化
/ c# u( @. b4 G: R# x8 S3 c* Z9 x0 |3 h7 _3 s' u b
cn ne
( m8 J3 z8 ^/ S: ?; }* r 搜寻目标的数值有变化
2 N9 J4 r8 q& @+ m9 M2 s 2 s2 }# y7 W9 u& c6 N& l, @
cn +, Z( D. T8 A1 u) X" l
搜寻目标的数值增加
4 c( i6 g6 b2 \; K. n" r : u( x& j1 \ N+ C5 _5 e
cn -, U" a! u- Q' Z# N4 r1 G
搜寻目标的数值减少1 _' f! B3 g3 I6 p) i6 v! s) f
" q# v, r3 Z' H* e) F cn +,3
: i+ C( F% f% v- ^ 搜寻目标的数值增加3 (十六进制)& Q) b$ _+ I5 W
. m9 I' U b4 M! I
cl
, ]: G, ~" M% r 列出所有搜寻结果3 z6 x9 |1 Q) ?# P- @
) D# P) C; [8 N1 I3 o- B& T cl xxx.txt# i8 ^" s3 z+ D& U
输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式" w$ E! e2 C$ ?! S6 d
6 k' x3 @7 I; d : R5 W3 F* q, u* \# ?- q
内存监视点指令: wp, wplist, wpclear
# x3 t% Q4 ^8 \3 T3 |3 j2 @) G 例子:
, _* ]- O" O1 Q( c& a2 O( }# E( U wp 1234,1,r$ s, B# b) Q* L6 Q$ C! L% K
在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1
/ `/ Z* S0 J& I9 N! w w4 D4 Q
1 P) i; L/ R5 i- `# n, h7 W wp 1234,2,w9 a8 y1 q+ P Y+ H5 @2 s
在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2* [, D1 j/ ^' N6 W4 _ b
7 p/ N8 T, ` F1 [
wp 1234,6,rw h: s7 S. A4 Q
在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6
; p( L% t1 {" ^; E# g2 p8 c% _, a: t% D. R5 s; x
wp 23456,a,w,wpdata == 1" c/ C) T5 X2 Q+ h
在地址1234下写入监视点, 数据长度a, 且写入的数据等于1
9 \' T. \- P' ~6 o& R/ e' X0 U9 A- e8 B3 e; M, M; x+ m+ ~
wplist; y( T. l0 u- k0 F/ ^
列出所有监视点
3 |/ J: S) s1 t# h E; i9 o
* u( B& z {& c0 F6 a' v: b wpclear 3
. W6 ~( y5 i* B! _ 删除编号3的监视点# j) {( P {$ e& [, i
" W: {' o& e) L
wpclear* v, G! i7 D% Q# x& ^, @
删除所有监视点
/ G/ V: m1 h, p% Q4 Z) g; Z
* H- w1 ^7 m( v# A 5 g! O- q6 P6 W" ]- s
6 _3 _) q' [* G8 V4 z7 ~1 T7 Q+ }6 T程序断点指令: bp, bplist, bpclear
, Q. y: Z+ h$ D8 T" X% n 例子:
4 w6 x& Z* i( U0 a bp 1234
* \+ U) o9 n, U8 i m 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断
! n1 B L# ^/ L" T: }: a1 ], ]
@% E; j/ O. t' J0 t3 ~ bp 23456,a0 == 0 && a1 == 0 i- `6 f! q$ u" r2 f
在地址23456下断, 且中断条件为a0等于0以及a1等于0
4 _# F2 R, f' o7 f2 @
5 [1 [+ a0 @9 K1 a bplist
% k4 A, ~( t9 y2 i; f4 a 列出所有断点: D. n1 ~! k5 Q/ ~
, W# J+ }! r3 i/ T: } bpclear 3
& u1 N; Q1 Y# h 删除编号3的断点# _ G$ k7 G4 Q6 r9 }) Y# J$ W a
0 k9 {" u6 Y1 w% j9 [% W2 [ bpclear
z+ _1 T8 a9 s. r8 R+ n4 Z0 c! V 删除所有断点
' V, G6 }8 ?; W# C5 K, ]3 n
6 P) M' |7 f% X( g2 K& B 9 S1 ^8 Y# M4 y; ~- K3 w
% @5 c } g& U# u& H2 N& T跟蹤紀錄指令: trace
) i1 a/ A9 Y. V( Y 例子:
' _+ Z& y( D1 @0 ^ trace 01.txt% C) J$ ~! l4 c4 J% y
跟踪当前CPU运行的所有代码, 输出至文件01.txt
# ~& h+ G! T1 ] y, g" e6 a+ P" x B4 f/ l
trace off# y D6 w: Z$ l6 E
停止跟踪, 并且关闭文件7 k. d2 ^, M% F5 }$ C+ z
" X5 Y8 d4 o" y5 [1 s, n) F
trace 01.txt,0
! V. M* |# G& ~, n: T 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt. ?- v( R2 [$ B8 K2 u
( Q* q1 T* M1 N, ]3 i trace off,0
' n; ?9 w- e. Q8 f* Y6 i4 j 停止跟踪编号为0的CPU, 并且关闭文件( n3 ?* _$ b F5 d6 [1 {
% }6 N {; Z2 y2 p$ q3 ]7 h
trace 01.txt,0,{tracelog "A=%02X ",a}
' L; h* P! C* t 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
1 R3 I% j# R# S1 Z. } 并且在每一行的前面, 写上"A=a "4 t5 l& ^% m8 f3 E1 P
"A=%02X ",a为一个C语言printf函数常用的输出格式
* K0 [4 T5 I" { q$ q4 d( o( D- }4 L 意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入' W7 _4 J- e# V( x1 U
X表示为大写十六进制数
; k, e* {. v1 a( r, A* l8 m
; B: V3 I: O3 ~, r' |4 h }
. ~: L8 G% P9 i9 }0 A
( a5 x3 K2 @1 y$ c$ A内存直接写入指令: maincpu2 y3 S j" p$ E% W2 c& Z4 D* E3 o
格式为 maincpu.[][]@地址=数据
8 t( a' H% l \' ?9 _. w 第一个[]:
7 t7 j0 A# O# Q o 表示ROM地址* x$ K5 A: }& [+ X A* }
p 表示RAM地址1 N( A+ t; f: I- Q. Y2 U3 |! f& Q! U
C4 n. D. u7 ?7 H/ i* I2 [
第二个[]:
; G, E; K/ v# h. i: e d 表示4字节. |8 [' }1 W/ ^$ [" C& T
w 表示2字节
$ |) r6 T6 k/ o! a C$ v8 r- y b 表示1字节
0 q. k6 `. P8 {
1 W3 k8 W6 N- P6 U 例子:5 B% a3 Y1 v- w; q: X2 L% A) |
maincpu.ob@1234=FF6 a+ }. T$ B5 t$ M
在ROM地址1234处, 写入FF一个字节% y0 R( C0 x% |3 c$ _
. \, H) z) l! G$ m( l3 I
maincpu.ow@1234=4E716 s) u7 U& B7 @& f6 G i, t
在ROM地址1234处, 写入4E 71两个字节9 J% p0 `" y2 z# H2 x9 g; W' x0 [
. |7 \0 j5 z6 L
maincpu.od@1234=600A4E71
! ~: u( {% f. {! E J 在ROM地址1234处, 写入60 0A 4E 71四个字节$ c% J- O5 `8 G0 @7 t- ]
3 A8 m5 E3 q% ~ 注: 如果是RAM地址, 可以在内存浏览窗口中直接改写. p1 W ~! x, n% x3 e
* P+ e1 H0 t3 x/ P5 G6 ~
' u0 ~, d5 u. {, G9 S1 f+ _其他:" X9 x" x. [# Y# b% b
dasm 输出档案名,地址,长度% X! Z( l1 h n/ q7 ]$ q/ L, s6 y' y1 W
输出程序的反汇编代码! O. G+ N4 C1 l: i
例子: D, e; O! E( z8 j( r
dasm 01.txt,0,1000006 ]1 p' E' [# I: [; m$ c; ^0 r+ T7 \3 W$ g
将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt, T( F4 a$ I; O* F
) e$ w4 `# N/ Y9 W softreset
; N8 E2 x1 b- t0 c$ J 游戏重启, 但不重新载入ROM
5 \, X$ I' n& \' ~+ J4 z, Y
7 j- Z: A1 _/ i5 L hardreset9 G# {+ c( k- v2 h7 k
游戏重启, 且重新载入ROM
8 O( V0 r; l+ |( m6 X& Q- a
) P! `9 G7 Z6 q* g& {! K snap xxx.png
' j6 | Z, t* U* V w b& ~6 h 截图为xxx.png0 L+ m+ B/ k) n. v/ g
' e) T2 X6 }7 D7 g! Z
3 s& s' P6 s. i8 Y8 g( I
* v5 k* E: Y& b
2 \. t2 N/ L& g! U7 G5 @" ?热键:% }; b2 H# |" J* O* N" I3 S, t0 |
~ 中断游戏
. e) ` r1 H8 B, r2 r7 j6 ^2 E1 b& N F5 运行游戏/ k- O' c7 p/ H/ ^* E3 V
F12 运行游戏且隐藏调试窗口
6 `2 ~$ @' j! T( Q- y3 A F11 步入, 单步执行, 会进入子程序& P. B; o! G5 n9 d
F10 步过, 单步执行, 不会进入子程序
+ J8 K& r& h; S9 i j Shift+F11 执行到子程序返回2 O; g2 q5 n9 J2 q
Ctrl+M 内存浏览窗口( t8 a% M$ ~3 w! Y6 P4 q# b; R. V
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
# H* j0 N) I+ o9 @1 l& r# G" e7 y K- E8 K; P$ Y( r2 t
{:4_94:} # b# X! [0 b1 c( D( t$ c
' e* B% C; w+ ?( h |
评分
-
1
查看全部评分
-
|