|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑
9 @! A8 F/ P2 ^& T
9 t5 A! F* u, I3 ] ;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone
# n& ]4 Z9 X" `$ P7 m# r ;2017.4.28
! E) ` Z1 Z8 H3 W( R3 ]) L ;例子:双截龙3
! ?, B% j; `3 n2 j, ]9 A .ORG $8100 ;定义程序开始地址
9 {: s5 b3 _) S, m* b JMP Copy_Data_Start ;跳转到复制程序
$ d8 N& s. J* E8 } s& M) r) m, i0 v1 T
Addr_To: ;目的写入地址
9 X T2 ^, w# s .BYTE $00,$70 ;想要复制到的地方
) x" a- C# f; s; R- D7 yAdd_Begin: ;源开始数据地址
5 H, [$ E) D7 k: ^* v+ ~* I .BYTE $00,$82 ;想要从何处开始复制& {4 ^ w7 a0 T, o" g. K8 x
Addr_End: ;源结束数据地址, z' E/ q: a% I5 g- w1 P
.BYTE $EE,$91 ;想要从何处结束复制
2 b* a- ?. }6 H" Q9 S
1 k$ u, j7 u3 C3 W5 G: {7 X/ eINT_Addr = $A0 ;中断地址1 q) x* d% a, m3 c
Flag_Over = $7FFF ;完成标志地址! q4 Y" ?* D1 Q4 }0 ]9 m3 o# h3 R
Data_Over = $7F ;完成标志
% \9 r% g0 ~6 h8 z3 b
& ~- k7 Y: M: A% G. Z
- E& `* v6 ] J; W' ZAddr_Data_TO = $A0 ;目的写入地址1 g% c$ h* T0 q' C
Addr_From_Start = $A2 ;源开始读取地址 B. R7 _1 ]5 F! a. u. l0 @( j
Addr_From_End = $A4 ;源结束读取地址
3 k T! |: j5 c4 f7 h( {1 m$ A5 H4 r
$ _7 ~! p- {3 _9 z& A$ I( B G" i1 YCopy_Data_Start:
: d& c# x7 t! ?' j) k: tData_Copy_Protect: ;保护数据
- E3 Y. h7 y1 `9 D! u+ G+ f3 G7 j; J PHA) x. O+ {- }* C; O
TXA) K8 P9 b& O; Y' i% o& v+ B! s0 @" ~$ [
PHA- z% ]! I. J1 N/ C7 A! {& x5 f
TYA
9 u g! ]/ n7 ?8 A% j: q PHA
# D; B+ J# g) t; o JSR Off_INT ;跳转到禁用软件中断
8 x1 p5 ?2 j5 p5 P0 K LDA Addr_Data_TO
& [& q2 ?. ]' n* c3 N PHA5 M! D+ H7 D5 {/ t+ u) L8 a% Z
LDA Addr_Data_TO+1+ ^0 ]& o( F: L' u/ S
PHA4 A+ e) N+ c: d7 _$ @3 k7 `$ l- A
LDA Addr_From_Start
# q; u+ u7 t# t @+ P: W5 z PHA
; I V0 {! a# w LDA Addr_From_Start+1
& [8 I8 p w) x9 l PHA/ L7 R8 C+ _8 {& F
LDA Addr_From_End. j' X, f: X% k9 a
PHA8 @# V- a9 R) H# I5 x
LDA Addr_From_End+1
: s" ^8 }6 g" V5 w9 Y5 t" a PHA
. @* D& o1 S: e: \% D) F y* Q% [+ \+ N, [8 ]4 q) h9 {. F
* W' G! H" @1 _2 h- ?7 WSet_Data_Addr_Start: ;设置复制起始地址: V6 o2 O5 T; y, ^2 G
LDA Add_Begin
) O u( ~. h& | y4 q g STA Addr_From_Start ;设置复制起始地址低位% {- Q# z/ e1 c6 y
LDA Add_Begin+15 E" n- t' H q T
STA Addr_From_Start+1 ;设置复制起始地址高位" N9 K% a2 F* b% ^2 n! F: P% U" j, S
; y! O7 A5 ]5 F" g& f' MSet_Data_Addr_End: ;设置复制结束地址
' ]: Q& c3 T3 ` LDA Addr_End
. m; t, B* t, J" v. H, | STA Addr_From_End ;设置复制结束地址低位" s( z; P" G' D; b9 ?! K
LDA Addr_End+1
$ t3 n" s0 ~1 i" Z& q) K STA Addr_From_End+1 ;设置复制结束地址高位- P! ]& ], ?+ |! ?5 n, U; b2 s
( }& K0 x% a) v$ g `Set_Data_Copy_Start: ;设置目的起始地址
: e. @) J8 d1 I7 R$ Y N* _ LDA Addr_To) A' ]0 G# c. _/ L& t
STA Addr_Data_TO ;设置目的起始地址低位
6 ]2 r& ^. v8 c$ t( @8 | LDA Addr_To+1+ k4 f+ t! R2 D
STA Addr_Data_TO+1 ;设置目的起始地址高位
% v \2 o1 t9 ~) T* F% ^ a' m* H, X " J- b) X% a, p |% a
Over_Copy_Cmp: ;复制完成比较
1 g' e9 F, P1 A! e, @, ^ LDA Flag_Over6 ~* S+ k5 Y4 Y/ R! l; [2 }3 c# B
CMP #Data_Over ;复制完成标志比较! f. J. w: ~0 ?9 v" l
BEQ Data_Copy_Exact" z& S7 C# C& B! f: N/ Z
/ z s( B" L0 A: D) C# iINI_XY_Count: ;计数器初始化
2 V/ l) r* d/ l7 a# p LDX #$00
4 B. M s2 V4 E% n& h' | LDY #$00
' h3 G1 T5 F& C+ X- Q! R- q ) k& f) D* u0 C c7 c
Copy_Over_Cmp: ;地址比较
' ]+ ]) j0 X, E8 [# Y, CCmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入)
) J& |. t9 o% \: Z, m LDA Addr_Data_TO+1& H7 N' C8 l6 x: {; j. l6 Y
CMP #$60
& d) n. H/ D2 G0 g0 w BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制
2 ]) r4 w! r* b5 G' p0 V' G- }4 rCmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)
1 }3 a- D3 D w. P$ U: u LDA Addr_Data_TO+15 c3 s9 G8 b; ]) }
CMP #$80
% E- F! `# f: P. A BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制
( ?# y9 r, X, ^4 ?+ x8 F7 H3 M6 s( \) n , ]* W! F' c, i5 k1 i
Cmp_Copy_FREE: ;源地址结束判断( K, P2 ~/ A; ~% g5 E
LDA Addr_From_Start' G9 R7 U' J- p; {( i$ R& |3 K% y" t
CMP Addr_From_End
- p/ }* C' {" [3 Y1 y$ L2 O- X BNE Copy_Start& H# J: V4 F! r4 w9 F1 u# O4 G
LDA Addr_From_Start+1
+ M7 Z# W" h Z; N CMP Addr_From_End+1: P ]- g5 C: i) W
BEQ Copy_Over
+ u& Q1 b- y+ a$ _. s+ J4 N: O 9 `" \# A. k% Z$ R
Copy_Start: ;数据复制开始6 [2 [+ \! j' a6 ?3 U
LDA (Addr_From_Start),Y ;读取源地址! d( j% g) v: c- S
STA (Addr_Data_TO),Y ;写入目的地址
& m* Y' S) n- o3 ^# O2 k2 c* HCopy_INC_From: ;源地址低位递增
( w1 {8 B1 \5 f. z$ ~5 A INC Addr_From_Start ;源地址低位递增
$ D8 X7 M$ I4 B( A& Q BNE Copy_INC_TO8 H- E( F/ p! ~& s$ S
INC Addr_From_Start+1 ;源地址高位递增
7 G& H `: m5 R4 n- \& t, I3 {2 hCopy_INC_TO: ;源地址高位递增$ Y4 {1 ]) v) s% u4 b; E* `
INC Addr_Data_TO ;目的地址低位递增
! \; ]# Y0 d, N BNE Recopy+ R/ H; N7 E- T S# l4 e
INC Addr_Data_TO+1 ;目的地址高位递增9 _% d+ _7 K( L! `
Recopy:4 w. R! m) M1 C+ {0 N% ^
JMP Copy_JMP4 a, z0 Q+ j. |7 j! [5 \
* N _% X6 F6 ~1 ^# ?) t
Copy_JMP:
5 |9 j* T8 O9 ?! ^$ B JMP Copy_Over_Cmp
$ F- W* v9 Z$ F7 l% f) L# d }& v3 O' e& n f3 M
Copy_Over: ;复制完成) K3 o) P& L* x4 [8 t5 c
LDA #Data_Over
" l( d7 c' p" c0 H: A! e. e5 R STA Flag_Over ;写入完成标志2 Y3 l+ A5 c9 {/ O, q( j7 E
FINAL_BYTE:
* V) }' Z; L: e- R8 d" F LDA (Addr_From_Start),Y ;读取最后一个字节- y" ]7 F: l) i3 L, i8 j: ~& R/ t
STA (Addr_Data_TO),Y ;写入最后一个字节
) ]% B, K6 a2 [' K* S
{. n0 a- o/ w" WData_Copy_Exact: ;恢复数据) S6 |: O w( W* P' W: c! `) a
PLA
$ D, q/ |& \7 A, L4 O$ g7 J( M% T STA Addr_From_End+1
% l! C& g$ l I PLA
) Q7 M* C. K% \4 u8 ?; k STA Addr_From_End& o; S/ \* S' K4 e0 z
PLA
; D/ ?2 M0 b' t: D STA Addr_From_Start+1
$ t; t0 O9 |: @4 T PLA
' Q8 T$ ~7 j% ?3 i$ n3 V STA Addr_From_Start
# @; z1 N/ \4 j& k' w PLA
' b" X' l0 l5 f0 n0 B STA Addr_Data_TO+1
: U' c6 ^8 N9 b6 e- d6 w0 A PLA
5 u5 A7 |9 @$ w4 Q, ] STA Addr_Data_TO
& h# ^8 j v" w PLA/ f; g% w0 L% K
TAY
: ~" T; A* J4 ?! G) I1 ^' [! e PLA
% F) J p! z, f$ D TAX9 o6 u4 D, S1 L
PLA; N. W4 l; G$ q& [8 r
# L% D6 a) t$ G& ` M3 g) [$ bData_Copy_Return:
, S. W3 q' Q/ j8 V( R% t JSR Rec_INT ;跳转到恢复软件中断数据- h- k$ Q% l0 Y3 L" o
RTS
8 c: X3 t0 a- s
1 r) }9 O; V- `' m; [Off_INT: ;禁用软件中断% X- H5 J5 W+ ]' Q8 a3 w/ J
LDA INT_Addr. z' g" e* ~4 R! j Y! y: l
AND #$7F
# F; d* V/ W4 Q0 h% X1 v% k" V8 @ STA 2000) ~& n6 s5 V5 z
RTS
1 c# }5 H; ]7 k3 H4 q- k3 }+ Z8 G3 f- X
Rec_INT: ;恢复软件中断数据
) v9 O' I) ~0 k7 q% R( H G LDA INT_Addr
2 U! R9 N- L A* f4 w3 S" a2 U6 D. R STA 2000
6 t; f: {: s/ c7 m* ^4 }0 { RTS |
|