mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
377 lines
5.7 KiB
377 lines
5.7 KiB
#include "class_hid_keyboard.h"
|
|
|
|
#define ESC 0x1B
|
|
/**
|
|
* scan codes sourced from https://deskthority.net/wiki/Scancode
|
|
*
|
|
*/
|
|
char scancodes_shift_table[128] = {
|
|
0x00, /*Reserved*/
|
|
0x00, /*Reserved*/
|
|
0x00, /*Reserved*/
|
|
0x00, /*Reserved*/
|
|
|
|
/* 0x04 */
|
|
'A',
|
|
'B',
|
|
'C',
|
|
'D',
|
|
'E',
|
|
'F',
|
|
'G',
|
|
'H',
|
|
|
|
/* 0x0C */
|
|
'I',
|
|
'J',
|
|
'K',
|
|
'L',
|
|
'M',
|
|
'N',
|
|
'O',
|
|
'P',
|
|
|
|
/* 0X14 */
|
|
'Q',
|
|
'R',
|
|
'S',
|
|
'T',
|
|
'U',
|
|
'V',
|
|
'W',
|
|
'X',
|
|
|
|
/* 0X1C */
|
|
'Y',
|
|
'Z',
|
|
'!',
|
|
'@',
|
|
'#',
|
|
'$',
|
|
'%',
|
|
'^',
|
|
|
|
/* 0x24 */
|
|
'&',
|
|
'*',
|
|
'(',
|
|
')',
|
|
'\r',
|
|
ESC,
|
|
'\b',
|
|
'\t',
|
|
|
|
/* 0x2C */
|
|
' ',
|
|
'_',
|
|
'+',
|
|
'{',
|
|
'}',
|
|
'|',
|
|
'~',
|
|
':',
|
|
|
|
/* 0x34 */
|
|
'"',
|
|
'~',
|
|
'<',
|
|
'>',
|
|
'?',
|
|
0x00 /*CAPSLOCK*/,
|
|
0x00 /* F1 */,
|
|
0x00 /* F2 */,
|
|
|
|
/* 0x3C */
|
|
0x00 /* F3 */,
|
|
0x00 /* F4 */,
|
|
0x00 /* F5 */,
|
|
0x00 /* F6 */,
|
|
0x00 /* F7 */,
|
|
0x00 /* F8 */,
|
|
0x00 /* F9 */,
|
|
0x00 /* F10 */,
|
|
|
|
/* 0x44 */
|
|
0x00 /* F11 */,
|
|
0x00 /* F12 */,
|
|
0x00 /* PRINTSCREEN */,
|
|
0x00 /* SCROLLLOCK */,
|
|
0x00 /* PAUSE */,
|
|
0x00 /* INSERT */,
|
|
0x00 /* HOME */,
|
|
0x00 /* PAGEUP */,
|
|
|
|
/* 0x4C */
|
|
0x00 /* DELETE */,
|
|
0x00 /* END */,
|
|
0x00 /* PAGEDOWN */,
|
|
0x00 /* RIGHT */,
|
|
0x00 /* LEFT */,
|
|
0x00 /* DOWN */,
|
|
0x00 /* UP */,
|
|
0x00 /* NUMLOCK */,
|
|
|
|
/* 0x54 */
|
|
'/' /* KP / */,
|
|
'*' /* KP * */,
|
|
'-' /* KP - */,
|
|
'+' /* KP + */,
|
|
'\r' /* KP ENTER */,
|
|
'1' /* KP 1 */,
|
|
'2' /* KP 2 */,
|
|
'3' /* KP 3 */,
|
|
|
|
/* 0x5C */
|
|
'4' /* KP 4 */,
|
|
'5' /* KP 5 */,
|
|
'6' /* KP 6 */,
|
|
'7' /* KP 7 */,
|
|
'8' /* KP 8 */,
|
|
'9' /* KP 9 */,
|
|
'0' /* KP 0 */,
|
|
'.' /* KP . */,
|
|
|
|
/* 0x64 */
|
|
'\\',
|
|
0x00 /* MENU */,
|
|
0x00 /* POWER */,
|
|
'=' /* KP = */,
|
|
0x00 /* F13 */,
|
|
0x00 /* F14 */,
|
|
0x00 /* F15 */,
|
|
0x00 /* F16 */,
|
|
|
|
/* 0x6C */
|
|
0x00 /* F17 */,
|
|
0x00 /* F18 */,
|
|
0x00 /* F19 */,
|
|
0x00 /* F20 */,
|
|
0x00 /* F21 */,
|
|
0x00 /* F22 */,
|
|
0x00 /* F23 */,
|
|
0x00 /* F24 */,
|
|
|
|
/* 0x74 */
|
|
0x00 /* EXECUTE */,
|
|
0x00 /* HELP */,
|
|
0x00 /* MENU */,
|
|
0x00 /* SELECT */,
|
|
0x00 /* STOP */,
|
|
0x00 /* AGAIN */,
|
|
0x00 /* UNDO */,
|
|
0x00 /* CUT */,
|
|
|
|
/* 0x7C */
|
|
0x00 /* COPY */,
|
|
0x00 /* PASTE */,
|
|
0x00 /* FIND */,
|
|
0x00 /* MUTE */,
|
|
};
|
|
|
|
char scancodes_table[128] = {
|
|
0x00, /*Reserved*/
|
|
0x00, /*Reserved*/
|
|
0x00, /*Reserved*/
|
|
0x00, /*Reserved*/
|
|
|
|
/* 0x04 */
|
|
'a',
|
|
'b',
|
|
'c',
|
|
'd',
|
|
'e',
|
|
'f',
|
|
'g',
|
|
'h',
|
|
|
|
/* 0x0C */
|
|
'i',
|
|
'j',
|
|
'k',
|
|
'l',
|
|
'm',
|
|
'n',
|
|
'o',
|
|
'p',
|
|
|
|
/* 0x14 */
|
|
'q',
|
|
'r',
|
|
's',
|
|
't',
|
|
'u',
|
|
'v',
|
|
'w',
|
|
'x',
|
|
|
|
/* 0x1C */
|
|
'y',
|
|
'z',
|
|
'1',
|
|
'2',
|
|
'3',
|
|
'4',
|
|
'5',
|
|
'6',
|
|
|
|
/* 0x24 */
|
|
'7',
|
|
'8',
|
|
'9',
|
|
'0',
|
|
'\r',
|
|
ESC,
|
|
'\b',
|
|
'\t',
|
|
|
|
/* 0x2C */
|
|
' ',
|
|
'-',
|
|
'=',
|
|
'[',
|
|
']',
|
|
'\\',
|
|
'#',
|
|
';',
|
|
|
|
/* 0x34 */
|
|
'\'',
|
|
'`',
|
|
',',
|
|
'.',
|
|
'/',
|
|
|
|
/* 0x39 */
|
|
0x00 /*CAPSLOCK*/,
|
|
0x00 /* F1 */,
|
|
0x00 /* F2 */,
|
|
|
|
/* 0x3C */
|
|
0x00 /* F3 */,
|
|
0x00 /* F4 */,
|
|
0x00 /* F5 */,
|
|
0x00 /* F6 */,
|
|
0x00 /* F7 */,
|
|
0x00 /* F8 */,
|
|
0x00 /* F9 */,
|
|
0x00 /* F10 */,
|
|
|
|
/* 0x44 */
|
|
0x00 /* F11 */,
|
|
0x00 /* F12 */,
|
|
0x00 /* PRINTSCREEN */,
|
|
0x00 /* SCROLLLOCK */,
|
|
0x00 /* PAUSE */,
|
|
0x00 /* INSERT */,
|
|
0x00 /* HOME */,
|
|
0x00 /* PAGEUP */,
|
|
|
|
/* 0x4C */
|
|
0x00 /* DELETE */,
|
|
0x00 /* END */,
|
|
0x00 /* PAGEDOWN */,
|
|
0x00 /* RIGHT */,
|
|
0x00 /* LEFT */,
|
|
0x00 /* DOWN */,
|
|
0x00 /* UP */,
|
|
0x00 /* NUMLOCK */,
|
|
|
|
/* 0x54 */
|
|
'/' /* KP / */,
|
|
'*' /* KP * */,
|
|
'-' /* KP - */,
|
|
'+' /* KP + */,
|
|
'\r' /* KP ENTER */,
|
|
'1' /* KP 1 */,
|
|
'2' /* KP 2 */,
|
|
'3' /* KP 3 */,
|
|
|
|
/* 0x5C */
|
|
'4' /* KP 4 */,
|
|
'5' /* KP 5 */,
|
|
'6' /* KP 6 */,
|
|
'7' /* KP 7 */,
|
|
'8' /* KP 8 */,
|
|
'9' /* KP 9 */,
|
|
'0' /* KP 0 */,
|
|
'.' /* KP . */,
|
|
|
|
/* 0x64 */
|
|
'\\',
|
|
0x00 /* MENU */,
|
|
0x00 /* POWER */,
|
|
'=' /* KP = */,
|
|
0x00 /* F13 */,
|
|
0x00 /* F14 */,
|
|
0x00 /* F15 */,
|
|
0x00 /* F16 */,
|
|
|
|
/* 0x6C */
|
|
0x00 /* F17 */,
|
|
0x00 /* F18 */,
|
|
0x00 /* F19 */,
|
|
0x00 /* F20 */,
|
|
0x00 /* F21 */,
|
|
0x00 /* F22 */,
|
|
0x00 /* F23 */,
|
|
0x00 /* F24 */,
|
|
|
|
/* 0x74 */
|
|
0x00 /* EXECUTE */,
|
|
0x00 /* HELP */,
|
|
0x00 /* MENU */,
|
|
0x00 /* SELECT */,
|
|
0x00 /* STOP */,
|
|
0x00 /* AGAIN */,
|
|
0x00 /* UNDO */,
|
|
0x00 /* CUT */,
|
|
|
|
/* 0x7C */
|
|
0x00 /* COPY */,
|
|
0x00 /* PASTE */,
|
|
0x00 /* FIND */,
|
|
0x00 /* MUTE */,
|
|
};
|
|
|
|
static char char_with_caps_lock(const char c, const bool caps_lock_engaged) __sdcccall(1) {
|
|
if (!caps_lock_engaged)
|
|
return c;
|
|
|
|
if (c >= 'A' && c <= 'Z')
|
|
return c - 'A' + 'a';
|
|
|
|
if (c >= 'a' && c <= 'z')
|
|
return c - 'a' + 'A';
|
|
|
|
return c;
|
|
}
|
|
|
|
char scancode_to_char(const uint8_t modifier_keys, const uint8_t code, const bool caps_lock_engaged) __sdcccall(1) {
|
|
if ((modifier_keys & (KEY_MOD_LCTRL | KEY_MOD_RCTRL))) {
|
|
if (code >= 4 && code <= 0x1d)
|
|
return code - 3;
|
|
|
|
if (code == 0x1F || code == 0x2C) //@ or SPACE
|
|
return 0;
|
|
|
|
if (code == 0x2F) // [
|
|
return 27;
|
|
|
|
if (code == 0x31) // back slash
|
|
return 28;
|
|
|
|
if (code == 0x30) // ]
|
|
return 29;
|
|
|
|
if (code == 0x23) //^
|
|
return 30;
|
|
|
|
if (code == 0x2D) //_
|
|
return 31;
|
|
}
|
|
|
|
if (modifier_keys & (KEY_MOD_LSHIFT | KEY_MOD_RSHIFT))
|
|
return char_with_caps_lock(scancodes_shift_table[code], caps_lock_engaged);
|
|
|
|
return char_with_caps_lock(scancodes_table[code], caps_lock_engaged);
|
|
}
|
|
|