xref: /csrg-svn/sys/hp300/stand/ite.c (revision 45790)
141488Smckusick /*
241488Smckusick  * Copyright (c) 1988 University of Utah.
341488Smckusick  * Copyright (c) 1990 The Regents of the University of California.
441488Smckusick  * All rights reserved.
541488Smckusick  *
641488Smckusick  * This code is derived from software contributed to Berkeley by
741488Smckusick  * the Systems Programming Group of the University of Utah Computer
841488Smckusick  * Science Department.
941488Smckusick  *
1041488Smckusick  * %sccs.include.redist.c%
1141488Smckusick  *
1241488Smckusick  * from: Utah $Hdr: ite.c 1.19 89/08/22$
1341488Smckusick  *
14*45790Sbostic  *	@(#)ite.c	7.2 (Berkeley) 12/16/90
1541488Smckusick  */
1641488Smckusick 
1741488Smckusick /*
1841488Smckusick  * Standalone Internal Terminal Emulator (CRT and keyboard)
1941488Smckusick  */
2041488Smckusick #include "samachdep.h"
2141488Smckusick 
2241488Smckusick #ifdef ITECONSOLE
2341488Smckusick 
24*45790Sbostic #include "sys/param.h"
25*45790Sbostic #include "../hp300/cons.h"
26*45790Sbostic #include "../dev/device.h"
27*45790Sbostic #include "../dev/itevar.h"
28*45790Sbostic #include "../dev/grfvar.h"
2941488Smckusick 
3041488Smckusick int nodev();
3141488Smckusick 
3241488Smckusick int topcat_init(), topcat_putc();
3341488Smckusick int topcat_clear(), topcat_cursor(), topcat_scroll();
3441488Smckusick int gatorbox_init(), gatorbox_clear();
3541488Smckusick int gatorbox_putc(), gatorbox_cursor(), gatorbox_scroll();
3641488Smckusick int rbox_init(), rbox_clear();
3741488Smckusick int rbox_putc(), rbox_cursor(), rbox_scroll();
3841488Smckusick int dvbox_init(), dvbox_clear();
3941488Smckusick int dvbox_putc(), dvbox_cursor(), dvbox_scroll();
4041488Smckusick 
4141488Smckusick struct itesw itesw[] = {
4241488Smckusick 	topcat_init,		nodev,			topcat_clear,
4341488Smckusick 	topcat_putc,		topcat_cursor,		topcat_scroll,
4441488Smckusick 
4541488Smckusick 	gatorbox_init,		nodev,			gatorbox_clear,
4641488Smckusick 	gatorbox_putc,		gatorbox_cursor,	gatorbox_scroll,
4741488Smckusick 
4841488Smckusick 	rbox_init,		nodev,			rbox_clear,
4941488Smckusick 	rbox_putc,		rbox_cursor,		rbox_scroll,
5041488Smckusick 
5141488Smckusick       	dvbox_init,		nodev,			dvbox_clear,
5241488Smckusick 	dvbox_putc,		dvbox_cursor,		dvbox_scroll,
5341488Smckusick };
5441488Smckusick 
5541488Smckusick /* these guys need to be in initialized data */
5641488Smckusick int itecons = -1;
5741488Smckusick struct  ite_softc ite_softc[NITE] = { 0 };
5841488Smckusick 
5941488Smckusick /*
6041488Smckusick  * Locate all bitmapped displays
6141488Smckusick  */
6241488Smckusick iteconfig()
6341488Smckusick {
6441488Smckusick 	extern struct hp_hw sc_table[];
6541488Smckusick 	int dtype, fboff, i;
6641488Smckusick 	struct hp_hw *hw;
6741488Smckusick 	struct grfreg *gr;
6841488Smckusick 	struct ite_softc *ip;
6941488Smckusick 
7041488Smckusick 	i = 0;
7141488Smckusick 	for (hw = sc_table; hw < &sc_table[MAX_CTLR]; hw++) {
7241488Smckusick 		if (hw->hw_type != BITMAP)
7341488Smckusick 			continue;
7441488Smckusick 		gr = (struct grfreg *) hw->hw_addr;
7541488Smckusick 		/* XXX: redundent but safe */
7641488Smckusick 		if (badaddr((caddr_t)gr) || gr->gr_id != GRFHWID)
7741488Smckusick 			continue;
7841488Smckusick 		switch (gr->gr_id2) {
7941488Smckusick 		case GID_GATORBOX:
8041488Smckusick 			dtype = ITE_GATORBOX;
8141488Smckusick 			break;
8241488Smckusick 		case GID_TOPCAT:
8341488Smckusick 		case GID_LRCATSEYE:
8441488Smckusick 		case GID_HRCCATSEYE:
8541488Smckusick 		case GID_HRMCATSEYE:
8641488Smckusick 			dtype = ITE_TOPCAT;
8741488Smckusick 			break;
8841488Smckusick 		case GID_RENAISSANCE:
8941488Smckusick 			dtype = ITE_RENAISSANCE;
9041488Smckusick 			break;
9141488Smckusick 		case GID_DAVINCI:
9241488Smckusick 			dtype = ITE_DAVINCI;
9341488Smckusick 			break;
9441488Smckusick 		default:
9541488Smckusick 			continue;
9641488Smckusick 		}
9741488Smckusick 		if (i >= NITE)
9841488Smckusick 			break;
9941488Smckusick 		ip = &ite_softc[i];
10041488Smckusick 		ip->regbase = (caddr_t) gr;
10141488Smckusick 		fboff = (gr->gr_fbomsb << 8) | gr->gr_fbolsb;
10241488Smckusick 		ip->fbbase = (caddr_t) (*((u_char *)ip->regbase+fboff) << 16);
10341488Smckusick 		/* DIO II: FB offset is relative to select code space */
10441488Smckusick 		if (ip->regbase >= (caddr_t)0x1000000)
10541488Smckusick 			ip->fbbase += (int)ip->regbase;
10641488Smckusick 		ip->flags = ITE_ALIVE|ITE_CONSOLE;
10741488Smckusick 		ip->type = dtype;
10841488Smckusick 		i++;
10941488Smckusick 	}
11041488Smckusick }
11141488Smckusick 
11241488Smckusick #ifdef CONSDEBUG
11341488Smckusick /*
11441488Smckusick  * Allows us to cycle through all possible consoles (NITE ites and serial port)
11541488Smckusick  * by using SHIFT-RESET on the keyboard.
11641488Smckusick  */
11741488Smckusick int	whichconsole = -1;
11841488Smckusick #endif
11941488Smckusick 
12041488Smckusick iteprobe(cp)
12141488Smckusick 	struct consdev *cp;
12241488Smckusick {
12341488Smckusick 	register int ite;
12441488Smckusick 	register struct ite_softc *ip;
12541488Smckusick 	int unit, pri;
12641488Smckusick 
12741488Smckusick #ifdef CONSDEBUG
12841488Smckusick 	whichconsole = ++whichconsole % (NITE+1);
12941488Smckusick #endif
13041488Smckusick 
13141488Smckusick 	if (itecons != -1)
13241488Smckusick 		return(1);
13341488Smckusick 
13441488Smckusick 	iteconfig();
13541488Smckusick 	unit = -1;
13641488Smckusick 	pri = CN_DEAD;
13741488Smckusick 	for (ite = 0; ite < NITE; ite++) {
13841488Smckusick #ifdef CONSDEBUG
13941488Smckusick 		if (ite < whichconsole)
14041488Smckusick 			continue;
14141488Smckusick #endif
14241488Smckusick 		ip = &ite_softc[ite];
14341488Smckusick 		if ((ip->flags & (ITE_ALIVE|ITE_CONSOLE))
14441488Smckusick 		    != (ITE_ALIVE|ITE_CONSOLE))
14541488Smckusick 			continue;
14641488Smckusick 		if ((int)ip->regbase == GRFIADDR) {
14741488Smckusick 			pri = CN_INTERNAL;
14841488Smckusick 			unit = ite;
14941488Smckusick 		} else if (unit < 0) {
15041488Smckusick 			pri = CN_NORMAL;
15141488Smckusick 			unit = ite;
15241488Smckusick 		}
15341488Smckusick 	}
15441488Smckusick 	cp->cn_dev = unit;
15541488Smckusick 	cp->cn_pri = pri;
15641488Smckusick }
15741488Smckusick 
15841488Smckusick iteinit(cp)
15941488Smckusick 	struct consdev *cp;
16041488Smckusick {
16141488Smckusick 	int ite = cp->cn_dev;
16241488Smckusick 	struct ite_softc *ip;
16341488Smckusick 
16441488Smckusick 	if (itecons != -1)
16541488Smckusick 		return(1);
16641488Smckusick 
16741488Smckusick 	ip = &ite_softc[ite];
16841488Smckusick 
16941488Smckusick 	ip->curx = 0;
17041488Smckusick 	ip->cury = 0;
17141488Smckusick 	ip->cursorx = 0;
17241488Smckusick 	ip->cursory = 0;
17341488Smckusick 
17441488Smckusick 	(*itesw[ip->type].ite_init)(ip);
17541488Smckusick 	(*itesw[ip->type].ite_cursor)(ip, DRAW_CURSOR);
17641488Smckusick 
17741488Smckusick 	itecons = ite;
17841488Smckusick 	kbdinit();
17941488Smckusick }
18041488Smckusick 
18141488Smckusick iteputchar(c)
18241488Smckusick 	register int c;
18341488Smckusick {
18441488Smckusick 	register struct ite_softc *ip = &ite_softc[itecons];
18541488Smckusick 	register struct itesw *sp = &itesw[ip->type];
18641488Smckusick 
18741488Smckusick 	c &= 0x7F;
18841488Smckusick 	switch (c) {
18941488Smckusick 
19041488Smckusick 	case '\n':
19141488Smckusick 		if (++ip->cury == ip->rows) {
19241488Smckusick 			ip->cury--;
19341488Smckusick 			(*sp->ite_scroll)(ip, 1, 0, 1, SCROLL_UP);
19441488Smckusick 			ite_clrtoeol(ip, sp, ip->cury, 0);
19541488Smckusick 		}
19641488Smckusick 		else
19741488Smckusick 			(*sp->ite_cursor)(ip, MOVE_CURSOR);
19841488Smckusick 		break;
19941488Smckusick 
20041488Smckusick 	case '\r':
20141488Smckusick 		ip->curx = 0;
20241488Smckusick 		(*sp->ite_cursor)(ip, MOVE_CURSOR);
20341488Smckusick 		break;
20441488Smckusick 
20541488Smckusick 	case '\b':
20641488Smckusick 		if (--ip->curx < 0)
20741488Smckusick 			ip->curx = 0;
20841488Smckusick 		else
20941488Smckusick 			(*sp->ite_cursor)(ip, MOVE_CURSOR);
21041488Smckusick 		break;
21141488Smckusick 
21241488Smckusick 	default:
21341488Smckusick 		if (c < ' ' || c == 0177)
21441488Smckusick 			break;
21541488Smckusick 		(*sp->ite_putc)(ip, c, ip->cury, ip->curx, ATTR_NOR);
21641488Smckusick 		(*sp->ite_cursor)(ip, DRAW_CURSOR);
21741488Smckusick 		itecheckwrap(ip, sp);
21841488Smckusick 		break;
21941488Smckusick 	}
22041488Smckusick }
22141488Smckusick 
22241488Smckusick itecheckwrap(ip, sp)
22341488Smckusick      register struct ite_softc *ip;
22441488Smckusick      register struct itesw *sp;
22541488Smckusick {
22641488Smckusick 	if (++ip->curx == ip->cols) {
22741488Smckusick 		ip->curx = 0;
22841488Smckusick 		if (++ip->cury == ip->rows) {
22941488Smckusick 			--ip->cury;
23041488Smckusick 			(*sp->ite_scroll)(ip, 1, 0, 1, SCROLL_UP);
23141488Smckusick 			ite_clrtoeol(ip, sp, ip->cury, 0);
23241488Smckusick 			return;
23341488Smckusick 		}
23441488Smckusick 	}
23541488Smckusick 	(*sp->ite_cursor)(ip, MOVE_CURSOR);
23641488Smckusick }
23741488Smckusick 
23841488Smckusick ite_clrtoeol(ip, sp, y, x)
23941488Smckusick      register struct ite_softc *ip;
24041488Smckusick      register struct itesw *sp;
24141488Smckusick      register int y, x;
24241488Smckusick {
24341488Smckusick 	(*sp->ite_clear)(ip, y, x, 1, ip->cols - x);
24441488Smckusick 	(*sp->ite_cursor)(ip, DRAW_CURSOR);
24541488Smckusick }
24641488Smckusick 
24741488Smckusick itegetchar()
24841488Smckusick {
24941488Smckusick #ifdef SMALL
25041488Smckusick 	return (0);
25141488Smckusick #else
25241488Smckusick 	return (kbdgetc());
25341488Smckusick #endif
25441488Smckusick }
25541488Smckusick #endif
256