home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1987 / 09 / exec4bh.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-08-09  |  3.6 KB  |  66 lines

  1.  
  2. (*------------------------------------------------------------------------*)
  3. (*  Korrekturen zu "Externe Kommandos in Turbo Pascal"
  4.                    (Pascal International 4/87, Seite 72 ff)
  5.  
  6.     1)  Zeile 47 muss lauten:   Block_Segment := Regs.BX;
  7.  
  8.     2)  Die Zeilen 140 bis 170 des Listings (Exec-Funktion) sollten
  9.         durch die nachfolgende Version ersetzt werden, um unter allen
  10.         DOS-Versionen lauffaehig zu sein:                                 *)
  11.  
  12. FUNCTION Exec (VAR Program_Name     : asciiz;
  13.                VAR Parameter_String : anystr) : INTEGER;
  14.  
  15. CONST
  16.   Save_SS   : INTEGER = -1;                    (* Bereich im Code-Segment *)
  17.   Save_SP   : INTEGER = -1;                    (* zur Sicherung von SS:SP *)
  18.   ErrorCode : INTEGER = -1;                    (* DOS Fehlercode          *)
  19.  
  20. VAR
  21.   LCB          : ARRAY [1..7] OF INTEGER;      (* Load Control Block      *)
  22.   FCB_1, FCB_2 : ARRAY [1..12] OF BYTE;        (* File Control Blocks     *)
  23.  
  24. BEGIN
  25.   Move (Mem [CSeg:$5C], FCB_1, 12);       (* File Control Blocks erzeugen *)
  26.   Move (Mem [CSeg:$6C], FCB_2, 12);
  27.                                           (* Load Control Block erzeugen: *)
  28.   LCB [1] := 0;                     (* Umgebung des aufrufenden Programms *)
  29.   LCB [2] := Ofs (Parameter_String);
  30.   LCB [3] := Seg (Parameter_String);
  31.   LCB [4] := Ofs (FCB_1);
  32.   LCB [5] := Seg (FCB_1);
  33.   LCB [6] := Ofs (FCB_2);
  34.   LCB [7] := Seg (FCB_2);
  35.  
  36.   INLINE($55               (*    Push  BP        ; Sichern von Registern  *)
  37.         /$1E               (*    Push  DS                                 *)
  38.         /$C5/$96           (*    LDS   DX,[BP]Program_Name                *)
  39.             /Program_Name  (*                    ; Zeiger DS:DX auf       *)
  40.         /$42               (*    Inc   DX        ; ASCIIZ Program_Name    *)
  41.         /$8C/$D0           (*    Mov   AX,SS     ; Stackregister laden    *)
  42.         /$8E/$C0           (*    Mov   ES,AX     ; Zeiger ES:BX auf LCB   *)
  43.         /$8D/$9E/LCB       (*    LEA   BX,[BP]LCB                         *)
  44.         /$2E/$A3/Save_SS   (*    Mov   CS:Save_SS,AX ; Sichern von SS:SP  *)
  45.         /$8B/$C4           (*    Mov   AX,SP                              *)
  46.         /$2E/$A3/Save_SP   (*    Mov   CS:Save_SP,AX                      *)
  47.         /$FC               (*    ClD             ; Clear Direction-Flag   *)
  48.         /$B8/$00/$4B       (*    Mov   AX,4B00h  ; DOS Exec Funktion 4Bh  *)
  49.         /$CD/$21           (*    Int   21h                                *)
  50.                            (* Kritische Phase, Stackregister in Unordnung *)
  51.         /$FA               (*    ClI             ; Interrupt disable      *)
  52.         /$72/$02           (*    JB    Run_Error ; Aufruf erfolgreich ?   *)
  53.         /$32/$C0           (*    XOr   AL,AL     ; Ja, Fehlercode = 0     *)
  54.                            (* Run_Error:                                  *)
  55.         /$32/$E4           (*    XOr   AH,AH     ; Nein, DOS Fehler in AL *)
  56.         /$2E/$8B/$16/Save_SS (*  Mov   DX,CS:Save_SS ; Wiederherstellen   *)
  57.         /$8E/$D2           (*    Mov   SS,DX         ;   von              *)
  58.         /$2E/$8B/$16/Save_SP (*  Mov   DX,CS:Save_SP ;  SS:SP             *)
  59.         /$8B/$E2           (*    Mov   SP,DX                              *)
  60.         /$FB               (*    StI             ; Interrupt enable       *)
  61.         /$1F               (*    Pop   DS        ; Register herstellen    *)
  62.         /$5D               (*    Pop   BP                                 *)
  63.         /$2E/$A3/ErrorCode); (*  Mov   CS:ErrorCode,AX                    *)
  64.   Exec := ErrorCode;
  65. END;
  66.