设为首页收藏本站

 找回密码
 立即注册
搜索
查看: 613|回复: 3

[原创HACK教程] [FC][数据搬移程序]

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:32:50 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-4-28 14:17 编辑 # S. o4 m/ v% K) Z! A6 v, W: q
$ B* x8 s9 [5 x, I2 {
;[FC][任意数据搬移到$6000-$7FFF] BY FlameCyclone
  w! S+ Q4 c4 F5 u$ o ;2017.4.28' G- `. L& _' u' g' M$ H
;例子:双截龙3
" @# E7 D1 k" L/ k: L .ORG $8100    ;定义程序开始地址
- c/ M$ B! g3 X  N3 m  B6 H3 w- F' ? JMP Copy_Data_Start    ;跳转到复制程序
! h% L2 m5 ?& S0 h5 Y
2 [! N' O' Q8 t' t; iAddr_To:    ;目的写入地址
3 x0 U2 k/ Z9 i1 s% Q) [ .BYTE $00,$70    ;想要复制到的地方
2 c1 `) Z; `0 m) F8 M7 O6 z5 T4 k& Q% NAdd_Begin:    ;源开始数据地址
- n4 q6 G3 k( ~3 G* ~$ {# i) b .BYTE $00,$82    ;想要从何处开始复制* I8 T* E, |3 d3 O- Y
Addr_End:    ;源结束数据地址
" W$ [- @  P( p/ W7 m0 S .BYTE $EE,$91    ;想要从何处结束复制
1 ^7 ]( G; @: D( s' Q0 B* k1 ^5 G( T4 A  Q
INT_Addr = $A0    ;中断地址
0 Y  _! P0 p& |; s0 I: kFlag_Over = $7FFF    ;完成标志地址
5 e5 ^; T+ O* N+ qData_Over = $7F      ;完成标志: ?+ T% t$ C7 W
& k' e; X; f# z2 |5 B3 _5 R! O# {

1 P, D  a, P4 _+ ~Addr_Data_TO = $A0    ;目的写入地址
' ?$ p' ~0 q% M  SAddr_From_Start = $A2    ;源开始读取地址. A8 @! d# r) r2 S; ]* w4 R
Addr_From_End = $A4    ;源结束读取地址. z# m5 I, y4 l6 T  V; c

% `4 Y8 C3 z/ u6 gCopy_Data_Start:
8 v1 s# g! }4 L/ C4 [Data_Copy_Protect:    ;保护数据) f! l, H3 o! O8 g
PHA: R' S+ b; u; b$ F
TXA
: @8 |% o. d; Z* n PHA
  {  u7 `0 r5 F4 a$ ~ TYA) p! D* k/ b! K( v/ Q) c5 j
PHA7 I0 `/ ]6 g5 j0 G6 |; T
JSR Off_INT    ;跳转到禁用软件中断
% o  A: q5 T' W" {* ~4 n- }) F1 p LDA Addr_Data_TO2 L7 M7 U* S* h% W
PHA" D& o; ~' [. l& ~: w3 Z' p
LDA Addr_Data_TO+1
- O& M& }+ Q  q8 u) L" k/ v* Y PHA# Z, m% {* H$ ^) \- {+ A
LDA Addr_From_Start7 E4 U1 e) Y6 \/ M! y+ f* r
PHA6 E: e5 ~) `8 C4 x% U; k
LDA Addr_From_Start+1
& U. P  C( c5 ?5 h! \! j PHA
  R! i1 y- H1 C7 ?! i1 I8 o LDA Addr_From_End, N7 a9 I2 o; L" |+ s
PHA; K% [" N/ h5 ]' W
LDA Addr_From_End+1
4 Y" B5 M  z5 H7 O: z PHA
% W! ~+ J6 [* v  K2 c
+ X% S5 v  j7 r% C   T$ Y+ N: p. p# {
Set_Data_Addr_Start:    ;设置复制起始地址
" p- y9 E! ?- a LDA Add_Begin4 n, z' G: K$ o! c2 g* H2 K. z
STA Addr_From_Start    ;设置复制起始地址低位
* Z, h# f& M. u5 |4 z; J LDA Add_Begin+1
' X/ A4 v7 S0 L$ l7 Z% P- v$ c STA Addr_From_Start+1    ;设置复制起始地址高位9 l4 y/ X" T0 X4 z3 b& R& D
8 ~% g; I; p9 Y0 x
Set_Data_Addr_End:    ;设置复制结束地址
% Z8 k  i5 b- l+ v; D) R# G0 D LDA Addr_End) i  t, _9 R7 @+ P; t! q
STA Addr_From_End    ;设置复制结束地址低位0 E8 t2 l; ^% m0 F* x# V$ A+ g" ?0 N
LDA Addr_End+1
$ G+ Q0 A9 ^" c* I. v1 {% c& q" T STA Addr_From_End+1    ;设置复制结束地址高位; w/ x/ L) L! D, z( _* e2 V

. }3 A: \. z3 m6 G' vSet_Data_Copy_Start:   ;设置目的起始地址# N5 c; z4 o8 R
LDA Addr_To& k1 L# y& C$ M
STA Addr_Data_TO   ;设置目的起始地址低位( H: a* a& d, J* R' a
LDA Addr_To+1' K+ a* x  S2 Z
STA Addr_Data_TO+1   ;设置目的起始地址高位
; e) l1 x. g: W1 a
" s( _' T1 z* h, _& OOver_Copy_Cmp:    ;复制完成比较) Y# |* K4 c: D
LDA Flag_Over
$ g0 h, i4 a9 M$ |# z CMP #Data_Over    ;复制完成标志比较+ w7 m& J( S& p
BEQ Data_Copy_Exact
7 a: q' G4 B3 y3 E. S; b/ `$ p, u) d( U+ j# p, Q5 E
INI_XY_Count:   ;计数器初始化) {! F2 O5 B9 w4 L: x
LDX #$00
" _! A7 b9 d9 }3 T, s0 s  @ LDY #$00
1 c8 c/ _' j$ m6 w% i8 A# H 1 A( M$ z* r7 Z' x$ y7 T
Copy_Over_Cmp:    ;地址比较& B4 ^- C: I6 H) b$ p  i
Cmp_Addr_Data_TO:    ;写入目的地址越界判断(向$6000前写入)
. u: ?& Z! S. Q7 L4 ^6 A2 ] LDA Addr_Data_TO+1$ b9 O' `  H4 w' I" o* q
CMP #$60
( a+ e0 l, K! X2 p/ t# I$ e& v BCC Data_Copy_Exact    ;写入目的地址小于$6000时结束复制" k2 R* M/ ?4 S" ?& n9 @
Cmp_Addr_Data_TO_H:    ;写入目的地址越界判断(向$7FFF后写入)
) c5 \( G1 L7 {/ q! |7 r5 i LDA Addr_Data_TO+1* X) n% _; Y: q
CMP #$80. D, J5 ?  z/ Y/ p1 b2 V5 U" g9 ]' O) I
BEQ Data_Copy_Exact    ;写入目的地址大于$7FFF时结束复制
' C: p) A. q, @; J8 o
2 k! t0 q) Q) O$ ]2 tCmp_Copy_FREE:     ;源地址结束判断; j. E9 C6 [5 a# f6 O+ l
LDA Addr_From_Start
1 v! N/ l; F% b5 T- l$ I( j5 Q% ?- R CMP Addr_From_End. ^. u2 _- I5 O6 W
BNE Copy_Start
1 I; A! \8 U0 a5 V LDA Addr_From_Start+1
& x# K5 H/ R4 G6 W" ~8 b9 o CMP Addr_From_End+15 U: c1 Q' u1 F
BEQ Copy_Over
$ @! @' ]1 `: M* e" r8 b 0 ]9 M4 _- a/ o4 U" N
Copy_Start:    ;数据复制开始2 Y0 u6 n- o# N
LDA (Addr_From_Start),Y    ;读取源地址! x4 k0 R' \5 Z$ _
STA (Addr_Data_TO),Y    ;写入目的地址( Y4 R: ?7 v; a: `+ F: F4 Y9 |
Copy_INC_From:     ;源地址低位递增
, W% \9 B. O8 w INC Addr_From_Start   ;源地址低位递增5 e* v; w7 E) T3 z2 j; K  M
BNE Copy_INC_TO' M1 z( w" X! l: r3 J9 W
INC Addr_From_Start+1   ;源地址高位递增
. ]) c0 v# e2 v2 z) |2 t4 hCopy_INC_TO:     ;源地址高位递增! `6 b; Z  S. R5 F
INC Addr_Data_TO   ;目的地址低位递增& J- _! W- A# A7 t$ s* E( q
BNE Recopy8 {5 ]- O5 @0 w
INC Addr_Data_TO+1   ;目的地址高位递增
, c% w- |- q1 o/ CRecopy:3 O+ M  L7 f7 ?% r. d0 ~  n, y
JMP Copy_JMP
3 U! P8 a0 Y* ?& N) |; U. V1 j " n2 Y5 \& `! D1 E8 U3 f) [8 V
Copy_JMP:      e+ H$ N5 Q$ I/ X5 R" r1 A  [
JMP Copy_Over_Cmp5 i; r4 Z  e3 Q% i& g
* r+ R) Z7 q' \4 t; q
Copy_Over:    ;复制完成) e, U5 X" N! D+ B4 A
LDA #Data_Over
! d- o" X% A; t0 n5 x: I STA Flag_Over    ;写入完成标志% T; p! o' a. ^: N0 z/ M. |
FINAL_BYTE:
, [3 p1 p/ C# o- U; F5 M* u LDA (Addr_From_Start),Y    ;读取最后一个字节
. a3 T" h: s1 Q- j- s1 L6 {+ ] STA (Addr_Data_TO),Y    ;写入最后一个字节
7 f' Y# F% W: G9 T$ b) s! Q2 }: I # {! o1 ~) x& j
Data_Copy_Exact:    ;恢复数据
; y+ O- ]& Z; \& I PLA
6 ~- u: z( h' X: i! o STA Addr_From_End+1
( f8 K( Q. _7 a6 j PLA" a/ D3 g4 _- W$ p& V% a
STA Addr_From_End% {3 R0 y& a7 J4 K5 a7 X, J5 Q# g
PLA* ?$ g3 q, h$ x. B: d3 T: p
STA Addr_From_Start+1
/ Q0 c! m6 z- z  a PLA9 I) q4 m; x$ H) c0 Z! |% ?- u
STA Addr_From_Start
0 Q/ S/ _8 U  ^; L PLA
5 d+ e2 V0 T# |5 @# U STA Addr_Data_TO+1' B& X' s5 C( f2 J) C
PLA7 I; [$ a6 F1 `8 Y! t( i+ I
STA Addr_Data_TO4 W( ]+ }" ^6 {/ }  S
PLA, P' _' }6 ~5 P8 {! ?1 J8 _
TAY. r- h" m/ Z  a' [
PLA
  B4 E4 N' O3 b: R, E$ E, E TAX7 E5 W3 t# K( x, V% O
PLA
+ @) ^$ j2 \. D1 m, M
7 Q; T  t" p- |" W6 U; H7 O* [Data_Copy_Return:
" y2 D" @2 Y8 {5 y JSR Rec_INT    ;跳转到恢复软件中断数据. o( e2 P+ R, b1 V
RTS
9 K0 U% C% C5 Q7 X1 |. ^$ F
$ T6 g1 [% ]4 {1 ]: IOff_INT:    ;禁用软件中断6 \5 m$ t9 ^( e" [2 b" i. z3 t
LDA INT_Addr' _+ l4 U5 Q" k# @2 m4 L
AND #$7F
+ }& `8 u5 O. M3 t  |* o- e STA 20000 J. q: @/ R1 g' s- A+ Q1 L
RTS2 E; j- h! J1 J$ C* H

2 B8 a- C. i% |1 ]6 _$ j) _( uRec_INT:    ;恢复软件中断数据
/ |, ^8 K4 E, r' Q& r LDA INT_Addr& o% k; T6 z3 T6 w( y; ~$ B9 [- E, _. Y
STA 2000
- H3 T. b) p0 l1 k& C- } RTS
[发帖际遇]: yandagui 打扫环境卫生,被奖励 6 个 柠檬. 幸运榜 / 衰神榜

签到天数: 3109 天

[LV.Master]伴坛终老

发表于 2017-4-1 20:40:43 | 显示全部楼层
感谢楼主分享教程!
[发帖际遇]: afti摆地摊卖菜,占道经营被城管罚款 6 个 柠檬. 幸运榜 / 衰神榜
回复

使用道具 举报

签到天数: 57 天

[LV.5]常住居民I

发表于 2017-4-20 10:41:20 | 显示全部楼层
谢谢楼主分享!
回复

使用道具 举报

签到天数: 39 天

[LV.5]常住居民I

 楼主| 发表于 2017-4-28 14:17:30 | 显示全部楼层
程序更新
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|国治模拟精品屋 ( 沪ICP备15012945号-1 )

GMT+8, 2026-6-26 09:53

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表