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

    UNIT Keybd;  { Keybd.PAS / Keybd.TPU }

    INTERFACE

    USES Crt, Dos;

    TYPE
      CType = ( UBAR, BLOCK );
      Keyboard = OBJECT
        ThisCursor: CType;
        PROCEDURE InitKeyBd;
        PROCEDURE SetCursor( Cursor: CType );
        FUNCTION  GetCursor: CType;
        FUNCTION  GetKbdFlags: Byte;
        FUNCTION  GetKey( VAR KeyFlags: Byte; VAR FunctKey: Boolean;
                                            VAR Ch: Char ): Boolean;
      END;

    {***************************************************************}
                          IMPLEMENTATION
    {***************************************************************}

    {Keyboard}

    {-------------------------------------------------
    - Name   : InitKeyBd                             -
    - Purpose: Set the cursor to underline style     -
    -          and empty keyboard buffer             -
    -------------------------------------------------}

    PROCEDURE Keyboard.InitKeyBd;
      VAR
        Ch : Char;
      BEGIN
        SetCursor( UBAR );
        WHILE( KeyPressed ) DO Ch := ReadKey;
      END;

    {-------------------------------------------------
    - Name   : SetCursor                             -
    - Purpose: Modify number of lines for cursor     -
    -------------------------------------------------}

    PROCEDURE Keyboard.SetCursor;
      VAR
        Regs: Registers;
      BEGIN
        CASE Cursor OF
          UBAR:  Regs.Ch := 6;
          BLOCK: Regs.Ch := 1;
        END;
        Regs.CL := 7;
        Regs.AH := 1;
        Intr( $10, Regs );
      END;

    {-------------------------------------------------
    - Name   : GetKbdFlags                           -
    - Purpose: Monitor the Insert key                -
    - Output : Shift key status flag byte            -
    -------------------------------------------------}

    FUNCTION  Keyboard.GetKbdFlags: Byte;
      VAR
        Regs: Registers;
      BEGIN
        (* FOR enhanced keyboards: AH := $12 *)
        (* FOR normal keyboards:   AH := $02 *)
        Regs.AH := $12;
        Intr( $16, Regs );
        IF( Regs.AX AND $80 = $80 ) THEN SetCursor( BLOCK )
                                    ELSE SetCursor( UBAR );
        GetKbdFlags := Regs.AX;
      END;

    {-------------------------------------------------
    - Name   : GetCursor                             -
    - Purpose: Query current cursor state            -
    -------------------------------------------------}

    FUNCTION  Keyboard.GetCursor;
      BEGIN
        GetCursor := ThisCursor;
      END;

    {-------------------------------------------------
    - Name   : GetKey                                -
    - Purpose: Get a keypress contents if any        -
    -          Updates a function keypressed flag    -
    -------------------------------------------------}

    FUNCTION  Keyboard.GetKey;
      VAR
        Result : Boolean;
      BEGIN
        Result := KeyPressed;
        FunctKey := FALSE;
        Ch := #$00;       {Use this to check for Function key press}
        IF Result THEN BEGIN
          Ch := ReadKey;
          IF( KeyPressed AND ( Ch = #$00 ) ) THEN BEGIN
            Ch := ReadKey;
            FunctKey := TRUE;
            END;
          END;
        KeyFlags := GetKbdFlags;
        GetKey := Result;
        END;

    END.

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