|
|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑 a+ ?; h' x7 z4 G2 s- k
0 T& f$ `9 ^/ u! h
;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone; x3 r4 e. w) f- [- {, i$ \
;2017.4.28 h- O+ a7 R: I' a" T6 g7 l
;例子:双截龙3
3 ~( ~# Y4 `' g .ORG $8100 ;定义程序开始地址' P) ?. _! \7 R5 v7 @' B
JMP Copy_Data_Start ;跳转到复制程序
2 I9 J5 i: O0 k( o( d
7 j4 i: A2 H# vAddr_To: ;目的写入地址
0 |6 i6 a2 p# p+ Y- q! T5 q, K .BYTE $00,$70 ;想要复制到的地方, f, {* e) g! I: J7 p1 \' ]
Add_Begin: ;源开始数据地址, \9 Y, g2 @7 q& G$ g7 s
.BYTE $00,$82 ;想要从何处开始复制
( h: T+ J6 H$ |+ ~1 R* A' q# D. pAddr_End: ;源结束数据地址
, ~- N. v, @$ [. e: Z! q .BYTE $EE,$91 ;想要从何处结束复制 I0 m( N% y( D
6 ^4 q; Z" f: S) v# KINT_Addr = $A0 ;中断地址
, Z( S" ^8 Z) SFlag_Over = $7FFF ;完成标志地址) M4 ?# Y0 w0 |8 D
Data_Over = $7F ;完成标志
' V- w4 m7 L" h" r: _3 o
+ ?: @* Y5 i/ i" |) u! Z: ~" a6 A
0 P8 s5 x7 d1 VAddr_Data_TO = $A0 ;目的写入地址" F Z1 z0 ?+ O) h
Addr_From_Start = $A2 ;源开始读取地址
/ D: a5 t$ m, d* U: nAddr_From_End = $A4 ;源结束读取地址
9 x' _8 c2 X6 G8 s) k: X
' C q' m: w" p+ O$ S; TCopy_Data_Start:) i3 B# j6 `! r* e1 i+ p' Y! Q
Data_Copy_Protect: ;保护数据( u$ I( A- h" _. c5 ~
PHA4 D+ \% i3 h5 L7 a7 W; ]9 r2 p
TXA/ z+ m$ I: j1 f7 L
PHA
$ J; L1 T& h& |* Q q( E TYA
0 F1 V8 T. b6 `, a PHA; k/ r9 m8 c0 V/ h
JSR Off_INT ;跳转到禁用软件中断
2 T& h1 J0 S# m6 b8 `9 e LDA Addr_Data_TO
! i! r! |# c" e4 _* f' L PHA
1 z, A( s6 t2 x- ^5 h LDA Addr_Data_TO+1
' ?3 ^% _0 U8 K, m |+ m4 s PHA \2 k7 i- Z1 j( M9 R% z
LDA Addr_From_Start4 _! B" r5 \: L5 s H+ Z
PHA
( B+ u$ ~5 x7 `& p LDA Addr_From_Start+1
3 o! W( ?0 ^7 S PHA
3 p; a/ B& X8 M$ m1 s, f2 v LDA Addr_From_End
1 Q. X4 ]1 P! a! v PHA
6 q1 M3 Y9 \$ b) E% B1 W/ b/ C LDA Addr_From_End+1; |* ~$ n: u- ?2 y) ^* y. `2 W
PHA
; E4 R K/ ?0 X2 E* ?
* c. Y7 b, p8 t: U, n 5 K1 \2 }3 V0 e- W8 ?
Set_Data_Addr_Start: ;设置复制起始地址5 f* b4 |3 h0 ]; M6 D$ ^6 M
LDA Add_Begin9 f3 r; v+ _* J+ W" d' J
STA Addr_From_Start ;设置复制起始地址低位
p1 x# i1 M% ^6 I4 y4 O. L2 @) E1 ~ LDA Add_Begin+14 {& _9 q$ C1 V
STA Addr_From_Start+1 ;设置复制起始地址高位4 u1 N9 s+ e9 X7 j7 n& y
* p. _8 k7 {3 t: S. t/ oSet_Data_Addr_End: ;设置复制结束地址% @8 q5 H. Q) }& I
LDA Addr_End
/ J1 q. ~: B* @, Y STA Addr_From_End ;设置复制结束地址低位, J% J/ d5 Z9 l% \
LDA Addr_End+1
- ^. A8 X' w) Q) G4 l2 K8 h STA Addr_From_End+1 ;设置复制结束地址高位% g$ u3 L/ T H6 f+ S
+ C5 L7 y/ ]% ~, E- ASet_Data_Copy_Start: ;设置目的起始地址* s T4 ~# }' _- P J2 V
LDA Addr_To
+ H( f* l& C9 }. O$ f STA Addr_Data_TO ;设置目的起始地址低位
1 u/ w! \# n8 |- m& a8 ^ LDA Addr_To+1' m5 c% {+ h; L' _6 x
STA Addr_Data_TO+1 ;设置目的起始地址高位6 s. z) A+ J, Z" x
4 C, }4 ^' Q% w1 \; F0 z: LOver_Copy_Cmp: ;复制完成比较4 X8 \2 u! x! b
LDA Flag_Over
. M, h: z1 D2 d I! w# z# s CMP #Data_Over ;复制完成标志比较4 T. D' D2 M9 I( M
BEQ Data_Copy_Exact
/ N. X) D$ k7 z% E( C0 `. O8 W; h, N$ k, [. w( v
INI_XY_Count: ;计数器初始化
! H; U# i% q: V& J% h" t) I* ^ LDX #$00
9 M$ f. ?( b" _ LDY #$001 l) w% y" a. Z0 O
6 D$ y! {- ]8 X# `Copy_Over_Cmp: ;地址比较3 D9 @$ s1 q$ [8 ~$ r
Cmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入)
0 Q% D! J$ m9 I9 R6 R! y LDA Addr_Data_TO+1
: V# s6 e( v# W/ H2 Y" J1 a1 x CMP #$601 l4 U/ O. M% |7 Q# W
BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制! Z! |. O# s0 Y& Z
Cmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)
5 z+ ~& c' _2 i( E LDA Addr_Data_TO+1
" |) y1 m) Q% Q3 C CMP #$80
# o g" o: K9 j' L+ { BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制
# l6 Q* |- [" ~- z F! y
# m5 S- r/ R7 o# ]Cmp_Copy_FREE: ;源地址结束判断
6 O) p, C" G0 {, o1 I- X LDA Addr_From_Start
, F1 a* H8 m: L9 s( l CMP Addr_From_End
) E- r( S3 A' y BNE Copy_Start
+ j5 E( {0 y' r) V" F. q LDA Addr_From_Start+1
) r6 F4 b1 O; q! }& J1 c CMP Addr_From_End+14 W2 ^9 `6 F6 ]& e5 v
BEQ Copy_Over0 O; q1 K$ p4 a7 ~" ^' {# m
5 K+ r% I) E7 h/ ~Copy_Start: ;数据复制开始' G6 I3 e6 n& ]- S$ z
LDA (Addr_From_Start),Y ;读取源地址
' b4 @. `# K9 ?. x. q STA (Addr_Data_TO),Y ;写入目的地址+ _% L' I& I; O0 u" Z! o2 }! S
Copy_INC_From: ;源地址低位递增0 _, f) d& f! l2 m5 d3 s
INC Addr_From_Start ;源地址低位递增
4 |+ }0 y+ m% S+ S& q BNE Copy_INC_TO6 f5 v1 n- M& s. V
INC Addr_From_Start+1 ;源地址高位递增
- r3 x/ X% k9 o2 g1 TCopy_INC_TO: ;源地址高位递增& X2 Q. R% y9 {, e4 V- R
INC Addr_Data_TO ;目的地址低位递增) X/ }: Y! Y& ~ \8 a7 A
BNE Recopy
l, m7 O4 m9 d# X1 P4 T INC Addr_Data_TO+1 ;目的地址高位递增/ {0 C8 g" ^6 X |; h
Recopy:
( P' Y ?1 n9 t( H( F JMP Copy_JMP. X: D1 J% ?2 {4 e6 V$ G
/ v. x0 Q- B4 j& ]' v
Copy_JMP: ) Z0 N. p; F6 c" E9 X
JMP Copy_Over_Cmp
2 ?: Z" n4 c# m& b( Z4 h& x2 H4 l0 a
Copy_Over: ;复制完成% P4 T( A, ]! \3 m/ @! J
LDA #Data_Over7 d/ u4 G& s( E: B/ i+ E
STA Flag_Over ;写入完成标志2 _. ^! d$ h0 M, d1 T8 _
FINAL_BYTE:# p" O$ {% I* l8 H; f% z
LDA (Addr_From_Start),Y ;读取最后一个字节
" a. z. Y# H5 U4 p STA (Addr_Data_TO),Y ;写入最后一个字节
: R, g+ F0 T8 I4 s - ~" G: `( g, N" }
Data_Copy_Exact: ;恢复数据
4 H4 s# o5 ~( |/ ?) B PLA8 [, _2 K* ]. c$ v
STA Addr_From_End+12 ]3 s \; T3 c8 R$ Y/ y' ^8 _
PLA# I" D9 }' Z' f7 @) ~ {( s
STA Addr_From_End
5 M( G g% j; E PLA6 x; I2 Q( I7 \
STA Addr_From_Start+1
g4 @8 R8 X1 V; v$ E$ N+ K PLA
) M1 ]" @4 e7 ~5 G STA Addr_From_Start6 c J k: ~' x- b* Z- s7 _- ]
PLA
2 X6 M% U- S/ q8 u, _( H( J |3 i( Z STA Addr_Data_TO+1
0 Q6 s" m) X. t. C1 s PLA9 T+ P0 w3 Y9 F
STA Addr_Data_TO
* ^/ \( x: M2 W0 Q& K PLA
( ]/ j- L6 d: Z+ d6 X TAY
* U c* j+ B7 y9 g# D PLA% y* L! k/ I' Q' G; o: X
TAX; K4 h, Q6 J- b) x
PLA" k; i5 [: w2 T% d6 a4 I
( r: W) k* M3 J1 p7 R
Data_Copy_Return:
1 \' B/ w2 D- x z JSR Rec_INT ;跳转到恢复软件中断数据/ y9 B( q$ @/ j1 a: @9 @
RTS$ ]1 j! ~: I3 ~0 g, f7 Z- G i
' m8 |3 a* N) [! p; I& POff_INT: ;禁用软件中断3 Q ]/ S* j, m0 f; b
LDA INT_Addr: N( L1 h9 o/ v) G0 v
AND #$7F+ u3 N6 k( H l. F
STA 2000
7 h. k- H; J& a$ l: h: \! z RTS7 |: F, \) ?& o
6 D8 U- ?0 A( ]+ s: H- }Rec_INT: ;恢复软件中断数据9 t z6 n3 ]* g( A% x" q
LDA INT_Addr8 w' U2 w& i) ]
STA 2000( @$ T [* L" \& n3 R* T5 y
RTS |
|