EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑 * D% Y8 q$ d6 m: y& l( [
6 `1 Q+ z5 q- [
FC自动演示修改教程
3 ^$ B4 M+ [/ n( z作者:火焰烈旋风
& q9 ^- j9 n# q工具:FCEUX中文版(www.9553.cn搜FCEU即可)9 X% l, \6 A  P1 v9 B, Y
1.找按键地址:( }. Z) I6 I8 b  V/ K5 O
    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.2 o/ B! }/ R: {5 y
2.找演示时按键的数据来源:/ i" s" S& p' [0 i& i* k( `1 U
    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
( Y5 g! s! u! f5 F07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
( E$ _6 @) H$ f7 U; s! s" {% Q, m07:C391:94 F9     STY $F9,X @ $00F9 = #$00- M( y' J3 o& |1 a; b; I
07:C393:CA        DEX
1 k8 A# i/ G8 y/ |" B07:C394:10 F0     BPL $C386
' K6 {) S( a! h8 k! o6 |07:C396:60        RTS
3 q* W$ \+ Z7 ~我们点击"运行"左边的上拉按钮上拉,看到如下指令:) h* A5 s3 l; N: X
07:C378:A5 1D     LDA $001D = #$07
, ^& S/ n0 Y5 E; E) c07:C37A:29 04     AND #$04
1 E& u. z* l; ?* I  I" c% E* ?5 ?07:C37C:D0 06     BNE $C3841 }" g7 C" V( }: Y5 K* s' [
07:C37E:A5 04     LDA $0004 = #$00. y. W% f9 }& G
07:C380:05 05     ORA $0005 = #$00$ v  i/ @  W: c% |) I; D' b4 }
07:C382:85 04     STA $0004 = #$00( ?9 B4 g, G, g9 Q2 U) P9 w0 [8 M
07:C384:A2 01     LDX #$01, p" X8 i; ?4 F1 b. ^# Q; G* x$ |
07:C386:B5 04     LDA $04,X @ $0004 = #$00
3 I* f: p) _$ f, ~! ]! Y) z: |07:C388:A8        TAY
) y4 o, c# `  \07:C389:55 F9     EOR $F9,X @ $00F9 = #$005 s$ X0 L& y4 F/ m$ M0 J% L$ x
07:C38B:35 04     AND $04,X @ $0004 = #$006 C  ~" x" U$ v/ f3 M, G
07:C38D:95 F5     STA $F5,X @ $00F5 = #$000 q7 D0 Z4 t' p; G/ q. U
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01/ h6 t( N5 x2 a$ u, b5 v) a
07:C391:94 F9     STY $F9,X @ $00F9 = #$00
/ m) R8 |2 H7 ?! x% V07:C393:CA        DEX% Q; ~" G8 X8 r( F* a1 p
07:C394:10 F0     BPL $C3861 I7 F. }$ ~& b; n
07:C396:60        RTS2 E5 v. Q  k# O3 D$ l
由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:0 ?" E1 M7 a, ~) k2 {
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$004 I: y( K% ]' y6 B- S
05:B3A5:A5 2E     LDA $002E = #$C88 o$ y* G8 w, m$ L1 {& y1 h7 Z/ [# ]6 E
05:B3A7:C9 50     CMP #$50
$ V% X: |) M0 k8 f$ P: E& H. J9 d! w05:B3A9:90 20     BCC $B3CB
% T+ ?% c/ l( D9 f. C05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$005 g# z" v4 d6 U, w& ]9 M( a/ T
05:B3AD:29 0F     AND #$0F) u! Z5 I4 @+ k8 ]
05:B3AF:C9 01     CMP #$01
9 U' r1 j$ |, ~( P0 q05:B3B1:F0 04     BEQ $B3B78 W/ x1 M5 _' _9 ?* v2 N" g
05:B3B3:C9 04     CMP #$04
  _8 o4 u# x- h1 V. n. T$ p.........
. W+ [0 L% }' V& B3 I我们点击"运行"左边的上拉按钮上拉,看到如下指令:
  e! m8 U' V) Z6 S8 l8 J8 o; m05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
7 V( d% l5 d: n" D/ n" A05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
) `3 i) k' @' @05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
6 F# f; `! |; c; c3 r05:B3A5:A5 2E     LDA $002E = #$C8
  u' n5 X- P# N; t5 \# \05:B3A7:C9 50     CMP #$50& c/ R# k$ K) o) a- X( ~) @9 W; D
05:B3A9:90 20     BCC $B3CB
# }3 V4 i9 i# _0 P* K05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$008 Q! d; N3 m: `) a1 s. z) b% Z6 X
05:B3AD:29 0F     AND #$0F3 R( C- s2 o4 t- S/ [
看到
$ X8 j& O# `. y# N  l05:B39F:B5 5C     LDA $5C,X @ $005C = #$01% ]  j* m& W5 S+ c, N+ h7 s
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
2 O, \' P/ q$ x) [) ]; y05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
3 o% T1 g: p3 B' e/ V! d没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.1 [# w4 p7 b% K9 ?2 _' ~" K
    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:* X# C+ p$ Y# v; [5 C5 q( B
05:B392:95 5C     STA $5C,X @ $005C = #$01$ S5 A# ~& n/ a
05:B394:C8        INY
1 j9 ~7 Q( R5 Z6 h# @  W05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
! o; O2 t, }: u9 I4 |) H# I05:B397:95 5A     STA $5A,X @ $005A = #$00
7 o. C1 H3 J: Q! p* p/ U05:B399:C8        INY! p! @. {2 r5 T4 W! e9 A
05:B39A:98        TYA
) a& Y5 ]: ]3 s" Y; A! _然后我们再上拉,得到如下指令:$ ?4 ~* P. |' Y
05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$094 e  [* y# p2 S5 U' J8 t8 o8 Y
05:B38E:C9 FF     CMP #$FF* T2 z' R8 T1 t  w- u" ]
05:B390:F0 3D     BEQ $B3CF; v" |4 G# @+ z0 j5 e  c7 w4 N
05:B392:95 5C     STA $5C,X @ $005C = #$016 a/ L$ o6 _0 }4 V8 i6 _9 q
05:B394:C8        INY
2 g5 C2 v" B0 n8 ]9 ~3 w# }' T05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$093 P- Q& o5 f" q. ^3 J8 }  p
05:B397:95 5A     STA $5A,X @ $005A = #$00
$ b: ?  J/ q% ~: [/ }" j  A# Y05:B399:C8        INY
$ n; o5 \6 O4 f7 J05:B39A:98        TYA; b) E6 u2 A2 x5 A. q
看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$093 v, |0 \6 N! a" C; S' F3 u
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.8 L8 n! A. _/ }% I) E2 u
3.修改演示:% I+ H8 V, i; y  Q. J. Q
    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
