mirror of
https://github.com/cc65/cc65.git
synced 2024-12-23 04:30:10 +00:00
149 lines
3.7 KiB
ArmAsm
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
|
|
|