1: #include <X/mit-copyright.h> 2: 3: /* Copyright Massachusetts Institute of Technology 1985 */ 4: 5: /* This file is device dependent, but is common to several devices */ 6: 7: #ifndef lint 8: static char *rcsid_lk201_c = "$Header: lk201.c,v 10.6 86/02/01 15:16:27 tony Rel $"; 9: #endif 10: 11: #include <sys/types.h> 12: #include "vsinput.h" 13: 14: #define KEYDOWN_ERROR 0x3d 15: #define POWERUP_ERROR 0x3e 16: #define BASEKEY 0x41 17: #define MINSPECIAL 0xb3 18: #define ALLUPS 0xb3 19: #define METRONOME 0xb4 20: #define OUTPUT_ERROR 0xb5 21: #define INPUT_ERROR 0xb6 22: #define MAXSPECIAL 0xba 23: 24: static u_char lastkey; 25: 26: #define NUMDIVS 14 27: static u_char divbeg[NUMDIVS] = {0xbf, 0x91, 0xbc, 0xbd, 0xb0, 0xad, 0xa6, 28: 0xa9, 0x88, 0x56, 0x63, 0x6f, 0x7b, 0x7e}; 29: static u_char divend[NUMDIVS] = {0xff, 0xa5, 0xbc, 0xbe, 0xb2, 0xaf, 0xa8, 30: 0xac, 0x90, 0x62, 0x6e, 0x7a, 0x7d, 0x87}; 31: /* initially set for keyboard defaults */ 32: static int keymodes[8] = {0, 0, 0, 0, 0, 0x0000c000, 0, 0}; /* down/up keys */ 33: static int keys[8]; /* down/up keys that are currently down */ 34: 35: /* Handle keyboard/button input from LK201/mouse */ 36: 37: ProcessInput (ev) 38: register vsEvent *ev; 39: { 40: register int idx, key, bits; 41: 42: if (ev->vse_direction != VSE_KBTRAW) { 43: Deal_with_input (ev); 44: return; 45: } 46: key = ev->vse_key; 47: if (key > MAXSPECIAL || (key >= BASEKEY && key < MINSPECIAL)) { 48: lastkey = key; 49: idx = key >> 5; 50: key &= 0x1f; 51: key = 1 << key; 52: if (!(keymodes[idx] & key) || ((keys[idx] ^= key) & key)) 53: ev->vse_direction = VSE_KBTDOWN; 54: else 55: ev->vse_direction = VSE_KBTUP; 56: Deal_with_input (ev); 57: } else { 58: switch (key) { 59: case METRONOME: 60: ev->vse_direction = VSE_KBTDOWN; 61: ev->vse_key = lastkey; 62: Deal_with_input (ev); 63: break; 64: case ALLUPS: 65: idx = 7; 66: ev->vse_direction = VSE_KBTUP; 67: do { 68: if (bits = keys[idx]) { 69: keys[idx] = 0; 70: key = 0; 71: do { 72: if (bits & 1) { 73: ev->vse_key = (idx << 5) | key; 74: Deal_with_input (ev); 75: } 76: key++; 77: } while (bits >>= 1); 78: } 79: } while (--idx >= 0); 80: break; 81: case POWERUP_ERROR: 82: case KEYDOWN_ERROR: 83: case OUTPUT_ERROR: 84: case INPUT_ERROR: 85: DeviceError ("keyboard error"); 86: break; 87: } 88: } 89: } 90: 91: /* Put keyboard in autorepeat mode and return control command string. 92: * autorepeat/down: main keyboard, numeric keypad, delete, cursors 93: * up/down: all others 94: */ 95: 96: char *AutoRepeatLKMode () 97: { 98: ResetLKModes (0x3f38); 99: return ("\212\222\232\246\256\266\272\302\316\326\336\346\356\366"); 100: } 101: 102: /* Put all of keyboard in down/up mode and return control command string */ 103: 104: char *UpDownLKMode () 105: { 106: ResetLKModes (0x3fff); 107: return ("\216\226\236\246\256\266\276\306\316\326\336\346\356\366"); 108: } 109: 110: ResetLKModes (modes) 111: register int modes; 112: { 113: register int i = 0; 114: register int key, last; 115: 116: bzero ((caddr_t) keymodes, sizeof (keymodes)); 117: do { 118: if (modes & 1) { 119: for (key = divbeg[i], last = divend[i]; key <= last; key++) 120: keymodes[key >> 5] |= 1 << (key & 0x1f); 121: } 122: modes >>= 1; 123: } while (++i < NUMDIVS); 124: }