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

{
 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

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