Reworked TVGA banking. Fixes some Windows 3.x drivers.

This commit is contained in:
TomW 2016-01-23 18:01:03 +00:00
commit 20c3415202

View file

@ -42,6 +42,7 @@ static uint8_t crtc_mask[0x40] =
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
}; };
static void tvga_recalcbanking(tvga_t *tvga);
void tvga_out(uint16_t addr, uint8_t val, void *p) void tvga_out(uint16_t addr, uint8_t val, void *p)
{ {
tvga_t *tvga = (tvga_t *)p; tvga_t *tvga = (tvga_t *)p;
@ -79,9 +80,8 @@ void tvga_out(uint16_t addr, uint8_t val, void *p)
else else
{ {
svga->seqregs[0xe] = val ^ 2; svga->seqregs[0xe] = val ^ 2;
svga->write_bank = (svga->seqregs[0xe] & 0xf) * 65536; tvga->tvga_3d8 = svga->seqregs[0xe] & 0xf;
if (!(svga->gdcreg[0xf] & 1)) tvga_recalcbanking(tvga);
svga->read_bank = svga->write_bank;
} }
return; return;
} }
@ -96,13 +96,12 @@ void tvga_out(uint16_t addr, uint8_t val, void *p)
{ {
case 0xE: case 0xE:
svga->gdcreg[0xe] = val ^ 2; svga->gdcreg[0xe] = val ^ 2;
if ((svga->gdcreg[0xf] & 1) == 1) tvga->tvga_3d9 = svga->gdcreg[0xe] & 0xf;
svga->read_bank = (svga->gdcreg[0xe] & 0xf) * 65536; tvga_recalcbanking(tvga);
break; break;
case 0xF: case 0xF:
if (val & 1) svga->read_bank = (svga->gdcreg[0xe] & 0xf) *65536; svga->gdcreg[0xf] = val;
else svga->read_bank = (svga->seqregs[0xe] & 0xf) *65536; tvga_recalcbanking(tvga);
svga->write_bank = (svga->seqregs[0xe] & 0xf) * 65536;
break; break;
} }
break; break;
@ -134,24 +133,17 @@ void tvga_out(uint16_t addr, uint8_t val, void *p)
} }
return; return;
case 0x3D8: case 0x3D8:
tvga->tvga_3d8 = val;
if (svga->gdcreg[0xf] & 4) if (svga->gdcreg[0xf] & 4)
{ {
svga->write_bank = (val & 0x1f) * 65536; tvga->tvga_3d8 = val;
// pclog("SVGAWBANK 3D8 %08X %04X:%04X\n",svgawbank,CS,pc); tvga_recalcbanking(tvga);
if (!(svga->gdcreg[0xf] & 1))
{
svga->read_bank = (val & 0x1f) * 65536;
// pclog("SVGARBANK 3D8 %08X %04X:%04X\n",svgarbank,CS,pc);
}
} }
return; return;
case 0x3D9: case 0x3D9:
tvga->tvga_3d9=val; if (svga->gdcreg[0xf] & 4)
if ((svga->gdcreg[0xf] & 5) == 5)
{ {
svga->read_bank = (val & 0x1F) * 65536; tvga->tvga_3d9 = val;
// pclog("SVGARBANK 3D9 %08X %04X:%04X\n",svgarbank,CS,pc); tvga_recalcbanking(tvga);
} }
return; return;
} }
@ -208,6 +200,20 @@ uint8_t tvga_in(uint16_t addr, void *p)
return svga_in(addr, svga); return svga_in(addr, svga);
} }
static void tvga_recalcbanking(tvga_t *tvga)
{
svga_t *svga = &tvga->svga;
svga->write_bank = (tvga->tvga_3d8 & 0x1f) * 65536;
if (svga->gdcreg[0xf] & 1)
svga->read_bank = (tvga->tvga_3d9 & 0x1f) * 65536;
else
svga->read_bank = svga->write_bank;
// pclog("recalcbanking: write_bank=%08x read_bank=%08x GDC[E]=%02x GDC[F]=%02x SEQ[E]=%02x 3d8=%02x 3d9=%02x\n", svga->read_bank, svga->write_bank, svga->gdcreg[0xe], svga->gdcreg[0xf], svga->seqregs[0xe], tvga->tvga_3d8, tvga->tvga_3d9);
}
void tvga_recalctimings(svga_t *svga) void tvga_recalctimings(svga_t *svga)
{ {
tvga_t *tvga = (tvga_t *)svga->p; tvga_t *tvga = (tvga_t *)svga->p;