iigs-game-engine/src/blitter/SCB.s

81 lines
2.5 KiB
ArmAsm

; SCB binding. Really just a fast copy from an array in memory to the SCBs for a range of
; physical lines. Follow the same calling conventions as _BltRange
;
; X = first line (inclusive), valid range of 0 to 199
; Y = last line (exclusive), valid range >X up to 200
;
; The lines are based on the appearance of lines in the play field, so blitting lines 0 through
; 19 will draw the first 20 lines on the play field, regardless of where the playfield is physically
; on the SHR screen or the current value of StartY
;
; This could be made faster by forcing a SCB array to be copied into PEAs ahead of time, but this
; is a bit more flexible
_BltSCBOut
rts
_BltSCB
lda SCBArrayPtr
ora SCBArrayPtr+2
beq _BltSCBOut
phb ; preserve the bank register
tsc ; save the stack pointer
stal :stk_save+1
sep #$20 ; Get the offset into the SCB array
lda SCBArrayPtr+2
pha ; Stash the bank to set later
rep #$20
lda SCBArrayPtr+2
bpl :bind_to_bg0
lda BG1StartYMod208
bra :bind_to_bg1
:bind_to_bg0
lda StartYMod208
:bind_to_bg1
clc
adc SCBArrayPtr
tax
lda ScreenHeight ; Calculate the number of scan lines / entry point
asl
and #$FFFC ; Make sure it's a multiple of 4
eor #$FFFF
inc
clc
adc #:scb_end
stal :entry+1
lda ScreenY1 ; Get the SCB address to put into the stack register
dec
clc
adc #SHADOW_SCREEN_SCB
plb ; Pop the bank with the SCB array
sei ; turn off interrupts while we slam SCBs
tcs ; set the stack to teh SCB area in Bank 01
_R0W1
:entry jmp :scb_end
; 100 lda/pha to cover, potentialls, the full screen
]line equ 198
lup 100
lda: ]line,x
pha
]line equ ]line-2
--^
:scb_end
_R0W0
:stk_save lda #0000 ; load the stack
tcs
cli ; re-enable interrupts
plb ; restore the bank
rts
_BindSCBArray
stx SCBArrayPtr
sta SCBArrayPtr+2
rts