|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑 ( \! |$ Y/ g; n
& {/ U. L/ Y1 W6 t4 ?6 N$ {# E
;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone' L0 k. V7 b- v) s1 E2 u
;2017.4.28
3 x, _2 F2 \' ? ;例子:双截龙3. d( a$ A- w6 a
.ORG $8100 ;定义程序开始地址
0 I/ b# z( [; y1 {% u2 o& [# \ JMP Copy_Data_Start ;跳转到复制程序
, n: E8 p: H$ E }3 @2 ]' V2 ~( k6 d$ S6 G( V# z/ R1 W
Addr_To: ;目的写入地址
% D+ n! ^4 k/ x$ Y6 z .BYTE $00,$70 ;想要复制到的地方
1 X' o/ F% P T; Q" W" W- f( `& N2 ~& HAdd_Begin: ;源开始数据地址
* H( p7 ~& T- v" I .BYTE $00,$82 ;想要从何处开始复制9 p# J' v- I( s: G, Z+ i
Addr_End: ;源结束数据地址1 P2 R. Y3 J; c ?9 s' r* ^! s
.BYTE $EE,$91 ;想要从何处结束复制2 T# f& m Y- f, ]
~* ^& X" V0 a" {8 D$ x4 v
INT_Addr = $A0 ;中断地址
3 \1 E+ O1 A% e0 BFlag_Over = $7FFF ;完成标志地址! I5 O, P9 P( |- q1 [: c
Data_Over = $7F ;完成标志
' A+ K$ i. u+ j7 L* i( ]
. Z% H0 V% L$ j T7 z
2 e4 X$ t: e% t4 q! g& V7 y: I. u7 WAddr_Data_TO = $A0 ;目的写入地址
3 {7 J \% O. `" R5 eAddr_From_Start = $A2 ;源开始读取地址
+ p) e% ?9 b4 m8 QAddr_From_End = $A4 ;源结束读取地址( _5 `! H& z$ w" j5 J5 q1 s
( H' s9 b q0 ], z5 [- aCopy_Data_Start: n8 S4 x( b7 \9 ]8 K- Y. L
Data_Copy_Protect: ;保护数据
" @3 \2 w9 n( Q, z; q: W4 o% ` PHA
4 |9 g9 H9 ^3 u) v$ P TXA
$ Y+ I( B+ C& _4 ?2 l+ t$ ^6 N- s PHA
# m! G( A3 }) n* l TYA! a( _3 @" P' [7 G9 U* d$ T7 k
PHA
- _5 f% R4 R6 }- l& B7 { JSR Off_INT ;跳转到禁用软件中断
* B/ \5 D' d' ]. Q1 Y LDA Addr_Data_TO
* N& R" Q6 {: b$ D2 H PHA/ K- N: {% n2 j
LDA Addr_Data_TO+1
) ~* m6 W: T' q; U0 Y; Q u PHA
! G$ }( ]7 l& s! G LDA Addr_From_Start# e! I# |/ @6 m# R* d( w
PHA
/ O* _ b6 a8 d( ] LDA Addr_From_Start+1! [6 T3 W: M6 q# u( [
PHA, F& k, X: C" f! X- v2 ~
LDA Addr_From_End
% _4 J- N9 G" ^0 ` PHA
3 G; w- j- h" n( }9 k LDA Addr_From_End+1) H" F3 U) v6 A0 ?4 T
PHA
/ `0 m! m& Q, c( F9 W1 v1 X5 U9 u e) }3 y% O
3 p; p, C* Z/ }: |: q4 TSet_Data_Addr_Start: ;设置复制起始地址
1 y9 H$ ]5 D2 Q LDA Add_Begin
4 u) s9 B2 A& n' @% F5 X STA Addr_From_Start ;设置复制起始地址低位$ X: A" I/ L6 {/ [5 ~9 d7 m
LDA Add_Begin+1
2 `$ A1 p! _& T3 s! P STA Addr_From_Start+1 ;设置复制起始地址高位7 e3 A' {7 s5 E( X1 W; [
& \' Z1 v4 _, g3 `) vSet_Data_Addr_End: ;设置复制结束地址
% t* U, u0 ^% z0 V/ u! K* [7 Z LDA Addr_End/ z9 D2 E0 ?& i+ t+ V
STA Addr_From_End ;设置复制结束地址低位
& K# e' x* t# o4 V, c9 w LDA Addr_End+1- y& w) @% g T3 L+ b) z+ O' N, J
STA Addr_From_End+1 ;设置复制结束地址高位
! D% w/ _ [2 }' c+ }0 ^( s
) H8 ~# S. t( u9 i/ ^. ?Set_Data_Copy_Start: ;设置目的起始地址
# \$ j& e6 u4 ^+ S4 H! X LDA Addr_To) _/ ~- g3 X H6 m7 l
STA Addr_Data_TO ;设置目的起始地址低位
3 @. T7 L4 }& f$ b* v, `' [8 p2 a% D, f LDA Addr_To+17 g* u8 ?9 F: a+ A6 }6 H( M$ \
STA Addr_Data_TO+1 ;设置目的起始地址高位! y$ y, y9 o. l# F
/ x, T+ q2 _; i
Over_Copy_Cmp: ;复制完成比较3 J( a5 x5 @- x6 Y" ]
LDA Flag_Over. S7 @4 J I& f7 z2 O, @
CMP #Data_Over ;复制完成标志比较, k' }$ w. i* n7 }
BEQ Data_Copy_Exact. D" ?) I# ^, t; z0 X( t/ B
3 J# {3 y3 d3 k" ^. dINI_XY_Count: ;计数器初始化
1 [! r3 f, O6 M+ V; H! ^ LDX #$00
" G m3 U9 r" R: y: d, Y/ j LDY #$00; _/ X& m9 v) i* N1 M
& a7 m4 `' d" j4 C, p" V% O
Copy_Over_Cmp: ;地址比较" l1 H1 w$ |+ g' q8 L
Cmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入)( v5 i; i7 m: E; [) r$ e3 `5 V; `
LDA Addr_Data_TO+19 Z5 y! \" }1 _, |
CMP #$60
7 r3 ?# n0 @3 c# M BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制# b0 A" D( b2 Q6 c5 Y `7 G
Cmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)2 R; u5 N% a+ r6 e% {) ~ ]
LDA Addr_Data_TO+18 l1 g" z4 k+ Z1 m
CMP #$80
9 v: T1 w% z- v BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制
& O. n. t- Y8 m' Y+ W
& m8 m) q0 T. U+ C" A1 \Cmp_Copy_FREE: ;源地址结束判断- s0 E, T; s3 x) s9 M% w( ]
LDA Addr_From_Start& C" ?. O" D" x: [1 w
CMP Addr_From_End
[5 M* R$ g4 Q' G5 H# Z5 x3 v" ` BNE Copy_Start3 @* g7 P& Y# f# \. E
LDA Addr_From_Start+1
4 `+ c( J' ~3 G) G) R, F CMP Addr_From_End+1
$ b Y/ y+ a) t: v BEQ Copy_Over6 A6 l q ?0 T1 e) V
# T8 m- V6 `+ @' }2 Q. d
Copy_Start: ;数据复制开始- q0 V" J# j1 j2 `7 V3 @. t
LDA (Addr_From_Start),Y ;读取源地址
. R! i' f% f0 F+ L* {- A0 O$ Z STA (Addr_Data_TO),Y ;写入目的地址8 a1 p2 J. K5 b) C8 N: T* X3 M; w
Copy_INC_From: ;源地址低位递增
9 K4 |# {* i8 U INC Addr_From_Start ;源地址低位递增+ i- ~. L! z) n* o# H: _
BNE Copy_INC_TO- D& w6 r \8 h& q4 q5 J/ N2 X
INC Addr_From_Start+1 ;源地址高位递增3 U$ a0 v8 G: T# ~% U3 G, w G
Copy_INC_TO: ;源地址高位递增* _; e: S2 b3 h" P p. Y/ K# I
INC Addr_Data_TO ;目的地址低位递增
. }, `! d3 V8 G4 ] BNE Recopy
% V0 G" V( Y, i, E INC Addr_Data_TO+1 ;目的地址高位递增
* ~+ X- a( l! j% P, Z; ]+ n: }( ]Recopy:4 R& y# I' z) ]5 g8 C6 j
JMP Copy_JMP* |2 c+ @9 B8 F" T$ x% t
+ h7 ]; q# {; g5 N) g9 x
Copy_JMP: 5 ^- T7 A# L& e i
JMP Copy_Over_Cmp8 s- U- C9 A h
S% r- X. q# p$ MCopy_Over: ;复制完成
" c, ]" j# T. d; Z g* G, o1 M LDA #Data_Over
1 b5 _) J2 P1 \, ~ w+ } STA Flag_Over ;写入完成标志
) ?4 R1 A8 Z* S' F( w; z6 z! K& |FINAL_BYTE:
. ~) w4 Q6 h" D8 L LDA (Addr_From_Start),Y ;读取最后一个字节
1 d, Z; h- [) ~$ Z& K) x" m STA (Addr_Data_TO),Y ;写入最后一个字节1 ~/ ~% V5 A% I: i4 t" q/ A
4 F; u; G4 z8 W4 ^2 v G* ] A
Data_Copy_Exact: ;恢复数据3 P6 ]/ i' C" B" S6 s
PLA
& z5 ^/ A1 K- M- j+ Y, _, R/ { STA Addr_From_End+1
# Y. ]: K( I* g0 m PLA
! R/ g. C9 v5 N- ` B- b$ T+ O) S1 V STA Addr_From_End$ `7 T G5 h+ [
PLA9 [( H: d" Y: P: m1 S+ U* q% ? j
STA Addr_From_Start+1
1 f1 c5 {# D* W5 N, X% M PLA
( t9 L( S0 ?! A5 | STA Addr_From_Start
& B& O/ l* p) Z) B PLA
% m8 l* y7 C$ H, ?" V2 y1 d X STA Addr_Data_TO+1
. }3 [8 A; `! s" ] PLA! }( \/ d* d6 `5 s! a6 Z, X9 y
STA Addr_Data_TO
) u$ q: A% I! \& G' `6 E5 P1 R PLA
* }7 @9 @7 T; ? TAY
+ J# D, V% q b ?! ~2 I2 z( K PLA
, h$ c/ e y: q! E TAX2 D" _) a5 v6 L( L- T& f9 n
PLA3 {7 y+ m6 @# w
' j) {, X5 C5 r U3 b* g% \
Data_Copy_Return:
( d- d# Q# j! k7 s4 p% B2 |- G JSR Rec_INT ;跳转到恢复软件中断数据
# {) _2 |. @9 ~ RTS
3 h4 s$ v3 g8 |: B* B
/ c6 U$ q: c u. D8 IOff_INT: ;禁用软件中断
/ Y1 k" O# G* V: ] ]$ Q LDA INT_Addr
0 @ c; w5 `6 W, d& b# @ AND #$7F2 v& K/ Y# k8 p% K+ X; U7 a8 H
STA 20008 |8 g z# ^8 X$ i8 J' o9 B3 ~
RTS. A M1 K' `& h, p4 k
7 N( T0 l& S8 @7 o% u; bRec_INT: ;恢复软件中断数据
3 ^+ b o: }3 M3 T/ ]- O: d( w$ e LDA INT_Addr. n7 C0 K5 e3 B; R H" ?
STA 20006 L9 d$ ?' W' v% ?# J9 y) F- ~5 h+ u
RTS |
|