8bitworkshop/presets/vcs/vcslib/bitmap48.ca65

116 lines
2.7 KiB
Plaintext

.include "vcs-ca65.inc"
.importzp tmp1, tmp2
.import _reset_sprites
.import Return
.export _bitmap48_kernel
.export _bitmap48_setup
.export _bitmap48_setaddress
.export _bitmap48_setheight
.export _bitmap48_ptr_0, _bitmap48_ptr_1, _bitmap48_ptr_2, _bitmap48_ptr_3, _bitmap48_ptr_4, _bitmap48_ptr_5
LoopCount = tmp1
Temp = tmp2
FontBuf = $1000 ;unused
; when the first STA GRP1 of the sequence happens
.define B48_CYCLE 42
; this will get loaded into RAM
; so we can change the offsets
.segment "XDATA"
; Display the resulting 48x5 bitmap from FontBuf
_bitmap48_kernel:
sta WSYNC
sta LoopCount
dec LoopCount
b48loop:
ldy LoopCount ; counts backwards
sta WSYNC ; sync to next scanline
_bitmap48_ptr_0 = *+1
lda FontBuf+0,y ; load B0 (1st sprite byte)
sta GRP0 ; B0 -> [GRP0]
_bitmap48_ptr_1 = *+1
lda FontBuf+5,y ; load B1 -> A
sta GRP1 ; B1 -> [GRP1], B0 -> GRP0
_bitmap48_ptr_2 = *+1
lda FontBuf+10,y ; load B2 -> A
sta GRP0 ; B2 -> [GRP0], B1 -> GRP1
_bitmap48_ptr_5 = *+1
lda FontBuf+25,y ; load B5 -> A
sta Temp ; B5 -> temp
_bitmap48_ptr_4 = *+1
ldx FontBuf+20,y ; load B4 -> X
_bitmap48_ptr_3 = *+1
lda FontBuf+15,y ; load B3 -> A
ldy Temp ; load B5 -> Y
sta GRP1 ; B3 -> [GRP1]; B2 -> GRP0
stx GRP0 ; B4 -> [GRP0]; B3 -> GRP1
sty GRP1 ; B5 -> [GRP1]; B4 -> GRP0
sta GRP0 ; ?? -> [GRP0]; B5 -> GRP1
b48dec:
dec LoopCount ; go to next line
bpl b48loop ; repeat until < 0
jmp _reset_sprites
; only used by _bitmap48_setaddress
_bitmap48_height: .byte 8
; TODO: can we write even when RAM not selected?
.proc _bitmap48_setaddress
sta _bitmap48_ptr_0+$400+0
stx _bitmap48_ptr_0+$400+1
jsr add_height_ax
sta _bitmap48_ptr_1+$400+0
stx _bitmap48_ptr_1+$400+1
jsr add_height_ax
sta _bitmap48_ptr_2+$400+0
stx _bitmap48_ptr_2+$400+1
jsr add_height_ax
sta _bitmap48_ptr_3+$400+0
stx _bitmap48_ptr_3+$400+1
jsr add_height_ax
sta _bitmap48_ptr_4+$400+0
stx _bitmap48_ptr_4+$400+1
jsr add_height_ax
sta _bitmap48_ptr_5+$400+0
stx _bitmap48_ptr_5+$400+1
rts
add_height_ax:
clc
adc _bitmap48_height
bcc :+
inx
: rts
.endproc
.proc _bitmap48_setheight
sta _bitmap48_height+$400
rts
.endproc
.code
.proc _bitmap48_setup
lda #THREE_COPIES
sta NUSIZ0
sta NUSIZ1
sta WSYNC
SLEEPR B48_CYCLE-7
sta RESP0
sta RESP1
sta HMCLR
lda #$10
sta HMP1
sta WSYNC
sta HMOVE
lda #1
sta VDELP0
sta VDELP1
sta REFP0
sta REFP1
rts
.endproc