home *** CD-ROM | disk | FTP | other *** search
- (*****************************************************************************)
- (* >>>>>>>>>> Modul: ERROR.INC (v1.0) <<<<<<<<<< *)
- (* *)
- (* Aufgabe: Behandeln und Abfangen von Arithmetik-Fehlern in Turbo Pascal *)
- (* verwendbar fuer Turbo 3.0 einschliesslich Turbo-BCD und Turbo-87 *)
- (* *)
- (*****************************************************************************)
-
- VAR SaveErrorPtr :INTEGER; (* Adresse der "leeren" Turbo-Fehlerbehandlung *)
-
- (* ------------------------------------------------------------------------- *)
- (* Benutzer-Prozedur zur Behandlung eines aufgetretenen Fehlers. Deklaration
- ausserhalb im Benutzer-Modul (s. Beispiel) *)
-
- PROCEDURE ErrorHandler (ErrorType, ErrorNr, ErrorPC :INTEGER); FORWARD;
-
- (* ------------------------------------------------------------------------- *)
- (* Erkennen und Abfangen von Arithmetik-Fehlern *)
-
- PROCEDURE ErrorCheck (Code,PC :INTEGER);
-
- VAR push,pop :INTEGER;
-
- BEGIN
- ErrorHandler (Hi(Code),Lo(Code),PC); (* Fehler von Benutzer-Prozedur be-
- handeln lassen... *)
- (* nur fuer Arithmetik-Fehler zustaendig: Programmabbruch bei anderen: *)
- IF (Hi(Code) <> $02) OR NOT (Lo(Code) IN [$01..$04,$92]) THEN Halt;
- push := 2; (* Zahl der notwendigen PUSH-Operationen zur Stapel-Korrektur *)
- IF Lo(Code) <> $92 THEN (* fuer INTEGER 2, fuer REAL entsprechend mehr *)
- push := push + SizeOf(REAL) SHR 1;
- pop := 3; (* das Gleiche fuer die POP-Operationen *)
- CASE SizeOf(REAL) OF
- 8: BEGIN (* Turbo-87 *)
- pop := pop + 4;
- IF Lo(Code)=$02 THEN pop := pop + 4
- END;
- 10: IF Lo(Code)=$92 THEN pop := pop + 5 (* Turbo-BCD *)
- END;
- (* Vorsicht! Turbo wird genarrt! *)
- INLINE ($5B/ (* POP BX ;pop holen *)
- $59/ (* POP CX ;push holen *)
- $5D/ (* POP BP ;Base-Pointer und ... *)
- $5A/ (* POP DX ;... Stack-Pointer sichern *)
- $58/ (* POP AX ;Ruecksprung entfernen *)
-
- $58/ (* POP AX ;Wort vom Stack entfernen *)
- $45/ (* INC BP ;Base-Pointer korrigieren *)
- $45/ (* INC BP ; *)
- $4B/ (* DEC BX ;Zahl der POPs erniedrigen *)
- $75/$FA/ (* JNZ *-4 ;bis alle POPs durchgefuehrt *)
-
- $31/$C0/ (* XOR AX,AX ;Akkumulator loeschen *)
- $50/ (* PUSH AX ;Wort auf Stack schieben *)
- $4D/ (* DEC BP ;Base-Pointer korrigieren *)
- $4D/ (* DEC BP ; *)
- $49/ (* DEC CX ;Zahl der PUSHs erniedrigen *)
- $75/$FA/ (* JNZ *-4 ;bis alle PUSHs durchgefuehrt*)
-
- $87/$06/$88/$01/ (* XCHG AX,[0188] ;Ruecksprungadresse holen... *)
- $05/$03/$00/ (* ADD AX,0003 ;...modifizieren... *)
- $50/ (* PUSH AX ;...und auf Stack *)
- $52/ (* PUSH DX ;Stack-Pointer und... *)
- $55/ (* PUSH BP ;...Base-Pointer auf Stack *)
- $31/$C0) (* XOR AX,AX ;Akkumulator loeschen *)
- END;
-
- (* ------------------------------------------------------------------------- *)
- (* Initialisierung des Moduls: Fehlerbehandlung umleiten *)
-
- PROCEDURE InitErrorCheck;
-
- BEGIN
- SaveErrorPtr := ErrorPtr;
- ErrorPtr := Ofs (ErrorCheck);
- END;
-
- (* ------------------------------------------------------------------------- *)
- (* Desaktivierung: Turbo's Fehlerbehandlung wiederherstellen *)
-
- PROCEDURE OldErrorCheck;
-
- BEGIN
- ErrorPtr := SaveErrorPtr
- END;
-
- (* ------------------------------------------------------------------------- *)
- (* Ende von ERROR.INC *)
-