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