home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
sonderh1
/
exec4bh.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1987-12-22
|
4KB
|
68 lines
(*--------------------------------------------------------------------------*)
(*
Fuer DOS-Versionen, die die Register SS und SP bei Durchfuehrung
der Funktion $4B nicht erhalten, muss die Funktion EXEC durch
die nachfolgende Version ersetzt werden: *)
FUNCTION Exec (VAR Program_Name : asciiz;
VAR Parameter_String : anystr) : INTEGER;
CONST
Save_SS : INTEGER = -1; (* Bereich im Code-Segment *)
Save_SP : INTEGER = -1; (* zur Sicherung von SS:SP *)
ErrorCode : INTEGER = -1; (* DOS Fehlercode *)
VAR
LCB : ARRAY [1..7] OF INTEGER; (* Load Control Block *)
FCB_1, FCB_2 : ARRAY [1..12] OF BYTE; (* File Control Blocks *)
BEGIN
(* File Control Blocks erzeugen *)
Move (Mem [CSeg:$5C], FCB_1, 12);
Move (Mem [CSeg:$6C], FCB_2, 12);
(* Load Control Block erzeugen *)
LCB [1] := 0; (* Umgebung des aufrufenden Programms *)
LCB [2] := Ofs (Parameter_String);
LCB [3] := Seg (Parameter_String);
LCB [4] := Ofs (FCB_1);
LCB [5] := Seg (FCB_1);
LCB [6] := Ofs (FCB_2);
LCB [7] := Seg (FCB_2);
Inline($55 (* Push BP ; Sichern von Registern *)
/$1E (* Push DS *)
/$C5/$96 (* LDS DX,[BP]Program_Name *)
/Program_Name (* ; Zeiger DS:DX auf *)
/$42 (* Inc DX ; ASCIIZ Program_Name *)
/$8C/$D0 (* Mov AX,SS ; Stackregister laden *)
/$8E/$C0 (* Mov ES,AX ; Zeiger ES:BX auf LCB *)
/$8D/$9E/LCB (* LEA BX,[BP]LCB *)
/$2E/$A3/Save_SS (* Mov CS:Save_SS,AX ; Sichern von SS:SP *)
/$8B/$C4 (* Mov AX,SP *)
/$2E/$A3/Save_SP (* Mov CS:Save_SP,AX *)
/$FC (* ClD ; Clear Direction-Flag *)
/$B8/$00/$4B (* Mov AX,4B00h ; DOS Exec Funktion 4Bh *)
/$CD/$21 (* Int 21h *)
(* Kritische Phase, Stackregister in Unordnung *)
/$FA (* ClI ; Interrupt disable *)
/$72/$02 (* JB Run_Error ; Aufruf erfolgreich ? *)
/$32/$C0 (* XOr AL,AL ; Ja, Fehlercode = 0 *)
(* Run_Error: *)
/$32/$E4 (* XOr AH,AH ; Nein, DOS Fehler in AL *)
/$2E/$8B/$16/Save_SS (* Mov DX,CS:Save_SS ; Wiederherstellen *)
/$8E/$D2 (* Mov SS,DX ; von *)
/$2E/$8B/$16/Save_SP (* Mov DX,CS:Save_SP ; SS:SP *)
/$8B/$E2 (* Mov SP,DX *)
/$FB (* StI ; Interrupt enable *)
/$1F (* Pop DS ; Register herstellen *)
/$5D (* Pop BP *)
/$2E/$A3/ErrorCode); (* Mov CS:ErrorCode,AX *)
Exec := ErrorCode;
END;