home *** CD-ROM | disk | FTP | other *** search
- PROCEDURE Exec (Path, cmdline : STRING);
- VAR anz : WORD;
- fp,t : POINTER;
- regs : REGISTERS;
- int00save,
- int23save,
- int24save,
- int1bsave : POINTER;
- {$ifopt N+}
- int02save,
- int75save : POINTER;
- {$endif}
-
- BEGIN
-
- { freelist sichern }
-
- fp := ptr(seg(freeptr^), ofs(freeptr^));
- anz := $FFFF - ofs(freeptr^) + 10;
- getmem(t, anz);
- move(fp^, t^, anz);
-
- { speicher freigeben }
-
- WITH regs DO BEGIN
- ah := $4A;
- es := prefixseg;
- bx := seg(heapptr^) + 1 - prefixseg;
- msdos(regs);
- END; { whith regs }
-
- { interruptvektoren zurücksetzen}
-
- getintvec($00, int00save);
- setintvec($00, saveint00);
- getintvec($23, int23save);
- setintvec($23, saveint23);
- getintvec($24, int24save);
- setintvec($24, saveint24);
- getintvec($1b, int1bsave);
- setintvec($1b, saveint1b);
- {$ifopt N+}
- getintvec($02, int02save);
- setintvec($02, saveint02);
- getintvec($75, int75save);
- setintvec($75, saveint75);
- {$endif}
-
- { programm starten }
-
- Dos.Exec(path, cmdline);
-
- { interruptvektoren einsetzen }
-
- setintvec($00, int00save);
- setintvec($23, int23save);
- setintvec($24, int24save);
- setintvec($1b, int1bsave);
- {$ifopt N+}
- setintvec($02, int02save);
- setintvec($75, int75save);
- {$endif}
-
- { Speicher wieder belegen }
-
- WITH regs DO BEGIN
- ah := $4A;
- es := prefixseg;
- bx := $FFFF;
- msdos(regs);
- ah := $4A;
- es := prefixseg;
- msdos(regs);
- END; { whith regs }
-
- { freelist restaurieren }
-
- move(t^, fp^, anz);
- freemem(t, anz);
- END; { exec }