|
本帖最后由 yandagui 于 2015-10-28 19:02 编辑
: n; i0 D5 g; @: U
' [# i* Y6 A9 }+ W8 J) F! IFC自动演示修改教程
; v. }% C, e0 U q) f8 U: C9 D作者:火焰烈旋风
$ P* F% F' ?- z! F; G工具:FCEUX中文版(www.9553.cn搜FCEU即可)- ^" U% @4 G1 X+ P6 B9 r
1.找按键地址:
$ v* G) T2 `& A ?! R( E( p. \ 首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10." F& E" H J+ u+ h4 F8 }/ x3 Q* B9 N$ P
2.找演示时按键的数据来源:& c: V8 K/ @, m# I7 r6 V
既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
3 F" ?7 g Q, l07:C38F:94 F1 STY $F1,X @ $00F1 = #$016 @# e o% Q& |1 z
07:C391:94 F9 STY $F9,X @ $00F9 = #$005 c F N a8 \7 r, n. h
07:C393:CA DEX
; }$ s% H2 k: j, {4 Z1 B07:C394:10 F0 BPL $C3865 S9 `% K/ I6 \3 G0 b0 @3 M
07:C396:60 RTS" k* D) G3 u! F; B: U: h
我们点击"运行"左边的上拉按钮上拉,看到如下指令:
4 o- U( B3 e; C4 C ~07:C378:A5 1D LDA $001D = #$07
( w4 w& ~& s9 u; K07:C37A:29 04 AND #$04
1 i7 V5 i; |3 v0 _6 H6 Y07:C37C:D0 06 BNE $C384
# o, w) `3 H7 p1 Y& v07:C37E:A5 04 LDA $0004 = #$00( Y" r& n [9 K' H* w* Q h+ e
07:C380:05 05 ORA $0005 = #$00
7 p: O% _' g4 z. }0 @07:C382:85 04 STA $0004 = #$00/ y8 K+ D2 T7 F) v
07:C384:A2 01 LDX #$01$ L R6 J( J. D, G# E/ ^
07:C386:B5 04 LDA $04,X @ $0004 = #$00
u6 r5 N% N: s9 b5 |07:C388:A8 TAY
, k. z) }+ f9 ~. b/ ?. z* T# v, A07:C389:55 F9 EOR $F9,X @ $00F9 = #$00* k: \5 }; z+ M' m7 a/ I8 z$ v
07:C38B:35 04 AND $04,X @ $0004 = #$00
3 s' U' L4 F* b& n# k5 n& t& N07:C38D:95 F5 STA $F5,X @ $00F5 = #$00
" s: R1 u6 E s q E/ V07:C38F:94 F1 STY $F1,X @ $00F1 = #$01
2 ?7 p c7 j* W! }) N07:C391:94 F9 STY $F9,X @ $00F9 = #$00: a9 D9 m6 Z D
07:C393:CA DEX
: s; ]9 G' `# T( k07:C394:10 F0 BPL $C386
; \$ ]/ j( V0 v- _4 u& b6 Y07:C396:60 RTS2 A' m1 F @( \ l* i1 P3 U) X
由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:5 _ C- Q8 o5 n9 V1 w' d' Z
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
A+ G' S! _; _( l05:B3A5:A5 2E LDA $002E = #$C8
& }3 [/ C- g" P0 u. w4 K+ d05:B3A7:C9 50 CMP #$50
: ]" `( L$ B2 t+ c+ j; g/ J& z05:B3A9:90 20 BCC $B3CB% _) \# t! C3 u: ~& m' V/ E6 S: ]
05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00
+ Y' z6 I* Z2 l2 Z9 u05:B3AD:29 0F AND #$0F# h+ q6 I* M# h5 X! Q$ g
05:B3AF:C9 01 CMP #$018 B% U( V$ v& V! p% ?
05:B3B1:F0 04 BEQ $B3B7
6 p, S8 i; o) Y: i: ]9 i7 i05:B3B3:C9 04 CMP #$042 X) `/ m: j/ k
.........2 y2 l. P) d* U1 @
我们点击"运行"左边的上拉按钮上拉,看到如下指令:
~6 S7 d" \0 p- h) _3 U: ?% b05:B39F:B5 5C LDA $5C,X @ $005C = #$01" s( G6 w U7 @4 y
05:B3A1:95 F5 STA $F5,X @ $00F5 = #$01$ ^& p8 B" j n* F
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
: {1 j" g1 d; e2 @) E05:B3A5:A5 2E LDA $002E = #$C8
& a' G6 `) K9 \- V: C R3 ^/ u05:B3A7:C9 50 CMP #$50
! f0 g/ h% H' o5 j05:B3A9:90 20 BCC $B3CB' d% S4 U. r9 g( Y1 L
05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00. z7 m7 H$ G; C; N
05:B3AD:29 0F AND #$0F
; S, b! ?& j, V0 b+ g看到2 i j) c. V& q- O* G' V# ^# k
05:B39F:B5 5C LDA $5C,X @ $005C = #$01" o: Z2 v9 C+ A, V- V
05:B3A1:95 F5 STA $F5,X @ $00F5 = #$01& K+ v1 u4 R9 F4 x
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
m3 n6 _% k' e, Q没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.
9 r" T+ ]' R% f# ?* X9 N 接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:
# |) W- O" D& C m05:B392:95 5C STA $5C,X @ $005C = #$016 r& y4 R' h1 { U" O$ N) f# B
05:B394:C8 INY
, j6 T+ {' S7 d+ n05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09
# i; o4 `3 X# l l05:B397:95 5A STA $5A,X @ $005A = #$00
5 O; N% q. n |: W05:B399:C8 INY
. E2 m E$ N. [/ u; y: u05:B39A:98 TYA; k0 t; ^. [; }* u, d% h
然后我们再上拉,得到如下指令:
9 ~2 T$ ?0 u. M1 P8 ?; u- O05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$09" }6 K9 o) V5 a5 T- c1 ~+ \! c' P
05:B38E:C9 FF CMP #$FF7 W. B+ D+ Z% ?6 n
05:B390:F0 3D BEQ $B3CF
# Y H0 D# d4 U1 D& G( L05:B392:95 5C STA $5C,X @ $005C = #$01
( @5 k3 C* V' k. n, ^) G; F05:B394:C8 INY* f0 m5 H* f& i) l2 ?
05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09: |5 c5 a- d, d+ Y: e/ F7 U6 U1 v: K
05:B397:95 5A STA $5A,X @ $005A = #$00
: ~, h# q7 G: a6 Y1 E05:B399:C8 INY6 N; f* k2 g2 d5 g" s% v X
05:B39A:98 TYA
( H2 }2 m, Q# l) M# W看到05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$09: Y% ^3 |3 A" X) M; J
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.
6 r2 B! C3 O$ j' ?! _5 H3.修改演示:
: K6 c. A# F* B7 U6 i 打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
# p. i4 K$ [0 p6 E 我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:1 g7 z. ^- Z. |7 o2 M
打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:2 A: W! F5 m' S. [4 S! E& E5 y
05:B392:95 5C STA $5C,X @ $005C = #$00' Q" |, ]9 q) N7 h5 j
05:B394:C8 INY
# R' k$ z/ O" X3 e05:B395:B1 08 LDA ($08),Y @ $B3DE = #$00
/ w9 G# ?: u; J! a6 ?7 Y$ m) _' m3 D05:B397:95 5A STA $5A,X @ $005A = #$00
5 w. h% P6 q. R1 C3 s$ M% u! d05:B399:C8 INY
) w/ V* o" Z5 h) j4 |' h( J+ H05:B39A:98 TYA7 C! ^* ]( ?) ]/ t( `' ?/ E
我们上拉看到了:
* Y8 l8 c. D9 Z# x% S) y05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$00* J2 h( T/ o9 O* q8 U* G K+ @
05:B38E:C9 FF CMP #$FF9 I" C/ H- b4 h( v# M
05:B390:F0 3D BEQ $B3CF
# E* Y4 t! E$ I9 h) m$ F& C+ ?05:B392:95 5C STA $5C,X @ $005C = #$00$ g( U+ G" c& `. L) |
05:B394:C8 INY4 D5 }" x( l3 E( D! C% X
05:B395:B1 08 LDA ($08),Y @ $B3DE = #$00' F) J8 k3 V, R* o# c% U- p& d# V
05:B397:95 5A STA $5A,X @ $005A = #$00
" h; ~8 m7 F6 l$ z9 w& o/ t8 q05:B399:C8 INY* N2 r/ \# B; w4 Y6 n9 |& U. q$ {
05:B39A:98 TYA( R- N! e% P( c. t5 N
看到) w |/ d5 B; k' G
05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$00* P8 `/ i0 Q0 N2 x# k ]
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.
) e( Z/ w6 u: |$ S S: y4 z, c8 r8 ~说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:( Q# G, w, k1 z0 j) j; |+ s
05:B371:B5 5A LDA $5A,X @ $005A = #$7F8 t/ w. w$ p# t V) h* ~
05:B373:D0 28 BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
& `7 A8 b; \6 Q6 x05:B375:A5 30 LDA $0030 = #$00/ \1 \3 j; }$ }- J' m; O1 ~9 j
05:B377:0A ASL+ h1 W4 `- a( B! t, E C/ n2 A
05:B378:0A ASL3 {0 G S) W$ Q l! E; U& Q
05:B379:85 08 STA $0008 = #$29
; J: V. {9 {$ F' V05:B37B:8A TXA" U' ] T: w* O
05:B37C:0A ASL D6 V- {- C' Q2 h% N3 z' v3 G8 s6 V
05:B37D:65 08 ADC $0008 = #$296 Z( l2 S5 _$ B3 o( H
05:B37F:A8 TAY
( I( w7 A4 [& `# z- X( n05:B380:B9 D2 B3 LDA $B3D2,Y @ $B3D7 = #$B4
$ P0 Z+ y$ a5 ^# T: q, a9 P: V) u; i05:B383:85 08 STA $0008 = #$29: g0 b% Q ?3 y- j: @0 x% E
05:B385:B9 D3 B3 LDA $B3D3,Y @ $B3D8 = #$FC
% R) O) @& {; I U/ X3 h% S6 n05:B388:85 09 STA $0009 = #$B29 ^3 B& M& u- [* G/ N$ L2 o
05:B38A:B4 5E LDY $5E,X @ $005E = #$02
4 y, G3 {3 b% Y; y) K0 Q05:B38C:B1 08 LDA ($08),Y @ $B22E = #$10 E6 B1 |/ t$ l1 i1 I9 ]& A/ S1 ~
05:B38E:C9 FF CMP #$FF
" V5 Y/ _! } [3 }, p, `05:B390:F0 3D BEQ $B3CF
$ e, y0 s" W- ~0 M05:B392:95 5C STA $5C,X @ $005C = #$00
4 ^* i, q$ g$ @/ V05:B394:C8 INY' W: z5 ^# R% H2 B1 D* {% E0 I
05:B395:B1 08 LDA ($08),Y @ $B22E = #$10
& J' o7 a, D" e4 ^. u05:B397:95 5A STA $5A,X @ $005A = #$7F
8 e# }& I& x' X" l/ o' a05:B399:C8 INY
% v" y6 w) W- O! |* I4 q) ~05:B39A:98 TYA n- v+ R6 o w: W
05:B39B:95 5E STA $5E,X @ $005E = #$02
a- h. g) i7 t05:B39D:D6 5A DEC $5A,X @ $005A = #$7F(5A递减)
# u+ e7 v4 r! L) T a% D( T05:B39F:B5 5C LDA $5C,X @ $005C = #$00) D6 M. W$ C! ^* h
05:B3A1:95 F5 STA $F5,X @ $00F5 = #$00
; W. O3 ^ h" x$ K05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
4 r6 o0 u$ h3 p9 i! ?% Y* `2 |* f3 S
) ~ F- l, R5 {/ @: [由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了9 M) r8 E: d# I( K3 t2 K' `
可以下载玩一玩
" R% B% r7 F* X& D0 Chttp://pan.baidu.com/s/1bnE0AwZ |
|