; ; score.s ; BuGS ; ; Created by Jeremy Rand on 2020-10-12. ;Copyright © 2020 Jeremy Rand. All rights reserved. ; case on mcopy score.macros keep score score start using globalData using tileData scoreStartGame entry stz gameScore stz gameScore+2 stz scoreWithin12000 stz scoreWithin20000 stz scoreNum20000 ldx #P1_SCORE_ONES_OFFSET lda #TILE_NUMBER_0 sta tileType,x _dirtyNonGameTile scoreStartGame_loop anop dex dex lda #TILE_EMPTY sta tileType,x _dirtyNonGameTile cpx #P1_SCORE_FIRST_OFFSET bne scoreStartGame_loop rtl ; The score tile to increment is in the X register ; Note that this function and the next one do no sanitization ; of the value in the X register. That also means that if ; someone scores several trillion in a single game, we will ; keep adding digits to the score displayed, eventually ; occupying tiles on the previous line on the LHS. ; ; But it is kind of classic for these arcade games to act ; weird if people do something deemed impossible by the ; author. So, I challenge you to get such a score! scoreAddOneToTile entry _dirtyNonGameTile lda tileType,x beq scoreAddOneToTile_empty cmp #TILE_NUMBER_9 beq scoreAddOneToTile_isNine anop clc adc #4 bra scoreAddOneToTile_done scoreAddOneToTile_empty anop lda #TILE_NUMBER_1 scoreAddOneToTile_done anop sta tileType,x rtl scoreAddOneToTile_isNine anop lda #TILE_NUMBER_0 sta tileType,x dex dex jmp scoreAddOneToTile ; The score tile to add to is in the X register ; The amount to add to the tile is in the accumulator ; and must be 4 to 36 in multiples of 4. This is because ; the tile types are all 4 apart. So, to add one, we ; actually add 4 to the tile type. scoreAddToTile entry ldy tileType,x bne scoreAddToTile_notEmpty tay lda #TILE_NUMBER_0 sta tileType,x tya scoreAddToTile_notEmpty anop clc adc tileType,x cmp #TILE_NUMBER_9+1 blt scoreAddToTile_done sec sbc #40 sta tileType,x _dirtyNonGameTile dex dex jmp scoreAddOneToTile scoreAddToTile_done anop sta tileType,x _dirtyNonGameTile rtl scoreAddOne entry _incrementScore 1 ldx #P1_SCORE_ONES_OFFSET jmp scoreAddOneToTile scoreAddFive entry _incrementScore 5 ldx #P1_SCORE_ONES_OFFSET lda #5*4 jmp scoreAddToTile scoreAddTen entry _incrementScore 10 lda tileType+P1_SCORE_ONES_OFFSET bne scoreAddTen_skipZeroOnes lda #TILE_NUMBER_0 sta tileType+P1_SCORE_ONES_OFFSET ldx #P1_SCORE_ONES_OFFSET _dirtyNonGameTile scoreAddTen_skipZeroOnes anop ldx #P1_SCORE_TENS_OFFSET jmp scoreAddOneToTile scoreAddOneHundred entry _incrementScore 100 lda tileType+P1_SCORE_ONES_OFFSET bne scoreAddHundred_skipZeroOnes lda #TILE_NUMBER_0 sta tileType+P1_SCORE_ONES_OFFSET ldx #P1_SCORE_ONES_OFFSET _dirtyNonGameTile scoreAddHundred_skipZeroOnes anop lda tileType+P1_SCORE_TENS_OFFSET bne scoreAddHundred_skipZeroTens lda #TILE_NUMBER_0 sta tileType+P1_SCORE_TENS_OFFSET ldx #P1_SCORE_TENS_OFFSET _dirtyNonGameTile scoreAddHundred_skipZeroTens anop ldx #P1_SCORE_HUNDREDS_OFFSET jmp scoreAddOneToTile scoreAddTwoHundred entry _incrementScore 200 lda tileType+P1_SCORE_ONES_OFFSET bne scoreAddTwoHundred_skipZeroOnes lda #TILE_NUMBER_0 sta tileType+P1_SCORE_ONES_OFFSET ldx #P1_SCORE_ONES_OFFSET _dirtyNonGameTile scoreAddTwoHundred_skipZeroOnes anop lda tileType+P1_SCORE_TENS_OFFSET bne scoreAddTwoHundred_skipZeroTens lda #TILE_NUMBER_0 sta tileType+P1_SCORE_TENS_OFFSET ldx #P1_SCORE_TENS_OFFSET _dirtyNonGameTile scoreAddTwoHundred_skipZeroTens anop ldx #P1_SCORE_HUNDREDS_OFFSET lda #2*4 jmp scoreAddToTile scoreAddThreeHundred entry _incrementScore 300 lda tileType+P1_SCORE_ONES_OFFSET bne scoreAddThreeHundred_skipZeroOnes lda #TILE_NUMBER_0 sta tileType+P1_SCORE_ONES_OFFSET ldx #P1_SCORE_ONES_OFFSET _dirtyNonGameTile scoreAddThreeHundred_skipZeroOnes anop lda tileType+P1_SCORE_TENS_OFFSET bne scoreAddThreeHundred_skipZeroTens lda #TILE_NUMBER_0 sta tileType+P1_SCORE_TENS_OFFSET ldx #P1_SCORE_TENS_OFFSET _dirtyNonGameTile scoreAddThreeHundred_skipZeroTens anop ldx #P1_SCORE_HUNDREDS_OFFSET lda #3*4 jmp scoreAddToTile scoreAddSixHundred entry _incrementScore 600 lda tileType+P1_SCORE_ONES_OFFSET bne scoreAddSixHundred_skipZeroOnes lda #TILE_NUMBER_0 sta tileType+P1_SCORE_ONES_OFFSET ldx #P1_SCORE_ONES_OFFSET _dirtyNonGameTile scoreAddSixHundred_skipZeroOnes anop lda tileType+P1_SCORE_TENS_OFFSET bne scoreAddSixHundred_skipZeroTens lda #TILE_NUMBER_0 sta tileType+P1_SCORE_TENS_OFFSET ldx #P1_SCORE_TENS_OFFSET _dirtyNonGameTile scoreAddSixHundred_skipZeroTens anop ldx #P1_SCORE_HUNDREDS_OFFSET lda #6*4 jmp scoreAddToTile scoreAddNineHundred entry _incrementScore 900 lda tileType+P1_SCORE_ONES_OFFSET bne scoreAddNineHundred_skipZeroOnes lda #TILE_NUMBER_0 sta tileType+P1_SCORE_ONES_OFFSET ldx #P1_SCORE_ONES_OFFSET _dirtyNonGameTile scoreAddNineHundred_skipZeroOnes anop lda tileType+P1_SCORE_TENS_OFFSET bne scoreAddNineHundred_skipZeroTens lda #TILE_NUMBER_0 sta tileType+P1_SCORE_TENS_OFFSET ldx #P1_SCORE_TENS_OFFSET _dirtyNonGameTile scoreAddNineHundred_skipZeroTens anop ldx #P1_SCORE_HUNDREDS_OFFSET lda #9*4 jmp scoreAddToTile scoreAddOneThousand entry _incrementScore 1000 lda tileType+P1_SCORE_ONES_OFFSET bne scoreAddOneThousand_skipZeroOnes lda #TILE_NUMBER_0 sta tileType+P1_SCORE_ONES_OFFSET ldx #P1_SCORE_ONES_OFFSET _dirtyNonGameTile scoreAddOneThousand_skipZeroOnes anop lda tileType+P1_SCORE_TENS_OFFSET bne scoreAddOneThousand_skipZeroTens lda #TILE_NUMBER_0 sta tileType+P1_SCORE_TENS_OFFSET ldx #P1_SCORE_TENS_OFFSET _dirtyNonGameTile scoreAddOneThousand_skipZeroTens anop lda tileType+P1_SCORE_HUNDREDS_OFFSET bne scoreAddOneThousand_skipZeroHundreds lda #TILE_NUMBER_0 sta tileType+P1_SCORE_HUNDREDS_OFFSET ldx #P1_SCORE_HUNDREDS_OFFSET _dirtyNonGameTile scoreAddOneThousand_skipZeroHundreds anop ldx #P1_SCORE_THOUSANDS_OFFSET jmp scoreAddOneToTile highScore dc i4'0' end