|
|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑 ' [! `2 Z% b4 ]
1 e+ t$ m$ O4 E" _6 G
;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone; \0 D$ A6 O" A4 K
;2017.4.28' U; Z/ t% D& a6 ^, ~
;例子:双截龙3
. c2 m; N4 I6 B' O .ORG $8100 ;定义程序开始地址
: Y3 w0 S/ U0 { JMP Copy_Data_Start ;跳转到复制程序
4 L& k& U4 {6 Z/ W, R$ G& C5 z: G, B% t" {8 H
Addr_To: ;目的写入地址
5 v$ _/ v/ K3 J) E3 X .BYTE $00,$70 ;想要复制到的地方
" L3 A% A0 T( o( |Add_Begin: ;源开始数据地址
7 s. w- n/ X9 ]9 t .BYTE $00,$82 ;想要从何处开始复制, F4 F0 D3 B- }9 Z8 ]7 B; Z; o
Addr_End: ;源结束数据地址
7 ^6 S8 |4 l4 h" f, K/ f! f. K .BYTE $EE,$91 ;想要从何处结束复制* w" ]2 b( H. s8 n% I
! K) K# M, i7 f. P3 |" PINT_Addr = $A0 ;中断地址2 ~2 \4 I( q1 r/ u3 }+ a! r
Flag_Over = $7FFF ;完成标志地址
! O% Y0 W) r$ m3 A. K8 u* wData_Over = $7F ;完成标志
. U: i0 r$ W( `% K; C' e% S1 a1 n+ T7 K: C1 c# s
g( C6 z) T1 `+ ^9 V& Z% z
Addr_Data_TO = $A0 ;目的写入地址1 Y I/ _( Q, D9 y! b
Addr_From_Start = $A2 ;源开始读取地址
- Z2 v3 n: v1 j. l& ]8 YAddr_From_End = $A4 ;源结束读取地址4 @( l/ F9 d) B/ _ u! @3 y8 ?
* x0 {8 r$ \6 \" p& S7 a v
Copy_Data_Start:; c/ b" D q# O& Y( x
Data_Copy_Protect: ;保护数据
+ k" d. y5 J' [ PHA& o( B( ]- w- X8 Z1 U+ }6 N. }
TXA5 n8 d9 n9 g8 v+ V6 a$ e
PHA
* p0 o8 w* f' T2 f! F TYA
6 G" [4 Q) y& j3 \% Q- t# b/ ^1 L PHA. V) N; E) g! O) ~* u9 S6 v, O
JSR Off_INT ;跳转到禁用软件中断6 ~- ~2 t2 H; ]* \: @, x7 e5 h+ |+ H
LDA Addr_Data_TO
0 H: I5 C( @ _ Z4 U8 Z PHA, q2 M+ ^, n! p; S0 f; O3 [8 X
LDA Addr_Data_TO+1
) z* J6 X4 H. K7 [ PHA
/ `2 b9 g8 j9 Z: ` LDA Addr_From_Start$ P4 R9 f! c4 b& ?* R: P4 _: Q
PHA: K' F% b4 o: R2 y
LDA Addr_From_Start+1
- o6 S. b6 f: V5 S- V) D+ P8 M/ P* p) m PHA
1 |2 d; p$ I) d7 q9 W4 l( x LDA Addr_From_End; _' x6 q3 D2 I/ q& {1 N
PHA
! K0 \8 q& D( Q1 g2 }+ C0 G LDA Addr_From_End+1
* P6 @7 X6 ~! t3 \4 S PHA
; \+ E6 F- x% a% Y
# b5 e: L0 F6 H N# b5 H2 a % _0 l7 `7 K4 c- [( X. l q# V
Set_Data_Addr_Start: ;设置复制起始地址3 H* O$ N O7 K! c
LDA Add_Begin( b5 M/ u( u* J5 f
STA Addr_From_Start ;设置复制起始地址低位; n2 z3 S7 \1 v9 X
LDA Add_Begin+1
3 l# ]+ X% B8 A6 F% s; r6 l) i" U STA Addr_From_Start+1 ;设置复制起始地址高位
5 I* s% S' y8 |7 f5 s; r 1 {0 n+ Z j' ]
Set_Data_Addr_End: ;设置复制结束地址
9 i2 E$ [% b0 y+ K8 y5 D% u- p LDA Addr_End
1 ^6 [8 c3 ~3 L. V' z6 R STA Addr_From_End ;设置复制结束地址低位+ j6 ?1 }& t* o: r4 u
LDA Addr_End+1/ }+ G: i% M+ Q" m" K; t
STA Addr_From_End+1 ;设置复制结束地址高位( g. ^) ~: P8 Z- n7 U( ]
8 y5 G; l& x9 \6 ]- p: L/ A" Y
Set_Data_Copy_Start: ;设置目的起始地址4 U! C8 h: A* X" ]
LDA Addr_To! {5 z7 I. b1 E" E8 ^
STA Addr_Data_TO ;设置目的起始地址低位. t0 j# V+ f5 D8 l) S
LDA Addr_To+1
- X5 y! z1 N$ D) B2 d. l STA Addr_Data_TO+1 ;设置目的起始地址高位
3 ~& P* f5 h+ v) Y1 ~
* [4 d% X& N: @/ u( D# _+ `Over_Copy_Cmp: ;复制完成比较
" ?" Y1 d0 w" Q' } LDA Flag_Over. n: b- L a# ?( S) d# b, K& E3 r4 Q
CMP #Data_Over ;复制完成标志比较! {& \3 J4 ?% C. N5 V
BEQ Data_Copy_Exact, I- X- j, `7 k8 ?' _3 H
$ a1 w, U' L+ dINI_XY_Count: ;计数器初始化
7 w% {8 S' w$ e& ^$ z LDX #$00
! V" i# C, } Z, H3 A LDY #$00' ^! v2 y% {" G7 w; i" j. L
, [- T2 K0 M5 C
Copy_Over_Cmp: ;地址比较
7 a: B( ~) I; M9 B: x# t6 dCmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入)- p! u6 r2 R8 J8 |' F3 w; y- S
LDA Addr_Data_TO+1
6 U; T0 |- L- B# K1 q CMP #$60
4 g: k0 i# ~0 b4 a5 a$ n# \; c0 W BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制: H8 b0 ~- t! ]/ ^, a( ?% @; E
Cmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)! R* f) Y! O1 R0 z* t; j
LDA Addr_Data_TO+1" `4 \5 d3 Q/ S& D: s. p
CMP #$80
+ l0 O3 w4 N+ Z& a BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制& _8 v4 a) s4 r: B
) m* C. Q+ |/ }1 l" Y" {+ h, l+ KCmp_Copy_FREE: ;源地址结束判断
& B; ~! J3 \4 ?) M! h/ q2 K LDA Addr_From_Start7 q. L; u7 [9 `' E9 p* X1 O
CMP Addr_From_End
2 z E" i+ y; {' e4 N+ F BNE Copy_Start
7 @. w7 h/ s* |4 t" A8 I6 }- D LDA Addr_From_Start+1- b5 F( A3 g5 r, i6 z, I8 p! `( C
CMP Addr_From_End+1. z7 @8 P! x; v/ e8 s; D r! k
BEQ Copy_Over
5 A2 H9 v/ @9 j/ Y {1 P E i : t# X1 X4 C `
Copy_Start: ;数据复制开始9 B9 L4 I+ t; L5 O
LDA (Addr_From_Start),Y ;读取源地址3 ]7 x" d6 D' [
STA (Addr_Data_TO),Y ;写入目的地址
% Y. c' z1 B( S3 a, E+ _Copy_INC_From: ;源地址低位递增
' p4 H8 B( f9 Z5 A' e1 |5 ~ INC Addr_From_Start ;源地址低位递增
) ]; B- {# Y: Y0 m* t4 @* y BNE Copy_INC_TO+ [' g* u- S; T5 g
INC Addr_From_Start+1 ;源地址高位递增- `2 x/ W7 f4 U! }* w1 i# [
Copy_INC_TO: ;源地址高位递增
/ l9 u$ e5 U2 M6 v INC Addr_Data_TO ;目的地址低位递增# u4 n+ M- ]$ T, h
BNE Recopy
7 a7 Y- |" z6 ~$ _& I$ I' E( l INC Addr_Data_TO+1 ;目的地址高位递增
. o. ~7 i! K$ r2 DRecopy:' A, I) y3 X, H. E* a
JMP Copy_JMP. W( N1 N: F9 }
6 e8 K, ~! D6 I3 U$ d) gCopy_JMP: 2 {, `; w2 v: [6 }- C2 y: O1 U
JMP Copy_Over_Cmp
9 B& u' t4 G _$ E0 Z/ g1 |% G4 y8 C# ]& _4 |/ `5 B" [2 |' x
Copy_Over: ;复制完成- K) f3 {' D P! [! @
LDA #Data_Over5 {3 ]5 }$ R7 _
STA Flag_Over ;写入完成标志
8 |9 ]& C0 f7 D0 M* J- {FINAL_BYTE:
8 }- Q6 }7 F9 ? ]. Q LDA (Addr_From_Start),Y ;读取最后一个字节
5 g2 K7 t+ m, v* u* w: u+ P) L STA (Addr_Data_TO),Y ;写入最后一个字节
5 d" X3 ?& o0 H2 }' Z+ z6 [
% {$ @; d, q9 C; L _5 [3 Z. uData_Copy_Exact: ;恢复数据
/ U* U( ^6 P4 B7 ~ PLA! f7 ?4 [$ ?3 Y' e
STA Addr_From_End+1
: I4 |. T, m, _: M+ D8 { PLA5 ~0 e' Z2 Q/ \. }8 A" |& _
STA Addr_From_End- Y* a, W( P0 A
PLA6 C6 j) V# X9 y# c7 n& @. ^
STA Addr_From_Start+1
- ?: C' O2 r/ L" W PLA
2 f$ e0 t% I4 Z1 E# B; u STA Addr_From_Start
- a, ]5 j$ V: c+ e PLA
7 J, M& T0 I* D6 M STA Addr_Data_TO+14 u; ~& k7 X2 h
PLA4 ?& a/ I' i- |( H& s# ?$ W
STA Addr_Data_TO
; e9 ]) q1 Y" F9 M PLA- J5 B8 Z8 d2 c
TAY
0 k3 y: O( j3 Q) t b2 B PLA+ Y: ^# v8 E5 }2 N5 p; Z! Q7 i
TAX2 j2 g7 |, \$ ~1 J& ^7 `
PLA
0 ^# u1 G$ a3 d$ \ $ G. ^# z& }) \2 G! K$ C4 v
Data_Copy_Return:+ S+ |/ ?' a0 X
JSR Rec_INT ;跳转到恢复软件中断数据
8 u4 N" x7 l/ F3 g RTS% Q& T: P7 f4 ?
0 L- ~9 K' }, h. v; f% a% C+ BOff_INT: ;禁用软件中断% \- P( H" k# v' T% A% s
LDA INT_Addr8 ?* A) o- k; I, i1 e# R
AND #$7F$ W0 J! l9 v7 i- I
STA 2000# D2 p8 h |8 V
RTS
8 d$ a2 J: e, u& Z* N+ g2 l" _2 y: v6 r
Rec_INT: ;恢复软件中断数据
+ m- p$ q2 E& Z; q+ U5 v5 H# ^ LDA INT_Addr
, O: Z, E( L2 s" g) P6 t1 O% s2 H STA 2000) I6 F: G/ B" a; m+ ^
RTS |
|