设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑 / G7 P+ ]* x+ c

0 f8 R. D( C) hFC自动演示修改教程
9 @. j2 O2 r  A6 E- R$ T作者:火焰烈旋风
% x) S6 a4 z7 a! V工具:FCEUX中文版(www.9553.cn搜FCEU即可)
2 S7 {/ ?: m) Q. @% Q- `3 U( T1.找按键地址:
5 ^$ w! y  A& [! k8 `    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
  o2 W5 k5 J/ a) T3 {% Y2.找演示时按键的数据来源:
1 ~# m$ z& [: y2 O" Q- d    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
, f9 @9 f$ c! v7 A07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
* I( o. j. g! e07:C391:94 F9     STY $F9,X @ $00F9 = #$00
% W+ }) W! O* _* ^. O07:C393:CA        DEX
' @* z% Y$ i: s* d1 H2 h07:C394:10 F0     BPL $C386: r, o4 d$ @+ @7 M6 ^" J
07:C396:60        RTS
9 I( Z. b( S. \3 @2 ?我们点击"运行"左边的上拉按钮上拉,看到如下指令:
) g) E. H4 @: p# {/ s5 P+ ?" `07:C378:A5 1D     LDA $001D = #$07
) ]/ p( Q9 x5 O7 b07:C37A:29 04     AND #$04
2 W- v, f, h, Y. R5 `07:C37C:D0 06     BNE $C384
) F. ]/ S# W8 n9 n5 r2 i07:C37E:A5 04     LDA $0004 = #$000 I" c# t7 ]: C8 }) B0 K  |8 R
07:C380:05 05     ORA $0005 = #$00
0 o5 U3 d$ c; s$ o! V07:C382:85 04     STA $0004 = #$00% ^* O- o4 G9 b; G
07:C384:A2 01     LDX #$01) t  Y* q, U( u2 I
07:C386:B5 04     LDA $04,X @ $0004 = #$00$ K$ C: R4 d, w3 L% ?
07:C388:A8        TAY
$ n0 R' A' _  W0 |# Q5 G07:C389:55 F9     EOR $F9,X @ $00F9 = #$001 C( @9 D+ W/ u! B$ E. R, U
07:C38B:35 04     AND $04,X @ $0004 = #$001 H3 q4 s  v; B* D
07:C38D:95 F5     STA $F5,X @ $00F5 = #$00
* a( b, W; e5 J+ ]" I- O, v0 O! g3 c07:C38F:94 F1     STY $F1,X @ $00F1 = #$01% l8 R/ E' I$ a) w
07:C391:94 F9     STY $F9,X @ $00F9 = #$009 V. W) I2 Y2 d* e
07:C393:CA        DEX
% Y: [5 q  {; Z0 Z07:C394:10 F0     BPL $C3867 A" e5 L; c0 F' L4 `$ ]& c
07:C396:60        RTS
5 c% s0 K% F' m9 b7 p由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:3 n0 s8 I3 N/ j. V' \0 J8 c, H
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00# }5 B0 j' L$ D) w3 ]6 ?  J
05:B3A5:A5 2E     LDA $002E = #$C8
4 n' @: U1 F$ s( A0 C; @/ C1 B05:B3A7:C9 50     CMP #$50% B7 J4 [( m8 q$ e( T4 x. s- U
05:B3A9:90 20     BCC $B3CB& i+ z8 G. E' a
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
$ Q# D4 e: i- k) D# [8 Q9 Q/ U05:B3AD:29 0F     AND #$0F
. o) j+ V! N6 [0 u/ Q05:B3AF:C9 01     CMP #$01& t- G8 k+ |* [. \
05:B3B1:F0 04     BEQ $B3B7
! |( u2 ~) ]$ c. R05:B3B3:C9 04     CMP #$04/ d" y5 N% a9 `- k& e
.........! Q6 z# @* G! X9 _" ^
我们点击"运行"左边的上拉按钮上拉,看到如下指令:
0 ~0 |6 u* J* c: b/ h9 k/ I05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
9 W/ f* H8 R) h) e+ g05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01! Q& w! W( _; O$ H
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
0 e# _5 ^  F: \/ a05:B3A5:A5 2E     LDA $002E = #$C8
( }, o  X6 a. s- j' j: |05:B3A7:C9 50     CMP #$50
, [5 W, k; r$ h# k05:B3A9:90 20     BCC $B3CB
* W* X/ W1 `& ^5 }3 N05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
; t+ z' i" N! j  ^05:B3AD:29 0F     AND #$0F! n& x5 J0 B5 I; q( ^7 d/ B
看到' z7 ?  A6 F% }$ A' @
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01* x# ]7 l6 o" E: F+ [4 ]
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01$ H( t% h0 {1 [$ g2 m& Y
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00' f8 _' A% j& H, Y! b5 c
没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.3 u: c+ ~' b- C  N9 O- b
    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:
# A% l: ?  B4 c- U* i05:B392:95 5C     STA $5C,X @ $005C = #$01
$ ~" k3 _% E% ^. _' J; Y* z05:B394:C8        INY2 t4 r( h; B. ?" V& V6 [3 H
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
& X. S  r5 p% m& R05:B397:95 5A     STA $5A,X @ $005A = #$00
0 j. {4 V( t) r( U4 Q. E05:B399:C8        INY7 F( p* _$ m$ E+ n' n6 f
05:B39A:98        TYA
2 i" I, g2 @( R然后我们再上拉,得到如下指令:
! T+ o8 P5 U  G! l) e05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09; x1 N3 {7 {# |& f3 B
05:B38E:C9 FF     CMP #$FF
; M; R' ]: l9 z' P05:B390:F0 3D     BEQ $B3CF
. I/ u3 q7 t- s: @05:B392:95 5C     STA $5C,X @ $005C = #$01
. O6 S0 J9 I; ~05:B394:C8        INY
! D" ]! P5 F2 E2 z# ]05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$097 s! w% U* G- e
05:B397:95 5A     STA $5A,X @ $005A = #$009 _8 y3 P: Y2 L$ f1 t$ _
05:B399:C8        INY
6 x" e# h% q7 `) X05:B39A:98        TYA! T7 O, {; N3 ^" r  [" n; p
看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$092 ]  Y/ o( n4 {! e/ h2 [
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.' b! ~, Y. ~% f# V; @
3.修改演示:
1 h- V) n- y" _- E. O1 S    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.% y9 P( |  Q: W" Z2 b/ d: c
    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
) ]" z" H8 |1 e, o- o9 s打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:& Y$ S* Q6 `; u6 x
05:B392:95 5C     STA $5C,X @ $005C = #$00' S' n# h3 `6 o& _, Q
05:B394:C8        INY/ f% @+ g: E# G  W
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00! k3 P  F0 ^: @0 _9 ?  k3 L( M
05:B397:95 5A     STA $5A,X @ $005A = #$00" X9 c2 ?* j$ b8 i: t" W
05:B399:C8        INY# J+ ]" U1 E, n; o% P
05:B39A:98        TYA; @3 u% z2 n1 |
我们上拉看到了:
# r3 f4 D$ W# |+ p8 ]1 d+ [; f05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00  ?( M0 k( z$ X. H, [
05:B38E:C9 FF     CMP #$FF
  e6 ]8 \+ n2 i1 a* ^& J6 l05:B390:F0 3D     BEQ $B3CF
+ [: q) [+ O$ V; _: s9 F05:B392:95 5C     STA $5C,X @ $005C = #$00
' d* r+ G# Q  n4 {; ~) g/ Z05:B394:C8        INY
9 T$ k% Z: w$ t* A  a9 P05:B395:B1 08     LDA ($08),Y @ $B3DE = #$000 ?- f0 Q: r2 b, \
05:B397:95 5A     STA $5A,X @ $005A = #$00/ W# t# v% B1 R( R" N
05:B399:C8        INY. i( y) \6 u0 V3 B5 X
05:B39A:98        TYA- _; w! {' h1 }% E* }
看到
! Q7 b/ ]" \; R05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$008 k* P8 ~% B' p' o6 R8 q6 I
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.
# y! h/ E7 I# I- R说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:
0 D" K( B: C9 ?3 c4 Q) b05:B371:B5 5A     LDA $5A,X @ $005A = #$7F0 h+ V2 t7 X7 z9 }' q
05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令): a( T0 U9 j! s4 y
05:B375:A5 30     LDA $0030 = #$00
1 [9 y% Q5 W2 a05:B377:0A        ASL
. t- @/ X2 c) u" {- @' V6 @2 \05:B378:0A        ASL
8 R% I/ m' K+ ]% M* O05:B379:85 08     STA $0008 = #$29! G* S% M' Y& s# B
05:B37B:8A        TXA
: F  r0 `7 `* j5 V05:B37C:0A        ASL( m# @2 R: r5 `# x# g
05:B37D:65 08     ADC $0008 = #$29
1 w, c( b$ Z" U1 Y, L6 R7 q05:B37F:A8        TAY2 R6 g$ ^3 z* R- y. Y( v4 J' C
05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4
! o+ y! H, B9 {1 A' e; e05:B383:85 08     STA $0008 = #$295 V+ I/ S) [4 U1 y& L" X
05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC
1 @9 A6 J, i7 g# F05:B388:85 09     STA $0009 = #$B2
! f% g6 W3 V' D$ e/ l# ?" l05:B38A:B4 5E     LDY $5E,X @ $005E = #$025 o% e* }% f; A% b" G+ @: E
05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10; I: y! y& W& Z8 `: K1 ~
05:B38E:C9 FF     CMP #$FF& @2 q9 C6 w4 V8 M2 C# f- P1 J! c
05:B390:F0 3D     BEQ $B3CF4 x! V# U! u' s: @) _
05:B392:95 5C     STA $5C,X @ $005C = #$00
0 S) |" u) l$ v05:B394:C8        INY# b4 M  ~& ^" F# ^, v
05:B395:B1 08     LDA ($08),Y @ $B22E = #$10
: Q2 o% J9 x/ u4 N05:B397:95 5A     STA $5A,X @ $005A = #$7F4 H4 R$ x% @" {& |/ R8 ~
05:B399:C8        INY" u: D: @% D, ]9 f, s# j0 U0 L
05:B39A:98        TYA
; S% L6 I8 z6 m; ^8 O, q2 Y. z05:B39B:95 5E     STA $5E,X @ $005E = #$02
* S  O& c$ Z  k% O  R( E05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)
2 U' ^, n0 P% g* T. w8 [; k& H+ l05:B39F:B5 5C     LDA $5C,X @ $005C = #$00
+ y7 v7 a6 [8 A8 e0 V7 J& f05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00
/ x2 ~/ i* X5 ]- [, K" }05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00  w, \2 Y) i  ^" p+ @, d

2 a/ P) `" X1 z由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了6 @- P- f% ~, Z' M$ B) j9 c
可以下载玩一玩/ r1 V4 t8 D3 }
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1291 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。
/ E5 E' n) {! T  z首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。/ M1 M; i+ _: ?, G1 g
后来尝试其它修改,但是偶尔会造成花版或者死机。
' y. Q9 N4 }6 u; n9 ?深入研究,发现要以演示模式通关,需要做的事情还很多。
$ N8 I, M! Z& O0 j- h& V  @8 t因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: 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-7-16 16:54

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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