'===========================================================================
' Subject: MONITOR INTERRUPTS                 Date: 04-15-96 (02:22)       
'  Author: Tyler Barnes                       Code: QB, PDS                
'  Origin: FidoNet QUIK_BAS Echo            Packet: INTERRPT.ABC
'===========================================================================
'Well, this code may be kind of useless, but it's something that I was messing
'with, and decided to post. I don't really have a use for it, maybe someone
'else does... It could probably be written better as well. You can see I don't
'have a high opinion on this code. <G>
'It allows you to monitor interrupts... Sort of pseudo-trapping.

DECLARE FUNCTION CalledInterrupt% (intnum%)
DECLARE SUB TrapInterrupt (intnum%, ExitProc%)
DECLARE SUB RestoreInterrupt (intnum%)
'$INCLUDE: 'qb.bi'
DIM SHARED InregX AS RegTypeX, OutregX AS RegTypeX
DIM IntSegs(0 TO 255) AS INTEGER, IntOffs(0 TO 255) AS INTEGER
DIM IntCode(0 TO 255) AS STRING * 25
 
CONST Abort = 0, Continue = 1, All = -1
 
'Pseudo interrupt trapper
'Future enhancements: Decrease memory used?
'                     Return Registers
 
 
TrapInterrupt 5, Abort
DO
LOOP UNTIL CalledInterrupt(5)
RestoreInterrupt All

DEFINT A-Z
FUNCTION CalledInterrupt (intnum%)
SHARED Interrupts AS STRING * 256
IF MID$(Interrupts, intnum% + 1, 1) = CHR$(2) THEN
MID$(Interrupts, intnum% + 1, 1) = CHR$(1)
CalledInterrupt = -1
ELSE
CalledInterrupt = 0
END IF
END FUNCTION

SUB RestoreInterrupt (intnum)
SHARED Interrupts AS STRING * 256, IntSegs() AS INTEGER, IntOffs() AS INTEGER
IF intnum < 0 THEN
FOR I% = 1 TO 256
IF MID$(Interrupts, I%, 1) <> CHR$(0) THEN
InregX.Ax = &H2500 + (I% - 1)
InregX.DS = IntSegs(I% - 1)
InregX.Dx = IntOffs(I% - 1)
CALL INTERRUPTX(&H21, InregX, OutregX)
END IF
NEXT I%
ELSE
InregX.Ax = &H2500 + intnum
InregX.DS = IntSegs(intnum)
InregX.Dx = IntOffs(intnum)
CALL INTERRUPTX(&H21, InregX, OutregX)
END IF
END SUB

SUB TrapInterrupt (intnum, ExitProc)
SHARED IntCode() AS STRING * 25, Interrupts AS STRING * 256
SHARED IntSegs() AS INTEGER, IntOffs() AS INTEGER
STATIC FirstTime
IF FirstTime = 0 THEN
FirstTime = 1
FOR I% = 0 TO 255
MID$(Interrupts, I% + 1, 1) = CHR$(0)
NEXT I%
END IF
InregX.Ax = &H3500 + intnum
CALL INTERRUPTX(&H21, InregX, OutregX)
IntSegs(intnum) = OutregX.ES
IntOffs(intnum) = OutregX.Bx
MID$(Interrupts, intnum + 1) = CHR$(1)
IC$ = CHR$(6) + CHR$(&H55) + CHR$(&H50) + CHR$(&HB8)
IC$ = IC$ + MKI$(VARSEG(Interrupts))
IC$ = IC$ + CHR$(&H8E) + CHR$(&HC0) + CHR$(&HBD) + MKI$(VARPTR(Interrupts) + intnum)
IC$ = IC$ + CHR$(&HB0) + CHR$(2) + CHR$(&H26) + CHR$(&H88) + CHR$(&H46)
IC$ = IC$ + CHR$(0) + CHR$(&H58) + CHR$(&H5D) + CHR$(7)
IF ExitProc = 0 THEN
IC$ = IC$ + CHR$(&HCF)
ELSE
IC$ = IC$ + CHR$(&HEA) + MKI$(IntOffs(intnum)) + MKI$(IntSegs(intnum))
END IF
IntCode(intnum) = IC$
InregX.Ax = &H2500 + intnum
InregX.DS = VARSEG(IntCode(intnum))
InregX.Dx = VARPTR(IntCode(intnum))
CALL INTERRUPTX(&H21, InregX, OutregX)
END SUB

