This page is a mirror of Tepples' nesdev forum mirror (URL TBD).
Last updated on Oct-18-2019 Download

[FC][DataCopy][Multi mode]

[FC][DataCopy][Multi mode]
by on (#239023)
[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