Change from an array of structs to a series of individual arrays for the tile information. This makes it easier to index into the arrays because the tile number * 2 is the offset, rather than tile number * 16.

This commit is contained in:
Jeremy Rand 2020-09-02 00:15:53 -04:00
parent df56cdecf1
commit b07221c363
11 changed files with 247 additions and 237 deletions

View File

@ -31,11 +31,22 @@ game start
gameLoop anop gameLoop anop
jsl drawDirtyGameTiles jsl drawDirtyGameTiles
short i,m
lda >BORDER_COLOUR_REGISTER
and #$f7
sta >BORDER_COLOUR_REGISTER
long i,m
jsl drawSpider jsl drawSpider
short i,m
lda >BORDER_COLOUR_REGISTER
and #$f3
sta >BORDER_COLOUR_REGISTER
long i,m
jsl drawScorpion jsl drawScorpion
jsl drawFlea
jsl drawSegments
jsl drawDirtyNonGameTiles
short i,m short i,m
lda >BORDER_COLOUR_REGISTER lda >BORDER_COLOUR_REGISTER
@ -43,6 +54,30 @@ gameLoop anop
sta >BORDER_COLOUR_REGISTER sta >BORDER_COLOUR_REGISTER
long i,m long i,m
jsl drawFlea
short i,m
lda >BORDER_COLOUR_REGISTER
ora #$08
sta >BORDER_COLOUR_REGISTER
long i,m
jsl drawSegments
short i,m
lda >BORDER_COLOUR_REGISTER
ora #$04
sta >BORDER_COLOUR_REGISTER
long i,m
jsl drawDirtyNonGameTiles
short i,m
lda >BORDER_COLOUR_REGISTER
ora #$02
sta >BORDER_COLOUR_REGISTER
long i,m
jsl updateScorpion jsl updateScorpion
jsl updateSpider jsl updateSpider
jsl updateFlea jsl updateFlea
@ -52,8 +87,10 @@ gameLoop anop
jsl waitForVbl jsl waitForVbl
lda shouldQuit lda shouldQuit
bne gameLoop beq gameDone
jmp gameLoop
gameDone anop
short i,m short i,m
lda >BORDER_COLOUR_REGISTER lda >BORDER_COLOUR_REGISTER
and #$f0 and #$f0
@ -73,9 +110,9 @@ dirtyTileLoop anop
phy phy
ldx dirtyGameTiles,y ldx dirtyGameTiles,y
stz tiles+TILE_DIRTY_OFFSET,x stz tileDirty,x
ldy tiles+TILE_SCREEN_OFFSET_OFFSET,x ldy tileOffset,x
lda tiles+TILE_TYPE_OFFSET,x lda tileType,x
jsl drawTile jsl drawTile
@ -95,9 +132,9 @@ dirtyTileLoop2 anop
phy phy
ldx dirtyNonGameTiles,y ldx dirtyNonGameTiles,y
stz tiles+TILE_DIRTY_OFFSET,x stz tileDirty,x
ldy tiles+TILE_SCREEN_OFFSET_OFFSET,x ldy tileOffset,x
lda tiles+TILE_TYPE_OFFSET,x lda tileType,x
jsl drawTile jsl drawTile

View File

@ -117,25 +117,25 @@ updateFlea_nextTile anop
ldx fleaTileOffsets ldx fleaTileOffsets
stx fleaTileOffsets+4 stx fleaTileOffsets+4
lda tiles+TILE_BELOW_OFFSET,x lda tileBelow,x
cmp #INVALID_TILE_NUM cmp #INVALID_TILE_NUM
beq updateFlea_bottom beq updateFlea_bottom
sta fleaTileOffsets sta fleaTileOffsets
ldx fleaTileOffsets+2 ldx fleaTileOffsets+2
stx fleaTileOffsets+6 stx fleaTileOffsets+6
lda tiles+TILE_BELOW_OFFSET,x lda tileBelow,x
sta fleaTileOffsets+2 sta fleaTileOffsets+2
ldx fleaTileOffsets+4 ldx fleaTileOffsets+4
lda tiles+TILE_TYPE_OFFSET,x lda tileType,x
bne updateFlea_nextAction bne updateFlea_nextAction
jsl rand0_to_65534 jsl rand0_to_65534
and #$3 and #$3
bne updateFlea_nextAction bne updateFlea_nextAction
lda #TILE_MUSHROOM4 lda #TILE_MUSHROOM4
sta tiles+TILE_TYPE_OFFSET,x sta tileType,x
bra updateFlea_nextAction bra updateFlea_nextAction
@ -174,18 +174,15 @@ addFlea entry
jsl rand25 jsl rand25
asl a asl a
asl a
asl a
asl a
sta fleaTileOffsets sta fleaTileOffsets
sta fleaTileOffsets+4 sta fleaTileOffsets+4
tax tax
lda tiles+TILE_LEFT_OFFSET,x lda tileLeft,x
sta fleaTileOffsets+2 sta fleaTileOffsets+2
sta fleaTileOffsets+6 sta fleaTileOffsets+6
lda tiles+TILE_SCREEN_OFFSET_OFFSET,x lda tileOffset,x
sec sec
sbc #6*SCREEN_BYTES_PER_ROW+3 sbc #6*SCREEN_BYTES_PER_ROW+3
sta fleaScreenOffset sta fleaScreenOffset

View File

