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