EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑
5 L+ _. y/ ~( ~5 L* v' Z, |" j: h* P: j
FC自动演示修改教程
2 c: W' c# R& r9 c& l. S作者:火焰烈旋风! n* T, ?$ r: p- K
工具:FCEUX中文版(www.9553.cn搜FCEU即可)
4 ^7 @# I5 M6 x& y& t1.找按键地址:. k6 h  J! @& W; M' `8 Q
    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.1 t7 L. @. v, H: l, }& X6 U
2.找演示时按键的数据来源:2 G7 z$ O2 Z9 r( X7 _
    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
% N  y4 `% {' T# }1 S. {" s5 {07:C38F:94 F1     STY $F1,X @ $00F1 = #$01/ Z1 K4 p9 I7 ?' i# M6 x
07:C391:94 F9     STY $F9,X @ $00F9 = #$00
5 r( k; C& N5 r2 j" y- y07:C393:CA        DEX
! ^) {" d" }( l# q07:C394:10 F0     BPL $C386
# i, [6 z  A9 i- Y8 B3 a. ?3 k  [: c% r07:C396:60        RTS* V# U( j9 ~& L( P# b
我们点击"运行"左边的上拉按钮上拉,看到如下指令:
, T3 x1 x9 d" p9 X7 L07:C378:A5 1D     LDA $001D = #$07& P9 d. G) Z1 e
07:C37A:29 04     AND #$049 f( m, X) s, T% b# ?8 h2 c
07:C37C:D0 06     BNE $C384
6 e7 M: P4 I& r07:C37E:A5 04     LDA $0004 = #$00
1 V0 p" \. O0 E5 l4 `07:C380:05 05     ORA $0005 = #$00
0 }% W" L0 J% @5 k  T2 J6 b9 m07:C382:85 04     STA $0004 = #$00  K6 z2 v1 A5 c1 q2 `) n5 B2 d9 Y
07:C384:A2 01     LDX #$01' W" E& y; V$ I6 T
07:C386:B5 04     LDA $04,X @ $0004 = #$00
  Q' T' E3 ]9 Q( T07:C388:A8        TAY' V2 F5 C7 w7 T
07:C389:55 F9     EOR $F9,X @ $00F9 = #$00
: l' z# G( Z; W6 r$ e" S07:C38B:35 04     AND $04,X @ $0004 = #$00
$ U2 z4 O5 q3 h8 z' v" j% }. r07:C38D:95 F5     STA $F5,X @ $00F5 = #$00+ t0 a+ t1 V# o( o$ r3 b
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
: r" Q: U( f& w+ `$ q& Q07:C391:94 F9     STY $F9,X @ $00F9 = #$00* v: f8 n0 V5 G' r- X3 k) ]
07:C393:CA        DEX# ^& y8 ^7 [- K0 [
07:C394:10 F0     BPL $C386; Z7 s6 j* h, [* H, ^. E' ]3 X
07:C396:60        RTS
9 ?: p! F- ~5 T, \% e' K$ }由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:3 R8 t0 i4 E6 n& z, P4 I7 i
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
- }! ~2 E! ]/ T5 z3 I% ]6 \05:B3A5:A5 2E     LDA $002E = #$C8
% {3 T5 ~! j0 p- K05:B3A7:C9 50     CMP #$509 N7 R# }& e" P- f4 T! S' R5 w8 g
05:B3A9:90 20     BCC $B3CB7 z: W. l9 W8 M, D7 g
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
$ |8 T$ T& w4 O) E  z' O2 U$ f05:B3AD:29 0F     AND #$0F3 n3 H! s3 L0 H1 @6 o3 t4 C
05:B3AF:C9 01     CMP #$01, \  U: z* `5 W5 n
05:B3B1:F0 04     BEQ $B3B7
7 k# n8 v2 S, T' t05:B3B3:C9 04     CMP #$04
1 t1 Z" `1 ^* Y7 z3 E.........& ?+ h/ S& `  f
我们点击"运行"左边的上拉按钮上拉,看到如下指令:
! D. C7 [5 l4 [7 ]8 ^& S- m05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
& j' V6 I; ]6 l+ U9 T/ K05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01  r0 v1 z) G4 U1 p+ \
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
3 e+ x% O, o; u1 A2 p  V$ H. X05:B3A5:A5 2E     LDA $002E = #$C82 }- |. o) C* k
05:B3A7:C9 50     CMP #$505 B5 R  a$ S" }$ A( F( Z. l, m
05:B3A9:90 20     BCC $B3CB. m* r* a0 m2 e% a' l$ Z- a
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
0 i& z& B6 k: c; N! m6 a3 C" G05:B3AD:29 0F     AND #$0F
4 ~  A- p$ O+ s9 i看到6 N; i# ~; d7 V' t( Z
05:B39F:B5 5C     LDA $5C,X @ $005C = #$016 H$ v  F; M, e  N) ]4 H
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01; q6 C) r# }4 c0 v! ?
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
& q5 ?4 q2 V, w1 X& J/ G没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.# Y% X0 W6 E% I$ ~, Y
    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:! w" P! ~# w* f! }; {
