# HG changeset patch # User TomW # Date 1406578453 -3600 # Node ID 528f6c46c324acd73cc15b19ec0a2b42d6323799 # Parent 6f30fb98b7f29db8deff8c74b561fb272802b15e Tweaked ET4000/W32p blitter, no longer hangs in Windows NT. diff -r 6f30fb98b7f2 -r 528f6c46c324 src/vid_et4000w32.c --- a/src/vid_et4000w32.c Mon Jul 28 20:32:56 2014 +0100 +++ b/src/vid_et4000w32.c Mon Jul 28 21:14:13 2014 +0100 @@ -351,6 +351,7 @@ svga_t *svga = &et4000->svga; int bank; // pclog("ET4K write %08X %02X %02X %04X(%08X):%08X\n",addr,val,et4000->acl.status,et4000->acl.internal.ctrl_routing,CS,cs,pc); + et4000->acl.status |= ACL_RDST; switch (addr & 0x6000) { case 0x0000: /*MMU 0*/ @@ -499,9 +500,10 @@ case 0x7f13: return et4000->mmu.ctrl; case 0x7f36: -// pclog("Read ACL status %02X\n",et4000->acl.status); + temp = et4000->acl.status; + et4000->acl.status &= ~ACL_RDST; // if (et4000->acl.internal.pos_x!=et4000->acl.internal.count_x || et4000->acl.internal.pos_y!=et4000->acl.internal.count_y) return et4000->acl.status | ACL_XYST; - return et4000->acl.status; + return temp; case 0x7f80: return et4000->acl.internal.pattern_addr; case 0x7f81: return et4000->acl.internal.pattern_addr >> 8; case 0x7f82: return et4000->acl.internal.pattern_addr >> 16; @@ -559,7 +561,7 @@ et4000->acl.dest_back = et4000->acl.dest_addr; et4000->acl.internal.pos_x = et4000->acl.internal.pos_y = 0; et4000->acl.pattern_x = et4000->acl.source_x = et4000->acl.pattern_y = et4000->acl.source_y = 0; - et4000->acl.status = ACL_XYST; + et4000->acl.status |= ACL_XYST; if ((!(et4000->acl.internal.ctrl_routing & 7) || (et4000->acl.internal.ctrl_routing & 4)) && !(et4000->acl.internal.ctrl_routing & 0x40)) et4000->acl.status |= ACL_SSO; @@ -782,7 +784,7 @@ if (et4000->acl.internal.pos_x > et4000->acl.internal.count_x || et4000->acl.internal.pos_y > et4000->acl.internal.count_y) { - et4000->acl.status = 0; + et4000->acl.status &= ~(ACL_XYST | ACL_SSO); // pclog("Blit line over\n"); return; } @@ -865,7 +867,7 @@ et4000->acl.internal.pos_x = 0; if (et4000->acl.internal.pos_y > et4000->acl.internal.count_y) { - et4000->acl.status = 0; + et4000->acl.status &= ~(ACL_XYST | ACL_SSO); // pclog("Blit over\n"); return; }