home *** CD-ROM | disk | FTP | other *** search
- {Fork.inc}
- CONST CR = #13; Null = #0;
- TYPE AnyString = STRING[255];
- VAR EnvSegAbs : INTEGER ABSOLUTE CSeg:$002C; {Environment String Segment}
- VAR Name, Line:ANYSTRING{FOR TEST};
-
- PROCEDURE FILLCHAR(var temp_item: AnyString; tempb1: BYTE; fchar: CHAR);
- { Fills a variable with a number of fchar }
- VAR i: integer;
- BEGIN
- for i:=1 to tempb1 do temp_item[i]:=fchar; temp_item[0]:=chr(tempb1);
- END; { FILLCHAR PROCEDURE }
-
- FUNCTION DOSErrorMsg(AX: INTEGER):AnyString;
- VAR ErrNumStr : AnyString;
- BEGIN {DOSErrMsg}
- CASE AX OF
- 1 : DOSErrorMsg := 'Invalid Function';
- 2 : DOSErrorMsg := 'File Not Found';
- 3 : DOSErrorMsg := 'Path Not Found';
- 4 : DOSErrorMsg := 'Too Many Open Files';
- 5 : DOSErrorMsg := 'Access Denied';
- 7 : DOSErrorMsg := 'Arena Trashed';
- 8 : DOSErrorMsg := 'Not Enough Memory';
- 9 : DOSErrorMsg := 'File Not Found';
- 10 : DOSErrorMsg := 'Bad Environment';
- 11 : DOSErrorMsg := 'Bad Format';
- ELSE BEGIN Str(AX, ErrNumStr); DOSErrorMsg := 'DOS Error ' + ErrNumStr; END
- END; {CASE}
- END; {DOSErrorMsg}
-
- FUNCTION Fork(ProgName, CmdLine: AnyString): BOOLEAN;
- TYPE
- RegType = RECORD AX, BX, CX, DX, BP, SI, DI, DS, ES, Flags: INTEGER; END;
- FCBType = ARRAY [0..36] OF CHAR;
- VAR
- Regs : RegType;
- Status : BOOLEAN;
- CmdLen : BYTE ABSOLUTE CmdLine;
- FCB1, FCB2 : FCBType;
- ParmBlock : RECORD
- EnvSeg : INTEGER;
- CmdPtr : ^AnyString;
- FCB1Ptr: ^FCBType;
- FCB2Ptr: ^FCBType;
- END;
-
- FUNCTION CallDOS(VAR Regs: RegType): BOOLEAN;
- BEGIN {CallDOS}
- MsDOS(Regs);
- CallDOS := (NOT Odd(Regs.Flags));
- END; {CallDOS}
-
- PROCEDURE MakeFCB(CmdLine: AnyString; VAR FCB1, FCB2: FCBType);
- VAR
- Regs : RegType;
- DummyFlag : BOOLEAN;
-
- BEGIN { MakeFCB }
- FillChar(FCB1, SizeOf(FCB1), 0);
- Regs.AX := $2901;
- Regs.DS := Seg(CmdLine[1]);
- Regs.SI := Ofs(CmdLine[1]);
- Regs.ES := Seg(FCB1);
- Regs.DI := Ofs(FCB1);
- DummyFlag := CallDOS(Regs);
-
- FillChar(FCB2, SizeOf(FCB2), 0);
- Regs.AX := $2901;
- Regs.ES := Seg(FCB2);
- Regs.DI := Ofs(FCB2);
- DummyFlag := CallDOS(Regs);
- END; { MakeFCB }
-
- BEGIN { Fork }
- Status := TRUE;
- MakeFCB(CmdLine, FCB1, FCB2);
- ProgName := ProgName + Null;
- CmdLine := ' ' + CmdLine + CR;
- CmdLen := PRED(CmdLen);
- WITH ParmBlock DO BEGIN
- EnvSeg := EnvSegAbs;
- CmdPtr := Addr(CmdLine);
- FCB1Ptr := Addr(FCB1);
- FCB2Ptr := Addr(FCB2);
- END;
- Regs.AX := $4B00;
- Regs.BX := Ofs(ParmBlock);
- Regs.DX := Ofs(ProgName[1]);
- Regs.DS := Seg(ProgName[1]);
- Regs.ES := Seg(ParmBlock);
- IF (NOT CallDOS(Regs))
- THEN BEGIN
- Status := FALSE;
- Writeln('Unable to run "', ProgName, '" with "', CmdLine, '" : ',
- DOSErrorMsg(Regs.AX));
- END;
- Fork := Status;
- END; {Fork}
-
- BEGIN {TEST}
- WRITELN('ENTER PROGNAME: ');
- READLN(NAME);
- WRITELN('ENTER CMDLINE: ');
- READLN(LINE);
- IF Fork(NAME, LINE) THEN WRITELN('FORK=TRUE');
- END.
-