; ; global.macros ; BuGS ; ; Created by Jeremy Rand on 2020-07-30. ;Copyright © 2020 Jeremy Rand. All rights reserved. ; macro _drawDirtyGameRow &rowNum 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 mend macro _dirtyGameOrNonGameTile &tileOffset ldx &tileOffset cpx #RHS_FIRST_TILE_OFFSET bge _dirtyGameTile_nonGame&SYSCNT lda #TILE_STATE_DIRTY sta tileDirty,x bra _dirtyGameTile_skip&SYSCNT _dirtyGameTile_nonGame&SYSCNT anop lda tileDirty,x bne _dirtyGameTile_skip&SYSCNT lda #TILE_STATE_DIRTY sta tileDirty,x ldy numDirtyNonGameTiles txa sta dirtyNonGameTiles,y iny iny sty numDirtyNonGameTiles _dirtyGameTile_skip&SYSCNT anop mend macro _dirtyGameOrNonGameTileX &tileOffset ldy &tileOffset,x cpy #RHS_FIRST_TILE_OFFSET bge _dirtyGameTile_nonGame&SYSCNT lda #TILE_STATE_DIRTY sta tileDirty,y bra _dirtyGameTile_skip&SYSCNT _dirtyGameTile_nonGame&SYSCNT anop lda tileDirty,y bne _dirtyGameTile_skip&SYSCNT lda #TILE_STATE_DIRTY sta tileDirty,y tya ldy numDirtyNonGameTiles sta dirtyNonGameTiles,y iny iny sty numDirtyNonGameTiles _dirtyGameTile_skip&SYSCNT anop mend ; Pass the tile offset to mark as dirty in the X register macro _dirtyNonGameTile lda tileDirty,x bne _dirtyNonGameTile_skip&SYSCNT lda #TILE_STATE_DIRTY sta tileDirty,x ldy numDirtyNonGameTiles txa sta dirtyNonGameTiles,y iny iny sty numDirtyNonGameTiles _dirtyNonGameTile_skip&SYSCNT anop mend ; Update the score macro _incrementScore &increment lda #&increment clc adc gameScore sta gameScore bcc _incrementScore_noCarry&SYSCNT inc gameScore+2 _incrementScore_noCarry&SYSCNT anop lda #&increment clc adc scoreWithin12000 cmp #12000 blt _incrementScore_noExtraMan&SYSCNT sec sbc #12000 pha jsl playerAddLife pla _incrementScore_noExtraMan&SYSCNT anop sta scoreWithin12000 lda #&increment clc adc scoreWithin20000 cmp #20000 blt _incrementScore_no2000&SYSCNT sec sbc #20000 inc scoreNum20000 _incrementScore_no2000&SYSCNT anop sta scoreWithin20000 mend