设为首页收藏本站

 找回密码
 立即注册
搜索
查看: 646|回复: 9

[原创HACK教程] [FC][按键开关][修改教程]

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-5-18 23:00:46 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-5-19 10:51 编辑   Y; w. K0 |; {. i
2 ~. F4 @: [* m! C" C0 [
[FC][按键开关][修改教程]
  B3 K) H) Z9 u  e! c' z- H时间:2017.5.18; k% h/ S- N' m& \/ ?) V& x7 F
作者:FlameCyclone$ O( k( k/ O! O7 c
工具:FCEUX 2.2.3,Hxd 1.7.7
- O2 m4 X% ~+ s, d& e0 bROM一个:魂斗罗(J)_Mapper4.nes
3 `" T& N! m1 N/ a) X& |- N
5 L2 t) W  Z) U0 D4 G
4 O5 `& g$ d8 o7 p2 D5 I5 y修改思路:" s3 M. h0 F. ~$ |+ F
1.先在$C000-$FFFF之间找到一段足够写程序的空白空间,通常是一段连续的FF或者00,是在找不到可以切页(切有空间的bank,注意用完切回原bank)或者扩容后再切页。! V4 O- U. z+ A( ]; n* w
2.再查找一个系统里没有进行读写的内存地址作为开关,一般在$0000-$07FF之间查找。
. o! ^7 X# d8 F6 X4 ^7 r3.查找暂停地址,一般暂停和运行时内存中有一个地址会变化。1 m6 c& `4 @$ ]" x. z, o' {6 h
4.查找按键地址,找到单次按键,就是按一次变化一次的按键地址,按键一般有连续按键和单次按键。(如果没有单次可以自己想办法添加)。* G% @7 ]) c' s9 d5 r
5.写按键开关程序,程序思路:当暂停时执行开关程序,非暂停时读取开关的状态,开启就干嘛干嘛,关闭就干嘛干嘛。
( l5 e. f9 q0 f/ q4 t' I* ?% ]' K" a6.写跳转,将按键程序跳转到按键开关程序。
$ o. _; z+ m1 V7 K" ]8 I. V+ S! e, J- S0 |. B  g- m+ |5 n

) h5 n* N" u# _' H/ E+ e程序流程图(假设暂停后,按上键切换无敌锁定的开关):
/ o" I5 s. C! w2 s( T1 H
% R5 F: ^8 X& v' M
2 ^4 G, e9 x, k. h+ f4 S! }接下来开始修改:' ]  w6 `6 k' N) V1 K+ e9 F0 C
用FCEUX打开rom:+ {' c8 K4 ^0 {

/ X5 U) B2 G: m然后查找修改中需要的地址空间:
- p; F: ^4 c/ H* ?, L2 _$ L9 \这里我就不慢慢找了,直接给出:
- ~( C4 z% g2 f1 r" z空白空间:$FB30-$FBFF+ M/ H( t+ N' s: C5 E' o
, k4 r, q9 e$ c
开关地址:$07A0:
! J3 _$ `, A4 R+ M9 A6 c
( _7 A# Y% C8 N9 v0 V0 N暂停地址:$0025;& A9 q2 {& U- _# W) y& Z: G6 l- ^
单次按键地址:$00F5,X(X=0是为P1的$00F5,X=1是为P2的$00F6);, V9 {" Q" `) X0 l+ K+ F
按键程序断点:
1 T' d3 ^! \0 I$ b) Z0 A打开调试器,设置写断点$00F5:* n" Z( j7 |9 r+ T+ n" w% T
& c$ q7 ]% ~7 C. j4 U4 V

