{@@@@@@@@@@@ copyright (C) 1984 by Neil J. Rubenking @@@@@@@@@@@@@@@@@@@@@@@@
The purchaser of these procedures and functions may include them in COMPILED
programs freely, but may not sell or give away the source text.

    This is a fancy driver for KEYBOARD.LIB.  It returns a character
    or descriptive phrase for ANY key pressed.  Note, though, that the
    <Alt> + <keypad number> combinations will be rendered as their
    equivalent <Ctrl> + <letter>s. (Alt-1 = Ctrl-A, etc.)


}


{$I regpack.typ}
{$I keyboard.lib}
type
  KeyType = string[12];
var
  KeyValue            : integer;
  ASCIIcode, ScanCode : byte;
  Result              : KeyType;

{@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}
function Read_Keyboard: KeyType;
var
  TempRead : KeyType;
  {============================================================}
function SpecialKey(Code:byte):KeyType;
const
  Row0 : KeyType = '1234567890-=';
  Row1 : KeyType = 'QWERTYUIOP';
  Row2 : KeyType = 'ASDFGHJKL';
  Row3 : KeyType = 'ZXCVBNM';
var
  temp : KeyType;
begin
case code of
       14: temp := 'BackSpace';
       15: temp := 'Back Tab';
   16..25: temp := 'Alt-' + Row1[code-15];
   30..38: temp := 'Alt-' + Row2[code-29];
   44..50: temp := 'Alt-' + Row3[code-43];
 120..131: temp := 'Alt-' + Row0[code-119];
   59..67: temp := 'F' + chr(code - 10);
       68: temp := 'F10';
   84..92: temp := 'Shift F' + chr(code-35);
       93: temp := 'Shift F10';
  94..102: temp := 'Ctrl-F' + chr(code-45);
      103: temp := 'Ctrl-F10';
 104..112: temp := 'Alt-F' + chr(code-55);
      113: temp := 'Alt-F10';
       71: temp := 'Home';
       72: temp := 'Up';
       73: temp := 'PgUp';
       75: temp := 'Left';
       77: temp := 'Right';
       79: temp := 'End';
       80: temp := 'Down';
       81: temp := 'PgDn';
       82: temp := 'Ins';
       83: temp := 'Del';
      114: temp := 'Ctrl-PrtSc';
      115: temp := 'Ctrl-Left';
      116: temp := 'Ctrl-Right';
      117: temp := 'Ctrl-End';
      118: temp := 'Ctrl-PgDn';
      119: temp := 'Ctrl-Home';
      132: temp := 'Ctrl-PgUp';
 else
   temp := 'Ctrl-Break';
 end;  {case}
SpecialKey := temp;
end;
  {============================================================}
function SpecChr(code:byte):KeyType;
begin
  case code of
     0..26 : SpecChr := 'Ctrl-' + chr(code + 64);
        27 : SpecChr := 'Esc';
   28..255 : SpecChr := chr(code);
  end;
end;
  {============================================================}
begin
    KeyValue  := KeyBoard('W');
    ScanCode  := KeyValue shr 8;
    ASCIICode := (KeyValue shl 8) shr 8;
                    {The special keys that have no ASCII character generate }
                    {a zero in place of the code.  However, there are three }
                    {non-printable characters that DO have an ASCII code.   }
                    {Their scan codes are 14, 15, and 28.  We provide for   }
                    {them below.                                            }

    if (not (ScanCode in [14,15,28])) and (ASCIICode <> 0)  then
      TempRead := SpecChr(ASCIICode)
    else
      begin
        if ASCIICode <> 0 then
          begin
            case ScanCode of
              14: TempRead := 'BackSpace';
              15: TempRead := 'Tab';
              28: TempRead := 'Return';
            end;  {case}
          end  {second if}
      else
    TempRead := SpecialKey(ScanCode);
      end;  {the upper else}
   Read_Keyboard := TempRead;
end;

{@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}
begin
  WriteLn('Press various keys and key combinations.');
  WriteLn('Press <ctrl><break> to stop.');
  repeat
    Result := Read_Keyboard;
    WriteLn(Result);
  until Result = 'Ctrl-Break';
end.