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

    (*
    KELD R. HANSEN

    > I need to *simulate* something like:
    > {$M 16384,0,0}               {reduce heap}
    > Exec('c:\myprgm.exe','');    {run myprgm.exe}
    > {$M 16384,110000,110000}     {restore heap}

    EXECUTE shrinks your programs memory allocation to the smallest possible value,
    then runs the program and then expands it back up again. Works in TP 6.0 and
    7.0!
    *)

    USES
      DOS;

    TYPE
      STR127 = STRING[127];

    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, 4Ah
      INT  21h
      JC   @X
      LES  DI, P
      MOV  WORD PTR HeapEnd,DI
      MOV  WORD PTR HeapEnd+2,ES

     @X:
    END;

    FUNCTION EXECUTE(Name : PathStr ; Tail : STR127) : WORD; ASSEMBLER;
    ASM
      {$IFDEF CPU386}
      DB      66h
      PUSH    WORD PTR HeapEnd
      DB      66h
      PUSH    WORD PTR Name
      DB      66h
      PUSH    WORD PTR Tail
      DB      66h
      PUSH    WORD PTR HeapPtr
      {$ELSE}
      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
      {$ENDIF}
      CALL ReallocateMemory
      CALL SwapVectors
      CALL DOS.EXEC
      CALL SwapVectors
      CALL ReallocateMemory
      MOV  AX, DosError
      OR   AX, AX
      JNZ  @OUT
      MOV  AH, 4Dh
      INT  21h

     @OUT:
    END;

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