|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑
e" H2 k# K% E' ~5 R, ^4 W8 q, h) b, B' ^/ o q
;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone& {: ]& j0 v/ K/ s
;2017.4.28
7 k" s0 I. M" {1 L. s4 p% V7 s ;例子:双截龙3' i8 c5 [2 U$ a
.ORG $8100 ;定义程序开始地址+ Z8 T- T# A3 I6 l& ~( w
JMP Copy_Data_Start ;跳转到复制程序
* `) V) B% I3 j9 V& K; p7 }8 `( H/ C2 |) {7 h2 R, K
Addr_To: ;目的写入地址
8 l- I( B$ A& N5 t3 F+ }* |6 d/ v .BYTE $00,$70 ;想要复制到的地方" \) @! b/ |, a& @3 `: Q
Add_Begin: ;源开始数据地址
" Y/ L' U* r6 F7 i, L6 V9 y .BYTE $00,$82 ;想要从何处开始复制
9 \1 H5 r$ p8 e! VAddr_End: ;源结束数据地址. ?8 \+ Z/ _ n" H0 `
.BYTE $EE,$91 ;想要从何处结束复制( V3 f# x+ Y0 L. g( r6 n
, J2 Z# ^$ G$ G: \2 C6 ?. p# q
INT_Addr = $A0 ;中断地址
- W) O% u, I4 d/ v2 o# b JFlag_Over = $7FFF ;完成标志地址
: h: |; z3 S, T2 u- iData_Over = $7F ;完成标志, M5 v3 B* Y8 c. l& \, j0 m, {" K
, n/ _6 V" _3 e3 Y5 u5 ?4 R# a% ^* B6 ]% f2 |! N
Addr_Data_TO = $A0 ;目的写入地址5 [+ P5 W+ l6 d [, O
Addr_From_Start = $A2 ;源开始读取地址. R1 E. y/ W4 e# K' b' t
Addr_From_End = $A4 ;源结束读取地址
6 j( o1 L/ A* s2 M) D# ?3 h* N6 ]8 }( c% L( B, A6 J4 V: T
Copy_Data_Start: @. j- x/ Z1 m$ m8 S/ t
Data_Copy_Protect: ;保护数据
2 l+ m p; |& E7 G: f M PHA
/ h A' ]) J9 R/ N7 R, U& }5 R$ K TXA
$ r9 r! V. A! Q- ~+ x7 p/ g8 S0 X PHA. p$ u' j( h- r; ^9 h
TYA1 c% O7 x2 A2 J$ i4 C+ M" }2 c
PHA9 T# R0 A4 {6 ?9 E) w
JSR Off_INT ;跳转到禁用软件中断( g5 x* m4 N: P. I$ n" z5 r
LDA Addr_Data_TO
+ _' X& j- p9 R) Z" M6 T PHA4 q7 d7 I! v H) ?$ I: @8 W, N/ s1 k
LDA Addr_Data_TO+1
0 P# p" \" w2 D2 ^5 ]; `5 b- u! i PHA/ A' ~% j0 y" U
LDA Addr_From_Start
6 G* m j3 x# P* V/ A( ]+ U PHA M- _/ b' Y/ v l& a1 s. O
LDA Addr_From_Start+1
* T& H/ Q2 l# w; N6 a, f PHA/ B/ v& x+ I# Q
LDA Addr_From_End& A2 I) J' R6 r( K
PHA
1 w+ `: P/ ^" }# \ LDA Addr_From_End+1* }4 B2 Z( }+ `! X. C* f% ^, N
PHA
5 ]. t& t; ^) x* N8 T/ Z" L" I9 N% d
# S9 S% w9 a; A0 l 2 e2 U7 @7 Y# p& X8 ]* g! Y4 D
Set_Data_Addr_Start: ;设置复制起始地址4 y0 F# t8 I! k3 l3 m7 `5 r
LDA Add_Begin* m& Q5 k: V; ~( Q; A$ l; ?4 r
STA Addr_From_Start ;设置复制起始地址低位
k% r( b3 R) { LDA Add_Begin+1$ P' I2 O9 u+ p7 ^7 ]* l8 S \
STA Addr_From_Start+1 ;设置复制起始地址高位
7 B4 q3 H2 K8 V
; p n, e2 ?4 Z3 ~Set_Data_Addr_End: ;设置复制结束地址1 C2 `$ A- @7 W' b0 C% t
LDA Addr_End9 T. L0 s$ I W- r& x
STA Addr_From_End ;设置复制结束地址低位
& N" R- T9 C" Q; Q4 P LDA Addr_End+1
2 y& A: r' Y9 B4 _4 E STA Addr_From_End+1 ;设置复制结束地址高位2 X* R: p+ r# y
' B) Z: S: l/ K
Set_Data_Copy_Start: ;设置目的起始地址
5 C5 [" m0 C' [ LDA Addr_To
2 T3 w8 \5 E; j( w0 J; W+ [# }2 d( T* k STA Addr_Data_TO ;设置目的起始地址低位5 q1 t6 ?$ [) H9 [/ s1 K I) i8 L
LDA Addr_To+1. ?: M1 }" P! ^8 B" g7 r& L7 F' Z$ j
STA Addr_Data_TO+1 ;设置目的起始地址高位
; C9 G% z1 u% m2 |% M( \
8 x S; r7 `- {% F& Y, I# N% mOver_Copy_Cmp: ;复制完成比较" N/ {$ K: r, I# l
LDA Flag_Over
5 n% B; e8 r( k/ {2 E CMP #Data_Over ;复制完成标志比较8 H3 q# c Z5 O. [- k) Q
BEQ Data_Copy_Exact$ M' d. Z# O* l7 O+ Y/ }( m
8 [3 k9 k o ?5 {0 ?
INI_XY_Count: ;计数器初始化
# B/ U5 Q# f0 A2 x) j LDX #$00
; P. }2 J8 c- Z3 s( s; L. M$ W LDY #$00. C$ Q. s! y. C$ U
( K, i% t n, ?/ p9 jCopy_Over_Cmp: ;地址比较
- B6 `# q( g5 U& n4 P$ VCmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入)
4 |( E3 W0 O! l. |/ ^8 S LDA Addr_Data_TO+12 ?6 |( J/ c, a+ { v
CMP #$606 l. X+ k g* }' c+ L1 ? w" J2 R
BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制; b6 F @$ g( h* Y$ J2 k) D
Cmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)
: b, e" z7 f0 G& T" F, }! A LDA Addr_Data_TO+1
$ [9 x4 c) s+ S% \; l0 P CMP #$80) h; a! }( e- q/ a/ p+ u) M
BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制0 j0 ?! D9 C& W9 Q" t% ]0 B, l/ r
, y( \( M; Q8 S9 E# P+ [Cmp_Copy_FREE: ;源地址结束判断
5 m) k; d5 T. ]" Y/ v LDA Addr_From_Start
& R5 D* q7 a9 U, y CMP Addr_From_End
' ?) l% Q$ l9 Y: \9 l# h2 W BNE Copy_Start2 E6 C! }( T7 k3 w$ v2 s+ \% x
LDA Addr_From_Start+1
, K% \# q. e2 w, n8 @* d5 E CMP Addr_From_End+1
% ?( v8 _6 V4 A BEQ Copy_Over
) @* \/ t1 T& v9 E 4 b$ j6 U9 l. z3 w* ]+ ^
Copy_Start: ;数据复制开始* k' s: A! _$ k: B# ?
LDA (Addr_From_Start),Y ;读取源地址. S6 W+ u! }% G4 K" t7 _6 i
STA (Addr_Data_TO),Y ;写入目的地址
& w4 @9 N3 H' U c1 [% S3 ECopy_INC_From: ;源地址低位递增
" n! c- B0 R! A/ c) C' ^4 S INC Addr_From_Start ;源地址低位递增
$ n7 r, ?' c8 a" X$ ~- D BNE Copy_INC_TO" L1 T9 b9 r5 `
INC Addr_From_Start+1 ;源地址高位递增7 Q/ K& B. X7 S. G3 l4 F
Copy_INC_TO: ;源地址高位递增
( Y' f+ d/ Y# N, I$ t: p INC Addr_Data_TO ;目的地址低位递增, G; F" K @3 P) ~" W
BNE Recopy$ y: e( M# Q/ x/ w. o6 H& y4 R( A
INC Addr_Data_TO+1 ;目的地址高位递增
L; q* E. R6 g# |4 x2 f" c: |1 hRecopy:
0 V8 q7 \* Y; D. ^) J1 a$ Y JMP Copy_JMP# e3 |4 r4 s$ d7 L
9 Z7 M7 P# L( T
Copy_JMP: 7 w$ ?3 `! ~. D# D |* L% t
JMP Copy_Over_Cmp
% F5 P* }8 b0 }5 [( \% l5 K" M7 H* W$ X! O" ]/ ^! n
Copy_Over: ;复制完成
/ {, z6 i i& m LDA #Data_Over; j n& n6 ?- K" {5 _
STA Flag_Over ;写入完成标志
0 e0 N3 J; ~0 mFINAL_BYTE:
4 y* G9 r" j2 W. h, } LDA (Addr_From_Start),Y ;读取最后一个字节
% v& I3 v3 P( Q$ x. d) I STA (Addr_Data_TO),Y ;写入最后一个字节
1 C5 G. n1 y4 k9 e
) N" D' l9 P& Z6 | LData_Copy_Exact: ;恢复数据
4 p! ^' |) [/ h, w+ |" F/ @ PLA* x/ n7 b0 z$ _, M
STA Addr_From_End+11 H3 D/ i/ Q8 h; X$ M3 ?1 {
PLA: S' E* d9 r: H: ]3 ]! @& x1 Y
STA Addr_From_End5 E/ i. n2 ?0 y" W3 {$ i
PLA0 j4 z, d7 `. m" I3 J0 F
STA Addr_From_Start+16 H- r# Z# Z- i
PLA
( F% I% L7 h5 K) S1 A STA Addr_From_Start
, P/ R+ {2 \, T, f! d PLA
0 N/ d) L1 @# a3 s5 ]7 z% @ STA Addr_Data_TO+16 D! F: ^3 C5 J, m5 b
PLA: M5 c; q3 E4 H3 F5 _0 @+ |2 X
STA Addr_Data_TO/ Z5 B5 _4 T' n0 ~2 ]% b& Q5 @
PLA1 D8 j5 a' R# g. @5 u$ |( Y& a ]1 a
TAY$ [" L6 ]+ [; K; P$ Y; O5 i
PLA
1 F! j; V& e4 g5 W8 F, ` TAX
* f- W; ?: l @: x PLA& {0 }5 ~1 `& Q/ p8 ~
1 y" z+ O; l r3 D' @
Data_Copy_Return:" N- F6 S( b. T* D# t
JSR Rec_INT ;跳转到恢复软件中断数据
) G5 c4 X$ Y4 S; }: G! @' o8 n, x RTS
0 W3 j7 E- Y# y- b
7 T7 w' M% E3 ?Off_INT: ;禁用软件中断4 A- i/ J4 x+ H8 z
LDA INT_Addr
# J7 l6 B. g% ?6 |& L) K6 @; y7 D8 R* `8 y AND #$7F- {4 O# J& Z9 Q" |1 b# E" A$ d
STA 2000) R5 d U. u, |" n2 k9 @
RTS
( J9 [* G _4 o; w6 B1 K4 @3 V
: t0 H4 c$ X( w2 s& c# Q' O) Q- B1 |Rec_INT: ;恢复软件中断数据
6 q J* u) Y+ c& K% M LDA INT_Addr6 Y% w9 d5 Y5 W: |! B& H B9 @
STA 2000
7 ]8 ^: G: k( _7 v RTS |
|