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

    {
    The code included in this example shows how to read
    an enhanced keyboard using Turbo Pascal. That is, it detects
    if the F11, F12, etc keys are pressed. It provides a substitute
    for the ReadKey and KeyPressed functions.
         This TI includes two source files, the first a unit
    called ENHKEY.PAS and the second a test program called TEST.PAS.
    ENHKEY.PAS contains three routines:

       KeyEPressed: Works just like the CRT routine called
    KeyPressed,
              except it detects keypresses on enhanced keys.

       NewReadKey:  Works very much like ReadKey, except it detects
              enhanced keys.

       ReadEKey:    This is the raw readkey function. It returns a
    word.
              The high order word contains the scan code and the
              low word contains the regular key. Some users might
              not want to call this function directle, but instead
              might want to access it through the NewReadKey
    function,
              which acts much more like the original ReadKey function

              from the CRT unit.

         The code in the EnhKey unit depends on interrupt 16h,
    functions
    10 and 11, both of which assume the presence of AT or better
    computer.
    In this day and age, that's a fairly safe bet, but you should be
    aware
    that this code will not run on an old XT.
         Notice that if NewReadKey returns zero the first time it is
    called, you can grab the scan code in the global variable
    ScanCode,
    or you can call NewReadKey a second time to return the ScanCode.

    }

    unit EnhKey;

    interface
    var
      ScanCode: Byte;

    function KeyEPressed: Boolean;
    function ReadEKey: Word;
    function NewReadKey: Char;

    implementation

    function KeyEPressed: Boolean; assembler;
    asm
      mov ah, $11
      int 16h
      mov ax, 1
      jnz @@True
      xor ax, ax
    @@True:
    end;

    function ReadEKey: Word; assembler;
    asm
      mov ah, 10h
      int 16h
    end;

    function NewReadKey: Char;
    var
      Ch: Word;
    begin
      if ScanCode <> 0 then begin
        NewReadKey := Char(ScanCode);

        ScanCode := 0;
        exit;
      end;
      Ch := ReadEKey;
      if Lo(Ch) = 0 then begin
        ScanCode := Hi(Ch);
        NewReadKey := #0;
        exit;
      end;
      NewReadKey := Char(Lo(Ch));
    end;
    begin
      ScanCode := 0;
    end.
    begin
      ScanCode := 0;
    end.

    { ================= The Test Program ================ }

    program Test;
    uses
      EnhKey;

    var
      Ch: Char;
      i: Integer;
    begin
      i := 0;
      while (Ch <> #27) do begin
        if KeyEpressed then begin
          Ch := NewReadKey;

          if Ch = #0 then begin
         Ch := NewReadKey;
         WriteLn('Enhanced: ', Ch)
          end else
         WriteLn('Normal: ', Ch);
          inc(i);
        end;
      end;
    end.

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