|
4 Z' o/ g1 w8 `, v1 L很快速的整理我自己常用的指令6 P' L; ]5 P6 _# R5 p8 }
0 H# A6 P+ o6 C1 m5 W2 W4 i
{:4_112:} $ `( \6 p) x* S# q2 Q: h% I
) R5 g* v( W! {# lMAME DEBUG常用指令
^+ ^5 `/ I, V% b8 x1 |# G7 D* @, w. |. U
内存搜寻: ci, cn, cl
* q! Y: K0 M: K6 F3 {4 {( V
' O1 w9 g( @! \4 x( X' _ ci5 P" I& }5 W- J& q" M
搜寻任务初始化, 每次搜寻一开始一定要输入这指令; v2 x6 A) q. g$ E4 I+ |
+ z5 z2 K9 X% \; E( W7 A+ E
cn/ I9 U5 B7 H) p5 X
搜寻指令
2 w! n3 D0 |, ]0 N 例子:
5 S* k8 ^& t5 a9 ^9 e+ p% d3 d cn eq,60
9 E' ~8 U( X O7 [( A8 y 搜寻目标等于60 (十六进制)" ^9 _: A# H) @1 Q7 \
$ z; W! o1 Y7 I7 m' F cn eq,#96
( k3 o- f( d4 y5 w( N. Y 搜寻目标等于96 (十进制)+ C) w, X! ?; e1 ] n- s
" Y& {+ C3 u& ^% t9 _ cn eq
" B& D* Y5 t" _9 O* O% r 搜寻目标的数值没有变化
0 k7 l7 w& K+ y8 }# M
- M* e9 n" L) L7 b/ r4 Z/ M cn ne+ ^! k) L4 e- o0 u
搜寻目标的数值有变化
8 f2 [) G z- \0 S6 o1 q" w3 L' g
7 Y5 a6 c. e! B& _1 ` cn +& Q7 I2 h; m g
搜寻目标的数值增加! I( k/ a% `& v$ Y
8 F' C" [: n/ | cn -
* y* E" X5 t `. c 搜寻目标的数值减少- h% ?2 G7 D+ H9 A5 k6 H
4 {% G' q' N( r cn +,3: p, w, K9 A# Y) K2 e: B
搜寻目标的数值增加3 (十六进制)
( w! Y, ?4 j' o1 i6 \& u5 F4 F/ m& n! l6 g
cl6 Z3 g/ p3 P& Y, F4 U
列出所有搜寻结果
9 G) f. R* a$ Q2 f+ S/ k8 |; i' h7 _ O5 u( z7 U" I. D5 w
cl xxx.txt+ @8 o2 I$ ]+ p' ^/ Q- ^/ O
输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式
+ j7 W9 k! f( R6 Y: |( J; Z$ V& ]6 R/ m% s. W6 L
9 L0 |3 N. ~1 m3 X9 I8 ~内存监视点指令: wp, wplist, wpclear6 r( X: g2 K9 b, o4 R- T
例子:
! u- p" d, [ F4 a5 ]5 _9 B8 D wp 1234,1,r
6 }! t5 Y' V2 ?4 w3 N& z r1 F# [4 Q4 Y 在地址1234下读取监视点(该地址被读取的时候中断), 数据长度14 |4 S* ^( O- O8 z) f
- g! v- ~9 L& _+ _; d4 ` wp 1234,2,w
+ c9 @( @- z$ t; M7 M, x5 \4 f3 o 在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2: A$ K& K: p* X. s
1 y9 m* I% q& x4 n4 w
wp 1234,6,rw
O/ I* a" c/ y 在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6/ R, N" a+ `! y! A8 `* l" H2 l5 {/ e
4 D: T- \# O8 l1 W
wp 23456,a,w,wpdata == 1
$ h2 K* B8 Z; ?/ b U: R 在地址1234下写入监视点, 数据长度a, 且写入的数据等于1
3 ^% F! }3 Z" x9 M2 y5 o
+ s- l* `, j6 S% H) |9 { wplist
- L; u3 i& n1 w# S5 ]1 T 列出所有监视点- z, i1 @ m& I2 S& h/ p g8 @
5 D% J. ]* w9 W' r4 v wpclear 38 _8 M F t* L- w2 a/ ]4 R
删除编号3的监视点
; J% x7 s7 ]5 n1 d! `$ T$ ^
1 t1 M3 p) s! C8 y* T, m8 ?' N wpclear/ T0 \) }# R7 J3 v1 A
删除所有监视点0 |5 p" p" H$ b) |- z" e
5 x" W6 Q8 d: R. s3 \
* M9 q, N5 d* e8 A, A& k; W. C8 k) f9 k( B3 B4 p4 l
程序断点指令: bp, bplist, bpclear/ u) @# b; ?. O# k+ ?6 N
例子:1 C0 [* _$ i b+ g- j
bp 1234
/ V& _( Z- v% r5 h s4 e 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断
q% E, M: h2 ~5 K5 F9 H' ?+ z' H6 R: Q8 E6 X5 x( c) Z
bp 23456,a0 == 0 && a1 == 0" U8 j5 X- k# q4 O
在地址23456下断, 且中断条件为a0等于0以及a1等于0
8 u8 G" G8 h% y1 b
4 S1 s! H8 B* M% k; Y bplist
/ f# @1 P. J$ W+ F 列出所有断点+ B, _% I2 O) l! f- Z9 U9 a
6 [0 |9 f! a0 W9 K" V& ~+ u9 h
bpclear 3
; T. S: w" E# T" |. V- C. }4 M$ |* S 删除编号3的断点/ E% [+ ?! F# y
2 `& {/ ?0 S0 V$ j
bpclear
# H: A' q$ p' k5 U! f# a 删除所有断点
$ _: X; c* o' X9 n- R A& f+ k: c% W: p0 b* O: k1 s4 _
, m% L9 ?- p6 d1 z: @8 H0 }3 K
' Y# ?; F* k2 |# I6 A8 I P5 T4 G跟蹤紀錄指令: trace. I8 S! G; i4 ]1 X9 p1 G
例子:( y8 ^$ i+ F+ w% p1 c( q6 [
trace 01.txt$ f0 M) T; { O" \
跟踪当前CPU运行的所有代码, 输出至文件01.txt
! @) I9 O; p T2 O% s5 m; u4 o; P: d# \0 C3 ^5 `
trace off
3 y, g' o I8 M; ~6 Y$ z. r" P 停止跟踪, 并且关闭文件
, T- z9 ?9 ]) Z( F* R/ c, c: a
4 b3 o$ ?; u. m* I( U trace 01.txt,09 ?/ [2 q2 l. F0 O" V
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
, x. [0 q( _ V( [4 d3 D
0 C9 I6 d7 P, p: m: F, s0 l trace off,02 F# b- \7 i B! x) o
停止跟踪编号为0的CPU, 并且关闭文件9 Z& d! }$ A B4 ?/ ?/ Y7 J
8 o6 [( c0 W. T; Z" `9 r* Q trace 01.txt,0,{tracelog "A=%02X ",a}
( e) \0 ?3 f6 d+ A5 Q5 \7 F 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
: _7 D" d6 w5 q' k: U" P4 b3 O 并且在每一行的前面, 写上"A=a "
1 z/ j# S, o2 Q4 k/ }4 O "A=%02X ",a为一个C语言printf函数常用的输出格式8 U8 T) Y# H! A2 v! B8 C) v [
意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入
4 N" g$ m* ]! H; D( l( r0 S! n X表示为大写十六进制数
3 B( F, \2 p, s2 y$ S# u/ O4 U$ }5 E, L# ]; ]
* W7 u( @( F: z, d
: I6 u" y3 i2 J" X! w8 g- a
内存直接写入指令: maincpu9 {. j" U# \! z1 t: [3 h
格式为 maincpu.[][]@地址=数据
' R* ^% G; S/ U4 D 第一个[]:
7 x$ A# X0 s+ F' s6 W& ^0 `2 ] o 表示ROM地址
/ X; P8 @7 u! x# k8 `* l p 表示RAM地址
6 Y" d8 O k k( I5 j9 M2 m/ u$ ]# B/ I
第二个[]:* o" r: J* q/ A
d 表示4字节- |+ X4 l1 c. b$ A, `% {) \
w 表示2字节
8 @1 Z3 L6 s2 k h$ ]- J! [ b 表示1字节
0 B/ C. i* R. |
' Q( T/ ~, p8 d' l% o+ k O5 V9 e 例子:
8 `9 _1 g1 r/ G! s maincpu.ob@1234=FF/ D9 ~9 H3 v1 l6 \. U
在ROM地址1234处, 写入FF一个字节/ ^; m7 @% p2 B+ h, f
/ w8 x; x" n6 q( {, A
maincpu.ow@1234=4E71
; i$ t! p8 h8 _; D, V8 g9 P- H 在ROM地址1234处, 写入4E 71两个字节
+ A6 w) I' b8 I! K* r6 V! A, `) ^6 D" z
maincpu.od@1234=600A4E71# Y2 t+ w; p/ I* C9 R( c7 W
在ROM地址1234处, 写入60 0A 4E 71四个字节% D( G; {9 e& w& e/ n
$ d5 o8 H8 s$ {; ?
注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
$ i" Q* L/ O! S$ @) \
; m* z) i1 ?- U U7 P$ }& z, R8 X: E7 C$ @5 ? O0 q Y& w
其他:. J( V8 d% Q* o0 O$ @; [
dasm 输出档案名,地址,长度
# c% V) O4 n+ ?/ y 输出程序的反汇编代码
/ o, }. o# F$ v. ]1 e0 i5 m8 S 例子:
, \' w; m# O2 v4 z# y dasm 01.txt,0,100000; ?9 s+ V, T3 O# @3 J
将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt. ^+ K! |: c) c/ W6 b/ x% L- ]& L r2 c
& S. f: A- o+ A" N8 s+ H, ]4 z; Q" \ softreset& r, U* O) g3 I1 m" t
游戏重启, 但不重新载入ROM/ r; S( o# F" I3 V$ N" e
" g8 |2 K+ t/ R/ W$ S3 b! X hardreset
9 P4 H% H U5 R0 p, f 游戏重启, 且重新载入ROM# E; _2 }8 g$ ? L
' R* n# `- }, S- w* c' z2 K- Z$ k
snap xxx.png
7 W6 [2 z8 t/ Q+ h/ V; r 截图为xxx.png( @9 f& ]! T1 t T6 ~
5 e3 M7 C: g |. L. B/ Z4 N
) k. O2 J7 d' {" O$ r2 [
% x# Z: Z) ~7 c! A, W
+ k4 j2 Q0 w- {; t% K7 t" j) H
热键:0 t- h p& C4 f
~ 中断游戏
+ [+ [* O5 o" g w F5 运行游戏- I5 r y8 S# ?+ Z
F12 运行游戏且隐藏调试窗口
# c3 D5 h6 e; u2 ]0 [5 c( B, I: q F11 步入, 单步执行, 会进入子程序
9 t( [+ {! l* I1 ?9 s" A F10 步过, 单步执行, 不会进入子程序0 f: `! G4 i: C# z# H
Shift+F11 执行到子程序返回
% P( v9 C* @& u: R4 b Ctrl+M 内存浏览窗口7 ]. q0 s0 v% L' W+ ~. \
F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
3 n/ ] q j5 T8 }" P: q, ^+ r! g6 q2 A) l- C! Q
{:4_94:} 1 S2 }+ h9 Y5 }7 w# F
! z: I8 d7 D7 g+ l$ ]
|
评分
-
1
查看全部评分
-
|