diff --git a/MiSTer.vcxproj b/MiSTer.vcxproj index 64edaeb..46bb6d8 100644 --- a/MiSTer.vcxproj +++ b/MiSTer.vcxproj @@ -79,7 +79,6 @@ - diff --git a/MiSTer.vcxproj.filters b/MiSTer.vcxproj.filters index 17969eb..a5a7241 100644 --- a/MiSTer.vcxproj.filters +++ b/MiSTer.vcxproj.filters @@ -124,9 +124,6 @@ Header Files - - Header Files - Header Files diff --git a/input.c b/input.c index e02202f..088e099 100644 --- a/input.c +++ b/input.c @@ -1,6 +1,5 @@ #include #include -#include #include #include #include @@ -18,129 +17,97 @@ #define NUMDEV 10 -typedef struct -{ - uint16_t vid, pid; - char led; - char last_l, last_r, last_u, last_d; - - char has_map; - uint32_t map[32]; - - char has_mmap; - uint32_t mmap[32]; - - char has_kbdmap; - uint8_t kbdmap[256]; -} devInput; - -static devInput input[NUMDEV] = {0}; -static int first_joystick = -1; - -#define FN 0x10000 - -#define LCTRL 0x0100 -#define LSHIFT 0x0200 -#define LALT 0x0400 -#define LGUI 0x0800 -#define RCTRL 0x1000 -#define RSHIFT 0x2000 -#define RALT 0x4000 -#define RGUI 0x8000 -#define MODMASK 0xFF00 -#define NONE 0 - -static int ev2usb[] = +static int ev2amiga[] = { NONE, //0 KEY_RESERVED - 0x29, //1 KEY_ESC - 0x1e, //2 KEY_1 - 0x1f, //3 KEY_2 - 0x20, //4 KEY_3 - 0x21, //5 KEY_4 - 0x22, //6 KEY_5 - 0x23, //7 KEY_6 - 0x24, //8 KEY_7 - 0x25, //9 KEY_8 - 0x26, //10 KEY_9 - 0x27, //11 KEY_0 - 0x2D, //12 KEY_MINUS - 0x2E, //13 KEY_EQUAL - 0x2A, //14 KEY_BACKSPACE - 0x2B, //15 KEY_TAB - 0x14, //16 KEY_Q - 0x1a, //17 KEY_W - 0x08, //18 KEY_E - 0x15, //19 KEY_R - 0x17, //20 KEY_T - 0x1c, //21 KEY_Y - 0x18, //22 KEY_U - 0x0c, //23 KEY_I - 0x12, //24 KEY_O - 0x13, //25 KEY_P - 0x2F, //26 KEY_LEFTBRACE - 0x30, //27 KEY_RIGHTBRACE - 0x28, //28 KEY_ENTER - LCTRL, //29 KEY_LEFTCTRL - 0x04, //30 KEY_A - 0x16, //31 KEY_S - 0x07, //32 KEY_D - 0x09, //33 KEY_F - 0x0a, //34 KEY_G - 0x0b, //35 KEY_H - 0x0d, //36 KEY_J - 0x0e, //37 KEY_K - 0x0f, //38 KEY_L - 0x33, //39 KEY_SEMICOLON - 0x34, //40 KEY_APOSTROPHE - 0x35, //41 KEY_GRAVE - LSHIFT, //42 KEY_LEFTSHIFT - 0x31, //43 KEY_BACKSLASH - 0x1d, //44 KEY_Z - 0x1b, //45 KEY_X - 0x06, //46 KEY_C - 0x19, //47 KEY_V - 0x05, //48 KEY_B - 0x11, //49 KEY_N - 0x10, //50 KEY_M - 0x36, //51 KEY_COMMA - 0x37, //52 KEY_DOT - 0x38, //53 KEY_SLASH - RSHIFT, //54 KEY_RIGHTSHIFT - 0x55, //55 KEY_KPASTERISK - LALT, //56 KEY_LEFTALT - 0x2C, //57 KEY_SPACE - 0x39, //58 KEY_CAPSLOCK - 0x3a, //59 KEY_F1 - 0x3b, //60 KEY_F2 - 0x3c, //61 KEY_F3 - 0x3d, //62 KEY_F4 - 0x3e, //63 KEY_F5 - 0x3f, //64 KEY_F6 - 0x40, //65 KEY_F7 - 0x41, //66 KEY_F8 - 0x42, //67 KEY_F9 - 0x43, //68 KEY_F10 - 0x53, //69 KEY_NUMLOCK - 0x47, //70 KEY_SCROLLLOCK - 0x5F, //71 KEY_KP7 - 0x60, //72 KEY_KP8 - 0x61, //73 KEY_KP9 - 0x56, //74 KEY_KPMINUS - 0x5C, //75 KEY_KP4 - 0x5D, //76 KEY_KP5 - 0x5E, //77 KEY_KP6 - 0x57, //78 KEY_KPPLUS - 0x59, //79 KEY_KP1 - 0x5A, //80 KEY_KP2 - 0x5B, //81 KEY_KP3 - 0x62, //82 KEY_KP0 - 0x63, //83 KEY_KPDOT + 0x45, //1 KEY_ESC + 0x01, //2 KEY_1 + 0x02, //3 KEY_2 + 0x03, //4 KEY_3 + 0x04, //5 KEY_4 + 0x05, //6 KEY_5 + 0x06, //7 KEY_6 + 0x07, //8 KEY_7 + 0x08, //9 KEY_8 + 0x09, //10 KEY_9 + 0x0a, //11 KEY_0 + 0x0b, //12 KEY_MINUS + 0x0c, //13 KEY_EQUAL + 0x41, //14 KEY_BACKSPACE + 0x42, //15 KEY_TAB + 0x10, //16 KEY_Q + 0x11, //17 KEY_W + 0x12, //18 KEY_E + 0x13, //19 KEY_R + 0x14, //20 KEY_T + 0x15, //21 KEY_Y + 0x16, //22 KEY_U + 0x17, //23 KEY_I + 0x18, //24 KEY_O + 0x19, //25 KEY_P + 0x1a, //26 KEY_LEFTBRACE + 0x1b, //27 KEY_RIGHTBRACE + 0x44, //28 KEY_ENTER + 0x63, //29 KEY_LEFTCTRL + 0x20, //30 KEY_A + 0x21, //31 KEY_S + 0x22, //32 KEY_D + 0x23, //33 KEY_F + 0x24, //34 KEY_G + 0x25, //35 KEY_H + 0x26, //36 KEY_J + 0x27, //37 KEY_K + 0x28, //38 KEY_L + 0x29, //39 KEY_SEMICOLON + 0x2a, //40 KEY_APOSTROPHE + 0x00, //41 KEY_GRAVE + 0x60, //42 KEY_LEFTSHIFT + 0x0d, //43 KEY_BACKSLASH + 0x31, //44 KEY_Z + 0x32, //45 KEY_X + 0x33, //46 KEY_C + 0x34, //47 KEY_V + 0x35, //48 KEY_B + 0x36, //49 KEY_N + 0x37, //50 KEY_M + 0x38, //51 KEY_COMMA + 0x39, //52 KEY_DOT + 0x3a, //53 KEY_SLASH + 0x61, //54 KEY_RIGHTSHIFT + 0x5d, //55 KEY_KPASTERISK + 0x64, //56 KEY_LEFTALT + 0x40, //57 KEY_SPACE + 0x62 | CAPS_TOGGLE, //58 KEY_CAPSLOCK + 0x50, //59 KEY_F1 + 0x51, //60 KEY_F2 + 0x52, //61 KEY_F3 + 0x53, //62 KEY_F4 + 0x54, //63 KEY_F5 + 0x55, //64 KEY_F6 + 0x56, //65 KEY_F7 + 0x57, //66 KEY_F8 + 0x58, //67 KEY_F9 + 0x59, //68 KEY_F10 + NONE, //69 KEY_NUMLOCK + NONE, //70 KEY_SCROLLLOCK + 0x3d, //71 KEY_KP7 + 0x3e, //72 KEY_KP8 + 0x3f, //73 KEY_KP9 + 0x4a, //74 KEY_KPMINUS + 0x2d, //75 KEY_KP4 + 0x2e, //76 KEY_KP5 + 0x2f, //77 KEY_KP6 + 0x5e, //78 KEY_KPPLUS + 0x1d, //79 KEY_KP1 + 0x1e, //80 KEY_KP2 + 0x1f, //81 KEY_KP3 + 0x0f, //82 KEY_KP0 + 0x3c, //83 KEY_KPDOT NONE, //84 ??? NONE, //85 KEY_ZENKAKU - FN, //86 KEY_102ND - 0x44, //87 KEY_F11 - 0x45, //88 KEY_F12 + NONE, //86 KEY_102ND + 0x5f, //87 KEY_F11 + NONE, //88 KEY_F12 NONE, //89 KEY_RO NONE, //90 KEY_KATAKANA NONE, //91 KEY_HIRAGANA @@ -148,38 +115,38 @@ static int ev2usb[] = NONE, //93 KEY_KATAKANA NONE, //94 KEY_MUHENKAN NONE, //95 KEY_KPJPCOMMA - 0x28, //96 KEY_KPENTER - RCTRL, //97 KEY_RIGHTCTRL - 0x54, //98 KEY_KPSLASH + 0x43, //96 KEY_KPENTER + 0x63, //97 KEY_RIGHTCTRL + 0x5c, //98 KEY_KPSLASH NONE, //99 KEY_SYSRQ - RALT, //100 KEY_RIGHTALT + 0x65, //100 KEY_RIGHTALT NONE, //101 KEY_LINEFEED - 0x4A, //102 KEY_HOME - 0x52, //103 KEY_UP - 0x4B, //104 KEY_PAGEUP - 0x50, //105 KEY_LEFT - 0x4F, //106 KEY_RIGHT - 0x4D, //107 KEY_END - 0x51, //108 KEY_DOWN - 0x4E, //109 KEY_PAGEDOWN - 0x49, //110 KEY_INSERT - 0x4C, //111 KEY_DELETE + 0x6a, //102 KEY_HOME + 0x4c, //103 KEY_UP + NONE, //104 KEY_PAGEUP + 0x4f, //105 KEY_LEFT + 0x4e, //106 KEY_RIGHT + NONE, //107 KEY_END + 0x4d, //108 KEY_DOWN + NONE, //109 KEY_PAGEDOWN + 0x0d, //110 KEY_INSERT + 0x46, //111 KEY_DELETE NONE, //112 KEY_MACRO NONE, //113 KEY_MUTE NONE, //114 KEY_VOLUMEDOWN NONE, //115 KEY_VOLUMEUP NONE, //116 KEY_POWER - 0x67, //117 KEY_KPEQUAL + NONE, //117 KEY_KPEQUAL NONE, //118 KEY_KPPLUSMINUS - 0x48, //119 KEY_PAUSE + NONE, //119 KEY_PAUSE NONE, //120 KEY_SCALE NONE, //121 KEY_KPCOMMA NONE, //122 KEY_HANGEUL NONE, //123 KEY_HANJA NONE, //124 KEY_YEN - LGUI, //125 KEY_LEFTMETA - RGUI, //126 KEY_RIGHTMETA - 0x65, //127 KEY_COMPOSE + 0x66, //125 KEY_LEFTMETA + 0x67, //126 KEY_RIGHTMETA + NONE, //127 KEY_COMPOSE NONE, //128 KEY_STOP NONE, //129 KEY_AGAIN NONE, //130 KEY_PROPS @@ -235,10 +202,10 @@ static int ev2usb[] = NONE, //180 KEY_KPRIGHTPAREN NONE, //181 KEY_NEW NONE, //182 KEY_REDO - NONE, //183 KEY_F13 - NONE, //184 KEY_F14 + 0x5a, //183 KEY_F13 + 0x5b, //184 KEY_F14 NONE, //185 KEY_F15 - NONE, //186 KEY_F16 + 0x5f, //186 KEY_F16 NONE, //187 KEY_F17 NONE, //188 KEY_F18 NONE, //189 KEY_F19 @@ -246,7 +213,7 @@ static int ev2usb[] = NONE, //191 KEY_F21 NONE, //192 KEY_F22 NONE, //193 KEY_F23 - RCTRL, //194 KEY_F24 + 0x63, //194 KEY_F24 NONE, //195 ??? NONE, //196 ??? NONE, //197 ??? @@ -262,7 +229,7 @@ static int ev2usb[] = NONE, //207 KEY_PLAY NONE, //208 KEY_FASTFORWARD NONE, //209 KEY_BASSBOOST - 0x46, //210 KEY_PRINT + NONE, //210 KEY_PRINT NONE, //211 KEY_HP NONE, //212 KEY_CAMERA NONE, //213 KEY_SOUND @@ -310,13 +277,8 @@ static int ev2usb[] = NONE //255 ??? }; -#define OSD 0x0100 // to be used by OSD, not the core itself -#define OSD_OPEN 0x0200 // OSD key not forwarded to core, but queued in arm controller -#define CAPS_LOCK_TOGGLE 0x0400 // caps lock toggle behaviour -#define NUM_LOCK_TOGGLE 0x0800 -#define EXT 0x1000 -static int ev2ps2[] = +static const int ev2ps2[] = { NONE, //0 KEY_RESERVED 0x76, //1 KEY_ESC @@ -347,7 +309,7 @@ static int ev2ps2[] = 0x54, //26 KEY_LEFTBRACE 0x5b, //27 KEY_RIGHTBRACE 0x5a, //28 KEY_ENTER - 0x14, //29 KEY_LEFTCTRL + LCTRL | 0x14, //29 KEY_LEFTCTRL 0x1c, //30 KEY_A 0x1b, //31 KEY_S 0x23, //32 KEY_D @@ -360,7 +322,7 @@ static int ev2ps2[] = 0x4c, //39 KEY_SEMICOLON 0x52, //40 KEY_APOSTROPHE 0x0e, //41 KEY_GRAVE - 0x12, //42 KEY_LEFTSHIFT + LSHIFT | 0x12, //42 KEY_LEFTSHIFT 0x5d, //43 KEY_BACKSLASH 0x1a, //44 KEY_Z 0x22, //45 KEY_X @@ -372,9 +334,9 @@ static int ev2ps2[] = 0x41, //51 KEY_COMMA 0x49, //52 KEY_DOT 0x4a, //53 KEY_SLASH - 0x59, //54 KEY_RIGHTSHIFT + RSHIFT | 0x59, //54 KEY_RIGHTSHIFT 0x7c, //55 KEY_KPASTERISK - 0x11, //56 KEY_LEFTALT + LALT | 0x11, //56 KEY_LEFTALT 0x29, //57 KEY_SPACE 0x58, //58 KEY_CAPSLOCK 0x05, //59 KEY_F1 @@ -387,8 +349,8 @@ static int ev2ps2[] = 0x0a, //66 KEY_F8 0x01, //67 KEY_F9 0x09, //68 KEY_F10 - 0x77, //69 KEY_NUMLOCK - 0x7E, //70 KEY_SCROLLLOCK + EMU_SWITCH_2 | 0x77, //69 KEY_NUMLOCK + EMU_SWITCH_1 | 0x7E, //70 KEY_SCROLLLOCK 0x6c, //71 KEY_KP7 0x75, //72 KEY_KP8 0x7d, //73 KEY_KP9 @@ -406,7 +368,7 @@ static int ev2ps2[] = NONE, //85 KEY_ZENKAKU NONE, //86 KEY_102ND 0x78, //87 KEY_F11 - NONE, //88 KEY_F12 + OSD_OPEN, //88 KEY_F12 NONE, //89 KEY_RO NONE, //90 KEY_KATAKANA NONE, //91 KEY_HIRAGANA @@ -415,10 +377,10 @@ static int ev2ps2[] = NONE, //94 KEY_MUHENKAN NONE, //95 KEY_KPJPCOMMA EXT | 0x5a, //96 KEY_KPENTER - EXT | 0x14, //97 KEY_RIGHTCTRL + RCTRL | EXT | 0x14, //97 KEY_RIGHTCTRL EXT | 0x4a, //98 KEY_KPSLASH NONE, //99 KEY_SYSRQ - EXT | 0x11, //100 KEY_RIGHTALT + RALT | EXT | 0x11, //100 KEY_RIGHTALT NONE, //101 KEY_LINEFEED EXT | 0x6c, //102 KEY_HOME EXT | 0x75, //103 KEY_UP @@ -443,8 +405,8 @@ static int ev2ps2[] = NONE, //122 KEY_HANGEUL NONE, //123 KEY_HANJA NONE, //124 KEY_YEN - EXT | 0x1f, //125 KEY_LEFTMETA - EXT | 0x27, //126 KEY_RIGHTMETA + LGUI | EXT | 0x1f, //125 KEY_LEFTMETA + RGUI | EXT | 0x27, //126 KEY_RIGHTMETA NONE, //127 KEY_COMPOSE NONE, //128 KEY_STOP NONE, //129 KEY_AGAIN @@ -505,14 +467,14 @@ static int ev2ps2[] = NONE, //184 KEY_F14 NONE, //185 KEY_F15 NONE, //186 KEY_F16 - NONE, //187 KEY_F17 - NONE, //188 KEY_F18 - NONE, //189 KEY_F19 - NONE, //190 KEY_F20 + EMU_SWITCH_1 | 1, //187 KEY_F17 + EMU_SWITCH_1 | 2, //188 KEY_F18 + EMU_SWITCH_1 | 3, //189 KEY_F19 + EMU_SWITCH_1 | 4, //190 KEY_F20 NONE, //191 KEY_F21 NONE, //192 KEY_F22 NONE, //193 KEY_F23 - NONE, //194 KEY_F24 + RCTRL | EXT | 0x14, //194 KEY_F24 NONE, //195 ??? NONE, //196 ??? NONE, //197 ??? @@ -576,6 +538,344 @@ static int ev2ps2[] = NONE //255 ??? }; +/* + +// unmapped atari keys: +// 0x63 KP ( +// 0x64 KP ) + +// keycode translation table for atari +const unsigned short usb2atari[] = { +MISS, // 00: NoEvent +MISS, // 01: Overrun Error +MISS, // 02: POST fail +MISS, // 03: ErrorUndefined +0x1e, // 04: a +0x30, // 05: b +0x2e, // 06: c +0x20, // 07: d +0x12, // 08: e +0x21, // 09: f +0x22, // 0a: g +0x23, // 0b: h +0x17, // 0c: i +0x24, // 0d: j +0x25, // 0e: k +0x26, // 0f: l +0x32, // 10: m +0x31, // 11: n +0x18, // 12: o +0x19, // 13: p +0x10, // 14: q +0x13, // 15: r +0x1f, // 16: s +0x14, // 17: t +0x16, // 18: u +0x2f, // 19: v +0x11, // 1a: w +0x2d, // 1b: x +0x15, // 1c: y +0x2c, // 1d: z +0x02, // 1e: 1 +0x03, // 1f: 2 +0x04, // 20: 3 +0x05, // 21: 4 +0x06, // 22: 5 +0x07, // 23: 6 +0x08, // 24: 7 +0x09, // 25: 8 +0x0a, // 26: 9 +0x0b, // 27: 0 +0x1c, // 28: Return +0x01, // 29: Escape +0x0e, // 2a: Backspace +0x0f, // 2b: Tab +0x39, // 2c: Space +0x0c, // 2d: - +0x0d, // 2e: = +0x1a, // 2f: [ +0x1b, // 30: ] +0x29, // 31: backslash, only on us keyboard +0x29, // 32: Europe 1, only on int. keyboard +0x27, // 33: ; +0x28, // 34: ' +0x2b, // 35: ` +0x33, // 36: , +0x34, // 37: . +0x35, // 38: / +0x3a | CAPS_LOCK_TOGGLE, // 39: Caps Lock +0x3b, // 3a: F1 +0x3c, // 3b: F2 +0x3d, // 3c: F3 +0x3e, // 3d: F4 +0x3f, // 3e: F5 +0x40, // 3f: F6 +0x41, // 40: F7 +0x42, // 41: F8 +0x43, // 42: F9 +0x44, // 43: F10 +MISS, // 44: F11 +OSD_OPEN, // 45: F12 +MISS, // 46: Print Screen +NUM_LOCK_TOGGLE, // 47: Scroll Lock +MISS, // 48: Pause +0x52, // 49: Insert +0x47, // 4a: Home +0x62, // 4b: Page Up +0x53, // 4c: Delete +MISS, // 4d: End +0x61, // 4e: Page Down +0x4d, // 4f: Right Arrow +0x4b, // 50: Left Arrow +0x50, // 51: Down Arrow +0x48, // 52: Up Arrow +NUM_LOCK_TOGGLE, // 53: Num Lock +0x65, // 54: KP / +0x66, // 55: KP * +0x4a, // 56: KP - +0x4e, // 57: KP + +0x72, // 58: KP Enter +0x6d, // 59: KP 1 +0x6e, // 5a: KP 2 +0x6f, // 5b: KP 3 +0x6a, // 5c: KP 4 +0x6b, // 5d: KP 5 +0x6c, // 5e: KP 6 +0x67, // 5f: KP 7 +0x68, // 60: KP 8 +0x69, // 61: KP 9 +0x70, // 62: KP 0 +0x71, // 63: KP . +0x60, // 64: Europe 2 +OSD_OPEN, // 65: App +MISS, // 66: Power +MISS, // 67: KP = +MISS, // 68: F13 +MISS, // 69: F14 +MISS, // 6a: F15 +0x52, // 6b: insert (for keyrah) +NUM_LOCK_TOGGLE | 1, // 6c: F17 +NUM_LOCK_TOGGLE | 2, // 6d: F18 +NUM_LOCK_TOGGLE | 3, // 6e: F19 +NUM_LOCK_TOGGLE | 4 // 6f: F20 +}; +*/ + +/* + +// Archimedes unmapped keys +// Missing sterling +// Missing kp_hash +// Missing button_1 +// Missing button_2 +// Missing button_3 +// Missing button_4 +// Missing button_5 + +// keycode translation table +const unsigned short usb2archie[] = { +MISS, // 00: NoEvent +MISS, // 01: Overrun Error +MISS, // 02: POST fail +MISS, // 03: ErrorUndefined +0x3c, // 04: a +0x52, // 05: b +0x50, // 06: c +0x3e, // 07: d +0x29, // 08: e +0x3f, // 09: f +0x40, // 0a: g +0x41, // 0b: h +0x2e, // 0c: i +0x42, // 0d: j +0x43, // 0e: k +0x44, // 0f: l +0x54, // 10: m +0x53, // 11: n +0x2f, // 12: o +0x30, // 13: p +0x27, // 14: q +0x2a, // 15: r +0x3d, // 16: s +0x2b, // 17: t +0x2d, // 18: u +0x51, // 19: v +0x28, // 1a: w +0x4f, // 1b: x +0x2c, // 1c: y +0x4e, // 1d: z +0x11, // 1e: 1 +0x12, // 1f: 2 +0x13, // 20: 3 +0x14, // 21: 4 +0x15, // 22: 5 +0x16, // 23: 6 +0x17, // 24: 7 +0x18, // 25: 8 +0x19, // 26: 9 +0x1a, // 27: 0 +0x47, // 28: Return +0x00, // 29: Escape +0x1e, // 2a: Backspace +0x26, // 2b: Tab +0x5f, // 2c: Space +0x1b, // 2d: - +0x1c, // 2e: = +0x31, // 2f: [ +0x32, // 30: ] +0x33, // 31: backslash (only on us keyboards) +0x33, // 32: Europe 1 (only on international kbds) +0x45, // 33: ; +0x46, // 34: ' +0x10, // 35: ` +0x55, // 36: , +0x56, // 37: . +0x57, // 38: / +0x5d, // 39: Caps Lock +0x01, // 3a: F1 +0x02, // 3b: F2 +0x03, // 3c: F3 +0x04, // 3d: F4 +0x05, // 3e: F5 +0x06, // 3f: F6 +0x07, // 40: F7 +0x08, // 41: F8 +0x09, // 42: F9 +0x0a, // 43: F10 +0x0b, // 44: F11 +0x0c, // 45: F12 - Used heavily by the archie... OSD moved to printscreen. +// 0x0d, // 46: Print Screen +OSD_OPEN, // 46: Print Screen +0x0e, // 47: Scroll Lock +0x0f, // 48: Pause +0x1f, // 49: Insert +0x20, // 4a: Home +0x21, // 4b: Page Up +0x34, // 4c: Delete +0x35, // 4d: End +0x36, // 4e: Page Down +0x64, // 4f: Right Arrow +0x62, // 50: Left Arrow +0x63, // 51: Down Arrow +0x59, // 52: Up Arrow +0x22, // 53: Num Lock +0x23, // 54: KP / +0x24, // 55: KP * +0x3a, // 56: KP - +0x4b, // 57: KP + +0x67, // 58: KP Enter +0x5a, // 59: KP 1 +0x5b, // 5a: KP 2 +0x5c, // 5b: KP 3 +0x48, // 5c: KP 4 +0x49, // 5d: KP 5 +0x4a, // 5e: KP 6 +0x37, // 5f: KP 7 +0x38, // 60: KP 8 +0x39, // 61: KP 9 +0x65, // 62: KP 0 +0x66, // 63: KP decimal +MISS, // 64: Europe 2 +0x72, // 65: App (maps to middle mouse button) +MISS, // 66: Power +MISS, // 67: KP = +MISS, // 68: F13 +MISS, // 69: F14 +MISS, // 6a: F15 +0x1f, // 6b: insert (for keyrah) +MISS, // 6c: F17 +MISS, // 6d: F18 +MISS, // 6e: F19 +MISS, // 6f: F20 +}; +*/ + +/* +unsigned short modifier_keycode(unsigned char index) +{ +// usb modifer bits: +//0 1 2 3 4 5 6 7 +//LCTRL LSHIFT LALT LGUI RCTRL RSHIFT RALT RGUI + +if (core_type == CORE_TYPE_MINIMIG2) +{ +static const unsigned short amiga_modifier[] = { 0x63, 0x60, 0x64, 0x66, 0x63, 0x61, 0x65, 0x67 }; +return amiga_modifier[index]; +} + +if (core_type == CORE_TYPE_MIST) +{ +static const unsigned short atari_modifier[] = { 0x1d, 0x2a, 0x38, MISS, 0x1d, 0x36, 0x38, MISS }; +return atari_modifier[index]; +} + +if (core_type == CORE_TYPE_8BIT) +{ +static const unsigned short ps2_modifier[] = { 0x14, 0x12, 0x11, EXT | 0x1f, EXT | 0x14, 0x59, EXT | 0x11, EXT | 0x27 }; +return ps2_modifier[index]; +} + +if (core_type == CORE_TYPE_ARCHIE) +{ +static const unsigned short archie_modifier[] = { 0x36, 0x4c, 0x5e, MISS, 0x61, 0x58, 0x60, MISS }; +return archie_modifier[index]; +} + +return MISS; +} +*/ + + +uint32_t get_ps2_code(uint16_t key) +{ + if (key > 255) return NONE; + return ev2ps2[key]; +} + +uint32_t get_amiga_code(uint16_t key) +{ + if (key > 255) return NONE; + return ev2amiga[key]; +} + +uint32_t get_atari_code(uint16_t key) +{ + if (key > 255) return NONE; + return 0; // ev2atari[key]; +} + +uint32_t get_archie_code(uint16_t key) +{ + if (key > 255) return NONE; + return 0; // ev2archie[key]; +} + +static uint32_t modifier = 0; + +uint32_t get_key_mod() +{ + return modifier & MODMASK; +} + +typedef struct +{ + uint16_t vid, pid; + char led; + char last_l, last_r, last_u, last_d; + + char has_map; + uint32_t map[32]; + + char has_mmap; + uint32_t mmap[32]; + + char has_kbdmap; + uint8_t kbdmap[256]; +} devInput; + +static devInput input[NUMDEV] = { 0 }; +static int first_joystick = -1; + int mfd = -1; int mwd = -1; @@ -789,51 +1089,51 @@ uint16_t get_map_pid() static char kr_fn_table[] = { - 0x54, 0x48, // pause/break - 0x55, 0x46, // prnscr - 0x50, 0x4a, // home - 0x4f, 0x4d, // end - 0x52, 0x4b, // pgup - 0x51, 0x4e, // pgdown - 0x3a, 0x44, // f11 - 0x3b, 0x45, // f12 + KEY_KPSLASH, KEY_PAUSE, + KEY_KPASTERISK, KEY_PRINT, + KEY_LEFT, KEY_HOME, + KEY_RIGHT, KEY_END, + KEY_UP, KEY_PAGEUP, + KEY_DOWN, KEY_PAGEDOWN, + KEY_F1, KEY_F11, + KEY_F2, KEY_F12, - 0x3c, 0x6c, // EMU_MOUSE - 0x3d, 0x6d, // EMU_JOY0 - 0x3e, 0x6e, // EMU_JOY1 - 0x3f, 0x6f, // EMU_NONE + KEY_F3, KEY_F17, // EMU_MOUSE + KEY_F4, KEY_F18, // EMU_JOY0 + KEY_F5, KEY_F19, // EMU_JOY1 + KEY_F6, KEY_F20, // EMU_NONE - //Emulate keypad for A600 - 0x1E, 0x59, //KP1 - 0x1F, 0x5A, //KP2 - 0x20, 0x5B, //KP3 - 0x21, 0x5C, //KP4 - 0x22, 0x5D, //KP5 - 0x23, 0x5E, //KP6 - 0x24, 0x5F, //KP7 - 0x25, 0x60, //KP8 - 0x26, 0x61, //KP9 - 0x27, 0x62, //KP0 - 0x2D, 0x56, //KP- - 0x2E, 0x57, //KP+ - 0x31, 0x55, //KP* - 0x2F, 0x68, //KP( - 0x30, 0x69, //KP) - 0x37, 0x63, //KP. - 0x28, 0x58 //KP Enter + //Emulate keypad for A600 + KEY_1, KEY_KP1, + KEY_2, KEY_KP2, + KEY_3, KEY_KP3, + KEY_4, KEY_KP4, + KEY_5, KEY_KP5, + KEY_6, KEY_KP6, + KEY_7, KEY_KP7, + KEY_8, KEY_KP8, + KEY_9, KEY_KP9, + KEY_0, KEY_KP0, + KEY_MINUS, KEY_KPMINUS, + KEY_EQUAL, KEY_KPPLUS, + KEY_BACKSLASH, KEY_KPASTERISK, + KEY_LEFTBRACE, KEY_F13, //KP( + KEY_RIGHTBRACE, KEY_F14, //KP) + KEY_DOT, KEY_KPDOT, + KEY_ENTER, KEY_KPENTER }; static int keyrah_trans(int key, int press) { static int fn = 0; - if (key == 0x53) return 0x68; - if (key == 0x47) return 0x69; - if (key == 0x49) return 0x6b; // workaround! + if (key == KEY_NUMLOCK) return KEY_F13; // numlock -> f13 + if (key == KEY_SCROLLLOCK) return KEY_F14; // scrlock -> f14 + if (key == KEY_INSERT) return KEY_F16; // insert -> f16. workaround! - if (key == FN) + if (key == KEY_102ND) { - if (!press && fn == 1) menu_key_set(KEY_AMI_MENU); + if (!press && fn == 1) menu_key_set(KEY_F12); fn = press ? 1 : 0; return 0; } @@ -987,95 +1287,12 @@ static void joy_analog(int num, int axis, int offset) } } -static int input_cb_x86(struct input_event *ev, int dev) -{ - if(user_io_osd_is_visible() || ev->type != EV_KEY || !is_x86_core() || ev->code>255) return 0; - - int code = ev2ps2[ev->code]; - if (code == NONE) return 0; - - //pause - if ((code & 0xff) == 0xE1) - { - // pause does not have a break code - if (ev->value != 1) - { - // Pause key sends E11477E1F014E077 - static const unsigned char c[] = { 0xe1, 0x14, 0x77, 0xe1, 0xf0, 0x14, 0xf0, 0x77, 0x00 }; - const unsigned char *p = c; - - spi_uio_cmd_cont(UIO_KEYBOARD); - - printf("PS2 PAUSE CODE: "); - while (*p) - { - printf("%x ", *p); - spi8(*p++); - } - printf("\n"); - - DisableIO(); - } - } - // print screen - else if ((code & 0xff) == 0xE2) - { - if (ev->value <= 1) - { - static const unsigned char c[2][8] = { - { 0xE0, 0xF0, 0x7C, 0xE0, 0xF0, 0x12, 0x00, 0x00 }, - { 0xE0, 0x12, 0xE0, 0x7C, 0x00, 0x00, 0x00, 0x00 } - }; - - const unsigned char *p = c[ev->value]; - - spi_uio_cmd_cont(UIO_KEYBOARD); - - printf("PS2 PRINT CODE: "); - while (*p) - { - printf("%x ", *p); - spi8(*p++); - } - printf("\n"); - - DisableIO(); - } - } - else - { - spi_uio_cmd_cont(UIO_KEYBOARD); - /* - iprintf("PS2 KBD "); - if (code & EXT) iprintf("e0 "); - if (code & BREAK) iprintf("f0 "); - iprintf("%x\n", code & 0xff); - */ - - // prepend extended code flag if required - if (code & EXT) spi8(0xe0); - - // prepend break code if required - if (!ev->value) spi8(0xf0); - - // send code itself - spi8(code & 0xff); - - DisableIO(); - } - - return 1; -} - static void input_cb(struct input_event *ev, int dev) { static int key_mapped = 0; static uint8_t modifiers = 0; static char keys[6] = { 0,0,0,0,0,0 }; - // repeat events won't be processed - if (ev->type == EV_KEY && ev->value > 1) return; - int map_skip = (ev->type == EV_KEY && ev->code == 57 && mapping_dev >= 0 && mapping_type==1); int cancel = (ev->type == EV_KEY && ev->code == 1); int enter = (ev->type == EV_KEY && ev->code == 28); @@ -1086,9 +1303,12 @@ static void input_cb(struct input_event *ev, int dev) case EV_KEY: if (ev->code >= 272 && ev->code <= 279) { - unsigned char mask = 1 << (ev->code - 272); - mouse_btn = (ev->value) ? mouse_btn | mask : mouse_btn & ~mask; - user_io_mouse(mouse_btn, 0, 0); + if (ev->value <= 1) + { + unsigned char mask = 1 << (ev->code - 272); + mouse_btn = (ev->value) ? mouse_btn | mask : mouse_btn & ~mask; + user_io_mouse(mouse_btn, 0, 0); + } return; } break; @@ -1148,7 +1368,7 @@ static void input_cb(struct input_event *ev, int dev) { if (mapping_type == 2) { - if (ev->value && ev->code < 256) + if (ev->value == 1 && ev->code < 256) { if(mapping_dev < 0) { @@ -1175,7 +1395,7 @@ static void input_cb(struct input_event *ev, int dev) if (mapping_dev == dev && mapping_button < mapping_count) { - if (ev->value) + if (ev->value == 1) { if (!mapping_button) memset(input[dev].map, 0, sizeof(input[dev].map)); @@ -1188,7 +1408,7 @@ static void input_cb(struct input_event *ev, int dev) key_mapped = 1; } } - else + else if(ev->value == 0) { if (key_mapped) mapping_button++; key_mapped = 0; @@ -1250,7 +1470,7 @@ static void input_cb(struct input_event *ev, int dev) { if (ev->code == input[dev].map[i]) { - joy_digital((first_joystick == dev) ? 0 : 1, 1 << i, ev->value, i); + if(ev->value <= 1) joy_digital((first_joystick == dev) ? 0 : 1, 1 << i, ev->value, i); return; } } @@ -1261,7 +1481,7 @@ static void input_cb(struct input_event *ev, int dev) { if (ev->code == input[dev].map[i]) { - joy_digital((first_joystick == dev) ? 0 : 1, 1 << i, ev->value, i); + if (ev->value <= 1) joy_digital((first_joystick == dev) ? 0 : 1, 1 << i, ev->value, i); return; } } @@ -1270,7 +1490,7 @@ static void input_cb(struct input_event *ev, int dev) { if (ev->code == input[dev].mmap[i]) { - joy_digital((first_joystick == dev) ? 0 : 1, 1 << (i - 8), ev->value, i - 8); + if (ev->value <= 1) joy_digital((first_joystick == dev) ? 0 : 1, 1 << (i - 8), ev->value, i - 8); return; } } @@ -1278,11 +1498,11 @@ static void input_cb(struct input_event *ev, int dev) if (ev->code == input[dev].map[17]) { - joy_digital((first_joystick == dev) ? 0 : 1, 0, ev->value, 17); + if (ev->value <= 1) joy_digital((first_joystick == dev) ? 0 : 1, 0, ev->value, 17); return; } - if (ev->code == input[dev].mmap[15]) + if (ev->code == input[dev].mmap[15] && (ev->value <= 1)) { mouse_emu = ev->value ? mouse_emu | 1 : mouse_emu & ~1; printf("mouse_emu = %d\n", mouse_emu); @@ -1312,7 +1532,7 @@ static void input_cb(struct input_event *ev, int dev) { if (ev->code == input[dev].map[i]) { - joy_digital((user_io_get_kbdemu() == EMU_JOY0) ? 0 : 1, 1 << i, ev->value, i); + if (ev->value <= 1) joy_digital((user_io_get_kbdemu() == EMU_JOY0) ? 0 : 1, 1 << i, ev->value, i); return; } } @@ -1320,7 +1540,7 @@ static void input_cb(struct input_event *ev, int dev) if (ev->code == input[dev].map[16]) { - joy_digital((user_io_get_kbdemu() == EMU_JOY0) ? 0 : 1, 0, ev->value, 16); + if (ev->value <= 1) joy_digital((user_io_get_kbdemu() == EMU_JOY0) ? 0 : 1, 0, ev->value, 16); return; } } @@ -1363,14 +1583,14 @@ static void input_cb(struct input_event *ev, int dev) if (ev->code == input[dev].mmap[15]) { - mouse_sniper = ev->value; + if (ev->value <= 1) mouse_sniper = ev->value; return; } } if (ev->code == input[dev].map[16]) { - if (ev->value) + if (ev->value == 1) { kbd_mouse_emu = !kbd_mouse_emu; printf("kbd_mouse_emu = %d\n", kbd_mouse_emu); @@ -1394,34 +1614,27 @@ static void input_cb(struct input_event *ev, int dev) input[dev].has_kbdmap = 1; } - int key = input[dev].kbdmap[ev->code] ? input[dev].kbdmap[ev->code] : ev->code; - key = (key < (sizeof(ev2usb) / sizeof(ev2usb[0]))) ? ev2usb[key] : NONE; - if(key != NONE) - { - static uint16_t mod = 0; + static uint16_t mod = 0; - //Keyrah v2: USB\VID_18D8&PID_0002\A600/A1200_MULTIMEDIA_EXTENSION_VERSION - int keyrah = (mist_cfg.keyrah_mode && (((((uint32_t)input[dev].vid) << 16) | input[dev].pid) == mist_cfg.keyrah_mode)); + // replace MENU key by RGUI to allow using Right Amiga on reduced keyboards + // (it also disables the use of Menu for OSD) + uint16_t code = ev->code; + if (mist_cfg.key_menu_as_rgui && code == 139) code = 126; - if (keyrah) key = keyrah_trans(key, ev->value); - if (key & 0xffff) - { - unsigned short reset_m = mod >> 8; - if (key == 0x4c) reset_m |= 0x100; - user_io_check_reset(reset_m, (keyrah && !mist_cfg.reset_combo) ? 1 : mist_cfg.reset_combo); + //Keyrah v2: USB\VID_18D8&PID_0002\A600/A1200_MULTIMEDIA_EXTENSION_VERSION + int keyrah = (mist_cfg.keyrah_mode && (((((uint32_t)input[dev].vid) << 16) | input[dev].pid) == mist_cfg.keyrah_mode)); + if (keyrah) code = keyrah_trans(code, ev->value); - if (key & MODMASK) - { - if (ev->value) mod |= key; - else mod &= ~key; - } - key = (mod & MODMASK) | (key & ~MODMASK); + uint32_t ps2code = get_ps2_code(code); + if (ev->value) modifier |= ps2code; + else modifier &= ~ps2code; - menu_mod_set(mod >> 8); - user_io_kbd((uint16_t)key, ev->value); - } - return; - } + uint16_t reset_m = (modifier & MODMASK) >> 8; + if (code == 111) reset_m |= 0x100; + user_io_check_reset(reset_m, (keyrah && !mist_cfg.reset_combo) ? 1 : mist_cfg.reset_combo); + + user_io_kbd(code, ev->value); + return; } break; @@ -1615,8 +1828,7 @@ int input_test(int getchar) } } - - if(!input_cb_x86(&ev, i)) input_cb(&ev, i); + input_cb(&ev, i); //sumulate digital directions from analog if (ev.type == EV_ABS && !(ev.code<=1 && mouse_emu && !user_io_osd_is_visible())) diff --git a/input.h b/input.h index c73bdaa..77061f6 100644 --- a/input.h +++ b/input.h @@ -2,11 +2,33 @@ #ifndef EVINPUT_H #define EVINPUT_H +#include + #define HID_LED_NUM_LOCK 1 #define HID_LED_CAPS_LOCK 2 #define HID_LED_SCROLL_LOCK 4 #define HID_LED_MASK 7 +#define NONE 0xFF +#define LCTRL 0x000100 +#define LSHIFT 0x000200 +#define LALT 0x000400 +#define LGUI 0x000800 +#define RCTRL 0x001000 +#define RSHIFT 0x002000 +#define RALT 0x004000 +#define RGUI 0x008000 +#define MODMASK 0x00FF00 + +#define OSD 0x010000 // to be used by OSD, not the core itself +#define OSD_OPEN 0x020000 // OSD key not forwarded to core, but queued in arm controller +#define CAPS_TOGGLE 0x040000 // caps lock toggle behaviour +#define EXT 0x080000 +#define EMU_SWITCH_1 0x100000 +#define EMU_SWITCH_2 0x200000 + +#define UPSTROKE 0x400000 + void set_kbdled(int mask, int state); int get_kbdled(int mask); int toggle_kbdled(int mask); @@ -22,4 +44,10 @@ void finish_map_setting(int dismiss); uint16_t get_map_vid(); uint16_t get_map_pid(); +uint32_t get_key_mod(); +uint32_t get_ps2_code(uint16_t key); +uint32_t get_amiga_code(uint16_t key); +uint32_t get_atari_code(uint16_t key); +uint32_t get_archie_code(uint16_t key); + #endif diff --git a/keycodes.h b/keycodes.h deleted file mode 100644 index e41f558..0000000 --- a/keycodes.h +++ /dev/null @@ -1,509 +0,0 @@ -// http://wiki.amigaos.net/index.php/Keymap_Library -// http://www.win.tue.nl/~aeb/linux/kbd/scancodes-14.html - -#include "osd.h" - -#ifndef KEYCODES_H -#define KEYCODES_H - -#define MISS 0xff -#define KEYCODE_MAX (0x6f) - -// The original minimig had the keyboard connected to the FPGA. Thus all key events (even for OSD) -// came from the FPGA core. The MIST has the keyboard attached to the arm controller. To be compatible -// with the minimig core all keys (incl. OSD!) are forwarded to the FPGA and the OSD keys are returned. -// These keys are tagged with the "OSD" flag -// The atari/mist core does not forwards keys through the FPGA but queues them inside the arm controller. -// Keys flagged with "OSD_OPEN" are used to open the OSD in non-minimig. They can have a keycode which -// will be sent into the core - -#define OSD 0x0100 // to be used by OSD, not the core itself -#define OSD_OPEN 0x0200 // OSD key not forwarded to core, but queued in arm controller -#define CAPS_LOCK_TOGGLE 0x0400 // caps lock toggle behaviour -#define NUM_LOCK_TOGGLE 0x0800 -#define EXT 0x1000 // extended PS/2 keycode - -// amiga unmapped: -// 0x5a KP-( (mapped on Keyrah) -// 0x5b KP-) (mapped on Keyrah) -// codes >= 0x69 are for OSD only and are not sent to the amiga itself - -// keycode translation table -const unsigned short usb2ami[] = { - MISS, // 00: NoEvent - MISS, // 01: Overrun Error - MISS, // 02: POST fail - MISS, // 03: ErrorUndefined - 0x20, // 04: a - 0x35, // 05: b - 0x33, // 06: c - 0x22, // 07: d - 0x12, // 08: e - 0x23, // 09: f - 0x24, // 0a: g - 0x25, // 0b: h - 0x17, // 0c: i - 0x26, // 0d: j - 0x27, // 0e: k - 0x28, // 0f: l - 0x37, // 10: m - 0x36, // 11: n - 0x18, // 12: o - 0x19, // 13: p - 0x10, // 14: q - 0x13, // 15: r - 0x21, // 16: s - 0x14, // 17: t - 0x16, // 18: u - 0x34, // 19: v - 0x11, // 1a: w - 0x32, // 1b: x - 0x15, // 1c: y - 0x31, // 1d: z - 0x01, // 1e: 1 - 0x02, // 1f: 2 - 0x03, // 20: 3 - 0x04, // 21: 4 - 0x05, // 22: 5 - 0x06, // 23: 6 - 0x07, // 24: 7 - 0x08, // 25: 8 - 0x09, // 26: 9 - 0x0a, // 27: 0 - 0x44, // 28: Return - 0x45, // 29: Escape - 0x41, // 2a: Backspace - 0x42, // 2b: Tab - 0x40, // 2c: Space - 0x0b, // 2d: - - 0x0c, // 2e: = - 0x1a, // 2f: [ - 0x1b, // 30: ] - 0x0d, // 31: backslash (only on us keyboards) - 0x2b, // 32: Europe 1 (only on international keyboards) - 0x29, // 33: ; - 0x2a, // 34: ' - 0x00, // 35: ` - 0x38, // 36: , - 0x39, // 37: . - 0x3a, // 38: / - 0x62 | CAPS_LOCK_TOGGLE, // 39: Caps Lock - 0x50, // 3a: F1 - 0x51, // 3b: F2 - 0x52, // 3c: F3 - 0x53, // 3d: F4 - 0x54, // 3e: F5 - 0x55, // 3f: F6 - 0x56, // 40: F7 - 0x57, // 41: F8 - 0x58, // 42: F9 - 0x59, // 43: F10 - 0x5f, // 44: F11 - OSD_OPEN, // 45: F12 (OSD) - 0x6e | OSD, // 46: Print Screen (OSD) - NUM_LOCK_TOGGLE, // 47: Scroll Lock (OSD) - 0x6f | OSD, // 48: Pause - 0x0d, // 49: backslash to avoid panic in Germany ;) - 0x6a, // 4a: Home - 0x6c | OSD, // 4b: Page Up (OSD) - 0x46, // 4c: Delete - MISS, // 4d: End - 0x6d | OSD, // 4e: Page Down (OSD) - 0x4e, // 4f: Right Arrow - 0x4f, // 50: Left Arrow - 0x4d, // 51: Down Arrow - 0x4c, // 52: Up Arrow - NUM_LOCK_TOGGLE, // 53: Num Lock - 0x5c, // 54: KP / - 0x5d, // 55: KP * - 0x4a, // 56: KP - - 0x5e, // 57: KP + - 0x43, // 58: KP Enter - 0x1d, // 59: KP 1 - 0x1e, // 5a: KP 2 - 0x1f, // 5b: KP 3 - 0x2d, // 5c: KP 4 - 0x2e, // 5d: KP 5 - 0x2f, // 5e: KP 6 - 0x3d, // 5f: KP 7 - 0x3e, // 60: KP 8 - 0x3f, // 61: KP 9 - 0x0f, // 62: KP 0 - 0x3c, // 63: KP . - 0x30, // 64: Europe 2 - 0x69 | OSD, // 65: App - MISS, // 66: Power - MISS, // 67: KP = - 0x5a, // 68: KP ( - 0x5b, // 69: KP ) - MISS, // 6a: F15 - 0x5f, // 6b: help (for keyrah) - NUM_LOCK_TOGGLE | 1, // 6c: F17 - NUM_LOCK_TOGGLE | 2, // 6d: F18 - NUM_LOCK_TOGGLE | 3, // 6e: F19 - NUM_LOCK_TOGGLE | 4 // 6f: F20 -}; - -// unmapped atari keys: -// 0x63 KP ( -// 0x64 KP ) - -// keycode translation table for atari -const unsigned short usb2atari[] = { - MISS, // 00: NoEvent - MISS, // 01: Overrun Error - MISS, // 02: POST fail - MISS, // 03: ErrorUndefined - 0x1e, // 04: a - 0x30, // 05: b - 0x2e, // 06: c - 0x20, // 07: d - 0x12, // 08: e - 0x21, // 09: f - 0x22, // 0a: g - 0x23, // 0b: h - 0x17, // 0c: i - 0x24, // 0d: j - 0x25, // 0e: k - 0x26, // 0f: l - 0x32, // 10: m - 0x31, // 11: n - 0x18, // 12: o - 0x19, // 13: p - 0x10, // 14: q - 0x13, // 15: r - 0x1f, // 16: s - 0x14, // 17: t - 0x16, // 18: u - 0x2f, // 19: v - 0x11, // 1a: w - 0x2d, // 1b: x - 0x15, // 1c: y - 0x2c, // 1d: z - 0x02, // 1e: 1 - 0x03, // 1f: 2 - 0x04, // 20: 3 - 0x05, // 21: 4 - 0x06, // 22: 5 - 0x07, // 23: 6 - 0x08, // 24: 7 - 0x09, // 25: 8 - 0x0a, // 26: 9 - 0x0b, // 27: 0 - 0x1c, // 28: Return - 0x01, // 29: Escape - 0x0e, // 2a: Backspace - 0x0f, // 2b: Tab - 0x39, // 2c: Space - 0x0c, // 2d: - - 0x0d, // 2e: = - 0x1a, // 2f: [ - 0x1b, // 30: ] - 0x29, // 31: backslash, only on us keyboard - 0x29, // 32: Europe 1, only on int. keyboard - 0x27, // 33: ; - 0x28, // 34: ' - 0x2b, // 35: ` - 0x33, // 36: , - 0x34, // 37: . - 0x35, // 38: / - 0x3a | CAPS_LOCK_TOGGLE, // 39: Caps Lock - 0x3b, // 3a: F1 - 0x3c, // 3b: F2 - 0x3d, // 3c: F3 - 0x3e, // 3d: F4 - 0x3f, // 3e: F5 - 0x40, // 3f: F6 - 0x41, // 40: F7 - 0x42, // 41: F8 - 0x43, // 42: F9 - 0x44, // 43: F10 - MISS, // 44: F11 - OSD_OPEN, // 45: F12 - MISS, // 46: Print Screen - NUM_LOCK_TOGGLE, // 47: Scroll Lock - MISS, // 48: Pause - 0x52, // 49: Insert - 0x47, // 4a: Home - 0x62, // 4b: Page Up - 0x53, // 4c: Delete - MISS, // 4d: End - 0x61, // 4e: Page Down - 0x4d, // 4f: Right Arrow - 0x4b, // 50: Left Arrow - 0x50, // 51: Down Arrow - 0x48, // 52: Up Arrow - NUM_LOCK_TOGGLE, // 53: Num Lock - 0x65, // 54: KP / - 0x66, // 55: KP * - 0x4a, // 56: KP - - 0x4e, // 57: KP + - 0x72, // 58: KP Enter - 0x6d, // 59: KP 1 - 0x6e, // 5a: KP 2 - 0x6f, // 5b: KP 3 - 0x6a, // 5c: KP 4 - 0x6b, // 5d: KP 5 - 0x6c, // 5e: KP 6 - 0x67, // 5f: KP 7 - 0x68, // 60: KP 8 - 0x69, // 61: KP 9 - 0x70, // 62: KP 0 - 0x71, // 63: KP . - 0x60, // 64: Europe 2 - OSD_OPEN, // 65: App - MISS, // 66: Power - MISS, // 67: KP = - MISS, // 68: F13 - MISS, // 69: F14 - MISS, // 6a: F15 - 0x52, // 6b: insert (for keyrah) - NUM_LOCK_TOGGLE | 1, // 6c: F17 - NUM_LOCK_TOGGLE | 2, // 6d: F18 - NUM_LOCK_TOGGLE | 3, // 6e: F19 - NUM_LOCK_TOGGLE | 4 // 6f: F20 -}; - -// keycode translation table for ps2 emulation -const unsigned short usb2ps2[] = { - MISS, // 00: NoEvent - MISS, // 01: Overrun Error - MISS, // 02: POST fail - MISS, // 03: ErrorUndefined - 0x1c, // 04: a - 0x32, // 05: b - 0x21, // 06: c - 0x23, // 07: d - 0x24, // 08: e - 0x2b, // 09: f - 0x34, // 0a: g - 0x33, // 0b: h - 0x43, // 0c: i - 0x3b, // 0d: j - 0x42, // 0e: k - 0x4b, // 0f: l - 0x3a, // 10: m - 0x31, // 11: n - 0x44, // 12: o - 0x4d, // 13: p - 0x15, // 14: q - 0x2d, // 15: r - 0x1b, // 16: s - 0x2c, // 17: t - 0x3c, // 18: u - 0x2a, // 19: v - 0x1d, // 1a: w - 0x22, // 1b: x - 0x35, // 1c: y - 0x1a, // 1d: z - 0x16, // 1e: 1 - 0x1e, // 1f: 2 - 0x26, // 20: 3 - 0x25, // 21: 4 - 0x2e, // 22: 5 - 0x36, // 23: 6 - 0x3d, // 24: 7 - 0x3e, // 25: 8 - 0x46, // 26: 9 - 0x45, // 27: 0 - 0x5a, // 28: Return - 0x76, // 29: Escape - 0x66, // 2a: Backspace - 0x0d, // 2b: Tab - 0x29, // 2c: Space - 0x4e, // 2d: - - 0x55, // 2e: = - 0x54, // 2f: [ - 0x5b, // 30: ] - 0x5d, // 31: backslash - 0x5d, // 32: Europe 1 - 0x4c, // 33: ; - 0x52, // 34: ' - 0x0e, // 35: ` - 0x41, // 36: , - 0x49, // 37: . - 0x4a, // 38: / - 0x58, // 39: Caps Lock - 0x05, // 3a: F1 - 0x06, // 3b: F2 - 0x04, // 3c: F3 - 0x0c, // 3d: F4 - 0x03, // 3e: F5 - 0x0b, // 3f: F6 - 0x83, // 40: F7 - 0x0a, // 41: F8 - 0x01, // 42: F9 - 0x09, // 43: F10 - 0x78, // 44: F11 - OSD_OPEN | 0x07, // 45: F12 (OSD) - EXT | 0x7c, // 46: Print Screen - NUM_LOCK_TOGGLE, // 47: Scroll Lock - 0x77, // 48: Pause (special key handled inside user_io) - EXT | 0x70, // 49: Insert - EXT | 0x6c, // 4a: Home - EXT | 0x7d, // 4b: Page Up - EXT | 0x71, // 4c: Delete - EXT | 0x69, // 4d: End - EXT | 0x7a, // 4e: Page Down - EXT | 0x74, // 4f: Right Arrow - EXT | 0x6b, // 50: Left Arrow - EXT | 0x72, // 51: Down Arrow - EXT | 0x75, // 52: Up Arrow - NUM_LOCK_TOGGLE, // 53: Num Lock - EXT | 0x4a, // 54: KP / - 0x7c, // 55: KP * - 0x7b, // 56: KP - - 0x79, // 57: KP + - EXT | 0x5a, // 58: KP Enter - 0x69, // 59: KP 1 - 0x72, // 5a: KP 2 - 0x7a, // 5b: KP 3 - 0x6b, // 5c: KP 4 - 0x73, // 5d: KP 5 - 0x74, // 5e: KP 6 - 0x6c, // 5f: KP 7 - 0x75, // 60: KP 8 - 0x7d, // 61: KP 9 - 0x70, // 62: KP 0 - 0x71, // 63: KP . - 0x61, // 64: Europe 2 - OSD_OPEN | EXT | 0x2f, // 65: App - EXT | 0x37, // 66: Power - 0x0f, // 67: KP = - 0x77, // 68: Num Lock - 0x7e, // 69: Scroll Lock - 0x18, // 6a: F15 - EXT | 0x70, // 6b: insert (for keyrah) - NUM_LOCK_TOGGLE | 1, // 6c: F17 - NUM_LOCK_TOGGLE | 2, // 6d: F18 - NUM_LOCK_TOGGLE | 3, // 6e: F19 - NUM_LOCK_TOGGLE | 4 // 6f: F20 -}; - -// Archimedes unmapped keys -// Missing sterling -// Missing kp_hash -// Missing button_1 -// Missing button_2 -// Missing button_3 -// Missing button_4 -// Missing button_5 - -// keycode translation table -const unsigned short usb2archie[] = { - MISS, // 00: NoEvent - MISS, // 01: Overrun Error - MISS, // 02: POST fail - MISS, // 03: ErrorUndefined - 0x3c, // 04: a - 0x52, // 05: b - 0x50, // 06: c - 0x3e, // 07: d - 0x29, // 08: e - 0x3f, // 09: f - 0x40, // 0a: g - 0x41, // 0b: h - 0x2e, // 0c: i - 0x42, // 0d: j - 0x43, // 0e: k - 0x44, // 0f: l - 0x54, // 10: m - 0x53, // 11: n - 0x2f, // 12: o - 0x30, // 13: p - 0x27, // 14: q - 0x2a, // 15: r - 0x3d, // 16: s - 0x2b, // 17: t - 0x2d, // 18: u - 0x51, // 19: v - 0x28, // 1a: w - 0x4f, // 1b: x - 0x2c, // 1c: y - 0x4e, // 1d: z - 0x11, // 1e: 1 - 0x12, // 1f: 2 - 0x13, // 20: 3 - 0x14, // 21: 4 - 0x15, // 22: 5 - 0x16, // 23: 6 - 0x17, // 24: 7 - 0x18, // 25: 8 - 0x19, // 26: 9 - 0x1a, // 27: 0 - 0x47, // 28: Return - 0x00, // 29: Escape - 0x1e, // 2a: Backspace - 0x26, // 2b: Tab - 0x5f, // 2c: Space - 0x1b, // 2d: - - 0x1c, // 2e: = - 0x31, // 2f: [ - 0x32, // 30: ] - 0x33, // 31: backslash (only on us keyboards) - 0x33, // 32: Europe 1 (only on international kbds) - 0x45, // 33: ; - 0x46, // 34: ' - 0x10, // 35: ` - 0x55, // 36: , - 0x56, // 37: . - 0x57, // 38: / - 0x5d, // 39: Caps Lock - 0x01, // 3a: F1 - 0x02, // 3b: F2 - 0x03, // 3c: F3 - 0x04, // 3d: F4 - 0x05, // 3e: F5 - 0x06, // 3f: F6 - 0x07, // 40: F7 - 0x08, // 41: F8 - 0x09, // 42: F9 - 0x0a, // 43: F10 - 0x0b, // 44: F11 - 0x0c, // 45: F12 - Used heavily by the archie... OSD moved to printscreen. - // 0x0d, // 46: Print Screen - OSD_OPEN, // 46: Print Screen - 0x0e, // 47: Scroll Lock - 0x0f, // 48: Pause - 0x1f, // 49: Insert - 0x20, // 4a: Home - 0x21, // 4b: Page Up - 0x34, // 4c: Delete - 0x35, // 4d: End - 0x36, // 4e: Page Down - 0x64, // 4f: Right Arrow - 0x62, // 50: Left Arrow - 0x63, // 51: Down Arrow - 0x59, // 52: Up Arrow - 0x22, // 53: Num Lock - 0x23, // 54: KP / - 0x24, // 55: KP * - 0x3a, // 56: KP - - 0x4b, // 57: KP + - 0x67, // 58: KP Enter - 0x5a, // 59: KP 1 - 0x5b, // 5a: KP 2 - 0x5c, // 5b: KP 3 - 0x48, // 5c: KP 4 - 0x49, // 5d: KP 5 - 0x4a, // 5e: KP 6 - 0x37, // 5f: KP 7 - 0x38, // 60: KP 8 - 0x39, // 61: KP 9 - 0x65, // 62: KP 0 - 0x66, // 63: KP decimal - MISS, // 64: Europe 2 - 0x72, // 65: App (maps to middle mouse button) - MISS, // 66: Power - MISS, // 67: KP = - MISS, // 68: F13 - MISS, // 69: F14 - MISS, // 6a: F15 - 0x1f, // 6b: insert (for keyrah) - MISS, // 6c: F17 - MISS, // 6d: F18 - MISS, // 6e: F19 - MISS, // 6f: F20 -}; - -#endif diff --git a/menu.c b/menu.c index f742bdc..18bec9a 100644 --- a/menu.c +++ b/menu.c @@ -415,52 +415,42 @@ const uint8_t keycode_table[128] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static uint8_t GetASCIIKey(unsigned char keycode) +static uint8_t GetASCIIKey(uint32_t keycode) { - if (keycode & KEY_AMI_UPSTROKE) + if (keycode & UPSTROKE) return 0; - return keycode_table[keycode & 0x7F]; + return keycode_table[get_amiga_code(keycode & 0xFFFF) & 0x7F]; } /* the Atari core handles OSD keys competely inside the core */ -static unsigned char menu_key = 0; -static unsigned char menu_mod = 0; +static uint32_t menu_key = 0; -void menu_key_set(unsigned char c) +void menu_key_set(uint32_t c) { - //iprintf("OSD enqueue: %x\n", c); + //printf("OSD enqueue: %x\n", c); menu_key = c; } -void menu_mod_set(uint8_t m) -{ - menu_mod = m; -} - // get key status -static uint8_t menu_key_get(void) +static uint32_t menu_key_get(void) { - static unsigned char c2; + static uint32_t c2; static unsigned long delay; static unsigned long repeat; static unsigned char repeat2; - unsigned char c1, c; + uint32_t c1, c; c1 = menu_key; - - // OsdKeyGet permanently returns the last key event. - - // generate normal "key-pressed" event c = 0; if (c1 != c2) c = c1; c2 = c1; // inject a fake "MENU_KEY" if no menu is visible and the menu key is loaded - if (!user_io_osd_is_visible() && is_menu_core()) c = KEY_AMI_MENU; + if (!user_io_osd_is_visible() && is_menu_core()) c = KEY_F12; // generate repeat "key-pressed" events - if ((c1 & KEY_AMI_UPSTROKE) || (!c1)) + if ((c1 & UPSTROKE) || (!c1)) { repeat = GetTimer(REPEATDELAY); } @@ -475,10 +465,9 @@ static uint8_t menu_key_get(void) { static unsigned char last_but = 0; unsigned char but = user_io_menu_button(); - if (!but && last_but) c = KEY_AMI_MENU; + if (!but && last_but) c = KEY_F12; last_but = but; } - return(c); } @@ -486,7 +475,7 @@ void HandleUI(void) { char *p; char s[40]; - unsigned char i, c, m, up, down, select, menu, right, left, plus, minus; + unsigned char i, m, up, down, select, menu, right, left, plus, minus; uint8_t mod; unsigned long len; static hardfileTYPE t_hardfile[2]; // temporary copy of former hardfile configuration @@ -502,7 +491,7 @@ void HandleUI(void) char usb_id[64]; // get user control codes - c = menu_key_get(); + uint32_t c = menu_key_get(); // decode and set events menu = false; @@ -516,9 +505,9 @@ void HandleUI(void) switch (c) { - case KEY_AMI_MENU: + case KEY_F12: menu = true; - menu_key_set(KEY_AMI_MENU | KEY_AMI_UPSTROKE); + menu_key_set(KEY_F12 | UPSTROKE); break; // Within the menu the esc key acts as the menu key. problem: @@ -526,35 +515,35 @@ void HandleUI(void) // break code for the ESC key when the key is released will // reach the core which never saw the make code. Simple solution: // react on break code instead of make code - case KEY_AMI_ESC | KEY_AMI_UPSTROKE: + case KEY_ESC | UPSTROKE: if (menustate != MENU_NONE2) menu = true; break; - case KEY_AMI_ENTER: - case KEY_AMI_SPACE: + case KEY_ENTER: + case KEY_SPACE: select = true; break; - case KEY_AMI_UP: + case KEY_UP: up = true; break; - case KEY_AMI_DOWN: + case KEY_DOWN: down = true; break; - case KEY_AMI_LEFT: + case KEY_LEFT: left = true; break; - case KEY_AMI_RIGHT: + case KEY_RIGHT: right = true; break; - case KEY_AMI_KPPLUS: - case 0x0c: // =/+ + case KEY_KPPLUS: + case KEY_EQUAL: // =/+ plus = true; break; - case KEY_AMI_KPMINUS: - case 0x0b: // -/_ + case KEY_KPMINUS: + case KEY_MINUS: // -/_ minus = true; break; - +/* case 0x01: // 1: 1280x720 mode if (user_io_osd_is_visible) mist_cfg.video_mode = 0; break; @@ -562,6 +551,7 @@ void HandleUI(void) case 0x02: // 2: 1280x1024 mode if (user_io_osd_is_visible) mist_cfg.video_mode = 1; break; +*/ } if (menu || select || up || down || left || right) @@ -633,7 +623,7 @@ void HandleUI(void) case MENU_NONE2: if (menu) { - if (menu_mod & 0x44) //Alt+Menu + if (get_key_mod() & (LALT|RALT)) //Alt+Menu { OsdSetSize(16); SelectFile("RBF", 0, MENU_FIRMWARE_CORE_FILE_SELECTED, MENU_NONE1, 0); @@ -1832,7 +1822,7 @@ void HandleUI(void) else if (menusub == 11) menustate = MENU_NONE1; } - else if (c == KEY_AMI_BACK) // eject all floppies + else if (c == KEY_BACKSPACE) // eject all floppies { for (i = 0; i <= drives; i++) df[i].status = 0; @@ -1934,25 +1924,25 @@ void HandleUI(void) ScrollLongName(); // scrolls file name if longer than display line - if (c == KEY_AMI_HOME) + if (c == KEY_HOME) { ScanDirectory(SelectedPath, SCAN_INIT, fs_pFileExt, fs_Options); menustate = MENU_FILE_SELECT1; } - if (c == KEY_AMI_BACK) + if (c == KEY_BACKSPACE) { changeDir(".."); menustate = MENU_FILE_SELECT1; } - if ((c == KEY_AMI_PGUP) || (c == KEY_AMI_LEFT)) + if ((c == KEY_PAGEUP) || (c == KEY_LEFT)) { ScanDirectory(SelectedPath, SCAN_PREV_PAGE, fs_pFileExt, fs_Options); menustate = MENU_FILE_SELECT1; } - if ((c == KEY_AMI_PGDN) || (c == KEY_AMI_RIGHT)) + if ((c == KEY_PAGEDOWN) || (c == KEY_RIGHT)) { ScanDirectory(SelectedPath, SCAN_NEXT_PAGE, fs_pFileExt, fs_Options); menustate = MENU_FILE_SELECT1; diff --git a/menu.h b/menu.h index 0493542..0f2e36b 100644 --- a/menu.h +++ b/menu.h @@ -3,23 +3,6 @@ #include "fdd.h" // for adfTYPE definition -#define KEY_AMI_UPSTROKE 0x80 -#define KEY_AMI_MENU 0x69 -#define KEY_AMI_PGUP 0x6C -#define KEY_AMI_PGDN 0x6D -#define KEY_AMI_HOME 0x6A -#define KEY_AMI_ESC 0x45 -#define KEY_AMI_KPENTER 0x43 -#define KEY_AMI_ENTER 0x44 -#define KEY_AMI_BACK 0x41 -#define KEY_AMI_SPACE 0x40 -#define KEY_AMI_UP 0x4C -#define KEY_AMI_DOWN 0x4D -#define KEY_AMI_LEFT 0x4F -#define KEY_AMI_RIGHT 0x4E -#define KEY_AMI_KPPLUS 0x5E -#define KEY_AMI_KPMINUS 0x4A - // UI strings, used by boot messages extern const char *config_filter_msg[]; extern const char *config_memory_chip_msg[]; @@ -40,7 +23,7 @@ void ShowSplash(); void HideSplash(); void EjectAllFloppies(); -void menu_key_set(unsigned char c); -void menu_mod_set(uint8_t m); +void menu_key_set(uint32_t c); +void menu_mod_set(uint32_t m); #endif diff --git a/user_io.c b/user_io.c index dbe7bf2..70b76f3 100644 --- a/user_io.c +++ b/user_io.c @@ -10,7 +10,6 @@ #include "user_io.h" #include "archie.h" #include "debug.h" -#include "keycodes.h" #include "ikbd.h" #include "spi.h" #include "mist_cfg.h" @@ -334,28 +333,6 @@ void user_io_detect_core_type() } } -unsigned short usb2amiga(unsigned char k) -{ - // replace MENU key by RGUI to allow using Right Amiga on reduced keyboards - // (it also disables the use of Menu for OSD) - if (mist_cfg.key_menu_as_rgui && k == 0x65) - { - return 0x67; - } - return usb2ami[k]; -} - -unsigned short usb2ps2code(unsigned char k) -{ - // replace MENU key by RGUI e.g. to allow using RGUI on reduced keyboards without physical key - // (it also disables the use of Menu for OSD) - if (mist_cfg.key_menu_as_rgui && k == 0x65) - { - return EXT | 0x27; - } - return usb2ps2[k]; -} - void user_io_analog_joystick(unsigned char joystick, char valueX, char valueY) { if (core_type == CORE_TYPE_8BIT) @@ -816,6 +793,8 @@ void kbd_reply(char code) spi_uio_cmd8(UIO_KEYBOARD, code); } +static uint8_t use_ps2ctl = 0; + void user_io_poll() { if ((core_type != CORE_TYPE_MINIMIG2) && @@ -1214,7 +1193,6 @@ void user_io_poll() if (core_type == CORE_TYPE_ARCHIE) archie_poll(); - static uint8_t use_ps2ctl = 0; static uint8_t leds = 0; if(use_ps2ctl) { @@ -1316,12 +1294,36 @@ char user_io_user_button() return((!user_io_menu_button() && (fpga_get_buttons() & BUTTON_USR)) ? 1 : 0); } -static void send_keycode(unsigned short code) +static void send_keycode(unsigned short key, int press) { if (core_type == CORE_TYPE_MINIMIG2) { - // amiga has "break" marker in msb - if (code & BREAK) code = (code & 0xff) | 0x80; + if (press > 1) return; + + uint32_t code = get_amiga_code(key); + if (code == NONE) return; + + if (code & CAPS_TOGGLE) + { + if (press = 1) + { + // send alternating make and break codes for caps lock + if(caps_lock_toggle) code |= 0x80; + caps_lock_toggle = !caps_lock_toggle; + set_kbd_led(HID_LED_CAPS_LOCK, caps_lock_toggle); + } + else + { + return; + } + } + else + { + // amiga has "break" marker in msb + if (!press) code |= 0x80; + } + + code &= 0xff; // send immediately if possible if (CheckTimer(kbd_timer) && (kbd_fifo_w == kbd_fifo_r)) @@ -1332,63 +1334,103 @@ static void send_keycode(unsigned short code) { kbd_fifo_enqueue(code); } + return; } if (core_type == CORE_TYPE_MIST) { + if (press > 1) return; + + uint32_t code = get_atari_code(key); + if (code == NONE) return; + // atari has "break" marker in msb - if (code & BREAK) code = (code & 0xff) | 0x80; + if (!press) code = (code & 0xff) | 0x80; ikbd_keyboard(code); + return; } if (core_type == CORE_TYPE_8BIT) { - // send ps2 keycodes for those cores that prefer ps2 - spi_uio_cmd_cont(UIO_KEYBOARD); + uint32_t code = get_ps2_code(key); + if (code == NONE) return; - // "pause" has a complex code - if ((code & 0xff) == 0x77) + //pause + if ((code & 0xff) == 0xE1) { // pause does not have a break code - if (!(code & BREAK)) + if (press != 1) { // Pause key sends E11477E1F014E077 - static const unsigned char c[] = { - 0xe1, 0x14, 0x77, 0xe1, 0xf0, 0x14, 0xf0, 0x77, 0x00 }; + static const unsigned char c[] = { 0xe1, 0x14, 0x77, 0xe1, 0xf0, 0x14, 0xf0, 0x77, 0x00 }; const unsigned char *p = c; - iprintf("PS2 KBD "); + spi_uio_cmd_cont(UIO_KEYBOARD); + + printf("PS2 PAUSE CODE: "); while (*p) { - iprintf("%x ", *p); + printf("%x ", *p); spi8(*p++); } - iprintf("\n"); + printf("\n"); + + DisableIO(); + } + } + // print screen + else if ((code & 0xff) == 0xE2) + { + if (press <= 1) + { + static const unsigned char c[2][8] = { + { 0xE0, 0xF0, 0x7C, 0xE0, 0xF0, 0x12, 0x00, 0x00 }, + { 0xE0, 0x12, 0xE0, 0x7C, 0x00, 0x00, 0x00, 0x00 } + }; + + const unsigned char *p = c[press]; + + spi_uio_cmd_cont(UIO_KEYBOARD); + + printf("PS2 PRINT CODE: "); + while (*p) + { + printf("%x ", *p); + spi8(*p++); + } + printf("\n"); + + DisableIO(); } } else { - /* - iprintf("PS2 KBD "); - if (code & EXT) iprintf("e0 "); - if (code & BREAK) iprintf("f0 "); - iprintf("%x\n", code & 0xff); - */ + if (press > 1 && !use_ps2ctl) return; + + spi_uio_cmd_cont(UIO_KEYBOARD); // prepend extended code flag if required if (code & EXT) spi8(0xe0); // prepend break code if required - if (code & BREAK) spi8(0xf0); + if (!press) spi8(0xf0); // send code itself spi8(code & 0xff); - } - DisableIO(); + DisableIO(); + } } - if (core_type == CORE_TYPE_ARCHIE) archie_kbd(code); + if (core_type == CORE_TYPE_ARCHIE) + { + if (press > 1) return; + + uint32_t code = get_archie_code(key); + if (code == NONE) return; + + archie_kbd(code); + } } void user_io_mouse(unsigned char b, int16_t x, int16_t y) @@ -1423,19 +1465,6 @@ LCTRL LSHIFT LALT LGUI RCTRL RSHIFT RALT RGUI #define EMU_BTN3 (2+(keyrah*4)) // left alt #define EMU_BTN4 (3+(keyrah*4)) // left gui (usually windows key) -unsigned short keycode(unsigned char in) -{ - if (core_type == CORE_TYPE_MINIMIG2) return usb2amiga(in); - - // atari st and the 8 bit core (currently only used for atari 800) - // use the same key codes - if (core_type == CORE_TYPE_MIST) return usb2atari[in]; - if (core_type == CORE_TYPE_ARCHIE) return usb2archie[in]; - if (core_type == CORE_TYPE_8BIT) return usb2ps2code(in); - - return MISS; -} - extern configTYPE config; void user_io_check_reset(unsigned short modifiers, char useKeys) @@ -1473,58 +1502,19 @@ void user_io_check_reset(unsigned short modifiers, char useKeys) } } -unsigned short modifier_keycode(unsigned char index) -{ - /* usb modifer bits: - 0 1 2 3 4 5 6 7 - LCTRL LSHIFT LALT LGUI RCTRL RSHIFT RALT RGUI - */ - - if (core_type == CORE_TYPE_MINIMIG2) - { - static const unsigned short amiga_modifier[] = { 0x63, 0x60, 0x64, 0x66, 0x63, 0x61, 0x65, 0x67 }; - return amiga_modifier[index]; - } - - if (core_type == CORE_TYPE_MIST) - { - static const unsigned short atari_modifier[] = { 0x1d, 0x2a, 0x38, MISS, 0x1d, 0x36, 0x38, MISS }; - return atari_modifier[index]; - } - - if (core_type == CORE_TYPE_8BIT) - { - static const unsigned short ps2_modifier[] = { 0x14, 0x12, 0x11, EXT | 0x1f, EXT | 0x14, 0x59, EXT | 0x11, EXT | 0x27 }; - return ps2_modifier[index]; - } - - if (core_type == CORE_TYPE_ARCHIE) - { - static const unsigned short archie_modifier[] = { 0x36, 0x4c, 0x5e, MISS, 0x61, 0x58, 0x60, MISS }; - return archie_modifier[index]; - } - - return MISS; -} - void user_io_osd_key_enable(char on) { iprintf("OSD is now %s\n", on ? "visible" : "invisible"); osd_is_visible = on; } -static char key_used_by_osd(unsigned short s) +static char key_used_by_osd(uint32_t s) { // this key is only used to open the OSD and has no keycode - if ((s & OSD_OPEN) && !(s & 0xff)) return true; + if (s & OSD_OPEN) return 1; // no keys are suppressed if the OSD is inactive - if (!osd_is_visible) return false; - - // in atari mode eat all keys if the OSD is online, - // else none as it's up to the core to forward keys - // to the OSD - return((core_type == CORE_TYPE_MIST) || (core_type == CORE_TYPE_ARCHIE) || (core_type == CORE_TYPE_8BIT)); + return osd_is_visible; } void user_io_kbd(uint16_t key, int press) @@ -1534,105 +1524,37 @@ void user_io_kbd(uint16_t key, int press) (core_type == CORE_TYPE_ARCHIE) || (core_type == CORE_TYPE_8BIT)) { - uint8_t m = key >> 8; - uint8_t k = key & 0xFF; - - static unsigned char modifier = 0; - - // handle modifier keys - if (m != modifier) + if (key) { - for (int i = 0; i<8; i++) - { - uint16_t code = modifier_keycode(i); - - // Do we have a downstroke on a modifier key? - if ((m & (1 << i)) && !(modifier & (1 << i))) - { - if (code != MISS) - { - if (is_menu_core()) printf("keycode(make)%s for core: %d(0x%X)\n", (code & EXT) ? "(ext)" : "", code & 255, code & 255); - if(!osd_is_visible) send_keycode(code); - } - } - - if (!(m & (1 << i)) && (modifier & (1 << i))) - { - if (code != MISS) - { - if (is_menu_core()) printf("keycode(break)%s for core: %d(0x%X)\n", (code & EXT) ? "(ext)" : "", code & 255, code & 255); - if (!osd_is_visible) send_keycode(BREAK | code); - } - } - } - - modifier = m; - } - - // check if there are keys in the pressed list which aren't - // reported anymore - if (k) - { - uint16_t code = keycode(k); + uint32_t code = get_ps2_code(key); if (!press) { - if (is_menu_core()) printf("keycode(break)%s for core: %d(0x%X)\n", (code & EXT) ? "(ext)" : "", code & 255, code & 255); + if (is_menu_core()) printf("PS2 code(break)%s for core: %d(0x%X)\n", (code & EXT) ? "(ext)" : "", code & 255, code & 255); - if (code != MISS) + if (code & OSD_OPEN) menu_key_set(UPSTROKE | KEY_F12); + else if (osd_is_visible) menu_key_set(UPSTROKE | key); + else { - if (code & OSD_OPEN) - { - menu_key_set(KEY_AMI_UPSTROKE | KEY_AMI_MENU); - } - else - { - // special OSD key handled internally - if (osd_is_visible) menu_key_set(KEY_AMI_UPSTROKE | usb2amiga(k)); - } - - if (!key_used_by_osd(code) && !(code & CAPS_LOCK_TOGGLE) && !(code & NUM_LOCK_TOGGLE)) - { - send_keycode(BREAK | code); - } + send_keycode(key, press); } } else { - if (is_menu_core()) printf("keycode(make)%s for core: %d(0x%X)\n", (code & EXT) ? "(ext)" : "", code & 255, code & 255); + if (is_menu_core()) printf("PS2 code(make)%s for core: %d(0x%X)\n", (code & EXT) ? "(ext)" : "", code & 255, code & 255); - if ((k <= KEYCODE_MAX) && code != MISS) + if (code & OSD_OPEN) { - // If OSD is visible, then all keys are sent into the OSD - // using Amiga key codes since the OSD itself uses Amiga key codes - // for historical reasons. If the OSD is invisble then only - // those keys marked for OSD in the core specific table are - // sent for OSD handling. - if (code & OSD_OPEN) + if (press == 1) menu_key_set(KEY_F12); + } + else if (osd_is_visible) + { + if (press == 1) menu_key_set(key); + } + else + { + if ((code & EMU_SWITCH_1) || ((code & EMU_SWITCH_2) && !use_ps2ctl)) { - menu_key_set(KEY_AMI_MENU); - } - else - { - // special OSD key handled internally - if (osd_is_visible) - { - menu_key_set(usb2amiga(k)); - } - } - - // no further processing of any key that is currently - // redirected to the OSD - if (!key_used_by_osd(code)) - { - if (code & CAPS_LOCK_TOGGLE) - { - // send alternating make and break codes for caps lock - send_keycode((code & 0xff) | (caps_lock_toggle ? BREAK : 0)); - caps_lock_toggle = !caps_lock_toggle; - - set_kbd_led(HID_LED_CAPS_LOCK, caps_lock_toggle); - } - else if (code & NUM_LOCK_TOGGLE) + if (press == 1) { // num lock has four states indicated by leds: // all off: normal @@ -1640,7 +1562,7 @@ void user_io_kbd(uint16_t key, int press) // num lock on, scroll lock off: joy0 emu // num lock off, scroll lock on: joy1 emu - switch (code ^ NUM_LOCK_TOGGLE) + switch (code & 0xff) { case 1: if (!joy_force) emu_mode = EMU_MOUSE; @@ -1670,10 +1592,10 @@ void user_io_kbd(uint16_t key, int press) if (emu_mode == EMU_MOUSE || emu_mode == EMU_JOY1) set_kbd_led(HID_LED_SCROLL_LOCK, true); else set_kbd_led(HID_LED_SCROLL_LOCK, false); } - else - { - send_keycode((press == 2) ? code & ~EXT : code); - } + } + else + { + send_keycode(key, press); } } }