Change the code to race the beam down the screen, redrawing the dirty game rows as it goes.

This commit is contained in:
Jeremy Rand 2020-09-04 00:17:19 -04:00
parent b07221c363
commit 22a22d3533
23 changed files with 124 additions and 551 deletions

View File

@ -102,25 +102,32 @@ gameDone anop
drawDirtyGameTiles entry
ldy numDirtyGameTiles
beq dirtyTileLoopDone
dirtyTileLoop anop
dey
dey
phy
ldx dirtyGameTiles,y
stz tileDirty,x
ldy tileOffset,x
lda tileType,x
jsl drawTile
ply
bne dirtyTileLoop
dirtyTileLoopDone anop
stz numDirtyGameTiles
rtl
_drawDirtyGameRow 0
_drawDirtyGameRow 1
_drawDirtyGameRow 2
_drawDirtyGameRow 3
_drawDirtyGameRow 4
_drawDirtyGameRow 5
_drawDirtyGameRow 6
_drawDirtyGameRow 7
_drawDirtyGameRow 8
_drawDirtyGameRow 9
_drawDirtyGameRow 10
_drawDirtyGameRow 11
_drawDirtyGameRow 12
_drawDirtyGameRow 13
_drawDirtyGameRow 14
_drawDirtyGameRow 15
_drawDirtyGameRow 16
_drawDirtyGameRow 17
_drawDirtyGameRow 18
_drawDirtyGameRow 19
_drawDirtyGameRow 20
_drawDirtyGameRow 21
_drawDirtyGameRow 22
_drawDirtyGameRow 23
_drawDirtyGameRow 24
drawDirtyNonGameTiles entry
@ -133,7 +140,7 @@ dirtyTileLoop2 anop
ldx dirtyNonGameTiles,y
stz tileDirty,x
ldy tileOffset,x
ldy tileScreenOffset,x
lda tileType,x
jsl drawTile
@ -156,500 +163,7 @@ drawTile entry
jumpInst jmp >mushroom1
nop
drawAll entry
ldy #$2003
jsl mushroom1
ldy #$200b
jsl mushroom2
ldy #$2013
jsl mushroom3
ldy #$201b
jsl mushroom4
ldy #$2023
jsl poisonedMushroom1
ldy #$202b
jsl poisonedMushroom2
ldy #$2033
jsl poisonedMushroom3
ldy #$203b
jsl poisonedMushroom4
ldy #$2043
jsl letterA
ldy #$204b
jsl letterB
ldy #$2053
jsl letterC
ldy #$205b
jsl letterD
ldy #$2063
jsl letterE
ldy #$206b
jsl letterF
ldy #$2073
jsl letterG
ldy #$207b
jsl letterH
ldy #$2083
jsl letterI
ldy #$208b
jsl letterJ
ldy #$2093
jsl letterK
ldy #$209b
jsl letterL
ldy #$2a03
jsl letterM
ldy #$2a0b
jsl letterN
ldy #$2a13
jsl letterO
ldy #$2a1b
jsl letterP
ldy #$2a23
jsl letterQ
ldy #$2a2b
jsl letterR
ldy #$2a33
jsl letterS
ldy #$2a3b
jsl letterT
ldy #$2a43
jsl letterU
ldy #$2a4b
jsl letterV
ldy #$2a53
jsl letterW
ldy #$2a5b
jsl letterX
ldy #$2a63
jsl letterY
ldy #$2a6b
jsl letterZ
ldy #$2a73
jsl symbolC
ldy #$2a7b
jsl symbolP
ldy #$2a83
jsl symbolDot
ldy #$2a8b
jsl symbolColon
ldy #$2a93
jsl solid0
ldy #$2a9b
jsl solid1
ldy #$3403
jsl solid2
ldy #$340b
jsl solid3
ldy #$3413
jsl number0
ldy #$341b
jsl number1
ldy #$3423
jsl number2
ldy #$342b
jsl number3
ldy #$3433
jsl number4
ldy #$343b
jsl number5
ldy #$3443
jsl number6
ldy #$344b
jsl number7
ldy #$3453
jsl number8
ldy #$345b
jsl number9
ldy #$345f
jsl flea1
ldy #$3467
jsl flea2
ldy #$346f
jsl flea3
ldy #$3477
jsl flea4
ldy #$347e
jsl score300
ldy #$3486
jsl score600
ldy #$348e
jsl score900
ldy #$3e04
jsl leftScorpion1
ldy #$3e14
jsl leftScorpion1s
ldy #$3e24
jsl leftScorpion2
ldy #$3e34
jsl leftScorpion2s
ldy #$3e44
jsl leftScorpion3
ldy #$3e54
jsl leftScorpion3s
ldy #$3e64
jsl leftScorpion4
ldy #$3e74
jsl leftScorpion4s
ldy #$4804
jsl rightScorpion1
ldy #$4814
jsl rightScorpion1s
ldy #$4824
jsl rightScorpion2
ldy #$4834
jsl rightScorpion2s
ldy #$4844
jsl rightScorpion3
ldy #$4854
jsl rightScorpion3s
ldy #$4864
jsl rightScorpion4
ldy #$4874
jsl rightScorpion4s
ldy #$5204
jsl spider1
ldy #$5214
jsl spider1s
ldy #$5224
jsl spider2
ldy #$5234
jsl spider2s
ldy #$5244
jsl spider3
ldy #$5254
jsl spider3s
ldy #$5264
jsl spider4
ldy #$5274
jsl spider4s
ldy #$5284
jsl spider5
ldy #$5294
jsl spider5s
ldy #$5c04
jsl spider6
ldy #$5c14
jsl spider6s
ldy #$5c24
jsl spider7
ldy #$5c34
jsl spider7s
ldy #$5c40
jsl explosion1
ldy #$5c48
jsl explosion2
ldy #$5c50
jsl explosion3
ldy #$5c58
jsl explosion4
ldy #$5c60
jsl explosion5
ldy #$5c68
jsl explosion6
ldy #$5c70
jsl leftHead1
ldy #$5c78
jsl leftHead1s
ldy #$5c80
jsl leftHead2
ldy #$5c88
jsl leftHead2s
ldy #$5c90
jsl leftHead3
ldy #$5c98
jsl leftHead3s
ldy #$6600
jsl leftHead4
ldy #$6608
jsl leftHead4s
ldy #$6610
jsl leftHead5
ldy #$6618
jsl leftHead5s
ldy #$6620
jsl leftBody1
ldy #$6628
jsl leftBody1s
ldy #$6630
jsl leftBody2
ldy #$6638
jsl leftBody2s
ldy #$6640
jsl leftBody3
ldy #$6648
jsl leftBody3s
ldy #$6650
jsl leftBody4
ldy #$6658
jsl leftBody4s
ldy #$6660
jsl leftBody5
ldy #$6668
jsl leftBody5s
ldy #$6670
jsl rightHead1
ldy #$6678
jsl rightHead1s
ldy #$6680
jsl rightHead2
ldy #$6688
jsl rightHead2s
ldy #$6690
jsl rightHead3
ldy #$6698
jsl rightHead3s
ldy #$7000
jsl rightHead4
ldy #$7008
jsl rightHead4s
ldy #$7010
jsl rightHead5
ldy #$7018
jsl rightHead5s
ldy #$7020
jsl rightBody1
ldy #$7028
jsl rightBody1s
ldy #$7030
jsl rightBody2
ldy #$7038
jsl rightBody2s
ldy #$7040
jsl rightBody3
ldy #$7048
jsl rightBody3s
ldy #$7050
jsl rightBody4
ldy #$7058
jsl rightBody4s
ldy #$7060
jsl rightBody5
ldy #$7068
jsl rightBody5s
ldy #$7070
jsl leftDownHead1
ldy #$7078
jsl leftDownHead1s
ldy #$7080
jsl leftDownHead2
ldy #$7088
jsl leftDownHead2s
ldy #$7090
jsl leftDownBody1
ldy #$7098
jsl leftDownBody1s
ldy #$7a00
jsl leftDownBody2
ldy #$7a08
jsl leftDownBody2s
ldy #$7a10
jsl rightDownHead1
ldy #$7a18
jsl rightDownHead1s
ldy #$7a20
jsl rightDownHead2
ldy #$7a28
jsl rightDownHead2s
ldy #$7a30
jsl rightDownBody1
ldy #$7a38
jsl rightDownBody1s
ldy #$7a40
jsl rightDownBody2
ldy #$7a48
jsl rightDownBody2s
ldy #$7a50
jsl downHead1
ldy #$7a58
jsl downHead2
ldy #$7a60
jsl downHead3
ldy #$7a68
jsl downBody1
ldy #$7a70
jsl downBody2
ldy #$7a78
jsl downBody3
ldy #$7a80
jsl drawShip
ldy #$7a88
jsl drawShipShift
ldy #$7a90
jsl drawHalfShot
ldy #$7a98
jsl drawHalfShotShift
ldy #$8400
jsl drawShot
ldy #$8408
jsl drawShotShift
rtl
setupScreen entry
short i,m
@ -667,7 +181,7 @@ setupScreen entry
sei
phd
tsc
sta backupStack
sta >backupStack
lda >STATE_REGISTER ; Direct Page and Stack in Bank 01/
ora #$0030
sta >STATE_REGISTER
@ -685,7 +199,7 @@ nextWord anop
lda >STATE_REGISTER
and #$ffcf
sta >STATE_REGISTER
lda backupStack
lda >backupStack
tcs
pld
cli
@ -814,17 +328,14 @@ waitForVbl entry
lda >BORDER_COLOUR_REGISTER
and #$f0
sta >BORDER_COLOUR_REGISTER
vblLoop1 anop
lda #$fe
cmp >READ_VBL
bpl vblLoop1
vblLoop2 anop
cmp >READ_VBL
bmi vblLoop2
lda >BORDER_COLOUR_REGISTER
ora #$0f
sta >BORDER_COLOUR_REGISTER
long i,m
vblLoop anop
lda >VERTICAL_COUNTER ; load the counter value
and #$80ff ; mask out the VBL bits
asl a ; shift the word around
adc #0 ; move MSB -> LSB
cmp #$100
bge vblLoop
rtl

