Most of the horizontal flip routines are not needed since the _GetTileAddr function returns the correct tile address. Need to finish auditing other Tile blitters

This commit is contained in:
Lucas Scharenbroich 2021-11-20 13:54:19 -06:00
parent 65ce5cbbc0
commit cd5de05d74
5 changed files with 142 additions and 127 deletions

View File

@ -60,8 +60,6 @@ RenderTile EXT ; Y = address from GetTileStoreOffset
GetTileStoreOffset EXT ; X = column, Y = row
TileStore EXT ; Tile store internal data structure
DrawTileSprite EXT ; X = target address in sprite plane, Y = address in tile bank
EraseTileSprite EXT ; X = target address is sprite plane
GetSpriteVBuffAddr EXT ; X = x-coordinate (0 - 159), Y = y-coordinate (0 - 199). Return in Acc.
; Allocate a full 64K bank

View File

@ -130,25 +130,7 @@ _RenderSprites
; as a future optimization. Ideally, all of the sprites will be rendered into the sprite plane in a separate
; pass from this function, which is primarily concerned with flagging dirty tiles in the Tile Store.
ldx _Sprites+OLD_VBUFF_ADDR,y
beq :noerase
jsr _EraseTileSprite ; erase from the old position
inx
inx
inx
inx
jsr _EraseTileSprite
txa
clc
adc #8*256
tax
jsr _EraseTileSprite
dex
dex
dex
dex
jsr _EraseTileSprite
:noerase
jsr _EraseSpriteY
; Draw the sprite into the sprint plane buffer(s)
@ -490,6 +472,66 @@ _DrawSprites
bra :loop
:out rts
; X = _Sprites array offset
_EraseSprite
txy
_EraseSpriteY
lda _Sprites+OLD_VBUFF_ADDR,y
beq :noerase
lda _Sprites+SPRITE_ID,y
and #$1800 ; use bits 11 and 12 to dispatch (oly care about size)
lsr
lsr
xba
tax
jmp (:erase_sprite,x)
:noerase rts
:erase_sprite dw erase_8x8,erase_8x16,erase_16x8,erase_16x16
erase_8x8
ldx _Sprites+OLD_VBUFF_ADDR,y
jmp _EraseTileSprite ; erase from the old position
erase_8x16
clc
ldx _Sprites+OLD_VBUFF_ADDR,y
jsr _EraseTileSprite
txa
adc #{8*SPRITE_PLANE_SPAN}
tax
jmp _EraseTileSprite
erase_16x8
clc
ldx _Sprites+OLD_VBUFF_ADDR,y
jsr _EraseTileSprite
txa
adc #4
tax
jmp _EraseTileSprite
erase_16x16
clc
ldx _Sprites+OLD_VBUFF_ADDR,y
jsr _EraseTileSprite
txa
adc #4
tax
jsr _EraseTileSprite
txa
adc #{8*SPRITE_PLANE_SPAN}-4
tax
jsr _EraseTileSprite
txa
adc #4
tax
jmp _EraseTileSprite
; X = _Sprites array offset
_DrawSprite
txy
@ -806,10 +848,6 @@ _DrawTile8x8V
; X = address is sprite plane -- erases an 8x8 region
SPRITE_PLANE_SPAN equ 256
EraseTileSprite ENT
jsr _EraseTileSprite
rtl
_EraseTileSprite
phb ; Save the bank to switch to the sprite plane

View File

@ -638,7 +638,7 @@ _SetTile
tay
pla
cmp TileStore+TS_TILE_ID,y ; Only set to dirty if the value changes
cmp TileStore+TS_TILE_ID,y ; Only set to dirty if the value changed
beq :nochange
sta TileStore+TS_TILE_ID,y ; Value is different, store it.
@ -668,27 +668,6 @@ PushDirtyTile ENT
plb
rtl
_PushDirtyTileOld
tay ; check if this already marked immediately
lda TileStore+TS_DIRTY,y ; If the lookup === $FFFF (<$8000), it is free.
bpl :occupied
; At this point, keep the Y register value because it is the correct offset to all of the tile
; record fields.
ldx DirtyTileCount
txa
sta TileStore+TS_DIRTY,y ; Store a back-link to this record
tya
sta DirtyTiles,x ; Store the lookup address in the list
inx
inx
stx DirtyTileCount ; Commit
:occupied
rts
; alternate version that is very slightly slower, but preserves the y-register
_PushDirtyTile
tax

View File

