From 763fe0b802b736a671eb65ffcb0969c42b4f83d3 Mon Sep 17 00:00:00 2001 From: uz Date: Fri, 30 Oct 2009 21:26:35 +0000 Subject: [PATCH] Start of TGI changes. Untested, may not work. git-svn-id: svn://svn.cc65.org/cc65/trunk@4404 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- asminc/tgi-kernel.inc | 22 +++++----- include/tgi.h | 6 ++- libsrc/tgi/Makefile | 3 +- libsrc/tgi/tgi-kernel.s | 17 ++++++-- libsrc/tgi/tgi_init.s | 13 +++--- libsrc/tgi/tgi_outtext.s | 32 ++++++++++++-- libsrc/tgi/tgi_textheight.s | 24 +++++++++++ libsrc/tgi/tgi_textsize.s | 72 ------------------------------- libsrc/tgi/tgi_textstyle.s | 86 +++++++++++++++++++++++++++---------- libsrc/tgi/tgi_textwidth.s | 27 ++++++++++++ 10 files changed, 180 insertions(+), 122 deletions(-) create mode 100644 libsrc/tgi/tgi_textheight.s delete mode 100644 libsrc/tgi/tgi_textsize.s create mode 100644 libsrc/tgi/tgi_textwidth.s diff --git a/asminc/tgi-kernel.inc b/asminc/tgi-kernel.inc index 3ff27eb68..0a31b904e 100644 --- a/asminc/tgi-kernel.inc +++ b/asminc/tgi-kernel.inc @@ -6,10 +6,10 @@ ;* */ ;* */ ;* */ -;* (C) 2002-2004 Ullrich von Bassewitz */ -;* Römerstraße 52 */ -;* D-70794 Filderstadt */ -;* EMail: uz@cc65.org */ +;* (C) 2002-2009, Ullrich von Bassewitz */ +;* Roemerstrasse 52 */ +;* D-70794 Filderstadt */ +;* EMail: uz@cc65.org */ ;* */ ;* */ ;* This software is provided 'as-is', without any expressed or implied */ @@ -44,8 +44,8 @@ YRES .word 1 ; Y resolution COLORCOUNT .byte 1 ; Number of available colors PAGECOUNT .byte 1 ; Number of screens available - FONTSIZE_X .byte 1 ; System font size in X direction - FONTSIZE_Y .byte 1 ; System font size in Y direction + FONTWIDTH .byte 1 ; System font width + FONTHEIGHT .byte 1 ; System font height ASPECTRATIO .word 1 ; Fixed point 8.8 format .endstruct JUMPTAB .struct @@ -93,14 +93,16 @@ TGI_TEXT_VERTICAL = 1 .global _tgi_cury ; Current drawing cursor Y .global _tgi_color ; Current drawing color .global _tgi_textdir ; Current text direction - .global _tgi_textmagx ; Text magnification in X dir - .global _tgi_textmagy ; Text magnification in Y dir + .global _tgi_textmagw ; Text magnification for the width + .global _tgi_textmagh ; Text magnification for the height + .global _tgi_charwidth ; Width of scaled system font char + .global _tgi_charheight ; Height of scaled system font char .global _tgi_xres ; X resolution of the current mode .global _tgi_yres ; Y resolution of the current mode .global _tgi_colorcount ; Number of available colors .global _tgi_pagecount ; Number of available screen pages - .global _tgi_fontsizex ; System font X size - .global _tgi_fontsizey ; System font Y size + .global _tgi_fontwidth ; System font width + .global _tgi_fontheight ; System font height .global _tgi_aspectratio ; Aspect ratio, fixed point 8.8 ;------------------------------------------------------------------------------ diff --git a/include/tgi.h b/include/tgi.h index 941c8a7fe..a56272ae1 100644 --- a/include/tgi.h +++ b/include/tgi.h @@ -190,9 +190,11 @@ void __fastcall__ tgi_circle (int x, int y, unsigned char radius); void __fastcall__ tgi_bar (int x1, int y1, int x2, int y2); /* Draw a bar (a filled rectangle) using the current color. */ -void __fastcall__ tgi_textstyle (unsigned char magx, unsigned char magy, +void __fastcall__ tgi_textstyle (unsigned magwidth, unsigned magheight, unsigned char dir); -/* Set the style for text output. */ +/* Set the style for text output. The scaling factors for width and height + * are 8.8 fixed point values. This means that $100 = 1 $200 = 2 etc. + */ unsigned __fastcall__ tgi_textwidth (const char* s); /* Calculate the width of the text in pixels according to the current text diff --git a/libsrc/tgi/Makefile b/libsrc/tgi/Makefile index f1a3ff6c4..755c5899a 100644 --- a/libsrc/tgi/Makefile +++ b/libsrc/tgi/Makefile @@ -71,7 +71,8 @@ S_OBJS = tgi-kernel.o \ tgi_setviewpage.o \ tgi_stddrv.o \ tgi_stdmode.o \ - tgi_textsize.o \ + tgi_textheight.o \ + tgi_textwidth.o \ tgi_textstyle.o \ tgi_unload.o diff --git a/libsrc/tgi/tgi-kernel.s b/libsrc/tgi/tgi-kernel.s index 1016635fc..fff88697f 100644 --- a/libsrc/tgi/tgi-kernel.s +++ b/libsrc/tgi/tgi-kernel.s @@ -23,17 +23,26 @@ _tgi_curx: .res 2 ; Current drawing cursor X _tgi_cury: .res 2 ; Current drawing cursor Y _tgi_color: .res 1 ; Current drawing color _tgi_textdir: .res 1 ; Current text direction -_tgi_textmagx: .res 1 ; Text magnification in X dir -_tgi_textmagy: .res 1 ; Text magnification in Y dir +; The following two store an 8.8 fixed point value in the first two bytes, +; and a rounded integer value in the third byte. The latter is passed to the +; driver to scale the bitmap font. The variables are expected to be in +; this order and adjacent. +_tgi_textmagw: .res 3 ; Text magnification for the width +_tgi_textmagh: .res 3 ; Text magnification for the height + +; The following two must also be in exactly this order +_tgi_charheight: .res 1 ; Char height of system font +_tgi_charwidth: .res 1 ; Char width of system font ; The following variables are copied from the driver header for faster access +; fontwidth and fontheight are expected to be in order and adjacent. tgi_driver_vars: _tgi_xres: .res 2 ; X resolution of the current mode _tgi_yres: .res 2 ; Y resolution of the current mode _tgi_colorcount: .res 1 ; Number of available colors _tgi_pagecount: .res 1 ; Number of available screen pages -_tgi_fontsizex: .res 1 ; System font X size -_tgi_fontsizey: .res 1 ; System font Y size +_tgi_fontwidth: .res 1 ; System font width in pixels +_tgi_fontheight: .res 1 ; System font height in pixels _tgi_aspectratio: .res 2 ; Aspect ratio in 8.8 fixed point diff --git a/libsrc/tgi/tgi_init.s b/libsrc/tgi/tgi_init.s index f45eda7b0..b061beda1 100644 --- a/libsrc/tgi/tgi_init.s +++ b/libsrc/tgi/tgi_init.s @@ -8,6 +8,7 @@ .include "tgi-kernel.inc" .include "tgi-error.inc" + .import pushax .importzp ptr1 .proc _tgi_init @@ -45,13 +46,11 @@ ; Set the text style - lda #TGI_TEXT_HORIZONTAL - sta _tgi_textdir - ldx #1 - stx _tgi_textmagx - ldy #1 - sty _tgi_textmagy - jsr tgi_textstyle ; Tell the driver about the text style + lda #<$100 + ldx #>$100 + jsr pushax ; Width scale + jsr pushax ; Heigh scale + jsr _tgi_textstyle ; A = Direction = TEXT_VERTICAL ; Clear the screen diff --git a/libsrc/tgi/tgi_outtext.s b/libsrc/tgi/tgi_outtext.s index f66cc0086..b5cccca76 100644 --- a/libsrc/tgi/tgi_outtext.s +++ b/libsrc/tgi/tgi_outtext.s @@ -7,15 +7,41 @@ .include "tgi-kernel.inc" - .import popax + .import popax, negax .importzp ptr3 .proc _tgi_outtext sta ptr3 - stx ptr3+1 ; Save s + 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 - jmp tgi_outtext ; Call the driver + jsr tgi_outtext ; Call the driver + + pla + tax + pla ; Restore s + jsr _tgi_textwidth ; Get width of text string + 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 + rts .endproc diff --git a/libsrc/tgi/tgi_textheight.s b/libsrc/tgi/tgi_textheight.s new file mode 100644 index 000000000..52bab4f1a --- /dev/null +++ b/libsrc/tgi/tgi_textheight.s @@ -0,0 +1,24 @@ +; +; Ullrich von Bassewitz, 2009-10-30 +; + + + .include "tgi-kernel.inc" + + +;----------------------------------------------------------------------------- +; unsigned __fastcall__ tgi_textheight (const char* s); +; /* Calculate the width of the text in pixels according to the current text +; * style. +; */ +; + +.proc _tgi_textheight + + lda _tgi_charheight + ldx #0 + rts + +.endproc + + diff --git a/libsrc/tgi/tgi_textsize.s b/libsrc/tgi/tgi_textsize.s deleted file mode 100644 index 24c0d4a75..000000000 --- a/libsrc/tgi/tgi_textsize.s +++ /dev/null @@ -1,72 +0,0 @@ -; -; Ullrich von Bassewitz, 22.06.2002 -; - - - .include "tgi-kernel.inc" - - .import _strlen, pushax, tosumulax - -;----------------------------------------------------------------------------- -; unsigned __fastcall__ tgi_textwidth (const char* s); -; /* Calculate the width of the text in pixels according to the current text -; * style. -; */ - - -_tgi_textwidth: - - ldy _tgi_textdir ; Get text direction - bne height - -; Result is -; -; strlen (s) * tgi_textmagx * tgi_fontsizex -; -; Since we don't expect textmagx to have large values, we do the multiplication -; by looping. - -width: jsr _strlen - jsr pushax - - lda #0 - tax - ldy _tgi_textmagx -@L1: clc - adc _tgi_fontsizex - bcc @L2 - inx -@L2: dey - bne @L1 - - jmp tosumulax ; Result * strlen (s) - -;----------------------------------------------------------------------------- -; unsigned __fastcall__ tgi_textheight (const char* s); -; /* Calculate the height of the text in pixels according to the current text -; * style. -; */ - -_tgi_textheight: - ldy _tgi_textdir ; Get text direction - bne width ; Jump if vertical - -; Result is -; -; tgi_textmagy * tgi_fontsizey -; -; Since we don't expect textmagx to have large values, we do the multiplication -; by looping. - -height: lda #0 - tax - ldy _tgi_textmagy -@L1: clc - adc _tgi_fontsizey - bcc @L2 - inx -@L2: dey - bne @L1 - rts - - diff --git a/libsrc/tgi/tgi_textstyle.s b/libsrc/tgi/tgi_textstyle.s index 2f7c2bcfa..501b02340 100644 --- a/libsrc/tgi/tgi_textstyle.s +++ b/libsrc/tgi/tgi_textstyle.s @@ -1,42 +1,82 @@ ; -; Ullrich von Bassewitz, 22.06.2002 +; Ullrich von Bassewitz, 2009-20-30 ; -; void __fastcall__ tgi_textstyle (unsigned char magx, unsigned char magy, +; void __fastcall__ tgi_textstyle (unsigned magwidth, unsigned magheight, ; unsigned char dir); -; /* Set the style for text output. */ +; /* Set the style for text output. The scaling factors for width and height +; * are 8.8 fixed point values. This means that $100 = 1 $200 = 2 etc. +; */ .include "tgi-kernel.inc" - .import popax, incsp2 + .import popax + + +;----------------------------------------------------------------------------- +; Calculate either the total height or the total width of a bitmapped +; character, depending on the value in Y. On entry, X contains the scaling +; factor. Since it is usually small, we multiplicate by doing repeated adds. +; The function returns zero in X and the calculated value in A. + +.proc charsize_helper + + lda _tgi_fontwidth,y + jmp @L2 +@L1: clc + adc _tgi_fontwidth,y +@L2: dex + bne @L1 + sta _tgi_charwidth,y + rts + +.endproc + + +;----------------------------------------------------------------------------- +; .proc _tgi_textstyle - pha - jsr popax ; Get magx/magy in one call - tay - pla + sta _tgi_textdir ; Remember the direction + +; The magheight value is in 8.8 fixed point. Store it and calculate a rounded +; value for scaling the bitmapped system font in the driver. + + jsr popax ; magheight + sta _tgi_textmagh+0 + stx _tgi_textmagh+1 + asl a ; Check value behind comma + bcc @L1 + inx ; Round +@L1: stx _tgi_textmagh+2 ; Store rounded value + +; Calculate the total height of the bitmapped font and remember it. + + ldy #1 + jsr charsize_helper -; A = textdir, X = textmagx, Y = textmagy +; The magwidth value is in 8.8 fixed point. Store it and calculate a rounded +; value for scaling the bitmapped system font in the driver. - cmp #TGI_TEXT_HORIZONTAL - beq DirOk - cmp #TGI_TEXT_VERTICAL - beq DirOk -Fail: jmp tgi_inv_arg ; Invalid argument -DirOk: cpy #$00 - beq Fail ; Cannot have magnification of zero - cpx #$00 - beq Fail ; Cannot have magnification of zero + jsr popax ; magheight + sta _tgi_textmagw+0 + stx _tgi_textmagw+1 + asl a ; Check value behind comma + bcc @L2 + inx ; Round +@L2: stx _tgi_textmagw+2 ; Store rounded value -; Parameter check ok, store them +; Calculate the total width of the bitmapped font and remember it. - stx _tgi_textmagx - sty _tgi_textmagy - sta _tgi_textdir + ldy #0 + jsr charsize_helper -; Call the driver, parameters are passed in registers +; Load values and call the driver, parameters are passed in registers + ldx _tgi_textmagw+2 + ldy _tgi_textmagh+2 + lda _tgi_textdir jmp tgi_textstyle .endproc diff --git a/libsrc/tgi/tgi_textwidth.s b/libsrc/tgi/tgi_textwidth.s new file mode 100644 index 000000000..0c04ed94a --- /dev/null +++ b/libsrc/tgi/tgi_textwidth.s @@ -0,0 +1,27 @@ +; +; Ullrich von Bassewitz, 2009-10-30 +; + + + .include "tgi-kernel.inc" + + .import _strlen, pushax, tosumula0 + +;----------------------------------------------------------------------------- +; unsigned __fastcall__ tgi_textwidth (const char* s); +; /* Calculate the width of the text in pixels according to the current text +; * style. +; */ +; +; Result is strlen (s) * tgi_textmagw * tgi_fontsizex +; + +.proc _tgi_textwidth + + jsr _strlen + jsr pushax + lda _tgi_charwidth + jmp tosumula0 + +.endproc + -- 2.39.2