PCem
changeset 23:1b2b9acf61eb
Added PCI registers for Trident TGUI9440.
| author | TomW |
|---|---|
| date | Sat Oct 19 20:30:52 2013 +0100 |
| parents | 16c3167038d7 |
| children | 4661055656f1 |
| files | src/ibm.h src/vid_tvga.c |
| diffstat | 2 files changed, 74 insertions(+), 5 deletions(-) [+] |
line diff
1.1 --- a/src/ibm.h Sat Oct 19 17:06:55 2013 +0100 1.2 +++ b/src/ibm.h Sat Oct 19 20:30:52 2013 +0100 1.3 @@ -287,7 +287,7 @@ 1.4 #define ET4000 (gfxcard==GFX_ET4000 && VGA) 1.5 #define ET4000W32 (gfxcard==GFX_ET4000W32 && VGA) 1.6 #define AT (romset>=ROM_IBMAT) 1.7 -#define PCI (romset == ROM_PCI486) 1.8 +#define PCI (romset >= ROM_PCI486) 1.9 1.10 #define AMIBIOS (romset==ROM_AMI386 || romset==ROM_AMI486 || romset == ROM_WIN486) 1.11
2.1 --- a/src/vid_tvga.c Sat Oct 19 17:06:55 2013 +0100 2.2 +++ b/src/vid_tvga.c Sat Oct 19 20:30:52 2013 +0100 2.3 @@ -69,7 +69,7 @@ 2.4 2.5 uint8_t old; 2.6 2.7 -// pclog("tvga_out : %04X %02X %04X:%04X %i\n", addr, val, CS,pc, bpp); 2.8 +// pclog("tvga_out : %04X %02X %04X:%04X %i\n", addr, val, CS,pc, svga->bpp); 2.9 if (((addr&0xFFF0) == 0x3D0 || (addr&0xFFF0) == 0x3B0) && !(svga->miscout & 1)) addr ^= 0x60; 2.10 2.11 switch (addr) 2.12 @@ -151,7 +151,14 @@ 2.13 { 2.14 case 0x21: 2.15 if (old != val) 2.16 - tvga_recalcmapping(tvga); 2.17 + { 2.18 + if (!PCI) 2.19 + { 2.20 + tvga->linear_base = ((val & 0xf) | ((val >> 2) & 0x30)) << 20; 2.21 + tvga->linear_size = (val & 0x10) ? 0x200000 : 0x100000; 2.22 + } 2.23 + tvga_recalcmapping(tvga); 2.24 + } 2.25 break; 2.26 2.27 2.28 @@ -322,8 +329,6 @@ 2.29 if (svga->crtc[0x21] & 0x20) 2.30 { 2.31 mem_mapping_disable(&svga->mapping); 2.32 - tvga->linear_base = ((svga->crtc[0x21] & 0xf) | ((svga->crtc[0x21] >> 2) & 0x30)) << 20; 2.33 - tvga->linear_size = (svga->crtc[0x21] & 0x10) ? 0x200000 : 0x100000; 2.34 mem_mapping_set_addr(&tvga->linear_mapping, tvga->linear_base, tvga->linear_size); 2.35 // pclog("Trident linear framebuffer at %08X - size %06X\n", tvga->linear_base, tvga->linear_size); 2.36 mem_mapping_enable(&tvga->accel_mapping); 2.37 @@ -378,6 +383,68 @@ 2.38 svga->hwcursor_latch.addr += 8; 2.39 } 2.40 2.41 +uint8_t tvga_pci_read(int func, int addr, void *p) 2.42 +{ 2.43 + tvga_t *tvga = (tvga_t *)p; 2.44 + svga_t *svga = &tvga->svga; 2.45 + 2.46 +// pclog("Trident PCI read %08X\n", addr); 2.47 + 2.48 + switch (addr) 2.49 + { 2.50 + case 0x00: return 0x23; /*Trident*/ 2.51 + case 0x01: return 0x10; 2.52 + 2.53 + case 0x02: return 0x40; /*TGUI9440 (9682)*/ 2.54 + case 0x03: return 0x94; 2.55 + 2.56 + case 0x04: return 0x03; /*Respond to IO and memory accesses*/ 2.57 + 2.58 + case 0x07: return 1 << 1; /*Medium DEVSEL timing*/ 2.59 + 2.60 + case 0x08: return 0; /*Revision ID*/ 2.61 + case 0x09: return 0; /*Programming interface*/ 2.62 + 2.63 + case 0x0a: return 0x01; /*Supports VGA interface, XGA compatible*/ 2.64 + case 0x0b: return 0x03; 2.65 + 2.66 + case 0x10: return 0x00; /*Linear frame buffer address*/ 2.67 + case 0x11: return 0x00; 2.68 + case 0x12: return tvga->linear_base >> 16; 2.69 + case 0x13: return tvga->linear_base >> 24; 2.70 + 2.71 + case 0x30: return 0x01; /*BIOS ROM address*/ 2.72 + case 0x31: return 0x00; 2.73 + case 0x32: return 0x0C; 2.74 + case 0x33: return 0x00; 2.75 + } 2.76 + return 0; 2.77 +} 2.78 + 2.79 +void tvga_pci_write(int func, int addr, uint8_t val, void *p) 2.80 +{ 2.81 + tvga_t *tvga = (tvga_t *)p; 2.82 + svga_t *svga = &tvga->svga; 2.83 + 2.84 +// pclog("Trident PCI write %08X %02X\n", addr, val); 2.85 + 2.86 + switch (addr) 2.87 + { 2.88 + case 0x12: 2.89 + tvga->linear_base = (tvga->linear_base & 0xff000000) | ((val & 0xe0) << 16); 2.90 + tvga->linear_size = 2 << 20; 2.91 + svga->crtc[0x21] = (svga->crtc[0x21] & ~0xf) | (val >> 4); 2.92 + tvga_recalcmapping(tvga); 2.93 + break; 2.94 + case 0x13: 2.95 + tvga->linear_base = (tvga->linear_base & 0xe00000) | (val << 24); 2.96 + tvga->linear_size = 2 << 20; 2.97 + svga->crtc[0x21] = (svga->crtc[0x21] & ~0xc0) | (val >> 6); 2.98 + tvga_recalcmapping(tvga); 2.99 + break; 2.100 + } 2.101 +} 2.102 + 2.103 void *tvga8900d_init() 2.104 { 2.105 tvga_t *tvga = malloc(sizeof(tvga_t)); 2.106 @@ -413,6 +480,8 @@ 2.107 2.108 io_sethandler(0x03c0, 0x0020, tvga_in, NULL, NULL, tvga_out, NULL, NULL, tvga); 2.109 2.110 + pci_add(tvga_pci_read, tvga_pci_write, tvga); 2.111 + 2.112 return tvga; 2.113 } 2.114
