|
|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑 9 V# `, x; m! [# Z) M) L, d
% M+ W: f% [( q, r5 s ;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone4 C0 G ]. e; T) @$ z- X0 L
;2017.4.28
/ S$ ~$ X j- R ;例子:双截龙3
& ?4 q+ y8 a. V6 j- o( q .ORG $8100 ;定义程序开始地址( O! x* T/ k0 V/ S1 Q- H3 r; [6 n
JMP Copy_Data_Start ;跳转到复制程序
: r7 D. V( {+ A$ q$ j9 n+ L. K& E" Q: e- L' I( g
Addr_To: ;目的写入地址8 h: w& T8 Q D* u' |
.BYTE $00,$70 ;想要复制到的地方/ e# i" {% J! o9 n j p4 I
Add_Begin: ;源开始数据地址
1 x; a( Y5 l- t9 U& t' I .BYTE $00,$82 ;想要从何处开始复制
9 C/ o4 i& E/ N' d4 Q" b: f; B) w pAddr_End: ;源结束数据地址
& d3 e) c: m& ~/ }+ V .BYTE $EE,$91 ;想要从何处结束复制
; }0 z0 z6 S/ O) i9 `2 ]$ F. V3 k& r
INT_Addr = $A0 ;中断地址' j5 ?1 A% p8 G" U8 R
Flag_Over = $7FFF ;完成标志地址
! d4 n9 O: q* YData_Over = $7F ;完成标志
# s. j3 O5 G- I* a: f8 m
. d) w8 s& ^8 x' G. U
' L( q% a. a9 w p" ~+ R# JAddr_Data_TO = $A0 ;目的写入地址, j2 p' a u6 N! y1 @0 [
Addr_From_Start = $A2 ;源开始读取地址
7 A# S' {) ~9 H$ d- MAddr_From_End = $A4 ;源结束读取地址
& i; m8 ^6 |4 Z; q" s" b8 L9 f/ W9 a5 m* b" k, W$ m7 t9 c) Z/ X
Copy_Data_Start:
4 b6 I9 a+ ~+ ^' _% C7 WData_Copy_Protect: ;保护数据
' H! N) B" m: l# R9 ?3 U# e8 y( } PHA+ E' @( N( z" ?
TXA
- L1 T5 E" Q" D& W& @* d PHA
' p' Y# C1 {7 a( l TYA, X0 {4 {9 \3 s9 F( W; `2 E, _
PHA8 i% t) a. s4 @
JSR Off_INT ;跳转到禁用软件中断. E6 o7 P t- E, {
LDA Addr_Data_TO
$ T! N) B- v9 }0 K8 C7 a: n PHA0 z, e$ S! Z+ J! J2 V+ `9 ]
LDA Addr_Data_TO+1! H0 |, Z. J x$ z/ }. I
PHA
, J3 c" L9 d! y! U: d1 C s/ } LDA Addr_From_Start, S) F1 H, ^7 O
PHA" c! }% T# b- Q7 E& A
LDA Addr_From_Start+1
, x9 ^5 b! _1 y$ p PHA
5 {- m( q1 l' u$ d3 O: ~ LDA Addr_From_End! R/ g) n" |$ n1 b9 d% @& v9 O
PHA
; C# N8 Z- ~1 S6 Y0 N LDA Addr_From_End+1$ M ^/ k& J( k( D7 ]
PHA
' E" k6 E. j! O+ G* ?
7 @8 }. `: @- J
$ o. i% U: v- J& ySet_Data_Addr_Start: ;设置复制起始地址
; X! V$ [* m* K' b% v: } LDA Add_Begin
" e# \. @" c( p$ V9 E5 T0 O STA Addr_From_Start ;设置复制起始地址低位
: q) z+ R0 ~4 U3 p3 W% K j LDA Add_Begin+1# p# h4 ]. L+ ^ @
STA Addr_From_Start+1 ;设置复制起始地址高位1 A5 a2 s7 W7 r2 B9 F, y
2 F0 T* c* v/ ESet_Data_Addr_End: ;设置复制结束地址
2 R. L* z) W8 a% _6 A9 j5 g/ a LDA Addr_End2 h5 R+ @$ f# k$ N& ?
STA Addr_From_End ;设置复制结束地址低位
: `" [4 F c; Q LDA Addr_End+1
: e8 }+ P; f7 w9 b6 V STA Addr_From_End+1 ;设置复制结束地址高位/ k$ g" N3 {* {" w
& m: x8 _$ n/ A- F5 n+ [5 Y( L+ O; kSet_Data_Copy_Start: ;设置目的起始地址
! S, O4 i+ V# Z LDA Addr_To: K" l5 o U4 c" s. H* X
STA Addr_Data_TO ;设置目的起始地址低位
- F- R$ J) J5 b4 g; ^" K4 [ LDA Addr_To+1! O+ e4 f9 g* U, p" K0 F
STA Addr_Data_TO+1 ;设置目的起始地址高位3 r( S4 H6 {- ~3 Z; s
; n E; w; H' K& i! M
Over_Copy_Cmp: ;复制完成比较
3 c D4 E7 m: Q- ^, V LDA Flag_Over
m: Z# V4 ]* D, y$ X+ w. _& \2 f' V0 B CMP #Data_Over ;复制完成标志比较
) s! E; u. r) d6 o* F8 P) j T2 o BEQ Data_Copy_Exact
8 y' L: I2 o P% x
5 Y$ I; f; ]& ~6 V9 ~INI_XY_Count: ;计数器初始化. Z2 V7 q4 ^& k7 X! r: i0 s! e
LDX #$00
8 R7 G" T$ {) Q8 U+ R, f: ^0 ` LDY #$00
. q. n( |2 G! Y6 o
. d8 W! A: k# u' pCopy_Over_Cmp: ;地址比较
[" o% R; K( P8 [# {. | hCmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入)
) Q: \2 M& k% V2 `$ d; I% n/ { LDA Addr_Data_TO+1
; ^2 {0 M8 k+ p5 b# b CMP #$60 z) s$ t3 K( ^$ N6 Q9 A
BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制: h! ^' z( V0 t0 b, X' Z
Cmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)+ I3 s4 }' p, w& |9 \
LDA Addr_Data_TO+1
/ B. [% M1 i% @* b: X J3 \: Z CMP #$80; X# J& ^" |+ J; g6 E& Q
BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制* n( I' ~" d6 }/ }0 g
. W j5 x3 m! u" S5 S3 T( S: k& J* _
Cmp_Copy_FREE: ;源地址结束判断1 Y4 h, c' m& p/ {
LDA Addr_From_Start# ?1 M* H7 m( Q1 R
CMP Addr_From_End( J5 b/ z* B) b% X1 J; I
BNE Copy_Start8 k9 [, G* P) y) ?. y i
LDA Addr_From_Start+18 ?( B# [" `( R M# q
CMP Addr_From_End+1
) J& ]! o2 l, v0 C BEQ Copy_Over
* l2 J# F1 \* y8 N4 E* Y ( z/ g( B; n1 [, M
Copy_Start: ;数据复制开始9 \2 Q' |$ G% q6 p9 z3 _. [
LDA (Addr_From_Start),Y ;读取源地址
. q% ? E: c6 ^: q2 k0 D; t STA (Addr_Data_TO),Y ;写入目的地址
4 E- q, F+ O+ G; T3 DCopy_INC_From: ;源地址低位递增. j* o9 A# p& Z: b4 D
INC Addr_From_Start ;源地址低位递增
/ ~6 C0 F4 d+ n4 e p BNE Copy_INC_TO5 c2 R5 Z/ O9 |
INC Addr_From_Start+1 ;源地址高位递增
9 |- I9 w; J- n9 k+ g2 cCopy_INC_TO: ;源地址高位递增
6 k" ` k+ T( E9 `2 }2 H. } INC Addr_Data_TO ;目的地址低位递增/ _- e9 Y" q0 u3 G! s/ |/ F: {
BNE Recopy2 s8 t5 |' m; z& f# F5 h; b
INC Addr_Data_TO+1 ;目的地址高位递增
7 `& d) u0 w' ]8 B- v9 XRecopy:
/ Z; H5 j; i8 a0 B! q JMP Copy_JMP7 L0 |! A9 {% x0 r
4 }/ |. F1 d! I N" j9 O+ d: `$ Z
Copy_JMP: $ {' G, x' z' ]- S) H- g
JMP Copy_Over_Cmp
* d+ |+ a: f" {! f) E0 u
8 d/ E1 C9 f8 F( `Copy_Over: ;复制完成7 y, Q; B( j; y5 N [; y
LDA #Data_Over
/ z) T* x, `3 q: L* g! v* o STA Flag_Over ;写入完成标志 }3 a: c& h% I) d5 K7 @# h
FINAL_BYTE:
( r! p$ u) X3 m w LDA (Addr_From_Start),Y ;读取最后一个字节1 G, O5 h2 q; o1 b
STA (Addr_Data_TO),Y ;写入最后一个字节
' E; G- V: r% D* Y8 O " W3 t% @. R l6 _8 g- } Z: C
Data_Copy_Exact: ;恢复数据
* o1 [. Z4 x' z7 Y* x5 s PLA% T: {) P" `2 B, x$ g
STA Addr_From_End+1
( M& K9 f& z3 S: j0 v6 y PLA! q1 s# w( }2 Y
STA Addr_From_End( v2 ^7 P, o+ j3 x. w O1 Q
PLA
/ f) n$ z1 P: n1 G STA Addr_From_Start+19 e( n* J! A7 Q; _0 P# E* c9 d! d
PLA
+ g0 `6 ^( f% M% I STA Addr_From_Start
2 B- Z- E8 q& i$ R PLA7 B5 u$ W; o: Q9 k; Y6 F
STA Addr_Data_TO+1
/ v- T& z& E# J. ~4 [. ]9 m. _ PLA' T9 o1 p# b/ s" N
STA Addr_Data_TO) r- ^! h& f: \$ A
PLA
# \! C' q) |6 n TAY
7 {$ R& d" N0 Y2 H% z: \8 | PLA
+ Y% C7 O/ @4 { b3 h TAX. b3 D4 u7 D k+ ~% n, ?
PLA; k% s' }" G8 N( E- ?
: p3 E) ?4 W2 i0 M+ j+ Y0 E( w% OData_Copy_Return:
/ d8 I9 r R( a6 ` JSR Rec_INT ;跳转到恢复软件中断数据1 y- w/ t8 h# _
RTS4 D: N" |3 N# ^4 P
4 Y& k( l$ f/ {! i4 R; W3 a! GOff_INT: ;禁用软件中断) T/ g! A8 X- y. Z
LDA INT_Addr$ W! y0 }- _. ^) Z" p s. q" E
AND #$7F+ L, f# y; f; O) a: Y: U! l' p
STA 2000
3 s2 ? l! P' _ RTS
6 Q4 Q. R% d3 o$ v; A4 L
+ L1 Z4 ` ?# H1 KRec_INT: ;恢复软件中断数据
: H1 |; t. B3 v `8 g LDA INT_Addr0 ~" X. j9 x( V0 A$ V% x$ S4 i
STA 2000
( ~. _ o3 F. |* I, p! c$ O/ ~% i RTS |
|