|
|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑 5 d0 q$ y3 O8 J5 c& N' @4 T
, W5 S; v8 \0 v8 C3 u+ U ;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone
8 f' y1 O2 _( E( ^1 X! X$ L- E ;2017.4.284 ~, Q, M0 R3 P$ n7 K
;例子:双截龙38 @1 T6 t8 @2 d* @5 L% m
.ORG $8100 ;定义程序开始地址5 m1 d4 o3 b4 b7 V' ]( l3 o
JMP Copy_Data_Start ;跳转到复制程序
+ o' k: o6 i( l7 S1 u% y+ a2 D1 D7 l1 u5 }1 D3 w
Addr_To: ;目的写入地址
' d7 f: j, ~9 V, m, G5 Z3 i .BYTE $00,$70 ;想要复制到的地方
9 g8 W% l' W) {6 ]% i9 s) LAdd_Begin: ;源开始数据地址3 [% p4 d/ l9 x% C! o# e* R. U
.BYTE $00,$82 ;想要从何处开始复制
' a( U% P! _; c9 y8 lAddr_End: ;源结束数据地址$ m8 B+ X; H7 C6 R5 h& w
.BYTE $EE,$91 ;想要从何处结束复制
5 j) u4 Y1 q6 O2 p0 |6 s5 }! Z
Y- x+ _: u0 I9 ^, `: u; QINT_Addr = $A0 ;中断地址
" S! n/ U- d5 |8 QFlag_Over = $7FFF ;完成标志地址
0 E7 s6 D" ~+ z# ?% QData_Over = $7F ;完成标志/ b& Y! j- K$ \! U% C( C; [8 x
* e# ?. E0 e/ x. i$ `8 e
8 Z. H5 y1 T& X# C8 W0 u& W5 dAddr_Data_TO = $A0 ;目的写入地址+ g2 i! j8 b: ^- Y7 O% {6 ?
Addr_From_Start = $A2 ;源开始读取地址 \3 M! F3 ]! x4 g* q; y
Addr_From_End = $A4 ;源结束读取地址
* U) `0 E- _; {
% k- Z6 u% E1 H$ L- C" F5 n* i, I6 DCopy_Data_Start:
, T9 {+ O$ @7 w. ?1 c( u2 g0 X6 IData_Copy_Protect: ;保护数据
* B. b, _# C J: U) p7 a8 ^6 k% @ PHA
$ w1 i( W% A% b; O, `6 f& y3 u) m0 J TXA& [+ w5 d( R" S$ o
PHA% [: y8 b$ B: H" @
TYA
0 N1 E# o6 _+ v PHA4 C4 L- F7 _* k7 a
JSR Off_INT ;跳转到禁用软件中断& N) q5 U0 R3 Z9 l
LDA Addr_Data_TO# G! V, x( _. _$ v5 ~
PHA
! \% X T+ q7 H4 a LDA Addr_Data_TO+12 M6 m" x9 N* K, k# T6 r
PHA! ^$ p( E! p U' J4 f2 x g
LDA Addr_From_Start* r2 t: }' r+ g
PHA4 Q, N5 `: h I+ x$ g
LDA Addr_From_Start+1
7 j/ c+ ^% o& ` PHA& h6 o& ^6 F; g- J5 J
LDA Addr_From_End# C/ u' L5 \, _; @2 [( `3 e$ x2 W* p
PHA
- p2 \0 y, y- `+ b/ a: g9 j3 f LDA Addr_From_End+1
( b z$ J6 C+ t# J" M" B PHA" \9 g1 r$ b$ z" Z0 f& X' U
& V9 m, l! Z* X; C
* n: ~- J( [" q! H' v
Set_Data_Addr_Start: ;设置复制起始地址
: ?& e$ X- T, v% V9 @7 }) r% h LDA Add_Begin
! ~8 X% ]/ t( u0 O2 c& i6 l STA Addr_From_Start ;设置复制起始地址低位
& b* w+ C- m$ Q5 C' }9 F LDA Add_Begin+1
B% F# A7 q& R' Z: t2 u: O1 G* p STA Addr_From_Start+1 ;设置复制起始地址高位0 `/ c! f. F- c, J' N
) H" H5 X9 ?5 |( D7 TSet_Data_Addr_End: ;设置复制结束地址/ f3 X. K" r& @3 S; ?
LDA Addr_End
4 _ k& m# H9 s) z$ Z. w6 { STA Addr_From_End ;设置复制结束地址低位+ C3 R+ R+ ?3 c3 ~) N
LDA Addr_End+1
G7 a$ v0 e' k9 ~. W0 g1 \ R STA Addr_From_End+1 ;设置复制结束地址高位
* U' x s/ D( b; p4 \& p ; k1 |: a X7 B* T% }; h' {
Set_Data_Copy_Start: ;设置目的起始地址$ f0 C+ Y; g" m% d* `+ m/ ^2 ~8 W
LDA Addr_To9 O/ Y+ \1 y- p2 ?$ a
STA Addr_Data_TO ;设置目的起始地址低位1 L* x8 Q. A }6 Z
LDA Addr_To+1
9 D5 ?. U6 `" l0 ? STA Addr_Data_TO+1 ;设置目的起始地址高位& v6 ~# v+ G) c) T
T1 |" C0 Z8 G0 gOver_Copy_Cmp: ;复制完成比较
K5 C4 j( g8 k9 a- \. `, Y LDA Flag_Over, k' C7 D9 t3 W8 e
CMP #Data_Over ;复制完成标志比较
" @% t% Z Z; k1 z: F/ [ BEQ Data_Copy_Exact
* o. E, A6 {- Y9 P% g
) `* d- J" S3 Y+ \INI_XY_Count: ;计数器初始化
9 D2 b6 q; _/ t9 `* b5 V LDX #$000 M" s0 Z1 z# b+ B. D
LDY #$00
$ ~+ y6 o) a! n; K2 U& x 9 U% A. d: B* I8 }* m
Copy_Over_Cmp: ;地址比较
/ n$ [& k& y7 l. f" @- ^Cmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入)( K; z; r6 L- ^
LDA Addr_Data_TO+10 u ?+ W5 q; b* O: n# k
CMP #$60; d2 t3 w7 @) M) ?! L0 M, G7 q
BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制9 t2 ]: V& D* _( }
Cmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)2 `' |1 E- F$ S, U- v
LDA Addr_Data_TO+19 t$ Z: y' c7 }1 h: s- G7 W
CMP #$80% V7 r G% P% K3 {6 M" ~
BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制5 `6 C- `3 e! H, g
5 B$ X) m, A$ ^/ Y" {
Cmp_Copy_FREE: ;源地址结束判断
9 v1 P1 a/ V8 B C: N8 i LDA Addr_From_Start0 H; p( j- n E
CMP Addr_From_End
. c( S; E/ k; \: G7 h: k% R6 A( S! j; R BNE Copy_Start$ p3 R8 t( G6 _+ i. D# k
LDA Addr_From_Start+1
2 F `0 b. D- N; G/ P CMP Addr_From_End+15 x* l4 R4 D* P$ u! M
BEQ Copy_Over
7 v/ D! u6 Z1 q& Y S* p
$ o; B8 \$ `+ w R% v" W' Q3 PCopy_Start: ;数据复制开始* r# \# V- b9 U2 b2 {
LDA (Addr_From_Start),Y ;读取源地址0 F0 t, J6 m9 ]& C
STA (Addr_Data_TO),Y ;写入目的地址& s! \6 u6 J) U0 W q6 h6 H6 p5 R
Copy_INC_From: ;源地址低位递增
: v9 R& Y3 B$ b" z% k+ T# T INC Addr_From_Start ;源地址低位递增0 V# _' Z$ d; }7 \
BNE Copy_INC_TO
$ f( l# f, |2 b4 C' u/ U+ p. E# U INC Addr_From_Start+1 ;源地址高位递增
2 y9 D+ o+ c) p- H4 r% \4 p; F5 }Copy_INC_TO: ;源地址高位递增
( y$ @# Q5 r9 J& s7 Y INC Addr_Data_TO ;目的地址低位递增
* `: @" S; J+ U8 U BNE Recopy
1 c9 c" r; u: C INC Addr_Data_TO+1 ;目的地址高位递增
& \- V4 }6 ?9 M( l0 C0 FRecopy:* A0 M* u' m' k; H- ]' g
JMP Copy_JMP
a8 Q3 U8 Q, f4 e9 p( |* I9 N
$ q+ f, r& r$ u: f" @2 ~" hCopy_JMP:
0 c- u+ f7 o3 ]. y% `: L) k' n JMP Copy_Over_Cmp
! i3 ]( ]& j6 \8 i% @% M4 g3 k6 m; _; N }8 @
Copy_Over: ;复制完成
# c; o0 y5 N6 ]; Q; i, U2 a LDA #Data_Over( n% x1 ` a% |/ n6 |& o
STA Flag_Over ;写入完成标志
N5 }6 f; \! f3 g" tFINAL_BYTE:3 a( W9 ?/ ]9 r5 k3 u1 y% C8 t
LDA (Addr_From_Start),Y ;读取最后一个字节3 R+ C4 c+ U9 S. e' J' A" C
STA (Addr_Data_TO),Y ;写入最后一个字节
! x0 O7 f H, F) ~; E/ V
+ t$ h# y8 _6 i. J, J, FData_Copy_Exact: ;恢复数据
1 T/ Y$ ]7 k4 k$ m8 B" j PLA
; w: j+ D2 M( x2 J/ y STA Addr_From_End+1
Q: i: \" F# l Y# p C( @1 n PLA( q8 X: [, c1 O3 v( U; G: P
STA Addr_From_End
8 o% ]. W/ E% [5 I. s( S) a PLA3 m: H! c1 [- c, ? x
STA Addr_From_Start+1
: t* W8 E! C- [ PLA _" r, I( V$ z
STA Addr_From_Start
% W2 U& s# |; E PLA* H7 ?) H7 O/ R. [* H2 U' m
STA Addr_Data_TO+14 D& D8 g) c# c4 b2 E- E
PLA
3 O0 a2 ~, D3 A! U! v) O* |8 T* c STA Addr_Data_TO; O% S6 Y" v+ g
PLA9 ^ U% b* X& a0 O P( R, a" H
TAY
. J& [* Q1 P q7 Q PLA
& T, P3 O$ }2 w8 Z7 ]1 n TAX; y' l1 ?& h- L2 E4 W
PLA4 {4 M( ?. }' M; I" ]
9 s8 ?( K1 ^7 p6 H4 [" tData_Copy_Return:
! b6 x+ ?+ x9 F JSR Rec_INT ;跳转到恢复软件中断数据8 f" ?1 {2 w0 ^/ |+ Z6 r; }% m" g; c& z
RTS: t0 x- U* h# ~% Y
: _) D- e2 ], k9 f
Off_INT: ;禁用软件中断
8 x) L/ C* R" U& |& G( o1 z2 ` LDA INT_Addr
0 f$ ^) ]' w8 C) G; o AND #$7F& j7 C) |; `0 C$ ?8 t
STA 2000! y9 r7 O5 L/ T5 @1 @1 C# Q
RTS( a. L' i$ u, r8 B9 c
5 M& l. x& N( u9 s5 j* U N. q
Rec_INT: ;恢复软件中断数据
$ C* p3 L6 S. \ LDA INT_Addr
! h) i! z Q4 P( e3 r, J& s STA 2000
1 L# `4 ~/ l! w0 a8 `; k RTS |
|