xref: /plan9/sys/src/cmd/aux/vga/neomagic.c (revision 5b7f163ef926031138d13ab99fb6fc8ce599f427)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
47dd7cddfSDavid du Colombier 
57dd7cddfSDavid du Colombier #include "pci.h"
69a747e4fSDavid du Colombier #include "vga.h"
77dd7cddfSDavid du Colombier 
87dd7cddfSDavid du Colombier typedef struct {
97dd7cddfSDavid du Colombier 	Pcidev*	pci;
107dd7cddfSDavid du Colombier 
117dd7cddfSDavid du Colombier 	int	x;
127dd7cddfSDavid du Colombier 	int	y;
137dd7cddfSDavid du Colombier } Neomagic;
147dd7cddfSDavid du Colombier 
157dd7cddfSDavid du Colombier enum {
167dd7cddfSDavid du Colombier 	ExtCrtx = 0x19,
177dd7cddfSDavid du Colombier 	MaxCRT=0x85,
187dd7cddfSDavid du Colombier 	MaxGR=0xc7,
197dd7cddfSDavid du Colombier };
207dd7cddfSDavid du Colombier 
217dd7cddfSDavid du Colombier enum {
227dd7cddfSDavid du Colombier 	GeneralLockReg = 0x0A,
237dd7cddfSDavid du Colombier 	ExtCRTDispAddr = 0x0E,
247dd7cddfSDavid du Colombier 	ExtCRTOffset = 0x0F,
257dd7cddfSDavid du Colombier 	SysIfaceCntl1 = 0x10,
267dd7cddfSDavid du Colombier 	SysIfaceCntl2 = 0x11,
277dd7cddfSDavid du Colombier 	SingleAddrPage = 0x15,		/* not changed? */
287dd7cddfSDavid du Colombier 	DualAddrPage = 0x16,		/* not changed? */
297dd7cddfSDavid du Colombier 	PanelDispCntlReg1 = 0x20,
307dd7cddfSDavid du Colombier 	PanelDispCntlReg2 = 0x25,
317dd7cddfSDavid du Colombier 	PanelDispCntlReg3 = 0x30,
327dd7cddfSDavid du Colombier 	PanelVertCenterReg1 = 0x28,
337dd7cddfSDavid du Colombier 	PanelVertCenterReg2 = 0x29,
347dd7cddfSDavid du Colombier 	PanelVertCenterReg3 = 0x2A,
357dd7cddfSDavid du Colombier 	PanelVertCenterReg4 = 0x32,	/* not 2070 */
367dd7cddfSDavid du Colombier 	PanelHorizCenterReg1 = 0x33,
377dd7cddfSDavid du Colombier 	PanelHorizCenterReg2 = 0x34,
387dd7cddfSDavid du Colombier 	PanelHorizCenterReg3 = 0x35,
3914414594SDavid du Colombier 	PanelHorizCenterReg4 = 0x36,	/* 2160, 2200, 2360 */
4014414594SDavid du Colombier 	PanelVertCenterReg5 = 0x37,	/* 2200, 2360 */
4114414594SDavid du Colombier 	PanelHorizCenterReg5 = 0x38,	/* 2200, 2360 */
427dd7cddfSDavid du Colombier 
437dd7cddfSDavid du Colombier 	ExtColorModeSelect = 0x90,
447dd7cddfSDavid du Colombier 
457dd7cddfSDavid du Colombier 	VerticalExt = 0x70,		/* 2200; iobase+4 */
467dd7cddfSDavid du Colombier };
477dd7cddfSDavid du Colombier 
487dd7cddfSDavid du Colombier static int crts[] = {
497dd7cddfSDavid du Colombier 	0x1D, 0x1F, 0x21, 0x23, 0x25, 0x2F,
507dd7cddfSDavid du Colombier 	/* also 40-59, 60-69, 70-MaxCRT */
517dd7cddfSDavid du Colombier 	-1
527dd7cddfSDavid du Colombier };
537dd7cddfSDavid du Colombier 
547dd7cddfSDavid du Colombier /*
557dd7cddfSDavid du Colombier  * Neomagic driver (fake)
567dd7cddfSDavid du Colombier  */
577dd7cddfSDavid du Colombier static void
snarf(Vga * vga,Ctlr * ctlr)587dd7cddfSDavid du Colombier snarf(Vga* vga, Ctlr* ctlr)
597dd7cddfSDavid du Colombier {
607dd7cddfSDavid du Colombier 	int i;
617dd7cddfSDavid du Colombier 	Pcidev *p;
627dd7cddfSDavid du Colombier 	Neomagic *nm;
637dd7cddfSDavid du Colombier 
647dd7cddfSDavid du Colombier 	generic.snarf(vga, ctlr);
657dd7cddfSDavid du Colombier 
667dd7cddfSDavid du Colombier 	outportw(Grx, 0x2609);	/* unlock neo registers */
677dd7cddfSDavid du Colombier 	outportw(Grx, 0x0015);	/* reset bank */
687dd7cddfSDavid du Colombier 
697dd7cddfSDavid du Colombier 	for(i=0; crts[i] >= 0; i++)
707dd7cddfSDavid du Colombier 		vga->crt[crts[i]] = vgaxi(Crtx, crts[i]);
717dd7cddfSDavid du Colombier 	for(i=0x40; i <= MaxCRT; i++)
727dd7cddfSDavid du Colombier 		vga->crt[i] = vgaxi(Crtx, i);
737dd7cddfSDavid du Colombier 
747dd7cddfSDavid du Colombier 	for(i=0x08; i<=0x3F; i++)
757dd7cddfSDavid du Colombier 		vga->graphics[i] = vgaxi(Grx, i);
767dd7cddfSDavid du Colombier 	for(i=0x70; i<=MaxGR; i++)
777dd7cddfSDavid du Colombier 		vga->graphics[i] = vgaxi(Grx, i);
787dd7cddfSDavid du Colombier 
797dd7cddfSDavid du Colombier 	if(vga->private == nil){
807dd7cddfSDavid du Colombier 		vga->private = alloc(sizeof(Neomagic));
817dd7cddfSDavid du Colombier 		nm = vga->private;
827dd7cddfSDavid du Colombier 		if((p = pcimatch(0, 0x10C8, 0)) == nil)
837dd7cddfSDavid du Colombier 			error("%s: not found\n", ctlr->name);
847dd7cddfSDavid du Colombier 		switch(p->did){
859d1c31b1SDavid du Colombier 		case 0x0003:			/* MagicGraph 128 ZV */
869d1c31b1SDavid du Colombier 			vga->f[1] = 80000000;
879d1c31b1SDavid du Colombier 			vga->vmz = 2048*1024;
889d1c31b1SDavid du Colombier 			vga->apz = 4*1024*1024;
899d1c31b1SDavid du Colombier 			break;
90afb30c3eSDavid du Colombier 		case 0x0083:			/* MagicGraph 128 ZV+ */
91afb30c3eSDavid du Colombier 			vga->f[1] = 80000000;
92afb30c3eSDavid du Colombier 			vga->vmz = 2048*1024;
93afb30c3eSDavid du Colombier 			vga->apz = 4*1024*1024;
94afb30c3eSDavid du Colombier 			break;
957dd7cddfSDavid du Colombier 		case 0x0004:			/* MagicGraph 128 XD */
967dd7cddfSDavid du Colombier 			vga->f[1] = 90000000;
977dd7cddfSDavid du Colombier 			vga->vmz = 2048*1024;
987dd7cddfSDavid du Colombier 			vga->apz = 16*1024*1024;
997dd7cddfSDavid du Colombier 			break;
1007dd7cddfSDavid du Colombier 		case 0x0005:			/* MagicMedia 256 AV */
1017dd7cddfSDavid du Colombier 			vga->f[1] = 110000000;
1027dd7cddfSDavid du Colombier 			vga->vmz = 2560*1024;
1037dd7cddfSDavid du Colombier 			vga->apz = 16*1024*1024;
1047dd7cddfSDavid du Colombier 			break;
10514414594SDavid du Colombier 		case 0x0006:			/* MagicMedia 256 ZX */
10614414594SDavid du Colombier 			vga->f[1] = 110000000;
10714414594SDavid du Colombier 			vga->vmz = 4096*1024;
10814414594SDavid du Colombier 			vga->apz = 16*1024*1024;
10914414594SDavid du Colombier 			break;
110*5b7f163eSDavid du Colombier 		case 0x0016:			/* MagicMedia 256 XL+ */
111*5b7f163eSDavid du Colombier 			vga->f[1] = 110000000;
112*5b7f163eSDavid du Colombier 			/* Vaio VESA BIOS says 6080, but then hwgc doesn't work */
113*5b7f163eSDavid du Colombier 			vga->vmz = 4096*1024;
114*5b7f163eSDavid du Colombier 			vga->apz = 32*1024*1024;
115*5b7f163eSDavid du Colombier 			break;
1167dd7cddfSDavid du Colombier 		case 0x0001:			/* MagicGraph 128 */
1177dd7cddfSDavid du Colombier 		case 0x0002:			/* MagicGraph 128 V */
1187dd7cddfSDavid du Colombier 		default:
1197dd7cddfSDavid du Colombier 			error("%s: DID %4.4uX unsupported\n",
1207dd7cddfSDavid du Colombier 				ctlr->name, p->did);
1217dd7cddfSDavid du Colombier 		}
1227dd7cddfSDavid du Colombier 		nm->pci = p;
1237dd7cddfSDavid du Colombier 	}
1247dd7cddfSDavid du Colombier 
1257dd7cddfSDavid du Colombier 	ctlr->flag |= Fsnarf;
1267dd7cddfSDavid du Colombier }
1277dd7cddfSDavid du Colombier 
1287dd7cddfSDavid du Colombier static void
options(Vga *,Ctlr * ctlr)1297dd7cddfSDavid du Colombier options(Vga*, Ctlr* ctlr)
1307dd7cddfSDavid du Colombier {
1317dd7cddfSDavid du Colombier 	ctlr->flag |= Ulinear|Hlinear|Foptions;
1327dd7cddfSDavid du Colombier }
1337dd7cddfSDavid du Colombier 
1347dd7cddfSDavid du Colombier static void
init(Vga * vga,Ctlr * ctlr)1357dd7cddfSDavid du Colombier init(Vga* vga, Ctlr* ctlr)
1367dd7cddfSDavid du Colombier {
1377dd7cddfSDavid du Colombier 	Neomagic *nm;
1387dd7cddfSDavid du Colombier 	int i, h, v, t;
1397dd7cddfSDavid du Colombier 
1407dd7cddfSDavid du Colombier 	generic.init(vga, ctlr);
1417dd7cddfSDavid du Colombier 
1427dd7cddfSDavid du Colombier 	nm = vga->private;
1437dd7cddfSDavid du Colombier 	switch((vga->graphics[0x20]>>3)&3){
1447dd7cddfSDavid du Colombier 	case 0:
1457dd7cddfSDavid du Colombier 		nm->x = 640;
1467dd7cddfSDavid du Colombier 		nm->y = 480;
1477dd7cddfSDavid du Colombier 		break;
1487dd7cddfSDavid du Colombier 	case 1:
1497dd7cddfSDavid du Colombier 		nm->x = 800;
1507dd7cddfSDavid du Colombier 		nm->y = 600;
1517dd7cddfSDavid du Colombier 		break;
1527dd7cddfSDavid du Colombier 	case 2:
1537dd7cddfSDavid du Colombier 		nm->x = 1024;
1547dd7cddfSDavid du Colombier 		nm->y = 768;
1557dd7cddfSDavid du Colombier 	case 3:
1567dd7cddfSDavid du Colombier 		nm->x = 1280;
1577dd7cddfSDavid du Colombier 		nm->y = 1024;
1587dd7cddfSDavid du Colombier 		break;
1597dd7cddfSDavid du Colombier 	}
1607dd7cddfSDavid du Colombier 
1617dd7cddfSDavid du Colombier 	vga->crt[0x0C] = 0;	/* vga starting address (offset) */
1627dd7cddfSDavid du Colombier 	vga->crt[0x0D] = 0;
1637dd7cddfSDavid du Colombier 	vga->graphics[GeneralLockReg] = 0x01;	/* (internal or simultaneous) */
1647dd7cddfSDavid du Colombier 	vga->attribute[0x10] &= ~0x40;	/* 2x4 mode not right for neomagic */
1657dd7cddfSDavid du Colombier 
1667dd7cddfSDavid du Colombier 	t = 2;		/* LCD only (0x01 for external) */
1677dd7cddfSDavid du Colombier 	switch(vga->mode->x){
1687dd7cddfSDavid du Colombier 	case 1280:
1697dd7cddfSDavid du Colombier 		t |= 0x60;
1707dd7cddfSDavid du Colombier 		break;
1717dd7cddfSDavid du Colombier 	case 1024:
1727dd7cddfSDavid du Colombier 		t |= 0x40;
1737dd7cddfSDavid du Colombier 		break;
1747dd7cddfSDavid du Colombier 	case 800:
1757dd7cddfSDavid du Colombier 		t |= 0x20;
1767dd7cddfSDavid du Colombier 		break;
1777dd7cddfSDavid du Colombier 	}
17814414594SDavid du Colombier 	if(0 && (nm->pci->did == 0x0005) || (nm->pci->did == 0x0006)){
1797dd7cddfSDavid du Colombier 		vga->graphics[PanelDispCntlReg1] &= 0x98;
1807dd7cddfSDavid du Colombier 		vga->graphics[PanelDispCntlReg1] |= (t & ~0x98);
1817dd7cddfSDavid du Colombier 	}
1827dd7cddfSDavid du Colombier 	else{
1837dd7cddfSDavid du Colombier 		vga->graphics[PanelDispCntlReg1] &= 0xDC;	/* save bits 7:6, 4:2 */
1847dd7cddfSDavid du Colombier 		vga->graphics[PanelDispCntlReg1] |= (t & ~0xDC);
1857dd7cddfSDavid du Colombier 	}
1867dd7cddfSDavid du Colombier 
1877dd7cddfSDavid du Colombier 	vga->graphics[PanelDispCntlReg2] &= 0x38;
1887dd7cddfSDavid du Colombier 	vga->graphics[PanelDispCntlReg3] &= 0xEF;
1897dd7cddfSDavid du Colombier 	vga->graphics[PanelVertCenterReg1] = 0x00;
1907dd7cddfSDavid du Colombier 	vga->graphics[PanelVertCenterReg2] = 0x00;
1917dd7cddfSDavid du Colombier 	vga->graphics[PanelVertCenterReg3] = 0x00;
1927dd7cddfSDavid du Colombier 	vga->graphics[PanelVertCenterReg4] = 0x00;
1937dd7cddfSDavid du Colombier 	vga->graphics[PanelVertCenterReg5] = 0x00;
1947dd7cddfSDavid du Colombier 	vga->graphics[PanelHorizCenterReg1] = 0x00;
1957dd7cddfSDavid du Colombier 	vga->graphics[PanelHorizCenterReg2] = 0x00;
1967dd7cddfSDavid du Colombier 	vga->graphics[PanelHorizCenterReg3] = 0x00;
1977dd7cddfSDavid du Colombier 	vga->graphics[PanelHorizCenterReg4] = 0x00;
1987dd7cddfSDavid du Colombier 	vga->graphics[PanelHorizCenterReg5] = 0x00;
1997dd7cddfSDavid du Colombier 	if(vga->mode->x < nm->x){
2007dd7cddfSDavid du Colombier 		vga->graphics[PanelDispCntlReg2] |= 0x01;
2017dd7cddfSDavid du Colombier 		vga->graphics[PanelDispCntlReg3] |= 0x10;
2027dd7cddfSDavid du Colombier 		h = ((nm->x - vga->mode->x) >> 4) - 1;
2037dd7cddfSDavid du Colombier 		v = ((nm->y - vga->mode->y) >> 1) - 2;
2047dd7cddfSDavid du Colombier 		switch(vga->mode->x){
2057dd7cddfSDavid du Colombier 		case 640:
2067dd7cddfSDavid du Colombier 			vga->graphics[PanelHorizCenterReg1] = h;
2077dd7cddfSDavid du Colombier 			vga->graphics[PanelVertCenterReg3] = v;
2087dd7cddfSDavid du Colombier 			break;
2097dd7cddfSDavid du Colombier 		case 800:
2107dd7cddfSDavid du Colombier 			vga->graphics[PanelHorizCenterReg2] = h;
2117dd7cddfSDavid du Colombier 			vga->graphics[PanelVertCenterReg4] = v;
2127dd7cddfSDavid du Colombier 			break;
2137dd7cddfSDavid du Colombier 		case 1024:
2147dd7cddfSDavid du Colombier 			vga->graphics[PanelHorizCenterReg5] = h;
2157dd7cddfSDavid du Colombier 			vga->graphics[PanelVertCenterReg5] = v;
2167dd7cddfSDavid du Colombier 			break;
2177dd7cddfSDavid du Colombier 		}
2187dd7cddfSDavid du Colombier 	}
2197dd7cddfSDavid du Colombier 
2207dd7cddfSDavid du Colombier 	vga->graphics[ExtCRTDispAddr] = 0x10;
2217dd7cddfSDavid du Colombier 	vga->graphics[SysIfaceCntl1] &= 0x0F;
2227dd7cddfSDavid du Colombier 	vga->graphics[SysIfaceCntl1] |= 0x30;
2237dd7cddfSDavid du Colombier 	vga->graphics[SysIfaceCntl2] = 0x40;	/* make sure MMIO is enabled */
2247dd7cddfSDavid du Colombier 	vga->graphics[SingleAddrPage] = 0x00;
2257dd7cddfSDavid du Colombier 	vga->graphics[DualAddrPage] = 0x00;
2267dd7cddfSDavid du Colombier 	vga->graphics[ExtCRTOffset] = 0x00;
2277dd7cddfSDavid du Colombier 	t = vga->graphics[ExtColorModeSelect] & 0x70;	/* colour mode extension */
2287dd7cddfSDavid du Colombier 	if(vga->mode->z == 8){
2297dd7cddfSDavid du Colombier 		t |= 0x11;
2307dd7cddfSDavid du Colombier 		vga->crt[0x13] = vga->mode->x/8;
2317dd7cddfSDavid du Colombier 		vga->graphics[ExtCRTOffset] = vga->mode->x>>11;
2327dd7cddfSDavid du Colombier 		vga->graphics[0x05] = 0x00;	/* linear addressing? */
2337dd7cddfSDavid du Colombier 		vga->crt[0x14] = 0x40;	/* double word mode but don't count by 4 */
2347dd7cddfSDavid du Colombier 	}
2357dd7cddfSDavid du Colombier 	else if(vga->mode->z == 16){
2367dd7cddfSDavid du Colombier 		t |= 0x13;
2377dd7cddfSDavid du Colombier 		vga->crt[0x13] = vga->mode->x/4;
2387dd7cddfSDavid du Colombier 		vga->graphics[0x05] = 0x00;	/* linear addressing? */
2397dd7cddfSDavid du Colombier 		vga->crt[0x14] = 0x40;	/* double word mode but don't count by 4 */
2407dd7cddfSDavid du Colombier 		vga->graphics[ExtCRTOffset] = vga->mode->x>>10;
2417dd7cddfSDavid du Colombier 		for(i = 0; i < Pcolours; i++){
2427dd7cddfSDavid du Colombier 			vga->palette[i][Red] = i<<1;
2437dd7cddfSDavid du Colombier 			vga->palette[i][Green] = i;
2447dd7cddfSDavid du Colombier 			vga->palette[i][Blue] = i<<1;
2457dd7cddfSDavid du Colombier 		}
2467dd7cddfSDavid du Colombier 	}
2477dd7cddfSDavid du Colombier 	else if(vga->mode->z == 24){
2487dd7cddfSDavid du Colombier 		t |= 0x14;
2497dd7cddfSDavid du Colombier 		vga->crt[0x13] = (vga->mode->x*3)/8;
2507dd7cddfSDavid du Colombier //		vga->graphics[0x05] = 0x00;	/* linear addressing? */
2517dd7cddfSDavid du Colombier 		vga->crt[0x14] = 0x40;	/* double word mode but don't count by 4 */
2527dd7cddfSDavid du Colombier 		vga->graphics[ExtCRTOffset] = (vga->mode->x*3)>>11;
2537dd7cddfSDavid du Colombier 		for(i = 0; i < Pcolours; i++){
2547dd7cddfSDavid du Colombier 			vga->palette[i][Red] = i;
2557dd7cddfSDavid du Colombier 			vga->palette[i][Green] = i;
2567dd7cddfSDavid du Colombier 			vga->palette[i][Blue] = i;
2577dd7cddfSDavid du Colombier 		}
2587dd7cddfSDavid du Colombier 	}
2597dd7cddfSDavid du Colombier 	else
2607dd7cddfSDavid du Colombier 		error("depth %d not supported\n", vga->mode->z);
2617dd7cddfSDavid du Colombier 	vga->graphics[ExtColorModeSelect] = t;
2627dd7cddfSDavid du Colombier 
2637dd7cddfSDavid du Colombier 	vga->misc |= 0x0C;
2647dd7cddfSDavid du Colombier 
2657dd7cddfSDavid du Colombier 	ctlr->flag |= Finit;
2667dd7cddfSDavid du Colombier }
2677dd7cddfSDavid du Colombier 
2687dd7cddfSDavid du Colombier static void
load(Vga * vga,Ctlr * ctlr)2697dd7cddfSDavid du Colombier load(Vga* vga, Ctlr* ctlr)
2707dd7cddfSDavid du Colombier {
2717dd7cddfSDavid du Colombier 	vgaxo(Grx, GeneralLockReg, vga->graphics[GeneralLockReg]);
2727dd7cddfSDavid du Colombier 	vgaxo(Grx, ExtColorModeSelect, vga->graphics[ExtColorModeSelect]);
2737dd7cddfSDavid du Colombier 	vgaxo(Grx, PanelDispCntlReg2, vga->graphics[PanelDispCntlReg2] & 0x39);
2747dd7cddfSDavid du Colombier 	sleep(200);
2757dd7cddfSDavid du Colombier 
2767dd7cddfSDavid du Colombier 	generic.load(vga, ctlr);
2777dd7cddfSDavid du Colombier 
2787dd7cddfSDavid du Colombier 	vgaxo(Grx, ExtCRTDispAddr, vga->graphics[ExtCRTDispAddr]);
2797dd7cddfSDavid du Colombier 	vgaxo(Grx, ExtCRTOffset, vga->graphics[ExtCRTOffset] & 0x39);
2807dd7cddfSDavid du Colombier 	vgaxo(Grx, SysIfaceCntl1, vga->graphics[SysIfaceCntl1]);
2817dd7cddfSDavid du Colombier 	if(ctlr->flag & Ulinear)
2827dd7cddfSDavid du Colombier 		vga->graphics[SysIfaceCntl2] |= 0x80;
2837dd7cddfSDavid du Colombier 	vgaxo(Grx, SysIfaceCntl2, vga->graphics[SysIfaceCntl2]);
2847dd7cddfSDavid du Colombier 	vgaxo(Grx, SingleAddrPage, vga->graphics[SingleAddrPage]);
2857dd7cddfSDavid du Colombier 	vgaxo(Grx, DualAddrPage, vga->graphics[DualAddrPage]);
2867dd7cddfSDavid du Colombier 	vgaxo(Grx, PanelDispCntlReg1, vga->graphics[PanelDispCntlReg1]);
2877dd7cddfSDavid du Colombier 	vgaxo(Grx, PanelDispCntlReg2, vga->graphics[PanelDispCntlReg2]);
2887dd7cddfSDavid du Colombier 	vgaxo(Grx, PanelDispCntlReg3, vga->graphics[PanelDispCntlReg3]);
2897dd7cddfSDavid du Colombier 	vgaxo(Grx, PanelVertCenterReg1, vga->graphics[PanelVertCenterReg1]);
2907dd7cddfSDavid du Colombier 	vgaxo(Grx, PanelVertCenterReg2, vga->graphics[PanelVertCenterReg2]);
2917dd7cddfSDavid du Colombier 	vgaxo(Grx, PanelVertCenterReg3, vga->graphics[PanelVertCenterReg3]);
2927dd7cddfSDavid du Colombier 	vgaxo(Grx, PanelVertCenterReg4, vga->graphics[PanelVertCenterReg4]);
2937dd7cddfSDavid du Colombier 	vgaxo(Grx, PanelHorizCenterReg1, vga->graphics[PanelHorizCenterReg1]);
2947dd7cddfSDavid du Colombier 	vgaxo(Grx, PanelHorizCenterReg2, vga->graphics[PanelHorizCenterReg2]);
2957dd7cddfSDavid du Colombier 	vgaxo(Grx, PanelHorizCenterReg3, vga->graphics[PanelHorizCenterReg3]);
2967dd7cddfSDavid du Colombier 	vgaxo(Grx, PanelHorizCenterReg4, vga->graphics[PanelHorizCenterReg4]);
2977dd7cddfSDavid du Colombier 	vgaxo(Grx, PanelVertCenterReg5, vga->graphics[PanelVertCenterReg5]);
2987dd7cddfSDavid du Colombier 	vgaxo(Grx, PanelHorizCenterReg5, vga->graphics[PanelHorizCenterReg5]);
2997dd7cddfSDavid du Colombier 
3007dd7cddfSDavid du Colombier 	if(vga->mode->z != 8)
3017dd7cddfSDavid du Colombier 		palette.load(vga, ctlr);
3027dd7cddfSDavid du Colombier }
3037dd7cddfSDavid du Colombier 
3047dd7cddfSDavid du Colombier static void
dump(Vga * vga,Ctlr * ctlr)3057dd7cddfSDavid du Colombier dump(Vga* vga, Ctlr* ctlr)
3067dd7cddfSDavid du Colombier {
3077dd7cddfSDavid du Colombier 	int i;
3087dd7cddfSDavid du Colombier 	char buf[100];
3097dd7cddfSDavid du Colombier 
3107dd7cddfSDavid du Colombier 	generic.dump(vga, ctlr);
3117dd7cddfSDavid du Colombier 
3127dd7cddfSDavid du Colombier 	for(i = 0; crts[i] >= 0; i++){
3137dd7cddfSDavid du Colombier 		sprint(buf, "Crt%2.2uX", crts[i]);
3147dd7cddfSDavid du Colombier 		printitem(ctlr->name, buf);
3157dd7cddfSDavid du Colombier 		printreg(vga->crt[crts[i]]);
3167dd7cddfSDavid du Colombier 	}
3177dd7cddfSDavid du Colombier 	printitem(ctlr->name, "Crt40");
3187dd7cddfSDavid du Colombier 	for(i=0x40; i<=0x59; i++)
3197dd7cddfSDavid du Colombier 		printreg(vga->crt[i]);
3207dd7cddfSDavid du Colombier 	printitem(ctlr->name, "Crt60");
3217dd7cddfSDavid du Colombier 	for(i=0x60; i<=0x69; i++)
3227dd7cddfSDavid du Colombier 		printreg(vga->crt[i]);
3237dd7cddfSDavid du Colombier 	printitem(ctlr->name, "Crt70");
3247dd7cddfSDavid du Colombier 	for (i = 0x70; i <= MaxCRT; i++)
3257dd7cddfSDavid du Colombier 		printreg(vga->crt[i]);
3267dd7cddfSDavid du Colombier 
3277dd7cddfSDavid du Colombier 	printitem(ctlr->name, "Gr08");
3287dd7cddfSDavid du Colombier 	for(i=0x08; i<=0x3F; i++)
3297dd7cddfSDavid du Colombier 		printreg(vga->graphics[i]);
3307dd7cddfSDavid du Colombier 	printitem(ctlr->name, "Gr70");
3317dd7cddfSDavid du Colombier 	for(i=0x70; i<=MaxGR; i++)
3327dd7cddfSDavid du Colombier 		printreg(vga->graphics[i]);
3337dd7cddfSDavid du Colombier }
3347dd7cddfSDavid du Colombier 
3357dd7cddfSDavid du Colombier Ctlr neomagic = {
3367dd7cddfSDavid du Colombier 	"neomagic",			/* name */
3377dd7cddfSDavid du Colombier 	snarf,				/* snarf */
3387dd7cddfSDavid du Colombier 	options,			/* options */
3397dd7cddfSDavid du Colombier 	init,				/* init */
3407dd7cddfSDavid du Colombier 	load,				/* load */
3417dd7cddfSDavid du Colombier 	dump,				/* dump */
3427dd7cddfSDavid du Colombier };
3437dd7cddfSDavid du Colombier 
3447dd7cddfSDavid du Colombier Ctlr neomagichwgc = {
3457dd7cddfSDavid du Colombier 	"neomagichwgc",			/* name */
3467dd7cddfSDavid du Colombier 	0,				/* snarf */
3477dd7cddfSDavid du Colombier 	0,				/* options */
3487dd7cddfSDavid du Colombier 	0,				/* init */
3497dd7cddfSDavid du Colombier 	0,				/* load */
3507dd7cddfSDavid du Colombier 	0,				/* dump */
3517dd7cddfSDavid du Colombier };
352