AT keycodes to doom keys

This commit is contained in:
Maxime Vincent 2017-12-12 10:09:06 +01:00
parent 015fec85cf
commit b92e06b108

View File

@ -13,11 +13,10 @@
// GNU General Public License for more details. // GNU General Public License for more details.
// //
// DESCRIPTION: // DESCRIPTION:
// DOOM graphics stuff for SDL. // DOOM keyboard input via linux tty
// //
#include "SDL/SDL.h"
#include <stdlib.h> #include <stdlib.h>
#include <ctype.h> #include <ctype.h>
#include <math.h> #include <math.h>
@ -53,9 +52,142 @@ int vanilla_keyboard_mapping = 1;
// Is the shift key currently down? // Is the shift key currently down?
static int shiftdown = 0; static int shiftdown = 0;
// Lookup table for mapping AT keycodes to their doom keycode
static const char at_to_doom[] =
{
/* 0x00 */ 0x00,
/* 0x01 */ KEY_ESCAPE,
/* 0x02 */ '1',
/* 0x03 */ '2',
/* 0x04 */ '3',
/* 0x05 */ '4',
/* 0x06 */ '5',
/* 0x07 */ '6',
/* 0x08 */ '7',
/* 0x09 */ '8',
/* 0x0a */ '9',
/* 0x0b */ '0',
/* 0x0c */ '-',
/* 0x0d */ '=',
/* 0x0e */ KEY_BACKSPACE,
/* 0x0f */ KEY_TAB,
/* 0x10 */ 'q',
/* 0x11 */ 'w',
/* 0x12 */ 'e',
/* 0x13 */ 'r',
/* 0x14 */ 't',
/* 0x15 */ 'y',
/* 0x16 */ 'u',
/* 0x17 */ 'i',
/* 0x18 */ 'o',
/* 0x19 */ 'p',
/* 0x1a */ '[',
/* 0x1b */ ']',
/* 0x1c */ KEY_ENTER,
/* 0x1d */ KEY_FIRE, /* KEY_RCTRL, */
/* 0x1e */ 'a',
/* 0x1f */ 's',
/* 0x20 */ 'd',
/* 0x21 */ 'f',
/* 0x22 */ 'g',
/* 0x23 */ 'h',
/* 0x24 */ 'j',
/* 0x25 */ 'k',
/* 0x26 */ 'l',
/* 0x27 */ ';',
/* 0x28 */ '\'',
/* 0x29 */ '`',
/* 0x2a */ KEY_RSHIFT,
/* 0x2b */ '\\',
/* 0x2c */ 'z',
/* 0x2d */ 'x',
/* 0x2e */ 'c',
/* 0x2f */ 'v',
/* 0x30 */ 'b',
/* 0x31 */ 'n',
/* 0x32 */ 'm',
/* 0x33 */ ',',
/* 0x34 */ '.',
/* 0x35 */ '/',
/* 0x36 */ KEY_RSHIFT,
/* 0x37 */ KEYP_MULTIPLY,
/* 0x38 */ KEY_LALT,
/* 0x39 */ KEY_USE,
/* 0x3a */ KEY_CAPSLOCK,
/* 0x3b */ KEY_F1,
/* 0x3c */ KEY_F2,
/* 0x3d */ KEY_F3,
/* 0x3e */ KEY_F4,
/* 0x3f */ KEY_F5,
/* 0x40 */ KEY_F6,
/* 0x41 */ KEY_F7,
/* 0x42 */ KEY_F8,
/* 0x43 */ KEY_F9,
/* 0x44 */ KEY_F10,
/* 0x45 */ KEY_NUMLOCK,
/* 0x46 */ 0x0,
/* 0x47 */ 0x0, /* 47 (Keypad-7/Home) */
/* 0x48 */ 0x0, /* 48 (Keypad-8/Up) */
/* 0x49 */ 0x0, /* 49 (Keypad-9/PgUp) */
/* 0x4a */ 0x0, /* 4a (Keypad--) */
/* 0x4b */ 0x0, /* 4b (Keypad-4/Left) */
/* 0x4c */ 0x0, /* 4c (Keypad-5) */
/* 0x4d */ 0x0, /* 4d (Keypad-6/Right) */
/* 0x4e */ 0x0, /* 4e (Keypad-+) */
/* 0x4f */ 0x0, /* 4f (Keypad-1/End) */
/* 0x50 */ 0x0, /* 50 (Keypad-2/Down) */
/* 0x51 */ 0x0, /* 51 (Keypad-3/PgDn) */
/* 0x52 */ 0x0, /* 52 (Keypad-0/Ins) */
/* 0x53 */ 0x0, /* 53 (Keypad-./Del) */
/* 0x54 */ 0x0, /* 54 (Alt-SysRq) on a 84+ key keyboard */
/* 0x55 */ 0x0,
/* 0x56 */ 0x0,
/* 0x57 */ 0x0,
/* 0x58 */ 0x0,
/* 0x59 */ 0x0,
/* 0x5a */ 0x0,
/* 0x5b */ 0x0,
/* 0x5c */ 0x0,
/* 0x5d */ 0x0,
/* 0x5e */ 0x0,
/* 0x5f */ 0x0,
/* 0x60 */ 0x0,
/* 0x61 */ 0x0,
/* 0x62 */ 0x0,
/* 0x63 */ 0x0,
/* 0x64 */ 0x0,
/* 0x65 */ 0x0,
/* 0x66 */ 0x0,
/* 0x67 */ KEY_UPARROW,
/* 0x68 */ 0x0,
/* 0x69 */ KEY_LEFTARROW,
/* 0x6a */ KEY_RIGHTARROW,
/* 0x6b */ 0x0,
/* 0x6c */ KEY_DOWNARROW,
/* 0x6d */ 0x0,
/* 0x6e */ 0x0,
/* 0x6f */ 0x0,
/* 0x70 */ 0x0,
/* 0x71 */ 0x0,
/* 0x72 */ 0x0,
/* 0x73 */ 0x0,
/* 0x74 */ 0x0,
/* 0x75 */ 0x0,
/* 0x76 */ 0x0,
/* 0x77 */ 0x0,
/* 0x78 */ 0x0,
/* 0x79 */ 0x0,
/* 0x7a */ 0x0,
/* 0x7b */ 0x0,
/* 0x7c */ 0x0,
/* 0x7d */ 0x0,
/* 0x7e */ 0x0,
/* 0x7f */ KEY_FIRE, //KEY_RCTRL,
};
// Lookup table for mapping ASCII characters to their equivalent when // Lookup table for mapping ASCII characters to their equivalent when
// shift is pressed on an American layout keyboard: // shift is pressed on an American layout keyboard:
static const char shiftxform[] = static const char shiftxform[] =
{ {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
@ -149,8 +281,6 @@ static int kbd_init(void)
int i; int i;
int flags; int flags;
printf(">>>>>>>>>>>>>> %s\r\n", __func__);
/* First we need to find a file descriptor that represents the /* First we need to find a file descriptor that represents the
system's keyboard. This should be /dev/tty, /dev/console, system's keyboard. This should be /dev/tty, /dev/console,
stdin, stdout, or stderr. We'll try them in that order. stdin, stdout, or stderr. We'll try them in that order.
@ -233,162 +363,20 @@ int kbd_read(int *pressed, unsigned char *key)
/* Print the keycode. The top bit is the pressed/released /* Print the keycode. The top bit is the pressed/released
flag, and the lower seven are the keycode. */ flag, and the lower seven are the keycode. */
printf("%s: 0x%2X (%i)\n", *pressed ? "Released" : " Pressed", (unsigned int)*key, (unsigned int)*key); //printf("%s: 0x%2X (%i)\n", *pressed ? "Released" : " Pressed", (unsigned int)*key, (unsigned int)*key);
//if (*key == 0x0E) {
// printf("Backspace pressed.\n");
// kbd_shutdown();
//}
return 1; return 1;
} }
//
// Translates the SDL key
//
#define TTY_ESC (0x01)
#define TTY_ENTER (0x1C)
#define TTY_W (0x11)
#define TTY_A (0x1E)
#define TTY_S (0x1F)
#define TTY_D (0x20)
#define TTY_LCTRL (0x1D)
#define TTY_RCTRL (0x61)
#define TTY_UP (0x67)
#define TTY_LEFT (0x69)
#define TTY_DOWN (0x6C)
#define TTY_RIGHT (0x6A)
#define TTY_Y (0x15)
#define TTY_N (0x31)
#if 0
enum sdl_keys {
SDLK_a = 97,
SDLK_b = 98,
SDLK_c = 99,
SDLK_d = 100,
SDLK_e = 101,
SDLK_f = 102,
SDLK_g = 103,
SDLK_h = 104,
SDLK_i = 105,
SDLK_j = 106,
SDLK_k = 107,
SDLK_l = 108,
SDLK_m = 109,
SDLK_n = 110,
SDLK_o = 111,
SDLK_p = 112,
SDLK_q = 113,
SDLK_r = 114,
SDLK_s = 115,
SDLK_t = 116,
SDLK_u = 117,
SDLK_v = 118,
SDLK_w = 119,
SDLK_x = 120,
SDLK_y = 121,
SDLK_z = 122,
};
#endif
static unsigned char TranslateKey(unsigned char key) static unsigned char TranslateKey(unsigned char key)
{ {
switch(key) if (key < sizeof(at_to_doom))
{ return at_to_doom[key];
case TTY_ENTER: return KEY_ENTER; else
case TTY_ESC: return KEY_ESCAPE; return 0x0;
case TTY_W: return 'w';
case TTY_A: return 'a';
case TTY_S: return 's';
case TTY_D: return 'd';
case TTY_LEFT: return KEY_LEFTARROW;
case TTY_RIGHT: return KEY_RIGHTARROW;
case TTY_DOWN: return KEY_DOWNARROW;
case TTY_UP: return KEY_UPARROW;
case TTY_Y: printf("Y\r\n"); return SDLK_y;
case TTY_N: printf("N\r\n"); return SDLK_n;
case TTY_LCTRL: //default:
case TTY_RCTRL: // return tolower(key);
return KEY_RCTRL;
// case SDLK_TAB: return KEY_TAB;
// case SDLK_F1: return KEY_F1;
// case SDLK_F2: return KEY_F2;
// case SDLK_F3: return KEY_F3;
// case SDLK_F4: return KEY_F4;
// case SDLK_F5: return KEY_F5;
// case SDLK_F6: return KEY_F6;
// case SDLK_F7: return KEY_F7;
// case SDLK_F8: return KEY_F8;
// case SDLK_F9: return KEY_F9;
// case SDLK_F10: return KEY_F10;
// case SDLK_F11: return KEY_F11;
// case SDLK_F12: return KEY_F12;
// case SDLK_PRINT: return KEY_PRTSCR;
//
// case SDLK_BACKSPACE: return KEY_BACKSPACE;
// case SDLK_DELETE: return KEY_DEL;
//
// case SDLK_PAUSE: return KEY_PAUSE;
//
// case SDLK_MINUS: return KEY_MINUS;
//
// case SDLK_LSHIFT:
// case SDLK_RSHIFT:
// return KEY_RSHIFT;
//
// case SDLK_LCTRL:
// case SDLK_RCTRL:
// return KEY_RCTRL;
//
// case SDLK_LALT:
// case SDLK_RALT:
// return KEY_RALT;
//
// case SDLK_CAPSLOCK: return KEY_CAPSLOCK;
// case SDLK_SCROLLOCK: return KEY_SCRLCK;
// case SDLK_NUMLOCK: return KEY_NUMLOCK;
//
// case SDLK_KP0: return KEYP_0;
// case SDLK_KP1: return KEYP_1;
// case SDLK_KP2: return KEYP_2;
// case SDLK_KP3: return KEYP_3;
// case SDLK_KP4: return KEYP_4;
// case SDLK_KP5: return KEYP_5;
// case SDLK_KP6: return KEYP_6;
// case SDLK_KP7: return KEYP_7;
// case SDLK_KP8: return KEYP_8;
// case SDLK_KP9: return KEYP_9;
//
// case SDLK_KP_PERIOD: return KEYP_PERIOD;
// case SDLK_KP_MULTIPLY: return KEYP_MULTIPLY;
// case SDLK_KP_PLUS: return KEYP_PLUS;
// case SDLK_KP_MINUS: return KEYP_MINUS;
// case SDLK_KP_DIVIDE: return KEYP_DIVIDE;
// case SDLK_KP_EQUALS: return KEYP_EQUALS;
// case SDLK_KP_ENTER: return KEYP_ENTER;
//
// case SDLK_HOME: return KEY_HOME;
// case SDLK_INSERT: return KEY_INS;
// case SDLK_END: return KEY_END;
// case SDLK_PAGEUP: return KEY_PGUP;
// case SDLK_PAGEDOWN: return KEY_PGDN;
//
//#ifdef SDL_HAVE_APP_KEYS
// case SDLK_APP1: return KEY_F1;
// case SDLK_APP2: return KEY_F2;
// case SDLK_APP3: return KEY_F3;
// case SDLK_APP4: return KEY_F4;
// case SDLK_APP5: return KEY_F5;
// case SDLK_APP6: return KEY_F6;
//#endif
//default:
// return tolower(key);
}
} }
// Get the equivalent ASCII (Unicode?) character for a keypress. // Get the equivalent ASCII (Unicode?) character for a keypress.
@ -399,17 +387,17 @@ static unsigned char GetTypedChar(unsigned char key)
// Is shift held down? If so, perform a translation. // Is shift held down? If so, perform a translation.
//if (shiftdown > 0) if (shiftdown > 0)
//{ {
// if (key >= 0 && key < arrlen(shiftxform)) if (key >= 0 && key < arrlen(shiftxform))
// { {
// key = shiftxform[key]; key = shiftxform[key];
// } }
// else else
// { {
// key = 0; key = 0;
// } }
//} }
return key; return key;
} }
@ -424,7 +412,7 @@ static void UpdateShiftStatus(int pressed, unsigned char key)
change = -1; change = -1;
} }
if (key == SDLK_LSHIFT || key == SDLK_RSHIFT) { if (key == 0x2a || key == 0x36) {
shiftdown += change; shiftdown += change;
} }
} }
@ -445,7 +433,7 @@ void I_GetEvent(void)
I_Quit(); I_Quit();
} }
//UpdateShiftStatus(pressed, key); UpdateShiftStatus(pressed, key);
// process event // process event
@ -459,7 +447,6 @@ void I_GetEvent(void)
if (event.data1 != 0) if (event.data1 != 0)
{ {
printf("Post keydown event.data1 = 0x%x\r\n", event.data1);
D_PostEvent(&event); D_PostEvent(&event);
} }
} }
@ -478,7 +465,6 @@ void I_GetEvent(void)
if (event.data1 != 0) if (event.data1 != 0)
{ {
printf("Post keyup event.data1 = 0x%x\r\n", event.data1);
D_PostEvent(&event); D_PostEvent(&event);
} }
break; break;
@ -497,42 +483,10 @@ void I_GetEvent(void)
*/ */
} }
//void I_ShutdownGraphics(void)
//{
// //SDL_QuitSubSystem(SDL_INIT_VIDEO);
//}
//
// I_StartTic
//
//void I_StartTic (void)
void I_InitInput(void) void I_InitInput(void)
{ {
SDL_Event dummy;
kbd_init(); kbd_init();
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
I_Error("Failed to initialize video: %s", SDL_GetError());
}
//UpdateFocus(); //UpdateFocus();
// We need SDL to give us translated versions of keys as well
SDL_EnableUNICODE(1);
// Repeat key presses - this is what Vanilla Doom does
// Not sure about repeat rate - probably dependent on which DOS
// driver is used. This is good enough though.
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
// clear out any events waiting at the start and center the mouse
while (SDL_PollEvent(&dummy));
} }