|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑 1 F G$ r) F/ J2 L9 L
& T* s8 ?& q9 n+ i8 C/ A' \" [
;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone0 [2 O5 O9 B+ x4 }
;2017.4.28
8 R2 I8 j* @% `( ^; b# @ ;例子:双截龙3# L* S" H2 o# G2 D. r' l2 F
.ORG $8100 ;定义程序开始地址
$ N# i' X/ d" f! z2 ^7 Y& j JMP Copy_Data_Start ;跳转到复制程序/ f- t' S6 A# @. o
6 @$ X k3 G. O! l F3 yAddr_To: ;目的写入地址
( B2 d/ n& e+ j .BYTE $00,$70 ;想要复制到的地方
' k1 P) N% B7 f! M# |/ s5 k6 RAdd_Begin: ;源开始数据地址( f! e4 g* e* w# ]
.BYTE $00,$82 ;想要从何处开始复制+ t+ P+ ]0 X: B% `& ?4 c
Addr_End: ;源结束数据地址7 g: V. C! P" w7 N3 D8 o. H
.BYTE $EE,$91 ;想要从何处结束复制% g4 I2 o+ \& \/ O( }
+ o# j; y7 S, ?& t6 ^6 ^* e$ i( y! yINT_Addr = $A0 ;中断地址8 u; M# l- X2 l r3 T/ F
Flag_Over = $7FFF ;完成标志地址7 o% Q( o9 \8 T4 @# H1 M% S
Data_Over = $7F ;完成标志0 x3 Y2 t! `2 V* _% J5 ]$ ^
2 n9 q8 v) h- t6 i$ n4 q6 c
P- F0 k: z. z1 O8 j8 N# mAddr_Data_TO = $A0 ;目的写入地址
) a4 e! ?' b" Q' bAddr_From_Start = $A2 ;源开始读取地址
8 O- f% Q# g/ b% ]$ Q; _' z4 cAddr_From_End = $A4 ;源结束读取地址
8 w: x0 S3 g+ H" u* f$ b! I \+ c% M8 i0 [+ z c5 {
Copy_Data_Start:4 J5 u$ I J9 O5 K) S4 ~
Data_Copy_Protect: ;保护数据
0 h4 T6 i- y; ?5 U PHA; h. b5 U$ Y2 t, B2 S4 d0 w
TXA
7 d5 K j1 d% ^+ y) P9 Y- G PHA) e2 [) f z4 i& d( {
TYA
) }+ `. y3 T4 W# B, O8 r PHA
. [; u: z, b) E H) S3 I6 o JSR Off_INT ;跳转到禁用软件中断
- [2 w$ K, f% c. S, K$ K$ n LDA Addr_Data_TO" D% M& }; i/ x4 N
PHA
- s/ V) V7 K3 I$ D0 x& N$ ~2 f( O LDA Addr_Data_TO+14 t. c: i% v. d$ f* h. c6 f* c
PHA, [2 b( w v6 J4 @" u) z
LDA Addr_From_Start
/ @' y/ G" a4 g2 M& ]/ X7 j; `. D PHA' \4 |* S3 A d) ^$ H
LDA Addr_From_Start+1
! L2 X+ {9 \$ L7 m1 c$ F PHA
& J1 ?# l, z" g7 d+ X LDA Addr_From_End
/ W4 U' r$ z" r2 A PHA6 t. O9 w/ @7 k2 T; w
LDA Addr_From_End+1
9 k6 N) ]: q- h1 c; ~ PHA# e& L0 A" m7 P0 C, g
$ r- e7 m/ U% a& f
) x/ V$ J0 I" oSet_Data_Addr_Start: ;设置复制起始地址
. z0 f; {/ D' _% H( ? LDA Add_Begin
: E) `: ]9 R( Y3 u4 t STA Addr_From_Start ;设置复制起始地址低位* d9 r* w1 Z& p& a: K
LDA Add_Begin+1
1 M' ?+ L4 C" R5 Y7 c* l STA Addr_From_Start+1 ;设置复制起始地址高位- n' s Z+ u7 U' m! w, K3 S& c4 ^
6 f3 C" h! V+ K) g: USet_Data_Addr_End: ;设置复制结束地址+ d' O& |* m4 {1 t* s
LDA Addr_End
) ~; J2 I% l. E2 t+ D$ e- v STA Addr_From_End ;设置复制结束地址低位9 {" A" {3 g# t' r+ b9 d) `- A
LDA Addr_End+1
6 C& E! {. ~0 G. M* L# s+ t2 { STA Addr_From_End+1 ;设置复制结束地址高位
6 L( w) C4 M/ _ 5 X _/ M5 u% T) F5 b
Set_Data_Copy_Start: ;设置目的起始地址
$ Y- |( ]4 o7 ^/ U) i LDA Addr_To4 ?5 {7 G4 E$ C
STA Addr_Data_TO ;设置目的起始地址低位; [* U Z, X, p! w) F' Q2 V2 |
LDA Addr_To+1
$ V0 d% @6 |9 s) B( X STA Addr_Data_TO+1 ;设置目的起始地址高位8 J( h4 c7 {9 i
{( v/ w# M2 u3 E* Z" S
Over_Copy_Cmp: ;复制完成比较
4 ^4 a3 ?& {. z, t7 u! z9 W LDA Flag_Over
- L/ w; }3 q/ B CMP #Data_Over ;复制完成标志比较
9 ~2 S6 e% H7 |' M+ u BEQ Data_Copy_Exact
( o4 ^4 x* M. [( G
; ]9 X- l) n, _1 C; sINI_XY_Count: ;计数器初始化6 L" h0 Z: ^9 x( `9 c
LDX #$00( u0 D+ r0 u3 V2 X. ]& m4 b- d% @
LDY #$00
M: A8 `; V1 Z5 d9 O
- \2 R; `) D# J dCopy_Over_Cmp: ;地址比较
+ W# e2 |& T# u% l- SCmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入)
- P( S; ^9 U: G8 u# z LDA Addr_Data_TO+1
8 H6 @; U7 Q$ q CMP #$60 U! b6 C" e. d
BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制
2 ]" t4 p' |6 U* @7 M3 k/ ^Cmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)
; [/ B6 U, j8 \5 f2 U2 ? LDA Addr_Data_TO+1
* Y' q ]1 b2 z CMP #$80
( N$ ?% [% m' r9 x: u BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制$ D: x: k, b% j1 N
9 V' N: w1 L" {8 c
Cmp_Copy_FREE: ;源地址结束判断
% t4 O) J: j& {$ n0 I* I8 c% u LDA Addr_From_Start7 f# U# Q. l/ w' u- U
CMP Addr_From_End
5 p1 S# E% V+ g5 \5 [& h% J BNE Copy_Start* X3 O- k! U- a; u }4 f9 y
LDA Addr_From_Start+1( W. H+ N i4 L, S; Z. |+ g: R& c U0 Z
CMP Addr_From_End+1
5 S: s2 v4 R" _# Q" L, @ BEQ Copy_Over
* j7 U* x' m7 G4 g 4 q P# L! w4 |, f
Copy_Start: ;数据复制开始' w+ q. G9 ~9 c% N" q
LDA (Addr_From_Start),Y ;读取源地址
- p1 J! V+ b5 [; s0 s. b. g STA (Addr_Data_TO),Y ;写入目的地址
( P0 x U+ D1 D4 s ^Copy_INC_From: ;源地址低位递增9 s* T5 G# B- U. M- K* k; C, o5 C8 O
INC Addr_From_Start ;源地址低位递增3 D' O3 {+ x, }3 Z y
BNE Copy_INC_TO% O F1 Q1 x/ t* {0 S' Q
INC Addr_From_Start+1 ;源地址高位递增
: U) M; j, z3 k: O+ zCopy_INC_TO: ;源地址高位递增# y! L3 w& S8 H& S* t
INC Addr_Data_TO ;目的地址低位递增0 h6 I/ L3 g, N3 j* s; Z0 i
BNE Recopy
. a- D$ x$ M* B$ u% y2 n INC Addr_Data_TO+1 ;目的地址高位递增4 U. u: `$ z, v
Recopy: K+ g! s+ E& |* z
JMP Copy_JMP
0 _5 C4 V2 C4 c i/ a: r2 j) X# h% S 7 G" L/ Y# n1 W
Copy_JMP:
' @+ g% l+ O) U JMP Copy_Over_Cmp. K$ @% d0 i3 n' S8 K
5 q" I# i; c( |: z0 [1 m! ?' Y
Copy_Over: ;复制完成( d" b$ P" g8 C! G3 h @8 C* o' M
LDA #Data_Over
/ L( p& D. c1 D1 v* F STA Flag_Over ;写入完成标志
& v) C; B8 F( n8 TFINAL_BYTE: S* z1 c" w7 ^1 p! V7 k/ L2 k9 m
LDA (Addr_From_Start),Y ;读取最后一个字节8 t+ ~; m, S- l: b4 R7 b7 j1 _/ T5 f
STA (Addr_Data_TO),Y ;写入最后一个字节2 D7 s2 r. |3 a. ^
/ Q( {/ y. L9 R. a3 V# c& KData_Copy_Exact: ;恢复数据: h0 o$ D K) f L" K
PLA+ q4 T0 _5 f/ ?
STA Addr_From_End+1
* a' N% J0 a8 b- J PLA) T8 t4 w, N' x, G0 g- t
STA Addr_From_End
) `) d9 e# M* l& s# }& f5 J q9 d PLA c5 H, m4 c* k# _
STA Addr_From_Start+1
4 Y3 n$ S, f- }# m- L PLA: B# Q4 e l; f1 ]
STA Addr_From_Start" M4 ]7 m1 t* g0 W" \
PLA `* \: y4 K: M# T
STA Addr_Data_TO+1( l2 U: h0 F! u X. b
PLA
& K+ q/ u8 o: g- b% y5 |, G4 V STA Addr_Data_TO
9 l" D2 d$ t/ e0 W PLA
; `; @3 X6 ]2 I8 |* z; | TAY
& M! o' c! I2 z x% F& n, k PLA
4 }$ |' D8 X) [+ j& g7 { TAX! W* {" n7 j F
PLA
' s2 U/ L2 J7 c0 ^# F T! j, w4 z
) \ H% b+ d! \Data_Copy_Return:
; | z/ M1 F3 U JSR Rec_INT ;跳转到恢复软件中断数据
- ?, c6 w, m& q RTS
7 I4 Q5 C# t) I3 C7 ~
3 b8 s8 G: Y" v0 N5 Y/ KOff_INT: ;禁用软件中断
) j# }9 ?' P4 W; i9 j8 Z( v0 i' K LDA INT_Addr+ }: A% d& X* x, F9 i1 F6 w2 O
AND #$7F
2 U7 g0 n% k( p7 P STA 20006 E( k7 H: O4 b9 V3 O/ ?) i
RTS
* ]9 S2 k0 D$ b( I1 M. v' c0 D M6 W8 _* A1 J m8 z( H3 h9 s1 _# G
Rec_INT: ;恢复软件中断数据
; g1 C6 ?* i; e! u( W LDA INT_Addr
; t9 z3 w! h5 w3 ^# \3 }9 v STA 2000 _1 Y, ]/ [" o
RTS |
|