EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑
3 R" t/ ]) \" h2 E3 r; O& C! ^8 I1 ]) V$ k
FC自动演示修改教程$ H7 w3 a% M% m
作者:火焰烈旋风
6 N$ i+ M5 B1 p工具:FCEUX中文版(www.9553.cn搜FCEU即可)
7 j+ s8 |, Z) J1.找按键地址:" h) g" c% n: ~& {6 P- G3 B$ d% e
    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.  j0 l6 R* _( p6 C+ s( m
2.找演示时按键的数据来源:
8 A  K7 @. d$ w- G3 M7 @" [# A    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:
; C" I, X( `5 ?" l: |0 p- n07:C38F:94 F1     STY $F1,X @ $00F1 = #$01) L! K  b% e7 ]/ j
07:C391:94 F9     STY $F9,X @ $00F9 = #$00
1 P9 O$ b! o. R; B4 w; x1 L. u07:C393:CA        DEX4 e: [! G# A$ _3 {9 `$ x; C/ F  e5 ~( Y
07:C394:10 F0     BPL $C386
1 _2 n+ ?6 p( `4 k07:C396:60        RTS8 A4 d1 [" o$ G6 T% Z  H% z& K
我们点击"运行"左边的上拉按钮上拉,看到如下指令:" v" h; S! P- r
07:C378:A5 1D     LDA $001D = #$07! s  T- h) r, Z' j- q# c
07:C37A:29 04     AND #$04
0 f  m4 c7 z3 C0 s0 f07:C37C:D0 06     BNE $C384; s: t: K* ^- t5 G
07:C37E:A5 04     LDA $0004 = #$00
; k# ~0 E: p5 t! n( k2 y07:C380:05 05     ORA $0005 = #$00
9 @% [- g2 u& T) j5 x2 ~07:C382:85 04     STA $0004 = #$00
4 Q& b% i& \8 P07:C384:A2 01     LDX #$01
. ~4 ?/ \, X0 [07:C386:B5 04     LDA $04,X @ $0004 = #$00
/ A6 @9 f0 U, c07:C388:A8        TAY7 o9 c( |- t* E- s1 z: C
07:C389:55 F9     EOR $F9,X @ $00F9 = #$000 H5 j! V" b2 G/ l9 c
07:C38B:35 04     AND $04,X @ $0004 = #$00
& j; i" Z% j# Y8 V& J07:C38D:95 F5     STA $F5,X @ $00F5 = #$002 E) s' x5 Y& s$ l( u8 u1 c2 I
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
  R) L$ g9 W5 o; b07:C391:94 F9     STY $F9,X @ $00F9 = #$004 U# Z+ F; D! y/ i- g2 z" u3 r
07:C393:CA        DEX
0 }$ @8 E2 P: ]8 G07:C394:10 F0     BPL $C386  ]/ i5 r) ]9 o) d& n, y3 B6 I5 k
07:C396:60        RTS
& R, m3 b& n0 w由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:- S* y; o' i3 z, d  j
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$003 d8 u4 H, Y& Q. `' [' }$ l) ]
05:B3A5:A5 2E     LDA $002E = #$C88 U$ d, X+ s# u
05:B3A7:C9 50     CMP #$50
" w( {3 J' E! u1 d. q3 X5 I, m3 R05:B3A9:90 20     BCC $B3CB6 p' V/ S# t6 c& v' i( z
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00# e8 E" ?' a. ^
05:B3AD:29 0F     AND #$0F+ d  p( y: t. w% p- M0 Z
05:B3AF:C9 01     CMP #$01# G$ c  P, k6 \1 W# C0 m
05:B3B1:F0 04     BEQ $B3B7
2 M# V8 y- t8 `. i) f  G3 Y05:B3B3:C9 04     CMP #$04
. N7 W) X8 V8 V, |6 n.........5 o; A3 q6 R0 u2 M/ r
我们点击"运行"左边的上拉按钮上拉,看到如下指令:
, p' R2 ~9 K0 x* m$ |; J05:B39F:B5 5C     LDA $5C,X @ $005C = #$01  Y. i# l9 u" G$ j' e  w! l
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
9 Q7 H) K( f$ Y+ s05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
/ k1 y0 T. f8 T: A& w  c; Q05:B3A5:A5 2E     LDA $002E = #$C8
+ \0 ^# v/ b; b9 M05:B3A7:C9 50     CMP #$50
, p$ f, h+ e3 J3 ~& P2 r05:B3A9:90 20     BCC $B3CB$ s2 K: R0 {0 }. d" t/ |- B
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00/ F$ {  A7 e  V/ }
05:B3AD:29 0F     AND #$0F
6 S. K' _& a2 {6 [" Q! ?& `# P% i# s看到* F: J+ J% a4 m
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01* E/ b6 ]( S; c- l( \
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
6 q4 J! S- w' B05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00# a5 P6 I3 ~/ }3 G" c+ r1 E
没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手./ |) E) L' s; N! ~
    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:
