|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑 8 K7 {! B, w& B
0 L1 ^7 T& a) e: I7 h! R% l4 c ;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone
: M8 _* ]( G+ E1 A5 S$ g1 `$ g ;2017.4.28
2 q; i7 ~; @/ _: |( J* l5 h ;例子:双截龙3
9 E i0 z9 P" C1 T; r .ORG $8100 ;定义程序开始地址3 Y/ s; Z1 j- x- j
JMP Copy_Data_Start ;跳转到复制程序; {0 H; q5 F/ c% J" W; t+ i2 i& a
# S% G# J7 X. D' a
Addr_To: ;目的写入地址
, E0 j ~$ F q6 I5 f .BYTE $00,$70 ;想要复制到的地方
/ G1 M7 G8 Q9 a$ x+ U# W8 [Add_Begin: ;源开始数据地址
% T2 t" s8 m' V" K .BYTE $00,$82 ;想要从何处开始复制
' O7 B5 r) G) K! c$ v& W- `. ?3 JAddr_End: ;源结束数据地址4 M! a* A3 ]- N) I* @
.BYTE $EE,$91 ;想要从何处结束复制" E4 v Z; w" i& y
" K! J& {( b) ]INT_Addr = $A0 ;中断地址2 r4 e8 w% a3 a
Flag_Over = $7FFF ;完成标志地址) g8 |8 v7 Z+ t2 C" i
Data_Over = $7F ;完成标志
9 {6 P) t7 H* U: R/ L" ], ?
" q$ h' o" u) ~8 }' R; Q* N0 O( f4 O0 m6 U; |$ @7 T
Addr_Data_TO = $A0 ;目的写入地址
: ]& U8 e a) o ]6 lAddr_From_Start = $A2 ;源开始读取地址" |: M& D1 E Y ~) v: |2 L
Addr_From_End = $A4 ;源结束读取地址& O/ S% ]; n0 K9 n! |* y
U$ O: i/ f5 C! V) B
Copy_Data_Start:
4 n; H3 Z! U; P. D5 `. s5 eData_Copy_Protect: ;保护数据 a3 \+ a8 c# q, [
PHA2 E7 `! j( p/ ?: w7 r& u0 D) Q
TXA
. F4 I! _% _5 N PHA$ T; }9 |0 L' z0 T( f- G2 M* _! Y
TYA W" j$ r4 ?8 F; s( g" ]
PHA
1 Z& j: u" r( l: I$ o/ v4 Z0 c JSR Off_INT ;跳转到禁用软件中断! `# `* ?# H. k9 P' J Z
LDA Addr_Data_TO
1 x( y5 K2 M7 M2 P" x: Q3 p PHA5 p, s. B5 F3 Z% q9 ]' n: ?% A$ _
LDA Addr_Data_TO+17 J2 [0 `+ k& w R( P. |; R
PHA
9 V0 W( x6 ~+ ?! A3 F LDA Addr_From_Start+ S4 n% c5 ~! D% B1 n( x
PHA% X0 B9 C% y$ @2 r
LDA Addr_From_Start+1! T( q" r: z* m
PHA' f% y; z3 B# `' o0 ^* W" F" i4 N
LDA Addr_From_End
" z' ]* Y$ B" r% r: h0 e PHA( l2 x+ a1 c# A% G4 g
LDA Addr_From_End+1
) q0 ^* k9 O3 |8 J( [9 ]1 | PHA3 |. h% Q' J& y; y. ]
- `, y! i8 h6 T" m9 n+ X5 j. e , ~' {( i! b2 M; @7 U9 r
Set_Data_Addr_Start: ;设置复制起始地址* e% L5 @5 Z* l. g
LDA Add_Begin- E0 b( m; v- y: ?9 R
STA Addr_From_Start ;设置复制起始地址低位
1 p+ t8 s5 H0 `, v# @ LDA Add_Begin+1
9 ^* L0 R, D# Q) E5 k STA Addr_From_Start+1 ;设置复制起始地址高位
* v6 l" `) _ K. S; C E
7 |. E; m% |5 y {; _& ZSet_Data_Addr_End: ;设置复制结束地址
R- W. \8 n9 i5 ]4 c0 u LDA Addr_End% F" I6 M1 p7 ?: J& k+ [% a) g
STA Addr_From_End ;设置复制结束地址低位3 c; a: b k9 G2 `; e; n
LDA Addr_End+1# ~9 Y/ ]5 b, X A7 `! H6 f
STA Addr_From_End+1 ;设置复制结束地址高位
$ V$ K# x7 L# F8 {( J1 J) j/ S+ @
1 Z* E) C: a$ Z/ ^4 P- u3 J, ^) D! OSet_Data_Copy_Start: ;设置目的起始地址
* _& f5 ]' [8 F6 l LDA Addr_To ^" [1 X" F9 E9 k& k
STA Addr_Data_TO ;设置目的起始地址低位
$ O9 d* T0 \; j7 h LDA Addr_To+1
" h1 z3 z8 c! _' J; E( I4 \ STA Addr_Data_TO+1 ;设置目的起始地址高位
1 \! ~8 D* |1 r. P" j3 v
9 _+ R7 b2 I# d7 [$ Y A1 Z% L7 YOver_Copy_Cmp: ;复制完成比较9 U1 `) Q: j3 ]& k/ N; \$ u
LDA Flag_Over
" l. u$ w% e7 q: Y' {4 l CMP #Data_Over ;复制完成标志比较1 _! |$ R" b# X0 ~' w
BEQ Data_Copy_Exact. b! S, K4 I l2 x9 c9 W8 s6 M
5 @, H4 e( j) C! S
INI_XY_Count: ;计数器初始化
0 c2 G+ ^- Y0 a& ~ LDX #$00
- H3 i: Q* I" Y, v LDY #$00
) v: ^( E% y5 r0 K* K # U5 L! @/ S3 h$ F2 F, K& d6 _' V" Y, }
Copy_Over_Cmp: ;地址比较
4 @9 L# c6 p: O, s7 eCmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入)
9 W# j1 n5 O5 l% v LDA Addr_Data_TO+1! D; X; M/ ^ c( a1 b/ l/ b4 ^* o
CMP #$60
_1 @5 L+ y3 ?& P9 @0 H, f( \ BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制
+ k+ ^& F8 P9 h2 XCmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)- S2 g ^/ {% ]
LDA Addr_Data_TO+1
5 C7 I$ I1 r: R9 S; r CMP #$805 V& k. M1 G) M2 Q# G
BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制3 X: o9 @& ^; e* l" O5 L
$ X' x: L$ o% w$ _1 u" y7 D2 L
Cmp_Copy_FREE: ;源地址结束判断* C4 d" ]- D- k+ C
LDA Addr_From_Start* D8 p( w- R+ x* ]2 U" [3 G
CMP Addr_From_End* I. ^! l. o' @1 K( T5 o
BNE Copy_Start
: p# B6 \( W2 `, B LDA Addr_From_Start+1* c! @9 @. f+ F
CMP Addr_From_End+19 I' N9 r& K0 F5 C2 I$ j% x
BEQ Copy_Over
- t: g8 d7 m- R% w3 i' d3 }5 z
, z' h1 x& q; d0 p4 i5 G1 BCopy_Start: ;数据复制开始
! l: E* \& |& i; d0 W, r: f3 a LDA (Addr_From_Start),Y ;读取源地址4 a: i( s) h+ M. q* B
STA (Addr_Data_TO),Y ;写入目的地址
' q9 \. @/ V7 m* R5 WCopy_INC_From: ;源地址低位递增
5 ?0 {+ E7 E3 x) r% J; J INC Addr_From_Start ;源地址低位递增
; F& W0 B9 R7 z$ e6 e BNE Copy_INC_TO
" z8 D9 r" D8 c5 n# ~7 O INC Addr_From_Start+1 ;源地址高位递增
% g; ?- N+ i5 }: P; }Copy_INC_TO: ;源地址高位递增/ z7 Q8 @5 I- j* J
INC Addr_Data_TO ;目的地址低位递增& Y" i& `4 W Z: r
BNE Recopy/ d0 ]* ?2 Y2 I* q( V' ^& @
INC Addr_Data_TO+1 ;目的地址高位递增
: v& V/ e* x: o$ LRecopy:
% q6 w. K- y3 w4 Y& {/ n& x' E JMP Copy_JMP
) y5 H$ S0 Y# k. f. c5 G 0 O3 F; y! V+ f" {: W
Copy_JMP:
7 Z' d$ g- k- |. Z/ m( z) E6 z JMP Copy_Over_Cmp
! H9 I% V' y- t" p2 P2 _8 u4 K B' Z( k) Y5 ^9 R! t8 X0 Y
Copy_Over: ;复制完成
) a: O; Z8 T0 N LDA #Data_Over
V+ Y' C$ Q2 u& K STA Flag_Over ;写入完成标志
6 y( P) l9 E/ g. n' T4 @* ~- `3 X; \1 G. WFINAL_BYTE:
5 }- z; @, z: F$ E2 v' V LDA (Addr_From_Start),Y ;读取最后一个字节! X7 r% s" k7 [; p0 k3 ]1 @
STA (Addr_Data_TO),Y ;写入最后一个字节6 `$ v d' _3 @5 A
3 S% Q* a4 ~1 g' t8 ^Data_Copy_Exact: ;恢复数据
9 K( k6 d7 V2 o. I' k PLA
" c8 A& n& C' `6 ^. c STA Addr_From_End+1
9 N" k* Z" Y7 j) a2 L PLA# ] O4 B% L) f+ E2 t
STA Addr_From_End1 E W. ~; u0 o+ I% V" w, r8 e
PLA$ L a1 K: b8 O
STA Addr_From_Start+1
" G3 l: |0 h0 t. ~7 \. l PLA
7 i% z' p3 k! U d. y STA Addr_From_Start
% \: Z8 ~4 ^' ?- b! i* Z PLA
' D2 L7 N* A$ r. X% `# @% q STA Addr_Data_TO+12 t7 F: s% ^3 J( y" @3 y
PLA
8 W' a/ z: y( i STA Addr_Data_TO! M2 {/ E+ K7 E3 a9 t S% J: X0 |
PLA
& @/ o/ U S3 _ TAY
5 t# T! E, v. I: A, n* @2 d; u PLA0 c2 R7 \ N, ]' O
TAX |9 `! r' N" G8 e/ Z: h
PLA8 F: M# n6 n. w& g- f' a, \* D. F! M
2 t: ]! a Z: J' z5 f3 X( HData_Copy_Return:
8 Z8 U7 c& L K k/ Q+ U JSR Rec_INT ;跳转到恢复软件中断数据7 V9 v# P8 Q+ s% S& S
RTS
5 L4 C! o; ]1 `- Q" X; ]) X$ e c) R" Z# }" ~$ R7 F9 f) N, k9 |
Off_INT: ;禁用软件中断
% W9 L7 \$ [0 G LDA INT_Addr
8 W2 n4 W1 n a. D5 H# H AND #$7F5 s* G8 X! N1 o# k; ^: C
STA 2000+ g+ @; j9 |2 T
RTS
. V8 t7 ^; [) `0 G) E9 _0 Z5 I b
' |) ~; ~, o/ jRec_INT: ;恢复软件中断数据
: W( S0 ~. v9 ^3 U# ^# E LDA INT_Addr
- N* t0 P& s5 z& V1 O1 p, L STA 2000
# b6 E: j. M8 n/ {4 W& M& F RTS |
|