dos33fsprogs/demos/second/part00_boot/font_console_1x8.s
2023-10-06 00:21:16 -04:00

252 lines
3.4 KiB
ArmAsm

;license:MIT
;(c) 2023 by 4am
;
; drawing routines for Million Perfect Tiles Condensed
;
; Public functions:
; - DrawCondensedString
;
; VMW: commented, reformatted, minor changes, ca65 assembly
; hacked up some more
FONT_OFFSET = $13
;------------------------------------------------------------------------------
; DrawCondensedString
;
; in: A/Y points to zero terminated string, with x-pos and y-pos at start
; out: clobbers all registers & flags
;------------------------------------------------------------------------------
DrawCondensedString:
; store the string location
sta OUTL
sty OUTH
DrawCondensedStringAgain:
lda OUTL
sta dcb_loop_smc+1
lda OUTH
sta dcb_loop_smc+2
ldy CV
; row0
lda hposn_low, Y ; get low memory offset
clc
adc CH ; add in x-coord
sta dcb_row0+4
lda hposn_high, Y ; get high memory offset
sta dcb_row0+5 ; save it out
iny ; go to next row
; row1
lda hposn_low, Y
adc CH
sta dcb_row1+4
lda hposn_high, Y
sta dcb_row1+5
iny
; row2
lda hposn_low, Y
adc CH
sta dcb_row2+4
lda hposn_high, Y
sta dcb_row2+5
iny
; row3
lda hposn_low, Y
adc CH
sta dcb_row3+4
lda hposn_high, Y
sta dcb_row3+5
iny
; row4
lda hposn_low, Y
adc CH
sta dcb_row4+4
lda hposn_high, Y
sta dcb_row4+5
iny
; row5
lda hposn_low, Y
adc CH
sta dcb_row5+4
lda hposn_high, Y
sta dcb_row5+5
iny
; row6
lda hposn_low, Y
adc CH
sta dcb_row6+4
lda hposn_high, Y
sta dcb_row6+5
iny
; row7
lda hposn_low, Y
adc CH
sta dcb_row7+4
lda hposn_high, Y
sta dcb_row7+5
ldx #0
dcb_loop:
dcb_loop_smc:
ldy $FDFD, X ; load next char into Y
beq dcb_done
cpy #13
bne not_linefeed
lda #0
sta CH
clc
lda CV
adc #8
sta CV
inx
lda CV
cmp #192
bcc dcb_loop
lda #184
sta CV
stx XSAVE
jsr scroll_screen
ldx XSAVE
jmp dcb_loop
not_linefeed:
; unrolled loop to write out each line
dcb_row0:
lda CondensedRow0-FONT_OFFSET, Y ; get 1-byte font row
sta $FDFD, X ; write out to graphics mem
dcb_row1:
lda CondensedRow1-FONT_OFFSET, Y
sta $FDFD, X
dcb_row2:
lda CondensedRow2-FONT_OFFSET, Y
sta $FDFD, X
dcb_row3:
lda CondensedRow3-FONT_OFFSET, Y
sta $FDFD, X
dcb_row4:
lda CondensedRow4-FONT_OFFSET, Y
sta $FDFD, X
dcb_row5:
lda CondensedRow5-FONT_OFFSET, Y
sta $FDFD, X
dcb_row6:
lda CondensedRow6-FONT_OFFSET, Y
sta $FDFD, X
dcb_row7:
lda CondensedRow7-FONT_OFFSET, Y
sta $FDFD, X
inc CH
inx ; move to next
bne dcb_loop ; bra (well, as long as string
; is less than 255 chars)
dcb_done:
; point to location after
sec ; always add 1
txa
adc OUTL
sta OUTL
lda #0
adc OUTH
sta OUTH
rts
;================================
;================================
; scroll_screen
;================================
;================================
; scrolls hgr page1 up by 8, filling with empty space at bottom
; trashes A,X,Y
scroll_screen:
ldx #8
stx SCROLL_IN
ldx #0
stx SCROLL_OUT
scroll_yloop:
ldx SCROLL_IN
lda hposn_low,X
sta xloop_smc1+1
lda hposn_high,X
sta xloop_smc1+2
ldx SCROLL_OUT
lda hposn_low,X
sta xloop_smc2+1
lda hposn_high,X
sta xloop_smc2+2
ldy #39
scroll_xloop:
xloop_smc1:
lda $2000,Y
xloop_smc2:
sta $2000,Y
dey
bpl scroll_xloop
inc SCROLL_IN
inc SCROLL_OUT
lda SCROLL_IN
cmp #192
bne scroll_yloop
; blank bottom line
lda #$00
ldy #39
scroll_hline_xloop:
sta $23D0,Y
sta $27D0,Y
sta $2BD0,Y
sta $2FD0,Y
sta $33D0,Y
sta $37D0,Y
sta $3BD0,Y
sta $3FD0,Y
dey
bpl scroll_hline_xloop
rts