设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:32:50 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-4-28 14:17 编辑
5 g  K0 q  T8 V9 M% Q8 s/ f( ]( g
) W# W1 d4 k2 C- L( z; I9 l  ^* p ;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone
  N/ T6 I2 k3 @% V6 d0 n  ~ ;2017.4.28' N7 c: E5 q* y& k4 y6 m- \/ G
;例子:双截龙3
; j$ v$ u2 z* q/ V1 c( d .ORG $8100    ;定义程序开始地址5 J  j- A  _, T- f6 H
JMP Copy_Data_Start    ;跳转到复制程序
( m7 r4 u9 I; g
  G! {( ?  b' M6 ?! L+ @+ W9 NAddr_To:    ;目的写入地址
1 O: D' T0 L5 O# ?7 z .BYTE $00,$70    ;想要复制到的地方7 ~) k3 T, C8 N0 Y# ?
Add_Begin:    ;源开始数据地址; W+ h! S( w& ]3 ^3 ]# @( Q
.BYTE $00,$82    ;想要从何处开始复制1 n$ K* B4 @* [3 T0 c! ^
Addr_End:    ;源结束数据地址2 ~* e2 u  }7 ~' ?& y* y
.BYTE $EE,$91    ;想要从何处结束复制
3 V  T3 e3 @7 D7 ~- v9 \# t1 P2 c! O/ Y* i. P
INT_Addr = $A0    ;中断地址
1 J/ U- y/ ]" P5 K$ D7 KFlag_Over = $7FFF    ;完成标志地址
' m' {$ s6 @6 O+ {4 x% bData_Over = $7F      ;完成标志
) n4 a3 A, {+ q( t
* F) E$ d2 k5 L& y; b! a- \) }9 _2 }! f% `8 Z8 _
Addr_Data_TO = $A0    ;目的写入地址0 `  G  W; @) e& X5 e
Addr_From_Start = $A2    ;源开始读取地址, N6 }; N1 t, ~! F+ z" |
Addr_From_End = $A4    ;源结束读取地址! @# h4 O3 K5 y9 z5 ~' g6 q8 ]

