[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]

    PROGRAM TESTFONT;
    USES VGAfnt,Crt;
    VAR I: Integer;
    BEGIN               {MAXIMUM STRING LENGTH                39}
    VideoMode($13);     {         1         2         3        X}
                        {123456789012345678901234567890123456789}
    FOR I:=1 TO 255 DO SetColors(I,(I MOD 63),(I MOD 13)+20,11);
    FOR I:=0 TO 255 DO DrawString((I MOD 39)*8,
                                     ((I DIV 39)*9)+1,I,0,Chr(i));
    readkey;
    VideoMode($3);
    END.
    {
    This driver doesn't draw a string put does display all ascii codes to the
    vga screen. Syntax for DrawString is as follows:
              DrawString(Xcor,Ycor,Color,Incr, string);
              Xcor:=x coordinate
              Ycor:=Y coordinate
    color:=color to start 1-256 [may be 0-255]
    Incr:Number to add to color inbetween chars
                   Example     This is a String

    This first would be color 1, the last color 16.
    String:=andy string..andy ascii code up to 39 characters.

    Char above and beyond 39 will be truncated and not displayed. The code NEEDS
    improvement.  If you can do so, then DO SO. Idea's.  Have a defaul font for
    EACH graphic video mode. Have it chosen when VideoMode is change, along with
    CHarHeight & charWidth. Create a program that allows you to modify each
    character WITHOUT having to text edit the FONT.TXT pascal typed structyre.

        This program is only a building block. It can be made into a great graphic
    font program. Play with it and learn.
    }

    PROGRAM FX; {FonteXtract}
    {This program makes a Pascal represenation type of the ascii chart by
     extracting the default font from memory.
     ERRORS: now very few}
    VAR   Fl   : Text;
          I    : integer;
          FontAddrSeg,
          FontAddrOfs,
          DOtLines          : word;

    PROCEDURE GetChar;
     PROCEDURE FontAddr(Font:byte);
     { Returns segment- and offset address of fonts with input of
      a Code, representing the font:
      Font 2 : 8x14 Font
           3 : 8x8 Font, 1. part, ASCII 00h..7Fh
           4 : 8x8 Font, 2. part, ASCII 80h..FFh
           5 : 9*14 substitutes
           6 : VGA 8x16 Font
           7 : VGA 9*16 substitutes }
      BEGIN
       ASM
        push bp       {BP will be changed by this function}
        mov ax,1130h
        mov bh,font
        int 10h
        mov FontAddrSeg,es      {will become $C000}
        mov FontAddrOfs,bp      {offset in VGA-BIOS}
        mov DotLines,cx         {bytes per char}
        pop bp
       END;
      END;  {FontAddr}
    VAR NC, BC, IT  :Integer;
        MMC    :word;
        TEMP   :byte;
        DStr        :STRING;

    BEGIN
    DStr:='';
    FontAddr(3);
    WriteLN(FL, 'Alpha: LettersType = (');
    FOR NC:=$0 TO $FF DO BEGIN               {Number of chars in font  }
        WriteLN(FL, '{',NC,'}');              {Title the block by ascii }
        WriteLN(FL,   '(');
        FOR BC:=0 TO 7 DO BEGIN              {Number of rows}
            TEMP:=Mem[FontAddrSeg:
                      FontAddrOfs+(NC*8)+(Bc)];   {Get the first line of the
    character}
            FOR IT:=7 DOWNTO 0 DO BEGIN           {Get the bit representation}
                IF (temp AND (1 SHL IT)) <> 0 THEN BEGIN
                   DStr:=DStr+'$B';
                   IF (BC=7) AND (IT=0) THEN BEGIN
                      IF NC=$FF THEN DStr:=DStr+'));'
                      ELSE DStr:=DStr+'),';
                   END
                   ELSE DStr:=DStr+',';
                END
                ELSE BEGIN
                   DStr:=DStr+' 0';
                   IF (BC=7) AND (IT=0) THEN BEGIN
                      IF NC=$FF THEN DStr:=DStr+'));'
                      ELSE DStr:=DStr+'),';
                   END
                   ELSE DStr:=DStr+',';
                END;
            END;
            WriteLN(FL,DStr);
            DStr:='';                       {Clear dummy string}
        END;
        WriteLN(FL);                        {Separate the blocks}
        END;
    END;

    BEGIN
      assign(FL,'Font.TXT');
      ReWrite(FL);
      GETCHAR;    {get it from Mem and make a representation of it}
      close(FL);
    END.

    {$M 9182,0,0}
    { $A+        Align Data ..Word                }
    { $B-        Boolean Evaluation..Short Circuit}
    { $D-        Debug Information..Off           }
    { $E-        Emulation..Off      not needed in units}
    { $F-        Force Far Calls..Off             }
    { $G-        286 Code..Off                    }
    { $I+        I/O Checking..On                 }
    { $K-        Smart callbacks..Off             }
    { $L-        Local Symbols..Off               }
    { $N-        80x87 Code..Off                  }
    { $O-        Overlay Code Generaton..Off      }
    { $P-        Open string parameters..Disabled }
    { $Q-        Overflow Checking..Off           }
    { $R-        Range Checking..Off              }
    { $S-        Stack Checking..Off              }
    { $T-        Type-Checked Pointers..Off       }
    { $V-        Relaxed Var-String Checking      }
    { $W-        Windows Stack Frame..Off         }
    { $X+        Extended Syntax..On              }
    { $Y-        Symbol reference information..Off}
    UNIT VGAfnt;
    INTERFACE
    PROCEDURE DrawString(Xcor,YCor,color:WORD; Incr:Integer;line:STRING);
     TYPE PalBuf256 = ARRAY[1..768] OF integer;
      PROCEDURE VideoMode(Mode : BYTE);
      PROCEDURE SetColPal(Color, Red, Gren, Blue : Word);
      PROCEDURE SetColors ( Color, Red, Green, Blue : integer );
      PROCEDURE PutDot(x,y:WoRd;color:integer);
      PROCEDURE Set256Pal( Palbuf: PalBuf256 );
    IMPLEMENTATION
    TYPE
      BitType      = ARRAY[0..8*8-1] OF word;
      LettersType  = ARRAY[0..255] OF BitType;     {a..z}
    CONST
      CharWidth   = 8;
      CharHeight  = 8;
      VGA_Segment = $0A000;
      {coded chart of font made by FX pascal extracter}{$I FONT.TXT }
    PROCEDURE VideoMode ( Mode : BYTE );
        BEGIN ASM
            Mov  AH,00
            Mov  AL,Mode
            Int  10h
        END; END;
    PROCEDURE SetColPal(Color, Red, Gren, Blue : Word); ASSEMBLER;
    ASM
            mov dx,$03c8;      mov ax,color;
            out dx,al;               inc dx;
            mov ax,red;           out dx,al;
            mov ax,gren;          out dx,al;
            mov ax,blue;          out dx,al;
    END;
    PROCEDURE SetColors ( Color, Red, Green, Blue : integer );
    BEGIN
     Port[$3C8] := Color;
     Port[$3C9] := Red;
     Port[$3C9] := Green;
     Port[$3C9] := Blue;
    END;
    PROCEDURE PutDot(x,y:word;color:integer);
    BEGIN            {test}
        Mem[VGA_Segment:((y-1)*320)+x] := color;
    END;
    PROCEDURE Set256Pal( Palbuf: PalBuf256 );
    VAR I : Integer;
    BEGIN
      FOR I :=0 TO 255 DO BEGIN
          SetColPal(I, PalBuf[ (I*3)], PalBuf[ (I*3) +1], PalBuf[ (I*3) +2]);
      END;
    END;

    {================ String writin' stuff ===================================}
    PROCEDURE DrawString(Xcor,YCor,color:WORD;Incr:Integer;Line:string);
    VAR I,Temp,B   : Integer;          {INCR: INC COLOR WITH EACH CHAR}
        Individual: BitType;           {LINE: WHAT TO DRAW}
    BEGIN
      FOR I:=1 TO length(Line) DO BEGIN
        IF (line[i]<>' ') AND (Xcor+CharWidth<320) THEN BEGIN
           Individual:=Alpha[ ORd(line[I]) ];
     {Chr} FOR b:=0 TO (CharHeight)* (charWidth)-1 DO BEGIN
           Temp:=Individual[b];
           IF temp<> 0 THEN
               PutDot(Xcor+(B MOD CharWidth),Ycor+(B DIV CharHeight),color);
               {Skip blanks}
     {END} END;
        END;
        Inc(xcor,CharWidth);
        Inc(color,IncR)
      END;
    END;
    BEGIN
    END.

    (*
        The following code can be used to make and display a single VGA font.
        The first program is FX. It is used to extract an 8x8 default font from
    memory and translate it into a pascal typed structure: simple to {$I}nclude
    into a unit.
        The Second pogram in VGAfnt. It includes the VGA putdot & SetColors
    procedures used to draw a string to the screen.
        The third program is a test driver for VGAfnt. It sets the palette and
    displays all font chars to the screen.

        To run and test FIRST run FX. It will create FONT.TXT, the file to be
    included in VGAfnt. SECOND compile VGAfnt with FONT.TXT in the same
    directory. THIRD build TESTFONT; this will gather all up and allow you to
    quickly test the unit.

        Have fun and enjoy. Modifications ARE welcome. Just post you mod.s so
    all can enjoy.
    *)

[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]