[FC][DataCopy][Multi mode]
Code:
;[FC][数据拷贝][20190428]
;FlameCyclone
.ORG $8000
FC_Copy_Addr = $00
;-------------------------------------------------------------
FC_Clear_Val = FC_Copy_Addr+$00 ;清除模式覆盖值
FC_Cpy_From_L = FC_Copy_Addr+$00 ;复制来源地址低位
FC_Cpy_From_H = FC_Copy_Addr+$01 ;复制来源地址高位
FC_Cpy_To_L = FC_Copy_Addr+$02 ;复制目的地址低位
FC_Cpy_To_H = FC_Copy_Addr+$03 ;复制目的地址高位
FC_Cpy_Count_L = FC_Copy_Addr+$04 ;复制长度低位
FC_Cpy_Count_H = FC_Copy_Addr+$05 ;复制长度高位
FC_Cpy_Port_L = FC_Copy_Addr+$06 ;配置地址低位
FC_Cpy_Port_H = FC_Copy_Addr+$07 ;配置地址高位
;-------------------------------------------------------------
FC_MODE_RAM_TO_RAM = $00 ;复制RAM到RAM模式
FC_MODE_RAM_TO_PPU = $01 ;复制RAM到PPU模式
FC_MODE_PPU_TO_RAM = $02 ;复制PPU到RAM模式
FC_MODE_PPU_CLEAR = $03 ;清除PPU模式
FC_MODE_RAM_CLEAR = $04 ;清除RAM模式
;-------------------------------------------------------------
;FC_MODE_RAM_TO_RAM
;1KB耗时21737
;FC_MODE_RAM_TO_PPU
;1KB耗时19692
;FC_MODE_PPU_TO_RAM
;1KB耗时20727
;FC_MODE_PPU_CLEAR
;1KB耗时12487
;FC_MODE_RAM_CLEAR
;1KB耗时16612
;-------------------------------------------------------------
TEST_DEMO: ;测试例子
LDX #<TEST_DATA
LDY #>TEST_DATA
JSR FC_Data_Copy
RTS
TEST_DATA:
;.DB $00,$F0,$00,$04,$00,$04,FC_MODE_RAM_TO_RAM
;.DB $00,$68,$00,$24,$00,$04,FC_MODE_RAM_TO_PPU
;.DB $00,$24,$00,$68,$00,$04,FC_MODE_PPU_TO_RAM
;.DB $FF,$00,$00,$24,$00,$04,FC_MODE_PPU_CLEAR
;.DB $FF,$00,$00,$68,$00,$04,FC_MODE_RAM_CLEAR
;-------------------------------------------------------------
FC_Data_Copy: ;数据拷贝参数设置
STX FC_Cpy_Port_L
STY FC_Cpy_Port_H
LDY #$00
LDX #$06
FC_Data_Copy_Addr_Set: ;从指定地址读入参数
LDA (FC_Cpy_Port_L),Y
STA FC_Cpy_From_L,Y
INY
DEX
BNE FC_Data_Copy_Addr_Set
LDA (FC_Cpy_Port_L),Y
CLV
LDY #$00
;----------------------------------
FC_Data_Copy_Mode: ;复制模式校验
CMP #FC_MODE_RAM_TO_RAM
BEQ FC_Ram_To_Ram_Mode
CMP #FC_MODE_RAM_TO_PPU
BEQ FC_Ram_To_Ppu_Mode
CMP #FC_MODE_PPU_TO_RAM
BEQ FC_Ppu_To_Ram_Mode
CMP #FC_MODE_RAM_CLEAR
BEQ FC_Ram_Clear_Mode
CMP #FC_MODE_PPU_CLEAR
BEQ FC_Ppu_Clear_Mode
RTS
;----------------------------------------
FC_Ram_To_Ram_Mode: ;复制RAM到RAM模式
LDX FC_Cpy_Count_L
INX
FC_Ram_To_Ram_Count: ;剩余计数检查
DEX
BNE FC_Ram_To_Ram_Copy
DEC FC_Cpy_Count_H
BMI FC_Ram_To_Ram_Over
FC_Ram_To_Ram_Copy: ;开始复制数据
LDA (FC_Cpy_From_L),Y
STA (FC_Cpy_To_L),Y
FC_Ram_To_Ram_From_Set: ;源地址递增
INY
BNE FC_Ram_To_Ram_Count
INC FC_Cpy_To_H
INC FC_Cpy_From_H
BVC FC_Ram_To_Ram_Count
FC_Ram_To_Ram_Over: ;结束数据复制
RTS
;----------------------------------------
FC_Ram_To_Ppu_Mode: ;复制RAM到PPU模式
LDA FC_Cpy_To_H
STA $2006
LDA FC_Cpy_To_L
STA $2006
LDX FC_Cpy_Count_L
INX
FC_Ram_To_Ppu_Count: ;剩余计数检查
DEX
BNE FC_Ram_To_Ppu_Copy
DEC FC_Cpy_Count_H
BMI FC_Ram_To_Ppu_Over
FC_Ram_To_Ppu_Copy: ;开始复制数据
LDA (FC_Cpy_From_L),Y
STA $2007
FC_Ram_To_Ppu_From_Set: ;源地址递增
INY
BNE FC_Ram_To_Ppu_Count
INC FC_Cpy_From_H
BVC FC_Ram_To_Ppu_Count
FC_Ram_To_Ppu_Over: ;结束数据复制
RTS
;----------------------------------------
FC_Ppu_To_Ram_Mode: ;复制PPU到RAM模式
LDA FC_Cpy_From_H
STA $2006
LDA FC_Cpy_From_L
STA $2006
LDA $2007
LDX FC_Cpy_Count_L
INX
FC_Ppu_To_Ram_Count: ;剩余计数检查
DEX
BNE FC_Ppu_To_Ram_Copy
DEC FC_Cpy_Count_H
BMI FC_Ppu_To_Ram_Over
FC_Ppu_To_Ram_Copy: ;开始复制数据
LDA $2007
STA (FC_Cpy_To_L),Y
FC_Ppu_To_Ram_To_Set: ;目的地址递增
INY
BNE FC_Ppu_To_Ram_Count
INC FC_Cpy_To_H
BVC FC_Ppu_To_Ram_Count
FC_Ppu_To_Ram_Over: ;结束数据复制
RTS
;----------------------------------------
FC_Ram_Clear_Mode: ;清除RAM模式
LDX FC_Cpy_Count_L
INX
LDA FC_Clear_Val
FC_Ram_Clear_Count: ;剩余计数检查
DEX
BNE FC_Ram_Clear_Copy
DEC FC_Cpy_Count_H
BMI FC_Ram_Clear_Over
FC_Ram_Clear_Copy: ;开始清除数据
STA (FC_Cpy_To_L),Y
FC_Ram_Clear_To_Set: ;目的地址递增
INY
BNE FC_Ram_Clear_Count
INC FC_Cpy_To_H
FC_Ram_Clear_To_Set_End:
BVC FC_Ram_Clear_Count
FC_Ram_Clear_Over: ;结束数据复制
RTS
;----------------------------------------
FC_Ppu_Clear_Mode: ;清除PPU模式
LDA FC_Cpy_To_H
STA $2006
LDA FC_Cpy_To_L
STA $2006
LDX FC_Cpy_Count_H
LDY FC_Cpy_Count_L
LDA FC_Clear_Val
FC_Ppu_Clear_Count: ;剩余计数检查
BNE FC_Ppu_Clear_Copy
DEX
BMI FC_Ppu_Clear_Over
FC_Ppu_Clear_Copy: ;开始清除PPU
STA $2007
DEY
BVC FC_Ppu_Clear_Count
FC_Ppu_Clear_Over: ;结束数据复制
RTS
;FlameCyclone
.ORG $8000
FC_Copy_Addr = $00
;-------------------------------------------------------------
FC_Clear_Val = FC_Copy_Addr+$00 ;清除模式覆盖值
FC_Cpy_From_L = FC_Copy_Addr+$00 ;复制来源地址低位
FC_Cpy_From_H = FC_Copy_Addr+$01 ;复制来源地址高位
FC_Cpy_To_L = FC_Copy_Addr+$02 ;复制目的地址低位
FC_Cpy_To_H = FC_Copy_Addr+$03 ;复制目的地址高位
FC_Cpy_Count_L = FC_Copy_Addr+$04 ;复制长度低位
FC_Cpy_Count_H = FC_Copy_Addr+$05 ;复制长度高位
FC_Cpy_Port_L = FC_Copy_Addr+$06 ;配置地址低位
FC_Cpy_Port_H = FC_Copy_Addr+$07 ;配置地址高位
;-------------------------------------------------------------
FC_MODE_RAM_TO_RAM = $00 ;复制RAM到RAM模式
FC_MODE_RAM_TO_PPU = $01 ;复制RAM到PPU模式
FC_MODE_PPU_TO_RAM = $02 ;复制PPU到RAM模式
FC_MODE_PPU_CLEAR = $03 ;清除PPU模式
FC_MODE_RAM_CLEAR = $04 ;清除RAM模式
;-------------------------------------------------------------
;FC_MODE_RAM_TO_RAM
;1KB耗时21737
;FC_MODE_RAM_TO_PPU
;1KB耗时19692
;FC_MODE_PPU_TO_RAM
;1KB耗时20727
;FC_MODE_PPU_CLEAR
;1KB耗时12487
;FC_MODE_RAM_CLEAR
;1KB耗时16612
;-------------------------------------------------------------
TEST_DEMO: ;测试例子
LDX #<TEST_DATA
LDY #>TEST_DATA
JSR FC_Data_Copy
RTS
TEST_DATA:
;.DB $00,$F0,$00,$04,$00,$04,FC_MODE_RAM_TO_RAM
;.DB $00,$68,$00,$24,$00,$04,FC_MODE_RAM_TO_PPU
;.DB $00,$24,$00,$68,$00,$04,FC_MODE_PPU_TO_RAM
;.DB $FF,$00,$00,$24,$00,$04,FC_MODE_PPU_CLEAR
;.DB $FF,$00,$00,$68,$00,$04,FC_MODE_RAM_CLEAR
;-------------------------------------------------------------
FC_Data_Copy: ;数据拷贝参数设置
STX FC_Cpy_Port_L
STY FC_Cpy_Port_H
LDY #$00
LDX #$06
FC_Data_Copy_Addr_Set: ;从指定地址读入参数
LDA (FC_Cpy_Port_L),Y
STA FC_Cpy_From_L,Y
INY
DEX
BNE FC_Data_Copy_Addr_Set
LDA (FC_Cpy_Port_L),Y
CLV
LDY #$00
;----------------------------------
FC_Data_Copy_Mode: ;复制模式校验
CMP #FC_MODE_RAM_TO_RAM
BEQ FC_Ram_To_Ram_Mode
CMP #FC_MODE_RAM_TO_PPU
BEQ FC_Ram_To_Ppu_Mode
CMP #FC_MODE_PPU_TO_RAM
BEQ FC_Ppu_To_Ram_Mode
CMP #FC_MODE_RAM_CLEAR
BEQ FC_Ram_Clear_Mode
CMP #FC_MODE_PPU_CLEAR
BEQ FC_Ppu_Clear_Mode
RTS
;----------------------------------------
FC_Ram_To_Ram_Mode: ;复制RAM到RAM模式
LDX FC_Cpy_Count_L
INX
FC_Ram_To_Ram_Count: ;剩余计数检查
DEX
BNE FC_Ram_To_Ram_Copy
DEC FC_Cpy_Count_H
BMI FC_Ram_To_Ram_Over
FC_Ram_To_Ram_Copy: ;开始复制数据
LDA (FC_Cpy_From_L),Y
STA (FC_Cpy_To_L),Y
FC_Ram_To_Ram_From_Set: ;源地址递增
INY
BNE FC_Ram_To_Ram_Count
INC FC_Cpy_To_H
INC FC_Cpy_From_H
BVC FC_Ram_To_Ram_Count
FC_Ram_To_Ram_Over: ;结束数据复制
RTS
;----------------------------------------
FC_Ram_To_Ppu_Mode: ;复制RAM到PPU模式
LDA FC_Cpy_To_H
STA $2006
LDA FC_Cpy_To_L
STA $2006
LDX FC_Cpy_Count_L
INX
FC_Ram_To_Ppu_Count: ;剩余计数检查
DEX
BNE FC_Ram_To_Ppu_Copy
DEC FC_Cpy_Count_H
BMI FC_Ram_To_Ppu_Over
FC_Ram_To_Ppu_Copy: ;开始复制数据
LDA (FC_Cpy_From_L),Y
STA $2007
FC_Ram_To_Ppu_From_Set: ;源地址递增
INY
BNE FC_Ram_To_Ppu_Count
INC FC_Cpy_From_H
BVC FC_Ram_To_Ppu_Count
FC_Ram_To_Ppu_Over: ;结束数据复制
RTS
;----------------------------------------
FC_Ppu_To_Ram_Mode: ;复制PPU到RAM模式
LDA FC_Cpy_From_H
STA $2006
LDA FC_Cpy_From_L
STA $2006
LDA $2007
LDX FC_Cpy_Count_L
INX
FC_Ppu_To_Ram_Count: ;剩余计数检查
DEX
BNE FC_Ppu_To_Ram_Copy
DEC FC_Cpy_Count_H
BMI FC_Ppu_To_Ram_Over
FC_Ppu_To_Ram_Copy: ;开始复制数据
LDA $2007
STA (FC_Cpy_To_L),Y
FC_Ppu_To_Ram_To_Set: ;目的地址递增
INY
BNE FC_Ppu_To_Ram_Count
INC FC_Cpy_To_H
BVC FC_Ppu_To_Ram_Count
FC_Ppu_To_Ram_Over: ;结束数据复制
RTS
;----------------------------------------
FC_Ram_Clear_Mode: ;清除RAM模式
LDX FC_Cpy_Count_L
INX
LDA FC_Clear_Val
FC_Ram_Clear_Count: ;剩余计数检查
DEX
BNE FC_Ram_Clear_Copy
DEC FC_Cpy_Count_H
BMI FC_Ram_Clear_Over
FC_Ram_Clear_Copy: ;开始清除数据
STA (FC_Cpy_To_L),Y
FC_Ram_Clear_To_Set: ;目的地址递增
INY
BNE FC_Ram_Clear_Count
INC FC_Cpy_To_H
FC_Ram_Clear_To_Set_End:
BVC FC_Ram_Clear_Count
FC_Ram_Clear_Over: ;结束数据复制
RTS
;----------------------------------------
FC_Ppu_Clear_Mode: ;清除PPU模式
LDA FC_Cpy_To_H
STA $2006
LDA FC_Cpy_To_L
STA $2006
LDX FC_Cpy_Count_H
LDY FC_Cpy_Count_L
LDA FC_Clear_Val
FC_Ppu_Clear_Count: ;剩余计数检查
BNE FC_Ppu_Clear_Copy
DEX
BMI FC_Ppu_Clear_Over
FC_Ppu_Clear_Copy: ;开始清除PPU
STA $2007
DEY
BVC FC_Ppu_Clear_Count
FC_Ppu_Clear_Over: ;结束数据复制
RTS