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;