. l: B" l) K9 t9 C! E' S05:B392:95 5C     STA $5C,X @ $005C = #$01
, ~4 c; r7 ?6 q) y6 P( f05:B394:C8        INY
( j, \) E2 O! F/ V05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09, U& k# f& }  m
05:B397:95 5A     STA $5A,X @ $005A = #$00" a- E% o& @; S+ O6 L
05:B399:C8        INY
9 ~5 H1 `) x4 N1 v05:B39A:98        TYA) n6 }  [, E+ P( H7 W
然后我们再上拉,得到如下指令:- \; l7 _" Z' K7 m; t9 I$ V: U$ M: h
05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09
, ^( V7 u2 I) w8 m) O) w, z* o$ S05:B38E:C9 FF     CMP #$FF6 X& m; w# v% x7 y- j
05:B390:F0 3D     BEQ $B3CF" z, w9 D+ [( U5 U" h& d
05:B392:95 5C     STA $5C,X @ $005C = #$01
% M" Y8 w, R: ?9 H- M05:B394:C8        INY
6 L1 X- x% P0 L1 V05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09( o8 o/ k7 o, r6 M& c
05:B397:95 5A     STA $5A,X @ $005A = #$00; W9 [) m# j: {5 e. R
05:B399:C8        INY2 ^/ R/ |6 E  G- G
05:B39A:98        TYA5 K1 h( o" O+ \
看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$099 B& Z6 ~9 z2 z8 O/ b, W
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.
* g- ]8 I- U. v& N/ S6 H3.修改演示:
8 C3 Z9 i" ], x6 P    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了./ z+ X3 f  w$ T5 R& G
    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:* s0 B" R# M+ M" g# n
打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:( `0 |( r$ g+ c) \
05:B392:95 5C     STA $5C,X @ $005C = #$005 B9 n" A) d. Z
05:B394:C8        INY
0 q+ c5 b0 N5 v% F7 ?' B05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
. o5 ~; \$ Q, [% \, @9 |05:B397:95 5A     STA $5A,X @ $005A = #$00
: Q& E) T; e* g2 B8 g! T( a: N05:B399:C8        INY: `. k* g6 l* P" I
05:B39A:98        TYA4 l3 z* |" G" [' S
我们上拉看到了:
; a- ~2 i4 J( D+ Q% L05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00! x4 w. I  C9 l" \+ p
05:B38E:C9 FF     CMP #$FF
0 }- z+ R; c! q( [+ `( |05:B390:F0 3D     BEQ $B3CF! I/ F3 H% q- j$ N0 F9 I
05:B392:95 5C     STA $5C,X @ $005C = #$00% W" }% j' J, h% G' K
05:B394:C8        INY4 ]6 y% p! n8 Z+ S& k
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$000 Y7 K) C/ }8 f$ z2 \/ h" g
05:B397:95 5A     STA $5A,X @ $005A = #$00
7 a& i8 }" o8 b8 g3 j05:B399:C8        INY4 y* n& `( Z  S% k7 e" |
05:B39A:98        TYA
2 T) j6 g) t& r: J6 {7 P/ U2 q看到4 E( O; A1 V8 Q
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$006 \0 L" W3 x0 |1 z. O0 ?' Y+ \6 |
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.  O3 N! A2 G, U' [( }; H5 G/ 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(时间).......以此类推,判断根据:- m% R" B( k1 S! U( A9 o
05:B371:B5 5A     LDA $5A,X @ $005A = #$7F- G& v0 @* [4 i! L  s' n: y9 m/ J
05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)* C5 E) W2 g9 r# t% N
05:B375:A5 30     LDA $0030 = #$00
! v+ G, j8 a: g4 S5 ^05:B377:0A        ASL/ _- e% r) K. K; v% D3 x
05:B378:0A        ASL
2 ~1 w5 {, |3 T& y) X- ?  F05:B379:85 08     STA $0008 = #$29
+ o2 i3 l! \) ?9 `9 ]$ u! K  u7 p05:B37B:8A        TXA$ K/ d. j9 _  Y# k( R4 d) J  |4 @
05:B37C:0A        ASL, E8 d: ~8 `: C% w3 Y
05:B37D:65 08     ADC $0008 = #$29
; T3 g5 q6 X+ o# d" T2 G( F1 b: c05:B37F:A8        TAY8 p7 D/ \2 A1 X. l' u6 W. Y$ w1 u3 e
05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4; R. w7 L: T1 b: k
05:B383:85 08     STA $0008 = #$29
- G8 h. ?' {- p  O- ]1 f# L1 k05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC" \9 H$ R& V1 d2 N4 H9 |% u
05:B388:85 09     STA $0009 = #$B2( e# m  l* F- T
05:B38A:B4 5E     LDY $5E,X @ $005E = #$02/ _) e4 {% t# x8 s
05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10- X! L# j+ d  Z1 E1 v
05:B38E:C9 FF     CMP #$FF1 G* }9 l, Y$ y
05:B390:F0 3D     BEQ $B3CF+ K$ ]& V% Z4 V: g
05:B392:95 5C     STA $5C,X @ $005C = #$00
7 S. O0 h& r& z3 p- N05:B394:C8        INY; C0 i" C9 g0 f! z
05:B395:B1 08     LDA ($08),Y @ $B22E = #$10
0 Z& B/ e1 ]8 Z1 t05:B397:95 5A     STA $5A,X @ $005A = #$7F
! O2 Y  S( E% |- _& Q: u5 s05:B399:C8        INY# B/ c8 L2 t; F8 w  F
05:B39A:98        TYA% O6 R! L+ B: G
05:B39B:95 5E     STA $5E,X @ $005E = #$02, t5 m- ]( |% e
05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)! j& x2 ~" K+ E2 L# Q
05:B39F:B5 5C     LDA $5C,X @ $005C = #$000 Z( L" t. y! v6 V/ T
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00
# z1 J" W% d0 F  ^4 d; b05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00' Y8 b& o: A/ Q/ Y; f+ R' W6 ^. i

. \5 |, O0 b' J$ G9 d/ |( X由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
3 I) P$ d; q# @3 _6 K可以下载玩一玩! D7 e7 ~5 T& Z+ x
http://pan.baidu.com/s/1bnE0AwZ

签到天数: 1310 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。- z/ {0 ~: ~7 A- _9 x
首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。
  a: r" i# z3 O/ r% G, l$ _. |: C后来尝试其它修改,但是偶尔会造成花版或者死机。4 A0 V( S) I$ z! E1 r/ F
深入研究,发现要以演示模式通关,需要做的事情还很多。2 A+ L9 {. U2 M" h6 h0 p/ 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-10-6 21:28 , Processed in 1.063477 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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