static void keydecode(void) { uint8_t c; uint8_t m = 0; if ((keymap[8] & 0x20) || (keymap[0] & 0x10)) { /* shift */ m = KEYPRESS_SHIFT; c = shiftkeyboard[keybyte][keybit]; } else c = keyboard[keybyte][keybit]; if (keymap[8] & 0x10) { /* control */ m |= KEYPRESS_CTRL; if (m & KEYPRESS_SHIFT) { /* shift */ if (c == '(') c = '{'; if (c == ')') c = '}'; if (c == '^') c = '|'; } else if (c > 31 && c < 127) c &= 31; } if (c) { switch (keyboard_grab) { case 0: vt_inproc(1, c); break; case 1: if (!input_match_meta(c)) { vt_inproc(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; } } }
static void keyproc(void) { int i; uint8_t key; kbd_data = 2; /* Reset the keyboard */ for (i = 0; i < 9; i++) { /* Read the keyboard row */ keyin[i] = kbd_data; kbd_data = 1; /* Clock the keyboard */ key = keyin[i] ^ keymap[i]; if (key) { int n; int m = 1; for (n = 0; n < 8; n++) { if ((key & m) && (keymap[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)) { keysdown++; newkey = 1; keybyte = i; keybit = n; } } m += m; } } keymap[i] = keyin[i]; } }
static void keyproc(void) { int i; uint8_t key; for (i = 0; i < 8; i++) { /* Set one of A0 to A7, and read the byte we get back. Invert that to get a mask of pressed buttons */ keyin[i] = *(uint8_t *) (0x3800 | (1 << i)); key = keyin[i] ^ keymap[i]; if (key) { int n; int m = 1; for (n = 0; n < 8; n++) { if ((key & m) && (keymap[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)) { keysdown++; newkey = 1; keybyte = i; keybit = n; } } m += m; } } keymap[i] = keyin[i]; } }
static void keydecode(void) { uint8_t c; uint8_t m = 0; /* Convention for capslock or the mod */ /* Only the model 3 has right shift (2) */ if (keymap[7] & 3) { /* shift (left/right) */ m = KEYPRESS_SHIFT; c = shiftkeyboard[keybyte][keybit]; } else c = keyboard[keybyte][keybit]; if (c == KEY_CAPSLOCK) { capslock = 1 - capslock; return; } /* The keyboard lacks some rather important symbols so remap them with control (down arrow) */ if ((keymap[6] | keymap[7]) & 16) { /* control */ m |= KEYPRESS_CTRL; if (keymap[7] & 3) { /* shift */ if (c == '(') c = '{'; if (c == ')') c = '}'; if (c == '-') c = '_'; if (c == '/') c = '``'; if (c == '<') c = '^'; } else { if (c == '8' /*'(' */ ) c = '['; else if (c == '9' /*')' */ ) c = ']'; else if (c == '-') c = '|'; else if (c > 31 && c < 127) c &= 31; } } else if (capslock && c >= 'a' && c <= 'z') c -= 'a' - 'A'; if (c) { switch (keyboard_grab) { case 0: vt_inproc(1, c); break; case 1: if (!input_match_meta(c)) { vt_inproc(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; } } }