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


{ THREE DIFFERENT WAYS TO WRITE TO SCREEN WITH ROW AND COLUMN }
{ TWO ARE VERY FAST AND ALLOW COLOR }

procedure QWrite( Column, Line , Color : byte; S : STRING );

var
   VMode  : BYTE ABSOLUTE $0040 : $0049; { Video mode: Mono=7, Color=0-3 }
   NumCol : WORD ABSOLUTE $0040 : $004A; { Number of CRT columns (1-based) }
   VSeg   : WORD;
   OfsPos : integer;  { offset position of the character in video RAM }
   vPos   : integer;
   sLen   : Byte ABSOLUTE S;

Begin
  If VMode in [0,2,7] THEN VSeg := $B000 ELSE VSeg := $B800;
  OfsPos   := (((pred(Line) * NumCol) + pred(Column)) * 2);
  FOR vPos := 0 to pred(sLen) do
      MemW[VSeg : (OfsPos + (vPos * 2))] :=
                     (Color shl 8) + byte(S[succ(vPos)])
End;


procedure fastwrite(x, y, f, b: byte; s : STRING);

{ Does a direct video write -- extremely fast.
  X, Y = screen location of first byte;
  S = string to display;
  F = foreground color;
  B = background color. }

type  videolocation = record    { the layout of a two-byte video location }
        videodata: char;        { character displayed }
        videoattribute: byte;   { attributes }
        end;

var cnter: byte;
    videosegment: word;         { the location of video memory }
    monosystem: boolean;        { mono vs. color }
    vidptr: ^videolocation;     { pointer to video locations }

begin

{ Find the memory location where the string will be displayed at, according to
  the monitor type and screen location.  Then associate the pointer VIDPTR with
  that memory location: VIDPTR is a pointer to type VIDEOLOCATION.  Insert a
  character and attribute; now go to the next character and video location. }

  monosystem := (lastmode in [0,2,7]);
  if monosystem then videosegment := $b000 else videosegment := $b800;
  vidptr := ptr(videosegment, 2*(80*(y - 1) + (x - 1)));
  for cnter := 1 to length(s) do begin
    vidptr^.videoattribute := (b shl 4) + f;  { high nibble=bg; lo nibble=fg }
    vidptr^.videodata := s[cnter];            { put character at location }
    inc(vidptr);                              { go to next video location }
    end;
  end;


Procedure Print(x,y : Byte; S : String);
BEGIN
  ASM
  MOV DH, Y    { DH = Row (Y) }
  MOV DL, X    { DL = Column (X) }
  DEC DH       { Adjust For Zero-based Bios routines }
  DEC DL       { Turbo Crt.GotoXY is 1-based }
  MOV BH,0     { Display page 0 }
  MOV AH,2     { Call For SET CURSOR POSITION }
  INT 10h
  END;
WRITE(S);
END;

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