|
本帖最后由 yandagui 于 2015-10-28 19:02 编辑 " j+ J" O8 B& q0 N0 N: U
3 L C7 q7 X7 R, D
FC自动演示修改教程
# f# }2 G- n& F/ s2 @# _6 M作者:火焰烈旋风/ w q& S8 _: Z# ?, Y/ F! w) Q
工具:FCEUX中文版(www.9553.cn搜FCEU即可); P/ C/ J6 D$ E0 p
1.找按键地址:
$ ]/ b9 |* W5 n4 s! n 首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
. s; r$ s0 O3 j. H# b& A/ Z0 q2.找演示时按键的数据来源:/ x5 h W0 B3 U; u
既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:2 b b1 z3 P* e. E
07:C38F:94 F1 STY $F1,X @ $00F1 = #$01/ A0 o( Z% F& D+ b) x6 u. ~
07:C391:94 F9 STY $F9,X @ $00F9 = #$00; m3 J5 i/ H3 d/ @8 U& l
07:C393:CA DEX
$ z4 d) G; p8 w" [2 `5 R$ d07:C394:10 F0 BPL $C386: M$ e7 q) g+ W
07:C396:60 RTS, M) g. }% c8 Y; v, v: l$ f
我们点击"运行"左边的上拉按钮上拉,看到如下指令:
2 _! J3 \. j! `0 w7 Z" _6 V/ [- d5 l07:C378:A5 1D LDA $001D = #$07/ u4 ~6 E/ z# ^' P
07:C37A:29 04 AND #$04
1 x2 d) K" m) d" x" q! U: d07:C37C:D0 06 BNE $C384/ O5 d1 y) r2 _/ F/ V" p S
07:C37E:A5 04 LDA $0004 = #$00
) y6 _6 k& U0 i+ K7 ^# Y! M2 \( B07:C380:05 05 ORA $0005 = #$004 D8 v8 @9 R3 C0 q: C/ y
07:C382:85 04 STA $0004 = #$00
# M8 c( B4 Z# x6 e07:C384:A2 01 LDX #$01. U& N7 ~+ R: F' B) M" S! `5 q
07:C386:B5 04 LDA $04,X @ $0004 = #$00( d1 r! g- ?, b' X9 w
07:C388:A8 TAY* {9 {' }- t+ N' t* Y7 O3 \
07:C389:55 F9 EOR $F9,X @ $00F9 = #$00 [% |- ]) o0 `% o
07:C38B:35 04 AND $04,X @ $0004 = #$00' H$ b- c; D$ c# @" F! j1 }
07:C38D:95 F5 STA $F5,X @ $00F5 = #$005 z# v$ B5 W ]5 J
07:C38F:94 F1 STY $F1,X @ $00F1 = #$01: f4 m R5 G# D a1 a: Q; A; z* t
07:C391:94 F9 STY $F9,X @ $00F9 = #$00; @) v X0 b! Q8 @
07:C393:CA DEX7 \2 ]0 ] Z3 k
07:C394:10 F0 BPL $C386! W; { y; z5 ]) T5 n
07:C396:60 RTS
7 T5 c, D+ F: m8 i4 {5 B/ k; v- |由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:. i$ N! y l$ x; J4 z
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$005 G& h3 r+ w G: d: O
05:B3A5:A5 2E LDA $002E = #$C8
. W& g r+ D) P& D& S. R) u05:B3A7:C9 50 CMP #$507 u( f" X" C, a; {
05:B3A9:90 20 BCC $B3CB7 B) q" s5 }& {
05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00/ D& o* |- }$ n* A
05:B3AD:29 0F AND #$0F. l7 v# b) U6 u" ~' ?
05:B3AF:C9 01 CMP #$01
! @5 w# C; w6 ~' J7 V05:B3B1:F0 04 BEQ $B3B7: v) N6 ~1 B! O5 d; a
05:B3B3:C9 04 CMP #$04
; C7 a# U( i P; T# e.........
4 n5 O7 w+ n* U* F我们点击"运行"左边的上拉按钮上拉,看到如下指令:
) R) g4 m0 t6 t05:B39F:B5 5C LDA $5C,X @ $005C = #$019 D! g0 E* K: x& U. s2 H5 A
05:B3A1:95 F5 STA $F5,X @ $00F5 = #$01: A% I& A# c" z" H: F4 ~
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
/ |! ?3 [# l/ R" o% u05:B3A5:A5 2E LDA $002E = #$C8! |( |6 d8 g v: G# U% ^; _) ?' a
05:B3A7:C9 50 CMP #$50 X. D; A6 z5 D. x: n% ~
05:B3A9:90 20 BCC $B3CB. x/ @0 q6 r: z( S* @
05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00; x$ R8 t; z' ?( y5 q- g B3 {, |5 h
05:B3AD:29 0F AND #$0F+ d$ p' E% w/ A( R* J
看到' w* I* T+ h% B% [! E6 E- j% h1 Z
05:B39F:B5 5C LDA $5C,X @ $005C = #$01 t: p; C3 J7 s% Z
05:B3A1:95 F5 STA $F5,X @ $00F5 = #$01
) P) }/ r" w0 u05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
3 v; `# z8 P6 ?) o没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.# C/ @6 T& g, y
接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:
. O( S5 v9 B; b! k; {+ g05:B392:95 5C STA $5C,X @ $005C = #$01: b; h' N) I( ^5 V$ }
05:B394:C8 INY
' X: G N1 N4 t6 c05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09
1 g% X' S7 |9 ] ~4 W05:B397:95 5A STA $5A,X @ $005A = #$00* y! j0 [6 W" K \# i; f9 l
05:B399:C8 INY
0 X4 U1 x) M. p! n6 H& O05:B39A:98 TYA
3 N, ] c7 @2 w- v然后我们再上拉,得到如下指令:
1 P% G( t5 h4 m6 h05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$09' w8 f# w+ w9 y" e! f1 o) H
05:B38E:C9 FF CMP #$FF. R0 h! T! \! l9 t; O- Y
05:B390:F0 3D BEQ $B3CF
) D7 m' r0 o; i, N5 L1 h05:B392:95 5C STA $5C,X @ $005C = #$01. y4 D) D7 V, c+ b" F2 V
05:B394:C8 INY
& o5 Z7 C5 j) d+ v05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09
' K3 q6 d4 j# R& d05:B397:95 5A STA $5A,X @ $005A = #$00( |* R4 I# C, }) w
05:B399:C8 INY2 s. Y; L3 Y* F/ ]
05:B39A:98 TYA* A- i0 Z& N: B
看到05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$09- T# V! m& p7 {+ v9 G
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.7 `6 [$ G) t8 K
3.修改演示:
2 `: ]5 r3 R, c% b$ R9 m 打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
" z; J% J/ D7 r& K; G3 P 我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
' O. I' v# z$ E" r4 z打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:
9 r( t# ` |+ L8 N7 g! F7 s0 n! E05:B392:95 5C STA $5C,X @ $005C = #$00
0 ~) _# [, g" o/ a05:B394:C8 INY& t B0 n6 X. o5 s. w: z
05:B395:B1 08 LDA ($08),Y @ $B3DE = #$00
_0 c, [4 ^( x, c05:B397:95 5A STA $5A,X @ $005A = #$00
% b7 N' d- w) ]4 Z4 Z: t- F6 n) v05:B399:C8 INY
+ ^ C0 T w0 w7 n" Y. L/ }+ \05:B39A:98 TYA
9 ]/ _8 L, S' e% \3 j我们上拉看到了:4 ?; y( f* f& o3 e7 K, H5 r3 y
05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$00
% q' T3 |/ K$ T6 r1 f05:B38E:C9 FF CMP #$FF
2 P- o0 y4 `$ g05:B390:F0 3D BEQ $B3CF/ Y2 a, l# f, n) N
05:B392:95 5C STA $5C,X @ $005C = #$001 u9 O# g# T) G" g' J9 @4 O
05:B394:C8 INY
7 v+ p, l) }( p% J4 h05:B395:B1 08 LDA ($08),Y @ $B3DE = #$00
( {7 d, g- w& K" f' T05:B397:95 5A STA $5A,X @ $005A = #$00/ g8 z( h2 X) I
05:B399:C8 INY( k: e6 s) h3 G
05:B39A:98 TYA
5 g5 O% v7 |/ J) n! K( a看到7 H; I; c/ C8 ^" e% u
05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$00# |1 @# e& T' f$ E+ q
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.# o2 B) R4 g, [5 S7 w
说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:& I+ ?2 L0 l" U1 t7 l
05:B371:B5 5A LDA $5A,X @ $005A = #$7F; H% ?/ R/ |) C+ L/ O' _. C4 p
05:B373:D0 28 BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)& u* L2 q8 w# s" L: E, Q
05:B375:A5 30 LDA $0030 = #$00
# b+ ?6 q; K0 C05:B377:0A ASL) o: G& R. l6 G8 {! u% Y. q( @
05:B378:0A ASL
. Q6 `" L; M3 z7 g b& u2 ^05:B379:85 08 STA $0008 = #$29
0 a8 G9 A. L4 q05:B37B:8A TXA# M& k8 X+ G1 u" t7 v8 K6 j6 r$ x
05:B37C:0A ASL/ K% r# C0 b5 q0 h+ P5 E( S
05:B37D:65 08 ADC $0008 = #$29% V4 T, l5 O I
05:B37F:A8 TAY# M8 z" x4 V: L3 w9 s
05:B380:B9 D2 B3 LDA $B3D2,Y @ $B3D7 = #$B42 A9 a* ?+ F: i- [( m
05:B383:85 08 STA $0008 = #$29
) K4 D6 ~$ _ Y# |( h, u05:B385:B9 D3 B3 LDA $B3D3,Y @ $B3D8 = #$FC7 n7 q% p* u2 g- g" p- R
05:B388:85 09 STA $0009 = #$B2% B; k9 G* \' g% \- Z
05:B38A:B4 5E LDY $5E,X @ $005E = #$02
0 }+ Y# \8 _! B5 c; O05:B38C:B1 08 LDA ($08),Y @ $B22E = #$10
; ` P# J: ^9 k2 `, f5 R- {! V05:B38E:C9 FF CMP #$FF
I. u5 S6 U: ?. }5 R05:B390:F0 3D BEQ $B3CF
; y+ g3 O. ]7 S+ L: c; w; S05:B392:95 5C STA $5C,X @ $005C = #$006 w2 ^+ W" n) _! x9 ?2 P
05:B394:C8 INY8 {' O/ [6 c3 u, _+ R
05:B395:B1 08 LDA ($08),Y @ $B22E = #$10( Z% `# D% `# u& T9 ]& d
05:B397:95 5A STA $5A,X @ $005A = #$7F/ Y! H+ j* t1 W& u" ?
05:B399:C8 INY
6 _- k0 r3 l5 O, V' M) A+ Q* F05:B39A:98 TYA
! ]. d& `- }- G05:B39B:95 5E STA $5E,X @ $005E = #$02
6 j$ q+ u, z! `5 n0 R05:B39D:D6 5A DEC $5A,X @ $005A = #$7F(5A递减)' O3 f! Z+ }5 w- h( ^
05:B39F:B5 5C LDA $5C,X @ $005C = #$00
' B7 P- ]3 k. j% v, ~05:B3A1:95 F5 STA $F5,X @ $00F5 = #$00 p/ }" [# @5 A( L) Z# c$ M
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
4 j( U3 \- m2 K: ^ |. r
. @4 |: S8 h5 L& z$ S3 c' \由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
+ z1 o6 ?: v' d, }可以下载玩一玩
2 [6 G- h1 b( m' P fhttp://pan.baidu.com/s/1bnE0AwZ |
|