|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑 5 ^; S8 ~4 i: d/ s! u& y9 C
$ B* W# R0 l( f9 A* v+ y: v8 n- h2 l
;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone
1 { V( B4 B1 S0 G- O, t ;2017.4.28
; L; k% G: N- k- @5 W, \ ;例子:双截龙3
% {8 |+ i8 L, t+ E" k$ [$ W# A: t .ORG $8100 ;定义程序开始地址$ E( \0 ^5 H* ]6 s7 t+ {
JMP Copy_Data_Start ;跳转到复制程序1 t1 {( b6 }0 m8 |! P1 H
7 E, {; j- H" ~9 w. h% S$ j6 DAddr_To: ;目的写入地址. o' ?$ o$ X1 w v/ s
.BYTE $00,$70 ;想要复制到的地方% j6 S$ k! P' z4 s2 q7 {* j
Add_Begin: ;源开始数据地址) A1 Y) w& v7 _9 O5 w2 K
.BYTE $00,$82 ;想要从何处开始复制9 ?9 p. j) d" A6 {$ J: {
Addr_End: ;源结束数据地址9 k7 R/ w: K: \' J5 a' T
.BYTE $EE,$91 ;想要从何处结束复制6 M4 ^! Y6 y) F+ ^: u7 J
- a5 i+ }, h! @) G2 ^, @4 T3 ]2 f& K+ jINT_Addr = $A0 ;中断地址, Y- u' E2 D" O. S
Flag_Over = $7FFF ;完成标志地址# X& U+ b8 F9 A4 I4 l; Q$ {
Data_Over = $7F ;完成标志
% L. l5 A5 g( ?2 O3 H) S# k6 n2 J# ?
D% T& L& ]2 _; B3 O* f/ a) T2 W: k* [
Addr_Data_TO = $A0 ;目的写入地址
: W3 s. E3 @7 B% E( Q, oAddr_From_Start = $A2 ;源开始读取地址
/ q, J6 W0 Q, D0 I, l) ^9 cAddr_From_End = $A4 ;源结束读取地址$ O1 {: C5 d8 o3 e: ?
& r( L( g9 c% o; Q# _2 v6 ~. U
Copy_Data_Start:
( l2 e# n0 Q) Q% r0 z+ d/ lData_Copy_Protect: ;保护数据1 Y1 \) c$ X) J. p1 v% E2 F6 w
PHA
9 k8 }6 D! A4 x* c! S TXA3 F5 M: j2 o8 F7 ?* F
PHA; \" G. ^- x7 @
TYA
- P$ G- n& f4 X( s* K PHA' P& m `7 U$ G; q2 Z D- T
JSR Off_INT ;跳转到禁用软件中断5 k/ J Q8 P8 n8 A7 p
LDA Addr_Data_TO
* q4 P/ V& a+ [% M, G% k PHA
9 J0 @7 [( i; N, x8 H- j+ h2 E LDA Addr_Data_TO+1* z) p" v& q+ _) {2 y! U- G; E% _
PHA o# I' C1 r1 v7 Y5 S( o# A' ~
LDA Addr_From_Start
) R% r; Q% e$ O3 _' ^5 d3 B W PHA
3 }) w _( K6 u- d, k, \1 N& ? C0 [ LDA Addr_From_Start+1" s0 `; L; a. n8 T1 b
PHA% l' X, @1 K; E: u# O5 e7 ~4 G
LDA Addr_From_End* \7 u2 V- h) A" b% b% F
PHA! d% \) B8 X/ ~
LDA Addr_From_End+1/ W! ~/ k% n- [; e, C8 |
PHA/ n& K+ R/ Z2 m! }% D
* |6 z, Y& l* Q5 F
* V; P4 W5 N. B G5 @Set_Data_Addr_Start: ;设置复制起始地址% c' @9 X% o% K3 m# e
LDA Add_Begin; K) m1 O# K3 _3 V; Z- A
STA Addr_From_Start ;设置复制起始地址低位
- j1 u, J: }) n7 G+ Y0 c LDA Add_Begin+17 I1 s) J# d: j
STA Addr_From_Start+1 ;设置复制起始地址高位# v/ m& T8 A! Q6 X
2 |2 E7 f' x2 t3 {( x
Set_Data_Addr_End: ;设置复制结束地址! I ?5 j# U) C7 b( r" Z5 M
LDA Addr_End
. m9 y6 W. ~! y4 Q STA Addr_From_End ;设置复制结束地址低位
$ U: N3 J% o. H5 c# e4 P LDA Addr_End+1" }! ?! D) e x/ Y7 R$ V8 ]
STA Addr_From_End+1 ;设置复制结束地址高位
. P R5 f( j' _) ~3 }7 A% h! l0 l ( _2 ~- B( I8 k
Set_Data_Copy_Start: ;设置目的起始地址
$ ~- ]+ H, ^. j1 H LDA Addr_To
. F5 ~/ A5 }; C STA Addr_Data_TO ;设置目的起始地址低位
5 ]$ C1 N) x5 c. Y LDA Addr_To+1
2 [5 G- R: D3 i STA Addr_Data_TO+1 ;设置目的起始地址高位. B, \ H: W+ ]0 m5 j) z
) a0 g, v7 d$ p9 z. W% HOver_Copy_Cmp: ;复制完成比较
2 \% L8 Y, ^) L! Y LDA Flag_Over; B6 L3 D* h3 j/ T
CMP #Data_Over ;复制完成标志比较! q, h- z. P2 b; ?6 \
BEQ Data_Copy_Exact# z8 I" s& K( o
/ h# c% m" {( Q1 V( u+ j% m$ S
INI_XY_Count: ;计数器初始化
( { ?6 M: \/ e R# O LDX #$00
! F' M$ N, U3 o" l! K) M LDY #$00" j* v8 u$ ~9 u6 V# m v( @
5 M) H8 L7 }" C/ \
Copy_Over_Cmp: ;地址比较0 \* d2 N h0 E: Z7 g: j6 ] |
Cmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入) G$ k3 [; d" S1 Q v% h
LDA Addr_Data_TO+12 b) }* W" e! v: I. d
CMP #$60. `3 A- T7 v( Z% o1 q$ y
BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制, {7 w! f; E' O- H. m* ?
Cmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)
}& y+ D4 Z8 y( \ LDA Addr_Data_TO+1
0 r" k8 v8 @" C CMP #$80" k" O7 b; h! k0 `
BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制
6 r( T n# P2 z- y9 o, G
+ M* o1 q4 l$ jCmp_Copy_FREE: ;源地址结束判断7 E# I" w J3 Q6 W
LDA Addr_From_Start
v; C/ r7 D1 C( w CMP Addr_From_End8 P x2 G( N$ g, G9 ^7 w' D
BNE Copy_Start" s6 q0 q4 _* d J! M
LDA Addr_From_Start+1
& O$ W1 G- S$ B* U& c+ n4 [ CMP Addr_From_End+1+ I. I g" P T# T' |
BEQ Copy_Over4 ^4 `7 z; P0 I8 P9 d* Z! V$ F
. n! x3 k6 J! Z
Copy_Start: ;数据复制开始
' h: o9 \7 ]2 N& f: X0 p LDA (Addr_From_Start),Y ;读取源地址
9 E0 ?" _0 X, y3 T7 R STA (Addr_Data_TO),Y ;写入目的地址
$ N6 m* V ?7 ` d' JCopy_INC_From: ;源地址低位递增
4 F: w* S* h& Q5 K8 A! J3 _9 K8 A8 h INC Addr_From_Start ;源地址低位递增0 N. }' Z) |" `' t' A; L
BNE Copy_INC_TO+ ]+ m Y) d& f- _3 T3 @
INC Addr_From_Start+1 ;源地址高位递增- l4 ^$ o- l3 S8 l2 x6 t
Copy_INC_TO: ;源地址高位递增) x5 k, F* \! v2 v
INC Addr_Data_TO ;目的地址低位递增
9 A* q! O% Z; y) M9 @- u' \ BNE Recopy9 o, H: T" k" r1 I# |) \
INC Addr_Data_TO+1 ;目的地址高位递增
$ e* S) V8 @0 p. K5 ]Recopy:
# D$ Q T( O- a% G8 Z9 F7 J JMP Copy_JMP; p' t" e' P* {5 e3 y. z
" c) T. z3 ?9 Q0 wCopy_JMP:
: T+ c. Z$ L/ s+ s# {* g JMP Copy_Over_Cmp5 [0 ]( \- |( u5 r
8 g" v! e& }+ @- I+ T. [
Copy_Over: ;复制完成( |" M6 W, r5 g# O
LDA #Data_Over, Z2 u% r! H' t) f$ q
STA Flag_Over ;写入完成标志
6 _) S; c$ \' C& g7 |; [FINAL_BYTE:
5 z; N m N2 T- B3 N+ a( g2 P9 k LDA (Addr_From_Start),Y ;读取最后一个字节
) w `$ m) V6 k- z1 M( I STA (Addr_Data_TO),Y ;写入最后一个字节3 K0 v m Q- T# m+ @
0 t$ E- k/ ?; L0 t4 l
Data_Copy_Exact: ;恢复数据4 M, ?$ m4 E9 N- s; G
PLA
6 U1 F0 K$ M3 M STA Addr_From_End+13 N) l: y) |' }) ^9 a
PLA: `# M: [4 g* D9 g
STA Addr_From_End
( e/ D/ g5 B0 y PLA
& w( e' h( Z& r5 c3 j( ~# y STA Addr_From_Start+1- M' [" g1 j2 M2 H, s
PLA
0 d% V8 i4 M, q: u, u. h* L& D STA Addr_From_Start3 C0 r3 G0 w4 E; l7 c% U' h
PLA
+ {, Z! {8 @/ D( W STA Addr_Data_TO+1
$ B4 e" h K2 J# Z9 N6 d" N/ `' I PLA+ t" O% Z4 L _( Y
STA Addr_Data_TO
4 x' h* x* @1 z- M4 Q PLA# q4 R q. u' X8 q# X. c8 S ]" z( F
TAY
7 k! m& `, k t/ d PLA# c* F- _ i; c& q$ r* Z/ F; P
TAX5 W# d K3 q- N, W
PLA
& u0 b2 z) n' Z) ` a
( N) P" O6 T5 o+ X; L) @- }- t5 RData_Copy_Return:
0 g5 E, Y4 u2 D o( s, ~2 i) y JSR Rec_INT ;跳转到恢复软件中断数据
; x+ C3 P! A! K8 O* o; M RTS
3 `* t8 d; g9 z; ~
8 x7 R, A. {7 x s+ @Off_INT: ;禁用软件中断! t: j" ?) U/ a. l! ` ^6 j @
LDA INT_Addr% @2 c& b0 k1 f+ f Q% I
AND #$7F7 k7 i- ~/ w0 H; l( t$ P4 H
STA 2000' b# w5 f7 }: M; ?' Y
RTS( }0 a" _( O) J( a% A
! `. U+ [5 Q; A8 l2 ?, k0 p
Rec_INT: ;恢复软件中断数据5 t$ {' A; W4 _0 k
LDA INT_Addr
3 t0 `& ~' l0 a- E; C$ [1 w STA 2000& G M; r) w8 \9 @
RTS |
|