Annotation of XNU/iokit/Drivers/hidsystem/drvApplePS2Keyboard/ApplePS2Keyboard.cpp, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * The contents of this file constitute Original Code as defined in and
        !             7:  * are subject to the Apple Public Source License Version 1.1 (the
        !             8:  * "License").  You may not use this file except in compliance with the
        !             9:  * License.  Please obtain a copy of the License at
        !            10:  * http://www.apple.com/publicsource and read it before using this file.
        !            11:  * 
        !            12:  * This Original Code and all software distributed under the License are
        !            13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            17:  * License for the specific language governing rights and limitations
        !            18:  * under the License.
        !            19:  * 
        !            20:  * @APPLE_LICENSE_HEADER_END@
        !            21:  */
        !            22: 
        !            23: #include <IOKit/assert.h>
        !            24: #include <IOKit/IOLib.h>
        !            25: #include <IOKit/hidsystem/IOHIDTypes.h>
        !            26: #include <IOKit/hidsystem/IOLLEvent.h>
        !            27: #include "ApplePS2Keyboard.h"
        !            28: 
        !            29: // =============================================================================
        !            30: // ApplePS2Keyboard Class Implementation
        !            31: //
        !            32: 
        !            33: #define super IOHIKeyboard
        !            34: OSDefineMetaClassAndStructors(ApplePS2Keyboard, IOHIKeyboard);
        !            35: 
        !            36: UInt32 ApplePS2Keyboard::deviceType()  { return NX_EVS_DEVICE_TYPE_KEYBOARD; };
        !            37: UInt32 ApplePS2Keyboard::interfaceID() { return NX_EVS_DEVICE_INTERFACE_ACE; };
        !            38: 
        !            39: UInt32 ApplePS2Keyboard::maxKeyCodes() { return KBV_NUM_KEYCODES; };
        !            40: 
        !            41: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        !            42: 
        !            43: bool ApplePS2Keyboard::init(OSDictionary * properties)
        !            44: {
        !            45:   //
        !            46:   // Initialize this object's minimal state.  This is invoked right after this
        !            47:   // object is instantiated.
        !            48:   //
        !            49: 
        !            50:   if (!super::init(properties))  return false;
        !            51: 
        !            52:   _device                    = 0;
        !            53:   _extendCount               = 0;
        !            54:   _interruptHandlerInstalled = false;
        !            55:   _ledState                  = 0;
        !            56: 
        !            57:   for (int index = 0; index < KBV_NUNITS; index++)  _keyBitVector[index] = 0;
        !            58: 
        !            59:   return true;
        !            60: }
        !            61: 
        !            62: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        !            63: 
        !            64: ApplePS2Keyboard * ApplePS2Keyboard::probe(IOService * provider, SInt32 * score)
        !            65: {
        !            66:   //
        !            67:   // The driver has been instructed to verify the presence of the actual
        !            68:   // hardware we represent. We are guaranteed by the controller that the
        !            69:   // keyboard clock is enabled and the keyboard itself is disabled (thus
        !            70:   // it won't send any asynchronous scan codes that may mess up the
        !            71:   // responses expected by the commands we send it).  This is invoked
        !            72:   // after the init.
        !            73:   //
        !            74: 
        !            75:   ApplePS2KeyboardDevice * device  = (ApplePS2KeyboardDevice *)provider;
        !            76:   PS2Request *             request = device->allocateRequest();
        !            77:   bool                     success;
        !            78: 
        !            79:   if (!super::probe(provider, score))  return 0;
        !            80: 
        !            81:   //
        !            82:   // Check to see if the keyboard responds to a basic diagnostic echo.
        !            83:   //
        !            84: 
        !            85:   // (diagnostic echo command)
        !            86:   request->commands[0].command = kPS2C_WriteDataPort;
        !            87:   request->commands[0].inOrOut = kDP_TestKeyboardEcho;
        !            88:   request->commands[1].command = kPS2C_ReadDataPortAndCompare;
        !            89:   request->commands[1].inOrOut = 0xEE;
        !            90:   request->commandsCount = 2;
        !            91:   device->submitRequestAndBlock(request);
        !            92: 
        !            93:   // (free the request)
        !            94:   success = (request->commandsCount == 2);
        !            95:   device->freeRequest(request);
        !            96: 
        !            97:   return (success) ? this : 0;
        !            98: }
        !            99: 
        !           100: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        !           101: 
        !           102: bool ApplePS2Keyboard::start(IOService * provider)
        !           103: {
        !           104:   //
        !           105:   // The driver has been instructed to start.   This is called after a
        !           106:   // successful attach.
        !           107:   //
        !           108: 
        !           109:   if (!super::start(provider))  return false;
        !           110: 
        !           111:   //
        !           112:   // Maintain a pointer to and retain the provider object.
        !           113:   //
        !           114: 
        !           115:   _device = (ApplePS2KeyboardDevice *)provider;
        !           116:   _device->retain();
        !           117: 
        !           118:   //
        !           119:   // Install our driver's interrupt handler, for asynchronous data delivery.
        !           120:   //
        !           121: 
        !           122:   _device->installInterruptAction(this,
        !           123:             (PS2InterruptAction)&ApplePS2Keyboard::interruptOccurred);
        !           124:   _interruptHandlerInstalled = true;
        !           125: 
        !           126:   //
        !           127:   // Initialize the keyboard LED state.
        !           128:   //
        !           129: 
        !           130:   setLEDs(_ledState);
        !           131: 
        !           132:   //
        !           133:   // Enable the keyboard clock (should already be so), the keyboard IRQ line,
        !           134:   // and the keyboard Kscan -> scan code translation mode.
        !           135:   //
        !           136: 
        !           137:   setCommandByte(kCB_EnableKeyboardIRQ | kCB_TranslateMode,
        !           138:                  kCB_DisableKeyboardClock);
        !           139: 
        !           140:   //
        !           141:   // Finally, we enable the keyboard itself, so that it may start reporting
        !           142:   // key events.
        !           143:   //
        !           144: 
        !           145:   setKeyboardEnable(true);
        !           146: 
        !           147:   return true;
        !           148: }
        !           149: 
        !           150: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        !           151: 
        !           152: void ApplePS2Keyboard::stop(IOService * provider)
        !           153: {
        !           154:   //
        !           155:   // The driver has been instructed to stop.  Note that we must break all
        !           156:   // connections to other service objects now (ie. no registered actions,
        !           157:   // no pointers and retains to objects, etc), if any.
        !           158:   //
        !           159: 
        !           160:   assert(_device == provider);
        !           161: 
        !           162:   //
        !           163:   // Disable the keyboard itself, so that it may stop reporting key events.
        !           164:   //
        !           165: 
        !           166:   setKeyboardEnable(false);
        !           167: 
        !           168:   //
        !           169:   // Disable the keyboard clock and the keyboard IRQ line.
        !           170:   //
        !           171: 
        !           172:   setCommandByte(kCB_DisableKeyboardClock, kCB_EnableKeyboardIRQ);
        !           173: 
        !           174:   //
        !           175:   // Uninstall the interrupt handler.
        !           176:   //
        !           177: 
        !           178:   if ( _interruptHandlerInstalled )  _device->uninstallInterruptAction();
        !           179:   _interruptHandlerInstalled = false;
        !           180: 
        !           181:   //
        !           182:   // Release the pointer to the provider object.
        !           183:   //
        !           184: 
        !           185:   _device->release();
        !           186:   _device = 0;
        !           187: 
        !           188:   super::stop(provider);
        !           189: }
        !           190: 
        !           191: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        !           192: 
        !           193: void ApplePS2Keyboard::interruptOccurred(UInt8 scanCode)   // PS2InterruptAction
        !           194: {
        !           195:   //
        !           196:   // This will be invoked automatically from our device when asynchronous
        !           197:   // keyboard data needs to be delivered.  Process the keyboard data.  Do
        !           198:   // NOT send any BLOCKING commands to our device in this context.
        !           199:   //
        !           200: 
        !           201:   if (scanCode == kSC_Acknowledge)
        !           202:     IOLog("%s: Unexpected acknowledge from PS/2 controller.\n", getName());
        !           203:   else if (scanCode == kSC_Resend)
        !           204:     IOLog("%s: Unexpected resend request from PS/2 controller.\n", getName());
        !           205:   else
        !           206:     dispatchKeyboardEventWithScancode(scanCode);
        !           207: }
        !           208: 
        !           209: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        !           210: 
        !           211: bool ApplePS2Keyboard::dispatchKeyboardEventWithScancode(UInt8 scanCode)
        !           212: {
        !           213:   //
        !           214:   // Parses the given scan code, updating all necessary internal state, and
        !           215:   // should a new key be detected, the key event is dispatched.
        !           216:   //
        !           217:   // Returns true if a key event was indeed dispatched.
        !           218:   //
        !           219: 
        !           220:   unsigned int keyCode;
        !           221:   bool         goingDown;
        !           222:   AbsoluteTime now;
        !           223: 
        !           224:   //
        !           225:   // See if this scan code introduces an extended key sequence.  If so, note
        !           226:   // it and then return.  Next time we get a key we'll finish the sequence.
        !           227:   //
        !           228: 
        !           229:   if (scanCode == kSC_Extend)
        !           230:   {
        !           231:     _extendCount = 1;
        !           232:     return false;
        !           233:   }
        !           234: 
        !           235:   //
        !           236:   // See if this scan code introduces an extended key sequence for the Pause
        !           237:   // Key.  If so, note it and then return.  The next time we get a key, drop
        !           238:   // it.  The next key we get after that finishes the Pause Key sequence.
        !           239:   //
        !           240:   // The sequence actually sent to us by the keyboard for the Pause Key is:
        !           241:   //
        !           242:   // 1. E1  Extended Sequence for Pause Key
        !           243:   // 2. 1D  Useless Data, with Up Bit Cleared
        !           244:   // 3. 45  Pause Key, with Up Bit Cleared
        !           245:   // 4. E1  Extended Sequence for Pause Key
        !           246:   // 5. 9D  Useless Data, with Up Bit Set
        !           247:   // 6. C5  Pause Key, with Up Bit Set
        !           248:   //
        !           249:   // The reason items 4 through 6 are sent with the Pause Key is because the
        !           250:   // keyboard hardware never generates a release code for the Pause Key and
        !           251:   // the designers are being smart about it.  The sequence above translates
        !           252:   // to this parser as two separate events, as it should be -- one down key
        !           253:   // event and one up key event (for the Pause Key).
        !           254:   //
        !           255: 
        !           256:   if (scanCode == kSC_Pause)
        !           257:   {
        !           258:     _extendCount = 2;
        !           259:     return false;
        !           260:   }
        !           261: 
        !           262:   //
        !           263:   // Convert the scan code into a key code.
        !           264:   //
        !           265: 
        !           266:   if (_extendCount == 0)
        !           267:     keyCode = scanCode & ~kSC_UpBit;
        !           268:   else
        !           269:   {
        !           270:     _extendCount--;
        !           271:     if (_extendCount)  return false;
        !           272: 
        !           273:     //
        !           274:     // Convert certain extended codes on the PC keyboard into single scancodes.
        !           275:     // Refer to the conversion table in defaultKeymapOfLength.
        !           276:     //
        !           277: 
        !           278:     switch (scanCode & ~kSC_UpBit)
        !           279:     {
        !           280:       case 0x1D: keyCode = 0x60; break;            // ctrl
        !           281:       case 0x38: keyCode = 0x61; break;            // alt
        !           282:       case 0x1C: keyCode = 0x62; break;            // enter
        !           283:       case 0x35: keyCode = 0x63; break;            // /
        !           284:       case 0x48: keyCode = 0x64; break;            // up arrow
        !           285:       case 0x50: keyCode = 0x65; break;            // down arrow
        !           286:       case 0x4B: keyCode = 0x66; break;            // left arrow
        !           287:       case 0x4D: keyCode = 0x67; break;            // right arrow
        !           288:       case 0x52: keyCode = 0x68; break;            // insert
        !           289:       case 0x53: keyCode = 0x69; break;            // delete
        !           290:       case 0x49: keyCode = 0x6A; break;            // page up
        !           291:       case 0x51: keyCode = 0x6B; break;            // page down
        !           292:       case 0x47: keyCode = 0x6C; break;            // home
        !           293:       case 0x4F: keyCode = 0x6D; break;            // end
        !           294:       case 0x37: keyCode = 0x6E; break;            // PrintScreen
        !           295:       case 0x45: keyCode = 0x6F; break;            // Pause
        !           296:       case 0x5B: keyCode = 0x70; break;            // Left Windows
        !           297:       case 0x5C: keyCode = 0x71; break;            // Right Windows
        !           298:       case 0x5D: keyCode = 0x72; break;            // Application
        !           299:       case 0x2A:             // header or trailer for PrintScreen
        !           300:       default: return false;
        !           301:     }
        !           302:   }
        !           303: 
        !           304:   if (keyCode == 0)  return false;
        !           305: 
        !           306:   //
        !           307:   // Update our key bit vector, which maintains the up/down status of all keys.
        !           308:   //
        !           309: 
        !           310:   goingDown = !(scanCode & kSC_UpBit);
        !           311: 
        !           312:   if (goingDown)
        !           313:   {
        !           314:     //
        !           315:     // Verify that this is not an autorepeated key -- discard it if it is.
        !           316:     //
        !           317: 
        !           318:     if (KBV_IS_KEYDOWN(keyCode, _keyBitVector))  return false;
        !           319: 
        !           320:     KBV_KEYDOWN(keyCode, _keyBitVector);
        !           321:   }
        !           322:   else
        !           323:   {
        !           324:     KBV_KEYUP(keyCode, _keyBitVector);
        !           325:   }
        !           326: 
        !           327:   //
        !           328:   // We have a valid key event -- dispatch it to our superclass.
        !           329:   //
        !           330: 
        !           331:   clock_get_uptime(&now);
        !           332: 
        !           333:   dispatchKeyboardEvent(keyCode, /*direction*/ goingDown, /*timeStamp*/ now);
        !           334: 
        !           335:   return true;
        !           336: }
        !           337: 
        !           338: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        !           339: 
        !           340: void ApplePS2Keyboard::setAlphaLockFeedback(bool locked)
        !           341: {
        !           342:   //
        !           343:   // Set the keyboard LEDs to reflect the state of alpha (caps) lock.
        !           344:   //
        !           345:   // It is safe to issue this request from the interrupt/completion context.
        !           346:   //
        !           347: 
        !           348:   _ledState = locked ? (_ledState | kLED_CapsLock):(_ledState & ~kLED_CapsLock);
        !           349:   setLEDs(_ledState);
        !           350: }
        !           351: 
        !           352: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        !           353: 
        !           354: void ApplePS2Keyboard::setLEDs(UInt8 ledState)
        !           355: {
        !           356:   //
        !           357:   // Asynchronously instructs the controller to set the keyboard LED state.
        !           358:   //
        !           359:   // It is safe to issue this request from the interrupt/completion context.
        !           360:   //
        !           361: 
        !           362:   PS2Request * request = _device->allocateRequest();
        !           363: 
        !           364:   // (set LEDs command)
        !           365:   request->commands[0].command = kPS2C_WriteDataPort;
        !           366:   request->commands[0].inOrOut = kDP_SetKeyboardLEDs;
        !           367:   request->commands[1].command = kPS2C_ReadDataPortAndCompare;
        !           368:   request->commands[1].inOrOut = kSC_Acknowledge;
        !           369:   request->commands[2].command = kPS2C_WriteDataPort;
        !           370:   request->commands[2].inOrOut = ledState;
        !           371:   request->commands[3].command = kPS2C_ReadDataPortAndCompare;
        !           372:   request->commands[3].inOrOut = kSC_Acknowledge;
        !           373:   request->commandsCount = 4;
        !           374:   _device->submitRequest(request); // asynchronous, auto-free'd
        !           375: }
        !           376: 
        !           377: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        !           378: 
        !           379: void ApplePS2Keyboard::setKeyboardEnable(bool enable)
        !           380: {
        !           381:   //
        !           382:   // Instructs the keyboard to start or stop the reporting of key events.
        !           383:   // Be aware that while the keyboard is enabled, asynchronous key events
        !           384:   // may arrive in the middle of command sequences sent to the controller,
        !           385:   // and may get confused for expected command responses.
        !           386:   //
        !           387:   // It is safe to issue this request from the interrupt/completion context.
        !           388:   //
        !           389: 
        !           390:   PS2Request * request = _device->allocateRequest();
        !           391: 
        !           392:   // (keyboard enable/disable command)
        !           393:   request->commands[0].command = kPS2C_WriteDataPort;
        !           394:   request->commands[0].inOrOut = (enable)?kDP_Enable:kDP_SetDefaultsAndDisable;
        !           395:   request->commands[1].command = kPS2C_ReadDataPortAndCompare;
        !           396:   request->commands[1].inOrOut = kSC_Acknowledge;
        !           397:   request->commandsCount = 2;
        !           398:   _device->submitRequest(request); // asynchronous, auto-free'd
        !           399: }
        !           400: 
        !           401: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        !           402: 
        !           403: void ApplePS2Keyboard::setCommandByte(UInt8 setBits, UInt8 clearBits)
        !           404: {
        !           405:   //
        !           406:   // Sets the bits setBits and clears the bits clearBits "atomically" in the
        !           407:   // controller's Command Byte.   Since the controller does not provide such
        !           408:   // a read-modify-write primitive, we resort to a test-and-set try loop.
        !           409:   //
        !           410:   // Do NOT issue this request from the interrupt/completion context.
        !           411:   //
        !           412: 
        !           413:   UInt8        commandByte;
        !           414:   UInt8        commandByteNew;
        !           415:   PS2Request * request = _device->allocateRequest();
        !           416: 
        !           417:   do
        !           418:   {
        !           419:     // (read command byte)
        !           420:     request->commands[0].command = kPS2C_WriteCommandPort;
        !           421:     request->commands[0].inOrOut = kCP_GetCommandByte;
        !           422:     request->commands[1].command = kPS2C_ReadDataPort;
        !           423:     request->commands[1].inOrOut = 0;
        !           424:     request->commandsCount = 2;
        !           425:     _device->submitRequestAndBlock(request);
        !           426: 
        !           427:     //
        !           428:     // Modify the command byte as requested by caller.
        !           429:     //
        !           430: 
        !           431:     commandByte    = request->commands[1].inOrOut;
        !           432:     commandByteNew = (commandByte | setBits) & (~clearBits);
        !           433: 
        !           434:     // ("test-and-set" command byte)
        !           435:     request->commands[0].command = kPS2C_WriteCommandPort;
        !           436:     request->commands[0].inOrOut = kCP_GetCommandByte;
        !           437:     request->commands[1].command = kPS2C_ReadDataPortAndCompare;
        !           438:     request->commands[1].inOrOut = commandByte;
        !           439:     request->commands[2].command = kPS2C_WriteCommandPort;
        !           440:     request->commands[2].inOrOut = kCP_SetCommandByte;
        !           441:     request->commands[3].command = kPS2C_WriteDataPort;
        !           442:     request->commands[3].inOrOut = commandByteNew;
        !           443:     request->commandsCount = 4;
        !           444:     _device->submitRequestAndBlock(request);
        !           445: 
        !           446:     //
        !           447:     // Repeat this loop if last command failed, that is, if the old command byte
        !           448:     // was modified since we first read it.
        !           449:     //
        !           450: 
        !           451:   } while (request->commandsCount != 4);  
        !           452: 
        !           453:   _device->freeRequest(request);
        !           454: }
        !           455: 
        !           456: // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        !           457: 
        !           458: const unsigned char * ApplePS2Keyboard::defaultKeymapOfLength(UInt32 * length)
        !           459: {
        !           460:   //
        !           461:   // Returns the default x86 keymap string.
        !           462:   //
        !           463:   // The following keys are multi-byte sequences on the x86 keyboard.  They get
        !           464:   // mapped into a single scan code for our purposes.  Here is the mapping:
        !           465:   //    PC Key          PC Code         NeXT Code
        !           466:   //    Right-Ctrl      E0-1D           0x60
        !           467:   //    Right-Alt       E0-38           0x61
        !           468:   //    Keypad-Enter    E0-1C           0x62
        !           469:   //    Keypad-/        E0-35           0x63
        !           470:   //    Up-Arrow        E0-48           0x64
        !           471:   //    Down-Arrow      E0-50           0x65
        !           472:   //    Left-Arrow      E0-4B           0x66
        !           473:   //    Right-Arrow     E0-4D           0x67
        !           474:   //    Insert          E0-52           0x68
        !           475:   //    Delete          E0-53           0x69
        !           476:   //    Page Up         E0-49           0x6A
        !           477:   //    Page Down       E0-51           0x6B
        !           478:   //    Home            E0-47           0x6C
        !           479:   //    End             E0-4F           0x6D
        !           480:   //
        !           481:   // Because there is no Command key on the x86 keyboard, we've split the ALT
        !           482:   // keys up.  We'll use Left-Alt as Command, and Right-Alt as ALT.
        !           483:   //
        !           484: 
        !           485:   #define CTRL(c) ((c)&037)
        !           486:   #define NX_MODIFIERKEY_ALPHALOCK        0
        !           487:   #define NX_MODIFIERKEY_SHIFT            1
        !           488:   #define NX_MODIFIERKEY_CONTROL          2
        !           489:   #define NX_MODIFIERKEY_ALTERNATE        3
        !           490:   #define NX_MODIFIERKEY_COMMAND          4
        !           491:   #define NX_MODIFIERKEY_NUMERICPAD       5
        !           492:   #define NX_MODIFIERKEY_HELP             6
        !           493: 
        !           494:   static const unsigned char defaultKeymapForPC[] =
        !           495:   {
        !           496:     0x00, 0x00,     // char file format
        !           497: 
        !           498:     6,              // MODIFIER KEY DEFINITIONS (6)
        !           499:     0x01, 0x02,     0x2A, 0x36,              // Shift, 2 keys
        !           500:     0x02, 0x02,     0x1D, 0x60,              // Ctrl, 2 keys
        !           501:     0x03, 0x01,     0x61,                    // Alt, 1 key
        !           502:     0x04, 0x01,     0x38,                    // Cmd, 1 key
        !           503:     0x05, 0x15,     0x52, 0x53, 0x62, 0x4F, 0x50, 0x51, 0x4B, 0x4C, 0x4D,
        !           504:                     0x4E, 0x47, 0x48, 0x49, 0x45, 0x63, 0x37, 0x4A,
        !           505:                     0x64, 0x65, 0x66, 0x67,  // NumPad, 21 keys
        !           506:     0x06, 0x01,     0x3B,                    // Help, 1 key
        !           507: 
        !           508:     104,            // KEY DEFINITIONS
        !           509:     0xff,   // Key 0x00 unassigned 
        !           510:        // Key 0x01 modifier key mask bits (0x02) 
        !           511:        (1<<NX_MODIFIERKEY_SHIFT),
        !           512:                NX_ASCIISET,    CTRL('['),      // no flags 
        !           513:                NX_ASCIISET,         '~',       // Shift 
        !           514:        // Key 0x02 modifier key mask bits (0x0a) 
        !           515:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
        !           516:                NX_ASCIISET,         '1',       // no flags 
        !           517:                NX_ASCIISET,         '!',       // Shift 
        !           518:                NX_SYMBOLSET,       0xad,       // Alt 
        !           519:                NX_ASCIISET,        0xa1,       // Shift Alt 
        !           520:        // Key 0x03 modifier key mask bits (0x0e) 
        !           521:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           522:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           523:                NX_ASCIISET,         '2',       // no flags 
        !           524:                NX_ASCIISET,         '@',       // Shift 
        !           525:                NX_ASCIISET,    CTRL('@'),      // Ctrl 
        !           526:                NX_ASCIISET,    CTRL('@'),      // Shift Ctrl 
        !           527:                NX_ASCIISET,        0xb2,       // Alt 
        !           528:                NX_ASCIISET,        0xb3,       // Shift Alt 
        !           529:                NX_ASCIISET,    CTRL('@'),      // Ctrl Alt 
        !           530:                NX_ASCIISET,    CTRL('@'),      // Shift Ctrl Alt 
        !           531:        // Key 0x04 modifier key mask bits (0x0a) 
        !           532:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
        !           533:                NX_ASCIISET,         '3',       // no flags 
        !           534:                NX_ASCIISET,         '#',       // Shift 
        !           535:                NX_ASCIISET,        0xa3,       // Alt 
        !           536:                NX_SYMBOLSET,       0xba,       // Shift Alt 
        !           537:        // Key 0x05 modifier key mask bits (0x0a) 
        !           538:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
        !           539:                NX_ASCIISET,         '4',       // no flags 
        !           540:                NX_ASCIISET,         '$',       // Shift 
        !           541:                NX_ASCIISET,        0xa2,       // Alt 
        !           542:                NX_ASCIISET,        0xa8,       // Shift Alt 
        !           543:        // Key 0x06 modifier key mask bits (0x0a) 
        !           544:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
        !           545:                NX_ASCIISET,         '5',       // no flags 
        !           546:                NX_ASCIISET,         '%',       // Shift 
        !           547:                NX_SYMBOLSET,       0xa5,       // Alt 
        !           548:                NX_ASCIISET,        0xbd,       // Shift Alt 
        !           549:        // Key 0x07 modifier key mask bits (0x0e) 
        !           550:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           551:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           552:                NX_ASCIISET,         '6',       // no flags 
        !           553:                NX_ASCIISET,         '^',       // Shift 
        !           554:                NX_ASCIISET,    CTRL('^'),      // Ctrl 
        !           555:                NX_ASCIISET,    CTRL('^'),      // Shift Ctrl 
        !           556:                NX_ASCIISET,        0xb6,       // Alt 
        !           557:                NX_ASCIISET,        0xc3,       // Shift Alt 
        !           558:                NX_ASCIISET,    CTRL('^'),      // Ctrl Alt 
        !           559:                NX_ASCIISET,    CTRL('^'),      // Shift Ctrl Alt 
        !           560:        // Key 0x08 modifier key mask bits (0x0a) 
        !           561:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
        !           562:                NX_ASCIISET,         '7',       // no flags 
        !           563:                NX_ASCIISET,         '&',       // Shift 
        !           564:                NX_ASCIISET,        0xb7,       // Alt 
        !           565:                NX_SYMBOLSET,       0xab,       // Shift Alt 
        !           566:        // Key 0x09 modifier key mask bits (0x0a) 
        !           567:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
        !           568:                NX_ASCIISET,         '8',       // no flags 
        !           569:                NX_ASCIISET,         '*',       // Shift 
        !           570:                NX_SYMBOLSET,       0xb0,       // Alt 
        !           571:                NX_ASCIISET,        0xb4,       // Shift Alt 
        !           572:        // Key 0x0A modifier key mask bits (0x0a) 
        !           573:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
        !           574:                NX_ASCIISET,         '9',       // no flags 
        !           575:                NX_ASCIISET,         '(',       // Shift 
        !           576:                NX_ASCIISET,        0xac,       // Alt 
        !           577:                NX_ASCIISET,        0xab,       // Shift Alt 
        !           578:        // Key 0x0B modifier key mask bits (0x0a) 
        !           579:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
        !           580:                NX_ASCIISET,         '0',       // no flags 
        !           581:                NX_ASCIISET,         ')',       // Shift 
        !           582:                NX_ASCIISET,        0xad,       // Alt 
        !           583:                NX_ASCIISET,        0xbb,       // Shift Alt 
        !           584:        // Key 0x0C modifier key mask bits (0x0e) 
        !           585:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           586:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           587:                NX_ASCIISET,         '-',       // no flags 
        !           588:                NX_ASCIISET,         '_',       // Shift 
        !           589:                NX_ASCIISET,    CTRL('_'),      // Ctrl 
        !           590:                NX_ASCIISET,    CTRL('_'),      // Shift Ctrl 
        !           591:                NX_ASCIISET,        0xb1,       // Alt 
        !           592:                NX_ASCIISET,        0xd0,       // Shift Alt 
        !           593:                NX_ASCIISET,    CTRL('_'),      // Ctrl Alt 
        !           594:                NX_ASCIISET,    CTRL('_'),      // Shift Ctrl Alt 
        !           595:        // Key 0x0D modifier key mask bits (0x0a) 
        !           596:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
        !           597:                NX_ASCIISET,         '=',       // no flags 
        !           598:                NX_ASCIISET,         '+',       // Shift 
        !           599:                NX_SYMBOLSET,       0xb9,       // Alt 
        !           600:                NX_SYMBOLSET,       0xb1,       // Shift Alt 
        !           601:        // Key 0x0E modifier key mask bits (0x02) 
        !           602:        (1<<NX_MODIFIERKEY_SHIFT),
        !           603:                NX_ASCIISET,        0x7f,       // no flags 
        !           604:                NX_ASCIISET,        '\b',       // Shift 
        !           605:        // Key 0x0f modifier key mask bits (0x02) 
        !           606:        (1<<NX_MODIFIERKEY_SHIFT),
        !           607:                NX_ASCIISET,        '\t',       // no flags 
        !           608:                NX_ASCIISET,    CTRL('Y'),      // Shift 
        !           609:        // Key 0x10 modifier key mask bits (0x0d) 
        !           610:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           611:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           612:                NX_ASCIISET,         'q',       // no flags 
        !           613:                NX_ASCIISET,         'Q',       // AlphaShift 
        !           614:                NX_ASCIISET,    CTRL('Q'),      // Ctrl 
        !           615:                NX_ASCIISET,    CTRL('Q'),      // AlphaShift Ctrl 
        !           616:                NX_ASCIISET,        0xfa,       // Alt 
        !           617:                NX_ASCIISET,        0xea,       // AlphaShift Alt 
        !           618:                NX_ASCIISET,    CTRL('Q'),      // Ctrl Alt 
        !           619:                NX_ASCIISET,    CTRL('Q'),      // AlphaShift Ctrl Alt 
        !           620:        // Key 0x11 modifier key mask bits (0x0d) 
        !           621:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           622:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           623:                NX_ASCIISET,         'w',       // no flags 
        !           624:                NX_ASCIISET,         'W',       // AlphaShift 
        !           625:                NX_ASCIISET,    CTRL('W'),      // Ctrl 
        !           626:                NX_ASCIISET,    CTRL('W'),      // AlphaShift Ctrl 
        !           627:                NX_SYMBOLSET,       0xc8,       // Alt 
        !           628:                NX_SYMBOLSET,       0xc7,       // AlphaShift Alt 
        !           629:                NX_ASCIISET,    CTRL('W'),      // Ctrl Alt 
        !           630:                NX_ASCIISET,    CTRL('W'),      // AlphaShift Ctrl Alt 
        !           631:        // Key 0x12 modifier key mask bits (0x0d) 
        !           632:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           633:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           634:                NX_ASCIISET,         'e',       // no flags 
        !           635:                NX_ASCIISET,         'E',       // AlphaShift 
        !           636:                NX_ASCIISET,    CTRL('E'),      // Ctrl 
        !           637:                NX_ASCIISET,    CTRL('E'),      // AlphaShift Ctrl 
        !           638:                NX_ASCIISET,        0xc2,       // Alt 
        !           639:                NX_ASCIISET,        0xc5,       // AlphaShift Alt 
        !           640:                NX_ASCIISET,    CTRL('E'),      // Ctrl Alt 
        !           641:                NX_ASCIISET,    CTRL('E'),      // AlphaShift Ctrl Alt 
        !           642:        // Key 0x13 modifier key mask bits (0x0d) 
        !           643:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           644:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           645:                NX_ASCIISET,         'r',       // no flags 
        !           646:                NX_ASCIISET,         'R',       // AlphaShift 
        !           647:                NX_ASCIISET,    CTRL('R'),      // Ctrl 
        !           648:                NX_ASCIISET,    CTRL('R'),      // AlphaShift Ctrl 
        !           649:                NX_SYMBOLSET,       0xe2,       // Alt 
        !           650:                NX_SYMBOLSET,       0xd2,       // AlphaShift Alt 
        !           651:                NX_ASCIISET,    CTRL('R'),      // Ctrl Alt 
        !           652:                NX_ASCIISET,    CTRL('R'),      // AlphaShift Ctrl Alt 
        !           653:        // Key 0x14 modifier key mask bits (0x0d) 
        !           654:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           655:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           656:                NX_ASCIISET,         't',       // no flags 
        !           657:                NX_ASCIISET,         'T',       // AlphaShift 
        !           658:                NX_ASCIISET,    CTRL('T'),      // Ctrl 
        !           659:                NX_ASCIISET,    CTRL('T'),      // AlphaShift Ctrl 
        !           660:                NX_SYMBOLSET,       0xe4,       // Alt 
        !           661:                NX_SYMBOLSET,       0xd4,       // AlphaShift Alt 
        !           662:                NX_ASCIISET,    CTRL('T'),      // Ctrl Alt 
        !           663:                NX_ASCIISET,    CTRL('T'),      // AlphaShift Ctrl Alt 
        !           664:        // Key 0x15 modifier key mask bits (0x0d) 
        !           665:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           666:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           667:                NX_ASCIISET,         'y',       // no flags 
        !           668:                NX_ASCIISET,         'Y',       // AlphaShift 
        !           669:                NX_ASCIISET,    CTRL('Y'),      // Ctrl 
        !           670:                NX_ASCIISET,    CTRL('Y'),      // AlphaShift Ctrl 
        !           671:                NX_ASCIISET,        0xa5,       // Alt 
        !           672:                NX_SYMBOLSET,       0xdb,       // AlphaShift Alt 
        !           673:                NX_ASCIISET,    CTRL('Y'),      // Ctrl Alt 
        !           674:                NX_ASCIISET,    CTRL('Y'),      // AlphaShift Ctrl Alt 
        !           675:        // Key 0x16 modifier key mask bits (0x0d) 
        !           676:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           677:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           678:                NX_ASCIISET,         'u',       // no flags 
        !           679:                NX_ASCIISET,         'U',       // AlphaShift 
        !           680:                NX_ASCIISET,    CTRL('U'),      // Ctrl 
        !           681:                NX_ASCIISET,    CTRL('U'),      // AlphaShift Ctrl 
        !           682:                NX_ASCIISET,        0xc8,       // Alt 
        !           683:                NX_ASCIISET,        0xcd,       // AlphaShift Alt 
        !           684:                NX_ASCIISET,    CTRL('U'),      // Ctrl Alt 
        !           685:                NX_ASCIISET,    CTRL('U'),      // AlphaShift Ctrl Alt 
        !           686:        // Key 0x17 modifier key mask bits (0x0d) 
        !           687:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           688:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           689:                NX_ASCIISET,         'i',       // no flags 
        !           690:                NX_ASCIISET,         'I',       // AlphaShift 
        !           691:                NX_ASCIISET,        '\t',       // Ctrl 
        !           692:                NX_ASCIISET,        '\t',       // AlphaShift Ctrl 
        !           693:                NX_ASCIISET,        0xc1,       // Alt 
        !           694:                NX_ASCIISET,        0xf5,       // AlphaShift Alt 
        !           695:                NX_ASCIISET,        '\t',       // Ctrl Alt 
        !           696:                NX_ASCIISET,        '\t',       // AlphaShift Ctrl Alt 
        !           697:        // Key 0x18 modifier key mask bits (0x0d) 
        !           698:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           699:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           700:                NX_ASCIISET,         'o',       // no flags 
        !           701:                NX_ASCIISET,         'O',       // AlphaShift 
        !           702:                NX_ASCIISET,    CTRL('O'),      // Ctrl 
        !           703:                NX_ASCIISET,    CTRL('O'),      // AlphaShift Ctrl 
        !           704:                NX_ASCIISET,        0xf9,       // Alt 
        !           705:                NX_ASCIISET,        0xe9,       // AlphaShift Alt 
        !           706:                NX_ASCIISET,    CTRL('O'),      // Ctrl Alt 
        !           707:                NX_ASCIISET,    CTRL('O'),      // AlphaShift Ctrl Alt 
        !           708:        // Key 0x19 modifier key mask bits (0x0d) 
        !           709:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           710:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           711:                NX_ASCIISET,         'p',       // no flags 
        !           712:                NX_ASCIISET,         'P',       // AlphaShift 
        !           713:                NX_ASCIISET,    CTRL('P'),      // Ctrl 
        !           714:                NX_ASCIISET,    CTRL('P'),      // AlphaShift Ctrl 
        !           715:                NX_SYMBOLSET,       0x70,       // Alt 
        !           716:                NX_SYMBOLSET,       0x50,       // AlphaShift Alt 
        !           717:                NX_ASCIISET,    CTRL('P'),      // Ctrl Alt 
        !           718:                NX_ASCIISET,    CTRL('P'),      // AlphaShift Ctrl Alt 
        !           719:        // Key 0x1A modifier key mask bits (0x0e) 
        !           720:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           721:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           722:                NX_ASCIISET,         '[',       // no flags 
        !           723:                NX_ASCIISET,         '{',       // Shift 
        !           724:                NX_ASCIISET,    CTRL('['),      // Ctrl 
        !           725:                NX_ASCIISET,    CTRL('['),      // Shift Ctrl 
        !           726:                NX_ASCIISET,         '`',       // Alt 
        !           727:                NX_ASCIISET,        0xaa,       // Shift Alt 
        !           728:                NX_ASCIISET,    CTRL('['),      // Ctrl Alt 
        !           729:                NX_ASCIISET,    CTRL('['),      // Shift Ctrl Alt 
        !           730:        // Key 0x1B modifier key mask bits (0x0e) 
        !           731:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           732:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           733:                NX_ASCIISET,         ']',       // no flags 
        !           734:                NX_ASCIISET,         '}',       // Shift 
        !           735:                NX_ASCIISET,    CTRL(']'),      // Ctrl 
        !           736:                NX_ASCIISET,    CTRL(']'),      // Shift Ctrl 
        !           737:                NX_ASCIISET,        '\'',       // Alt 
        !           738:                NX_ASCIISET,        0xba,       // Shift Alt 
        !           739:                NX_ASCIISET,    CTRL(']'),      // Ctrl Alt 
        !           740:                NX_ASCIISET,    CTRL(']'),      // Shift Ctrl Alt 
        !           741:        // Key 0x1C modifier key mask bits (0x10) 
        !           742:        (1<<NX_MODIFIERKEY_COMMAND),
        !           743:                NX_ASCIISET,        '\r',       // no flags 
        !           744:                NX_ASCIISET,    CTRL('C'),      // Cmd 
        !           745:        0xff,   // Key 0x1D unassigned - Left Control 
        !           746:        // Key 0x1E modifier key mask bits (0x0d) 
        !           747:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           748:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           749:                NX_ASCIISET,         'a',       // no flags 
        !           750:                NX_ASCIISET,         'A',       // AlphaShift 
        !           751:                NX_ASCIISET,    CTRL('A'),      // Ctrl 
        !           752:                NX_ASCIISET,    CTRL('A'),      // AlphaShift Ctrl 
        !           753:                NX_ASCIISET,        0xca,       // Alt 
        !           754:                NX_ASCIISET,        0xc7,       // AlphaShift Alt 
        !           755:                NX_ASCIISET,    CTRL('A'),      // Ctrl Alt 
        !           756:                NX_ASCIISET,    CTRL('A'),      // AlphaShift Ctrl Alt 
        !           757:        // Key 0x1F modifier key mask bits (0x0d) 
        !           758:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           759:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           760:                NX_ASCIISET,         's',       // no flags 
        !           761:                NX_ASCIISET,         'S',       // AlphaShift 
        !           762:                NX_ASCIISET,    CTRL('S'),      // Ctrl 
        !           763:                NX_ASCIISET,    CTRL('S'),      // AlphaShift Ctrl 
        !           764:                NX_ASCIISET,        0xfb,       // Alt 
        !           765:                NX_ASCIISET,        0xa7,       // AlphaShift Alt 
        !           766:                NX_ASCIISET,    CTRL('S'),      // Ctrl Alt 
        !           767:                NX_ASCIISET,    CTRL('S'),      // AlphaShift Ctrl Alt 
        !           768:        // Key 0x20 modifier key mask bits (0x0d) 
        !           769:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           770:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           771:                NX_ASCIISET,         'd',       // no flags 
        !           772:                NX_ASCIISET,         'D',       // AlphaShift 
        !           773:                NX_ASCIISET,    CTRL('D'),      // Ctrl 
        !           774:                NX_ASCIISET,    CTRL('D'),      // AlphaShift Ctrl 
        !           775:                NX_SYMBOLSET,       0x44,       // Alt 
        !           776:                NX_SYMBOLSET,       0xb6,       // AlphaShift Alt 
        !           777:                NX_ASCIISET,    CTRL('D'),      // Ctrl Alt 
        !           778:                NX_ASCIISET,    CTRL('D'),      // AlphaShift Ctrl Alt 
        !           779:        // Key 0x21 modifier key mask bits (0x0d) 
        !           780:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           781:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           782:                NX_ASCIISET,         'f',       // no flags 
        !           783:                NX_ASCIISET,         'F',       // AlphaShift 
        !           784:                NX_ASCIISET,    CTRL('F'),      // Ctrl 
        !           785:                NX_ASCIISET,    CTRL('F'),      // AlphaShift Ctrl 
        !           786:                NX_ASCIISET,        0xa6,       // Alt 
        !           787:                NX_SYMBOLSET,       0xac,       // AlphaShift Alt 
        !           788:                NX_ASCIISET,    CTRL('F'),      // Ctrl Alt 
        !           789:                NX_ASCIISET,    CTRL('F'),      // AlphaShift Ctrl Alt 
        !           790:        // Key 0x22 modifier key mask bits (0x0d) 
        !           791:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           792:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           793:                NX_ASCIISET,         'g',       // no flags 
        !           794:                NX_ASCIISET,         'G',       // AlphaShift 
        !           795:                NX_ASCIISET,    CTRL('G'),      // Ctrl 
        !           796:                NX_ASCIISET,    CTRL('G'),      // AlphaShift Ctrl 
        !           797:                NX_ASCIISET,        0xf1,       // Alt 
        !           798:                NX_ASCIISET,        0xe1,       // AlphaShift Alt 
        !           799:                NX_ASCIISET,    CTRL('G'),      // Ctrl Alt 
        !           800:                NX_ASCIISET,    CTRL('G'),      // AlphaShift Ctrl Alt 
        !           801:        // Key 0x23 modifier key mask bits (0x0d) 
        !           802:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           803:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           804:                NX_ASCIISET,         'h',       // no flags 
        !           805:                NX_ASCIISET,         'H',       // AlphaShift 
        !           806:                NX_ASCIISET,        '\b',       // Ctrl 
        !           807:                NX_ASCIISET,        '\b',       // AlphaShift Ctrl 
        !           808:                NX_ASCIISET,        0xe3,       // Alt 
        !           809:                NX_ASCIISET,        0xeb,       // AlphaShift Alt 
        !           810:                NX_ASCIISET,    CTRL('@'),      // Ctrl Alt 
        !           811:                0x18,   CTRL('@'),      // AlphaShift Ctrl Alt 
        !           812:        // Key 0x24 modifier key mask bits (0x0d) 
        !           813:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           814:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           815:                NX_ASCIISET,         'j',       // no flags 
        !           816:                NX_ASCIISET,         'J',       // AlphaShift 
        !           817:                NX_ASCIISET,        '\n',       // Ctrl 
        !           818:                NX_ASCIISET,        '\n',       // AlphaShift Ctrl 
        !           819:                NX_ASCIISET,        0xc6,       // Alt 
        !           820:                NX_ASCIISET,        0xae,       // AlphaShift Alt 
        !           821:                NX_ASCIISET,        '\n',       // Ctrl Alt 
        !           822:                NX_ASCIISET,        '\n',       // AlphaShift Ctrl Alt 
        !           823:        // Key 0x25 modifier key mask bits (0x0d) 
        !           824:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           825:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           826:                NX_ASCIISET,         'k',       // no flags 
        !           827:                NX_ASCIISET,         'K',       // AlphaShift 
        !           828:                NX_ASCIISET,    CTRL('K'),      // Ctrl 
        !           829:                NX_ASCIISET,    CTRL('K'),      // AlphaShift Ctrl 
        !           830:                NX_ASCIISET,        0xce,       // Alt 
        !           831:                NX_ASCIISET,        0xaf,       // AlphaShift Alt 
        !           832:                NX_ASCIISET,    CTRL('K'),      // Ctrl Alt 
        !           833:                NX_ASCIISET,    CTRL('K'),      // AlphaShift Ctrl Alt 
        !           834:        // Key 0x26 modifier key mask bits (0x0d) 
        !           835:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           836:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           837:                NX_ASCIISET,         'l',       // no flags 
        !           838:                NX_ASCIISET,         'L',       // AlphaShift 
        !           839:                NX_ASCIISET,        '\f',       // Ctrl 
        !           840:                NX_ASCIISET,        '\f',       // AlphaShift Ctrl 
        !           841:                NX_ASCIISET,        0xf8,       // Alt 
        !           842:                NX_ASCIISET,        0xe8,       // AlphaShift Alt 
        !           843:                NX_ASCIISET,        '\f',       // Ctrl Alt 
        !           844:                NX_ASCIISET,        '\f',       // AlphaShift Ctrl Alt 
        !           845:        // Key 0x27 modifier key mask bits (0x0a) 
        !           846:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
        !           847:                NX_ASCIISET,         ';',       // no flags 
        !           848:                NX_ASCIISET,         ':',       // Shift 
        !           849:                NX_SYMBOLSET,       0xb2,       // Alt 
        !           850:                NX_SYMBOLSET,       0xa2,       // Shift Alt 
        !           851:        // Key 0x28 modifier key mask bits (0x0a) 
        !           852:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
        !           853:                NX_ASCIISET,        '\'',       // no flags 
        !           854:                NX_ASCIISET,         '"',       // Shift 
        !           855:                NX_ASCIISET,        0xa9,       // Alt 
        !           856:                NX_SYMBOLSET,       0xae,       // Shift Alt 
        !           857:        // Key 0x29 modifier key mask bits (0x02) 
        !           858:        (1<<NX_MODIFIERKEY_SHIFT),
        !           859:                NX_ASCIISET,         '`',        // no flags 
        !           860:                NX_ASCIISET,         '~',       // Shift 
        !           861:        0xff,   // Key 0x2A unassigned - Left Shift 
        !           862:        // Key 0x2B modifier key mask bits (0x0e) 
        !           863:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           864:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           865:                NX_ASCIISET,        '\\',       // no flags 
        !           866:                NX_ASCIISET,         '|',       // Shift 
        !           867:                NX_ASCIISET,    CTRL('\\'),     // Ctrl 
        !           868:                NX_ASCIISET,    CTRL('\\'),     // Shift Ctrl 
        !           869:                NX_ASCIISET,        0xe3,       // Alt 
        !           870:                NX_ASCIISET,        0xeb,       // Shift Alt 
        !           871:                NX_ASCIISET,    CTRL('\\'),     // Ctrl Alt 
        !           872:                NX_ASCIISET,    CTRL('\\'),     // Shift Ctrl Alt 
        !           873:        // Key 0x2C modifier key mask bits (0x0d) 
        !           874:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           875:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           876:                NX_ASCIISET,         'z',       // no flags 
        !           877:                NX_ASCIISET,         'Z',       // AlphaShift 
        !           878:                NX_ASCIISET,    CTRL('Z'),      // Ctrl 
        !           879:                NX_ASCIISET,    CTRL('Z'),      // AlphaShift Ctrl 
        !           880:                NX_ASCIISET,        0xcf,       // Alt 
        !           881:                NX_SYMBOLSET,       0x57,       // AlphaShift Alt 
        !           882:                NX_ASCIISET,    CTRL('Z'),      // Ctrl Alt 
        !           883:                NX_ASCIISET,    CTRL('Z'),      // AlphaShift Ctrl Alt 
        !           884:        // Key 0x2D modifier key mask bits (0x0d) 
        !           885:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           886:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           887:                NX_ASCIISET,         'x',       // no flags 
        !           888:                NX_ASCIISET,         'X',       // AlphaShift 
        !           889:                NX_ASCIISET,    CTRL('X'),      // Ctrl 
        !           890:                NX_ASCIISET,    CTRL('X'),      // AlphaShift Ctrl 
        !           891:                NX_SYMBOLSET,       0xb4,       // Alt 
        !           892:                NX_SYMBOLSET,       0xce,       // AlphaShift Alt 
        !           893:                NX_ASCIISET,    CTRL('X'),      // Ctrl Alt 
        !           894:                NX_ASCIISET,    CTRL('X'),      // AlphaShift Ctrl Alt 
        !           895:        // Key 0x2E modifier key mask bits (0x0d) 
        !           896:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           897:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           898:                NX_ASCIISET,         'c',       // no flags 
        !           899:                NX_ASCIISET,         'C',       // AlphaShift 
        !           900:                NX_ASCIISET,    CTRL('C'),      // Ctrl 
        !           901:                NX_ASCIISET,    CTRL('C'),      // AlphaShift Ctrl 
        !           902:                NX_SYMBOLSET,       0xe3,       // Alt 
        !           903:                NX_SYMBOLSET,       0xd3,       // AlphaShift Alt 
        !           904:                NX_ASCIISET,    CTRL('C'),      // Ctrl Alt 
        !           905:                NX_ASCIISET,    CTRL('C'),      // AlphaShift Ctrl Alt 
        !           906:        // Key 0x2F modifier key mask bits (0x0d) 
        !           907:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           908:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           909:                NX_ASCIISET,         'v',       // no flags 
        !           910:                NX_ASCIISET,         'V',       // AlphaShift 
        !           911:                NX_ASCIISET,    CTRL('V'),      // Ctrl 
        !           912:                NX_ASCIISET,    CTRL('V'),      // AlphaShift Ctrl 
        !           913:                NX_SYMBOLSET,       0xd6,       // Alt 
        !           914:                NX_SYMBOLSET,       0xe0,       // AlphaShift Alt 
        !           915:                NX_ASCIISET,    CTRL('V'),      // Ctrl Alt 
        !           916:                NX_ASCIISET,    CTRL('V'),      // AlphaShift Ctrl Alt 
        !           917:        // Key 0x30 modifier key mask bits (0x0d) 
        !           918:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           919:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           920:                NX_ASCIISET,         'b',       // no flags 
        !           921:                NX_ASCIISET,         'B',       // AlphaShift 
        !           922:                NX_ASCIISET,    CTRL('B'),      // Ctrl 
        !           923:                NX_ASCIISET,    CTRL('B'),      // AlphaShift Ctrl 
        !           924:                NX_SYMBOLSET,       0xe5,       // Alt 
        !           925:                NX_SYMBOLSET,       0xf2,       // AlphaShift Alt 
        !           926:                NX_ASCIISET,    CTRL('B'),      // Ctrl Alt 
        !           927:                NX_ASCIISET,    CTRL('B'),      // AlphaShift Ctrl Alt 
        !           928:        // Key 0x31 modifier key mask bits (0x0d) 
        !           929:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           930:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           931:                NX_ASCIISET,         'n',       // no flags 
        !           932:                NX_ASCIISET,         'N',       // AlphaShift 
        !           933:                NX_ASCIISET,    CTRL('N'),      // Ctrl 
        !           934:                NX_ASCIISET,    CTRL('N'),      // AlphaShift Ctrl 
        !           935:                NX_ASCIISET,        0xc4,       // Alt 
        !           936:                NX_SYMBOLSET,       0xaf,       // AlphaShift Alt 
        !           937:                NX_ASCIISET,    CTRL('N'),      // Ctrl Alt 
        !           938:                NX_ASCIISET,    CTRL('N'),      // AlphaShift Ctrl Alt 
        !           939:        // Key 0x32 modifier key mask bits (0x0d) 
        !           940:        (1<<NX_MODIFIERKEY_ALPHALOCK)|(1<<NX_MODIFIERKEY_CONTROL)|
        !           941:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !           942:                NX_ASCIISET,         'm',       // no flags 
        !           943:                NX_ASCIISET,         'M',       // AlphaShift 
        !           944:                NX_ASCIISET,        '\r',       // Ctrl 
        !           945:                NX_ASCIISET,        '\r',       // AlphaShift Ctrl 
        !           946:                NX_SYMBOLSET,       0x6d,       // Alt 
        !           947:                NX_SYMBOLSET,       0xd8,       // AlphaShift Alt 
        !           948:                NX_ASCIISET,        '\r',       // Ctrl Alt 
        !           949:                NX_ASCIISET,        '\r',       // AlphaShift Ctrl Alt 
        !           950:        // Key 0x33 modifier key mask bits (0x0a) 
        !           951:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
        !           952:                NX_ASCIISET,         ',',       // no flags 
        !           953:                NX_ASCIISET,         '<',       // Shift 
        !           954:                NX_ASCIISET,        0xcb,       // Alt 
        !           955:                NX_SYMBOLSET,       0xa3,       // Shift Alt 
        !           956:        // Key 0x34 modifier key mask bits (0x0a) 
        !           957:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
        !           958:                NX_ASCIISET,         '.',       // no flags 
        !           959:                NX_ASCIISET,         '>',       // Shift 
        !           960:                NX_ASCIISET,        0xbc,       // Alt 
        !           961:                NX_SYMBOLSET,       0xb3,       // Shift Alt 
        !           962:        // Key 0x35 modifier key mask bits (0x0a) 
        !           963:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
        !           964:                NX_ASCIISET,         '/',       // no flags 
        !           965:                NX_ASCIISET,         '?',       // Shift 
        !           966:                NX_SYMBOLSET,       0xb8,       // Alt 
        !           967:                NX_ASCIISET,        0xbf,       // Shift Alt 
        !           968:        0xff,   // Key 0x36 unassigned - Right Shift 
        !           969:        // Key 0x37 modifier key mask bits (0x00) 
        !           970:        0,
        !           971:                NX_ASCIISET,         '*',       // all 
        !           972:        0xff,   // Key 0x38 unassigned - Left Alt 
        !           973:        // Key 0x39 modifier key mask bits (0x0c) 
        !           974:        (1<<NX_MODIFIERKEY_CONTROL)|(1<<NX_MODIFIERKEY_ALTERNATE),
        !           975:                NX_ASCIISET,         ' ',       // no flags 
        !           976:                NX_ASCIISET,    CTRL('@'),      // Ctrl 
        !           977:                NX_ASCIISET,        0x80,       // Alt 
        !           978:                NX_ASCIISET,    CTRL('@'),      // Ctrl Alt 
        !           979:        0xff,   // Key 0x3A unassigned - CAPS LOCK 
        !           980:        0xff,   // Key 0x3B unassigned - F1      
        !           981:        0xff,   // Key 0x3C unassigned - F2      
        !           982:        0xff,   // Key 0x3D unassigned - F3      
        !           983:        0xff,   // Key 0x3E unassigned - F4      
        !           984:        0xff,   // Key 0x3F unassigned - F5      
        !           985:        0xff,   // Key 0x40 unassigned - F6      
        !           986:        0xff,   // Key 0x41 unassigned - F7      
        !           987:        0xff,   // Key 0x42 unassigned - F8      
        !           988:        0xff,   // Key 0x43 unassigned - F9      
        !           989:        0xff,   // Key 0x44 unassigned - F10     
        !           990:        // Key 0x45 modifier key mask bits (0x0a) 
        !           991:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_ALTERNATE),
        !           992:                NX_ASCIISET,         '`',       // no flags 
        !           993:                NX_ASCIISET,         '~',       // Shift 
        !           994:                NX_ASCIISET,         '`',       // Alt 
        !           995:                NX_SYMBOLSET,       0xbb,       // Shift Alt 
        !           996:        0xff,   // Key 0x46 unassigned 
        !           997:        // Key 0x47 modifier key mask bits (0x00) 
        !           998:        0,
        !           999:                NX_ASCIISET,         '7',       // all 
        !          1000:        // Key 0x48 modifier key mask bits (0x00) 
        !          1001:        0,
        !          1002:                NX_ASCIISET,         '8',       // all 
        !          1003:        // Key 0x49 modifier key mask bits (0x00) 
        !          1004:        0,
        !          1005:                NX_ASCIISET,         '9',       // all 
        !          1006:        // Key 0x4A modifier key mask bits (0x00) 
        !          1007:        0,
        !          1008:                NX_SYMBOLSET,       0x2d,       // all 
        !          1009:        // Key 0x4B modifier key mask bits (0x00) 
        !          1010:        0,
        !          1011:                NX_ASCIISET,         '4',       // all 
        !          1012:        // Key 0x4C modifier key mask bits (0x00) 
        !          1013:        0,
        !          1014:                NX_ASCIISET,         '5',       // all 
        !          1015:        // Key 0x4D modifier key mask bits (0x00) 
        !          1016:        0,
        !          1017:                NX_ASCIISET,         '6',       // all 
        !          1018:        // Key 0x4E modifier key mask bits (0x00) 
        !          1019:        0,
        !          1020:                NX_ASCIISET,         '+',       // all 
        !          1021:        // Key 0x4F modifier key mask bits (0x00) 
        !          1022:        0,
        !          1023:                NX_ASCIISET,         '1',       // all 
        !          1024:        // Key 0x50 modifier key mask bits (0x00) 
        !          1025:        0,
        !          1026:                NX_ASCIISET,         '2',       // all 
        !          1027:        // Key 0x51 modifier key mask bits (0x00) 
        !          1028:        0,
        !          1029:                NX_ASCIISET,         '3',       // all 
        !          1030:        // Key 0x52 modifier key mask bits (0x00) 
        !          1031:        0,
        !          1032:                NX_ASCIISET,         '0',       // all 
        !          1033:        // Key 0x53 modifier key mask bits (0x00) 
        !          1034:        0,
        !          1035:                NX_ASCIISET,         '.',       // all 
        !          1036:        0xff,   // Key 0x54 unassigned 
        !          1037:        0xff,   // Key 0x55 unassigned 
        !          1038:        0xff,   // Key 0x56 unassigned 
        !          1039:        0xff,   // Key 0x57 unassigned - F11     
        !          1040:        0xff,   // Key 0x58 unassigned - F12      
        !          1041:        0xff,   // Key 0x59 unassigned 
        !          1042:        0xff,   // Key 0x5A unassigned 
        !          1043:        0xff,   // Key 0x5B unassigned 
        !          1044:        0xff,   // Key 0x5C unassigned 
        !          1045:        0xff,   // Key 0x5D unassigned 
        !          1046:        0xff,   // Key 0x5E unassigned 
        !          1047:        0xff,   // Key 0x5F unassigned 
        !          1048:        0xff,   // Key 0x60 unassigned - Right Ctrl      
        !          1049:        0xff,   // Key 0x61 unassigned - Right Alt       
        !          1050:        // Key 0x62 modifier key mask bits (0x00) 
        !          1051:        0,
        !          1052:                NX_ASCIISET,    CTRL('C'),      // all 
        !          1053:        // Key 0x63 modifier key mask bits (0x0e) 
        !          1054:        (1<<NX_MODIFIERKEY_SHIFT)|(1<<NX_MODIFIERKEY_CONTROL)|
        !          1055:        (1<<NX_MODIFIERKEY_ALTERNATE),
        !          1056:                NX_ASCIISET,         '/',       // no flags 
        !          1057:                NX_ASCIISET,        '\\',       // Shift 
        !          1058:                NX_ASCIISET,         '/',       // Ctrl 
        !          1059:                NX_ASCIISET,    CTRL('\\'),     // Shift Ctrl 
        !          1060:                NX_ASCIISET,         '/',       // Alt 
        !          1061:                NX_ASCIISET,        '\\',       // Shift Alt 
        !          1062:                NX_ASCIISET,    CTRL('@'),      // Ctrl Alt 
        !          1063:                0x0a,   CTRL('@'),      // Shift Ctrl Alt 
        !          1064:        // Key 0x64 modifier key mask bits (0x00) 
        !          1065:        0,
        !          1066:                NX_SYMBOLSET,       0xad,       // all 
        !          1067:        // Key 0x65 modifier key mask bits (0x00) 
        !          1068:        0,
        !          1069:                NX_SYMBOLSET,       0xaf,       // all 
        !          1070:        // Key 0x66 modifier key mask bits (0x00) 
        !          1071:        0,
        !          1072:                NX_SYMBOLSET,       0xac,       // all 
        !          1073:        // Key 0x67 modifier key mask bits (0x00) 
        !          1074:        0,
        !          1075:                NX_SYMBOLSET,       0xae,       // all 
        !          1076:        0,      // Sequence Definitions 
        !          1077:        9,      // special keys 
        !          1078:        0x00, 0x68,     // Sound Up 
        !          1079:        0x01, 0x69,     // Sound Down 
        !          1080:        0x02, 0x6A,     // Brightness Up 
        !          1081:        0x03, 0x6B,     // Brightness Down 
        !          1082:        0x04, 0x3A,     // Caps Lock 
        !          1083:        0x05, 0x3B,     // Help Key 
        !          1084:        0x06, 0x47,     // Power Key 
        !          1085:        0x07, 0x48,     // Up Arrow 
        !          1086:        0x08, 0x50      // Down Arrow 
        !          1087:   };
        !          1088: 
        !          1089:   *length = sizeof(defaultKeymapForPC);
        !          1090:   return defaultKeymapForPC;
        !          1091: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.