@ -149,7 +149,7 @@ updateScorpionLeft_nextTile anop
stx scorpionTileOffsets+4 stx scorpionTileOffsets+4
ldx scorpionTileOffsets ldx scorpionTileOffsets
stx scorpionTileOffsets+2 stx scorpionTileOffsets+2
lda tiles+TILE_LEFT_OFFSET,x lda tileLeft,x
sta scorpionTileOffsets sta scorpionTileOffsets
bra updateScorpion_maybePoison bra updateScorpion_maybePoison
@ -157,17 +157,17 @@ updateScorpionRight_notOffScreen anop
stx scorpionTileOffsets+4 stx scorpionTileOffsets+4
ldx scorpionTileOffsets ldx scorpionTileOffsets
stx scorpionTileOffsets+2 stx scorpionTileOffsets+2
lda tiles+TILE_RIGHT_OFFSET,x lda tileRight,x
sta scorpionTileOffsets sta scorpionTileOffsets
updateScorpion_maybePoison anop updateScorpion_maybePoison anop
lda tiles+TILE_TYPE_OFFSET,x lda tileType,x
beq updateScorpion_done beq updateScorpion_done
cmp #TILE_MUSHROOM4+1 cmp #TILE_MUSHROOM4+1
bge updateScorpion_done bge updateScorpion_done
ora #TILE_POISON_A_MUSHROOM ora #TILE_POISON_A_MUSHROOM
sta tiles+TILE_TYPE_OFFSET,x sta tileType,x
updateScorpion_done anop updateScorpion_done anop
rtl rtl
@ -253,15 +253,15 @@ addScorpion_doit anop
ldx scorpionLeftTileOffset,y ldx scorpionLeftTileOffset,y
stx scorpionTileOffsets stx scorpionTileOffsets
lda tiles+TILE_SCREEN_OFFSET_OFFSET,x lda tileOffset,x
dec a dec a
sta scorpionScreenOffset sta scorpionScreenOffset
lda tiles+TILE_RIGHT_OFFSET,x lda tileRight,x
sta scorpionTileOffsets+2 sta scorpionTileOffsets+2
tax tax
lda tiles+TILE_RIGHT_OFFSET,x lda tileRight,x
sta scorpionTileOffsets+4 sta scorpionTileOffsets+4
bra addScorpion_common bra addScorpion_common
@ -274,15 +274,15 @@ addScorpion_right anop
ldx scorpionRightTileOffset,y ldx scorpionRightTileOffset,y
stx scorpionTileOffsets stx scorpionTileOffsets
lda tiles+TILE_LEFT_OFFSET,x lda tileLeft,x
sta scorpionTileOffsets+2 sta scorpionTileOffsets+2
tax tax
lda tiles+TILE_LEFT_OFFSET,x lda tileLeft,x
sta scorpionTileOffsets+4 sta scorpionTileOffsets+4
tax tax
lda tiles+TILE_SCREEN_OFFSET_OFFSET,x lda tileOffset,x
dec a dec a
dec a dec a
sta scorpionScreenOffset sta scorpionScreenOffset

View File

@ -161,13 +161,7 @@ addBodySegment entry
lda #SEGMENT_FACING_LEFT lda #SEGMENT_FACING_LEFT
sta segmentFacing,x sta segmentFacing,x
txa lda tileOffset,x
asl a
asl a
asl a
tay
lda tiles+TILE_SCREEN_OFFSET_OFFSET,y
sec sec
sbc #3 sbc #3
sta segmentScreenOffsets,x sta segmentScreenOffsets,x
@ -177,13 +171,13 @@ addBodySegment entry
txa txa
asl a asl a
asl a asl a
tax tay
tya txa
sta segmentTileOffsets,x sta segmentTileOffsets,y
sta segmentTileOffsets+2,x sta segmentTileOffsets+2,y
sta segmentTileOffsets+4,x sta segmentTileOffsets+4,y
sta segmentTileOffsets+6,x sta segmentTileOffsets+6,y
inc numSegments inc numSegments
@ -204,13 +198,7 @@ addHeadSegment entry
lda #SEGMENT_FACING_LEFT lda #SEGMENT_FACING_LEFT
sta segmentFacing,x sta segmentFacing,x
txa lda tileOffset,x
asl a
asl a
asl a
tay
lda tiles+TILE_SCREEN_OFFSET_OFFSET,y
sec sec
sbc #3 sbc #3
sta segmentScreenOffsets,x sta segmentScreenOffsets,x
@ -220,13 +208,13 @@ addHeadSegment entry
txa txa
asl a asl a
asl a asl a
tax tay
tya txa
sta segmentTileOffsets,x sta segmentTileOffsets,y
sta segmentTileOffsets+2,x sta segmentTileOffsets+2,y
sta segmentTileOffsets+4,x sta segmentTileOffsets+4,y
sta segmentTileOffsets+6,x sta segmentTileOffsets+6,y
inc numSegments inc numSegments

View File

