From 33aa7393a13e6969ed4f13342007f49fd22547e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aitor=20G=C3=B3mez?= Date: Fri, 18 Feb 2022 17:24:54 +0100 Subject: [PATCH] Keyboard scancode set switching and set 1 support (#546) This improvement allows the use of set 1 of keyboard scancodes, as well as the possibility of changing from one to another from the OS. Both core ao486 and new cores based on set 1 will benefit from this feature. Thank you @naeloob for your cooperation and support in developing this feature. --- input.cpp | 264 +++++++++++++++++++++++++++++++++++++++++++++++++++- input.h | 1 + main.cpp | 1 + user_io.cpp | 107 ++++++++++++++------- 4 files changed, 338 insertions(+), 35 deletions(-) diff --git a/input.cpp b/input.cpp index f8d0de0..44cb648 100644 --- a/input.cpp +++ b/input.cpp @@ -556,6 +556,266 @@ static const int ev2ps2[] = NONE //255 ??? }; +static const int ev2ps2_set1[] = +{ + NONE, //0 KEY_RESERVED + 0x01, //1 KEY_ESC + 0x02, //2 KEY_1 + 0x03, //3 KEY_2 + 0x04, //4 KEY_3 + 0x05, //5 KEY_4 + 0x06, //6 KEY_5 + 0x07, //7 KEY_6 + 0x08, //8 KEY_7 + 0x09, //9 KEY_8 + 0x0a, //10 KEY_9 + 0x0b, //11 KEY_0 + 0x0c, //12 KEY_MINUS + 0x0d, //13 KEY_EQUAL + 0x0e, //14 KEY_BACKSPACE + 0x0f, //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 + 0x1c, //28 KEY_ENTER + LCTRL | 0x1d, //29 KEY_LEFTCTRL + 0x1e, //30 KEY_A + 0x1f, //31 KEY_S + 0x20, //32 KEY_D + 0x21, //33 KEY_F + 0x22, //34 KEY_G + 0x23, //35 KEY_H + 0x24, //36 KEY_J + 0x25, //37 KEY_K + 0x26, //38 KEY_L + 0x27, //39 KEY_SEMICOLON ; + 0x28, //40 KEY_APOSTROPHE + 0x29, //41 KEY_GRAVE + LSHIFT | 0x2a, //42 KEY_LEFTSHIFT + 0x2b, //43 KEY_BACKSLASH + 0x2c, //44 KEY_Z + 0x2d, //45 KEY_X + 0x2e, //46 KEY_C + 0x2f, //47 KEY_V + 0x30, //48 KEY_B + 0x31, //49 KEY_N + 0x32, //50 KEY_M + 0x33, //51 KEY_COMMA + 0x34, //52 KEY_DOT + 0x35, //53 KEY_SLASH + RSHIFT | 0x36, //54 KEY_RIGHTSHIFT + 0x37, //55 KEY_KPASTERISK + LALT | 0x38, //56 KEY_LEFTALT + 0x39, //57 KEY_SPACE + 0x3a, //58 KEY_CAPSLOCK + 0x3b, //59 KEY_F1 + 0x3c, //60 KEY_F2 + 0x3d, //61 KEY_F3 + 0x3e, //62 KEY_F4 + 0x3f, //63 KEY_F5 + 0x40, //64 KEY_F6 + 0x41, //65 KEY_F7 + 0x42, //66 KEY_F8 + 0x43, //67 KEY_F9 + 0x44, //68 KEY_F10 + EMU_SWITCH_2 | 0x45, //69 KEY_NUMLOCK + EMU_SWITCH_1 | 0x46, //70 KEY_SCROLLLOCK + 0x47, //71 KEY_KP7 + 0x48, //72 KEY_KP8 + 0x49, //73 KEY_KP9 + 0x4a, //74 KEY_KPMINUS + 0x4b, //75 KEY_KP4 + 0x4c, //76 KEY_KP5 + 0x4d, //77 KEY_KP6 + 0x4e, //78 KEY_KPPLUS + 0x4f, //79 KEY_KP1 + 0x50, //80 KEY_KP2 + 0x51, //81 KEY_KP3 + 0x52, //82 KEY_KP0 + 0x53, //83 KEY_KPDOT + NONE, //84 ??? + NONE, //85 KEY_ZENKAKU + 0x56, //86 KEY_102ND + 0x57, //87 KEY_F11 + 0x58, //88 KEY_F12 + NONE, //89 KEY_RO + NONE, //90 KEY_KATAKANA + NONE, //91 KEY_HIRAGANA + NONE, //92 KEY_HENKAN + NONE, //93 KEY_KATAKANA + NONE, //94 KEY_MUHENKAN + NONE, //95 KEY_KPJPCOMMA + EXT | 0x1c, //96 KEY_KPENTER + RCTRL | EXT | 0x1d, //97 KEY_RIGHTCTRL + EXT | 0x35, //98 KEY_KPSLASH + 0xE2, //99 KEY_SYSRQ + RALT | EXT | 0x38, //100 KEY_RIGHTALT + NONE, //101 KEY_LINEFEED + EXT | 0x47, //102 KEY_HOME + EXT | 0x48, //103 KEY_UP + EXT | 0x49, //104 KEY_PAGEUP + EXT | 0x4b, //105 KEY_LEFT + EXT | 0x4d, //106 KEY_RIGHT + EXT | 0x4f, //107 KEY_END + EXT | 0x50, //108 KEY_DOWN + EXT | 0x51, //109 KEY_PAGEDOWN + EXT | 0x52, //110 KEY_INSERT + EXT | 0x53, //111 KEY_DELETE + NONE, //112 KEY_MACRO + NONE, //113 KEY_MUTE + NONE, //114 KEY_VOLUMEDOWN + NONE, //115 KEY_VOLUMEUP + NONE, //116 KEY_POWER + NONE, //117 KEY_KPEQUAL + NONE, //118 KEY_KPPLUSMINUS + 0xE1, //119 KEY_PAUSE + NONE, //120 KEY_SCALE + NONE, //121 KEY_KPCOMMA + NONE, //122 KEY_HANGEUL + NONE, //123 KEY_HANJA + NONE, //124 KEY_YEN + LGUI | EXT | 0x5B, //125 KEY_LEFTMETA + RGUI | EXT | 0x5C, //126 KEY_RIGHTMETA + NONE, //127 KEY_COMPOSE + NONE, //128 KEY_STOP + NONE, //129 KEY_AGAIN + NONE, //130 KEY_PROPS + NONE, //131 KEY_UNDO + NONE, //132 KEY_FRONT + NONE, //133 KEY_COPY + NONE, //134 KEY_OPEN + NONE, //135 KEY_PASTE + NONE, //136 KEY_FIND + NONE, //137 KEY_CUT + NONE, //138 KEY_HELP + NONE, //139 KEY_MENU + NONE, //140 KEY_CALC + NONE, //141 KEY_SETUP + NONE, //142 KEY_SLEEP + NONE, //143 KEY_WAKEUP + NONE, //144 KEY_FILE + NONE, //145 KEY_SENDFILE + NONE, //146 KEY_DELETEFILE + NONE, //147 KEY_XFER + NONE, //148 KEY_PROG1 + NONE, //149 KEY_PROG2 + NONE, //150 KEY_WWW + NONE, //151 KEY_MSDOS + NONE, //152 KEY_SCREENLOCK + NONE, //153 KEY_DIRECTION + NONE, //154 KEY_CYCLEWINDOWS + NONE, //155 KEY_MAIL + NONE, //156 KEY_BOOKMARKS + NONE, //157 KEY_COMPUTER + NONE, //158 KEY_BACK + NONE, //159 KEY_FORWARD + NONE, //160 KEY_CLOSECD + NONE, //161 KEY_EJECTCD + NONE, //162 KEY_EJECTCLOSECD + NONE, //163 KEY_NEXTSONG + NONE, //164 KEY_PLAYPAUSE + NONE, //165 KEY_PREVIOUSSONG + NONE, //166 KEY_STOPCD + NONE, //167 KEY_RECORD + NONE, //168 KEY_REWIND + NONE, //169 KEY_PHONE + NONE, //170 KEY_ISO + NONE, //171 KEY_CONFIG + NONE, //172 KEY_HOMEPAGE + NONE, //173 KEY_REFRESH + NONE, //174 KEY_EXIT + NONE, //175 KEY_MOVE + NONE, //176 KEY_EDIT + NONE, //177 KEY_SCROLLUP + NONE, //178 KEY_SCROLLDOWN + NONE, //179 KEY_KPLEFTPAREN + NONE, //180 KEY_KPRIGHTPAREN + NONE, //181 KEY_NEW + NONE, //182 KEY_REDO + NONE, //183 KEY_F13 + NONE, //184 KEY_F14 + NONE, //185 KEY_F15 + NONE, //186 KEY_F16 + 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 + 0x2B, //194 U-mlaut on DE mapped to backslash + NONE, //195 ??? + NONE, //196 ??? + NONE, //197 ??? + NONE, //198 ??? + NONE, //199 ??? + NONE, //200 KEY_PLAYCD + NONE, //201 KEY_PAUSECD + NONE, //202 KEY_PROG3 + NONE, //203 KEY_PROG4 + NONE, //204 KEY_DASHBOARD + NONE, //205 KEY_SUSPEND + NONE, //206 KEY_CLOSE + NONE, //207 KEY_PLAY + NONE, //208 KEY_FASTFORWARD + NONE, //209 KEY_BASSBOOST + NONE, //210 KEY_PRINT + NONE, //211 KEY_HP + NONE, //212 KEY_CAMERA + NONE, //213 KEY_SOUND + NONE, //214 KEY_QUESTION + NONE, //215 KEY_EMAIL + NONE, //216 KEY_CHAT + NONE, //217 KEY_SEARCH + NONE, //218 KEY_CONNECT + NONE, //219 KEY_FINANCE + NONE, //220 KEY_SPORT + NONE, //221 KEY_SHOP + NONE, //222 KEY_ALTERASE + NONE, //223 KEY_CANCEL + NONE, //224 KEY_BRIGHT_DOWN + NONE, //225 KEY_BRIGHT_UP + NONE, //226 KEY_MEDIA + NONE, //227 KEY_SWITCHVIDEO + NONE, //228 KEY_DILLUMTOGGLE + NONE, //229 KEY_DILLUMDOWN + NONE, //230 KEY_DILLUMUP + NONE, //231 KEY_SEND + NONE, //232 KEY_REPLY + NONE, //233 KEY_FORWARDMAIL + NONE, //234 KEY_SAVE + NONE, //235 KEY_DOCUMENTS + NONE, //236 KEY_BATTERY + NONE, //237 KEY_BLUETOOTH + NONE, //238 KEY_WLAN + NONE, //239 KEY_UWB + NONE, //240 KEY_UNKNOWN + NONE, //241 KEY_VIDEO_NEXT + NONE, //242 KEY_VIDEO_PREV + NONE, //243 KEY_BRIGHT_CYCLE + NONE, //244 KEY_BRIGHT_AUTO + NONE, //245 KEY_DISPLAY_OFF + NONE, //246 KEY_WWAN + NONE, //247 KEY_RFKILL + NONE, //248 KEY_MICMUTE + NONE, //249 ??? + NONE, //250 ??? + NONE, //251 ??? + NONE, //252 ??? + NONE, //253 ??? + NONE, //254 ??? + NONE //255 ??? +}; + static int ev2archie[] = { NONE, //0 KEY_RESERVED @@ -818,8 +1078,8 @@ static int ev2archie[] = uint32_t get_ps2_code(uint16_t key) { - if (key > 255) return NONE; - return ev2ps2[key]; + if (key > 255) return NONE; + return (ps2_kbd_scan_set == 1) ? ev2ps2_set1[key] : ev2ps2[key]; } uint32_t get_amiga_code(uint16_t key) diff --git a/input.h b/input.h index 3286aac..d5dfbd0 100644 --- a/input.h +++ b/input.h @@ -107,6 +107,7 @@ void input_uinp_destroy(); extern char joy_bnames[NUMBUTTONS][32]; extern int joy_bcount; +extern uint8_t ps2_kbd_scan_set; void parse_buttons(); char *get_buttons(int type = 0); diff --git a/main.cpp b/main.cpp index f9109d2..bcb26dd 100644 --- a/main.cpp +++ b/main.cpp @@ -34,6 +34,7 @@ along with this program. If not, see . #include "osd.h" const char *version = "$VER:" VDATE; +uint8_t ps2_kbd_scan_set = 2; int main(int argc, char *argv[]) { diff --git a/user_io.cpp b/user_io.cpp index 20e6727..ed1b4d2 100644 --- a/user_io.cpp +++ b/user_io.cpp @@ -2897,6 +2897,8 @@ void user_io_poll() if (core_type == CORE_TYPE_SHARPMZ) sharpmz_poll(); static uint8_t leds = 0; + static uint8_t ps2_scancode_f0 = 0; + if(use_ps2ctl && !is_minimig() && !is_archie()) { leds |= (KBD_LED_FLAG_STATUS | KBD_LED_CAPS_CONTROL); @@ -2907,44 +2909,73 @@ void user_io_poll() if (ps2ctl & 1) { static uint8_t cmd = 0; - static uint8_t byte = 0; + static uint8_t byte = 0; printf("kbd_ctl = 0x%02X\n", kbd_ctl); if (!byte) { cmd = kbd_ctl; - switch (cmd) - { - case 0xff: - kbd_reply(0xFA); - kbd_reply(0xAA); - break; + + if (ps2_scancode_f0 == 0) + { + switch (cmd) + { + case 0xff: + ps2_kbd_scan_set = 2; + kbd_reply(0xFA); + kbd_reply(0xAA); + break; - case 0xf2: - kbd_reply(0xFA); - kbd_reply(0xAB); - kbd_reply(0x83); - break; + case 0xf2: + kbd_reply(0xFA); + kbd_reply(0xAB); + kbd_reply(0x83); + break; + case 0xF0: // scan get/set + kbd_reply(0xFA); + ps2_scancode_f0 = 1; + break; + + case 0xF6: // set default parameters + kbd_reply(0xFA); + ps2_kbd_scan_set = 2; + break; - case 0xf4: - case 0xf5: - case 0xfa: - kbd_reply(0xFA); - break; + case 0xf4: + case 0xf5: + case 0xfa: + kbd_reply(0xFA); + break; - case 0xed: - kbd_reply(0xFA); - byte++; - break; + case 0xed: + kbd_reply(0xFA); + byte++; + break; - case 0xee: - kbd_reply(0xEE); - break; + case 0xee: + kbd_reply(0xEE); + break; + + default: + kbd_reply(0xFE); + break; + } + } + + else + { + if (cmd<=3) { + kbd_reply(0xFA); + if (!cmd) // get + kbd_reply(ps2_kbd_scan_set); + else // set + ps2_kbd_scan_set = cmd; + ps2_scancode_f0 = 0; + } else { + kbd_reply(0xFE); // RESEND + } + } - default: - kbd_reply(0xFE); - break; - } } else { @@ -3245,7 +3276,8 @@ static void send_keycode(unsigned short key, int press) { // Pause key sends E11477E1F014E077 static const unsigned char c[] = { 0xe1, 0x14, 0x77, 0xe1, 0xf0, 0x14, 0xf0, 0x77, 0x00 }; - const unsigned char *p = c; + static const unsigned char c_set1[] = { 0xe1, 0x1d, 0x45, 0xe1, 0x9d, 0xc5, 0x00 }; + const unsigned char *p = (ps2_kbd_scan_set == 1) ? c_set1 : c; spi_uio_cmd_cont(UIO_KEYBOARD); @@ -3269,8 +3301,12 @@ static void send_keycode(unsigned short key, int press) { 0xE0, 0xF0, 0x7C, 0xE0, 0xF0, 0x12, 0x00, 0x00 }, { 0xE0, 0x12, 0xE0, 0x7C, 0x00, 0x00, 0x00, 0x00 } }; - - const unsigned char *p = c[press]; + static const unsigned char c_set1[2][8] = { + { 0xE0, 0xB7, 0xE0, 0xAA, 0x00, 0x00, 0x00, 0x00 }, + { 0xE0, 0x2A, 0xE0, 0x37, 0x00, 0x00, 0x00, 0x00 } + }; + + const unsigned char *p = (ps2_kbd_scan_set == 1) ? c_set1[press] : c[press]; spi_uio_cmd_cont(UIO_KEYBOARD); @@ -3295,8 +3331,13 @@ static void send_keycode(unsigned short key, int press) if (code & EXT) spi8(0xe0); // prepend break code if required - if (!press) spi8(0xf0); - + if (!press) + { + if (ps2_kbd_scan_set == 1) + code |= 0x80; + else + spi8(0xf0); + } // send code itself spi8(code & 0xff);