Reworked HT216-32 banking code. Fixes graphics errors in Windows 3.x.
This commit is contained in:
parent
3fd56facb6
commit
d49aab7782
1 changed files with 21 additions and 18 deletions
|
|
@ -78,6 +78,8 @@ void ht216_out(uint16_t addr, uint8_t val, void *p)
|
||||||
case 0x3c2:
|
case 0x3c2:
|
||||||
ht216->clk_sel = (ht216->clk_sel & ~3) | ((val & 0x0c) >> 2);
|
ht216->clk_sel = (ht216->clk_sel & ~3) | ((val & 0x0c) >> 2);
|
||||||
ht216->misc = val;
|
ht216->misc = val;
|
||||||
|
ht216->read_bank_reg[0] = (ht216->read_bank_reg[0] & ~0x20) | ((val & HT_MISC_PAGE_SEL) ? 0x20 : 0);
|
||||||
|
ht216->write_bank_reg[0] = (ht216->write_bank_reg[0] & ~0x20) | ((val & HT_MISC_PAGE_SEL) ? 0x20 : 0);
|
||||||
ht216_remap(ht216);
|
ht216_remap(ht216);
|
||||||
svga_recalctimings(&ht216->svga);
|
svga_recalctimings(&ht216->svga);
|
||||||
break;
|
break;
|
||||||
|
|
@ -145,6 +147,12 @@ void ht216_out(uint16_t addr, uint8_t val, void *p)
|
||||||
break;
|
break;
|
||||||
case 0xf6:
|
case 0xf6:
|
||||||
svga->vram_display_mask = (val & 0x40) ? ht216->vram_mask : 0x3ffff;
|
svga->vram_display_mask = (val & 0x40) ? ht216->vram_mask : 0x3ffff;
|
||||||
|
ht216->read_bank_reg[0] = (ht216->read_bank_reg[0] & ~0xc0) | ((val & 0xc) << 4);
|
||||||
|
ht216->write_bank_reg[0] = (ht216->write_bank_reg[0] & ~0xc0) | ((val & 0x3) << 6);
|
||||||
|
break;
|
||||||
|
case 0xf9:
|
||||||
|
ht216->read_bank_reg[0] = (ht216->read_bank_reg[0] & ~0x10) | ((val & 1) ? 0x10 : 0);
|
||||||
|
ht216->write_bank_reg[0] = (ht216->write_bank_reg[0] & ~0x10) | ((val & 1) ? 0x10 : 0);
|
||||||
break;
|
break;
|
||||||
case 0xff:
|
case 0xff:
|
||||||
svga->hwcursor.addr = ((ht216->ht_regs[0x94] << 6) | (3 << 14) | ((val & 0x60) << 11)) << 2;
|
svga->hwcursor.addr = ((ht216->ht_regs[0x94] << 6) | (3 << 14) | ((val & 0x60) << 11)) << 2;
|
||||||
|
|
@ -296,29 +304,24 @@ void ht216_remap(ht216_t *ht216)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
uint32_t read_offset = (ht216->ht_regs[0xf6] & 0xc) << 16;
|
uint8_t read_bank_reg[2] = {ht216->read_bank_reg[0], ht216->read_bank_reg[1]};
|
||||||
uint32_t write_offset = (ht216->ht_regs[0xf6] & 0x3) << 18;
|
uint8_t write_bank_reg[2] = {ht216->write_bank_reg[0], ht216->write_bank_reg[1]};
|
||||||
|
|
||||||
if (svga->chain4 && (ht216->ht_regs[0xfc] & HT_REG_FC_ECOLRE))
|
if (!svga->chain4 || !(ht216->ht_regs[0xfc] & HT_REG_FC_ECOLRE))
|
||||||
{
|
{
|
||||||
if (ht216->misc & HT_MISC_PAGE_SEL)
|
read_bank_reg[0] &= ~0x30;
|
||||||
{
|
read_bank_reg[1] &= ~0x30;
|
||||||
read_offset |= (1 << 17);
|
write_bank_reg[0] &= ~0x30;
|
||||||
write_offset |= (1 << 17);
|
write_bank_reg[1] &= ~0x30;
|
||||||
}
|
|
||||||
if (ht216->ht_regs[0xf9] & HT_REG_F9_XPSEL)
|
|
||||||
{
|
|
||||||
read_offset |= (1 << 16);
|
|
||||||
write_offset |= (1 << 16);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ht216->read_bank[0] = read_offset + (ht216->read_bank_reg[0] << 12);
|
|
||||||
ht216->write_bank[0] = write_offset + (ht216->write_bank_reg[0] << 12);
|
ht216->read_bank[0] = read_bank_reg[0] << 12;
|
||||||
|
ht216->write_bank[0] = write_bank_reg[0] << 12;
|
||||||
if (ht216->ht_regs[0xe0] & HT_REG_E0_SBAE)
|
if (ht216->ht_regs[0xe0] & HT_REG_E0_SBAE)
|
||||||
{
|
{
|
||||||
/*Split bank*/
|
/*Split bank*/
|
||||||
ht216->read_bank[1] = read_offset + (ht216->read_bank_reg[1] << 12);
|
ht216->read_bank[1] = read_bank_reg[1] << 12;
|
||||||
ht216->write_bank[1] = write_offset + (ht216->write_bank_reg[1] << 12);
|
ht216->write_bank[1] = write_bank_reg[1] << 12;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -334,7 +337,7 @@ void ht216_remap(ht216_t *ht216)
|
||||||
ht216->write_bank[1] >>= 2;
|
ht216->write_bank[1] >>= 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// pclog("Remap - chain4=%i gdc[6]=%02x read[0]=%05X write[0]=%05X read[1]=%05X write[1]=%05X\n", svga->chain4, svga->gdcreg[6], ht216->read_bank[0], ht216->write_bank[0], ht216->read_bank[1], ht216->write_bank[1]);
|
// pclog("Remap - chain4=%i [e0]=%02x [e8]=%02x [e9]=%02x [f6]=%02x [fc]=%02x [f9]=%02x misc=%02x gdc[6]=%02x read[0]=%05X write[0]=%05X read[1]=%05X write[1]=%05X\n", svga->chain4, ht216->ht_regs[0xe0], ht216->ht_regs[0xe8], ht216->ht_regs[0xe9], ht216->ht_regs[0xf6], ht216->ht_regs[0xfc], ht216->ht_regs[0xf9], ht216->misc, svga->gdcreg[6], ht216->read_bank[0], ht216->write_bank[0], ht216->read_bank[1], ht216->write_bank[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ht216_recalctimings(svga_t *svga)
|
void ht216_recalctimings(svga_t *svga)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue