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

    {
    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.

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