View File

@ -182,7 +182,7 @@ addFlea entry
sta fleaTileOffsets+2
sta fleaTileOffsets+6
lda tileOffset,x
lda tileScreenOffset,x
sec
sbc #6*SCREEN_BYTES_PER_ROW+3
sta fleaScreenOffset

View File

@ -253,7 +253,7 @@ addScorpion_doit anop
ldx scorpionLeftTileOffset,y
stx scorpionTileOffsets
lda tileOffset,x
lda tileScreenOffset,x
dec a
sta scorpionScreenOffset
@ -282,7 +282,7 @@ addScorpion_right anop
sta scorpionTileOffsets+4
tax
lda tileOffset,x
lda tileScreenOffset,x
dec a
dec a
sta scorpionScreenOffset

View File

@ -161,7 +161,7 @@ addBodySegment entry
lda #SEGMENT_FACING_LEFT
sta segmentFacing,x
lda tileOffset,x
lda tileScreenOffset,x
sec
sbc #3
sta segmentScreenOffsets,x
@ -198,7 +198,7 @@ addHeadSegment entry
lda #SEGMENT_FACING_LEFT
sta segmentFacing,x
lda tileOffset,x
lda tileScreenOffset,x
sec
sbc #3
sta segmentScreenOffsets,x

View File

