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