[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]