#include <devices/keymap.h>

static UBYTE LoKeyMapTypes[64] = {
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KCF_NOP,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KCF_NOP,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KCF_NOP,
	KCF_NOP,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KCF_NOP,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KCF_NOP,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA,
	KC_VANILLA
};

static UBYTE LoKeyMap[64][4] = {
	{0xFE, 0xE0,  '~',  '`' },
	{0xA1, 0xB1,  '!',  '1' },
	{0xC0, 0xB2,  '@',  '2' },
	{0xA3, 0xB3,  '#',  '3' },
	{0xA4, 0xB4,  '$',  '4' },
	{0xA5, 0xB5,  '%',  '5' },
	{0xDE, 0xB6,  '^',  '6' },
	{0xA6, 0xB7,  '&',  '7' },
	{0xAA, 0xB8,  '*',  '8' },
	{0xA8, 0xB9,  '(',  '9' },
	{0xA9, 0xB0,  ')',  '0' },
	{0xDF, 0xAD,  '_',  '-' },
	{0xAB, 0xBD,  '+',  '=' },
	{0xFC, 0xDC,  '|',  '\\' },
	{0x00, 0x00, 0x00, 0x00 },
	{0xB0, 0xB0,  '0',  '0' },
	{0xD1, 0xF1,  'Q',  'q' },
	{0xD7, 0xF7,  'W',  'w' },
	{0xC5, 0xE5,  'E',  'e' },
	{0xD2, 0xF2,  'R',  'r' },
	{0xD4, 0xF4,  'T',  't' },
	{0xD9, 0xF9,  'Y',  'y' },
	{0xD5, 0xF5,  'U',  'u' },
	{0xC9, 0xE9,  'I',  'i' },
	{0xCF, 0xEF,  'O',  'o' },
	{0xD0, 0xF0,  'P',  'p' },
	{0xFB, 0xDB,  '{',  '[' },
	{0xFD, 0xDD,  '}',  ']' },
	{0x00, 0x00, 0x00, 0x00 },
	{0xB1, 0xB1,  '1',  '1' },
	{0xB2, 0xB2,  '2',  '2' },
	{0xB3, 0xB3,  '3',  '3' },
	{0xC1, 0xE1,  'A',  'a' },
	{0xD3, 0xF3,  'S',  's' },
	{0xC4, 0xE4,  'D',  'd' },
	{0xC6, 0xE6,  'F',  'f' },
	{0xC7, 0xE7,  'G',  'g' },
	{0xC8, 0xE8,  'H',  'h' },
	{0xCA, 0xEA,  'J',  'j' },
	{0xCB, 0xEB,  'K',  'k' },
	{0xCC, 0xEC,  'L',  'l' },
	{0xBA, 0xBB,  ':',  ';' },
	{0xA2, 0xA7,  '"',  '\'' },
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 },
	{0xB4, 0xB4,  '4',  '4' },
	{0xB5, 0xB5,  '5',  '5' },
	{0xB6, 0xB6,  '6',  '6' },
	{0x00, 0x00, 0x00, 0x00 },
	{0xDA, 0xFA,  'Z',  'z' },
	{0xD8, 0xF8,  'X',  'x' },
	{0xC3, 0xE3,  'C',  'c' },
	{0xD6, 0xF6,  'V',  'v' },
	{0xC2, 0xE2,  'B',  'b' },
	{0xCE, 0xEE,  'N',  'n' },
	{0xCD, 0xED,  'M',  'm' },
	{0xBC, 0xAC,  '<',  ',' },
	{0xBE, 0xAE,  '>',  '.' },
	{0xBF, 0xAF,  '?',  '/' },
	{0x00, 0x00, 0x00, 0x00 },
	{0xAE, 0xAE,  '.',  '.' },
	{0xB7, 0xB7,  '7',  '7' },
	{0xB8, 0xB8,  '8',  '8' },
	{0xB9, 0xB9,  '9',  '9' }
};

static UBYTE LoCapsable[8] = {
	0x00, 0x00, 0xFF, 0x03, 0xFF, 0x01, 0xFE, 0x00
};

static UBYTE LoRepeatable[8] = {
	0xFF, 0xBF, 0xFF, 0xEF, 0xFF, 0xEF, 0xFF, 0xF7
};

