|
|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑 6 b' }) W7 }$ b! O
4 f- {9 ?5 x7 m! E/ c2 ^' [ ;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone1 x/ ]5 W; _' X( ~: o5 k7 P
;2017.4.287 T' @" X9 l0 |3 l8 r) j
;例子:双截龙3
2 D+ A, s6 P/ N .ORG $8100 ;定义程序开始地址
0 `$ {9 [) G' [( r JMP Copy_Data_Start ;跳转到复制程序
; D7 A& H; @8 c4 `* h# b% k+ {7 v
8 E' W3 |- J! l0 o" n! X$ Y( [Addr_To: ;目的写入地址
' R5 _' r& ^5 F, U+ u7 H8 a) y+ R .BYTE $00,$70 ;想要复制到的地方, p* D9 f- t- e9 g$ F: r
Add_Begin: ;源开始数据地址
* A0 V! b' m* i+ y .BYTE $00,$82 ;想要从何处开始复制
9 Q7 l v5 x) g: d J- qAddr_End: ;源结束数据地址
+ A7 r* H8 u" I8 c# Q .BYTE $EE,$91 ;想要从何处结束复制
- I- G; k/ k4 O6 S
0 F* A9 b5 `: }# Z3 G: s( _INT_Addr = $A0 ;中断地址0 r9 U# o% {/ V0 m5 d0 z
Flag_Over = $7FFF ;完成标志地址
7 o$ u/ {+ G4 b$ Q% [6 oData_Over = $7F ;完成标志7 }' L7 ]( @3 v1 g& B: U
. M$ s; V- e) t3 X' y
& Y! F3 s5 ]3 j0 q/ E
Addr_Data_TO = $A0 ;目的写入地址' n `6 E! M& x( g" k7 W
Addr_From_Start = $A2 ;源开始读取地址
5 b1 C! z f+ G( a+ ?7 SAddr_From_End = $A4 ;源结束读取地址: Z. Z+ Y+ x% N" M h
4 B @1 Z. b% s" R
Copy_Data_Start:
1 f9 t4 a+ T/ {* }5 t! x0 nData_Copy_Protect: ;保护数据
9 J; p7 `& r7 |" |+ c" w PHA6 w3 O" V8 z0 |+ a$ u- i
TXA- O, a, Q2 f: E) H0 L
PHA5 ~' P9 v, v3 ]0 {
TYA) T7 n, |; J! F; @; x$ d6 \) Q
PHA
: @; A1 x6 f) V JSR Off_INT ;跳转到禁用软件中断6 |' O' Q9 z9 V
LDA Addr_Data_TO
9 U, ?& I! k* l- w, E PHA8 U8 \; T4 l) F0 L3 B
LDA Addr_Data_TO+1: x& a: i; y2 e# ^8 o' ]. B! z% K
PHA' d* g( X% u' {
LDA Addr_From_Start
) B1 q/ A3 D9 f6 m0 B$ D% i5 c$ u PHA
! }. ~5 r. W! Z4 s( t) _ LDA Addr_From_Start+1
$ M3 e" Q9 \. F2 L( c' ] PHA% l( W2 }% Y( z3 M! M; q
LDA Addr_From_End- q7 M3 F1 R0 K+ e+ s
PHA- u; t X6 g/ g7 S+ P+ t; ^1 [ K' ~
LDA Addr_From_End+1
; N; C$ l% ?% p: x: \) B PHA
9 G- Z. Z" [/ c1 S( q z
" F( Y4 x, t, n6 A8 ]
- r% q) b5 c, w. j, y& I- T* ?& [1 KSet_Data_Addr_Start: ;设置复制起始地址
; Z) g: \+ A# U LDA Add_Begin' y" f' P* |5 |: i4 j( W. ~( ]
STA Addr_From_Start ;设置复制起始地址低位2 j& \* y7 Q2 y6 G' f5 f
LDA Add_Begin+1
) m( f- D) I6 k, a' y" b STA Addr_From_Start+1 ;设置复制起始地址高位) _$ H1 `+ y1 B: W( l& S; V
. o1 y0 x) t" P U( K
Set_Data_Addr_End: ;设置复制结束地址
, }7 Y! A# c) Q; c4 r LDA Addr_End" N+ n. W. u( h1 J; C- v
STA Addr_From_End ;设置复制结束地址低位
; C }0 a4 C2 H# d LDA Addr_End+1* v4 H" ^4 P: \' c T, `" d) d" G
STA Addr_From_End+1 ;设置复制结束地址高位6 ^/ ]/ q4 M. I
4 u' I. C5 F& i# Y9 I8 qSet_Data_Copy_Start: ;设置目的起始地址
' x! }. \+ b$ M& `: P6 \% v# B LDA Addr_To
* f6 r* c5 x# B3 J STA Addr_Data_TO ;设置目的起始地址低位2 u) F; z1 M% Z' |& M6 g
LDA Addr_To+1
* ]' u) M* W- K g% k. C* a5 z STA Addr_Data_TO+1 ;设置目的起始地址高位
4 }! Y' n. i8 s8 K! m. W/ v4 e
3 W0 k# V5 [; Z, p7 TOver_Copy_Cmp: ;复制完成比较0 ~3 A a8 d' T+ \* F! Z
LDA Flag_Over
! h8 d% O, D9 j! C4 r9 E2 ~ CMP #Data_Over ;复制完成标志比较5 X s" h6 |5 u" c3 Y6 X
BEQ Data_Copy_Exact
# E: h$ r- j& X @1 e/ I# H# Z% Y [1 }7 x) O' O
INI_XY_Count: ;计数器初始化8 E( d' u! V; X
LDX #$003 O% s+ O$ [3 \8 `
LDY #$00
6 c5 n }6 D8 N) l, p
$ Z6 p9 b0 v, j, E) ]Copy_Over_Cmp: ;地址比较" B' a5 H# \" l; l9 U4 d
Cmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入)
& v, K* l% a0 L0 E7 M LDA Addr_Data_TO+1
. W$ L, y* `; n' w CMP #$60
8 V9 A- Y6 Z8 y# O9 O BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制2 p/ ?' l- {' F- f
Cmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)
|, r+ Y& s" I; ^$ I# j. G( K LDA Addr_Data_TO+12 L& v5 ?3 b/ I0 U
CMP #$80
4 D9 g) C3 U8 U# i: p o& R" | BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制8 _7 l- B6 L* p& l+ J
( W s6 ^0 Q2 P4 `3 g0 A8 M$ wCmp_Copy_FREE: ;源地址结束判断; |1 G, U9 z! L8 X
LDA Addr_From_Start
3 J, n% @8 a/ a8 G CMP Addr_From_End& N5 H# E' e8 t5 j/ H! J$ a
BNE Copy_Start1 N- ]! r4 x; s. [
LDA Addr_From_Start+13 R- e4 q3 ~# [7 h/ n+ S* d
CMP Addr_From_End+1* N$ R' o, Z2 h% ~% S( y' ^
BEQ Copy_Over: @$ B1 N# J9 }7 i% K
; k" w+ V) h, `8 ]8 G9 ^- jCopy_Start: ;数据复制开始
7 J3 |# l; @$ T, X/ ^$ L* z LDA (Addr_From_Start),Y ;读取源地址
: ?; `, ]( Z! V/ K9 I( n) x STA (Addr_Data_TO),Y ;写入目的地址
0 j7 m" @& x5 _9 J5 B/ JCopy_INC_From: ;源地址低位递增$ X" s/ N# s; O, y0 Z& d# ^
INC Addr_From_Start ;源地址低位递增
9 ?8 z1 O7 Q V$ P" H BNE Copy_INC_TO8 f" M/ d& [3 q2 ~
INC Addr_From_Start+1 ;源地址高位递增6 {* T2 ?4 r8 G5 P' s( i
Copy_INC_TO: ;源地址高位递增
4 m2 o4 X1 x$ U, ~8 B1 y: j INC Addr_Data_TO ;目的地址低位递增4 j. x, t. S+ p$ p1 o; h
BNE Recopy
# o0 o( g$ s& Y3 e* b% n9 R* G/ B+ d INC Addr_Data_TO+1 ;目的地址高位递增
$ c9 N3 U) J& kRecopy:! t% t( ~% H: P2 _: d
JMP Copy_JMP
+ x. }$ p; s0 g # l3 Q& t+ B, p, Q
Copy_JMP:
) Z# j, ?/ V0 `3 \+ T5 I JMP Copy_Over_Cmp7 k5 t, o" M1 _% g
2 Z ^9 }! ?4 a, U. B1 f
Copy_Over: ;复制完成4 u( _; c3 p+ W
LDA #Data_Over
3 {! J. s7 f/ [, y+ j7 @ STA Flag_Over ;写入完成标志
* f% n+ ~. V) S7 ?9 C2 S& mFINAL_BYTE:
1 k* j/ i$ i( n7 @ LDA (Addr_From_Start),Y ;读取最后一个字节2 w( q. L8 x. {* P, ?
STA (Addr_Data_TO),Y ;写入最后一个字节
" i. `% z. v0 r( R( ^- J
0 p# C3 Q6 H: K0 [Data_Copy_Exact: ;恢复数据
) M. Q9 P2 p; e- l PLA
- I) B t8 B3 A Z! J! z! q STA Addr_From_End+1
0 ?; i" T& A/ C2 h: V2 {1 S4 Z PLA; V9 M3 F6 H: N) D+ B6 `3 b
STA Addr_From_End
2 m* Q0 U. m% x' j) ~* J3 o1 A PLA4 e1 T' h4 w K
STA Addr_From_Start+1
1 u/ M; Y1 \; z+ A }. b3 E PLA( D% J O$ s* Z& i' c
STA Addr_From_Start
+ C/ p# h0 M: x9 J3 m7 G; o; X PLA
- u, E) _6 O: ]' J5 ^ STA Addr_Data_TO+1
+ ]. S& N/ x& {% S. [6 \3 K! | PLA
5 z/ Q7 \$ b; A8 W STA Addr_Data_TO' a! U* Z& o' [4 O. S: r
PLA8 N9 |- A& j+ K; g' L
TAY. U. S0 p# w+ ]! ?. J5 y
PLA
! z& V/ W! E3 ?) b; L8 a TAX: w N- V' L+ v5 v. Z
PLA* _$ ^4 d* k7 B0 q {1 U
. q, T2 R4 g$ M# f4 f: N
Data_Copy_Return:+ P" M. @: V3 w
JSR Rec_INT ;跳转到恢复软件中断数据
, K9 `2 j1 X6 T' w RTS
, J7 A ~. Y2 a; G ) T( \1 r$ D- f* D5 R4 T8 e
Off_INT: ;禁用软件中断# i' C; y" c. i7 m. p& `; a* K, N
LDA INT_Addr" f; H; |3 i. l7 s" X- r
AND #$7F) o+ Q2 I+ K% \! u
STA 2000
: y6 w: E$ ^% C( |1 q% E% G# j RTS
5 b4 C6 R, `( `" P* b& l3 d; h* I( O" g U9 F, s) E" P. S
Rec_INT: ;恢复软件中断数据
% l8 ~3 r% N9 I LDA INT_Addr
0 ~5 F8 o1 T1 f9 O/ M5 B) h STA 2000$ e! h6 F- Z6 u; \, i& ~
RTS |
|