|
|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑
' A6 F8 y% N9 w! I. C* R' f2 N5 W6 Z4 K# J( |$ h
;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone7 v9 G9 L! P+ Q: j$ k$ x+ i, z
;2017.4.28# z, E- K0 p4 p' a
;例子:双截龙3
& h+ L( a; s" L4 r, d .ORG $8100 ;定义程序开始地址
- n7 h% D' F& a0 F7 M7 T$ ` JMP Copy_Data_Start ;跳转到复制程序
8 L5 B! W {; N2 D2 S: C: r, X' i3 a# M
Addr_To: ;目的写入地址3 U/ L3 A5 e( `3 C% z
.BYTE $00,$70 ;想要复制到的地方# F/ t7 t2 V! @; I7 x
Add_Begin: ;源开始数据地址 [/ J8 ?3 c- N2 F: I( |
.BYTE $00,$82 ;想要从何处开始复制3 D# @8 [$ C: U3 F1 Q# \, b2 |
Addr_End: ;源结束数据地址
+ v3 f5 {7 N( Y: h& F! j# N0 |) j .BYTE $EE,$91 ;想要从何处结束复制% g$ V. i6 Q ^9 @0 p
* q0 L y( h! }
INT_Addr = $A0 ;中断地址2 e* @9 V6 Z/ Y9 m# Z; M E
Flag_Over = $7FFF ;完成标志地址3 s) ^! J5 | y% M" b+ V
Data_Over = $7F ;完成标志
! j! v+ \2 g& X
! ^2 u) ]6 k3 m* h( p [- \/ O, u5 G8 s3 d, d* K
Addr_Data_TO = $A0 ;目的写入地址8 P* U/ O; P. z5 D/ h, @& }
Addr_From_Start = $A2 ;源开始读取地址
" y( D, T% N2 E' eAddr_From_End = $A4 ;源结束读取地址* h( m4 z1 R2 s7 K
5 |3 m4 x. G' S q l" W/ d: ^0 i# q
Copy_Data_Start:
+ |& a) E6 G. C. lData_Copy_Protect: ;保护数据' ~2 z6 ^, ^' R3 v5 _- I9 \
PHA
4 B* e/ |4 k5 x: K/ ?# Q6 y TXA7 \" C$ A, e" F2 `' F
PHA
6 U1 [$ K6 B+ _, n1 d P TYA
( k4 u1 l' S# Y8 s PHA' l1 m1 {- w5 c1 y2 ?
JSR Off_INT ;跳转到禁用软件中断
) s$ e' J+ z% w& b3 S: P) h/ } LDA Addr_Data_TO
9 O, s i7 ?- E/ C PHA$ ]$ y6 H0 x- U% g
LDA Addr_Data_TO+13 h4 {, m n# s& @
PHA' M, @# }: j$ p. @
LDA Addr_From_Start
6 R% F! v2 V4 c4 g; `* S PHA/ D' G4 {7 A7 C# x% w$ y- `
LDA Addr_From_Start+1
/ K9 z3 h) {9 ~ PHA
5 ?$ k( s6 O8 d0 v# m7 r5 m% I4 K2 t* M; s LDA Addr_From_End x: I# Y# V& m! P" S
PHA
. u$ H' q z6 b. ]4 T n+ i! c LDA Addr_From_End+14 c" g5 G/ Y% V% U
PHA
3 v4 r' r. f5 b8 u+ R* x7 I( H1 }6 N' r5 J3 M) \0 n$ v
4 ^# K" @& I W. v5 q7 I6 DSet_Data_Addr_Start: ;设置复制起始地址
8 M- C$ ?8 m' k. T LDA Add_Begin" J. }& }% _9 k [
STA Addr_From_Start ;设置复制起始地址低位3 f$ S6 v% U: x- `
LDA Add_Begin+1
: o: d: p, i3 G& W STA Addr_From_Start+1 ;设置复制起始地址高位
5 ~* ?3 A& ]! S& E : M- W8 x2 O2 l0 O
Set_Data_Addr_End: ;设置复制结束地址
+ s5 m6 J; V4 x/ W. L9 H- Y5 R& ]4 \ LDA Addr_End: d( @# U) M6 P# M3 R& H
STA Addr_From_End ;设置复制结束地址低位+ m a( S* }' u' E: w- ?3 Q
LDA Addr_End+1
* `) I# J* B; `% U$ a STA Addr_From_End+1 ;设置复制结束地址高位/ H0 H- X0 |4 {: d, y
m! t3 q9 V1 ]* l2 ]Set_Data_Copy_Start: ;设置目的起始地址! ?/ x% L/ j& B: H( P7 y- o* m! |/ w
LDA Addr_To
/ a! i* n9 W3 k, D7 f5 w V+ y STA Addr_Data_TO ;设置目的起始地址低位; R2 J X; z; V3 X- I2 o9 [
LDA Addr_To+1
0 x+ h2 y8 D% b! R+ |. [1 W0 _; }5 \ STA Addr_Data_TO+1 ;设置目的起始地址高位
- n6 [7 K7 c ~0 g, ]
3 N; i' w1 M" n F8 c+ EOver_Copy_Cmp: ;复制完成比较( k$ F) R5 @' n1 ]3 c' S
LDA Flag_Over
& t( J A7 E" o; H! @2 y+ S CMP #Data_Over ;复制完成标志比较
2 ]/ H4 x" P5 c% n! b BEQ Data_Copy_Exact
" ~( S) n5 b0 h' `4 M, w7 A8 Z, n2 G; Y3 Y& w3 v' U
INI_XY_Count: ;计数器初始化
! V5 _1 d6 J7 k6 }! D LDX #$00$ a) d" \0 N2 R) z9 z" H
LDY #$003 ], |" C, k* `' l- V! H c$ t
- h1 A( S$ ~! u, Z" D2 x. ^
Copy_Over_Cmp: ;地址比较
- Q" p, J2 c+ Y. r pCmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入). e# f; g$ a2 d+ F B- C
LDA Addr_Data_TO+1+ g. G; @& u j' G
CMP #$60. X+ v: c" ~/ {7 L/ c6 x: `$ o9 O+ _
BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制
( G; M/ R* L d$ T7 x% _Cmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)
/ \) e7 r' s; U$ G7 _6 a* P LDA Addr_Data_TO+1
/ c5 ? L. `7 G$ q; L1 a CMP #$809 X. q( W" u ~
BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制
" X4 h3 s9 J! e, J3 y 2 K9 d) U% N6 h- ?
Cmp_Copy_FREE: ;源地址结束判断+ H5 |$ s5 S3 V' r$ G g l% {
LDA Addr_From_Start- V( z+ V, v! X1 K+ u5 t# }
CMP Addr_From_End
4 ^5 H# G4 _2 j7 U2 b- O' K$ M4 Z BNE Copy_Start1 N2 z5 z6 }6 Z& c% p& ]& n
LDA Addr_From_Start+1
8 E' ~9 q2 g l5 a3 D! O CMP Addr_From_End+1: }, N ~' c' i! n( Y; ~9 G
BEQ Copy_Over# v- x. b9 u! r1 c- D1 O$ Q
4 l/ q! `6 A6 K% f$ {
Copy_Start: ;数据复制开始; V$ M$ Y+ ^1 W( @! T* ^
LDA (Addr_From_Start),Y ;读取源地址+ h0 j/ O# g. w9 P( f. d6 G' n
STA (Addr_Data_TO),Y ;写入目的地址
! ^/ ]0 V0 a7 v* P# SCopy_INC_From: ;源地址低位递增+ }- n6 @+ v0 n% C
INC Addr_From_Start ;源地址低位递增
1 e% C! K$ D! J: ?5 \ BNE Copy_INC_TO
2 P) ?! P% P; L1 u" T INC Addr_From_Start+1 ;源地址高位递增+ W5 W; ?- ^- d- f7 |0 H$ k7 V
Copy_INC_TO: ;源地址高位递增
7 u9 ^) o' M; K INC Addr_Data_TO ;目的地址低位递增
6 |$ {% W9 n9 Z2 k; J; g BNE Recopy
* R. H1 {; B# S# w$ t L INC Addr_Data_TO+1 ;目的地址高位递增2 a# p9 z" e7 _1 ~+ ~9 _
Recopy:' n6 X5 e8 s4 W+ {. H
JMP Copy_JMP
# B+ b n8 z) X1 G" ]' R E" g $ j( d- h$ w, z
Copy_JMP: % a0 g6 ~3 m4 X, E: g# { z1 a
JMP Copy_Over_Cmp
8 r& I/ ^% Q% v* F$ G4 o+ v0 L( v; i9 f+ y
Copy_Over: ;复制完成
$ W! D" Z z6 ?- ]* \' b7 q2 L LDA #Data_Over: ~, y# m& |6 i7 e. ~' i
STA Flag_Over ;写入完成标志, y- @) i/ ~1 Q# d! P9 l+ B( _
FINAL_BYTE:5 w* P$ ~! K3 o( s, v
LDA (Addr_From_Start),Y ;读取最后一个字节. T) y" c0 _5 ?5 A4 F# K
STA (Addr_Data_TO),Y ;写入最后一个字节
+ V* T: R# `; x6 S/ C
; `0 C/ {& [ ?9 g& JData_Copy_Exact: ;恢复数据5 @9 b7 @: [) S. j: y8 Q# B
PLA
' O2 [! a6 |5 f1 m) I7 Q, ? STA Addr_From_End+18 T% W! ?! W* r* z8 k
PLA% v, E) `! y4 m0 z. V1 j9 A
STA Addr_From_End
. b3 u6 V* H k+ h4 H PLA4 O; [7 l$ m. `$ [" ^# S- R) Q# K
STA Addr_From_Start+1
; @( a, H" S$ ^3 }& @& k1 W8 } PLA- S+ q! \9 |* a% D% P! Q
STA Addr_From_Start8 L3 | _" [/ R& w7 C3 ~
PLA
0 Q' U) w$ ]- N, c: j STA Addr_Data_TO+1: G r4 k- c0 h) k# ]
PLA! N( Y! I" m* k* |
STA Addr_Data_TO$ B# |# o' b/ n! I) t& a
PLA0 O' B3 \* P' W8 q
TAY
, N0 T! H' c7 K z8 b' V PLA
$ w3 [4 B6 i# D TAX
" U7 [+ t/ \: a2 Z' h1 |6 } PLA/ W7 @. T1 E: M4 P& B& P
5 U% S9 M: W/ H( t- n/ S$ m% q& S
Data_Copy_Return:$ [9 S" M3 w) ^ A, [- u
JSR Rec_INT ;跳转到恢复软件中断数据
) d' w- E; r9 E* e2 d, W RTS
8 s, R7 c. `5 D ! C7 M: p! D, F" W9 K+ e, Y
Off_INT: ;禁用软件中断
$ Y( ]# g* u% X+ _+ { LDA INT_Addr4 j3 G. m) K2 b
AND #$7F6 T, W6 e5 _1 L& p
STA 2000
+ ~8 c/ e4 r* h RTS
0 L: [4 u. A5 Y9 l+ G; T! F# ^1 B& ?$ T3 }
Rec_INT: ;恢复软件中断数据& l; z$ d3 I& i; ` G+ K" N; H
LDA INT_Addr
' w9 ]. W- t4 o5 @ STA 2000
' V& ~7 Q* x. k& s! v4 J- A/ D4 u RTS |
|