Utility: piping to Windows-Clipboard

{$I-,R-,S-,M 1024,0,655360}
{ USES DOS; (include this if you can't use asm) }
Const
  MP        = $2F; { Multiplex-Interrupt }
  ClipVer   = $1700;   ClipOpen  = $1701;
  ClipEmpty = $1702;   ClipSData = $1703;
  ClipClose = $1708;   ClipMOEM  = $0007;

Procedure SetClipData(Var Data; Size: Word); Assembler;
Asm                  { Var r: Registers;      }
                     { Begin                  }
  mov  ax,ClipVer    { r.ax := ClipVer;       }
  int  MP            { Intr(MP,r);            }
  cmp  ax,ClipVer    { If (r.ax <> ClipVer)   }
  je   @E            {    Then Exit;          }
  mov  ax,ClipOpen   { r.ax := ClipOpen       }
  int  MP            { Intr(MP,r);            }
  mov  ax,ClipEmpty  { r.ax := ClipEmpty;     }
  int  MP            { Intr(MP,r);            }
  mov  ax,ClipSData  { r.ax := ClipSData;     }
  mov  dx,ClipMOEM   { r.dx := ClipMOEM;      }
  les  bx,[Data]     { r.es := Seg(Data);     }
                     { r.bx := Ofs(Data);     }
  xor  si,si         { r.si := 0;             }
  mov  cx,[Size]     { r.cx := Size;          }
  int  MP            { Intr(MP,r);            }
  mov  ax,ClipClose  { r.ax := ClipClose;     }
  int  MP            { Intr(MP,r);            }
@E:                  { End;                   }
End;

Const MaxAlloc = $FFF8; { max allowed allocation }
Var Buffer: Pointer; BufSize,InBuffer: Word; StdIn: File;
Begin
  If (Pos('/?',String(Ptr(PrefixSeg,$80)^)) <> 0)
     Then { Looking for /? in commandline }
       Begin
         Write(#13#10'CLIP V1.0 - Author: ');
         Write('Antivivisekt...@t-online.de'#13#10#10);
         Write(' Syntax: CLIP X:\PATH\FILE.EXT'#13#10);
         Write('  Usage: CUTs max. 64 kB from FILE.EXT and');
         Write(' PASTEs'#13#10);
         Write('         it as TEXT into the WINDOWS clipboard.'#13#10);
         Write('         Without parameter, CLIP reads from');
         Write(' StdIn:'#13#10);
         Write('         from keyboard (use F6 to quit) or ');
         Write('from PIPE (| command).'#13#10);
         Write('Example: CLIP myfile.pas  -or-  dir | CLIP');
         Exit;
       End;
  If (MaxAvail > MaxAlloc)
     Then BufSize := MaxAlloc
     Else BufSize := MaxAvail;
  GetMem(Buffer,BufSize);
  Assign(StdIn,ParamStr(1));
  Reset(StdIn,1);
  BlockRead(StdIn,Buffer^,BufSize,InBuffer);
  Close(StdIn);
  SetClipData(Buffer^,InBuffer);
End.