[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]
{
The following does not use assembly but it should do what you want,
and should give you an idea about how its done incase you want to
translate it to BASM later. It uses the ROM text font information
for its screen writes.
{***********************************************************************}
PROGRAM RomFontDemo; { May 08/94, Greg Estabrooks. }
VAR
Colors :BYTE;
PROCEDURE SetVidMode( Mode :BYTE ); ASSEMBLER;
{ Routine to set video mode }
ASM
Mov AH,00 { Function to set mode }
Mov AL,Mode { Mode to change to }
Int $10 { Call dos }
END;{SetVidMode}
PROCEDURE PutPixel( X,Y :WORD; Color :BYTE );
BEGIN
Mem[$A000:(320*Y)+X]:= Color;
END;
PROCEDURE WriteXY( X,Y :WORD; Color :BYTE; Str :STRING );
VAR
OldX :WORD; { Holds Original Column. }
OldY :WORD;
StrPos :BYTE; { Character pos in string to write. }
FontChr:BYTE; { ROM font info. }
FontPos:BYTE;
BitPos :BYTE;
BEGIN
OldY := Y; { Save Starting Row. }
FOR StrPos := 1 TO Length(Str) DO
BEGIN { Loop through every character. }
OldX := X; { Save Current Column. }
Y := OldY; { Restore starting row. }
FOR FontPos := 0 TO 7 DO
BEGIN { Scroll through all 8 BYTES of font. }
FontChr := MEM[$FFA6:$E+(ORD(Str[StrPos]) SHL 3) + FontPos];
FOR BitPos := 7 DOWNTO 0 DO
BEGIN { Scroll through all 8 BITS of each BYTE.}
IF (FontChr AND (1 SHL BitPos)) <> 0 THEN
PutPixel(X,Y,Color); { IF bit is set then draw pixel. }
INC(X); { point to next column. }
END;
INC(Y); { point to next row. }
X := OldX; { Restore old column for next line. }
END;
X := X + 8; { Move 9 columns ahead. }
END;
END;{WriteXY}
BEGIN
SetVidMode($13);
FOR Colors := 1 TO 19 DO
WriteXY(Colors*10,Colors*10,Colors,'Greg Estabrooks');
Readln;
SetVidMode($03);
END.
{***********************************************************************}
[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]