4 [$ [, j  D/ B" T3 k! j" C/ d% p
然后程序暂停了:
1 L. e7 n1 I& I" W) {" J0 p0 h4 ]$ N  r: H' R+ ^5 _7 q% L

. a1 y. L& u0 w# n由此知道按键程序断点在$C1EF;+ U; E$ ~' L! @0 P( Y5 t  t9 M
然后开始编写程序:& s) p9 Z; d, _$ ^6 B
推荐使用6502 Simulator编写,由于本篇教程需要的程序不算复杂,我就直接写机器码了:+ R) Z( M( y: T# s
打开Hxd,新建一个文件:
' `# Q( U) q2 n
) d" e3 O- B# H. t8 T7 i( u# G然后开始写程序:
8 L# o( _, t8 p" W' p  \95 F5 94 F1 48 A5 25 C9 01 D0 1F B5 F5 C9 08 D0 19 BD A0 07 29 08 D0 0A BD A0 07 09 08 9D A0 07 D0 08 BD A0 07 29 F7 9D A0 07 BD A0 07 29 08 F0 04 A9 03 95 B0 68 60
7 J# s- M9 F( W  p+ R/ b. [; T2 M) O# J% P" v- l% t) a" q
反编译解释:
4 \% m5 M) R' I6 z8 V5 z95 F5 STA $F5,X 送入单次按键
: u  y9 V+ A- L- J7 @94 F1 STY $F1,X 送入连续按键; o0 v5 A7 F+ q! H
48 PHA 累加器A入栈. e6 D. v/ D  w- Y
A5 25 LDA $25 读取暂停状态
. C! N* L( p! c8 n5 u4 vC9 01 CMP #$01 与暂停值#$01比较
" l+ x6 ~2 S+ C# |D0 1F BNE 不同则跳转到 开关读取
+ q$ J1 u8 p9 A' U( |+ L  i+ V; a3 C4 ]
读取按键值:
# n# b- F1 L3 O0 D3 S, dB5 F5 LDA $F5,X 读取单次按键键值9 U" X9 N5 H6 U$ {
C9 08 CMP #$08 与上键键值比较
' E% B& }; L5 W* H' n$ vD0 19 BNE不同则跳转到 开关读取
+ u# A; P$ B. P6 }7 q
4 I% Z( U% R  p& ^2 |' c+ a5 e2 f读取开关当前状态:
2 |  g7 ^- s) H. y8 |( T( wBD A0 07 LDA $07A0 读取开关数据
; X3 |4 n, p: L29 08 AND #$08 判断D4位是否设置
" Q; r# O& u, s! UD0 0A BNE 不同则跳转到 清除开关的D4位
. ]7 ?3 B; U9 i7 L' ?% L1 S3 ]- A; c
设置开关的D4位:
* J) }1 S: M; ]8 m9 RBD A0 07 LDA $07A0,X 读取开关数据
2 a% s4 G4 X3 n. d7 F; l8 {09 08 ORA #$08 设置D4位  A) z( o' x9 s) G7 m: {
9D A0 07 STA $07A0,X 送入开关3 B+ i6 X; A! w" r
D0 08 BNE 不同则跳转到 开关读取
4 ^+ j; a+ p1 K1 S  q; L8 q& ]4 y清除开关的D4位:
! g% G5 @" R( u( cBD A0 07 LDA $07A0,X  读取开关数据
/ N4 X3 b4 }- e8 Z5 Q1 @* [. j29 F7 AND #$F7 清除D4位5 G8 _% A( T- b) t2 b
9D A0 07 STA $07A0,X 送入开关
# K- T( G" j: k6 T8 B
, u* Z3 T5 `9 |- C1 h. p3 U开关读取:
+ a; t1 {0 X& d  i' z! BBD A0 07 LDA $07A0,X  读取开关数据( q; T4 u+ y& w" U! k! G
29 08 AND #$08 判断D4位是否设置
% D( d: O( g1 \$ Z% UF0 04 BEQ 如果未设置则跳转到 出栈并返回. J% [/ q* n/ y0 A" f! r( p
: A8 L! a" Y+ r
无敌锁定:  D# Y+ i/ ]+ B# G
A9 03 LDA #$05 取一个立即数#$03
- {' [9 q9 z8 y9 ~2 I; t: i95 B0 STA $B0,X 送入无敌地址& Z( D( M) t2 D* F$ A" T) _0 n
' w" y7 o+ g2 h; j" p7 w, _. M
出栈并返回:' o9 S4 u4 f- r5 K
68 PLA 累加器A出栈
% U# ^9 a* q, O" A  x5 v( g" [60 RTS 子程序返回
  b2 X. a5 B) U
7 P1 c0 o' O% b$ O4 h8 R" d- r  M3 E; z/ ^! u% I8 C
然后把程序粘贴到NES内存$FB50对应的ROM地址:
7 `) O2 ]- O; u6 G单击右键:  L5 A* b/ n* `5 N, n

( y3 z+ Q9 b1 P% d0 \* l6 D4 ~) y9 f; E) x- C4 f& p8 l

4 S% O4 i& F" o0 s7 Z4 B' x5 I
% @3 V" E7 A! s5 Q) E: l
然后跳转到按键程序地址$C1EF对应的ROM地址:
% ?7 k' V3 {4 m8 l5 V8 P% W; J- h
Ctrl+A:
- K6 c' j5 [& {" T* z8 p. F
! ~' }8 F0 ]4 Q4 @: j1 h7 o, ]! l! I7 k8 a: z, @
0 u# |/ i9 E) [/ O5 a
% {+ v# b- [- u9 ^7 q3 B6 m: M% Y
单击右键:
) K$ u3 j1 L' j6 b6 `: ^+ Z- x/ Y, D8 x* I7 F. {) s, z

