home *** CD-ROM | disk | FTP | other *** search
- 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.
- *)