设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-5-18 23:00:46 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-5-19 10:51 编辑
5 B8 w- U6 l% [5 {8 ~! K1 x* S  t1 O+ l, y
[FC][按键开关][修改教程]
) M( l2 l  S+ `& A6 l时间:2017.5.18
0 j6 n1 X/ {; A9 r/ D: H作者:FlameCyclone9 p! e, |; z' N' d% L/ ]  M2 j, l
工具:FCEUX 2.2.3,Hxd 1.7.7
' e- L& k, g* w# ZROM一个:魂斗罗(J)_Mapper4.nes1 U- |+ t2 P6 N$ h, z+ a" b) i

5 b+ g2 Y4 j, |" n
4 Y. N. S, ?0 D9 _0 d; i修改思路:! [3 v/ M! p! B& @; r, j
1.先在$C000-$FFFF之间找到一段足够写程序的空白空间,通常是一段连续的FF或者00,是在找不到可以切页(切有空间的bank,注意用完切回原bank)或者扩容后再切页。! }8 I: {5 R. Q, ~. J& b
2.再查找一个系统里没有进行读写的内存地址作为开关,一般在$0000-$07FF之间查找。
4 Y# y0 G# H% j1 e4 M& p0 J/ h  w3.查找暂停地址,一般暂停和运行时内存中有一个地址会变化。& I" Y/ P, u$ i6 X( Q  B
4.查找按键地址,找到单次按键,就是按一次变化一次的按键地址,按键一般有连续按键和单次按键。(如果没有单次可以自己想办法添加)。2 t* w" R2 g5 s* u8 i
5.写按键开关程序,程序思路:当暂停时执行开关程序,非暂停时读取开关的状态,开启就干嘛干嘛,关闭就干嘛干嘛。
3 k: Z  C9 L- g9 C4 V) K  Z6.写跳转,将按键程序跳转到按键开关程序。1 u1 D0 I2 j. N1 C/ l4 D. E
/ {! o/ x: _! q# w, ]+ W9 p
' W& u! ]$ H6 j) }+ e
程序流程图(假设暂停后,按上键切换无敌锁定的开关):
3 W9 N% y- k  M3 W; L
2 J  Y- @  r" P8 E0 `4 E+ {4 k; _  S0 I6 {" l* p' r
接下来开始修改:' `9 F1 t$ N* s4 ?6 G7 S
用FCEUX打开rom:: r/ V1 N$ [8 G0 u( E! O/ B5 P

/ s3 Y4 }' P5 _% M$ H( E4 F. T然后查找修改中需要的地址空间:
' V) u- [0 h$ O6 J; }这里我就不慢慢找了,直接给出:) g& p* e7 k! c: z
空白空间:$FB30-$FBFF& [0 S" U! |3 h2 J$ q8 p

' A5 L1 H4 A: V' \3 {5 _( d开关地址:$07A0:
# T  |, [3 f( A% u6 [% A: B2 b& `; ~6 n6 f; Y
暂停地址:$0025;
; v" d* N- Z2 C" M/ `) n4 N单次按键地址:$00F5,X(X=0是为P1的$00F5,X=1是为P2的$00F6);
: q7 _) Z! `2 m( C% t8 P: Z按键程序断点:
7 a1 U, G, v6 n" y: D打开调试器,设置写断点$00F5:
  e  [  E. D# h) u% J& B
1 V" x( w; p6 h7 _6 H; i+ u2 Y4 {7 u; c

! X+ J7 m0 j" _! Z5 C5 {然后程序暂停了:
) E8 U) N2 K' ^( e
# R; R1 P% d  b- x/ E; K( x, F  G- [) C& M* @! V) x* y) G1 c
由此知道按键程序断点在$C1EF;6 W# O0 T8 ^- j+ j# J& q9 u
然后开始编写程序:
+ ]) k  l- K' \+ I" P推荐使用6502 Simulator编写,由于本篇教程需要的程序不算复杂,我就直接写机器码了:
" k, ]+ ~" U2 ?2 v5 ]打开Hxd,新建一个文件:
, u2 o4 `5 w( s9 o7 b% D+ I- c; L
( E' E) m! R- Z3 V) j$ E7 X$ w然后开始写程序:( c9 W1 c. w. z. \7 ~
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  s" D; d% c/ `" Q4 A2 G
, \3 K# p6 @6 g; L" W( K: V
反编译解释:, ?, E; W  N% Y% {" i
95 F5 STA $F5,X 送入单次按键: s7 V7 Y0 ]: S: K; y
94 F1 STY $F1,X 送入连续按键  E3 }6 P/ t2 `3 W1 ~- W
48 PHA 累加器A入栈8 J# }1 L1 Q( |  m7 W
A5 25 LDA $25 读取暂停状态
  c- f& t( N5 V1 V0 _# qC9 01 CMP #$01 与暂停值#$01比较8 N2 b+ R7 d* o- s$ i7 S! W' O9 X
D0 1F BNE 不同则跳转到 开关读取1 M. q6 C% ~. m0 ]3 N( z
, w8 }; \: W- D& }( i
读取按键值:6 \0 A% W* p. Q- ]
B5 F5 LDA $F5,X 读取单次按键键值6 _4 K" L. {( h% D' @# U. w
C9 08 CMP #$08 与上键键值比较: {# ^) ]9 C6 R5 z
D0 19 BNE不同则跳转到 开关读取
$ c9 |3 B/ y$ G4 C6 [
( k+ M& S( o# l3 w) G( {+ L( O& ?读取开关当前状态:3 _) l7 w6 q0 e$ s0 N
BD A0 07 LDA $07A0 读取开关数据
  N1 H% m" M4 R6 _" C7 C& w' f* Z29 08 AND #$08 判断D4位是否设置8 M2 X7 s. \. F' f
D0 0A BNE 不同则跳转到 清除开关的D4位# t# _! |, r1 r. L) L

0 I# l4 t* C2 H. T7 M$ c6 m设置开关的D4位:
4 Y: P9 E" K  OBD A0 07 LDA $07A0,X 读取开关数据
0 E, R0 i- M- d) f: @. X: u' c1 d09 08 ORA #$08 设置D4位
$ K8 X& ?: ]! @) Y+ }% U3 A9D A0 07 STA $07A0,X 送入开关
7 s+ O3 @" |# w/ k% U7 q1 v, x% qD0 08 BNE 不同则跳转到 开关读取
3 S5 B7 D- v, E/ N清除开关的D4位:
: U$ v, e; e5 ~: `2 G4 O8 A$ EBD A0 07 LDA $07A0,X  读取开关数据
& z5 q# d7 l/ U# T29 F7 AND #$F7 清除D4位% h7 U+ t2 q: b
9D A0 07 STA $07A0,X 送入开关
6 k4 M: W& A. T7 e% B3 i5 ], [+ l9 E, ?) v: `  x, N3 [& C/ O
开关读取:2 [* i8 E: Y% h( |: |, {9 ~
BD A0 07 LDA $07A0,X  读取开关数据
  M1 [1 v: {/ Y29 08 AND #$08 判断D4位是否设置2 M" |) u5 `) Z: j2 |- K4 h
F0 04 BEQ 如果未设置则跳转到 出栈并返回+ |# Y) \" D+ H
' S, H. i9 @+ w, S- U9 Y) Z
无敌锁定:# v& u' w1 F# z! y9 O2 u
A9 03 LDA #$05 取一个立即数#$031 H( x8 Z2 [2 X5 ^* \7 V
95 B0 STA $B0,X 送入无敌地址
: Q; Y! a$ P; |2 \* i* K' ~! E/ E. P+ p* f" {; y
出栈并返回:
. K: R2 C. F6 y! _% A) U5 E. r# u68 PLA 累加器A出栈
# v/ l4 N! b3 B6 p60 RTS 子程序返回3 q  n3 ?( |' x9 e, T) Z

! z) R, K' z) e/ G( b, D  s- @" C8 b
然后把程序粘贴到NES内存$FB50对应的ROM地址:) g5 m0 d6 C3 H' r
单击右键:
5 j- e% c! V/ }" v. c/ M( K
) ?# k5 Y& Q; h8 i, J1 y' P
" G3 M' |+ j# M' g' g! p' S! B" Z* ~, A8 k

