EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑
: n; i0 D5 g; @: U
' [# i* Y6 A9 }+ W8 J) F! IFC自动演示修改教程
; v. }% C, e0 U  q) f8 U: C9 D作者:火焰烈旋风
$ P* F% F' ?- z! F; G工具:FCEUX中文版(www.9553.cn搜FCEU即可)- ^" U% @4 G1 X+ P6 B9 r
1.找按键地址:
$ v* G) T2 `& A  ?! R( E( p. \    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10." F& E" H  J+ u+ h4 F8 }/ x3 Q* B9 N$ P
2.找演示时按键的数据来源:& c: V8 K/ @, m# I7 r6 V
    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
3 F" ?7 g  Q, l07:C38F:94 F1     STY $F1,X @ $00F1 = #$016 @# e  o% Q& |1 z
07:C391:94 F9     STY $F9,X @ $00F9 = #$005 c  F  N  a8 \7 r, n. h
07:C393:CA        DEX
; }$ s% H2 k: j, {4 Z1 B07:C394:10 F0     BPL $C3865 S9 `% K/ I6 \3 G0 b0 @3 M
07:C396:60        RTS" k* D) G3 u! F; B: U: h
我们点击"运行"左边的上拉按钮上拉,看到如下指令:
4 o- U( B3 e; C4 C  ~07:C378:A5 1D     LDA $001D = #$07
( w4 w& ~& s9 u; K07:C37A:29 04     AND #$04
1 i7 V5 i; |3 v0 _6 H6 Y07:C37C:D0 06     BNE $C384
# o, w) `3 H7 p1 Y& v07:C37E:A5 04     LDA $0004 = #$00( Y" r& n  [9 K' H* w* Q  h+ e
07:C380:05 05     ORA $0005 = #$00
7 p: O% _' g4 z. }0 @07:C382:85 04     STA $0004 = #$00/ y8 K+ D2 T7 F) v
07:C384:A2 01     LDX #$01$ L  R6 J( J. D, G# E/ ^
07:C386:B5 04     LDA $04,X @ $0004 = #$00
  u6 r5 N% N: s9 b5 |07:C388:A8        TAY
, k. z) }+ f9 ~. b/ ?. z* T# v, A07:C389:55 F9     EOR $F9,X @ $00F9 = #$00* k: \5 }; z+ M' m7 a/ I8 z$ v
07:C38B:35 04     AND $04,X @ $0004 = #$00
3 s' U' L4 F* b& n# k5 n& t& N07:C38D:95 F5     STA $F5,X @ $00F5 = #$00
" s: R1 u6 E  s  q  E/ V07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
2 ?7 p  c7 j* W! }) N07:C391:94 F9     STY $F9,X @ $00F9 = #$00: a9 D9 m6 Z  D
07:C393:CA        DEX
: s; ]9 G' `# T( k07:C394:10 F0     BPL $C386
; \$ ]/ j( V0 v- _4 u& b6 Y07:C396:60        RTS2 A' m1 F  @( \  l* i1 P3 U) X
由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:5 _  C- Q8 o5 n9 V1 w' d' Z
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
  A+ G' S! _; _( l05:B3A5:A5 2E     LDA $002E = #$C8
& }3 [/ C- g" P0 u. w4 K+ d05:B3A7:C9 50     CMP #$50
: ]" `( L$ B2 t+ c+ j; g/ J& z05:B3A9:90 20     BCC $B3CB% _) \# t! C3 u: ~& m' V/ E6 S: ]
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
+ Y' z6 I* Z2 l2 Z9 u05:B3AD:29 0F     AND #$0F# h+ q6 I* M# h5 X! Q$ g
05:B3AF:C9 01     CMP #$018 B% U( V$ v& V! p% ?
05:B3B1:F0 04     BEQ $B3B7
6 p, S8 i; o) Y: i: ]9 i7 i05:B3B3:C9 04     CMP #$042 X) `/ m: j/ k
.........2 y2 l. P) d* U1 @
我们点击"运行"左边的上拉按钮上拉,看到如下指令:
  ~6 S7 d" \0 p- h) _3 U: ?% b05:B39F:B5 5C     LDA $5C,X @ $005C = #$01" s( G6 w  U7 @4 y
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01$ ^& p8 B" j  n* F
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
: {1 j" g1 d; e2 @) E05:B3A5:A5 2E     LDA $002E = #$C8
& a' G6 `) K9 \- V: C  R3 ^/ u05:B3A7:C9 50     CMP #$50
! f0 g/ h% H' o5 j05:B3A9:90 20     BCC $B3CB' d% S4 U. r9 g( Y1 L
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00. z7 m7 H$ G; C; N
05:B3AD:29 0F     AND #$0F
; S, b! ?& j, V0 b+ g看到2 i  j) c. V& q- O* G' V# ^# k
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01" o: Z2 v9 C+ A, V- V
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01& K+ v1 u4 R9 F4 x
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
  m3 n6 _% k' e, Q没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.
9 r" T+ ]' R% f# ?* X9 N    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:
# |) W- O" D& C  m05:B392:95 5C     STA $5C,X @ $005C = #$016 r& y4 R' h1 {  U" O$ N) f# B
05:B394:C8        INY
, j6 T+ {' S7 d+ n05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
# i; o4 `3 X# l  l05:B397:95 5A     STA $5A,X @ $005A = #$00
5 O; N% q. n  |: W05:B399:C8        INY
. E2 m  E$ N. [/ u; y: u05:B39A:98        TYA; k0 t; ^. [; }* u, d% h
然后我们再上拉,得到如下指令:
9 ~2 T$ ?0 u. M1 P8 ?; u- O05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09" }6 K9 o) V5 a5 T- c1 ~+ \! c' P
05:B38E:C9 FF     CMP #$FF7 W. B+ D+ Z% ?6 n
05:B390:F0 3D     BEQ $B3CF
# Y  H0 D# d4 U1 D& G( L05:B392:95 5C     STA $5C,X @ $005C = #$01
( @5 k3 C* V' k. n, ^) G; F05:B394:C8        INY* f0 m5 H* f& i) l2 ?
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09: |5 c5 a- d, d+ Y: e/ F7 U6 U1 v: K
05:B397:95 5A     STA $5A,X @ $005A = #$00
: ~, h# q7 G: a6 Y1 E05:B399:C8        INY6 N; f* k2 g2 d5 g" s% v  X
05:B39A:98        TYA
( H2 }2 m, Q# l) M# W看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09: Y% ^3 |3 A" X) M; J
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.
6 r2 B! C3 O$ j' ?! _5 H3.修改演示:
: K6 c. A# F* B7 U6 i    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
# p. i4 K$ [0 p6 E    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:1 g7 z. ^- Z. |7 o2 M
打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:2 A: W! F5 m' S. [4 S! E& E5 y
05:B392:95 5C     STA $5C,X @ $005C = #$00' Q" |, ]9 q) N7 h5 j
05:B394:C8        INY
# R' k$ z/ O" X3 e05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
/ w9 G# ?: u; J! a6 ?7 Y$ m) _' m3 D05:B397:95 5A     STA $5A,X @ $005A = #$00
5 w. h% P6 q. R1 C3 s$ M% u! d05:B399:C8        INY
) w/ V* o" Z5 h) j4 |' h( J+ H05:B39A:98        TYA7 C! ^* ]( ?) ]/ t( `' ?/ E
我们上拉看到了:
* Y8 l8 c. D9 Z# x% S) y05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00* J2 h( T/ o9 O* q8 U* G  K+ @
05:B38E:C9 FF     CMP #$FF9 I" C/ H- b4 h( v# M
05:B390:F0 3D     BEQ $B3CF
# E* Y4 t! E$ I9 h) m$ F& C+ ?05:B392:95 5C     STA $5C,X @ $005C = #$00$ g( U+ G" c& `. L) |
05:B394:C8        INY4 D5 }" x( l3 E( D! C% X
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00' F) J8 k3 V, R* o# c% U- p& d# V
05:B397:95 5A     STA $5A,X @ $005A = #$00
" h; ~8 m7 F6 l$ z9 w& o/ t8 q05:B399:C8        INY* N2 r/ \# B; w4 Y6 n9 |& U. q$ {
05:B39A:98        TYA( R- N! e% P( c. t5 N
看到) w  |/ d5 B; k' G
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00* P8 `/ i0 Q0 N2 x# k  ]
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.
) e( Z/ w6 u: |$ S  S: y4 z, c8 r8 ~说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:( Q# G, w, k1 z0 j) j; |+ s
05:B371:B5 5A     LDA $5A,X @ $005A = #$7F8 t/ w. w$ p# t  V) h* ~
05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
& `7 A8 b; \6 Q6 x05:B375:A5 30     LDA $0030 = #$00/ \1 \3 j; }$ }- J' m; O1 ~9 j
05:B377:0A        ASL+ h1 W4 `- a( B! t, E  C/ n2 A
05:B378:0A        ASL3 {0 G  S) W$ Q  l! E; U& Q
05:B379:85 08     STA $0008 = #$29
; J: V. {9 {$ F' V05:B37B:8A        TXA" U' ]  T: w* O
05:B37C:0A        ASL  D6 V- {- C' Q2 h% N3 z' v3 G8 s6 V
05:B37D:65 08     ADC $0008 = #$296 Z( l2 S5 _$ B3 o( H
05:B37F:A8        TAY
( I( w7 A4 [& `# z- X( n05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4
$ P0 Z+ y$ a5 ^# T: q, a9 P: V) u; i05:B383:85 08     STA $0008 = #$29: g0 b% Q  ?3 y- j: @0 x% E
05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC
% R) O) @& {; I  U/ X3 h% S6 n05:B388:85 09     STA $0009 = #$B29 ^3 B& M& u- [* G/ N$ L2 o
05:B38A:B4 5E     LDY $5E,X @ $005E = #$02
4 y, G3 {3 b% Y; y) K0 Q05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10  E6 B1 |/ t$ l1 i1 I9 ]& A/ S1 ~
05:B38E:C9 FF     CMP #$FF
" V5 Y/ _! }  [3 }, p, `05:B390:F0 3D     BEQ $B3CF
$ e, y0 s" W- ~0 M05:B392:95 5C     STA $5C,X @ $005C = #$00
4 ^* i, q$ g$ @/ V05:B394:C8        INY' W: z5 ^# R% H2 B1 D* {% E0 I
05:B395:B1 08     LDA ($08),Y @ $B22E = #$10
& J' o7 a, D" e4 ^. u05:B397:95 5A     STA $5A,X @ $005A = #$7F
8 e# }& I& x' X" l/ o' a05:B399:C8        INY
% v" y6 w) W- O! |* I4 q) ~05:B39A:98        TYA  n- v+ R6 o  w: W
05:B39B:95 5E     STA $5E,X @ $005E = #$02
  a- h. g) i7 t05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)
# u+ e7 v4 r! L) T  a% D( T05:B39F:B5 5C     LDA $5C,X @ $005C = #$00) D6 M. W$ C! ^* h
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00
; W. O3 ^  h" x$ K05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
4 r6 o0 u$ h3 p9 i! ?% Y* `2 |* f3 S
) ~  F- l, R5 {/ @: [由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了9 M) r8 E: d# I( K3 t2 K' `
可以下载玩一玩
" R% B% r7 F* X& D0 Chttp://pan.baidu.com/s/1bnE0AwZ

签到天数: 1297 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。
: e9 {9 H* Y& M* P首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。
4 c) W' s+ P" P6 h. K后来尝试其它修改,但是偶尔会造成花版或者死机。
2 {: f5 s* p5 Q6 Q深入研究,发现要以演示模式通关,需要做的事情还很多。( x9 Z8 D# I+ H. k# Z# 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, 2025-4-23 00:48 , Processed in 1.257812 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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