|
本帖最后由 yandagui 于 2015-10-28 19:02 编辑
8 Y- T) y' s+ ?2 j/ Z* w7 T8 h# X0 M% Z8 |
FC自动演示修改教程
% Y' ^7 r% }) q0 P+ }作者:火焰烈旋风
& T( M+ ^) X' k7 c" J4 h工具:FCEUX中文版(www.9553.cn搜FCEU即可)2 @+ \" j0 W- C9 x* x$ z9 o! M
1.找按键地址:! |6 V' l7 y# ]% ]' e! Y( b
首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.) r i$ D1 A! n& T
2.找演示时按键的数据来源:$ O, y" Y, b+ S; y9 y
既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
2 i6 q3 }4 y, V* S( B07:C38F:94 F1 STY $F1,X @ $00F1 = #$01) D+ V! V2 [' O
07:C391:94 F9 STY $F9,X @ $00F9 = #$00
m1 b0 { N" u. m% S' w: z! `07:C393:CA DEX- t, D; p( s! }
07:C394:10 F0 BPL $C386( _4 n1 J) {! T1 k- W% R
07:C396:60 RTS
/ Z1 e1 B& X& B& B我们点击"运行"左边的上拉按钮上拉,看到如下指令:
; I1 K2 z$ p; } ^07:C378:A5 1D LDA $001D = #$07
1 E- c' h. x2 C* n) A07:C37A:29 04 AND #$04( ] h5 H0 V+ Q# `+ A
07:C37C:D0 06 BNE $C384
7 }+ L$ t& w" e& i( @07:C37E:A5 04 LDA $0004 = #$004 {6 R' x4 R, J
07:C380:05 05 ORA $0005 = #$00$ D6 B- Z2 x: M& V& d; H
07:C382:85 04 STA $0004 = #$00
! u% r$ h& V& s# g3 X8 {, j& f' `07:C384:A2 01 LDX #$01% P4 i; ], r3 J$ d- j
07:C386:B5 04 LDA $04,X @ $0004 = #$00
+ V: B- y0 D( H' U/ U- l07:C388:A8 TAY5 M( L( Y; r6 r5 D a
07:C389:55 F9 EOR $F9,X @ $00F9 = #$008 J8 h3 y" |; L' Z
07:C38B:35 04 AND $04,X @ $0004 = #$00
" S) R) ?( }- M' W; w07:C38D:95 F5 STA $F5,X @ $00F5 = #$00
& n F R# e% x+ k7 ^/ w07:C38F:94 F1 STY $F1,X @ $00F1 = #$019 x9 a2 B0 N# n& v& ]4 z7 I. q4 M
07:C391:94 F9 STY $F9,X @ $00F9 = #$00
: Y, H, J7 h2 J% @8 ]( S* P07:C393:CA DEX% E3 ^5 Z# Y2 `7 N* D* X
07:C394:10 F0 BPL $C386
. {2 k r/ C7 T" t3 S: m07:C396:60 RTS2 n) Z" G2 I; W2 h5 L
由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:
+ V, q( L7 U0 N. M l; K* r; p; R: f05:B3A3:95 F1 STA $F1,X @ $00F1 = #$008 `5 p! o* _7 g2 U: u7 h' r) N7 [
05:B3A5:A5 2E LDA $002E = #$C8
' m& S: P! s2 t$ |* w, q6 U6 X* ^% T9 W05:B3A7:C9 50 CMP #$509 C$ r) Q' T/ r4 j' j
05:B3A9:90 20 BCC $B3CB2 ?$ j$ V/ G) ]3 R$ w+ N" K! a2 T
05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00
1 V7 ^2 R- O6 v" f. ]5 _8 w$ H05:B3AD:29 0F AND #$0F5 Q8 v8 d( k7 E& s/ I
05:B3AF:C9 01 CMP #$01
% g) u5 G! K2 h! C( D+ v05:B3B1:F0 04 BEQ $B3B70 ?5 K; G6 z" O- u
05:B3B3:C9 04 CMP #$04
c R- R6 Y; B% q) p c, r6 p.........
( k1 D+ F, g3 Z我们点击"运行"左边的上拉按钮上拉,看到如下指令:6 g" @6 t' t( Y; H
05:B39F:B5 5C LDA $5C,X @ $005C = #$01
3 E3 Y' c$ u7 r* A7 G( V! Y( c05:B3A1:95 F5 STA $F5,X @ $00F5 = #$01
: K& y2 I e. ^' ?( f3 ]05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
2 B! {0 U( g6 [! s( k# a05:B3A5:A5 2E LDA $002E = #$C8
, W1 ?' O5 E* T5 {05:B3A7:C9 50 CMP #$50- B2 w1 j& U2 T v. ]" [
05:B3A9:90 20 BCC $B3CB
1 K& I1 u7 S+ m4 G! j2 |5 T05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00
, C9 W+ Z+ C4 f% j$ e5 W6 l05:B3AD:29 0F AND #$0F
7 N5 S) q7 b8 o$ k2 n看到
% q0 e% T n6 n% d0 J9 J4 T05:B39F:B5 5C LDA $5C,X @ $005C = #$01
0 Y7 d* y( L* n+ g! U( o" \05:B3A1:95 F5 STA $F5,X @ $00F5 = #$01
5 ]. W! k+ p8 d/ ^% O5 G2 u05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
9 J) M* w. Q* v, x n/ V+ h没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.
- U. w2 ~& _; x/ C" p- Z7 { 接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:; q+ p6 H! K: j( }, Z9 P
05:B392:95 5C STA $5C,X @ $005C = #$01
& }& h$ |: n6 ?% \+ }05:B394:C8 INY
/ t1 I; C0 ]3 |! |$ r: z05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09: e5 r6 x4 @* _" C x! l* o
05:B397:95 5A STA $5A,X @ $005A = #$00
* D$ r# x* {7 M- X, v05:B399:C8 INY E d! \/ R$ i- q
05:B39A:98 TYA
5 c4 \" m* H/ \) S* T然后我们再上拉,得到如下指令:5 _* x, S% `1 H7 x0 A
05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$09- J$ q! k2 L* }
05:B38E:C9 FF CMP #$FF
$ \6 M/ L8 Z1 H* Y6 ~" M, H! e( p05:B390:F0 3D BEQ $B3CF; }+ g) s( Z s% E) X
05:B392:95 5C STA $5C,X @ $005C = #$016 Z0 ~1 V6 Q! N
05:B394:C8 INY! \4 A4 U, S0 c8 o5 c# R+ Z
05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09
! M3 j: m d. _7 x) h+ z05:B397:95 5A STA $5A,X @ $005A = #$00
5 n0 L3 f4 ~* Q" c05:B399:C8 INY
) e. h+ K {' h05:B39A:98 TYA
+ I6 R1 J5 v5 ~看到05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$09
- A# d, r# @5 ^& e没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.
; E' n' ^" ]8 g! _3.修改演示:
. g& F& M- T4 ]) w+ ^" f; n 打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了. Z) S1 F" R1 _( G" ~; k
我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
# Y5 w% r, S( m( ^ \打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:/ W# ~7 B4 C. \2 S. Y! o9 ~( M; z
05:B392:95 5C STA $5C,X @ $005C = #$00
+ j0 j" A4 T r0 d05:B394:C8 INY
6 I, d5 [+ g& z' p i1 U8 I! p: ]05:B395:B1 08 LDA ($08),Y @ $B3DE = #$008 P$ N3 f# s, d
05:B397:95 5A STA $5A,X @ $005A = #$00( S/ h- q: d; R! Y' N Z
05:B399:C8 INY& T: v* P3 R1 J/ ]8 o
05:B39A:98 TYA: M0 P- ~" m. d9 q
我们上拉看到了:& e# c; d$ b% e- Q$ P$ z1 j- w
05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$00
$ j5 K1 K0 g% S+ F/ }0 n9 R05:B38E:C9 FF CMP #$FF
0 d% ?1 q- I& ]- O |: G H2 I! l05:B390:F0 3D BEQ $B3CF2 R9 Q: [/ G- b I3 K1 s, d& P/ P
05:B392:95 5C STA $5C,X @ $005C = #$00" w H7 T1 y% R) ]. t o. e
05:B394:C8 INY# k$ [ U: z2 W" Q
05:B395:B1 08 LDA ($08),Y @ $B3DE = #$00
+ k& A) [2 ?: K; W4 ?05:B397:95 5A STA $5A,X @ $005A = #$005 T. Y3 n* H5 u$ K! J
05:B399:C8 INY
' e" B! d/ U& J05:B39A:98 TYA
" p! e+ l4 o6 `1 C" h看到
/ O- J; [8 l0 j) W! G05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$00
% H6 p3 e- I* k+ z0 k* s* \没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.
2 y$ t5 c4 h9 n$ ~ p3 e) e, a说明:演示按键地址的结构,以开始的00 21 01 03 00 0E 01 3D 04 06 05 33 00 0E 04 0A 05 01为例:第1个00是按键数值(无行动),第2个21是指按键数值21前的按键保持21(时间),第3个01是按键数值(向右走),第4个03是指按键数值03前的按键保持03(时间).......以此类推,判断根据:
2 P: V( l- y U6 u05:B371:B5 5A LDA $5A,X @ $005A = #$7F+ Q# R$ m% x, M2 S8 r1 H
05:B373:D0 28 BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
* ^- k" o8 s! m3 f* `% \6 ~5 e05:B375:A5 30 LDA $0030 = #$007 M9 T- g4 V+ |
05:B377:0A ASL
5 W$ p) z, [" X4 H; o6 q05:B378:0A ASL
" F7 [& |" W( I6 A/ F4 Z05:B379:85 08 STA $0008 = #$29& I/ L6 D% M; i* J& x
05:B37B:8A TXA
- H8 F4 h4 E q" g* u- O05:B37C:0A ASL$ s. w% P6 c% \% O. K1 `; r
05:B37D:65 08 ADC $0008 = #$29
1 P& S R" O* n$ O$ {% n05:B37F:A8 TAY
3 [: M8 a% F# r6 Z |05:B380:B9 D2 B3 LDA $B3D2,Y @ $B3D7 = #$B4
' V( N3 Q8 X# j1 u7 w4 }& U: x: D05:B383:85 08 STA $0008 = #$29
* J# ?: @# R" @6 r9 a05:B385:B9 D3 B3 LDA $B3D3,Y @ $B3D8 = #$FC
g8 n( ]# p/ F$ ] f p& L05:B388:85 09 STA $0009 = #$B2% x& N( b( o w# V6 b, z: |! U
05:B38A:B4 5E LDY $5E,X @ $005E = #$02
" k( C5 d! B3 ^1 m' z5 {: S05:B38C:B1 08 LDA ($08),Y @ $B22E = #$10
9 K8 s0 U* [: u7 |& a05:B38E:C9 FF CMP #$FF
: _+ K9 W0 ^( |5 n05:B390:F0 3D BEQ $B3CF* N& w' F U; B
05:B392:95 5C STA $5C,X @ $005C = #$003 ?# x0 I) A3 p# O. W! s" X
05:B394:C8 INY
; b/ G/ |6 \6 e# j- x( W05:B395:B1 08 LDA ($08),Y @ $B22E = #$10* `0 @: _- K0 H8 O3 e
05:B397:95 5A STA $5A,X @ $005A = #$7F
' L0 P8 v$ D0 x" Q05:B399:C8 INY
* Q- g# s6 T: K; _& u+ t3 U" E05:B39A:98 TYA1 L C) V7 W. i; o& v: Z9 z4 m
05:B39B:95 5E STA $5E,X @ $005E = #$02
* s" j7 N5 D( j05:B39D:D6 5A DEC $5A,X @ $005A = #$7F(5A递减)
9 D7 P J( x: A& G05:B39F:B5 5C LDA $5C,X @ $005C = #$00
# i: q/ k5 ]1 N* O* B! O- A05:B3A1:95 F5 STA $F5,X @ $00F5 = #$002 ~" v$ I; }! p7 R
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00" x% h4 s2 b7 B y( _/ u
, P/ {! E/ ]# g: f
由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
! X% J) E7 p7 e可以下载玩一玩
# g* v. P7 W: D" p/ ~http://pan.baidu.com/s/1bnE0AwZ |
|