|
|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑 . T3 j. {" Y9 c$ N, f) J; {
+ A0 S' I: }. o) K ;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone
7 R8 s* }* Y% Z$ X0 B, w ;2017.4.28; O% e% w: }4 U8 h% u
;例子:双截龙3% a9 c9 `! I1 x; a/ R& Q9 B6 \0 ^
.ORG $8100 ;定义程序开始地址1 i8 u9 E1 U) J! @
JMP Copy_Data_Start ;跳转到复制程序
) l1 J) f. M1 o9 m
' u K) S/ x& P. e0 eAddr_To: ;目的写入地址1 d$ R1 ?* w( Q6 o
.BYTE $00,$70 ;想要复制到的地方 K, M- k! y! N0 p9 u
Add_Begin: ;源开始数据地址
9 e/ n1 f8 O* T3 J$ @8 X .BYTE $00,$82 ;想要从何处开始复制
8 c B0 E2 d6 z c; y' rAddr_End: ;源结束数据地址3 _/ t4 p+ A- s2 d" S
.BYTE $EE,$91 ;想要从何处结束复制
" a* ?0 t7 U2 e! v8 J6 [, A3 u3 Y/ b0 {, Y ?/ A0 o
INT_Addr = $A0 ;中断地址" Q: g3 C* @8 Y9 y/ v/ l, Y. B6 F* @
Flag_Over = $7FFF ;完成标志地址9 {) d1 W8 z; {( x+ _& Y J% E' d( ^
Data_Over = $7F ;完成标志. s: s$ b3 r$ g% M5 Z
( ~4 G, d/ N) l, t- r- c
; l! M* Q: ]7 n! S0 B
Addr_Data_TO = $A0 ;目的写入地址
7 I: b C: V2 YAddr_From_Start = $A2 ;源开始读取地址
X# c0 }. O9 {& @% B. O" X) F* U( r8 qAddr_From_End = $A4 ;源结束读取地址6 k X d2 ~* A: W) c; c, d
: d' b$ y& d5 u6 [! D5 S
Copy_Data_Start:
( \/ t" r) a# T) Z' M/ E4 ~Data_Copy_Protect: ;保护数据
3 p Y- z$ ?7 k PHA( M0 J: G5 C. O# B
TXA# @9 O- h( f+ Q/ a7 P
PHA b' K8 r# g' p: f6 L' D
TYA* W! D4 \* d3 @" U+ R( y% f
PHA. {# S5 v$ D$ Z1 G2 }" R3 W5 c4 t
JSR Off_INT ;跳转到禁用软件中断7 B8 m. n6 M* ]# Y$ J
LDA Addr_Data_TO
+ t. I5 [4 y8 B. k) K PHA
5 S, l4 G% {4 F" o LDA Addr_Data_TO+1/ A& ^2 u1 p1 g+ [" V7 }% C6 I. G
PHA
0 {, `3 M0 b/ [9 e. t9 v/ N LDA Addr_From_Start
. S# u- I; E. Z3 k# y; s7 O9 T PHA4 G* x& p* p. p+ c% J$ @9 ?9 s
LDA Addr_From_Start+1
0 J# r# G' U' ]( n6 p# w. `4 \ PHA5 v/ O$ }6 ^4 d% M: h5 |6 W% o
LDA Addr_From_End
, p/ x4 _- U7 h PHA
, O' @ b1 M/ m3 E" [ LDA Addr_From_End+1
! o1 p7 W' F1 R. F% D1 w PHA- o6 W- i n/ }
( O% |# k6 g: v3 ]; S* }
) x* e# g Y# e: L* {, e0 ]
Set_Data_Addr_Start: ;设置复制起始地址% g' W6 A3 k n. w/ B8 o/ Z
LDA Add_Begin
) x) v6 z8 f+ q, q4 @7 c1 |5 k STA Addr_From_Start ;设置复制起始地址低位
# t6 i2 F- o9 R# { LDA Add_Begin+1
- M0 Y2 _" S: |5 ? STA Addr_From_Start+1 ;设置复制起始地址高位5 j/ @. l' y4 i# U
$ P. }9 E, E0 Z; O4 B0 L* ~- OSet_Data_Addr_End: ;设置复制结束地址
7 n M2 I4 M6 z* H LDA Addr_End
" S) f% f" p8 V5 I2 K: s STA Addr_From_End ;设置复制结束地址低位
( z; U8 Y1 F2 f( N( L0 a5 H LDA Addr_End+1% A+ v! ~- r l5 N* Q
STA Addr_From_End+1 ;设置复制结束地址高位
y/ @2 K0 D. J) ^
, e- I" z- x0 U# l4 GSet_Data_Copy_Start: ;设置目的起始地址
3 V: c) p! }) t) X7 h8 _ LDA Addr_To
# Q8 N ~) D2 u- l, j/ Q STA Addr_Data_TO ;设置目的起始地址低位. O" d6 I& }+ I a# e
LDA Addr_To+11 r; f8 s0 L8 m. ] |4 Q
STA Addr_Data_TO+1 ;设置目的起始地址高位$ ?- R/ k4 s% j, }0 S
' F: n3 n( ?4 \% R) }Over_Copy_Cmp: ;复制完成比较
4 F' A3 n1 U* P7 r7 }: W% M LDA Flag_Over
) v B. D% F7 s9 `% b3 P( ?# l CMP #Data_Over ;复制完成标志比较
/ d! y" f$ w/ j4 [3 V1 a* T- F BEQ Data_Copy_Exact& P* T. s6 p# W/ A9 U9 n3 S
+ u1 B6 h" H. u$ ]' |+ j9 n3 VINI_XY_Count: ;计数器初始化. X! N! l* e. K' `5 @* ^
LDX #$00: v5 o- U) }, t, C
LDY #$00) h/ T" `+ H5 `' m
9 {( b k" W1 `/ `1 OCopy_Over_Cmp: ;地址比较
; j3 W/ z4 b6 T1 [8 g1 eCmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入)
. ]8 S1 f5 Q! [7 q+ q" a7 ^ LDA Addr_Data_TO+1
# \; t) t0 E* ?3 q1 W; z8 Y CMP #$60
, E; ~( z# j& ^2 A2 x* t R BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制
$ W, d* `& ~( v w0 kCmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)
; y& ]* x K/ `/ \4 y: v5 y LDA Addr_Data_TO+1
9 H! K" j& M; f: {0 n5 z CMP #$80
( c: @6 V4 ~% t! [ BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制* ~+ L/ f9 I' z1 g9 T2 d9 K8 h
0 c0 [; I: K+ S6 S* o3 GCmp_Copy_FREE: ;源地址结束判断. c" L, E+ @. w2 f
LDA Addr_From_Start \" W% i- ]( I: U& C8 z, b: a
CMP Addr_From_End
& [# O% o& m5 F6 y( {2 v BNE Copy_Start
& S# n7 `( F1 }4 n, @. P LDA Addr_From_Start+1
. b$ @' V( d' X) p CMP Addr_From_End+1
2 Y8 C- k Z- x$ M* Q9 v BEQ Copy_Over! n8 ?$ p* k6 V/ X1 Q
8 [6 d& C1 ^" mCopy_Start: ;数据复制开始1 R5 X" J' a' ]2 ?- y5 T
LDA (Addr_From_Start),Y ;读取源地址, A2 H1 @" A; t0 K
STA (Addr_Data_TO),Y ;写入目的地址7 F$ a3 |" s v* x c
Copy_INC_From: ;源地址低位递增
! |2 e! g) S# F# ] INC Addr_From_Start ;源地址低位递增5 z5 a! y$ k5 n& r
BNE Copy_INC_TO- r0 {' g1 R8 }9 h- a
INC Addr_From_Start+1 ;源地址高位递增8 z1 G7 K# H( S, Y: U8 q
Copy_INC_TO: ;源地址高位递增) A, y- u. v/ O* A% m& n
INC Addr_Data_TO ;目的地址低位递增) }+ y4 ]0 b M
BNE Recopy
8 _5 i5 J, U( n& I2 k( [ INC Addr_Data_TO+1 ;目的地址高位递增
/ J3 P4 }! l& n% VRecopy:
; E7 R( O& C) v9 K/ o* U) R g; I JMP Copy_JMP' Q# I6 ~* E% ^) @% {4 `; s
, V2 r+ w2 S4 I4 ]( N% `# m# }) | @% NCopy_JMP: 1 m# q) e% d% d, y- J+ }
JMP Copy_Over_Cmp% P7 I: ?5 }3 a6 @( w' t
5 ]6 `) N9 e0 u# T9 Z: e, j' y
Copy_Over: ;复制完成
7 S3 w9 C1 c2 b7 i( Z LDA #Data_Over
" _: n- W0 P% [" Y9 s! D STA Flag_Over ;写入完成标志
, Z% X8 M, {6 S1 C3 K; \: u: kFINAL_BYTE:2 i* `/ Y" M8 D& E9 f' E6 r6 S
LDA (Addr_From_Start),Y ;读取最后一个字节
$ B2 T/ O* y# n1 i STA (Addr_Data_TO),Y ;写入最后一个字节6 O3 Q6 z0 x" U; p2 D
9 o# P$ U9 R( ZData_Copy_Exact: ;恢复数据
/ i$ a7 ^' s* k f+ T1 e: |5 l PLA$ C- h6 X9 f/ ~% V( K8 t
STA Addr_From_End+1
) v7 H1 T2 C( a% R, ^ PLA
2 i1 z e2 y4 P1 |/ {6 a STA Addr_From_End
+ @3 E5 w0 K: f" q PLA
: C' }: j) S7 `5 t' R" z STA Addr_From_Start+1! c2 |+ x$ p3 ^7 S; w, T3 |
PLA
+ ~& V Z, o. V. A( c; a# r5 ^ STA Addr_From_Start
6 w6 u7 f9 `' z% H# @9 c PLA" ]# l T E) {
STA Addr_Data_TO+1
9 G" H) P, t6 n- } PLA4 { S* l5 t% K C* A/ d
STA Addr_Data_TO
; v5 i; a3 m% D5 K. N8 [3 e PLA
; A, p. c) F; h' s, r# ~! u TAY
6 E% i) H0 s3 C8 u3 H9 q) ~5 P PLA
% w/ C* y1 S) o4 t% A* a2 [ TAX1 l" l! y) i/ {) n& A
PLA* k+ X( K( U3 S6 s" ?+ B* @( o
" x/ g. B$ G4 [) }! U8 ^Data_Copy_Return:& d8 P0 E" V1 r, J- `
JSR Rec_INT ;跳转到恢复软件中断数据
) `$ V6 f- Y* i RTS
o- {$ r# P* d
; M4 L) K" V- COff_INT: ;禁用软件中断% p6 }9 X' U5 ?% C1 J* T( s
LDA INT_Addr
% L9 y. H r8 s' r; C R AND #$7F
. J6 h% [9 q: M1 L$ o1 g STA 2000
5 z% L$ B s& i2 s9 \ RTS1 z3 l/ w, c5 c3 b: v% z
2 f$ b$ w, f1 |; a
Rec_INT: ;恢复软件中断数据
' }$ d: T' E' w1 W LDA INT_Addr
" x% W# [' V* R9 s5 x+ @0 Y STA 2000: a. M% E, X o T
RTS |
|