yandagui 发表于 2017-3-30 20:32:50

[FC][数据搬移程序]

本帖最后由 yandagui 于 2017-4-28 14:17 编辑

;[任意数据搬移到$6000-$7FFF] BY FlameCyclone
;2017.4.28
;例子:双截龙3
.ORG $8100    ;定义程序开始地址
JMP Copy_Data_Start    ;跳转到复制程序

Addr_To:    ;目的写入地址
.BYTE $00,$70    ;想要复制到的地方
Add_Begin:    ;源开始数据地址
.BYTE $00,$82    ;想要从何处开始复制
Addr_End:    ;源结束数据地址
.BYTE $EE,$91    ;想要从何处结束复制

INT_Addr = $A0    ;中断地址
Flag_Over = $7FFF    ;完成标志地址
Data_Over = $7F      ;完成标志


Addr_Data_TO = $A0    ;目的写入地址
Addr_From_Start = $A2    ;源开始读取地址
Addr_From_End = $A4    ;源结束读取地址

Copy_Data_Start:
Data_Copy_Protect:    ;保护数据
PHA
TXA
PHA
TYA
PHA
JSR Off_INT    ;跳转到禁用软件中断
LDA Addr_Data_TO
PHA
LDA Addr_Data_TO+1
PHA
LDA Addr_From_Start
PHA
LDA Addr_From_Start+1
PHA
LDA Addr_From_End
PHA
LDA Addr_From_End+1
PHA


Set_Data_Addr_Start:    ;设置复制起始地址
LDA Add_Begin
STA Addr_From_Start    ;设置复制起始地址低位
LDA Add_Begin+1
STA Addr_From_Start+1    ;设置复制起始地址高位

Set_Data_Addr_End:    ;设置复制结束地址
LDA Addr_End
STA Addr_From_End    ;设置复制结束地址低位
LDA Addr_End+1
STA Addr_From_End+1    ;设置复制结束地址高位

Set_Data_Copy_Start:   ;设置目的起始地址
LDA Addr_To
STA Addr_Data_TO   ;设置目的起始地址低位
LDA Addr_To+1
STA Addr_Data_TO+1   ;设置目的起始地址高位

Over_Copy_Cmp:    ;复制完成比较
LDA Flag_Over
CMP #Data_Over    ;复制完成标志比较
BEQ Data_Copy_Exact

INI_XY_Count:   ;计数器初始化
LDX #$00
LDY #$00

Copy_Over_Cmp:    ;地址比较
Cmp_Addr_Data_TO:    ;写入目的地址越界判断(向$6000前写入)
LDA Addr_Data_TO+1
CMP #$60
BCC Data_Copy_Exact    ;写入目的地址小于$6000时结束复制
Cmp_Addr_Data_TO_H:    ;写入目的地址越界判断(向$7FFF后写入)
LDA Addr_Data_TO+1
CMP #$80
BEQ Data_Copy_Exact    ;写入目的地址大于$7FFF时结束复制

Cmp_Copy_FREE:   ;源地址结束判断
LDA Addr_From_Start
CMP Addr_From_End
BNE Copy_Start
LDA Addr_From_Start+1
CMP Addr_From_End+1
BEQ Copy_Over

Copy_Start:    ;数据复制开始
LDA (Addr_From_Start),Y    ;读取源地址
STA (Addr_Data_TO),Y    ;写入目的地址
Copy_INC_From:   ;源地址低位递增
INC Addr_From_Start   ;源地址低位递增
BNE Copy_INC_TO
INC Addr_From_Start+1   ;源地址高位递增
Copy_INC_TO:   ;源地址高位递增
INC Addr_Data_TO   ;目的地址低位递增
BNE Recopy
INC Addr_Data_TO+1   ;目的地址高位递增
Recopy:
JMP Copy_JMP

Copy_JMP:   
JMP Copy_Over_Cmp

Copy_Over:    ;复制完成
LDA #Data_Over
STA Flag_Over    ;写入完成标志
FINAL_BYTE:
LDA (Addr_From_Start),Y    ;读取最后一个字节
STA (Addr_Data_TO),Y    ;写入最后一个字节

Data_Copy_Exact:    ;恢复数据
PLA
STA Addr_From_End+1
PLA
STA Addr_From_End
PLA
STA Addr_From_Start+1
PLA
STA Addr_From_Start
PLA
STA Addr_Data_TO+1
PLA
STA Addr_Data_TO
PLA
TAY
PLA
TAX
PLA

Data_Copy_Return:
JSR Rec_INT    ;跳转到恢复软件中断数据
RTS

Off_INT:    ;禁用软件中断
LDA INT_Addr
AND #$7F
STA 2000
RTS

Rec_INT:    ;恢复软件中断数据
LDA INT_Addr
STA 2000
RTS

afti 发表于 2017-4-1 20:40:43

感谢楼主分享教程!

曹的爽 发表于 2017-4-20 10:41:20

谢谢楼主分享!

yandagui 发表于 2017-4-28 14:17:30

程序更新
页: [1]
查看完整版本: [FC][数据搬移程序]