@ -337,12 +337,12 @@ updateSpider_tilesRight_cont anop
ldx spiderTileOffsets+2 ldx spiderTileOffsets+2
stx spiderTileOffsets+6 stx spiderTileOffsets+6
lda tiles+TILE_RIGHT_OFFSET,x lda tileRight,x
sta spiderTileOffsets+2 sta spiderTileOffsets+2
ldx spiderTileOffsets ldx spiderTileOffsets
stx spiderTileOffsets+4 stx spiderTileOffsets+4
lda tiles+TILE_RIGHT_OFFSET,x lda tileRight,x
sta spiderTileOffsets sta spiderTileOffsets
rtl rtl
@ -359,12 +359,12 @@ updateSpider_tilesLeft_cont anop
ldx spiderTileOffsets+10 ldx spiderTileOffsets+10
stx spiderTileOffsets+6 stx spiderTileOffsets+6
lda tiles+TILE_LEFT_OFFSET,x lda tileLeft,x
sta spiderTileOffsets+10 sta spiderTileOffsets+10
ldx spiderTileOffsets+8 ldx spiderTileOffsets+8
stx spiderTileOffsets+4 stx spiderTileOffsets+4
lda tiles+TILE_LEFT_OFFSET,x lda tileLeft,x
sta spiderTileOffsets+8 sta spiderTileOffsets+8
rtl rtl
@ -381,26 +381,26 @@ updateSpider_tilesUp anop
ldx spiderTileOffsets+2 ldx spiderTileOffsets+2
stx spiderTileOffsets stx spiderTileOffsets
lda tiles+TILE_ABOVE_OFFSET,x lda tileAbove,x
sta spiderTileOffsets+2 sta spiderTileOffsets+2
ldx spiderTileOffsets+6 ldx spiderTileOffsets+6
stx spiderTileOffsets+4 stx spiderTileOffsets+4
lda tiles+TILE_ABOVE_OFFSET,x lda tileAbove,x
sta spiderTileOffsets+6 sta spiderTileOffsets+6
; As per the below, clear any mushroom if present ; As per the below, clear any mushroom if present
cpx #RHS_FIRST_TILE_OFFSET cpx #RHS_FIRST_TILE_OFFSET
bge updateSpider_tilesUpCont bge updateSpider_tilesUpCont
lda tiles+TILE_TYPE_OFFSET,x lda tileType,x
beq updateSpider_tilesUpCont beq updateSpider_tilesUpCont
lda #TILE_EMPTY lda #TILE_EMPTY
sta tiles+TILE_TYPE_OFFSET,x sta tileType,x
updateSpider_tilesUpCont anop updateSpider_tilesUpCont anop
ldx spiderTileOffsets+10 ldx spiderTileOffsets+10
stx spiderTileOffsets+8 stx spiderTileOffsets+8
lda tiles+TILE_ABOVE_OFFSET,x lda tileAbove,x
sta spiderTileOffsets+10 sta spiderTileOffsets+10
rtl rtl
@ -452,27 +452,27 @@ updateSpider_tilesDown anop
ldx spiderTileOffsets ldx spiderTileOffsets
stx spiderTileOffsets+2 stx spiderTileOffsets+2
lda tiles+TILE_BELOW_OFFSET,x lda tileBelow,x
sta spiderTileOffsets sta spiderTileOffsets
ldx spiderTileOffsets+4 ldx spiderTileOffsets+4
stx spiderTileOffsets+6 stx spiderTileOffsets+6
lda tiles+TILE_BELOW_OFFSET,x lda tileBelow,x
sta spiderTileOffsets+4 sta spiderTileOffsets+4
; If the middle tile is a game time and it isn't empty, then ; If the middle tile is a game time and it isn't empty, then
; empty it. Spiders "consume" mushrooms as they pass over them. ; empty it. Spiders "consume" mushrooms as they pass over them.
cpx #RHS_FIRST_TILE_OFFSET cpx #RHS_FIRST_TILE_OFFSET
bge updateSpider_tilesDownCont bge updateSpider_tilesDownCont
lda tiles+TILE_TYPE_OFFSET,x lda tileType,x
beq updateSpider_tilesDownCont beq updateSpider_tilesDownCont
lda #TILE_EMPTY lda #TILE_EMPTY
sta tiles+TILE_TYPE_OFFSET,x sta tileType,x
updateSpider_tilesDownCont anop updateSpider_tilesDownCont anop
ldx spiderTileOffsets+8 ldx spiderTileOffsets+8
stx spiderTileOffsets+10 stx spiderTileOffsets+10
lda tiles+TILE_BELOW_OFFSET,x lda tileBelow,x
sta spiderTileOffsets+8 sta spiderTileOffsets+8
rtl rtl
@ -556,26 +556,26 @@ addSpider_left anop
ldx #SPIDER_RHS_TILE_OFFSET ldx #SPIDER_RHS_TILE_OFFSET
stx spiderTileOffsets+8 stx spiderTileOffsets+8
lda tiles+TILE_ABOVE_OFFSET,x lda tileAbove,x
sta spiderTileOffsets+10 sta spiderTileOffsets+10
lda tiles+TILE_RIGHT_OFFSET,x lda tileRight,x
sta spiderTileOffsets+4 sta spiderTileOffsets+4
tax tax
lda tiles+TILE_SCREEN_OFFSET_OFFSET,x lda tileOffset,x
sec sec
sbc #SPIDER_RHS_STARTING_SCREEN_OFFSET sbc #SPIDER_RHS_STARTING_SCREEN_OFFSET
sta spiderScreenOffset sta spiderScreenOffset
lda tiles+TILE_ABOVE_OFFSET,x lda tileAbove,x
sta spiderTileOffsets+6 sta spiderTileOffsets+6
lda tiles+TILE_RIGHT_OFFSET,x lda tileRight,x
sta spiderTileOffsets sta spiderTileOffsets
tax tax
lda tiles+TILE_ABOVE_OFFSET,x lda tileAbove,x
sta spiderTileOffsets+2 sta spiderTileOffsets+2
rtl rtl
@ -590,26 +590,26 @@ addSpider_right anop
ldx #SPIDER_LHS_TILE_OFFSET ldx #SPIDER_LHS_TILE_OFFSET
stx spiderTileOffsets stx spiderTileOffsets
lda tiles+TILE_ABOVE_OFFSET,x lda tileAbove,x
sta spiderTileOffsets+2 sta spiderTileOffsets+2
lda tiles+TILE_LEFT_OFFSET,x lda tileLeft,x
sta spiderTileOffsets+4 sta spiderTileOffsets+4
tax tax
lda tiles+TILE_SCREEN_OFFSET_OFFSET,x lda tileOffset,x
sec sec
sbc #SPIDER_LHS_STARTING_SCREEN_OFFSET sbc #SPIDER_LHS_STARTING_SCREEN_OFFSET
sta spiderScreenOffset sta spiderScreenOffset
lda tiles+TILE_ABOVE_OFFSET,x lda tileAbove,x
sta spiderTileOffsets+6 sta spiderTileOffsets+6
lda tiles+TILE_LEFT_OFFSET,x lda tileLeft,x
sta spiderTileOffsets+8 sta spiderTileOffsets+8
tax tax
lda tiles+TILE_ABOVE_OFFSET,x lda tileAbove,x
sta spiderTileOffsets+10 sta spiderTileOffsets+10
rtl rtl

