|
|
5 N: C6 o( j% B8 H3 A& R
很快速的整理我自己常用的指令9 M+ d1 O1 F6 |
v6 w% B5 ^( ~$ o' a& q, w9 W
{:4_112:} / ]$ c/ h( \4 b4 g [3 g
' k- {: Z/ t4 p5 M; a
MAME DEBUG常用指令
6 Z' E! A) v" d z9 D7 c$ W! p3 j/ W& O* E/ r2 ~0 |6 N
内存搜寻: ci, cn, cl
5 r. N! }. O; ~ G/ r2 ~( N0 @% O& i5 G/ @0 C9 Q" p
ci
' B8 ?4 N( g' G 搜寻任务初始化, 每次搜寻一开始一定要输入这指令
4 }& e) g" @8 S _( j! [0 ~' ~/ j" k, B
cn( v0 j9 U3 v. C# f3 N6 d) e
搜寻指令
9 }" D) H5 F7 r+ p0 m 例子:
# B9 G: P. T4 d- Z" s cn eq,60
$ x' c* V9 E7 n4 i$ E 搜寻目标等于60 (十六进制)
" u. C1 z) ]; x 8 u8 @3 J6 C2 _* {
cn eq,#96
- a4 L2 m+ h4 G% C, P 搜寻目标等于96 (十进制)7 z: b# T; p$ K o N2 p! x* A
3 V/ o/ U" X; t* C( _% e
cn eq
6 b$ @& t8 d1 r& x* v/ B5 Y 搜寻目标的数值没有变化
. @# e! Y. s P# g& J0 W9 `
& g4 E, N* ~, ~6 B8 p1 i3 L8 | cn ne) n' [' h, w4 j9 v1 N/ r
搜寻目标的数值有变化
, D4 `6 u0 N2 a! @2 k
5 ~/ f6 o' E9 j& i5 ? cn +
6 @+ A/ A: W% I* G6 \( C. f 搜寻目标的数值增加
# N, J8 s& v% [- B6 W( Y + F7 {0 B1 f7 e) P- E( \. V
cn -
6 m9 w8 [- ?7 J" N; | G M! f 搜寻目标的数值减少8 M9 c0 X8 m; ^% ~6 L( ^
; w; d: v& O: ]4 y- C$ M! m
cn +,3
' w+ N. C% h0 p! t; O 搜寻目标的数值增加3 (十六进制)2 F; J6 h0 ^3 g6 D; ?, c- ~# w+ ~
$ w" l" T( B3 b! Y" m0 j8 J
cl5 s3 ]9 ]2 l1 d+ ]: p
列出所有搜寻结果
0 ]/ T l' ~% a' ?2 F) Y* {! M) {% `% W* k) n1 m
cl xxx.txt( `7 w! J) H* b2 W/ G( a. c, s
输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式9 n; J, C w) z1 E0 [/ k/ f. U8 B7 v
3 ^ U2 z% v1 u, `& m
) a" }; }$ k6 e$ y% Q1 a内存监视点指令: wp, wplist, wpclear5 R0 R2 W5 ~( B4 R3 C8 E+ b, l0 }+ S
例子:
0 C. M4 J3 g j) H% ? wp 1234,1,r
7 @7 {/ \$ q q 在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1
5 F( V2 K& S: z8 L. R: `2 Z
* L' H* W( ]; b8 a wp 1234,2,w6 [& I9 G0 C% q' }& F
在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2
; s2 v. u8 v% Y m" p2 O$ E
; Z- ]1 o" t5 D; I3 s$ P. I9 l wp 1234,6,rw
. |: t" d3 E: h7 l& Q 在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度6
5 b% n) A( l% T5 n3 Z$ h; J' `3 X8 R& i: }0 H
wp 23456,a,w,wpdata == 1
" I; u! M% D2 h 在地址1234下写入监视点, 数据长度a, 且写入的数据等于1
+ J+ ~1 Q9 Z8 D. c5 A% U9 q( N4 ^; x0 _- I ]* Y- e; R
wplist0 |" d1 ^) W6 B0 a7 W
列出所有监视点8 V \# e) y' Z' c4 S& t
5 e: P) F& L) j S2 q
wpclear 3
; j% t0 N j5 z: |( | 删除编号3的监视点* k8 a7 z( _6 [. R5 x; s( W. y3 P
0 M$ g; P- m& Y wpclear# ~& N8 w* @+ e$ u ]4 N
删除所有监视点
7 t8 \; S8 e( @% t+ M* `) O% g
. H/ k3 Y6 Y' o, K' e 6 A& ^( Y, o) h+ V: i/ l. ^
% \! o" t. k( y& M8 {程序断点指令: bp, bplist, bpclear
- B V3 g, S6 n0 y. k5 f 例子:
7 }* @- V9 V/ m$ o" v2 c& O( W bp 1234
5 E6 u7 a# a( A3 a- z) m- d 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断
; Q- T0 @, k3 Y- Q+ L$ m" D4 ~2 c
bp 23456,a0 == 0 && a1 == 0; [; J& s8 P& H5 \1 n
在地址23456下断, 且中断条件为a0等于0以及a1等于0$ b: Y# h: l0 k9 ]
$ z7 o( l1 Z( m5 S bplist6 ^* e8 f- L' \- W- n# a2 Y
列出所有断点
8 G, j" V, W: U$ y: e% P; l# n# Z6 W4 A
N' F3 j8 q( X3 n# a bpclear 3
1 |7 z' y/ [* ] 删除编号3的断点) i4 b' b: F5 _7 R5 o: \
8 q: M4 k" `2 Y6 S7 U
bpclear1 F5 i. g0 ]: w4 @2 G% k
删除所有断点1 @6 A7 \9 d6 v( I7 l# g1 ?- A% A- R
4 f0 d2 `5 S2 t, s
2 Y% `% e& c. G
" s% A1 d+ U2 r1 p+ M跟蹤紀錄指令: trace
0 e9 J7 `( o8 M* \ { 例子:
3 ]) p6 z0 r0 J' H; V1 D trace 01.txt$ d! Q* A" }+ ~% Z) V# y7 h3 b! x" o
跟踪当前CPU运行的所有代码, 输出至文件01.txt* y6 Z! }# u3 c4 g9 P
# [" h2 H: O' N# K4 h
trace off
P5 x8 X( y; t2 J 停止跟踪, 并且关闭文件
. b8 T8 D: |! M
L: P8 j1 q# ]/ d. n! w trace 01.txt,0
0 q# o) z8 }0 b1 f 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
; n" s9 t7 e4 x, n; Z% s7 X, h' s; a% O( N% K" g+ q n
trace off,0% L, F/ S% N& v5 z' b
停止跟踪编号为0的CPU, 并且关闭文件
1 b& } z/ U, |' B
" I1 \! s' D. j trace 01.txt,0,{tracelog "A=%02X ",a}
! ~" e! N `" m) z9 }' V 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt , @ i& w+ U0 t
并且在每一行的前面, 写上"A=a "7 I; Q0 s2 C& B$ n9 L' w3 @
"A=%02X ",a为一个C语言printf函数常用的输出格式3 t# ~) `, m. q1 \
意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入
' F% n q E: { X表示为大写十六进制数
( J: [1 |1 i. b6 C% R; p2 K/ V! \8 |9 m3 p4 g
" Y* C6 L2 l& I
1 {9 H6 \) n5 G* }, M3 f- b
内存直接写入指令: maincpu8 F% Z' S$ C: l& H3 Z, f& a" o
格式为 maincpu.[][]@地址=数据9 |3 ]1 P) M1 j/ \) B
第一个[]:/ [4 @/ A8 z! D4 {6 [+ e0 j. l
o 表示ROM地址 y$ e9 @1 |9 u; d; p0 X5 q" U
p 表示RAM地址8 ?8 I8 l# A6 l
9 K5 \- e6 _. N+ B5 v3 r
第二个[]:! R( E' h7 @) P: m" A5 _
d 表示4字节
( W' c8 L8 J3 J. w w 表示2字节
% g- X1 S# Z$ Y b 表示1字节' l; Q. ^0 Z$ D7 e! `
& m* F' U2 ]4 |& x0 _; x, |" j 例子:& s: u, Z' L5 s4 N& [, P P
maincpu.ob@1234=FF9 S- b1 ^$ B* [
在ROM地址1234处, 写入FF一个字节2 R2 S* |$ q7 ^6 y* B* d0 @( @
3 u2 X; I) `8 C% F3 \8 c+ S4 U
maincpu.ow@1234=4E71- J% T" s: h; \; B* `/ O5 S
在ROM地址1234处, 写入4E 71两个字节. u, u+ n. w6 I$ `
1 A; f. `2 m1 \8 {4 b/ ~5 z
maincpu.od@1234=600A4E71
$ R& n* Z$ }/ @# Y+ u 在ROM地址1234处, 写入60 0A 4E 71四个字节
, l5 c( F. {6 G6 e. V9 `* i. J( ^
% U4 V) ~% G& Q 注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
6 H9 @: f1 X) h7 l) o; j/ z; f , f$ p% M" F, F/ n% {
- I. d1 e2 a9 R. b. b
其他:! d; _ T! S' \1 t1 y) b7 Q
dasm 输出档案名,地址,长度' I- X! {0 A2 u8 N# m
输出程序的反汇编代码
2 ]% g" E6 |# y7 r+ M+ Y6 e 例子:
0 l9 d. l/ C H e4 ~: p* P dasm 01.txt,0,100000
, b4 v# m+ T$ \) b4 h8 n 将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt
; s- r% L7 R0 n0 A, D0 f$ y) A% A$ `% U& W2 P4 @7 s
softreset: z/ b% Y6 c9 I' o6 L$ R/ O
游戏重启, 但不重新载入ROM1 V3 N0 G1 B# ~
# i9 G) W: d! C* k( g; ? hardreset
# S* T: u( C: b1 k% J' R5 U 游戏重启, 且重新载入ROM# e. g" b+ M( r+ \
i; o5 `4 w' ^ snap xxx.png0 E6 x; L a7 u) Q2 r
截图为xxx.png+ R9 ?( O" p( Z
+ ^5 \/ B% v- e Y/ T Z
' r5 Y: `: b# O( h! r1 `
! ~2 U3 Q" W- ]9 h& m' ?+ c ' g" V$ q* r# s8 i3 {& e
热键:
5 D. g$ K& Q! l; r* {) J% @ ~ 中断游戏4 H5 H l9 M9 h5 t, P" p
F5 运行游戏
5 g4 v/ r. j" D- U$ K" w F12 运行游戏且隐藏调试窗口$ t8 B& j) D7 w f s0 a
F11 步入, 单步执行, 会进入子程序
9 [+ N1 D' N8 r1 F' v/ {; ~" X F10 步过, 单步执行, 不会进入子程序0 H' ^! n" a( n. ]: A7 {
Shift+F11 执行到子程序返回
: F7 U: c7 {9 M* { Ctrl+M 内存浏览窗口
! C8 s6 B1 ?/ }$ N% [% F& R F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU, s, b6 V, t! a' @( L3 a
4 m0 h% o. k! q% X" e" G7 B{:4_94:} " F' E' m# O0 K1 E/ I
) M3 B8 Q% Y8 i4 N9 j4 Y3 s% A |
评分
-
1
查看全部评分
-
|