msx2: add localized keyboard matrices
authorgeijoenr <enric.geijo@gmail.com>
Sun, 1 Feb 2015 18:10:18 +0000 (18:10 +0000)
committergeijoenr <enric.geijo@gmail.com>
Sun, 1 Feb 2015 18:27:21 +0000 (18:27 +0000)
Only JP,UK,ES are available for now.

Kernel/platform-msx2/devtty.c

index d5f9a51..0787b3b 100644 (file)
@@ -5,6 +5,7 @@
 #include <devtty.h>
 #include <vt.h>
 #include <tty.h>
+#include "msx2.h"
 
 #undef  DEBUG                  /* UNdefine to delete debug code sequences */
 
@@ -21,6 +22,67 @@ struct s_queue ttyinq[NUM_DEV_TTY + 1] = {   /* ttyinq[0] is never used */
        {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) */
@@ -47,7 +109,7 @@ void tty_putc(uint8_t minor, unsigned char c)
                vtoutput(&c, 1);
 //             return;
 //     }
-       tty_debug2 = c; 
+       tty_debug2 = c;
 }
 
 int tty_carrier(uint8_t minor)
@@ -59,6 +121,22 @@ 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);
+       }
 }
 
 
@@ -100,37 +178,6 @@ static void keyproc(void)
        }
 }
 
-/* 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)
@@ -142,7 +189,7 @@ 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];