[旋風][6502匯編][數(shù)據(jù)拷貝]

;[FC][數(shù)據(jù)拷貝][20190108]
;FlameCyclone
?.ORG $8000
?
FC_Copy_Addr = $00
;-------------------------------------------------------------
FC_Cpy_From_L? ?= FC_Copy_Addr+$00? ? ?;復(fù)制來源地址低位
FC_Cpy_From_H? ?= FC_Copy_Addr+$01? ? ?;復(fù)制來源地址高位
FC_Cpy_To_L? ? ?= FC_Copy_Addr+$02? ? ?;復(fù)制目的地址低位
FC_Cpy_To_H? ? ?= FC_Copy_Addr+$03? ? ?;復(fù)制目的地址高位
FC_Cpy_Count_L = FC_Copy_Addr+$04? ? ?;復(fù)制長度低位
FC_Cpy_Count_H = FC_Copy_Addr+$05? ? ?;復(fù)制長度高位
FC_Cpy_Port_L? ?= FC_Copy_Addr+$06? ? ?;配置地址低位
FC_Cpy_Port_H? ?= FC_Copy_Addr+$07? ? ?;配置地址高位
;-------------------------------------------------------------
FC_MODE_RAM_TO_RAM? ? ?= $00? ;復(fù)制RAM到RAM模式
FC_MODE_RAM_TO_PPU? ? ?= $01? ;復(fù)制RAM到PPU模式
FC_MODE_PPU_TO_RAM? ? ?= $02? ;復(fù)制PPU到RAM模式
FC_MODE_PPU_CLEAR? ? ?= $03? ;清除PPU模式
FC_MODE_RAM_CLEAR? ? ?= $04? ;清除RAM模式
;-------------------------------------------------------------
;FC_MODE_RAM_TO_RAM
;1KB耗時21740
;FC_MODE_RAM_TO_PPU
;1KB耗時19690
;FC_MODE_PPU_TO_RAM
;1KB耗時20722
;FC_MODE_PPU_CLEAR
;1KB耗時12489
;FC_MODE_RAM_CLEAR
;1KB耗時16614
;-------------------------------------------------------------
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 $00,$00,$00,$24,$00,$04,FC_MODE_PPU_CLEAR
?;.DB $00,$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
?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_Clear_Mode:? ?;清除RAM模式
?TYA
?LDX FC_Cpy_Count_L
?INX
FC_Ram_Clear_Count:? ?;剩余計數(shù)檢查
?DEX
?BNE FC_Ram_Clear_Copy
?DEC FC_Cpy_Count_H
?BMI FC_Ram_Clear_Over
FC_Ram_Clear_Copy:? ?;開始清除數(shù)據(jù)
?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:
?JMP FC_Ram_Clear_Count
FC_Ram_Clear_Over:? ? ;結(jié)束數(shù)據(jù)復(fù)制
?RTS
;----------------------------------------
FC_Ppu_Clear_Mode:? ?;清除PPU模式
?LDA FC_Cpy_To_H
?STA $2006
?LDA FC_Cpy_To_L
?STA $2006
?TYA
?LDX FC_Cpy_Count_H
?LDY FC_Cpy_Count_L
FC_Ppu_Clear_Count:? ?;剩余計數(shù)檢查
?BNE FC_Ppu_Clear_Copy
?DEX
?BMI FC_Ppu_Clear_Over
FC_Ppu_Clear_Copy:? ?;開始清除PPU
?STA $2007
?DEY
?JMP FC_Ppu_Clear_Count
FC_Ppu_Clear_Over:? ? ;結(jié)束數(shù)據(jù)復(fù)制
?RTS
;----------------------------------------
FC_Ram_To_Ram_Mode:? ?;復(fù)制RAM到RAM模式
?LDX FC_Cpy_Count_L
?INX
FC_Ram_To_Ram_Count:? ?;剩余計數(shù)檢查
?DEX
?BNE FC_Ram_To_Ram_Copy
?DEC FC_Cpy_Count_H
?BMI FC_Ram_To_Ram_Over
FC_Ram_To_Ram_Copy:? ?;開始復(fù)制數(shù)據(jù)
?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
?JMP FC_Ram_To_Ram_Count
FC_Ram_To_Ram_Over:? ? ;結(jié)束數(shù)據(jù)復(fù)制
?RTS
;----------------------------------------
FC_Ram_To_Ppu_Mode:? ?;復(fù)制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:? ?;剩余計數(shù)檢查
?DEX
?BNE FC_Ram_To_Ppu_Copy
?DEC FC_Cpy_Count_H
?BMI FC_Ram_To_Ppu_Over
FC_Ram_To_Ppu_Copy:? ?;開始復(fù)制數(shù)據(jù)
?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
?JMP FC_Ram_To_Ppu_Count
FC_Ram_To_Ppu_Over:? ? ;結(jié)束數(shù)據(jù)復(fù)制
?RTS
;----------------------------------------
FC_Ppu_To_Ram_Mode:? ?;復(fù)制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:? ?;剩余計數(shù)檢查
?DEX
?BNE FC_Ppu_To_Ram_Copy
?DEC FC_Cpy_Count_H
?BMI FC_Ppu_To_Ram_Over
FC_Ppu_To_Ram_Copy:? ?;開始復(fù)制數(shù)據(jù)
?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
?JMP FC_Ppu_To_Ram_Count
FC_Ppu_To_Ram_Over:? ? ;結(jié)束數(shù)據(jù)復(fù)制
?RTS