|
|
本帖最后由 yandagui 于 2015-10-28 19:02 编辑 , j7 v* b6 Z8 G" A: O
8 w( @* C$ p% ^* n4 Y/ `
FC自动演示修改教程( Q) n3 Z1 V/ H& @$ G
作者:火焰烈旋风, c7 \2 O0 U- I1 f4 ^
工具:FCEUX中文版(www.9553.cn搜FCEU即可)' L- t8 `' f) S6 F
1.找按键地址:
: S: r3 r2 U7 D# U6 H# ^% s q9 M 首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
% T0 M9 b5 N: R( G6 `2 [7 I8 s2.找演示时按键的数据来源:- W$ l( h( k2 F
既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
! p; b. Z* I. k/ R* Z07:C38F:94 F1 STY $F1,X @ $00F1 = #$01( f& z# I- }8 H# `0 V
07:C391:94 F9 STY $F9,X @ $00F9 = #$00* D0 [( O# x* j1 x! J3 U
07:C393:CA DEX0 w" t1 X+ p {
07:C394:10 F0 BPL $C386# m* L0 O1 Y9 k4 l, n3 X) Y2 D
07:C396:60 RTS
6 E# [0 K3 ^8 o! ?# ], E. M" f我们点击"运行"左边的上拉按钮上拉,看到如下指令:" T9 q- J7 O/ r
07:C378:A5 1D LDA $001D = #$07
2 [5 y: z8 Y' K# V9 a07:C37A:29 04 AND #$04) J" g1 X. J1 ^& n0 x
07:C37C:D0 06 BNE $C3844 E7 m3 s1 Z- I3 u8 u, A: ?2 [1 P
07:C37E:A5 04 LDA $0004 = #$005 @2 m/ j. d" F9 [6 ?: u# F5 w
07:C380:05 05 ORA $0005 = #$00
9 b8 K N. M- m1 j* ]* g07:C382:85 04 STA $0004 = #$00+ t6 a1 y7 K$ e/ Y* `; P
07:C384:A2 01 LDX #$017 }2 i0 f( y/ X3 x1 O7 D7 v( m' K
07:C386:B5 04 LDA $04,X @ $0004 = #$00& q; Q+ I" k+ r8 u1 D* m1 g
07:C388:A8 TAY& s& Q; A- L1 Q( r1 t: d
07:C389:55 F9 EOR $F9,X @ $00F9 = #$00
1 |5 Q& o* {4 m( s0 ]07:C38B:35 04 AND $04,X @ $0004 = #$00
3 }% x$ L0 W' f; B9 J# [0 {& X07:C38D:95 F5 STA $F5,X @ $00F5 = #$00$ T7 l! z$ o6 U6 k+ x$ {
07:C38F:94 F1 STY $F1,X @ $00F1 = #$01% Q' E% f% t3 i
07:C391:94 F9 STY $F9,X @ $00F9 = #$00
8 c' W4 ~% J; q8 V7 y; M07:C393:CA DEX
- N& K6 F" O) L( U/ S) z* r$ _2 v0 c07:C394:10 F0 BPL $C386
' Y; x" y1 p" T07:C396:60 RTS/ P. N' o$ X5 s& u5 g( O: d) ~: Q
由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:
6 _: [, w" d ]' L( \) K05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
3 m! L# `$ s s+ q05:B3A5:A5 2E LDA $002E = #$C8% {' A' E B; C! v$ G+ [5 w% B5 h
05:B3A7:C9 50 CMP #$50
! l7 X6 l+ Z% U- `1 l05:B3A9:90 20 BCC $B3CB& H5 r" _# a2 V% a+ g4 z# `
05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00. t0 Y1 a: g7 U' W; S. u
05:B3AD:29 0F AND #$0F
) e: E: u; A" K) B% T* q8 Z05:B3AF:C9 01 CMP #$01
G8 k! v% x2 n/ t05:B3B1:F0 04 BEQ $B3B75 `3 t0 Z3 e$ b, k
05:B3B3:C9 04 CMP #$04* S4 M$ D5 O" t ~
.........6 D9 V+ l/ O6 a# y
我们点击"运行"左边的上拉按钮上拉,看到如下指令:( h4 X5 m& D' \3 z( F
05:B39F:B5 5C LDA $5C,X @ $005C = #$01
' p6 w- R2 e8 |( s3 }: b, _; U$ x05:B3A1:95 F5 STA $F5,X @ $00F5 = #$01+ }: R3 _0 D4 N: Q. p
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
. H, d; d$ L; Q/ [ u05:B3A5:A5 2E LDA $002E = #$C8
8 w9 v4 A& c* U% B) X* h# R& F05:B3A7:C9 50 CMP #$50, @/ c6 A" P* w( n" b/ ~
05:B3A9:90 20 BCC $B3CB5 q$ H) s8 B% |
05:B3AB:B5 AA LDA $AA,X @ $00AA = #$003 G0 U' a5 o3 |: J1 p3 p O( X3 Y
05:B3AD:29 0F AND #$0F, J* K. s1 ?6 x. v
看到 m: w; ^0 R3 L/ D0 V: g
05:B39F:B5 5C LDA $5C,X @ $005C = #$01
Y0 v6 O8 _$ J8 g9 H' S2 w05:B3A1:95 F5 STA $F5,X @ $00F5 = #$01
& u0 T( F2 s+ ?, I1 u! R& `05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
1 T9 `7 G3 s. X没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.
F2 l8 Y K$ Q$ V) Y- m( C 接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:5 E- v% ^- }# f6 _) n' p$ ]
05:B392:95 5C STA $5C,X @ $005C = #$018 M! f& t5 {" t0 A. U
05:B394:C8 INY! s1 n+ z: d7 k( J; |' g
05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09
6 g4 r& p7 k5 q/ V! J C; `& o05:B397:95 5A STA $5A,X @ $005A = #$00
9 M# [- ?9 i* `% B$ [; `05:B399:C8 INY
5 j/ {3 p/ N2 l7 }05:B39A:98 TYA
& X$ l# v5 T) b9 w7 U$ `; q4 Y然后我们再上拉,得到如下指令:7 D3 K6 _$ T+ v5 s
05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$09, p6 M+ q" V% S0 Y v7 r: Q
05:B38E:C9 FF CMP #$FF
% Z% I0 p6 z- e# k) e" b* H+ V% F05:B390:F0 3D BEQ $B3CF
/ [ x: a+ x+ U& J; T4 R; E05:B392:95 5C STA $5C,X @ $005C = #$01( G; |8 ?0 ^! s8 j6 V
05:B394:C8 INY
# M7 u* `; x* w# M6 B O r05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09. ~6 l* x" e* J6 ]( C2 M
05:B397:95 5A STA $5A,X @ $005A = #$00
- c% h0 o- w8 w05:B399:C8 INY& V6 r0 e0 K, T. L
05:B39A:98 TYA
* Y* P3 G) \) q5 x2 P% v- M4 L6 H7 r看到05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$09
8 I0 Z( a& x! K- T. L2 d+ k没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.( ` m; L5 U0 j( S9 g( D7 r/ h' K5 c
3.修改演示:
/ J! o4 z: X% m7 l" i1 ]* e 打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
1 h: k- g1 ?/ x! h. ?( S( b 我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
$ y1 t& o7 q+ q6 T7 }3 \打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:! t) Y2 Y/ [/ E3 i# i7 m5 I/ }
05:B392:95 5C STA $5C,X @ $005C = #$00
; V7 ^/ |7 y8 a* f+ E* G4 z05:B394:C8 INY
7 b8 T6 d1 M8 F/ }4 B2 r2 ]! }05:B395:B1 08 LDA ($08),Y @ $B3DE = #$00
" p6 C6 Z; a4 l/ i& J4 S05:B397:95 5A STA $5A,X @ $005A = #$00. V2 p# O m" `' ?* F
05:B399:C8 INY, a; b( \/ E+ p! q1 H
05:B39A:98 TYA8 b1 \2 \$ U# N+ T/ }
我们上拉看到了:2 C: Q( p: \4 L
05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$008 g v, Q1 S/ c) w( a" {
05:B38E:C9 FF CMP #$FF" y( h- u; ?0 N
05:B390:F0 3D BEQ $B3CF
7 I. Q. N4 G! T4 P3 i3 n e A05:B392:95 5C STA $5C,X @ $005C = #$00
' w" E% o( R' }: P: k3 @05:B394:C8 INY. v8 i+ S4 B* w* {$ w# x4 U9 [
05:B395:B1 08 LDA ($08),Y @ $B3DE = #$00
" r2 K, D/ {" z05:B397:95 5A STA $5A,X @ $005A = #$00
# D$ Q* p; q2 m4 R1 R2 O7 [) L/ Q05:B399:C8 INY
: H+ l0 g' `, q% p. \$ o05:B39A:98 TYA: s! I9 y* R4 x4 m
看到
4 e- J# R+ E& l- r. N05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$00
5 W" i& e& [1 Z: S0 A3 n& Q5 s/ H没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.+ @6 }* r' o/ a- a# B
说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:
% F. u) W4 i; w) S p: C2 ?+ t05:B371:B5 5A LDA $5A,X @ $005A = #$7F
4 r" C: O( b' N- E0 B: z5 X' s05:B373:D0 28 BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)" E! z/ m8 E2 D, B4 t
05:B375:A5 30 LDA $0030 = #$00
, v- h8 m! n* ]' i05:B377:0A ASL
: Y$ S" _; j2 _( }$ @05:B378:0A ASL
8 u( ^4 c9 o' ?8 P$ B0 t2 X05:B379:85 08 STA $0008 = #$29
7 ?( m. G, t4 P( q4 A, s. Z05:B37B:8A TXA
" A7 Q9 Q5 \( y$ H- @05:B37C:0A ASL
6 y& @; V' e0 o9 Q% c05:B37D:65 08 ADC $0008 = #$29+ e8 ^& k) J3 m+ D! k
05:B37F:A8 TAY" V1 Y& t' h# }1 w2 l$ b
05:B380:B9 D2 B3 LDA $B3D2,Y @ $B3D7 = #$B4
' a+ M7 M2 o/ q3 | E: i05:B383:85 08 STA $0008 = #$29' Z) [, E' F! O- e# f, d& F8 L
05:B385:B9 D3 B3 LDA $B3D3,Y @ $B3D8 = #$FC2 @4 h. h8 l" {$ J9 ^. {" ?0 t
05:B388:85 09 STA $0009 = #$B2
8 _! s# Z9 C( F0 `5 c; s05:B38A:B4 5E LDY $5E,X @ $005E = #$02" r+ d$ c& `, ]) p- z
05:B38C:B1 08 LDA ($08),Y @ $B22E = #$10
+ [5 x. T/ F, S) T) U05:B38E:C9 FF CMP #$FF
/ `) R9 G' d; S05:B390:F0 3D BEQ $B3CF' u6 g4 ~! S; ]& c7 V
05:B392:95 5C STA $5C,X @ $005C = #$00
% l7 }0 H0 T9 P G& ^0 z05:B394:C8 INY8 ^8 e7 H6 E$ a# a0 b/ O
05:B395:B1 08 LDA ($08),Y @ $B22E = #$10
0 i/ v5 v. G: _ ?. ?4 R$ u# G05:B397:95 5A STA $5A,X @ $005A = #$7F: O2 e& e$ G7 i0 I+ E2 ?1 U% ]
05:B399:C8 INY
8 Q7 {5 u- s Q+ r" A05:B39A:98 TYA
* ]. X2 s/ v' X05:B39B:95 5E STA $5E,X @ $005E = #$02
5 K3 }# c1 i# f( X1 ^& L05:B39D:D6 5A DEC $5A,X @ $005A = #$7F(5A递减)
. P5 v6 l8 u2 m' K1 L7 s; U05:B39F:B5 5C LDA $5C,X @ $005C = #$00
# v, B; F9 O8 @' S* g5 S( }05:B3A1:95 F5 STA $F5,X @ $00F5 = #$00. J1 B: m9 |. J+ @6 Z$ d' t& `
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$007 f7 a4 H8 Y! s3 h# c
3 {1 t6 r5 l0 T- b) |0 Z. d" b* R
由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了6 ]* S9 Q+ Q9 D
可以下载玩一玩8 S& w1 T- Z$ k% l6 i' d; p
http://pan.baidu.com/s/1bnE0AwZ |
|