home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: Programmierung / SOURCE.mdf / programm / msdos / pascal / rehack / event / keyboard.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-10  |  5.8 KB  |  297 lines

  1. //---------------------------------------------------------------------------
  2. // File:            KEYBOARD.CPP
  3. // Path:            ...\REHACK\EVENT\KEYBOARD.CPP
  4. // Version:        1.00
  5. // Author:        Bob Provencher/GD SL
  6. // CIS Id:    
  7. // Created On:        7/6/93
  8. // Modified On:
  9. // Description:    
  10. // Tabs:            5
  11. //---------------------------------------------------------------------------
  12.  
  13. #ifndef _KEYBOARD_HPP
  14. #include "..\event\keyboard.hpp"
  15. #endif
  16.  
  17. #ifndef _GAME_HPP
  18. #include "..\game\game.hpp"
  19. #endif
  20.  
  21. #ifndef _GENERAL_HPP
  22. #include "..\general\general.hpp"
  23. #endif
  24.  
  25. bool        Keyboard::installed = false;
  26. bool        Keyboard::extended  = false;
  27. bool        Keyboard::keyDown    = false;
  28.  
  29. Event    Keyboard::curEvent;
  30.  
  31. void interrupt (*Keyboard::oldhandler)(...);
  32.  
  33.  
  34. byte FAR* const Keyboard::pState = (byte FAR*)0x0417;
  35.                                     // pointer to BIOS key status
  36.  
  37.  
  38. bool        Keyboard::inKeyCaps   = false,
  39.         Keyboard::inKeyScroll = false,
  40.         Keyboard::inKeyNum      = false;
  41.  
  42. //
  43. //    Scan code to ASCII lookup table - Normal, Shifted
  44. //
  45.  
  46. const char Keyboard::keyToChar[ 89 ][ 2 ] =
  47. {
  48.  
  49.     { charUndef,    charUndef  },    // 00    0x00
  50.     { '`',        '~'         },
  51.     { '1',        '!'         },
  52.     { '2',        '@'         },
  53.     { '3',        '#'         },
  54.     { '4',        '$'         },    // 05    0x05
  55.     { '5',        '%'         },
  56.     { '6',        '^'         },
  57.     { '7',        '&'         },
  58.     { '8',        '*'         },
  59.     { '9',        '('         },    // 10    0x0A
  60.     { '0',        ')'         },
  61.     { '-',        '_'         },
  62.     { '=',        '+'         },
  63.     { charBkSpc,    charBkSpc     },    // Backspace
  64.     { charTab,    charTab     },    // Tab         15    0x0F
  65.     { 'q',        'Q'         },
  66.     { 'w',        'W'         },
  67.     { 'e',        'E'         },
  68.     { 'r',        'R'         },
  69.     { 't',        'T'         },    // 20    0x14
  70.     { 'y',        'Y'         },
  71.     { 'u',        'U'         },
  72.     { 'i',        'I'         },
  73.     { 'o',        'O'         },
  74.     { 'p',        'P'         },    // 25    0x19
  75.     { '[',        '{'         },
  76.     { ']',        '}'         },
  77.     { charEnter,    charEnter     },    // Enter
  78.     { charUndef,    charUndef  },    // Ctrl
  79.     { 'a',        'A'         },    // 30    0x1E
  80.     { 's',        'S'         },
  81.     { 'd',        'D'         },
  82.     { 'f',        'F'         },
  83.     { 'g',        'G'         },
  84.     { 'h',        'H'         },    // 35    0x23
  85.     { 'j',        'J'         },
  86.     { 'k',        'K'         },
  87.     { 'l',        'L'         },
  88.     { ';',        ':'         },
  89.     { '\'',        '"'         },    // 40    0x28
  90.     { '`',        '~'         },
  91.     { charUndef,    charUndef  },    // LeftShift
  92.     { '\\',        '|'         },
  93.     { 'z',        'Z'         },
  94.     { 'x',        'X'         },    // 45    0x2D
  95.     { 'c',        'C'         },
  96.     { 'v',        'V'         },
  97.     { 'b',        'B'         },
  98.     { 'n',        'N'         },
  99.     { 'm',        'M'         },    // 50    0x32
  100.     { ',',        '<'         },
  101.     { '.',        '>'         },
  102.     { '/',        '?'         },
  103.     { charUndef,    charUndef  },    // RightShift
  104.     { '*',        charUndef  },    // PrtScrn        55    0x37
  105.     { charUndef,    charUndef  },    // Alt
  106.     { ' ',        ' '         },    // Space
  107.     { charUndef,    charUndef  },    // CapsLock
  108.     { charUndef,    charUndef  },    // F1
  109.     { charUndef,    charUndef  },    // F2            60    0x3E
  110.     { charUndef,    charUndef  },    // F3
  111.     { charUndef,    charUndef  },    // F4
  112.     { charUndef,    charUndef  },    // F5
  113.     { charUndef,    charUndef  },    // F6
  114.     { charUndef,    charUndef  },    // F7            65    0x41
  115.     { charUndef,    charUndef  },    // F8
  116.     { charUndef,    charUndef  },    // F9
  117.     { charUndef,    charUndef  },    // F10
  118.     { charUndef,    charUndef  },    // NumLock
  119.     { charUndef,    charUndef  },    // ScrlLock        70    0x46
  120.  
  121.     //
  122.     //    from here down - Normal, NumLock for keypad keys, non-extended
  123.     //    extended keys ignore shift key
  124.     //
  125.  
  126.     { charUndef,    '7'         },    // Home            71    0x47
  127.     { charUndef,    '8'         },    // Up
  128.     { charUndef,    '9'         },    // PgUp
  129.     { '-',        '-'         },    // -
  130.     { charLeft,    '4'         },    // BackSpace        75    0x4B
  131.     { '5',        '5'         },    //
  132.     { charRight,    '6'         },    // 
  133.     { '+',        '+'         },    // Plus
  134.     { charUndef,    '1'          },    // 
  135.     { charUndef,    '2'          },    // 80    0x50
  136.     { charUndef,    '3'          },    // 
  137.     { charUndef,    '0'         },    // 
  138.     { charUndef,    '.'         },    // 
  139.  
  140.     { charUndef,    charUndef  },    // 84, 0x54        no keys
  141.     { charUndef,    charUndef  },    // 85, 0x55
  142.     { charUndef,    charUndef  },    // 86, 0x56
  143.  
  144.     { charUndef,    charUndef  },    // F11            87, 0x57
  145.     { charUndef,    charUndef  }    // F12            88, 0x58
  146.                         
  147. };
  148.  
  149. Keyboard::~Keyboard()
  150. {
  151.     remove();
  152. }
  153.  
  154. void Keyboard::install()
  155. {
  156.     if ( !installed )
  157.     {
  158.         oldhandler = getvect( 0x09 );
  159.         setvect( 0x09, handler );
  160.         installed = true;
  161.     }
  162. }
  163.  
  164. void Keyboard::remove()
  165. {
  166.     if ( installed )
  167.     {
  168.         setvect( 0x09, oldhandler );
  169.         installed = false;
  170.     }
  171. }
  172.  
  173. void interrupt Keyboard::handler(...)
  174. {
  175.  
  176.     extended = false;
  177.  
  178.     curEvent.type = 0;
  179.  
  180.     byte& scan = curEvent.key.charScanValue.scan;
  181.     byte& chr  = curEvent.key.charScanValue.code;
  182.  
  183.     scan = chr = 0;
  184.  
  185.     //
  186.     //    Read keyboard data 
  187.     //
  188.  
  189.     read( scan );
  190.  
  191.     while ( scan == 0xE0 )
  192.     {
  193.         extended = true;
  194.         read( scan );
  195.     }
  196.  
  197.     outportb( 0x20, 0x20 );         /* EOI */
  198.  
  199.     keyDown = bool( !( scan & 0x80 ) );
  200.  
  201.     if ( keyDown )
  202.         curEvent.type |= KeyDown;
  203.     else
  204.         curEvent.type |= KeyUp;
  205.  
  206.     scan &= 0x7F;
  207.  
  208.     switch ( scan )
  209.     {
  210.  
  211.         case scanNum:
  212.  
  213.             if ( keyDown )
  214.             {
  215.                 if ( !inKeyNum )
  216.                     toggleState( stateNum );
  217.                 inKeyNum = true;
  218.             }
  219.             else
  220.                 inKeyNum = false;
  221.  
  222.             break;
  223.  
  224.         case scanCaps:
  225.  
  226.             if ( keyDown )
  227.             {
  228.                 if ( !inKeyCaps )
  229.                     toggleState( stateCaps );
  230.                 inKeyCaps = true;
  231.             }
  232.             else
  233.                 inKeyCaps = false;
  234.  
  235.             break;
  236.  
  237.         case scanScrl:
  238.  
  239.             if ( keyDown )
  240.             {
  241.                 if ( !inKeyScroll )
  242.                     toggleState( stateScrl );
  243.                 inKeyScroll = true;
  244.             }
  245.             else
  246.                 inKeyScroll = false;
  247.             break;
  248.  
  249.         case scanLShft:
  250.             setState( stateLShft, keyDown );
  251.             break;
  252.  
  253.         case scanRShft:
  254.             setState( stateRShft, keyDown );
  255.             break;
  256.  
  257.         case scanCtrl:
  258.             setState( stateCtrl, keyDown );
  259.             break;
  260.  
  261.         case scanAlt:
  262.             setState( stateAlt, keyDown );
  263.             break;
  264.  
  265.         default:
  266.  
  267.             int i;
  268.  
  269.             if ( extended )
  270.             {
  271.                 if ( scan >= scanHome )
  272.                     chr = keyToChar[ scan ][ 0 ];
  273.                 else
  274.                 {
  275.                     i = xor( testState( stateShift ), testState( stateCaps ) ) ? 1 : 0;
  276.                     chr = keyToChar[ scan ][ i ];
  277.                 }
  278.             }
  279.             else
  280.             {
  281.                 if ( scan >= scanHome )
  282.                     chr = keyToChar[ scan ][ testState( stateNum ) ? 1 : 0 ];
  283.                 else
  284.                 {
  285.                     i = xor( testState( stateShift ), testState( stateCaps ) ) ? 1 : 0;
  286.                     chr = keyToChar[ scan ][ i ];
  287.                 }
  288.             }
  289.  
  290.  
  291.     }
  292.  
  293.     Game::eventQueue.put( curEvent );
  294.  
  295. }
  296.  
  297.