[Back to KEYBOARD SWAG index] [Back to Main SWAG index] [Original]
(*******************************************************************)
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}.
(*******************************************************************)
[Back to KEYBOARD SWAG index] [Back to Main SWAG index] [Original]