mirror of
https://github.com/lscharen/iigs-game-engine.git
synced 2024-12-01 23:51:12 +00:00
Fix initialization bug in TileStore
This commit is contained in:
parent
b022162036
commit
a938639c1b
@ -39,6 +39,19 @@ ScreenY equ 2
|
|||||||
pea #TSZelda
|
pea #TSZelda
|
||||||
_GTELoadTileSet
|
_GTELoadTileSet
|
||||||
|
|
||||||
|
; Set the palette
|
||||||
|
ldx #11*2
|
||||||
|
:ploop
|
||||||
|
lda palette,x
|
||||||
|
stal $E19E00,x
|
||||||
|
dex
|
||||||
|
dex
|
||||||
|
bpl :ploop
|
||||||
|
bra sprt
|
||||||
|
|
||||||
|
palette dw $0000,$08C1,$0C41,$0F93,$0777,$0FDA,$00A0,$0000,$0D20,$0FFF,$023E
|
||||||
|
sprt
|
||||||
|
|
||||||
; Create stamps for the sprites we are going to use
|
; Create stamps for the sprites we are going to use
|
||||||
HERO_SPRITE_1 equ SPRITE_16X16+1
|
HERO_SPRITE_1 equ SPRITE_16X16+1
|
||||||
HERO_SLOT equ 0
|
HERO_SLOT equ 0
|
||||||
@ -49,8 +62,8 @@ HERO_SLOT equ 0
|
|||||||
|
|
||||||
; Create sprites
|
; Create sprites
|
||||||
pea HERO_SPRITE_1 ; sprite id
|
pea HERO_SPRITE_1 ; sprite id
|
||||||
pea #0 ; screen x-position (<256)
|
pea #11 ; screen x-position (<256)
|
||||||
pea #0 ; screen y-position (<256)
|
pea #23 ; screen y-position (<256)
|
||||||
pea HERO_SLOT ; sprite slot (0 - 15)
|
pea HERO_SLOT ; sprite slot (0 - 15)
|
||||||
_GTEAddSprite
|
_GTEAddSprite
|
||||||
|
|
||||||
@ -59,44 +72,62 @@ HERO_SLOT equ 0
|
|||||||
pea VBUFF_SPRITE_START ; and use this stamp
|
pea VBUFF_SPRITE_START ; and use this stamp
|
||||||
_GTEUpdateSprite
|
_GTEUpdateSprite
|
||||||
|
|
||||||
; Manually fill in the 41x26 tiles of the TileStore with a test pattern.
|
; Manually fill in the 41x26 tiles of the TileStore with a test pattern of trees
|
||||||
|
;
|
||||||
|
; Tile 65 Tile 66
|
||||||
|
; Tile 97 Tile 98
|
||||||
|
|
||||||
ldx #0
|
stz 0 ; X
|
||||||
ldy #0
|
stz 2 ; Y
|
||||||
|
|
||||||
:loop
|
:tloop
|
||||||
phx
|
ldx 0
|
||||||
phy
|
ldy 2
|
||||||
|
|
||||||
phx
|
phx
|
||||||
phy
|
phy
|
||||||
lda 0
|
pea #65
|
||||||
clc
|
|
||||||
adc #64
|
inx
|
||||||
pha
|
phx
|
||||||
|
phy
|
||||||
|
pea #66
|
||||||
|
|
||||||
|
iny
|
||||||
|
phx
|
||||||
|
phy
|
||||||
|
pea #98
|
||||||
|
|
||||||
|
dex
|
||||||
|
phx
|
||||||
|
phy
|
||||||
|
pea #97
|
||||||
|
|
||||||
|
_GTESetTile
|
||||||
|
_GTESetTile
|
||||||
|
_GTESetTile
|
||||||
_GTESetTile
|
_GTESetTile
|
||||||
|
|
||||||
lda 0
|
lda 0
|
||||||
inc
|
inc
|
||||||
and #$001F
|
inc
|
||||||
sta 0
|
sta 0
|
||||||
|
cmp #40
|
||||||
|
bcc :tloop
|
||||||
|
|
||||||
ply
|
stz 0
|
||||||
plx
|
lda 2
|
||||||
inx
|
inc
|
||||||
cpx #41
|
inc
|
||||||
bcc :loop
|
sta 2
|
||||||
|
cmp #25
|
||||||
|
bcc :tloop
|
||||||
|
|
||||||
ldx #0
|
; Set the screen coordinates
|
||||||
iny
|
|
||||||
cpy #26
|
|
||||||
bcc :loop
|
|
||||||
|
|
||||||
; Set the origin of the screen
|
lda #8
|
||||||
:skip
|
sta ScreenX
|
||||||
|
sta ScreenY
|
||||||
stz ScreenX
|
|
||||||
stz ScreenY
|
|
||||||
|
|
||||||
; Very simple actions
|
; Very simple actions
|
||||||
:evt_loop
|
:evt_loop
|
||||||
@ -138,6 +169,7 @@ HERO_SLOT equ 0
|
|||||||
; _GTEUpdateSprite
|
; _GTEUpdateSprite
|
||||||
|
|
||||||
_GTERender
|
_GTERender
|
||||||
|
brl :evt_loop
|
||||||
|
|
||||||
; Debug stuff
|
; Debug stuff
|
||||||
ldx #$100
|
ldx #$100
|
||||||
|
@ -174,7 +174,7 @@ _DoPhase1
|
|||||||
bit #SPRITE_STATUS_MOVED
|
bit #SPRITE_STATUS_MOVED
|
||||||
beq :no_move
|
beq :no_move
|
||||||
|
|
||||||
; jsr _ClearSpriteFromTileStore
|
jsr _ClearSpriteFromTileStore
|
||||||
ldy tmpY
|
ldy tmpY
|
||||||
|
|
||||||
; Anything else (MOVED, UPDATED, ADDED) will need to have the VBUFF information updated and the
|
; Anything else (MOVED, UPDATED, ADDED) will need to have the VBUFF information updated and the
|
||||||
|
31
src/Tiles.s
31
src/Tiles.s
@ -80,20 +80,7 @@ InitTiles
|
|||||||
:row equ tmp1
|
:row equ tmp1
|
||||||
:vbuff equ tmp2
|
:vbuff equ tmp2
|
||||||
|
|
||||||
; Fill in the TileStoreYTable. This is just a table of offsets into the Tile Store for each row. There
|
; Initialize the Tile Store
|
||||||
; are 26 rows with a stride of 41
|
|
||||||
ldy #0
|
|
||||||
lda #0
|
|
||||||
:yloop
|
|
||||||
sta TileStoreYTable,y
|
|
||||||
clc
|
|
||||||
adc #41*2
|
|
||||||
iny
|
|
||||||
iny
|
|
||||||
cpy #26*2
|
|
||||||
bcc :yloop
|
|
||||||
|
|
||||||
; Next, initialize the Tile Store itself
|
|
||||||
|
|
||||||
ldx #TILE_STORE_SIZE-2
|
ldx #TILE_STORE_SIZE-2
|
||||||
lda #25
|
lda #25
|
||||||
@ -105,7 +92,7 @@ InitTiles
|
|||||||
|
|
||||||
:loop
|
:loop
|
||||||
|
|
||||||
; The first set of values in the Tile Store are changed during each frame based on the actions
|
; The first set of values in the Tile Store that are changed during each frame based on the actions
|
||||||
; that are happening
|
; that are happening
|
||||||
|
|
||||||
lda #0
|
lda #0
|
||||||
@ -114,12 +101,26 @@ InitTiles
|
|||||||
sta TileStore+TS_SPRITE_FLAG,x ; no sprites are set at the beginning
|
sta TileStore+TS_SPRITE_FLAG,x ; no sprites are set at the beginning
|
||||||
sta TileStore+TS_DIRTY,x ; none of the tiles are dirty
|
sta TileStore+TS_DIRTY,x ; none of the tiles are dirty
|
||||||
|
|
||||||
|
; Set the default tile rendering functions
|
||||||
|
|
||||||
|
lda EngineMode
|
||||||
|
bit #ENGINE_MODE_DYN_TILES+ENGINE_MODE_TWO_LAYER
|
||||||
|
beq :fast
|
||||||
|
; ldal TileProcs
|
||||||
|
; sta TileStore+TS_BASE_TILE_DISP,x
|
||||||
|
bra :out
|
||||||
|
:fast
|
||||||
|
ldal FastTileProcs
|
||||||
|
sta TileStore+TS_BASE_TILE_DISP,x
|
||||||
|
:out
|
||||||
|
|
||||||
; lda DirtyTileProcs ; Fill in with the first dispatch address
|
; lda DirtyTileProcs ; Fill in with the first dispatch address
|
||||||
; stal TileStore+TS_DIRTY_TILE_DISP,x
|
; stal TileStore+TS_DIRTY_TILE_DISP,x
|
||||||
;
|
;
|
||||||
; lda TileProcs ; Same for non-dirty, non-sprite base case
|
; lda TileProcs ; Same for non-dirty, non-sprite base case
|
||||||
; stal TileStore+TS_BASE_TILE_DISP,x
|
; stal TileStore+TS_BASE_TILE_DISP,x
|
||||||
|
|
||||||
|
|
||||||
; The next set of values are constants that are simply used as cached parameters to avoid needing to
|
; The next set of values are constants that are simply used as cached parameters to avoid needing to
|
||||||
; calculate any of these values during tile rendering
|
; calculate any of these values during tile rendering
|
||||||
|
|
||||||
|
@ -14,6 +14,8 @@ TS_CODE_ADDR_HIGH equ TILE_STORE_SIZE*5
|
|||||||
TS_WORD_OFFSET equ TILE_STORE_SIZE*6 ; const value, word offset value for this tile if LDA (dp),y instructions re used
|
TS_WORD_OFFSET equ TILE_STORE_SIZE*6 ; const value, word offset value for this tile if LDA (dp),y instructions re used
|
||||||
TS_BASE_ADDR equ TILE_STORE_SIZE*7 ; const value, because there are two rows of tiles per bank, this is set to $0000 ot $8000.
|
TS_BASE_ADDR equ TILE_STORE_SIZE*7 ; const value, because there are two rows of tiles per bank, this is set to $0000 ot $8000.
|
||||||
TS_SCREEN_ADDR equ TILE_STORE_SIZE*8 ; cached value of on-screen location of tile. Used for DirtyRender.
|
TS_SCREEN_ADDR equ TILE_STORE_SIZE*8 ; cached value of on-screen location of tile. Used for DirtyRender.
|
||||||
|
|
||||||
|
; TODO: Move these arrays into the K bank to support direct dispatch via jmp (abs,x)
|
||||||
TS_BASE_TILE_COPY equ TILE_STORE_SIZE*9 ; derived from TS_TILE_ID to optimize tile copy to support sprite rendering
|
TS_BASE_TILE_COPY equ TILE_STORE_SIZE*9 ; derived from TS_TILE_ID to optimize tile copy to support sprite rendering
|
||||||
TS_BASE_TILE_DISP equ TILE_STORE_SIZE*10 ; derived from TS_TILE_ID to optimize base (non-sprite) tile dispatch in the Render function
|
TS_BASE_TILE_DISP equ TILE_STORE_SIZE*10 ; derived from TS_TILE_ID to optimize base (non-sprite) tile dispatch in the Render function
|
||||||
TS_DIRTY_TILE_DISP equ TILE_STORE_SIZE*11 ; derived from TS_TILE_ID to optimize dirty tile dispatch in the Render function
|
TS_DIRTY_TILE_DISP equ TILE_STORE_SIZE*11 ; derived from TS_TILE_ID to optimize dirty tile dispatch in the Render function
|
||||||
@ -43,9 +45,9 @@ SPRITE_STATUS equ {MAX_SPRITES*0}
|
|||||||
SPRITE_ID equ {MAX_SPRITES*2}
|
SPRITE_ID equ {MAX_SPRITES*2}
|
||||||
SPRITE_X equ {MAX_SPRITES*4}
|
SPRITE_X equ {MAX_SPRITES*4}
|
||||||
SPRITE_Y equ {MAX_SPRITES*6}
|
SPRITE_Y equ {MAX_SPRITES*6}
|
||||||
|
VBUFF_ADDR equ {MAX_SPRITES*8} ; Base address of the sprite's stamp in the data/mask banks
|
||||||
|
|
||||||
; These values are cached / calculated during the rendering process
|
; These values are cached / calculated during the rendering process
|
||||||
VBUFF_ADDR equ {MAX_SPRITES*8} ; Base address of the sprite's stamp in the data/mask banks
|
|
||||||
TS_LOOKUP_INDEX equ {MAX_SPRITES*10} ; The index from the TileStoreLookup table that corresponds to the top-left corner of the sprite
|
TS_LOOKUP_INDEX equ {MAX_SPRITES*10} ; The index from the TileStoreLookup table that corresponds to the top-left corner of the sprite
|
||||||
TS_COVERAGE_SIZE equ {MAX_SPRITES*12} ; Representation of how many TileStore tiles (NxM) are covered by this sprite
|
TS_COVERAGE_SIZE equ {MAX_SPRITES*12} ; Representation of how many TileStore tiles (NxM) are covered by this sprite
|
||||||
OLD_TS_LOOKUP_INDEX equ {MAX_SPRITES*14} ; Copy of the values to support diffing
|
OLD_TS_LOOKUP_INDEX equ {MAX_SPRITES*14} ; Copy of the values to support diffing
|
||||||
|
Loading…
Reference in New Issue
Block a user