|
本帖最后由 yandagui 于 2015-10-28 19:02 编辑
! p/ y/ h# X$ r' |: B7 N, S9 e
: P9 `' S4 l. J4 x. B) AFC自动演示修改教程6 l- Q2 `8 k" @- G- ^9 W: S! N2 @
作者:火焰烈旋风# S9 |$ D) }5 R# ^
工具:FCEUX中文版(www.9553.cn搜FCEU即可)
5 E: u+ l1 }) E3 M' v1 m1.找按键地址:/ A/ d2 c7 ^- F! C/ o* ^
首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
# a' ~4 Y- J2 `+ ` e2.找演示时按键的数据来源:4 o- m: u3 t) c$ n( f( `
既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:5 V4 x1 K/ I% a) I4 A. ?
07:C38F:94 F1 STY $F1,X @ $00F1 = #$01) c* ^) u; h& R. J
07:C391:94 F9 STY $F9,X @ $00F9 = #$00
) I% G% ~1 q" a( b0 _07:C393:CA DEX- s: t- F5 Q( F/ w4 Z; b0 n& Z" p
07:C394:10 F0 BPL $C3866 K* e9 L. ~- E1 ^5 d' b# k
07:C396:60 RTS
' z* V0 t/ U: L$ j$ y* j我们点击"运行"左边的上拉按钮上拉,看到如下指令:
2 ?' k- Y7 ~$ l, Z07:C378:A5 1D LDA $001D = #$077 J! X) o$ ^" O9 W9 M/ C" a# _: O& d
07:C37A:29 04 AND #$04
+ ` b9 v! D% x. @" U+ ~" |07:C37C:D0 06 BNE $C384" Z5 @9 g1 o+ @
07:C37E:A5 04 LDA $0004 = #$00/ t7 V5 W3 D- t
07:C380:05 05 ORA $0005 = #$009 o6 H+ U' I# o/ O
07:C382:85 04 STA $0004 = #$00
2 D% Q6 }1 [' I" { V07:C384:A2 01 LDX #$01- a1 m( Q7 w+ [/ K, |$ \
07:C386:B5 04 LDA $04,X @ $0004 = #$00/ H- b8 N% a, P* R- g+ J" ?
07:C388:A8 TAY
) w/ D) y4 S3 D4 L9 g) X, d: i; P4 B07:C389:55 F9 EOR $F9,X @ $00F9 = #$00# o3 U& q0 g4 f: `
07:C38B:35 04 AND $04,X @ $0004 = #$00; Y( _& v- p2 f' k( |5 H6 |5 Z+ P
07:C38D:95 F5 STA $F5,X @ $00F5 = #$00& V) l. Q: ~, p) n- r/ t& ?
07:C38F:94 F1 STY $F1,X @ $00F1 = #$01% j& Q, \. a, J0 b# _
07:C391:94 F9 STY $F9,X @ $00F9 = #$005 q% x$ S+ ?. q: ?+ c
07:C393:CA DEX5 v9 A; A$ R3 m) N" W V h) L
07:C394:10 F0 BPL $C386 F- T" f' i4 s+ ?8 f3 N: W
07:C396:60 RTS0 F% K/ ~: ~# P
由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:2 h! U6 `/ @3 n G
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
5 P9 l/ s$ j% v u+ y) S5 w8 E) s05:B3A5:A5 2E LDA $002E = #$C88 y' A& Z3 j' y2 H2 W. z
05:B3A7:C9 50 CMP #$50
8 }2 T: n0 ]6 g2 T+ o1 I2 C05:B3A9:90 20 BCC $B3CB
7 b4 X8 o7 `" ?4 r+ {" X. I3 S, C05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00
; X9 G8 a2 d. k& o' m4 ~05:B3AD:29 0F AND #$0F" l0 ?) x; [" J0 Y0 Z
05:B3AF:C9 01 CMP #$01
6 q1 z( a: q7 ^05:B3B1:F0 04 BEQ $B3B7
- w$ E, O$ D+ r7 r$ z6 D05:B3B3:C9 04 CMP #$04/ b0 q* C4 Z6 y/ @8 Q- D+ p
.........
( Z. V2 h+ \6 X我们点击"运行"左边的上拉按钮上拉,看到如下指令:/ B* P I6 Y7 ^ G7 ?* q( _" L
05:B39F:B5 5C LDA $5C,X @ $005C = #$01
, e0 s: T, v# A! U5 l7 {05:B3A1:95 F5 STA $F5,X @ $00F5 = #$015 o. W1 z. m! I. o4 g+ w5 `% _6 ^
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
" U- N- Q9 a6 C0 m1 m05:B3A5:A5 2E LDA $002E = #$C8
+ O0 c0 r2 W& J/ V& G05:B3A7:C9 50 CMP #$50
! j8 q: D4 D: c/ _) H05:B3A9:90 20 BCC $B3CB* \& U$ ]+ R9 x
05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00
& P' \7 Q' F8 I- C8 |05:B3AD:29 0F AND #$0F
, ` h5 _3 f5 F3 O: `7 q看到
2 @' ?) b1 Y, u5 w) m% t05:B39F:B5 5C LDA $5C,X @ $005C = #$01# ~$ {3 D, g% h# p
05:B3A1:95 F5 STA $F5,X @ $00F5 = #$01
6 R. z* i9 l2 E' V$ N/ C3 H6 v$ ?. b05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
$ I( w9 t. G- S G' n没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手., v5 b$ }% |. j$ D2 K; @7 h
接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:
$ P" o" D' m3 c+ H05:B392:95 5C STA $5C,X @ $005C = #$01
, z- K/ F/ }8 U; d$ t/ M% Y05:B394:C8 INY
0 e5 w- L/ v2 I7 q8 p* I7 H05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09% U% o) a) S' O7 N0 {5 B
05:B397:95 5A STA $5A,X @ $005A = #$00 q. c+ j# z9 g$ c, F" p
05:B399:C8 INY
9 z: T V9 p: Q$ g6 t# e05:B39A:98 TYA9 Z; r3 s0 o, `) ?
然后我们再上拉,得到如下指令:0 a3 w8 D' G2 k0 r' l8 d
05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$09
1 f0 V( l- j# g/ c' X# ?% b05:B38E:C9 FF CMP #$FF
( D# i/ a( Q. \* ]# h05:B390:F0 3D BEQ $B3CF k5 c5 S% m6 h9 R# w4 c5 f
05:B392:95 5C STA $5C,X @ $005C = #$01* I" {; a7 W l" W, Q
05:B394:C8 INY! B8 `8 R! E% x+ J
05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09
) h' X$ ]* ~6 j2 F- x7 O05:B397:95 5A STA $5A,X @ $005A = #$001 Y$ b( b+ @; h1 o. E
05:B399:C8 INY
2 R; e. G7 w$ A2 x' B05:B39A:98 TYA
" O5 x/ A4 B4 r- ?! y看到05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$096 I$ t c2 ` H3 B8 v2 S
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.
/ T, a3 S& s! ~$ R3.修改演示:7 Y+ U" K# V7 F
打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
% _2 S! s: f5 o* N& ~$ M 我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:. P4 m# j0 m* g1 k7 @: h& j
打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:
' y# r: {. }$ X05:B392:95 5C STA $5C,X @ $005C = #$00
. w$ `- ~2 J h05:B394:C8 INY
7 R* \/ L) k2 Z7 `' d" q5 e/ M05:B395:B1 08 LDA ($08),Y @ $B3DE = #$00
6 G! {: s1 ^$ S05:B397:95 5A STA $5A,X @ $005A = #$00
0 r" C% w% L" h05:B399:C8 INY
3 f x1 z/ H8 q9 a' q05:B39A:98 TYA
7 I1 A- N- ?; ?, V8 d我们上拉看到了:3 K+ X# t2 G+ b. Y t
05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$004 J8 I8 U" K/ i" l! i/ d
05:B38E:C9 FF CMP #$FF
# i2 |, d/ h5 j3 y3 p* m05:B390:F0 3D BEQ $B3CF9 K8 r5 P' }9 P2 z
05:B392:95 5C STA $5C,X @ $005C = #$00
& W! l6 Y0 x! [1 W2 V1 m* d/ C; x05:B394:C8 INY
* B, m" w, t& W, |, c$ o05:B395:B1 08 LDA ($08),Y @ $B3DE = #$00
: n5 e8 \+ }0 t( _05:B397:95 5A STA $5A,X @ $005A = #$00
6 w) z& R b# P+ C! M' I. M) ]; j0 s8 {05:B399:C8 INY6 o$ x/ {4 d. p2 h( a. n
05:B39A:98 TYA! X8 c" Z# Y# L
看到, l% O( Y' r7 m- Z* L3 m6 h6 |% Q
05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$00
% v+ S) T u. m1 e没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.5 `& U3 E4 X3 @8 L# L0 c& c2 T
说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:7 Q6 H5 O! {/ ~0 }7 _4 G2 }' y
05:B371:B5 5A LDA $5A,X @ $005A = #$7F
: ]: {& `2 x$ W1 u, ?05:B373:D0 28 BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
3 G4 f B8 G. g9 [2 E05:B375:A5 30 LDA $0030 = #$00
V' m( N9 h* {: [) b7 {" T: ]% X05:B377:0A ASL
1 K, H L4 w7 Y( b% s# z05:B378:0A ASL
0 Q$ O7 `; C" F/ S% I. o# D+ ]05:B379:85 08 STA $0008 = #$29. R. W2 |+ }+ Z' b" m- H
05:B37B:8A TXA
[- b! e, `+ |+ p05:B37C:0A ASL
/ e; O! o- W' s5 w8 Y05:B37D:65 08 ADC $0008 = #$29
+ B4 t# ?1 b6 D o9 x05:B37F:A8 TAY
# L. g/ R% ]5 [0 b' D5 G! }- O05:B380:B9 D2 B3 LDA $B3D2,Y @ $B3D7 = #$B4
& V U& g1 M9 w7 `: M. O05:B383:85 08 STA $0008 = #$29
$ \/ A% w" u& _* C3 f05:B385:B9 D3 B3 LDA $B3D3,Y @ $B3D8 = #$FC; |/ t" B1 k' t4 Y. }
05:B388:85 09 STA $0009 = #$B26 b9 s. U7 a/ k# h/ a- B* d+ F2 L
05:B38A:B4 5E LDY $5E,X @ $005E = #$02
. Q- p6 U/ A" i+ }0 u2 d05:B38C:B1 08 LDA ($08),Y @ $B22E = #$10
5 }4 {9 a: Y/ [0 z R% A05:B38E:C9 FF CMP #$FF
. a! {1 K' e8 ^05:B390:F0 3D BEQ $B3CF
% [3 }6 H0 R: u% |* \8 u+ P% }05:B392:95 5C STA $5C,X @ $005C = #$004 S1 O& T" {+ x0 c9 G8 \4 b
05:B394:C8 INY, U4 {5 X- \$ K: I
05:B395:B1 08 LDA ($08),Y @ $B22E = #$10
) E3 {$ r! ~( x05:B397:95 5A STA $5A,X @ $005A = #$7F& s, v- m4 \* y0 `
05:B399:C8 INY
# ^$ {$ |" n" y2 @ Z05:B39A:98 TYA
! {; h- w; h+ r! f' x05:B39B:95 5E STA $5E,X @ $005E = #$02
& W; S+ E6 H. ?& `. U1 A0 P! ^05:B39D:D6 5A DEC $5A,X @ $005A = #$7F(5A递减): ]7 c) D7 r1 x; w4 @
05:B39F:B5 5C LDA $5C,X @ $005C = #$00
- g* v! q- D1 g05:B3A1:95 F5 STA $F5,X @ $00F5 = #$009 o6 ]9 T6 E! y* `# M w' S) _3 y+ n- [
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00! E& A$ t1 M* H
8 O; @0 C! h) Z; e, X+ g+ ]! ~& N由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
1 v. g ~& t/ M; F- O/ S8 G可以下载玩一玩! P z% X5 j+ V& m3 f- O
http://pan.baidu.com/s/1bnE0AwZ |
|