Reworked TVGA banking. Fixes some Windows 3.x drivers.
This commit is contained in:
parent
50dfd8b7a5
commit
20c3415202
1 changed files with 26 additions and 20 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue