|
|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑
8 O4 V8 S9 I% ~- P/ Z# q) }* Q$ h! \
;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone4 B" E6 H. Y2 L2 Z5 G8 `
;2017.4.28% s% c6 V: g; ^
;例子:双截龙39 }4 f) N) ^, D: E) a
.ORG $8100 ;定义程序开始地址2 r; b2 @2 a5 J8 I3 j
JMP Copy_Data_Start ;跳转到复制程序 X+ C$ m: `& v" b C
5 Z5 U2 K, R3 `% h4 uAddr_To: ;目的写入地址
7 t6 }& I+ \" l4 b1 K .BYTE $00,$70 ;想要复制到的地方
. E: ?, A6 a8 Z0 j" D& iAdd_Begin: ;源开始数据地址
. N* }7 \9 i, T( D1 Z# \% G! j .BYTE $00,$82 ;想要从何处开始复制
& ~5 j3 Z8 G* l$ dAddr_End: ;源结束数据地址/ k# K. E3 X& T- ^: Y
.BYTE $EE,$91 ;想要从何处结束复制7 m5 A2 i1 z9 G8 G6 T5 |3 m
. R% z& y' \: a& e0 GINT_Addr = $A0 ;中断地址! o. |% P+ q/ a& U$ w
Flag_Over = $7FFF ;完成标志地址
L3 ~' Z \- u5 HData_Over = $7F ;完成标志
5 \/ a8 A4 Y$ c: A* C
/ T# }- O5 J' I2 F3 N- b- H9 w- d: C0 L0 @0 _$ \( l
Addr_Data_TO = $A0 ;目的写入地址' @6 j! Y& A% u
Addr_From_Start = $A2 ;源开始读取地址: m6 a0 Q9 C* R' o7 n* B; j
Addr_From_End = $A4 ;源结束读取地址, c% A/ `& L, \, ?6 q) H4 y
. p- x, y: z7 S; b$ o7 f3 q0 `Copy_Data_Start:( W) _# d) W' F* e
Data_Copy_Protect: ;保护数据
0 O: c6 `. j; ~- T PHA
: G7 i$ ~8 E: Q+ P; m0 K TXA0 e, d- s/ K ~( i$ T( K, B. L
PHA4 T% s f) ?0 ]- }7 p9 e
TYA
, f/ X) x- U9 Y( A! f PHA
" j4 Y; |' B2 v ^ JSR Off_INT ;跳转到禁用软件中断
: [. s7 R t; e LDA Addr_Data_TO8 e/ e1 U |& b0 u/ a
PHA, ?4 |; ^$ I8 | n5 a* ?
LDA Addr_Data_TO+1
, K+ b: W2 `) h PHA
3 t8 S6 s. G' Q- j LDA Addr_From_Start: f" q U: v: _+ S B3 c
PHA
/ `6 C+ s1 v0 P @2 \ LDA Addr_From_Start+1
5 j4 P, K5 K; I% ?5 w* O* K PHA9 P0 D6 e0 }( r
LDA Addr_From_End
; ]: W) F5 b4 l8 J+ Q PHA' \# d: r& @/ _- B3 ^+ w/ ^, Y0 _
LDA Addr_From_End+17 @& C: ^: M: {- `
PHA
- S) e/ q, v1 B' _" X3 _
, v5 @- f5 P2 w! f' q, \ % V( y) v+ x1 n5 f- \; J
Set_Data_Addr_Start: ;设置复制起始地址0 \/ v5 }% ~8 X7 X
LDA Add_Begin
+ A z) Y k) Q2 ? STA Addr_From_Start ;设置复制起始地址低位# N( b0 @. k0 } R) b# N4 [
LDA Add_Begin+1& f. S) D+ F& Z% x, `
STA Addr_From_Start+1 ;设置复制起始地址高位' g8 G4 y8 G6 T; W; g
9 V+ d; w1 \0 b9 sSet_Data_Addr_End: ;设置复制结束地址* r! j. \; r/ w
LDA Addr_End
& W. b9 `4 H. e0 R) b STA Addr_From_End ;设置复制结束地址低位
# d2 y5 n4 u6 a: m LDA Addr_End+1% L' l l5 D% W% o; e
STA Addr_From_End+1 ;设置复制结束地址高位
$ C* A- {: _1 X8 p( e( S5 j d7 I* R" T+ D# T
Y9 F" Q1 W2 m4 M# zSet_Data_Copy_Start: ;设置目的起始地址
" d6 q/ Q8 V. f4 K& R8 m8 e LDA Addr_To, y- W y1 s# k G @" M7 }
STA Addr_Data_TO ;设置目的起始地址低位
$ d2 `2 R8 y" j) T LDA Addr_To+1
( | {: ~; {5 k M" N5 e8 B; d; ] STA Addr_Data_TO+1 ;设置目的起始地址高位
+ V7 D1 C" G7 d& m- h( f% s2 B
& P0 X, Z+ H F( X. ZOver_Copy_Cmp: ;复制完成比较3 M1 Y3 J8 w+ U* F$ C% l0 r, H
LDA Flag_Over1 y: f0 S! l8 m: n# _7 B& c1 U' i9 G
CMP #Data_Over ;复制完成标志比较
6 a. r1 a6 U- M4 s% I BEQ Data_Copy_Exact
" e! v( [0 u7 T+ v
6 a$ I, U8 b9 g1 A8 PINI_XY_Count: ;计数器初始化
7 V# M. e9 a7 Q LDX #$000 R, B' G& M- k& r; I
LDY #$00! R# `9 m5 g( r
) r5 r2 e! c( Z) g
Copy_Over_Cmp: ;地址比较
! _4 c8 k# I, E; f! ?) uCmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入) t: D* Z* I5 O" v
LDA Addr_Data_TO+19 c/ c3 x+ |: D- h
CMP #$604 ~1 `2 [. S7 m q% s/ S8 v/ h6 m
BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制
3 \ y6 }' A7 b/ o; eCmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入): G0 M4 ^. E2 d% K# A* G' ]
LDA Addr_Data_TO+1: `8 u* U: J1 b! c, \, @
CMP #$80
5 t2 d1 s# N+ }" p/ x BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制
" p& n4 V6 W( W ' O* J0 \+ p% K3 l6 K2 I
Cmp_Copy_FREE: ;源地址结束判断
8 K, Y# p% s( `; R% y7 c1 G2 g+ j5 ?: S LDA Addr_From_Start
U* s7 R8 y: ?9 z2 A8 Y# O; n# f CMP Addr_From_End
4 |8 ^# T0 ?- Y1 o9 X BNE Copy_Start7 u% h3 A4 z! n J
LDA Addr_From_Start+1
. i8 J2 a; z0 x" T5 ^, x2 ~0 {7 D CMP Addr_From_End+1
0 w7 E" a: T3 U. @ BEQ Copy_Over
6 L, q; m: P f6 r* H - C$ _: o+ M8 ^ g6 c* G5 s# k
Copy_Start: ;数据复制开始" T: V3 \ c) y3 X% e( i6 [( T
LDA (Addr_From_Start),Y ;读取源地址
- n9 {5 S, C% }0 w5 N9 P* U7 c STA (Addr_Data_TO),Y ;写入目的地址# W3 ^# n' y! Y0 J( e$ C" M
Copy_INC_From: ;源地址低位递增
# F1 C4 E, i8 i8 Y' [" H# S INC Addr_From_Start ;源地址低位递增
, e0 e7 C: t; `# z9 l BNE Copy_INC_TO
# K2 f) c7 |9 T0 j INC Addr_From_Start+1 ;源地址高位递增
+ m" Y0 d# [0 v2 p- [, rCopy_INC_TO: ;源地址高位递增) n: X. o [) G
INC Addr_Data_TO ;目的地址低位递增. h6 T; _3 {- ^. {# J
BNE Recopy- n+ g, d' Y* _% z" Y4 E
INC Addr_Data_TO+1 ;目的地址高位递增1 ?3 G. V- ]/ w; ]" c- O G) r1 g# {9 L
Recopy:
6 H: \1 ~! p# U! @+ E' c: q4 K" e JMP Copy_JMP# T# P0 ]7 U D6 w9 q, C. V7 z% d
$ B# s( i& V5 C* Q: q' Y
Copy_JMP:
5 A+ [6 w% m6 ^2 [ JMP Copy_Over_Cmp; E" o6 B" X" J5 s1 I
! B9 D* w4 d/ v! dCopy_Over: ;复制完成
+ Q+ Q( _: ~: i) d. Q LDA #Data_Over0 P: E# Y* H: G& L% f
STA Flag_Over ;写入完成标志
. N3 U4 v! e/ ZFINAL_BYTE:
) c; `+ N3 W. B' W" B$ w LDA (Addr_From_Start),Y ;读取最后一个字节
2 F. u& P* d: l( K6 D STA (Addr_Data_TO),Y ;写入最后一个字节. M; r0 K. u3 @1 W( O# w# X$ P
3 o2 l7 y, k7 T* L* i# i
Data_Copy_Exact: ;恢复数据) d! P4 G% B' D: x# m0 B
PLA4 l( p3 ?2 v. x) A: h* {
STA Addr_From_End+18 d3 R+ Z( K# J- n, ?0 }/ l
PLA
+ ?6 i( L: ~8 K# S% c STA Addr_From_End B# @9 v. K% J0 I6 p0 X$ Z: c
PLA
+ i, T4 S0 V1 s A8 H% u STA Addr_From_Start+1" L6 s" {2 w/ @% T3 F! C
PLA
9 M; O# r, J8 A2 f- k7 y7 h2 ^ STA Addr_From_Start
; R* [1 D% W' h( M6 ` PLA0 w; I- [# P1 t
STA Addr_Data_TO+1
" K8 d3 [5 g% b7 B PLA9 J, _, _% b9 k, t
STA Addr_Data_TO
" }6 d% H* w: m. E' C PLA
, }- F" S }( u+ d F: n! x2 f TAY/ w, `, c! c2 }7 Q" h
PLA
( k3 e* f* \* ?* } TAX! ]9 \- f7 d6 Y1 w( D ]; Q
PLA
6 n$ Q- m7 y5 n/ g
8 f/ d- r+ T8 s) N0 l( u: zData_Copy_Return:1 G7 t, Z& u2 m- b2 A$ H( `
JSR Rec_INT ;跳转到恢复软件中断数据4 w1 E# b" S; U9 |9 x7 b
RTS
* C% O( N* Q1 A9 Z7 q; W ; m; @. W9 \) r' W" Y4 z( i' R
Off_INT: ;禁用软件中断6 k: P' A) u' R! c( K: L
LDA INT_Addr
3 q; j0 k+ S) p$ x7 P' g: c AND #$7F# P$ W1 w n# a9 H& a/ M. k
STA 2000
9 C9 O# @ D3 t- R RTS M% k& s; i. h& E* q
$ g& l. b) Q; @8 b" w% M) p3 ]1 ]
Rec_INT: ;恢复软件中断数据
0 }) r+ Z. s% a: N& l% q% c LDA INT_Addr
4 V! n4 u; h* v) ? STA 20003 _, G- {/ E( W
RTS |
|