iigs-game-engine/src/sprites/DirtySpriteProcs.s

92 lines
2.6 KiB
ArmAsm

; Functions to handle rendering sprites into 8x8 tile buffers for dirty tile rendering. Because we
; are rendering directly to the graphics screen instead of the code field, we can map the direct
; page into Bank 01 and use that to avoid writing the merge sprite and tile data to an intermediate
; buffer.
;DirtyTileSpriteProcs dw _TBDirtySpriteTile_00,_TBDirtySpriteTile_0H,_TBDirtySpriteTile_V0,_TBDirtySpriteTile_VH
; Optimization Note: The single-sprite blitter seems like it could be made faster by taking advantage of
; the fact that only a single set of sprite data needs to be read, but the extra overhead
; of using the direct page and setting up and restoring registers wipes out the 2 cycle
; per word advantage.
;
; A = screen address
; X = address of sprite data
; Y = address of tile data
; B = tile data bank
_OneDirtySprite_00
_OneDirtySprite_0H
phd
sei
clc
tcd
_R0W1
_ODS_Line 0,0,$0
_ODS_Line 1,1,$A0
tdc
adc #320
tcd
_ODS_Line 2,2,$0
_ODS_Line 3,3,$A0
tdc
adc #320
tcd
_ODS_Line 4,4,$0
_ODS_Line 5,5,$A0
tdc
adc #320
tcd
_ODS_Line 6,6,$0
_ODS_Line 7,7,$A0
_R0W0
cli
pld
rts
_OneDirtySprite_V0
_OneDirtySprite_VH
phd
sei
clc
tcd
_R0W1
_ODS_Line 0,7,$0
_ODS_Line 1,6,$A0
tdc
adc #320
tcd
_ODS_Line 2,5,$0
_ODS_Line 3,4,$A0
tdc
adc #320
tcd
_ODS_Line 4,3,$0
_ODS_Line 5,2,$A0
tdc
adc #320
tcd
_ODS_Line 6,1,$0
_ODS_Line 7,0,$A0
_R0W0
cli
pld
rts
; Build up from here
_FourDirtySprites
lda TileStore+TS_VBUFF_ADDR_0,y
sta spriteIdx
lda TileStore+TS_VBUFF_ADDR_1,y
sta spriteIdx+4
lda TileStore+TS_VBUFF_ADDR_2,y
sta spriteIdx+8
lda TileStore+TS_VBUFF_ADDR_3,y
sta spriteIdx+12