|
|
1.1 root 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: * Redistribution is only permitted until one year after the first shipment
11: * of 4.4BSD by the Regents. Otherwise, redistribution and use in source and
12: * binary forms are permitted provided that: (1) source distributions retain
13: * this entire copyright notice and comment, and (2) distributions including
14: * binaries display the following acknowledgement: This product includes
15: * software developed by the University of California, Berkeley and its
16: * contributors'' in the documentation or other materials provided with the
17: * distribution and in all advertising materials mentioning features or use
18: * of this software. Neither the name of the University nor the names of
19: * its contributors may be used to endorse or promote products derived from
20: * this software without specific prior written permission.
21: * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
22: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
23: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
24: *
25: * from: Utah $Hdr: ite_gb.c 1.17 89/04/11$
26: *
27: * @(#)ite_gb.c 7.1 (Berkeley) 5/8/90
28: */
29:
30: #include "ite.h"
31: #if NITE > 0
32:
33: #include "param.h"
34: #include "conf.h"
35: #include "user.h"
36: #include "proc.h"
37: #include "ioctl.h"
38: #include "tty.h"
39: #include "systm.h"
40: #include "uio.h"
41:
42: #include "itevar.h"
43: #include "itereg.h"
44: #include "grf_gbreg.h"
45:
46: #include "machine/cpu.h"
47:
48: /* XXX */
49: #include "grfioctl.h"
50: #include "grfvar.h"
51:
52: #define REGBASE ((struct gboxfb *)(ip->regbase))
53: #define WINDOWMOVER gatorbox_windowmove
54:
55: gatorbox_init(ip)
56: register struct ite_softc *ip;
57: {
58: /* XXX */
59: if (ip->regbase == 0) {
60: struct grfinfo *gi = &grf_softc[ip - ite_softc].g_display;
61: ip->regbase = IOV(gi->gd_regaddr);
62: ip->fbbase = IOV(gi->gd_fbaddr);
63: }
64:
65: REGBASE->write_protect = 0x0;
66: REGBASE->interrupt = 0x4;
67: REGBASE->rep_rule = RR_COPY;
68: REGBASE->blink1 = 0xff;
69: REGBASE->blink2 = 0xff;
70: gb_microcode(REGADDR);
71: REGBASE->sec_interrupt = 0x01;
72:
73: /*
74: * Set up the color map entries. We use three entries in the
75: * color map. The first, is for black, the second is for
76: * white, and the very last entry is for the inverted cursor.
77: */
78: REGBASE->creg_select = 0x00;
79: REGBASE->cmap_red = 0x00;
80: REGBASE->cmap_grn = 0x00;
81: REGBASE->cmap_blu = 0x00;
82: REGBASE->cmap_write = 0x00;
83: gbcm_waitbusy(REGADDR);
84:
85: REGBASE->creg_select = 0x01;
86: REGBASE->cmap_red = 0xFF;
87: REGBASE->cmap_grn = 0xFF;
88: REGBASE->cmap_blu = 0xFF;
89: REGBASE->cmap_write = 0x01;
90: gbcm_waitbusy(REGADDR);
91:
92: REGBASE->creg_select = 0xFF;
93: REGBASE->cmap_red = 0xFF;
94: REGBASE->cmap_grn = 0xFF;
95: REGBASE->cmap_blu = 0xFF;
96: REGBASE->cmap_write = 0x01;
97: gbcm_waitbusy(REGADDR);
98:
99: ite_devinfo(ip);
100: ite_fontinit(ip);
101:
102: /*
103: * Clear the display. This used to be before the font unpacking
104: * but it crashes. Figure it out later.
105: */
106: gatorbox_windowmove(ip, 0, 0, 0, 0, ip->dheight, ip->dwidth, RR_CLEAR);
107: tile_mover_waitbusy(REGADDR);
108:
109: /*
110: * Stash the inverted cursor.
111: */
112: gatorbox_windowmove(ip, charY(ip, ' '), charX(ip, ' '),
113: ip->cblanky, ip->cblankx, ip->ftheight,
114: ip->ftwidth, RR_COPYINVERTED);
115: }
116:
117: gatorbox_deinit(ip)
118: struct ite_softc *ip;
119: {
120: gatorbox_windowmove(ip, 0, 0, 0, 0,
121: ip->dheight, ip->dwidth, RR_CLEAR);
122: tile_mover_waitbusy(REGADDR);
123:
124: ip->flags &= ~ITE_INITED;
125: }
126:
127: gatorbox_putc(ip, c, dy, dx, mode)
128: register struct ite_softc *ip;
129: register int dy, dx;
130: int c, mode;
131: {
132: register int wrr = ((mode == ATTR_INV) ? RR_COPYINVERTED : RR_COPY);
133:
134: gatorbox_windowmove(ip, charY(ip, c), charX(ip, c),
135: dy * ip->ftheight, dx * ip->ftwidth,
136: ip->ftheight, ip->ftwidth, wrr);
137: }
138:
139: gatorbox_cursor(ip, flag)
140: register struct ite_softc *ip;
141: register int flag;
142: {
143: if (flag == DRAW_CURSOR)
144: draw_cursor(ip)
145: else if (flag == MOVE_CURSOR) {
146: erase_cursor(ip)
147: draw_cursor(ip)
148: }
149: else
150: erase_cursor(ip)
151: }
152:
153: gatorbox_clear(ip, sy, sx, h, w)
154: struct ite_softc *ip;
155: register int sy, sx, h, w;
156: {
157: gatorbox_windowmove(ip, sy * ip->ftheight, sx * ip->ftwidth,
158: sy * ip->ftheight, sx * ip->ftwidth,
159: h * ip->ftheight, w * ip->ftwidth,
160: RR_CLEAR);
161: }
162: #define gatorbox_blockmove(ip, sy, sx, dy, dx, h, w) \
163: gatorbox_windowmove((ip), \
164: (sy) * ip->ftheight, \
165: (sx) * ip->ftwidth, \
166: (dy) * ip->ftheight, \
167: (dx) * ip->ftwidth, \
168: (h) * ip->ftheight, \
169: (w) * ip->ftwidth, \
170: RR_COPY)
171:
172: gatorbox_scroll(ip, sy, sx, count, dir)
173: register struct ite_softc *ip;
174: register int sy;
175: int dir, sx, count;
176: {
177: register int height, dy, i;
178:
179: tile_mover_waitbusy(REGADDR);
180: REGBASE->write_protect = 0x0;
181:
182: gatorbox_cursor(ip, ERASE_CURSOR);
183:
184: if (dir == SCROLL_UP) {
185: dy = sy - count;
186: height = ip->rows - sy;
187: for (i = 0; i < height; i++)
188: gatorbox_blockmove(ip, sy + i, sx, dy + i, 0,
189: 1, ip->cols);
190: }
191: else if (dir == SCROLL_DOWN) {
192: dy = sy + count;
193: height = ip->rows - dy;
194: for (i = (height - 1); i >= 0; i--)
195: gatorbox_blockmove(ip, sy + i, sx, dy + i, 0,
196: 1, ip->cols);
197: }
198: else if (dir == SCROLL_RIGHT) {
199: gatorbox_blockmove(ip, sy, sx, sy, sx + count,
200: 1, ip->cols - (sx + count));
201: }
202: else {
203: gatorbox_blockmove(ip, sy, sx, sy, sx - count,
204: 1, ip->cols - sx);
205: }
206: }
207:
208: gatorbox_windowmove(ip, sy, sx, dy, dx, h, w, mask)
209: register struct ite_softc *ip;
210: int sy, sx, dy, dx, mask;
211: register int h, w;
212: {
213: register int src, dest;
214:
215: src = (sy * 1024) + sx; /* upper left corner in pixels */
216: dest = (dy * 1024) + dx;
217:
218: tile_mover_waitbusy(REGADDR);
219: REGBASE->width = -(w / 4);
220: REGBASE->height = -(h / 4);
221: if (src < dest)
222: REGBASE->rep_rule = MOVE_DOWN_RIGHT|mask;
223: else {
224: REGBASE->rep_rule = MOVE_UP_LEFT|mask;
225: /*
226: * Adjust to top of lower right tile of the block.
227: */
228: src = src + ((h - 4) * 1024) + (w - 4);
229: dest= dest + ((h - 4) * 1024) + (w - 4);
230: }
231: FBBASE[dest] = FBBASE[src];
232: }
233: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.