xref: /csrg-svn/sys/hp300/stand/hil.c (revision 63163)
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