& w$ h* V& Q/ q& ]9 I
& k+ G# s5 v) M. r然后跳转到按键程序地址$C1EF对应的ROM地址:+ W. ~' D5 ^( b: l) `2 G
( J4 R4 h; f/ P' m( m3 p  r  |! e
Ctrl+A:
9 @* U1 |6 ^2 e. i- y5 j/ A" F8 P1 {( T# o2 [0 [
6 H$ o% `, ?: ^) A  _2 O# f/ @
8 v0 \  K% T/ X
6 f5 G7 Y$ s1 M' l- l$ R, N
单击右键:
$ p6 o, G1 c6 R0 t* ^' T/ k; L% {
- a& ^% d; d0 |. N6 h; X
把源指令修改为20 50 FB EA' f; j5 z: G/ I4 t0 G. H
JSR $FB50 跳转到$FB50
1 a( l- ~  `& _NOP 无动作
, O1 H" E2 c" f注:* P$ z$ @/ U! S
如果不修改最后的F1,那么系统会把F1当做操作码来执行,后果不可预知,所以改为NOP才正确。4 T% S) a9 y# P/ d
$ s/ @) ]! Y1 y: d4 v9 J$ @
然后双击断点取消断点,再点击运行按钮继续运行:9 `( j4 ]" O1 {/ }: L: d  Q; E

  e1 ^9 o: J1 t暂停后如下:
5 h  J$ z. d* J8 B! B/ u0 r' T+ X' r( y
按一次上键:
4 ~0 y3 r/ B2 i2 ~2 I$ ?! L9 v2 ]: N无敌马上生效了,取消暂停后也一样保持无敌不会掉:
+ ?& h1 b0 o0 G& ?# l" m  V" z; d+ C: n+ @* F1 l/ D
暂停后然后再按一次上键
4 [. @( i; @( D5 U# X6 l! t此时无敌还没有消失,因为暂停时无敌时间不会减,所以不会消失.
1 m* P  F- ]3 i1 ~( r" X/ b& ^- [, A' z
按下开始键取消暂停:( W& }& Q2 D9 T9 B
马上无敌就失效了:  f. U" m' z! f; ]" [

( B0 }: s  ^4 N7 ^. ?: j  E2 W
- E/ L/ J* Q2 t, K, z) F* i5 m8 ~测试成功,没有什么BUG,接下来保存文件:" a, S; L8 H. O; Z+ o

+ ?# U& o# o& J: k- T1 o# p) {) Z3 ]% K4 W2 j7 c; {2 X* J
到此为止修改结束。
1 q$ I7 L4 Y$ B
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

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

×

评分

1

查看全部评分

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

签到天数: 3039 天

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

使用道具 举报

签到天数: 1546 天

[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-4-17 11:30

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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