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

    {
    To the person that posted the message about using KeyPressed or anyone
    else interested. Below is a Function that I have used to read keyboard input
    that is similiar to KeyPressed.  It does a KeyPressed and ReadKey all in one
    statement.  If you are familiar With BASIC this InKey Function is similiar
    to the one in BASIC in that is doesn't sit and wait For input.  The KeyEnh
    Function just returns True/False depending on whether or not it detected
    an Enhanced keyboard. SHIFT, CTRL, and ALT are global Boolean Variables
    which value reflect the state of these keys involved in the the keypress.
    }

    Uses
      Dos;

    Function KeyEnh:  Boolean;
    Var
      Enh:  Byte Absolute $0040:$0096;

    begin
      KeyEnh := False;
      if (Enh and $10) = $10 then
        KeyEnh := True;
    end;

    Function InKey(Var SCAN, ASCII:  Byte): Boolean;
    Var
      i     :  Integer;
      Shift,
      Ctrl,
      Alt   : Boolean;
      Temp,
      Flag1 : Byte;
      HEXCH,
      HEXRD,
      HEXFL : Byte;
      reg   : Registers;

    begin
      if KeyEnh then
      begin
        HEXCH := $11;
        HEXRD := $10;
        HEXFL := $12;
      end
      else
      begin
        HEXCH := $01;
        HEXRD := $00;
        HEXFL := $02;
      end;

      reg.ah := HEXCH;
      Intr($16, reg);
      i := reg.flags and FZero;

      reg.ah := HEXFL;
      Intr($16, reg);
      Flag1 := Reg.al;
      Temp  := Flag1 and $03;

      if Temp = 0 then
        SHIFT := False
      ELSE
        SHIFT := True;

      Temp  := Flag1 and $04;
      if Temp = 0 then
        CTRL := False
      ELSE
        CTRL := True;

      Temp  := Flag1 and $08;
      if Temp = 0 Then
        ALT  := False
      ELSE
        ALT  := True;

      if i = 0 then
      begin
        reg.ah := HEXRD;
        Intr($16, reg);
        scan  := reg.ah;
        ascii := reg.al;
        InKey := True;
      end
      else
        InKey := False;
    end;

    Var
      Hi, Hi2 : Byte;

    begin
      Repeat Until InKey(Hi,Hi2);
      Writeln(Hi);
      Writeln(Hi2);
    end.

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