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

122 lines
1.9 KiB
Plaintext

.include "vcs-ca65.inc"
.global _scorepf_build
.global _scorepf_kernel
.importzp _bcd_score
.importzp tmp1
.import _reset_gfx
.import Return
.zeropage
digit_ofs: .res 4
;pftmp: .res 2
; no one is using this, right??
pftmp = tmp1
.segment "ROM1"
; calculate the byte offsets for each digit
; basically (digit * 5)
.proc _scorepf_build
ldx #0
lda _bcd_score+0
jsr calc_bcd_pair
lda _bcd_score+1
jsr calc_bcd_pair
rts
.endproc
.proc calc_bcd_pair
pha
and #$0f
sta pftmp
jsr mul5store ; (clever inlining)
pla
and #$f0
lsr
lsr
lsr
lsr
mul5store:
sta pftmp
asl
asl
adc pftmp ; mul by 5
sta digit_ofs,x
inx
rts
.endproc
.proc _scorepf_kernel
jsr _reset_gfx ; returns A=0
sta pftmp+0
sta pftmp+1
tax
; render the digits
ldx #0
@loop:
; first digit pair
sta WSYNC
ldy digit_ofs+0
inc digit_ofs+0
lda DigitsBitmap,y
and #$0f
ldy pftmp+0 ; load old value digits 0/1
sta pftmp+0
sty PF1 ; store in PF1
ldy digit_ofs+1
inc digit_ofs+1
lda DigitsBitmap,y
and #$f0
ora pftmp+0
sta pftmp+0
; second digit pair
ldy pftmp+1 ; load old value digits 2/3
sty PF1 ; store in PF1
ldy digit_ofs+2
inc digit_ofs+2
lda DigitsBitmap,y
and #$0f
sta pftmp+1
sta WSYNC
ldy digit_ofs+3
inc digit_ofs+3
lda DigitsBitmap,y
and #$f0
ora pftmp+1
sta pftmp+1
; one more line
lda pftmp+0
sta PF1
SLEEPR 6
lda pftmp+1
sta PF1
; loop over 5 lines
inx
cpx #5
bne @loop
; one more line
sta WSYNC
lda pftmp+0
sta PF1
SLEEPR 24
lda pftmp+1
sta PF1
sta WSYNC
jmp _reset_gfx
.endproc
; Bitmap pattern for digits
DigitsBitmap: ;;{w:8,h:5,count:10,brev:1};;
.byte $EE,$AA,$AA,$AA,$EE
.byte $22,$22,$22,$22,$22
.byte $EE,$22,$EE,$88,$EE
.byte $EE,$22,$66,$22,$EE
.byte $AA,$AA,$EE,$22,$22
.byte $EE,$88,$EE,$22,$EE
.byte $EE,$88,$EE,$AA,$EE
.byte $EE,$22,$22,$22,$22
.byte $EE,$AA,$EE,$AA,$EE
.byte $EE,$AA,$EE,$22,$EE
;;end