@ -563,7 +563,7 @@ addSpider_left anop
sta spiderTileOffsets+4
tax
lda tileOffset,x
lda tileScreenOffset,x
sec
sbc #SPIDER_RHS_STARTING_SCREEN_OFFSET
sta spiderScreenOffset
@ -597,7 +597,7 @@ addSpider_right anop
sta spiderTileOffsets+4
tax
lda tileOffset,x
lda tileScreenOffset,x
sec
sbc #SPIDER_LHS_STARTING_SCREEN_OFFSET
sta spiderScreenOffset

View File

@ -7,6 +7,67 @@
;
macro
_drawDirtyGameRow &rowNum
trace on
short i,m
lda >BORDER_COLOUR_REGISTER
and #$f0
sta >BORDER_COLOUR_REGISTER
long i,m
_drawDirtyGameRow_wait&rowNum anop
; This code loads into the accumulator the line currently being drawn to the
; screen by HW. It allows code to race just behind the beam and redraw the
; screen.
;
; Based on code found here:
; https://iigs.dreamhosters.com/gte/blitter.html
;
; Unlike that code, it does not change the baseline of the values. According
; to GS technote 39, this number ranges from $fa to $1ff. Scan line zero is
; $100 and scan line 199 is $1c7. We will race the beam by comparing to these
; offset numbers.
;
; Also according to that technote, it looks like these numbers are different
; in PAL mode. TODO - Do I need something here to handle PAL correctly?
lda >VERTICAL_COUNTER ; load the counter value
and #$80ff ; mask out the VBL bits
asl a ; shift the word around
adc #0 ; move MSB -> LSB
lcla &scanLineNum
&scanLineNum seta &rowNum
&scanLineNum seta &scanLineNum*8
&scanLineNum seta &scanLineNum+264
cmp #&scanLineNum
blt _drawDirtyGameRow_wait&rowNum
short i,m
lda >BORDER_COLOUR_REGISTER
ora #$0f
sta >BORDER_COLOUR_REGISTER
long i,m
lcla &tileOffset
&tileOffset seta &rowNum*50
lcla &lastTileOffset
&lastTileOffset seta 50+&tileOffset
.drawDirtyGameRowLoop
lda tileDirty+&tileOffset
beq _drawDirtyGameRow_skip&tileOffset
stz tileDirty+&tileOffset
ldy tileScreenOffset+&tileOffset
lda tileType+&tileOffset
jsl drawTile
_drawDirtyGameRow_skip&tileOffset anop
&tileOffset seta &tileOffset+2
aif &tileOffset<&lastTileOffset,.drawDirtyGameRowLoop
trace off
mend
; This macro uses the Y register as an index into the tile offsets. This is
; needed for segments because each segment has their own dirty tile offsets.
macro

