#include <devtty.h>
#include <vt.h>
#include <tty.h>
+#include "msx2.h"
#undef DEBUG /* UNdefine to delete debug code sequences */
{tbuf2, tbuf2, tbuf2, TTYSIZ, 0, TTYSIZ / 2}
};
+/*
+ * International key matrix
+ */
+uint8_t keyboard[11][8] = {
+ {'0','1','2', '3','4','5','6','7'},
+ {'8','9','-','=','\\','[',']',';'},
+ { 39, '`', ',', '.','/',' ','a','b'},
+ {'c','d','e', 'f','g','h','i','j'},
+ {'k','l','m', 'n','o','p','q','r'},
+ {'s','t','u', 'v','w','x','y','z'},
+ {0/*SHIFT*/,0/*CTRL*/,0/*GRPH*/,0/*CAPS*/,0/*CODE*/ , KEY_F3 , KEY_F2 , KEY_F1 },
+ {KEY_F4 , KEY_F5, KEY_ESC , '\t', KEY_STOP ,KEY_BS , 0 , 13},
+ {32 , KEY_HOME, KEY_INSERT , KEY_DEL, KEY_LEFT , KEY_UP , KEY_DOWN , KEY_RIGHT},
+ {'*','+','/','0','1' ,'2','3','4'},
+ {'5','6','7','8','9' ,'-',',','.'}
+};
+
+uint8_t shiftkeyboard[11][8] = {
+ {')','!','@', '#','$','%','^','&'},
+ {'*','(','_','+','|','{','}',':'},
+ {'"','~','<','>','?',' ','A','B'},
+ {'C','D','E', 'F','G','H','I','J'},
+ {'K','L','M', 'N','O','P','Q','R'},
+ {'S','T','U', 'V','W','X','Y','Z'},
+ {0/*SHIFT*/,0/*CTRL*/,0/*GRPH*/,0/*CAPS*/,0/*CODE*/, KEY_F3 , KEY_F2 , KEY_F1 },
+ {KEY_F4 , KEY_F5, KEY_ESC , '\t', KEY_STOP ,KEY_BS , 0/*SELECT*/ , 13},
+ {32 ,KEY_HOME, KEY_INSERT , KEY_DEL, KEY_LEFT , KEY_UP , KEY_DOWN , KEY_RIGHT},
+ {'*','+','/','0','1' ,'2','3','4'},
+ {'5','6','7','8','9' ,'-',',','.'}
+};
+
+/*
+ * Japan
+ */
+uint8_t keyboard_jp[3][8] = {
+ {'0','1','2', '3','4','5','6','7'},
+ {'8','9','-','^',KEY_YEN,'@','[',';'},
+ {':',']', ',', '.','/',' ','a','b'}};
+
+uint8_t shiftkeyboard_jp[3][8] = {
+ {' ','!','"', '#','$','%','&',39},
+ {'(',')','=','~','|','`','{','+'},
+ {'*','}','<','>','?','_','A','B'}};
+/*
+ * UK
+ */
+uint8_t shiftkeyboard_uk[1][8] = {
+ {39,'`', ',', '.','/',KEY_POUND,'A','B'}}; /* row 2 */
+
+/*
+ * Spanish
+ */
+uint8_t keyboard_es[2][8] = {
+ {'8','9','-','=','\\','[',']', 'N'/* Ñ */}, /* row 1 */
+ {39, ':', ',', '.','/',' ','a','b'}};
+
+uint8_t shiftkeyboard_es[2][8] = {
+ {'*','(','_','+','|','{','}', 'n' /* ñ */}, /* row 1 */
+ {'"',':','<','>','?',' ','A','B'}};
+
+
/* tty1 is the screen tty2 is the debug port */
/* Output for the system console (kprintf etc) */
vtoutput(&c, 1);
// return;
// }
- tty_debug2 = c;
+ tty_debug2 = c;
}
int tty_carrier(uint8_t minor)
void tty_setup(uint8_t minor)
{
minor;
+
+ /* setup termios to use msx keys */
+ ttydata[1].termios.c_cc[VERASE] = KEY_BS;
+ ttydata[1].termios.c_cc[VSTOP] = KEY_STOP;
+ ttydata[1].termios.c_cc[VSTART] = KEY_STOP;
+
+ /* keyboard layout selection: default is international */
+ if ((infobits & KBDTYPE_MASK) == KBDTYPE_JPN) {
+ memcpy(keyboard, keyboard_jp, 24);
+ memcpy(shiftkeyboard, shiftkeyboard_jp, 24);
+ } else if ((infobits & KBDTYPE_MASK) == KBDTYPE_UK) {
+ memcpy(&shiftkeyboard[2][0],shiftkeyboard_uk,8);
+ } else if ((infobits & KBDTYPE_MASK) == KBDTYPE_ES) {
+ memcpy(&keyboard[1][0], keyboard_es, 16);
+ memcpy(&shiftkeyboard[1][0], shiftkeyboard_es, 16);
+ }
}
}
}
-/* TODO: use locale indicator in addr 002c BIOS, for now only
- international layout */
-
-uint8_t keyboard[11][8] = {
- {'0','1','2', '3','4','5','6','7'},
- {'8','9','-','=','\\','[',']',';'},
- { 0, 0, ',', '.','/',' ','a','b'},
- {'c','d','e', 'f','g','h','i','j'},
- {'k','l','m', 'n','o','p','q','r'},
- {'s','t','u', 'v','w','x','y','z'},
- { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }, /* f3 f2 f1 code caps graph ctrl shift */
- { 0 , 0, 27 , '\t',24 ,8 , 0 , 13}, /* ret select bs stop tab esc f5 f4 */
- {32 ,12, 0 , 127, 0 , 0 , 0 , 0 }, /* right down up left del ins home space */
- {'*','+','/','0','1' ,'2','3','4'}, /* numeric keyboard */
- {'5','6','7','8','9' ,'-',',','.'}
-};
-
-uint8_t shiftkeyboard[11][8] = {
- {')','!','@', '#','$','%','^','&'},
- {'*','(','_','+','|','{','}',':'},
- {'"','~','<','>','?',' ','A','B'},
- {'C','D','E', 'F','G','H','I','J'},
- {'K','L','M', 'N','O','P','Q','R'},
- {'S','T','U', 'V','W','X','Y','Z'},
- { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }, /* f3 f2 f1 code caps graph ctrl shift */
- { 0 , 0, 27 , '\t',24 ,8 , 0 , 13}, /* ret select bs stop tab esc f5 f4 */
- {32 ,12, 0 , 127, 0 , 0 , 0 , 0 }, /* right down up left del ins home space */
- {'*','+','/','0','1' ,'2','3','4'}, /* numeric keyboard */
- {'5','6','7','8','9' ,'-',',','.'}
-};
-
static uint8_t capslock = 0;
static void keydecode(void)
return;
}
- if (keymap[6] & 1) /* shift */
+ if (keymap[6] & 3 ) /* shift or control */
c = shiftkeyboard[keybyte][keybit];
else
c = keyboard[keybyte][keybit];