[Back to KEYBOARD SWAG index] [Back to Main SWAG index] [Original]
UNIT Break;
{This unit traps the Ctrl-Break sequence}
INTERFACE
USES
DOS;
CONST
BrkTrapped : Boolean = FALSE;
PROCEDURE TrapCtrlBrkOn;
PROCEDURE TrapCtrlBrkOff;
IMPLEMENTATION
CONST
CtrlBrkInterrupt = $1B;
BrkTrapSet : Boolean = FALSE;
VAR
OldBrkVector : Pointer;
{ The following procedure is the new Ctrl-Break
Interrupt handler. It traps the Ctrl-Break key
sequence and setsa flag for the currently
running program to check. You should do any
special processing based on this flag's value}
{$F+}
PROCEDURE NewCtrlBrkVector; INTERRUPT;
{$F-}
BEGIN
INLINE($FA); {Clear interrupts instruction -CLI}
{Reset bit 7 low}
Mem[$0040:$0071] := Mem[$0040:$0071] AND $E;
BrkTrapped := TRUE;
INLINE($FB) {Set interrupts instruction - STI}
END;
PROCEDURE TrapCtrlBrkOn;
BEGIN
{Make sure no stacked calls are possible}
IF NOT BrkTrapSet THEN
BEGIN
BrkTrapSet := TRUE;
GetIntVec(CtrlBrkInterrupt, OldBrkVector);
SetIntVec(CtrlBrkInterrupt, @NewCtrlBrkVector)
END
END;
PROCEDURE TrapCtrlBrkOff;
BEGIN {Check if there is an old vector to restore}
IF BrkTrapSet THEN
BEGIN
BrkTrapSet := FALSE;
SetIntVec(CtrlBrkInterrupt, OldBrkVector)
END
END;
END.
[Back to KEYBOARD SWAG index] [Back to Main SWAG index] [Original]