|
|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑 , \( F) f+ _- x: S" e" V5 _; a
1 s" W. l# O: ?' m( ?
;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone
. k; T, x' J* Y! v% e7 V ;2017.4.28" W! Q# O! g: y/ b# M
;例子:双截龙3
* R2 z! O& a' F4 e9 p .ORG $8100 ;定义程序开始地址, h8 M3 K A2 m6 U/ L3 p# l
JMP Copy_Data_Start ;跳转到复制程序+ z8 Q+ h! R3 r
3 Z. C+ V! a* [3 X' n' SAddr_To: ;目的写入地址
0 S3 ?9 Z* [1 Y .BYTE $00,$70 ;想要复制到的地方
, C: m) r5 v/ ~! S4 kAdd_Begin: ;源开始数据地址% X9 g. j4 Z) q* u$ |$ Q& q
.BYTE $00,$82 ;想要从何处开始复制8 z' G, O0 g; Y# N/ N
Addr_End: ;源结束数据地址- K4 I+ [/ L1 N! K
.BYTE $EE,$91 ;想要从何处结束复制
U& G. W! U$ {8 V g+ ^0 q* A( t6 U* a3 _
INT_Addr = $A0 ;中断地址9 s& ?% }' o, j/ }* J4 O6 M
Flag_Over = $7FFF ;完成标志地址
5 |& l% w1 ?: R6 \Data_Over = $7F ;完成标志
6 R7 V# L8 D, F: C3 D6 B6 u5 i% e! ~$ N7 x
o) ?& v5 G" N5 }. o9 p, t/ T
Addr_Data_TO = $A0 ;目的写入地址
# D5 R- g, i4 e4 G. @! d+ u d+ Q8 s& h' XAddr_From_Start = $A2 ;源开始读取地址
0 j1 h& C5 E ?Addr_From_End = $A4 ;源结束读取地址. W7 X# X. V) l5 {( y
: q- Z. v; K9 I5 z$ j
Copy_Data_Start:4 H* H" f8 I0 r- U4 v5 ] X
Data_Copy_Protect: ;保护数据# T' n: d5 u# c! ]& ~7 t' w6 {% w
PHA
7 U( a! c& U7 E7 I TXA
8 @5 F/ f3 I) z o" U! z/ Z9 V/ C: Z PHA
n9 s; K( k+ k" b" p TYA" ~1 A9 H$ N: j0 f
PHA7 A, Y. A1 @- f2 w' ~& N5 X/ y
JSR Off_INT ;跳转到禁用软件中断$ f! H1 X; c6 w7 B! \. K7 O
LDA Addr_Data_TO8 {; ?* k+ e6 U6 ~- Y5 U
PHA8 @' m" A, h7 r* d- C
LDA Addr_Data_TO+1: D4 o8 \" k6 V: x4 C: n0 I
PHA2 J2 g* Z% T& k8 E% X6 T) I
LDA Addr_From_Start2 Y. B- @, a4 `; p
PHA
6 ?8 \$ k* W) U& s+ f% J5 L+ y LDA Addr_From_Start+1
9 Y2 W/ @( J5 b9 `$ u PHA
8 x8 {4 {4 x% h5 P L LDA Addr_From_End5 h7 B* n- y0 V- ], h$ Z3 e
PHA) E% n! a" r$ U; m8 N) R
LDA Addr_From_End+1. Y# e, |' U$ F8 s% Y) K
PHA1 Z0 o- x9 R& C R. T
6 g6 D) r6 n* n5 ^0 G" w, P6 a3 w
. y) I# i( m2 s" {8 ?: ^5 I
Set_Data_Addr_Start: ;设置复制起始地址) V- e" x @1 P. N4 J5 `7 n
LDA Add_Begin- B! ~8 x/ h# _3 p: q
STA Addr_From_Start ;设置复制起始地址低位
' B' h- J& u' C/ I9 e+ a' A LDA Add_Begin+1
$ V- {# y6 _* J# m STA Addr_From_Start+1 ;设置复制起始地址高位6 ~' }$ K# t/ j" V" x* t
c* U# g" ~9 U7 q( ]& g/ D+ kSet_Data_Addr_End: ;设置复制结束地址
+ _5 L2 z& V5 l ^5 n$ S LDA Addr_End, h% v+ b) ]1 t% q6 d; S
STA Addr_From_End ;设置复制结束地址低位 A0 b- \7 Q! {% _/ R4 D
LDA Addr_End+1
: d" I. r: X1 ^2 |8 }( o/ I STA Addr_From_End+1 ;设置复制结束地址高位
2 }/ k7 P8 ~9 c4 ^5 X ' K2 o. ?# R% ]) D: G. Z
Set_Data_Copy_Start: ;设置目的起始地址* l e9 H0 e4 Z4 c6 R* H* M# L
LDA Addr_To |0 C# M; s+ L4 b8 Z
STA Addr_Data_TO ;设置目的起始地址低位$ y- b8 V% `% g! Y
LDA Addr_To+1
7 h7 e8 D! m1 p8 A+ M6 k STA Addr_Data_TO+1 ;设置目的起始地址高位, d4 m- W8 w7 N4 l/ @" R6 X- B3 y
0 \8 z& M- x3 Q* i! g$ ]
Over_Copy_Cmp: ;复制完成比较
1 }; p+ N( S3 E8 R- t LDA Flag_Over
* B! `6 S+ b( @0 _" l" h CMP #Data_Over ;复制完成标志比较& i4 n" u/ M2 C8 h: ?2 k
BEQ Data_Copy_Exact
- I3 X/ [) `8 ^& u" f; s, w' m8 Q
H8 b9 j7 K' QINI_XY_Count: ;计数器初始化4 X9 E. C+ @7 q/ ]+ Z0 e, _
LDX #$00
: w% P9 S5 p2 d7 @' s LDY #$00) a3 q9 S# o/ ]! ?* _ X! O* m- c3 c
4 {3 k+ s" C0 YCopy_Over_Cmp: ;地址比较% r3 w, d+ v: G! Y
Cmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入), }7 p- ?( j& S
LDA Addr_Data_TO+1
. C& I$ U0 }$ U/ ?4 _ CMP #$60
! o7 M! `, x1 a: K, Y& e BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制2 e% w. @" L8 c7 V5 ]: e. y! b; p
Cmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)
: t8 b! }( W1 {5 ^% n# { LDA Addr_Data_TO+15 ~1 s5 n. I( n2 L; L4 m, s
CMP #$80$ H! `$ Z# K/ p% R0 x
BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制
' [( z! N" ?" z' v6 G7 M
/ A+ `" G* l' X5 CCmp_Copy_FREE: ;源地址结束判断; T+ T7 `$ s, s& M1 R; n
LDA Addr_From_Start% V. Y6 U4 l* Z5 ~ M3 y `1 {# y, O
CMP Addr_From_End
x4 j2 f0 K% l BNE Copy_Start
% U. U1 D0 b' s' i# H% D8 t LDA Addr_From_Start+1, W. L, F- q* p1 F
CMP Addr_From_End+1+ s! N/ G( r6 x2 m* |
BEQ Copy_Over9 o7 C! y+ r& s) t8 p1 _
8 t% D7 o/ f, E& V& _2 \$ p y
Copy_Start: ;数据复制开始7 ?6 f* v v$ F5 Z$ v
LDA (Addr_From_Start),Y ;读取源地址$ t+ ?5 v% Z7 P- G8 k7 `
STA (Addr_Data_TO),Y ;写入目的地址8 d# U7 {* U, E8 E% l3 ^/ f n
Copy_INC_From: ;源地址低位递增* h# k. X7 b+ r r
INC Addr_From_Start ;源地址低位递增" i( r" _9 q3 L/ i1 i
BNE Copy_INC_TO
0 \% G, T$ N" g; T5 f- B INC Addr_From_Start+1 ;源地址高位递增6 f4 `% z* `) ^- ^; H+ }
Copy_INC_TO: ;源地址高位递增! r0 _$ }6 ~; s$ |; I) n9 K
INC Addr_Data_TO ;目的地址低位递增- Q3 j( I2 B0 n+ r
BNE Recopy; s/ S0 J% t7 x# j- R
INC Addr_Data_TO+1 ;目的地址高位递增
$ f0 c; g: K4 FRecopy:: W: U. o" |& F/ \
JMP Copy_JMP
. b( t7 o- M8 N# r K9 ^
8 J: Q* g& E4 w; F1 pCopy_JMP:
" D, T, t& M: V8 a R' V9 Z8 q5 \ JMP Copy_Over_Cmp& a* S0 Q& u- t: {1 ?
; i( G9 V0 y% xCopy_Over: ;复制完成0 f3 [- G p2 @' s# S* S" ^
LDA #Data_Over
+ D" l+ E# {7 t/ |7 h( \/ q STA Flag_Over ;写入完成标志
: Y( p8 Z" m7 R) ?FINAL_BYTE:
/ m, O4 X/ A0 |% w T: m LDA (Addr_From_Start),Y ;读取最后一个字节
! N( T4 `2 E( v- ?* H' ], G- }% X, I STA (Addr_Data_TO),Y ;写入最后一个字节 _2 {% h% Y; i2 p8 v
: q' W/ ], p! l- X4 ^5 @Data_Copy_Exact: ;恢复数据
" C% R: G; v" c+ e1 j0 @% w PLA
, g2 u) l3 F; N I" _6 ? STA Addr_From_End+12 { A0 R! T" x
PLA# ^" S" e6 c; @# a* g
STA Addr_From_End
3 m& b! S! w( y" G PLA
7 C# x* q0 i4 p) P+ I# E& _ STA Addr_From_Start+1
8 w6 ]4 p; D( `# X# v; E+ \ PLA
9 P4 _5 G# c2 h9 K6 m2 g STA Addr_From_Start$ P: Z# e4 \! F4 {
PLA
* _$ H6 }! D0 T1 w1 h* H STA Addr_Data_TO+12 [: n' J% L+ `& v9 r
PLA& O) Y, r% I% C" }' I4 ?8 |
STA Addr_Data_TO. b% s1 a4 i7 k1 y3 E$ G6 i5 [
PLA6 Y0 U" f/ l6 o5 [
TAY
. B/ }4 e" W) e9 V' { PLA
8 {) A4 K; ~* ]4 a' o# K- E/ s' I# x TAX
0 u6 }" `8 t$ S, D+ w PLA3 K+ x5 K7 M( F( ~4 w ?) ]
( ^# C) P+ ~( {
Data_Copy_Return:- Y3 H6 t0 P+ o9 ~! O Q6 `
JSR Rec_INT ;跳转到恢复软件中断数据
3 y! z% `. M8 V RTS
/ I. F/ e$ c. T" Z: Q. D% M+ ?
" N1 x8 R( A7 ]5 h5 q7 a3 x; `1 OOff_INT: ;禁用软件中断/ I. h1 [, }( x: Y& l0 |/ [
LDA INT_Addr" H; @ L- A) M8 ^5 s. n# Y
AND #$7F
" |& f6 S+ T$ e' e' [( G STA 2000
% F( Y4 |4 f9 b$ U3 w RTS/ M/ q+ c# K& \/ j3 ?% A3 n* }
, Q' T( m5 M3 Y7 F' h! N! \3 }' jRec_INT: ;恢复软件中断数据4 @; @- Y9 L+ q% G- i
LDA INT_Addr7 n! U7 S" R: \$ f1 ]; p1 j
STA 2000" ?; Q; z: R+ t. `; |
RTS |
|