cc65/libsrc/tgi/tgi_outtext.s

149 lines
3.7 KiB
ArmAsm

;
; Ullrich von Bassewitz, 21.06.2002
;
; void __fastcall__ tgi_outtext (const char* s);
; /* Output text at the current graphics cursor position. */
.include "tgi-kernel.inc"
.include "tgi-vectorfont.inc"
.include "zeropage.inc"
.import _toascii
.import popax, negax
;----------------------------------------------------------------------------
; Data
text := regbank
font := regbank ; Same as text
widths := regbank+2
;----------------------------------------------------------------------------
;
.proc _tgi_outtext
ldy _tgi_font ; Bit or vectorfont?
bne VectorFont
; Handle bitmapped font output
sta ptr3
stx ptr3+1 ; Pass s in ptr3 to driver
pha
txa
pha ; Save s on stack for later
jsr tgi_curtoxy ; Copy curx/cury into ptr1/ptr2
jsr tgi_outtext ; Call the driver
pla
tax
pla ; Restore s
jsr _tgi_gettextwidth ; Get width of text string
; Move the graphics cursor by the amount in a/x
MoveCursor:
ldy _tgi_textdir ; Horizontal or vertical text?
beq @L1 ; Jump if horizontal
; Move graphics cursor for vertical text
jsr negax
ldy #2 ; Point to _tgi_cury
; Move graphics cursor for horizontal text
@L1: clc
adc _tgi_curx,y
sta _tgi_curx,y
txa
adc _tgi_curx+1,y
sta _tgi_curx+1,y
Done: rts
; Handle vector font output. First, check if we really have a registered
; vector font. Bail out if this is not the case.
VectorFont:
tay
lda _tgi_vectorfont ; Do we have a vector font?
ora _tgi_vectorfont+1
beq Done ; Bail out if not
; Check if the font in the given size is partially out of the screen. We
; do this in vertical direction here, and in horizontal direction before
; outputting a character.
; (todo)
; Save zero page variable on stack and save
lda text
pha
lda text+1
pha
lda widths
pha
lda widths+1
pha
sty text
stx text+1 ; Store pointer to string
lda _tgi_vectorfont
clc
adc #<(TGI_VECTORFONT::WIDTHS - TGI_VF_FIRSTCHAR)
sta widths
lda _tgi_vectorfont+1
adc #>(TGI_VECTORFONT::WIDTHS - TGI_VF_FIRSTCHAR)
sta widths+1
; Output the text string
@L1: ldy #0
lda (text),y ; Get next character from string
beq EndOfText
jsr _toascii ; Convert to ascii
pha ; Save char in A
jsr _tgi_vectorchar ; Output it
pla
; Move the graphics cursor by the width of the char
tay
lda (widths),y ; Get width of this char
sta ptr1
lda #0
sta ptr1+1
lda _tgi_textscalew
ldx _tgi_textscalew+1 ; Get scale factor
jsr tgi_imulround ; Multiplcate and round
jsr MoveCursor ; Move the graphics cursor
; Next char in string
inc text
bne @L1
inc text+1
bne @L1
; Done. Restore registers and return
EndOfText:
pla
sta widths+1
pla
sta widths
pla
sta text+1
pla
sta text
rts
.endproc