05:B392:95 5C     STA $5C,X @ $005C = #$01
! V+ s1 h, l3 d$ D* K0 @8 e- w. X# J05:B394:C8        INY4 Z% t9 s7 P3 o0 u) H# p2 }8 V$ W
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
+ k. X+ c5 r# P1 Z, h05:B397:95 5A     STA $5A,X @ $005A = #$000 X+ ^( r8 w3 N8 @( u/ @
05:B399:C8        INY
; A8 C. X! p* v9 X. @* K: r$ G: X05:B39A:98        TYA* A; g/ T) \' r! _0 M$ B7 [
然后我们再上拉,得到如下指令:
( f% R7 g* r! ~' d6 b1 T( v05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09# @. c9 Z8 Z7 G3 P+ J5 x. Q, U. A
05:B38E:C9 FF     CMP #$FF
& I' p) z* y: ^& I0 y* ?7 V) L05:B390:F0 3D     BEQ $B3CF& Y$ W" _- J0 D# Y( A
05:B392:95 5C     STA $5C,X @ $005C = #$01
7 W+ F9 @; g# s, X. v) p05:B394:C8        INY3 o6 t, @. U! f4 m- [& Q, _
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09$ b% n8 `1 ^6 g* W
05:B397:95 5A     STA $5A,X @ $005A = #$00' w; [0 }* P- d
05:B399:C8        INY4 w& t" y$ h" r6 s1 D
05:B39A:98        TYA3 R6 D1 ^$ b0 G2 W- S
看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09* \# d! ]5 q7 r; ?8 j, o% N1 T3 v
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.3 W2 N; U2 r4 n, D4 j0 V
3.修改演示:
% L, f$ ^. F  J8 Z! ?    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
- ]9 N) J: z: M' D& T* E& @) t    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:7 u8 ^  j5 |! a$ G2 @/ H
打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:  ]. f  [7 q9 D3 }
05:B392:95 5C     STA $5C,X @ $005C = #$00
! y7 O9 c3 b, H1 A* j/ j+ N# X05:B394:C8        INY# w9 \3 P1 u3 c8 m
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
' N, ~2 Z& ?; D  r05:B397:95 5A     STA $5A,X @ $005A = #$00) Z% N0 G$ `: I1 m& v4 i
05:B399:C8        INY
1 H0 a: A# C4 l" h$ S05:B39A:98        TYA7 {+ d$ b3 a3 Y
我们上拉看到了:$ @& k0 a+ m% p; r# S  o# v% f/ G5 h
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
% M5 W2 _5 o6 k/ m0 a( v1 t& J  `05:B38E:C9 FF     CMP #$FF
' c  F4 X: _: m05:B390:F0 3D     BEQ $B3CF
& i4 L2 {0 k# p/ k4 Q05:B392:95 5C     STA $5C,X @ $005C = #$00
, @9 H0 _2 w0 T! {8 o& w/ B05:B394:C8        INY! g6 A- L2 n; N: B4 M
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
, K+ o% I) [8 J, b3 i8 g. k05:B397:95 5A     STA $5A,X @ $005A = #$00- a/ w  C+ s  @! l- o
05:B399:C8        INY
8 f9 w# l' D/ i, S05:B39A:98        TYA
5 H5 Q! L& a! k& r看到- \/ t, _1 B" ?/ p7 }6 ]
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
* T9 f6 I) S" c! U; p" [没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.$ w' s- J" m+ @3 k
说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:- M2 D* `' ^/ k1 M
05:B371:B5 5A     LDA $5A,X @ $005A = #$7F( M. [2 T8 I+ ^# Z, y
05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)4 d4 d) x6 G9 N1 @1 V
05:B375:A5 30     LDA $0030 = #$00
0 z' N& g/ a8 y3 r' W5 s05:B377:0A        ASL: P: F4 S4 R. p) o$ s  y, u+ v) k
05:B378:0A        ASL
: i' i9 e; A: h8 n0 m$ j05:B379:85 08     STA $0008 = #$299 V$ s1 W: c+ O, c( W3 {
05:B37B:8A        TXA8 H5 ?: `, a& o! i' \% L3 C7 @
05:B37C:0A        ASL
- w- ?# a) w$ C05:B37D:65 08     ADC $0008 = #$29  m/ X6 d7 ^; f9 T
05:B37F:A8        TAY9 E2 J- f3 x8 q  }
05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4" Y  `9 m$ Q0 V' M% Q) h7 h- T" N
05:B383:85 08     STA $0008 = #$29  E! O/ s0 ]6 o1 X0 O7 l7 B
05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC: o5 x7 k3 {8 ?7 h% n4 z5 V
05:B388:85 09     STA $0009 = #$B2. v/ J' j# H4 y" ?) a/ j, ?
05:B38A:B4 5E     LDY $5E,X @ $005E = #$02- m$ _9 Q: ?& x/ _
05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10
4 a8 g0 Q4 m6 {+ B6 Z6 H" Y05:B38E:C9 FF     CMP #$FF
% z5 }4 [7 j1 {4 o6 A05:B390:F0 3D     BEQ $B3CF" V' E) \8 ~2 F
05:B392:95 5C     STA $5C,X @ $005C = #$00
$ u: p* i& X2 N! `% Q. Y05:B394:C8        INY, r" u; s* w) p4 o# ?! t
05:B395:B1 08     LDA ($08),Y @ $B22E = #$100 |: n9 M" J9 N7 _% m
05:B397:95 5A     STA $5A,X @ $005A = #$7F' s& c0 J; M! [% q! c$ a$ \
05:B399:C8        INY
# W: Y& [& d1 X7 b# n+ R$ s05:B39A:98        TYA
, ^/ N" z) S+ J/ ~# V2 P05:B39B:95 5E     STA $5E,X @ $005E = #$02
8 ]) U, @& ?3 i4 n05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)
( [3 G* g# z, a& J- o' T05:B39F:B5 5C     LDA $5C,X @ $005C = #$00
3 T6 a, B8 c$ c$ q05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00. r# q' D7 f7 O9 [+ x
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00' x5 q( B. O$ K3 e

9 n& }/ L' T6 M2 I; S, o. x由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了' m% a. l: z5 T; e2 Y; o( k3 x& h
可以下载玩一玩  R  t0 x4 s# X5 B; ^9 f3 y; y& N
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1290 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。
6 z6 q0 J$ {" k' d5 `; I首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。0 ?9 D, _1 {$ X- ~' z7 p
后来尝试其它修改,但是偶尔会造成花版或者死机。
* M- _9 d% t! B- R8 B# r5 r3 G: ]深入研究,发现要以演示模式通关,需要做的事情还很多。
/ t: X- D" w$ R. d因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: 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-3-13 16:02 , Processed in 1.125000 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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