1*41488Smckusick /* 2*41488Smckusick * Copyright (c) 1988 University of Utah. 3*41488Smckusick * Copyright (c) 1990 The Regents of the University of California. 4*41488Smckusick * All rights reserved. 5*41488Smckusick * 6*41488Smckusick * This code is derived from software contributed to Berkeley by 7*41488Smckusick * the Systems Programming Group of the University of Utah Computer 8*41488Smckusick * Science Department. 9*41488Smckusick * 10*41488Smckusick * %sccs.include.redist.c% 11*41488Smckusick * 12*41488Smckusick * from: Utah $Hdr: hil.c 1.1 89/08/22$ 13*41488Smckusick * 14*41488Smckusick * @(#)hil.c 7.1 (Berkeley) 05/08/90 15*41488Smckusick */ 16*41488Smckusick 17*41488Smckusick /* 18*41488Smckusick * Keyboard routines for the standalone ITE. 19*41488Smckusick */ 20*41488Smckusick #include "samachdep.h" 21*41488Smckusick 22*41488Smckusick #ifdef ITECONSOLE 23*41488Smckusick 24*41488Smckusick #include "param.h" 25*41488Smckusick #include "../hpdev/hilreg.h" 26*41488Smckusick #include "../hpdev/kbdmap.h" 27*41488Smckusick #include "../hpdev/itevar.h" 28*41488Smckusick 29*41488Smckusick #ifndef SMALL 30*41488Smckusick 31*41488Smckusick /* 32*41488Smckusick * HIL cooked keyboard keymaps. 33*41488Smckusick * Supports only unshifted, shifted and control keys. 34*41488Smckusick */ 35*41488Smckusick char us_keymap[] = { 36*41488Smckusick NULL, '`', '\\', ESC, NULL, DEL, NULL, NULL, 37*41488Smckusick '\n', '\t', NULL, NULL, NULL, NULL, NULL, NULL, 38*41488Smckusick NULL, '\n', NULL, NULL, NULL, NULL, NULL, NULL, 39*41488Smckusick NULL, '\t', NULL, NULL, NULL, NULL, NULL, NULL, 40*41488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 41*41488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, '\b', NULL, 42*41488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 43*41488Smckusick ESC, '\r', NULL, '\n', '0', '.', ',', '+', 44*41488Smckusick '1', '2', '3', '-', '4', '5', '6', '*', 45*41488Smckusick '7', '8', '9', '/', 'E', '(', ')', '^', 46*41488Smckusick '1', '2', '3', '4', '5', '6', '7', '8', 47*41488Smckusick '9', '0', '-', '=', '[', ']', ';', '\'', 48*41488Smckusick ',', '.', '/', '\040', 'o', 'p', 'k', 'l', 49*41488Smckusick 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 50*41488Smckusick 'a', 's', 'd', 'f', 'g', 'h', 'j', 'm', 51*41488Smckusick 'z', 'x', 'c', 'v', 'b', 'n', NULL, NULL 52*41488Smckusick }; 53*41488Smckusick 54*41488Smckusick char us_shiftmap[] = { 55*41488Smckusick NULL, '~', '|', DEL, NULL, DEL, NULL, NULL, 56*41488Smckusick '\n', '\t', NULL, NULL, NULL, NULL, NULL, NULL, 57*41488Smckusick NULL, '\n', NULL, NULL, NULL, NULL, NULL, NULL, 58*41488Smckusick NULL, '\t', NULL, NULL, NULL, NULL, NULL, NULL, 59*41488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 60*41488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, DEL, NULL, 61*41488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 62*41488Smckusick ESC, '\r', NULL, '\n', '0', '.', ',', '+', 63*41488Smckusick '1', '2', '3', '-', '4', '5', '6', '*', 64*41488Smckusick '7', '8', '9', '/', '`', '|', '\\', '~', 65*41488Smckusick '!', '@', '#', '$', '%', '^', '&', '*', 66*41488Smckusick '(', ')', '_', '+', '{', '}', ':', '\"', 67*41488Smckusick '<', '>', '?', '\040', 'O', 'P', 'K', 'L', 68*41488Smckusick 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 69*41488Smckusick 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'M', 70*41488Smckusick 'Z', 'X', 'C', 'V', 'B', 'N', NULL, NULL 71*41488Smckusick }; 72*41488Smckusick 73*41488Smckusick char us_ctrlmap[] = { 74*41488Smckusick NULL, '`', '\034', ESC, NULL, DEL, NULL, NULL, 75*41488Smckusick '\n', '\t', NULL, NULL, NULL, NULL, NULL, NULL, 76*41488Smckusick NULL, '\n', NULL, NULL, NULL, NULL, NULL, NULL, 77*41488Smckusick NULL, '\t', NULL, NULL, NULL, NULL, NULL, NULL, 78*41488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 79*41488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, '\b', NULL, 80*41488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 81*41488Smckusick ESC, '\r', NULL, '\n', '0', '.', ',', '+', 82*41488Smckusick '1', '2', '3', '-', '4', '5', '6', '*', 83*41488Smckusick '7', '8', '9', '/', 'E', '(', ')', '\036', 84*41488Smckusick '1', '2', '3', '4', '5', '6', '7', '8', 85*41488Smckusick '9', '0', '-', '=', '\033', '\035', ';', '\'', 86*41488Smckusick ',', '.', '/', '\040', '\017', '\020', '\013', '\014', 87*41488Smckusick '\021', '\027', '\005', '\022', '\024', '\031', '\025', '\011', 88*41488Smckusick '\001', '\023', '\004', '\006', '\007', '\010', '\012', '\015', 89*41488Smckusick '\032', '\030', '\003', '\026', '\002', '\016', NULL, NULL 90*41488Smckusick }; 91*41488Smckusick 92*41488Smckusick #ifdef UK_KEYBOARD 93*41488Smckusick char uk_keymap[] = { 94*41488Smckusick NULL, '`', '<', ESC, NULL, DEL, NULL, NULL, 95*41488Smckusick '\n', '\t', NULL, NULL, NULL, NULL, NULL, NULL, 96*41488Smckusick NULL, '\n', NULL, NULL, NULL, NULL, NULL, NULL, 97*41488Smckusick NULL, '\t', NULL, NULL, NULL, NULL, NULL, NULL, 98*41488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 99*41488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, '\b', NULL, 100*41488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 101*41488Smckusick ESC, '\r', NULL, '\n', '0', '.', ',', '+', 102*41488Smckusick '1', '2', '3', '-', '4', '5', '6', '*', 103*41488Smckusick '7', '8', '9', '/', 'E', '(', ')', '^', 104*41488Smckusick '1', '2', '3', '4', '5', '6', '7', '8', 105*41488Smckusick '9', '0', '+', '\'', '[', ']', '*', '\\', 106*41488Smckusick ',', '.', '-', '\040', 'o', 'p', 'k', 'l', 107*41488Smckusick 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 108*41488Smckusick 'a', 's', 'd', 'f', 'g', 'h', 'j', 'm', 109*41488Smckusick 'z', 'x', 'c', 'v', 'b', 'n', NULL, NULL 110*41488Smckusick }; 111*41488Smckusick 112*41488Smckusick char uk_shiftmap[] = { 113*41488Smckusick NULL, '~', '>', DEL, NULL, DEL, NULL, NULL, 114*41488Smckusick '\n', '\t', NULL, NULL, NULL, NULL, NULL, NULL, 115*41488Smckusick NULL, '\n', NULL, NULL, NULL, NULL, NULL, NULL, 116*41488Smckusick NULL, '\t', NULL, NULL, NULL, NULL, NULL, NULL, 117*41488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 118*41488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, DEL, NULL, 119*41488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 120*41488Smckusick ESC, '\r', NULL, '\n', '0', '.', ',', '+', 121*41488Smckusick '1', '2', '3', '-', '4', '5', '6', '*', 122*41488Smckusick '7', '8', '9', '/', '`', '|', '\\', '~', 123*41488Smckusick '!', '\"', '#', '$', '%', '&', '^', '(', 124*41488Smckusick ')', '=', '?', '/', '{', '}', '@', '|', 125*41488Smckusick ';', ':', '_', '\040', 'O', 'P', 'K', 'L', 126*41488Smckusick 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 127*41488Smckusick 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'M', 128*41488Smckusick 'Z', 'X', 'C', 'V', 'B', 'N', NULL, NULL 129*41488Smckusick }; 130*41488Smckusick 131*41488Smckusick char uk_ctrlmap[] = { 132*41488Smckusick NULL, '`', '<', ESC, NULL, DEL, NULL, NULL, 133*41488Smckusick '\n', '\t', NULL, NULL, NULL, NULL, NULL, NULL, 134*41488Smckusick NULL, '\n', NULL, NULL, NULL, NULL, NULL, NULL, 135*41488Smckusick NULL, '\t', NULL, NULL, NULL, NULL, NULL, NULL, 136*41488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 137*41488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, '\b', NULL, 138*41488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 139*41488Smckusick ESC, '\r', NULL, '\n', '0', '.', ',', '+', 140*41488Smckusick '1', '2', '3', '-', '4', '5', '6', '*', 141*41488Smckusick '7', '8', '9', '/', 'E', '(', ')', '\036', 142*41488Smckusick '1', '2', '3', '4', '5', '6', '7', '8', 143*41488Smckusick '9', '0', '+', '\'', '\033', '\035', '*', '\034', 144*41488Smckusick ',', '.', '/', '\040', '\017', '\020', '\013', '\014', 145*41488Smckusick '\021', '\027', '\005', '\022', '\024', '\031', '\025', '\011', 146*41488Smckusick '\001', '\023', '\004', '\006', '\007', '\010', '\012', '\015', 147*41488Smckusick '\032', '\030', '\003', '\026', '\002', '\016', NULL, NULL 148*41488Smckusick }; 149*41488Smckusick #endif 150*41488Smckusick 151*41488Smckusick /* 152*41488Smckusick * The keyboard map table. 153*41488Smckusick * Lookup is by hardware returned language code. 154*41488Smckusick */ 155*41488Smckusick struct kbdmap kbd_map[] = { 156*41488Smckusick KBD_US, NULL, 157*41488Smckusick us_keymap, us_shiftmap, us_ctrlmap, NULL, NULL, 158*41488Smckusick 159*41488Smckusick #ifdef UK_KEYBOARD 160*41488Smckusick KBD_UK, NULL, 161*41488Smckusick uk_keymap, uk_shiftmap, uk_ctrlmap, NULL, NULL, 162*41488Smckusick #endif 163*41488Smckusick 164*41488Smckusick 0, NULL, 165*41488Smckusick NULL, NULL, NULL, NULL, NULL, 166*41488Smckusick }; 167*41488Smckusick 168*41488Smckusick char *kbd_keymap = us_keymap; 169*41488Smckusick char *kbd_shiftmap = us_shiftmap; 170*41488Smckusick char *kbd_ctrlmap = us_ctrlmap; 171*41488Smckusick 172*41488Smckusick kbdgetc() 173*41488Smckusick { 174*41488Smckusick register int status, c; 175*41488Smckusick register struct hil_dev *hiladdr = HILADDR; 176*41488Smckusick 177*41488Smckusick status = hiladdr->hil_stat; 178*41488Smckusick if ((status & HIL_DATA_RDY) == 0) 179*41488Smckusick return(0); 180*41488Smckusick c = hiladdr->hil_data; 181*41488Smckusick switch ((status>>KBD_SSHIFT) & KBD_SMASK) { 182*41488Smckusick case KBD_SHIFT: 183*41488Smckusick c = kbd_shiftmap[c & KBD_CHARMASK]; 184*41488Smckusick break; 185*41488Smckusick case KBD_CTRL: 186*41488Smckusick c = kbd_ctrlmap[c & KBD_CHARMASK]; 187*41488Smckusick break; 188*41488Smckusick case KBD_KEY: 189*41488Smckusick c = kbd_keymap[c & KBD_CHARMASK]; 190*41488Smckusick break; 191*41488Smckusick default: 192*41488Smckusick c = 0; 193*41488Smckusick break; 194*41488Smckusick } 195*41488Smckusick return(c); 196*41488Smckusick } 197*41488Smckusick #endif 198*41488Smckusick 199*41488Smckusick kbdnmi() 200*41488Smckusick { 201*41488Smckusick register struct hil_dev *hiladdr = HILADDR; 202*41488Smckusick 203*41488Smckusick HILWAIT(hiladdr); 204*41488Smckusick hiladdr->hil_cmd = HIL_CNMT; 205*41488Smckusick HILWAIT(hiladdr); 206*41488Smckusick hiladdr->hil_cmd = HIL_CNMT; 207*41488Smckusick HILWAIT(hiladdr); 208*41488Smckusick printf("\nboot interrupted\n"); 209*41488Smckusick } 210*41488Smckusick 211*41488Smckusick kbdinit() 212*41488Smckusick { 213*41488Smckusick register struct hil_dev *hiladdr = HILADDR; 214*41488Smckusick register struct kbdmap *km; 215*41488Smckusick u_char lang; 216*41488Smckusick 217*41488Smckusick HILWAIT(hiladdr); 218*41488Smckusick hiladdr->hil_cmd = HIL_SETARR; 219*41488Smckusick HILWAIT(hiladdr); 220*41488Smckusick hiladdr->hil_data = ar_format(KBD_ARR); 221*41488Smckusick HILWAIT(hiladdr); 222*41488Smckusick hiladdr->hil_cmd = HIL_READKBDLANG; 223*41488Smckusick HILDATAWAIT(hiladdr); 224*41488Smckusick lang = hiladdr->hil_data; 225*41488Smckusick for (km = kbd_map; km->kbd_code; km++) 226*41488Smckusick if (km->kbd_code == lang) { 227*41488Smckusick kbd_keymap = km->kbd_keymap; 228*41488Smckusick kbd_shiftmap = km->kbd_shiftmap; 229*41488Smckusick kbd_ctrlmap = km->kbd_ctrlmap; 230*41488Smckusick } 231*41488Smckusick HILWAIT(hiladdr); 232*41488Smckusick hiladdr->hil_cmd = HIL_INTON; 233*41488Smckusick } 234*41488Smckusick #endif 235