EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑
, Q9 `( k' `# j7 y$ u% g  q7 Z
6 b, h9 s/ @2 q$ j# M5 SFC自动演示修改教程
% h3 j* x$ Q. f作者:火焰烈旋风
1 [) u0 j9 w9 I2 u6 a9 {工具:FCEUX中文版(www.9553.cn搜FCEU即可)2 \) k$ X& A7 m5 ?$ N  v
1.找按键地址:% \; N, T2 F: P8 e. B5 D7 v2 ~; h
    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
' a* X0 M. z& B) b! M! J- p* _4 ~4 |2.找演示时按键的数据来源:
7 f) T" R7 J3 J6 B1 D5 H5 B    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:  g! c: s, d$ f5 H0 G+ t" [, Z( L
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01; \+ u/ o  Y( t9 B/ x5 N9 ]
07:C391:94 F9     STY $F9,X @ $00F9 = #$005 Y( c0 F5 B$ V& K
07:C393:CA        DEX! ]! A5 m% D! u+ D& ]7 x
07:C394:10 F0     BPL $C3865 j' z5 g! y9 B4 T! `. x
07:C396:60        RTS
0 ^7 n3 i4 H! M! Q" N( b, U7 k我们点击"运行"左边的上拉按钮上拉,看到如下指令:8 |; `6 X7 ?/ e% w) k& U
07:C378:A5 1D     LDA $001D = #$07
& R* U: ?' D; l6 K4 D$ I, H07:C37A:29 04     AND #$040 b# g/ I* D7 V5 D
07:C37C:D0 06     BNE $C3841 c1 t' F* X4 x, l9 ~3 H" p/ I$ {
07:C37E:A5 04     LDA $0004 = #$00
; j4 n1 E& K% R2 f$ }07:C380:05 05     ORA $0005 = #$00( m/ h3 h/ o  M5 W- ]0 x
07:C382:85 04     STA $0004 = #$00
# e! `$ |+ g4 o/ L. i/ A& L4 H07:C384:A2 01     LDX #$017 F) s5 N1 }4 Q% l* [0 n# \2 y; K
07:C386:B5 04     LDA $04,X @ $0004 = #$00
" u/ x$ Z, Z3 H6 N/ C07:C388:A8        TAY
1 M6 ^0 h6 t' L) d6 ^07:C389:55 F9     EOR $F9,X @ $00F9 = #$00. W  V% [6 @$ Y' f2 t. {* y
07:C38B:35 04     AND $04,X @ $0004 = #$00
& p5 u6 H* N4 [7 Q07:C38D:95 F5     STA $F5,X @ $00F5 = #$000 y2 ~  y& P0 D+ G& G# ]
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01) u. ?' @' q  o, t; s" C- m6 |
07:C391:94 F9     STY $F9,X @ $00F9 = #$00+ ?" ^& w9 o5 a
07:C393:CA        DEX
: [" a7 `% ?; v6 M+ G: m/ K3 }3 M% {07:C394:10 F0     BPL $C386
- s/ y0 O0 }: J; m7 v: l07:C396:60        RTS! U9 k6 p: z4 y( l) m& c+ c" g
由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:# V. f5 ]3 ]) y0 G" ?
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
4 W" f3 ?3 j* M4 E4 b3 [. t! ~05:B3A5:A5 2E     LDA $002E = #$C8% j4 F4 ?* P& _3 v' t  C# x3 x. Q
05:B3A7:C9 50     CMP #$50* i% n- D, t- }/ X
05:B3A9:90 20     BCC $B3CB7 v+ w" i: S0 h4 Z. V
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
( \4 u: x+ p" c7 I# R0 O05:B3AD:29 0F     AND #$0F! O) [# A# a# n0 s
05:B3AF:C9 01     CMP #$016 [+ M% w: S" A3 g
05:B3B1:F0 04     BEQ $B3B7& d2 S1 n0 f7 w$ s; y/ J2 N
05:B3B3:C9 04     CMP #$04/ ^9 u# A! y1 W# ^
.........$ E# @) U3 S% Z/ j6 ]
我们点击"运行"左边的上拉按钮上拉,看到如下指令:
1 ^; i. D. ]/ b' |1 y$ @05:B39F:B5 5C     LDA $5C,X @ $005C = #$017 D2 |* C8 c3 h+ l& z) j
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
; @7 A1 B! t& c  p) J05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
- y" G( b- A/ P& V8 F! W05:B3A5:A5 2E     LDA $002E = #$C8& o: n: r* T$ }' w, g  V# j
05:B3A7:C9 50     CMP #$50
6 O3 S. P  _- X, J/ g, j05:B3A9:90 20     BCC $B3CB/ }! X) \" I2 V* U$ f4 N) d
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$007 V4 ]( C+ K1 C7 H
05:B3AD:29 0F     AND #$0F- ~, P& y$ I4 n! [
看到  ]/ i% ?! b, E( Q: r: S0 F
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01; f+ V8 l1 Y& F5 p6 e4 ~/ K9 t
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$016 u0 f7 j' Z+ B4 ~) t3 S: R
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00$ v# Q1 K9 C" A2 r5 u! ^
没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.5 T( N& H6 R" p* J2 [6 u$ Q7 A5 {/ m
    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:. G9 E7 @1 x; m) k
05:B392:95 5C     STA $5C,X @ $005C = #$01
2 K3 {0 X+ t1 }7 r8 ?+ ]. m05:B394:C8        INY6 Z4 _" v& ~# j* R
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
3 F4 v1 g2 R4 Q05:B397:95 5A     STA $5A,X @ $005A = #$000 }' N# x9 V6 b6 r0 V
05:B399:C8        INY! b6 X! v  Q5 Y8 G1 o
05:B39A:98        TYA2 J. S" i2 h& a& n
然后我们再上拉,得到如下指令:$ F5 P( T( E- O9 |( N+ K; n
05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09
6 @, ]5 n, K+ v05:B38E:C9 FF     CMP #$FF
: w3 N' Y2 J4 n/ W: ~% M6 Z2 t$ `05:B390:F0 3D     BEQ $B3CF5 N+ `, [7 ]0 C2 H* S# w9 S; }- h  R
05:B392:95 5C     STA $5C,X @ $005C = #$01
& \+ X1 P# \  C$ V% Y05:B394:C8        INY
) K6 L$ {* ^& E! e! r" [; H+ P4 t" ?05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09: t- J0 d/ a- o* S5 A% r" b" c
05:B397:95 5A     STA $5A,X @ $005A = #$00% `/ j2 {2 x7 Q" H  z- d; n
05:B399:C8        INY. `7 _  a) [' y3 K
05:B39A:98        TYA6 N/ H: z. x, z$ w
看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09
" ?( f" s9 K- q1 {8 z2 t  @3 J% J没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近./ Q- O6 u: F) u8 L
3.修改演示:
2 X, t* ^$ P" e) L  f* y! s' C    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.' l# k2 O2 _2 h1 `, h- O
    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
/ z! X( {* K) N打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:: }. Z# M1 O4 d8 ^4 T4 d5 Q7 T8 Z7 B
05:B392:95 5C     STA $5C,X @ $005C = #$00
$ d2 x7 v: k: ~/ F3 j05:B394:C8        INY
! C6 [8 G( v& }4 W# Y+ T05:B395:B1 08     LDA ($08),Y @ $B3DE = #$002 n$ S5 [+ d" K5 [
05:B397:95 5A     STA $5A,X @ $005A = #$00
$ b8 |( Q& ^" n+ S; f6 a* t05:B399:C8        INY
$ S7 b) F4 Y% e* _" p05:B39A:98        TYA
) W+ @& Q$ ~6 `) u5 l! \8 @. d1 r我们上拉看到了:4 h0 t1 [2 l! R3 W2 x& }$ v
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$006 U+ N0 l0 Q" \: `) [. ?, Z
05:B38E:C9 FF     CMP #$FF
  S' v( {- y+ I9 Y2 \5 E05:B390:F0 3D     BEQ $B3CF
4 \# l- u- z" \/ d6 [0 c05:B392:95 5C     STA $5C,X @ $005C = #$00  K( r, R* H/ ]3 @6 W1 t- z
05:B394:C8        INY4 A) z- l8 S+ w, w  m
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
8 ?3 A* l. b+ K2 s% J1 b9 V- ]& Y05:B397:95 5A     STA $5A,X @ $005A = #$001 q8 {; H% S0 w6 |$ \
05:B399:C8        INY* K; w# U8 }' y: S
05:B39A:98        TYA+ O6 f2 l7 n: ^! i5 ~$ X
看到
/ r8 x, Y  |8 v05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$009 h, {7 Y8 Z8 w+ P) b. \
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.
! e7 S7 j5 \2 N# X  F说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:+ o. u1 N0 V, i0 ^
05:B371:B5 5A     LDA $5A,X @ $005A = #$7F4 e# q9 M7 d: F/ f% X
05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
0 ]2 z% W; Q/ U6 g4 s; _05:B375:A5 30     LDA $0030 = #$00) @9 F' Y4 S1 _' C
05:B377:0A        ASL& c) S; t% n6 C* a; l
05:B378:0A        ASL
. @% O4 \: o, L05:B379:85 08     STA $0008 = #$29
* o% @; n; C) \0 |8 |% _05:B37B:8A        TXA9 s. Z! k0 c* f4 @; f8 |
05:B37C:0A        ASL
7 S; p8 j! o! e05:B37D:65 08     ADC $0008 = #$29
; h1 h- ]& W) J: L- g0 h7 V05:B37F:A8        TAY
$ @* j7 I3 H0 i- |" \0 O/ f05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4
1 N2 }7 f( ^3 Q8 }: @5 F- D05:B383:85 08     STA $0008 = #$29. p* j1 {6 P5 _" l8 s$ o: Z, W
05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC/ y5 Q, T+ _0 u% D+ g! B2 u, f7 U% r
05:B388:85 09     STA $0009 = #$B2
( T0 E' N* i, s' w05:B38A:B4 5E     LDY $5E,X @ $005E = #$02% y. l: f5 y) g6 x/ E
05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10- O9 J5 c& U6 p  j
05:B38E:C9 FF     CMP #$FF% a/ n& Y8 S+ Z9 @; p3 N# Q1 D2 M; j
05:B390:F0 3D     BEQ $B3CF
2 I: X; P6 n  z/ G05:B392:95 5C     STA $5C,X @ $005C = #$00
" ^/ u6 U% `, B' W3 {6 x05:B394:C8        INY
+ |- M% R, {- L; B7 {05:B395:B1 08     LDA ($08),Y @ $B22E = #$10
+ U: c( r3 z+ N( K05:B397:95 5A     STA $5A,X @ $005A = #$7F
/ h5 Z" {' }$ \05:B399:C8        INY
6 ]) w& Q' ?9 L05:B39A:98        TYA
- d; t+ _& y8 k1 V+ ?05:B39B:95 5E     STA $5E,X @ $005E = #$02
# a( h/ N# E" U05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)
9 T$ y1 z5 h. L( w4 r05:B39F:B5 5C     LDA $5C,X @ $005C = #$003 d6 Y' B* j/ I; A
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00/ A$ c$ p& g* s. S4 E- J$ ]. S
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
' d- ^/ U7 J& X
# B! u- }0 q. a* p3 I由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了2 ~. J9 R1 c* v
可以下载玩一玩7 ^/ P* w- \. s
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1269 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。, Y5 G. G5 {# k$ s- l
首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。( c- a6 o* ^! F2 O2 O0 {
后来尝试其它修改,但是偶尔会造成花版或者死机。
( w) r5 \- U3 A/ @深入研究,发现要以演示模式通关,需要做的事情还很多。7 C3 {( v- {" f" T+ h
因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: 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, 2024-9-24 06:32 , Processed in 1.065429 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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