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


Procedure WriteS (DispStr : String; X,Y,Colr : Byte);

               (* DispStr = String to display on screen
                  X,Y     = Coordinates to being writing
                  Colr    = Color attribute
               *)

  (* This is a simple procedure to directly write a string to the screen,
     accounting for imbedded color codes.  These color codes are identified
     by a \ followed by a two or three digit number representing the color
     desired.  All subsequent output of the string will be given the new
     color until otherwise declared.  The string '\M' is also recognized as
     a carriage return, where the string will be continued on the next line,
     aligned with the above line.  No values are returned.

     It's fairly fast, and it does the job, but I know that it could use a
     lot of tweaking, so if anybody does improve on it, please give me an
     updated copy.

     ** NOTE **  The screen address is kept in the variable VidSeg.  You can
                 either go through the procedure and replace it with a constant
                 screen address, or assign the variable VidSeg in your program.
  *)

  (* Standard disclaimer: I'm not liable for anything this procedure does
                          outside the original purpose of the procedure.  If
                          something bad happens, let me know, but that's all
                          I can do.
  *)

Var
   Loc, TmpInt, OldX                    : Integer;
   TmpStr                               : String[3];

Begin
     OldX := X;
     Loc := ((X-1)*2)+((Y-1)*160);
     Loop := 1;
     While Loop <= Length (DispStr) Do
     Begin
          TmpStr := '';
          If (DispStr[Loop] = '\') And (DispStr[Loop+1] <> '\') Then
          Begin
               Inc (Loop);
               If DispStr[Loop] In ['0'..'9'] Then
               Begin
                    While (DispStr[Loop] In ['0'..'9']) And
                          (Length (TmpStr) < 3) Do
                    Begin
                         TmpStr := TmpStr + DispStr[Loop];
                         Inc (Loop);
                    End;
                    Val (TmpStr,Colr,TmpInt);
                    Colr := CheckColor (Colr);
               End
               Else
               If UpCase (DispStr[Loop]) = 'M' Then
               Begin
                    Inc (Y);
                    X := OldX;
                    Loc := ((X-1)*2)+((Y-1)*160);
               End;
          End
          Else
          Begin
               If DispStr[Loop] = '\' Then
                  Delete (DispStr,Loop,1);
               Mem[VidSeg:Loc] := Ord (DispStr[Loop]);
               Mem[VidSeg:Loc+1] := Colr;
               Inc (Loc,2);
               Inc (Loop);
          End;
     End;
End;

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