BSD 4_4 development
[unix-history] / .ref-6294d633e80db8e89697db796e6f6025d5af0cae / usr / src / sys / hp300 / stand / ite.c
CommitLineData
a8fd2d0d
KM
1/*
2 * Copyright (c) 1988 University of Utah.
3 * Copyright (c) 1990 The Regents of the University of California.
4 * 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 *
33583b53 12 * from: Utah $Hdr: ite.c 1.23 92/02/28$
a8fd2d0d 13 *
38a01dbe 14 * @(#)ite.c 7.5 (Berkeley) %G%
a8fd2d0d
KM
15 */
16
17/*
18 * Standalone Internal Terminal Emulator (CRT and keyboard)
19 */
38a01dbe 20#include <hp300/stand/samachdep.h>
a8fd2d0d
KM
21
22#ifdef ITECONSOLE
23
38a01dbe
KB
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>
33583b53
MH
29
30extern int nodev();
31extern u_char ite_readbyte();
32extern int ite_writeglyph();
33
34extern int topcat_init(), topcat_putc();
35extern int topcat_clear(), topcat_cursor(), topcat_scroll();
36extern int gbox_init(), gbox_clear();
37extern int gbox_putc(), gbox_cursor(), gbox_scroll();
38extern int rbox_init(), rbox_clear();
39extern int rbox_putc(), rbox_cursor(), rbox_scroll();
40extern int dvbox_init(), dvbox_clear();
41extern int dvbox_putc(), dvbox_cursor(), dvbox_scroll();
42extern int hyper_init(), hyper_clear();
43extern int hyper_putc(), hyper_cursor(), hyper_scroll();
a8fd2d0d
KM
44
45struct itesw itesw[] = {
33583b53
MH
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,
a8fd2d0d 70};
33583b53 71int nitesw = sizeof(itesw) / sizeof(itesw[0]);
a8fd2d0d
KM
72
73/* these guys need to be in initialized data */
74int itecons = -1;
75struct ite_softc ite_softc[NITE] = { 0 };
76
77/*
78 * Locate all bitmapped displays
79 */
80iteconfig()
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;
2bb0988c
MH
89 for (hw = sc_table; hw < &sc_table[MAXCTLRS]; hw++) {
90 if (!HW_ISDEV(hw, D_BITMAP))
a8fd2d0d 91 continue;
2bb0988c 92 gr = (struct grfreg *) hw->hw_kva;
a8fd2d0d
KM
93 /* XXX: redundent but safe */
94 if (badaddr((caddr_t)gr) || gr->gr_id != GRFHWID)
95 continue;
33583b53
MH
96 for (dtype = 0; dtype < nitesw; dtype++)
97 if (itesw[dtype].ite_hwid == gr->gr_id2)
98 break;
99 if (dtype == nitesw)
a8fd2d0d 100 continue;
a8fd2d0d
KM
101 if (i >= NITE)
102 break;
103 ip = &ite_softc[i];
33583b53 104 ip->isw = &itesw[dtype];
a8fd2d0d
KM
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 */
2bb0988c 109 if (ip->regbase >= (caddr_t)DIOIIBASE)
a8fd2d0d 110 ip->fbbase += (int)ip->regbase;
33583b53
MH
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;
a8fd2d0d 115 ip->flags = ITE_ALIVE|ITE_CONSOLE;
a8fd2d0d
KM
116 i++;
117 }
118}
119
120#ifdef CONSDEBUG
121/*
122 * Allows us to cycle through all possible consoles (NITE ites and serial port)
123 * by using SHIFT-RESET on the keyboard.
124 */
125int whichconsole = -1;
126#endif
127
128iteprobe(cp)
129 struct consdev *cp;
130{
131 register int ite;
132 register struct ite_softc *ip;
133 int unit, pri;
134
135#ifdef CONSDEBUG
136 whichconsole = ++whichconsole % (NITE+1);
137#endif
138
139 if (itecons != -1)
140 return(1);
141
142 iteconfig();
143 unit = -1;
144 pri = CN_DEAD;
145 for (ite = 0; ite < NITE; ite++) {
146#ifdef CONSDEBUG
147 if (ite < whichconsole)
148 continue;
149#endif
150 ip = &ite_softc[ite];
151 if ((ip->flags & (ITE_ALIVE|ITE_CONSOLE))
152 != (ITE_ALIVE|ITE_CONSOLE))
153 continue;
154 if ((int)ip->regbase == GRFIADDR) {
155 pri = CN_INTERNAL;
156 unit = ite;
157 } else if (unit < 0) {
158 pri = CN_NORMAL;
159 unit = ite;
160 }
161 }
162 cp->cn_dev = unit;
163 cp->cn_pri = pri;
164}
165
166iteinit(cp)
167 struct consdev *cp;
168{
169 int ite = cp->cn_dev;
170 struct ite_softc *ip;
171
172 if (itecons != -1)
173 return(1);
174
175 ip = &ite_softc[ite];
176
177 ip->curx = 0;
178 ip->cury = 0;
179 ip->cursorx = 0;
180 ip->cursory = 0;
181
33583b53
MH
182 (*ip->isw->ite_init)(ip);
183 (*ip->isw->ite_cursor)(ip, DRAW_CURSOR);
a8fd2d0d
KM
184
185 itecons = ite;
186 kbdinit();
187}
188
189iteputchar(c)
190 register int c;
191{
192 register struct ite_softc *ip = &ite_softc[itecons];
33583b53 193 register struct itesw *sp = ip->isw;
a8fd2d0d
KM
194
195 c &= 0x7F;
196 switch (c) {
197
198 case '\n':
199 if (++ip->cury == ip->rows) {
200 ip->cury--;
201 (*sp->ite_scroll)(ip, 1, 0, 1, SCROLL_UP);
202 ite_clrtoeol(ip, sp, ip->cury, 0);
203 }
204 else
205 (*sp->ite_cursor)(ip, MOVE_CURSOR);
206 break;
207
208 case '\r':
209 ip->curx = 0;
210 (*sp->ite_cursor)(ip, MOVE_CURSOR);
211 break;
212
213 case '\b':
214 if (--ip->curx < 0)
215 ip->curx = 0;
216 else
217 (*sp->ite_cursor)(ip, MOVE_CURSOR);
218 break;
219
220 default:
221 if (c < ' ' || c == 0177)
222 break;
223 (*sp->ite_putc)(ip, c, ip->cury, ip->curx, ATTR_NOR);
224 (*sp->ite_cursor)(ip, DRAW_CURSOR);
225 itecheckwrap(ip, sp);
226 break;
227 }
228}
229
230itecheckwrap(ip, sp)
231 register struct ite_softc *ip;
232 register struct itesw *sp;
233{
234 if (++ip->curx == ip->cols) {
235 ip->curx = 0;
236 if (++ip->cury == ip->rows) {
237 --ip->cury;
238 (*sp->ite_scroll)(ip, 1, 0, 1, SCROLL_UP);
239 ite_clrtoeol(ip, sp, ip->cury, 0);
240 return;
241 }
242 }
243 (*sp->ite_cursor)(ip, MOVE_CURSOR);
244}
245
246ite_clrtoeol(ip, sp, y, x)
247 register struct ite_softc *ip;
248 register struct itesw *sp;
249 register int y, x;
250{
251 (*sp->ite_clear)(ip, y, x, 1, ip->cols - x);
252 (*sp->ite_cursor)(ip, DRAW_CURSOR);
253}
254
255itegetchar()
256{
257#ifdef SMALL
258 return (0);
259#else
260 return (kbdgetc());
261#endif
262}
263#endif