'===========================================================================
' Subject: QBASIC INTERRUPT CALLS             Date: 10-28-95 (22:32)       
'  Author: Tyler Barnes                       Code: QBasic                 
'  Origin: FidoNet QUIK_BAS Echo            Packet: DOS.ABC
'===========================================================================
DEFINT A-Z
DECLARE FUNCTION ASMCode$ ()
TYPE RegTypeX
ax AS INTEGER
BX AS INTEGER
CX AS INTEGER
dx AS INTEGER
BP AS INTEGER
SI AS INTEGER
DI AS INTEGER
Flags AS INTEGER
DS AS INTEGER
ES AS INTEGER
END TYPE
DIM SHARED Regs AS RegTypeX
DECLARE SUB INTERRUPT (IntNum%, Regs AS RegTypeX)

'** Simple demonstration on using INTERRUPT **
'** Requires a mouse driver **
CLS
Regs.ax = 0
INTERRUPT &H33, Regs
Regs.ax = &H20
INTERRUPT &H33, Regs
Regs.ax = 1
INTERRUPT &H33, Regs

DEFSNG A-Z
FUNCTION ASMCode$
Buf$ = "UVWU^G=" + CHR$(255) + CHR$(255) + "uGG=" + CHR$(255) + CHR$(255) + "uGGFOWw" + CHR$(10) + "" + CHR$(255) + "w" + CHR$(255) + "wF" + CHR$(255) + "wn[!Un^^F"
Buf$ = Buf$ + CHR$(255) + "vFGOWXGw" + CHR$(10) + "GGFGZ_^]" + CHR$(0)
ASMCode$ = Buf$
END FUNCTION

DEFINT A-Z
SUB INTERRUPT (IntNum, Regs AS RegTypeX) STATIC
STATIC FileNum, IntOffset, Loaded
DIM Intcode AS STRING * 200
IF NOT Loaded THEN                        ' loaded will be 0 first time
Intcode = ASMCode        ' load routine and determine
IntOffset = INSTR(Intcode$, CHR$(&HCD) + CHR$(&H21)) + 1 ' int # offset
Loaded = -1
END IF
SELECT CASE IntNum
CASE &H25, &H26, IS > 255               ' ignore these interrupts
CASE ELSE
DEF SEG = VARSEG(Intcode)             ' poke interrupt number into
POKE VARPTR(Intcode) * 1& + IntOffset - 1, IntNum' code block
CALL Absolute(Regs, VARPTR(Intcode$)) ' call routine
END SELECT
END SUB

