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