{
 Small program to demostrate redirection of TP's Output variable
 Arne de Bruijn, 1994, PD
}

Unit SmallCrt;
interface
procedure AssignCrt(var F:text);
implementation
uses Dos; {For TextRec, fmClosed, fmOutput}

function InOutCrtOut(var F:text):byte; far; assembler;
asm
 cld                          { Count forwards }
 mov dx,ds                    { Save DS }
 lds si,F                     { Get address of F }
 mov cx,[si].TextRec.BufPos   { Get number of bytes to write }
 lds si,[si].TextRec.BufPtr   { Get address of buffer }
@OutChars:
 lodsb                        { Load character to output in AL, and }
                              { set SI to next character }
 int 29h                      { Output AL with DOS undocumented fast write }
 loop @OutChars               { Do all characters (dec(cx); until cx=0) }
 mov ds,dx                    { Restore DS }
end;

function CloseCrtOut(var F:text):byte; far;
begin
 TextRec(F).Mode:=fmClosed;
 CloseCrtOut:=0;
end;

function OpenCrtOut(var F:text):byte; far;
begin
 with TextRec(F) do
  begin
   Mode:=fmOutput;
   BufPos:=0; BufEnd:=0;
   InOutFunc:=@InOutCrtOut;
   FlushFunc:=@InOutCrtOut;
   CloseFunc:=@CloseCrtOut;
  end;
 OpenCrtOut:=0;
end;

procedure AssignCrt(var F:text);
begin
 with TextRec(F) do
  begin
   Mode:=fmClosed;
   BufSize:=SizeOf(Buffer);
   BufPtr:=@Buffer;
   Name[0]:=#0;
   OpenFunc:=@OpenCrtOut;
  end;
end;

begin
 AssignCrt(Output);
 Rewrite(Output);
end.
