iigs-game-engine/src/render/Dirty.s

438 lines
11 KiB
ArmAsm

; Special routines for the dirty tile renderer that draws directly to the graphics screen
; A = tile address
; Y = screen address
SpriteUnder0Dirty
ConstTile0Dirty
lda TileStore+TS_SCREEN_ADDR,x ; Get the on-screen address of this tile
tax
pei DP2_BANK01_AND_TILESTORE_BANKS
plb
]line equ 0
lup 8
stz: {]line*SHR_LINE_WIDTH}+0,x
stz: {]line*SHR_LINE_WIDTH}+2,x
]line equ ]line+1
--^
plb
rts
; Sprite over a zero tile
OneSpriteDirtyOver0
ldy TileStore+TS_SCREEN_ADDR,x
tax
pei DP2_BANK01_AND_TILESTORE_BANKS
plb
]line equ 0
lup 8
ldal spritedata+{]line*SPRITE_PLANE_SPAN}+0,x
sta: {]line*SHR_LINE_WIDTH}+0,y
ldal spritedata+{]line*SPRITE_PLANE_SPAN}+2,x
sta: {]line*SHR_LINE_WIDTH}+2,y
]line equ ]line+1
--^
plb
rts
; Multiple sprites (copied to direct page temp space)
SpriteOver0Dirty
ldy TileStore+TS_SCREEN_ADDR,x
pei DP2_BANK01_AND_TILESTORE_BANKS
plb
]line equ 0
lup 8
lda tmp_sprite_data+{]line*4}+0
sta: {]line*SHR_LINE_WIDTH}+0,y
lda tmp_sprite_data+{]line*4}+2
sta: {]line*SHR_LINE_WIDTH}+2,y
]line equ ]line+1
--^
plb
rts
CopyTileADirty
ldy TileStore+TS_SCREEN_ADDR,x ; Get the on-screen address of this tile
lda TileStore+TS_TILE_ADDR,x ; load the address of this tile's data (pre-calculated)
tax
pei DP2_BANK01_AND_TILESTORE_BANKS
plb
]line equ 0
lup 8
ldal tiledata+{]line*4}+0,x
sta: {]line*SHR_LINE_WIDTH}+0,y
ldal tiledata+{]line*4}+2,x
sta: {]line*SHR_LINE_WIDTH}+2,y
]line equ ]line+1
--^
plb
rts
CopyTileVDirty
ldy TileStore+TS_SCREEN_ADDR,x ; Get the on-screen address of this tile
lda TileStore+TS_TILE_ADDR,x ; load the address of this tile's data (pre-calculated)
tax
pei DP2_BANK01_AND_TILESTORE_BANKS
plb
]src equ 7
]dest equ 0
lup 8
ldal tiledata+{]src*4}+0,x
sta: {]line*SHR_LINE_WIDTH}+0,y
ldal tiledata+{]src*4}+2,x
sta: {]line*SHR_LINE_WIDTH}+2,y
]src equ ]src-1
]dest equ ]dest+1
--^
plb
rts
; DirtySpriteLine srcLine,destLine,dpAddr,offset
DirtySpriteOver mac
lda: tiledata+{]1*TILE_DATA_SPAN}+]4,y
andl spritemask+{]2*SPRITE_PLANE_SPAN}+]4,x
oral spritedata+{]2*SPRITE_PLANE_SPAN}+]4,x
sta ]3+]4
<<<
DirtySpriteUnder mac
ldal spritedata+{]2*SPRITE_PLANE_SPAN}+]4,x
and tiledata+{]1*TILE_DATA_SPAN}+32+]4,y
ora tiledata+{]1*TILE_DATA_SPAN}+]4,y
sta ]3+]4
<<<
; Special routine for a single sprite
OneSpriteDirtyOverA
ldy TileStore+TS_TILE_ADDR,x
lda TileStore+TS_SCREEN_ADDR,x
ldx sprite_ptr0
phd
pei DP2_TILEDATA_AND_TILESTORE_BANKS
plb
sei
clc
tcd
_R0W1
DirtySpriteOver 0;0;$00;0
DirtySpriteOver 0;0;$00;2
DirtySpriteOver 1;1;$A0;0
DirtySpriteOver 1;1;$A0;2
tdc
adc #320
tcd
DirtySpriteOver 2;2;$00;0
DirtySpriteOver 2;2;$00;2
DirtySpriteOver 3;3;$A0;0
DirtySpriteOver 3;3;$A0;2
tdc
adc #320
tcd
DirtySpriteOver 4;4;$00;0
DirtySpriteOver 4;4;$00;2
DirtySpriteOver 5;5;$A0;0
DirtySpriteOver 5;5;$A0;2
tdc
adc #320
tcd
DirtySpriteOver 6;6;$00;0
DirtySpriteOver 6;6;$00;2
DirtySpriteOver 7;7;$A0;0
DirtySpriteOver 7;7;$A0;2
_R0W0
cli
plb
pld
rts
OneSpriteDirtyUnderA
ldy TileStore+TS_TILE_ADDR,x
lda TileStore+TS_SCREEN_ADDR,x
ldx sprite_ptr0
phd
pei DP2_TILEDATA_AND_TILESTORE_BANKS
plb
sei
clc
tcd
_R0W1
DirtySpriteUnder 0;0;$00;0
DirtySpriteUnder 0;0;$00;2
DirtySpriteUnder 1;1;$A0;0
DirtySpriteUnder 1;1;$A0;2
tdc
adc #320
tcd
DirtySpriteUnder 2;2;$00;0
DirtySpriteUnder 2;2;$00;2
DirtySpriteUnder 3;3;$A0;0
DirtySpriteUnder 3;3;$A0;2
tdc
adc #320
tcd
DirtySpriteUnder 4;4;$00;0
DirtySpriteUnder 4;4;$00;2
DirtySpriteUnder 5;5;$A0;0
DirtySpriteUnder 5;5;$A0;2
tdc
adc #320
tcd
DirtySpriteUnder 6;6;$00;0
DirtySpriteUnder 6;6;$00;2
DirtySpriteUnder 7;7;$A0;0
DirtySpriteUnder 7;7;$A0;2
_R0W0
cli
plb
pld
rts
OneSpriteDirtyOverV
ldy TileStore+TS_TILE_ADDR,x
lda TileStore+TS_SCREEN_ADDR,x
ldx sprite_ptr0
phd
pei DP2_TILEDATA_AND_TILESTORE_BANKS
plb
sei
clc
tcd
_R0W1
DirtySpriteOver 7;0;$00;0
DirtySpriteOver 7;0;$00;2
DirtySpriteOver 6;1;$A0;0
DirtySpriteOver 6;1;$A0;2
tdc
adc #320
tcd
DirtySpriteOver 5;2;$00;0
DirtySpriteOver 5;2;$00;2
DirtySpriteOver 4;3;$A0;0
DirtySpriteOver 4;3;$A0;2
tdc
adc #320
tcd
DirtySpriteOver 3;4;$00;0
DirtySpriteOver 3;4;$00;2
DirtySpriteOver 2;5;$A0;0
DirtySpriteOver 2;5;$A0;2
tdc
adc #320
tcd
DirtySpriteOver 1;6;$00;0
DirtySpriteOver 1;6;$00;2
DirtySpriteOver 0;7;$A0;0
DirtySpriteOver 0;7;$A0;2
_R0W0
cli
plb
pld
rts
OneSpriteDirtyUnderV
ldy TileStore+TS_TILE_ADDR,x
lda TileStore+TS_SCREEN_ADDR,x
ldx sprite_ptr0
phd
pei DP2_TILEDATA_AND_TILESTORE_BANKS
plb
sei
clc
tcd
_R0W1
DirtySpriteUnder 7;0;$00;0
DirtySpriteUnder 7;0;$00;2
DirtySpriteUnder 6;1;$A0;0
DirtySpriteUnder 6;1;$A0;2
tdc
adc #320
tcd
DirtySpriteUnder 5;2;$00;0
DirtySpriteUnder 5;2;$00;2
DirtySpriteUnder 4;3;$A0;0
DirtySpriteUnder 4;3;$A0;2
tdc
adc #320
tcd
DirtySpriteUnder 3;4;$00;0
DirtySpriteUnder 3;4;$00;2
DirtySpriteUnder 2;5;$A0;0
DirtySpriteUnder 2;5;$A0;2
tdc
adc #320
tcd
DirtySpriteUnder 1;6;$00;0
DirtySpriteUnder 1;6;$00;2
DirtySpriteUnder 0;7;$A0;0
DirtySpriteUnder 0;7;$A0;2
_R0W0
cli
plb
pld
rts
; Generic routine for multiple sprites -- expect sprites to be in tmp_sprite_data and tmp_sprite_mask
SpriteOverADirty
ldy TileStore+TS_SCREEN_ADDR,x
lda TileStore+TS_TILE_ADDR,x
tax
pei DP2_BANK01_AND_TILESTORE_BANKS
plb
]line equ 0
lup 8
ldal tiledata+{]line*TILE_DATA_SPAN}+0,x
and tmp_sprite_mask+{]line*4}+0
ora tmp_sprite_data+{]line*4}+0
sta: {]line*SHR_LINE_WIDTH}+0,y
; brk $00
ldal tiledata+{]line*TILE_DATA_SPAN}+2,x
and tmp_sprite_mask+{]line*4}+2
ora tmp_sprite_data+{]line*4}+2
sta: {]line*SHR_LINE_WIDTH}+2,y
]line equ ]line+1
--^
plb
rts
SpriteUnderADirty
ldy TileStore+TS_SCREEN_ADDR,x
lda TileStore+TS_TILE_ADDR,x
tax
pei DP2_BANK01_AND_TILESTORE_BANKS
plb
]line equ 0
lup 8
lda tmp_sprite_data+{]line*4}+0
andl tiledata+{]line*TILE_DATA_SPAN}+32,x
oral tiledata+{]line*TILE_DATA_SPAN}+0,x
sta: {]line*SHR_LINE_WIDTH}+0,y
lda tmp_sprite_data+{]line*4}+2
andl tiledata+{]line*TILE_DATA_SPAN}+32+2,x
oral tiledata+{]line*TILE_DATA_SPAN}+2,x
sta: {]line*SHR_LINE_WIDTH}+2,y
]line equ ]line+1
--^
plb
rts
SpriteOverVDirty
ldy TileStore+TS_SCREEN_ADDR,x
lda TileStore+TS_TILE_ADDR,x
tax
pei DP2_BANK01_AND_TILESTORE_BANKS
plb
]src equ 7
]dest equ 0
lup 8
ldal tiledata+{]src*TILE_DATA_SPAN}+0,x
and tmp_sprite_mask+{]dest*4}+0
ora tmp_sprite_data+{]dest*4}+0
sta: {]dest*SHR_LINE_WIDTH}+0,y
ldal tiledata+{]src*TILE_DATA_SPAN}+2,x
and tmp_sprite_mask+{]dest*4}+2
ora tmp_sprite_data+{]dest*4}+2
sta: {]dest*SHR_LINE_WIDTH}+2,y
]src equ ]src-1
]dest equ ]dest+1
--^
plb
rts
SpriteUnderVDirty
ldy TileStore+TS_SCREEN_ADDR,x
lda TileStore+TS_TILE_ADDR,x
tax
pei DP2_BANK01_AND_TILESTORE_BANKS
plb
]src equ 7
]dest equ 0
lup 8
lda tmp_sprite_data+{]dest*4}+0
andl tiledata+{]src*TILE_DATA_SPAN}+32,x
oral tiledata+{]src*TILE_DATA_SPAN}+0,x
sta: {]dest*SHR_LINE_WIDTH}+0,y
lda tmp_sprite_data+{]dest*4}+2
andl tiledata+{]src*TILE_DATA_SPAN}+32+2,x
oral tiledata+{]src*TILE_DATA_SPAN}+2,x
sta: {]dest*SHR_LINE_WIDTH}+2,y
]src equ ]src-1
]dest equ ]dest+1
--^
plb
rts