|
|
本帖最后由 yandagui 于 2015-10-28 19:02 编辑
0 f C4 S0 z& f; ^$ V$ ]$ d, b0 [: y; Q0 \
FC自动演示修改教程
# x/ E1 \+ J5 U1 y作者:火焰烈旋风% m' [% e8 D* e8 Y" W t
工具:FCEUX中文版(www.9553.cn搜FCEU即可)
+ L" F# y7 a" Q, Y2 M1.找按键地址:
: I/ z8 Z* @0 U# X3 e- W, i& i 首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
# S! {) m. n+ |9 w9 ~* ~2.找演示时按键的数据来源:4 }& h( s I6 k3 h4 c; q* Q4 z
既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
' W' @, P, f B0 D( M! N g07:C38F:94 F1 STY $F1,X @ $00F1 = #$015 Q u# j& O; d' y% Y
07:C391:94 F9 STY $F9,X @ $00F9 = #$00! ^- h- n* [) o1 g% }- c
07:C393:CA DEX+ I* q* t8 \' k' u: r
07:C394:10 F0 BPL $C3865 o) V+ O4 a3 R/ S+ t7 H- A
07:C396:60 RTS
) o9 T) I1 v0 F& V# I我们点击"运行"左边的上拉按钮上拉,看到如下指令:, O$ h/ k; F3 q% k
07:C378:A5 1D LDA $001D = #$07
0 A0 J) }5 o Q4 a% y5 ], T07:C37A:29 04 AND #$043 }% {& V' n- h" R$ ]: d
07:C37C:D0 06 BNE $C384) ^* g) I' e" Q( S
07:C37E:A5 04 LDA $0004 = #$00
' E4 z- [8 f/ O; S07:C380:05 05 ORA $0005 = #$00+ T- Z7 r# A) x% ^
07:C382:85 04 STA $0004 = #$00
# X) U+ `0 O- I' N% _07:C384:A2 01 LDX #$01
$ l! M) n1 M2 r- W07:C386:B5 04 LDA $04,X @ $0004 = #$00
, T6 }( j2 G% _7 }7 @& H9 i; _* B( L, z/ h6 C07:C388:A8 TAY
2 p/ O! ]9 F# {4 x; H07:C389:55 F9 EOR $F9,X @ $00F9 = #$00
; L9 Z$ L2 ?8 J$ V07:C38B:35 04 AND $04,X @ $0004 = #$00; e# }# Y. K7 {( g! `
07:C38D:95 F5 STA $F5,X @ $00F5 = #$004 f$ D- ?4 m4 a1 {! d' G6 F T
07:C38F:94 F1 STY $F1,X @ $00F1 = #$01- O8 e' q6 j. M! a- d$ F* b4 Z
07:C391:94 F9 STY $F9,X @ $00F9 = #$00
P8 |- s/ K" i2 S+ F" V" ~07:C393:CA DEX4 _' H: |- v" l: U! ^8 `( W
07:C394:10 F0 BPL $C386
$ |) ^9 r" p! x$ m& {07:C396:60 RTS
2 A- d$ J; K+ d6 {% c w1 z# |% q由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:
2 f& [7 L: m7 ?. [05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00" m6 R' z: _( ?2 R4 }( [9 [
05:B3A5:A5 2E LDA $002E = #$C8
1 q0 f0 ]! [1 n/ B% v/ Q0 W/ j05:B3A7:C9 50 CMP #$50
0 R/ G d1 c7 @+ W) I; K, z05:B3A9:90 20 BCC $B3CB
- w3 B3 t8 n8 r: d05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00: k4 K+ D* ~: K" O
05:B3AD:29 0F AND #$0F1 Y' ^$ N# j/ \
05:B3AF:C9 01 CMP #$01
% X3 I3 O7 l1 _! D, k05:B3B1:F0 04 BEQ $B3B73 R6 t" g! r& D3 F: R! O, r# R" U
05:B3B3:C9 04 CMP #$04
7 v# a" S* |( H! T8 K! o- y. ?.........- p. I# O0 u/ q0 Z M- c0 z
我们点击"运行"左边的上拉按钮上拉,看到如下指令:- \8 ^0 W6 G3 A" |3 D$ a
05:B39F:B5 5C LDA $5C,X @ $005C = #$01
* @ H4 \. ]. B4 l) Q" M$ P5 E$ j( w05:B3A1:95 F5 STA $F5,X @ $00F5 = #$01
" w" l' A( [, J& v05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00* d( E. V+ l+ N6 C: _" W. B0 h
05:B3A5:A5 2E LDA $002E = #$C87 z; L+ S- g+ T
05:B3A7:C9 50 CMP #$50 V6 {8 p; G b* O* r" B
05:B3A9:90 20 BCC $B3CB
5 v, r8 q+ G w2 ?05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00
' D+ B8 `% }% a" d. p+ m05:B3AD:29 0F AND #$0F- v) `. b! o& R t) _
看到5 E5 S1 C% a: @& L5 |6 l
05:B39F:B5 5C LDA $5C,X @ $005C = #$01+ d! _& d( H) T; z1 `: D+ N
05:B3A1:95 F5 STA $F5,X @ $00F5 = #$01
8 X# f5 P4 ~' p05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
+ {; `5 Q2 W. M. t6 R没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.1 h: h* ?! w, C/ `( b' F! X1 w- Y% M. T
接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:4 ^8 ^; Z) Y" H2 j% N' R3 Y
05:B392:95 5C STA $5C,X @ $005C = #$01, x5 z4 w. ^' l! S5 g/ I
05:B394:C8 INY
! F' I7 ^# j% E6 O05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09. `% _5 }8 _3 _* z, ^2 U9 U ~! N
05:B397:95 5A STA $5A,X @ $005A = #$00
2 H. p1 }! _1 o! v9 u05:B399:C8 INY; @3 q# R# J& f& W' S
05:B39A:98 TYA: K! R8 |3 E" e1 @& L' u& f
然后我们再上拉,得到如下指令:
# W7 M+ j$ x. V7 f1 C1 f/ U05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$094 z3 X; E: N: C/ J, _) y
05:B38E:C9 FF CMP #$FF
) {- r% r0 S1 G8 Q2 E" i9 t05:B390:F0 3D BEQ $B3CF
) y# X: ]; G, @: G0 S# Q1 q% T+ c05:B392:95 5C STA $5C,X @ $005C = #$01& _ i: Q: u [, x$ y
05:B394:C8 INY
4 x; h* @( f# U& d x7 ?05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09" N% ?) J: I& ^6 C. n& P7 Q6 a
05:B397:95 5A STA $5A,X @ $005A = #$00; H& Q4 k) Z* ^0 n# G
05:B399:C8 INY- d# i2 A9 l5 r; S# Y: ?; W- z5 j
05:B39A:98 TYA6 m+ j4 B0 A, ?+ {: l8 r* D% ], S
看到05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$09
1 I U! Y; f, m2 W4 J没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.
7 o$ o3 n/ C) u& J0 n3.修改演示:
- h& @7 `8 B+ A2 W' w0 D; p; l 打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.( w; N4 ?. b# y1 |$ J' }
我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:+ j$ `. i- H+ [1 ]3 L- u
打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:
$ }1 j5 p* k: n8 c4 O W# h05:B392:95 5C STA $5C,X @ $005C = #$00
2 C% [! ]( W: N1 x7 ?05:B394:C8 INY
, q2 U# m( O0 ]0 U05:B395:B1 08 LDA ($08),Y @ $B3DE = #$00. l- e5 M% a( n% A* o4 j7 I
05:B397:95 5A STA $5A,X @ $005A = #$002 X2 n7 r) o; y
05:B399:C8 INY
U) @8 a/ a3 e2 s0 s, V05:B39A:98 TYA
: F/ |# r4 T; ^1 P, O: l2 y我们上拉看到了:2 z1 K6 J6 F& z$ m# |! q+ L' X: F
05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$00
) a5 a; I: R- z& c05:B38E:C9 FF CMP #$FF
" y6 f% E5 W3 B8 o7 X) `6 A$ s! N05:B390:F0 3D BEQ $B3CF% j; \9 [/ I3 O% X+ B8 S1 ~+ {
05:B392:95 5C STA $5C,X @ $005C = #$00! d" b4 T" c9 Y
05:B394:C8 INY
- D/ [3 C: X8 o% B05:B395:B1 08 LDA ($08),Y @ $B3DE = #$001 A5 C/ X# g2 i0 j' ?+ `9 ~
05:B397:95 5A STA $5A,X @ $005A = #$00, C# W w1 P" L
05:B399:C8 INY* F# `8 X2 v# G: o2 i/ k: {
05:B39A:98 TYA
" e- }$ }# j6 S! e4 W3 n3 V看到
5 K) X' l* x$ Q# u1 J05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$00# z4 N( h8 P$ S }. L! w
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.
! O. e4 H9 I3 B1 i, M说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:
2 d; ]$ A9 x- v$ r05:B371:B5 5A LDA $5A,X @ $005A = #$7F3 ]; r+ n1 J8 e- D/ [( z
05:B373:D0 28 BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
8 }2 R, c# }; t6 }9 Q/ t' i5 ^05:B375:A5 30 LDA $0030 = #$00- `4 R$ o/ W T" i3 E3 X$ {' J3 d5 ^
05:B377:0A ASL* q0 S. t* y, t! b2 D$ |: E2 c
05:B378:0A ASL
( a2 A0 L9 O, p; j: U05:B379:85 08 STA $0008 = #$29
6 B8 o u* }! f% C; p: a05:B37B:8A TXA5 g/ `) y+ k+ F! L' D& B
05:B37C:0A ASL
" z% `1 n8 @: ~8 c& `05:B37D:65 08 ADC $0008 = #$29, B! c0 D1 Z4 ~9 m7 F1 [7 Q* ?8 X0 D
05:B37F:A8 TAY4 ^2 J, H2 i. N3 ^, D# U% m
05:B380:B9 D2 B3 LDA $B3D2,Y @ $B3D7 = #$B4
2 w4 x( X$ y/ A7 R0 N$ _05:B383:85 08 STA $0008 = #$29: s% G, _7 O/ l9 N. D& O
05:B385:B9 D3 B3 LDA $B3D3,Y @ $B3D8 = #$FC$ Q# Z5 o# V) S8 Z0 c, U \6 ?
05:B388:85 09 STA $0009 = #$B2, _' R. [* s; L$ e2 o
05:B38A:B4 5E LDY $5E,X @ $005E = #$02/ }" ~$ I6 U4 a8 P7 L( z
05:B38C:B1 08 LDA ($08),Y @ $B22E = #$102 U4 }" f- p Q
05:B38E:C9 FF CMP #$FF
2 p( A/ ~/ r' Q$ t) \" L+ @05:B390:F0 3D BEQ $B3CF' Y, R' ?# A4 c0 g
05:B392:95 5C STA $5C,X @ $005C = #$004 H) K4 j' G' f
05:B394:C8 INY3 ~5 N; ~9 D- I# ~
05:B395:B1 08 LDA ($08),Y @ $B22E = #$10
( B5 q. }2 D) e- x7 H+ y: S05:B397:95 5A STA $5A,X @ $005A = #$7F
3 I( K$ t% a5 e05:B399:C8 INY1 n: ]/ o# e: Y# z, N8 ^" j
05:B39A:98 TYA
V' E7 v. H) a7 R05:B39B:95 5E STA $5E,X @ $005E = #$02/ ~" x9 d6 D5 ]
05:B39D:D6 5A DEC $5A,X @ $005A = #$7F(5A递减). K8 u4 M: x: S& L4 W% o7 w3 k
05:B39F:B5 5C LDA $5C,X @ $005C = #$007 |& o& J! ^; e* h* J' a& \8 g
05:B3A1:95 F5 STA $F5,X @ $00F5 = #$00
; S6 [4 ?3 m, c- N05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
: }9 {. s# e9 s; l; ~& M
/ `# o7 ~$ D9 {' `由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
2 ]8 `3 k% p& }9 u* X' n可以下载玩一玩) B8 m t& P3 V& |* f5 n
http://pan.baidu.com/s/1bnE0AwZ |
|