|
本帖最后由 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 |
|