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