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