'===========================================================================
' Subject: DETECTING KEY STATUS               Date: 11-17-95 (00:00)       
'  Author: Kerry S. Goodin                    Code: QB, PDS                
'  Origin: kerry.goodin@shivasys.com        Packet: KEYBOARD.ABC
'===========================================================================
'**********************************************************
'*      keyflags.bas by Kerry S. Goodin, D.D.S.           *
'*        Placed in public domain 11-17-95                *
'*               use at your own risk                     *
'**********************************************************


DECLARE SUB keybFlags ()
DEFINT A-Z

'Quick Basic Code for detecting the status of alt, ctrl, left shift, 
'right shift, and insert or the state of the flags of numlock, capslock,
'and scroll lock of ROM BIOS (ie. Flag set on or off)

'remember to start QB with the /lqb switch
'end program with esc key

'$INCLUDE: 'qb.bi'

'declare the types of the flags
TYPE Keyboard
 insert AS INTEGER
 CapsLock AS INTEGER
 NumLock  AS INTEGER
 ScrollLock AS INTEGER
 alt AS INTEGER
 Ctrl AS INTEGER
 LeftShift AS INTEGER
 RightShift AS INTEGER
END TYPE

DIM SHARED inRegs AS RegType
DIM SHARED outRegs AS RegType
DIM SHARED kb AS Keyboard

CLS
PRINT "Demo of reading the keyboard flags"
PRINT "press esc to end"

DO
 COLOR 4, 7, 0
 LOCATE 20, 5, 0:
 CALL keybFlags
 IF kb.alt THEN
     PRINT " alt ";
 ELSE
     PRINT "     ";
 END IF
 IF kb.Ctrl THEN
     PRINT " Ctrl ";
 ELSE
     PRINT "      ";
 END IF
 IF kb.LeftShift THEN
     PRINT " LeftShift ";
 ELSE
     PRINT "           ";
 END IF
 IF kb.RightShift THEN
     PRINT " RightShift ";
 ELSE
     PRINT "            ";
 END IF
 IF kb.insert THEN
     PRINT " Insert ";
 ELSE
     PRINT "        ";
 END IF
 IF kb.CapsLock THEN
     PRINT " CapsLock ";
 ELSE
     PRINT "          ";
 END IF
 IF kb.NumLock THEN
     PRINT " NumLock ";
 ELSE
     PRINT "         ";
 END IF
 IF kb.ScrollLock THEN
     PRINT " ScrollLock ";
 ELSE
     PRINT "            ";
 END IF
 IF INKEY$ = CHR$(27) THEN EXIT DO 'get out of loop

LOOP

END

SUB keybFlags

 'call the keyboard flags service
        'Int 16H Function 02H

 inRegs.ax = &H200
 CALL interrupt(&H16, inRegs, outRegs)

 'extract the bits of the flag byte
 kb.insert = outRegs.ax \ 128
 kb.CapsLock = (outRegs.ax AND &H40) \ 64
 kb.NumLock = (outRegs.ax AND &H20) \ 32
 kb.ScrollLock = (outRegs.ax AND &H10) \ 16
 kb.alt = (outRegs.ax AND &H8) \ 8
 kb.Ctrl = (outRegs.ax AND &H4) \ 4
 kb.LeftShift = (outRegs.ax AND &H2) \ 2
 kb.RightShift = (outRegs.ax AND 1)

END SUB
