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