1 /*
2 * Copyright (c) 1988 University of Utah.
3 * Copyright (c) 1990, 1993
4 * The Regents of the University of California. All rights reserved.
5 *
6 * This code is derived from software contributed to Berkeley by
7 * the Systems Programming Group of the University of Utah Computer
8 * Science Department.
9 *
10 * %sccs.include.redist.c%
11 *
12 * from: Utah $Hdr: ite.c 1.24 93/06/25$
13 *
14 * @(#)ite.c 8.1 (Berkeley) 07/08/93
15 */
16
17 /*
18 * Standalone Internal Terminal Emulator (CRT and keyboard)
19 */
20 #include <hp300/stand/samachdep.h>
21
22 #ifdef ITECONSOLE
23
24 #include <sys/param.h>
25 #include <hp/dev/cons.h>
26 #include <hp/dev/device.h>
27 #include <hp/dev/itevar.h>
28 #include <hp/dev/grfreg.h>
29
30 extern int nodev();
31 extern u_char ite_readbyte();
32 extern int ite_writeglyph();
33
34 extern int topcat_init(), topcat_putc();
35 extern int topcat_clear(), topcat_cursor(), topcat_scroll();
36 extern int gbox_init(), gbox_clear();
37 extern int gbox_putc(), gbox_cursor(), gbox_scroll();
38 extern int rbox_init(), rbox_clear();
39 extern int rbox_putc(), rbox_cursor(), rbox_scroll();
40 extern int dvbox_init(), dvbox_clear();
41 extern int dvbox_putc(), dvbox_cursor(), dvbox_scroll();
42 extern int hyper_init(), hyper_clear();
43 extern int hyper_putc(), hyper_cursor(), hyper_scroll();
44
45 struct itesw itesw[] = {
46 GID_TOPCAT,
47 topcat_init, nodev, topcat_clear, topcat_putc,
48 topcat_cursor, topcat_scroll, ite_readbyte, ite_writeglyph,
49 GID_GATORBOX,
50 gbox_init, nodev, gbox_clear, gbox_putc,
51 gbox_cursor, gbox_scroll, ite_readbyte, ite_writeglyph,
52 GID_RENAISSANCE,
53 rbox_init, nodev, rbox_clear, rbox_putc,
54 rbox_cursor, rbox_scroll, ite_readbyte, ite_writeglyph,
55 GID_LRCATSEYE,
56 topcat_init, nodev, topcat_clear, topcat_putc,
57 topcat_cursor, topcat_scroll, ite_readbyte, ite_writeglyph,
58 GID_HRCCATSEYE,
59 topcat_init, nodev, topcat_clear, topcat_putc,
60 topcat_cursor, topcat_scroll, ite_readbyte, ite_writeglyph,
61 GID_HRMCATSEYE,
62 topcat_init, nodev, topcat_clear, topcat_putc,
63 topcat_cursor, topcat_scroll, ite_readbyte, ite_writeglyph,
64 GID_DAVINCI,
65 dvbox_init, nodev, dvbox_clear, dvbox_putc,
66 dvbox_cursor, dvbox_scroll, ite_readbyte, ite_writeglyph,
67 GID_HYPERION,
68 hyper_init, nodev, hyper_clear, hyper_putc,
69 hyper_cursor, hyper_scroll, ite_readbyte, ite_writeglyph,
70 };
71 int nitesw = sizeof(itesw) / sizeof(itesw[0]);
72
73 /* these guys need to be in initialized data */
74 int itecons = -1;
75 struct ite_softc ite_softc[NITE] = { 0 };
76
77 /*
78 * Locate all bitmapped displays
79 */
iteconfig()80 iteconfig()
81 {
82 extern struct hp_hw sc_table[];
83 int dtype, fboff, i;
84 struct hp_hw *hw;
85 struct grfreg *gr;
86 struct ite_softc *ip;
87
88 i = 0;
89 for (hw = sc_table; hw < &sc_table[MAXCTLRS]; hw++) {
90 if (!HW_ISDEV(hw, D_BITMAP))
91 continue;
92 gr = (struct grfreg *) hw->hw_kva;
93 /* XXX: redundent but safe */
94 if (badaddr((caddr_t)gr) || gr->gr_id != GRFHWID)
95 continue;
96 for (dtype = 0; dtype < nitesw; dtype++)
97 if (itesw[dtype].ite_hwid == gr->gr_id2)
98 break;
99 if (dtype == nitesw)
100 continue;
101 if (i >= NITE)
102 break;
103 ip = &ite_softc[i];
104 ip->isw = &itesw[dtype];
105 ip->regbase = (caddr_t) gr;
106 fboff = (gr->gr_fbomsb << 8) | gr->gr_fbolsb;
107 ip->fbbase = (caddr_t) (*((u_char *)ip->regbase+fboff) << 16);
108 /* DIO II: FB offset is relative to select code space */
109 if (ip->regbase >= (caddr_t)DIOIIBASE)
110 ip->fbbase += (int)ip->regbase;
111 ip->fbwidth = gr->gr_fbwidth_h << 8 | gr->gr_fbwidth_l;
112 ip->fbheight = gr->gr_fbheight_h << 8 | gr->gr_fbheight_l;
113 ip->dwidth = gr->gr_dwidth_h << 8 | gr->gr_dwidth_l;
114 ip->dheight = gr->gr_dheight_h << 8 | gr->gr_dheight_l;
115 /*
116 * XXX some displays (e.g. the davinci) appear
117 * to return a display height greater than the
118 * returned FB height. Guess we should go back
119 * to getting the display dimensions from the
120 * fontrom...
121 */
122 if (ip->dwidth > ip->fbwidth)
123 ip->dwidth = ip->fbwidth;
124 if (ip->dheight > ip->fbheight)
125 ip->dheight = ip->fbheight;
126 ip->flags = ITE_ALIVE|ITE_CONSOLE;
127 i++;
128 }
129 }
130
131 #ifdef CONSDEBUG
132 /*
133 * Allows us to cycle through all possible consoles (NITE ites and serial port)
134 * by using SHIFT-RESET on the keyboard.
135 */
136 int whichconsole = -1;
137 #endif
138
139 iteprobe(cp)
140 struct consdev *cp;
141 {
142 register int ite;
143 register struct ite_softc *ip;
144 int unit, pri;
145
146 #ifdef CONSDEBUG
147 whichconsole = ++whichconsole % (NITE+1);
148 #endif
149
150 if (itecons != -1)
151 return(1);
152
153 iteconfig();
154 unit = -1;
155 pri = CN_DEAD;
156 for (ite = 0; ite < NITE; ite++) {
157 #ifdef CONSDEBUG
158 if (ite < whichconsole)
159 continue;
160 #endif
161 ip = &ite_softc[ite];
162 if ((ip->flags & (ITE_ALIVE|ITE_CONSOLE))
163 != (ITE_ALIVE|ITE_CONSOLE))
164 continue;
165 if ((int)ip->regbase == GRFIADDR) {
166 pri = CN_INTERNAL;
167 unit = ite;
168 } else if (unit < 0) {
169 pri = CN_NORMAL;
170 unit = ite;
171 }
172 }
173 cp->cn_dev = unit;
174 cp->cn_pri = pri;
175 }
176
177 iteinit(cp)
178 struct consdev *cp;
179 {
180 int ite = cp->cn_dev;
181 struct ite_softc *ip;
182
183 if (itecons != -1)
184 return(1);
185
186 ip = &ite_softc[ite];
187
188 ip->curx = 0;
189 ip->cury = 0;
190 ip->cursorx = 0;
191 ip->cursory = 0;
192
193 (*ip->isw->ite_init)(ip);
194 (*ip->isw->ite_cursor)(ip, DRAW_CURSOR);
195
196 itecons = ite;
197 kbdinit();
198 }
199
iteputchar(c)200 iteputchar(c)
201 register int c;
202 {
203 register struct ite_softc *ip = &ite_softc[itecons];
204 register struct itesw *sp = ip->isw;
205
206 c &= 0x7F;
207 switch (c) {
208
209 case '\n':
210 if (++ip->cury == ip->rows) {
211 ip->cury--;
212 (*sp->ite_scroll)(ip, 1, 0, 1, SCROLL_UP);
213 ite_clrtoeol(ip, sp, ip->cury, 0);
214 }
215 else
216 (*sp->ite_cursor)(ip, MOVE_CURSOR);
217 break;
218
219 case '\r':
220 ip->curx = 0;
221 (*sp->ite_cursor)(ip, MOVE_CURSOR);
222 break;
223
224 case '\b':
225 if (--ip->curx < 0)
226 ip->curx = 0;
227 else
228 (*sp->ite_cursor)(ip, MOVE_CURSOR);
229 break;
230
231 default:
232 if (c < ' ' || c == 0177)
233 break;
234 (*sp->ite_putc)(ip, c, ip->cury, ip->curx, ATTR_NOR);
235 (*sp->ite_cursor)(ip, DRAW_CURSOR);
236 itecheckwrap(ip, sp);
237 break;
238 }
239 }
240
itecheckwrap(ip,sp)241 itecheckwrap(ip, sp)
242 register struct ite_softc *ip;
243 register struct itesw *sp;
244 {
245 if (++ip->curx == ip->cols) {
246 ip->curx = 0;
247 if (++ip->cury == ip->rows) {
248 --ip->cury;
249 (*sp->ite_scroll)(ip, 1, 0, 1, SCROLL_UP);
250 ite_clrtoeol(ip, sp, ip->cury, 0);
251 return;
252 }
253 }
254 (*sp->ite_cursor)(ip, MOVE_CURSOR);
255 }
256
ite_clrtoeol(ip,sp,y,x)257 ite_clrtoeol(ip, sp, y, x)
258 register struct ite_softc *ip;
259 register struct itesw *sp;
260 register int y, x;
261 {
262 (*sp->ite_clear)(ip, y, x, 1, ip->cols - x);
263 (*sp->ite_cursor)(ip, DRAW_CURSOR);
264 }
265
itegetchar()266 itegetchar()
267 {
268 #ifdef SMALL
269 return (0);
270 #else
271 return (kbdgetc());
272 #endif
273 }
274 #endif
275