static UBYTE HiKeyMapTypes[40] = {
	KC_NOQUAL,	/* Space */
	KCF_STRING | KCF_SHIFT,	/* Backspace */
	KC_NOQUAL,	/* Tab */
	KC_NOQUAL,	/* ENTER (numeric) */
	KCF_CONTROL,	/* Return */
	KC_NOQUAL,	/* Escape */
	KCF_STRING | KCF_SHIFT,	/* DEL */
	KCF_NOP,
	KCF_NOP,
	KCF_NOP,
	KCF_ALT,	/* Numeric - */
	KCF_NOP,
	KCF_STRING | KCF_ALT | KCF_SHIFT,	/* Cursor Up */
	KCF_STRING | KCF_ALT | KCF_SHIFT,	/* Cursor Down */
	KCF_STRING | KCF_ALT | KCF_SHIFT,	/* Cursor Right */
	KCF_STRING | KCF_ALT | KCF_SHIFT,	/* Cursor Left */
	KCF_STRING | KCF_SHIFT, /*F1*/
	KCF_STRING | KCF_SHIFT,
	KCF_STRING | KCF_SHIFT,
	KCF_STRING | KCF_SHIFT,
	KCF_STRING | KCF_SHIFT,
	KCF_STRING | KCF_SHIFT,
	KCF_STRING | KCF_SHIFT,
	KCF_STRING | KCF_SHIFT,
	KCF_STRING | KCF_SHIFT,
	KCF_STRING | KCF_SHIFT, /*F10*/
	KCF_NOP,
	KCF_NOP,
	KCF_NOP,
	KCF_NOP,
	KCF_NOP,
	KC_NOQUAL, /* HELP */
	KCF_NOP,
	KCF_NOP,
	KCF_NOP,
	KCF_NOP,
	KCF_NOP,
	KCF_NOP,
	KCF_NOP,
	KCF_NOP
};

static UBYTE HiKeyMap[40][4] = {
	{0x00, 0x00, 0x00,  ' ' },	/* Space */
	{0x00, 0x00, 0x17, 0x08 },	/* Backspace */
	{0x00, 0x00, 0x00, 0x09 },	/* Tab */
	{0x00, 0x00, 0x00, 0x0A },	/* ENTER (numeric) */
	{0x00, 0x00, 0x0A, 0x0D },	/* Return */
	{0x00, 0x00, 0x00, 0x1B },	/* Escape */
	{0x00, 0x00, 0xFF, 0x7F },	/* DEL */
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0xFF,  '-' },	/* Numeric - */
	{0x00, 0x00, 0x00, 0x00 },
	{0xD6, 0xBC, 0xD6, 0x10 },	/* Cursor Up */
	{0x16, 0xBE, 0x16, 0x0E },	/* Cursor Down */
	{0xC6, 0x05, 0xC6, 0x06 },	/* Cursor Right */
	{0xC2, 0x01, 0xC2, 0x02 },	/* Cursor Left */
	{0x00, 0x00, 0x00, 0x00 }, /*F1*/
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 }, /*F10*/
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x15 }, /* HELP */
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 },
	{0x00, 0x00, 0x00, 0x00 }
};

static UBYTE HiCapsable[8] = {
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

static UBYTE HiRepeatable[8] = {
	0x47, 0xF4, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00
};

static char *HiStrings[] = {
	"\x01\x04\x02\x05\b\x1B\x7F",	/* Backspace */
	"\x01\x04\x02\x05\b\x1B\x7F",	/* DEL */
	"\x01\x08\x02\x09\x02\x0B\x02\x0D\x10\x1BV\x1B<\x18\x10", /* CU */
	"\x01\x08\x01\x09\x02\x0A\x02\x0C\x0E\x16\x1B>\x18\x0E", /* CD */
	"\x01\x08\x02\x09\x01\x0B\x02\x0C\x06\x1BF\x05\x18N", /* CR */
	"\x01\x08\x02\x09\x01\x0B\x02\x0C\x02\x1BB\x01\x18P", /* CL */
	"\x02\x04\x02\x06\x18\x16\x18\x13", /* F1 ^x^v ^x^s */
	"\x02\x04\x02\x06\x18B\x18\x02", /* F2 ^xB ^x^b */
	"\x02\x04\x02\x06\x18N\x18P", /* F3 ^xN ^xB */
	"\x02\x04\x02\x06\x182\x181", /* F4 ^x2 ^x1 */
	"\x02\x04\x02\x06\x18\x1A\x18Z", /* F5 ^x^z ^xZ */
	"\x02\x04\x02\x06\x18\x10\x18\x0E", /* F6 ^x^n ^x^p */
	"\x02\x04\x02\x06\x18=\x1B!", /* F7 ^x= ^[! */
	"\x01\x04\x02\x05\x0F\x18\x04", /* F8 ^o ^x^d */
	"\x02\x04\x02\x06\x18E\x18\x18", /* F9 ^xE ^x^x */
	"\x02\x04\x01\x06\x18\x03\x1A", /* F10 ^x^c ^z */
	NULL
};

static struct KeyMap KeyMap = {
	(APTR)LoKeyMapTypes,
	(APTR)LoKeyMap,
	(APTR)LoCapsable,
	(APTR)LoRepeatable,
	(APTR)HiKeyMapTypes,
	(APTR)HiKeyMap,
	(APTR)HiCapsable,
	(APTR)HiRepeatable
};