View File

@ -122,6 +122,7 @@ SHADOW_REGISTER gequ $e0c035
NEW_VIDEO_REGISTER gequ $e0c029
BORDER_COLOUR_REGISTER gequ $e0c034
STATE_REGISTER gequ $e1c068
VERTICAL_COUNTER gequ $e0c02e
backupStack dc i2'0'

View File

@ -10,7 +10,7 @@
mcopy explosions.macros
keep explosions
explosions start
explosions start spriteSeg
using globalData
explosion1 entry

View File

@ -10,7 +10,7 @@
mcopy fleas.macros
keep fleas
fleas start
fleas start spriteSeg
using globalData

View File

@ -10,7 +10,7 @@
mcopy letters.macros
keep letters
letters start
letters start spriteSeg
using globalData
letterA entry

View File

@ -10,7 +10,7 @@
mcopy mushrooms.macros
keep mushrooms
mushrooms start
mushrooms start spriteSeg
using globalData
mushroom1 entry

View File

@ -10,7 +10,7 @@
mcopy numbers.macros
keep numbers
numbers start
numbers start spriteSeg
using globalData
number0 entry

View File

@ -10,7 +10,7 @@
mcopy scores.macros
keep scores
scores start
scores start spriteSeg
using globalData
score300 entry

View File