@ -8,15 +8,13 @@
; X : address of base tile in the tiledata bank (tileId * 128)
; Y : address of the top-left corder of the tile location in the code field
; B : set to the code field bank
;_TBSolidTile dw _TBSolidTile_00,_TBSolidTile_0H,_TBSolidTile_V0,_TBSolidTile_VH
; dw _TBCopyData,_TBCopyDataH,_TBCopyDataV,_TBCopyDataVH
_TBSolidTile_00
jsr _TBCopyData
jmp _TBFillPEAOpcode
_TBSolidTile_0H
jsr _TBCopyDataH
jsr _TBCopyData
jmp _TBFillPEAOpcode
_TBSolidTile_V0
@ -24,7 +22,7 @@ _TBSolidTile_V0
jmp _TBFillPEAOpcode
_TBSolidTile_VH
jsr _TBCopyDataVH
jsr _TBCopyDataV
jmp _TBFillPEAOpcode
; The workhorse blitter. This blitter copies tile data into the code field without masking. This is the
@ -49,16 +47,16 @@ _TBCopyData
--^
rts
_TBCopyDataH
]line equ 0
lup 8
ldal tiledata+{]line*4}+64,x
sta: $0004+{]line*$1000},y
ldal tiledata+{]line*4}+66,x
sta: $0001+{]line*$1000},y
]line equ ]line+1
--^
rts
;_TBCopyDataH
;]line equ 0
; lup 8
; ldal tiledata+{]line*4}+64,x
; sta: $0004+{]line*$1000},y
; ldal tiledata+{]line*4}+66,x
; sta: $0001+{]line*$1000},y
;]line equ ]line+1
; --^
; rts
_TBCopyDataV
]src equ 7
@ -73,18 +71,18 @@ _TBCopyDataV
--^
rts
_TBCopyDataVH
]src equ 7
]dest equ 0
lup 8
ldal tiledata+{]src*4}+64,x
sta: $0004+{]dest*$1000},y
ldal tiledata+{]src*4}+66,x
sta: $0001+{]dest*$1000},y
]src equ ]src-1
]dest equ ]dest+1
--^
rts
;_TBCopyDataVH
;]src equ 7
;]dest equ 0
; lup 8
; ldal tiledata+{]src*4}+64,x
; sta: $0004+{]dest*$1000},y
; ldal tiledata+{]src*4}+66,x
; sta: $0001+{]dest*$1000},y
;]src equ ]src-1
;]dest equ ]dest+1
; --^
; rts
; A simple helper function that fill in all of the opcodes of a tile with the PEA opcode. This is
; a common function since a tile must be explicitly flagged to use a mask, so this routine is used

View File

