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

    PROGRAM ScanCode ;      { display MAKE and BREAK scan codes }

    USES Crt, Dos, KeyIntr ;      { keyboard interrupt support }

    { ----- this program will probably hang a debugger ----- }

    Var
       OldInt09 : Pointer ;
       ExitSave : Pointer ;

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

    {$F+} Procedure NewInt09 ; Interrupt ;   { return scan code as key's value }
    Var
       ScanCode : Byte ;
       BufferFull : Boolean ;

    Begin
       EnableInterrupts ;
       ScanCode := ReadScanCode ;
       ResetKeyboard ;
       BufferFull := Not StoreKey( ScanCode, ScanCode ) ;
       EOI ;
       If BufferFull then
       Begin
          Sound( 880 ) ;
          Delay( 100 ) ;
          Sound( 440 ) ;
          Delay( 100 ) ;
          NoSound ;
       End ;
                    { variation : move the EOI before the beep to after it }
                    {      note the difference when the keyboard overflows }
    End ;

    { see Turbo Pascal 5.0 reference p 450 for a list of scan codes }
    {                  6.0 programmers guide p 354                  }

    Var
       N  : Byte ;

    BEGIN
       ExitSave := ExitProc ;
       ExitProc := @RestoreInt09 ;
       GetIntVec( $09, OldInt09 ) ;
       SetIntVec( $09, @NewInt09 ) ;

       WriteLn( '   Display "make" and "break" scan codes ' ) ;
       WriteLn ;
       WriteLn( '   Hit the <Esc> key to exit ' ) ;
       Repeat
          Delay( 400 ) ;               { make it easy to overrun keyboard }
          N := Ord( ReadKey ) ;        { n is the scan code from NewInt09 }
          If N < 128 then
             WriteLn( 'Make  ', n )
          Else
             WriteLn( '    Break  ', n - 128 ) ;
       Until n = 1 ;      { the make code for Esc }
    END.

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