4cade/src/ui.font.lc2.a

199 lines
5.1 KiB
Plaintext
Raw Normal View History

2019-10-09 17:04:39 +00:00
;license:MIT
2021-10-18 01:12:04 +00:00
;(c) 2018-2021 by 4am
2019-10-09 17:04:39 +00:00
;
; hi-res font drawing routines
;
; /!\ These live in LC RAM 2 and rely on the font data which is also in LC RAM 2. /!\
2019-10-09 17:05:08 +00:00
; Code in LC RAM 1 (which is most program code) should call the functions in ui.font
2019-10-09 17:04:39 +00:00
; which handle bank switching for you.
;
DrawPageInternal
2021-10-18 01:12:04 +00:00
; A/Y contains address of array of length-prefixed strings
; length #$FF terminates
; X contains 0-indexed left margin (HTAB)
2019-10-09 17:04:39 +00:00
; carry bit clear -> draw on page 1
; carry bit set -> draw on page 2
; drawing starts at VTAB 0
; each line starts at column X which was passed in (0-indexed)
2019-10-09 17:04:39 +00:00
; clobbers PTR
2021-10-18 04:33:34 +00:00
; clobbers $FE/$FF
2019-10-09 17:04:39 +00:00
; clobbers A/X/Y
2021-10-18 03:57:24 +00:00
; preserves C, other flags clobbered
2020-08-11 18:55:38 +00:00
stx $FF
2019-10-09 17:04:39 +00:00
ldx #0
stx VTAB
2020-03-24 20:30:14 +00:00
+ST16 PTR
2021-10-18 04:33:34 +00:00
php ; save C, but Z=1 because of ldx #0
2019-10-09 17:04:39 +00:00
@drawLine
2020-08-11 18:55:38 +00:00
lda $FF
sta HTAB
2021-10-18 04:33:34 +00:00
jsr DrawStringInternal_PTR_is_already_set
bmi @donePage
clc
2019-10-09 17:04:39 +00:00
adc PTR
sta PTR
bcc +
inc PTR+1
2021-10-18 04:33:34 +00:00
+ plp ; restore C to whatever it was on entry
php
beq @drawLine ; always branches
@donePage
plp
2019-10-09 17:04:39 +00:00
rts
Draw40CharsInternal
; A/Y contains address of character buffer
; carry bit clear -> draw on page 1
2020-08-11 18:55:38 +00:00
;v carry bit set -> draw on page 2
2019-10-09 17:04:39 +00:00
; $25 contains textpage line (0..23) (this is the standard VTAB address)
; drawing starts at HTAB 0
2021-10-18 04:33:34 +00:00
; increments VTAB on exit
2019-10-09 17:04:39 +00:00
; sets HTAB to 0 on exit
; clobbers A/X/Y
jsr +
ldx #40
jsr DrawBufferInternal
+ ldx #0
stx HTAB
rts
DrawCenteredStringInternal
; A/Y contains address of length-prefixed string
; carry bit clear -> draw on page 1
; carry bit set -> draw on page 2
; $25 contains textpage line (0..23) (this is the standard VTAB address)
; clobbers A/X/Y
; clobbers PTR/PTR+1
2020-03-24 20:30:14 +00:00
+ST16 PTR
2019-10-09 17:04:39 +00:00
ldy #0
php
2019-10-09 17:04:39 +00:00
lda #40
sec
sbc (PTR),y
2019-10-09 17:04:39 +00:00
lsr
sta HTAB
plp
2021-10-18 04:33:34 +00:00
beq DrawStringInternal_PTR_and_Y_are_already_set
2019-10-09 17:04:39 +00:00
DrawStringInternal
; A/Y contains address of length-prefixed string
2021-10-18 04:33:34 +00:00
; length can be 0
2019-10-09 17:04:39 +00:00
; carry bit clear -> draw on page 1
; carry bit set -> draw on page 2
; $24 contains starting column (0..39) (this is the standard HTAB address)
; $25 contains textpage line (0..23) (this is the standard VTAB address)
; clobbers A/X/Y
; clobbers PTR/PTR+1
2020-03-24 20:30:14 +00:00
+ST16 PTR
2021-10-18 04:33:34 +00:00
DrawStringInternal_PTR_is_already_set
2019-10-09 17:04:39 +00:00
ldy #0
2021-10-18 04:33:34 +00:00
DrawStringInternal_PTR_and_Y_are_already_set
lda (PTR),y
2019-10-09 17:04:39 +00:00
inc PTR
bne +
inc PTR+1
2021-10-18 04:33:34 +00:00
+ tax
bpl +
rts
2019-10-09 17:04:39 +00:00
+
2020-03-24 20:30:14 +00:00
+LD16 PTR
2019-10-09 17:04:39 +00:00
; /!\ execution falls through here to DrawBufferInternal
DrawBufferInternal
; A/Y contains address of character buffer
2021-10-18 01:12:04 +00:00
; X contains buffer length (0..40)
2019-10-09 17:04:39 +00:00
; carry bit clear -> draw on page 1
; carry bit set -> draw on page 2
; characters MUST have high bit off (0x00..0x7F)
; special characters (0x00..0x1F) will be drawn
; $24 contains starting column (0..39) (this is the standard HTAB address)
; $25 contains textpage line (0..23) (this is the standard VTAB address)
; all characters are drawn on the same line
; HTAB is incremented for each character
2021-10-18 04:33:34 +00:00
; clobbers X,Y
; increments VTAB on exit
; A=buffer length on exit
; N=0 on exit
2020-03-24 20:30:14 +00:00
+ST16 DBISrc+1
2021-10-18 03:57:24 +00:00
php
2019-10-09 17:04:39 +00:00
lda VTAB
asl
asl
asl
; routine to calculate memory address within HGR page
; and self-modify addresses within draw loop that follows
; (routine clobbers A and Y but preserves X)
asl
tay
and #$F0
bpl @calc1
ora #$05
@calc1 bcc @calc2
ora #$0A
@calc2 asl
asl
sta @hgrlo+1
tya
and #$0E
adc #$10
asl @hgrlo+1
rol
plp
bcc +
eor #$60
2019-10-09 17:04:39 +00:00
clc
+
sta DBIRow0+2
2019-10-09 17:04:39 +00:00
adc #$04
sta DBIRow1+2
2019-10-09 17:04:39 +00:00
adc #$04
sta DBIRow2+2
2019-10-09 17:04:39 +00:00
adc #$04
sta DBIRow3+2
2019-10-09 17:04:39 +00:00
adc #$04
sta DBIRow4+2
2019-10-09 17:04:39 +00:00
adc #$04
sta DBIRow5+2
2019-10-09 17:04:39 +00:00
adc #$04
sta DBIRow6+2
2019-10-09 17:04:39 +00:00
adc #$04
sta DBIRow7+2
2019-10-09 17:04:39 +00:00
@hgrlo lda #$FD
adc HTAB
sta DBIRow0+1
sta DBIRow1+1
sta DBIRow2+1
sta DBIRow3+1
sta DBIRow4+1
sta DBIRow5+1
sta DBIRow6+1
sta DBIRow7+1
2021-10-18 04:33:34 +00:00
txa
pha
bpl + ; always branches because X is 0..40
DBILoop
DBISrc ldy $FDFD,x
2019-10-09 17:04:39 +00:00
lda FontDataRow0,y
DBIRow0 sta $FDFD,x
2019-10-09 17:04:39 +00:00
lda FontDataRow1,y
DBIRow1 sta $FDFD,x
2019-10-09 17:04:39 +00:00
lda FontDataRow2,y
DBIRow2 sta $FDFD,x
2019-10-09 17:04:39 +00:00
lda FontDataRow3,y
DBIRow3 sta $FDFD,x
2019-10-09 17:04:39 +00:00
lda FontDataRow4,y
DBIRow4 sta $FDFD,x
2019-10-09 17:04:39 +00:00
lda FontDataRow5,y
DBIRow5 sta $FDFD,x
2019-10-09 17:04:39 +00:00
lda FontDataRow6,y
DBIRow6 sta $FDFD,x
2019-10-09 17:04:39 +00:00
lda FontDataRow7,y
DBIRow7 sta $FDFD,x
2019-10-09 17:04:39 +00:00
inc HTAB
2021-10-18 04:33:34 +00:00
+ dex
bpl DBILoop
2021-10-18 04:33:34 +00:00
pla ; A = buffer length (passed in in X)
inc VTAB
2019-10-09 17:04:39 +00:00
rts