[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
Oops, I Forgot to include one of the Units you'll need to do this. I've already
sent you POLL.PAS and TWOKEYS.PAS.  Here's KEYinTR.PAS:
}
Unit KeyIntr ;  { support For inT 09 routines } { Turbo Pascal 5.5 } Interface
Procedure CLI ;  Inline( $FA ) ;   { disable interrupts } Procedure STI ;
Inline( $FB ) ;   { enable interrupts } { cannot be used outside an interrupt
Procedure } Procedure JumpInterrupt( p : Pointer ) ; { see TP5 Ref p 222
} Inline( $5B/$58/                         { POP  BX, AX   AX:BX = p }
        $89/$EC/                         { MOV  SP, BP             }
        $87/$46/$10/                     { XCHG AX, [BP+10H]       }
        $87/$5E/$0E/                     { XCHG BX, [BP+0EH]       }
        $5D/$07/$1F/$5F/$5E/             { POP  BP, ES, DS, DI, SI }
        $5A/$59/                         { POP  DX, CX             }
        $FA/                             { CLI                     }
        $CB ) ;                          { RETF          jmp Far p }

Function Control_Pressed : Boolean ;
Procedure EOI ;                         { end of interrupt to 8259 } Function
ReadScanCode : Byte ;             { read keyboard } Procedure ResetKeyboard ;
               { prepare For next key } Procedure StoreKey( Scan, Key : Byte )
;
                                   { put key in buffer For inT 16 }
Implementation Uses Crt ;  { Sound, NoSound } Type
   Address = Record                  { used in Pointer manipulation }
                offset : Word ;
                Segment : Word ;
             end ;
Const
   BiosDataSegment = $40 ;
Var
   KeyState       : Word Absolute BiosDataSegment:$0017 ;
   KeyBufferHead  : Word Absolute BiosDataSegment:$001A ;
   KeyBufferTail  : Word Absolute BiosDataSegment:$001C ;
   KeyBufferStart : Word Absolute BiosDataSegment:$0080 ;
   KeyBufferend   : Word Absolute BiosDataSegment:$0082 ;


Function Control_Pressed : Boolean ;
begin
Control_Pressed := ( KeyState and  4 ) = 4 ; end ;

Procedure EOI ;  { end of interrupt to 8259 interrupt controller } begin
   CLI ;
   Port[$20] := $20 ;     { see TP5 ref p 211 } end ;

Function ReadScanCode : Byte ;
begin
ReadScanCode := Port[$60] ;
end ;

Procedure ResetKeyboard ;      { prepare For next key } Var
   N : Byte ;
begin
   N := Port[$61] ;
   Port[$61] := ( N or $80 ) ;
   Port[$61] := N ;
end ;

Procedure StoreKey( Scan, Key : Byte ) ; Var                { put key in buffer
that inT 16 reads }
   P : ^Word ;
   N : Word ;
begin
   address(P).segment := BiosDataSegment ;
   N := KeyBufferTail ;
   address(P).offset := N ;
   Inc( N, 2 ) ;                      { advance Pointer two Bytes }
   if( N = KeyBufferend ) then        { end of the circular buffer }
      N := KeyBufferStart ;
   if( N = KeyBufferHead ) then       { buffer full }
   begin
      EOI ;               { EOI must be done beFore Exit            }
      Sound( 2200 ) ;     {    but beFore anything that takes a lot }
      Delay( 80 ) ;       {     of time and can be interrupted      }
      NoSound ;
   end
   else
   begin          { high Byte is scan code, low is ASCII }
      P^ := Scan * $100 + Key ;       { store key in circular buffer }
      KeyBufferTail := N ;            { advance tail Pointer }
      EOI ;
   end ;
end ;
end.

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