设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-5-18 23:00:46 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-5-19 10:51 编辑
1 I' M( V5 w+ a# j9 y( G; C  ~% @
[FC][按键开关][修改教程]
' N7 h8 L% c5 ]1 S$ O时间:2017.5.182 ]& ^. }, i  X& w; a
作者:FlameCyclone: z* ^) X( p  \% }& w1 [8 r# ~9 `! F
工具:FCEUX 2.2.3,Hxd 1.7.7
- T6 T* r& A) ]7 \! {ROM一个:魂斗罗(J)_Mapper4.nes
6 ?& b: b% `6 H% k  H/ ~) G' \# J6 L6 g' ?1 `) ]) L2 [( a
  T/ B6 b7 A4 X- E8 Z
修改思路:. Y. h5 ]0 p3 r/ v
1.先在$C000-$FFFF之间找到一段足够写程序的空白空间,通常是一段连续的FF或者00,是在找不到可以切页(切有空间的bank,注意用完切回原bank)或者扩容后再切页。
$ r3 J& n8 }+ s5 ~& W- [: ]2.再查找一个系统里没有进行读写的内存地址作为开关,一般在$0000-$07FF之间查找。
1 ?' L* X3 P7 f& |3 n; g+ b# E7 q3.查找暂停地址,一般暂停和运行时内存中有一个地址会变化。
' f3 u/ b3 |- I1 j( |$ m4.查找按键地址,找到单次按键,就是按一次变化一次的按键地址,按键一般有连续按键和单次按键。(如果没有单次可以自己想办法添加)。4 F( x: L. y. g5 ~3 \
5.写按键开关程序,程序思路:当暂停时执行开关程序,非暂停时读取开关的状态,开启就干嘛干嘛,关闭就干嘛干嘛。
( u; x7 g' G) j6 l, _4 r  d/ _6.写跳转,将按键程序跳转到按键开关程序。
: G& s! \# q. A1 a# w
0 [$ q& L& G. ^* _, F/ J% P0 ]6 o/ p9 y0 q- G- y* P# S) n
程序流程图(假设暂停后,按上键切换无敌锁定的开关):+ h& `. P9 T  j# @, Q

8 U8 z  X, M+ @2 }5 \, H6 [; g; h; A/ g2 Y' ~$ C
接下来开始修改:- D6 l; A  F% C
用FCEUX打开rom:
. V3 b) w4 I6 M* B/ {9 z/ N$ P- ~2 _, O& y$ B4 p5 r# ~. H
然后查找修改中需要的地址空间:
& Q6 B- v  I$ q: Z, g这里我就不慢慢找了,直接给出:
$ h$ a% F3 u2 r) y; V, C* k( `) q; q空白空间:$FB30-$FBFF
. I7 i' l1 C$ p0 Y, P& x8 g; M! [1 ?. a# [/ i
开关地址:$07A0:' l/ n' i2 f9 P# V

+ o0 j* M2 y1 D9 M( C, `2 U暂停地址:$0025;
% f/ I- Z7 b8 p: ^9 b0 P单次按键地址:$00F5,X(X=0是为P1的$00F5,X=1是为P2的$00F6);( }) N( A# @' V8 x; r
按键程序断点:
* s% n4 j/ P; c3 |打开调试器,设置写断点$00F5:+ t) _- I: L2 f
9 o# q# \5 Q. X$ z6 Q8 ~$ v

% I  v( C. a% D+ \% K- w( P% M
! s4 H7 W# ]4 G$ Z然后程序暂停了:
* D- w5 R) U8 l8 N9 y; G9 x& g0 c# j/ {% X( f/ d
% Z$ g+ g! K0 x. W
由此知道按键程序断点在$C1EF;
3 O# w, @  b5 o( }然后开始编写程序:
+ C& V- y$ B) @: t' y推荐使用6502 Simulator编写,由于本篇教程需要的程序不算复杂,我就直接写机器码了:) o- f  o( D8 g1 P; X6 h
打开Hxd,新建一个文件:, z  ?4 Z% y' v5 e

0 h' s# w6 }6 ^/ p" ~然后开始写程序:* b0 b4 a, I/ x% V" n" ]- X
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
. x* o! q8 j" q
! ?3 P$ Q3 P% h反编译解释:
) @# P; H7 c3 z) v% X! t! R95 F5 STA $F5,X 送入单次按键
" W" h, E3 w1 h, Y94 F1 STY $F1,X 送入连续按键
' p" E3 d$ G$ _: h/ f7 U48 PHA 累加器A入栈
8 H3 \' @3 I/ [+ p& t- \7 QA5 25 LDA $25 读取暂停状态5 p3 N$ K( @! Z5 k# Z/ k
C9 01 CMP #$01 与暂停值#$01比较
! W3 H" Z5 U- c# XD0 1F BNE 不同则跳转到 开关读取, a2 k3 c" ~. D

+ q1 h  E1 R7 ^) Z7 w* o读取按键值:
" X& {9 c/ m3 `! p/ D$ [4 X' iB5 F5 LDA $F5,X 读取单次按键键值
  t; Y; Z. R8 T# _+ RC9 08 CMP #$08 与上键键值比较
) u5 [" \. e. s2 y2 d1 g6 uD0 19 BNE不同则跳转到 开关读取
# V8 n- X6 e$ S1 ~  y' S% |& W: P+ O; h! E) G& i
读取开关当前状态:
1 Y- j+ V; x: XBD A0 07 LDA $07A0 读取开关数据
- |) b* Z; P) w9 t5 p/ p! h: |29 08 AND #$08 判断D4位是否设置; o# D6 P7 h+ ~8 G* {  ~
D0 0A BNE 不同则跳转到 清除开关的D4位
( g. h$ l. f: s( m1 r4 K7 W4 s! ^# I+ \
设置开关的D4位:* ?$ n" ^; b- |# n- z
BD A0 07 LDA $07A0,X 读取开关数据9 q/ q# X6 k9 w4 T% Z
09 08 ORA #$08 设置D4位# @" d* g! q4 @& [2 V
9D A0 07 STA $07A0,X 送入开关
  w' u7 ~3 l4 i3 c4 e2 XD0 08 BNE 不同则跳转到 开关读取7 p$ r6 {& G! G) y( `+ W
清除开关的D4位:+ y  a9 b1 \4 G; U; o: ^3 O) s
BD A0 07 LDA $07A0,X  读取开关数据, Q3 w* B- P9 b' ~4 b7 U, Y
29 F7 AND #$F7 清除D4位" T9 T' V+ C2 g! E( ^
9D A0 07 STA $07A0,X 送入开关2 T; b3 L" `) L2 F0 b
# k+ Y$ E  L  h4 \
开关读取:
8 m: D9 s/ J# {' M2 x& b8 f% e& RBD A0 07 LDA $07A0,X  读取开关数据8 t# G5 \6 Q! p: q0 X
29 08 AND #$08 判断D4位是否设置" T0 X  e7 ]( w- N3 A
F0 04 BEQ 如果未设置则跳转到 出栈并返回; G6 _4 r+ }' o8 F

