trs80: turn on input support and fix keyboard bits
authorAlan Cox <alan@linux.intel.com>
Fri, 6 Jul 2018 23:41:59 +0000 (00:41 +0100)
committerAlan Cox <alan@linux.intel.com>
Fri, 6 Jul 2018 23:41:59 +0000 (00:41 +0100)
Kernel/platform-trs80/Makefile
Kernel/platform-trs80/config.h
Kernel/platform-trs80/devtty.c
Kernel/platform-trs80/fuzix.lnk

index 9112cd6..5540280 100644 (file)
@@ -1,6 +1,6 @@
 
 CSRCS = devlpr.c devtty.c devfd.c devhd.c devgfx.c
-CSRCS += devices.c main.c
+CSRCS += devices.c main.c devinput.c
 DISCARD_CSRCS = discard.c devhd_discard.c
 
 ASRCS = trs80.s trs80-bank94.s crt0.s
index 2048ede..bd3d9e0 100644 (file)
 #define CONFIG_VT_MULTI
 /* Banked memory set up */
 #define CONFIG_BANK_FIXED
-
+/* Input device support */
+#define CONFIG_INPUT
+/* Full key up/down support */
+#define CONFIG_INPUT_GRABMAX 3
 
 /* Support extra banked expansion memory using port 0x94 */
 #define CONFIG_MAP94
index 330524c..86f30ac 100644 (file)
@@ -5,6 +5,8 @@
 #include <tty.h>
 #include <vt.h>
 #include <devtty.h>
+#include <input.h>
+#include <devinput.h>
 #include <stdarg.h>
 
 char tbuf1[TTYSIZ];
@@ -205,8 +207,13 @@ static void keyproc(void)
                        int m = 1;
                        for (n = 0; n < 8; n++) {
                                if ((key & m) && (keymap[i] & m)) {
-                                       if (!(shiftmask[i] & m))
+                                       if (!(shiftmask[i] & m)) {
+                                               if (keyboard_grab == 3) {
+                                                   queue_input(KEYPRESS_UP);
+                                                   queue_input(keyboard[i][n]);
+                                                }
                                                keysdown--;
+                                        }
                                }
                                if ((key & m) && !(keymap[i] & m)) {
                                        if (!(shiftmask[i] & m)) {
@@ -252,6 +259,7 @@ static uint8_t kbd_timer;
 static void keydecode(void)
 {
        uint8_t c;
+       uint8_t m = 0;
 
        if (keybyte == 7 && keybit == 3) {
                capslock = 1 - capslock;
@@ -259,6 +267,7 @@ static void keydecode(void)
        }
 
        if (keymap[7] & 3) {    /* shift */
+               m = KEYPRESS_SHIFT;
                c = shiftkeyboard[keybyte][keybit];
                /* VT switcher */
                if (c == KEY_F1 || c == KEY_F2) {
@@ -274,6 +283,7 @@ static void keydecode(void)
         /* The keyboard lacks some rather important symbols so remap them
            with control */
        if (keymap[7] & 4) {    /* control */
+               m |= KEYPRESS_CTRL;
                 if (keymap[7] & 3) {   /* shift */
                     if (c == '(')
                         c = '{';
@@ -286,10 +296,10 @@ static void keydecode(void)
                     if (c == '<')
                         c = '^';
                 } else {
-                    if (c == '(')
+                    if (c == '8')
                         c = '[';
                     else if (c == ')')
-                        c = ']';
+                        c = '9';
                     else if (c == '-')
                         c = '|';
                     else if (c > 31 && c < 127)
@@ -298,8 +308,30 @@ static void keydecode(void)
        }
        else if (capslock && c >= 'a' && c <= 'z')
                c -= 'a' - 'A';
-       if (c)
-               vt_inproc(inputtty+1, c);
+       if (c) {
+               switch(keyboard_grab) {
+               case 0:
+                   vt_inproc(inputtty + 1, c);
+                   break;
+                case 1:
+                    /* Proper rule needed FIXME */
+                    if (c <= 0x83) {
+                       vt_inproc(inputtty + 1, c);
+                       break;
+                    }
+                    /* Fall through */
+                case 2:
+                    queue_input(KEYPRESS_DOWN);
+                    queue_input(c);
+                    break;
+                case 3:
+                    /* Queue an event giving the base key (unshifted)
+                       and the state of shift/ctrl/alt */
+                    queue_input(KEYPRESS_DOWN | m);
+                   queue_input(keyboard[keybyte][keybit]);
+                   break;
+                }
+        }
 }
 
 void kbd_interrupt(void)
index ee07683..e2458e4 100644 (file)
@@ -38,9 +38,11 @@ swap.rel
 bankfixed.rel
 vt.rel
 devsys.rel
+devinput.rel
 platform-trs80/devlpr.rel
 platform-trs80/devtty.rel
 platform-trs80/discard.rel
 platform-trs80/devdw.rel
 platform-trs80/drivewire.rel
+platform-trs80/devinput.rel
 -e