]> git.sur5r.net Git - cc65/commitdiff
Working on the TGI API, adding vector fonts. Only roughly tested!
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 2 Nov 2009 22:29:49 +0000 (22:29 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 2 Nov 2009 22:29:49 +0000 (22:29 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@4432 b7a2c559-68d2-44c3-8de9-860c34a00d81

asminc/tgi-kernel.inc
include/tgi.h
include/tgi/tgi-vectorfont.h
libsrc/tgi/Makefile
libsrc/tgi/tgi-kernel.s
libsrc/tgi/tgi_init.s
libsrc/tgi/tgi_textstyle.s
libsrc/tgi/tgi_vectorchar.s [new file with mode: 0644]

index 4b6215a027b183969fa5858f83824d00e1046134..410293e79c621ea1519e038e779e4694048c5230 100644 (file)
@@ -79,7 +79,7 @@ TGI_API_VERSION         = $03
 
 ;------------------------------------------------------------------------------
 ; Color and text constants
-                           
+
 TGI_COLOR_BLACK         = 0
 TGI_COLOR_WHITE         = 1
 
@@ -98,9 +98,10 @@ TGI_TEXT_VERTICAL       = 1
         .global _tgi_curx               ; Current drawing cursor X
         .global _tgi_cury               ; Current drawing cursor Y
         .global _tgi_color              ; Current drawing color
+        .global _tgi_font               ; Which font to use
         .global _tgi_textdir            ; Current text direction
-        .global _tgi_textmagw           ; Text magnification for the width
-        .global _tgi_textmagh           ; Text magnification for the height
+        .global _tgi_textscalew         ; Text magnification for the width
+        .global _tgi_textscaleh         ; 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
@@ -181,6 +182,7 @@ TGI_TEXT_VERTICAL       = 1
         .global _tgi_lineto
         .global _tgi_circle
         .global _tgi_bar
+        .global _tgi_textscale
         .global _tgi_textstyle
         .global _tgi_textwidth
         .global _tgi_textheight
index 2999c1ad0d0bcac0799b6f5708076cc9397baaab..589ad12cc768efe8ae7c93ea5715a61eb131428a 100644 (file)
@@ -216,12 +216,19 @@ 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 magwidth, unsigned magheight,
-                                 unsigned char dir);
-/* Set the style for text output. The scaling factors for width and height
+void __fastcall__ tgi_textscale (unsigned width, unsigned height);
+/* Set the scaling for text output. The scaling factors for width and height
  * are 8.8 fixed point values. This means that $100 = 1 $200 = 2 etc.
  */
 
+void __fastcall__ tgi_textstyle (unsigned width, unsigned height,
+                                 unsigned char dir, unsigned char font);
+/* 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.
+ * dir is one of the TGI_TEXT_XXX constants. font is one of the TGI_FONT_XXX
+ * constants.
+ */
+             
 unsigned __fastcall__ tgi_textwidth (const char* s);
 /* Calculate the width of the text in pixels according to the current text
  * style.
index 73a5bf5f118cfd26b9ba8e5e50a9ced0290b6d09..6801b7b34e4695308ddd07f0eb83374bc8ee1044 100644 (file)
@@ -70,6 +70,19 @@ struct tgi_vectorfont {
 
 
 
+/*****************************************************************************/
+/*                                  Code                                    */
+/*****************************************************************************/
+
+
+
+void __fastcall__ tgi_vectorchar (const unsigned char* Ops);
+/* Draw one character of the vector font at the current graphics cursor
+ * position using the current font magnification.
+ */
+
+
+
 /* End of tgi-vectorfont.h */
 #endif
 
index 6f7b955b30dcb5bc9ec6cabf8dd180d6c168a8a6..c24b00c52dbc1c120a77f02c4bd1a3ea3b74ef8d 100644 (file)
@@ -76,7 +76,8 @@ S_OBJS =              tgi-kernel.o            \
                 tgi_textheight.o        \
                 tgi_textwidth.o         \
                 tgi_textstyle.o         \
-                tgi_unload.o
+                tgi_unload.o            \
+                tgi_vectorchar.o
 
 
 #--------------------------------------------------------------------------
index fa926895f4eead48c0f15545d925a86e9f742278..9eb697b6abc948007179aec753b08d55d4675cd1 100644 (file)
@@ -22,13 +22,14 @@ _tgi_gmode:         .res    1           ; Flag: Graphics mode active
 _tgi_curx:          .res    2           ; Current drawing cursor X
 _tgi_cury:          .res    2           ; Current drawing cursor Y
 _tgi_color:         .res    1           ; Current drawing color
+_tgi_font:          .res    1           ; Which font to use
 _tgi_textdir:       .res    1           ; Current text direction
 ; 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
+_tgi_textscalew:    .res    3           ; Text scale for the width
+_tgi_textscaleh:    .res    3           ; Text scale for the height
 
 ; The following two must also be in exactly this order
 _tgi_charwidth:     .res    1           ; Char width of system font
index 5aab06a8391c91ad93480941ca4f977d78402f76..65e6e2d98b7afa55ec50d2ddc1c9f3204a3ef1eb 100644 (file)
@@ -8,7 +8,7 @@
         .include        "tgi-kernel.inc"
         .include        "tgi-error.inc"
 
-        .import         pushax
+        .import         pushax, pusha
         .importzp       ptr1
 
 .proc   _tgi_init
@@ -48,7 +48,8 @@
         ldx     #>$100
         jsr     pushax                  ; Width scale
         jsr     pushax                  ; Heigh scale
-        jsr     _tgi_textstyle          ; A = Direction = TEXT_VERTICAL
+        jsr     pusha                   ; Text direction = TGI_TEXT_VERTICAL
+        jsr     _tgi_textstyle          ; A = Font = TGI_FONT_BITMAP
 
 ; Clear the screen
 
index 501b0234080dc1364c8623f9f68c7b64f5a6c39a..47a58a38012287440c46a30c27f503288690befe 100644 (file)
@@ -1,16 +1,11 @@
 ;
-; Ullrich von Bassewitz, 2009-20-30
+; Ullrich von Bassewitz, 2009-10-30
 ;
-; void __fastcall__ tgi_textstyle (unsigned magwidth, unsigned magheight,
-;                                  unsigned char dir);
-; /* 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
+        .import         popa, popax
 
 
 ;-----------------------------------------------------------------------------
 
 .endproc
 
-
 ;-----------------------------------------------------------------------------
+; void __fastcall__ tgi_textstyle (unsigned width, unsigned height,
+;                                  unsigned char dir, unsigned char font);
+; /* 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.
+;  * dir is one of the TGI_TEXT_XXX constants. font is one of the TGI_FONT_XXX
+;  * constants.
+;  */
 ;
 
 .proc   _tgi_textstyle
 
+        sta     _tgi_font               ; Remember the font to use
+        jsr     popa
         sta     _tgi_textdir            ; Remember the direction
 
-; The magheight value is in 8.8 fixed point. Store it and calculate a rounded
+; Pop the height and run directly into tgi_textscale
+
+        jsr     popax
+
+.endproc
+
+;-----------------------------------------------------------------------------
+; void __fastcall__ tgi_textscale (unsigned width, unsigned height);
+; /* Set the scaling for text output. The scaling factors for width and height
+;  * are 8.8 fixed point values. This means that $100 = 1 $200 = 2 etc.
+;  */
+
+.proc   _tgi_textscale
+
+; The height 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
+        sta     _tgi_textscaleh+0
+        stx     _tgi_textscaleh+1
         asl     a                       ; Check value behind comma
         bcc     @L1
         inx                             ; Round
-@L1:    stx     _tgi_textmagh+2         ; Store rounded value
+@L1:    stx     _tgi_textscaleh+2       ; Store rounded value
 
 ; Calculate the total height of the bitmapped font and remember it.
 
         ldy     #1
         jsr     charsize_helper
 
-; The magwidth value is in 8.8 fixed point. Store it and calculate a rounded
+; The width 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_textmagw+0
-        stx     _tgi_textmagw+1
+        jsr     popax                   ; height
+        sta     _tgi_textscalew+0
+        stx     _tgi_textscalew+1
         asl     a                       ; Check value behind comma
         bcc     @L2
         inx                             ; Round
-@L2:    stx     _tgi_textmagw+2         ; Store rounded value
+@L2:    stx     _tgi_textscalew+2       ; Store rounded value
 
 ; Calculate the total width of the bitmapped font and remember it.
 
 
 ; Load values and call the driver, parameters are passed in registers
 
-        ldx     _tgi_textmagw+2
-        ldy     _tgi_textmagh+2
+        ldx     _tgi_textscalew+2
+        ldy     _tgi_textscaleh+2
         lda     _tgi_textdir
         jmp     tgi_textstyle
 
 .endproc
 
+
diff --git a/libsrc/tgi/tgi_vectorchar.s b/libsrc/tgi/tgi_vectorchar.s
new file mode 100644 (file)
index 0000000..dafef75
--- /dev/null
@@ -0,0 +1,174 @@
+;
+; Ullrich von Bassewitz, 2009-11-02
+;
+; void __fastcall__ tgi_vectorchar (const unsigned char* Ops);
+; /* Draw one character of the vector font at the current graphics cursor
+;  * position using the current font magnification.
+;  */
+;
+
+        .export         _tgi_vectorchar
+
+        .import         push0ax, tosmuleax
+
+        .include        "tgi-kernel.inc"
+        .include        "zeropage.inc"
+
+
+;----------------------------------------------------------------------------
+; Data
+
+Ops     = regbank
+Flag    = regbank+2
+
+.bss
+X1:     .res    2
+Y1:     .res    2
+X2:     .res    2
+Y2:     .res    2
+
+
+
+;----------------------------------------------------------------------------
+;
+
+.code
+.proc   _tgi_vectorchar
+
+; Since we will call tgi_lineto, which uses the zero page, and we do also
+; need the zero page, make room in the register bank.
+
+        tay
+        lda     Ops
+        pha
+        lda     Ops+1
+        pha
+        lda     Flag
+        pha
+
+; Save the pointer
+
+        sty     Ops
+        stx     Ops+1
+
+; Main loop executing vector operations
+
+Loop:   lda     _tgi_textscalew+0
+        ldx     _tgi_textscalew+1
+        jsr     GetProcessedCoord
+
+; X2 = tgi_curx + XMag * XDelta.
+
+        clc
+        adc     _tgi_curx+0
+        sta     X2+0
+        txa
+        adc     _tgi_curx+1
+        sta     X2+1
+
+; Process the Y value
+
+        lda     _tgi_textscaleh+0
+        ldx     _tgi_textscaleh+1
+        jsr     GetProcessedCoord
+
+; Y2 = tgi_cury - YMag * YDelta;
+; Y2 = tgi_cury + (~(YMag * YDelta) + 1);
+
+        eor     #$FF
+        sec                             ; + 1
+        adc     _tgi_cury+0
+        sta     Y2+0
+        txa
+        eor     #$FF
+        adc     _tgi_cury+1
+        sta     Y2+1
+
+; Do the actual operation
+
+        bit     Flag
+        bpl     @Move                   ; Jump if move only
+
+        ldy     #7                      ; Copy start coords into zp
+:       lda     X1,y
+        sta     ptr1,y
+        dey
+        bpl     :-
+
+        jsr     tgi_line                ; Call the driver
+
+; Move the start position
+
+@Move:  ldy     #3
+:       lda     X2,y
+        sta     X1,y
+        dey
+        bpl     :-
+
+; Loop if not done
+
+        bit     Flag
+        bvc     Loop
+
+; Done. Restore zp and return.
+
+@Done:  pla
+        sta     Flag
+        pla
+        sta     Ops+1
+        pla
+        sta     Ops
+        rts
+
+.endproc
+
+;----------------------------------------------------------------------------
+; Get and process one coordinate value. The scale factor is passed in a/x
+
+.proc   GetProcessedCoord
+
+; Push the scale factor
+
+        jsr     push0ax
+
+; Load delta value
+
+        ldy     #0
+        lda     (Ops),y
+        inc     Ops
+        bne     :+
+        inc     Ops+1
+
+; Move bit 7 into Flag
+
+:       asl     a                       ; Flag into carry
+        ror     Flag
+
+; Sign extend the value
+
+        ldx     #0
+        cmp     #$80                    ; Sign bit into carry
+        bcc     :+
+        dex
+:       ror     a                       ; Sign extend the value
+
+; Multiplicate with the scale factor.
+
+        stx     sreg
+        stx     sreg+1
+        jsr     tosmuleax               ; Multiplicate
+
+; The result is a 16.8 fixed point value. Round and return it.
+
+        cmp     #$80                    ; Check digits after the dec point
+        txa
+        adc     #$00
+        tay
+        lda     sreg
+        adc     #$00
+        tax
+        tya
+        rts
+
+.endproc
+