8 w- Z) _+ K0 ~* U6 m  l3 Q0 b" s2 S把源指令修改为20 50 FB EA8 ^1 A/ e+ B! E! F% h
JSR $FB50 跳转到$FB503 Z0 H4 x" Z4 O
NOP 无动作9 P0 a  i: L) }7 q, |1 C
注:
: N+ l7 z# w) @" O5 |如果不修改最后的F1,那么系统会把F1当做操作码来执行,后果不可预知,所以改为NOP才正确。. C: C- [% g: J: w0 ]$ z
8 n* e) ]  j) m7 M. t. a
然后双击断点取消断点,再点击运行按钮继续运行:" y/ p5 V5 |8 k6 m/ l/ F
# l2 ]( H1 R8 \; M
暂停后如下:. A+ _2 Z7 X! L2 f' \6 o

1 t& D% b$ M7 y! t- g; |& W按一次上键:# J% E. s# O% a8 t
无敌马上生效了,取消暂停后也一样保持无敌不会掉:5 O8 d. q- |8 x- U0 T8 y3 ]

+ o* U5 ]! A: m暂停后然后再按一次上键
1 M& j# _. i! U' V" H/ E2 h此时无敌还没有消失,因为暂停时无敌时间不会减,所以不会消失.
8 s. I5 E8 {- ^* l" V1 ]4 a; ?6 b) `  z
按下开始键取消暂停:  p8 N, G) A+ N
马上无敌就失效了:5 A9 l( V/ P: k$ ?4 M7 h
% F. z; d: ]4 B' S6 u
9 A8 V9 |7 e9 P& p! u& c
测试成功,没有什么BUG,接下来保存文件:
8 h# S1 Q* Z) L: A. b5 Y& i
2 w' E+ N1 }/ ?1 v* K/ z1 C8 O
: t7 ~' v* K, C& ]# `* Y! a到此为止修改结束。8 d2 ~" F: g; {' i
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

1

查看全部评分

[发帖际遇]: yandagui整理箱子竟然翻出了 7 个 柠檬. 幸运榜 / 衰神榜

签到天数: 3018 天

[LV.Master]伴坛终老

发表于 2017-5-20 11:36:59 | 显示全部楼层
非常给力的按键修改教程
回复

使用道具 举报

签到天数: 1279 天

[LV.10]以坛为家III

发表于 2017-5-20 17:39:57 | 显示全部楼层
大学生就是头脑厉害!
回复

使用道具 举报

签到天数: 39 天

[LV.5]常住居民I

 楼主| 发表于 2017-5-20 21:15:54 | 显示全部楼层
我发现付费没人看,一免费就有人来看了,唉....................
回复

使用道具 举报

签到天数: 69 天

[LV.6]常住居民II

发表于 2017-5-20 22:58:18 | 显示全部楼层
感谢发布教程!
[发帖际遇]: zhaoyunchun摆地摊卖菜,占道经营被城管罚款 6 个 柠檬. 幸运榜 / 衰神榜
回复

使用道具 举报

签到天数: 2060 天

[LV.Master]伴坛终老

发表于 2017-5-21 00:35:01 | 显示全部楼层
好复杂啊、、、、
[发帖际遇]: liujunbtx 打扫环境卫生,被奖励 2 个 柠檬. 幸运榜 / 衰神榜
回复

使用道具 举报

签到天数: 1524 天

[LV.Master]伴坛终老

发表于 2017-5-21 18:50:43 | 显示全部楼层
支持一下,很好的教程!
回复

使用道具 举报

签到天数: 20 天

[LV.4]偶尔看看III

发表于 2017-6-24 22:33:46 | 显示全部楼层
高手。。。。。。。。。。
回复

使用道具 举报

签到天数: 8 天

[LV.3]偶尔看看II

发表于 2017-6-25 08:53:32 | 显示全部楼层
技术活。。。。。。。。。
回复

使用道具 举报

签到天数: 30 天

[LV.5]常住居民I

发表于 2017-7-25 23:56:41 | 显示全部楼层
感谢楼主分享,回复看一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|国治模拟精品屋 ( 沪ICP备15012945号-1 )

GMT+8, 2026-3-27 07:30

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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