'===========================================================================
' Subject: VARIABLE FONT                      Date: 04-02-00 (15:17)       
'  Author: Dieter Folger                      Code: PB                     
'  Origin: folger@bnv-bamberg.de            Packet: PB.ABC
'===========================================================================
' VFONT.BAS - Variable font in graphic mode
' Original QBASIC-Program: H. Foerter
' Converted to PowerBASIC and improved: D. Folger
DEFINT A-Z
SCREEN 12
GetFontAdr
LINE (0,   0)-(639, 479), 7, BF
LINE (10, 10)-(629, 329), 4, BF
Prints 45,  10, 20, 20,  0, "ABC", 1 'shadow effect
Prints 40,   5, 20, 20, 14, "ABC", 1
Prints 590, 285,  2,  2, 14, "The ABC Archive", 4
Prints 52, 246,  4,  6,  0, "All Basic Code", 1
Prints 50, 244,  4,  6, 14, "All Basic Code", 1
Prints 575, 360,  1,  1,  0, "Your source for BASIC sources", 2
Prints 500, 462,  0,  1,  0, "Press key to end", 1
ShowFont 'show all ASCII chars
DO: LOOP WHILE INKEY$=""
END
'-----------------------------------------------------------------------
SUB Prints(x1, y1, SizeX, SizeY, Colr, Text$, FontMode)
'-------------------------------------------------------------------------
SHARED Seg16??,Ofs16??
 COLOR Colr
 WordLen = LEN(Text$)
 DEF SEG=Seg16??
 IF SizeX = 0 OR SizeY = 0 then FontMode = 0
 SELECT CASE FontMode
 '--------------------------
 CASE 0   'No Scaling
 '---------------------------
FOR i = 1 TO WordLen
    CharNr = ASC(MID$(Text$, i, 1))
    Adr?? =Ofs16??+16*CharNr
    x1 = x1 + 7
    FOR j = 1 TO 8
        FOR k = 1 TO 16
           z = PEEK(Adr?? + k - 1)
           IF BIT(z, 8 - j) THEN PSET (x1+j, y1 + k)
        NEXT k
    NEXT j
NEXT i
       '----------------
 CASE 1 'Normal
       '----------------
      xx = -SizeX - 1
      FOR i = 1 TO WordLen
          CharNr = ASC(MID$(Text$, i, 1))
          Adr?? = Ofs16?? + 16 * CharNr
          FOR j = 1 TO 8
              xx = xx + SizeX: yy = -SizeY - 1
              FOR k = 1 TO 16
                  z=PEEK(Adr??+k-1)
                  yy = yy + SizeY
                  IF BIT(z, 8 - j) THEN
                     LINE (x1 + xx, y1 + yy)-(x1+xx+SizeX,y1+yy+SizeY),Colr, BF
                  END IF
              NEXT k
          NEXT j
      NEXT i
 '----------------
 CASE 2 'Upside down
 '----------------
      xx = -SizeX - 1
      FOR i = 1 TO WordLen
          CharNr = ASC(MID$(Text$, i, 1))
          Adr?? = Ofs16?? +16 * CharNr
          FOR j = 1 TO 8
              xx = xx - SizeX : yy = SizeY - 1
              FOR k = 1 TO 16
                  z=PEEK(Adr??+k-1)
                  yy = yy - SizeY
                  IF BIT(z, 8 - j) THEN
                     LINE (x1 + xx, y1 + yy)-(x1+xx+SizeX,y1+yy+SizeY),Colr,BF
                  END IF
              NEXT k
          NEXT j
      NEXT i
 '----------------
 CASE 3 'Vertical down
 '----------------
       yy = SizeX - 1
       FOR i = 1 TO WordLen
           CharNr = ASC(MID$(Text$, i, 1))
           Adr?? = Ofs16?? + 16*CharNr
           FOR j = 1 TO 8
               xx = SizeX - 1:yy = yy - SizeY
               FOR k = 1 TO 16
                   z=PEEK(Adr??+k-1)
                   xx = xx + SizeY
                   IF BIT (z,8-j) THEN
                      LINE (x1 - xx, y1 - yy)-(x1-xx-SizeX,y1-yy-SizeY),Colr,BF
                   END IF
               NEXT k
           NEXT j
       NEXT i
 '----------------
 CASE 4 'Vertical up
 '----------------
      yy = -SizeX - 1
      FOR i = 1 TO WordLen
          CharNr = ASC(MID$(Text$, i, 1))
          Adr??=Ofs16??+16*CharNr
          FOR j = 1 TO 8
              xx = SizeY + 1: yy = yy + SizeX
              FOR k = 1 TO 16
                  z=PEEK(Adr??+k-1)
                  xx = xx - SizeY
                  IF BIT(z,8-j) THEN
                     LINE (x1 - xx, y1 - yy - m)-(x1-xx+SizeX,y1-yy-SizeY),Colr,BF
                  END IF
              NEXT k
          NEXT j
      NEXT i
 END SELECT
 DEF SEG
END SUB
'------------
SUB GetFontAdr
'------------
 SHARED Seg16??,Ofs16??
 ! push bp
 ! mov ax,&H1130
 ! mov bx,&H0600
 ! int &H10
 ! mov Seg16??,es
 ! mov Ofs16??,bp
 ! pop bp
END SUB
'-----------
SUB ShowFont
'-----------
'Just a demonstration: Shows ASCII characters 1-254
SHARED Seg16??,Ofs16??
y = 380
COLOR 15
DEF SEG=Seg16??
FOR i = 1 TO 254
    Adr&=Ofs16??+16*i
    x = (i MOD 62) * 10
    IF x = 0 THEN y = y + 20
    FOR j = 1 TO 8
        FOR k = 1 TO 16
           z = PEEK(Adr& + k - 1)
           IF BIT(z, 8 - j) THEN PSET (x + j + 10, y + k)
        NEXT k
    NEXT j
NEXT i
DEF SEG
END SUB
