{ TF> Hello . How Are YOU doing. TF> I have some trouble and i'm wondering if you can help me. TF> Can you write a little program that showes ansi-pics under TF> Turbo Pascal 7. Here's a UNIT of mine that interprets and displays ANSI files: ----------------------------------------------- } {Written by Mike Phillips 12-01-93} UNIT ANSI; INTERFACE USES crt,dos; VAR speed : integer; FUNCTION Min(X,Y : integer):integer; FUNCTION Max(X,Y : INTEGER) : INTEGER; TYPE charset = set of char; TANSiView = object ANSiParams : array [byte] of byte; ANSiNum : byte; errornum : integer; ANSiType : char; ANS : text; ANSiStr : string; ESCChars : charset; blinkin,high : boolean; fore,back,temp : word; constructor init; procedure attrib; virtual; procedure parse; virtual; procedure read_file (fn:string); virtual; procedure err; virtual; destructor done; virtual; end; (* of object *) IMPLEMENTATION FUNCTION Min(X,Y : INTEGER) : INTEGER; ASSEMBLER; ASM MOV AX,X CMP AX,Y JLE @@1 MOV AX,Y @@1: END; FUNCTION Max(X,Y : INTEGER) : INTEGER; ASSEMBLER; ASM MOV AX,X CMP AX,Y JGE @@1 MOV AX,Y @@1: END; constructor TANSiView.Init; begin clrscr; blinkin := false; high := false; fore := 7; back := 0; ESCChars := ['H','f','A','B','C','D','s','u','J','K','m','h','l','p','@',#14];end; (* of constructor TANSiVeiw.Init *) procedure TANSiView.attrib; var count : byte; begin FOR count := 1 TO ANSiParams [0] DO begin case ANSiParams [count] of 0 : begin blinkin := false; high := false; fore := 7; back := 0; end; 1 : high := true; 4,7 : begin temp := fore; fore := back; back := temp; end; 5 : blinkin := true; 8 : fore := back; 30 : fore := black; 31 : fore := red; 32 : fore := green; 33 : fore := brown; 34 : fore := blue; 35 : fore := magenta; 36 : fore := cyan; 37 : fore := lightgray; 40 : back := black; 41 : back := red; 42 : back := green; 43 : back := brown; 44 : back := blue; 45 : back := magenta; 46 : back := cyan; 47 : back := lightgray; end; (* of CASE *) END; (* of FOR *) if high then fore := fore OR 8; if blinkin then textattr := fore + back*16 + 128 else textattr := fore + back*16; end; (* of method attrib *) procedure TANSiView.parse; type tcurpos = record x,y : byte end; (* of record *) var count : byte; tempst : string; inpu : char; curpos : tcurpos; begin ANSiParams [0] := 0; read (ans,inpu); if inpu <> '[' then exit; WHILE NOT (inpu in ESCChars) DO begin read (ans,inpu); WHILE NOT (inpu in [';'] + ESCChars) DO begin if inpu in ['0'..'9'] then tempst := tempst + inpu; read (ans,inpu); end; (* of WHILE *) val (tempst,ANSiParams[ANSiParams[0]+1],errornum); if errornum = 0 then inc (ANSiParams [0]); tempst := ''; if inpu in ESCChars then begin case inpu of 'H','f' : IF ANSiParams[0] = 2 then gotoxy (ANSiParams[2],ANSiParams[1]) else IF ANSiParams[0] = 0 then gotoxy (1,1) else gotoxy (1,ansiparams[1]); 'A' : IF ANSIParams [0] = 0 then if wherey > 1 then gotoxy (wherex,wherey-1) else if wherey > ANSiParams [1] then gotoxy (wherex,wherey-ANSiParams[1]) else gotoxy (wherex,1); 'B' : IF ANSiParams [0] = 0 then gotoxy (wherex,wherey+1) else gotoxy (wherex,wherey+ANSiParams[1]); 'C' : IF ANSiParams [0] = 0 then gotoxy (wherex+1,wherey) else gotoxy (wherex+ANSiParams[1],wherey); 'D' : IF ANSIParams [0] = 0 then gotoxy (wherex-1,wherey) else if wherex > ANSiParams [1] then gotoxy (wherex - ANSiParams[1],wherey) else gotoxy (1,wherey); 's' : begin curpos.x := wherex; curpos.y := wherey; end; 'u' : gotoxy (curpos.x,curpos.y); 'J' : clrscr; 'K' : clreol; 'm' : attrib; end; (* of case *) end; (* of IF *) end; (* of WHILE *) end; (* of method parse *) procedure TANSiView.read_file (Fn:string); var ch:char; begin {$I-} ANSiStr := Fn; assign (ANS,Fn); reset (ANS); {$I+} if ioresult <> 0 then begin err; exit; end; read (ANS,ch); while not eof (ans) do begin delay (speed); if ch = #27 then parse else write (ch); read (ans,ch); end; (* of while *) close (ans); end; (* of method read_file *) procedure TANSiView.err; begin writeln ('File not found'); end; destructor TANSiView.done; begin end; begin speed := 0; end. { TEST PROGRAM ----------------------------------------------} Use it like : var MyANSI : TANSIView; ANSIFile : string; begin write ('Enter the filename to view: '); readln (ANSIFile); MyANSI.Read_File (ANSIFile); end. You may set the speed variable to slow down the display in order to emulate various baud rates. Higher value = slower. Mike Phillips INTERNET: phil4086@utdallas.edu