[Back to INTERRUP SWAG index] [Back to Main SWAG index] [Original]
Uses Dos;
var
ExitSave,
BKDISave,
BKDIHandler : Pointer;
Regs : Registers;
Abort : Boolean;
{$F+}
procedure NewCntlBreakHandler(Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP:Word);
interrupt;
begin
inline($FA); { disable interrupts }
{ do nada widda data } { OR DO ANYTHING YOU WANT }
inline($FB); { enable interrupts }
Abort := True; { Use this for (while NOT abort do..) }
end;
procedure NewBKDIHandler(Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP:Word);
interrupt;
begin
inline($FA); { disable interrupts }
{ do nada widda data } { OR DO ANYTHING YOU WANT }
inline($FB); { enable interrupts }
AX := 0; {This must remain. An oversight in Turbo Pascal.}
end;
procedure MyExit;
begin
ExitProc := ExitSave;
SetIntVec($1B, BKDISave);
SetIntVec($24, BKDIHandler);
end;
{$F-}
begin
ExitSave := ExitProc;
ExitProc := @MyExit;
Regs.AH := $35; { Get Cntl-Break Interrupt Vector }
Regs.AL := $1B;
Intr($21,Regs);
BKDISave := Ptr(Regs.ES, Regs.BX);
SetIntVec($1B, @NewBKDIHandler);
Regs.AH := $35; { Get Cntl-Break Handler Interrupt Vector }
Regs.AL := $23;
Intr($21,Regs);
BKDIHandler := Ptr(Regs.ES, Regs.BX);
SetIntVec($23, @NewCntlBreakHandler);
{ Do whatever here. When finished, the old interrupt vectors are
restored in the MyExit procedure }
end.
[Back to INTERRUP SWAG index] [Back to Main SWAG index] [Original]