|
|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑
5 ?1 ~* w4 ~/ {0 a" @5 e# [ c, X( L% D3 ^/ B7 L
;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone- D4 j1 v; c7 c/ ]
;2017.4.28
* v: H2 Z4 r, S7 i/ E7 b ;例子:双截龙3& U8 W9 ~+ A( W2 F/ V N' f
.ORG $8100 ;定义程序开始地址! D L) [: x3 `1 ]% x- J6 n: h
JMP Copy_Data_Start ;跳转到复制程序
( J( |" b) M" V3 P- S- M" _7 k z4 J5 l% g3 B( n
Addr_To: ;目的写入地址
2 m. I4 S5 r; U4 Z/ F. E .BYTE $00,$70 ;想要复制到的地方
% q/ c9 B, v. P! t1 l8 yAdd_Begin: ;源开始数据地址
2 W6 P' q$ N- W: L .BYTE $00,$82 ;想要从何处开始复制# p6 _4 k- {, u/ i) `: c
Addr_End: ;源结束数据地址
& k' ]2 W. l" @! B .BYTE $EE,$91 ;想要从何处结束复制' y, G$ Y+ [4 o/ j
, p6 e; R0 e6 _ J
INT_Addr = $A0 ;中断地址+ W0 O3 `; |' _& a6 V
Flag_Over = $7FFF ;完成标志地址1 X2 _2 l0 j8 O6 K4 j; x6 } l
Data_Over = $7F ;完成标志
# C- h r) b4 W7 ?/ ?& c' I' E2 @! Z5 J5 T& m3 K) L) w# f/ V
1 Q. @6 \4 j# |3 j* T" r, y6 ^Addr_Data_TO = $A0 ;目的写入地址
' p: Q; q0 c# S z U! w7 v; y JAddr_From_Start = $A2 ;源开始读取地址1 x% o! J* o+ z7 C' g
Addr_From_End = $A4 ;源结束读取地址
4 }0 u7 N4 O' M4 z) j4 l! k7 E5 }4 w8 Q! F9 [: Z& ?0 l. d
Copy_Data_Start:6 O% [" O3 A1 ?. R- l
Data_Copy_Protect: ;保护数据
/ U9 T: f; k' `& O& u7 I PHA
& w+ g- M' C/ t; ?: a TXA
! I. h5 W1 M0 U PHA$ z9 a) v& |" q' N% K) T
TYA
* l1 |$ b0 g O& a4 r3 F PHA
) o* f" ?5 ~% N+ F# k JSR Off_INT ;跳转到禁用软件中断5 T1 `5 w8 {# r
LDA Addr_Data_TO3 ?9 i/ R8 J7 \
PHA' N( m! n+ c' e8 X
LDA Addr_Data_TO+1
9 |. e9 i0 S2 ?3 {$ } PHA
- h k$ d. }9 ~% ~: w; c* k LDA Addr_From_Start8 J! m4 R D; z6 K- s
PHA# M$ M) E5 |4 _ P) b5 |
LDA Addr_From_Start+1
6 x, T5 Q+ |( @1 n PHA
* |* q; Q+ C& u1 x$ e LDA Addr_From_End/ A( F) S- |( D$ ?
PHA; `7 ]4 d9 v: t2 k9 a
LDA Addr_From_End+1
6 A" o2 g# v" J P. C PHA( l( K+ H2 j+ k1 r- p# }6 Y
; I i( a2 j; }- e* F% X ; P1 [' T* |- r4 S, K6 T/ Z
Set_Data_Addr_Start: ;设置复制起始地址
: C6 S( U/ o0 h; A6 d LDA Add_Begin t( w3 n$ d/ Q- T7 n6 Q! m
STA Addr_From_Start ;设置复制起始地址低位
- ^- q! ^8 u' r# q( Y$ K LDA Add_Begin+1* W. P0 b) j# x6 J4 ?2 t* C
STA Addr_From_Start+1 ;设置复制起始地址高位. Y& I1 E5 o5 h
; m5 L, u/ X/ k6 P% aSet_Data_Addr_End: ;设置复制结束地址
0 y2 g3 R' ]3 Q0 q% w/ a LDA Addr_End9 Z" s" l7 i2 P2 r
STA Addr_From_End ;设置复制结束地址低位6 O% a& A7 \3 o- J0 {) t
LDA Addr_End+19 ], ~6 t. v. L3 h3 Q
STA Addr_From_End+1 ;设置复制结束地址高位
9 B, F) m( r- s: W; r( U" r 6 V3 P5 a" b4 X* k
Set_Data_Copy_Start: ;设置目的起始地址9 t+ s0 V0 E* o: p6 C) c0 E- H
LDA Addr_To; [( s2 o: E6 o1 Q. u, a
STA Addr_Data_TO ;设置目的起始地址低位, b, S& P! l0 g# j
LDA Addr_To+1
* P0 D2 Z9 u5 S0 |, E STA Addr_Data_TO+1 ;设置目的起始地址高位% K3 V7 ?5 N6 x3 C
1 ^5 F5 l8 Z% }7 qOver_Copy_Cmp: ;复制完成比较
. }0 D3 a4 d5 G1 l6 s. ` LDA Flag_Over# P; B9 N) J5 N( U
CMP #Data_Over ;复制完成标志比较
0 K: S) B$ c% I9 n BEQ Data_Copy_Exact
6 N% s6 i# l' v& I; V- A' z/ N% O, }
INI_XY_Count: ;计数器初始化
+ W$ R( N& \" s3 X; Z# G LDX #$00
0 [# n* v" S8 `/ K" [8 g: u9 W LDY #$00$ w7 a/ G6 G& |" M
# t, Z; V4 V' h1 t4 B f1 fCopy_Over_Cmp: ;地址比较
8 J+ Z h7 M7 ^4 d4 ^1 r1 VCmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入)
5 ]0 b& C1 E1 | LDA Addr_Data_TO+1
* s, L8 [' `0 h- L: U, W$ a, D: P CMP #$60
3 v6 ^6 T6 E% k# K BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制# q G& g5 ?) i. Z( k1 D- k
Cmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)* S/ Z0 H7 n3 ^) V8 `. W
LDA Addr_Data_TO+1
; y* k. ?- K0 N" q: j( r9 Q) z CMP #$802 K; |% Q: Y; i8 s
BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制; P5 Y5 e& F, w, x) N$ a) g! @/ I
6 U* L& O }, |& vCmp_Copy_FREE: ;源地址结束判断! _+ a, f3 \0 ^6 l3 l5 Q' W' r2 Q
LDA Addr_From_Start
3 j$ v8 j x+ W4 D# J8 k, i8 y CMP Addr_From_End
0 H* G: @1 a( n$ q. E BNE Copy_Start" n" a8 G# M' j" S# w% }% k
LDA Addr_From_Start+12 h2 W$ C7 ^9 @" b- U
CMP Addr_From_End+1
7 y- ]( t4 T" E. g1 k BEQ Copy_Over
7 e- i! G; w7 L# l# o D" i" a
7 z5 x0 X7 _2 O5 v2 X2 h1 PCopy_Start: ;数据复制开始
& P: g8 Z, v0 g6 f! h$ } LDA (Addr_From_Start),Y ;读取源地址
4 w8 U/ M& V4 A! q STA (Addr_Data_TO),Y ;写入目的地址# P- E: M6 k: A) U* | M
Copy_INC_From: ;源地址低位递增6 W: @" r' N/ @. ~ V/ Q. i' r7 s
INC Addr_From_Start ;源地址低位递增
2 V U/ V* O7 Q: l+ u3 f BNE Copy_INC_TO
/ Z) x, S" l" g( z9 _8 ^% d INC Addr_From_Start+1 ;源地址高位递增* M) c/ F2 O+ l8 }7 C* k
Copy_INC_TO: ;源地址高位递增
$ P6 G4 A4 k4 E- n+ M1 Y INC Addr_Data_TO ;目的地址低位递增
* P* t, i, a2 Q! R" | BNE Recopy5 Z- o: F/ P4 m
INC Addr_Data_TO+1 ;目的地址高位递增/ a4 A- Q( B* |; j4 N# [
Recopy:
/ }2 @7 J1 |: \* [% |! J JMP Copy_JMP
* ~, z0 W. w$ N+ b/ G1 ?
. q& E7 k! d0 T& i# ^2 RCopy_JMP: , j4 @5 ^: J6 ~1 F
JMP Copy_Over_Cmp2 N8 ` }! X5 u& H4 f
8 S2 J4 R& ]* Y, e- sCopy_Over: ;复制完成8 I0 S6 n& P" f& y# H
LDA #Data_Over. i# e, p" J, B, ?9 S# t+ R
STA Flag_Over ;写入完成标志2 _7 w% h( G! O( y
FINAL_BYTE: F& |, j: H5 l4 L
LDA (Addr_From_Start),Y ;读取最后一个字节: A$ @5 o) Y& Y" ?
STA (Addr_Data_TO),Y ;写入最后一个字节# x* {1 U+ D& B9 r6 v* r
9 ^! Z7 J- t7 \
Data_Copy_Exact: ;恢复数据7 t! b7 H8 \, L0 |; C
PLA4 T- H! ]' {% O) [4 U& n
STA Addr_From_End+1' B8 m0 [% m3 v+ E F2 z
PLA+ N! x$ X" l- U9 k: J' F
STA Addr_From_End
2 [7 e( Q8 ^8 q9 x- Q PLA, S! x3 g1 E; r. J0 w5 f( h
STA Addr_From_Start+1
. i& \% M. y: ~+ y: |/ _ PLA
. @/ g) i4 E' C; U' v STA Addr_From_Start
1 t0 G g- |8 _$ a8 d$ a" _5 x8 p PLA1 Y4 M w& ]$ K( ?! U, `
STA Addr_Data_TO+1
% u B( H* e1 K' a- _ PLA* D: d4 t' a( t; z) j( P
STA Addr_Data_TO5 t+ S: \0 J8 o" h( V7 ~
PLA
3 Z) ]% m2 P3 v: z6 H4 k TAY
c, }4 f; p! a1 n. x6 D' N PLA
; m( r6 L* j) p, g TAX
! B0 ~% y. _, i PLA9 M1 f/ T, ]" v0 e. ]# p* d
3 e% |5 _$ D( ?! m9 l6 g6 c
Data_Copy_Return:
$ |9 G7 ] `# i. T# } JSR Rec_INT ;跳转到恢复软件中断数据
0 P& X2 f4 y8 z. ^$ Y, H' e RTS) \, R4 C8 F$ O: {7 f2 M
0 w$ h* e6 Q4 p# _2 r5 Q/ C) fOff_INT: ;禁用软件中断 s1 K3 C6 d' t% T) f
LDA INT_Addr' j& B' e( y# h
AND #$7F
/ w. W$ J$ v, Z% u0 e# @ STA 2000! L3 F2 P. v% [* T: o
RTS
3 A2 K+ [% v) N+ _5 {' l3 P- c# `7 c9 u* x. d/ w7 v( ~% z
Rec_INT: ;恢复软件中断数据
$ u( m* h8 a! t2 A |: t LDA INT_Addr
, M( l3 h; X4 |; U7 V1 K3 _8 Y STA 2000
; q, O6 ?9 J# a* n RTS |
|