PCem

changeset 136:cba58d4def81

Improved Trident TVGA CRTC emulation, Windows NT no longer detects as ET4000.
author TomW
date Sun Jul 27 14:41:18 2014 +0100
parents abd5259486c3
children 6f30fb98b7f2
files src/vid_tvga.c
diffstat 1 files changed, 20 insertions(+), 0 deletions(-) [+]
line diff
     1.1 --- a/src/vid_tvga.c	Thu Jul 24 21:30:17 2014 +0100
     1.2 +++ b/src/vid_tvga.c	Sun Jul 27 14:41:18 2014 +0100
     1.3 @@ -30,6 +30,18 @@
     1.4          uint32_t vram_mask;
     1.5  } tvga_t;
     1.6  
     1.7 +static uint8_t crtc_mask[0x40] =
     1.8 +{
     1.9 +        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    1.10 +        0x7f, 0xff, 0x3f, 0x7f, 0xff, 0xff, 0xff, 0xff,
    1.11 +        0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xef,
    1.12 +        0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
    1.13 +        0x7f, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x03,
    1.14 +        0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1.15 +        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    1.16 +        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    1.17 +};
    1.18 +
    1.19  void tvga_out(uint16_t addr, uint8_t val, void *p)
    1.20  {
    1.21          tvga_t *tvga = (tvga_t *)p;
    1.22 @@ -100,6 +112,7 @@
    1.23                  case 0x3D5:
    1.24                  if (svga->crtcreg <= 7 && svga->crtc[0x11] & 0x80) return;
    1.25                  old = svga->crtc[svga->crtcreg];
    1.26 +                val &= crtc_mask[svga->crtcreg];
    1.27                  svga->crtc[svga->crtcreg] = val;
    1.28  //                if (svga->crtcreg != 0xC && svga->crtcreg != 0xE && svga->crtcreg != 0xF) pclog("CRTC R%02X = %02X %04X:%04X\n", svga->crtcreg, val, CS, pc);
    1.29                  if (old != val)
    1.30 @@ -170,12 +183,19 @@
    1.31                          if (tvga->oldmode) return tvga->oldctrl2;
    1.32                          return tvga->newctrl2;
    1.33                  }
    1.34 +                if ((svga->seqaddr & 0xf) == 0xe)
    1.35 +                {
    1.36 +                        if (tvga->oldmode) 
    1.37 +                                return tvga->oldctrl1; 
    1.38 +                }
    1.39                  break;
    1.40                  case 0x3C6: case 0x3C7: case 0x3C8: case 0x3C9:
    1.41                  return tkd8001_ramdac_in(addr, &tvga->ramdac, svga);
    1.42                  case 0x3D4:
    1.43                  return svga->crtcreg;
    1.44                  case 0x3D5:
    1.45 +                if (svga->crtcreg > 0x18 && svga->crtcreg < 0x1e)
    1.46 +                        return 0xff;
    1.47                  return svga->crtc[svga->crtcreg];
    1.48                  case 0x3d8:
    1.49  		return tvga->tvga_3d8;