|
|
1.1 ! root 1: #include "ite.h" ! 2: #if NITE > 0 ! 3: ! 4: #include "param.h" ! 5: #include "conf.h" ! 6: #include "proc.h" ! 7: #include "ioctl.h" ! 8: #include "tty.h" ! 9: #include "systm.h" ! 10: ! 11: #include "itevar.h" ! 12: ! 13: #include "machine/cpu.h" ! 14: ! 15: /* XXX */ ! 16: #include "grfioctl.h" ! 17: #include "grfvar.h" ! 18: #include "grf_ccreg.h" ! 19: ! 20: extern unsigned char kernel_font_width, kernel_font_height; ! 21: extern unsigned char kernel_font_lo, kernel_font_hi; ! 22: extern unsigned char kernel_font[], kernel_cursor[]; ! 23: ! 24: ! 25: customc_init(ip) ! 26: register struct ite_softc *ip; ! 27: { ! 28: struct ccfb *fb; ! 29: int fboff, fbsize; ! 30: ! 31: if (ip->grf == 0) ! 32: ip->grf = &grf_softc[ip - ite_softc]; ! 33: ! 34: ip->priv = ip->grf->g_display.gd_regaddr; ! 35: fb = (struct ccfb *) ip->priv; ! 36: fbsize = ip->grf->g_display.gd_fbsize; ! 37: ! 38: #if 0 ! 39: /* already done in the grf layer */ ! 40: ! 41: /* clear the display. bzero only likes regions up to 64k, so call multiple times */ ! 42: for (fboff = 0; fboff < fbsize; fboff += 64*1024) ! 43: bzero (fb->fb + fboff, fbsize - fboff > 64*1024 ? 64*1024 : fbsize - fboff); ! 44: #endif ! 45: ! 46: /* this is a dreadful font, but I don't have an alternative at the moment.. */ ! 47: ip->font = kernel_font; ! 48: ip->font_lo = kernel_font_lo; ! 49: ip->font_hi = kernel_font_hi; ! 50: ip->ftwidth = kernel_font_width; ! 51: ip->ftheight = kernel_font_height; ! 52: ip->cursor = kernel_cursor; ! 53: ! 54: ip->rows = fb->disp_height / ip->ftheight; ! 55: ip->cols = fb->disp_width / ip->ftwidth; ! 56: ! 57: ! 58: #if 0 ! 59: printf ("font@%x, cursor@%x\n", ip->font, ip->cursor); ! 60: dump_copperlist (fb->cop1); ! 61: dump_copperlist (fb->cop2); ! 62: #endif ! 63: } ! 64: ! 65: customc_deinit(ip) ! 66: struct ite_softc *ip; ! 67: { ! 68: ip->flags &= ~ITE_INITED; ! 69: } ! 70: ! 71: ! 72: void static inline ! 73: customc_windowmove (src, srcx, srcy, srcmod, ! 74: dst, dstx, dsty, dstmod, h, w, op) ! 75: unsigned char *src, *dst; ! 76: unsigned short srcx, srcy, srcmod; ! 77: unsigned short dstx, dsty, dstmod; ! 78: unsigned short h, w; ! 79: unsigned char op; ! 80: { ! 81: int i; ! 82: ! 83: src += srcmod*srcy + (srcx >> 3); ! 84: dst += dstmod*dsty + (dstx >> 3); ! 85: ! 86: #if 0 ! 87: printf("ccwm: %x-%x-%x-%x-%c\n", src, dst, h, w, ! 88: op == RR_XOR ? '^' : op == RR_COPY ? '|' : op == RR_CLEAR ? 'C' : 'I'); ! 89: #endif ! 90: ! 91: /* currently, only drawing to byte slots is supported... */ ! 92: if ((srcx & 07) || (dstx & 07) || (w & 07)) ! 93: panic ("customc_windowmove: odd offset"); ! 94: ! 95: w >>= 3; ! 96: while (h--) ! 97: { ! 98: if (src > dst) ! 99: for (i = 0; i < w; i++) ! 100: switch (op) ! 101: { ! 102: case RR_COPY: ! 103: dst[i] = src[i]; ! 104: break; ! 105: ! 106: case RR_CLEAR: ! 107: dst[i] = 0; ! 108: break; ! 109: ! 110: case RR_XOR: ! 111: dst[i] ^= src[i]; ! 112: break; ! 113: ! 114: case RR_COPYINVERTED: ! 115: dst[i] = ~src[i]; ! 116: break; ! 117: } ! 118: else ! 119: for (i = w - 1; i >= 0; i--) ! 120: switch (op) ! 121: { ! 122: case RR_COPY: ! 123: dst[i] = src[i]; ! 124: break; ! 125: ! 126: case RR_CLEAR: ! 127: dst[i] = 0; ! 128: break; ! 129: ! 130: case RR_XOR: ! 131: dst[i] ^= src[i]; ! 132: break; ! 133: ! 134: case RR_COPYINVERTED: ! 135: dst[i] = ~src[i]; ! 136: break; ! 137: } ! 138: ! 139: ! 140: src += srcmod; ! 141: dst += dstmod; ! 142: } ! 143: ! 144: } ! 145: ! 146: ! 147: customc_putc(ip, c, dy, dx, mode) ! 148: register struct ite_softc *ip; ! 149: register int dy, dx; ! 150: int c, mode; ! 151: { ! 152: register int wrr = ((mode == ATTR_INV) ? RR_COPYINVERTED : RR_COPY); ! 153: struct ccfb *fb = (struct ccfb *) ip->priv; ! 154: ! 155: if (c >= ip->font_lo && c <= ip->font_hi) ! 156: { ! 157: c -= ip->font_lo; ! 158: ! 159: customc_windowmove (ip->font, 0, c * ip->ftheight, 1, ! 160: fb->fb, fb->fb_x + dx * ip->ftwidth, ! 161: fb->fb_y + dy * ip->ftheight, ! 162: fb->fb_width >> 3, ! 163: ip->ftheight, ip->ftwidth, wrr); ! 164: } ! 165: } ! 166: ! 167: customc_cursor(ip, flag) ! 168: register struct ite_softc *ip; ! 169: register int flag; ! 170: { ! 171: struct ccfb *fb = (struct ccfb *) ip->priv; ! 172: ! 173: if (flag != DRAW_CURSOR) ! 174: { ! 175: /* erase it */ ! 176: customc_windowmove (ip->cursor, 0, 0, 1, ! 177: fb->fb, fb->fb_x + ip->cursorx * ip->ftwidth, ! 178: fb->fb_y + ip->cursory * ip->ftheight, ! 179: fb->fb_width >> 3, ! 180: ip->ftheight, ip->ftwidth, RR_XOR); ! 181: } ! 182: if (flag == DRAW_CURSOR || flag == MOVE_CURSOR) ! 183: { ! 184: /* draw it */ ! 185: customc_windowmove (ip->cursor, 0, 0, 1, ! 186: fb->fb, fb->fb_x + ip->curx * ip->ftwidth, ! 187: fb->fb_y + ip->cury * ip->ftheight, ! 188: fb->fb_width >> 3, ! 189: ip->ftheight, ip->ftwidth, RR_XOR); ! 190: ip->cursorx = ip->curx; ! 191: ip->cursory = ip->cury; ! 192: } ! 193: } ! 194: ! 195: customc_clear(ip, sy, sx, h, w) ! 196: struct ite_softc *ip; ! 197: register int sy, sx, h, w; ! 198: { ! 199: struct ccfb *fb = (struct ccfb *) ip->priv; ! 200: ! 201: customc_windowmove (0, 0, 0, 0, ! 202: fb->fb, fb->fb_x + sx * ip->ftwidth, ! 203: fb->fb_y + sy * ip->ftheight, ! 204: fb->fb_width >> 3, ! 205: h * ip->ftheight, w * ip->ftwidth, RR_CLEAR); ! 206: } ! 207: ! 208: customc_blockmove(ip, sy, sx, dy, dx, h, w) ! 209: register struct ite_softc *ip; ! 210: int sy, sx, dy, dx, h, w; ! 211: { ! 212: struct ccfb *fb = (struct ccfb *) ip->priv; ! 213: ! 214: customc_windowmove(fb->fb, fb->fb_x + sx * ip->ftwidth, ! 215: fb->fb_y + sy * ip->ftheight, ! 216: fb->fb_width >> 3, ! 217: fb->fb, fb->fb_x + dx * ip->ftwidth, ! 218: fb->fb_y + dy * ip->ftheight, ! 219: fb->fb_width >> 3, ! 220: h * ip->ftheight, w * ip->ftwidth, RR_COPY); ! 221: } ! 222: ! 223: customc_scroll(ip, sy, sx, count, dir) ! 224: register struct ite_softc *ip; ! 225: register int sy; ! 226: int dir, sx, count; ! 227: { ! 228: register int height, dy, i; ! 229: ! 230: customc_cursor(ip, ERASE_CURSOR); ! 231: ! 232: if (dir == SCROLL_UP) ! 233: { ! 234: dy = sy - count; ! 235: height = ip->bottom_margin - sy + 1; ! 236: for (i = 0; i < height; i++) ! 237: customc_blockmove(ip, sy + i, sx, dy + i, 0, 1, ip->cols); ! 238: } ! 239: else if (dir == SCROLL_DOWN) ! 240: { ! 241: dy = sy + count; ! 242: height = ip->bottom_margin - dy + 1; ! 243: for (i = (height - 1); i >= 0; i--) ! 244: customc_blockmove(ip, sy + i, sx, dy + i, 0, 1, ip->cols); ! 245: } ! 246: else if (dir == SCROLL_RIGHT) ! 247: { ! 248: customc_blockmove(ip, sy, sx, sy, sx + count, 1, ip->cols - (sx + count)); ! 249: } ! 250: else ! 251: { ! 252: customc_blockmove(ip, sy, sx, sy, sx - count, 1, ip->cols - sx); ! 253: } ! 254: } ! 255: ! 256: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.