141488Smckusick /*
241488Smckusick * Copyright (c) 1988 University of Utah.
3*63163Sbostic * Copyright (c) 1990, 1993
4*63163Sbostic * The Regents of the University of California. 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*63163Sbostic * @(#)hil.c 8.1 (Berkeley) 06/10/93
1541488Smckusick */
1641488Smckusick
1741488Smckusick /*
1841488Smckusick * Keyboard routines for the standalone ITE.
1941488Smckusick */
2056510Sbostic #include <hp300/stand/samachdep.h>
2141488Smckusick
2241488Smckusick #ifdef ITECONSOLE
2341488Smckusick
2456510Sbostic #include <sys/param.h>
2556510Sbostic #include <hp/dev/hilreg.h>
2656510Sbostic #include <hp/dev/kbdmap.h>
2756510Sbostic #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
kbdgetc()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
kbdnmi()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
kbdinit()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