|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑 , n9 h9 t9 w& c$ D) c6 Y# ]
0 D/ _. A% E! \; Z+ W) e ;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone
2 n' U/ G/ l+ [& u2 R" E b ;2017.4.28
' p* o9 O1 V" j) p( h" Z2 a ;例子:双截龙34 f) F# \' g! f
.ORG $8100 ;定义程序开始地址
. K& p' y" g. s( j# a2 w JMP Copy_Data_Start ;跳转到复制程序* V3 B0 w9 w7 r, ^9 s; C
8 I) c% S# ~) c0 \5 |9 [% z0 c @
Addr_To: ;目的写入地址
9 F7 Y; a/ C! {9 J .BYTE $00,$70 ;想要复制到的地方" K& E5 b5 B" v: A' `
Add_Begin: ;源开始数据地址5 _+ M s" @* E# R
.BYTE $00,$82 ;想要从何处开始复制1 F" I: [, l+ I* K7 K. i& n; `
Addr_End: ;源结束数据地址' B h' s6 q; B& H
.BYTE $EE,$91 ;想要从何处结束复制
; @8 {4 I5 q M5 _( p$ X- Y+ i/ x0 M
INT_Addr = $A0 ;中断地址7 q7 u/ n5 Q5 n: j+ z2 E4 W
Flag_Over = $7FFF ;完成标志地址
" b% W5 z; K$ L% OData_Over = $7F ;完成标志+ y# l2 C4 D; X* e- Z5 k0 ?4 |" ^
. i# g4 n# ?: R- Z4 ]
/ S2 o3 W; _9 W- c2 v8 bAddr_Data_TO = $A0 ;目的写入地址
# l e' B+ c) M6 q& F2 FAddr_From_Start = $A2 ;源开始读取地址
7 p6 \1 i& Z+ K# k/ A% [& pAddr_From_End = $A4 ;源结束读取地址
9 P; @$ ]1 g0 ]+ D; C" u
# e- p" X6 R" b% QCopy_Data_Start:3 v- Z$ m) u1 Q' M; @; u5 {2 L8 I
Data_Copy_Protect: ;保护数据: e! m+ A% [2 W+ U6 D A9 {
PHA3 P( y. b1 p0 z7 ]1 u% N) m, y
TXA$ U- ]6 B; P5 v2 }
PHA
4 X9 ]" S! r4 ^3 _: q' |& @: F TYA# E m E9 n/ @
PHA% k3 a9 p, w( |- {
JSR Off_INT ;跳转到禁用软件中断
6 M7 Y d" n/ b, | X LDA Addr_Data_TO
: Z! g- `1 K/ z% N- D: W) T8 G% D' S PHA
' k- ?! a; @. s' [5 y/ H LDA Addr_Data_TO+1
( s; u( l8 p8 j0 y; w) B PHA
/ |# z' G, o* X+ a: A LDA Addr_From_Start; l+ S) T* m) O+ g( B
PHA, q" W2 ^. V3 Q( _ c
LDA Addr_From_Start+14 S& j$ n! |! ~5 B; ~
PHA/ m% N% }4 q: H' C9 n: `2 l
LDA Addr_From_End
; {$ J2 z* ?: G9 S1 a1 R; ]2 l PHA! H- r5 ]- {1 u# D9 H; p: m
LDA Addr_From_End+1
8 k9 g4 {, a5 X$ h2 y* u PHA4 Y5 Y$ B% H9 n, F
4 U0 m+ K. o9 d+ a: {& \
5 q; u3 z) M) b$ x lSet_Data_Addr_Start: ;设置复制起始地址
7 d, v# n ^! z LDA Add_Begin$ X; ?0 K: P& r' C. }! s
STA Addr_From_Start ;设置复制起始地址低位4 X% E* S7 f: w; I: K/ @$ R- H
LDA Add_Begin+19 Q! v$ X% `: u6 i, w' L. G8 `& E& A1 p
STA Addr_From_Start+1 ;设置复制起始地址高位
" L T# R; ?" {+ J. U$ ~" X8 i. P 6 w/ t, `% |" ~6 x* g
Set_Data_Addr_End: ;设置复制结束地址
* ]3 X G7 C2 ^& [: r LDA Addr_End
0 c+ ]9 ~* o/ k1 [$ y4 D STA Addr_From_End ;设置复制结束地址低位
! b% Q6 g e6 s; b LDA Addr_End+1
+ E+ e; m3 {- N& E/ \" ^ STA Addr_From_End+1 ;设置复制结束地址高位5 ]+ N) @% o& X8 n+ U4 S
4 c% D, H+ h) O( ]5 W/ v) I- t/ R
Set_Data_Copy_Start: ;设置目的起始地址# ^+ f3 S. A1 [- b& u( C" x. d
LDA Addr_To
- \7 H. A7 P' X: _, t STA Addr_Data_TO ;设置目的起始地址低位
( g4 P1 G! ~ a& \ LDA Addr_To+14 j+ f+ H4 H! P2 w2 J
STA Addr_Data_TO+1 ;设置目的起始地址高位
: y& l* h# Y H: ~
. Q# b) C" P" H1 Z" W2 E" }9 jOver_Copy_Cmp: ;复制完成比较
% v$ s0 ]1 s, y% d1 }5 y$ t5 P; e LDA Flag_Over
# F1 k- z) ]! }& u! _ CMP #Data_Over ;复制完成标志比较0 _! _! d% D3 Y9 U, x5 Q
BEQ Data_Copy_Exact
$ H! X! [7 p8 |+ k* r$ B6 R) f2 W' G) _( x9 y" p
INI_XY_Count: ;计数器初始化" |- y8 P8 X2 W; j: q' M' u
LDX #$003 F" `* X: r* i/ M
LDY #$00
+ G. n" S" _4 A) o& x # x9 r1 u6 C5 i
Copy_Over_Cmp: ;地址比较% J& n% q# n8 m5 J" F2 }
Cmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入)
4 S* e& F# u6 h& v LDA Addr_Data_TO+1
e& |/ A, B8 C& t1 P4 X+ N CMP #$60
8 s5 d) }) w; |8 J BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制
% c; P5 I! H: t; T2 d8 U- tCmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)( W1 T9 d2 Z! s! p
LDA Addr_Data_TO+1
+ t/ v. d6 r. C. V( f$ o& \' V$ l CMP #$80/ G: W u: W* l# t6 j- l) `
BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制
a. z% `3 V3 J" o9 i @7 Z: p& V
- V; q O r; pCmp_Copy_FREE: ;源地址结束判断3 O! _0 Z. K) V" v4 _7 F2 \: A
LDA Addr_From_Start
4 R6 s# { C( k/ q% L/ I CMP Addr_From_End; D' ?' B: P7 h, ?& [/ g
BNE Copy_Start- g( }# a8 k1 f% W! s0 m
LDA Addr_From_Start+1
G' O: O" T$ R; ?8 u( c L CMP Addr_From_End+15 X9 ~/ g5 ?2 Y* m( R& ?
BEQ Copy_Over
6 s* Y4 F9 u& f5 u: [# N0 [
* d9 Y) g- e- \Copy_Start: ;数据复制开始
- a, s& W9 ^9 n0 K$ n+ C* N2 ? LDA (Addr_From_Start),Y ;读取源地址
7 Y9 L" w7 H, y1 a( l STA (Addr_Data_TO),Y ;写入目的地址
8 s5 B# e$ @6 mCopy_INC_From: ;源地址低位递增7 D0 ~7 J( ]! }6 t8 B
INC Addr_From_Start ;源地址低位递增+ m! S- Z$ L7 ?- F& t; H5 B
BNE Copy_INC_TO
/ R) z/ B- v9 j5 K" j+ B q INC Addr_From_Start+1 ;源地址高位递增
4 v/ I- `, `, s, TCopy_INC_TO: ;源地址高位递增- M3 S) m& w( U# ^' ~
INC Addr_Data_TO ;目的地址低位递增
& U. C3 B9 ~' t1 A BNE Recopy4 D: W) P1 h( }- ]0 k6 Z1 k( k
INC Addr_Data_TO+1 ;目的地址高位递增% i/ f, ~' D2 F: Y. [& b1 e
Recopy:+ f* B# f9 v5 [9 B2 X. i
JMP Copy_JMP
. p, G4 Y0 t! i9 p! @ # i8 o; c& O4 N% | E3 {# z
Copy_JMP:
3 N5 M/ V' z4 E- M; Z JMP Copy_Over_Cmp
8 D/ R, M; o9 x/ B0 b0 j/ I$ a; @9 ]( I, e6 l! F
Copy_Over: ;复制完成
2 f3 {2 s. p) Q3 x+ b6 p u+ ]3 @+ Z LDA #Data_Over
2 b) ]! n: I) `% [# G; J8 J STA Flag_Over ;写入完成标志
/ x0 W6 w# y @8 CFINAL_BYTE:9 q9 u4 k1 e: |: B& }% A
LDA (Addr_From_Start),Y ;读取最后一个字节
" }; X+ e- A; R; Y& R6 ]- a STA (Addr_Data_TO),Y ;写入最后一个字节4 i1 G6 D: c8 C6 `: V
. }7 t# s/ |+ i. t4 ~8 r( Y2 p5 FData_Copy_Exact: ;恢复数据( y3 s* X3 D" q0 j
PLA1 b6 E3 n6 Y; j! C+ a" \. Q
STA Addr_From_End+1
* G) U2 \+ o6 s7 \7 R* \( P PLA" w U8 L+ G( T
STA Addr_From_End
4 K4 J3 c: q+ A3 a- p PLA5 k9 W& ~ z J' g+ O& h
STA Addr_From_Start+1
5 I; c* \5 T! A1 a PLA
! y+ N% ^+ L, \, \5 @ STA Addr_From_Start
8 Z( g/ [5 Q0 y PLA9 M9 ?8 o, p# T' [' G u2 ^
STA Addr_Data_TO+1
' V+ @) S* {# P3 L+ P PLA$ x- ?. h0 U+ V+ V
STA Addr_Data_TO
; T9 S8 e( @' ~/ Y PLA
2 G+ {) D/ |' }5 h8 ?7 J, z" [0 Z TAY
8 D6 c0 D# M; E, z PLA
" ?! y. q7 r' z; m& r c, q TAX
6 l9 {/ h8 X# x' X; D2 P' G! Q PLA$ F$ j- w0 w* v/ V3 V
7 x. e; m7 Z UData_Copy_Return:' j) q0 h2 Q& |$ |' k
JSR Rec_INT ;跳转到恢复软件中断数据- K z& t( {9 Q' ], w( H# T
RTS) c1 H- a5 r% z b6 c3 q4 ?4 \
0 ^1 i# S3 _! v; I
Off_INT: ;禁用软件中断
9 U5 x g( F7 S' a0 w: r4 `$ c$ R LDA INT_Addr7 z* j9 z3 P# W! Y* S6 P+ n
AND #$7F
1 h% c! f9 u3 h! C3 _6 I/ o STA 2000& f( C* J5 C9 i3 ~/ m5 _
RTS
: H# D& l1 X- I3 H$ O# @4 K" k! H; c# w$ M: M; L) ^
Rec_INT: ;恢复软件中断数据* i5 W! W9 r- m1 K' _4 S1 l
LDA INT_Addr
# W( X+ R4 M7 X0 }% b' U STA 2000
0 h: d7 O# R$ L0 d. x+ W RTS |
|