[Back to EXEC SWAG index] [Back to Main SWAG index] [Original]
{$S-,R-,V-,I-,N-,B-,F-}
{$IFNDEF Ver40}
{Allow overlays}
{$F+,O-,X+,A-}
{$ENDIF}
UNIT FINDEXEC;
INTERFACE
USES CRT,DOS;
PROCEDURE FLUSHALLDOS;
PROCEDURE REBOOT;
FUNCTION EXECUTE (Name : PathStr ; Tail : STRING) : WORD;
PROCEDURE RunInWindow (FN, Cmd : STRING; PAUSE : BOOLEAN);
IMPLEMENTATION
VAR
cname : STRING;
Old_29H : POINTER;
PROCEDURE FLUSHALLDOS; ASSEMBLER;
ASM
mov ah, 0Dh
INT 21h
XOR cx, cx
@1 :
push cx
INT 28h
pop cx
loop @1
END;
PROCEDURE Reboot; assembler;
asm
CALL FLUSHALLDOS
MOV ds, cx
MOV WORD PTR [472h], 1234h
DEC cx
PUSH cx
PUSH ds
END;
{F+}
Procedure Int29Handler(AX, BX, CX, DX, SI, DI, DS, ES, BP : Word); Interrupt;
Var
Dummy : Byte;
begin
Asm
Sti
end;
Write(Char(Lo(Ax)));
Asm
Cli
end;
end;
{$F-}
{ EXECUTE STUFF - SHRINK HEAP AND EXECUTE LIKE EXECDOS }
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;
{ ZAP this DEFINE if NOT 386,486}
{..$DEFINE CPU386}
FUNCTION EXEC (Name : PathStr ; Tail : STRING) : WORD; ASSEMBLER;
ASM
CALL FLUSHALLDOS
{$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;
FUNCTION EXECUTE (Name : PathStr ; Tail : STRING) : WORD;
VAR W : PathStr;
BEGIN
DosError := 2;
W := FSEARCH (Name, GetEnv ('PATH') );
IF W = '' THEN EXIT;
EXECUTE := EXEC(W,Tail);
END;
PROCEDURE RunInWindow (FN, Cmd : STRING; PAUSE : BOOLEAN);
VAR sa : BYTE;
w : pathstr;
BEGIN
DosError := 2;
W := FSEARCH (fn, GetEnv ('PATH') );
IF W = '' THEN EXIT;
sa := Textattr;
GETINTVEC ($29, OLD_29H);
SETINTVEC ($29, @Int29Handler); { Install interrupt handler }
WINDOW (LO (WindMin) + 1, HI (WindMin) + 1, LO (WindMax) + 1, HI (WindMax) + 1);
EXEC (W, Cmd );
SETINTVEC ($29, OLD_29h);
IF PAUSE THEN
BEGIN
WRITELN;
WRITELN (' .. Any Key Continues .. ');
asm
Mov AX, $0C00; { flush keyboard }
Int 21h;
end;
WHILE NOT KEYPRESSED DO;
asm
Mov AX, $0C00;
Int 21h;
end;
END;
Textattr := sa;
END;
END.
[Back to EXEC SWAG index] [Back to Main SWAG index] [Original]