'===========================================================================
' Subject: ALT/CTRL/SHIFT/CAPS/NUM/SCRL       Date: Unknown Date (00:00)   
'  Author: Matt Hart                          Code: QB, PDS                
'  Origin: ALT,CTRL,SHIFT,CAPS,NUM,SCRL     Packet: KEYBOARD.ABC
'===========================================================================
'
' KEYSTUFF.BAS  by Matt Hart
' Uses Interrupt 16H for various keyboard operations.
'
' The scroll lock, num lock, caps lock, and insert
' key flags remain ON until pressed again, thus the need for
' the ?Flag variables in this demo program.
'
' Also see Keystuf.asm for assembly language equivilants.
'
    DEFINT A-Z
    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
    DECLARE FUNCTION RShift()
    DECLARE FUNCTION LShift()
    DECLARE FUNCTION CtrlKey()
    DECLARE FUNCTION AltKey()
    DECLARE FUNCTION ScrollLock()
    DECLARE FUNCTION NumLock()
    DECLARE FUNCTION CapsLock()
    DECLARE FUNCTION InsertKey()
    SFlag=0 : NFlag=0 : CFlag=0 : IFlag=0
    DO
        IF RShift     THEN PRINT "Right Shift Key"
        IF LShift     THEN PRINT "Left Shift Key"
        IF CtrlKey    THEN PRINT "Control Key"
        IF AltKey     THEN PRINT "Alt Key"
        IF ScrollLock AND NOT SFlag THEN
            PRINT "Scroll Lock Enabled"
            SFlag = NOT SFlag
        ELSEIF NOT ScrollLock AND SFlag THEN
            PRINT "Scroll Lock Disabled"
            SFlag = NOT SFlag
        ENDIF
        IF NumLock AND NOT NFlag THEN
            PRINT "Num Lock Enabled"
            NFlag = NOT NFlag
        ELSEIF NOT NumLock AND NFlag THEN
            PRINT "Num Lock Disabled"
            NFlag = NOT NFlag
        ENDIF
        IF CapsLock AND NOT CFlag THEN
            PRINT "Caps Lock Enabled"
            CFlag = NOT CFlag
        ELSEIF NOT CapsLock AND CFlag THEN
            PRINT "Caps Lock Disabled"
            CFlag = NOT CFlag
        ENDIF
        IF (InsertKey AND NOT IFlag) OR_
           (NOT InsertKey AND IFlag) THEN
            PRINT "Insert Key Toggled"
            IFlag = NOT IFlag
        ENDIF
    LOOP UNTIL INKEY$=CHR$(27)
    END
'
FUNCTION RShift
    CALL KeyInt(AL) : RShift = (AL AND 1) = 1
END FUNCTION
'
FUNCTION LShift
    CALL KeyInt(AL) : LShift = (AL AND 2) = 2
END FUNCTION
'
FUNCTION CtrlKey
    CALL KeyInt(AL) : CtrlKey = (AL AND 4) = 4
END FUNCTION

FUNCTION AltKey
    CALL KeyInt(AL) : AltKey = (AL AND 8) = 8
END FUNCTION
'
FUNCTION ScrollLock
    CALL KeyInt(AL) : ScrollLock = (AL AND 16) = 16
END FUNCTION
'
FUNCTION NumLock
    CALL KeyInt(AL) : NumLock = (AL AND 32) = 32
END FUNCTION
'
FUNCTION CapsLock
    CALL KeyInt(AL) : CapsLock = (AL AND 64) = 64
END FUNCTION
'
FUNCTION InsertKey
    CALL KeyInt(AL) : InsertKey = (AL AND 128) = 128
END FUNCTION
'
SUB KeyInt(AL)
    DIM InRegs AS RegTypeX
    DIM OutRegs AS RegTypeX
    InRegs.AX = &H0200
    CALL InterruptX(&H16,InRegs,OutRegs)
    AL = OutRegs.AX MOD 256
END SUB
