[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]