; }+ C+ k$ u- t, h  d! B$ f$ q' x无敌锁定:
* S/ V1 L, I2 U$ w6 @4 x7 [8 q* yA9 03 LDA #$05 取一个立即数#$03* t8 E' M& X$ P  Z3 h/ B$ C
95 B0 STA $B0,X 送入无敌地址
- \( @$ P7 Y# x( j- q
' F3 v  M0 q, G2 }出栈并返回:
( {' X- S* l. T68 PLA 累加器A出栈
8 u& b& M4 _# x5 J60 RTS 子程序返回
5 }( L/ H+ d/ l* x& F& }8 d
; E7 `  w! Y3 Y4 c) q
( z8 x6 ?& r3 d! N9 O0 j然后把程序粘贴到NES内存$FB50对应的ROM地址:( H9 ]8 m3 p' Z; X, O
单击右键:
! ?& O% G9 F2 h
4 c5 H1 ?* C! p2 \5 l# |1 h4 c; F6 ]7 m! o
! _8 T9 {1 h2 d4 e

' m# ]# z& w1 r7 x! R, [7 g: S, U
0 c  Q& A. y( E: H然后跳转到按键程序地址$C1EF对应的ROM地址:1 o3 q7 [5 v" _  r+ P
0 d( C. a) W; ^% J7 n, l. F
Ctrl+A:
/ U+ {" Q# S# d' {; R$ X
" `- Y. c5 f# V5 p7 x/ w7 H& O% |& w9 a* z0 [/ j
& T! Q' ]4 X; B$ T9 R3 u+ Y

1 b8 X* U4 D$ q$ z; y! _- x5 {! g单击右键:
9 |  h  |& I  Z3 N  @$ n) ]3 X$ J2 n; t8 E
  n" O# U" P* h/ p: C
把源指令修改为20 50 FB EA# O7 c2 }' X; i; Y# k2 |* A3 t
JSR $FB50 跳转到$FB50; [+ `0 g. C3 R, O
NOP 无动作
/ |* G* u8 x$ F5 D) c# ^& H' ^3 u; ~注:
) i9 K1 Z7 [& b$ c6 r如果不修改最后的F1,那么系统会把F1当做操作码来执行,后果不可预知,所以改为NOP才正确。
9 e7 K5 n2 n7 D0 W; a3 X, H4 y
4 I' E3 U+ B0 Y  s# p- f然后双击断点取消断点,再点击运行按钮继续运行:! M; ~. t7 m$ L& t+ j) k4 G
- E& x( b6 M$ |
暂停后如下:4 q$ `8 M& Z, d7 S2 R0 O

0 f3 S6 A- T  b0 D, O0 v按一次上键:
4 f7 _; R2 U7 t8 S0 _1 c& }( ^) Q无敌马上生效了,取消暂停后也一样保持无敌不会掉:2 u! f" l1 N! A% f* z

" e1 J" Y3 K  r$ a) N- Z暂停后然后再按一次上键
# U; w1 S; Y+ G1 c3 g此时无敌还没有消失,因为暂停时无敌时间不会减,所以不会消失.
; X6 X6 J/ Q9 T; J. u( q" B( Y: F9 D7 @; W8 Q. n& O# f
按下开始键取消暂停:
# T' |% G0 r7 Y+ h& y& B马上无敌就失效了:
5 p6 N4 E7 u4 |9 W, c* w- @: u$ V: N- a6 _. K% C5 W' ]4 I6 P7 ^" K
- @) F' w3 L5 w  I$ F3 j$ Q5 _
测试成功,没有什么BUG,接下来保存文件:% @% w( g; G0 v; i( @" Y5 }

" b/ _  B& _7 \8 U: Q! }. a% z
% T- N) U8 H1 ]5 `到此为止修改结束。
0 @# g' b0 R2 B3 T: o
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

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

×

评分

1

查看全部评分

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

签到天数: 3163 天

[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 个 柠檬. 幸运榜 / 衰神榜
回复

使用道具 举报

签到天数: 1672 天

[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-8-26 19:06

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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