1 /*
2 * Copyright (c) 1988 University of Utah.
3 * Copyright (c) 1990, 1993
4 * The Regents of the University of California. 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_rb.c 1.19 93/06/25$
13 *
14 * @(#)ite_rb.c 8.1 (Berkeley) 07/08/93
15 */
16
17 #include "ite.h"
18 #if NITE > 0
19
20 #include <sys/param.h>
21 #include <sys/conf.h>
22 #include <sys/proc.h>
23 #include <sys/ioctl.h>
24 #include <sys/tty.h>
25 #include <sys/systm.h>
26
27 #include <hp/dev/itevar.h>
28 #include <hp/dev/itereg.h>
29 #include <hp300/dev/grf_rbreg.h>
30
31 #include <machine/cpu.h>
32
33 /* XXX */
34 #include <hp/dev/grfioctl.h>
35 #include <hp/dev/grfvar.h>
36
37 #define REGBASE ((struct rboxfb *)(ip->regbase))
38 #define WINDOWMOVER rbox_windowmove
39
40 rbox_init(ip)
41 struct ite_softc *ip;
42 {
43 register int i;
44
45 /* XXX */
46 if (ip->regbase == 0) {
47 struct grf_softc *gp = ip->grf;
48
49 ip->regbase = gp->g_regkva;
50 ip->fbbase = gp->g_fbkva;
51 ip->fbwidth = gp->g_display.gd_fbwidth;
52 ip->fbheight = gp->g_display.gd_fbheight;
53 ip->dwidth = gp->g_display.gd_dwidth;
54 ip->dheight = gp->g_display.gd_dheight;
55 /*
56 * XXX some displays (e.g. the davinci) appear
57 * to return a display height greater than the
58 * returned FB height. Guess we should go back
59 * to getting the display dimensions from the
60 * fontrom...
61 */
62 if (ip->dwidth > ip->fbwidth)
63 ip->dwidth = ip->fbwidth;
64 if (ip->dheight > ip->fbheight)
65 ip->dheight = ip->fbheight;
66 }
67
68 rb_waitbusy(ip->regbase);
69
70 REGBASE->reset = 0x39;
71 DELAY(1000);
72
73 REGBASE->interrupt = 0x04;
74 REGBASE->display_enable = 0x01;
75 REGBASE->video_enable = 0x01;
76 REGBASE->drive = 0x01;
77 REGBASE->vdrive = 0x0;
78
79 ite_fontinfo(ip);
80
81 REGBASE->opwen = 0xFF;
82
83 /*
84 * Clear the framebuffer.
85 */
86 rbox_windowmove(ip, 0, 0, 0, 0, ip->fbheight, ip->fbwidth, RR_CLEAR);
87 rb_waitbusy(ip->regbase);
88
89 for(i = 0; i < 16; i++) {
90 *(ip->regbase + 0x63c3 + i*4) = 0x0;
91 *(ip->regbase + 0x6403 + i*4) = 0x0;
92 *(ip->regbase + 0x6803 + i*4) = 0x0;
93 *(ip->regbase + 0x6c03 + i*4) = 0x0;
94 *(ip->regbase + 0x73c3 + i*4) = 0x0;
95 *(ip->regbase + 0x7403 + i*4) = 0x0;
96 *(ip->regbase + 0x7803 + i*4) = 0x0;
97 *(ip->regbase + 0x7c03 + i*4) = 0x0;
98 }
99
100 REGBASE->rep_rule = 0x33;
101
102 /*
103 * I cannot figure out how to make the blink planes stop. So, we
104 * must set both colormaps so that when the planes blink, and
105 * the secondary colormap is active, we still get text.
106 */
107 CM1RED[0x00].value = 0x00;
108 CM1GRN[0x00].value = 0x00;
109 CM1BLU[0x00].value = 0x00;
110 CM1RED[0x01].value = 0xFF;
111 CM1GRN[0x01].value = 0xFF;
112 CM1BLU[0x01].value = 0xFF;
113
114 CM2RED[0x00].value = 0x00;
115 CM2GRN[0x00].value = 0x00;
116 CM2BLU[0x00].value = 0x00;
117 CM2RED[0x01].value = 0xFF;
118 CM2GRN[0x01].value = 0xFF;
119 CM2BLU[0x01].value = 0xFF;
120
121 REGBASE->blink = 0x00;
122 REGBASE->write_enable = 0x01;
123 REGBASE->opwen = 0x00;
124
125 ite_fontinit(ip);
126
127 /*
128 * Stash the inverted cursor.
129 */
130 rbox_windowmove(ip, charY(ip, ' '), charX(ip, ' '),
131 ip->cblanky, ip->cblankx, ip->ftheight,
132 ip->ftwidth, RR_COPYINVERTED);
133 }
134
135 rbox_deinit(ip)
136 struct ite_softc *ip;
137 {
138 rbox_windowmove(ip, 0, 0, 0, 0, ip->fbheight, ip->fbwidth, RR_CLEAR);
139 rb_waitbusy(ip->regbase);
140
141 ip->flags &= ~ITE_INITED;
142 }
143
rbox_putc(ip,c,dy,dx,mode)144 rbox_putc(ip, c, dy, dx, mode)
145 register struct ite_softc *ip;
146 register int dy, dx;
147 int c, mode;
148 {
149 register int wrr = ((mode == ATTR_INV) ? RR_COPYINVERTED : RR_COPY);
150
151 rbox_windowmove(ip, charY(ip, c), charX(ip, c),
152 dy * ip->ftheight, dx * ip->ftwidth,
153 ip->ftheight, ip->ftwidth, wrr);
154 }
155
rbox_cursor(ip,flag)156 rbox_cursor(ip, flag)
157 register struct ite_softc *ip;
158 register int flag;
159 {
160 if (flag == DRAW_CURSOR)
161 draw_cursor(ip)
162 else if (flag == MOVE_CURSOR) {
163 erase_cursor(ip)
164 draw_cursor(ip)
165 }
166 else
167 erase_cursor(ip)
168 }
169
170 rbox_clear(ip, sy, sx, h, w)
171 struct ite_softc *ip;
172 register int sy, sx, h, w;
173 {
174 rbox_windowmove(ip, sy * ip->ftheight, sx * ip->ftwidth,
175 sy * ip->ftheight, sx * ip->ftwidth,
176 h * ip->ftheight, w * ip->ftwidth,
177 RR_CLEAR);
178 }
179
rbox_scroll(ip,sy,sx,count,dir)180 rbox_scroll(ip, sy, sx, count, dir)
181 register struct ite_softc *ip;
182 register int sy, count;
183 int dir, sx;
184 {
185 register int dy;
186 register int dx = sx;
187 register int height = 1;
188 register int width = ip->cols;
189
190 if (dir == SCROLL_UP) {
191 dy = sy - count;
192 height = ip->rows - sy;
193 }
194 else if (dir == SCROLL_DOWN) {
195 dy = sy + count;
196 height = ip->rows - dy - 1;
197 }
198 else if (dir == SCROLL_RIGHT) {
199 dy = sy;
200 dx = sx + count;
201 width = ip->cols - dx;
202 }
203 else {
204 dy = sy;
205 dx = sx - count;
206 width = ip->cols - sx;
207 }
208
209 rbox_windowmove(ip, sy * ip->ftheight, sx * ip->ftwidth,
210 dy * ip->ftheight, dx * ip->ftwidth,
211 height * ip->ftheight,
212 width * ip->ftwidth, RR_COPY);
213 }
214
215 rbox_windowmove(ip, sy, sx, dy, dx, h, w, func)
216 struct ite_softc *ip;
217 int sy, sx, dy, dx, h, w, func;
218 {
219 register struct rboxfb *rp = REGBASE;
220 if (h == 0 || w == 0)
221 return;
222
223 rb_waitbusy(ip->regbase);
224 rp->rep_rule = func << 4 | func;
225 rp->source_y = sy;
226 rp->source_x = sx;
227 rp->dest_y = dy;
228 rp->dest_x = dx;
229 rp->wheight = h;
230 rp->wwidth = w;
231 rp->wmove = 1;
232 }
233 #endif
234