xref: /csrg-svn/sys/hp300/dev/ite_tc.c (revision 63151)
141480Smckusick /*
241480Smckusick  * Copyright (c) 1988 University of Utah.
3*63151Sbostic  * Copyright (c) 1990, 1993
4*63151Sbostic  *	The Regents of the University of California.  All rights reserved.
541480Smckusick  *
641480Smckusick  * This code is derived from software contributed to Berkeley by
741480Smckusick  * the Systems Programming Group of the University of Utah Computer
841480Smckusick  * Science Department.
941480Smckusick  *
1041480Smckusick  * %sccs.include.redist.c%
1141480Smckusick  *
1257325Shibler  * from: Utah $Hdr: ite_tc.c 1.27 92/12/20$
1341480Smckusick  *
14*63151Sbostic  *	@(#)ite_tc.c	8.1 (Berkeley) 06/10/93
1541480Smckusick  */
1641480Smckusick 
1741480Smckusick #include "ite.h"
1841480Smckusick #if NITE > 0
1941480Smckusick 
2056507Sbostic #include <sys/param.h>
2156507Sbostic #include <sys/conf.h>
2256507Sbostic #include <sys/proc.h>
2356507Sbostic #include <sys/ioctl.h>
2456507Sbostic #include <sys/tty.h>
2556507Sbostic #include <sys/systm.h>
2641480Smckusick 
2756507Sbostic #include <hp300/dev/grf_tcreg.h>
2856507Sbostic #include <hp/dev/grfreg.h>
2956507Sbostic #include <hp/dev/itereg.h>
3056507Sbostic #include <hp/dev/itevar.h>
3141480Smckusick 
3256507Sbostic #include <machine/cpu.h>
3341480Smckusick 
3453929Shibler /* XXX */
3556507Sbostic #include <hp/dev/grfioctl.h>
3656507Sbostic #include <hp/dev/grfvar.h>
3753929Shibler 
3841480Smckusick #define REGBASE	    	((struct tcboxfb *)(ip->regbase))
3941480Smckusick #define WINDOWMOVER 	topcat_windowmove
4041480Smckusick 
topcat_init(ip)4141480Smckusick topcat_init(ip)
4241480Smckusick 	register struct ite_softc *ip;
4341480Smckusick {
4441480Smckusick 	/* XXX */
4541480Smckusick 	if (ip->regbase == NULL) {
4653929Shibler 		struct grf_softc *gp = ip->grf;
4753929Shibler 
4849310Shibler 		ip->regbase = gp->g_regkva;
4949310Shibler 		ip->fbbase = gp->g_fbkva;
5053929Shibler 		ip->fbwidth = gp->g_display.gd_fbwidth;
5153929Shibler 		ip->fbheight = gp->g_display.gd_fbheight;
5253929Shibler 		ip->dwidth = gp->g_display.gd_dwidth;
5353929Shibler 		ip->dheight = gp->g_display.gd_dheight;
5441480Smckusick 	}
5541480Smckusick 
5641480Smckusick 	/*
5749310Shibler 	 * Catseye looks a lot like a topcat, but not completely.
5849310Shibler 	 * So, we set some bits to make it work.
5949310Shibler 	 */
6049310Shibler 	if (REGBASE->fbid != GID_TOPCAT) {
6149310Shibler 		while ((REGBASE->catseye_status & 1))
6249310Shibler 			;
6349310Shibler 		REGBASE->catseye_status = 0x0;
6449310Shibler 		REGBASE->vb_select      = 0x0;
6549310Shibler 		REGBASE->tcntrl         = 0x0;
6649310Shibler 		REGBASE->acntrl         = 0x0;
6749310Shibler 		REGBASE->pncntrl        = 0x0;
6849310Shibler 		REGBASE->rug_cmdstat    = 0x90;
6949310Shibler 	}
7049310Shibler 
7149310Shibler 	/*
7241480Smckusick 	 * Determine the number of planes by writing to the first frame
7341480Smckusick 	 * buffer display location, then reading it back.
7441480Smckusick 	 */
7541480Smckusick 	REGBASE->wen = ~0;
7641480Smckusick 	REGBASE->fben = ~0;
7741480Smckusick 	REGBASE->prr = RR_COPY;
7841480Smckusick 	*FBBASE = 0xFF;
7941480Smckusick 	ip->planemask = *FBBASE;
8041480Smckusick 
8141480Smckusick 	/*
8241480Smckusick 	 * Enable reading/writing of all the planes.
8341480Smckusick 	 */
8441480Smckusick 	REGBASE->fben = ip->planemask;
8541480Smckusick 	REGBASE->wen  = ip->planemask;
8641480Smckusick 	REGBASE->ren  = ip->planemask;
8741480Smckusick 	REGBASE->prr  = RR_COPY;
8841480Smckusick 
8953929Shibler 	ite_fontinfo(ip);
9041480Smckusick 
9141480Smckusick 	/*
9241480Smckusick 	 * Clear the framebuffer on all planes.
9341480Smckusick 	 */
9441480Smckusick 	topcat_windowmove(ip, 0, 0, 0, 0, ip->fbheight, ip->fbwidth, RR_CLEAR);
9553929Shibler 	tc_waitbusy(ip->regbase, ip->planemask);
9641480Smckusick 
9741480Smckusick 	ite_fontinit(ip);
9841480Smckusick 
9941480Smckusick 	/*
10041480Smckusick 	 * Initialize color map for color displays
10141480Smckusick 	 */
10241480Smckusick 	if (ip->planemask != 1) {
10353929Shibler 	  	tc_waitbusy(ip->regbase, ip->planemask);
10441480Smckusick 		REGBASE->nblank = 0x01;
10541480Smckusick 
10653929Shibler 		tccm_waitbusy(ip->regbase);
10741480Smckusick 		REGBASE->rdata  = 0x0;
10841480Smckusick 		REGBASE->gdata  = 0x0;
10941480Smckusick 		REGBASE->bdata  = 0x0;
11041480Smckusick 		REGBASE->cindex = 0xFF;
11141480Smckusick 		REGBASE->strobe = 0xFF;
11241480Smckusick 
11341480Smckusick 		DELAY(100);
11453929Shibler 		tccm_waitbusy(ip->regbase);
11541480Smckusick 		REGBASE->rdata  = 0x0;
11641480Smckusick 		REGBASE->gdata  = 0x0;
11741480Smckusick 		REGBASE->bdata  = 0x0;
11841480Smckusick 		REGBASE->cindex = 0x0;
11941480Smckusick 
12041480Smckusick 		DELAY(100);
12153929Shibler 		tccm_waitbusy(ip->regbase);
12241480Smckusick 		REGBASE->rdata  = 0xFF;
12341480Smckusick 		REGBASE->gdata  = 0xFF;
12441480Smckusick 		REGBASE->bdata  = 0xFF;
12541480Smckusick 		REGBASE->cindex = 0xFE;
12641480Smckusick 		REGBASE->strobe = 0xFF;
12741480Smckusick 
12841480Smckusick 		DELAY(100);
12953929Shibler 		tccm_waitbusy(ip->regbase);
13041480Smckusick 		REGBASE->rdata  = 0x0;
13141480Smckusick 		REGBASE->gdata  = 0x0;
13241480Smckusick 		REGBASE->bdata  = 0x0;
13341480Smckusick 		REGBASE->cindex = 0x0;
13441480Smckusick 	}
13541480Smckusick 
13641480Smckusick 	/*
13741480Smckusick 	 * Stash the inverted cursor.
13841480Smckusick 	 */
13941480Smckusick 	topcat_windowmove(ip, charY(ip, ' '), charX(ip, ' '),
14041480Smckusick 			  ip->cblanky, ip->cblankx, ip->ftheight,
14141480Smckusick 			  ip->ftwidth, RR_COPYINVERTED);
14241480Smckusick }
14341480Smckusick 
topcat_deinit(ip)14441480Smckusick topcat_deinit(ip)
14541480Smckusick 	register struct ite_softc *ip;
14641480Smckusick {
14741480Smckusick 	topcat_windowmove(ip, 0, 0, 0, 0, ip->fbheight, ip->fbwidth, RR_CLEAR);
14853929Shibler 	tc_waitbusy(ip->regbase, ip->planemask);
14941480Smckusick 
15041480Smckusick 	REGBASE->nblank = ~0;
15141480Smckusick    	ip->flags &= ~ITE_INITED;
15241480Smckusick }
15341480Smckusick 
topcat_putc(ip,c,dy,dx,mode)15441480Smckusick topcat_putc(ip, c, dy, dx, mode)
15541480Smckusick 	register struct ite_softc *ip;
15641480Smckusick 	int c, dy, dx, mode;
15741480Smckusick {
15841480Smckusick         int wmrr = ((mode == ATTR_INV) ? RR_COPYINVERTED : RR_COPY);
15941480Smckusick 
16041480Smckusick 	topcat_windowmove(ip, charY(ip, c), charX(ip, c),
16141480Smckusick 			  dy * ip->ftheight, dx * ip->ftwidth,
16241480Smckusick 			  ip->ftheight, ip->ftwidth, wmrr);
16341480Smckusick }
16441480Smckusick 
topcat_cursor(ip,flag)16541480Smckusick topcat_cursor(ip, flag)
16641480Smckusick 	register struct ite_softc *ip;
16741480Smckusick 	register int flag;
16841480Smckusick {
16941480Smckusick 	if (flag == DRAW_CURSOR)
17041480Smckusick 		draw_cursor(ip)
17141480Smckusick 	else if (flag == MOVE_CURSOR) {
17241480Smckusick 		erase_cursor(ip)
17341480Smckusick 		draw_cursor(ip)
17441480Smckusick 	}
17541480Smckusick 	else
17641480Smckusick 		erase_cursor(ip)
17741480Smckusick }
17841480Smckusick 
topcat_clear(ip,sy,sx,h,w)17941480Smckusick topcat_clear(ip, sy, sx, h, w)
18041480Smckusick 	register struct ite_softc *ip;
18141480Smckusick 	register int sy, sx, h, w;
18241480Smckusick {
18341480Smckusick 	topcat_windowmove(ip, sy * ip->ftheight, sx * ip->ftwidth,
18441480Smckusick 			  sy * ip->ftheight, sx * ip->ftwidth,
18541480Smckusick 			  h  * ip->ftheight, w  * ip->ftwidth,
18641480Smckusick 			  RR_CLEAR);
18741480Smckusick }
18841480Smckusick 
topcat_scroll(ip,sy,sx,count,dir)18941480Smckusick topcat_scroll(ip, sy, sx, count, dir)
19041480Smckusick         register struct ite_softc *ip;
19141480Smckusick         register int sy, count;
19241480Smckusick         int dir, sx;
19341480Smckusick {
19441480Smckusick 	register int dy;
19541480Smckusick 	register int dx = sx;
19641480Smckusick 	register int height = 1;
19741480Smckusick 	register int width = ip->cols;
19841480Smckusick 
19941480Smckusick 	if (dir == SCROLL_UP) {
20041480Smckusick 		dy = sy - count;
20141480Smckusick 		height = ip->rows - sy;
20241480Smckusick 	}
20341480Smckusick 	else if (dir == SCROLL_DOWN) {
20441480Smckusick 		dy = sy + count;
20541480Smckusick 		height = ip->rows - dy - 1;
20641480Smckusick 	}
20741480Smckusick 	else if (dir == SCROLL_RIGHT) {
20841480Smckusick 		dy = sy;
20941480Smckusick 		dx = sx + count;
21041480Smckusick 		width = ip->cols - dx;
21141480Smckusick 	}
21241480Smckusick 	else {
21341480Smckusick 		dy = sy;
21441480Smckusick 		dx = sx - count;
21541480Smckusick 		width = ip->cols - sx;
21641480Smckusick 	}
21741480Smckusick 
21841480Smckusick 	topcat_windowmove(ip, sy * ip->ftheight, sx * ip->ftwidth,
21941480Smckusick 			  dy * ip->ftheight, dx * ip->ftwidth,
22041480Smckusick 			  height * ip->ftheight,
22141480Smckusick 			  width  * ip->ftwidth, RR_COPY);
22241480Smckusick }
22341480Smckusick 
22441480Smckusick topcat_windowmove(ip, sy, sx, dy, dx, h, w, func)
22541480Smckusick 	struct ite_softc *ip;
22641480Smckusick 	int sy, sx, dy, dx, h, w, func;
22741480Smckusick {
22841480Smckusick   	register struct tcboxfb *rp = REGBASE;
22941480Smckusick 
23041480Smckusick 	if (h == 0 || w == 0)
23141480Smckusick 		return;
23253929Shibler 	tc_waitbusy(ip->regbase, ip->planemask);
23341480Smckusick 	rp->wmrr     = func;
23441480Smckusick 	rp->source_y = sy;
23541480Smckusick 	rp->source_x = sx;
23641480Smckusick 	rp->dest_y   = dy;
23741480Smckusick 	rp->dest_x   = dx;
23841480Smckusick 	rp->wheight  = h;
23941480Smckusick 	rp->wwidth   = w;
24041480Smckusick 	rp->wmove    = ip->planemask;
24141480Smckusick }
24241480Smckusick #endif
243