8 z5 l2 A% o3 |0 c( e) i2 q, G$ TCopy_Data_Start:0 a! ^% i8 [; X  r9 P
Data_Copy_Protect:    ;保护数据
- N. u' p8 O' x) v- `/ j PHA/ B3 B. |% C' ?
TXA+ y; l, M. k* z1 k! H2 ?
PHA
# P1 d4 O- ^3 Y4 k TYA6 v" B4 M! Y+ l: V3 {4 |
PHA
9 g! R( g& }8 x% o* d+ u$ k JSR Off_INT    ;跳转到禁用软件中断
! B! m( v) L# R8 b9 q$ r9 { LDA Addr_Data_TO
% t' D  _0 z  ?/ r/ D- E2 c PHA
9 z  p% f4 K& `/ [1 W$ V8 u( } LDA Addr_Data_TO+1
9 K0 x6 T4 i- E# N. d: k PHA9 E' J* g! j; g3 `& {6 x+ d- O% l
LDA Addr_From_Start2 `( S; k& E+ c$ m" z4 {( y
PHA! b$ u3 @( g  `5 ^" r6 ~+ T
LDA Addr_From_Start+1
/ G1 }! ?, f" s/ u, C PHA
0 Y2 E: Y+ k7 H LDA Addr_From_End
  a9 t+ ]- b6 G4 p( ^ PHA2 X1 y8 y8 ^, E! a3 M
LDA Addr_From_End+12 b( c9 j# Q6 _& _" ~9 q: l
PHA
# Q) C# ]* v1 G: R* u
0 W& h: }" [& v5 V  S * d/ u0 N/ B( V) p- m
Set_Data_Addr_Start:    ;设置复制起始地址3 s0 V4 z4 y: K& T- R
LDA Add_Begin; y9 F/ c0 Q" d  x
STA Addr_From_Start    ;设置复制起始地址低位
7 @4 Y* O8 k. x& W3 y LDA Add_Begin+1
- A8 }( L- p6 d% D STA Addr_From_Start+1    ;设置复制起始地址高位
& v8 h+ o) x/ A) o* ~. D $ g/ {( S1 w0 N' _
Set_Data_Addr_End:    ;设置复制结束地址9 l9 c. c1 M6 w2 r
LDA Addr_End
: _& X+ ^! X5 l! r+ u, Z STA Addr_From_End    ;设置复制结束地址低位# ]9 O2 N, ~$ i% l3 U
LDA Addr_End+10 f0 s* ^  q) {. W* o5 c8 g  m
STA Addr_From_End+1    ;设置复制结束地址高位  W9 m+ W7 c$ `7 P9 _

8 V/ }; p3 h. ^2 n! ~Set_Data_Copy_Start:   ;设置目的起始地址9 F! ]0 S1 C' x5 Y) \
LDA Addr_To
0 v" q1 _2 q$ z+ C STA Addr_Data_TO   ;设置目的起始地址低位
" m9 `# ?8 E7 j7 l- x, q1 q0 g LDA Addr_To+1
* ?! \& N9 {# I STA Addr_Data_TO+1   ;设置目的起始地址高位
- p0 X. r( E: }& z2 N 6 T8 A# y2 Y  x8 }% @
Over_Copy_Cmp:    ;复制完成比较
7 a/ e/ j$ j1 R6 W& {6 w* U! v/ v LDA Flag_Over" b1 [6 C2 M  A! k
CMP #Data_Over    ;复制完成标志比较( I8 d, H2 J) w4 i7 |1 A3 Z& I
BEQ Data_Copy_Exact
/ W4 X, b2 j; `- Z- J  O8 }4 f
7 |4 Z' |+ V" EINI_XY_Count:   ;计数器初始化
% E$ s. m# o. {+ V LDX #$004 v4 \/ K- t: ?# j, ]
LDY #$00
3 S1 Q+ x. M, W
4 O# Y" n9 V6 ~" n, hCopy_Over_Cmp:    ;地址比较
7 X/ t$ y; U+ j8 g3 cCmp_Addr_Data_TO:    ;写入目的地址越界判断(向$6000前写入)
6 F+ X8 l% j6 x LDA Addr_Data_TO+1
9 `1 _% t) P+ S2 t  a6 U' v0 H/ ] CMP #$60
' n" K* ^) E2 s, I BCC Data_Copy_Exact    ;写入目的地址小于$6000时结束复制8 ]  j1 b5 H, l
Cmp_Addr_Data_TO_H:    ;写入目的地址越界判断(向$7FFF后写入)
( n  }. G$ P% g" ]+ d LDA Addr_Data_TO+1- }: N" e3 l# T, v9 F
CMP #$80- v" v, w) S  h+ L7 n5 r" Z
BEQ Data_Copy_Exact    ;写入目的地址大于$7FFF时结束复制2 v, q# v7 [: Y! D

- {9 m+ H/ X9 |: H- kCmp_Copy_FREE:     ;源地址结束判断3 {) g2 {% Y1 f; V- m2 l4 ?5 h
LDA Addr_From_Start- ^+ l1 C8 @" `
CMP Addr_From_End7 ^- b+ |  n4 d6 B8 V. b
BNE Copy_Start. M) U9 p, K$ ~+ @
LDA Addr_From_Start+1
$ I* T, }) B2 F" H4 `9 M; D CMP Addr_From_End+12 c1 H/ X3 J$ n9 ]9 y# Y& A! c6 ?
BEQ Copy_Over; L2 j* E# [9 M; k3 }

0 s' v7 L& b$ v" G8 `Copy_Start:    ;数据复制开始
. s- V/ r. b$ F LDA (Addr_From_Start),Y    ;读取源地址
1 C5 u; A" x; { STA (Addr_Data_TO),Y    ;写入目的地址
$ J, ?) k6 C) c7 @1 uCopy_INC_From:     ;源地址低位递增+ ^  j, J1 n* g# Z; S4 f. I
INC Addr_From_Start   ;源地址低位递增' }, X, E, h0 Z% D4 _
BNE Copy_INC_TO) j8 J8 l4 t( o8 i9 u. S! v
INC Addr_From_Start+1   ;源地址高位递增
3 w5 q* E. s- l0 J4 }; U7 ?/ LCopy_INC_TO:     ;源地址高位递增! H5 n  @5 H* v: V8 j
INC Addr_Data_TO   ;目的地址低位递增/ q# V7 k8 e- \: O' s! ^! z! A/ Y
BNE Recopy
  K, L  I, J! @  x" B3 I INC Addr_Data_TO+1   ;目的地址高位递增) q$ u3 ^* ]2 Z7 d8 L3 ~* ~