View File

@ -13,10 +13,10 @@
_dirtyGameTile &tileOffset _dirtyGameTile &tileOffset
ldx &tileOffset,y ldx &tileOffset,y
lda tiles+TILE_DIRTY_OFFSET,x lda tileDirty,x
bne _dirtyGameTile_skip&SYSCNT bne _dirtyGameTile_skip&SYSCNT
lda #TILE_STATE_DIRTY lda #TILE_STATE_DIRTY
sta tiles+TILE_DIRTY_OFFSET,x sta tileDirty,x
txa txa
ldx numDirtyGameTiles ldx numDirtyGameTiles
sta dirtyGameTiles,x sta dirtyGameTiles,x
@ -35,10 +35,10 @@ _dirtyGameTile_skip&SYSCNT anop
_dirtyGameTileWithY &tileOffset _dirtyGameTileWithY &tileOffset
ldx &tileOffset ldx &tileOffset
lda tiles+TILE_DIRTY_OFFSET,x lda tileDirty,x
bne _dirtyGameTileWithY_skip&SYSCNT bne _dirtyGameTileWithY_skip&SYSCNT
lda #TILE_STATE_DIRTY lda #TILE_STATE_DIRTY
sta tiles+TILE_DIRTY_OFFSET,x sta tileDirty,x
txa txa
sta dirtyGameTiles,y sta dirtyGameTiles,y
iny iny
@ -52,10 +52,10 @@ _dirtyGameTileWithY_skip&SYSCNT anop
_dirtyGameOrNonGameTile &tileOffset _dirtyGameOrNonGameTile &tileOffset
ldx &tileOffset ldx &tileOffset
lda tiles+TILE_DIRTY_OFFSET,x lda tileDirty,x
bne _dirtyGameTile_skip&SYSCNT bne _dirtyGameTile_skip&SYSCNT
lda #TILE_STATE_DIRTY lda #TILE_STATE_DIRTY
sta tiles+TILE_DIRTY_OFFSET,x sta tileDirty,x
txa txa
cmp #RHS_FIRST_TILE_OFFSET cmp #RHS_FIRST_TILE_OFFSET
bge _dirtyGameTile_nonGame&SYSCNT bge _dirtyGameTile_nonGame&SYSCNT

View File

@ -18,7 +18,7 @@ globalData data
SCREEN_BYTES_PER_ROW gequ 160 SCREEN_BYTES_PER_ROW gequ 160
SIZEOF_TILE_INFO gequ 16 SIZEOF_TILE_INFO gequ 2
TILE_PIXEL_WIDTH gequ 8 TILE_PIXEL_WIDTH gequ 8
TILE_PIXEL_HEIGHT gequ 8 TILE_PIXEL_HEIGHT gequ 8
@ -110,14 +110,6 @@ TILE_PLAYER gequ 52*4
TILE_POISON_A_MUSHROOM gequ TILE_POISON_MUSHROOM4-TILE_MUSHROOM4 TILE_POISON_A_MUSHROOM gequ TILE_POISON_MUSHROOM4-TILE_MUSHROOM4
TILE_DIRTY_OFFSET gequ 0
TILE_SCREEN_OFFSET_OFFSET gequ 2
TILE_TYPE_OFFSET gequ 4
TILE_ABOVE_OFFSET gequ 6
TILE_BELOW_OFFSET gequ 8
TILE_LEFT_OFFSET gequ 10
TILE_RIGHT_OFFSET gequ 12
NUM_COLOUR_PALETTES gequ 14 NUM_COLOUR_PALETTES gequ 14
SPRITE_SPEED_SLOW gequ 0 SPRITE_SPEED_SLOW gequ 0

View File

@ -15,7 +15,7 @@ fleas start
flea1 entry flea1 entry
_spriteHeader _spriteHeader ; 30
; $c - Green ; $c - Green
; $4 - Red ; $4 - Red
@ -31,94 +31,95 @@ flea1 entry
; ....|.G.G|...G ; ....|.G.G|...G
; ;
lda $0,s lda $0,s ; 5
and #$00ff and #$00ff ; 3
ora #$8800 ora #$8800 ; 3
sta $0,s sta $0,s ; 5
; 46
lda $2,s lda $2,s ; 5
and #$ff0f and #$ff0f ; 3
ora #$0080 ora #$0080 ; 3
sta $2,s sta $2,s ; 5
; 62
lda $a0,s lda $a0,s
and #$00f0 and #$00f0
ora #$8804 ora #$8804
sta $a0,s sta $a0,s
; 78
lda $a2,s lda $a2,s
and #$ff00 and #$ff00
ora #$0088 ora #$0088
sta $a2,s sta $a2,s
; 94
tsc tsc ; 2
adc #$0141 adc #$0141 ; 3
tcs tcs ; 2
; 101
pea $8844 pea $8844 ; 5
lda $3,s lda $3,s
and #$0f00 and #$0f00
ora #$8088 ora #$8088
sta $3,s sta $3,s
; 122
lda $9f,s lda $9f,s
and #$f0ff and #$f0ff
ora #$0800 ora #$0800
sta $9f,s sta $9f,s
; 138
tsc tsc
adc #$00a4 adc #$00a4
tcs tcs
pea $8888 pea $8888
pea $8888 pea $8888
; 155
lda $9f,s lda $9f,s
and #$f0ff and #$f0ff
ora #$0800 ora #$0800
sta $9f,s sta $9f,s
; 171
lda $a1,s lda $a1,s
and #$0f00 and #$0f00
ora #$c088 ora #$c088
sta $a1,s sta $a1,s
; 187
tsc tsc
adc #$00a4 adc #$00a4
tcs tcs
pea $88c8 pea $88c8
; 199
lda $9f,s lda $9f,s
ora #$c000 ora #$c000
sta $9f,s sta $9f,s
; 212
lda $a1,s lda $a1,s
and #$000f and #$000f
ora #$88c0 ora #$88c0
sta $a1,s sta $a1,s
; 228
tsc tsc
adc #$013e adc #$013e
tcs tcs
; 235
lda $1,s lda $1,s
ora #$c000 ora #$c000
sta $1,s sta $1,s
; 248
lda $3,s lda $3,s
ora #$c0c0 ora #$c0c0
sta $3,s sta $3,s
; 261
lda $a1,s lda $a1,s
ora #$0c0c ora #$0c0c
sta $a1,s sta $a1,s
; 274
lda $a3,s lda $a3,s
ora #$0c00 ora #$0c00
sta $a3,s sta $a3,s
; 287
_spriteFooter _spriteFooter
; 311 cycles
rtl rtl
flea2 entry flea2 entry
_spriteHeader _spriteHeader

