EMU618社区

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

[原创HACK教程] [FC][数据搬移程序]

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:32:50 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-4-28 14:17 编辑
% b  g7 a  W) Y6 _/ ~4 Y0 }4 q* J- L& r7 x3 H2 B; m4 r
;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone% `& y& B+ `+ `+ Q1 P' U2 y0 n  j7 A
;2017.4.28
, K9 t7 d% d, x: x! u4 Z ;例子:双截龙3
0 s6 w- k3 m5 h9 R1 B .ORG $8100    ;定义程序开始地址; u) u: u$ \! p; q$ l
JMP Copy_Data_Start    ;跳转到复制程序6 u, Y( p8 P7 |+ O( Z  c$ ?% e% ~
. b6 C$ p+ W  q/ Q6 S
Addr_To:    ;目的写入地址
: H; Z- S( ]! Z, A( W! c% H5 v .BYTE $00,$70    ;想要复制到的地方
( H9 P6 a, G3 A5 Y5 eAdd_Begin:    ;源开始数据地址
+ y& W5 l& d% W/ b; n. h .BYTE $00,$82    ;想要从何处开始复制3 X7 I1 F% A2 o3 _0 t
Addr_End:    ;源结束数据地址3 i0 p- u2 }5 v1 W% R8 x: q
.BYTE $EE,$91    ;想要从何处结束复制7 H) x4 P1 l& K. U; i
7 ^) x; p7 g! Y7 D4 `" B9 \8 J2 Y, W
INT_Addr = $A0    ;中断地址6 d4 l8 I* A' F6 `' K8 i. j
Flag_Over = $7FFF    ;完成标志地址# u- P! [! `# K5 l5 W3 h) A' H
Data_Over = $7F      ;完成标志
2 W+ v; ]+ C# X0 x5 s- n% T' E- P9 U9 N9 A, L
2 {* n+ c$ t; P( L2 ^: n
Addr_Data_TO = $A0    ;目的写入地址
8 J# b' U6 r3 H6 J7 E5 U! X1 lAddr_From_Start = $A2    ;源开始读取地址  {/ S) G; `  |: O: ]: W( H
Addr_From_End = $A4    ;源结束读取地址
* M2 O: t9 J5 o; J; i- I. I) G$ V. D/ |+ N- l4 n
Copy_Data_Start:6 }  f8 Q( C4 g4 T
Data_Copy_Protect:    ;保护数据! _/ _5 U9 X" Y! i2 [" g* s
PHA9 p* f, Q) w! q0 ]4 Q# Q
TXA  M  Y# R; Z- k& o( k
PHA. _+ T' I; J5 F9 O" B
TYA
9 M, l8 I. a* I& U1 { PHA, ?. b8 r& ~2 u& \& u: k
JSR Off_INT    ;跳转到禁用软件中断% l; m2 _5 A4 l& M
LDA Addr_Data_TO& ^* s+ T6 K4 m3 _, O5 f; P+ H
PHA
  z& M  e  e+ w& c- o0 | LDA Addr_Data_TO+13 L4 Z- c6 ~$ q* q1 T$ v7 j; j, ]1 M
