|
|
本帖最后由 yandagui 于 2017-4-28 14:17 编辑
' i z* D1 S% b) f
- s/ }! e o# i7 X; { ;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone+ ?- A+ F8 ~1 P c/ q4 s
;2017.4.281 E5 j4 [3 C. X0 ?. Z5 ~
;例子:双截龙3
6 I& b M+ m7 V* m8 I+ D \ .ORG $8100 ;定义程序开始地址2 v2 ]4 m" g0 S" `0 P3 ?3 u/ i
JMP Copy_Data_Start ;跳转到复制程序
' v! e. h5 j4 j' t6 |0 U3 \) s' w) ?- H6 M& U. @" _
Addr_To: ;目的写入地址
0 O- b* ?! ?0 G+ p .BYTE $00,$70 ;想要复制到的地方
3 T# c/ ~' h0 jAdd_Begin: ;源开始数据地址
8 r! A4 |5 h/ Y' Q, h' Q6 s7 H0 E+ I .BYTE $00,$82 ;想要从何处开始复制% v. d# @1 G" p* n% b& h' R$ j
Addr_End: ;源结束数据地址
& }( @/ `* f5 _! z .BYTE $EE,$91 ;想要从何处结束复制; i4 j- c G4 M
1 @" k0 Z% X- A2 U8 v
INT_Addr = $A0 ;中断地址" `. l; a! y+ P/ @) T% v
Flag_Over = $7FFF ;完成标志地址
7 H0 n% R0 V& m( |( j" W5 rData_Over = $7F ;完成标志" f6 @* m" `* t" e8 m U
$ J {" f5 k% V" }2 Y
/ A: _* Z: T5 c( ZAddr_Data_TO = $A0 ;目的写入地址9 ~9 N* H: w B; L4 z/ I
Addr_From_Start = $A2 ;源开始读取地址
$ N+ O7 W: ?7 s1 ]% QAddr_From_End = $A4 ;源结束读取地址0 L9 b" f$ k/ i! g4 U
5 |5 b8 F/ B, _" R; |
Copy_Data_Start:
" G8 l+ M, g: s' q$ hData_Copy_Protect: ;保护数据
% J- }4 y' ~( T+ X f7 j PHA+ g0 e5 O4 u @' h
TXA
7 O4 H( P* c$ C2 R" W PHA! k* T1 S5 _ p/ g
TYA
& T: A: s) M; u. b# j1 R* ]+ _8 x PHA( h* H( g0 \8 X5 K' e$ S2 P
JSR Off_INT ;跳转到禁用软件中断
1 _/ k0 D8 Q1 z' h LDA Addr_Data_TO, w5 {& }5 {; B5 O
PHA. F; D9 g: _" U' D7 A+ z
LDA Addr_Data_TO+1- Q6 v3 R- L5 ^3 C1 \0 r
PHA
* W# h$ D# J% T$ d, T( z LDA Addr_From_Start* @: U* V1 p! j
PHA( r2 x+ }8 _/ \: _
LDA Addr_From_Start+1
' L' z3 C, G0 ~ PHA2 t- S, F; J; J# W
LDA Addr_From_End
- A9 p( }2 X0 |# B! t: n PHA; ]( C% B3 U8 w
LDA Addr_From_End+1
1 B! i9 }% }% T( J2 K PHA* W! O7 ?+ N& D
, h+ A) I; {) r B" ]1 w0 l
9 [& c0 ]) S: n* d+ Y. }Set_Data_Addr_Start: ;设置复制起始地址
- C7 k8 @% C. d LDA Add_Begin
$ e+ r6 Y* S& X2 _6 ? STA Addr_From_Start ;设置复制起始地址低位
- K/ D1 P: [& K LDA Add_Begin+1
. v( C% B0 Z' P+ p4 W& \# p/ { STA Addr_From_Start+1 ;设置复制起始地址高位& ?4 v5 C. d3 q' ]
. j6 e) w0 v1 S
Set_Data_Addr_End: ;设置复制结束地址" G5 X8 j8 i6 J2 m2 p
LDA Addr_End
* [' j+ L+ P3 L$ p# w STA Addr_From_End ;设置复制结束地址低位7 q- }. y0 g7 n" s
LDA Addr_End+1
% b3 N1 d6 J, f: ~+ [ STA Addr_From_End+1 ;设置复制结束地址高位: b" u# y/ S% i9 d' k: b W
6 J; ~. P: Q- v4 G0 `
Set_Data_Copy_Start: ;设置目的起始地址8 H) I1 Z+ {/ Y( M8 d4 a( c
LDA Addr_To. c) L' d( x, [
STA Addr_Data_TO ;设置目的起始地址低位- [9 [: c9 C* S
LDA Addr_To+14 x* P0 h4 Q, s8 r2 n+ ^1 n3 X
STA Addr_Data_TO+1 ;设置目的起始地址高位
" {$ s$ c7 J: q" o6 c2 Q1 r% [: p ( F1 j- Y+ j; t: o1 A
Over_Copy_Cmp: ;复制完成比较 c' ]- t8 q1 e( z
LDA Flag_Over; t8 y/ x7 @6 M# t8 f& I1 n
CMP #Data_Over ;复制完成标志比较+ [+ O h! R1 K$ A( o8 X
BEQ Data_Copy_Exact; u6 H' o) `8 J9 @$ D% d
9 B2 P2 F" q0 [
INI_XY_Count: ;计数器初始化
# {. `+ @+ H* Q& A3 [ LDX #$003 I. Y, W8 Q* l o+ c
LDY #$00
- w' A! U8 C, o& |' a& A # e% h7 r' k6 @' x
Copy_Over_Cmp: ;地址比较
, B* Z E! P2 ?6 w1 F* l5 s; V1 j, OCmp_Addr_Data_TO: ;写入目的地址越界判断(向$6000前写入)
$ Z) a3 `7 b0 ]( M5 L$ c LDA Addr_Data_TO+1( ?: }& P. e; h& Q+ {8 ], {
CMP #$60/ T/ S% K9 j& J5 X
BCC Data_Copy_Exact ;写入目的地址小于$6000时结束复制
, X+ L6 M4 _1 p# HCmp_Addr_Data_TO_H: ;写入目的地址越界判断(向$7FFF后写入)
0 U3 z+ x' ~$ R7 i4 b. r LDA Addr_Data_TO+1; d8 s( q$ d ?/ _5 \$ F: \
CMP #$80
- J; ~. F* f3 x6 w BEQ Data_Copy_Exact ;写入目的地址大于$7FFF时结束复制
- I8 T- }& _* `8 |8 v4 z* s ( a, ^0 S- A F& }. s+ H
Cmp_Copy_FREE: ;源地址结束判断
" a2 B: |0 [, g8 z7 r) a8 p9 [ LDA Addr_From_Start
* r/ _$ |2 ~1 g' X+ b% D CMP Addr_From_End" ?' K) `1 c9 l& b. Z, x5 N- Z+ |
BNE Copy_Start
# c. Z* u$ g, n6 S. v LDA Addr_From_Start+1" [5 s! I/ ^( R! T; ~% L
CMP Addr_From_End+1
9 Z5 H+ E W% Y; E: r+ m2 D9 { BEQ Copy_Over% O, ? l) v: W6 [0 K0 c5 H" ]
: @+ c/ ]* b& M" D& t- Q5 H
Copy_Start: ;数据复制开始
" c; ]; U, @* b E8 a# E( { LDA (Addr_From_Start),Y ;读取源地址
* n' g3 i1 l% ]* E3 x STA (Addr_Data_TO),Y ;写入目的地址
' K: d3 L- l) HCopy_INC_From: ;源地址低位递增) D- J/ w" `: j: N0 |8 }
INC Addr_From_Start ;源地址低位递增
! S: t( L# [, k, e' b( }( m BNE Copy_INC_TO+ D0 |, t+ ]4 \) g/ }' B
INC Addr_From_Start+1 ;源地址高位递增1 {+ q4 G6 P! o+ u, f+ @
Copy_INC_TO: ;源地址高位递增" I& y. |' G0 |+ E
INC Addr_Data_TO ;目的地址低位递增
q3 J6 y0 k9 i0 r BNE Recopy6 r. o; A4 L" Q8 g2 p, n
INC Addr_Data_TO+1 ;目的地址高位递增& }/ x J/ D1 W
Recopy:
: ^9 k+ Z6 A% Q JMP Copy_JMP" E* b I( c& r" ?- P# N
2 `& C; g- m, n
Copy_JMP: : \+ L4 |( g' M
JMP Copy_Over_Cmp( H- b" B. t# U/ p* }( l9 E
. s( B( t% Z; R$ S7 X- N/ |$ ]
Copy_Over: ;复制完成+ \) @. ^( x+ R# v0 V/ ?7 ]
LDA #Data_Over# @% |) ~7 Y6 Z3 ]- X; w% g& G* L
STA Flag_Over ;写入完成标志
/ T1 u8 h c/ Z" \! i% ]FINAL_BYTE:+ d& D' F8 D: i4 \3 a% u
LDA (Addr_From_Start),Y ;读取最后一个字节
% t; p0 c) t4 e7 h0 {, F STA (Addr_Data_TO),Y ;写入最后一个字节
0 H+ _3 b1 O' i; Y' V+ c2 z3 J
8 m3 R4 J9 X" P: ]$ Q) {6 fData_Copy_Exact: ;恢复数据
, o; |! I+ V1 G1 F. z PLA
- Q/ V- s2 I% V, p, D5 ` STA Addr_From_End+1
- l7 G! R5 X0 ~ PLA
j @; \5 L1 G& N: k STA Addr_From_End( j) a: \$ c; `4 c3 M8 |4 Z' p
PLA
! P- r! [& ~1 w7 W STA Addr_From_Start+1
: x6 D* C0 P+ O( [% R8 `6 G: ` r% i PLA; e% U+ J/ a/ r, t. u
STA Addr_From_Start
D5 M. f ?+ ^9 ~" {7 [+ @ PLA
- y, r/ a1 K v: q+ O" y' Z: ? STA Addr_Data_TO+16 k5 t3 @5 K& k1 _6 F- ~1 k9 K
PLA' {" M1 J/ Y6 b# n1 M* z& [5 O8 D, `
STA Addr_Data_TO
9 W H; T5 |& W$ G' p PLA
( K" j6 K4 S% Z( W) d( E+ j* M TAY
) q+ d$ a1 K+ l, `: O D PLA n, Q. l8 J2 o
TAX
$ s# {8 b- k1 ~4 ^# _) Q PLA- {. T9 s5 d" v: I! O) f
! m! B7 H7 h5 Q+ I3 TData_Copy_Return:
" m7 C5 `- }3 U5 B; \' `1 ~) O& j& D( S JSR Rec_INT ;跳转到恢复软件中断数据* Y& b" G- x/ \+ o, ]. _* w
RTS, }: z i. @7 S; M0 R G1 d
4 Q) [8 u3 v5 G# _+ j0 W
Off_INT: ;禁用软件中断) K- ]7 x% Y1 }
LDA INT_Addr
4 o# S7 o' v9 F z% F AND #$7F
* f& M3 H5 A$ u' M STA 2000
. J2 R% L$ L& u* t* m" } RTS4 N8 z7 I. j2 q, o0 Y% p( o8 i
5 B4 F8 Z% C. b" C# B$ g; U z- VRec_INT: ;恢复软件中断数据
7 G* ?$ u) k; d% I# S* q L7 R LDA INT_Addr
$ Q: B" D( r5 m8 x7 \+ A9 [ STA 2000
z) H2 j. t' \4 Z6 F6 ]& U% k8 h RTS |
|