Contributor: MARK LEWIS               

{
MARK LEWIS

> The problem is that Without allocating a new FCB For Dos, you
> can't have more than 15 or so Files open at a time in TP, no
> matter WHAT the CONFIG.SYS FileS= statement says.  (By default,

i cannot remember exactly what INT $21 Function $6700 is but here's a PD Unit
i got from borland's bbs the other day... i've trimmed the Text down for
posting... if anyone Really needs everything that comes With it, they should
look For EXTend6.*
}

Unit Extend;
{ This extends the number of File handles from 20 to 255 }
{ Dos requires 5 For itself. Applications can use up to 250 }

Interface

Implementation
Uses
  Dos;

Const
  Handles = 255;
  { You can reduce the value passed to Handles if fewer Files are required. }

Var
  Reg : Registers;
  begin
  { Check the Dos Version - This technique only works For Dos 3.0 or later }
  Reg.ah := $30;
  MsDos(Reg);
  if Reg.al<3 then
  begin
    Writeln('Extend Unit Require Dos 3.0 or greater');
    halt(1);
  end;

  {Reset the FreePtr - This reduces the heap space used by Turbo Pascal}
  if HeapOrg <> HeapPtr then
  {Checks to see if the Heap is empty}
  begin
    Write('Heap must be empty before Extend Unit initializes');
    Writeln;
    halt(1);
  end;
  Heapend := ptr(Seg(Heapend^) - (Handles div 8 + 1), Ofs(Heapend^));

  {Determine how much memory is allocated to Program}
  {Reg.Bx will return how many paraGraphs used by Program}
  Reg.ah := $4A;
  Reg.es := PrefixSeg;
  Reg.bx := $FFFF;
  msDos(Reg);

  {Set the Program size to the allow For new handles}
  Reg.ah := $4A;
  Reg.es := PrefixSeg;
  Reg.bx := reg.bx - (Handles div 8 + 1);
  msDos(Reg);

  {Error when a Block Size is not appropriate}
  if (Reg.flags and 1) = 1 then
  begin
    Writeln('Runtime Error ', Reg.ax, ' in Extend.');
    halt(1);
  end;

  {Allocate Space For Additional Handles}
  reg.ah := $67;
  reg.bx := Handles;
  MsDos(reg);
end.

{
Write the following Program to a separate File. This Program tests the EXTend
Unit. This test should be done on systems equipped With a hard disk.
}

Program TestEx;

Uses
  EXTend;

Type
  FileArray = Array [1..250] of Text;

Var
  f : ^FileArray;
  i : Integer;
  s : String;

begin
  {Allocate Space For fILE Variable Table}
  new(f);
  {oPEN 250 Files simultaneously}
  For i:=1 to 250 do
  begin
    str(i,s);
    Assign(f^[i],'Dum'+s+'.txt');
    reWrite(f^[i]);
    Writeln('Open #',s);
  end;
  {Write some Text to the Files}
  For i:=1 to 250 do
  Write(f^[i],'This is a test File');
  {Close the Files}
  For i:=1 to 250 do
  begin
    close(f^[i]);
    Writeln('Closing #',i);
  end;
  {Erase the Files}
  For i:=1 to 250 do
  begin
    erase(f^[i]);
    Writeln('Erasing #',i);
  end;
end.