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