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