View File

@ -8,28 +8,28 @@
macro macro
_spriteHeader _spriteHeader
sei sei ; 2
tsc tsc ; 2
sta backupStack sta backupStack ; 5
lda >STATE_REGISTER ; Direct Page and Stack in Bank 01/ lda >STATE_REGISTER ; 6 - Direct Page and Stack in Bank 01/
ora #$0030 ora #$0030 ; 3
sta >STATE_REGISTER sta >STATE_REGISTER ; 6
clc clc ; 2
tya tya ; 2
tcs tcs ; 2
mend mend ; 30
macro macro
_spriteFooter _spriteFooter
lda >STATE_REGISTER lda >STATE_REGISTER ; 6
and #$ffcf and #$ffcf ; 3
sta >STATE_REGISTER sta >STATE_REGISTER ; 6
lda backupStack lda backupStack ; 5
tcs tcs ; 2
cli cli ; 2
mend mend ; 24
macro macro
_leftHead _leftHead

View File

@ -23,13 +23,13 @@
#define GAME_TOP_MOST_Y_POS (0 * TILE_HEIGHT) #define GAME_TOP_MOST_Y_POS (0 * TILE_HEIGHT)
#define GAME_X_Y_TO_TILE_OFFSET(X, Y) \ #define GAME_X_Y_TO_TILE_OFFSET(X, Y) \
((((Y) * GAME_NUM_TILES_WIDE) + (X)) * sizeof(tTile)) ((((Y) * GAME_NUM_TILES_WIDE) + (X)) * sizeof(word))
#define RHS_X_Y_TO_TILE_OFFSET(X, Y) \ #define RHS_X_Y_TO_TILE_OFFSET(X, Y) \
((RHS_FIRST_TILE + ((Y) * RHS_NUM_TILES_WIDE) + (X)) * sizeof(tTile)) ((RHS_FIRST_TILE + ((Y) * RHS_NUM_TILES_WIDE) + (X)) * sizeof(word))
#define LHS_X_Y_TO_TILE_OFFSET(X, Y) \ #define LHS_X_Y_TO_TILE_OFFSET(X, Y) \
((LHS_FIRST_TILE + ((Y) * LHS_NUM_TILES_WIDE) + (X)) * sizeof(tTile)) ((LHS_FIRST_TILE + ((Y) * LHS_NUM_TILES_WIDE) + (X)) * sizeof(word))
#define SCREEN_ADDRESS_FOR_TILE_AT_X_Y(X, Y) \ #define SCREEN_ADDRESS_FOR_TILE_AT_X_Y(X, Y) \
(0x2000 + (0xa0 * (Y)) + ((X) / 2) + 3) (0x2000 + (0xa0 * (Y)) + ((X) / 2) + 3)
@ -38,22 +38,28 @@
#define STARTING_NUM_PLAYERS 3 #define STARTING_NUM_PLAYERS 3
#define ADD_DIRTY_GAME_TILE(tileNum) \ #define ADD_DIRTY_GAME_TILE(tileNum) \
if (!tiles[tileNum].dirty) { \ if (!tileDirty[tileNum]) { \
tiles[tileNum].dirty = 1; \ tileDirty[tileNum] = 1; \
dirtyGameTiles[numDirtyGameTiles / 2] = ((tileNum) * sizeof(tTile)); \ dirtyGameTiles[numDirtyGameTiles / 2] = ((tileNum) * sizeof(word)); \
numDirtyGameTiles += 2; \ numDirtyGameTiles += 2; \
} }
#define ADD_DIRTY_NON_GAME_TILE(tileNum) \ #define ADD_DIRTY_NON_GAME_TILE(tileNum) \
if (!tiles[tileNum].dirty) { \ if (!tileDirty[tileNum]) { \
tiles[tileNum].dirty = 1; \ tileDirty[tileNum] = 1; \
dirtyNonGameTiles[numDirtyNonGameTiles / 2] = ((tileNum) * sizeof(tTile)); \ dirtyNonGameTiles[numDirtyNonGameTiles / 2] = ((tileNum) * sizeof(word)); \
numDirtyNonGameTiles += 2; \ numDirtyNonGameTiles += 2; \
} }
/* Globals */ /* Globals */
tTile tiles[TOTAL_NUM_TILES]; word tileDirty[TOTAL_NUM_TILES];
word tileOffset[TOTAL_NUM_TILES];
tTileType tileType[TOTAL_NUM_TILES];
tTileOffset tileAbove[TOTAL_NUM_TILES];
tTileOffset tileBelow[TOTAL_NUM_TILES];
tTileOffset tileLeft[TOTAL_NUM_TILES];
tTileOffset tileRight[TOTAL_NUM_TILES];
tTileOffset dirtyGameTiles[NUM_GAME_TILES + GAME_NUM_TILES_TALL]; tTileOffset dirtyGameTiles[NUM_GAME_TILES + GAME_NUM_TILES_TALL];
word numDirtyGameTiles; word numDirtyGameTiles;
@ -71,9 +77,9 @@ void initTiles(void)
word tileX; word tileX;
word tileY; word tileY;
word lastOffset; word lastOffset;
tTile * tilePtr = &(tiles[0]); word tileIndex = 0;
tTile * rhsTilePtr = &(tiles[RHS_FIRST_TILE]); word rhsTileIndex = RHS_FIRST_TILE;
tTile * lhsTilePtr = &(tiles[LHS_FIRST_TILE]); word lhsTileIndex = LHS_FIRST_TILE;
for (tileY = 0; tileY < GAME_NUM_TILES_TALL; tileY++) for (tileY = 0; tileY < GAME_NUM_TILES_TALL; tileY++)
{ {
@ -81,97 +87,93 @@ void initTiles(void)
for (tileX = 0; tileX < LHS_NUM_TILES_WIDE; tileX++) for (tileX = 0; tileX < LHS_NUM_TILES_WIDE; tileX++)
{ {
lhsTilePtr->dirty = 0; tileDirty[lhsTileIndex] = 0;
lhsTilePtr->offset = lastOffset; tileOffset[lhsTileIndex] = lastOffset;
lhsTilePtr->type = TILE_EMPTY; tileType[lhsTileIndex] = TILE_EMPTY;
if (tileY == 0) if (tileY == 0)
lhsTilePtr->tileAbove = INVALID_TILE_NUM; tileAbove[lhsTileIndex] = INVALID_TILE_NUM;
else else
lhsTilePtr->tileAbove = LHS_X_Y_TO_TILE_OFFSET(tileX, tileY - 1); tileAbove[lhsTileIndex] = LHS_X_Y_TO_TILE_OFFSET(tileX, tileY - 1);
if (tileY == GAME_NUM_TILES_TALL - 1) if (tileY == GAME_NUM_TILES_TALL - 1)
lhsTilePtr->tileBelow = INVALID_TILE_NUM; tileBelow[lhsTileIndex] = INVALID_TILE_NUM;
else else
lhsTilePtr->tileBelow = LHS_X_Y_TO_TILE_OFFSET(tileX, tileY + 1); tileBelow[lhsTileIndex] = LHS_X_Y_TO_TILE_OFFSET(tileX, tileY + 1);
if (tileX == 0) if (tileX == 0)
lhsTilePtr->tileLeft = INVALID_TILE_NUM; tileLeft[lhsTileIndex] = INVALID_TILE_NUM;
else else
lhsTilePtr->tileLeft = LHS_X_Y_TO_TILE_OFFSET(tileX - 1, tileY); tileLeft[lhsTileIndex] = LHS_X_Y_TO_TILE_OFFSET(tileX - 1, tileY);
if (tileX == LHS_NUM_TILES_WIDE - 1) if (tileX == LHS_NUM_TILES_WIDE - 1)
lhsTilePtr->tileRight = GAME_X_Y_TO_TILE_OFFSET(0, tileY); tileRight[lhsTileIndex] = GAME_X_Y_TO_TILE_OFFSET(0, tileY);
else else
lhsTilePtr->tileRight = LHS_X_Y_TO_TILE_OFFSET(tileX + 1, tileY); tileRight[lhsTileIndex] = LHS_X_Y_TO_TILE_OFFSET(tileX + 1, tileY);
lhsTilePtr->dummy = 0;
lhsTilePtr++; lhsTileIndex++;
lastOffset += 4; lastOffset += 4;
} }
for (tileX = 0; tileX < GAME_NUM_TILES_WIDE; tileX++) for (tileX = 0; tileX < GAME_NUM_TILES_WIDE; tileX++)
{ {
tilePtr->dirty = 0; tileDirty[tileIndex] = 0;
tilePtr->offset = lastOffset; tileOffset[tileIndex] = lastOffset;
tilePtr->type = TILE_EMPTY; tileType[tileIndex] = TILE_EMPTY;
if (tileY == 0) if (tileY == 0)
tilePtr->tileAbove = INVALID_TILE_NUM; tileAbove[tileIndex] = INVALID_TILE_NUM;
else else
tilePtr->tileAbove = GAME_X_Y_TO_TILE_OFFSET(tileX, tileY - 1); tileAbove[tileIndex] = GAME_X_Y_TO_TILE_OFFSET(tileX, tileY - 1);
if (tileY == GAME_NUM_TILES_TALL - 1) if (tileY == GAME_NUM_TILES_TALL - 1)
tilePtr->tileBelow = INVALID_TILE_NUM; tileBelow[tileIndex] = INVALID_TILE_NUM;
else else
tilePtr->tileBelow = GAME_X_Y_TO_TILE_OFFSET(tileX, tileY + 1); tileBelow[tileIndex] = GAME_X_Y_TO_TILE_OFFSET(tileX, tileY + 1);
if (tileX == 0) if (tileX == 0)
tilePtr->tileLeft = LHS_X_Y_TO_TILE_OFFSET(LHS_NUM_TILES_WIDE - 1, tileY); tileLeft[tileIndex] = LHS_X_Y_TO_TILE_OFFSET(LHS_NUM_TILES_WIDE - 1, tileY);
else else
tilePtr->tileLeft = GAME_X_Y_TO_TILE_OFFSET(tileX - 1, tileY); tileLeft[tileIndex] = GAME_X_Y_TO_TILE_OFFSET(tileX - 1, tileY);
if (tileX == GAME_NUM_TILES_WIDE - 1) if (tileX == GAME_NUM_TILES_WIDE - 1)
tilePtr->tileRight = RHS_X_Y_TO_TILE_OFFSET(0, tileY); tileRight[tileIndex] = RHS_X_Y_TO_TILE_OFFSET(0, tileY);
else else
tilePtr->tileRight = GAME_X_Y_TO_TILE_OFFSET(tileX + 1, tileY); tileRight[tileIndex] = GAME_X_Y_TO_TILE_OFFSET(tileX + 1, tileY);
tilePtr->dummy = 0; tileIndex++;
tilePtr++;
lastOffset += 4; lastOffset += 4;
} }
for (tileX = 0; tileX < RHS_NUM_TILES_WIDE; tileX++) for (tileX = 0; tileX < RHS_NUM_TILES_WIDE; tileX++)
{ {
rhsTilePtr->dirty = 0; tileDirty[rhsTileIndex] = 0;
rhsTilePtr->offset = lastOffset; tileOffset[rhsTileIndex] = lastOffset;
rhsTilePtr->type = TILE_EMPTY; tileType[rhsTileIndex] = TILE_EMPTY;
if (tileY == 0) if (tileY == 0)
rhsTilePtr->tileAbove = INVALID_TILE_NUM; tileAbove[rhsTileIndex] = INVALID_TILE_NUM;
else else
rhsTilePtr->tileAbove = RHS_X_Y_TO_TILE_OFFSET(tileX, tileY - 1); tileAbove[rhsTileIndex] = RHS_X_Y_TO_TILE_OFFSET(tileX, tileY - 1);
if (tileY == GAME_NUM_TILES_TALL - 1) if (tileY == GAME_NUM_TILES_TALL - 1)
rhsTilePtr->tileBelow = INVALID_TILE_NUM; tileBelow[rhsTileIndex] = INVALID_TILE_NUM;
else else
rhsTilePtr->tileBelow = RHS_X_Y_TO_TILE_OFFSET(tileX, tileY + 1); tileBelow[rhsTileIndex] = RHS_X_Y_TO_TILE_OFFSET(tileX, tileY + 1);
if (tileX == 0) if (tileX == 0)
rhsTilePtr->tileLeft = GAME_X_Y_TO_TILE_OFFSET(GAME_NUM_TILES_WIDE - 1, tileY); tileLeft[rhsTileIndex] = GAME_X_Y_TO_TILE_OFFSET(GAME_NUM_TILES_WIDE - 1, tileY);
else else
rhsTilePtr->tileLeft = RHS_X_Y_TO_TILE_OFFSET(tileX - 1, tileY); tileLeft[rhsTileIndex] = RHS_X_Y_TO_TILE_OFFSET(tileX - 1, tileY);
if (tileX == RHS_NUM_TILES_WIDE - 1) if (tileX == RHS_NUM_TILES_WIDE - 1)
rhsTilePtr->tileRight = INVALID_TILE_NUM; tileRight[rhsTileIndex] = INVALID_TILE_NUM;
else else
rhsTilePtr->tileRight = RHS_X_Y_TO_TILE_OFFSET(tileX + 1, tileY); tileRight[rhsTileIndex] = RHS_X_Y_TO_TILE_OFFSET(tileX + 1, tileY);
rhsTilePtr->dummy = 0; rhsTileIndex++;
rhsTilePtr++;
lastOffset += 4; lastOffset += 4;
} }
@ -190,81 +192,81 @@ void initNonGameTiles(void)
for (i = 0; i < numPlayers; i++) for (i = 0; i < numPlayers; i++)
{ {
tileNum = RHS_FIRST_TILE + i; tileNum = RHS_FIRST_TILE + i;
tiles[tileNum].type = TILE_PLAYER; tileType[tileNum] = TILE_PLAYER;
ADD_DIRTY_NON_GAME_TILE(tileNum); ADD_DIRTY_NON_GAME_TILE(tileNum);
} }
tileNum = LHS_FIRST_TILE + (1 * LHS_NUM_TILES_WIDE) + 6; tileNum = LHS_FIRST_TILE + (1 * LHS_NUM_TILES_WIDE) + 6;
tiles[tileNum].type = TILE_LETTER_S; tileType[tileNum] = TILE_LETTER_S;
ADD_DIRTY_NON_GAME_TILE(tileNum); ADD_DIRTY_NON_GAME_TILE(tileNum);
tileNum++; tileNum++;
tiles[tileNum].type = TILE_LETTER_C; tileType[tileNum] = TILE_LETTER_C;
ADD_DIRTY_NON_GAME_TILE(tileNum); ADD_DIRTY_NON_GAME_TILE(tileNum);
tileNum++; tileNum++;
tiles[tileNum].type = TILE_LETTER_O; tileType[tileNum] = TILE_LETTER_O;
ADD_DIRTY_NON_GAME_TILE(tileNum); ADD_DIRTY_NON_GAME_TILE(tileNum);
tileNum++; tileNum++;
tiles[tileNum].type = TILE_LETTER_R; tileType[tileNum] = TILE_LETTER_R;
ADD_DIRTY_NON_GAME_TILE(tileNum); ADD_DIRTY_NON_GAME_TILE(tileNum);
tileNum++; tileNum++;
tiles[tileNum].type = TILE_LETTER_E; tileType[tileNum] = TILE_LETTER_E;
ADD_DIRTY_NON_GAME_TILE(tileNum); ADD_DIRTY_NON_GAME_TILE(tileNum);
tileNum++; tileNum++;
tiles[tileNum].type = TILE_SYMBOL_COLON; tileType[tileNum] = TILE_SYMBOL_COLON;
ADD_DIRTY_NON_GAME_TILE(tileNum); ADD_DIRTY_NON_GAME_TILE(tileNum);
tileNum = LHS_FIRST_TILE + (4 * LHS_NUM_TILES_WIDE) - 2; tileNum = LHS_FIRST_TILE + (4 * LHS_NUM_TILES_WIDE) - 2;
tiles[tileNum].type = TILE_NUMBER_0; tileType[tileNum] = TILE_NUMBER_0;
ADD_DIRTY_NON_GAME_TILE(tileNum); ADD_DIRTY_NON_GAME_TILE(tileNum);
tileNum = LHS_FIRST_TILE + (12 * LHS_NUM_TILES_WIDE) + 1; tileNum = LHS_FIRST_TILE + (12 * LHS_NUM_TILES_WIDE) + 1;
tiles[tileNum].type = TILE_LETTER_H; tileType[tileNum] = TILE_LETTER_H;
ADD_DIRTY_NON_GAME_TILE(tileNum); ADD_DIRTY_NON_GAME_TILE(tileNum);
tileNum++; tileNum++;
tiles[tileNum].type = TILE_LETTER_I; tileType[tileNum] = TILE_LETTER_I;
ADD_DIRTY_NON_GAME_TILE(tileNum); ADD_DIRTY_NON_GAME_TILE(tileNum);
tileNum++; tileNum++;
tiles[tileNum].type = TILE_LETTER_G; tileType[tileNum] = TILE_LETTER_G;
ADD_DIRTY_NON_GAME_TILE(tileNum); ADD_DIRTY_NON_GAME_TILE(tileNum);
tileNum++; tileNum++;
tiles[tileNum].type = TILE_LETTER_H; tileType[tileNum] = TILE_LETTER_H;
ADD_DIRTY_NON_GAME_TILE(tileNum); ADD_DIRTY_NON_GAME_TILE(tileNum);
tileNum++; tileNum++;
tileNum++; tileNum++;
tiles[tileNum].type = TILE_LETTER_S; tileType[tileNum] = TILE_LETTER_S;
ADD_DIRTY_NON_GAME_TILE(tileNum); ADD_DIRTY_NON_GAME_TILE(tileNum);
tileNum++; tileNum++;
tiles[tileNum].type = TILE_LETTER_C; tileType[tileNum] = TILE_LETTER_C;
ADD_DIRTY_NON_GAME_TILE(tileNum); ADD_DIRTY_NON_GAME_TILE(tileNum);
tileNum++; tileNum++;
tiles[tileNum].type = TILE_LETTER_O; tileType[tileNum] = TILE_LETTER_O;
ADD_DIRTY_NON_GAME_TILE(tileNum); ADD_DIRTY_NON_GAME_TILE(tileNum);
tileNum++; tileNum++;
tiles[tileNum].type = TILE_LETTER_R; tileType[tileNum] = TILE_LETTER_R;
ADD_DIRTY_NON_GAME_TILE(tileNum); ADD_DIRTY_NON_GAME_TILE(tileNum);
tileNum++; tileNum++;
tiles[tileNum].type = TILE_LETTER_E; tileType[tileNum] = TILE_LETTER_E;
ADD_DIRTY_NON_GAME_TILE(tileNum); ADD_DIRTY_NON_GAME_TILE(tileNum);
tileNum++; tileNum++;
tiles[tileNum].type = TILE_SYMBOL_COLON; tileType[tileNum] = TILE_SYMBOL_COLON;
ADD_DIRTY_NON_GAME_TILE(tileNum); ADD_DIRTY_NON_GAME_TILE(tileNum);
tileNum = LHS_FIRST_TILE + (15 * LHS_NUM_TILES_WIDE) - 2; tileNum = LHS_FIRST_TILE + (15 * LHS_NUM_TILES_WIDE) - 2;
tiles[tileNum].type = TILE_NUMBER_0; tileType[tileNum] = TILE_NUMBER_0;
ADD_DIRTY_NON_GAME_TILE(tileNum); ADD_DIRTY_NON_GAME_TILE(tileNum);
} }
@ -279,10 +281,10 @@ void addStartingMushrooms(void)
/* We do not put mushrooms in the bottom tile so we subtract the width here to find /* We do not put mushrooms in the bottom tile so we subtract the width here to find
a tile number above that last line */ a tile number above that last line */
tileNum = rand() % (NUM_GAME_TILES - GAME_NUM_TILES_WIDE); tileNum = rand() % (NUM_GAME_TILES - GAME_NUM_TILES_WIDE);
if (tiles[tileNum].type != TILE_EMPTY) if (tileType[tileNum] != TILE_EMPTY)
continue; continue;
tiles[tileNum].type = TILE_MUSHROOM4; tileType[tileNum] = TILE_MUSHROOM4;
ADD_DIRTY_GAME_TILE(tileNum); ADD_DIRTY_GAME_TILE(tileNum);
numMushrooms++; numMushrooms++;
} }

