(*******************************************************************) PROGRAM xKeys; { test detecting shift/alt/ctrl/sysreq keys } { Turbo/Quick Pascal Oct.1992 Greg Vigneault } USES Crt; { import for ClrScr and KeyPressed } {-------------------------------------------------------------------} TYPE LockKey = ( RShift,LShift,Ctrl,Alt,Scroll,NumLock,Caps,Insert, RightAlt,LeftAlt,RightCtrl,LeftCtrl,SysReq ); VAR KeyByte1 : BYTE Absolute $40:$17; { data maintained by BIOS } KeyByte2 : BYTE Absolute $40:$18; KeyByte3 : BYTE Absolute $40:$96; {-------------------------------------------------------------------} FUNCTION KeyOn( xkey : LockKey ) : BOOLEAN; { TRUE if LockKey on } BEGIN CASE xkey OF RShift..Insert : KeyOn:=BOOLEAN( KeyByte1 SHR ORD(xkey) AND 1); RightAlt : KeyOn:=BOOLEAN( KeyByte3 SHR 3 AND 1 ); LeftAlt : KeyOn:=BOOLEAN( KeyByte2 SHR 1 AND 1 ); RightCtrl : KeyOn:=BOOLEAN( KeyByte3 SHR 2 AND 1 ); LeftCtrl : KeyOn:=BOOLEAN( KeyByte2 AND 1 ); SysReq : KeyOn:=BOOLEAN( KeyByte2 SHR 2 AND 1 ); END; {case} END; {-------------------------------------------------------------------} FUNCTION Keyboard101 : BOOLEAN; { TRUE for 101/102-key kybd } BEGIN KeyBoard101 := BOOLEAN( KeyByte3 SHR 4 AND 1 ); END; {-------------------------------------------------------------------} VAR xkey : LockKey; BEGIN REPEAT gotoxy(1,1); WriteLn('Press any of...'); Write('Shifts: '); IF KeyOn(LShift) OR KeyOn(RShift) { either shift down? } THEN BEGIN IF KeyOn(LShift) THEN Write('LEFT '); IF KeyOn(RShift) THEN Write('RIGHT'); WriteLn; END ELSE WriteLn('none'); { neither shift } Write('Controls: '); IF KeyOn(Ctrl) { either ctrl down? } THEN BEGIN IF KeyOn(LeftCtrl) THEN Write('LEFT '); IF KeyOn(RightCtrl) THEN Write('RIGHT'); WriteLn; END ELSE WriteLn('none'); { neither ctrl } Write('Alt keys: '); IF KeyOn(Alt) { either Alt down? } THEN BEGIN IF KeyOn(LeftAlt) THEN Write('LEFT '); IF KeyON(RightAlt) THEN Write('RIGHT'); WriteLn; END ELSE WriteLn('none'); { neither alt } FOR xkey := Scroll TO Insert { check other keys } DO BEGIN CASE xkey OF Scroll : Write('Scroll: '); NumLock : Write('NumLock: '); Caps : Write('CapsLock: '); Insert : Write('Insert: '); END; {case} IF KeyOn(xkey) THEN WriteLn('ON') ELSE WriteLn('OFF'); END; IF KeyBoard101 THEN BEGIN Write('SysReq: '); IF KeyOn(SysReq) THEN WriteLn('ON') ELSE WriteLn('OFF'); END; UNTIL KeyPressed; END {xKeys}. (*******************************************************************)