|
本帖最后由 yandagui 于 2015-10-28 19:02 编辑
# N- L7 }% p: Y( l) L% Y3 v# I( D7 M
FC自动演示修改教程
. s4 W6 X# K: | y0 [# p. b( l. [作者:火焰烈旋风3 |8 I2 J. ~5 z
工具:FCEUX中文版(www.9553.cn搜FCEU即可)% m( M: t3 I+ b6 L! ~7 w1 f' O0 L
1.找按键地址:2 i: {, \' K! g! b: K" P# Y
首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
4 ~5 A5 d" X2 d' n# k2.找演示时按键的数据来源:
" r* {7 R: k, G8 `5 p 既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
# ?: ~' x! D7 _$ _$ ~. i4 E07:C38F:94 F1 STY $F1,X @ $00F1 = #$013 H- g* j f, p# w1 P! h* J
07:C391:94 F9 STY $F9,X @ $00F9 = #$00) I/ w1 N8 t5 w
07:C393:CA DEX! @4 e1 p% ]8 \
07:C394:10 F0 BPL $C386
) w+ [! k- x, c, @; J; x, d7 m07:C396:60 RTS$ _% i" v, i8 ^5 N8 A
我们点击"运行"左边的上拉按钮上拉,看到如下指令:6 S8 [7 g3 k8 e% `) L6 Z) M! c
07:C378:A5 1D LDA $001D = #$07
# [1 s$ m6 W$ L e" l1 ?5 i0 W/ S07:C37A:29 04 AND #$04
|4 K5 W2 y# ^# k5 }6 ^" T07:C37C:D0 06 BNE $C384
g- a. o- F: l07:C37E:A5 04 LDA $0004 = #$00
4 n$ w4 z1 m) z07:C380:05 05 ORA $0005 = #$00; ^" X5 g. q) E$ ?3 L+ j: S
07:C382:85 04 STA $0004 = #$005 P% Z5 j2 \6 x8 v) d
07:C384:A2 01 LDX #$01
" b# Z. [6 m: i4 ^$ H07:C386:B5 04 LDA $04,X @ $0004 = #$00+ \4 @' A# C' f) i. n& b
07:C388:A8 TAY6 E5 k4 D+ v- V& L! E: _9 I
07:C389:55 F9 EOR $F9,X @ $00F9 = #$00' v: H+ d3 o& h' o( q ~) S
07:C38B:35 04 AND $04,X @ $0004 = #$00
' C: u% g- y# D1 b07:C38D:95 F5 STA $F5,X @ $00F5 = #$00
' }1 M. b8 c: r" P! b07:C38F:94 F1 STY $F1,X @ $00F1 = #$01% O/ g' c8 m, z2 ?0 g( S
07:C391:94 F9 STY $F9,X @ $00F9 = #$00
' ?* }6 l3 s- ?$ [07:C393:CA DEX
3 z1 v% N. U4 W5 ]07:C394:10 F0 BPL $C3861 f' }6 x2 u! R6 w2 _
07:C396:60 RTS
! m; O+ A, Z) U& F0 R由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:5 F6 y0 w, q6 _
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
* A+ g9 d! B5 D; H' v' v# q- |05:B3A5:A5 2E LDA $002E = #$C8
; c! H' Y8 \1 L( S9 @( B2 b05:B3A7:C9 50 CMP #$50
. P- {5 z7 r% D# ~0 z" W4 t- F05:B3A9:90 20 BCC $B3CB
8 _* |7 H$ T* G" m( S& l8 c05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00* d" F- W# p/ s8 w" \
05:B3AD:29 0F AND #$0F
# ^" H/ v) |- P05:B3AF:C9 01 CMP #$01
( a( i2 f* ^9 b2 ]. b5 L05:B3B1:F0 04 BEQ $B3B70 {6 j% C: t3 M4 q0 W$ M2 D: G5 }
05:B3B3:C9 04 CMP #$04
' i+ F1 \% E: p, m.........5 Y& n+ X, Z1 |" B# p! {. E
我们点击"运行"左边的上拉按钮上拉,看到如下指令:( o9 d7 ]) A- T7 o. ~
05:B39F:B5 5C LDA $5C,X @ $005C = #$01* E8 V2 D! Y; c! f; B4 g' z: `* T0 Y
05:B3A1:95 F5 STA $F5,X @ $00F5 = #$01! L9 [/ x9 U' q- L7 l9 J0 C/ V
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00- \$ K" p2 Q& o# j( R
05:B3A5:A5 2E LDA $002E = #$C8$ }- s, H6 o& Z6 E+ }
05:B3A7:C9 50 CMP #$50
1 e% y5 I. R5 a$ e05:B3A9:90 20 BCC $B3CB4 ^; r7 l5 z% A+ _# Y) Q& ?
05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00' u/ z O1 C6 p9 _* }# d8 o
05:B3AD:29 0F AND #$0F2 {; D2 f5 d: d3 T" _) ^
看到" \) B' S z; w1 j O j! |* z9 M
05:B39F:B5 5C LDA $5C,X @ $005C = #$015 y, m; x: U7 O; T( O, W
05:B3A1:95 F5 STA $F5,X @ $00F5 = #$01" _6 n0 }; W9 w5 I# m2 A. p
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$007 |5 }' B2 o* L$ M7 a
没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.# b3 M% u6 q' N
接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:
7 c3 j& k$ e) G0 ?05:B392:95 5C STA $5C,X @ $005C = #$01: m. d# X* l- C! a. _' T
05:B394:C8 INY1 I) Y, H( _( {' P& R5 ]% X
05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09- y D" \7 ]+ f M' n7 z9 l
05:B397:95 5A STA $5A,X @ $005A = #$00. [# y4 }, U% U* u/ k y% I, X
05:B399:C8 INY7 w7 R: p' @; k. }- f/ H$ X, ~" B5 z
05:B39A:98 TYA; j$ A0 I' \0 @! w2 V, D: f: K# R% P
然后我们再上拉,得到如下指令:- N1 t( k8 f$ j, X
05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$09# U( k; z! P8 ~% m+ t# y+ g' P
05:B38E:C9 FF CMP #$FF* f& I# q" a" @. l; r
05:B390:F0 3D BEQ $B3CF1 j: d1 y" l) ^
05:B392:95 5C STA $5C,X @ $005C = #$01
8 \3 ]4 e% H6 A1 e05:B394:C8 INY
* ?% R8 N/ d! ^4 o5 T% n05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09
0 b) o3 ~- o6 B3 C6 U+ M& W05:B397:95 5A STA $5A,X @ $005A = #$00& E2 o/ U6 t- I% p" P. B
05:B399:C8 INY" k/ n+ f- g) G$ G% }
05:B39A:98 TYA
- k: @ X. ^: C- h2 q3 s+ ]看到05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$09
6 D1 ~ V0 J6 u: w0 `. @没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.
4 e! A$ k$ i( F3.修改演示:
. d# o% r+ s& ^! S& m 打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
4 N0 j" V W" L3 j, U 我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
( C+ d6 J* D0 L C打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:4 a* F A$ V7 [$ e% \
05:B392:95 5C STA $5C,X @ $005C = #$00
' C" \; z0 W* g% `9 z05:B394:C8 INY
* t! K7 J$ a: G; O) i: c7 W05:B395:B1 08 LDA ($08),Y @ $B3DE = #$00# C( e! @: Q% g, R% p& L/ \( Z# w6 I! e
05:B397:95 5A STA $5A,X @ $005A = #$009 u% r+ a$ V: d8 V1 Z1 \
05:B399:C8 INY
" Z7 {3 Q7 k9 S. g" @; a% V05:B39A:98 TYA' L: ]6 x8 [, d# t0 V7 m4 `: N
我们上拉看到了:
! m% H. u, n4 k; `( g/ I7 t05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$00/ ~9 q, ]7 ]: A! w0 a+ j+ ?
05:B38E:C9 FF CMP #$FF$ `: b8 P5 R5 m2 K# X1 F# r( Y: H
05:B390:F0 3D BEQ $B3CF
8 M) `: }2 F6 {1 ?1 Y [( t$ N05:B392:95 5C STA $5C,X @ $005C = #$004 B3 h+ A; Z4 p: G( L0 I* ]0 k
05:B394:C8 INY1 j, E7 N4 S1 d
05:B395:B1 08 LDA ($08),Y @ $B3DE = #$00 k. _1 n0 N+ k& }4 a+ c
05:B397:95 5A STA $5A,X @ $005A = #$00
% {7 s3 W4 R. v3 Q6 b05:B399:C8 INY; L9 @& W+ a6 T* t
05:B39A:98 TYA
& `2 H/ ]5 y+ Q3 v- y) h/ R* ~看到
: H- ?3 {" \; S! W0 w* L05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$00& M6 D# {- e4 U) t* c
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.5 f! W" g# c) ~8 n# k( E
说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:
% n, ^5 f2 u0 ?05:B371:B5 5A LDA $5A,X @ $005A = #$7F$ _' @& q2 @" f8 b5 B2 Y
05:B373:D0 28 BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)4 f) P, L6 Q7 c# Y
05:B375:A5 30 LDA $0030 = #$00
. J" `% e& M: G! Q2 V$ y3 P05:B377:0A ASL
) ^. A8 ]- ]5 a3 z0 [05:B378:0A ASL4 G1 B2 p+ I* V5 _) q2 A
05:B379:85 08 STA $0008 = #$29* t- x' K: R: h
05:B37B:8A TXA
8 P/ a% H9 N, N& N2 Z9 t) L05:B37C:0A ASL& f* u& ]! q, m
05:B37D:65 08 ADC $0008 = #$29
) x9 n/ x/ @( k: |4 y: p05:B37F:A8 TAY
( d9 L( }+ E( j' c. A( v( t05:B380:B9 D2 B3 LDA $B3D2,Y @ $B3D7 = #$B4
8 v% V( N3 e+ m) g+ ]05:B383:85 08 STA $0008 = #$29
% w3 K0 P1 U! W' ]05:B385:B9 D3 B3 LDA $B3D3,Y @ $B3D8 = #$FC" o& d- K( O r! K# V& i
05:B388:85 09 STA $0009 = #$B2
' X$ n2 l$ K8 W6 i. x; T7 W05:B38A:B4 5E LDY $5E,X @ $005E = #$028 I) `' [, `% N; {) ~ S
05:B38C:B1 08 LDA ($08),Y @ $B22E = #$10
: c* i* y& C0 }2 K05:B38E:C9 FF CMP #$FF
+ G5 I0 k, J" M05:B390:F0 3D BEQ $B3CF
$ C* ^* B* ?- n' ^9 K* ?7 Z05:B392:95 5C STA $5C,X @ $005C = #$00
$ ?' Z% |% r% v( V05:B394:C8 INY. `" `4 s$ ?1 @7 j2 t
05:B395:B1 08 LDA ($08),Y @ $B22E = #$10
% i2 f1 f: o w1 D05:B397:95 5A STA $5A,X @ $005A = #$7F
4 |5 Y- K! v9 O7 h05:B399:C8 INY& `$ g* T" ?6 e2 z& S/ k0 G
05:B39A:98 TYA, Z* s j% O. A7 o
05:B39B:95 5E STA $5E,X @ $005E = #$02
2 u( {' l. {2 B! {$ f$ Q05:B39D:D6 5A DEC $5A,X @ $005A = #$7F(5A递减)7 U! Q3 A" K. T
05:B39F:B5 5C LDA $5C,X @ $005C = #$003 Z; l$ m C; Z, R% a9 D7 H3 k) s" `
05:B3A1:95 F5 STA $F5,X @ $00F5 = #$00
! \- U6 ?1 a* E2 U3 e+ k( A05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00( h. H3 n2 x4 k8 Y
. e! }/ ^$ K& G7 w4 d# V/ V/ G2 \
由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了9 p$ ^5 o+ i3 b7 \5 G7 ^! x- ]/ c
可以下载玩一玩
. C: g p% M/ y$ x/ l: ^5 @2 n0 P0 ~5 ohttp://pan.baidu.com/s/1bnE0AwZ |
|