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