; U$ e9 h" H7 E  g- h+ @    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
& h4 V/ T4 s/ {8 R打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:5 ?; c* W1 X% c6 ?
05:B392:95 5C     STA $5C,X @ $005C = #$00
: V  W( \: p6 i' ]% Q/ D5 }05:B394:C8        INY9 Z' d4 a2 x7 k+ d5 Q2 j" O
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
( V( H8 }3 |5 w05:B397:95 5A     STA $5A,X @ $005A = #$00
: ^* V* Q. i! D9 y2 d05:B399:C8        INY
' p- g; V' Q9 h3 a05:B39A:98        TYA# R* d/ I% x2 _$ Q1 n+ h' h
我们上拉看到了:% g2 y! E) d5 c# p
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
- {/ @; M/ H& O$ X" o0 H0 S0 E05:B38E:C9 FF     CMP #$FF) }: b9 d; G0 N- y- m
05:B390:F0 3D     BEQ $B3CF
* ]9 _1 J' p7 w6 v% K05:B392:95 5C     STA $5C,X @ $005C = #$00
6 D- [+ a! [6 p, v4 B* N8 _# s, n( J05:B394:C8        INY
: [2 v' `% `+ O) ]5 f: x+ _& o# \05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00' z) o' f+ a8 |: }$ e2 h8 k
05:B397:95 5A     STA $5A,X @ $005A = #$003 L! l2 B$ L5 O$ W% H$ l1 Y% |9 t
05:B399:C8        INY* t4 u) s- [6 Y) U# b
05:B39A:98        TYA( D/ }( Y. u! {% g  e5 _
看到
. r4 L, M+ _  Y" v05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00; I3 i$ l: a/ X1 L" `
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.
( m9 ?* N" c; S5 e说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:
. r, z8 ]: N" k. }1 _+ s05:B371:B5 5A     LDA $5A,X @ $005A = #$7F5 _! Y% K% E0 x1 m4 L- s: W2 Z
05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
) t1 X- K. b" `' M8 D  K# g0 ^05:B375:A5 30     LDA $0030 = #$003 C4 B3 E4 u- Z  F7 B% `
05:B377:0A        ASL3 {9 o$ q, e8 D: v) s
05:B378:0A        ASL
  u& a2 c2 b9 w05:B379:85 08     STA $0008 = #$29( v6 `2 b0 i  F- e$ j6 ?
05:B37B:8A        TXA
' c$ U/ q+ ~  ?4 v' i" u% n5 _0 i05:B37C:0A        ASL
8 e) }" F2 V+ p' R5 H9 \2 q05:B37D:65 08     ADC $0008 = #$29( G$ ~$ V! f6 d9 K
05:B37F:A8        TAY% m+ @* i, i8 w/ i8 |; V* U$ T" \
05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4
; w( M. o5 j2 i4 o7 v05:B383:85 08     STA $0008 = #$29
9 [+ [: ~$ V& @- C4 e0 M4 N05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC
5 X" R9 s4 z) I* k# N+ }; ?) V05:B388:85 09     STA $0009 = #$B22 w7 L! x4 U8 K, ?4 K, W
05:B38A:B4 5E     LDY $5E,X @ $005E = #$02; q" x7 U8 @2 j& w  o/ `
05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10
; w, y& f; ?# ~05:B38E:C9 FF     CMP #$FF' D. _4 q7 [2 h/ L" `! L
05:B390:F0 3D     BEQ $B3CF  U& {# W0 C+ f8 j- x
05:B392:95 5C     STA $5C,X @ $005C = #$001 M+ r8 ^" S* a
05:B394:C8        INY6 A4 n5 z# G( H  l6 k9 B
05:B395:B1 08     LDA ($08),Y @ $B22E = #$101 M, L+ x9 M6 O: H
05:B397:95 5A     STA $5A,X @ $005A = #$7F0 s3 T/ {6 P' Z
05:B399:C8        INY- ?6 C* n0 Y( n' N/ p
05:B39A:98        TYA$ {8 |9 J+ H' ?
05:B39B:95 5E     STA $5E,X @ $005E = #$02
7 |0 Z4 b) [* W# Q* {7 B05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)% U6 O8 g, K' F# r/ |( M: ~2 A+ v
05:B39F:B5 5C     LDA $5C,X @ $005C = #$00
* r, w' c# o; Z1 m( s! @) O05:B3A1:95 F5     STA $F5,X @ $00F5 = #$000 F/ a: p% V) c. u9 \4 h& ^( D
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
8 o/ T& |- Y2 B7 y9 H$ F% p; G( l9 n. s/ ?  P
由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
6 U# U  K! T* O9 B! K- C" N0 g, A可以下载玩一玩9 `7 Y1 l* g9 d+ g
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1303 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。# }: K# S; M. l
首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。0 a' s+ n; j2 e  k; V! g
后来尝试其它修改,但是偶尔会造成花版或者死机。1 V; f# }5 v5 `% ^/ q9 C) E
深入研究,发现要以演示模式通关,需要做的事情还很多。1 k- C4 B' Q1 T# d9 [2 {
因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: 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-5-16 01:38 , Processed in 1.072265 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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