[Back to KEYBOARD SWAG index] [Back to Main SWAG index] [Original]
{
BI> In TP, when you do a 'ReadKey', the keyboard buffer is
BI> 'updated'. When use 'KeyPressed' it just tells you whether
BI> a key has been pressed. Does anyone have any source etc on
BI> how to see if a specific key has been pressed, but which
BI> leaves the other keys alone?
BI>
If I understand you correctly, this should interest you:
Check enhanced keystroke (Int 16/11)
INT 16 - KEYBOARD - (AT model 339,XT2,XT286,PS)
AH = 11h
Return: ZF clear if keystroke available
AH = scan code \ meaningless if ZF = 1
AL = character /
ZF set if kbd buffer empty
SeeAlso: AH=01h,10h
^^^ use this if you own an XT
}
PROGRAM Check_Keyboard_Buffer;
USES Crt;
FUNCTION KeyAvailable(VAR Keystroke: word): boolean; ASSEMBLER;
ASM xor dx, dx { -- DX has the result of the function;
-- initialize to FALSE. }
mov ah, $11
int $16 { -- Ask the BIOS. }
jz @@Exit { -- No key waiting, so quit. }
les di, Keystroke { -- Key waiting; move it to Keystroke. }
mov es:[di], ax
inc dx { -- Function result := TRUE. }
@@Exit:
mov ax, dx { -- TP expects a boolean function result to be
-- in AX, so move DX to AX. }
END;
PROCEDURE MakeKbdBufferEmpty;
BEGIN WHILE keypressed DO readkey END;
FUNCTION HexB(CONST B: byte): STRING;
{ -- Return hex string for byte. }
CONST Digits: ARRAY[$00 .. $0F] OF char = '0123456789ABCDEF';
BEGIN HexB[0]:= #3;
HexB[1]:='$';
HexB[2]:=Digits[B SHR 4];
HexB[3]:=Digits[B AND $0F]
END;
{ -- Main: }
CONST Esc = $011B;
VAR key : word;
X, Y, TA: byte;
BEGIN clrscr;
MakeKbdBufferEmpty; { -- "Eat" any still available keys. }
REPEAT write('*'); delay(10);
IF KeyAvailable(key)
THEN BEGIN X:=WhereX; Y:=WhereY;
TA:=TextAttr; TextAttr:=$30;
gotoxy(25, 12);
write('Scancode: ', HexB(hi(key)),
' Character: ', HexB(lo(key)));
delay(100);
MakeKbdBufferEmpty;
{ -- Remove that key from the buffer, otherwise
-- it will remain there forever ! }
gotoxy(X, Y); TextAttr:=TA
END
UNTIL key = Esc
END.
[Back to KEYBOARD SWAG index] [Back to Main SWAG index] [Original]