EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑
- G2 P; r1 `) A  j+ I( f0 V- m8 ~# W( r+ Y  k
FC自动演示修改教程+ P; S6 F$ G! J( j7 E
作者:火焰烈旋风
. a5 G4 X' P6 C1 g5 k1 ^- @/ K工具:FCEUX中文版(www.9553.cn搜FCEU即可)
* m' M/ z* L/ {$ r1.找按键地址:6 l/ m, i7 G# d( z  I
    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.: _  p) ]$ Y. R. E
2.找演示时按键的数据来源:
# N/ o- n- R- S1 v9 ^' U9 L+ i    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:6 l9 T8 z6 X! W! C
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01/ f0 @1 m! h; a3 h( u. F) f- z1 i
07:C391:94 F9     STY $F9,X @ $00F9 = #$00
& [1 ?. d1 g1 r; i/ X5 P07:C393:CA        DEX% z/ G, C9 p3 q; Z( `. O5 J4 K
07:C394:10 F0     BPL $C386
2 }) h3 ~+ O4 l: n* i7 O$ l07:C396:60        RTS
% A$ a" q/ _* P% X! @. t$ N, E我们点击"运行"左边的上拉按钮上拉,看到如下指令:% F* T& P% Y* ?: o' u5 z9 l6 ]
07:C378:A5 1D     LDA $001D = #$07
* z  r$ @) ?; X4 z9 P  o07:C37A:29 04     AND #$042 U7 \9 I# e7 m5 U0 `6 Q
07:C37C:D0 06     BNE $C3849 ?$ G% T  m" }1 m6 C
07:C37E:A5 04     LDA $0004 = #$00
# j2 q, t2 F; w* E% L. }1 C6 b1 [% U: {07:C380:05 05     ORA $0005 = #$00+ ?9 O. d4 G& ]+ G* ^  g* E$ x
07:C382:85 04     STA $0004 = #$00) b# g5 |0 O8 l" r; ~6 I: H
07:C384:A2 01     LDX #$01
( @; f7 Z( |7 @& v* U07:C386:B5 04     LDA $04,X @ $0004 = #$006 j* g  g& K6 |4 N6 y$ b
07:C388:A8        TAY
  y* A/ e; \" Q  B; m/ |07:C389:55 F9     EOR $F9,X @ $00F9 = #$00' {' B$ }# l# |2 Y. G
07:C38B:35 04     AND $04,X @ $0004 = #$00
* h( T8 y1 o( B, c07:C38D:95 F5     STA $F5,X @ $00F5 = #$00
1 k0 H" @5 a8 j( u) C8 [9 o07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
4 h8 f9 `! |$ k. l7 q$ E3 g07:C391:94 F9     STY $F9,X @ $00F9 = #$00
2 G0 ^( F; L" a% e7 F07:C393:CA        DEX
6 E9 r2 H# }+ E5 B07:C394:10 F0     BPL $C386
5 k0 O" S" F8 m, @7 ^07:C396:60        RTS
5 B4 e9 n& ?4 o$ L7 P由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:
7 H9 r0 O; x" l/ V05:B3A3:95 F1     STA $F1,X @ $00F1 = #$006 e2 B# }% N: k+ Z
05:B3A5:A5 2E     LDA $002E = #$C8
; C! O/ E% N7 {% {' i; R05:B3A7:C9 50     CMP #$50) {4 a- t* G3 o5 J
05:B3A9:90 20     BCC $B3CB1 ~1 O+ G6 ?! s4 g# D; P+ Q
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
) j+ T: g6 N1 {  }9 l$ y: d05:B3AD:29 0F     AND #$0F$ }; e/ {/ Y3 [" O$ x2 M9 ~- h& s
05:B3AF:C9 01     CMP #$012 |7 A: Y* f  R0 n/ G; j) l( D% F- D
05:B3B1:F0 04     BEQ $B3B7
8 a' Z7 A$ ?! D; R( l  S05:B3B3:C9 04     CMP #$04
$ V4 M* }4 p% A0 I9 N# k.........
. ~0 c3 E6 g1 b' z' V9 Q9 ^我们点击"运行"左边的上拉按钮上拉,看到如下指令:5 H0 G6 @. f/ ]# M! J, H
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
, v' c: V1 G- t05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
% C) P& ?  J1 o' X6 x05:B3A3:95 F1     STA $F1,X @ $00F1 = #$001 I9 g5 A6 K; x. l! {
05:B3A5:A5 2E     LDA $002E = #$C8# Y4 ?3 w) O, n* n: T/ F& P
05:B3A7:C9 50     CMP #$50: R( o7 `- H, p* F" K4 e% j
05:B3A9:90 20     BCC $B3CB, |* `) k& U: O
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
$ E+ _" H7 P! g$ {# s) V% J$ e( n: f05:B3AD:29 0F     AND #$0F
. L: `: w; m2 |看到
5 {, G5 d* K! l  ^5 _9 w05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
( _9 @/ a4 r/ Z8 p& C0 Z2 l, J05:B3A1:95 F5     STA $F5,X @ $00F5 = #$013 X7 h4 S& |; i0 x  l6 s0 e
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00& e; Q, l& l& y" t# U' A
没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.
" b5 Z3 U) r& t% s) f- Y) J  Q    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:2 X  t5 R( N- T* {$ [4 ?* S
05:B392:95 5C     STA $5C,X @ $005C = #$01
1 n, K7 {  ^3 A05:B394:C8        INY; z3 @4 Y8 ]* n4 A+ ~* |. g
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09/ k: |8 X4 _1 z! x1 |4 S
05:B397:95 5A     STA $5A,X @ $005A = #$00
+ r# x+ x/ w7 z  c05:B399:C8        INY+ P; w- I/ |' A5 T. y1 X& ~3 X
05:B39A:98        TYA
5 C' {+ Y( P6 _* r2 \/ X5 s" c然后我们再上拉,得到如下指令:
; k5 e- q- s. _4 }6 K' h05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09
' J- u8 }  c0 E' `3 [; G* Q' |" ]05:B38E:C9 FF     CMP #$FF; H; h$ }2 w% r* {' D2 n
05:B390:F0 3D     BEQ $B3CF1 L+ R( Z2 u0 a& I* T& X- V- J4 ~4 H
05:B392:95 5C     STA $5C,X @ $005C = #$01
) U" g' G. |4 G( a: y05:B394:C8        INY' r& R4 V* J0 C
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
4 [8 h+ ]. Z0 b; O9 `05:B397:95 5A     STA $5A,X @ $005A = #$00
' D! v0 s+ `8 R* l0 H6 W05:B399:C8        INY
" K  j, l$ Y2 G7 B, I05:B39A:98        TYA
) Z4 J+ }  }1 r2 A" E看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09
9 V4 o& J" @0 c4 R% O9 ^1 e没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.1 W3 ]! ~! @3 w) S
3.修改演示:5 O" x( |7 F+ G* G0 A
    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
3 q4 G) H9 m! c* ^    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
) l! @% K3 y5 \& ?! V8 n5 v& S打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:
$ p/ g1 H5 e5 t2 L- ?05:B392:95 5C     STA $5C,X @ $005C = #$00
0 U) \; J7 r1 x3 P- k05:B394:C8        INY
" @3 l1 l6 U9 B* n, y; r/ j05:B395:B1 08     LDA ($08),Y @ $B3DE = #$006 e! x" K8 [8 k' ~6 l$ _
05:B397:95 5A     STA $5A,X @ $005A = #$00
2 N) Z+ O/ y+ |% u, d: E05:B399:C8        INY# n" K. X5 B) Z
05:B39A:98        TYA# }5 W( g' V0 A% F& D+ Z- U9 f
我们上拉看到了:
) f# [8 M  _4 B' G05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
: \$ ^( F6 y/ P( [' m( R, i: l1 Z4 }05:B38E:C9 FF     CMP #$FF5 e7 ]% T0 X9 u( Y
05:B390:F0 3D     BEQ $B3CF2 J; ^& N3 X. m/ i2 I2 I% k7 Q
05:B392:95 5C     STA $5C,X @ $005C = #$00& Z, a6 Z* C* [- @) C
05:B394:C8        INY6 F/ k" y6 q0 i5 x: o
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
4 M, L( o3 _4 P" X, D& d05:B397:95 5A     STA $5A,X @ $005A = #$007 m+ g2 C4 p& `2 d9 M, L' t' c
05:B399:C8        INY
" [! u% W) T! ?  f& @4 @  ^05:B39A:98        TYA
/ e$ U' k( c9 w看到
+ e/ _4 |! {, W1 j4 q05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00/ r' r) d" B& a+ i
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.
7 a  F0 N: e+ u% [8 O: 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(时间).......以此类推,判断根据:, M/ N1 B# m- n* {
05:B371:B5 5A     LDA $5A,X @ $005A = #$7F; L1 A5 n# a1 p# r; V: v1 U
05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
# D$ R6 ]/ x0 i! @) p. d5 q' q2 F  O; ?05:B375:A5 30     LDA $0030 = #$00- M% E+ B2 _: n( Q& e" J& r& z
05:B377:0A        ASL
6 l$ N: x( e& i" }05:B378:0A        ASL
* S0 K# X6 W6 J) o" k5 q05:B379:85 08     STA $0008 = #$29* F# S* D: D- |
05:B37B:8A        TXA
0 s0 p6 }+ E3 @4 M8 V! n$ W* C& H05:B37C:0A        ASL& C+ V% ~' |- x) ~9 y9 N. H
05:B37D:65 08     ADC $0008 = #$29
. F6 P! y' v( D05:B37F:A8        TAY( N+ Q4 v) ?2 N( F
05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4
' a+ n7 A% g& v/ y0 E# z05:B383:85 08     STA $0008 = #$294 U8 l- `) O  d6 A& }% P
05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC2 _* S$ H: s8 D9 X2 P8 w3 H
05:B388:85 09     STA $0009 = #$B2
; l6 J4 e# `( t8 X4 z05:B38A:B4 5E     LDY $5E,X @ $005E = #$023 w6 y6 [9 Z) f9 o; v4 `2 G
05:B38C:B1 08     LDA ($08),Y @ $B22E = #$101 a* v% j$ \4 N- ^6 _2 W, Q! C  W% Z
05:B38E:C9 FF     CMP #$FF$ n% T; C3 z" e3 s$ ?% `4 T5 H; I
05:B390:F0 3D     BEQ $B3CF
: j; p0 c; O5 F$ C* D! M05:B392:95 5C     STA $5C,X @ $005C = #$009 N' j1 z. m) N, U9 T
05:B394:C8        INY5 K2 y) V  C% z2 ?9 Q. s
05:B395:B1 08     LDA ($08),Y @ $B22E = #$10
" v6 p3 U1 L9 u& |, A0 B0 I" a05:B397:95 5A     STA $5A,X @ $005A = #$7F) R7 t  Z* u$ j- s
05:B399:C8        INY
$ h3 F, S% v" C: e% ^$ P05:B39A:98        TYA
- S$ z* f! Z: w, ]7 N5 u% e$ I* x05:B39B:95 5E     STA $5E,X @ $005E = #$02% L; e; A; n) b' b' f7 k* T
05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)
) a4 |; P; j/ y0 k9 Y% @/ n05:B39F:B5 5C     LDA $5C,X @ $005C = #$00
' Y+ R0 L3 s- H05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00# X# j* [; X% s) @8 C2 y  V& s
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
( @" ?& k( F) L1 v0 A2 J. V: q
5 R. x3 e& O- C# A3 A由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
; n6 t0 R4 A) J5 j, P3 E9 v* C可以下载玩一玩  z3 [7 _& r* R6 b2 K  t( g7 H
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1310 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。
) G1 f2 D9 A6 o首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。
& R! n6 B& F; a后来尝试其它修改,但是偶尔会造成花版或者死机。
6 j% m1 I9 P  E0 M8 w深入研究,发现要以演示模式通关,需要做的事情还很多。
! s# A. }4 e; e, P6 o' _0 S因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: 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, 2025-12-27 11:32 , Processed in 1.088867 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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