Recopy:
4 L- E' J9 i; v. Y JMP Copy_JMP
& s6 K3 @1 G% ?- j6 Y# H: m0 j 8 _! M9 Y* m8 L6 H1 ?3 V
Copy_JMP:   
1 r; X" u6 i8 v' g JMP Copy_Over_Cmp
2 T2 B+ r  T$ i2 B7 t
+ R9 U- H: o2 ]- N* A. t% n- `  bCopy_Over:    ;复制完成
7 V$ C6 \* A8 Y: j! k/ B+ i* f3 J, ^ LDA #Data_Over
4 S0 O4 v8 U& y3 d( M  ?* f: l STA Flag_Over    ;写入完成标志; U" Y5 h/ S: S& S3 t
FINAL_BYTE:
" |/ d/ r' U. e1 L: G LDA (Addr_From_Start),Y    ;读取最后一个字节1 a$ {3 K5 v% t% n( ]
STA (Addr_Data_TO),Y    ;写入最后一个字节
: z# h' |* q8 S0 B 9 \; Y: U3 I' I- f7 i& r( K9 d
Data_Copy_Exact:    ;恢复数据* Z! m2 D2 W& J; w; b
PLA  A$ d5 c9 m5 _# I# |& R0 T' m
STA Addr_From_End+1
7 Z1 |9 S0 C2 |: P! t: \ PLA' W! \8 l. F+ E9 ]5 O8 u4 n5 r
STA Addr_From_End
  ]5 }% m% ?4 t7 [9 o( x( J PLA( j" v# j$ |" W7 G/ X
STA Addr_From_Start+10 k0 c0 I8 [( Q# a" T% I
PLA
1 H3 T  M) f* f/ g: b STA Addr_From_Start2 H' D3 I# J# v) A4 L8 h  \% _' i
PLA
( Z1 W' h4 e- u; N0 ?. P( { STA Addr_Data_TO+1$ ^4 D% L5 X9 x1 \4 ~5 [7 l
PLA( F! D5 J2 Q8 y0 W. s6 q- e6 Q
STA Addr_Data_TO+ z7 l2 O2 R  }. w
PLA
( N9 S6 X; c7 w4 c$ ] TAY0 g) a  I' r/ l/ M5 n& U
PLA
6 o+ I+ O2 K+ M5 {- H0 k$ ~! D, c TAX
  D6 U: t/ q5 ]( }: V. Z" P7 V1 F PLA6 p- _, A+ |  Y3 a

& G+ o( |1 h  p7 D9 C) ]! A1 m# b3 \Data_Copy_Return:
4 e$ M! e% H5 p- v. J4 N7 D, L JSR Rec_INT    ;跳转到恢复软件中断数据
; T  J5 K6 r2 s" n RTS* \$ N) O. E$ d
' G( F$ S3 ]8 G, q0 Z
Off_INT:    ;禁用软件中断+ n% D* j" N) ?
LDA INT_Addr
5 k9 Y* i; J4 {  c& m4 u; k. T* I AND #$7F
, \# L5 J" _4 h STA 2000
' y" K& {% ~+ O; N4 |0 G: Y RTS" V4 C% W3 J3 V6 Y. B4 k
# |# U8 A/ K6 G1 V4 q- n; @
Rec_INT:    ;恢复软件中断数据/ \( Q" x/ R0 I4 j& j
LDA INT_Addr
  }  ~7 B$ v$ D/ D STA 2000  M6 M+ D8 G2 `8 O( K7 ], C! p7 [
RTS
[发帖际遇]: yandagui 打扫环境卫生,被奖励 6 个 柠檬. 幸运榜 / 衰神榜

签到天数: 3129 天

[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, 2026-7-16 14:57

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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