|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑 2 R6 B% N3 I1 J3 k& {5 b$ M
: g7 Q4 E% X& ^8 o; B% }* J& u! C$ p ;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone: |9 b" w6 @3 E8 D8 }: a( d+ \
;2017.4.28
`5 |* m7 K/ T ;例子:双截龙3) g4 F4 u! @: e( ^; c/ \
.ORG $8100 ;定义程序开始地址
) W' l8 q' U2 N3 {' `/ `6 S2 X JMP Copy_Data_Start ;跳转到复制程序
1 b% N* l. ^3 @! C8 C: _
+ U8 c$ `7 V5 a# d2 B( o+ qAddr_To: ;目的写入地址5 H+ E, y5 s' l4 t( V" F6 F/ g2 M
.BYTE $00,$70 ;想要复制到的地方
4 a% ]' h% i: ?Add_Begin: ;源开始数据地址
# D7 d" ^& B. J/ p) `' B$ k7 J .BYTE $00,$82 ;想要从何处开始复制
j: w5 S4 S7 P$ k, Y$ [# X' c* ~Addr_End: ;源结束数据地址
; ^, q& K9 {( Q+ n: i .BYTE $EE,$91 ;想要从何处结束复制
' I7 P3 T* N/ G% t; {) F( O
1 \# Q! r; |/ f* [% P1 q/ W0 w' _INT_Addr = $A0 ;中断地址
- Y/ E; O ?* }) OFlag_Over = $7FFF ;完成标志地址
4 i! X! T* E% `4 ZData_Over = $7F ;完成标志3 Y. N! V+ e6 X- S2 b% F# S
; B1 K/ c5 ]; F% c
8 b- V6 d. k/ Q5 _& ?; L; [Addr_Data_TO = $A0 ;目的写入地址# U, y, @9 |# J0 o9 G" f I
Addr_From_Start = $A2 ;源开始读取地址
$ {' ]5 ` o4 UAddr_From_End = $A4 ;源结束读取地址
6 C) ^! i! @# v( h9 f5 Q
( T1 R( ^1 `* |- R' K: F; UCopy_Data_Start:% }6 S. X! k" ~) r7 W0 N
Data_Copy_Protect: ;保护数据
7 }4 G0 a/ X3 Q/ }1 _: g: f1 s/ [ PHA
! h. m3 c" s7 U9 u+ w" e TXA
: x% o5 U4 G _9 v( J. c PHA. m0 A5 E+ _. T7 t) U# z" J
TYA3 ?, Q; o4 l# b& y& O' H$ o
PHA
# S$ D- x" z0 Q JSR Off_INT ;跳转到禁用软件中断
, z" D- j$ c, R* M. o LDA Addr_Data_TO
4 Y: y- `9 |7 \& C) r; x PHA
& Q# A6 p( K) P, c' C LDA Addr_Data_TO+1
' m8 p" ]' G v7 G7 ^+ W& c6 e8 r* \ PHA6 e$ f2 i. l0 z+ k2 f6 p7 y- w
LDA Addr_From_Start1 X `4 l9 w2 x( o
PHA
6 w, X% H4 C: F3 ~ LDA Addr_From_Start+1- C0 K% V: S0 g! r5 R% O
PHA5 i& O/ L, m7 d; y5 g
LDA Addr_From_End
/ ^" \5 q7 z2 i( H) _1 R; z4 T PHA
+ b: X; B4 @. h' j3 y, c) U5 L LDA Addr_From_End+1
r) u" R' Q2 l( A5 c( p2 H PHA
% G5 Q* Q# _: |3 N7 ~% f) t. \6 a! p$ V& Y
/ ^2 {4 y' o7 A( pSet_Data_Addr_Start: ;设置复制起始地址6 p* a- T2 k+ b1 V
LDA Add_Begin0 D* N# s6 j5 B- U
STA Addr_From_Start ;设置复制起始地址低位
: z- G' @0 }. |8 o _1 a3 @ LDA Add_Begin+1
: m! `" W/ U b( ~5 ?7 t. K. g" Y6 y2 R STA Addr_From_Start+1 ;设置复制起始地址高位
, ], x; n5 q0 I6 P( W
7 |6 S: `1 C1 YSet_Data_Addr_End: ;设置复制结束地址% X# o+ @8 b! `$ M" W
LDA Addr_End
: X% f5 t' G, c4 Q STA Addr_From_End ;设置复制结束地址低位
, i3 c; p4 n; t( Y1 g; [ LDA Addr_End+1( P9 N8 K$ b' S
STA Addr_From_End+1 ;设置复制结束地址高位, [( ~9 n6 \& G+ L
+ M5 |* D, [! h+ _
Set_Data_Copy_Start: ;设置目的起始地址. b8 \; {& M0 x# W6 m. W5 S
LDA Addr_To
# t* {( L6 Q8 P* r STA Addr_Data_TO ;设置目的起始地址低位2 a" I" D4 u# n) `* }; S
LDA Addr_To+16 {- q2 o. Y$ ]) d6 T$ @% G( X
STA Addr_Data_TO+1 ;设置目的起始地址高位3 S9 F2 Z! J `: }8 p
' Y" b2 o9 @) R. {
Over_Copy_Cmp: ;复制完成比较% P: u8 w1 n9 H# w1 x4 g" H$ G5 [
LDA Flag_Over9 X. w( C" ^5 \
CMP #Data_Over ;复制完成标志比较
; M0 |9 G$ C2 Y) ^# O BEQ Data_Copy_Exact
; k0 \$ E9 G8 B- W3 Z/ g# |
^8 U- g; x& v# p% y/ Q( u" rINI_XY_Count: ;计数器初始化2 C3 l. c* i. A- L$ U
LDX #$001 m2 y7 S- r6 p5 ^: o
LDY #$00
* ~- c: Y! k* B! K1 B, Q6 ? 1 y( L5 n8 v4 y1 o2 b. g
Copy_Over_Cmp: ;地址比较
( x# A. a- x5 g- R* f' | ECmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入)- i' Y. y. k$ [2 E
LDA Addr_Data_TO+1
8 \7 V+ f _* E- o! X9 K CMP #$605 M9 K% u# q" d2 c# F6 d
BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制: a/ D ~3 ?5 g: V- W2 |; ]! [
Cmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)
" J8 N) T% e- f0 C7 M6 B" r* S0 q4 S LDA Addr_Data_TO+1
7 a0 g: f$ v& H& m CMP #$80
2 n# j. m: K+ _9 r. `! Q BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制
$ J. i* V" D9 }
, ]5 Q6 [9 z# Y. e% U7 \5 eCmp_Copy_FREE: ;源地址结束判断% H! ~% @8 ?% U8 O- x1 H' L$ H% z% k
LDA Addr_From_Start
4 R4 o/ ~9 q+ |) s ? CMP Addr_From_End
2 u+ a* k: ~/ K; U, j8 M$ P4 _' O BNE Copy_Start
9 K0 y8 e& I8 X2 u+ m5 \4 x/ ^ LDA Addr_From_Start+16 b, Z- \+ f T: ]# D( X0 T. U
CMP Addr_From_End+1( C2 V& x8 A/ v# z
BEQ Copy_Over
/ V/ P8 q" t. b; c! I! u" P' C
# F: B5 N4 j/ R7 h uCopy_Start: ;数据复制开始. O$ y4 r+ s) I; f; L) x
LDA (Addr_From_Start),Y ;读取源地址! G( ^8 Z! v0 A- c3 V: y* y2 D* I% T
STA (Addr_Data_TO),Y ;写入目的地址' X6 D. @# M2 ~4 `
Copy_INC_From: ;源地址低位递增+ L( o H! g7 @8 b$ l1 @
INC Addr_From_Start ;源地址低位递增+ v8 a' c8 i0 p) A. B6 f7 k9 c, h7 M
BNE Copy_INC_TO+ @$ O* [; q3 d( L( J, a
INC Addr_From_Start+1 ;源地址高位递增
# B, c; w/ Q0 [6 ]' B8 o7 q+ BCopy_INC_TO: ;源地址高位递增: G8 ^3 t; D$ {1 f
INC Addr_Data_TO ;目的地址低位递增
, w8 t ]( U" i. z) }8 D* f BNE Recopy
1 \( W3 O. C( [ INC Addr_Data_TO+1 ;目的地址高位递增* g7 Y2 Y7 Z) ]$ L# Q. O* z$ B$ {/ I
Recopy:
3 J7 w1 @" M& {+ R/ b JMP Copy_JMP# p, `6 K9 F4 Z; Q
5 d2 |9 i5 R; w4 }- I
Copy_JMP:
& O/ H6 |# O2 c1 R1 Y) x JMP Copy_Over_Cmp- A1 k9 B# ~8 ]7 V4 j* T4 Y/ e, `
1 |! c ~' B) d; F: u) p% y8 J7 vCopy_Over: ;复制完成! V, H* B' Q! k" H2 A9 ]
LDA #Data_Over
) k9 r- V: d4 h+ M4 Y STA Flag_Over ;写入完成标志
- M4 `7 s2 D4 G7 ~! t2 I$ v. MFINAL_BYTE:- g$ Y" \8 h/ |9 x- R# S* v
LDA (Addr_From_Start),Y ;读取最后一个字节, s/ \( t/ f4 q' q2 e+ g
STA (Addr_Data_TO),Y ;写入最后一个字节
6 J9 f. e! O% s' t8 h 9 ^: Y' z2 W# ^0 N& R' Q& Z" F! F/ x
Data_Copy_Exact: ;恢复数据
; h5 P& c% D! Y PLA
0 p3 x3 D8 H3 ]( T5 Y STA Addr_From_End+1
1 p: J; a z5 O: C6 T- T PLA
) @1 t% U9 ^+ p7 \4 U, g STA Addr_From_End$ s3 f: b: F7 r* _0 @" [! A: ^, B
PLA
$ {" ]& b$ C6 G! I$ U) x STA Addr_From_Start+1
+ S7 y3 t2 J8 w PLA
$ b V6 G o' P# I( n STA Addr_From_Start
8 I/ v( a# B6 O# }/ u PLA, o- g; l& ^" s( A7 G! @1 a
STA Addr_Data_TO+1: |, |$ q2 B+ r: f3 z
PLA
: ]& W( N# `" y. n/ Q STA Addr_Data_TO( d0 t/ n. K E5 d9 Z$ a4 w8 {8 m
PLA3 m0 _6 C" y T O+ X1 i6 g3 p
TAY
3 y7 ]( {: l2 |# d$ X PLA, g4 m% l: D' ~ R
TAX7 G5 l6 t9 h4 t
PLA
* _- O* f' _ j, z 5 g1 v5 E) ~3 v( ^/ u% f8 ?4 m
Data_Copy_Return:
5 o/ u- `; y5 J2 E+ n* q JSR Rec_INT ;跳转到恢复软件中断数据
: q. H, U/ w8 ^6 l- _, R RTS/ e$ s* l+ O- J" W! w( G
1 k3 i6 o% a/ s, n$ ]. SOff_INT: ;禁用软件中断
& c* c' w: n* I$ J0 z+ d3 i LDA INT_Addr$ H/ `! o8 S: T7 N7 \6 X& r
AND #$7F
^6 u! o: D2 Y* v& }( L; n STA 2000
: m8 s4 y2 Z) K8 z! l+ T& q$ x4 \ RTS5 g C$ G6 c2 J6 |9 e) [2 O$ T$ c
) {9 X5 ?! c6 |) N
Rec_INT: ;恢复软件中断数据
. b! l M; z4 j' u6 ?# K4 V4 ^ LDA INT_Addr8 ~" f% T/ B1 [
STA 20006 t( Q/ K2 b; O2 M5 t
RTS |
|