flamecyclone吧 关注:27贴子:24
  • 0回复贴,共1

[FC][数据搬移程序]

只看楼主收藏回复

;[FC][任意数据搬移到$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


IP属地:美国1楼2017-04-28 14:59回复