Commit | Line | Data |
---|---|---|
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 | |
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(); | |
a8fd2d0d KM |
44 | |
45 | struct 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 | 71 | int nitesw = sizeof(itesw) / sizeof(itesw[0]); |
a8fd2d0d KM |
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 | */ | |
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; | |
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 | */ | |
125 | int whichconsole = -1; | |
126 | #endif | |
127 | ||
128 | iteprobe(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 | ||
166 | iteinit(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 | ||
189 | iteputchar(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 | ||
230 | itecheckwrap(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 | ||
246 | ite_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 | ||
255 | itegetchar() | |
256 | { | |
257 | #ifdef SMALL | |
258 | return (0); | |
259 | #else | |
260 | return (kbdgetc()); | |
261 | #endif | |
262 | } | |
263 | #endif |