@ -9,6 +9,7 @@
;
; Need to slightly remap these register inputs to save into the direct page cached values
_TBMaskedTile_00
_TBMaskedTile_0H
sta _X_REG ; Save these values as we will need to reload them
sty _Y_REG ; at certain points
stx _T_PTR
@ -44,35 +45,36 @@ _TBMaskedTile_00
rts
_TBMaskedTile_0H
sta _X_REG
sty _Y_REG
stx _T_PTR
CopyMaskedWord tiledata+64+0;tiledata+64+32+0;$0003
CopyMaskedWord tiledata+64+4;tiledata+64+32+4;$1003
CopyMaskedWord tiledata+64+8;tiledata+64+32+8;$2003
CopyMaskedWord tiledata+64+12;tiledata+64+32+12;$3003
CopyMaskedWord tiledata+64+16;tiledata+64+32+16;$4003
CopyMaskedWord tiledata+64+20;tiledata+64+32+20;$5003
CopyMaskedWord tiledata+64+24;tiledata+64+32+24;$6003
CopyMaskedWord tiledata+64+28;tiledata+64+32+28;$7003
inc _X_REG
inc _X_REG
CopyMaskedWord tiledata+64+2;tiledata+64+32+2;$0000
CopyMaskedWord tiledata+64+6;tiledata+64+32+6;$1000
CopyMaskedWord tiledata+64+10;tiledata+64+32+10;$2000
CopyMaskedWord tiledata+64+14;tiledata+64+32+14;$3000
CopyMaskedWord tiledata+64+18;tiledata+64+32+18;$4000
CopyMaskedWord tiledata+64+22;tiledata+64+32+22;$5000
CopyMaskedWord tiledata+64+26;tiledata+64+32+26;$6000
CopyMaskedWord tiledata+64+30;tiledata+64+32+30;$7000
rts
;_TBMaskedTile_0H
; sta _X_REG
; sty _Y_REG
; stx _T_PTR
;
; CopyMaskedWord tiledata+64+0;tiledata+64+32+0;$0003
; CopyMaskedWord tiledata+64+4;tiledata+64+32+4;$1003
; CopyMaskedWord tiledata+64+8;tiledata+64+32+8;$2003
; CopyMaskedWord tiledata+64+12;tiledata+64+32+12;$3003
; CopyMaskedWord tiledata+64+16;tiledata+64+32+16;$4003
; CopyMaskedWord tiledata+64+20;tiledata+64+32+20;$5003
; CopyMaskedWord tiledata+64+24;tiledata+64+32+24;$6003
; CopyMaskedWord tiledata+64+28;tiledata+64+32+28;$7003
;
; inc _X_REG
; inc _X_REG
;
; CopyMaskedWord tiledata+64+2;tiledata+64+32+2;$0000
; CopyMaskedWord tiledata+64+6;tiledata+64+32+6;$1000
; CopyMaskedWord tiledata+64+10;tiledata+64+32+10;$2000
; CopyMaskedWord tiledata+64+14;tiledata+64+32+14;$3000
; CopyMaskedWord tiledata+64+18;tiledata+64+32+18;$4000
; CopyMaskedWord tiledata+64+22;tiledata+64+32+22;$5000
; CopyMaskedWord tiledata+64+26;tiledata+64+32+26;$6000
; CopyMaskedWord tiledata+64+30;tiledata+64+32+30;$7000
;
; rts
_TBMaskedTile_V0
_TBMaskedTile_VH
sta _X_REG
sty _Y_REG
stx _T_PTR
@ -100,30 +102,30 @@ _TBMaskedTile_V0
rts
_TBMaskedTile_VH
sta _X_REG
sty _Y_REG
stx _T_PTR
CopyMaskedWord tiledata+64+0;tiledata+64+32+0;$7003
CopyMaskedWord tiledata+64+4;tiledata+64+32+4;$6003
CopyMaskedWord tiledata+64+8;tiledata+64+32+8;$5003
CopyMaskedWord tiledata+64+12;tiledata+64+32+12;$4003
CopyMaskedWord tiledata+64+16;tiledata+64+32+16;$3003
CopyMaskedWord tiledata+64+20;tiledata+64+32+20;$2003
CopyMaskedWord tiledata+64+24;tiledata+64+32+24;$1003
CopyMaskedWord tiledata+64+28;tiledata+64+32+28;$0003
inc _X_REG
inc _X_REG
CopyMaskedWord tiledata+64+2;tiledata+64+32+2;$7000
CopyMaskedWord tiledata+64+6;tiledata+64+32+6;$6000
CopyMaskedWord tiledata+64+10;tiledata+64+32+10;$5000
CopyMaskedWord tiledata+64+14;tiledata+64+32+14;$4000
CopyMaskedWord tiledata+64+18;tiledata+64+32+18;$3000
CopyMaskedWord tiledata+64+22;tiledata+64+32+22;$2000
CopyMaskedWord tiledata+64+26;tiledata+64+32+26;$1000
CopyMaskedWord tiledata+64+30;tiledata+64+32+30;$0000
rts
;_TBMaskedTile_VH
; sta _X_REG
; sty _Y_REG
; stx _T_PTR
;
; CopyMaskedWord tiledata+64+0;tiledata+64+32+0;$7003
; CopyMaskedWord tiledata+64+4;tiledata+64+32+4;$6003
; CopyMaskedWord tiledata+64+8;tiledata+64+32+8;$5003
; CopyMaskedWord tiledata+64+12;tiledata+64+32+12;$4003
; CopyMaskedWord tiledata+64+16;tiledata+64+32+16;$3003
; CopyMaskedWord tiledata+64+20;tiledata+64+32+20;$2003
; CopyMaskedWord tiledata+64+24;tiledata+64+32+24;$1003
; CopyMaskedWord tiledata+64+28;tiledata+64+32+28;$0003
;
; inc _X_REG
; inc _X_REG
;
; CopyMaskedWord tiledata+64+2;tiledata+64+32+2;$7000
; CopyMaskedWord tiledata+64+6;tiledata+64+32+6;$6000
; CopyMaskedWord tiledata+64+10;tiledata+64+32+10;$5000
; CopyMaskedWord tiledata+64+14;tiledata+64+32+14;$4000
; CopyMaskedWord tiledata+64+18;tiledata+64+32+18;$3000
; CopyMaskedWord tiledata+64+22;tiledata+64+32+22;$2000
; CopyMaskedWord tiledata+64+26;tiledata+64+32+26;$1000
; CopyMaskedWord tiledata+64+30;tiledata+64+32+30;$0000
;
; rts