grf_rh.c revision 1.2 1 1.1 chopps /*
2 1.2 chopps * $Id: grf_rh.c,v 1.2 1994/06/15 19:06:00 chopps Exp $
3 1.1 chopps */
4 1.1 chopps
5 1.2 chopps #include "grfrh.h"
6 1.2 chopps #if NGRFRH > 0
7 1.1 chopps
8 1.1 chopps /*
9 1.1 chopps * Graphics routines for the Retina BLT Z3 board,
10 1.1 chopps * using the NCR 77C32BLT VGA controller.
11 1.1 chopps */
12 1.1 chopps
13 1.1 chopps #include <sys/param.h>
14 1.1 chopps #include <sys/errno.h>
15 1.1 chopps #include <sys/ioctl.h>
16 1.1 chopps #include <sys/device.h>
17 1.1 chopps #include <sys/malloc.h>
18 1.1 chopps #include <machine/cpu.h>
19 1.1 chopps #include <amiga/amiga/device.h>
20 1.1 chopps #include <amiga/dev/grfioctl.h>
21 1.1 chopps #include <amiga/dev/grfvar.h>
22 1.1 chopps #include <amiga/dev/grf_rhreg.h>
23 1.1 chopps #include <amiga/dev/zthreebusvar.h>
24 1.1 chopps
25 1.1 chopps int rh_mondefok __P((struct MonDef *));
26 1.1 chopps
27 1.1 chopps u_short CompFQ __P((u_int fq));
28 1.1 chopps int rh_load_mon __P((struct grf_softc *gp, struct MonDef *md));
29 1.1 chopps int rh_getvmode __P((struct grf_softc *gp, struct grfvideo_mode *vm));
30 1.1 chopps int rh_setvmode __P((struct grf_softc *gp, unsigned int mode, int txtonly));
31 1.1 chopps
32 1.1 chopps
33 1.1 chopps extern unsigned char kernel_font_8x8_width, kernel_font_8x8_height;
34 1.1 chopps extern unsigned char kernel_font_8x8_lo, kernel_font_8x8_hi;
35 1.1 chopps extern unsigned char kernel_font_8x8[];
36 1.2 chopps #ifdef KFONT_8X11
37 1.2 chopps extern unsigned char kernel_font_8x11_width, kernel_font_8x11_height;
38 1.2 chopps extern unsigned char kernel_font_8x11_lo, kernel_font_8x11_hi;
39 1.2 chopps extern unsigned char kernel_font_8x11[];
40 1.2 chopps #endif
41 1.1 chopps
42 1.1 chopps
43 1.1 chopps /*
44 1.1 chopps * NOTE: this driver for the MacroSystem Retina board was only possible,
45 1.1 chopps * because MacroSystem provided information about the pecularities
46 1.1 chopps * of the board. THANKS! Competition in Europe among gfx board
47 1.1 chopps * manufacturers is rather tough, so Lutz Vieweg, who wrote the
48 1.1 chopps * initial driver, has made an agreement with MS not to document
49 1.1 chopps * the driver source (see also his Copyright disclaimer below).
50 1.1 chopps * -> ALL comments after
51 1.1 chopps * -> "/* -------------- START OF CODE -------------- * /"
52 1.1 chopps * -> have been added by myself (mw) from studying the publically
53 1.1 chopps * -> available "NCR 77C32BLT" Data Manual
54 1.1 chopps *
55 1.1 chopps * Lutz' original driver source (without any of my comments) is
56 1.1 chopps * available on request.
57 1.1 chopps */
58 1.1 chopps
59 1.1 chopps /* This code offers low-level routines to access the Retina BLT Z3
60 1.1 chopps * graphics-board manufactured by MS MacroSystem GmbH from within NetBSD
61 1.1 chopps * for the Amiga. * No warranties for any kind of function at all - this
62 1.1 chopps * code may crash your hardware and scratch your harddisk. Use at your
63 1.1 chopps * own risk. Freely distributable.
64 1.1 chopps *
65 1.1 chopps * Written by Lutz Vieweg 02/94
66 1.1 chopps *
67 1.1 chopps * Thanks to MacroSystem for providing me with the neccessary information
68 1.1 chopps * to create theese routines. The sparse documentation of this code
69 1.1 chopps * results from the agreements between MS and me.
70 1.1 chopps */
71 1.1 chopps
72 1.1 chopps
73 1.1 chopps
74 1.1 chopps #define MDF_DBL 1
75 1.1 chopps #define MDF_LACE 2
76 1.1 chopps #define MDF_CLKDIV2 4
77 1.1 chopps
78 1.1 chopps
79 1.1 chopps /* -------------- START OF CODE -------------- */
80 1.1 chopps
81 1.1 chopps /* Convert big-endian long into little-endian long. */
82 1.1 chopps
83 1.1 chopps #define M2I(val) \
84 1.1 chopps asm volatile (" rorw #8,%0 ; \
85 1.1 chopps swap %0 ; \
86 1.1 chopps rorw #8,%0 ; " : "=d" (val) : "0" (val));
87 1.1 chopps
88 1.1 chopps #define M2INS(val) \
89 1.1 chopps asm volatile (" rorw #8,%0 ; \
90 1.1 chopps swap %0 ; \
91 1.1 chopps rorw #8,%0 ; \
92 1.1 chopps swap %0 ; " : "=d" (val) : "0" (val));
93 1.1 chopps
94 1.1 chopps #define ACM_OFFSET (0x00b00000)
95 1.1 chopps #define LM_OFFSET (0x00c00000)
96 1.1 chopps
97 1.1 chopps static unsigned char optab[] = {
98 1.1 chopps 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
99 1.1 chopps 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0
100 1.1 chopps };
101 1.1 chopps static char optabs[] = {
102 1.1 chopps 0, -1, -1, -1, -1, 0, -1, -1,
103 1.1 chopps -1, -1, 0, -1, -1, -1, -1, 0
104 1.1 chopps };
105 1.1 chopps
106 1.1 chopps void
107 1.1 chopps RZ3DisableHWC(gp)
108 1.1 chopps struct grf_softc *gp;
109 1.1 chopps {
110 1.1 chopps volatile void *ba = gp->g_regkva;
111 1.1 chopps
112 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_Y_INDEX, 0x00);
113 1.1 chopps }
114 1.1 chopps
115 1.1 chopps void
116 1.1 chopps RZ3SetupHWC(gp, col1, col2, hsx, hsy, data)
117 1.1 chopps struct grf_softc *gp;
118 1.1 chopps unsigned char col1;
119 1.1 chopps unsigned col2;
120 1.1 chopps unsigned char hsx;
121 1.1 chopps unsigned char hsy;
122 1.1 chopps const unsigned long *data;
123 1.1 chopps {
124 1.1 chopps volatile unsigned char *ba = gp->g_regkva;
125 1.1 chopps unsigned long *c = (unsigned long *)(ba + LM_OFFSET + HWC_MEM_OFF);
126 1.1 chopps const unsigned long *s = data;
127 1.1 chopps struct MonDef *MonitorDef = (struct MonDef *) gp->g_data;
128 1.1 chopps short x = (HWC_MEM_SIZE / (4*4)) - 1;
129 1.1 chopps /* copy only, if there is a data pointer. */
130 1.1 chopps if (data) do {
131 1.1 chopps *c++ = *s++;
132 1.1 chopps *c++ = *s++;
133 1.1 chopps *c++ = *s++;
134 1.1 chopps *c++ = *s++;
135 1.1 chopps } while (x-- > 0);
136 1.1 chopps
137 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_COLOR1, col1);
138 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_COLOR0, col2);
139 1.1 chopps if (MonitorDef->DEP < 16)
140 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_CONTROL, 0x85);
141 1.1 chopps else
142 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_CONTROL, 0xa5);
143 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_X_LOC_HI, 0x00);
144 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_X_LOC_LO, 0x00);
145 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_Y_LOC_HI, 0x00);
146 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_Y_LOC_LO, 0x00);
147 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_X_INDEX, hsx);
148 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_Y_INDEX, hsy);
149 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_STORE_HI, 0x00);
150 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_STORE_LO, ((HWC_MEM_OFF / 4) & 0x0000f));
151 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_ST_OFF_HI, (((HWC_MEM_OFF / 4) & 0xff000) >> 12));
152 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_ST_OFF_LO, (((HWC_MEM_OFF / 4) & 0x00ff0) >> 4));
153 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_PIXELMASK, 0xff);
154 1.1 chopps }
155 1.1 chopps
156 1.1 chopps void
157 1.1 chopps RZ3AlphaErase (gp, xd, yd, w, h)
158 1.1 chopps struct grf_softc *gp;
159 1.1 chopps unsigned short xd;
160 1.1 chopps unsigned short yd;
161 1.1 chopps unsigned short w;
162 1.1 chopps unsigned short h;
163 1.1 chopps {
164 1.1 chopps const struct MonDef * md = (struct MonDef *) gp->g_data;
165 1.1 chopps RZ3AlphaCopy(gp, xd, yd+md->TY, xd, yd, w, h);
166 1.1 chopps }
167 1.1 chopps
168 1.1 chopps void
169 1.1 chopps RZ3AlphaCopy (gp, xs, ys, xd, yd, w, h)
170 1.1 chopps struct grf_softc *gp;
171 1.1 chopps unsigned short xs;
172 1.1 chopps unsigned short ys;
173 1.1 chopps unsigned short xd;
174 1.1 chopps unsigned short yd;
175 1.1 chopps unsigned short w;
176 1.1 chopps unsigned short h;
177 1.1 chopps {
178 1.1 chopps volatile unsigned char *ba = gp->g_regkva;
179 1.1 chopps const struct MonDef *md = (struct MonDef *) gp->g_data;
180 1.1 chopps volatile unsigned long *acm = (unsigned long *) (ba + ACM_OFFSET);
181 1.1 chopps unsigned short mod;
182 1.1 chopps
183 1.1 chopps xs *= 4;
184 1.1 chopps ys *= 4;
185 1.1 chopps xd *= 4;
186 1.1 chopps yd *= 4;
187 1.1 chopps w *= 4;
188 1.1 chopps
189 1.1 chopps {
190 1.1 chopps /* anyone got Windoze GDI opcodes handy?... */
191 1.1 chopps unsigned long tmp = 0x0000ca00;
192 1.1 chopps *(acm + ACM_RASTEROP_ROTATION/4) = tmp;
193 1.1 chopps }
194 1.1 chopps
195 1.1 chopps mod = 0xc0c2;
196 1.1 chopps
197 1.1 chopps {
198 1.1 chopps unsigned long pat = 8 * PAT_MEM_OFF;
199 1.1 chopps unsigned long dst = 8 * (xd + yd * md->TX);
200 1.1 chopps
201 1.1 chopps unsigned long src = 8 * (xs + ys * md->TX);
202 1.1 chopps
203 1.1 chopps if (xd > xs) {
204 1.1 chopps mod &= ~0x8000;
205 1.1 chopps src += 8 * (w - 1);
206 1.1 chopps dst += 8 * (w - 1);
207 1.1 chopps pat += 8 * 2;
208 1.1 chopps }
209 1.1 chopps if (yd > ys) {
210 1.1 chopps mod &= ~0x4000;
211 1.1 chopps src += 8 * (h - 1) * md->TX * 4;
212 1.1 chopps dst += 8 * (h - 1) * md->TX * 4;
213 1.1 chopps pat += 8 * 4;
214 1.1 chopps }
215 1.1 chopps
216 1.1 chopps M2I(src);
217 1.1 chopps *(acm + ACM_SOURCE/4) = src;
218 1.1 chopps
219 1.1 chopps M2I(pat);
220 1.1 chopps *(acm + ACM_PATTERN/4) = pat;
221 1.1 chopps
222 1.1 chopps M2I(dst);
223 1.1 chopps *(acm + ACM_DESTINATION/4) = dst;
224 1.1 chopps }
225 1.1 chopps {
226 1.1 chopps
227 1.1 chopps unsigned long tmp = mod << 16;
228 1.1 chopps *(acm + ACM_CONTROL/4) = tmp;
229 1.1 chopps }
230 1.1 chopps {
231 1.1 chopps
232 1.1 chopps unsigned long tmp = w | (h << 16);
233 1.1 chopps M2I(tmp);
234 1.1 chopps *(acm + ACM_BITMAP_DIMENSION/4) = tmp;
235 1.1 chopps }
236 1.1 chopps
237 1.1 chopps *(((volatile unsigned char *)acm) + ACM_START_STATUS) = 0x00;
238 1.1 chopps *(((volatile unsigned char *)acm) + ACM_START_STATUS) = 0x01;
239 1.1 chopps
240 1.1 chopps while ((*(((volatile unsigned char *)acm) +
241 1.1 chopps (ACM_START_STATUS + 2)) & 1) == 0);
242 1.1 chopps }
243 1.1 chopps
244 1.1 chopps void
245 1.1 chopps RZ3BitBlit (gp, gbb)
246 1.1 chopps struct grf_softc *gp;
247 1.1 chopps struct grf_bitblt * gbb;
248 1.1 chopps {
249 1.1 chopps volatile unsigned char *ba = gp->g_regkva;
250 1.1 chopps volatile unsigned char *lm = ba + LM_OFFSET;
251 1.1 chopps volatile unsigned long *acm = (unsigned long *) (ba + ACM_OFFSET);
252 1.1 chopps const struct MonDef *md = (struct MonDef *) gp->g_data;
253 1.1 chopps unsigned short mod;
254 1.1 chopps
255 1.1 chopps {
256 1.1 chopps unsigned long * pt = (unsigned long *) (lm + PAT_MEM_OFF);
257 1.1 chopps unsigned long tmp = gbb->mask | ((unsigned long)gbb->mask << 16);
258 1.1 chopps *pt++ = tmp;
259 1.1 chopps *pt = tmp;
260 1.1 chopps }
261 1.1 chopps
262 1.1 chopps {
263 1.1 chopps
264 1.1 chopps unsigned long tmp = optab[ gbb->op ] << 8;
265 1.1 chopps *(acm + ACM_RASTEROP_ROTATION/4) = tmp;
266 1.1 chopps }
267 1.1 chopps
268 1.1 chopps mod = 0xc0c2;
269 1.1 chopps
270 1.1 chopps {
271 1.1 chopps unsigned long pat = 8 * PAT_MEM_OFF;
272 1.1 chopps unsigned long dst = 8 * (gbb->dst_x + gbb->dst_y * md->TX);
273 1.1 chopps
274 1.1 chopps if (optabs[gbb->op]) {
275 1.1 chopps unsigned long src = 8 * (gbb->src_x + gbb->src_y * md->TX);
276 1.1 chopps
277 1.1 chopps if (gbb->dst_x > gbb->src_x) {
278 1.1 chopps mod &= ~0x8000;
279 1.1 chopps src += 8 * (gbb->w - 1);
280 1.1 chopps dst += 8 * (gbb->w - 1);
281 1.1 chopps pat += 8 * 2;
282 1.1 chopps }
283 1.1 chopps if (gbb->dst_y > gbb->src_y) {
284 1.1 chopps mod &= ~0x4000;
285 1.1 chopps src += 8 * (gbb->h - 1) * md->TX;
286 1.1 chopps dst += 8 * (gbb->h - 1) * md->TX;
287 1.1 chopps pat += 8 * 4;
288 1.1 chopps }
289 1.1 chopps
290 1.1 chopps M2I(src);
291 1.1 chopps *(acm + ACM_SOURCE/4) = src;
292 1.1 chopps }
293 1.1 chopps
294 1.1 chopps M2I(pat);
295 1.1 chopps *(acm + ACM_PATTERN/4) = pat;
296 1.1 chopps
297 1.1 chopps M2I(dst);
298 1.1 chopps *(acm + ACM_DESTINATION/4) = dst;
299 1.1 chopps }
300 1.1 chopps {
301 1.1 chopps
302 1.1 chopps unsigned long tmp = mod << 16;
303 1.1 chopps *(acm + ACM_CONTROL/4) = tmp;
304 1.1 chopps }
305 1.1 chopps {
306 1.1 chopps unsigned long tmp = gbb->w | (gbb->h << 16);
307 1.1 chopps M2I(tmp);
308 1.1 chopps *(acm + ACM_BITMAP_DIMENSION/4) = tmp;
309 1.1 chopps }
310 1.1 chopps
311 1.1 chopps *(((volatile unsigned char *)acm) + ACM_START_STATUS) = 0x00;
312 1.1 chopps *(((volatile unsigned char *)acm) + ACM_START_STATUS) = 0x01;
313 1.1 chopps
314 1.1 chopps while ((*(((volatile unsigned char *)acm) +
315 1.1 chopps (ACM_START_STATUS + 2)) & 1) == 0);
316 1.1 chopps }
317 1.1 chopps
318 1.1 chopps void
319 1.1 chopps RZ3BitBlit16 (gp, gbb)
320 1.1 chopps struct grf_softc *gp;
321 1.1 chopps struct grf_bitblt * gbb;
322 1.1 chopps {
323 1.1 chopps volatile unsigned char *ba = gp->g_regkva;
324 1.1 chopps volatile unsigned char *lm = ba + LM_OFFSET;
325 1.1 chopps volatile unsigned long * acm = (unsigned long *) (ba + ACM_OFFSET);
326 1.1 chopps const struct MonDef * md = (struct MonDef *) gp->g_data;
327 1.1 chopps unsigned short mod;
328 1.1 chopps
329 1.1 chopps {
330 1.1 chopps unsigned long * pt = (unsigned long *) (lm + PAT_MEM_OFF);
331 1.1 chopps unsigned long tmp = gbb->mask | ((unsigned long)gbb->mask << 16);
332 1.1 chopps *pt++ = tmp;
333 1.1 chopps *pt++ = tmp;
334 1.1 chopps *pt++ = tmp;
335 1.1 chopps *pt = tmp;
336 1.1 chopps }
337 1.1 chopps
338 1.1 chopps {
339 1.1 chopps
340 1.1 chopps unsigned long tmp = optab[ gbb->op ] << 8;
341 1.1 chopps *(acm + ACM_RASTEROP_ROTATION/4) = tmp;
342 1.1 chopps }
343 1.1 chopps
344 1.1 chopps mod = 0xc0c2;
345 1.1 chopps
346 1.1 chopps {
347 1.1 chopps unsigned long pat = 8 * PAT_MEM_OFF;
348 1.1 chopps unsigned long dst = 8 * 2 * (gbb->dst_x + gbb->dst_y * md->TX);
349 1.1 chopps
350 1.1 chopps if (optabs[gbb->op]) {
351 1.1 chopps unsigned long src = 8 * 2 * (gbb->src_x + gbb->src_y * md->TX);
352 1.1 chopps
353 1.1 chopps if (gbb->dst_x > gbb->src_x) {
354 1.1 chopps mod &= ~0x8000;
355 1.1 chopps src += 8 * 2 * (gbb->w);
356 1.1 chopps dst += 8 * 2 * (gbb->w);
357 1.1 chopps pat += 8 * 2 * 2;
358 1.1 chopps }
359 1.1 chopps if (gbb->dst_y > gbb->src_y) {
360 1.1 chopps mod &= ~0x4000;
361 1.1 chopps src += 8 * 2 * (gbb->h - 1) * md->TX;
362 1.1 chopps dst += 8 * 2 * (gbb->h - 1) * md->TX;
363 1.1 chopps pat += 8 * 4 * 2;
364 1.1 chopps }
365 1.1 chopps
366 1.1 chopps M2I(src);
367 1.1 chopps *(acm + ACM_SOURCE/4) = src;
368 1.1 chopps }
369 1.1 chopps
370 1.1 chopps M2I(pat);
371 1.1 chopps *(acm + ACM_PATTERN/4) = pat;
372 1.1 chopps
373 1.1 chopps M2I(dst);
374 1.1 chopps *(acm + ACM_DESTINATION/4) = dst;
375 1.1 chopps }
376 1.1 chopps {
377 1.1 chopps
378 1.1 chopps unsigned long tmp = mod << 16;
379 1.1 chopps *(acm + ACM_CONTROL/4) = tmp;
380 1.1 chopps }
381 1.1 chopps {
382 1.1 chopps
383 1.1 chopps unsigned long tmp = gbb->w | (gbb->h << 16);
384 1.1 chopps M2I(tmp);
385 1.1 chopps *(acm + ACM_BITMAP_DIMENSION/4) = tmp;
386 1.1 chopps }
387 1.1 chopps
388 1.1 chopps *(((volatile unsigned char *)acm) + ACM_START_STATUS) = 0x00;
389 1.1 chopps *(((volatile unsigned char *)acm) + ACM_START_STATUS) = 0x01;
390 1.1 chopps
391 1.1 chopps while ((*(((volatile unsigned char *)acm) +
392 1.1 chopps (ACM_START_STATUS+ 2)) & 1) == 0);
393 1.1 chopps }
394 1.1 chopps
395 1.1 chopps void
396 1.1 chopps RZ3SetCursorPos (gp, pos)
397 1.1 chopps struct grf_softc *gp;
398 1.1 chopps unsigned short pos;
399 1.1 chopps {
400 1.1 chopps volatile unsigned char *ba = gp->g_regkva;
401 1.1 chopps
402 1.1 chopps WCrt(ba, CRT_ID_CURSOR_LOC_LOW, (unsigned char)pos);
403 1.1 chopps WCrt(ba, CRT_ID_CURSOR_LOC_HIGH, (unsigned char)(pos >> 8));
404 1.1 chopps
405 1.1 chopps }
406 1.1 chopps
407 1.1 chopps void
408 1.1 chopps RZ3LoadPalette (gp, pal, firstcol, colors)
409 1.1 chopps struct grf_softc *gp;
410 1.1 chopps unsigned char * pal;
411 1.1 chopps unsigned char firstcol;
412 1.1 chopps unsigned char colors;
413 1.1 chopps {
414 1.1 chopps volatile unsigned char *ba = gp->g_regkva;
415 1.1 chopps
416 1.1 chopps if (colors == 0)
417 1.1 chopps return;
418 1.1 chopps
419 1.1 chopps vgaw(ba, VDAC_ADDRESS_W, firstcol);
420 1.1 chopps
421 1.1 chopps {
422 1.1 chopps
423 1.1 chopps short x = colors-1;
424 1.1 chopps const unsigned char * col = pal;
425 1.1 chopps do {
426 1.1 chopps
427 1.1 chopps vgaw(ba, VDAC_DATA, (*col++ >> 2));
428 1.1 chopps vgaw(ba, VDAC_DATA, (*col++ >> 2));
429 1.1 chopps vgaw(ba, VDAC_DATA, (*col++ >> 2));
430 1.1 chopps
431 1.1 chopps } while (x-- > 0);
432 1.1 chopps
433 1.1 chopps }
434 1.1 chopps }
435 1.1 chopps
436 1.1 chopps void
437 1.1 chopps RZ3SetPalette (gp, colornum, red, green, blue)
438 1.1 chopps struct grf_softc *gp;
439 1.1 chopps unsigned char colornum;
440 1.1 chopps unsigned char red, green, blue;
441 1.1 chopps {
442 1.1 chopps volatile unsigned char *ba = gp->g_regkva;
443 1.1 chopps
444 1.1 chopps vgaw(ba, VDAC_ADDRESS_W, colornum);
445 1.1 chopps
446 1.1 chopps vgaw(ba, VDAC_DATA, (red >> 2));
447 1.1 chopps vgaw(ba, VDAC_DATA, (green >> 2));
448 1.1 chopps vgaw(ba, VDAC_DATA, (blue >> 2));
449 1.1 chopps
450 1.1 chopps }
451 1.1 chopps
452 1.1 chopps /* XXXXXXXXX !! */
453 1.1 chopps static unsigned short xpan;
454 1.1 chopps static unsigned short ypan;
455 1.1 chopps
456 1.1 chopps void
457 1.1 chopps RZ3SetPanning (gp, xoff, yoff)
458 1.1 chopps struct grf_softc *gp;
459 1.1 chopps unsigned short xoff, yoff;
460 1.1 chopps {
461 1.1 chopps volatile unsigned char *ba = gp->g_regkva;
462 1.1 chopps const struct MonDef * md = (struct MonDef *) gp->g_data;
463 1.1 chopps unsigned long off;
464 1.1 chopps
465 1.1 chopps xpan = xoff;
466 1.1 chopps ypan = yoff;
467 1.1 chopps
468 1.1 chopps
469 1.1 chopps if (md->DEP > 8)
470 1.1 chopps xoff *= 2;
471 1.1 chopps
472 1.1 chopps vgar(ba, ACT_ADDRESS_RESET);
473 1.1 chopps WAttr(ba, ACT_ID_HOR_PEL_PANNING, (unsigned char)((xoff << 1) & 0x07));
474 1.1 chopps /* have the color lookup function normally again */
475 1.1 chopps vgaw(ba, ACT_ADDRESS_W, 0x20);
476 1.1 chopps
477 1.1 chopps if (md->DEP == 8)
478 1.1 chopps off = ((yoff * md->TX)/ 4) + (xoff >> 2);
479 1.1 chopps else
480 1.1 chopps off = ((yoff * md->TX * 2)/ 4) + (xoff >> 2);
481 1.1 chopps
482 1.1 chopps WCrt(ba, CRT_ID_START_ADDR_LOW, ((unsigned char)off));
483 1.1 chopps
484 1.1 chopps off >>= 8;
485 1.1 chopps
486 1.1 chopps WCrt(ba, CRT_ID_START_ADDR_HIGH, ((unsigned char)off));
487 1.1 chopps
488 1.1 chopps off >>= 8;
489 1.1 chopps
490 1.1 chopps WCrt(ba, CRT_ID_EXT_START_ADDR,
491 1.1 chopps ((RCrt(ba, CRT_ID_EXT_START_ADDR) & 0xf0) | (off & 0x0f)));
492 1.1 chopps
493 1.1 chopps
494 1.1 chopps }
495 1.1 chopps
496 1.1 chopps void
497 1.1 chopps RZ3SetHWCloc (gp, x, y)
498 1.1 chopps struct grf_softc *gp;
499 1.1 chopps unsigned short x, y;
500 1.1 chopps {
501 1.1 chopps volatile unsigned char *ba = gp->g_regkva;
502 1.1 chopps const struct MonDef *md = (struct MonDef *) gp->g_data;
503 1.1 chopps volatile unsigned char *acm = ba + ACM_OFFSET;
504 1.1 chopps
505 1.1 chopps if (x < xpan)
506 1.1 chopps RZ3SetPanning(gp, x, ypan);
507 1.1 chopps
508 1.1 chopps if (x >= (xpan+md->MW))
509 1.1 chopps RZ3SetPanning(gp, (1 + x - md->MW) , ypan);
510 1.1 chopps
511 1.1 chopps if (y < ypan)
512 1.1 chopps RZ3SetPanning(gp, xpan, y);
513 1.1 chopps
514 1.1 chopps if (y >= (ypan+md->MH))
515 1.1 chopps RZ3SetPanning(gp, xpan, (1 + y - md->MH));
516 1.1 chopps
517 1.1 chopps x -= xpan;
518 1.1 chopps y -= ypan;
519 1.1 chopps
520 1.1 chopps *(acm + (ACM_CURSOR_POSITION+0)) = x & 0xff;
521 1.1 chopps *(acm + (ACM_CURSOR_POSITION+1)) = x >> 8;
522 1.1 chopps *(acm + (ACM_CURSOR_POSITION+2)) = y & 0xff;
523 1.1 chopps *(acm + (ACM_CURSOR_POSITION+3)) = y >> 8;
524 1.1 chopps }
525 1.1 chopps
526 1.1 chopps u_short
527 1.1 chopps CompFQ(fq)
528 1.1 chopps u_int fq;
529 1.1 chopps {
530 1.1 chopps /* yuck... this sure could need some explanation.. */
531 1.1 chopps
532 1.1 chopps unsigned long f = fq;
533 1.1 chopps long n2 = 3;
534 1.1 chopps long abw = 0x7fffffff;
535 1.1 chopps long n1 = 3;
536 1.1 chopps unsigned long m;
537 1.1 chopps unsigned short erg = 0;
538 1.1 chopps
539 1.1 chopps f *= 8;
540 1.1 chopps
541 1.1 chopps do {
542 1.1 chopps
543 1.1 chopps if (f <= 250000000)
544 1.1 chopps break;
545 1.1 chopps f /= 2;
546 1.1 chopps
547 1.1 chopps } while (n2-- > 0);
548 1.1 chopps
549 1.1 chopps if (n2 < 0)
550 1.1 chopps return(0);
551 1.1 chopps
552 1.1 chopps
553 1.1 chopps do {
554 1.1 chopps long tmp;
555 1.1 chopps
556 1.1 chopps f = fq;
557 1.1 chopps f >>= 3;
558 1.1 chopps f <<= n2;
559 1.1 chopps f >>= 7;
560 1.1 chopps
561 1.1 chopps m = (f * n1) / (14318180/1024);
562 1.1 chopps
563 1.1 chopps if (m > 129)
564 1.1 chopps break;
565 1.1 chopps
566 1.1 chopps tmp = (((m * 14318180) >> n2) / n1) - fq;
567 1.1 chopps if (tmp < 0)
568 1.1 chopps tmp = -tmp;
569 1.1 chopps
570 1.1 chopps if (tmp < abw) {
571 1.1 chopps abw = tmp;
572 1.1 chopps erg = (((n2 << 5) | (n1-2)) << 8) | (m-2);
573 1.1 chopps }
574 1.1 chopps
575 1.1 chopps } while ( (++n1) <= 21);
576 1.1 chopps
577 1.1 chopps return(erg);
578 1.1 chopps }
579 1.1 chopps
580 1.1 chopps int
581 1.1 chopps rh_mondefok(mdp)
582 1.1 chopps struct MonDef *mdp;
583 1.1 chopps {
584 1.1 chopps switch(mdp->DEP) {
585 1.1 chopps case 8:
586 1.1 chopps case 16:
587 1.1 chopps return(1);
588 1.1 chopps case 4:
589 1.1 chopps if (mdp->FX == 4 || (mdp->FX >= 7 && mdp->FX <= 16))
590 1.2 chopps return(1);
591 1.1 chopps /*FALLTHROUGH*/
592 1.1 chopps default:
593 1.1 chopps return(0);
594 1.1 chopps }
595 1.1 chopps }
596 1.1 chopps
597 1.1 chopps
598 1.1 chopps int
599 1.1 chopps rh_load_mon(gp, md)
600 1.1 chopps struct grf_softc *gp;
601 1.1 chopps struct MonDef *md;
602 1.1 chopps {
603 1.1 chopps struct grfinfo *gi = &gp->g_display;
604 1.1 chopps volatile unsigned char *ba;
605 1.1 chopps volatile unsigned char *fb;
606 1.1 chopps short FW, clksel, HDE, VDE;
607 1.1 chopps unsigned short *c, z;
608 1.1 chopps const unsigned char *f;
609 1.1 chopps
610 1.1 chopps ba = gp->g_regkva;;
611 1.1 chopps fb = gp->g_fbkva;
612 1.1 chopps
613 1.1 chopps /* provide all needed information in grf device-independant
614 1.1 chopps * locations */
615 1.1 chopps gp->g_data = (caddr_t) md;
616 1.1 chopps gi->gd_regaddr = (caddr_t) kvtop (ba);
617 1.1 chopps gi->gd_regsize = LM_OFFSET;
618 1.1 chopps gi->gd_fbaddr = (caddr_t) kvtop (fb);
619 1.1 chopps gi->gd_fbsize = MEMSIZE *1024*1024;
620 1.1 chopps #ifdef BANKEDDEVPAGER
621 1.1 chopps /* we're not using banks NO MORE! */
622 1.1 chopps gi->gd_bank_size = 0;
623 1.1 chopps #endif
624 1.1 chopps gi->gd_colors = 1 << md->DEP;
625 1.1 chopps gi->gd_planes = md->DEP;
626 1.1 chopps
627 1.1 chopps if (md->DEP == 4) {
628 1.1 chopps gi->gd_fbwidth = md->MW;
629 1.1 chopps gi->gd_fbheight = md->MH;
630 1.1 chopps gi->gd_fbx = 0;
631 1.1 chopps gi->gd_fby = 0;
632 1.1 chopps gi->gd_dwidth = md->TX * md->FX;
633 1.1 chopps gi->gd_dheight = md->TY * md->FY;
634 1.1 chopps gi->gd_dx = 0;
635 1.1 chopps gi->gd_dy = 0;
636 1.1 chopps } else {
637 1.1 chopps gi->gd_fbwidth = md->TX;
638 1.1 chopps gi->gd_fbheight = md->TY;
639 1.1 chopps gi->gd_fbx = 0;
640 1.1 chopps gi->gd_fby = 0;
641 1.1 chopps gi->gd_dwidth = md->MW;
642 1.1 chopps gi->gd_dheight = md->MH;
643 1.1 chopps gi->gd_dx = 0;
644 1.1 chopps gi->gd_dy = 0;
645 1.1 chopps }
646 1.1 chopps
647 1.1 chopps FW =0;
648 1.1 chopps if (md->DEP == 4) { /* XXX some text-mode! */
649 1.1 chopps switch (md->FX) {
650 1.1 chopps case 4:
651 1.1 chopps FW = 0;
652 1.1 chopps break;
653 1.1 chopps case 7:
654 1.1 chopps FW = 1;
655 1.1 chopps break;
656 1.1 chopps case 8:
657 1.1 chopps FW = 2;
658 1.1 chopps break;
659 1.1 chopps case 9:
660 1.1 chopps FW = 3;
661 1.1 chopps break;
662 1.1 chopps case 10:
663 1.1 chopps FW = 4;
664 1.1 chopps break;
665 1.1 chopps case 11:
666 1.1 chopps FW = 5;
667 1.1 chopps break;
668 1.1 chopps case 12:
669 1.1 chopps FW = 6;
670 1.1 chopps break;
671 1.1 chopps case 13:
672 1.1 chopps FW = 7;
673 1.1 chopps break;
674 1.1 chopps case 14:
675 1.1 chopps FW = 8;
676 1.1 chopps break;
677 1.1 chopps case 15:
678 1.1 chopps FW = 9;
679 1.1 chopps break;
680 1.1 chopps case 16:
681 1.1 chopps FW = 11;
682 1.1 chopps break;
683 1.1 chopps default:
684 1.1 chopps return(0);
685 1.1 chopps break;
686 1.1 chopps }
687 1.1 chopps }
688 1.1 chopps
689 1.1 chopps if (md->DEP == 4)
690 1.1 chopps HDE = (md->MW+md->FX-1)/md->FX;
691 1.1 chopps else if (md->DEP == 8)
692 1.1 chopps HDE = (md->MW+3)/4;
693 1.1 chopps else if (md->DEP == 16)
694 1.1 chopps HDE = (md->MW*2+3)/4;
695 1.1 chopps
696 1.1 chopps VDE = md->MH-1;
697 1.1 chopps
698 1.1 chopps clksel = 0;
699 1.1 chopps
700 1.1 chopps vgaw(ba, GREG_MISC_OUTPUT_W, 0xe3 | ((clksel & 3) * 0x04));
701 1.1 chopps vgaw(ba, GREG_FEATURE_CONTROL_W, 0x00);
702 1.1 chopps
703 1.1 chopps WSeq(ba, SEQ_ID_RESET, 0x00);
704 1.1 chopps WSeq(ba, SEQ_ID_RESET, 0x03);
705 1.1 chopps WSeq(ba, SEQ_ID_CLOCKING_MODE, 0x01 | ((md->FLG & MDF_CLKDIV2)/ MDF_CLKDIV2 * 8));
706 1.1 chopps WSeq(ba, SEQ_ID_MAP_MASK, 0x0f);
707 1.1 chopps WSeq(ba, SEQ_ID_CHAR_MAP_SELECT, 0x00);
708 1.1 chopps WSeq(ba, SEQ_ID_MEMORY_MODE, 0x06);
709 1.1 chopps WSeq(ba, SEQ_ID_RESET, 0x01);
710 1.1 chopps WSeq(ba, SEQ_ID_RESET, 0x03);
711 1.1 chopps
712 1.1 chopps WSeq(ba, SEQ_ID_EXTENDED_ENABLE, 0x05);
713 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_CONTROL, 0x00);
714 1.1 chopps WSeq(ba, SEQ_ID_PRIM_HOST_OFF_HI, 0x00);
715 1.1 chopps WSeq(ba, SEQ_ID_PRIM_HOST_OFF_HI, 0x00);
716 1.1 chopps WSeq(ba, SEQ_ID_LINEAR_0, 0x4a);
717 1.1 chopps WSeq(ba, SEQ_ID_LINEAR_1, 0x00);
718 1.1 chopps
719 1.1 chopps WSeq(ba, SEQ_ID_SEC_HOST_OFF_HI, 0x00);
720 1.1 chopps WSeq(ba, SEQ_ID_SEC_HOST_OFF_LO, 0x00);
721 1.1 chopps WSeq(ba, SEQ_ID_EXTENDED_MEM_ENA, 0x3 | 0x4 | 0x10 | 0x40);
722 1.1 chopps WSeq(ba, SEQ_ID_EXT_CLOCK_MODE, 0x10 | (FW & 0x0f));
723 1.1 chopps WSeq(ba, SEQ_ID_EXT_VIDEO_ADDR, 0x03);
724 1.1 chopps if (md->DEP == 4) {
725 1.1 chopps /* 8bit pixel, no gfx byte path */
726 1.1 chopps WSeq(ba, SEQ_ID_EXT_PIXEL_CNTL, 0x00);
727 1.1 chopps } else if (md->DEP == 8) {
728 1.1 chopps /* 8bit pixel, gfx byte path */
729 1.1 chopps WSeq(ba, SEQ_ID_EXT_PIXEL_CNTL, 0x01);
730 1.1 chopps } else if (md->DEP == 16) {
731 1.1 chopps /* 16bit pixel, gfx byte path */
732 1.1 chopps WSeq(ba, SEQ_ID_EXT_PIXEL_CNTL, 0x11);
733 1.1 chopps }
734 1.1 chopps WSeq(ba, SEQ_ID_BUS_WIDTH_FEEDB, 0x04);
735 1.1 chopps WSeq(ba, SEQ_ID_COLOR_EXP_WFG, 0x01);
736 1.1 chopps WSeq(ba, SEQ_ID_COLOR_EXP_WBG, 0x00);
737 1.1 chopps WSeq(ba, SEQ_ID_EXT_RW_CONTROL, 0x00);
738 1.1 chopps WSeq(ba, SEQ_ID_MISC_FEATURE_SEL, (0x51 | (clksel & 8)));
739 1.1 chopps WSeq(ba, SEQ_ID_COLOR_KEY_CNTL, 0x40);
740 1.1 chopps WSeq(ba, SEQ_ID_COLOR_KEY_MATCH0, 0x00);
741 1.1 chopps WSeq(ba, SEQ_ID_COLOR_KEY_MATCH1, 0x00);
742 1.1 chopps WSeq(ba, SEQ_ID_COLOR_KEY_MATCH2, 0x00);
743 1.1 chopps WSeq(ba, SEQ_ID_CRC_CONTROL, 0x00);
744 1.1 chopps WSeq(ba, SEQ_ID_PERF_SELECT, 0x10);
745 1.1 chopps WSeq(ba, SEQ_ID_ACM_APERTURE_1, 0x00);
746 1.1 chopps WSeq(ba, SEQ_ID_ACM_APERTURE_2, 0x30);
747 1.1 chopps WSeq(ba, SEQ_ID_ACM_APERTURE_3, 0x00);
748 1.1 chopps WSeq(ba, SEQ_ID_MEMORY_MAP_CNTL, 0x07);
749 1.1 chopps
750 1.1 chopps WCrt(ba, CRT_ID_END_VER_RETR, (md->VSE & 0xf) | 0x20);
751 1.1 chopps WCrt(ba, CRT_ID_HOR_TOTAL, md->HT & 0xff);
752 1.1 chopps WCrt(ba, CRT_ID_HOR_DISP_ENA_END, (HDE-1) & 0xff);
753 1.1 chopps WCrt(ba, CRT_ID_START_HOR_BLANK, md->HBS & 0xff);
754 1.1 chopps WCrt(ba, CRT_ID_END_HOR_BLANK, (md->HBE & 0x1f) | 0x80);
755 1.1 chopps
756 1.1 chopps WCrt(ba, CRT_ID_START_HOR_RETR, md->HSS & 0xff);
757 1.1 chopps WCrt(ba, CRT_ID_END_HOR_RETR,
758 1.1 chopps (md->HSE & 0x1f) |
759 1.1 chopps ((md->HBE & 0x20)/ 0x20 * 0x80));
760 1.1 chopps WCrt(ba, CRT_ID_VER_TOTAL, (md->VT & 0xff));
761 1.1 chopps WCrt(ba, CRT_ID_OVERFLOW,
762 1.1 chopps ((md->VSS & 0x200) / 0x200 * 0x80) |
763 1.1 chopps ((VDE & 0x200) / 0x200 * 0x40) |
764 1.1 chopps ((md->VT & 0x200) / 0x200 * 0x20) |
765 1.1 chopps 0x10 |
766 1.1 chopps ((md->VBS & 0x100) / 0x100 * 8) |
767 1.1 chopps ((md->VSS & 0x100) / 0x100 * 4) |
768 1.1 chopps ((VDE & 0x100) / 0x100 * 2) |
769 1.1 chopps ((md->VT & 0x100) / 0x100));
770 1.1 chopps WCrt(ba, CRT_ID_PRESET_ROW_SCAN, 0x00);
771 1.1 chopps
772 1.1 chopps if (md->DEP == 4) {
773 1.1 chopps WCrt(ba, CRT_ID_MAX_SCAN_LINE,
774 1.1 chopps ((md->FLG & MDF_DBL)/ MDF_DBL * 0x80) |
775 1.1 chopps 0x40 |
776 1.1 chopps ((md->VBS & 0x200)/0x200*0x20) |
777 1.1 chopps ((md->FY-1) & 0x1f));
778 1.1 chopps } else {
779 1.1 chopps WCrt(ba, CRT_ID_MAX_SCAN_LINE,
780 1.1 chopps ((md->FLG & MDF_DBL)/ MDF_DBL * 0x80) |
781 1.1 chopps 0x40 |
782 1.1 chopps ((md->VBS & 0x200)/0x200*0x20) |
783 1.1 chopps (0 & 0x1f));
784 1.1 chopps }
785 1.1 chopps
786 1.1 chopps /* I prefer "_" cursor to "block" cursor.. */
787 1.1 chopps #if 1
788 1.1 chopps WCrt(ba, CRT_ID_CURSOR_START, (md->FY & 0x1f) - 2);
789 1.1 chopps WCrt(ba, CRT_ID_CURSOR_END, (md->FY & 0x1f) - 1);
790 1.1 chopps #else
791 1.1 chopps WCrt(ba, CRT_ID_CURSOR_START, 0x00);
792 1.1 chopps WCrt(ba, CRT_ID_CURSOR_END, md->FY & 0x1f);
793 1.1 chopps #endif
794 1.1 chopps
795 1.1 chopps WCrt(ba, CRT_ID_START_ADDR_HIGH, 0x00);
796 1.1 chopps WCrt(ba, CRT_ID_START_ADDR_LOW, 0x00);
797 1.1 chopps
798 1.1 chopps WCrt(ba, CRT_ID_CURSOR_LOC_HIGH, 0x00);
799 1.1 chopps WCrt(ba, CRT_ID_CURSOR_LOC_LOW, 0x00);
800 1.1 chopps
801 1.1 chopps WCrt(ba, CRT_ID_START_VER_RETR, md->VSS & 0xff);
802 1.1 chopps WCrt(ba, CRT_ID_END_VER_RETR, (md->VSE & 0xf) | 0x80 | 0x20);
803 1.1 chopps WCrt(ba, CRT_ID_VER_DISP_ENA_END, VDE & 0xff);
804 1.1 chopps
805 1.1 chopps if (md->DEP == 4)
806 1.1 chopps WCrt(ba, CRT_ID_OFFSET, (HDE / 2) & 0xff);
807 1.1 chopps else if (md->DEP == 8)
808 1.1 chopps WCrt(ba, CRT_ID_OFFSET, (md->TX / 8) & 0xff);
809 1.1 chopps else
810 1.1 chopps WCrt(ba, CRT_ID_OFFSET, (md->TX / 4) & 0xff);
811 1.1 chopps
812 1.1 chopps WCrt(ba, CRT_ID_UNDERLINE_LOC, (md->FY-1) & 0x1f);
813 1.1 chopps WCrt(ba, CRT_ID_START_VER_BLANK, md->VBS & 0xff);
814 1.1 chopps WCrt(ba, CRT_ID_END_VER_BLANK, md->VBE & 0xff);
815 1.1 chopps WCrt(ba, CRT_ID_MODE_CONTROL, 0xe3);
816 1.1 chopps WCrt(ba, CRT_ID_LINE_COMPARE, 0xff);
817 1.1 chopps
818 1.1 chopps WCrt(ba, CRT_ID_EXT_HOR_TIMING1,
819 1.1 chopps 0 | 0x20 |
820 1.1 chopps ((md->FLG & MDF_LACE) / MDF_LACE * 0x10) |
821 1.1 chopps ((md->HT & 0x100) / 0x100) |
822 1.1 chopps (((HDE-1) & 0x100) / 0x100 * 2) |
823 1.1 chopps ((md->HBS & 0x100) / 0x100 * 4) |
824 1.1 chopps ((md->HSS & 0x100) / 0x100 * 8));
825 1.1 chopps
826 1.1 chopps if (md->DEP == 4)
827 1.1 chopps WCrt(ba, CRT_ID_EXT_START_ADDR,
828 1.1 chopps (((HDE / 2) & 0x100)/0x100 * 16));
829 1.1 chopps else if (md->DEP == 8)
830 1.1 chopps WCrt(ba, CRT_ID_EXT_START_ADDR,
831 1.1 chopps (((md->TX / 8) & 0x100)/0x100 * 16));
832 1.1 chopps else
833 1.1 chopps WCrt(ba, CRT_ID_EXT_START_ADDR,
834 1.1 chopps (((md->TX / 4) & 0x100)/0x100 * 16));
835 1.1 chopps
836 1.1 chopps WCrt(ba, CRT_ID_EXT_HOR_TIMING2,
837 1.1 chopps ((md->HT & 0x200)/ 0x200) |
838 1.1 chopps (((HDE-1) & 0x200)/ 0x200 * 2 ) |
839 1.1 chopps ((md->HBS & 0x200)/ 0x200 * 4 ) |
840 1.1 chopps ((md->HSS & 0x200)/ 0x200 * 8 ) |
841 1.1 chopps ((md->HBE & 0xc0) / 0x40 * 16 ) |
842 1.1 chopps ((md->HSE & 0x60) / 0x20 * 64));
843 1.1 chopps
844 1.1 chopps WCrt(ba, CRT_ID_EXT_VER_TIMING,
845 1.1 chopps ((md->VSE & 0x10) / 0x10 * 0x80 ) |
846 1.1 chopps ((md->VBE & 0x300)/ 0x100 * 0x20 ) |
847 1.1 chopps 0x10 |
848 1.1 chopps ((md->VSS & 0x400)/ 0x400 * 8 ) |
849 1.1 chopps ((md->VBS & 0x400)/ 0x400 * 4 ) |
850 1.1 chopps ((VDE & 0x400)/ 0x400 * 2 ) |
851 1.1 chopps ((md->VT & 0x400)/ 0x400));
852 1.1 chopps WCrt(ba, CRT_ID_MONITOR_POWER, 0x00);
853 1.1 chopps
854 1.1 chopps {
855 1.1 chopps unsigned short tmp = CompFQ(md->FQ);
856 1.1 chopps WPLL(ba, 2 , tmp);
857 1.1 chopps tmp = CompFQ(MEMCLK);
858 1.1 chopps WPLL(ba,10 , tmp);
859 1.1 chopps WPLL(ba,14 , 0x22);
860 1.1 chopps }
861 1.1 chopps
862 1.1 chopps WGfx(ba, GCT_ID_SET_RESET, 0x00);
863 1.1 chopps WGfx(ba, GCT_ID_ENABLE_SET_RESET, 0x00);
864 1.1 chopps WGfx(ba, GCT_ID_COLOR_COMPARE, 0x00);
865 1.1 chopps WGfx(ba, GCT_ID_DATA_ROTATE, 0x00);
866 1.1 chopps WGfx(ba, GCT_ID_READ_MAP_SELECT, 0x00);
867 1.1 chopps WGfx(ba, GCT_ID_GRAPHICS_MODE, 0x00);
868 1.1 chopps if (md->DEP == 4)
869 1.1 chopps WGfx(ba, GCT_ID_MISC, 0x04);
870 1.1 chopps else
871 1.1 chopps WGfx(ba, GCT_ID_MISC, 0x05);
872 1.1 chopps WGfx(ba, GCT_ID_COLOR_XCARE, 0x0f);
873 1.1 chopps WGfx(ba, GCT_ID_BITMASK, 0xff);
874 1.1 chopps
875 1.1 chopps vgar(ba, ACT_ADDRESS_RESET);
876 1.1 chopps WAttr(ba, ACT_ID_PALETTE0 , 0x00);
877 1.1 chopps WAttr(ba, ACT_ID_PALETTE1 , 0x01);
878 1.1 chopps WAttr(ba, ACT_ID_PALETTE2 , 0x02);
879 1.1 chopps WAttr(ba, ACT_ID_PALETTE3 , 0x03);
880 1.1 chopps WAttr(ba, ACT_ID_PALETTE4 , 0x04);
881 1.1 chopps WAttr(ba, ACT_ID_PALETTE5 , 0x05);
882 1.1 chopps WAttr(ba, ACT_ID_PALETTE6 , 0x06);
883 1.1 chopps WAttr(ba, ACT_ID_PALETTE7 , 0x07);
884 1.1 chopps WAttr(ba, ACT_ID_PALETTE8 , 0x08);
885 1.1 chopps WAttr(ba, ACT_ID_PALETTE9 , 0x09);
886 1.1 chopps WAttr(ba, ACT_ID_PALETTE10, 0x0a);
887 1.1 chopps WAttr(ba, ACT_ID_PALETTE11, 0x0b);
888 1.1 chopps WAttr(ba, ACT_ID_PALETTE12, 0x0c);
889 1.1 chopps WAttr(ba, ACT_ID_PALETTE13, 0x0d);
890 1.1 chopps WAttr(ba, ACT_ID_PALETTE14, 0x0e);
891 1.1 chopps WAttr(ba, ACT_ID_PALETTE15, 0x0f);
892 1.1 chopps
893 1.1 chopps vgar(ba, ACT_ADDRESS_RESET);
894 1.1 chopps if (md->DEP == 4)
895 1.1 chopps WAttr(ba, ACT_ID_ATTR_MODE_CNTL, 0x08);
896 1.1 chopps else
897 1.1 chopps WAttr(ba, ACT_ID_ATTR_MODE_CNTL, 0x09);
898 1.1 chopps
899 1.1 chopps WAttr(ba, ACT_ID_OVERSCAN_COLOR, 0x00);
900 1.1 chopps WAttr(ba, ACT_ID_COLOR_PLANE_ENA, 0x0f);
901 1.1 chopps WAttr(ba, ACT_ID_HOR_PEL_PANNING, 0x00);
902 1.1 chopps WAttr(ba, ACT_ID_COLOR_SELECT, 0x00);
903 1.1 chopps
904 1.1 chopps vgar(ba, ACT_ADDRESS_RESET);
905 1.1 chopps vgaw(ba, ACT_ADDRESS_W, 0x20);
906 1.1 chopps
907 1.1 chopps vgaw(ba, VDAC_MASK, 0xff);
908 1.1 chopps if (md->DEP < 16)
909 1.1 chopps /* well... probably the PLL chip */
910 1.1 chopps vgaw(ba, 0x83c6, ((0 & 7) << 5));
911 1.1 chopps else if (md->DEP == 16)
912 1.1 chopps /* well... */
913 1.1 chopps vgaw(ba, 0x83c6, ((3 & 7) << 5));
914 1.1 chopps vgaw(ba, VDAC_ADDRESS_W, 0x00);
915 1.1 chopps
916 1.1 chopps if (md->DEP < 16) {
917 1.1 chopps short x = 256-17;
918 1.1 chopps unsigned char cl = 16;
919 1.1 chopps RZ3LoadPalette(gp, md->PAL, 0, 16);
920 1.1 chopps do {
921 1.1 chopps vgaw(ba, VDAC_DATA, (cl >> 2));
922 1.1 chopps vgaw(ba, VDAC_DATA, (cl >> 2));
923 1.1 chopps vgaw(ba, VDAC_DATA, (cl >> 2));
924 1.1 chopps cl++;
925 1.1 chopps } while (x-- > 0);
926 1.1 chopps }
927 1.1 chopps
928 1.1 chopps if (md->DEP == 4) {
929 1.1 chopps {
930 1.1 chopps struct grf_bitblt bb = {
931 1.1 chopps GRFBBOPset,
932 1.1 chopps 0, 0,
933 1.1 chopps 0, 0,
934 1.1 chopps md->TX*4, 2*md->TY,
935 1.1 chopps EMPTY_ALPHA
936 1.1 chopps };
937 1.1 chopps RZ3BitBlit(gp, &bb);
938 1.1 chopps }
939 1.1 chopps
940 1.1 chopps c = (unsigned short *)(ba + LM_OFFSET);
941 1.1 chopps c += 2 * md->FLo*32;
942 1.1 chopps c += 1;
943 1.1 chopps f = md->FData;
944 1.1 chopps for (z = md->FLo; z <= md->FHi; z++) {
945 1.1 chopps short y = md->FY-1;
946 1.1 chopps if (md->FX > 8){
947 1.1 chopps do {
948 1.1 chopps *c = *((const unsigned short *)f);
949 1.1 chopps c += 2;
950 1.1 chopps f += 2;
951 1.1 chopps } while (y-- > 0);
952 1.1 chopps } else {
953 1.1 chopps do {
954 1.1 chopps *c = (*f++) << 8;
955 1.1 chopps c += 2;
956 1.1 chopps } while (y-- > 0);
957 1.1 chopps }
958 1.1 chopps
959 1.1 chopps c += 2 * (32-md->FY);
960 1.1 chopps }
961 1.1 chopps {
962 1.1 chopps unsigned long * pt = (unsigned long *) (ba + LM_OFFSET + PAT_MEM_OFF);
963 1.1 chopps unsigned long tmp = 0xffff0000;
964 1.1 chopps *pt++ = tmp;
965 1.1 chopps *pt = tmp;
966 1.1 chopps }
967 1.1 chopps
968 1.1 chopps WSeq(ba, SEQ_ID_MAP_MASK, 3);
969 1.1 chopps
970 1.1 chopps c = (unsigned short *)(ba + LM_OFFSET);
971 1.1 chopps c += (md->TX-6)*2;
972 1.1 chopps {
973 1.1 chopps /* it's show-time :-) */
974 1.1 chopps static unsigned short init_msg[6] = {
975 1.1 chopps 0x520a, 0x450b, 0x540c, 0x490d, 0x4e0e, 0x410f
976 1.1 chopps };
977 1.1 chopps unsigned short * m = init_msg;
978 1.1 chopps short x = 5;
979 1.1 chopps do {
980 1.1 chopps *c = *m++;
981 1.1 chopps c += 2;
982 1.1 chopps } while (x-- > 0);
983 1.1 chopps }
984 1.1 chopps
985 1.1 chopps return(1);
986 1.1 chopps } else if (md->DEP == 8) {
987 1.1 chopps struct grf_bitblt bb = {
988 1.1 chopps GRFBBOPset,
989 1.1 chopps 0, 0,
990 1.1 chopps 0, 0,
991 1.1 chopps md->TX, md->TY,
992 1.1 chopps 0x0000
993 1.1 chopps };
994 1.1 chopps WSeq(ba, SEQ_ID_MAP_MASK, 0x0f);
995 1.1 chopps
996 1.1 chopps RZ3BitBlit(gp, &bb);
997 1.1 chopps
998 1.1 chopps xpan = 0;
999 1.1 chopps ypan = 0;
1000 1.1 chopps
1001 1.1 chopps return(1);
1002 1.1 chopps } else if (md->DEP == 16) {
1003 1.1 chopps struct grf_bitblt bb = {
1004 1.1 chopps GRFBBOPset,
1005 1.1 chopps 0, 0,
1006 1.1 chopps 0, 0,
1007 1.1 chopps md->TX, md->TY,
1008 1.1 chopps 0x0000
1009 1.1 chopps };
1010 1.1 chopps WSeq(ba, SEQ_ID_MAP_MASK, 0x0f);
1011 1.1 chopps
1012 1.1 chopps RZ3BitBlit16(gp, &bb);
1013 1.1 chopps
1014 1.1 chopps xpan = 0;
1015 1.1 chopps ypan = 0;
1016 1.1 chopps
1017 1.1 chopps return(1);
1018 1.1 chopps } else
1019 1.1 chopps return(0);
1020 1.1 chopps }
1021 1.1 chopps
1022 1.1 chopps /* standard-palette definition */
1023 1.1 chopps
1024 1.1 chopps unsigned char RZ3StdPalette[16*3] = {
1025 1.1 chopps /* R G B */
1026 1.1 chopps 0, 0, 0,
1027 1.1 chopps 192,192,192,
1028 1.1 chopps 128, 0, 0,
1029 1.1 chopps 0,128, 0,
1030 1.1 chopps 0, 0,128,
1031 1.1 chopps 128,128, 0,
1032 1.1 chopps 0,128,128,
1033 1.1 chopps 128, 0,128,
1034 1.1 chopps 64, 64, 64, /* the higher 8 colors have more intensity for */
1035 1.1 chopps 255,255,255, /* compatibility with standard attributes */
1036 1.1 chopps 255, 0, 0,
1037 1.1 chopps 0,255, 0,
1038 1.1 chopps 0, 0,255,
1039 1.1 chopps 255,255, 0,
1040 1.1 chopps 0,255,255,
1041 1.1 chopps 255, 0,255
1042 1.1 chopps };
1043 1.1 chopps
1044 1.1 chopps /*
1045 1.1 chopps * The following structures are examples for monitor-definitions. To make one
1046 1.1 chopps * of your own, first use "DefineMonitor" and create the 8-bit or 16-bit
1047 1.1 chopps * monitor-mode of your dreams. Then save it, and make a structure from the
1048 1.1 chopps * values provided in the file DefineMonitor stored - the labels in the comment
1049 1.1 chopps * above the structure definition show where to put what value.
1050 1.1 chopps *
1051 1.1 chopps * If you want to use your definition for the text-mode, you'll need to adapt
1052 1.1 chopps * your 8-bit monitor-definition to the font you want to use. Be FX the width of
1053 1.1 chopps * the font, then the following modifications have to be applied to your values:
1054 1.1 chopps *
1055 1.1 chopps * HBS = (HBS * 4) / FX
1056 1.1 chopps * HSS = (HSS * 4) / FX
1057 1.1 chopps * HSE = (HSE * 4) / FX
1058 1.1 chopps * HBE = (HBE * 4) / FX
1059 1.1 chopps * HT = (HT * 4) / FX
1060 1.1 chopps *
1061 1.1 chopps * Make sure your maximum width (MW) and height (MH) are even multiples of
1062 1.1 chopps * the fonts' width and height.
1063 1.1 chopps *
1064 1.1 chopps * You may use definitons created by the old DefineMonitor, but you'll get
1065 1.1 chopps * better results with the new DefineMonitor supplied along with the Retin Z3.
1066 1.1 chopps */
1067 1.1 chopps
1068 1.1 chopps /*
1069 1.1 chopps * FQ FLG MW MH HBS HSS HSE HBE HT VBS VSS VSE VBE VT
1070 1.1 chopps * Depth, PAL, TX, TY, XY,FontX, FontY, FontData, FLo, Fhi
1071 1.1 chopps */
1072 1.1 chopps static struct MonDef monitor_defs[] = {
1073 1.1 chopps /* Text-mode definitions */
1074 1.1 chopps
1075 1.1 chopps /* horizontal 31.5 kHz */
1076 1.2 chopps #ifdef KFONT_8X11
1077 1.2 chopps { 50000000, 28, 640, 506, 81, 86, 93, 98, 95, 513, 513, 521, 535, 535,
1078 1.2 chopps 4, RZ3StdPalette, 80, 46, 3680, 8, 11, kernel_font_8x11, 32, 255},
1079 1.2 chopps #else
1080 1.1 chopps { 50000000, 28, 640, 512, 81, 86, 93, 98, 95, 513, 513, 521, 535, 535,
1081 1.1 chopps 4, RZ3StdPalette, 80, 64, 5120, 8, 8, kernel_font_8x8, 32, 255},
1082 1.1 chopps #endif
1083 1.1 chopps
1084 1.1 chopps /* horizontal 38kHz */
1085 1.2 chopps #ifdef KFONT_8X11
1086 1.2 chopps { 75000000, 28, 768, 594, 97, 99,107,120,117, 601, 615, 625, 638, 638,
1087 1.2 chopps 4, RZ3StdPalette, 96, 54, 5184, 8, 11, kernel_font_8x11, 32, 255},
1088 1.2 chopps #else
1089 1.1 chopps { 75000000, 28, 768, 600, 97, 99,107,120,117, 601, 615, 625, 638, 638,
1090 1.1 chopps 4, RZ3StdPalette, 96, 75, 7200, 8, 8, kernel_font_8x8, 32, 255},
1091 1.2 chopps #endif
1092 1.1 chopps
1093 1.1 chopps /* horizontal 64kHz */
1094 1.2 chopps #ifdef KFONT_8X11
1095 1.2 chopps { 50000000, 24, 768, 594, 97,104,112,122,119, 601, 606, 616, 628, 628,
1096 1.2 chopps 4, RZ3StdPalette, 96, 54, 5184, 8, 8, kernel_font_8x8, 32, 255},
1097 1.2 chopps #else
1098 1.1 chopps { 50000000, 24, 768, 600, 97,104,112,122,119, 601, 606, 616, 628, 628,
1099 1.1 chopps 4, RZ3StdPalette, 96, 75, 7200, 8, 8, kernel_font_8x8, 32, 255},
1100 1.2 chopps #endif
1101 1.1 chopps
1102 1.1 chopps /* 8-bit gfx-mode definitions */
1103 1.1 chopps
1104 1.1 chopps /*
1105 1.1 chopps * IMPORTANT: the "logical" screen size can be up to 2048x2048 pixels,
1106 1.1 chopps * independent from the "physical" screen size. If your code does NOT
1107 1.1 chopps * support panning, please adjust the "logical" screen sizes below to
1108 1.1 chopps * match the physical ones
1109 1.1 chopps */
1110 1.1 chopps
1111 1.1 chopps /* 640 x 480, 8 Bit, 31862 Hz, 63 Hz */
1112 1.1 chopps { 26000000, 0, 640, 480, 161,175,188,200,199, 481, 483, 491, 502, 502,
1113 1.1 chopps 8, RZ3StdPalette,1280,1024, 5120, 8, 8, kernel_font_8x8, 32, 255},
1114 1.1 chopps /* This is the logical ^ ^ screen size */
1115 1.1 chopps
1116 1.1 chopps /* 640 x 480, 8 Bit, 38366 Hz, 76 Hz */
1117 1.1 chopps { 31000000, 0, 640, 480, 161,169,182,198,197, 481, 482, 490, 502, 502,
1118 1.1 chopps 8, RZ3StdPalette,1280,1024, 5120, 8, 8, kernel_font_8x8, 32, 255},
1119 1.1 chopps
1120 1.1 chopps /* 800 x 600, 8 Bit, 31620 Hz, 50 Hz (1950) */
1121 1.1 chopps { 32000000, 0, 800, 600, 201,202,218,249,248, 601, 602, 612, 628, 628,
1122 1.1 chopps 8, RZ3StdPalette,1280,1024, 5120, 8, 8, kernel_font_8x8, 32, 255},
1123 1.1 chopps /* 800 x 600, 8 Bit, 38537 Hz, 61 Hz */
1124 1.1 chopps { 39000000, 0, 800, 600, 201,211,227,249,248, 601, 603, 613, 628, 628,
1125 1.1 chopps 8, RZ3StdPalette,1280,1024, 5120, 8, 8, kernel_font_8x8, 32, 255},
1126 1.1 chopps
1127 1.1 chopps /* 1024 x 768, 8 Bit, 63862 Hz, 79 Hz */
1128 1.1 chopps { 82000000, 0, 1024, 768, 257,257,277,317,316, 769, 771, 784, 804, 804,
1129 1.1 chopps 8, RZ3StdPalette,1280,1024, 5120, 8, 8, kernel_font_8x8, 32, 255},
1130 1.1 chopps
1131 1.1 chopps /* 1120 x 896, 8 Bit, 64000 Hz, 69 Hz */
1132 1.1 chopps { 97000000, 0, 1120, 896, 281,283,306,369,368, 897, 898, 913, 938, 938,
1133 1.1 chopps 8, RZ3StdPalette,1280,1024, 5120, 8, 8, kernel_font_8x8, 32, 255},
1134 1.1 chopps
1135 1.1 chopps /* 1152 x 910, 8 Bit, 76177 Hz, 79 Hz */
1136 1.1 chopps {110000000, 0, 1152, 910, 289,310,333,357,356, 911, 923, 938, 953, 953,
1137 1.1 chopps 8, RZ3StdPalette,1280,1024, 5120, 8, 8, kernel_font_8x8, 32, 255},
1138 1.1 chopps
1139 1.1 chopps /* 1184 x 848, 8 Bit, 73529 Hz, 82 Hz */
1140 1.1 chopps {110000000, 0, 1184, 848, 297,319,342,370,369, 849, 852, 866, 888, 888,
1141 1.1 chopps 8, RZ3StdPalette,1280,1024, 5120, 8, 8, kernel_font_8x8, 32, 255},
1142 1.1 chopps
1143 1.1 chopps /* 1280 x 1024, 8 Bit, 64516 Hz, 60 Hz */
1144 1.1 chopps {104000000, 0, 1280,1024, 321,323,348,399,398,1025,1026,1043,1073,1073,
1145 1.1 chopps 8, RZ3StdPalette,1280,1024, 5120, 8, 8, kernel_font_8x8, 32, 255},
1146 1.1 chopps
1147 1.1 chopps /* WARNING: THE FOLLOWING MONITOR MODE EXCEEDS THE 110-MHz LIMIT THE PROCESSOR
1148 1.1 chopps HAS BEEN SPECIFIED FOR. USE AT YOUR OWN RISK (AND THINK ABOUT
1149 1.1 chopps MOUNTING SOME COOLING DEVICE AT THE PROCESSOR AND RAMDAC)! */
1150 1.1 chopps /* 1280 x 1024, 8 Bit, 75436 Hz, 70 Hz */
1151 1.1 chopps {121000000, 0, 1280,1024, 321,322,347,397,396,1025,1026,1043,1073,1073,
1152 1.1 chopps 8, RZ3StdPalette,1280,1024, 5120, 8, 8, kernel_font_8x8, 32, 255},
1153 1.1 chopps
1154 1.1 chopps
1155 1.1 chopps /* 16-bit gfx-mode definitions */
1156 1.1 chopps
1157 1.1 chopps /* 640 x 480, 16 Bit, 31795 Hz, 63 Hz */
1158 1.1 chopps { 51000000, 0, 640, 480, 321,344,369,397,396, 481, 482, 490, 502, 502,
1159 1.1 chopps 16, 0,1280, 1024, 7200, 8, 8, kernel_font_8x8, 32, 255},
1160 1.1 chopps
1161 1.1 chopps /* 800 x 600, 16 Bit, 38500 Hz, 61 Hz */
1162 1.1 chopps { 77000000, 0, 800, 600, 401,418,449,496,495, 601, 602, 612, 628, 628,
1163 1.1 chopps 16, 0,1280, 1024, 7200, 8, 8, kernel_font_8x8, 32, 255},
1164 1.1 chopps
1165 1.1 chopps /* 1024 x 768, 16 Bit, 42768 Hz, 53 Hz */
1166 1.1 chopps {110000000, 0, 1024, 768, 513,514,554,639,638, 769, 770, 783, 804, 804,
1167 1.1 chopps 16, 0,1280, 1024, 7200, 8, 8, kernel_font_8x8, 32, 255},
1168 1.1 chopps
1169 1.1 chopps /* 864 x 648, 16 Bit, 50369 Hz, 74 Hz */
1170 1.1 chopps {109000000, 0, 864, 648, 433,434,468,537,536, 649, 650, 661, 678, 678,
1171 1.1 chopps 16, 0,1280, 1024, 7200, 8, 8, kernel_font_8x8, 32, 255},
1172 1.1 chopps
1173 1.1 chopps /*
1174 1.1 chopps * WARNING: THE FOLLOWING MONITOR MODE EXCEEDS THE 110-MHz LIMIT THE PROCESSOR
1175 1.1 chopps * HAS BEEN SPECIFIED FOR. USE AT YOUR OWN RISK (AND THINK ABOUT
1176 1.1 chopps * MOUNTING SOME COOLING DEVICE AT THE PROCESSOR AND RAMDAC)!
1177 1.1 chopps */
1178 1.1 chopps /* 1024 x 768, 16 Bit, 48437 Hz, 60 Hz */
1179 1.1 chopps {124000000, 0, 1024, 768, 513,537,577,636,635, 769, 770, 783, 804, 804,
1180 1.1 chopps 16, 0,1280, 1024, 7200, 8, 8, kernel_font_8x8, 32, 255},
1181 1.1 chopps };
1182 1.1 chopps
1183 1.1 chopps static const char *monitor_descr[] = {
1184 1.2 chopps #ifdef KFONT_8X11
1185 1.2 chopps "80x46 (640x506) 31.5kHz",
1186 1.2 chopps "96x54 (768x594) 38kHz",
1187 1.2 chopps "96x54 (768x594) 64kHz",
1188 1.2 chopps #else
1189 1.1 chopps "80x64 (640x512) 31.5kHz",
1190 1.1 chopps "96x75 (768x600) 38kHz",
1191 1.1 chopps "96x75 (768x600) 64kHz",
1192 1.2 chopps #endif
1193 1.1 chopps
1194 1.1 chopps "GFX-8 (640x480) 31.5kHz",
1195 1.1 chopps "GFX-8 (640x480) 38kHz",
1196 1.1 chopps "GFX-8 (800x600) 31.6kHz",
1197 1.1 chopps "GFX-8 (800x600) 38.5kHz",
1198 1.1 chopps "GFX-8 (1024x768) 64kHz",
1199 1.1 chopps "GFX-8 (1120x896) 64kHz",
1200 1.1 chopps "GFX-8 (1152x910) 76kHz",
1201 1.1 chopps "GFX-8 (1182x848) 73kHz",
1202 1.1 chopps "GFX-8 (1280x1024) 64.5kHz",
1203 1.1 chopps "GFX-8 (1280x1024) 75.5kHz ***EXCEEDS CHIP LIMIT!!!***",
1204 1.1 chopps
1205 1.1 chopps "GFX-16 (640x480) 31.8kHz",
1206 1.1 chopps "GFX-16 (800x600) 38.5kHz",
1207 1.1 chopps "GFX-16 (1024x768) 42.8kHz",
1208 1.1 chopps "GFX-16 (864x648) 50kHz",
1209 1.1 chopps "GFX-16 (1024x768) 48.5kHz ***EXCEEDS CHIP LIMIT!!!***",
1210 1.1 chopps };
1211 1.1 chopps
1212 1.1 chopps int rh_mon_max = sizeof (monitor_defs)/sizeof (monitor_defs[0]);
1213 1.1 chopps
1214 1.1 chopps /* patchable */
1215 1.1 chopps int rh_default_mon = 0;
1216 1.1 chopps int rh_default_gfx = 4;
1217 1.1 chopps
1218 1.1 chopps static struct MonDef *current_mon;
1219 1.1 chopps
1220 1.1 chopps int rh_mode __P((struct grf_softc *, int, void *, int, int));
1221 1.1 chopps void grfrhattach __P((struct device *, struct device *, void *));
1222 1.1 chopps int grfrhprint __P((void *, char *));
1223 1.1 chopps int grfrhmatch __P((struct device *, struct cfdata *, void *));
1224 1.1 chopps
1225 1.1 chopps struct cfdriver grfrhcd = {
1226 1.1 chopps NULL, "grfrh", grfrhmatch, grfrhattach,
1227 1.1 chopps DV_DULL, sizeof(struct grf_softc), NULL, 0
1228 1.1 chopps };
1229 1.1 chopps
1230 1.1 chopps static struct cfdata *cfdata;
1231 1.1 chopps
1232 1.1 chopps int
1233 1.1 chopps grfrhmatch(pdp, cfp, auxp)
1234 1.1 chopps struct device *pdp;
1235 1.1 chopps struct cfdata *cfp;
1236 1.1 chopps void *auxp;
1237 1.1 chopps {
1238 1.1 chopps #ifdef RETINACONSOLE
1239 1.1 chopps static int rhconunit = -1;
1240 1.1 chopps #endif
1241 1.1 chopps struct zthreebus_args *zap;
1242 1.1 chopps
1243 1.1 chopps zap = auxp;
1244 1.1 chopps
1245 1.1 chopps if (amiga_realconfig == 0)
1246 1.1 chopps #ifdef RETINACONSOLE
1247 1.1 chopps if (rhconunit != -1)
1248 1.1 chopps #endif
1249 1.1 chopps return(0);
1250 1.1 chopps if (zap->manid != 18260 || zap->prodid != 16)
1251 1.1 chopps return(0);
1252 1.1 chopps #ifdef RETINACONSOLE
1253 1.1 chopps if (amiga_realconfig == 0 || rhconunit != cfp->cf_unit) {
1254 1.1 chopps #endif
1255 1.1 chopps if ((unsigned)rh_default_mon >= rh_mon_max ||
1256 1.1 chopps monitor_defs[rh_default_mon].DEP == 8)
1257 1.1 chopps rh_default_mon = 0;
1258 1.1 chopps current_mon = monitor_defs + rh_default_mon;
1259 1.1 chopps if (rh_mondefok(current_mon) == 0)
1260 1.1 chopps return(0);
1261 1.1 chopps #ifdef RETINACONSOLE
1262 1.1 chopps if (amiga_realconfig == 0) {
1263 1.1 chopps rhconunit = cfp->cf_unit;
1264 1.1 chopps cfdata = cfp;
1265 1.1 chopps }
1266 1.1 chopps }
1267 1.1 chopps #endif
1268 1.1 chopps return(1);
1269 1.1 chopps }
1270 1.1 chopps
1271 1.1 chopps void
1272 1.1 chopps grfrhattach(pdp, dp, auxp)
1273 1.1 chopps struct device *pdp, *dp;
1274 1.1 chopps void *auxp;
1275 1.1 chopps {
1276 1.1 chopps static struct grf_softc congrf;
1277 1.1 chopps static int coninited;
1278 1.1 chopps struct zthreebus_args *zap;
1279 1.1 chopps struct grf_softc *gp;
1280 1.1 chopps
1281 1.1 chopps zap = auxp;
1282 1.1 chopps
1283 1.1 chopps if (dp == NULL)
1284 1.1 chopps gp = &congrf;
1285 1.1 chopps else
1286 1.1 chopps gp = (struct grf_softc *)dp;
1287 1.1 chopps if (dp != NULL && congrf.g_regkva != 0) {
1288 1.1 chopps /*
1289 1.1 chopps * inited earlier, just copy (not device struct)
1290 1.1 chopps */
1291 1.1 chopps bcopy(&congrf.g_display, &gp->g_display,
1292 1.1 chopps (char *)&gp[1] - (char *)&gp->g_display);
1293 1.1 chopps } else {
1294 1.1 chopps gp->g_regkva = (volatile caddr_t)zap->va;
1295 1.1 chopps gp->g_fbkva = (volatile caddr_t)zap->va + LM_OFFSET;
1296 1.1 chopps gp->g_unit = GRF_RETINAIII_UNIT;
1297 1.1 chopps gp->g_mode = rh_mode;
1298 1.1 chopps gp->g_conpri = grfrh_cnprobe();
1299 1.1 chopps gp->g_flags = GF_ALIVE;
1300 1.1 chopps grfrh_iteinit(gp);
1301 1.1 chopps (void)rh_load_mon(gp, current_mon);
1302 1.1 chopps }
1303 1.1 chopps if (dp != NULL)
1304 1.1 chopps printf("\n");
1305 1.1 chopps /*
1306 1.1 chopps * attach grf
1307 1.1 chopps */
1308 1.1 chopps amiga_config_found(cfdata, &gp->g_device, gp, grfrhprint);
1309 1.1 chopps }
1310 1.1 chopps
1311 1.1 chopps int
1312 1.1 chopps grfrhprint(auxp, pnp)
1313 1.1 chopps void *auxp;
1314 1.1 chopps char *pnp;
1315 1.1 chopps {
1316 1.1 chopps if (pnp)
1317 1.1 chopps printf("ite at %s", pnp);
1318 1.1 chopps return(UNCONF);
1319 1.1 chopps }
1320 1.1 chopps
1321 1.1 chopps int
1322 1.1 chopps rh_getvmode(gp, vm)
1323 1.1 chopps struct grf_softc *gp;
1324 1.1 chopps struct grfvideo_mode *vm;
1325 1.1 chopps {
1326 1.1 chopps struct MonDef *md;
1327 1.1 chopps
1328 1.1 chopps if (vm->mode_num && vm->mode_num > rh_mon_max)
1329 1.1 chopps return(EINVAL);
1330 1.1 chopps
1331 1.1 chopps if (! vm->mode_num)
1332 1.1 chopps vm->mode_num = (current_mon - monitor_defs) + 1;
1333 1.1 chopps
1334 1.1 chopps md = monitor_defs + (vm->mode_num - 1);
1335 1.1 chopps strncpy (vm->mode_descr, monitor_descr + (vm->mode_num - 1),
1336 1.1 chopps sizeof (vm->mode_descr));
1337 1.1 chopps vm->pixel_clock = md->FQ;
1338 1.1 chopps vm->disp_width = md->MW;
1339 1.1 chopps vm->disp_height = md->MH;
1340 1.1 chopps vm->depth = md->DEP;
1341 1.1 chopps vm->hblank_start = md->HBS;
1342 1.1 chopps vm->hblank_stop = md->HBE;
1343 1.1 chopps vm->hsync_start = md->HSS;
1344 1.1 chopps vm->hsync_stop = md->HSE;
1345 1.1 chopps vm->htotal = md->HT;
1346 1.1 chopps vm->vblank_start = md->VBS;
1347 1.1 chopps vm->vblank_stop = md->VBE;
1348 1.1 chopps vm->vsync_start = md->VSS;
1349 1.1 chopps vm->vsync_stop = md->VSE;
1350 1.1 chopps vm->vtotal = md->VT;
1351 1.1 chopps
1352 1.1 chopps return(0);
1353 1.1 chopps }
1354 1.1 chopps
1355 1.1 chopps
1356 1.1 chopps int
1357 1.1 chopps rh_setvmode(gp, mode, txtonly)
1358 1.1 chopps struct grf_softc *gp;
1359 1.1 chopps unsigned mode;
1360 1.1 chopps int txtonly;
1361 1.1 chopps {
1362 1.1 chopps struct MonDef *md;
1363 1.1 chopps int error;
1364 1.1 chopps
1365 1.1 chopps if (!mode || mode > rh_mon_max)
1366 1.1 chopps return(EINVAL);
1367 1.1 chopps
1368 1.1 chopps if (txtonly && monitor_defs[mode-1].DEP != 4)
1369 1.1 chopps return(EINVAL);
1370 1.1 chopps
1371 1.1 chopps current_mon = monitor_defs + (mode - 1);
1372 1.1 chopps
1373 1.1 chopps error = rh_load_mon (gp, current_mon) ? 0 : EINVAL;
1374 1.1 chopps
1375 1.1 chopps return(error);
1376 1.1 chopps }
1377 1.1 chopps
1378 1.1 chopps
1379 1.1 chopps /*
1380 1.1 chopps * Change the mode of the display.
1381 1.1 chopps * Return a UNIX error number or 0 for success.
1382 1.1 chopps */
1383 1.1 chopps rh_mode(gp, cmd, arg, a2, a3)
1384 1.1 chopps register struct grf_softc *gp;
1385 1.1 chopps int cmd;
1386 1.1 chopps void *arg;
1387 1.1 chopps int a2, a3;
1388 1.1 chopps {
1389 1.1 chopps /* implement these later... */
1390 1.1 chopps
1391 1.1 chopps switch (cmd) {
1392 1.1 chopps case GM_GRFON:
1393 1.1 chopps rh_setvmode (gp, rh_default_gfx + 1, 0);
1394 1.1 chopps return(0);
1395 1.1 chopps
1396 1.1 chopps case GM_GRFOFF:
1397 1.1 chopps rh_setvmode (gp, rh_default_mon + 1, 0);
1398 1.1 chopps return(0);
1399 1.1 chopps
1400 1.1 chopps case GM_GRFCONFIG:
1401 1.1 chopps return(0);
1402 1.1 chopps
1403 1.1 chopps case GM_GRFGETVMODE:
1404 1.1 chopps return(rh_getvmode (gp, (struct grfvideo_mode *) arg));
1405 1.1 chopps
1406 1.1 chopps case GM_GRFSETVMODE:
1407 1.1 chopps return(rh_setvmode (gp, *(unsigned *) arg, 1));
1408 1.1 chopps
1409 1.1 chopps case GM_GRFGETNUMVM:
1410 1.1 chopps *(int *)arg = rh_mon_max;
1411 1.1 chopps return(0);
1412 1.1 chopps
1413 1.1 chopps #ifdef BANKEDDEVPAGER
1414 1.1 chopps case GM_GRFGETBANK:
1415 1.1 chopps case GM_GRFGETCURBANK:
1416 1.1 chopps case GM_GRFSETBANK:
1417 1.1 chopps return(EINVAL);
1418 1.1 chopps #endif
1419 1.1 chopps case GM_GRFIOCTL:
1420 1.1 chopps return(rh_ioctl (gp, (int) arg, (caddr_t) a2));
1421 1.1 chopps
1422 1.1 chopps default:
1423 1.1 chopps break;
1424 1.1 chopps }
1425 1.1 chopps
1426 1.1 chopps return(EINVAL);
1427 1.1 chopps }
1428 1.1 chopps
1429 1.1 chopps int
1430 1.1 chopps rh_ioctl (gp, cmd, data)
1431 1.1 chopps register struct grf_softc *gp;
1432 1.1 chopps int cmd;
1433 1.1 chopps void *data;
1434 1.1 chopps {
1435 1.1 chopps switch (cmd) {
1436 1.1 chopps case GRFIOCGSPRITEPOS:
1437 1.1 chopps return(rh_getspritepos (gp, (struct grf_position *) data));
1438 1.1 chopps
1439 1.1 chopps case GRFIOCSSPRITEPOS:
1440 1.1 chopps return(rh_setspritepos (gp, (struct grf_position *) data));
1441 1.1 chopps
1442 1.1 chopps case GRFIOCSSPRITEINF:
1443 1.1 chopps return(rh_setspriteinfo (gp, (struct grf_spriteinfo *) data));
1444 1.1 chopps
1445 1.1 chopps case GRFIOCGSPRITEINF:
1446 1.1 chopps return(rh_getspriteinfo (gp, (struct grf_spriteinfo *) data));
1447 1.1 chopps
1448 1.1 chopps case GRFIOCGSPRITEMAX:
1449 1.1 chopps return(rh_getspritemax (gp, (struct grf_position *) data));
1450 1.1 chopps
1451 1.1 chopps case GRFIOCGETCMAP:
1452 1.1 chopps return(rh_getcmap (gp, (struct grf_colormap *) data));
1453 1.1 chopps
1454 1.1 chopps case GRFIOCPUTCMAP:
1455 1.1 chopps return(rh_putcmap (gp, (struct grf_colormap *) data));
1456 1.1 chopps
1457 1.1 chopps case GRFIOCBITBLT:
1458 1.1 chopps return(rh_bitblt (gp, (struct grf_bitblt *) data));
1459 1.1 chopps }
1460 1.1 chopps
1461 1.1 chopps return(EINVAL);
1462 1.1 chopps }
1463 1.1 chopps
1464 1.1 chopps
1465 1.1 chopps int
1466 1.1 chopps rh_getcmap (gfp, cmap)
1467 1.1 chopps struct grf_softc *gfp;
1468 1.1 chopps struct grf_colormap *cmap;
1469 1.1 chopps {
1470 1.1 chopps volatile unsigned char *ba;
1471 1.1 chopps u_char red[256], green[256], blue[256], *rp, *gp, *bp;
1472 1.1 chopps short x;
1473 1.1 chopps int error;
1474 1.1 chopps
1475 1.1 chopps if (cmap->count == 0 || cmap->index >= 256)
1476 1.1 chopps return 0;
1477 1.1 chopps
1478 1.1 chopps if (cmap->index + cmap->count > 256)
1479 1.1 chopps cmap->count = 256 - cmap->index;
1480 1.1 chopps
1481 1.1 chopps ba = gfp->g_regkva;
1482 1.1 chopps /* first read colors out of the chip, then copyout to userspace */
1483 1.1 chopps vgaw (ba, VDAC_ADDRESS_W, cmap->index);
1484 1.1 chopps x = cmap->count - 1;
1485 1.1 chopps rp = red + cmap->index;
1486 1.1 chopps gp = green + cmap->index;
1487 1.1 chopps bp = blue + cmap->index;
1488 1.1 chopps do {
1489 1.1 chopps *rp++ = vgar (ba, VDAC_DATA) << 2;
1490 1.1 chopps *gp++ = vgar (ba, VDAC_DATA) << 2;
1491 1.1 chopps *bp++ = vgar (ba, VDAC_DATA) << 2;
1492 1.1 chopps } while (x-- > 0);
1493 1.1 chopps
1494 1.1 chopps if (!(error = copyout (red + cmap->index, cmap->red, cmap->count))
1495 1.1 chopps && !(error = copyout (green + cmap->index, cmap->green, cmap->count))
1496 1.1 chopps && !(error = copyout (blue + cmap->index, cmap->blue, cmap->count)))
1497 1.1 chopps return(0);
1498 1.1 chopps
1499 1.1 chopps return(error);
1500 1.1 chopps }
1501 1.1 chopps
1502 1.1 chopps int
1503 1.1 chopps rh_putcmap (gfp, cmap)
1504 1.1 chopps struct grf_softc *gfp;
1505 1.1 chopps struct grf_colormap *cmap;
1506 1.1 chopps {
1507 1.1 chopps volatile unsigned char *ba;
1508 1.1 chopps u_char red[256], green[256], blue[256], *rp, *gp, *bp;
1509 1.1 chopps short x;
1510 1.1 chopps int error;
1511 1.1 chopps
1512 1.1 chopps if (cmap->count == 0 || cmap->index >= 256)
1513 1.1 chopps return(0);
1514 1.1 chopps
1515 1.1 chopps if (cmap->index + cmap->count > 256)
1516 1.1 chopps cmap->count = 256 - cmap->index;
1517 1.1 chopps
1518 1.1 chopps /* first copy the colors into kernelspace */
1519 1.1 chopps if (!(error = copyin (cmap->red, red + cmap->index, cmap->count))
1520 1.1 chopps && !(error = copyin (cmap->green, green + cmap->index, cmap->count))
1521 1.1 chopps && !(error = copyin (cmap->blue, blue + cmap->index, cmap->count))) {
1522 1.1 chopps /* argl.. LoadPalette wants a different format, so do it like with
1523 1.1 chopps * Retina2.. */
1524 1.1 chopps ba = gfp->g_regkva;
1525 1.1 chopps vgaw (ba, VDAC_ADDRESS_W, cmap->index);
1526 1.1 chopps x = cmap->count - 1;
1527 1.1 chopps rp = red + cmap->index;
1528 1.1 chopps gp = green + cmap->index;
1529 1.1 chopps bp = blue + cmap->index;
1530 1.1 chopps do {
1531 1.1 chopps vgaw (ba, VDAC_DATA, *rp++ >> 2);
1532 1.1 chopps vgaw (ba, VDAC_DATA, *gp++ >> 2);
1533 1.1 chopps vgaw (ba, VDAC_DATA, *bp++ >> 2);
1534 1.1 chopps } while (x-- > 0);
1535 1.1 chopps return(0);
1536 1.1 chopps }
1537 1.1 chopps else
1538 1.1 chopps return(error);
1539 1.1 chopps }
1540 1.1 chopps
1541 1.1 chopps int
1542 1.1 chopps rh_getspritepos (gp, pos)
1543 1.1 chopps struct grf_softc *gp;
1544 1.1 chopps struct grf_position *pos;
1545 1.1 chopps {
1546 1.1 chopps volatile unsigned char *acm = gp->g_regkva + ACM_OFFSET;
1547 1.1 chopps
1548 1.1 chopps pos->x = acm[ACM_CURSOR_POSITION + 0] +
1549 1.1 chopps (acm[ACM_CURSOR_POSITION + 1] << 8);
1550 1.1 chopps pos->y = acm[ACM_CURSOR_POSITION + 2] +
1551 1.1 chopps (acm[ACM_CURSOR_POSITION + 3] << 8);
1552 1.1 chopps
1553 1.1 chopps pos->x += xpan;
1554 1.1 chopps pos->y += ypan;
1555 1.1 chopps
1556 1.1 chopps return(0);
1557 1.1 chopps }
1558 1.1 chopps
1559 1.1 chopps int
1560 1.1 chopps rh_setspritepos (gp, pos)
1561 1.1 chopps struct grf_softc *gp;
1562 1.1 chopps struct grf_position *pos;
1563 1.1 chopps {
1564 1.1 chopps RZ3SetHWCloc (gp, pos->x, pos->y);
1565 1.1 chopps return(0);
1566 1.1 chopps }
1567 1.1 chopps
1568 1.1 chopps int
1569 1.1 chopps rh_getspriteinfo (gp, info)
1570 1.1 chopps struct grf_softc *gp;
1571 1.1 chopps struct grf_spriteinfo *info;
1572 1.1 chopps {
1573 1.1 chopps volatile unsigned char *ba, *fb;
1574 1.1 chopps
1575 1.1 chopps ba = gp->g_regkva;
1576 1.1 chopps fb = gp->g_fbkva;
1577 1.1 chopps if (info->set & GRFSPRSET_ENABLE)
1578 1.1 chopps info->enable = RSeq (ba, SEQ_ID_CURSOR_CONTROL) & 0x01;
1579 1.1 chopps if (info->set & GRFSPRSET_POS)
1580 1.1 chopps rh_getspritepos (gp, &info->pos);
1581 1.1 chopps if (info->set & GRFSPRSET_HOT) {
1582 1.1 chopps info->hot.x = RSeq (ba, SEQ_ID_CURSOR_X_INDEX) & 0x3f;
1583 1.1 chopps info->hot.y = RSeq (ba, SEQ_ID_CURSOR_Y_INDEX) & 0x7f;
1584 1.1 chopps }
1585 1.1 chopps if (info->set & GRFSPRSET_CMAP) {
1586 1.1 chopps struct grf_colormap cmap;
1587 1.1 chopps int index;
1588 1.1 chopps cmap.index = 0;
1589 1.1 chopps cmap.count = 256;
1590 1.1 chopps rh_getcmap (gp, &cmap);
1591 1.1 chopps index = RSeq (ba, SEQ_ID_CURSOR_COLOR0);
1592 1.1 chopps info->cmap.red[0] = cmap.red[index];
1593 1.1 chopps info->cmap.green[0] = cmap.green[index];
1594 1.1 chopps info->cmap.blue[0] = cmap.blue[index];
1595 1.1 chopps index = RSeq (ba, SEQ_ID_CURSOR_COLOR1);
1596 1.1 chopps info->cmap.red[1] = cmap.red[index];
1597 1.1 chopps info->cmap.green[1] = cmap.green[index];
1598 1.1 chopps info->cmap.blue[1] = cmap.blue[index];
1599 1.1 chopps }
1600 1.1 chopps if (info->set & GRFSPRSET_SHAPE) {
1601 1.1 chopps u_char image[128], mask[128];
1602 1.1 chopps volatile u_long *hwp;
1603 1.1 chopps u_char *imp, *mp;
1604 1.1 chopps short row;
1605 1.1 chopps
1606 1.1 chopps /* sprite bitmap is WEIRD in this chip.. see grf_rhvar.h
1607 1.1 chopps * for an explanation. To convert to "our" format, the
1608 1.1 chopps * following holds:
1609 1.1 chopps * col2 = !image & mask
1610 1.1 chopps * col1 = image & mask
1611 1.1 chopps * transp = !mask
1612 1.1 chopps * and thus:
1613 1.1 chopps * image = col1
1614 1.1 chopps * mask = col1 | col2
1615 1.1 chopps * hope I got these bool-eqs right below..
1616 1.1 chopps */
1617 1.1 chopps
1618 1.1 chopps info->size.x = 64;
1619 1.1 chopps info->size.y = 64;
1620 1.1 chopps for (row = 0, hwp = (u_long *)(ba + LM_OFFSET + HWC_MEM_OFF),
1621 1.1 chopps mp = mask, imp = image;
1622 1.1 chopps row < 64;
1623 1.1 chopps row++) {
1624 1.1 chopps u_long bp10, bp20, bp11, bp21;
1625 1.1 chopps bp10 = *hwp++;
1626 1.1 chopps bp20 = *hwp++;
1627 1.1 chopps bp11 = *hwp++;
1628 1.1 chopps bp21 = *hwp++;
1629 1.1 chopps M2I (bp10);
1630 1.1 chopps M2I (bp20);
1631 1.1 chopps M2I (bp11);
1632 1.1 chopps M2I (bp21);
1633 1.1 chopps *imp++ = (~bp10) & bp11;
1634 1.1 chopps *imp++ = (~bp20) & bp21;
1635 1.1 chopps *mp++ = (~bp10) | (bp10 & ~bp11);
1636 1.1 chopps *mp++ = (~bp20) & (bp20 & ~bp21);
1637 1.1 chopps }
1638 1.1 chopps copyout (image, info->image, sizeof (image));
1639 1.1 chopps copyout (mask, info->mask, sizeof (mask));
1640 1.1 chopps }
1641 1.1 chopps return(0);
1642 1.1 chopps }
1643 1.1 chopps
1644 1.1 chopps int
1645 1.1 chopps rh_setspriteinfo (gp, info)
1646 1.1 chopps struct grf_softc *gp;
1647 1.1 chopps struct grf_spriteinfo *info;
1648 1.1 chopps {
1649 1.1 chopps volatile unsigned char *ba, *fb;
1650 1.1 chopps u_char control;
1651 1.1 chopps
1652 1.1 chopps ba = gp->g_regkva;
1653 1.1 chopps fb = gp->g_fbkva;
1654 1.1 chopps
1655 1.1 chopps if (info->set & GRFSPRSET_SHAPE) {
1656 1.1 chopps /*
1657 1.1 chopps * For an explanation of these weird actions here, see above
1658 1.1 chopps * when reading the shape. We set the shape directly into
1659 1.1 chopps * the video memory, there's no reason to keep 1k on the
1660 1.1 chopps * kernel stack just as template
1661 1.1 chopps */
1662 1.1 chopps u_char *image, *mask;
1663 1.1 chopps volatile u_long *hwp;
1664 1.1 chopps u_char *imp, *mp;
1665 1.1 chopps short row;
1666 1.1 chopps
1667 1.1 chopps if (info->size.y > 64)
1668 1.1 chopps info->size.y = 64;
1669 1.1 chopps if (info->size.x > 64)
1670 1.1 chopps info->size.x = 64;
1671 1.1 chopps
1672 1.1 chopps if (info->size.x < 32)
1673 1.1 chopps info->size.x = 32;
1674 1.1 chopps
1675 1.1 chopps image = malloc(HWC_MEM_SIZE, M_TEMP, M_WAITOK);
1676 1.1 chopps mask = image + HWC_MEM_SIZE/2;
1677 1.1 chopps
1678 1.1 chopps copyin(info->image, image, info->size.y * info->size.x / 8);
1679 1.1 chopps copyin(info->mask, mask, info->size.y * info->size.x / 8);
1680 1.1 chopps
1681 1.1 chopps hwp = (u_long *)(ba + LM_OFFSET + HWC_MEM_OFF);
1682 1.1 chopps
1683 1.1 chopps /*
1684 1.1 chopps * setting it is slightly more difficult, because we can't
1685 1.1 chopps * force the application to not pass a *smaller* than
1686 1.1 chopps * supported bitmap
1687 1.1 chopps */
1688 1.1 chopps
1689 1.1 chopps for (row = 0, mp = mask, imp = image;
1690 1.1 chopps row < info->size.y;
1691 1.1 chopps row++) {
1692 1.1 chopps u_long im1, im2, m1, m2;
1693 1.1 chopps
1694 1.1 chopps im1 = *(unsigned long *)imp;
1695 1.1 chopps imp += 4;
1696 1.1 chopps m1 = *(unsigned long *)mp;
1697 1.1 chopps mp += 4;
1698 1.1 chopps if (info->size.x > 32) {
1699 1.1 chopps im2 = *(unsigned long *)imp;
1700 1.1 chopps imp += 4;
1701 1.1 chopps m2 = *(unsigned long *)mp;
1702 1.1 chopps mp += 4;
1703 1.1 chopps }
1704 1.1 chopps else
1705 1.1 chopps im2 = m2 = 0;
1706 1.1 chopps
1707 1.1 chopps M2I(im1);
1708 1.1 chopps M2I(im2);
1709 1.1 chopps M2I(m1);
1710 1.1 chopps M2I(m2);
1711 1.1 chopps
1712 1.1 chopps *hwp++ = ~m1;
1713 1.1 chopps *hwp++ = ~m2;
1714 1.1 chopps *hwp++ = m1 & im1;
1715 1.1 chopps *hwp++ = m2 & im2;
1716 1.1 chopps }
1717 1.1 chopps for (; row < 64; row++) {
1718 1.1 chopps *hwp++ = 0xffffffff;
1719 1.1 chopps *hwp++ = 0xffffffff;
1720 1.1 chopps *hwp++ = 0x00000000;
1721 1.1 chopps *hwp++ = 0x00000000;
1722 1.1 chopps }
1723 1.1 chopps
1724 1.1 chopps free(image, M_TEMP);
1725 1.1 chopps RZ3SetupHWC(gp, 1, 0, 0, 0, 0);
1726 1.1 chopps }
1727 1.1 chopps if (info->set & GRFSPRSET_CMAP) {
1728 1.1 chopps /* hey cheat a bit here.. XXX */
1729 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_COLOR0, 0);
1730 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_COLOR1, 1);
1731 1.1 chopps }
1732 1.1 chopps if (info->set & GRFSPRSET_ENABLE) {
1733 1.1 chopps if (info->enable)
1734 1.1 chopps control = 0x85;
1735 1.1 chopps else
1736 1.1 chopps control = 0;
1737 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_CONTROL, control);
1738 1.1 chopps }
1739 1.1 chopps if (info->set & GRFSPRSET_POS)
1740 1.1 chopps rh_setspritepos(gp, &info->pos);
1741 1.1 chopps if (info->set & GRFSPRSET_HOT) {
1742 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_X_INDEX, info->hot.x & 0x3f);
1743 1.1 chopps WSeq(ba, SEQ_ID_CURSOR_Y_INDEX, info->hot.y & 0x7f);
1744 1.1 chopps }
1745 1.1 chopps
1746 1.1 chopps return(0);
1747 1.1 chopps }
1748 1.1 chopps
1749 1.1 chopps int
1750 1.1 chopps rh_getspritemax (gp, pos)
1751 1.1 chopps struct grf_softc *gp;
1752 1.1 chopps struct grf_position *pos;
1753 1.1 chopps {
1754 1.1 chopps pos->x = 64;
1755 1.1 chopps pos->y = 64;
1756 1.1 chopps
1757 1.1 chopps return(0);
1758 1.1 chopps }
1759 1.1 chopps
1760 1.1 chopps
1761 1.1 chopps int
1762 1.1 chopps rh_bitblt (gp, bb)
1763 1.1 chopps struct grf_softc *gp;
1764 1.1 chopps struct grf_bitblt *bb;
1765 1.1 chopps {
1766 1.1 chopps struct MonDef *md = (struct MonDef *)gp->g_data;
1767 1.1 chopps if (md->DEP < 16)
1768 1.1 chopps RZ3BitBlit(gp, bb);
1769 1.1 chopps else
1770 1.1 chopps RZ3BitBlit16(gp, bb);
1771 1.1 chopps }
1772 1.1 chopps #endif /* NGRF */
1773