|
本帖最后由 yandagui 于 2015-10-28 19:02 编辑
% B, e0 V* r8 H2 B
! ]1 P2 i" ?! G- IFC自动演示修改教程
+ C; T' H' O( h8 k; v% {作者:火焰烈旋风
! V! g5 l6 n3 m) }工具:FCEUX中文版(www.9553.cn搜FCEU即可)1 a! g% p2 V8 g, E/ q; j
1.找按键地址:
9 M2 _; C" ~! h; O 首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
8 g6 r5 A1 a( I3 \" X2.找演示时按键的数据来源:
9 z2 ~: e a' u, X0 o. {" o: R 既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
0 g. W- \8 X/ q7 b* f! ?8 X, Q6 l% B, u07:C38F:94 F1 STY $F1,X @ $00F1 = #$01
3 n2 A5 [0 }9 b! f07:C391:94 F9 STY $F9,X @ $00F9 = #$00
, ]) c1 q, Y1 X! O07:C393:CA DEX) {1 _" r) C( s/ K2 L5 |
07:C394:10 F0 BPL $C386/ f3 H/ P" P! s! P9 T; `
07:C396:60 RTS
8 k' J: S- A7 d3 F6 X我们点击"运行"左边的上拉按钮上拉,看到如下指令:
! y& y1 c) ]/ X) L# A" c- i8 l07:C378:A5 1D LDA $001D = #$07
2 b# l: j! x+ E- C% ?( I07:C37A:29 04 AND #$04
9 w- c% N$ r1 l2 |5 C) s0 e: `- l07:C37C:D0 06 BNE $C3844 S; ?% e) J; t3 o8 r) }1 E9 _# [
07:C37E:A5 04 LDA $0004 = #$00/ Y1 {- q/ ]* v5 c: G$ x
07:C380:05 05 ORA $0005 = #$00
9 _+ d. ~: B) e! G07:C382:85 04 STA $0004 = #$00
0 j& h+ S. `5 @) M07:C384:A2 01 LDX #$01
' i9 H# V1 }1 ]( v6 V07:C386:B5 04 LDA $04,X @ $0004 = #$00
% o7 l3 C4 V9 W- w! t& d$ L07:C388:A8 TAY
& S* G- T+ l( {) B K I" i# F07:C389:55 F9 EOR $F9,X @ $00F9 = #$00* p" o) A7 [. Z4 X
07:C38B:35 04 AND $04,X @ $0004 = #$00
: `( o% q" t9 Q. @% ]07:C38D:95 F5 STA $F5,X @ $00F5 = #$00
; T1 V# U; t5 Y2 v" V/ e# `; K( n% w07:C38F:94 F1 STY $F1,X @ $00F1 = #$01; q9 o9 c+ |. S! C, c" @
07:C391:94 F9 STY $F9,X @ $00F9 = #$00. U1 ~$ \) u* ^/ _
07:C393:CA DEX
k* A/ P* G" B/ R9 J07:C394:10 F0 BPL $C386& w S' n& J: V5 B+ l. h
07:C396:60 RTS
% k3 ?! m5 y, n1 g由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:, ?6 H) J6 ?' ]) M& T
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$007 k- M1 z, c7 X; J1 T6 V
05:B3A5:A5 2E LDA $002E = #$C8% p1 a$ T% }3 f. h; U2 {) T/ H
05:B3A7:C9 50 CMP #$50! C' w" I( c5 ]: Y& P
05:B3A9:90 20 BCC $B3CB+ V ~$ d5 ^$ e- y$ F
05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00
: v8 V2 F$ L/ B% V. b05:B3AD:29 0F AND #$0F( E3 j3 p0 U: X6 S# Q+ m/ h
05:B3AF:C9 01 CMP #$01
' |. {& ]" b$ `) ~8 d05:B3B1:F0 04 BEQ $B3B77 C: a* G/ z2 |7 ?- I1 A" `" d% Y
05:B3B3:C9 04 CMP #$04( q( u# I, f+ p( K& f
.........: e* H5 b1 i% C/ Y) b
我们点击"运行"左边的上拉按钮上拉,看到如下指令:( u6 u0 D( m3 C6 p
05:B39F:B5 5C LDA $5C,X @ $005C = #$01
- R( m9 M! V$ x2 l$ i- e1 M5 T05:B3A1:95 F5 STA $F5,X @ $00F5 = #$01
5 _% K' }6 M0 o' w05:B3A3:95 F1 STA $F1,X @ $00F1 = #$001 P ]2 J3 h, W. W- ]
05:B3A5:A5 2E LDA $002E = #$C8
8 ?" l% F& J# x ^) {! k6 E05:B3A7:C9 50 CMP #$50
5 i+ x. ^5 i( N1 b05:B3A9:90 20 BCC $B3CB
3 Y' P! H. p9 H05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00& l& l' f& ?; t9 \ E7 s! @
05:B3AD:29 0F AND #$0F
; O$ s- {$ v# n$ i8 p% J看到* C" t" M) l# p9 D7 z
05:B39F:B5 5C LDA $5C,X @ $005C = #$018 d9 S6 x' |/ E9 @4 J! U3 P
05:B3A1:95 F5 STA $F5,X @ $00F5 = #$01( T1 v8 }9 I: F1 g( U0 V+ A
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
) ~$ q) s2 _5 ~3 F没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.8 j% L; V! C+ Z* v+ O
接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:
8 T6 ^( `/ c- ^0 V0 `' O- b05:B392:95 5C STA $5C,X @ $005C = #$01
. w1 R2 y( i6 @1 }9 l05:B394:C8 INY
' h" n9 e) k4 J1 Z2 M05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09
- I! n e! Z _- L- F8 f05:B397:95 5A STA $5A,X @ $005A = #$00
- R) R5 U$ K8 Q9 @- L- ?6 B* F5 F/ F05:B399:C8 INY
: Y* w1 N; B$ ]4 i05:B39A:98 TYA! k& R7 h0 d: R3 N, ?
然后我们再上拉,得到如下指令:5 y! ]2 y6 J1 w# L( |9 b( V3 ^* s
05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$098 D# b& {; [' H4 }$ m
05:B38E:C9 FF CMP #$FF
: ]% J& K/ V' _05:B390:F0 3D BEQ $B3CF
. @5 ?! L$ m8 c05:B392:95 5C STA $5C,X @ $005C = #$01
7 u! ^8 g6 @6 G+ U6 A05:B394:C8 INY
5 |+ h5 J, O B0 X# T6 j' s05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09- ~/ c6 T; i6 A% J: f ^
05:B397:95 5A STA $5A,X @ $005A = #$00& I& H; B8 C1 x- `
05:B399:C8 INY8 E- }5 T5 X1 J( S8 D
05:B39A:98 TYA. g e) M7 f B; ]7 P9 ?0 G
看到05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$09
l, h1 p: e* V没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.# b& U: p& u3 n" d- O/ k/ p; F
3.修改演示:7 w0 V) W9 w2 Z
打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.4 g6 }. |5 M, j4 a. f i" Y- x% q
我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
9 u5 S/ C/ k9 i打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:
3 A+ \3 D0 _% r& ?2 g7 [7 @6 H0 v! W05:B392:95 5C STA $5C,X @ $005C = #$004 b) x0 W; L i+ f- V) N+ B
05:B394:C8 INY
8 D8 l* e5 r+ `. j, \ u' X05:B395:B1 08 LDA ($08),Y @ $B3DE = #$00
' g; I! ^# N- ^0 W8 C3 }05:B397:95 5A STA $5A,X @ $005A = #$00
8 _/ T5 B8 z+ x9 [ h05:B399:C8 INY
8 a |0 h* x: ~# m05:B39A:98 TYA$ f7 ]- }& @- v6 F# y1 @; j
我们上拉看到了:- d2 t) q- q9 Z7 u
05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$00) a' n0 V! ^+ ~ W2 Q
05:B38E:C9 FF CMP #$FF, h5 ?/ }( e' n9 b1 }$ A
05:B390:F0 3D BEQ $B3CF& D8 k$ l2 t1 `- U
05:B392:95 5C STA $5C,X @ $005C = #$00' i* m) L) F+ O+ n+ S
05:B394:C8 INY* T# r* r+ X0 H$ E9 g+ x
05:B395:B1 08 LDA ($08),Y @ $B3DE = #$00: J; o; \. W, j ?' k. w* o
05:B397:95 5A STA $5A,X @ $005A = #$00 t+ |; @" R2 b% n' |
05:B399:C8 INY4 j; `9 ]+ `. j" ?
05:B39A:98 TYA4 x. q3 P0 `2 N+ C( `
看到
. q: J7 l) C+ u/ `/ { M, g- g. c05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$00$ i' q0 z2 v; d
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.9 h0 P* j/ Y. N& P% M u
说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:
; b- P' q- J# K, j# R05:B371:B5 5A LDA $5A,X @ $005A = #$7F
5 u8 Q6 k/ d5 E( t% W05:B373:D0 28 BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
1 {8 p6 b) n7 [! z05:B375:A5 30 LDA $0030 = #$00
+ w6 q+ x) b' ^) O# R05:B377:0A ASL
5 U# s) L2 ~3 S; t( Q7 |1 I2 U05:B378:0A ASL9 Q# p+ s$ f! ^ H+ E' \" J1 t9 v
05:B379:85 08 STA $0008 = #$29
3 {$ u# a* n8 s Z) T2 G7 C4 T( a05:B37B:8A TXA8 K, x* t. S1 E7 O% l
05:B37C:0A ASL
- u+ z, {; ], b5 I5 d u05:B37D:65 08 ADC $0008 = #$29
: o6 N, t: P3 U- |, [' A D8 ~0 H05:B37F:A8 TAY# h& |$ p2 Q" l5 I5 U3 d
05:B380:B9 D2 B3 LDA $B3D2,Y @ $B3D7 = #$B4& X0 b2 c8 }4 \4 x, o, q- o
05:B383:85 08 STA $0008 = #$29
( k1 t9 e; f. y" @ G6 T05:B385:B9 D3 B3 LDA $B3D3,Y @ $B3D8 = #$FC0 D% T, E, K9 K4 ~
05:B388:85 09 STA $0009 = #$B2
# g0 c, ? F8 [# ?5 [05:B38A:B4 5E LDY $5E,X @ $005E = #$02
0 [6 K5 I! ^) q5 k% X/ U05:B38C:B1 08 LDA ($08),Y @ $B22E = #$10
/ ]& u/ E! @+ o5 `05:B38E:C9 FF CMP #$FF, H6 L. q+ G4 R( `; h- R
05:B390:F0 3D BEQ $B3CF7 Q- ]) n1 [ U
05:B392:95 5C STA $5C,X @ $005C = #$00
/ U1 e$ N: T' F: ^* A& b$ l05:B394:C8 INY
8 i. `5 ]" X8 T. n& P2 E05:B395:B1 08 LDA ($08),Y @ $B22E = #$10
# d) f1 l1 Z; s05:B397:95 5A STA $5A,X @ $005A = #$7F1 Y* x& @# _) O) g8 v: W- D3 e1 @
05:B399:C8 INY
6 \- s3 ?7 R0 b" b9 a! H05:B39A:98 TYA
$ ?0 |. s+ }9 [4 L# F }# x" j5 ~05:B39B:95 5E STA $5E,X @ $005E = #$02
8 a( Y9 t& h) m' F9 W05:B39D:D6 5A DEC $5A,X @ $005A = #$7F(5A递减)
2 A' [# d. g/ K0 X0 I, |# q& h4 z05:B39F:B5 5C LDA $5C,X @ $005C = #$00
1 ^( ~3 \7 O8 X6 H6 t6 Y+ a05:B3A1:95 F5 STA $F5,X @ $00F5 = #$00) _4 _: [8 F2 D( H' P
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
) X1 s7 Z" X: U: a4 J0 o
% c* H+ t0 S, k% M8 E, e由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了, I1 }* c) Z& i9 D$ `* l0 @8 ]
可以下载玩一玩8 W. Y0 N; v. ~* T* Q& S. `" z
http://pan.baidu.com/s/1bnE0AwZ |
|