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