|
|
1.1 root 1: /*
2: Hatari - keymap.c
3:
4: This file is distributed under the GNU Public License, version 2 or at
5: your option any later version. Read the file gpl.txt for details.
6:
7: Here we process a key press and the remapping of the scancodes.
8: */
9: const char Keymap_fileid[] = "Hatari keymap.c : " __DATE__ " " __TIME__;
10:
11: #include <ctype.h>
12: #include "main.h"
13: #include "keymap.h"
14: #include "configuration.h"
15: #include "file.h"
16: #include "shortcut.h"
17: #include "str.h"
18: #include "screen.h"
19: #include "debugui.h"
20: #include "log.h"
1.1.1.2 ! root 21: #include "ioMem.h"
! 22: #include "m68000.h"
! 23:
! 24: #include "SDL.h"
! 25:
! 26:
! 27: /*
! 28:
! 29: Byte at address 0x0200e00a contains modifier key values:
! 30:
! 31: x--- ---- valid
! 32: -x-- ---- alt_right
! 33: --x- ---- alt_left
! 34: ---x ---- command_right
! 35: ---- x--- command_left
! 36: ---- -x-- shift_right
! 37: ---- --x- shift_left
! 38: ---- ---x control
! 39:
! 40:
! 41: Byte at address 0x0200e00b contains key values:
! 42:
! 43: x--- ---- key up (1) or down (0)
! 44: -xxx xxxx key_code
! 45:
! 46: */
! 47:
! 48:
! 49: void Keymap_Init(void) {
! 50: if(ConfigureParams.Keyboard.bDisableKeyRepeat)
! 51: SDL_EnableKeyRepeat(0, 0);
! 52: else
! 53: SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
! 54: }
! 55:
! 56: Uint8 nextkeycode;
! 57: Uint8 modkeys;
! 58: Uint8 ralt;
! 59: Uint8 lalt;
! 60: Uint8 rcom;
! 61: Uint8 lcom;
! 62: Uint8 rshift;
! 63: Uint8 lshift;
! 64: Uint8 ctrl;
! 65:
! 66:
! 67: void Keyboard_Read0(void) {
! 68: // Log_Printf(LOG_WARN, "Keyboard read at $%08x PC=$%08x\n", IoAccessCurrentAddress, m68k_getpc());
! 69: IoMem[IoAccessCurrentAddress & 0x1FFFF]=0xA0;
! 70: }
! 71:
! 72: void Keyboard_Read1(void) {
! 73: // Log_Printf(LOG_WARN, "Keyboard read at $%08x PC=$%08x\n", IoAccessCurrentAddress, m68k_getpc());
! 74: IoMem[IoAccessCurrentAddress & 0x1FFFF]=0xF0;
! 75: }
! 76:
! 77: void Keyboard_Read2(void) {
! 78: // Log_Printf(LOG_WARN, "Keyboard read at $%08x PC=$%08x\n", IoAccessCurrentAddress, m68k_getpc());
! 79: IoMem[IoAccessCurrentAddress & 0x1FFFF]=0x13;
! 80: }
! 81:
! 82: void Keycode_Read(void) {
! 83: // Log_Printf(LOG_WARN, "Keycode read at $%08x PC=$%08x\n", IoAccessCurrentAddress, m68k_getpc());
! 84: IoMem[0xe002]=0x93;
! 85: IoMem[0xe008]=0x10;
! 86:
! 87: IoMem[0xe00a]=modkeys; // Set modifier Keys
! 88: IoMem[0xe00b]=nextkeycode; // Press virtual Key
! 89: nextkeycode=nextkeycode | 0x80; // Automatically release virtual Key
! 90: }
! 91:
! 92:
! 93: void KeyTranslator(SDL_keysym *sdlkey) { // Translate SDL Keys to NeXT Keycodes
! 94: Log_Printf(LOG_WARN, "Key pressed: %s\n", SDL_GetKeyName(sdlkey->sym));
! 95:
! 96: int symkey = sdlkey->sym;
! 97: int modkey = sdlkey->mod;
! 98: if (ShortCut_CheckKeys(modkey, symkey, 1)) // Check if we pressed a shortcut
! 99: ShortCut_ActKey();
! 100: else
! 101:
! 102: switch (sdlkey->sym) {
! 103:
! 104: case SDLK_RIGHTBRACKET: nextkeycode = 0x04;
! 105: break;
! 106: case SDLK_LEFTBRACKET: nextkeycode = 0x05;
! 107: break;
! 108: case SDLK_i: nextkeycode = 0x06;
! 109: break;
! 110: case SDLK_o: nextkeycode = 0x07;
! 111: break;
! 112: case SDLK_p: nextkeycode = 0x08;
! 113: break;
! 114: case SDLK_LEFT: nextkeycode = 0x09;
! 115: break;
! 116: case SDLK_KP0: nextkeycode = 0x0B;
! 117: break;
! 118: case SDLK_KP_PERIOD: nextkeycode = 0x0C;
! 119: break;
! 120: case SDLK_KP_ENTER: nextkeycode = 0x0D;
! 121: break;
! 122: case SDLK_DOWN: nextkeycode = 0x0F;
! 123: break;
! 124: case SDLK_RIGHT: nextkeycode = 0x10;
! 125: break;
! 126: case SDLK_KP1: nextkeycode = 0x11;
! 127: break;
! 128: case SDLK_KP4: nextkeycode = 0x12;
! 129: break;
! 130: case SDLK_KP6: nextkeycode = 0x13;
! 131: break;
! 132: case SDLK_KP3: nextkeycode = 0x14;
! 133: break;
! 134: case SDLK_KP_PLUS: nextkeycode = 0x15;
! 135: break;
! 136: case SDLK_UP: nextkeycode = 0x16;
! 137: break;
! 138: case SDLK_KP2: nextkeycode = 0x17;
! 139: break;
! 140: case SDLK_KP5: nextkeycode = 0x18;
! 141: break;
! 142: case SDLK_BACKSPACE: nextkeycode = 0x1B;
! 143: break;
! 144: case SDLK_EQUALS: nextkeycode = 0x1C;
! 145: break;
! 146: case SDLK_MINUS: nextkeycode = 0x1D;
! 147: break;
! 148: case SDLK_8: nextkeycode = 0x1E;
! 149: break;
! 150: case SDLK_9: nextkeycode = 0x1F;
! 151: break;
! 152: case SDLK_0: nextkeycode = 0x20;
! 153: break;
! 154: case SDLK_KP7: nextkeycode = 0x21;
! 155: break;
! 156: case SDLK_KP8: nextkeycode = 0x22;
! 157: break;
! 158: case SDLK_KP9: nextkeycode = 0x23;
! 159: break;
! 160: case SDLK_KP_MINUS: nextkeycode = 0x24;
! 161: break;
! 162: case SDLK_KP_MULTIPLY: nextkeycode = 0x25;
! 163: break;
! 164: case SDLK_BACKQUOTE: nextkeycode = 0x26;
! 165: break;
! 166: case SDLK_KP_EQUALS: nextkeycode = 0x27;
! 167: break;
! 168: case SDLK_KP_DIVIDE: nextkeycode = 0x28;
! 169: break;
! 170: case SDLK_RETURN: nextkeycode = 0x2A;
! 171: break;
! 172: case SDLK_BACKSLASH: nextkeycode = 0x2B;
! 173: break;
! 174: case SDLK_SEMICOLON: nextkeycode = 0x2C;
! 175: break;
! 176: case SDLK_l: nextkeycode = 0x2D;
! 177: break;
! 178: case SDLK_COMMA: nextkeycode = 0x2E;
! 179: break;
! 180: case SDLK_PERIOD: nextkeycode = 0x2F;
! 181: break;
! 182: case SDLK_SLASH: nextkeycode = 0x30;
! 183: break;
! 184: case SDLK_z: nextkeycode = 0x31;
! 185: break;
! 186: case SDLK_x: nextkeycode = 0x32;
! 187: break;
! 188: case SDLK_c: nextkeycode = 0x33;
! 189: break;
! 190: case SDLK_v: nextkeycode = 0x34;
! 191: break;
! 192: case SDLK_b: nextkeycode = 0x35;
! 193: break;
! 194: case SDLK_m: nextkeycode = 0x36;
! 195: break;
! 196: case SDLK_n: nextkeycode = 0x37;
! 197: break;
! 198: case SDLK_SPACE: nextkeycode = 0x38;
! 199: break;
! 200: case SDLK_a: nextkeycode = 0x39;
! 201: break;
! 202: case SDLK_s: nextkeycode = 0x3A;
! 203: break;
! 204: case SDLK_d: nextkeycode = 0x3B;
! 205: break;
! 206: case SDLK_f: nextkeycode = 0x3C;
! 207: break;
! 208: case SDLK_g: nextkeycode = 0x3D;
! 209: break;
! 210: case SDLK_k: nextkeycode = 0x3E;
! 211: break;
! 212: case SDLK_j: nextkeycode = 0x3F;
! 213: break;
! 214: case SDLK_h: nextkeycode = 0x40;
! 215: break;
! 216: case SDLK_TAB: nextkeycode = 0x41;
! 217: break;
! 218: case SDLK_q: nextkeycode = 0x42;
! 219: break;
! 220: case SDLK_w: nextkeycode = 0x43;
! 221: break;
! 222: case SDLK_e: nextkeycode = 0x44;
! 223: break;
! 224: case SDLK_r: nextkeycode = 0x45;
! 225: break;
! 226: case SDLK_u: nextkeycode = 0x46;
! 227: break;
! 228: case SDLK_y: nextkeycode = 0x47;
! 229: break;
! 230: case SDLK_t: nextkeycode = 0x48;
! 231: break;
! 232: case SDLK_ESCAPE: nextkeycode = 0x49;
! 233: break;
! 234: case SDLK_1: nextkeycode = 0x4A;
! 235: break;
! 236: case SDLK_2: nextkeycode = 0x4B;
! 237: break;
! 238: case SDLK_3: nextkeycode = 0x4C;
! 239: break;
! 240: case SDLK_4: nextkeycode = 0x4D;
! 241: break;
! 242: case SDLK_7: nextkeycode = 0x4E;
! 243: break;
! 244: case SDLK_6: nextkeycode = 0x4F;
! 245: break;
! 246: case SDLK_5: nextkeycode = 0x50;
! 247: break;
! 248:
! 249: /* Modifier Keys */
! 250: case SDLK_RMETA: ctrl = 0x01;
! 251: break;
! 252: case SDLK_LMETA: ctrl = 0x01;
! 253: break;
! 254: case SDLK_LSHIFT: lshift = 0x02;
! 255: break;
! 256: case SDLK_RSHIFT: rshift = 0x04;
! 257: break;
! 258: case SDLK_LCTRL: lcom = 0x08;
! 259: break;
! 260: case SDLK_RCTRL: rcom = 0x10;
! 261: break;
! 262: case SDLK_LALT: lalt = 0x20;
! 263: break;
! 264: case SDLK_RALT: ralt = 0x40;
! 265: break;
! 266: case SDLK_CAPSLOCK: lshift = 0x02, rshift = 0x04;
! 267: break;
! 268:
! 269: /* Special keys not yet emulated:
! 270: SOUND_UP_KEY 0x1A
! 271: SOUND_DOWN_KEY 0x02
! 272: BRIGHTNESS_UP_KEY 0x19
! 273: BRIGHTNESS_DOWN_KEY 0x01
! 274: POWER_KEY 0x58
! 275: */
! 276:
! 277: default: break;
! 278: }
! 279: modkeys = 0x80 | ralt | lalt | rcom | lcom | rshift | lshift | ctrl;
! 280: Log_Printf(LOG_WARN, "Modkeys: $%02x\n", modkeys);
! 281: }
! 282:
! 283:
! 284: void KeyRelease(SDL_keysym *sdlkey) { //release modifier Keys
! 285: int symkey = sdlkey->sym;
! 286: int modkey = sdlkey->mod;
! 287: if (ShortCut_CheckKeys(modkey, symkey, 0))
! 288: return;
! 289:
! 290: switch (sdlkey->sym) {
! 291:
! 292: case SDLK_RMETA: ctrl = 0x00;
! 293: break;
! 294: case SDLK_LMETA: ctrl = 0x00;
! 295: break;
! 296: case SDLK_LSHIFT: lshift = 0x00;
! 297: break;
! 298: case SDLK_RSHIFT: rshift = 0x00;
! 299: break;
! 300: case SDLK_LCTRL: lcom = 0x00;
! 301: break;
! 302: case SDLK_RCTRL: rcom = 0x00;
! 303: break;
! 304: case SDLK_LALT: lalt = 0x00;
! 305: break;
! 306: case SDLK_RALT: ralt = 0x00;
! 307: break;
! 308: case SDLK_CAPSLOCK: lshift = 0x00, rshift = 0x00;
! 309: break;
! 310: default: break;
! 311: }
! 312: modkeys = 0x80 | ralt | lalt | rcom | lcom | rshift | lshift | ctrl;
! 313: Log_Printf(LOG_WARN, "Modkeys: $%02x\n", modkeys);
! 314: }
1.1 root 315:
316:
317:
318: /*-----------------------------------------------------------------------*/
319: /**
320: * User press key down
321: */
322: void Keymap_KeyDown(SDL_keysym *sdlkey)
323: {
324: bool bPreviousKeyState;
325: char STScanCode;
326: int symkey = sdlkey->sym;
327: int modkey = sdlkey->mod;
328:
329: /*fprintf(stderr, "keydown: sym=%i scan=%i mod=$%x\n",symkey, sdlkey->scancode, modkey);*/
330:
331: if (ShortCut_CheckKeys(modkey, symkey, 1))
332: return;
333:
334: }
335:
336:
337: /*-----------------------------------------------------------------------*/
338: /**
339: * User released key
340: */
341: void Keymap_KeyUp(SDL_keysym *sdlkey)
342: {
343: char STScanCode;
344: int symkey = sdlkey->sym;
345: int modkey = sdlkey->mod;
346:
347: /*fprintf(stderr, "keyup: sym=%i scan=%i mod=$%x\n",symkey, sdlkey->scancode, modkey);*/
348:
349: /* Ignore short-cut keys here */
350:
351: if (ShortCut_CheckKeys(modkey, symkey, 0))
352: return;
353:
354:
355: }
356:
357: /*-----------------------------------------------------------------------*/
358: /**
359: * Simulate press or release of a key corresponding to given character
360: */
361: void Keymap_SimulateCharacter(char asckey, bool press)
362: {
363: SDL_keysym sdlkey;
364:
365: sdlkey.mod = KMOD_NONE;
366: sdlkey.scancode = 0;
367: if (isupper(asckey)) {
368: if (press) {
369: sdlkey.sym = SDLK_LSHIFT;
370: Keymap_KeyDown(&sdlkey);
371: }
372: sdlkey.sym = tolower(asckey);
373: sdlkey.mod = KMOD_LSHIFT;
374: } else {
375: sdlkey.sym = asckey;
376: }
377: if (press) {
378: Keymap_KeyDown(&sdlkey);
379: } else {
380: Keymap_KeyUp(&sdlkey);
381: if (isupper(asckey)) {
382: sdlkey.sym = SDLK_LSHIFT;
383: Keymap_KeyUp(&sdlkey);
384: }
385: }
386: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.