PHA; L' x. J/ x! q: ]+ \$ w
LDA Addr_From_Start5 b5 o2 m3 U" L( z2 s. B
PHA
. y* m4 e4 g" Z1 v$ Z/ c/ J LDA Addr_From_Start+1
3 D7 Q5 _0 _. C2 \- X PHA9 E. [' ~5 V2 V! l' C  r7 H8 f1 H
LDA Addr_From_End
7 l- [3 V, Y6 S9 D# O% ?: ] PHA% n7 c4 u2 p' C( ]% [2 S, M) v+ ^- a5 Q
LDA Addr_From_End+1# x' J7 c" b* w# d0 \0 m
PHA
& O' t2 F0 j, o1 v3 ]3 j: g4 u! R+ j, r9 \& r3 G! L
) ]' N; v% k1 o6 t" h3 U- k
Set_Data_Addr_Start:    ;设置复制起始地址
4 ^; o7 k9 H* [; J* s LDA Add_Begin' l9 R% h/ L/ }7 Q# L  {; _0 S0 u, c4 [
STA Addr_From_Start    ;设置复制起始地址低位- h3 ]! ]) r( L
LDA Add_Begin+1
( S: M7 Y* I$ _- J% Z5 D# { STA Addr_From_Start+1    ;设置复制起始地址高位6 E4 L! r+ K: z5 o1 x$ D* a. u

& f2 z* F( p1 [# B' ~  u* oSet_Data_Addr_End:    ;设置复制结束地址
5 a# f6 r6 Y! e# x' q. G LDA Addr_End
+ Y$ b0 P. h- p/ h. [/ H0 I STA Addr_From_End    ;设置复制结束地址低位
9 @, S/ C" A6 p  B LDA Addr_End+1
1 a9 ]2 A9 |) d! p% F STA Addr_From_End+1    ;设置复制结束地址高位! y9 E4 I7 v1 n8 V( ?  d5 @
( i9 ~6 n: C/ L% H" _
Set_Data_Copy_Start:   ;设置目的起始地址
! r3 \. c  E! L8 L, c$ s1 { LDA Addr_To/ m5 G% ~0 }, }7 u
STA Addr_Data_TO   ;设置目的起始地址低位
9 h  ], q3 R2 q4 r2 f7 \ LDA Addr_To+1% Y7 Q( `9 W0 j" M4 q+ B, W3 W
STA Addr_Data_TO+1   ;设置目的起始地址高位
/ ?  d8 ^( g9 ~( }$ g0 m5 E  U 4 @8 X1 y: ?" S* y* e* y
Over_Copy_Cmp:    ;复制完成比较/ ^/ j+ N2 n$ ~5 X' D4 L: W) Z
LDA Flag_Over
6 A0 J. Q  n" v CMP #Data_Over    ;复制完成标志比较
4 ]$ _: \2 y( U BEQ Data_Copy_Exact
2 Y* {6 X2 ]4 h8 ~! ^* W7 ]3 I# X" U* {/ e/ @# y. ?
INI_XY_Count:   ;计数器初始化% T, M+ Y9 F  O& |4 `3 w
LDX #$007 q0 X" V  S. H6 p8 M
LDY #$009 _( e0 g' |" P6 o) d

5 h( `& ^# a( X; ], x  e7 WCopy_Over_Cmp:    ;地址比较& v* x% L8 u0 X6 }/ T) r
Cmp_Addr_Data_TO:    ;写入目的地址越界判断(向$6000前写入)
" s, U+ o, ^8 F  G8 X4 @ LDA Addr_Data_TO+1
4 W1 D+ p! [0 R6 b) j CMP #$60
8 m% q3 d4 Q% r: ^+ e: H1 _ BCC Data_Copy_Exact    ;写入目的地址小于$6000时结束复制1 K, n6 c: I0 ?/ Q5 `5 z) g
Cmp_Addr_Data_TO_H:    ;写入目的地址越界判断(向$7FFF后写入)
1 ?) Q$ j2 H  F( ^ LDA Addr_Data_TO+1
) {" K2 a& }; f% w7 R( K CMP #$802 U( l4 A: S+ P, p* \) k
BEQ Data_Copy_Exact    ;写入目的地址大于$7FFF时结束复制+ q: a9 y& q( |# j8 b4 S8 q) ]

. c: g. L1 t+ _; h1 G4 k0 TCmp_Copy_FREE:     ;源地址结束判断/ g$ c! ]( z3 f2 e1 ]8 f! m6 w9 }5 e* F
LDA Addr_From_Start% u# {  G" _( p- {$ u
CMP Addr_From_End
& y5 D# n. V- X5 P+ q* s# ], l BNE Copy_Start
8 p5 W; a  |/ o. u6 S, _3 o LDA Addr_From_Start+1
0 i& I3 _( l) |, d; `  H CMP Addr_From_End+1" E# q; B8 c' v2 K( w, m
BEQ Copy_Over& A- e6 B6 @1 k7 w/ N) ~$ v
! }% G5 J; u* g' F
Copy_Start:    ;数据复制开始
& R0 g5 N  G0 g( c9 @* K LDA (Addr_From_Start),Y    ;读取源地址1 C0 `; @% J" }& J8 A& `+ I! H
STA (Addr_Data_TO),Y    ;写入目的地址
: ]6 W. E5 q* u" c9 ]! wCopy_INC_From:     ;源地址低位递增9 }/ e  ^3 k' k. K
INC Addr_From_Start   ;源地址低位递增) g. g% n, p$ A: N0 v( j
BNE Copy_INC_TO
6 Z; e. W7 _- o: ^1 L7 y INC Addr_From_Start+1   ;源地址高位递增
5 e: M3 X. w2 f( BCopy_INC_TO:     ;源地址高位递增
$ q+ }; K: F8 o8 \( z INC Addr_Data_TO   ;目的地址低位递增+ `' n2 t: n) I+ I) l$ v. y1 s
BNE Recopy
) M* |1 V! V6 U8 Y! r8 C INC Addr_Data_TO+1   ;目的地址高位递增$ @* Y5 i; F9 p- Q" V. ~. I
Recopy:
7 a1 z! P, N3 U* B JMP Copy_JMP
3 ~% g3 x$ i- c& s ' X: ?8 C/ s$ V1 Z4 }
Copy_JMP:    2 ^9 z" W" f- I  n) A
JMP Copy_Over_Cmp+ w0 Y4 _+ T8 N7 m6 q  y* W! w1 B
% O, Z( Z& x: {4 G/ Q
Copy_Over:    ;复制完成
  x; ]6 `0 Y* q/ o% e( L. v: X LDA #Data_Over
/ ?  l& |6 l% e STA Flag_Over    ;写入完成标志- I& W3 ~1 c& u8 k4 i
FINAL_BYTE:
- O( c  @& h* w% K& f LDA (Addr_From_Start),Y    ;读取最后一个字节6 y8 Z1 h. h! E; P8 _/ c. w
STA (Addr_Data_TO),Y    ;写入最后一个字节$ a; X$ z) `; x6 N% n$ ^9 ?. Z: O

9 a% Y. q4 P( [2 A( }: gData_Copy_Exact:    ;恢复数据: A) T; K  k& t/ T+ ?
PLA
& s: S' @1 Q" m' x' L STA Addr_From_End+1( R0 j7 I; A3 S# ?; p9 D' D
PLA2 f1 C$ C! Z3 ~
STA Addr_From_End* x4 W& Q# R- v
PLA
2 b' K1 k5 ]& F# R STA Addr_From_Start+18 U8 e  t+ C2 P4 Y8 e. F0 _& ]8 ?
PLA
" E5 p; A5 y( e/ K5 a STA Addr_From_Start
* m8 A2 }& l1 J! D$ Y PLA4 v5 ?; ^) I  t6 U, O1 C, q
STA Addr_Data_TO+18 J7 z6 Q( C9 |1 {" C5 J, p# C7 [. l
PLA2 m3 L' S9 I4 X% k  b' W
STA Addr_Data_TO
! b0 E: B; B1 Y& X: b$ u PLA3 `; D2 |+ M! I2 S" E. j6 h+ ]* A
TAY: W. o  K8 ]- g& @/ ]$ L* @+ ^; J
PLA
  D1 a$ B4 F0 F/ c7 S+ i TAX
- [, Q+ q! X4 z+ Y  ], ^ PLA
1 T' P: N. x& Q! W0 F
$ o) {0 W. P! yData_Copy_Return:, m" b5 p& q: h( _) P# ]
JSR Rec_INT    ;跳转到恢复软件中断数据) B) N0 S' w: y6 u+ k& c/ D
RTS- I9 m6 H" [% y% H; h: ]1 P

