Added PCI registers for Trident TGUI9440.
This commit is contained in:
parent
7735e82085
commit
16509b1970
2 changed files with 74 additions and 5 deletions
|
|
@ -287,7 +287,7 @@ int driveempty[2];
|
||||||
#define ET4000 (gfxcard==GFX_ET4000 && VGA)
|
#define ET4000 (gfxcard==GFX_ET4000 && VGA)
|
||||||
#define ET4000W32 (gfxcard==GFX_ET4000W32 && VGA)
|
#define ET4000W32 (gfxcard==GFX_ET4000W32 && VGA)
|
||||||
#define AT (romset>=ROM_IBMAT)
|
#define AT (romset>=ROM_IBMAT)
|
||||||
#define PCI (romset == ROM_PCI486)
|
#define PCI (romset >= ROM_PCI486)
|
||||||
|
|
||||||
#define AMIBIOS (romset==ROM_AMI386 || romset==ROM_AMI486 || romset == ROM_WIN486)
|
#define AMIBIOS (romset==ROM_AMI386 || romset==ROM_AMI486 || romset == ROM_WIN486)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,7 @@ void tvga_out(uint16_t addr, uint8_t val, void *p)
|
||||||
|
|
||||||
uint8_t old;
|
uint8_t old;
|
||||||
|
|
||||||
// pclog("tvga_out : %04X %02X %04X:%04X %i\n", addr, val, CS,pc, bpp);
|
// pclog("tvga_out : %04X %02X %04X:%04X %i\n", addr, val, CS,pc, svga->bpp);
|
||||||
if (((addr&0xFFF0) == 0x3D0 || (addr&0xFFF0) == 0x3B0) && !(svga->miscout & 1)) addr ^= 0x60;
|
if (((addr&0xFFF0) == 0x3D0 || (addr&0xFFF0) == 0x3B0) && !(svga->miscout & 1)) addr ^= 0x60;
|
||||||
|
|
||||||
switch (addr)
|
switch (addr)
|
||||||
|
|
@ -151,7 +151,14 @@ void tvga_out(uint16_t addr, uint8_t val, void *p)
|
||||||
{
|
{
|
||||||
case 0x21:
|
case 0x21:
|
||||||
if (old != val)
|
if (old != val)
|
||||||
tvga_recalcmapping(tvga);
|
{
|
||||||
|
if (!PCI)
|
||||||
|
{
|
||||||
|
tvga->linear_base = ((val & 0xf) | ((val >> 2) & 0x30)) << 20;
|
||||||
|
tvga->linear_size = (val & 0x10) ? 0x200000 : 0x100000;
|
||||||
|
}
|
||||||
|
tvga_recalcmapping(tvga);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -322,8 +329,6 @@ void tvga_recalcmapping(tvga_t *tvga)
|
||||||
if (svga->crtc[0x21] & 0x20)
|
if (svga->crtc[0x21] & 0x20)
|
||||||
{
|
{
|
||||||
mem_mapping_disable(&svga->mapping);
|
mem_mapping_disable(&svga->mapping);
|
||||||
tvga->linear_base = ((svga->crtc[0x21] & 0xf) | ((svga->crtc[0x21] >> 2) & 0x30)) << 20;
|
|
||||||
tvga->linear_size = (svga->crtc[0x21] & 0x10) ? 0x200000 : 0x100000;
|
|
||||||
mem_mapping_set_addr(&tvga->linear_mapping, tvga->linear_base, tvga->linear_size);
|
mem_mapping_set_addr(&tvga->linear_mapping, tvga->linear_base, tvga->linear_size);
|
||||||
// pclog("Trident linear framebuffer at %08X - size %06X\n", tvga->linear_base, tvga->linear_size);
|
// pclog("Trident linear framebuffer at %08X - size %06X\n", tvga->linear_base, tvga->linear_size);
|
||||||
mem_mapping_enable(&tvga->accel_mapping);
|
mem_mapping_enable(&tvga->accel_mapping);
|
||||||
|
|
@ -378,6 +383,68 @@ void tvga_hwcursor_draw(svga_t *svga, int displine)
|
||||||
svga->hwcursor_latch.addr += 8;
|
svga->hwcursor_latch.addr += 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t tvga_pci_read(int func, int addr, void *p)
|
||||||
|
{
|
||||||
|
tvga_t *tvga = (tvga_t *)p;
|
||||||
|
svga_t *svga = &tvga->svga;
|
||||||
|
|
||||||
|
// pclog("Trident PCI read %08X\n", addr);
|
||||||
|
|
||||||
|
switch (addr)
|
||||||
|
{
|
||||||
|
case 0x00: return 0x23; /*Trident*/
|
||||||
|
case 0x01: return 0x10;
|
||||||
|
|
||||||
|
case 0x02: return 0x40; /*TGUI9440 (9682)*/
|
||||||
|
case 0x03: return 0x94;
|
||||||
|
|
||||||
|
case 0x04: return 0x03; /*Respond to IO and memory accesses*/
|
||||||
|
|
||||||
|
case 0x07: return 1 << 1; /*Medium DEVSEL timing*/
|
||||||
|
|
||||||
|
case 0x08: return 0; /*Revision ID*/
|
||||||
|
case 0x09: return 0; /*Programming interface*/
|
||||||
|
|
||||||
|
case 0x0a: return 0x01; /*Supports VGA interface, XGA compatible*/
|
||||||
|
case 0x0b: return 0x03;
|
||||||
|
|
||||||
|
case 0x10: return 0x00; /*Linear frame buffer address*/
|
||||||
|
case 0x11: return 0x00;
|
||||||
|
case 0x12: return tvga->linear_base >> 16;
|
||||||
|
case 0x13: return tvga->linear_base >> 24;
|
||||||
|
|
||||||
|
case 0x30: return 0x01; /*BIOS ROM address*/
|
||||||
|
case 0x31: return 0x00;
|
||||||
|
case 0x32: return 0x0C;
|
||||||
|
case 0x33: return 0x00;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tvga_pci_write(int func, int addr, uint8_t val, void *p)
|
||||||
|
{
|
||||||
|
tvga_t *tvga = (tvga_t *)p;
|
||||||
|
svga_t *svga = &tvga->svga;
|
||||||
|
|
||||||
|
// pclog("Trident PCI write %08X %02X\n", addr, val);
|
||||||
|
|
||||||
|
switch (addr)
|
||||||
|
{
|
||||||
|
case 0x12:
|
||||||
|
tvga->linear_base = (tvga->linear_base & 0xff000000) | ((val & 0xe0) << 16);
|
||||||
|
tvga->linear_size = 2 << 20;
|
||||||
|
svga->crtc[0x21] = (svga->crtc[0x21] & ~0xf) | (val >> 4);
|
||||||
|
tvga_recalcmapping(tvga);
|
||||||
|
break;
|
||||||
|
case 0x13:
|
||||||
|
tvga->linear_base = (tvga->linear_base & 0xe00000) | (val << 24);
|
||||||
|
tvga->linear_size = 2 << 20;
|
||||||
|
svga->crtc[0x21] = (svga->crtc[0x21] & ~0xc0) | (val >> 6);
|
||||||
|
tvga_recalcmapping(tvga);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void *tvga8900d_init()
|
void *tvga8900d_init()
|
||||||
{
|
{
|
||||||
tvga_t *tvga = malloc(sizeof(tvga_t));
|
tvga_t *tvga = malloc(sizeof(tvga_t));
|
||||||
|
|
@ -413,6 +480,8 @@ void *tgui9440_init()
|
||||||
|
|
||||||
io_sethandler(0x03c0, 0x0020, tvga_in, NULL, NULL, tvga_out, NULL, NULL, tvga);
|
io_sethandler(0x03c0, 0x0020, tvga_in, NULL, NULL, tvga_out, NULL, NULL, tvga);
|
||||||
|
|
||||||
|
pci_add(tvga_pci_read, tvga_pci_write, tvga);
|
||||||
|
|
||||||
return tvga;
|
return tvga;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue