EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑
( b3 z) l: N, Z+ ~7 H' g8 y! ]9 l5 |8 G8 v' H+ P; ^7 q' X2 i
FC自动演示修改教程& ~. P) X7 p3 ~7 ]2 x. |+ F& u0 R7 P  ~3 e
作者:火焰烈旋风7 t, T, s- N: |6 |" ]) d
工具:FCEUX中文版(www.9553.cn搜FCEU即可)+ c* j, y8 `' l6 y* B( u: s# B7 b' I
1.找按键地址:
/ p' y  }3 x, ]% A9 b! e    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.0 Z2 u* Q9 Q; `* e- W& Q+ @1 s/ R
2.找演示时按键的数据来源:9 B% v* Z' j( X3 g6 `, e9 V0 L! r: f! `
    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:+ P% }  m1 R  T8 U- B% K
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
& p+ p1 K7 h0 ]2 q1 P/ A8 P07:C391:94 F9     STY $F9,X @ $00F9 = #$005 I/ o# v# a$ z! L9 b
07:C393:CA        DEX
' M% C3 [( b, n/ R1 l' X* T07:C394:10 F0     BPL $C386) K9 W1 n, `' O9 ]9 q
07:C396:60        RTS5 @5 r# E/ M: M+ k7 P6 M( f# u
我们点击"运行"左边的上拉按钮上拉,看到如下指令:
0 o9 ]" d4 K9 `/ v( I) p- o+ c07:C378:A5 1D     LDA $001D = #$07
3 c: ^1 ?7 \" K( ]8 v8 g07:C37A:29 04     AND #$04. t; h. d, F$ L! y+ F0 T
07:C37C:D0 06     BNE $C384
- X" U4 R7 _$ m; ^- S07:C37E:A5 04     LDA $0004 = #$00/ K  h; c! Y3 _9 b. x$ U4 c, r$ Y
07:C380:05 05     ORA $0005 = #$00" T! \3 L- S4 ]! z0 ]5 q/ P
07:C382:85 04     STA $0004 = #$00
! H6 D( i+ J9 t$ r# a07:C384:A2 01     LDX #$01' _: [. m) k4 b1 d( \
07:C386:B5 04     LDA $04,X @ $0004 = #$00+ G" S5 g4 @7 l- q# n" N' o
07:C388:A8        TAY* n. X5 S' I  P+ L; p7 K
07:C389:55 F9     EOR $F9,X @ $00F9 = #$00
+ Y- G3 n$ P1 }* F, R07:C38B:35 04     AND $04,X @ $0004 = #$00* x. L) S' G# M& Q" y
07:C38D:95 F5     STA $F5,X @ $00F5 = #$006 t; f, L) a3 _% x
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01+ H4 n+ ?5 H( B6 o# }
07:C391:94 F9     STY $F9,X @ $00F9 = #$00
% D! a, Y3 p- d0 s5 Y2 z7 ~4 X% N* w1 f07:C393:CA        DEX# j0 S2 ^  [* [* v* T: z
07:C394:10 F0     BPL $C386. b$ t8 h( F3 ~' q( G6 y! o
07:C396:60        RTS
: O8 d8 U; q% V+ v4 p  M由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:- q9 S: N5 O+ |6 T* L% Y
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
  ~7 O( D+ n8 q8 ?8 }; o05:B3A5:A5 2E     LDA $002E = #$C8
: Q0 c! r9 V! q! k) _7 p+ G05:B3A7:C9 50     CMP #$50# Q+ Z! K  i$ J5 [
05:B3A9:90 20     BCC $B3CB; L; ~6 @' b$ l1 y. G! N. x
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00/ x# g! {; @9 J% Z* O0 s
05:B3AD:29 0F     AND #$0F/ c7 u& r  l  t" ?
05:B3AF:C9 01     CMP #$01. h- ?! A; l4 [- s
05:B3B1:F0 04     BEQ $B3B7
) K- J3 b. h/ N% S4 X; \05:B3B3:C9 04     CMP #$040 S5 b9 J' d2 l# a+ e* u+ y
.........1 s9 @0 w& h( \* e: }
我们点击"运行"左边的上拉按钮上拉,看到如下指令:% s" q3 [' n5 f) }1 X
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01& \5 s8 Y: u8 F/ o, K' _" d% U- S
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
! `' U) W% j! W; U( R05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00; H( ?% e3 c4 b' r
05:B3A5:A5 2E     LDA $002E = #$C83 I9 u7 y) f. ]; ^2 F; Q
05:B3A7:C9 50     CMP #$50
: M# X+ C' W) {- u05:B3A9:90 20     BCC $B3CB
: \8 \! v0 f/ r) V. u2 T) B05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00" t0 Y" u& A$ T) X# S
05:B3AD:29 0F     AND #$0F& [* d/ Q: l( _' b6 K3 M" E; U
看到& Z+ V- a2 r# K( }
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01/ V( U( u/ X/ C
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$010 }; {6 u8 f: Z
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
5 S: h, X& _8 H没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.( D( x6 H# W1 o0 R* W( [
    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:
  N$ D; \9 x( g% F05:B392:95 5C     STA $5C,X @ $005C = #$01# I% ~. a) w! c  s/ O0 M
05:B394:C8        INY; `: ?$ R' C8 Q9 h! |) Z0 D
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
$ k) W" z2 F3 J05:B397:95 5A     STA $5A,X @ $005A = #$00: ]# ^' p0 g0 N. M- n% Q: r0 @% v
05:B399:C8        INY
2 q# T8 q" R4 D7 e/ u05:B39A:98        TYA" Y# E# S9 W3 f: P1 H9 [# X! M
然后我们再上拉,得到如下指令:
# g$ a/ O2 W: k$ D05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09% a$ N1 a$ N9 |9 y6 }
05:B38E:C9 FF     CMP #$FF
' p+ S4 H3 h6 r6 _; Q05:B390:F0 3D     BEQ $B3CF4 E/ ]. y, L9 E# ^4 b; I
05:B392:95 5C     STA $5C,X @ $005C = #$01
* ]/ G  s- a( d4 r8 z05:B394:C8        INY9 y, h3 f9 B0 X
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
! m4 c' P, X5 D8 t6 N05:B397:95 5A     STA $5A,X @ $005A = #$001 Q4 p9 M3 @, l, B/ E% i7 g8 Y
05:B399:C8        INY
# u  ~% i* ~* ^9 q8 ?6 C% M: t05:B39A:98        TYA
: a1 {) |  r2 r% u+ M7 P看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09
  }9 B. r8 {3 i/ X/ _没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.$ k2 K+ v: r+ _  t6 g# e
3.修改演示:9 o: [# h2 g1 {
    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.1 o, o  ^) s4 I0 V& I
    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
1 x% W6 T$ X* Z打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:3 Y$ E" v4 [% [: ^
05:B392:95 5C     STA $5C,X @ $005C = #$00* s0 m$ ]) E0 T6 C7 z) Z6 C! D
05:B394:C8        INY
3 B2 k9 l6 g2 H% u05:B395:B1 08     LDA ($08),Y @ $B3DE = #$008 ?' H5 G, m( w7 R2 [$ k
05:B397:95 5A     STA $5A,X @ $005A = #$00: C$ m- G9 P! D& j+ v- u
05:B399:C8        INY
+ r/ v4 x  p+ j05:B39A:98        TYA
. k' b/ N: U. N0 q) U+ w0 x我们上拉看到了:
* T8 _( {) t2 `8 H3 [05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
! J. T! P( t0 u8 b05:B38E:C9 FF     CMP #$FF1 I1 g1 f7 t7 ~: x+ P( o
05:B390:F0 3D     BEQ $B3CF. T% P: g3 Y9 H% \% Q9 ^8 j- l
05:B392:95 5C     STA $5C,X @ $005C = #$007 t) y* u! Y1 v- X8 s
05:B394:C8        INY
/ X$ }: e% u* K* f05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
6 j' b/ J3 P& N: X- r: ~05:B397:95 5A     STA $5A,X @ $005A = #$00
* Y9 F5 C  \: c05:B399:C8        INY
7 G2 _: }$ Q5 ~5 P05:B39A:98        TYA
; x/ V) L! n! Q% F% z; k! }! [9 c看到
) J6 X! Z3 z; @, h# w( \05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
& ^& Q8 ~" }) X/ x. ^* L# m没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址., X  j0 `& B' L& C) U' S
说明:演示按键地址的结构,以开始的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(时间).......以此类推,判断根据:
+ E5 L) f2 \: @4 Y05:B371:B5 5A     LDA $5A,X @ $005A = #$7F
- e$ s5 }0 J. E! f05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
  r: N. @! e# w7 o7 s/ s* s, y; k05:B375:A5 30     LDA $0030 = #$00
, z' ?2 w% h) L& p# t05:B377:0A        ASL4 e7 Q: d! p" `6 O- ]% T/ T
05:B378:0A        ASL) U4 W, f: R1 M5 T
05:B379:85 08     STA $0008 = #$29
; {) ?2 u% A/ B# }7 E05:B37B:8A        TXA
# c6 _% m, w6 e. X( S05:B37C:0A        ASL
8 a( a5 t3 E2 R4 |* N4 O& V1 _) P05:B37D:65 08     ADC $0008 = #$29
  R; U, H' @* |! B05:B37F:A8        TAY
2 X/ N$ a" _! \% ?9 l0 n$ g# f05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4
, S& O9 y% |2 \( A' i: N; D05:B383:85 08     STA $0008 = #$29* V9 ~2 W+ H( |
05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC
) ]0 D0 U/ t0 p$ ?' M8 y, |05:B388:85 09     STA $0009 = #$B2
5 d, s: D" I% A* q7 i' _3 y05:B38A:B4 5E     LDY $5E,X @ $005E = #$02. D. A) v  b/ K  s6 |4 f# C4 z" H
05:B38C:B1 08     LDA ($08),Y @ $B22E = #$100 {& w; J- ?" `, w. [
05:B38E:C9 FF     CMP #$FF: N! ~% z6 H+ B( W( y
05:B390:F0 3D     BEQ $B3CF* Q, ]7 C( e! T9 _1 B# r0 [
05:B392:95 5C     STA $5C,X @ $005C = #$00
( g* W- ?( Z+ l! S" E# W6 O, z  s$ V05:B394:C8        INY
7 F) n( o  g, @/ e% v1 Y  H% m05:B395:B1 08     LDA ($08),Y @ $B22E = #$10' a6 y* S- v7 I' A' J; X
05:B397:95 5A     STA $5A,X @ $005A = #$7F
* Z( ~' |& d0 ^05:B399:C8        INY4 R8 Z- `2 W4 M+ p# q
05:B39A:98        TYA
6 z( P' h$ H2 S% Y05:B39B:95 5E     STA $5E,X @ $005E = #$02
: l  K2 l/ E- `2 J9 W' F- C& j05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)
: h5 t! e% [% X( C# Q$ O# r$ J- U05:B39F:B5 5C     LDA $5C,X @ $005C = #$00
8 {8 T" u$ ?3 O1 K  F1 y' ?. i' d05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00
, Z# b1 M5 ^) @' _( \, M0 y$ b05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00; R: F& n# K+ m& P2 y1 o0 E, v
* s, m1 Y& d" |/ N" s! y! a2 c) |# r0 h! K
由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
% ]. T2 g% |7 B: `可以下载玩一玩7 T) y/ O4 R8 H$ G: @9 U( R
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1290 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。1 t; E9 h' w% `% h
首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。
- U/ m; T3 E3 e后来尝试其它修改,但是偶尔会造成花版或者死机。
  L0 ^' c! D% m' W& N( j1 ?7 w深入研究,发现要以演示模式通关,需要做的事情还很多。! a& J0 I6 n7 B: T5 O6 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, 2025-2-25 16:15 , Processed in 1.126953 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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