[Back to KEYBOARD SWAG index] [Back to Main SWAG index] [Original]

    {
    Author : GAYLE DAVIS

    I have seen a number of messages recently about keyboard access.  Here are
    some neat FAST routines to use instead of ReadKey (Crt Unit).  Be advised
    that in these routines, I add 128 to the HI Byte in order to be able to use
    all 256 Characters.  Just remember to add 128 to test For all Function keys.
    }

    Uses
      Dos;

    Function GetKey (Var Key : Word) : Boolean; Assembler;
    { determine if key pressed and return it as a Word }
    { if Lo(key) = 0 and Hi(key) <> 0 then we have a FN key ! }
    Asm
      MOV     AH, 1
      INT     16H
      MOV     AL, 0
      JE      @@1
      xor     AH, AH
      INT     16H
      LES     DI, Key
      MOV     Word PTR ES : [DI], AX
      MOV     AL, 1
     @@1 :
    end;

    Function GetChar (Var Key : Char) : Boolean;
    { determine if key pressed and return it as a Char}
    Var
      c : Word;
    begin
      Key := #0;
      if GetKey (c) then
      begin
        GetChar := True;
        if (LO (c) = 0) and (HI (c) <> 0) then
          Key := CHR ( HI (c) + 128 )  { add 128 For FN keys }
        else
          Key := CHR (LO (c) );
      end
      else
        GetChar := False;
    end;

    Function KeyReady : Char;
    { looks For and PEEKS at Char but DOES not read it out of buffer }
    { returns the Char it finds or #0 if no Character waiting        }
    Var
      Regs : Registers;
      Key  : Byte;
    begin
      Regs.AH := 1;                          { determine if a key has been }
      INTR ( $16, Regs );                    { converted to a key code     }
      if ( Regs.Flags and FZERO = 0 ) then
      begin                          { yes, Character now in keyboard buffer }
                                     { determine what it is }
        if ( Regs.AL = 0 ) then
          Key := Regs.AH + 128
        else
          Key := Regs.AL;
      end
      else
        Key := 0;
      KeyReady := CHR (Key);
    end;

    Procedure ClearKeyBuffer;
    Var
      Regs : Registers;
    begin
      Regs.AH := 0;                { Clear ENTIRE keyboard }
      INTR ( $16, Regs );          { buffer via the BIOS   }
    end;

    Function AnyKeyPressed (Ch : Char; Clear : Boolean) : Boolean;
    { Check if a Character is present in buffer, and optionally clears it }
    Var
      Key  : Char;
      Regs : Registers;

    begin
      Key := KeyReady;
      AnyKeyPressed := (Key = Ch);
      if (Key = Ch) and Clear then
        ClearKeyBuffer;
    end;

[Back to KEYBOARD SWAG index] [Back to Main SWAG index] [Original]