{ ***************************************************************************** COLOR.PAS By Tobin Fricke This should solve everyone's problems with Ascii, ANSI, WWIV, Avatar, LVI, Pipe, Direct, and RIP. ***************************************************************************** } {$IFDEF DEBUG} {$D+,L+} {$ENDIF} Unit Color; {$S-} (* BBS Color Unit by Tobin Fricke *) (* TobinTech Software Research and Development *) (* Copyright (c) 1994 Tobin Fricke, All Rights Reserved *) (* This is a unit to allow the use of color on bbs systems. It will send *) (* the color codes to the screen using BIOS. These can easily be trapped *) (* and sent to the modem by most BBS systems. *) (* -=- If you use this in any of your programs, you must give credit to the author of this toolkit, Tobin Fricke. You must register this and receive permission to use it in any commercial product or shareware product. It may be used without consent from the author (as long as credit is given) in any "freeware" or "public domain" programs. This may not be bought or sold, and contains no warrantee. Use it at your own risk. Please send the author a copy of anything you create using this toolkit. Thanks. For information on registration, contact the author. *) (* -=- Reaching The Author Internet: dr261@cleveland.freenet.edu Postal: 25271 Arion Way, Mission Viejo, Ca, 92691-3702 Phone: (714) 586-4906 BBS: (714) 586-6142 The Digital Forest Information system DFIN: 13:714/100 *) Interface uses DOS; Type ProcType=Procedure(S:String); Const NoColor=0; { Ignores Color commands, no color } ASCIIColor=0; { Same as NoColor } ANSIColor=1; { Uses ANSI Escape Codes } WWIVColor=2; { Uses WWIV Heart Codes } AVATARColor=3; { Uses AVATAR codes } LVIColor=4; { Uses LVI (Last Video Interface) codes } DirectColor=7; PipeSystemColor=5; { The Renegade Pipe System for Color } RipColor=6; WWIVEscape:Char=#3; { These are escape codes for the different } ANSIEscape:Char=#27; { modes. } AVATEscape:Char=#22; Black=0; { These are color constants. } Blue=1; Green=2; Cyan=3; Red=4; Magenta=5; Brown=6; Gray=7; Bright=8; EmuNum=6; EmuMenu:Array[0..EmuNum] of String= ('ASCII ', 'ANSI ', 'WWIV ', 'AVATAR', 'LVI ', 'PIPE System', 'RIPScrip'); EmuComment:Array[0..EmuNum] of String= ('No Color or Screen Control', 'ANSI Color and Screen Control', 'WWIV BBS Software "Heart Codes"', 'This isn''t used much anymore', 'The Last Video Interface, Faster than ANSI', 'Renegade Style Color Codes', 'Remote Imaging Protocol Script'); var WriteMode:Byte; { Prior to use, you must set WriteMode equal } Output:ProcType; { to NoColor, ANSIcolor, AVATARColor, or LVI-} { color } Var T:Text; {Assigned to StdOutput } Procedure Default; { Change colors to default (7 on 0) } Procedure BackgroundColor(I:Byte); { Set Background color to I } Procedure ForgroundColor(I:Byte); { Set Foreground Color to I } Procedure GotoXY(X,Y:Byte); { Go to specific location on screen } Procedure CLRSCR; { Clear the screen } function readkey:char; { Not Implemented Yet } Procedure D; { Same as Default; } Procedure WWIVParse(S:String); { See the end of this file... } Procedure GetEmu; { See the end of this file... } Procedure FColor(B:Byte); { Same as ForegroundColor } Procedure BColor(B:Byte); { Same as BackgroundColor } Implementation Uses CRT; Procedure DefOutput(S:StrinG); Begin Write(T,S); End; {function readkey:char; var B:Byte; begin ASM; Mov AH, 01h Int 21 Mov [B], AL End; readkey:=chr(B); end; } function readkey:char; var it:string; Regs:Registers; begin Regs.AH:=$01; MSDOS(Regs); STr(Regs.AL,it); readkey:=it[1]; end; Procedure PIPEBackground(B:Byte); Var S:String; Begin Case B Of 0: S:='|16'; 1: S:='|17'; 2: S:='|18'; 3: S:='|19'; 4: S:='|20'; 5: S:='|21'; 6: S:='|22'; 7: S:='|23'; End; Write(S); End; Procedure PIPEForground(B:Byte); Var S:String; Begin Case B Of 0: S:='|00'; 1: S:='|01'; 2: S:='|02'; 3: S:='|03'; 4: S:='|04'; 5: S:='|05'; 6: S:='|06'; 7: S:='|07'; 8: S:='|08'; 9: S:='|09'; 10: S:='|10'; 11: S:='|11'; 12: S:='|12'; 13: S:='|13'; 14: S:='|14'; 15: S:='|15'; End; Write(S); End; Procedure AVATARGotoXy(X,Y:Byte); begin Write(#22+#8+Char(X)+Char(Y)); end; Procedure AvatarForground(A:Byte); begin Write(#22+#1+Char(A and $7F)); end; Procedure AvatarClrScr; begin Write(#12); end; Procedure WWIVForground(I:Byte); var C:Byte; D:Char; begin Repeat If I>8 then I:=I-8; Until I<9; C:=I; Case I of 0:C:=0; 1:C:=7; 2:C:=5; 3:C:=1; 4:C:=6; 5:C:=3; 6:C:=2; 7:C:=4; 8:C:=4; end; Output(WWIVEscape+Char(48+C)); end; Procedure WWIVBackground(I:Byte); begin If I=1 then Output(WWIVEscape+'4'); end; procedure ANSIDefault; begin Output(ANSIEscape+'[0m'); end; Procedure ANSIForground(I:Byte); var z:string; begin {ANSIDefault;} case I of 0:z:='0;30'; 1:z:='0;34'; 2:z:='0;32'; 3:z:='0;36'; 4:z:='0;31'; 5:z:='0;35'; 6:z:='0;33'; 7:z:='0;37'; 8:z:='1;30'; 9:z:='1;34'; 10:z:='1;32'; 11:z:='1;36'; 12:z:='1;31'; 13:z:='1;35'; 14:z:='1;33'; 15:z:='1;37'; end; Output(ANSIescape+'['+z+'m'); end; Procedure ANSIBackground(I:Byte); var z:string; ansistr:string; begin { ANSIDefault;} case I of 0:z:='40'; 1:z:='44'; 2:z:='42'; 3:z:='46'; 4:z:='41'; 5:z:='45'; 6:z:='43'; 7:z:='47'; end; ansistr:=ANSIEscape+'['+z+'m'; Output(ansistr); end; Procedure GotoXY(X,Y:Byte); var SX,SY:string; begin Str(X,SX); Str(Y,SY); Output(ANSIEscape+'['+SY+';'+SX+'H'); end; Var F,B:Byte; Procedure LVIForground(I:Byte); Begin F:=I; Output(#29+Char(F+(B*16))); end; Procedure LVIBackground(I:Byte); Begin B:=I; Output(#29+Char(F+(B*16))); end; Procedure Zero(Var X:Byte); Begin X:=0; end; Procedure FColor(B:Byte); Begin ForgroundColor(B); end; Procedure BColor(B:Byte); Begin BackgroundColor(B); End; Procedure WWIVParse(S:String); var I:Byte; begin Zero(I); Repeat Inc(I); Case S[I] of #3:Begin { #3 =  } Inc(I); Case S[I] of '0':Begin BColor(0); FColor(7+0); End; '1':Begin BColor(0); FColor(3+8); End; '2':Begin BColor(0); FColor(6+8); End; '3':Begin BColor(0); FColor(5+0); End; '4':Begin BColor(1); FColor(1+0); End; '5':Begin BColor(0); FColor(2+0); End; '6':Begin BColor(0); FColor(4+8); End; '7':Begin BColor(0); FColor(1+8); End; '8':Begin BColor(0); FColor(2+8); End; '9':Begin BColor(0); FColor(3+8); End; End; End; Else Output(S[I]); End; Until I>=Length(S); End; Procedure BackgroundColor(I:Byte); begin Case WriteMode of ANSIColor:ANSIBackground(I); RIPColor:ANSIBackground(I); WWIVColor:WWIVBackground(I); LVIColor:LVIBackground(I); DirectColor:CRT.TextBackground(I); PipeSystemColor:PipeBackground(I); end; end; Procedure ForgroundColor(I:Byte); begin Case WriteMode of ANSIColor:ANSIForground(I); RIPColor:ANSIForground(I); WWIVColor:WWIVForground(I); AVATARColor:AvatarForground(I); LVIColor:LVIForground(I); DirectColor:CRT.TextColor(I); PipeSystemColor:PipeForground(I); end; end; Procedure ANSIClrScr; begin Output(ANSIEscape+'[2J'); end; Procedure WWIVClrScr; var I:Byte; begin For I:=1 to 25 do Writeln(T,''); end; Procedure ClrScr; begin Case WriteMode of ANSIColor:ANSIClrScr; RIPColor:ANSIClrScr; WWIVColor:WWIVClrScr; AVATARColor:AvatarClrScr; LVIColor:ANSIClrScr; DirectColor:CRT.ClrScr; end; end; Procedure Default; Begin Case Writemode of ANSIColor: ANSIDefault; RipColor: ANSIDefault; end; end; Procedure D; begin Default; end; Procedure GetEMu; Var I,E:Integer; S:String; T:Integer; Begin Repeat Writeln(' Please choose a terminal type: '); Writeln; For I:=0 to Color.EmuNum do Writeln(' ',I,') ',Color.EmuMenu[I],#9,Color.EmuComment[I]); Writeln; Write(' TERM>'); Readln(S); Val(S,T,E); If E<>0 then begin Writeln(' I can''t understand: ',S); Write(' '); For I:=1 to E do Write(' '); Writeln('^'); End; If ((T>Color.EmuNum) OR (T<0)) AND (E=0) then begin Writeln(' You must enter a number from 0 to ',EmuNum); E:=1; end; Until E=0; Writeln; Writeln(' ',EmuMenu[T],' Emulation Selected '); WriteMode:=T; end; begin Output:=DefOutput; Assign(System.Output,''); Assign(System.Input,''); Assign(T,''); Rewrite(T); Rewrite(System.Output); Reset(Input); DirectVideo:=False; WriteMode:=ANSIColor; F:=7; B:=0; end. (* Information... Set WriteMode to one of the following before calling any color commands. NoColor=0; { Ignores Color commands, no color } ASCIIColor=0; { Same as NoColor } ANSIColor=1; { Uses ANSI Escape Codes } WWIVColor=2; { Uses WWIV Heart Codes } AVATARColor=3; { Uses AVATAR codes } LVIColor=4; { Uses LVI (Last Video Interface) codes } DirectColor=7; { Not implemented yet } PipeSystemColor=5; { The Renegade Pipe System for Color } RipColor=6; For TTY emulation, see TTY.PAS For LVI emulation, see LVI.PAS Output(S:String) Is called to output the ANSI/WWIV/AVATAR/LVI/PIPE/RIP codes. It defaults to StdOutput, and It may be redefined like so: Procedure COMOutput(S:String); begin { send S to COMPort } end; begin Color.Output:=ComOutput; end. WWIVParse(S:String) will take a string containing WWIV (ASCII 3) color codes, parse it, and output it (through procedure output) with the correct coloring. GetEmu will display a menu and ask the user for an emulation. *)