mirror of https://github.com/jeremysrand/BuGS.git
104 lines
2.9 KiB
Plaintext
104 lines
2.9 KiB
Plaintext
;
|
|
; 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
|
|
|
|
; This macro uses the X register as an index into the tile offsets. This is
|
|
; needed for segments because each segment has their own dirty tile offsets.
|
|
macro
|
|
_dirtyGameTileWithX &tileOffset
|
|
ldy &tileOffset,x
|
|
lda #TILE_STATE_DIRTY
|
|
sta tileDirty,y
|
|
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
|