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