EMU618社区

 找回密码
 立即注册
搜索
查看: 889|回复: 3

[原创HACK教程] FC自动演示修改教程

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑
1 J8 P+ q. k! W  l& H& R( {( ^5 T8 A% l7 c  ~4 e
FC自动演示修改教程
2 M- i% F, a1 U7 U/ v作者:火焰烈旋风
1 {, g' m( V* h9 C1 G* ~工具:FCEUX中文版(www.9553.cn搜FCEU即可)
4 q9 k$ H$ ]7 [) _* ]5 P/ J1.找按键地址:3 {" T- b1 O: R
    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
! j1 W( R! ?1 Y0 {# T6 x+ e2.找演示时按键的数据来源:% T9 A; f0 o( u: ^
    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
; ^2 z5 }) P9 o' B7 n, r3 m. }. b8 |07:C38F:94 F1     STY $F1,X @ $00F1 = #$011 Q6 o& j' c, F2 g+ v; ?
07:C391:94 F9     STY $F9,X @ $00F9 = #$002 b9 l; h( }* a, p# \
07:C393:CA        DEX
$ d: ~0 d2 c7 i! B: G; m07:C394:10 F0     BPL $C386/ \5 P: d4 T2 y' X1 ?: z2 L, a) C
07:C396:60        RTS
; w# |' y( F$ L- C3 m5 w我们点击"运行"左边的上拉按钮上拉,看到如下指令:
* s  [1 W6 v/ o4 N07:C378:A5 1D     LDA $001D = #$07
/ G. q8 X/ P) }9 L) J07:C37A:29 04     AND #$04
; w, n& ]0 s( @% \, t; y4 W3 Q4 M/ ~+ k07:C37C:D0 06     BNE $C384- u  R+ `! C  K$ @" U
07:C37E:A5 04     LDA $0004 = #$00& I/ A8 @1 n2 O
07:C380:05 05     ORA $0005 = #$00
8 ?; w  j6 \: Z! [$ {07:C382:85 04     STA $0004 = #$002 V  Q4 z8 Y: G! y4 @
07:C384:A2 01     LDX #$01- Z( a& |- L, Q7 T1 D4 o
07:C386:B5 04     LDA $04,X @ $0004 = #$00; E6 n# Q1 a% l
07:C388:A8        TAY' C8 {6 q  h( L3 v9 ]0 e
07:C389:55 F9     EOR $F9,X @ $00F9 = #$00
/ H; t7 ]7 h: R7 K7 w8 C07:C38B:35 04     AND $04,X @ $0004 = #$006 q, p4 g* D7 J: E8 W# G
07:C38D:95 F5     STA $F5,X @ $00F5 = #$003 K) f! @) N: ^' p2 c' T# R3 m
07:C38F:94 F1     STY $F1,X @ $00F1 = #$011 H# ]3 V' L" l" u, A. |
07:C391:94 F9     STY $F9,X @ $00F9 = #$00# {) l6 W/ c1 h% m' R4 B0 }( @
07:C393:CA        DEX
2 C9 ~* L. `1 {8 m% |07:C394:10 F0     BPL $C386+ v7 M% ~9 O# |& o- h6 u
07:C396:60        RTS& S7 ^" C+ N& G( D% Q, O* n9 j
由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:$ }* V5 n" C2 l5 |9 n6 K) h
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
& D3 Y5 h- L* \$ U$ |7 a4 Q05:B3A5:A5 2E     LDA $002E = #$C8
: a$ n; A( H7 Q+ h8 B05:B3A7:C9 50     CMP #$50
3 ?/ S5 x; \5 v- c' \05:B3A9:90 20     BCC $B3CB
; t, X2 a; G2 m4 J05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
8 u, b8 ^) F4 W% |7 C05:B3AD:29 0F     AND #$0F
. ]6 w$ q* J( N$ n( y9 l7 x) `6 x05:B3AF:C9 01     CMP #$018 k! V0 B5 M$ H4 \% g: I
05:B3B1:F0 04     BEQ $B3B7
  x9 d6 `3 G% s- _05:B3B3:C9 04     CMP #$04
, I. d" o3 @! z, ^; H- x- t.........2 g" I, B, O1 P. j7 m& G$ A4 u
我们点击"运行"左边的上拉按钮上拉,看到如下指令:
0 t" D8 k; w8 c8 F2 Y6 U05:B39F:B5 5C     LDA $5C,X @ $005C = #$013 D) {) t, v" c
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01/ V/ w  G' y- W
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00/ A) h# O3 N; k& {  v# m' S  X& d
05:B3A5:A5 2E     LDA $002E = #$C8" N3 _& x: p/ o/ A+ a6 ?
05:B3A7:C9 50     CMP #$50
; ~; |$ n/ v  ?  M3 C$ G05:B3A9:90 20     BCC $B3CB
! a6 w6 Q/ {' C0 q/ V+ z. c! T05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$003 K4 V/ Q' w, b! K; D
05:B3AD:29 0F     AND #$0F
7 Y$ N+ s6 X0 y" \9 ~/ g看到
; x) w+ ^* T# b05:B39F:B5 5C     LDA $5C,X @ $005C = #$01) s( a* a. b3 u
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01! Z  o' Q. Y2 i! r: Z
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$004 e7 x: p- u+ o8 ^5 B) H
没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.
- x0 x  F4 m  w* l" Y    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:9 _' b2 v  y' I- L! `! {' v
05:B392:95 5C     STA $5C,X @ $005C = #$01
' I" b3 h9 r6 G$ u) B1 {% \1 |05:B394:C8        INY* v+ _1 E. R# M$ H
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09, ~8 ]" p  Z5 v: [9 u2 F
05:B397:95 5A     STA $5A,X @ $005A = #$00
$ e3 k2 s9 l4 f2 H05:B399:C8        INY1 D9 m" l6 X  i6 O, ?, @$ [
05:B39A:98        TYA& s! f; I. P6 }: o1 {3 @
然后我们再上拉,得到如下指令:
# }" D# j* T; D: ^6 m# S0 C05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09
- i# }7 M; U# j$ \4 c05:B38E:C9 FF     CMP #$FF
: H2 Y( a" g5 ]0 S05:B390:F0 3D     BEQ $B3CF
: D/ [  F. S0 l* i2 d& e05:B392:95 5C     STA $5C,X @ $005C = #$01
+ k* F- H! W# V7 G7 G! L# J05:B394:C8        INY
, i; G* C& {: P' Q$ R05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
; ?1 j% M0 b- v8 G7 v+ w05:B397:95 5A     STA $5A,X @ $005A = #$00' O, [. `8 H9 x* |- V5 [
05:B399:C8        INY' W1 R3 Y1 b0 E5 l
05:B39A:98        TYA) l4 S0 G) t% g0 S
看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09' M7 D/ s! r7 T8 F
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近., R' m1 t; V7 s, G! z& l: _+ G
3.修改演示:; Z' J; l1 s, b6 P* e% V" N
    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
% F/ f. d' t" B* V& n( {! a    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
% x* c4 y  `) Y! ?! {, W打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:1 p0 r! P/ g0 t  K% B* j, b2 k
05:B392:95 5C     STA $5C,X @ $005C = #$00/ D4 a# G4 v3 h$ L
05:B394:C8        INY6 T5 U* E) Y7 ^1 C6 `8 g
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00" c" Z  A6 \( e
05:B397:95 5A     STA $5A,X @ $005A = #$00. T! Q& M) t1 j2 `
05:B399:C8        INY4 u6 O! \  q6 G8 a4 b% L. N
05:B39A:98        TYA
7 ?$ @- }+ m. Y  S# h我们上拉看到了:' h* `1 Y, m- l% F# d4 Y/ P
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
0 P" c$ A1 f0 K  g% i' W05:B38E:C9 FF     CMP #$FF5 m6 f, p7 r) m$ x, l
05:B390:F0 3D     BEQ $B3CF# Y) P, g$ `9 O1 Z
05:B392:95 5C     STA $5C,X @ $005C = #$00
/ _* M- N+ b1 y9 m  T05:B394:C8        INY
  w2 }: u$ |0 C05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
. t# q1 V8 A+ V) r5 a: b: H* @2 U05:B397:95 5A     STA $5A,X @ $005A = #$00) H2 _' Y% K; ^7 K
05:B399:C8        INY4 D* ?" T4 l7 B
05:B39A:98        TYA% A3 {% Q  W9 s# Z5 L  D
看到% Q. s6 Y6 j; D& S' b1 C. h
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
& p1 u2 V& F% b5 G- g没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.
. H- V5 K7 j3 C% L( F  v( o说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:: G% _6 N7 E1 ?# D. h/ R
05:B371:B5 5A     LDA $5A,X @ $005A = #$7F
4 H$ Z' H, n9 z- p$ L1 @$ s8 l9 s05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令), N$ b, ~! I) d. O
05:B375:A5 30     LDA $0030 = #$003 A5 P8 x' p8 X  A9 D/ B  O
05:B377:0A        ASL
* b! v: S, `" Q05:B378:0A        ASL& l$ ]- [( w9 s
05:B379:85 08     STA $0008 = #$296 Q3 S3 E2 e' O) L
05:B37B:8A        TXA( ^% }3 z- _  Q2 y
05:B37C:0A        ASL: h! v2 v" Z& c7 y. G) v' ^$ i
05:B37D:65 08     ADC $0008 = #$29& y5 v. y6 k) n6 m" @- t+ N
05:B37F:A8        TAY* ~: P. d; M9 I
05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4/ _; Z4 E4 B4 k, o8 y* m
05:B383:85 08     STA $0008 = #$29" B  W9 \- m( H3 b& i5 S7 {0 l
05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC
4 Z5 m/ \" J/ l) e5 v05:B388:85 09     STA $0009 = #$B2
) u9 i' K0 D. ?5 L  @% p7 g05:B38A:B4 5E     LDY $5E,X @ $005E = #$025 }: t2 W" ?# G! A: `3 {
05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10
4 |( `  @; Z% a: r05:B38E:C9 FF     CMP #$FF
! i* N) U  ^1 x! u4 x05:B390:F0 3D     BEQ $B3CF
+ Q% }3 p, b0 |: ]  I05:B392:95 5C     STA $5C,X @ $005C = #$00) |+ V! m% B% S
05:B394:C8        INY
4 [5 i9 P. O) J. I& K  q6 Z05:B395:B1 08     LDA ($08),Y @ $B22E = #$10
; P! ^! x, t& e3 ?2 Q& h- K2 r9 y05:B397:95 5A     STA $5A,X @ $005A = #$7F5 c& [0 J( J5 g% B0 |9 D( b
05:B399:C8        INY
7 {0 p% d/ l) v( z' n  Z05:B39A:98        TYA
, M5 i: }% H2 s7 V: c05:B39B:95 5E     STA $5E,X @ $005E = #$02
% V$ W8 O1 s: Z8 k$ K) j05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)5 b6 q4 Y5 l/ s# _9 K, L: Y# c
05:B39F:B5 5C     LDA $5C,X @ $005C = #$00
: ?9 a& Z$ F' a; N) c05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00' r$ E; V8 x% a& ]$ K$ }
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00; |( B' T2 ~+ X4 s/ g# n4 e4 Q5 h
9 E' \) N) i0 S
由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
0 V5 O  k9 R. ]7 Y% x/ d+ n可以下载玩一玩5 w$ x! E6 O7 \1 @, l+ \
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1311 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。% @, Y: g2 Z+ b$ Z- w8 S+ i4 D- ?: z
首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。. z- P$ {* w/ E, ^
后来尝试其它修改,但是偶尔会造成花版或者死机。0 A2 w  R& S5 ~* Y  i: P4 M
深入研究,发现要以演示模式通关,需要做的事情还很多。
: L0 y  ?, I: c  k- m! S+ M因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: wyw 被钱袋砸中进医院,看病花了 3 个 柠檬. 幸运榜 / 衰神榜

签到天数: 112 天

[LV.6]常住居民II

发表于 2015-10-16 08:50:07 | 显示全部楼层
厉害啊,这个真厉害

签到天数: 9 天

[LV.3]偶尔看看II

发表于 2015-12-21 10:43:36 | 显示全部楼层
啊哦,你来晚了,分享的文件已经被删除了,下次要早点哟。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|国治模拟精品屋 ( 沪ICP备15012945号-1 )

GMT+8, 2026-1-13 15:01 , Processed in 1.075196 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表