# HG changeset patch # User TomW # Date 1406575976 -3600 # Node ID 6f30fb98b7f29db8deff8c74b561fb272802b15e # Parent cba58d4def8120c182d525360d9f1168baba4c75 Improved ET4000 CRTC emulation, Windows NT no longer misdetects ET4000/W32 or hangs. diff -r cba58d4def81 -r 6f30fb98b7f2 src/vid_et4000.c --- a/src/vid_et4000.c Sun Jul 27 14:41:18 2014 +0100 +++ b/src/vid_et4000.c Mon Jul 28 20:32:56 2014 +0100 @@ -21,6 +21,18 @@ uint8_t banking; } et4000_t; +static uint8_t crtc_mask[0x40] = +{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + void et4000_out(uint16_t addr, uint8_t val, void *p) { et4000_t *et4000 = (et4000_t *)p; @@ -32,7 +44,7 @@ addr ^= 0x60; // pclog("ET4000 out %04X %02X\n", addr, val); - + switch (addr) { case 0x3C6: case 0x3C7: case 0x3C8: case 0x3C9: @@ -51,6 +63,7 @@ case 0x3D5: if (svga->crtcreg <= 7 && svga->crtc[0x11] & 0x80) return; old = svga->crtc[svga->crtcreg]; + val &= crtc_mask[svga->crtcreg]; svga->crtc[svga->crtcreg] = val; if (old != val) {