diff --git a/BuGS/game.s b/BuGS/game.s index 681c1bd..6e2fd1f 100644 --- a/BuGS/game.s +++ b/BuGS/game.s @@ -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 diff --git a/BuGS/gameFlea.s b/BuGS/gameFlea.s index 16c9f39..fa0965c 100644 --- a/BuGS/gameFlea.s +++ b/BuGS/gameFlea.s @@ -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 diff --git a/BuGS/gameScorpion.s b/BuGS/gameScorpion.s index f6a7f26..ff9b12d 100644 --- a/BuGS/gameScorpion.s +++ b/BuGS/gameScorpion.s @@ -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 diff --git a/BuGS/gameSegments.s b/BuGS/gameSegments.s index 144d02a..f131854 100644 --- a/BuGS/gameSegments.s +++ b/BuGS/gameSegments.s @@ -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 diff --git a/BuGS/gameSpider.s b/BuGS/gameSpider.s index 659469f..cdaf33d 100644 --- a/BuGS/gameSpider.s +++ b/BuGS/gameSpider.s @@ -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 diff --git a/BuGS/global.macros b/BuGS/global.macros index e04fa2d..2e471ed 100644 --- a/BuGS/global.macros +++ b/BuGS/global.macros @@ -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 diff --git a/BuGS/globals.s b/BuGS/globals.s index d4d1fbe..a5026d5 100644 --- a/BuGS/globals.s +++ b/BuGS/globals.s @@ -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' diff --git a/BuGS/sprites/explosions.s b/BuGS/sprites/explosions.s index 8411e8f..03a23fa 100644 --- a/BuGS/sprites/explosions.s +++ b/BuGS/sprites/explosions.s @@ -10,7 +10,7 @@ mcopy explosions.macros keep explosions -explosions start +explosions start spriteSeg using globalData explosion1 entry diff --git a/BuGS/sprites/fleas.s b/BuGS/sprites/fleas.s index a8d3458..ea6f837 100644 --- a/BuGS/sprites/fleas.s +++ b/BuGS/sprites/fleas.s @@ -10,7 +10,7 @@ mcopy fleas.macros keep fleas -fleas start +fleas start spriteSeg using globalData diff --git a/BuGS/sprites/letters.s b/BuGS/sprites/letters.s index 7d9835e..d57b695 100644 --- a/BuGS/sprites/letters.s +++ b/BuGS/sprites/letters.s @@ -10,7 +10,7 @@ mcopy letters.macros keep letters -letters start +letters start spriteSeg using globalData letterA entry diff --git a/BuGS/sprites/mushrooms.s b/BuGS/sprites/mushrooms.s index ea387d6..be980cd 100644 --- a/BuGS/sprites/mushrooms.s +++ b/BuGS/sprites/mushrooms.s @@ -10,7 +10,7 @@ mcopy mushrooms.macros keep mushrooms -mushrooms start +mushrooms start spriteSeg using globalData mushroom1 entry diff --git a/BuGS/sprites/numbers.s b/BuGS/sprites/numbers.s index c9bd873..e30958a 100644 --- a/BuGS/sprites/numbers.s +++ b/BuGS/sprites/numbers.s @@ -10,7 +10,7 @@ mcopy numbers.macros keep numbers -numbers start +numbers start spriteSeg using globalData number0 entry diff --git a/BuGS/sprites/scores.s b/BuGS/sprites/scores.s index a4fdb4a..2bfbdf2 100644 --- a/BuGS/sprites/scores.s +++ b/BuGS/sprites/scores.s @@ -10,7 +10,7 @@ mcopy scores.macros keep scores -scores start +scores start spriteSeg using globalData score300 entry diff --git a/BuGS/sprites/scorpions.s b/BuGS/sprites/scorpions.s index 5cb61d4..e29f28c 100644 --- a/BuGS/sprites/scorpions.s +++ b/BuGS/sprites/scorpions.s @@ -10,7 +10,7 @@ mcopy scorpions.macros keep scorpions -scorpions start +scorpions start spriteSeg using globalData leftScorpion1 entry diff --git a/BuGS/sprites/segments.s b/BuGS/sprites/segments.s index 19295d9..2cd6140 100644 --- a/BuGS/sprites/segments.s +++ b/BuGS/sprites/segments.s @@ -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 diff --git a/BuGS/sprites/ship.s b/BuGS/sprites/ship.s index 1c565af..7b02415 100644 --- a/BuGS/sprites/ship.s +++ b/BuGS/sprites/ship.s @@ -10,7 +10,7 @@ mcopy ship.macros keep ship -ship start +ship start spriteSeg using globalData drawShip entry diff --git a/BuGS/sprites/shot.s b/BuGS/sprites/shot.s index 2a91045..e969757 100644 --- a/BuGS/sprites/shot.s +++ b/BuGS/sprites/shot.s @@ -10,7 +10,7 @@ mcopy shot.macros keep shot -shot start +shot start spriteSeg using globalData drawHalfShot entry diff --git a/BuGS/sprites/solid.s b/BuGS/sprites/solid.s index c110291..854a8b3 100644 --- a/BuGS/sprites/solid.s +++ b/BuGS/sprites/solid.s @@ -10,7 +10,7 @@ mcopy solid.macros keep solid -solid start +solid start spriteSeg using globalData solid0 entry diff --git a/BuGS/sprites/spiders.s b/BuGS/sprites/spiders.s index 88ed9a5..55b7a1c 100644 --- a/BuGS/sprites/spiders.s +++ b/BuGS/sprites/spiders.s @@ -10,7 +10,7 @@ mcopy spiders.macros keep spiders -spiders start +spiders start spriteSeg using globalData spider1 entry diff --git a/BuGS/sprites/sprites.macros b/BuGS/sprites/sprites.macros index 6171c20..09051c5 100644 --- a/BuGS/sprites/sprites.macros +++ b/BuGS/sprites/sprites.macros @@ -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 diff --git a/BuGS/sprites/symbols.s b/BuGS/sprites/symbols.s index c19acab..50f936a 100644 --- a/BuGS/sprites/symbols.s +++ b/BuGS/sprites/symbols.s @@ -10,7 +10,7 @@ mcopy symbols.macros keep symbols -symbols start +symbols start spriteSeg using globalData symbolC entry diff --git a/BuGS/tiles.c b/BuGS/tiles.c index 0e427ca..3834adc 100644 --- a/BuGS/tiles.c +++ b/BuGS/tiles.c @@ -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) diff --git a/BuGS/tiles.h b/BuGS/tiles.h index ce9aa9a..24ced39 100644 --- a/BuGS/tiles.h +++ b/BuGS/tiles.h @@ -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];