home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1987 / 09 / error.inc < prev    next >
Encoding:
Text File  |  1987-08-09  |  4.5 KB  |  89 lines

  1. (*****************************************************************************)
  2. (*            >>>>>>>>>>  Modul:     ERROR.INC  (v1.0)  <<<<<<<<<<           *)
  3. (*                                                                           *)
  4. (*  Aufgabe:  Behandeln und Abfangen von Arithmetik-Fehlern in Turbo Pascal  *)
  5. (*      verwendbar fuer Turbo 3.0 einschliesslich Turbo-BCD und Turbo-87     *)
  6. (*                                                                           *)
  7. (*****************************************************************************)
  8.  
  9. VAR SaveErrorPtr :INTEGER;   (*  Adresse der "leeren" Turbo-Fehlerbehandlung *)
  10.  
  11. (* ------------------------------------------------------------------------- *)
  12. (* Benutzer-Prozedur zur Behandlung eines aufgetretenen Fehlers. Deklaration
  13.    ausserhalb im Benutzer-Modul (s. Beispiel)                                *)
  14.  
  15. PROCEDURE ErrorHandler (ErrorType, ErrorNr, ErrorPC :INTEGER); FORWARD;
  16.  
  17. (* ------------------------------------------------------------------------- *)
  18. (*               Erkennen und Abfangen von Arithmetik-Fehlern                *)
  19.  
  20. PROCEDURE ErrorCheck (Code,PC :INTEGER);
  21.  
  22.    VAR push,pop :INTEGER;
  23.  
  24.  BEGIN
  25.    ErrorHandler (Hi(Code),Lo(Code),PC); (* Fehler von Benutzer-Prozedur be-
  26.                                            handeln lassen...                 *)
  27.    (* nur fuer Arithmetik-Fehler zustaendig: Programmabbruch bei anderen:    *)
  28.    IF (Hi(Code) <> $02) OR NOT (Lo(Code) IN [$01..$04,$92]) THEN Halt;
  29.    push := 2;  (* Zahl der notwendigen PUSH-Operationen zur Stapel-Korrektur *)
  30.    IF Lo(Code) <> $92 THEN    (* fuer INTEGER 2, fuer REAL entsprechend mehr *)
  31.      push := push + SizeOf(REAL) SHR 1;
  32.    pop := 3;                         (* das Gleiche fuer die POP-Operationen *)
  33.    CASE SizeOf(REAL) OF
  34.       8: BEGIN                                                   (* Turbo-87 *)
  35.            pop := pop + 4;
  36.            IF Lo(Code)=$02 THEN pop := pop + 4
  37.          END;
  38.      10: IF Lo(Code)=$92 THEN pop := pop + 5                    (* Turbo-BCD *)
  39.    END;
  40.                                             (* Vorsicht! Turbo wird genarrt! *)
  41.    INLINE ($5B/             (*  POP  BX         ;pop holen                   *)
  42.            $59/             (*  POP  CX         ;push holen                  *)
  43.            $5D/             (*  POP  BP         ;Base-Pointer und ...        *)
  44.            $5A/             (*  POP  DX         ;... Stack-Pointer sichern   *)
  45.            $58/             (*  POP  AX         ;Ruecksprung entfernen       *)
  46.  
  47.            $58/             (*  POP  AX         ;Wort vom Stack entfernen    *)
  48.            $45/             (*  INC  BP         ;Base-Pointer korrigieren    *)
  49.            $45/             (*  INC  BP         ;                            *)
  50.            $4B/             (*  DEC  BX         ;Zahl der POPs erniedrigen   *)
  51.            $75/$FA/         (*  JNZ  *-4        ;bis alle POPs durchgefuehrt *)
  52.  
  53.            $31/$C0/         (*  XOR  AX,AX      ;Akkumulator loeschen        *)
  54.            $50/             (*  PUSH AX         ;Wort auf Stack schieben     *)
  55.            $4D/             (*  DEC  BP         ;Base-Pointer korrigieren    *)
  56.            $4D/             (*  DEC  BP         ;                            *)
  57.            $49/             (*  DEC  CX         ;Zahl der PUSHs erniedrigen  *)
  58.            $75/$FA/         (*  JNZ  *-4        ;bis alle PUSHs durchgefuehrt*)
  59.  
  60.            $87/$06/$88/$01/ (*  XCHG AX,[0188]  ;Ruecksprungadresse holen... *)
  61.            $05/$03/$00/     (*  ADD  AX,0003    ;...modifizieren...          *)
  62.            $50/             (*  PUSH AX         ;...und auf Stack            *)
  63.            $52/             (*  PUSH DX         ;Stack-Pointer und...        *)
  64.            $55/             (*  PUSH BP         ;...Base-Pointer auf Stack   *)
  65.            $31/$C0)         (*  XOR  AX,AX      ;Akkumulator loeschen        *)
  66.  END;
  67.  
  68. (* ------------------------------------------------------------------------- *)
  69. (*           Initialisierung des Moduls:  Fehlerbehandlung umleiten          *)
  70.  
  71. PROCEDURE InitErrorCheck;
  72.  
  73.  BEGIN
  74.    SaveErrorPtr := ErrorPtr;
  75.    ErrorPtr := Ofs (ErrorCheck);
  76.  END;
  77.  
  78. (* ------------------------------------------------------------------------- *)
  79. (*        Desaktivierung:  Turbo's Fehlerbehandlung wiederherstellen         *)
  80.  
  81. PROCEDURE OldErrorCheck;
  82.  
  83.  BEGIN
  84.    ErrorPtr := SaveErrorPtr
  85.  END;
  86.  
  87. (* ------------------------------------------------------------------------- *)
  88. (*                          Ende von ERROR.INC                               *)
  89.