hack游戏吧 关注:13,883贴子:89,097
  • 0回复贴,共1

[FC][数据搬移到PPU程序]

只看楼主收藏回复

;FC数据搬移程序 BY FlameCyclone
.ORG $8300
JMP OFF_INT
ADDR_DATA_TO = $A0 ;目的读取地址
ADDR_FROM_START = $A2 ;源开始读取地址
ADDR_FROM_END = $A4 ;源结束读取地址
DATA_OVER = $7F
ADDR_TO: ;目的写入地址
.BYTE $00,$A0 ;想要复制到的地方
ADDR_BEGIN: ;源开始数据地址
.BYTE $00,$A0 ;想要从何处开始复制
ADDR_END: ;源结束数据地址
.BYTE $FF,$BF ;想要从何处结束复制
INT_ADDR = $FF ;中断地址
FLAG_OVER = $07AD ;完成标志
OFF_INT: ;屏蔽中断
DATA_COPY_PROTECT: ;保护数据
PHP
LDA #$00
STA $2001
PHA
TXA
PHA
TYA
PHA
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 ADDR_BEGIN
STA ADDR_FROM_START ;设置复制起始地址低位
LDA ADDR_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 #$20
STA $2006 ;设置目的起始地址低位
LDA #$00
STA $2006 ;设置目的起始地址高位
OVER_COPY_CMP: ;复制完成比较
LDA FLAG_OVER
CMP #DATA_OVER ;复制完成标志比较
BEQ DATA_COPY_EXACT
INI_XY_COUNT: ;计数器初始化
LDX #$00
LDY #$00
COPY_OVER_CMP: ;地址比较
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 $2007 ;写入目的地址
INC ADDR_FROM_START ;源地址低位递增
BNE H_INC
INC ADDR_DATA_TO ;目的地址低位递增
H_INC:
INC ADDR_FROM_START+1 ;源地址高位递增
BNE COPY_JMP
INC ADDR_DATA_TO+1 ;目的地址高位递增
COPY_JMP:
JMP COPY_OVER_CMP
COPY_OVER: ;复制完成
LDA #DATA_OVER
STA FLAG_OVER ;写入完成标志
FINAL_BYTE:
LDA (ADDR_FROM_START),Y ;读取最后一个字节
STA $2007 ;写入最后一个字节
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
PLP
DATA_COPY_RETURN:
RTS


IP属地:广东1楼2017-04-28 15:05回复