|
本帖最后由 yandagui 于 2015-10-28 19:02 编辑 ! v! F) Q# s* K- S& M$ A& A
% a |7 h. O- o5 R) M, s) {FC自动演示修改教程# l N7 }4 s' m, ?2 l0 \
作者:火焰烈旋风
$ K0 J" T. U8 o5 ^: y工具:FCEUX中文版(www.9553.cn搜FCEU即可)
* u7 i4 t- i8 y1.找按键地址:9 e( J7 D! x: t U! v
首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.$ J4 `% y4 Z5 s2 v. I& B: ?" V
2.找演示时按键的数据来源:
+ U$ M% F" \+ f$ e! q7 N9 j 既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:' M2 T! `1 m* A. ^
07:C38F:94 F1 STY $F1,X @ $00F1 = #$01
/ o0 g0 ?" C, [: F07:C391:94 F9 STY $F9,X @ $00F9 = #$00
7 p3 o# _! U. W+ a/ v$ Y+ H; a07:C393:CA DEX
* z6 r+ c) e3 Q- ?- o07:C394:10 F0 BPL $C3867 P' s( o6 P# }
07:C396:60 RTS- m7 D6 d, o f9 ^
我们点击"运行"左边的上拉按钮上拉,看到如下指令:1 y; U. q+ q! c9 L7 T
07:C378:A5 1D LDA $001D = #$07
0 F& ^, d H; G% u% g% E' B07:C37A:29 04 AND #$04
0 _1 ^5 p J s* A07:C37C:D0 06 BNE $C384( P' f: b/ q; g# x% K, B+ P
07:C37E:A5 04 LDA $0004 = #$00
% G, }6 u- G& F) f n0 k( t# w5 N07:C380:05 05 ORA $0005 = #$00
9 x0 b7 n# v6 { e5 ?3 A07:C382:85 04 STA $0004 = #$002 r7 @* r$ ~) s# v( I7 ~8 S4 ?. `6 M$ Y
07:C384:A2 01 LDX #$01
8 ~% _ ^8 g) w2 G8 O& `07:C386:B5 04 LDA $04,X @ $0004 = #$000 F, A4 G) p X1 I
07:C388:A8 TAY
4 `8 O4 ~) O3 r- N07:C389:55 F9 EOR $F9,X @ $00F9 = #$003 O4 n! |( ?$ H$ l9 [6 b
07:C38B:35 04 AND $04,X @ $0004 = #$00
2 g5 i) E) N9 k5 p5 m( h9 A07:C38D:95 F5 STA $F5,X @ $00F5 = #$001 i6 C! e# r: o+ z8 U) Z
07:C38F:94 F1 STY $F1,X @ $00F1 = #$01; x4 s) a2 v( X% t$ [! ^
07:C391:94 F9 STY $F9,X @ $00F9 = #$00. x7 m- r+ g0 w4 s; `3 ~' |6 q- e" D1 Y
07:C393:CA DEX* s4 n" x9 r: v: M v+ |% v7 `% }
07:C394:10 F0 BPL $C386
- L/ {" T( G$ {' b' |# K, N5 f07:C396:60 RTS3 ]$ D( @0 I1 V# u6 F
由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:0 C4 N+ y! P. w. j V5 m7 p. u
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00! m \& ?0 g4 H1 j+ |$ t
05:B3A5:A5 2E LDA $002E = #$C8
2 y9 L0 L! `6 ?+ ^$ C4 `$ c( @05:B3A7:C9 50 CMP #$50
/ p+ G" ~. R" Z05:B3A9:90 20 BCC $B3CB
) K, P9 t/ ?2 ~" `/ b, u* H) g/ E05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00& t( o) R8 Q K) p' ^0 o9 F; m
05:B3AD:29 0F AND #$0F
8 ~# `1 L* c* X( b) n3 R$ h05:B3AF:C9 01 CMP #$01+ z/ m7 O2 [1 \# Z' `9 }
05:B3B1:F0 04 BEQ $B3B77 }) ^% ^# G: q" X! C5 o
05:B3B3:C9 04 CMP #$04
8 h+ _- a' Q- P- T7 Q: d# h.........5 n7 Y! H' [7 o7 o( k3 v
我们点击"运行"左边的上拉按钮上拉,看到如下指令:7 N0 ^- V+ x9 g) n, q
05:B39F:B5 5C LDA $5C,X @ $005C = #$01
$ m$ v- l: z7 S05:B3A1:95 F5 STA $F5,X @ $00F5 = #$01 v% W: G) S! H- y" k0 w9 B# r
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
3 L1 r9 h) A" d- t& O05:B3A5:A5 2E LDA $002E = #$C8
. D$ { H) s5 \ ?05:B3A7:C9 50 CMP #$50
3 K/ b# F, V" |% N1 y3 k05:B3A9:90 20 BCC $B3CB, G% I: f: ~/ `9 ]9 \
05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00
' ^8 w/ I9 ?: `9 O: ]% a, j05:B3AD:29 0F AND #$0F* K) i8 s. p$ i! A9 P1 v5 q
看到
9 y! w3 z8 L+ R3 P6 Y05:B39F:B5 5C LDA $5C,X @ $005C = #$01, e I3 ~0 h% Z; b2 ]$ K
05:B3A1:95 F5 STA $F5,X @ $00F5 = #$01* I* @3 b7 y/ S6 w9 q
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
3 c D" C V( h/ D; r没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.: c. r/ s0 I- ^
接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:
" S, L$ q. g$ u. W05:B392:95 5C STA $5C,X @ $005C = #$01
# m# n" e; H6 G- O* e( ] y05:B394:C8 INY7 d8 z, A+ v- \) i2 w; R t
05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09- Z' M) t: B0 g. m4 r$ o$ O
05:B397:95 5A STA $5A,X @ $005A = #$00
2 P, B) X9 e% x% X L# [05:B399:C8 INY
. N( ?& m3 y+ [) D05:B39A:98 TYA) s) w2 L+ @+ X: _- b) x! V& U/ |
然后我们再上拉,得到如下指令:* A8 z3 k. y) L- O4 ~% N
05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$09$ a! _, e6 t3 d" N# `; \4 b' u# k
05:B38E:C9 FF CMP #$FF
4 m8 r- B0 o1 b, v9 G/ Z! Y05:B390:F0 3D BEQ $B3CF
, y4 V, K* y. D. |7 n! U05:B392:95 5C STA $5C,X @ $005C = #$01
( c8 Z9 r3 i$ N; _ U" T05:B394:C8 INY
3 k5 G7 M0 o9 x05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09* y) N" u- f* r$ j3 k" K
05:B397:95 5A STA $5A,X @ $005A = #$00* `6 _) e) y) V8 C
05:B399:C8 INY
& W O" Q- `# j9 ]4 {05:B39A:98 TYA( e& d( W/ l1 ^
看到05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$09
5 ^, M2 a) |' S: R没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.' d$ ^( |, Q$ c5 m
3.修改演示:3 X* U+ h% D( x# x. C
打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.8 W, P3 w" z' M( @3 u/ c
我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
' m& \7 V: c4 n* y4 ]4 C打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:
& w k' F( I; ]7 v+ E05:B392:95 5C STA $5C,X @ $005C = #$00
- P! J+ ?" s2 S v0 t- w( E05:B394:C8 INY
7 t$ I& d9 ], w6 a+ ?, H2 [" ~' T05:B395:B1 08 LDA ($08),Y @ $B3DE = #$00
|6 C8 P* ~ W* t5 B: w8 i6 A05:B397:95 5A STA $5A,X @ $005A = #$00+ [" T( V( X* h. x6 q+ D
05:B399:C8 INY4 x0 X. u$ Z) } S
05:B39A:98 TYA1 l# p9 N& b* M0 q2 `
我们上拉看到了:
( P3 W' b: x/ `6 @$ G# s05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$005 {% m0 X1 V1 D' M% i
05:B38E:C9 FF CMP #$FF7 P, X6 P! s# {
05:B390:F0 3D BEQ $B3CF5 \* R* c* p$ b4 l. j0 A3 G
05:B392:95 5C STA $5C,X @ $005C = #$00
" C% ^: k* x3 {& I0 l( ], V05:B394:C8 INY6 T! Q% e6 o! i& Q
05:B395:B1 08 LDA ($08),Y @ $B3DE = #$00
. D$ u# r4 K6 d% F05:B397:95 5A STA $5A,X @ $005A = #$00" C9 _# J8 ~0 K+ `
05:B399:C8 INY
7 v+ I$ @9 l% F05:B39A:98 TYA; A' M. k( E6 h* {8 g
看到7 D$ _& ?# l h' U" [
05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$002 Y/ c- R9 O+ ~
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.
+ }4 H$ n9 e2 |说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:3 [2 Q& T W/ V
05:B371:B5 5A LDA $5A,X @ $005A = #$7F8 z; d: `" { u& v# S& P2 ^& ?
05:B373:D0 28 BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)1 }' y: K r4 k _2 `3 J. s" N
05:B375:A5 30 LDA $0030 = #$00. K, Q6 v- P7 Y5 H0 ]
05:B377:0A ASL
5 n- y4 O) H4 S( i& }/ [: q( R05:B378:0A ASL* ]7 I, U3 G6 {7 x
05:B379:85 08 STA $0008 = #$29/ O. Y/ H& ?1 R9 F% u5 @4 w7 s
05:B37B:8A TXA% W& `+ F. m1 M
05:B37C:0A ASL X4 v/ G; q, V& N8 r9 M
05:B37D:65 08 ADC $0008 = #$290 K9 L; I( u- S) a6 l! \3 B$ U
05:B37F:A8 TAY
+ ?9 b" V, e" M* B. X0 _05:B380:B9 D2 B3 LDA $B3D2,Y @ $B3D7 = #$B4
5 o5 A6 d7 P2 j# p1 C2 [/ D' k05:B383:85 08 STA $0008 = #$29
! ?% h7 Q" y) F; ~8 L. Q) `3 a0 d( ?05:B385:B9 D3 B3 LDA $B3D3,Y @ $B3D8 = #$FC
! f& U: F0 M/ c05:B388:85 09 STA $0009 = #$B20 m1 ?4 p$ _1 J" u1 s
05:B38A:B4 5E LDY $5E,X @ $005E = #$02
2 O& i6 A6 I" k* b! H05:B38C:B1 08 LDA ($08),Y @ $B22E = #$10
3 P F( E9 @$ P: t! W( [/ M05:B38E:C9 FF CMP #$FF( K$ Q8 z: A# p) `8 W v1 f. D
05:B390:F0 3D BEQ $B3CF6 K0 w6 X0 K' h3 p( A% L
05:B392:95 5C STA $5C,X @ $005C = #$00$ j2 K o3 X) r! c1 W- c
05:B394:C8 INY$ p0 U: o: d+ i* k+ x) Z" D
05:B395:B1 08 LDA ($08),Y @ $B22E = #$10
; u; m: N$ m: o& w8 C( s05:B397:95 5A STA $5A,X @ $005A = #$7F
9 x, j1 V6 ]/ J8 @05:B399:C8 INY$ z. I' {% o; Q
05:B39A:98 TYA
' C* j% {( H' x" p- Z05:B39B:95 5E STA $5E,X @ $005E = #$02
2 N8 ?8 x0 S$ l$ m05:B39D:D6 5A DEC $5A,X @ $005A = #$7F(5A递减)2 y" F% g/ s) o; G% k
05:B39F:B5 5C LDA $5C,X @ $005C = #$00
% u+ l; W( J* k6 ~/ G: Q05:B3A1:95 F5 STA $F5,X @ $00F5 = #$00
5 q a9 y8 D9 c0 `- C+ b: q05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
2 r5 Q" U$ M7 t; h' i% N1 i& g: L8 ^& [1 V) L: C, ^) n6 L. K. M
由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了, s3 ]4 |# y* O+ w
可以下载玩一玩
( D- H: M5 m/ A& ]0 vhttp://pan.baidu.com/s/1bnE0AwZ |
|