141488Smckusick /* 241488Smckusick * Copyright (c) 1988 University of Utah. 341488Smckusick * Copyright (c) 1990 The Regents of the University of California. 441488Smckusick * All rights reserved. 541488Smckusick * 641488Smckusick * This code is derived from software contributed to Berkeley by 741488Smckusick * the Systems Programming Group of the University of Utah Computer 841488Smckusick * Science Department. 941488Smckusick * 1041488Smckusick * %sccs.include.redist.c% 1141488Smckusick * 1241488Smckusick * from: Utah $Hdr: hil.c 1.1 89/08/22$ 1341488Smckusick * 14*56510Sbostic * @(#)hil.c 7.4 (Berkeley) 10/11/92 1541488Smckusick */ 1641488Smckusick 1741488Smckusick /* 1841488Smckusick * Keyboard routines for the standalone ITE. 1941488Smckusick */ 20*56510Sbostic #include <hp300/stand/samachdep.h> 2141488Smckusick 2241488Smckusick #ifdef ITECONSOLE 2341488Smckusick 24*56510Sbostic #include <sys/param.h> 25*56510Sbostic #include <hp/dev/hilreg.h> 26*56510Sbostic #include <hp/dev/kbdmap.h> 27*56510Sbostic #include <hp/dev/itevar.h> 2841488Smckusick 2941488Smckusick #ifndef SMALL 3041488Smckusick 3141488Smckusick /* 3241488Smckusick * HIL cooked keyboard keymaps. 3341488Smckusick * Supports only unshifted, shifted and control keys. 3441488Smckusick */ 3541488Smckusick char us_keymap[] = { 3641488Smckusick NULL, '`', '\\', ESC, NULL, DEL, NULL, NULL, 3741488Smckusick '\n', '\t', NULL, NULL, NULL, NULL, NULL, NULL, 3841488Smckusick NULL, '\n', NULL, NULL, NULL, NULL, NULL, NULL, 3941488Smckusick NULL, '\t', NULL, NULL, NULL, NULL, NULL, NULL, 4041488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 4141488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, '\b', NULL, 4241488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 4341488Smckusick ESC, '\r', NULL, '\n', '0', '.', ',', '+', 4441488Smckusick '1', '2', '3', '-', '4', '5', '6', '*', 4541488Smckusick '7', '8', '9', '/', 'E', '(', ')', '^', 4641488Smckusick '1', '2', '3', '4', '5', '6', '7', '8', 4741488Smckusick '9', '0', '-', '=', '[', ']', ';', '\'', 4841488Smckusick ',', '.', '/', '\040', 'o', 'p', 'k', 'l', 4941488Smckusick 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 5041488Smckusick 'a', 's', 'd', 'f', 'g', 'h', 'j', 'm', 5141488Smckusick 'z', 'x', 'c', 'v', 'b', 'n', NULL, NULL 5241488Smckusick }; 5341488Smckusick 5441488Smckusick char us_shiftmap[] = { 5541488Smckusick NULL, '~', '|', DEL, NULL, DEL, NULL, NULL, 5641488Smckusick '\n', '\t', NULL, NULL, NULL, NULL, NULL, NULL, 5741488Smckusick NULL, '\n', NULL, NULL, NULL, NULL, NULL, NULL, 5841488Smckusick NULL, '\t', NULL, NULL, NULL, NULL, NULL, NULL, 5941488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 6041488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, DEL, NULL, 6141488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 6241488Smckusick ESC, '\r', NULL, '\n', '0', '.', ',', '+', 6341488Smckusick '1', '2', '3', '-', '4', '5', '6', '*', 6441488Smckusick '7', '8', '9', '/', '`', '|', '\\', '~', 6541488Smckusick '!', '@', '#', '$', '%', '^', '&', '*', 6641488Smckusick '(', ')', '_', '+', '{', '}', ':', '\"', 6741488Smckusick '<', '>', '?', '\040', 'O', 'P', 'K', 'L', 6841488Smckusick 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 6941488Smckusick 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'M', 7041488Smckusick 'Z', 'X', 'C', 'V', 'B', 'N', NULL, NULL 7141488Smckusick }; 7241488Smckusick 7341488Smckusick char us_ctrlmap[] = { 7441488Smckusick NULL, '`', '\034', ESC, NULL, DEL, NULL, NULL, 7541488Smckusick '\n', '\t', NULL, NULL, NULL, NULL, NULL, NULL, 7641488Smckusick NULL, '\n', NULL, NULL, NULL, NULL, NULL, NULL, 7741488Smckusick NULL, '\t', NULL, NULL, NULL, NULL, NULL, NULL, 7841488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 7941488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, '\b', NULL, 8041488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 8141488Smckusick ESC, '\r', NULL, '\n', '0', '.', ',', '+', 8241488Smckusick '1', '2', '3', '-', '4', '5', '6', '*', 8341488Smckusick '7', '8', '9', '/', 'E', '(', ')', '\036', 8441488Smckusick '1', '2', '3', '4', '5', '6', '7', '8', 8541488Smckusick '9', '0', '-', '=', '\033', '\035', ';', '\'', 8641488Smckusick ',', '.', '/', '\040', '\017', '\020', '\013', '\014', 8741488Smckusick '\021', '\027', '\005', '\022', '\024', '\031', '\025', '\011', 8841488Smckusick '\001', '\023', '\004', '\006', '\007', '\010', '\012', '\015', 8941488Smckusick '\032', '\030', '\003', '\026', '\002', '\016', NULL, NULL 9041488Smckusick }; 9141488Smckusick 9241488Smckusick #ifdef UK_KEYBOARD 9341488Smckusick char uk_keymap[] = { 9441488Smckusick NULL, '`', '<', ESC, NULL, DEL, NULL, NULL, 9541488Smckusick '\n', '\t', NULL, NULL, NULL, NULL, NULL, NULL, 9641488Smckusick NULL, '\n', NULL, NULL, NULL, NULL, NULL, NULL, 9741488Smckusick NULL, '\t', NULL, NULL, NULL, NULL, NULL, NULL, 9841488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 9941488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, '\b', NULL, 10041488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 10141488Smckusick ESC, '\r', NULL, '\n', '0', '.', ',', '+', 10241488Smckusick '1', '2', '3', '-', '4', '5', '6', '*', 10341488Smckusick '7', '8', '9', '/', 'E', '(', ')', '^', 10441488Smckusick '1', '2', '3', '4', '5', '6', '7', '8', 10541488Smckusick '9', '0', '+', '\'', '[', ']', '*', '\\', 10641488Smckusick ',', '.', '-', '\040', 'o', 'p', 'k', 'l', 10741488Smckusick 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 10841488Smckusick 'a', 's', 'd', 'f', 'g', 'h', 'j', 'm', 10941488Smckusick 'z', 'x', 'c', 'v', 'b', 'n', NULL, NULL 11041488Smckusick }; 11141488Smckusick 11241488Smckusick char uk_shiftmap[] = { 11341488Smckusick NULL, '~', '>', DEL, NULL, DEL, NULL, NULL, 11441488Smckusick '\n', '\t', NULL, NULL, NULL, NULL, NULL, NULL, 11541488Smckusick NULL, '\n', NULL, NULL, NULL, NULL, NULL, NULL, 11641488Smckusick NULL, '\t', NULL, NULL, NULL, NULL, NULL, NULL, 11741488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 11841488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, DEL, NULL, 11941488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 12041488Smckusick ESC, '\r', NULL, '\n', '0', '.', ',', '+', 12141488Smckusick '1', '2', '3', '-', '4', '5', '6', '*', 12241488Smckusick '7', '8', '9', '/', '`', '|', '\\', '~', 12341488Smckusick '!', '\"', '#', '$', '%', '&', '^', '(', 12441488Smckusick ')', '=', '?', '/', '{', '}', '@', '|', 12541488Smckusick ';', ':', '_', '\040', 'O', 'P', 'K', 'L', 12641488Smckusick 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 12741488Smckusick 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'M', 12841488Smckusick 'Z', 'X', 'C', 'V', 'B', 'N', NULL, NULL 12941488Smckusick }; 13041488Smckusick 13141488Smckusick char uk_ctrlmap[] = { 13241488Smckusick NULL, '`', '<', ESC, NULL, DEL, NULL, NULL, 13341488Smckusick '\n', '\t', NULL, NULL, NULL, NULL, NULL, NULL, 13441488Smckusick NULL, '\n', NULL, NULL, NULL, NULL, NULL, NULL, 13541488Smckusick NULL, '\t', NULL, NULL, NULL, NULL, NULL, NULL, 13641488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 13741488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, '\b', NULL, 13841488Smckusick NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 13941488Smckusick ESC, '\r', NULL, '\n', '0', '.', ',', '+', 14041488Smckusick '1', '2', '3', '-', '4', '5', '6', '*', 14141488Smckusick '7', '8', '9', '/', 'E', '(', ')', '\036', 14241488Smckusick '1', '2', '3', '4', '5', '6', '7', '8', 14341488Smckusick '9', '0', '+', '\'', '\033', '\035', '*', '\034', 14441488Smckusick ',', '.', '/', '\040', '\017', '\020', '\013', '\014', 14541488Smckusick '\021', '\027', '\005', '\022', '\024', '\031', '\025', '\011', 14641488Smckusick '\001', '\023', '\004', '\006', '\007', '\010', '\012', '\015', 14741488Smckusick '\032', '\030', '\003', '\026', '\002', '\016', NULL, NULL 14841488Smckusick }; 14941488Smckusick #endif 15041488Smckusick 15141488Smckusick /* 15241488Smckusick * The keyboard map table. 15341488Smckusick * Lookup is by hardware returned language code. 15441488Smckusick */ 15541488Smckusick struct kbdmap kbd_map[] = { 15641488Smckusick KBD_US, NULL, 15741488Smckusick us_keymap, us_shiftmap, us_ctrlmap, NULL, NULL, 15841488Smckusick 15941488Smckusick #ifdef UK_KEYBOARD 16041488Smckusick KBD_UK, NULL, 16141488Smckusick uk_keymap, uk_shiftmap, uk_ctrlmap, NULL, NULL, 16241488Smckusick #endif 16341488Smckusick 16441488Smckusick 0, NULL, 16541488Smckusick NULL, NULL, NULL, NULL, NULL, 16641488Smckusick }; 16741488Smckusick 16841488Smckusick char *kbd_keymap = us_keymap; 16941488Smckusick char *kbd_shiftmap = us_shiftmap; 17041488Smckusick char *kbd_ctrlmap = us_ctrlmap; 17141488Smckusick 17241488Smckusick kbdgetc() 17341488Smckusick { 17441488Smckusick register int status, c; 17541488Smckusick register struct hil_dev *hiladdr = HILADDR; 17641488Smckusick 17741488Smckusick status = hiladdr->hil_stat; 17841488Smckusick if ((status & HIL_DATA_RDY) == 0) 17941488Smckusick return(0); 18041488Smckusick c = hiladdr->hil_data; 18141488Smckusick switch ((status>>KBD_SSHIFT) & KBD_SMASK) { 18241488Smckusick case KBD_SHIFT: 18341488Smckusick c = kbd_shiftmap[c & KBD_CHARMASK]; 18441488Smckusick break; 18541488Smckusick case KBD_CTRL: 18641488Smckusick c = kbd_ctrlmap[c & KBD_CHARMASK]; 18741488Smckusick break; 18841488Smckusick case KBD_KEY: 18941488Smckusick c = kbd_keymap[c & KBD_CHARMASK]; 19041488Smckusick break; 19141488Smckusick default: 19241488Smckusick c = 0; 19341488Smckusick break; 19441488Smckusick } 19541488Smckusick return(c); 19641488Smckusick } 19741488Smckusick #endif 19841488Smckusick 19941488Smckusick kbdnmi() 20041488Smckusick { 20141488Smckusick register struct hil_dev *hiladdr = HILADDR; 20241488Smckusick 20341488Smckusick HILWAIT(hiladdr); 20441488Smckusick hiladdr->hil_cmd = HIL_CNMT; 20541488Smckusick HILWAIT(hiladdr); 20641488Smckusick hiladdr->hil_cmd = HIL_CNMT; 20741488Smckusick HILWAIT(hiladdr); 20841488Smckusick printf("\nboot interrupted\n"); 20941488Smckusick } 21041488Smckusick 21141488Smckusick kbdinit() 21241488Smckusick { 21341488Smckusick register struct hil_dev *hiladdr = HILADDR; 21441488Smckusick register struct kbdmap *km; 21541488Smckusick u_char lang; 21641488Smckusick 21741488Smckusick HILWAIT(hiladdr); 21841488Smckusick hiladdr->hil_cmd = HIL_SETARR; 21941488Smckusick HILWAIT(hiladdr); 22041488Smckusick hiladdr->hil_data = ar_format(KBD_ARR); 22141488Smckusick HILWAIT(hiladdr); 22241488Smckusick hiladdr->hil_cmd = HIL_READKBDLANG; 22341488Smckusick HILDATAWAIT(hiladdr); 22441488Smckusick lang = hiladdr->hil_data; 22541488Smckusick for (km = kbd_map; km->kbd_code; km++) 22641488Smckusick if (km->kbd_code == lang) { 22741488Smckusick kbd_keymap = km->kbd_keymap; 22841488Smckusick kbd_shiftmap = km->kbd_shiftmap; 22941488Smckusick kbd_ctrlmap = km->kbd_ctrlmap; 23041488Smckusick } 23141488Smckusick HILWAIT(hiladdr); 23241488Smckusick hiladdr->hil_cmd = HIL_INTON; 23341488Smckusick } 23441488Smckusick #endif 235