View File

@ -103,23 +103,16 @@ typedef enum {
} tTileType; } tTileType;
typedef struct
{
word dirty;
word offset;
tTileType type;
tTileOffset tileAbove;
tTileOffset tileBelow;
tTileOffset tileLeft;
tTileOffset tileRight;
word dummy; /* I want a size which is a multiple of 2 */
} tTile;
/* Globals */ /* Globals */
extern tTile tiles[TOTAL_NUM_TILES]; extern word tileDirty[TOTAL_NUM_TILES];
extern word tileOffset[TOTAL_NUM_TILES];
extern tTileType tileType[TOTAL_NUM_TILES];
extern tTileOffset tileAbove[TOTAL_NUM_TILES];
extern tTileOffset tileBelow[TOTAL_NUM_TILES];
extern tTileOffset tileLeft[TOTAL_NUM_TILES];
extern tTileOffset tileRight[TOTAL_NUM_TILES];
extern tTileOffset dirtyGameTiles[NUM_GAME_TILES + GAME_NUM_TILES_TALL]; extern tTileOffset dirtyGameTiles[NUM_GAME_TILES + GAME_NUM_TILES_TALL];
extern word numDirtyGameTiles; extern word numDirtyGameTiles;
extern tTileOffset dirtyNonGameTiles[NUM_NON_GAME_TILES]; extern tTileOffset dirtyNonGameTiles[NUM_NON_GAME_TILES];