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

    (*
    > Does anybody know, how can I free heap for use for Dos? Ex.
    > {$M 16384,0,655360}
    > .
    > Exec('command.com','');
    > .   ^------------------ Before this command I would like decrease
    > heap-limit to 0 (Even I dispose all variables, exec reports memory error.

    Yes.
    *)

    Procedure ReallocateMemory(P : Pointer); Assembler;
    Asm
      Mov  AX, PrefixSeg
      Mov  ES, AX
      Mov  BX, word ptr P+2
      Cmp  Word ptr P,0
      Je   @OK
      Inc  BX
     @OK:
      Sub  BX, AX
      Mov  AH, $4A
      Int  $21
      Jc   @Out
      Les  DI, P
      Mov  Word Ptr HeapEnd,DI
      Mov  Word Ptr HeapEnd+2,ES
     @Out:
    End;

    Function Execute(Name, tail : pathstr) : Word; Assembler;
    Asm
      Push Word Ptr HeapEnd+2
      Push Word Ptr HeapEnd
      Push Word Ptr Name+2
      Push Word Ptr Name
      Push Word Ptr Tail+2
      Push Word Ptr Tail
      Push Word Ptr HeapPtr+2
      Push Word Ptr HeapPtr
      Call ReallocateMemory
      Call SwapVectors
      Call Dos.Exec
      Call SwapVectors
      Call ReallocateMemory
      Mov  AX, DosError
      Or   AX, AX
      Jnz  @Done
      Mov  AH, $4D
      Int  $21 { Return error in will be in AX (if any) }
     @Done:
    End;
    {
    That works great. I even use it before I run Ralf Browns SPAWNO to speed
    it up if I have a full heap (the reaccolate memory)..

    The execute part in pure pascal is really:
    }
    Function Execute(Name, tail : pathstr) : Word;
    var old: longint;
    begin
      old := heapend;
      ReallocateMemory(heapptr);
      Exec(name,tail);
      ReallocateMemory(old);
      execute := doserror;
    end;
    {
    But re-written for optimization.
    }

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