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

    {
    >  Does anybody know of a way to reWrite the keyboard routines, to be abl
    >  to read several keys at once? ReadKey will only read the last keypress
    >  anything else I've tried can only read the last key you have pressed d
    >
    >  For example, in many games it will let you move Forward (With the Forw
    >  arrow key) and shoot at the same time, With the space bar...Any sugges
    }

    Unit POLL ;         { polled keyboard handler }
                        { does not support F11 or F12 keys } Interface

    Const
       EscKey = 1 ;    { key codes }
       aKey = 30 ;     { see TP 6 Programmers guide p 354 }
       sKey = 31 ;
       endKey = 79 ;
       DownKey = 80 ;

    Var
       KeyTable : Array[ 1..127 ] of Boolean ; { KeyTable[ x ] is True when key x
    is pressed } { and stays True Until key x is released }

    Implementation

    Uses Dos, KeyIntr ;  { keyboard interrupt support }

    Var
       OldInt09 : Pointer ;
       ExitSave : Pointer ;

    {$F+} Procedure RestoreInt09 ;
    begin
       ExitProc := ExitSave ;
       SetIntVec( $09, OldInt09 ) ;
    end ;

    {$F+} Procedure NewInt09 ; interrupt ;
    Var
       ScanCode : Byte ;
       KeyCode : Byte ;
    begin
       STI ;
       ScanCode := ReadScanCode ;
       KeyCode := ScanCode and $7F ;        { strip make/break bit }
       KeyTable[ KeyCode ] := ( ScanCode and $80 ) = 0 ; (* { For non C Programmers
    }
       if ( ScanCode and $80 ) = 0  then    { make code -- key pressed }
          KeyTable[ KeyCode ] := True
       else                                 { break code -- key released }
          KeyTable[ KeyCode ] := False ;
    *)
       ResetKeyboard ;
       EOI ;
    end ;

    Var
       N : Byte ;

    begin
       ExitSave := ExitProc ;
       ExitProc := addr( RestoreInt09 ) ;

       For N := 1 to 127 do            { no key pressed }
          KeyTable[ N ] := False ;

       GetIntVec( $09, OldInt09 ) ;
       SetIntVec( $09, addr( NewInt09 ) ) ;
    end.
    {---------------------------------------------} Program TwoKeys;

    Uses Crt, Poll ;  { polled keyboard handler } { ----- this Program will
    probably hang a debugger ----- } Var
       X, Y : Byte ;
    begin
       ClrScr ;
       X := 40 ;
       Y := 12 ;

       WriteLn( 'Hit keys A S  and  1 2 on the keypad' ) ;
       WriteLn( ' -- Esc to stop' ) ;

       While not KeyTable[ EscKey ] do
       begin
          GotoXY( X, Y ) ;
          Write( ' ' ) ;

    { poll the KeyTable }
          if KeyTable[ endKey ] and ( X > 1 ) then  Dec( X ) ;
          if KeyTable[ DownKey ] and ( X < 80 ) then  Inc( X ) ;
          if KeyTable[ aKey ] and ( Y > 4 ) then  Dec( Y ) ;
          if KeyTable[ sKey ] and ( Y < 24 ) then  Inc( Y ) ;

          GotoXY( X, Y ) ;
          Write( chr( 1 ) ) ;
          Delay( 10 ) ;
       end ;
    end.

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