5 D* R5 G# m, U( r7 eOff_INT:    ;禁用软件中断
; J# L3 Q+ U, D5 ~* M4 j; O' f LDA INT_Addr
# E+ d! Q- S3 L% B AND #$7F& Z7 d  ^2 Y1 b) u3 ~
STA 20009 p3 Z. f  A! p$ q; T- V8 {
RTS
$ l) b. ?+ N2 W6 y: [1 E; D& A* c$ A9 ~& T% o0 d* S2 C
Rec_INT:    ;恢复软件中断数据
5 f9 L4 Q4 w9 h: {8 F) D+ P# ~ LDA INT_Addr
; ~( h* `' E0 N1 v: H STA 2000
4 N; J/ s; _# j! g4 g) D# a, k- m. x% ? RTS
[发帖际遇]: yandagui 打扫环境卫生,被奖励 6 个 柠檬. 幸运榜 / 衰神榜

签到天数: 3092 天

[LV.Master]伴坛终老

发表于 2017-4-1 20:40:43 | 显示全部楼层
感谢楼主分享教程!
[发帖际遇]: afti摆地摊卖菜,占道经营被城管罚款 6 个 柠檬. 幸运榜 / 衰神榜

签到天数: 57 天

[LV.5]常住居民I

发表于 2017-4-20 10:41:20 | 显示全部楼层
谢谢楼主分享!

签到天数: 39 天

[LV.5]常住居民I

 楼主| 发表于 2017-4-28 14:17:30 | 显示全部楼层
程序更新
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-13 22:42 , Processed in 1.068359 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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