Annotation of sys/arch/hp300/stand/common/ite_subr.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: ite_subr.c,v 1.5 2006/08/17 06:31:10 miod Exp $ */
! 2: /* $NetBSD: ite_subr.c,v 1.8 1996/03/03 04:23:40 thorpej Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1988 University of Utah.
! 6: * Copyright (c) 1990, 1993
! 7: * The Regents of the University of California. All rights reserved.
! 8: *
! 9: * This code is derived from software contributed to Berkeley by
! 10: * the Systems Programming Group of the University of Utah Computer
! 11: * Science Department.
! 12: *
! 13: * Redistribution and use in source and binary forms, with or without
! 14: * modification, are permitted provided that the following conditions
! 15: * are met:
! 16: * 1. Redistributions of source code must retain the above copyright
! 17: * notice, this list of conditions and the following disclaimer.
! 18: * 2. Redistributions in binary form must reproduce the above copyright
! 19: * notice, this list of conditions and the following disclaimer in the
! 20: * documentation and/or other materials provided with the distribution.
! 21: * 3. Neither the name of the University nor the names of its contributors
! 22: * may be used to endorse or promote products derived from this software
! 23: * without specific prior written permission.
! 24: *
! 25: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
! 26: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 27: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 28: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 29: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 30: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 31: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 32: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 33: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 34: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 35: * SUCH DAMAGE.
! 36: *
! 37: * from: Utah $Hdr: ite_subr.c 1.2 92/01/20$
! 38: *
! 39: * @(#)ite_subr.c 8.1 (Berkeley) 6/10/93
! 40: */
! 41:
! 42: #ifdef ITECONSOLE
! 43:
! 44: #include <sys/param.h>
! 45:
! 46: #include "samachdep.h"
! 47: #include "itevar.h"
! 48: #include "itereg.h"
! 49:
! 50: #define getbyte(ip, offset) \
! 51: *(((u_char *)(ip)->regbase) + (offset))
! 52:
! 53: #define getword(ip, offset) \
! 54: ((getbyte(ip, offset) << 8) | getbyte(ip, (offset) + 2))
! 55:
! 56: u_char ite_readbyte(struct ite_data *, int);
! 57: void ite_writeglyph(struct ite_data *, u_char *, u_char *);
! 58:
! 59: void
! 60: ite_fontinfo(struct ite_data *ip)
! 61: {
! 62: u_long fontaddr = getword(ip, getword(ip, FONTROM) + FONTADDR);
! 63:
! 64: ip->ftheight = getbyte(ip, fontaddr + FONTHEIGHT);
! 65: ip->ftwidth = getbyte(ip, fontaddr + FONTWIDTH);
! 66: ip->rows = ip->dheight / ip->ftheight;
! 67: ip->cols = ip->dwidth / ip->ftwidth;
! 68:
! 69: if (ip->fbwidth > ip->dwidth) {
! 70: /*
! 71: * Stuff goes to right of display.
! 72: */
! 73: ip->fontx = ip->dwidth;
! 74: ip->fonty = 0;
! 75: ip->cpl = (ip->fbwidth - ip->dwidth) / ip->ftwidth;
! 76: ip->cblankx = ip->dwidth;
! 77: ip->cblanky = ip->fonty + ((128 / ip->cpl) +1) * ip->ftheight;
! 78: } else {
! 79: /*
! 80: * Stuff goes below the display.
! 81: */
! 82: ip->fontx = 0;
! 83: ip->fonty = ip->dheight;
! 84: ip->cpl = ip->fbwidth / ip->ftwidth;
! 85: ip->cblankx = 0;
! 86: ip->cblanky = ip->fonty + ((128 / ip->cpl) + 1) * ip->ftheight;
! 87: }
! 88: }
! 89:
! 90: void
! 91: ite_fontinit1bpp(struct ite_data *ip)
! 92: {
! 93: u_char *fbmem, *dp;
! 94: int c, l, b;
! 95: int stride, width;
! 96:
! 97: dp = (u_char *)(getword(ip, getword(ip, FONTROM) + FONTADDR) +
! 98: ip->regbase) + FONTDATA;
! 99: stride = ip->fbwidth >> 3;
! 100: width = (ip->ftwidth + 7) / 8;
! 101:
! 102: for (c = 0; c < 128; c++) {
! 103: fbmem = (u_char *)FBBASE +
! 104: (ip->fonty + (c / ip->cpl) * ip->ftheight) * stride;
! 105: fbmem += (ip->fontx >> 3) + (c % ip->cpl) * width;
! 106: for (l = 0; l < ip->ftheight; l++) {
! 107: for (b = 0; b < width; b++) {
! 108: *fbmem++ = *dp;
! 109: dp += 2;
! 110: }
! 111: fbmem -= width;
! 112: fbmem += stride;
! 113: }
! 114: }
! 115: }
! 116:
! 117: void
! 118: ite_fontinit8bpp(struct ite_data *ip)
! 119: {
! 120: int bytewidth = (((ip->ftwidth - 1) / 8) + 1);
! 121: int glyphsize = bytewidth * ip->ftheight;
! 122: u_char fontbuf[500];
! 123: u_char *dp, *fbmem;
! 124: int c, i, romp;
! 125:
! 126: romp = getword(ip, getword(ip, FONTROM) + FONTADDR) + FONTDATA;
! 127: for (c = 0; c < 128; c++) {
! 128: fbmem = (u_char *)(FBBASE +
! 129: (ip->fonty + (c / ip->cpl) * ip->ftheight) * ip->fbwidth +
! 130: (ip->fontx + (c % ip->cpl) * ip->ftwidth));
! 131: dp = fontbuf;
! 132: for (i = 0; i < glyphsize; i++) {
! 133: *dp++ = getbyte(ip, romp);
! 134: romp += 2;
! 135: }
! 136: ite_writeglyph(ip, fbmem, fontbuf);
! 137: }
! 138: }
! 139:
! 140: void
! 141: ite_writeglyph(struct ite_data *ip, u_char *fbmem, u_char *glyphp)
! 142: {
! 143: int bn;
! 144: int l, b;
! 145:
! 146: for (l = 0; l < ip->ftheight; l++) {
! 147: bn = 7;
! 148: for (b = 0; b < ip->ftwidth; b++) {
! 149: if ((1 << bn) & *glyphp)
! 150: *fbmem++ = 1;
! 151: else
! 152: *fbmem++ = 0;
! 153: if (--bn < 0) {
! 154: bn = 7;
! 155: glyphp++;
! 156: }
! 157: }
! 158: if (bn < 7)
! 159: glyphp++;
! 160: fbmem -= ip->ftwidth;
! 161: fbmem += ip->fbwidth;
! 162: }
! 163: }
! 164:
! 165: /*
! 166: * The cursor is just an inverted space.
! 167: */
! 168: #define flip_cursor(ip) \
! 169: (*ip->bmv)(ip, ip->cblanky, ip->cblankx, ip->cursory * ip->ftheight, \
! 170: ip->cursorx * ip->ftwidth, ip->ftheight, ip->ftwidth, RR_XOR)
! 171:
! 172: void
! 173: ite_dio_cursor(struct ite_data *ip, int flag)
! 174: {
! 175: switch (flag) {
! 176: case MOVE_CURSOR:
! 177: flip_cursor(ip);
! 178: /* FALLTHROUGH */
! 179: case DRAW_CURSOR:
! 180: ip->cursorx = ip->curx;
! 181: ip->cursory = ip->cury;
! 182: /* FALLTHROUGH */
! 183: default:
! 184: flip_cursor(ip);
! 185: break;
! 186: }
! 187: }
! 188:
! 189: void
! 190: ite_dio_putc1bpp(struct ite_data *ip, int c, int dy, int dx)
! 191: {
! 192: ite_dio_windowmove1bpp(ip, charY(ip, c), charX1bpp(ip, c),
! 193: dy * ip->ftheight, dx * ip->ftwidth,
! 194: ip->ftheight, ip->ftwidth, RR_COPY);
! 195: }
! 196:
! 197: void
! 198: ite_dio_putc8bpp(struct ite_data *ip, int c, int dy, int dx)
! 199: {
! 200: (*ip->bmv)(ip, charY(ip, c), charX(ip, c),
! 201: dy * ip->ftheight, dx * ip->ftwidth,
! 202: ip->ftheight, ip->ftwidth, RR_COPY);
! 203: }
! 204:
! 205: void
! 206: ite_dio_clear(struct ite_data *ip, int sy, int sx, int h, int w)
! 207: {
! 208: (*ip->bmv)(ip, sy * ip->ftheight, sx * ip->ftwidth,
! 209: sy * ip->ftheight, sx * ip->ftwidth,
! 210: h * ip->ftheight, w * ip->ftwidth, RR_CLEAR);
! 211: }
! 212:
! 213: void
! 214: ite_dio_scroll(struct ite_data *ip)
! 215: {
! 216: flip_cursor(ip);
! 217:
! 218: (*ip->bmv)(ip, ip->ftheight, 0, 0, 0, (ip->rows - 1) * ip->ftheight,
! 219: ip->cols * ip->ftwidth, RR_COPY);
! 220: }
! 221:
! 222: #include "maskbits.h"
! 223:
! 224: /* NOTE:
! 225: * the first element in starttab could be 0xffffffff. making it 0
! 226: * lets us deal with a full first word in the middle loop, rather
! 227: * than having to do the multiple reads and masks that we'd
! 228: * have to do if we thought it was partial.
! 229: */
! 230: int starttab[32] = {
! 231: 0x00000000,
! 232: 0x7FFFFFFF,
! 233: 0x3FFFFFFF,
! 234: 0x1FFFFFFF,
! 235: 0x0FFFFFFF,
! 236: 0x07FFFFFF,
! 237: 0x03FFFFFF,
! 238: 0x01FFFFFF,
! 239: 0x00FFFFFF,
! 240: 0x007FFFFF,
! 241: 0x003FFFFF,
! 242: 0x001FFFFF,
! 243: 0x000FFFFF,
! 244: 0x0007FFFF,
! 245: 0x0003FFFF,
! 246: 0x0001FFFF,
! 247: 0x0000FFFF,
! 248: 0x00007FFF,
! 249: 0x00003FFF,
! 250: 0x00001FFF,
! 251: 0x00000FFF,
! 252: 0x000007FF,
! 253: 0x000003FF,
! 254: 0x000001FF,
! 255: 0x000000FF,
! 256: 0x0000007F,
! 257: 0x0000003F,
! 258: 0x0000001F,
! 259: 0x0000000F,
! 260: 0x00000007,
! 261: 0x00000003,
! 262: 0x00000001
! 263: };
! 264:
! 265: int endtab[32] = {
! 266: 0x00000000,
! 267: 0x80000000,
! 268: 0xC0000000,
! 269: 0xE0000000,
! 270: 0xF0000000,
! 271: 0xF8000000,
! 272: 0xFC000000,
! 273: 0xFE000000,
! 274: 0xFF000000,
! 275: 0xFF800000,
! 276: 0xFFC00000,
! 277: 0xFFE00000,
! 278: 0xFFF00000,
! 279: 0xFFF80000,
! 280: 0xFFFC0000,
! 281: 0xFFFE0000,
! 282: 0xFFFF0000,
! 283: 0xFFFF8000,
! 284: 0xFFFFC000,
! 285: 0xFFFFE000,
! 286: 0xFFFFF000,
! 287: 0xFFFFF800,
! 288: 0xFFFFFC00,
! 289: 0xFFFFFE00,
! 290: 0xFFFFFF00,
! 291: 0xFFFFFF80,
! 292: 0xFFFFFFC0,
! 293: 0xFFFFFFE0,
! 294: 0xFFFFFFF0,
! 295: 0xFFFFFFF8,
! 296: 0xFFFFFFFC,
! 297: 0xFFFFFFFE
! 298: };
! 299:
! 300: void
! 301: ite_dio_windowmove1bpp(struct ite_data *ip, int sy, int sx, int dy, int dx,
! 302: int h, int w, int func)
! 303: {
! 304: int width; /* add to get to same position in next line */
! 305:
! 306: unsigned int *psrcLine, *pdstLine;
! 307: /* pointers to line with current src and dst */
! 308: unsigned int *psrc; /* pointer to current src longword */
! 309: unsigned int *pdst; /* pointer to current dst longword */
! 310:
! 311: /* following used for looping through a line */
! 312: unsigned int startmask, endmask; /* masks for writing ends of dst */
! 313: int nlMiddle; /* whole longwords in dst */
! 314: int nl; /* temp copy of nlMiddle */
! 315: unsigned int tmpSrc; /* place to store full source word */
! 316: int xoffSrc; /* offset (>= 0, < 32) from which to
! 317: fetch whole longwords fetched
! 318: in src */
! 319: int nstart; /* number of ragged bits at start of dst */
! 320: int nend; /* number of ragged bits at end of dst */
! 321: int srcStartOver; /* pulling nstart bits from src
! 322: overflows into the next word? */
! 323:
! 324: if (h == 0 || w == 0)
! 325: return;
! 326:
! 327: width = ip->fbwidth >> 5;
! 328: psrcLine = ((unsigned int *) ip->fbbase) + (sy * width);
! 329: pdstLine = ((unsigned int *) ip->fbbase) + (dy * width);
! 330:
! 331: /* x direction doesn't matter for < 1 longword */
! 332: if (w <= 32) {
! 333: int srcBit, dstBit; /* bit offset of src and dst */
! 334:
! 335: pdstLine += (dx >> 5);
! 336: psrcLine += (sx >> 5);
! 337: psrc = psrcLine;
! 338: pdst = pdstLine;
! 339:
! 340: srcBit = sx & 0x1f;
! 341: dstBit = dx & 0x1f;
! 342:
! 343: while (h--) {
! 344: getandputrop(psrc, srcBit, dstBit, w, pdst, func);
! 345: pdst += width;
! 346: psrc += width;
! 347: }
! 348: } else {
! 349: maskbits(dx, w, startmask, endmask, nlMiddle);
! 350: if (startmask)
! 351: nstart = 32 - (dx & 0x1f);
! 352: else
! 353: nstart = 0;
! 354: if (endmask)
! 355: nend = (dx + w) & 0x1f;
! 356: else
! 357: nend = 0;
! 358:
! 359: xoffSrc = ((sx & 0x1f) + nstart) & 0x1f;
! 360: srcStartOver = ((sx & 0x1f) + nstart) > 31;
! 361:
! 362: pdstLine += (dx >> 5);
! 363: psrcLine += (sx >> 5);
! 364:
! 365: while (h--) {
! 366: psrc = psrcLine;
! 367: pdst = pdstLine;
! 368:
! 369: if (startmask) {
! 370: getandputrop(psrc, (sx & 0x1f), (dx & 0x1f),
! 371: nstart, pdst, func);
! 372: pdst++;
! 373: if (srcStartOver)
! 374: psrc++;
! 375: }
! 376:
! 377: /* special case for aligned operations */
! 378: if (xoffSrc == 0) {
! 379: nl = nlMiddle;
! 380: while (nl--) {
! 381: DoRop (*pdst, func, *psrc++, *pdst);
! 382: pdst++;
! 383: }
! 384: } else {
! 385: nl = nlMiddle + 1;
! 386: while (--nl) {
! 387: getunalignedword (psrc, xoffSrc,
! 388: tmpSrc);
! 389: DoRop (*pdst, func, tmpSrc, *pdst);
! 390: pdst++;
! 391: psrc++;
! 392: }
! 393: }
! 394:
! 395: if (endmask) {
! 396: getandputrop0(psrc, xoffSrc, nend, pdst, func);
! 397: }
! 398:
! 399: pdstLine += width;
! 400: psrcLine += width;
! 401: }
! 402: }
! 403: }
! 404: #endif
CVSweb