[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]