|
|
: z# r; E( K( g& I, p5 a" Y很快速的整理我自己常用的指令9 r1 u5 |. y7 M; \. f; ^( E4 f
- Q: F7 Y& ~" \. `1 r8 @5 y6 @
{:4_112:} # S* u: V% n4 X4 ^
# o+ I/ ^& {+ M/ [, QMAME DEBUG常用指令
. k* p0 x* T; |& O8 P
7 a3 Y0 T k6 L7 z7 B内存搜寻: ci, cn, cl
& r" [: W5 ^% K* [' P; p9 Q6 _- H# A4 V6 f; c' r0 O; R$ T- y* I9 I
ci. @; B2 |4 ^+ v
搜寻任务初始化, 每次搜寻一开始一定要输入这指令
3 ?! t9 w/ a" E6 T: c9 }8 S( d% ~- r9 t4 e' X
cn
U2 U* x c: t: w 搜寻指令* R5 j1 y' |7 i2 X7 }# D
例子:; G" C+ q$ H+ c7 C# f- N9 `" d
cn eq,60& R: Q, K* a" ]1 |. D8 S
搜寻目标等于60 (十六进制)" I2 Y4 [+ |7 g9 F
- M' o R, }5 D+ C8 r/ w cn eq,#96! ^- E# ?7 I( l5 Z7 K
搜寻目标等于96 (十进制)1 ^4 i- y; y C9 _& k, U
' I/ y- X/ N% S$ {7 E! ]: ?
cn eq ]& b9 J% _& U4 p2 \6 Z
搜寻目标的数值没有变化
5 X* s4 g0 s* [3 j C# C. p' t
: s( P/ M* y1 J8 q: O cn ne0 o2 S* C8 b0 V$ ]
搜寻目标的数值有变化" D* t9 c: V* P1 E; G% g
! r, }7 [+ ^7 E) K6 _ cn +' a' W6 V& e; H
搜寻目标的数值增加
+ j4 s) E, [; [9 s( }, l
9 ~5 m% K: g, i cn -
' n! T- C; c6 o5 E& G7 |6 u 搜寻目标的数值减少
* k1 y& p+ q- B% c1 s4 {3 t9 i
; z* Z$ x8 x# e7 F9 _ cn +,3
: s* K: d. V+ b3 w 搜寻目标的数值增加3 (十六进制)
" B% T! W6 Q% n4 ?
4 L+ M0 R* D! P, o cl
; ]/ y y: O4 F9 q1 B 列出所有搜寻结果6 X, b. o0 N; o: \( A' }0 |
8 W# i0 g6 p0 x8 N X. p. G/ O cl xxx.txt
& W0 E$ F4 @2 o/ u7 M$ \ 输出所有搜寻结果至档案xxx.txt, 其输出的格式为XML cheat金手指的格式5 ?( M" n9 P" w& X1 Y3 y8 D
1 [. Q. I4 d N! O* a
+ q& Q8 L5 S }+ B' e内存监视点指令: wp, wplist, wpclear
) i$ C% C2 [6 {- g 例子:
/ c% a0 x) L, A. I" ?8 T) t wp 1234,1,r3 S; e# y8 q3 b' @% C h
在地址1234下读取监视点(该地址被读取的时候中断), 数据长度1
# q9 c0 U4 [& s. u! N+ u5 s* C+ l9 [% X9 S/ }1 T4 g1 _/ y1 a9 b9 d
wp 1234,2,w' _4 F8 v+ b2 ?, t8 \
在地址1234下写入监视点(该地址被写入的时候中断), 数据长度2
2 d+ I" H. a. i9 }
2 ] Z; T9 Q0 e7 D1 k wp 1234,6,rw
0 G9 z" V" v9 V 在地址1234下读写监视点(该地址被读取或被写入的时候中断), 数据长度68 V9 p6 q; ?, S* W- x
' \% o5 I6 r- V+ y2 t9 a wp 23456,a,w,wpdata == 1+ U: s& L! S9 e* u7 m0 l$ T& Z
在地址1234下写入监视点, 数据长度a, 且写入的数据等于1
2 q5 T7 T% V, s9 n5 ~9 c" S* q9 [4 q
wplist5 S) z: }' {+ P! w% J5 L3 i
列出所有监视点& p5 w1 k% Q& W- E
% m( t, I5 X0 }5 T s: ?# O
wpclear 35 h1 Q8 P, i6 K* c% c9 n2 ^" Z( _
删除编号3的监视点9 B1 Y. n1 N) i( N9 I% @
9 A- n& n$ g+ b1 K wpclear
* H0 `/ ?5 q0 o( d0 a5 o" W 删除所有监视点
2 A9 X& l& C% t) t7 `$ ]! W F, s, W0 N' o0 d
d6 J$ Y6 u4 h0 J/ Y7 S4 }4 `
! h9 L1 o+ c" O# o9 T W" N程序断点指令: bp, bplist, bpclear
& Q* D0 \( L1 w9 E& E 例子:
9 A7 S) ^ J( ?2 {/ N$ j bp 1234
8 F$ j, v8 p' F6 ?5 I, f 在地址1234下断, 当程序运行到地址1234的程序代码的时候会中断: T4 c+ L6 J+ i4 \
7 B" H) q" m) P+ e
bp 23456,a0 == 0 && a1 == 0
* q: d$ _6 R% o) v5 h7 d 在地址23456下断, 且中断条件为a0等于0以及a1等于0
: D& Q' {5 h7 H( R1 m5 T, l5 _( c. ]4 |% S* R8 E
bplist* B+ A4 P% t4 j3 C5 \
列出所有断点/ P% C4 U; T5 O' F! r
4 ?1 O" C" W% `1 o3 \ bpclear 3$ P1 @% F! n: D- y4 s7 F/ L6 q
删除编号3的断点
. E! j& l/ O. \: Z3 f! W, l/ r* S8 a+ Y! D* p& |
bpclear
+ H, ^0 m0 l! E- {4 i$ h 删除所有断点
; e0 e8 o5 ~/ p$ |! H2 W! x; ~* ~6 ?, w% } I2 r% p% ?. e0 A
1 b) o8 g4 I0 f5 ?; |! L
8 [; V2 {, s* o, @5 K- r) k跟蹤紀錄指令: trace
! q' x* @. l6 B& V 例子:- c& P, J, h4 }. s3 M" o
trace 01.txt
+ f, R+ ]: M$ ?1 R0 C$ a' ` 跟踪当前CPU运行的所有代码, 输出至文件01.txt
2 ]. I/ N7 u- t# I4 E
$ H8 o2 S8 G# K8 f/ A trace off
5 z+ S j i- I 停止跟踪, 并且关闭文件% @1 h1 P: r/ `
5 {1 V o. d6 O! v, z, j% R4 r trace 01.txt,0
+ c. @! e) R/ S1 ?* A2 U+ | 跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt
$ Z$ ?3 n* ^& G# c+ o2 c6 S1 E x5 J; C+ q
trace off,0$ c; d5 X& z% v0 | s2 j" R$ v% v! B
停止跟踪编号为0的CPU, 并且关闭文件
9 C6 t. J3 U8 b& M( D$ V4 H
3 R* K7 a% m! `, Z trace 01.txt,0,{tracelog "A=%02X ",a}: }- |+ \( d7 q
跟踪编号为0的CPU运行的所有代码, 输出至文件01.txt & W' x0 r$ u9 u* e
并且在每一行的前面, 写上"A=a "
) h( M. e/ G6 ^! z* ^/ @ "A=%02X ",a为一个C语言printf函数常用的输出格式
- _; d+ q5 l( y( n+ W. { 意为将a的值代入%02X中, 而02表示两位数, 不足两位时以0填入0 c c" z- t5 n0 M' A
X表示为大写十六进制数( S% V7 {/ T* ]! K) q( R+ c
$ j3 W& B7 l9 c
% h" A# l4 [ ?7 t/ C" b$ V$ V5 [/ N* E1 {# M/ X
内存直接写入指令: maincpu N4 W( b3 o5 H0 V; A4 m
格式为 maincpu.[][]@地址=数据( j6 K( q4 x) x
第一个[]:
9 v- l- H) l4 x7 } o 表示ROM地址
3 a+ R( M8 a5 _7 N8 [; d4 ] p 表示RAM地址9 w+ R' d- O2 [: a* _ t, x) D
4 a! f! r$ C( ~$ D4 I- t3 G
第二个[]:' i$ W1 q, m' }9 }) L2 h/ W, r9 v
d 表示4字节
- y& o C4 q3 u' B4 z w 表示2字节, }8 \- [( J7 \' Y' v% b) G$ s8 N
b 表示1字节
# \/ p4 R. b6 o9 s, F5 ^" q3 H4 p/ F
例子:
/ w! M- L( u' W! b4 u maincpu.ob@1234=FF
/ o9 ?* y t3 q, T/ Q9 e) k 在ROM地址1234处, 写入FF一个字节
6 h$ i+ N1 c, ~8 F' @/ F* I! x8 `; F3 O& {/ E1 y. Y
maincpu.ow@1234=4E71
* a; c9 u6 Y& p; W# C5 l p" _1 r 在ROM地址1234处, 写入4E 71两个字节
7 s4 J& @& e* ~% b ?% _4 D+ N5 x/ g- I" d
maincpu.od@1234=600A4E71
! k- a2 a0 I) a6 f5 G- a 在ROM地址1234处, 写入60 0A 4E 71四个字节 m y1 V" e: \( R# c
7 G, G* e- z- J: s l; \ 注: 如果是RAM地址, 可以在内存浏览窗口中直接改写
. c" e) r6 y' {! n- O" n ! @! T1 Q4 h* n* F% Y
0 Q b# P' c. m. S) K2 b4 U& a
其他:
9 x8 _ B$ g; |6 \ dasm 输出档案名,地址,长度/ N% H7 V" e- [( m3 j! a& o
输出程序的反汇编代码5 z5 u9 B" \2 i! v5 D+ e- p' b! ]
例子:
- ~, b" Q8 `7 Q dasm 01.txt,0,100000
. t& [1 ^/ j7 o4 R" _ 将程序汇编代码自地址0开始, 长度100000, 输出至文件01.txt; a4 B- B6 a7 B3 G- x! R
/ S+ V( P: i4 p! Z. f softreset
, z) g8 l" g7 m- S* Q( R 游戏重启, 但不重新载入ROM8 Z" @/ V$ y U% H( t0 x: q0 N4 t
. e! u% G$ C- K1 v# Z
hardreset
' j, @+ I' w ]3 ~ 游戏重启, 且重新载入ROM$ |' r: r" M! S- c- R- O4 D
7 K0 K* _9 F& B2 [: N" {
snap xxx.png
8 s" a8 V& C3 B2 x3 Q# U 截图为xxx.png; h/ Y1 X8 E5 W9 U/ {
. o- H: x% G$ F1 B7 Y; j) [1 f 2 t; k! s+ u) \& R( a0 I( v% h
; l5 m4 A! Y# u; i1 m: ?0 e' u
! h4 D8 T9 v( l
热键:
7 ^! }4 Z3 I o+ B& t8 w ~ 中断游戏3 ~; D& n% _0 k) Q* I* ?
F5 运行游戏
0 U0 ^" k. J: Y7 t) z: n' `( H F12 运行游戏且隐藏调试窗口
( Z2 N0 a9 T5 O8 d. D8 x6 c9 D3 O F11 步入, 单步执行, 会进入子程序" m: H, }8 R- z+ c
F10 步过, 单步执行, 不会进入子程序
* {) b7 W# g0 M! o$ l$ u6 l* _; r Shift+F11 执行到子程序返回* l5 x% u0 U8 G, b
Ctrl+M 内存浏览窗口
7 E% l! Y1 o6 R ], w6 | F6 运行到下个CPU, 有时候~中断游戏会停在音效控制的CPU, 用这指令可以切换到主CPU
J A6 s; B4 Z2 E" {
6 r1 `! s8 A7 S. g# I{:4_94:} 7 S8 m/ ?/ [1 @2 U
& s5 k0 T) Y6 g |
评分
-
1
查看全部评分
-
|