home *** CD-ROM | disk | FTP | other *** search
- //---------------------------------------------------------------------------
- // File: KEYBOARD.CPP
- // Path: ...\REHACK\EVENT\KEYBOARD.CPP
- // Version: 1.00
- // Author: Bob Provencher/GD SL
- // CIS Id:
- // Created On: 7/6/93
- // Modified On:
- // Description:
- // Tabs: 5
- //---------------------------------------------------------------------------
-
- #ifndef _KEYBOARD_HPP
- #include "..\event\keyboard.hpp"
- #endif
-
- #ifndef _GAME_HPP
- #include "..\game\game.hpp"
- #endif
-
- #ifndef _GENERAL_HPP
- #include "..\general\general.hpp"
- #endif
-
- bool Keyboard::installed = false;
- bool Keyboard::extended = false;
- bool Keyboard::keyDown = false;
-
- Event Keyboard::curEvent;
-
- void interrupt (*Keyboard::oldhandler)(...);
-
-
- byte FAR* const Keyboard::pState = (byte FAR*)0x0417;
- // pointer to BIOS key status
-
-
- bool Keyboard::inKeyCaps = false,
- Keyboard::inKeyScroll = false,
- Keyboard::inKeyNum = false;
-
- //
- // Scan code to ASCII lookup table - Normal, Shifted
- //
-
- const char Keyboard::keyToChar[ 89 ][ 2 ] =
- {
-
- { charUndef, charUndef }, // 00 0x00
- { '`', '~' },
- { '1', '!' },
- { '2', '@' },
- { '3', '#' },
- { '4', '$' }, // 05 0x05
- { '5', '%' },
- { '6', '^' },
- { '7', '&' },
- { '8', '*' },
- { '9', '(' }, // 10 0x0A
- { '0', ')' },
- { '-', '_' },
- { '=', '+' },
- { charBkSpc, charBkSpc }, // Backspace
- { charTab, charTab }, // Tab 15 0x0F
- { 'q', 'Q' },
- { 'w', 'W' },
- { 'e', 'E' },
- { 'r', 'R' },
- { 't', 'T' }, // 20 0x14
- { 'y', 'Y' },
- { 'u', 'U' },
- { 'i', 'I' },
- { 'o', 'O' },
- { 'p', 'P' }, // 25 0x19
- { '[', '{' },
- { ']', '}' },
- { charEnter, charEnter }, // Enter
- { charUndef, charUndef }, // Ctrl
- { 'a', 'A' }, // 30 0x1E
- { 's', 'S' },
- { 'd', 'D' },
- { 'f', 'F' },
- { 'g', 'G' },
- { 'h', 'H' }, // 35 0x23
- { 'j', 'J' },
- { 'k', 'K' },
- { 'l', 'L' },
- { ';', ':' },
- { '\'', '"' }, // 40 0x28
- { '`', '~' },
- { charUndef, charUndef }, // LeftShift
- { '\\', '|' },
- { 'z', 'Z' },
- { 'x', 'X' }, // 45 0x2D
- { 'c', 'C' },
- { 'v', 'V' },
- { 'b', 'B' },
- { 'n', 'N' },
- { 'm', 'M' }, // 50 0x32
- { ',', '<' },
- { '.', '>' },
- { '/', '?' },
- { charUndef, charUndef }, // RightShift
- { '*', charUndef }, // PrtScrn 55 0x37
- { charUndef, charUndef }, // Alt
- { ' ', ' ' }, // Space
- { charUndef, charUndef }, // CapsLock
- { charUndef, charUndef }, // F1
- { charUndef, charUndef }, // F2 60 0x3E
- { charUndef, charUndef }, // F3
- { charUndef, charUndef }, // F4
- { charUndef, charUndef }, // F5
- { charUndef, charUndef }, // F6
- { charUndef, charUndef }, // F7 65 0x41
- { charUndef, charUndef }, // F8
- { charUndef, charUndef }, // F9
- { charUndef, charUndef }, // F10
- { charUndef, charUndef }, // NumLock
- { charUndef, charUndef }, // ScrlLock 70 0x46
-
- //
- // from here down - Normal, NumLock for keypad keys, non-extended
- // extended keys ignore shift key
- //
-
- { charUndef, '7' }, // Home 71 0x47
- { charUndef, '8' }, // Up
- { charUndef, '9' }, // PgUp
- { '-', '-' }, // -
- { charLeft, '4' }, // BackSpace 75 0x4B
- { '5', '5' }, //
- { charRight, '6' }, //
- { '+', '+' }, // Plus
- { charUndef, '1' }, //
- { charUndef, '2' }, // 80 0x50
- { charUndef, '3' }, //
- { charUndef, '0' }, //
- { charUndef, '.' }, //
-
- { charUndef, charUndef }, // 84, 0x54 no keys
- { charUndef, charUndef }, // 85, 0x55
- { charUndef, charUndef }, // 86, 0x56
-
- { charUndef, charUndef }, // F11 87, 0x57
- { charUndef, charUndef } // F12 88, 0x58
-
- };
-
- Keyboard::~Keyboard()
- {
- remove();
- }
-
- void Keyboard::install()
- {
- if ( !installed )
- {
- oldhandler = getvect( 0x09 );
- setvect( 0x09, handler );
- installed = true;
- }
- }
-
- void Keyboard::remove()
- {
- if ( installed )
- {
- setvect( 0x09, oldhandler );
- installed = false;
- }
- }
-
- void interrupt Keyboard::handler(...)
- {
-
- extended = false;
-
- curEvent.type = 0;
-
- byte& scan = curEvent.key.charScanValue.scan;
- byte& chr = curEvent.key.charScanValue.code;
-
- scan = chr = 0;
-
- //
- // Read keyboard data
- //
-
- read( scan );
-
- while ( scan == 0xE0 )
- {
- extended = true;
- read( scan );
- }
-
- outportb( 0x20, 0x20 ); /* EOI */
-
- keyDown = bool( !( scan & 0x80 ) );
-
- if ( keyDown )
- curEvent.type |= KeyDown;
- else
- curEvent.type |= KeyUp;
-
- scan &= 0x7F;
-
- switch ( scan )
- {
-
- case scanNum:
-
- if ( keyDown )
- {
- if ( !inKeyNum )
- toggleState( stateNum );
- inKeyNum = true;
- }
- else
- inKeyNum = false;
-
- break;
-
- case scanCaps:
-
- if ( keyDown )
- {
- if ( !inKeyCaps )
- toggleState( stateCaps );
- inKeyCaps = true;
- }
- else
- inKeyCaps = false;
-
- break;
-
- case scanScrl:
-
- if ( keyDown )
- {
- if ( !inKeyScroll )
- toggleState( stateScrl );
- inKeyScroll = true;
- }
- else
- inKeyScroll = false;
- break;
-
- case scanLShft:
- setState( stateLShft, keyDown );
- break;
-
- case scanRShft:
- setState( stateRShft, keyDown );
- break;
-
- case scanCtrl:
- setState( stateCtrl, keyDown );
- break;
-
- case scanAlt:
- setState( stateAlt, keyDown );
- break;
-
- default:
-
- int i;
-
- if ( extended )
- {
- if ( scan >= scanHome )
- chr = keyToChar[ scan ][ 0 ];
- else
- {
- i = xor( testState( stateShift ), testState( stateCaps ) ) ? 1 : 0;
- chr = keyToChar[ scan ][ i ];
- }
- }
- else
- {
- if ( scan >= scanHome )
- chr = keyToChar[ scan ][ testState( stateNum ) ? 1 : 0 ];
- else
- {
- i = xor( testState( stateShift ), testState( stateCaps ) ) ? 1 : 0;
- chr = keyToChar[ scan ][ i ];
- }
- }
-
-
- }
-
- Game::eventQueue.put( curEvent );
-
- }
-
-