|
|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑 0 G ~, Z2 }; l$ c! R
# C- q& `. h9 D( Y0 W7 P3 I' u1 u ;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone
`4 F" R& o! L) g& F0 `7 q ;2017.4.28) B, X3 i* Y. S; [. ]
;例子:双截龙34 I, ~9 Y$ [6 v: y9 R/ b
.ORG $8100 ;定义程序开始地址
; o8 k# d+ {$ P6 k$ l* k% O JMP Copy_Data_Start ;跳转到复制程序6 S2 k. z1 ?5 k* y9 q
- c A) i8 K/ |" x. ~Addr_To: ;目的写入地址6 X1 _- E2 E. ^* `1 R
.BYTE $00,$70 ;想要复制到的地方
+ z2 |# \8 Y+ F, S2 bAdd_Begin: ;源开始数据地址9 ^; P. ^# [1 D6 M9 a
.BYTE $00,$82 ;想要从何处开始复制
4 o. u% j) T9 r* Z/ U& U5 ^Addr_End: ;源结束数据地址9 M- ~ U9 G* r3 V
.BYTE $EE,$91 ;想要从何处结束复制
% F: L/ o4 s: [8 u& L# e7 p7 x( @5 M* ^- i; K* [
INT_Addr = $A0 ;中断地址
4 c1 q. C! `3 ?% x/ P& m! nFlag_Over = $7FFF ;完成标志地址
$ y' c2 T4 L- @; i: X4 BData_Over = $7F ;完成标志
; ]$ p0 u2 l( [/ E" G* M8 n/ R* a# h) o) H( Y% T
0 T4 ?/ b; a$ Y; s2 c, D% h. Q: ^ t: N
Addr_Data_TO = $A0 ;目的写入地址! s; m+ L. E2 @3 {5 q$ K
Addr_From_Start = $A2 ;源开始读取地址. C. F6 `$ M8 ^6 Y% @: Z) o- @
Addr_From_End = $A4 ;源结束读取地址
7 M# }: H9 X% }: X* D1 r; m8 @, v' u2 _! Z& ?9 ]8 P" E/ _
Copy_Data_Start:4 L7 T( P- L# Q" M& N6 \
Data_Copy_Protect: ;保护数据+ m9 R; k3 d7 v
PHA6 J- P8 ]7 D3 P
TXA
+ {, B. S Z7 B1 t4 x! K" p PHA
6 D2 G$ f- l. D7 } TYA% o y C- {* E; ^
PHA, I+ {) ^5 W2 Q! u( Y' @( l
JSR Off_INT ;跳转到禁用软件中断" z$ J a6 V& G' c4 B: k- K
LDA Addr_Data_TO! f, r' k( R! G1 g7 [8 V1 d: F
PHA
5 R: R1 C9 e3 |+ u/ C3 L LDA Addr_Data_TO+1
! Q! C( ]& |6 a( \% G& { PHA
+ q$ ]6 N8 U6 D# X4 K* P8 i LDA Addr_From_Start
% W+ x/ R' h5 P2 L( a4 H PHA4 R5 z# t: f/ G8 V3 [1 s) X3 y
LDA Addr_From_Start+1( t+ B! t |8 b7 j3 |4 e. Z% {+ M
PHA# L$ q N6 {. Q( \
LDA Addr_From_End( Y9 o4 ?" x* D# P) O: H, f
PHA
$ L4 v" m7 O3 x+ ]# B, e! {* ^ LDA Addr_From_End+1* k: _/ K# {# g- s
PHA) V. M) ~6 T& c# o8 ]' e
& Q+ C- m% F; t # A) x6 ?5 n0 e) V5 x
Set_Data_Addr_Start: ;设置复制起始地址) K& k* A/ r" R
LDA Add_Begin% I" g$ ^: {: d" Q# w
STA Addr_From_Start ;设置复制起始地址低位
! `, p* o" i2 p LDA Add_Begin+1( @% W1 M9 C# G# O& k5 w8 V
STA Addr_From_Start+1 ;设置复制起始地址高位) b# s3 q D$ Z
0 O/ I1 h F2 KSet_Data_Addr_End: ;设置复制结束地址
* P. D) \; d! s LDA Addr_End
# U% |9 t3 D- O" ?* W, ] STA Addr_From_End ;设置复制结束地址低位
2 Z0 x& c% F7 e3 K& ]' f& m LDA Addr_End+1
8 K4 {- R0 v* R! H& e9 E6 v STA Addr_From_End+1 ;设置复制结束地址高位
* V) G- v ~7 u8 k- [$ K9 c
# ^) X% q& f: t5 M' | H/ M0 Y2 u7 ^Set_Data_Copy_Start: ;设置目的起始地址
# U0 }- K8 L% ]* i K LDA Addr_To
h9 T2 k' y9 ]+ J# g8 d d STA Addr_Data_TO ;设置目的起始地址低位
& |1 ~8 O- {! j+ f0 k2 p: B) [" \ LDA Addr_To+1/ Y' N0 H" \# x+ B2 U' ]- o8 P
STA Addr_Data_TO+1 ;设置目的起始地址高位 G& W1 P. i) T0 g- h! \: C5 l* Y
1 N( Q+ T- F2 ~2 L1 _- c- Z4 S6 GOver_Copy_Cmp: ;复制完成比较
' [0 O: A$ \$ B6 E. h LDA Flag_Over
% v" S: d* f" p% P4 k% s3 D2 M( B- j CMP #Data_Over ;复制完成标志比较
# R) l+ h h( m6 c BEQ Data_Copy_Exact
; f! A+ N, d) x' O" t- T! P, Q
[2 E4 B- C" K2 v4 fINI_XY_Count: ;计数器初始化
" }$ n/ w: I# y LDX #$00
& `- X; Q# E0 y. j" h. f+ o LDY #$00( G$ T6 S* }; O# z
7 H1 r" B. F# }' s1 a/ x$ wCopy_Over_Cmp: ;地址比较
. X- a$ {$ F( u7 C1 g8 ^, uCmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入)
% H: ` l- A& a& B! P LDA Addr_Data_TO+18 |$ d v; u) e9 K# X2 H( i
CMP #$60$ z" g7 U% A( g: f
BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制
9 I7 r F( H! @, WCmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)
2 a4 ]4 i5 C7 E; I2 B LDA Addr_Data_TO+1# e2 o7 ]8 s1 @: e
CMP #$806 @' W8 C6 Y: T1 H# s4 |+ \; z
BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制
6 Q; s$ t3 d5 D# ]) U+ G8 c , b6 V% C3 L! G: i. C% |
Cmp_Copy_FREE: ;源地址结束判断* W2 [5 v7 ]3 ]( b' y/ D; |9 p' l7 U! B
LDA Addr_From_Start V! ?) R+ f* @( `0 N
CMP Addr_From_End; \3 T1 l% w1 }1 C$ R5 _ l
BNE Copy_Start9 r: d: U. ^5 k0 X0 r
LDA Addr_From_Start+1
% N0 A, p8 Z* p CMP Addr_From_End+16 X0 L; _! _ O! d$ m3 J. n
BEQ Copy_Over
* q% B9 G! B0 c/ \/ G! R* c
3 b; l; D' x& u4 C& u H3 ECopy_Start: ;数据复制开始: v8 J. z @' b2 [ i
LDA (Addr_From_Start),Y ;读取源地址8 T1 G& j, C0 i# [3 v% @% P. n+ e
STA (Addr_Data_TO),Y ;写入目的地址! M* Y0 S5 r; W8 ~6 E
Copy_INC_From: ;源地址低位递增
8 v7 I7 n% W, D S0 W3 a+ w INC Addr_From_Start ;源地址低位递增7 N: Q. H- o) G6 G+ O( V! E3 P
BNE Copy_INC_TO
% I+ J- b I2 k, C INC Addr_From_Start+1 ;源地址高位递增- `8 q. f& D+ t6 C* ~; G; Z; @
Copy_INC_TO: ;源地址高位递增7 m$ j. ]( ]' U( W" P8 r$ ?
INC Addr_Data_TO ;目的地址低位递增0 Z% N# [: A2 J1 ~3 G7 U% k
BNE Recopy
7 v' G F$ Q! S* G INC Addr_Data_TO+1 ;目的地址高位递增
# _* |# e( W' c- U% NRecopy:4 y8 y6 N0 D- u7 B' p0 W
JMP Copy_JMP
0 a" l, m- |, c% C$ h
9 b) Q) R2 ?! j% HCopy_JMP: : |8 P, S2 z9 e* R: l6 u0 u
JMP Copy_Over_Cmp9 X' L8 Y" C1 {; |! {% b- o! |
9 G& W7 y( \6 P* I% M. t
Copy_Over: ;复制完成- N/ z8 f5 K, Y& k
LDA #Data_Over
6 S4 J _, g( O1 T! {( h) t' Z STA Flag_Over ;写入完成标志; E/ [. E" D+ Y4 |+ I" i/ x+ a
FINAL_BYTE:
8 z" y+ ^- M' t9 O- B. @# v: Y LDA (Addr_From_Start),Y ;读取最后一个字节8 x( S$ C& H' v# [$ O$ \9 l
STA (Addr_Data_TO),Y ;写入最后一个字节
8 S& s8 b* Z; L! r; H
+ a+ i' l- s9 HData_Copy_Exact: ;恢复数据
: b; v* G4 C1 E' l) y PLA! o$ I3 K+ k* G# C+ o6 k
STA Addr_From_End+1
, V8 w# u, v. |. o' t. s PLA
& {, G. g$ B" [: `# s' Y STA Addr_From_End
2 R, R. p+ U/ T! m: H( u PLA# ?2 m6 r) \6 T+ z0 o. r
STA Addr_From_Start+1. y6 z! K* N" P$ N. R
PLA! |& F& j. q/ o. z# Y& b; |
STA Addr_From_Start3 q) d) u- X" H0 z+ G& {3 K
PLA6 f4 j+ }$ d# }+ n
STA Addr_Data_TO+1
6 V- A8 w C5 c l* R) {5 T0 P; B PLA8 e! x1 h' b( z2 e1 \; X8 _
STA Addr_Data_TO
, E- T4 n- r5 d5 ^, [ PLA
% I. A- A8 z# m& ?& Q0 f TAY
" j8 _ _/ V, T4 U PLA
, Z4 R7 g0 D# i# O% r& z: ~ TAX
+ J! T; U8 W8 L. u5 z PLA
4 G }8 t8 d5 F: C' i3 C& ~5 M+ o
9 N4 E7 _9 F, U1 ], hData_Copy_Return:
1 x b$ p9 n1 b9 r: g2 y4 j( ^ JSR Rec_INT ;跳转到恢复软件中断数据
% D( r0 k- I t+ x RTS
2 O$ p4 _. {- k/ }
* R/ Q: o. B6 U tOff_INT: ;禁用软件中断# j, q5 F& L3 \4 C1 f3 `2 ~
LDA INT_Addr
' e: g' }& ~7 h* B, |# t AND #$7F
- H7 R$ v" F4 \/ x0 P STA 2000
% P+ Q% Z1 k' ?/ i RTS7 H4 j8 ~% f2 u' [& D3 R8 w! I4 x
' ?; ^8 M, E. b1 }
Rec_INT: ;恢复软件中断数据
5 m7 V& O+ x* F$ m3 }- g$ w3 u LDA INT_Addr
L/ l C0 W6 q+ y) y2 n8 s STA 2000
! s T# J! u! c8 r( E) W+ h, F4 K RTS |
|