|
|
1.1 root 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: * 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: * 3. All advertising materials mentioning features or use of this software
19: * must display the following acknowledgement:
20: * This product includes software developed by the University of
21: * California, Berkeley and its contributors.
22: * 4. Neither the name of the University nor the names of its contributors
23: * may be used to endorse or promote products derived from this software
24: * without specific prior written permission.
25: *
26: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36: * SUCH DAMAGE.
37: *
38: * from: Utah $Hdr: ite.c 1.20 91/01/21$
39: *
40: * @(#)ite.c 7.3 (Berkeley) 5/7/91
41: */
42:
43: /*
44: * Standalone Internal Terminal Emulator (CRT and keyboard)
45: */
46: #include "samachdep.h"
47:
48: #ifdef ITECONSOLE
49:
50: #include "sys/param.h"
51: #include "../hp300/cons.h"
52: #include "../dev/device.h"
53: #include "../dev/itevar.h"
54: #include "../dev/grfvar.h"
55:
56: int nodev();
57:
58: int topcat_init(), topcat_putc();
59: int topcat_clear(), topcat_cursor(), topcat_scroll();
60: int gatorbox_init(), gatorbox_clear();
61: int gatorbox_putc(), gatorbox_cursor(), gatorbox_scroll();
62: int rbox_init(), rbox_clear();
63: int rbox_putc(), rbox_cursor(), rbox_scroll();
64: int dvbox_init(), dvbox_clear();
65: int dvbox_putc(), dvbox_cursor(), dvbox_scroll();
66:
67: struct itesw itesw[] = {
68: topcat_init, nodev, topcat_clear,
69: topcat_putc, topcat_cursor, topcat_scroll,
70:
71: gatorbox_init, nodev, gatorbox_clear,
72: gatorbox_putc, gatorbox_cursor, gatorbox_scroll,
73:
74: rbox_init, nodev, rbox_clear,
75: rbox_putc, rbox_cursor, rbox_scroll,
76:
77: dvbox_init, nodev, dvbox_clear,
78: dvbox_putc, dvbox_cursor, dvbox_scroll,
79: };
80:
81: /* these guys need to be in initialized data */
82: int itecons = -1;
83: struct ite_softc ite_softc[NITE] = { 0 };
84:
85: /*
86: * Locate all bitmapped displays
87: */
88: iteconfig()
89: {
90: extern struct hp_hw sc_table[];
91: int dtype, fboff, i;
92: struct hp_hw *hw;
93: struct grfreg *gr;
94: struct ite_softc *ip;
95:
96: i = 0;
97: for (hw = sc_table; hw < &sc_table[MAXCTLRS]; hw++) {
98: if (!HW_ISDEV(hw, D_BITMAP))
99: continue;
100: gr = (struct grfreg *) hw->hw_kva;
101: /* XXX: redundent but safe */
102: if (badaddr((caddr_t)gr) || gr->gr_id != GRFHWID)
103: continue;
104: switch (gr->gr_id2) {
105: case GID_GATORBOX:
106: dtype = ITE_GATORBOX;
107: break;
108: case GID_TOPCAT:
109: case GID_LRCATSEYE:
110: case GID_HRCCATSEYE:
111: case GID_HRMCATSEYE:
112: dtype = ITE_TOPCAT;
113: break;
114: case GID_RENAISSANCE:
115: dtype = ITE_RENAISSANCE;
116: break;
117: case GID_DAVINCI:
118: dtype = ITE_DAVINCI;
119: break;
120: default:
121: continue;
122: }
123: if (i >= NITE)
124: break;
125: ip = &ite_softc[i];
126: ip->regbase = (caddr_t) gr;
127: fboff = (gr->gr_fbomsb << 8) | gr->gr_fbolsb;
128: ip->fbbase = (caddr_t) (*((u_char *)ip->regbase+fboff) << 16);
129: /* DIO II: FB offset is relative to select code space */
130: if (ip->regbase >= (caddr_t)DIOIIBASE)
131: ip->fbbase += (int)ip->regbase;
132: ip->flags = ITE_ALIVE|ITE_CONSOLE;
133: ip->type = dtype;
134: i++;
135: }
136: }
137:
138: #ifdef CONSDEBUG
139: /*
140: * Allows us to cycle through all possible consoles (NITE ites and serial port)
141: * by using SHIFT-RESET on the keyboard.
142: */
143: int whichconsole = -1;
144: #endif
145:
146: iteprobe(cp)
147: struct consdev *cp;
148: {
149: register int ite;
150: register struct ite_softc *ip;
151: int unit, pri;
152:
153: #ifdef CONSDEBUG
154: whichconsole = ++whichconsole % (NITE+1);
155: #endif
156:
157: if (itecons != -1)
158: return(1);
159:
160: iteconfig();
161: unit = -1;
162: pri = CN_DEAD;
163: for (ite = 0; ite < NITE; ite++) {
164: #ifdef CONSDEBUG
165: if (ite < whichconsole)
166: continue;
167: #endif
168: ip = &ite_softc[ite];
169: if ((ip->flags & (ITE_ALIVE|ITE_CONSOLE))
170: != (ITE_ALIVE|ITE_CONSOLE))
171: continue;
172: if ((int)ip->regbase == GRFIADDR) {
173: pri = CN_INTERNAL;
174: unit = ite;
175: } else if (unit < 0) {
176: pri = CN_NORMAL;
177: unit = ite;
178: }
179: }
180: cp->cn_dev = unit;
181: cp->cn_pri = pri;
182: }
183:
184: iteinit(cp)
185: struct consdev *cp;
186: {
187: int ite = cp->cn_dev;
188: struct ite_softc *ip;
189:
190: if (itecons != -1)
191: return(1);
192:
193: ip = &ite_softc[ite];
194:
195: ip->curx = 0;
196: ip->cury = 0;
197: ip->cursorx = 0;
198: ip->cursory = 0;
199:
200: (*itesw[ip->type].ite_init)(ip);
201: (*itesw[ip->type].ite_cursor)(ip, DRAW_CURSOR);
202:
203: itecons = ite;
204: kbdinit();
205: }
206:
207: iteputchar(c)
208: register int c;
209: {
210: register struct ite_softc *ip = &ite_softc[itecons];
211: register struct itesw *sp = &itesw[ip->type];
212:
213: c &= 0x7F;
214: switch (c) {
215:
216: case '\n':
217: if (++ip->cury == ip->rows) {
218: ip->cury--;
219: (*sp->ite_scroll)(ip, 1, 0, 1, SCROLL_UP);
220: ite_clrtoeol(ip, sp, ip->cury, 0);
221: }
222: else
223: (*sp->ite_cursor)(ip, MOVE_CURSOR);
224: break;
225:
226: case '\r':
227: ip->curx = 0;
228: (*sp->ite_cursor)(ip, MOVE_CURSOR);
229: break;
230:
231: case '\b':
232: if (--ip->curx < 0)
233: ip->curx = 0;
234: else
235: (*sp->ite_cursor)(ip, MOVE_CURSOR);
236: break;
237:
238: default:
239: if (c < ' ' || c == 0177)
240: break;
241: (*sp->ite_putc)(ip, c, ip->cury, ip->curx, ATTR_NOR);
242: (*sp->ite_cursor)(ip, DRAW_CURSOR);
243: itecheckwrap(ip, sp);
244: break;
245: }
246: }
247:
248: itecheckwrap(ip, sp)
249: register struct ite_softc *ip;
250: register struct itesw *sp;
251: {
252: if (++ip->curx == ip->cols) {
253: ip->curx = 0;
254: if (++ip->cury == ip->rows) {
255: --ip->cury;
256: (*sp->ite_scroll)(ip, 1, 0, 1, SCROLL_UP);
257: ite_clrtoeol(ip, sp, ip->cury, 0);
258: return;
259: }
260: }
261: (*sp->ite_cursor)(ip, MOVE_CURSOR);
262: }
263:
264: ite_clrtoeol(ip, sp, y, x)
265: register struct ite_softc *ip;
266: register struct itesw *sp;
267: register int y, x;
268: {
269: (*sp->ite_clear)(ip, y, x, 1, ip->cols - x);
270: (*sp->ite_cursor)(ip, DRAW_CURSOR);
271: }
272:
273: itegetchar()
274: {
275: #ifdef SMALL
276: return (0);
277: #else
278: return (kbdgetc());
279: #endif
280: }
281: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.