Christophe Bothamy wrote the keymapping code for Bochs, and provided this documentation for how to create new keymaps. Keymapping was first implemented for X windows only, so there are many references to X-specific values in this section. In Bochs 2.0 keymapping is also available for SDL (Linux port) and wxWidgets (wxGTK port).
The standard US Keyboard looks like this: ------------------------------------------- Top row Esc F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 ------------------------------------------- 2nd row ` 1 2 3 4 5 6 7 8 9 0 - = \ Back ------------------------------------------- 3rd row Tab Q W E R T Y U I O P [ ] Enter ------------------------------------------- 4rd row Caps A S D F G H J K L ; ' ------------------------------------------- 5rd row lShift l\ Z X C V B N M , . / rShift ------------------------------------------- 6rd row lCtrl lAlt Space rAlt rCtrl -------------------------------------------
Each key of the US keyboard maps to a Bochs constant named BX_KEY_symbol. You can find the current list of BX_KEY_symbol in the BX_KEY table, below. Please note that there is only one BX_KEY_symbol for each physical key.
Now, for each key of the US keyboard, look at which symbols you can type on your real keyboard. Each symbol maps to a X-windows XK_symbol constant. In X11/keysymdef.h, you will find the list of all possible XK_symbol on your system. Alternatively, you can use a small utility called "xev" that prints out the symbol names of a pressed key. Note that the symbol name given by xev does not contain the XK_ prefix. Don't forget to add a line for every symbol you can type on each key. For the key BX_KEY_A, you can type both lowercase 'a' and uppercase 'A', so you would need two different entries.
You can then create your own map file. Keymap files are found in the "gui/keymaps" directory in the source code, or in the "keymaps" directory in binary releases. Look at the existing keymap file as an example, and create a file containing one line for each symbol. The first column tells what key or combination of keys can be used to produce a given symbol. The second column is the ASCII equivalent for that symbol, or a special keyword (none, space, return, tab, backslash, or apostrophe). The third column is the X windows keysym for that symbol.
For example :
BX_KEY_0 '0' XK_0 BX_KEY_1 '1' XK_1 BX_KEY_2 '2' XK_2 BX_KEY_0+BX_KEY_SHIFT_L ')' XK_parenright BX_KEY_1+BX_KEY_SHIFT_L '!' XK_exclam BX_KEY_2+BX_KEY_SHIFT_L '@' XK_at BX_KEY_A 'a' XK_a BX_KEY_B 'b' XK_b BX_KEY_A+BX_KEY_SHIFT_L 'A' XK_A BX_KEY_B+BX_KEY_SHIFT_L 'B' XK_B BX_KEY_TAB tab XK_Tab BX_KEY_ENTER return XK_Return BX_KEY_F1 none XK_F1 BX_KEY_F2 none XK_F2 BX_KEY_F3 none XK_F3
Now that there are several keymap files in the Bochs distribution, it is easiest to copy an existing keymap and follow the examples you see. When it works, be sure to send it to the mailing list or post it on Source Forge so that we can include it in the next release. You may need to look up some of your country specific X11 symbols in X11/keysymdef.h.
Table 4-7. BX_KEY constants
BX_KEY constant | Keyboard Symbol |
---|---|
BX_KEY_CTRL_L | left Ctrl |
BX_KEY_SHIFT_L | left Shift |
BX_KEY_F1 | F1 |
BX_KEY_F2 | F2 |
BX_KEY_F3 | F3 |
BX_KEY_F4 | F4 |
BX_KEY_F5 | F5 |
BX_KEY_F6 | F6 |
BX_KEY_F7 | F7 |
BX_KEY_F8 | F8 |
BX_KEY_F9 | F9 |
BX_KEY_F10 | F10 |
BX_KEY_F11 | F11 |
BX_KEY_F12 | F12 |
BX_KEY_CTRL_R | right Ctrl |
BX_KEY_SHIFT_R | right Shift |
BX_KEY_CAPS_LOCK | CapsLock |
BX_KEY_NUM_LOCK | NumLock |
BX_KEY_ALT_L | left Alt |
BX_KEY_ALT_R | right Alt |
BX_KEY_A | A |
BX_KEY_B | B |
BX_KEY_C | C |
BX_KEY_D | D |
BX_KEY_E | E |
BX_KEY_F | F |
BX_KEY_G | G |
BX_KEY_H | H |
BX_KEY_I | I |
BX_KEY_J | J |
BX_KEY_K | K |
BX_KEY_L | L |
BX_KEY_M | M |
BX_KEY_N | N |
BX_KEY_O | O |
BX_KEY_P | P |
BX_KEY_Q | Q |
BX_KEY_R | R |
BX_KEY_S | S |
BX_KEY_T | T |
BX_KEY_U | U |
BX_KEY_V | V |
BX_KEY_W | W |
BX_KEY_X | X |
BX_KEY_Y | Y |
BX_KEY_Z | Z |
BX_KEY_0 | 0 |
BX_KEY_1 | 1 |
BX_KEY_2 | 2 |
BX_KEY_3 | 3 |
BX_KEY_4 | 4 |
BX_KEY_5 | 5 |
BX_KEY_6 | 6 |
BX_KEY_7 | 7 |
BX_KEY_8 | 8 |
BX_KEY_9 | 9 |
BX_KEY_ESC | Esc |
BX_KEY_SPACE | SpaceBar |
BX_KEY_SINGLE_QUOTE | ' |
BX_KEY_COMMA | , |
BX_KEY_PERIOD | . |
BX_KEY_SLASH | / |
BX_KEY_SEMICOLON | ; |
BX_KEY_EQUALS | = |
BX_KEY_LEFT_BRACKET | [ |
BX_KEY_BACKSLASH | \ |
BX_KEY_RIGHT_BRACKET | ] |
BX_KEY_MINUS | - |
BX_KEY_GRAVE | ` |
BX_KEY_BACKSPACE | BackSpace |
BX_KEY_ENTER | Enter |
BX_KEY_TAB | Tab |
BX_KEY_LEFT_BACKSLASH | left \ |
BX_KEY_PRINT | PrintScreen |
BX_KEY_SCRL_LOCK | ScrollLock |
BX_KEY_PAUSE | Pause |
BX_KEY_INSERT | Ins |
BX_KEY_DELETE | Del |
BX_KEY_HOME | Home |
BX_KEY_END | End |
BX_KEY_PAGE_UP | PageUo |
BX_KEY_PAGE_DOWN | PageDown |
BX_KEY_KP_ADD | Numeric Keypad + |
BX_KEY_KP_SUBTRACT | Numeric Keypad - |
BX_KEY_KP_END | Numeric Keypad 1 |
BX_KEY_KP_DOWN | Numeric Keypad 2 |
BX_KEY_KP_PAGE_DOWN | Numeric Keypad 3 |
BX_KEY_KP_LEFT | Numeric Keypad 4 |
BX_KEY_KP_5 | Numeric Keypad 5 |
BX_KEY_KP_RIGHT | Numeric Keypad 6 |
BX_KEY_KP_HOME | Numeric Keypad 7 |
BX_KEY_KP_UP | Numeric Keypad 8 |
BX_KEY_KP_PAGE_UP | Numeric Keypad 9 |
BX_KEY_KP_INSERT | Numeric Keypad 0 |
BX_KEY_KP_DELETE | Numeric Keypad . |
BX_KEY_KP_ENTER | Numeric Keypad Enter |
BX_KEY_KP_MULTIPLY | Numeric Keypad * |
BX_KEY_KP_DIVIDE | Numeric Keypad / |
BX_KEY_UP | UpArrow |
BX_KEY_DOWN | DownArrow |
BX_KEY_LEFT | LeftArrow |
BX_KEY_RIGHT | RightArrow |
BX_KEY_WIN_L | Left Windows |
BX_KEY_WIN_R | Right Windows |
BX_KEY_MENU | Menu |
BX_KEY_ALT_SYSREQ | Alt-Sysreq |
BX_KEY_CTRL_BREAK | Ctrl-Break |
BX_KEY_INT_BACK | Internet - back |
BX_KEY_INT_FORWARD | Internet - forward |
BX_KEY_INT_STOP | Internet - stop |
BX_KEY_INT_MAIL | Internet - mail |
BX_KEY_INT_SEARCH | Internet - search |
BX_KEY_INT_FAV | Internet - favorites |
BX_KEY_INT_HOME | Internet - home |
BX_KEY_POWER_MYCOMP | Powerkeys - my computer |
BX_KEY_POWER_CALC | Powerkeys - calculator |
BX_KEY_POWER_SLEEP | Powerkeys - sleep |
BX_KEY_POWER_POWER | Powerkeys - power |
BX_KEY_POWER_WAKE | Powerkeys - wake |