xref: /netbsd-src/sys/arch/hp300/stand/common/hil.c (revision 8448487e704668efb4dc7a0968d659270341fd19)
1 /*	$NetBSD: hil.c,v 1.15 2023/01/15 06:19:46 tsutsui Exp $	*/
2 
3 /*-
4  * Copyright (c) 1997 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Jason R. Thorpe.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 /*
33  * Copyright (c) 1988 University of Utah.
34  * Copyright (c) 1990, 1993
35  *	The Regents of the University of California.  All rights reserved.
36  *
37  * This code is derived from software contributed to Berkeley by
38  * the Systems Programming Group of the University of Utah Computer
39  * Science Department.
40  *
41  * Redistribution and use in source and binary forms, with or without
42  * modification, are permitted provided that the following conditions
43  * are met:
44  * 1. Redistributions of source code must retain the above copyright
45  *    notice, this list of conditions and the following disclaimer.
46  * 2. Redistributions in binary form must reproduce the above copyright
47  *    notice, this list of conditions and the following disclaimer in the
48  *    documentation and/or other materials provided with the distribution.
49  * 3. Neither the name of the University nor the names of its contributors
50  *    may be used to endorse or promote products derived from this software
51  *    without specific prior written permission.
52  *
53  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
54  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
55  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
56  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
57  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
58  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
59  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
60  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
61  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
62  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
63  * SUCH DAMAGE.
64  *
65  * from: Utah Hdr: hil.c 1.1 89/08/22
66  *
67  *	@(#)hil.c	8.1 (Berkeley) 6/10/93
68  */
69 
70 /*
71  * HIL keyboard routines for the standalone ITE.
72  */
73 
74 #if defined(ITECONSOLE) && defined(HIL_KEYBOARD)
75 
76 #include <sys/param.h>
77 
78 #include <hp300/stand/common/hilreg.h>
79 #include <hp300/stand/common/kbdmap.h>
80 #include <hp300/stand/common/itevar.h>
81 
82 #include <hp300/stand/common/samachdep.h>
83 #include <hp300/stand/common/kbdvar.h>
84 
85 #ifndef SMALL
86 
87 /*
88  * HIL cooked keyboard keymaps.
89  * Supports only unshifted, shifted and control keys.
90  */
91 char hil_us_keymap[] = {
92 	'\0',	'`',	'\\',	ESC,	'\0',	DEL,	'\0',	'\0',
93 	'\n',	'\t',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
94 	'\0',	'\n',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
95 	'\0',	'\t',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
96 	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
97 	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\b',	'\0',
98 	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
99 	ESC,	'\r',	'\0',	'\n',	'0',	'.',	',',	'+',
100 	'1',	'2',	'3',	'-',	'4',	'5',	'6',	'*',
101 	'7',	'8',	'9',	'/',	'E',	'(',	')',	'^',
102 	'1',	'2',	'3',	'4',	'5',	'6',	'7',	'8',
103 	'9',	'0',	'-',	'=',	'[',	']',	';',	'\'',
104 	',',	'.',	'/',	'\040',	'o',	'p',	'k',	'l',
105 	'q',	'w',	'e',	'r',	't',	'y',	'u',	'i',
106 	'a',	's',	'd',	'f',	'g',	'h',	'j',	'm',
107 	'z',	'x',	'c',	'v',	'b',	'n',	'\0',	'\0'
108 };
109 
110 char hil_us_shiftmap[] = {
111 	'\0',	'~',	'|',	DEL,	'\0',	DEL,	'\0',	'\0',
112 	'\n',	'\t',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
113 	'\0',	'\n',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
114 	'\0',	'\t',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
115 	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
116 	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	DEL,	'\0',
117 	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
118 	ESC,	'\r',	'\0',	'\n',	'0',	'.',	',',	'+',
119 	'1',	'2',	'3',	'-',	'4',	'5',	'6',	'*',
120 	'7',	'8',	'9',	'/',	'`',	'|',	'\\',	'~',
121 	'!',	'@',	'#',	'$',	'%',	'^',	'&',	'*',
122 	'(',	')',	'_',	'+',	'{',	'}',	':',	'\"',
123 	'<',	'>',	'?',	'\040',	'O',	'P',	'K',	'L',
124 	'Q',	'W',	'E',	'R',	'T',	'Y',	'U',	'I',
125 	'A',	'S',	'D',	'F',	'G',	'H',	'J',	'M',
126 	'Z',	'X',	'C',	'V',	'B',	'N',	'\0',	'\0'
127 };
128 
129 char hil_us_ctrlmap[] = {
130 	'\0',	'`',	'\034',	ESC,	'\0',	DEL,	'\0',	'\0',
131 	'\n',	'\t',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
132 	'\0',	'\n',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
133 	'\0',	'\t',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
134 	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
135 	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\b',	'\0',
136 	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
137 	ESC,	'\r',	'\0',	'\n',	'0',	'.',	',',	'+',
138 	'1',	'2',	'3',	'-',	'4',	'5',	'6',	'*',
139 	'7',	'8',	'9',	'/',	'E',	'(',	')',	'\036',
140 	'1',	'2',	'3',	'4',	'5',	'6',	'7',	'8',
141 	'9',	'0',	'-',	'=',	'\033',	'\035',	';',	'\'',
142 	',',	'.',	'/',	'\040',	'\017',	'\020',	'\013',	'\014',
143 	'\021',	'\027',	'\005',	'\022',	'\024',	'\031',	'\025',	'\011',
144 	'\001',	'\023',	'\004',	'\006',	'\007',	'\010',	'\012',	'\015',
145 	'\032',	'\030',	'\003',	'\026',	'\002',	'\016',	'\0',	'\0'
146 };
147 
148 #ifdef UK_KEYBOARD
149 char hil_uk_keymap[] = {
150 	'\0',	'`',	'<',	ESC,	'\0',	DEL,	'\0',	'\0',
151 	'\n',	'\t',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
152 	'\0',	'\n',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
153 	'\0',	'\t',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
154 	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
155 	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\b',	'\0',
156 	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
157 	ESC,	'\r',	'\0',	'\n',	'0',	'.',	',',	'+',
158 	'1',	'2',	'3',	'-',	'4',	'5',	'6',	'*',
159 	'7',	'8',	'9',	'/',	'E',	'(',	')',	'^',
160 	'1',	'2',	'3',	'4',	'5',	'6',	'7',	'8',
161 	'9',	'0',	'+',	'\'',	'[',	']',	'*',	'\\',
162 	',',	'.',	'-',	'\040',	'o',	'p',	'k',	'l',
163 	'q',	'w',	'e',	'r',	't',	'y',	'u',	'i',
164 	'a',	's',	'd',	'f',	'g',	'h',	'j',	'm',
165 	'z',	'x',	'c',	'v',	'b',	'n',	'\0',	'\0'
166 };
167 
168 char hil_uk_shiftmap[] = {
169 	'\0',	'~',	'>',	DEL,	'\0',	DEL,	'\0',	'\0',
170 	'\n',	'\t',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
171 	'\0',	'\n',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
172 	'\0',	'\t',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
173 	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
174 	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	DEL,	'\0',
175 	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
176 	ESC,	'\r',	'\0',	'\n',	'0',	'.',	',',	'+',
177 	'1',	'2',	'3',	'-',	'4',	'5',	'6',	'*',
178 	'7',	'8',	'9',	'/',	'`',	'|',	'\\',	'~',
179 	'!',	'\"',	'#',	'$',	'%',	'&',	'^',	'(',
180 	')',	'=',	'?',	'/',	'{',	'}',	'@',	'|',
181 	';',	':',	'_',	'\040',	'O',	'P',	'K',	'L',
182 	'Q',	'W',	'E',	'R',	'T',	'Y',	'U',	'I',
183 	'A',	'S',	'D',	'F',	'G',	'H',	'J',	'M',
184 	'Z',	'X',	'C',	'V',	'B',	'N',	'\0',	'\0'
185 };
186 
187 char hil_uk_ctrlmap[] = {
188 	'\0',	'`',	'<',	ESC,	'\0',	DEL,	'\0',	'\0',
189 	'\n',	'\t',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
190 	'\0',	'\n',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
191 	'\0',	'\t',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
192 	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
193 	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\b',	'\0',
194 	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',	'\0',
195 	ESC,	'\r',	'\0',	'\n',	'0',	'.',	',',	'+',
196 	'1',	'2',	'3',	'-',	'4',	'5',	'6',	'*',
197 	'7',	'8',	'9',	'/',	'E',	'(',	')',	'\036',
198 	'1',	'2',	'3',	'4',	'5',	'6',	'7',	'8',
199 	'9',	'0',	'+',	'\'',	'\033',	'\035',	'*',	'\034',
200 	',',	'.',	'/',	'\040',	'\017',	'\020',	'\013',	'\014',
201 	'\021',	'\027',	'\005',	'\022',	'\024',	'\031',	'\025',	'\011',
202 	'\001',	'\023',	'\004',	'\006',	'\007',	'\010',	'\012',	'\015',
203 	'\032',	'\030',	'\003',	'\026',	'\002',	'\016',	'\0',	'\0'
204 };
205 #endif
206 
207 /*
208  * The keyboard map table.
209  * Lookup is by hardware returned language code.
210  */
211 struct kbdmap hilkbd_map[] = {
212 	{ KBD_US, "",
213 	    hil_us_keymap, hil_us_shiftmap, hil_us_ctrlmap, NULL, NULL},
214 
215 #ifdef UK_KEYBOARD
216 	{ KBD_UK, "",
217 	    hil_uk_keymap, hil_uk_shiftmap, hil_uk_ctrlmap, NULL, NULL},
218 #endif
219 
220 	{ 0, "",
221 	    NULL, NULL, NULL, NULL, NULL},
222 };
223 
224 char	*hilkbd_keymap = hil_us_keymap;
225 char	*hilkbd_shiftmap = hil_us_shiftmap;
226 char	*hilkbd_ctrlmap = hil_us_ctrlmap;
227 
228 int
hilkbd_getc(void)229 hilkbd_getc(void)
230 {
231 	int status, c;
232 	struct hil_dev *hiladdr = HILADDR;
233 
234 	status = hiladdr->hil_stat;
235 	if ((status & HIL_DATA_RDY) == 0)
236 		return 0;
237 	c = hiladdr->hil_data;
238 	switch ((status>>KBD_SSHIFT) & KBD_SMASK) {
239 	case KBD_SHIFT:
240 		c = hilkbd_shiftmap[c & KBD_CHARMASK];
241 		break;
242 	case KBD_CTRL:
243 		c = hilkbd_ctrlmap[c & KBD_CHARMASK];
244 		break;
245 	case KBD_KEY:
246 		c = hilkbd_keymap[c & KBD_CHARMASK];
247 		break;
248 	default:
249 		c = 0;
250 		break;
251 	}
252 	return c;
253 }
254 #endif /* SMALL */
255 
256 void
hilkbd_nmi(void)257 hilkbd_nmi(void)
258 {
259 	struct hil_dev *hiladdr = HILADDR;
260 
261 	HILWAIT(hiladdr);
262 	hiladdr->hil_cmd = HIL_CNMT;
263 	HILWAIT(hiladdr);
264 	hiladdr->hil_cmd = HIL_CNMT;
265 	HILWAIT(hiladdr);
266 }
267 
268 int
hilkbd_init(void)269 hilkbd_init(void)
270 {
271 	struct hil_dev *hiladdr = HILADDR;
272 	struct kbdmap *km;
273 	u_char lang;
274 
275 	/*
276 	 * Determine the existence of a HIL keyboard.
277 	 */
278 	HILWAIT(hiladdr);
279 	hiladdr->hil_cmd = HIL_READKBDSADR;
280 	HILDATAWAIT(hiladdr);
281 	lang = hiladdr->hil_data;
282 	if (lang == 0)
283 		return 0;
284 
285 	HILWAIT(hiladdr);
286 	hiladdr->hil_cmd = HIL_SETARR;
287 	HILWAIT(hiladdr);
288 	hiladdr->hil_data = ar_format(KBD_ARR);
289 	HILWAIT(hiladdr);
290 	hiladdr->hil_cmd = HIL_READKBDLANG;
291 	HILDATAWAIT(hiladdr);
292 	lang = hiladdr->hil_data;
293 	for (km = hilkbd_map; km->kbd_code; km++) {
294 		if (km->kbd_code == lang) {
295 			hilkbd_keymap = km->kbd_keymap;
296 			hilkbd_shiftmap = km->kbd_shiftmap;
297 			hilkbd_ctrlmap = km->kbd_ctrlmap;
298 		}
299 	}
300 	HILWAIT(hiladdr);
301 	hiladdr->hil_cmd = HIL_INTON;
302 	return 1;
303 }
304 #endif /* ITECONSOLE && HIL_KEYBOARD */
305