xref: /csrg-svn/sys/hp300/stand/ite_hy.c (revision 63163)
154074Shibler /*
254074Shibler  * Copyright (c) 1988 University of Utah.
3*63163Sbostic  * Copyright (c) 1990, 1993
4*63163Sbostic  *	The Regents of the University of California.  All rights reserved.
554074Shibler  *
654074Shibler  * This code is derived from software contributed to Berkeley by
754074Shibler  * the Systems Programming Group of the University of Utah Computer
854349Shibler  * Science Department and Mark Davies of the Department of Computer
954349Shibler  * Science, Victoria University of Wellington, New Zealand.
1054074Shibler  *
1154074Shibler  * %sccs.include.redist.c%
1254074Shibler  *
1354074Shibler  * from: Utah $Hdr: ite_hy.c 1.1 92/01/22$
1454074Shibler  *
15*63163Sbostic  *	@(#)ite_hy.c	8.1 (Berkeley) 06/10/93
1654074Shibler  */
1754074Shibler 
1856510Sbostic #include <hp300/stand/samachdep.h>
1954074Shibler 
2054074Shibler #ifdef ITECONSOLE
2156510Sbostic #include <sys/param.h>
2254074Shibler 
2356510Sbostic #include <hp/dev/itevar.h>
2456510Sbostic #include <hp/dev/itereg.h>
2556510Sbostic #include <hp300/dev/grf_hyreg.h>
2654074Shibler 
2754074Shibler #define REGBASE	    	((struct hyboxfb *)(ip->regbase))
2854074Shibler #define WINDOWMOVER     hyper_windowmove
2954074Shibler 
3054074Shibler #undef charX
3154074Shibler #define	charX(ip,c)	\
3254074Shibler 	(((c) % (ip)->cpl) * ((((ip)->ftwidth + 7) / 8) * 8) + (ip)->fontx)
3354074Shibler 
hyper_init(ip)3454074Shibler hyper_init(ip)
3554074Shibler 	register struct ite_softc *ip;
3654074Shibler {
3754074Shibler 	int width;
3854074Shibler 
3954074Shibler 	ite_fontinfo(ip);
4054074Shibler 	width = ((ip->ftwidth + 7) / 8) * 8;
4154074Shibler 	ip->cpl      = (ip->fbwidth - ip->dwidth) / width;
4254074Shibler 	ip->cblanky  = ip->fonty + ((128 / ip->cpl) +1) * ip->ftheight;
4354074Shibler 
4454074Shibler 	REGBASE->nblank = 0x05;
4554074Shibler 
4654074Shibler 	/*
4754074Shibler 	 * Clear the framebuffer on all planes.
4854074Shibler 	 */
4954074Shibler 	hyper_windowmove(ip, 0, 0, 0, 0, ip->fbheight, ip->fbwidth, RR_CLEAR);
5054074Shibler 
5154074Shibler 	hyper_ite_fontinit(ip);
5254074Shibler 
5354074Shibler 	/*
5454074Shibler 	 * Stash the inverted cursor.
5554074Shibler 	 */
5654074Shibler 	hyper_windowmove(ip, charY(ip, ' '), charX(ip, ' '),
5754074Shibler 			 ip->cblanky, ip->cblankx, ip->ftheight,
5854074Shibler 			 ip->ftwidth, RR_COPYINVERTED);
5954074Shibler }
6054074Shibler 
hyper_ite_fontinit(ip)6154074Shibler hyper_ite_fontinit(ip)
6254074Shibler 	register struct ite_softc *ip;
6354074Shibler {
6454074Shibler 	register u_char *fbmem, *dp;
6554074Shibler 	int c, l, b;
6654074Shibler 	int stride, width;
6754074Shibler 
6860898Smckusick 	dp = (u_char *)(getword(ip, getword(ip, FONTROM) + FONTADDR) +
6960898Smckusick 	    ip->regbase) + FONTDATA;
7054074Shibler 	stride = ip->fbwidth >> 3;
7154074Shibler 	width = (ip->ftwidth + 7) / 8;
7254074Shibler 
7354074Shibler 	for (c = 0; c < 128; c++) {
7454074Shibler 		fbmem = (u_char *) FBBASE +
7554074Shibler 			(ip->fonty + (c / ip->cpl) * ip->ftheight) *
7654074Shibler 			stride;
7754074Shibler 		fbmem += (ip->fontx >> 3) + (c % ip->cpl) * width;
7854074Shibler 		for (l = 0; l < ip->ftheight; l++) {
7954074Shibler 			for (b = 0; b < width; b++) {
8054074Shibler 				*fbmem++ = *dp;
8154074Shibler 				dp += 2;
8254074Shibler 			}
8354074Shibler 			fbmem -= width;
8454074Shibler 			fbmem += stride;
8554074Shibler 		}
8654074Shibler 	}
8754074Shibler }
8854074Shibler 
hyper_putc(ip,c,dy,dx,mode)8954074Shibler hyper_putc(ip, c, dy, dx, mode)
9054074Shibler 	register struct ite_softc *ip;
9154074Shibler         register int dy, dx;
9254074Shibler 	int c, mode;
9354074Shibler {
9454074Shibler 	hyper_windowmove(ip, charY(ip, c), charX(ip, c),
9554074Shibler 			 dy * ip->ftheight, dx * ip->ftwidth,
9654074Shibler 			 ip->ftheight, ip->ftwidth, RR_COPY);
9754074Shibler }
9854074Shibler 
hyper_cursor(ip,flag)9954074Shibler hyper_cursor(ip, flag)
10054074Shibler 	register struct ite_softc *ip;
10154074Shibler         int flag;
10254074Shibler {
10354074Shibler 	switch (flag) {
10454074Shibler 	case MOVE_CURSOR:
10554074Shibler 		erase_cursor(ip);
10654074Shibler 		/* fall through ... */
10754074Shibler 	case DRAW_CURSOR:
10854074Shibler 		draw_cursor(ip);
10954074Shibler 		break;
11054074Shibler 	default:
11154074Shibler 		erase_cursor(ip);
11254074Shibler 		break;
11354074Shibler 	}
11454074Shibler }
11554074Shibler 
11654074Shibler hyper_clear(ip, sy, sx, h, w)
11754074Shibler 	struct ite_softc *ip;
11854074Shibler 	register int sy, sx, h, w;
11954074Shibler {
12054074Shibler 	hyper_windowmove(ip, sy * ip->ftheight, sx * ip->ftwidth,
12154074Shibler 			 sy * ip->ftheight, sx * ip->ftwidth,
12254074Shibler 			 h  * ip->ftheight, w  * ip->ftwidth,
12354074Shibler 			 RR_CLEAR);
12454074Shibler }
12554074Shibler 
hyper_scroll(ip,sy,sx,count,dir)12654074Shibler hyper_scroll(ip, sy, sx, count, dir)
12754074Shibler         register struct ite_softc *ip;
12854074Shibler         register int sy, count;
12954074Shibler         int dir, sx;
13054074Shibler {
13154074Shibler 	register int dy = sy - count;
13254074Shibler 	register int height = ip->rows - sy;
13354074Shibler 
13454074Shibler 	hyper_cursor(ip, ERASE_CURSOR);
13554074Shibler 
13654074Shibler 	hyper_windowmove(ip, sy * ip->ftheight, sx * ip->ftwidth,
13754074Shibler 			 dy * ip->ftheight, sx * ip->ftwidth,
13854074Shibler 			 height * ip->ftheight,
13954074Shibler 			 ip->cols  * ip->ftwidth, RR_COPY);
14054074Shibler }
14154074Shibler 
14256510Sbostic #include <hp300/dev/maskbits.h>
14354074Shibler 
14454074Shibler /* NOTE:
14554074Shibler  * the first element in starttab could be 0xffffffff.  making it 0
14654074Shibler  * lets us deal with a full first word in the middle loop, rather
14754074Shibler  * than having to do the multiple reads and masks that we'd
14854074Shibler  * have to do if we thought it was partial.
14954074Shibler  */
15054074Shibler int starttab[32] =
15154074Shibler     {
15254074Shibler 	0x00000000,
15354074Shibler 	0x7FFFFFFF,
15454074Shibler 	0x3FFFFFFF,
15554074Shibler 	0x1FFFFFFF,
15654074Shibler 	0x0FFFFFFF,
15754074Shibler 	0x07FFFFFF,
15854074Shibler 	0x03FFFFFF,
15954074Shibler 	0x01FFFFFF,
16054074Shibler 	0x00FFFFFF,
16154074Shibler 	0x007FFFFF,
16254074Shibler 	0x003FFFFF,
16354074Shibler 	0x001FFFFF,
16454074Shibler 	0x000FFFFF,
16554074Shibler 	0x0007FFFF,
16654074Shibler 	0x0003FFFF,
16754074Shibler 	0x0001FFFF,
16854074Shibler 	0x0000FFFF,
16954074Shibler 	0x00007FFF,
17054074Shibler 	0x00003FFF,
17154074Shibler 	0x00001FFF,
17254074Shibler 	0x00000FFF,
17354074Shibler 	0x000007FF,
17454074Shibler 	0x000003FF,
17554074Shibler 	0x000001FF,
17654074Shibler 	0x000000FF,
17754074Shibler 	0x0000007F,
17854074Shibler 	0x0000003F,
17954074Shibler 	0x0000001F,
18054074Shibler 	0x0000000F,
18154074Shibler 	0x00000007,
18254074Shibler 	0x00000003,
18354074Shibler 	0x00000001
18454074Shibler     };
18554074Shibler 
18654074Shibler int endtab[32] =
18754074Shibler     {
18854074Shibler 	0x00000000,
18954074Shibler 	0x80000000,
19054074Shibler 	0xC0000000,
19154074Shibler 	0xE0000000,
19254074Shibler 	0xF0000000,
19354074Shibler 	0xF8000000,
19454074Shibler 	0xFC000000,
19554074Shibler 	0xFE000000,
19654074Shibler 	0xFF000000,
19754074Shibler 	0xFF800000,
19854074Shibler 	0xFFC00000,
19954074Shibler 	0xFFE00000,
20054074Shibler 	0xFFF00000,
20154074Shibler 	0xFFF80000,
20254074Shibler 	0xFFFC0000,
20354074Shibler 	0xFFFE0000,
20454074Shibler 	0xFFFF0000,
20554074Shibler 	0xFFFF8000,
20654074Shibler 	0xFFFFC000,
20754074Shibler 	0xFFFFE000,
20854074Shibler 	0xFFFFF000,
20954074Shibler 	0xFFFFF800,
21054074Shibler 	0xFFFFFC00,
21154074Shibler 	0xFFFFFE00,
21254074Shibler 	0xFFFFFF00,
21354074Shibler 	0xFFFFFF80,
21454074Shibler 	0xFFFFFFC0,
21554074Shibler 	0xFFFFFFE0,
21654074Shibler 	0xFFFFFFF0,
21754074Shibler 	0xFFFFFFF8,
21854074Shibler 	0xFFFFFFFC,
21954074Shibler 	0xFFFFFFFE
22054074Shibler     };
22154074Shibler 
22254074Shibler hyper_windowmove(ip, sy, sx, dy, dx, h, w, func)
22354074Shibler 	struct ite_softc *ip;
22454074Shibler 	int sy, sx, dy, dx, h, w, func;
22554074Shibler {
22654074Shibler 	unsigned int *psrcBase, *pdstBase;
22754074Shibler 				/* start of src and dst bitmaps */
22854074Shibler 	int width;		/* add to get to same position in next line */
22954074Shibler 
23054074Shibler 	unsigned int *psrcLine, *pdstLine;
23154074Shibler                                 /* pointers to line with current src and dst */
23254074Shibler 	register unsigned int *psrc;  /* pointer to current src longword */
23354074Shibler 	register unsigned int *pdst;  /* pointer to current dst longword */
23454074Shibler 
23554074Shibler                                 /* following used for looping through a line */
23654074Shibler 	unsigned int startmask, endmask;  /* masks for writing ends of dst */
23754074Shibler 	int nlMiddle;		/* whole longwords in dst */
23854074Shibler 	register int nl;	/* temp copy of nlMiddle */
23954074Shibler 	register unsigned int tmpSrc;
24054074Shibler                                 /* place to store full source word */
24154074Shibler 	register int xoffSrc;	/* offset (>= 0, < 32) from which to
24254074Shibler                                    fetch whole longwords fetched
24354074Shibler                                    in src */
24454074Shibler 	int nstart;		/* number of ragged bits at start of dst */
24554074Shibler 	int nend;		/* number of ragged bits at end of dst */
24654074Shibler 	int srcStartOver;	/* pulling nstart bits from src
24754074Shibler                                    overflows into the next word? */
24854074Shibler 
24954074Shibler 	if (h == 0 || w == 0)
25054074Shibler 		return;
25154074Shibler 
25254074Shibler 	width = ip->fbwidth >> 5;
25354074Shibler 	psrcLine = ((unsigned int *) ip->fbbase) + (sy * width);
25454074Shibler 	pdstLine = ((unsigned int *) ip->fbbase) + (dy * width);
25554074Shibler 
25654074Shibler 	/* x direction doesn't matter for < 1 longword */
25754074Shibler 	if (w <= 32)
25854074Shibler 	{
25954074Shibler 	    int srcBit, dstBit;     /* bit offset of src and dst */
26054074Shibler 
26154074Shibler 	    pdstLine += (dx >> 5);
26254074Shibler 	    psrcLine += (sx >> 5);
26354074Shibler 	    psrc = psrcLine;
26454074Shibler 	    pdst = pdstLine;
26554074Shibler 
26654074Shibler 	    srcBit = sx & 0x1f;
26754074Shibler 	    dstBit = dx & 0x1f;
26854074Shibler 
26954074Shibler 	    while(h--)
27054074Shibler 	    {
27154074Shibler                 getandputrop(psrc, srcBit, dstBit, w, pdst, func)
27254074Shibler 	        pdst += width;
27354074Shibler 		psrc += width;
27454074Shibler 	    }
27554074Shibler 	}
27654074Shibler 	else
27754074Shibler         {
27854074Shibler 	    maskbits(dx, w, startmask, endmask, nlMiddle)
27954074Shibler 	    if (startmask)
28054074Shibler 	      nstart = 32 - (dx & 0x1f);
28154074Shibler 	    else
28254074Shibler 	      nstart = 0;
28354074Shibler 	    if (endmask)
28454074Shibler 	      nend = (dx + w) & 0x1f;
28554074Shibler 	    else
28654074Shibler 	      nend = 0;
28754074Shibler 
28854074Shibler 	    xoffSrc = ((sx & 0x1f) + nstart) & 0x1f;
28954074Shibler 	    srcStartOver = ((sx & 0x1f) + nstart) > 31;
29054074Shibler 
29154074Shibler 	    pdstLine += (dx >> 5);
29254074Shibler 	    psrcLine += (sx >> 5);
29354074Shibler 
29454074Shibler 	    while (h--)
29554074Shibler 	    {
29654074Shibler 	        psrc = psrcLine;
29754074Shibler 		pdst = pdstLine;
29854074Shibler 
29954074Shibler 		if (startmask)
30054074Shibler 		{
30154074Shibler 		    getandputrop(psrc, (sx & 0x1f),
30254074Shibler 				 (dx & 0x1f), nstart, pdst, func)
30354074Shibler 		    pdst++;
30454074Shibler 		    if (srcStartOver)
30554074Shibler 		        psrc++;
30654074Shibler 		}
30754074Shibler 
30854074Shibler 		/* special case for aligned operations */
30954074Shibler 		if (xoffSrc == 0)
31054074Shibler 		{
31154074Shibler 		    nl = nlMiddle;
31254074Shibler 		    while (nl--)
31354074Shibler 		    {
31454074Shibler 		        DoRop (*pdst, func, *psrc++, *pdst);
31554074Shibler 			pdst++;
31654074Shibler 		    }
31754074Shibler 		}
31854074Shibler 		else
31954074Shibler 		{
32054074Shibler 		    nl = nlMiddle + 1;
32154074Shibler 		    while (--nl)
32254074Shibler 		    {
32354074Shibler 		        getunalignedword (psrc, xoffSrc, tmpSrc)
32454074Shibler 			DoRop (*pdst, func, tmpSrc, *pdst);
32554074Shibler 			pdst++;
32654074Shibler 			psrc++;
32754074Shibler 		    }
32854074Shibler 		}
32954074Shibler 
33054074Shibler 		if (endmask)
33154074Shibler 		{
33254074Shibler 		    getandputrop0(psrc, xoffSrc, nend, pdst, func);
33354074Shibler 		}
33454074Shibler 
33554074Shibler 		pdstLine += width;
33654074Shibler 		psrcLine += width;
33754074Shibler 	    }
33854074Shibler 	}
33954074Shibler }
34054074Shibler #endif
341