|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑 3 r, Z, E [& W; b" r
! [$ j6 N. @; t5 s9 I
;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone
5 _9 p: l1 h2 m( W6 t ;2017.4.28. B6 k0 L! K; p; x; O
;例子:双截龙3
w6 r+ b' w, M9 q .ORG $8100 ;定义程序开始地址9 J- I5 J8 j6 h* j5 z( u' u
JMP Copy_Data_Start ;跳转到复制程序: p* j5 R0 e% I! z* z" i4 a) I
% v4 E1 w! Z% ] ]; K+ M1 T1 s* I
Addr_To: ;目的写入地址
9 t6 k) H; O6 t4 @# [ .BYTE $00,$70 ;想要复制到的地方
2 u& v, q2 w3 c% ^/ M) ~. NAdd_Begin: ;源开始数据地址: L% V. \: O/ V8 B( L
.BYTE $00,$82 ;想要从何处开始复制
( k0 H1 ?$ N, G: Y# j! K: QAddr_End: ;源结束数据地址
3 V$ l" ^- ~& A/ c! V) f3 ]# { .BYTE $EE,$91 ;想要从何处结束复制
. ^5 \, ~& d6 Y% G
) i% _2 J6 H% ^) f: QINT_Addr = $A0 ;中断地址0 h+ N. t( S2 K3 E
Flag_Over = $7FFF ;完成标志地址
4 w0 J9 o: @3 b/ E! U; q8 r' PData_Over = $7F ;完成标志
% _, ~3 o% }9 k. r7 E! s% ]- U
; f4 P. s* {/ }# u
; @! L: p3 R% _Addr_Data_TO = $A0 ;目的写入地址
* o/ [, h1 ]$ n1 w" H+ R+ j" zAddr_From_Start = $A2 ;源开始读取地址
6 U- M2 F' q# w/ e! G5 ~' x4 B# SAddr_From_End = $A4 ;源结束读取地址0 {+ Y3 z8 e9 C q# q2 U
# e: L6 ]; S9 h, P% t5 p$ w6 zCopy_Data_Start:
9 t [: h* \* nData_Copy_Protect: ;保护数据
, Q s4 G- b( y+ H0 k PHA2 k9 q4 J( Y4 G. E+ n6 N, }8 k# H) {1 } g
TXA7 T6 H) E* [! t% Q
PHA
) R4 g9 e2 G* }7 J TYA/ G' y% [& o, k5 H
PHA
* Q( G+ j0 s% a/ m5 w8 Q JSR Off_INT ;跳转到禁用软件中断* j, x0 d! M' k G! K
LDA Addr_Data_TO& n4 o4 Z. t* l" K% v% F! I# q
PHA) l1 P8 _" ]5 A" g9 S
LDA Addr_Data_TO+1
5 `0 E9 Q# P7 E& Z) o. [! T# k PHA" g9 f6 B9 r3 T! t4 ^7 ?
LDA Addr_From_Start4 T# t- K, t B
PHA
' `1 c# u. w+ [! Z LDA Addr_From_Start+15 R- E6 }1 C; X$ r' n: ~
PHA
% o. ^! G* s0 y2 Y2 S LDA Addr_From_End
3 c" e; T$ q8 L* W7 Q4 U z PHA% A; Y! @! F" W. p6 u; I) i
LDA Addr_From_End+1
: `$ R! k! @5 c8 X" y2 a PHA5 p9 q/ }/ S0 Z1 ~! f3 {) }
) }( F2 ]- w. q
! v+ e) _2 [) U0 M' uSet_Data_Addr_Start: ;设置复制起始地址
- E [0 P& x3 j2 { LDA Add_Begin
4 O8 E0 ?# T, h/ d: j STA Addr_From_Start ;设置复制起始地址低位
3 s# B Q1 Z5 c% k4 m" Z LDA Add_Begin+1
9 e: p8 \- S9 m+ ] STA Addr_From_Start+1 ;设置复制起始地址高位2 V/ M# A; M, `- O7 ^5 _
; G' R( {+ y6 Q* K0 _* t
Set_Data_Addr_End: ;设置复制结束地址
3 G0 E6 `$ C& s LDA Addr_End
" M2 s# p: ^7 r, { STA Addr_From_End ;设置复制结束地址低位4 O7 G5 Z! e) k2 W$ e: S, h
LDA Addr_End+1" u+ ]8 E$ Z$ D c2 K; Z# W
STA Addr_From_End+1 ;设置复制结束地址高位
. E4 z5 F0 b6 M3 p0 ^% r
- X- e9 }9 U/ [, Q: o6 uSet_Data_Copy_Start: ;设置目的起始地址# w6 Y8 [7 x3 ?6 i0 ]0 @8 r
LDA Addr_To8 u" J1 P( r! }. b
STA Addr_Data_TO ;设置目的起始地址低位
7 e' w4 Y/ G, M6 G: s LDA Addr_To+1
/ `0 w1 ]3 g, ` \ J STA Addr_Data_TO+1 ;设置目的起始地址高位7 _! A: T+ Z: C6 h
% ?+ a2 W' G' v8 a
Over_Copy_Cmp: ;复制完成比较
" O8 i* F2 G# f/ [ LDA Flag_Over
) p' [- [+ i9 `% b, f$ ^ CMP #Data_Over ;复制完成标志比较) e D! I g- g2 E9 [! s1 h4 y
BEQ Data_Copy_Exact3 {* }/ k8 W9 q' ]0 h: U0 \ T2 _
* B1 S& z& Z0 |+ Y7 Q' iINI_XY_Count: ;计数器初始化
/ M5 ~/ o: |( B' t& n8 ^# S$ K: O LDX #$00
, e# M4 s P( g! F1 C4 k; K* F LDY #$001 o9 e, S3 Y; M. b7 ?. [; g
7 h1 B* ~9 M, P @
Copy_Over_Cmp: ;地址比较
! T r N7 Y2 S: k& I* g9 u& [Cmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入)
' q# o1 L4 g! T LDA Addr_Data_TO+1. F0 y+ a3 _& T( J) Q8 h
CMP #$60
: h( l* ]% L8 v2 L BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制
0 _) z7 Z8 z yCmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)
5 J2 c- b" [. |- M: G6 G) D7 C LDA Addr_Data_TO+1
1 V; @8 p4 f" W/ g CMP #$80
) p" j% V2 `% k( i BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制/ g: h5 j6 @- U
4 y/ D/ [! ? U. v3 [0 i2 q$ }6 K3 l
Cmp_Copy_FREE: ;源地址结束判断
( V% C0 S6 N; m LDA Addr_From_Start
+ K2 X/ S) B3 N& c, c( x CMP Addr_From_End1 G( o$ G5 A: Z/ n' B* e
BNE Copy_Start
2 {! t) V+ s! f, f, \9 j LDA Addr_From_Start+14 \. ^- M: _5 p4 Y5 S
CMP Addr_From_End+1, U \( O* N' U% Q4 L' \
BEQ Copy_Over& W/ x8 r9 T( y2 a! w" C1 e
2 G5 R, p% ~7 E1 [2 KCopy_Start: ;数据复制开始
% I& s# I. D, ]* b% O LDA (Addr_From_Start),Y ;读取源地址0 t- D, W8 }5 V! a* C. s, ~* ~5 x
STA (Addr_Data_TO),Y ;写入目的地址
; b+ Q/ d- ^8 `Copy_INC_From: ;源地址低位递增
% s9 h9 j; A' I9 x INC Addr_From_Start ;源地址低位递增) ?( V" k+ J W* T2 [# v, w
BNE Copy_INC_TO
l4 R; W3 U4 o2 x J. U INC Addr_From_Start+1 ;源地址高位递增' Q9 I- E, g" G6 H- r7 y" K7 t
Copy_INC_TO: ;源地址高位递增" D+ n9 L1 b% _) U O
INC Addr_Data_TO ;目的地址低位递增$ _. ? `; a7 n3 i* T' H# X
BNE Recopy) V @( ] I8 s* |2 g3 q' U
INC Addr_Data_TO+1 ;目的地址高位递增" n9 s5 A* |$ i/ I( Z
Recopy:% h- C# H+ j% a, l! [, h
JMP Copy_JMP& n' D. b$ g- c K6 ~' e) S2 h* f4 j+ O
1 s. ~! H& ?+ B
Copy_JMP:
- I4 \2 @$ @7 ~- F% O, h. q JMP Copy_Over_Cmp. m. q q+ p5 S& i1 Z `
. W1 d, G: [! N' | @6 |- Z( {6 pCopy_Over: ;复制完成% P5 }7 W6 Y4 |: s; D
LDA #Data_Over
+ s' \7 U2 G' V. I STA Flag_Over ;写入完成标志
7 W5 [% X( R$ W+ _3 iFINAL_BYTE:# K% x: Y/ v8 O, Z4 J! l! a0 J; K' R
LDA (Addr_From_Start),Y ;读取最后一个字节
- L& C: d* E0 Q2 o( o. v8 m/ s STA (Addr_Data_TO),Y ;写入最后一个字节
3 \# ]" `6 b7 t2 l
8 \% ?6 j9 d6 T6 B2 CData_Copy_Exact: ;恢复数据. ?! |# I) G s3 i9 D, `# D( n) \
PLA
2 k5 a# k( ~- E STA Addr_From_End+1" G& C9 P, m. S! I% C+ B+ v0 q
PLA
( r5 x& E/ J2 f; S$ _ STA Addr_From_End4 Q" E! x: G* R0 }$ D
PLA
; x; W/ K& E5 ]% Y/ c STA Addr_From_Start+1
! S1 @/ K8 C# e' |) X PLA
( O4 M1 b. Z% j STA Addr_From_Start
$ \+ _/ g1 o5 g1 j; ]1 { PLA
/ q7 ^- O+ \. U$ r6 [ STA Addr_Data_TO+1
- c. y9 P% B: b8 o: C PLA( u: W/ k' l) q
STA Addr_Data_TO
. _9 C" T5 j' b$ u! H PLA
& o$ r9 I$ z$ i9 l! L TAY
# f* p/ P/ P9 } PLA! q s: R& W- g! w
TAX( ?. L5 ?, Q7 C& Y" Q" R4 p
PLA/ a% n; j0 J f# P) y) M
* b1 i& L7 e+ U7 m: x9 f5 Z
Data_Copy_Return:
9 _2 a& ^+ a9 R2 o JSR Rec_INT ;跳转到恢复软件中断数据# u# f% j' F9 Q0 M% l
RTS
1 c' d3 \: q- o% n* j . c" n4 K( C, I" \9 N5 B5 T
Off_INT: ;禁用软件中断
+ z7 b7 v; n% X( q LDA INT_Addr5 q" P9 c) z2 ?9 G2 [
AND #$7F
+ y9 H; o, W! H& c3 d STA 2000
; d# h( M/ A4 g. c& f0 S- J/ ~+ e f. r RTS
5 y- h3 A0 D" n$ d7 v9 q* B& u+ E( u+ H0 c+ F& Y6 \
Rec_INT: ;恢复软件中断数据0 j) x3 S) _+ @- ^
LDA INT_Addr! _0 \& A ?* ]1 d0 @, m
STA 2000
: i* v+ c, l) n8 s) { RTS |
|