|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑 * |$ F* M" V& b" P* C
) D! |0 z; [/ d. {6 P
;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone. y o; L4 |2 K( x( R" Q
;2017.4.28
9 j- `7 k R2 P ;例子:双截龙38 a2 g+ S6 h/ |
.ORG $8100 ;定义程序开始地址
6 H) W0 ?4 W' n8 }+ b, k$ L JMP Copy_Data_Start ;跳转到复制程序# ~) |9 Y4 f) Y5 F- ?: k F$ ^
; U$ o; U1 N: K3 l- W$ p
Addr_To: ;目的写入地址
- u7 Q7 B& o C0 \ .BYTE $00,$70 ;想要复制到的地方
i/ i7 G# _* `' U( c) g" Q. VAdd_Begin: ;源开始数据地址
& v6 k# W5 a0 E' `9 d! u% N .BYTE $00,$82 ;想要从何处开始复制
# M7 ^" u% }1 R+ s0 {* KAddr_End: ;源结束数据地址9 n2 \! h, I9 c$ }
.BYTE $EE,$91 ;想要从何处结束复制
4 @3 z4 Z8 |" L, a4 j& e( H- ?* L; a9 L
INT_Addr = $A0 ;中断地址
+ x; }; @) p" Z( vFlag_Over = $7FFF ;完成标志地址. W6 m' a; r3 s6 C/ h- i7 y
Data_Over = $7F ;完成标志
: F* N: [/ z b2 v
[. n8 l' w' l b L4 P! v$ {6 g$ }0 ^/ q
Addr_Data_TO = $A0 ;目的写入地址
2 V {- l: e4 Z$ i8 yAddr_From_Start = $A2 ;源开始读取地址
! \" V. A: \" cAddr_From_End = $A4 ;源结束读取地址/ n, ^6 a, ^! y) M4 t5 H
2 o' A# x' R5 v- w3 S
Copy_Data_Start:4 M% h! {' a) Z% Q: r( G, A5 Q
Data_Copy_Protect: ;保护数据
5 |/ L" }* u [" q- b- F# y PHA
: L; i0 K6 e2 p1 c2 h$ k6 N TXA
4 d4 ]1 F5 c4 g D/ N" G0 d PHA
) R8 \2 P" N6 V8 k! ^- d6 Q! n TYA
* T1 W' ^8 n$ X- G PHA2 U2 f$ ?4 Q+ d3 c, V3 B4 O% y
JSR Off_INT ;跳转到禁用软件中断 [/ \8 x2 r0 N4 X/ U/ m% X
LDA Addr_Data_TO
$ ^. M; \% O5 g PHA
2 I8 a5 A& q5 }) Q+ J2 G LDA Addr_Data_TO+1
- X. |. q- x6 @ Z9 y7 ?; e& G: R2 U PHA
3 g/ V! \& N9 Y" S* u+ m LDA Addr_From_Start
* c! F5 k* ~: e PHA/ S! p2 H3 h9 T! N9 j* B7 M# l6 S
LDA Addr_From_Start+1
& o0 K E8 m0 n# o ? PHA
: c% x+ K9 ^' T7 f! b LDA Addr_From_End# T1 X1 @8 A. W7 v7 Q! K
PHA3 ^' c" d. i5 v+ B
LDA Addr_From_End+1) I4 k5 ~7 W9 B
PHA$ f4 D% u% Y2 Y9 L; d, B
( @$ l6 a' y! L9 k6 ^: d3 [ % y b- B) I# n6 d: |& f5 p* A* M
Set_Data_Addr_Start: ;设置复制起始地址5 x* A: s/ o- o C; e/ |) s+ D
LDA Add_Begin) ^( ^+ x( [0 U" F3 p
STA Addr_From_Start ;设置复制起始地址低位& ~: S0 @: O C' h+ U% i* m
LDA Add_Begin+14 S6 }9 k- X" g N' R t$ n( Q
STA Addr_From_Start+1 ;设置复制起始地址高位) R" S. i( \8 {' i( X; {
4 \ u, U$ }7 y: b, L" I
Set_Data_Addr_End: ;设置复制结束地址" H/ X5 D- p. g
LDA Addr_End
) k7 H' Q+ c0 F* B }: e \- u STA Addr_From_End ;设置复制结束地址低位& Q \; Y1 g+ b5 K: Q: @. D6 _
LDA Addr_End+16 J! _: I q+ t: o
STA Addr_From_End+1 ;设置复制结束地址高位
2 D7 M3 u. O# [% Q + }1 y/ X3 n3 C- R" q2 [
Set_Data_Copy_Start: ;设置目的起始地址
" A& g5 a. p, `; ]0 ?2 H LDA Addr_To e: x# F! G, s+ H( r
STA Addr_Data_TO ;设置目的起始地址低位
+ V- Z# X3 {; w& ^: v LDA Addr_To+1
, K( j. |/ m0 `; D5 k, M& c STA Addr_Data_TO+1 ;设置目的起始地址高位2 e- u# V* q( C$ x/ |
. p; J3 q0 V* U0 h# v. MOver_Copy_Cmp: ;复制完成比较
$ s# h, F2 p M1 ~ LDA Flag_Over4 D) A0 j, J6 I+ n& a# n3 R
CMP #Data_Over ;复制完成标志比较' m5 Y3 J( m/ J
BEQ Data_Copy_Exact+ K. b5 `& }5 X4 J" f
9 u4 Q) w8 } h( s& _2 H
INI_XY_Count: ;计数器初始化9 @4 j7 l# a: M) @5 C5 A
LDX #$001 ?# a( G2 V; @+ M j# |. E [2 d
LDY #$00, b r/ l6 I" A8 P' N
$ h3 {* v8 W. x7 K; n& oCopy_Over_Cmp: ;地址比较
& C5 [7 t* V: [( S9 qCmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入)2 y$ Z. Y$ ]1 M! U
LDA Addr_Data_TO+12 G3 O6 t4 i5 D1 x9 S
CMP #$60+ Z- [9 ]% U9 I% U& N- Z- j! Y
BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制' L+ `* }" a! L( O
Cmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)
: ^! d- d. b i/ m3 d LDA Addr_Data_TO+1( B* f1 D% x) U8 z* i6 o' p
CMP #$80
+ s9 g% I, _* A2 f7 X7 U/ |. d BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制
$ [2 I" ~; H" D 3 V2 a- J$ s' p
Cmp_Copy_FREE: ;源地址结束判断
) u; x' M" Q0 M+ c0 d LDA Addr_From_Start
3 `0 x. Q/ o2 S( @" s# g0 J CMP Addr_From_End# d3 X! r1 I/ p% J
BNE Copy_Start
I$ P6 g- j6 c! L LDA Addr_From_Start+1( s' h$ F; w; E4 c
CMP Addr_From_End+1
; t6 j0 \! k0 ?! i" j- | BEQ Copy_Over, i7 {' C7 D% `! E% E8 [
- Y5 @4 _ e: @. R+ t$ J0 h; gCopy_Start: ;数据复制开始
3 j$ h% z% }0 _& w& q/ _ LDA (Addr_From_Start),Y ;读取源地址! o; ~) U. M7 v) m5 A
STA (Addr_Data_TO),Y ;写入目的地址% _6 r1 T0 u% L! D) M h
Copy_INC_From: ;源地址低位递增
% E1 `9 k8 z. U m% M INC Addr_From_Start ;源地址低位递增
/ h @. t: o( W BNE Copy_INC_TO, h% i. X$ N! w9 b$ x1 H& B& ?
INC Addr_From_Start+1 ;源地址高位递增
8 J6 e' T! F$ V$ s2 WCopy_INC_TO: ;源地址高位递增8 T. J& @$ B2 g* w
INC Addr_Data_TO ;目的地址低位递增
" _3 ?& i( N' `1 ~% {/ b BNE Recopy; x/ r- V0 D% `8 R' a
INC Addr_Data_TO+1 ;目的地址高位递增4 c- R8 { U9 O& |2 L0 ]
Recopy:
0 m) [( Z7 z: b7 e( N8 Z0 C, C" K JMP Copy_JMP( {! Z* Q8 Z2 r
& o; S3 r" g: U9 s1 C a" e5 t
Copy_JMP: - K. p C: b/ }: o3 _/ u
JMP Copy_Over_Cmp5 b6 P. z) R8 `1 l- I F( _
: a+ U ?) l7 n4 KCopy_Over: ;复制完成
! b; p: y, \7 j: H! z' h$ Q0 L5 F LDA #Data_Over
) D7 A* z! G; m8 `- O. G0 c STA Flag_Over ;写入完成标志
+ [7 }0 b2 M2 FFINAL_BYTE:
, i9 j$ m! w- n) s: Y LDA (Addr_From_Start),Y ;读取最后一个字节7 @+ J8 y o: X0 |# c
STA (Addr_Data_TO),Y ;写入最后一个字节4 u4 n _0 S! A G
, P) T7 S+ r( E' i
Data_Copy_Exact: ;恢复数据' b) l4 t" N, S/ Q9 p/ h; p
PLA
# R9 ]1 u/ P- d3 f5 E4 e1 X8 C STA Addr_From_End+1
& i; r) m3 n0 ^" K PLA
7 O8 V2 a* o7 h3 z STA Addr_From_End
4 a( D. |+ x3 S, _6 W PLA' M! H$ Q/ f( ] G8 W8 t8 ^/ o& Y
STA Addr_From_Start+1
F7 E" e6 F8 X9 a2 I9 @ PLA
! ?4 a( r( I: |, X5 F- O9 r STA Addr_From_Start7 p |- s: o `' d1 g
PLA
+ q, m% I+ V$ }7 l. q! ]& U: w STA Addr_Data_TO+1
9 V8 \0 z2 ^( W' {( g: G# Q& Z. t x PLA
" N4 Y& u; t: _: ?' N STA Addr_Data_TO( P8 L3 f% Z' `7 u
PLA
+ G6 S' j. ^ ]' Z" b. o TAY9 V: g6 A/ P$ a: b
PLA2 K7 N1 z6 X4 p" b" \6 K7 f
TAX0 K! [2 [% v d6 b
PLA
. p7 r( p6 x0 D8 I2 ]+ \+ `5 R
: f. }5 e! E5 Q# I, S5 y( rData_Copy_Return:3 g$ O- D" Z/ G- ?: v& j0 c1 K
JSR Rec_INT ;跳转到恢复软件中断数据
; I5 `* M' D$ N3 |3 c/ F9 @4 X RTS
|1 j: V8 p* U" a/ a8 f 0 W0 x- Y- |4 Y/ r( F, A
Off_INT: ;禁用软件中断2 x; V$ Y& Y+ W1 f
LDA INT_Addr, X7 W r( t! N
AND #$7F1 ]5 E: s: e" r% I$ T2 \
STA 2000
# D9 e1 W( B( }1 Q O. ^ RTS
6 K+ ^9 M9 ?* T6 l( ^8 c
" G' b' {, m7 T& s: K0 K E% g) nRec_INT: ;恢复软件中断数据
- i* u, i, J) B" W3 O, Q LDA INT_Addr
1 o8 J s$ w2 ]% F! R; c$ J" _ STA 2000
* z: G9 v3 f p3 C7 j% P9 [/ H$ Q RTS |
|