home *** CD-ROM | disk | FTP | other *** search
- Unit BreakOut;
- { This Unit will intercept hardware interrupt $9 and check for a Ctrl-Break. }
- { If the interrupt does not contain a Ctrl-Break the preceding Int9 is called.}
- { If Ctrl-Break was pressed we call Turbo's int23 handler to stop execution }
- { of the program, while still executing the ExitProcs. }
-
- INTERFACE
-
- Uses DOS,CRT;
-
- IMPLEMENTATION
-
- Var
- Int23,
- OldExit,
- OldKBD : pointer;
-
- Procedure JmpOldISR ( OldISR: pointer );
- Inline ( $5B/$58/$87/$5E/$0E/$87/$46/$10/$89/
- $EC/$5D/$07/$1F/$5F/$5E/$5A/$59/$CB );
-
- {$F+}
- Procedure Key_ISR; Interrupt;
- Begin
- If CheckBreak AND ( ( Mem [0000:$0417] AND 4 ) = 4 ) AND
- ( Port[$60] = 70 ) Then
- Begin
- Inline ( $E4/$61/$8A/$E0/$0C/$80/$E6/$61/ { Clean up as the }
- $86/$E0/$E6/$61/$B0/$20/$E6/$20 ); { Bios would }
- JmpOldISR( Int23 ); {Jump to current Int23 handler (turbo's) }
- End;
- JmpOldISR( OldKBD ); {Jump to Old Keyboard handler }
- End;
-
- Procedure Exitit;
- Begin
- ExitProc := OldExit; { Restore Old ExitProc pointer }
- SetIntVec ( 9, OldKBD ); { Restore Old Int9 Handler }
- End;
- {$F-}
-
- Begin
- OldExit := ExitProc; { Save old ExitProc pointer }
- ExitProc := @Exitit; { Set new ExitProc pointer }
- GetIntVec ( $23, Int23 ); { Get Turbo's Int23 Vector }
- GetIntVec ( 9, OldKBD ); { Get Current Int9 Vector }
- SetIntVec ( 9, @Key_ISR ); { Set Int9 to our routine }
- End.
-