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