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