@ -10,7 +10,7 @@
mcopy scorpions.macros
keep scorpions
scorpions start
scorpions start spriteSeg
using globalData
leftScorpion1 entry

View File

@ -10,7 +10,7 @@
mcopy segments.macros
keep segments
segments start
segments start spriteSeg
using globalData
; IMPORTANT!!!! - It is critical that the X register is preserved in all of these

View File

@ -10,7 +10,7 @@
mcopy ship.macros
keep ship
ship start
ship start spriteSeg
using globalData
drawShip entry

View File

@ -10,7 +10,7 @@
mcopy shot.macros
keep shot
shot start
shot start spriteSeg
using globalData
drawHalfShot entry

View File

@ -10,7 +10,7 @@
mcopy solid.macros
keep solid
solid start
solid start spriteSeg
using globalData
solid0 entry

View File

@ -10,7 +10,7 @@
mcopy spiders.macros
keep spiders
spiders start
spiders start spriteSeg
using globalData
spider1 entry

View File

@ -10,7 +10,7 @@
_spriteHeader
sei ; 2
tsc ; 2
sta backupStack ; 5
sta >backupStack ; 5
lda >STATE_REGISTER ; 6 - Direct Page and Stack in Bank 01/
ora #$0030 ; 3
sta >STATE_REGISTER ; 6
@ -25,7 +25,7 @@
lda >STATE_REGISTER ; 6
and #$ffcf ; 3
sta >STATE_REGISTER ; 6
lda backupStack ; 5
lda >backupStack ; 5
tcs ; 2
cli ; 2
mend ; 24

View File

@ -10,7 +10,7 @@
mcopy symbols.macros
keep symbols
symbols start
symbols start spriteSeg
using globalData
symbolC entry

View File

@ -54,7 +54,7 @@
/* Globals */
word tileDirty[TOTAL_NUM_TILES];
word tileOffset[TOTAL_NUM_TILES];
word tileScreenOffset[TOTAL_NUM_TILES];
tTileType tileType[TOTAL_NUM_TILES];
tTileOffset tileAbove[TOTAL_NUM_TILES];
tTileOffset tileBelow[TOTAL_NUM_TILES];
@ -88,7 +88,7 @@ void initTiles(void)
for (tileX = 0; tileX < LHS_NUM_TILES_WIDE; tileX++)
{
tileDirty[lhsTileIndex] = 0;
tileOffset[lhsTileIndex] = lastOffset;
tileScreenOffset[lhsTileIndex] = lastOffset;
tileType[lhsTileIndex] = TILE_EMPTY;
if (tileY == 0)
@ -119,7 +119,7 @@ void initTiles(void)
for (tileX = 0; tileX < GAME_NUM_TILES_WIDE; tileX++)
{
tileDirty[tileIndex] = 0;
tileOffset[tileIndex] = lastOffset;
tileScreenOffset[tileIndex] = lastOffset;
tileType[tileIndex] = TILE_EMPTY;
if (tileY == 0)
@ -150,7 +150,7 @@ void initTiles(void)
for (tileX = 0; tileX < RHS_NUM_TILES_WIDE; tileX++)
{
tileDirty[rhsTileIndex] = 0;
tileOffset[rhsTileIndex] = lastOffset;
tileScreenOffset[rhsTileIndex] = lastOffset;
tileType[rhsTileIndex] = TILE_EMPTY;
if (tileY == 0)

View File

@ -106,7 +106,7 @@ typedef enum {
/* Globals */
extern word tileDirty[TOTAL_NUM_TILES];
extern word tileOffset[TOTAL_NUM_TILES];
extern word tileScreenOffset[TOTAL_NUM_TILES];
extern tTileType tileType[TOTAL_NUM_TILES];
extern tTileOffset tileAbove[TOTAL_NUM_TILES];
extern tTileOffset tileBelow[TOTAL_NUM_TILES];