|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑
- g9 W5 @5 Y( F; `9 d3 h
' S1 W' F7 O# M! H7 k, z ;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone- _, V# r) l: V
;2017.4.28
; F3 q6 j0 s4 M$ @6 a& r2 k0 T6 u ;例子:双截龙3
1 ~1 M) X F: k0 r. a$ {. H .ORG $8100 ;定义程序开始地址5 e. e3 e: j2 j1 d) B1 H' \2 o! X; q
JMP Copy_Data_Start ;跳转到复制程序
. T1 f; q& @7 _
5 @8 }* b+ Z0 R* Q5 iAddr_To: ;目的写入地址! T2 I/ h' ?' Y) `4 a1 x6 M
.BYTE $00,$70 ;想要复制到的地方0 p# _" y4 c* h7 L
Add_Begin: ;源开始数据地址
% b# S# E$ ?5 @3 ~2 q7 b .BYTE $00,$82 ;想要从何处开始复制# W& d6 |* v6 Q4 U
Addr_End: ;源结束数据地址+ l5 c) k: g# t. C! q
.BYTE $EE,$91 ;想要从何处结束复制
: q- }5 ~3 n' D4 c
2 ?# a+ Y* l% o5 vINT_Addr = $A0 ;中断地址5 Q2 e0 {" D- a! w! @ D
Flag_Over = $7FFF ;完成标志地址
; Y) n: c" c1 R, |% s: TData_Over = $7F ;完成标志
5 m! Z& j$ ]) g! P s/ u- ] D4 m( m) L5 J4 K% ]
: t3 Y9 t$ D* h) n( i, w7 b; U
Addr_Data_TO = $A0 ;目的写入地址
6 x/ A7 k% L! R% [' f3 h$ {, gAddr_From_Start = $A2 ;源开始读取地址2 C x# d& t+ [, v8 {2 [3 y v, N) c
Addr_From_End = $A4 ;源结束读取地址! d9 `+ r8 B5 _- f9 P5 p' s V
2 a, L2 X( Q" _& I# L8 j0 sCopy_Data_Start:. ` L1 W; J, E- D
Data_Copy_Protect: ;保护数据. i5 Y. \8 y7 K% V/ L( u
PHA
. J7 a9 u4 W" z& L: H a$ b TXA& E% t/ E+ n" P6 r* s' y# r
PHA+ \+ ^. U. y% C# N$ t/ A* N
TYA
: l) V, U0 B! h% Y PHA: M; ~6 K: s8 l: N
JSR Off_INT ;跳转到禁用软件中断
( f( b& b+ r' F0 g' l" i LDA Addr_Data_TO N& x" v$ u; n/ g" P7 m
PHA, g/ b+ q* G/ d) F, M2 h
LDA Addr_Data_TO+14 ~) U# V7 q6 ], ~0 O( l. k
PHA7 k, f4 a1 ~$ D4 a+ w# M% `
LDA Addr_From_Start2 |# [$ S# d. E- h! }
PHA
3 E% M* q* n, x9 ?: K LDA Addr_From_Start+1
: D0 X) i- g" u; X9 M4 V PHA2 v* Z) m( ]: e: z
LDA Addr_From_End/ A% ~+ J! F1 t$ `
PHA- u0 e& `% Z9 ^9 s
LDA Addr_From_End+1# M9 e! l3 s( l! t6 s8 N0 |
PHA2 n5 m) e' D: k; B4 c$ L# }6 U: e
9 G' W' T6 V& Y9 ]2 P( H3 k. Y& o; D% w 1 x5 _- N+ e" W, U
Set_Data_Addr_Start: ;设置复制起始地址0 s8 D$ s& Y; l$ k- \9 a2 J2 y
LDA Add_Begin7 j1 R/ U5 d* k. m
STA Addr_From_Start ;设置复制起始地址低位! l2 f; F5 I: {3 W" w( s
LDA Add_Begin+1
2 i2 C6 H# F7 u6 c7 D4 Q STA Addr_From_Start+1 ;设置复制起始地址高位7 Z/ T0 ?, P, J# l# h" E) Q
0 c: g F3 m* y1 Y3 c9 F6 w
Set_Data_Addr_End: ;设置复制结束地址
" P1 T. f3 L3 _% i9 F" g# ]" c LDA Addr_End9 b2 W) F& X& E- U+ ?
STA Addr_From_End ;设置复制结束地址低位
0 M- U6 ? ?( @ LDA Addr_End+1
6 |+ C4 D0 D+ v: Q* u STA Addr_From_End+1 ;设置复制结束地址高位
! M( F- K8 M& U3 H; h/ q 9 J; H+ U" D1 ]2 q- G, \7 c
Set_Data_Copy_Start: ;设置目的起始地址
( ]' L4 g4 P5 q5 W: o& k LDA Addr_To
' o+ d: |+ k/ B+ s) { STA Addr_Data_TO ;设置目的起始地址低位
; Z/ R$ h7 L8 K2 g0 W" V6 J2 c) \ LDA Addr_To+1
) J- T* q6 ~$ \ STA Addr_Data_TO+1 ;设置目的起始地址高位
J: N. U6 j/ t0 d1 x4 [ 2 D+ y9 G$ G# @: \! D
Over_Copy_Cmp: ;复制完成比较
1 E# f4 k) g( A LDA Flag_Over
1 i) ?9 }3 M( J5 p CMP #Data_Over ;复制完成标志比较! H3 b1 |# w) _+ T
BEQ Data_Copy_Exact$ E1 ~& L$ K% W8 z
& b/ Q) b4 g1 ~( S" h* Q" [INI_XY_Count: ;计数器初始化
# b* H3 N% S% D- [ LDX #$00
& M& T6 z" L5 r8 Z8 `; v2 e1 e- d LDY #$00* a# C% F3 ]! R2 f6 R# A
4 }8 b; Y) O; H- N) @Copy_Over_Cmp: ;地址比较
& T4 J5 d# \' \6 BCmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入) [8 i- @, ]1 N0 M( j% z
LDA Addr_Data_TO+1/ ]' z' s9 m% i3 V9 w, s' e+ j
CMP #$60
$ z$ f4 @1 m- S/ u- K BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制- J0 q* E5 @$ L, N/ c l* s* T, D
Cmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)
# y! B6 Z$ H* \& d2 P LDA Addr_Data_TO+1
4 k5 X5 p( i) { CMP #$80. B0 [3 `' `3 m4 i4 H* s; e0 M
BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制6 g( t2 b1 S8 }7 f& d m# i/ v* V- v
8 s* ]3 X4 Y" P! ]8 b0 I
Cmp_Copy_FREE: ;源地址结束判断
% t2 f+ C$ s& N4 U! a4 k( F, O) O LDA Addr_From_Start. O0 q/ P4 d2 i* k
CMP Addr_From_End
1 q* W) G1 c# c2 s5 V( ^* G BNE Copy_Start# }! m8 u/ r3 a4 C0 ^7 c* [1 V
LDA Addr_From_Start+1! J4 a4 J3 P s4 H6 n' e) J9 m) a
CMP Addr_From_End+1
4 t. u/ D5 E9 X2 Y- `( T BEQ Copy_Over
" c6 j4 g( y6 [8 S% @( p
- c1 r6 X3 l u! u! C7 _6 RCopy_Start: ;数据复制开始4 S. b& x6 L# q2 @
LDA (Addr_From_Start),Y ;读取源地址
3 t) g! ^- T8 x5 |' W$ @, @ STA (Addr_Data_TO),Y ;写入目的地址( j$ p/ e6 l" o$ V# f( N
Copy_INC_From: ;源地址低位递增& d% s1 R3 w' z% T( i; |9 S
INC Addr_From_Start ;源地址低位递增
: Y! @9 H8 @/ h3 `& d$ ~+ v, c9 A/ f+ [ BNE Copy_INC_TO. U7 q Y( f- p2 H, I8 G
INC Addr_From_Start+1 ;源地址高位递增* K0 D6 ]% U# J1 e6 ^: W1 O
Copy_INC_TO: ;源地址高位递增
% P8 d8 Z; _ `8 w, A0 g/ d INC Addr_Data_TO ;目的地址低位递增
5 d9 Z: v' ~; c& ?( k- R, T3 Y BNE Recopy( W& L$ H9 ~+ o3 O% A+ F
INC Addr_Data_TO+1 ;目的地址高位递增! S" e7 T5 E, R" M b" P# C" U
Recopy:9 \. J& @5 l+ h5 x; U0 e( i
JMP Copy_JMP' a! F" g* F8 Y8 |
1 C- N" O3 C P2 X, h' LCopy_JMP: 8 t5 ]1 U; a8 \/ b7 w, e
JMP Copy_Over_Cmp: P: y: F- l. L
0 k+ T$ f9 p8 b& E W1 O$ rCopy_Over: ;复制完成2 b, H- s4 W3 k! q/ R
LDA #Data_Over C R6 ~4 e& N
STA Flag_Over ;写入完成标志
3 {' F/ m9 ?& d# u: s3 i( d- Y, ^. lFINAL_BYTE:
6 z; u$ T0 Z8 m5 b) K LDA (Addr_From_Start),Y ;读取最后一个字节
8 T4 I6 B+ a4 L5 J! z STA (Addr_Data_TO),Y ;写入最后一个字节
* d$ e/ v/ ]2 _9 q: I7 I- G
$ I9 P/ Y. G8 o4 J4 T! o" p9 T0 |Data_Copy_Exact: ;恢复数据
6 F7 |3 [& w# h$ \. b$ t8 o8 i4 f- I PLA
& }5 y/ O% A3 s. h STA Addr_From_End+1
! [7 J" W0 M3 q PLA
- G$ ~/ k9 O" {" ]9 R! b STA Addr_From_End
1 x9 R& C% N p. F6 q4 A PLA: r- h; x3 g# R ~* J
STA Addr_From_Start+1; h7 J1 W0 q) ~) E
PLA
/ u3 V9 B: W/ r6 U4 C! r STA Addr_From_Start
% l* A3 s0 B( j4 g, G, }: ?7 r) N PLA- w& ^. }% v: V( B' x. n
STA Addr_Data_TO+1% ?3 v( Y4 e; I, a+ q
PLA) p0 m! @, b0 ~2 E+ Y. F
STA Addr_Data_TO; l5 ^7 [7 _2 `5 M4 H/ g
PLA/ T1 z& k0 q9 f( [* h
TAY1 u% w6 `# m# h4 I
PLA+ b. m' Q3 l1 X( T" l" S! t& N
TAX
2 @4 A8 o ?$ { PLA
7 k0 @; f: m* G; t" u% n 2 y9 K% z* V. F3 E# o8 g: Z* G
Data_Copy_Return:
$ o4 P3 Y) k+ W7 E JSR Rec_INT ;跳转到恢复软件中断数据
# r( C/ `" V6 n; g. {( w RTS* m% g9 a7 T. Y( E/ Q
( R: U! f9 s( W) Y
Off_INT: ;禁用软件中断: r [: o) m* p
LDA INT_Addr
: i0 ^, m, s- u7 d AND #$7F
' n1 {- v8 W0 I: ]0 v% N4 R STA 2000
2 V6 C; f A4 `( X7 W RTS
) R" W+ S& S5 A3 I& E1 F6 w5 c/ l5 x4 s5 @- M7 X8 o
Rec_INT: ;恢复软件中断数据
7 e T$ X7 m; C1 e LDA INT_Addr$ ~& S+ v) N8 z6 U6 T
STA 2000
) z% s6 x, t1 Q! R RTS |
|