EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2015-10-15 08:53:29 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2015-10-28 19:02 编辑 ; Z& S5 ^; B$ o$ m  Z$ v* H1 g4 w4 E
. g4 [. M* ?3 t& ?/ X0 s, w
FC自动演示修改教程, R) d% a4 O( g/ h; s4 l) S6 R
作者:火焰烈旋风" g! \: d9 Z! p
工具:FCEUX中文版(www.9553.cn搜FCEU即可)
) S0 F" M+ |1 `4 `1.找按键地址:, x1 s# h2 K- b$ E0 P' p
    首先,我们打开FCEUX,再打开魂斗罗美版,进入游戏无动作,打开FCEUX的工具>作弊,若左下角的"活跃时暂停"没打勾请点击打勾,游戏暂停了,点击中上部的"重设",在已知值输入后输入框中00,点击按钮"已知值",此时搜到大量数据为00的地址.单击FCEU窗口,游戏正常运行,按住一个按键不放如上键,点击作弊窗口的">",游戏暂停了,此时剩下几个地址,再单击FCEU窗口,按住两个按键如上+选择键不放,点击作弊窗口的">",游戏暂停了,只剩下几个地址了,再单击FCEU窗口,不要按任何按键键,点击作弊窗口的"已知值:00"最后剩下两个地址F1,F2,点中其中一个,再点左下角的"添加",发现按什么按键人物都不能动,说明这两个地址就是按键地址,双击左上部的锁定地址,前面的"*"号消失就解除了锁定,并且通过调试知道上=08,下=04,左01,右=02,A=80,B=40,选择=20,开始=10.
( @7 M) e# J9 j, T% k2.找演示时按键的数据来源:, i, A; o& D1 O2 v' B- k* [1 \
    既然知道了按键的地址,那么就要看演示时是什么改变了这些值.点击FCEUX的>游戏>重设,等进入自动演示时,我们打开打开FCEUX的调试>调试器,在右上部分点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入F1(我们找到的按键),将输入框下面的"写"打上勾,CPU也打勾,点"确定".此时调试窗口出现如下指令:5 {% V. b! z8 U' q6 ~
07:C38F:94 F1     STY $F1,X @ $00F1 = #$01
. P3 M: ?, E# V7 X$ Y3 M" p07:C391:94 F9     STY $F9,X @ $00F9 = #$00
! K( P* Z7 U- D4 i# b# U07:C393:CA        DEX
, ~% z6 m8 ~4 U4 P8 K07:C394:10 F0     BPL $C386
9 H' L& N6 L9 i3 \  W: M$ |07:C396:60        RTS
! g4 d7 O' I2 U我们点击"运行"左边的上拉按钮上拉,看到如下指令:
5 i/ l* M/ w; T7 e, w07:C378:A5 1D     LDA $001D = #$07- k1 j. Y8 P" i1 m8 J4 X2 n
07:C37A:29 04     AND #$04
' f* T+ A7 f2 G07:C37C:D0 06     BNE $C384
+ |* m: ~; d$ x' K8 G07:C37E:A5 04     LDA $0004 = #$00; C% W7 E! a& ~8 G1 i1 V" t
07:C380:05 05     ORA $0005 = #$00( D* ]: o7 L9 Y* Y$ k
07:C382:85 04     STA $0004 = #$00
$ H# F) G' b( k4 G& n07:C384:A2 01     LDX #$01
1 M, P2 p' P  M  K# r07:C386:B5 04     LDA $04,X @ $0004 = #$00
. r( m5 C: e+ E9 g07:C388:A8        TAY
, R7 _# J1 f, a# Q* l; R* J07:C389:55 F9     EOR $F9,X @ $00F9 = #$00# ]  d+ i" u# D7 W
07:C38B:35 04     AND $04,X @ $0004 = #$00
+ r) C7 h# J% b* B% o( F# M% y5 Q07:C38D:95 F5     STA $F5,X @ $00F5 = #$00
( t% F" l% l' n; m( k% Z$ |07:C38F:94 F1     STY $F1,X @ $00F1 = #$01' Q8 o9 g: I+ C  y3 x6 B( \
07:C391:94 F9     STY $F9,X @ $00F9 = #$007 g7 I4 A( i( u7 r  F" n, Q
07:C393:CA        DEX4 ]6 H- K7 L. q, W6 G
07:C394:10 F0     BPL $C386
8 z7 F- Y: D5 |+ G2 H) I& a! T07:C396:60        RTS# R+ b6 @/ \( L% r: L9 L( L( V& u
由于演示的数据存放在某处,然而这里并没有读取某处的值送F1的指令,所以很可能不是我们要找的指令,点击"断点"窗口旁边的"运行",窗口中出现如下数据:+ G- N* H' X. |2 n
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
+ y! X5 E' c: [1 X. l& Z+ ?05:B3A5:A5 2E     LDA $002E = #$C8
# ~% J( n. Z% A; S9 L) m05:B3A7:C9 50     CMP #$50
' J9 C# w& o* q3 @( l05:B3A9:90 20     BCC $B3CB4 X$ L9 ^% e/ n: ?3 h9 E
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00
; H7 Y4 e' X6 P, e3 _05:B3AD:29 0F     AND #$0F
' \4 n9 O2 v% B7 P05:B3AF:C9 01     CMP #$01
  C3 p* c  x) U1 d5 F# e% G( ~05:B3B1:F0 04     BEQ $B3B7; W: u/ }+ Z! q! K" _
