1 /* 2 * Copyright (c) 1988 University of Utah. 3 * Copyright (c) 1990 The Regents of the University of California. 4 * All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * the Systems Programming Group of the University of Utah Computer 8 * Science Department. 9 * 10 * %sccs.include.redist.c% 11 * 12 * from: Utah $Hdr: ite_dv.c 1.1 90/07/09$ 13 * 14 * @(#)ite_dv.c 7.3 (Berkeley) 12/16/90 15 */ 16 17 #include "ite.h" 18 #if NITE > 0 19 20 #include "sys/param.h" 21 #include "sys/conf.h" 22 #include "sys/user.h" 23 #include "sys/proc.h" 24 #include "sys/ioctl.h" 25 #include "sys/tty.h" 26 #include "sys/systm.h" 27 #include "sys/uio.h" 28 29 #include "itevar.h" 30 #include "itereg.h" 31 #include "grf_dvreg.h" 32 33 #include "../include/cpu.h" 34 35 /* XXX */ 36 #include "grfioctl.h" 37 #include "grfvar.h" 38 39 #define REGBASE ((struct dvboxfb *)(ip->regbase)) 40 #define WINDOWMOVER dvbox_windowmove 41 42 dvbox_init(ip) 43 struct ite_softc *ip; 44 { 45 int i; 46 47 /* XXX */ 48 if (ip->regbase == 0) { 49 struct grfinfo *gi = &grf_softc[ip - ite_softc].g_display; 50 ip->regbase = IOV(gi->gd_regaddr); 51 ip->fbbase = IOV(gi->gd_fbaddr); 52 } 53 54 dv_reset(REGADDR); 55 56 /* 57 * Turn on frame buffer, turn on overlay planes, set replacement 58 * rule, enable top overlay plane writes for ite, disable all frame 59 * buffer planes, set byte per pixel, and display frame buffer 0. 60 * Lastly, turn on the box. 61 */ 62 REGBASE->interrupt = 0x04; 63 REGBASE->drive = 0x10; 64 REGBASE->rep_rule = RR_COPY << 4 | RR_COPY; 65 REGBASE->opwen = 0x01; 66 REGBASE->fbwen = 0x0; 67 REGBASE->fold = 0x01; 68 REGBASE->vdrive = 0x0; 69 REGBASE->dispen = 0x01; 70 71 /* 72 * Video enable top overlay plane. 73 */ 74 REGBASE->opvenp = 0x01; 75 REGBASE->opvens = 0x01; 76 77 /* 78 * Make sure that overlay planes override frame buffer planes. 79 */ 80 REGBASE->ovly0p = 0x0; 81 REGBASE->ovly0s = 0x0; 82 REGBASE->ovly1p = 0x0; 83 REGBASE->ovly1s = 0x0; 84 REGBASE->fv_trig = 0x1; 85 DELAY(100); 86 87 /* 88 * Setup the overlay colormaps. Need to set the 0,1 (black/white) 89 * color for both banks. 90 */ 91 92 for (i = 0; i <= 1; i++) { 93 REGBASE->cmapbank = i; 94 REGBASE->rgb[0].red = 0x00; 95 REGBASE->rgb[0].green = 0x00; 96 REGBASE->rgb[0].blue = 0x00; 97 REGBASE->rgb[1].red = 0xFF; 98 REGBASE->rgb[1].green = 0xFF; 99 REGBASE->rgb[1].blue = 0xFF; 100 } 101 REGBASE->cmapbank = 0; 102 103 db_waitbusy(REGADDR); 104 105 ite_devinfo(ip); 106 ite_fontinit(ip); 107 108 /* 109 * Clear the (visible) framebuffer. 110 */ 111 dvbox_windowmove(ip, 0, 0, 0, 0, ip->dheight, ip->dwidth, RR_CLEAR); 112 db_waitbusy(REGADDR); 113 114 /* 115 * Stash the inverted cursor. 116 */ 117 dvbox_windowmove(ip, charY(ip, ' '), charX(ip, ' '), 118 ip->cblanky, ip->cblankx, ip->ftheight, 119 ip->ftwidth, RR_COPYINVERTED); 120 } 121 122 dvbox_deinit(ip) 123 struct ite_softc *ip; 124 { 125 dvbox_windowmove(ip, 0, 0, 0, 0, ip->fbheight, ip->fbwidth, RR_CLEAR); 126 db_waitbusy(REGADDR); 127 128 ip->flags &= ~ITE_INITED; 129 } 130 131 dvbox_putc(ip, c, dy, dx, mode) 132 register struct ite_softc *ip; 133 register int dy, dx; 134 int c, mode; 135 { 136 register int wrr = ((mode == ATTR_INV) ? RR_COPYINVERTED : RR_COPY); 137 138 dvbox_windowmove(ip, charY(ip, c), charX(ip, c), 139 dy * ip->ftheight, dx * ip->ftwidth, 140 ip->ftheight, ip->ftwidth, wrr); 141 } 142 143 dvbox_cursor(ip, flag) 144 register struct ite_softc *ip; 145 register int flag; 146 { 147 if (flag == DRAW_CURSOR) 148 draw_cursor(ip) 149 else if (flag == MOVE_CURSOR) { 150 erase_cursor(ip) 151 draw_cursor(ip) 152 } 153 else 154 erase_cursor(ip) 155 } 156 157 dvbox_clear(ip, sy, sx, h, w) 158 struct ite_softc *ip; 159 register int sy, sx, h, w; 160 { 161 dvbox_windowmove(ip, sy * ip->ftheight, sx * ip->ftwidth, 162 sy * ip->ftheight, sx * ip->ftwidth, 163 h * ip->ftheight, w * ip->ftwidth, 164 RR_CLEAR); 165 } 166 167 dvbox_scroll(ip, sy, sx, count, dir) 168 register struct ite_softc *ip; 169 register int sy, count; 170 int dir, sx; 171 { 172 register int dy; 173 register int dx = sx; 174 register int height = 1; 175 register int width = ip->cols; 176 177 dvbox_cursor(ip, ERASE_CURSOR); 178 179 if (dir == SCROLL_UP) { 180 dy = sy - count; 181 height = ip->rows - sy; 182 } 183 else if (dir == SCROLL_DOWN) { 184 dy = sy + count; 185 height = ip->rows - dy - 1; 186 } 187 else if (dir == SCROLL_RIGHT) { 188 dy = sy; 189 dx = sx + count; 190 width = ip->cols - dx; 191 } 192 else { 193 dy = sy; 194 dx = sx - count; 195 width = ip->cols - sx; 196 } 197 198 dvbox_windowmove(ip, sy * ip->ftheight, sx * ip->ftwidth, 199 dy * ip->ftheight, dx * ip->ftwidth, 200 height * ip->ftheight, 201 width * ip->ftwidth, RR_COPY); 202 } 203 204 dvbox_windowmove(ip, sy, sx, dy, dx, h, w, func) 205 struct ite_softc *ip; 206 int sy, sx, dy, dx, h, w, func; 207 { 208 register struct dvboxfb *dp = REGBASE; 209 if (h == 0 || w == 0) 210 return; 211 212 db_waitbusy(REGADDR); 213 dp->rep_rule = func << 4 | func; 214 dp->source_y = sy; 215 dp->source_x = sx; 216 dp->dest_y = dy; 217 dp->dest_x = dx; 218 dp->wheight = h; 219 dp->wwidth = w; 220 dp->wmove = 1; 221 } 222 #endif 223