1*54074Shibler /* 2*54074Shibler * Copyright (c) 1988 University of Utah. 3*54074Shibler * Copyright (c) 1990 The Regents of the University of California. 4*54074Shibler * All rights reserved. 5*54074Shibler * 6*54074Shibler * This code is derived from software contributed to Berkeley by 7*54074Shibler * the Systems Programming Group of the University of Utah Computer 8*54074Shibler * Science Department. 9*54074Shibler * 10*54074Shibler * %sccs.include.redist.c% 11*54074Shibler * 12*54074Shibler * from: Utah $Hdr: ite_hy.c 1.1 92/01/22$ 13*54074Shibler * 14*54074Shibler * @(#)ite_hy.c 7.1 (Berkeley) 06/18/92 15*54074Shibler */ 16*54074Shibler 17*54074Shibler #include "samachdep.h" 18*54074Shibler 19*54074Shibler #ifdef ITECONSOLE 20*54074Shibler #include "sys/param.h" 21*54074Shibler 22*54074Shibler #include "hp/dev/itevar.h" 23*54074Shibler #include "hp/dev/itereg.h" 24*54074Shibler #include "../dev/grf_hyreg.h" 25*54074Shibler 26*54074Shibler #define REGBASE ((struct hyboxfb *)(ip->regbase)) 27*54074Shibler #define WINDOWMOVER hyper_windowmove 28*54074Shibler 29*54074Shibler #undef charX 30*54074Shibler #define charX(ip,c) \ 31*54074Shibler (((c) % (ip)->cpl) * ((((ip)->ftwidth + 7) / 8) * 8) + (ip)->fontx) 32*54074Shibler 33*54074Shibler hyper_init(ip) 34*54074Shibler register struct ite_softc *ip; 35*54074Shibler { 36*54074Shibler int width; 37*54074Shibler 38*54074Shibler ite_fontinfo(ip); 39*54074Shibler width = ((ip->ftwidth + 7) / 8) * 8; 40*54074Shibler ip->cpl = (ip->fbwidth - ip->dwidth) / width; 41*54074Shibler ip->cblanky = ip->fonty + ((128 / ip->cpl) +1) * ip->ftheight; 42*54074Shibler 43*54074Shibler REGBASE->nblank = 0x05; 44*54074Shibler 45*54074Shibler /* 46*54074Shibler * Clear the framebuffer on all planes. 47*54074Shibler */ 48*54074Shibler hyper_windowmove(ip, 0, 0, 0, 0, ip->fbheight, ip->fbwidth, RR_CLEAR); 49*54074Shibler 50*54074Shibler hyper_ite_fontinit(ip); 51*54074Shibler 52*54074Shibler /* 53*54074Shibler * Stash the inverted cursor. 54*54074Shibler */ 55*54074Shibler hyper_windowmove(ip, charY(ip, ' '), charX(ip, ' '), 56*54074Shibler ip->cblanky, ip->cblankx, ip->ftheight, 57*54074Shibler ip->ftwidth, RR_COPYINVERTED); 58*54074Shibler } 59*54074Shibler 60*54074Shibler hyper_ite_fontinit(ip) 61*54074Shibler register struct ite_softc *ip; 62*54074Shibler { 63*54074Shibler register u_char *fbmem, *dp; 64*54074Shibler int c, l, b; 65*54074Shibler int stride, width; 66*54074Shibler 67*54074Shibler dp = (u_char *)getword(ip, getword(ip, FONTROM) + FONTADDR) + FONTDATA; 68*54074Shibler stride = ip->fbwidth >> 3; 69*54074Shibler width = (ip->ftwidth + 7) / 8; 70*54074Shibler 71*54074Shibler for (c = 0; c < 128; c++) { 72*54074Shibler fbmem = (u_char *) FBBASE + 73*54074Shibler (ip->fonty + (c / ip->cpl) * ip->ftheight) * 74*54074Shibler stride; 75*54074Shibler fbmem += (ip->fontx >> 3) + (c % ip->cpl) * width; 76*54074Shibler for (l = 0; l < ip->ftheight; l++) { 77*54074Shibler for (b = 0; b < width; b++) { 78*54074Shibler *fbmem++ = *dp; 79*54074Shibler dp += 2; 80*54074Shibler } 81*54074Shibler fbmem -= width; 82*54074Shibler fbmem += stride; 83*54074Shibler } 84*54074Shibler } 85*54074Shibler } 86*54074Shibler 87*54074Shibler hyper_putc(ip, c, dy, dx, mode) 88*54074Shibler register struct ite_softc *ip; 89*54074Shibler register int dy, dx; 90*54074Shibler int c, mode; 91*54074Shibler { 92*54074Shibler hyper_windowmove(ip, charY(ip, c), charX(ip, c), 93*54074Shibler dy * ip->ftheight, dx * ip->ftwidth, 94*54074Shibler ip->ftheight, ip->ftwidth, RR_COPY); 95*54074Shibler } 96*54074Shibler 97*54074Shibler hyper_cursor(ip, flag) 98*54074Shibler register struct ite_softc *ip; 99*54074Shibler int flag; 100*54074Shibler { 101*54074Shibler switch (flag) { 102*54074Shibler case MOVE_CURSOR: 103*54074Shibler erase_cursor(ip); 104*54074Shibler /* fall through ... */ 105*54074Shibler case DRAW_CURSOR: 106*54074Shibler draw_cursor(ip); 107*54074Shibler break; 108*54074Shibler default: 109*54074Shibler erase_cursor(ip); 110*54074Shibler break; 111*54074Shibler } 112*54074Shibler } 113*54074Shibler 114*54074Shibler hyper_clear(ip, sy, sx, h, w) 115*54074Shibler struct ite_softc *ip; 116*54074Shibler register int sy, sx, h, w; 117*54074Shibler { 118*54074Shibler hyper_windowmove(ip, sy * ip->ftheight, sx * ip->ftwidth, 119*54074Shibler sy * ip->ftheight, sx * ip->ftwidth, 120*54074Shibler h * ip->ftheight, w * ip->ftwidth, 121*54074Shibler RR_CLEAR); 122*54074Shibler } 123*54074Shibler 124*54074Shibler hyper_scroll(ip, sy, sx, count, dir) 125*54074Shibler register struct ite_softc *ip; 126*54074Shibler register int sy, count; 127*54074Shibler int dir, sx; 128*54074Shibler { 129*54074Shibler register int dy = sy - count; 130*54074Shibler register int height = ip->rows - sy; 131*54074Shibler 132*54074Shibler hyper_cursor(ip, ERASE_CURSOR); 133*54074Shibler 134*54074Shibler hyper_windowmove(ip, sy * ip->ftheight, sx * ip->ftwidth, 135*54074Shibler dy * ip->ftheight, sx * ip->ftwidth, 136*54074Shibler height * ip->ftheight, 137*54074Shibler ip->cols * ip->ftwidth, RR_COPY); 138*54074Shibler } 139*54074Shibler 140*54074Shibler #include "../dev/maskbits.h" 141*54074Shibler 142*54074Shibler /* NOTE: 143*54074Shibler * the first element in starttab could be 0xffffffff. making it 0 144*54074Shibler * lets us deal with a full first word in the middle loop, rather 145*54074Shibler * than having to do the multiple reads and masks that we'd 146*54074Shibler * have to do if we thought it was partial. 147*54074Shibler */ 148*54074Shibler int starttab[32] = 149*54074Shibler { 150*54074Shibler 0x00000000, 151*54074Shibler 0x7FFFFFFF, 152*54074Shibler 0x3FFFFFFF, 153*54074Shibler 0x1FFFFFFF, 154*54074Shibler 0x0FFFFFFF, 155*54074Shibler 0x07FFFFFF, 156*54074Shibler 0x03FFFFFF, 157*54074Shibler 0x01FFFFFF, 158*54074Shibler 0x00FFFFFF, 159*54074Shibler 0x007FFFFF, 160*54074Shibler 0x003FFFFF, 161*54074Shibler 0x001FFFFF, 162*54074Shibler 0x000FFFFF, 163*54074Shibler 0x0007FFFF, 164*54074Shibler 0x0003FFFF, 165*54074Shibler 0x0001FFFF, 166*54074Shibler 0x0000FFFF, 167*54074Shibler 0x00007FFF, 168*54074Shibler 0x00003FFF, 169*54074Shibler 0x00001FFF, 170*54074Shibler 0x00000FFF, 171*54074Shibler 0x000007FF, 172*54074Shibler 0x000003FF, 173*54074Shibler 0x000001FF, 174*54074Shibler 0x000000FF, 175*54074Shibler 0x0000007F, 176*54074Shibler 0x0000003F, 177*54074Shibler 0x0000001F, 178*54074Shibler 0x0000000F, 179*54074Shibler 0x00000007, 180*54074Shibler 0x00000003, 181*54074Shibler 0x00000001 182*54074Shibler }; 183*54074Shibler 184*54074Shibler int endtab[32] = 185*54074Shibler { 186*54074Shibler 0x00000000, 187*54074Shibler 0x80000000, 188*54074Shibler 0xC0000000, 189*54074Shibler 0xE0000000, 190*54074Shibler 0xF0000000, 191*54074Shibler 0xF8000000, 192*54074Shibler 0xFC000000, 193*54074Shibler 0xFE000000, 194*54074Shibler 0xFF000000, 195*54074Shibler 0xFF800000, 196*54074Shibler 0xFFC00000, 197*54074Shibler 0xFFE00000, 198*54074Shibler 0xFFF00000, 199*54074Shibler 0xFFF80000, 200*54074Shibler 0xFFFC0000, 201*54074Shibler 0xFFFE0000, 202*54074Shibler 0xFFFF0000, 203*54074Shibler 0xFFFF8000, 204*54074Shibler 0xFFFFC000, 205*54074Shibler 0xFFFFE000, 206*54074Shibler 0xFFFFF000, 207*54074Shibler 0xFFFFF800, 208*54074Shibler 0xFFFFFC00, 209*54074Shibler 0xFFFFFE00, 210*54074Shibler 0xFFFFFF00, 211*54074Shibler 0xFFFFFF80, 212*54074Shibler 0xFFFFFFC0, 213*54074Shibler 0xFFFFFFE0, 214*54074Shibler 0xFFFFFFF0, 215*54074Shibler 0xFFFFFFF8, 216*54074Shibler 0xFFFFFFFC, 217*54074Shibler 0xFFFFFFFE 218*54074Shibler }; 219*54074Shibler 220*54074Shibler hyper_windowmove(ip, sy, sx, dy, dx, h, w, func) 221*54074Shibler struct ite_softc *ip; 222*54074Shibler int sy, sx, dy, dx, h, w, func; 223*54074Shibler { 224*54074Shibler unsigned int *psrcBase, *pdstBase; 225*54074Shibler /* start of src and dst bitmaps */ 226*54074Shibler int width; /* add to get to same position in next line */ 227*54074Shibler 228*54074Shibler unsigned int *psrcLine, *pdstLine; 229*54074Shibler /* pointers to line with current src and dst */ 230*54074Shibler register unsigned int *psrc; /* pointer to current src longword */ 231*54074Shibler register unsigned int *pdst; /* pointer to current dst longword */ 232*54074Shibler 233*54074Shibler /* following used for looping through a line */ 234*54074Shibler unsigned int startmask, endmask; /* masks for writing ends of dst */ 235*54074Shibler int nlMiddle; /* whole longwords in dst */ 236*54074Shibler register int nl; /* temp copy of nlMiddle */ 237*54074Shibler register unsigned int tmpSrc; 238*54074Shibler /* place to store full source word */ 239*54074Shibler register int xoffSrc; /* offset (>= 0, < 32) from which to 240*54074Shibler fetch whole longwords fetched 241*54074Shibler in src */ 242*54074Shibler int nstart; /* number of ragged bits at start of dst */ 243*54074Shibler int nend; /* number of ragged bits at end of dst */ 244*54074Shibler int srcStartOver; /* pulling nstart bits from src 245*54074Shibler overflows into the next word? */ 246*54074Shibler 247*54074Shibler if (h == 0 || w == 0) 248*54074Shibler return; 249*54074Shibler 250*54074Shibler width = ip->fbwidth >> 5; 251*54074Shibler psrcLine = ((unsigned int *) ip->fbbase) + (sy * width); 252*54074Shibler pdstLine = ((unsigned int *) ip->fbbase) + (dy * width); 253*54074Shibler 254*54074Shibler /* x direction doesn't matter for < 1 longword */ 255*54074Shibler if (w <= 32) 256*54074Shibler { 257*54074Shibler int srcBit, dstBit; /* bit offset of src and dst */ 258*54074Shibler 259*54074Shibler pdstLine += (dx >> 5); 260*54074Shibler psrcLine += (sx >> 5); 261*54074Shibler psrc = psrcLine; 262*54074Shibler pdst = pdstLine; 263*54074Shibler 264*54074Shibler srcBit = sx & 0x1f; 265*54074Shibler dstBit = dx & 0x1f; 266*54074Shibler 267*54074Shibler while(h--) 268*54074Shibler { 269*54074Shibler getandputrop(psrc, srcBit, dstBit, w, pdst, func) 270*54074Shibler pdst += width; 271*54074Shibler psrc += width; 272*54074Shibler } 273*54074Shibler } 274*54074Shibler else 275*54074Shibler { 276*54074Shibler maskbits(dx, w, startmask, endmask, nlMiddle) 277*54074Shibler if (startmask) 278*54074Shibler nstart = 32 - (dx & 0x1f); 279*54074Shibler else 280*54074Shibler nstart = 0; 281*54074Shibler if (endmask) 282*54074Shibler nend = (dx + w) & 0x1f; 283*54074Shibler else 284*54074Shibler nend = 0; 285*54074Shibler 286*54074Shibler xoffSrc = ((sx & 0x1f) + nstart) & 0x1f; 287*54074Shibler srcStartOver = ((sx & 0x1f) + nstart) > 31; 288*54074Shibler 289*54074Shibler pdstLine += (dx >> 5); 290*54074Shibler psrcLine += (sx >> 5); 291*54074Shibler 292*54074Shibler while (h--) 293*54074Shibler { 294*54074Shibler psrc = psrcLine; 295*54074Shibler pdst = pdstLine; 296*54074Shibler 297*54074Shibler if (startmask) 298*54074Shibler { 299*54074Shibler getandputrop(psrc, (sx & 0x1f), 300*54074Shibler (dx & 0x1f), nstart, pdst, func) 301*54074Shibler pdst++; 302*54074Shibler if (srcStartOver) 303*54074Shibler psrc++; 304*54074Shibler } 305*54074Shibler 306*54074Shibler /* special case for aligned operations */ 307*54074Shibler if (xoffSrc == 0) 308*54074Shibler { 309*54074Shibler nl = nlMiddle; 310*54074Shibler while (nl--) 311*54074Shibler { 312*54074Shibler DoRop (*pdst, func, *psrc++, *pdst); 313*54074Shibler pdst++; 314*54074Shibler } 315*54074Shibler } 316*54074Shibler else 317*54074Shibler { 318*54074Shibler nl = nlMiddle + 1; 319*54074Shibler while (--nl) 320*54074Shibler { 321*54074Shibler getunalignedword (psrc, xoffSrc, tmpSrc) 322*54074Shibler DoRop (*pdst, func, tmpSrc, *pdst); 323*54074Shibler pdst++; 324*54074Shibler psrc++; 325*54074Shibler } 326*54074Shibler } 327*54074Shibler 328*54074Shibler if (endmask) 329*54074Shibler { 330*54074Shibler getandputrop0(psrc, xoffSrc, nend, pdst, func); 331*54074Shibler } 332*54074Shibler 333*54074Shibler pdstLine += width; 334*54074Shibler psrcLine += width; 335*54074Shibler } 336*54074Shibler } 337*54074Shibler } 338*54074Shibler #endif 339