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