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