05:B3B3:C9 04     CMP #$048 ~2 R- d0 P! S- j2 y' P  C0 o: f# o* [  N/ {
.........
4 {! d8 z4 k* Z* W9 u我们点击"运行"左边的上拉按钮上拉,看到如下指令:
8 d" {9 e- g0 P2 Y% v05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
, y+ k4 F% ^* U* r2 ~05:B3A1:95 F5     STA $F5,X @ $00F5 = #$015 d6 t; P  _6 I2 {0 z% ~
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
+ k! l+ [) |' J7 h$ d05:B3A5:A5 2E     LDA $002E = #$C8. X5 o, e( j4 O$ _$ Q  M
05:B3A7:C9 50     CMP #$502 ~+ w  a5 _3 P4 E# D0 H/ R: j
05:B3A9:90 20     BCC $B3CB5 m& g' D1 X) [; v0 J( Y
05:B3AB:B5 AA     LDA $AA,X @ $00AA = #$00( M. c1 X/ ~" j3 h5 h$ |( L
05:B3AD:29 0F     AND #$0F
- Q' G' y. H, G; |0 s* |% C8 ~) h看到0 a& E9 i7 p3 {1 }/ k. M: l
05:B39F:B5 5C     LDA $5C,X @ $005C = #$01
/ Y0 G6 B9 w! ]* x4 B, H0 @/ c/ W05:B3A1:95 F5     STA $F5,X @ $00F5 = #$01
8 Y' q) Y* a1 K* y7 R05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
, g$ Q: P% n0 Z& K没有?这个说明F1的数据是从地址5C送出得到的,说明我们要找到存储演示按键数据必须从地址5C入手.
# H0 n( k- Q0 @9 G% z    接下来调试器,双击取消F1断点,点击"断点"下的"添加",此时弹出"添加断点"窗口,我们在"地址"第一个输入框输入5C,同样"写"打上勾,点"确定",一会出现如下指令:
" b8 T/ z4 A' d) f& K! w+ w05:B392:95 5C     STA $5C,X @ $005C = #$01
. a( P3 s' y1 O/ x! _05:B394:C8        INY6 A% I5 ]5 p) k
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$099 ?+ i# x2 I( R0 w+ @
05:B397:95 5A     STA $5A,X @ $005A = #$00
1 u/ b' M+ c, u/ T# P7 M2 P05:B399:C8        INY
7 W0 i; j1 T8 W6 \. g& }# [05:B39A:98        TYA
- Z1 A& j* z6 Z9 G然后我们再上拉,得到如下指令:. _, H& ]1 E: ?" C) l
05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$09
% n: L6 o- e" A$ u05:B38E:C9 FF     CMP #$FF) S- v! y* `( C1 V
05:B390:F0 3D     BEQ $B3CF
3 w+ |  s- D. _05:B392:95 5C     STA $5C,X @ $005C = #$01" }2 Y4 c1 Y. B2 r& m3 M0 c# Q
05:B394:C8        INY9 o! s. x  B  \/ @  }1 I
05:B395:B1 08     LDA ($08),Y @ $B3F2 = #$09
, c# e3 i0 d2 J. l: M05:B397:95 5A     STA $5A,X @ $005A = #$00( b3 m+ ^1 `) {! B4 c0 m9 D: i
05:B399:C8        INY
" U; j6 F9 Z0 l) S9 L$ P05:B39A:98        TYA
* i* Y0 Q* T( s& G看到05:B38C:B1 08     LDA ($08),Y @ $B3F2 = #$095 q, f2 L7 P! J( e8 P7 \8 e
没有?说明现在5C的值来源于变址得到的$B3F2,哈哈,演示按键的数据找到了,在游戏CPU的$B3F2附近.5 g: i0 |# k: C7 u" e) C3 O
3.修改演示:7 j% x+ e8 m8 d7 S3 z
    打开FCEUX的调试>十六进制编辑器,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3F2,此时黑色光标标记的地方就是CPU的$B3F2,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了.
/ ]; y1 l% u9 [( l. h& \# g    我们要修改,必须从开始演示的第一个演示按键开始,接下来去找到它:
0 k, L; m7 d6 Y* i! `1 s, x" M打开FCEUX的游戏>重设,此时游戏暂停无状态,点击调试器的"运行",出现黑屏,再点击两次"运行"游戏运行了,过一会又暂停,再点击两次"运行"游戏运行了,出现背景画面时暂停了,调试器窗口中出现了如下数据:
  E: \7 L) y0 u# m8 c05:B392:95 5C     STA $5C,X @ $005C = #$00, X8 e1 g9 Q) P# b
05:B394:C8        INY
' d: C9 `0 D1 b$ ?05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00( f( `/ N  U0 i5 P8 U
05:B397:95 5A     STA $5A,X @ $005A = #$00( o) ^9 L+ \! T5 f5 d$ b
05:B399:C8        INY
" X7 h5 m  O& d" w' t' z2 o05:B39A:98        TYA  l4 h) ~+ X( x6 s, {
我们上拉看到了:; h6 |9 ^+ [/ X6 @3 `# i% m
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00
7 Q  U% {3 G' b; M, g2 o* y05:B38E:C9 FF     CMP #$FF; |4 x, x( r$ Z; c4 ^
05:B390:F0 3D     BEQ $B3CF
  L' N- Q( y) v  Y; M! T+ f05:B392:95 5C     STA $5C,X @ $005C = #$00: X. I: K% y" X
05:B394:C8        INY: N5 W* e5 _9 u1 \* ?. O2 E* K
05:B395:B1 08     LDA ($08),Y @ $B3DE = #$00
: |# f/ A( @& N6 ^: U05:B397:95 5A     STA $5A,X @ $005A = #$00# \/ A* S  G* k: O
05:B399:C8        INY
& n% I% \) A/ f% D5 ^( x3 q5 t  n2 b05:B39A:98        TYA: M& `7 k! ]+ Z1 K' ]# i
看到6 p, f( a/ Y6 U
05:B38C:B1 08     LDA ($08),Y @ $B3DE = #$00, _6 l8 J- A2 j  T7 {) [
没有?它应该是第一个演示按键,接下来进入十六进制编辑器,点击查看>NES内存,此时切换到NES的CPU内存,按Ctrl+A或点击十六进制编辑器>转到地址,输入B3DE,此时黑色光标标记的地方就是CPU的$B3DE,右击黑色光标>转至ROM文件中对应位置,此时已转至ROM文件中对应位置了,这里就是演示按键的开始地址.
$ H2 V/ {  W% \9 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(时间).......以此类推,判断根据:
8 k. z. B: [0 j, z4 j! x( C05:B371:B5 5A     LDA $5A,X @ $005A = #$7F/ q# ~7 \+ z4 [. t5 d: g1 ?6 a
05:B373:D0 28     BNE $B39D(如果5A=00,那么就会跳过28字节执行2A递减的指令)
/ u) S0 R8 h' c2 ]7 }+ s4 p( ^8 l05:B375:A5 30     LDA $0030 = #$00! F% l# f$ n" F; F. U
05:B377:0A        ASL4 W* ]! B* w: K# b% M
05:B378:0A        ASL
+ E8 H8 Y6 J* h: V3 {( T05:B379:85 08     STA $0008 = #$29# b! M+ G3 C& ^, S; Q1 N
05:B37B:8A        TXA7 d9 x; N4 ^( u- I8 u/ L
05:B37C:0A        ASL
, W, M! S! N" Q) o; @2 ^' [- G05:B37D:65 08     ADC $0008 = #$29) q1 y0 a  F( ^/ w
05:B37F:A8        TAY" p2 x0 x$ h0 Z
05:B380:B9 D2 B3  LDA $B3D2,Y @ $B3D7 = #$B4
" p" p  g% \* ^" S4 `$ X4 n05:B383:85 08     STA $0008 = #$29
1 d  h' M, W- ]4 d+ G05:B385:B9 D3 B3  LDA $B3D3,Y @ $B3D8 = #$FC5 G$ m5 `( p0 W" g2 K
05:B388:85 09     STA $0009 = #$B2
+ d8 g8 h6 ^0 W9 K5 L" Z05:B38A:B4 5E     LDY $5E,X @ $005E = #$02. ]9 A& Z8 b+ }" ?& u+ g5 m
05:B38C:B1 08     LDA ($08),Y @ $B22E = #$10- n5 G/ |: Q9 q
05:B38E:C9 FF     CMP #$FF$ ?  D, q2 m! E7 O- {; H
05:B390:F0 3D     BEQ $B3CF; D) Z9 b# J! F4 D9 b( ^( W) ^8 y
05:B392:95 5C     STA $5C,X @ $005C = #$00% I& e) u$ [& ~$ F$ d
05:B394:C8        INY
( u* A* U8 m" L: c05:B395:B1 08     LDA ($08),Y @ $B22E = #$10
  d" u% @4 A& H( U/ v% Z7 H) {05:B397:95 5A     STA $5A,X @ $005A = #$7F7 r" @. z0 ]' m0 t/ J
05:B399:C8        INY* m0 ~! R/ Y# T9 p* J$ `
05:B39A:98        TYA
$ J5 I8 n, k' ?05:B39B:95 5E     STA $5E,X @ $005E = #$02
2 A# S$ J, _- e# e8 B: B05:B39D:D6 5A     DEC $5A,X @ $005A = #$7F(5A递减)* J& B9 S( |/ s6 ~1 _
05:B39F:B5 5C     LDA $5C,X @ $005C = #$000 Q; a0 J: o* X* }
05:B3A1:95 F5     STA $F5,X @ $00F5 = #$00. D8 z1 l  y5 s
05:B3A3:95 F1     STA $F1,X @ $00F1 = #$00
% ^0 Y1 \3 T8 ]) g; t* r  X0 P" p
. ]; R8 x* {; t2 J由于技术原因,本人以前只能改到打完三关,因为间址LDA ($08),Y得到的地址发生改变,那时本人无能力了.现在全部完成,用到其他方法们再次难以叙述了
; H6 c7 B9 X+ L/ z6 `# i可以下载玩一玩
! D' k! ~! m, W# }; K6 Shttp://pan.baidu.com/s/1bnE0AwZ

签到天数: 1243 天

[LV.10]以坛为家III

发表于 2015-10-16 08:11:53 | 显示全部楼层
我以前曾经也想改这个,看看游戏是否能演示到通关。( o4 [, R- b8 S9 o( Y  x3 F  Y$ ?- e
首先考虑的是将游戏改成无敌版,演示时,到背景断层处,主角还是会掉下去死了。
! p9 s! Y# `) ^7 ~后来尝试其它修改,但是偶尔会造成花版或者死机。
  Y, g8 q+ f" g+ X- Z! }# Z深入研究,发现要以演示模式通关,需要做的事情还很多。
, G5 p5 Q0 a$ W" j! C因为太麻烦,也没太多时间弄这个,最后放弃。
[发帖际遇]: 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-5-5 11:29 , Processed in 1.062500 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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