It is currently Tue Jun 18, 2019 4:03 pm

All times are UTC - 7 hours





Post new topic Reply to topic  [ 1 post ] 
Author Message
PostPosted: Fri May 17, 2019 9:19 pm 
Offline

Joined: Fri Jun 02, 2017 2:45 am
Posts: 12
[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


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 1 post ] 

All times are UTC - 7 hours


Who is online

Users browsing this forum: No registered users and 3 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group