|
本帖最后由 yandagui 于 2015-10-28 19:02 编辑
" K2 y( P) w* K. J& w1 w0 y1 J% |
0 y/ A( c+ |) V$ W" L9 [FC自动演示修改教程, `# p, c+ n! @2 P9 b" A2 q3 K% T
作者:火焰烈旋风0 o; G9 r( f7 j; F4 y' S+ K4 q
工具:FCEUX中文版(www.9553.cn搜FCEU即可)+ j; e8 {) u7 l3 U: A+ O
1.找按键地址:. V: H9 u( F) A6 k& M$ u
首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
8 n6 s: J9 H; t$ E. |2 g+ X- L5 l2.找演示时按键的数据来源:
9 }- K. I S2 r, ? 既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:( @3 M' n# G2 n0 c
07:C38F:94 F1 STY $F1,X @ $00F1 = #$01
& J3 J/ L1 \7 \07:C391:94 F9 STY $F9,X @ $00F9 = #$00
- z# {/ H0 l8 h& ~4 a2 o: O! Z" [07:C393:CA DEX; o3 c- ~( a; O+ u. L/ X
07:C394:10 F0 BPL $C386
7 ~! O, ~; ]. b% {07:C396:60 RTS. H3 ^/ I; A! e( r+ M. C! K
我们点击"运行"左边的上拉按钮上拉,看到如下指令:* t6 B! f1 W, [. W6 i }
07:C378:A5 1D LDA $001D = #$07
' A/ c7 U# |6 S0 V( ]4 c07:C37A:29 04 AND #$045 P! R. I3 h7 ]; {! d. O
07:C37C:D0 06 BNE $C384
% y' w3 b9 d1 R/ N% y A# a8 |07:C37E:A5 04 LDA $0004 = #$00
' J( S2 ?, F. h) ^6 \07:C380:05 05 ORA $0005 = #$00
# ?5 u4 s0 R0 u- G) R07:C382:85 04 STA $0004 = #$00
- p1 g5 _1 x7 p, j1 z9 p, o07:C384:A2 01 LDX #$01
, \% H9 F) L2 L8 k. D6 q07:C386:B5 04 LDA $04,X @ $0004 = #$00
0 T) n9 Y& L; J" b" t07:C388:A8 TAY: }, B f' z/ K7 B
07:C389:55 F9 EOR $F9,X @ $00F9 = #$00
% T9 l& T1 M. d' Q' l9 B07:C38B:35 04 AND $04,X @ $0004 = #$00
, J" Z) K" X; ^4 ]9 ~( {% R2 u07:C38D:95 F5 STA $F5,X @ $00F5 = #$00( y3 O4 [$ z# [4 D4 Q! B5 x. K
07:C38F:94 F1 STY $F1,X @ $00F1 = #$01
$ P& X9 ]# X" i07:C391:94 F9 STY $F9,X @ $00F9 = #$00
$ b# B4 r, B8 |. Y07:C393:CA DEX
/ B1 Q- G6 k. b4 F+ a3 i7 {7 F. P07:C394:10 F0 BPL $C386
# S% |5 R2 X5 \/ V& D5 R0 D/ Q07:C396:60 RTS
- Y' |" K/ ~ u1 k: W- h( Y由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:4 P% c0 ?7 v( z
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
9 N6 ^7 Z# e6 `+ F0 u05:B3A5:A5 2E LDA $002E = #$C8% U7 C0 d9 B. G7 \ B
05:B3A7:C9 50 CMP #$50
7 M+ t1 f% j$ Q3 F0 w9 E& c! H7 o) y! S05:B3A9:90 20 BCC $B3CB
5 j% t M1 l: y( M7 y05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00; K4 P0 E* V" q/ w
05:B3AD:29 0F AND #$0F7 {; V, _, y1 Y% k
05:B3AF:C9 01 CMP #$01 I; V6 t9 j$ M- ~3 Q# R
05:B3B1:F0 04 BEQ $B3B7
# }; W9 p- X: M' _05:B3B3:C9 04 CMP #$04
- u* P& b. O4 i% t.........
# n1 H. H& @4 O8 S我们点击"运行"左边的上拉按钮上拉,看到如下指令:
4 P5 f3 F) d, _; K05:B39F:B5 5C LDA $5C,X @ $005C = #$01
& D! D( s+ s& H05:B3A1:95 F5 STA $F5,X @ $00F5 = #$01
' @$ l5 d$ w/ l% K2 `05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00* R- Q4 C4 V* e( q
05:B3A5:A5 2E LDA $002E = #$C8( X- U6 V, ~3 x$ V8 P$ N0 l* V" R
05:B3A7:C9 50 CMP #$50$ {8 E. ^2 j" F* l" r, _
05:B3A9:90 20 BCC $B3CB* [# X/ A. w. u9 T
05:B3AB:B5 AA LDA $AA,X @ $00AA = #$00
0 d5 F; E( y3 Y3 r05:B3AD:29 0F AND #$0F( W: K. Y6 o6 A6 H# y- X1 w6 S
看到( n" u( D4 a2 m4 G' P; B2 m" I
05:B39F:B5 5C LDA $5C,X @ $005C = #$01# Q L- e2 J+ ^; y& a* b# E
05:B3A1:95 F5 STA $F5,X @ $00F5 = #$017 N5 ?3 I( I! ^# P* T, t. T6 \* x
05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
[( _( E( V+ c& c" W没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.
3 `9 D2 M7 k- g# ?" t% }# R2 R 接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:
7 g5 z# F: v6 ^% L. Y' E b2 i05:B392:95 5C STA $5C,X @ $005C = #$01! c9 Z) i8 E8 [
05:B394:C8 INY( I9 s8 C. h- B; n( d4 G
05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$09
, d- V+ u: c) ^; g/ m/ [$ U9 k05:B397:95 5A STA $5A,X @ $005A = #$00
i b3 a, b$ c) [9 N, @) _05:B399:C8 INY+ ^* D: X% z& x
05:B39A:98 TYA9 u# }2 M3 b1 ]9 s; w
然后我们再上拉,得到如下指令:/ B8 F9 k" n6 x9 F3 O5 g
05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$09
" E* s/ J# J' W4 A) s4 Z% A05:B38E:C9 FF CMP #$FF' J; O0 W1 ^5 F/ W2 F/ W
05:B390:F0 3D BEQ $B3CF
, v) z+ d5 s9 a$ o05:B392:95 5C STA $5C,X @ $005C = #$01
% c+ u# f3 [( {0 Q05:B394:C8 INY
6 m6 [& h) t8 ~3 m$ p( z05:B395:B1 08 LDA ($08),Y @ $B3F2 = #$098 F0 R& k& r0 B q. o
05:B397:95 5A STA $5A,X @ $005A = #$00
- o8 v; d) W( P* Y: _05:B399:C8 INY" D8 @5 Y& L. z. |9 U- a& `
05:B39A:98 TYA
+ I! U+ F1 I p+ ?' \1 H看到05:B38C:B1 08 LDA ($08),Y @ $B3F2 = #$09/ T6 B4 Q# l% y, i( P* S
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.
6 r1 j( J. k5 I& U: }3.修改演示:* z, @# c3 ]4 q$ \; e
打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
0 e% n/ o9 s8 V# g# C: \$ w& R; u. S 我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:$ D6 ~. b8 e! `8 h6 N. f, W
打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:/ [; X7 a0 _( \% V6 g- S6 J$ k
05:B392:95 5C STA $5C,X @ $005C = #$00- n1 d2 s# N% w2 h- L+ v, m, i" \
05:B394:C8 INY
- B' w, w: R* ], l* W. B7 @9 x8 B" ?& q05:B395:B1 08 LDA ($08),Y @ $B3DE = #$00, {% e5 K- z0 C9 z: ~- S2 S% Z6 f3 r
05:B397:95 5A STA $5A,X @ $005A = #$00
: B; r5 J3 L, z# ^% w6 g$ I+ \05:B399:C8 INY. ~, u% M5 \) R
05:B39A:98 TYA& {" T# o' g% B# y6 R9 C; E. k
我们上拉看到了:
( u q" u- R( A) e4 k2 e; j05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$00
) y1 s' a7 l# Q( |# @: l! q4 _05:B38E:C9 FF CMP #$FF
- t' j9 b1 E K! I) e05:B390:F0 3D BEQ $B3CF
+ ?* Q3 j* l/ k% |05:B392:95 5C STA $5C,X @ $005C = #$00; ~; a# |1 c9 Y# D7 x$ i
05:B394:C8 INY6 q3 k4 ~7 t/ S1 G; x
05:B395:B1 08 LDA ($08),Y @ $B3DE = #$00% s) h" d3 R# k7 u# W/ m
05:B397:95 5A STA $5A,X @ $005A = #$00! t8 D$ b* ~: i+ P
05:B399:C8 INY
7 P; {1 E+ }8 p. t6 a0 _05:B39A:98 TYA/ Z0 l+ T* C* w5 d
看到9 q$ k o9 J7 B' Z) f
05:B38C:B1 08 LDA ($08),Y @ $B3DE = #$00
' X+ ]+ _! t. G9 I没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.2 x D. v7 v! 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(时间).......以此类推,判断根据:$ w* D- X0 \0 k( ?$ A
05:B371:B5 5A LDA $5A,X @ $005A = #$7F4 ]' ~& X( b, D1 \
05:B373:D0 28 BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
2 |7 f4 n- t$ k- ?: r7 @, s05:B375:A5 30 LDA $0030 = #$00
# `3 {8 H2 i' R! `! p05:B377:0A ASL
A+ c1 p2 m. S6 U7 K7 \# g( W0 p05:B378:0A ASL# K+ `5 I+ E7 t
05:B379:85 08 STA $0008 = #$296 d1 V- f, q( t( m) Z7 u4 ~' T
05:B37B:8A TXA
) P; ^7 ^" o2 [5 w05:B37C:0A ASL/ U; p" y6 N; p2 k" q" B" w
05:B37D:65 08 ADC $0008 = #$29# X$ J R2 S% i
05:B37F:A8 TAY2 q/ o) G& i X3 n T( J
05:B380:B9 D2 B3 LDA $B3D2,Y @ $B3D7 = #$B4
: s8 o' o2 X5 r" a7 ~2 a05:B383:85 08 STA $0008 = #$29
; n, t/ h" Q6 T# j/ \% s05:B385:B9 D3 B3 LDA $B3D3,Y @ $B3D8 = #$FC3 A$ p9 O S! P# }
05:B388:85 09 STA $0009 = #$B2
2 d1 [* u8 M8 u0 \: t1 c" {05:B38A:B4 5E LDY $5E,X @ $005E = #$02& i$ ~; i# i, b+ `+ G0 l( @
05:B38C:B1 08 LDA ($08),Y @ $B22E = #$10
/ H6 ^; ]* {! C+ A% [05:B38E:C9 FF CMP #$FF0 J$ a# s- Q+ q' ?3 o
05:B390:F0 3D BEQ $B3CF2 d2 ] S) E" t0 I1 i8 v: F
05:B392:95 5C STA $5C,X @ $005C = #$00" V5 @ B4 C/ {+ H8 d
05:B394:C8 INY0 ]8 c0 h: y& S6 L
05:B395:B1 08 LDA ($08),Y @ $B22E = #$10
2 g7 I1 o$ C: k4 A1 W* A: K05:B397:95 5A STA $5A,X @ $005A = #$7F& v1 W* H8 z# J8 B- I' ?2 \
05:B399:C8 INY/ q& s1 H, ^$ M8 Q+ Q
05:B39A:98 TYA8 b$ n( p4 v! k4 `0 o, p2 b
05:B39B:95 5E STA $5E,X @ $005E = #$02
# q j- [, v/ ?1 Z$ S05:B39D:D6 5A DEC $5A,X @ $005A = #$7F(5A递减)6 w! V; t/ Q0 Q- _
05:B39F:B5 5C LDA $5C,X @ $005C = #$00
9 V$ k6 T9 Y/ G! p8 h) ^( j) _05:B3A1:95 F5 STA $F5,X @ $00F5 = #$00
- w, {" a4 Q6 J8 Y! ]5 t+ j, r05:B3A3:95 F1 STA $F1,X @ $00F1 = #$00
5 h0 U8 x# u$ t w$ F. e; R" o( b' s
7 R4 c$ i8 e7 g5 G& p由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
) @+ g5 i# L4 Y% o3 w4 Y- w2 z' H可以下载玩一玩
/ I" \5 G$ q2 N! {+ ?2 Phttp://pan.baidu.com/s/1bnE0AwZ |
|