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