Merge pull request #1778 from 86Box/tc1995

Video changes (ET4000W32/i):
This commit is contained in:
Miran Grča
2021-11-04 17:22:35 +01:00
committed by GitHub
2 changed files with 42 additions and 21 deletions

View File

@@ -169,7 +169,7 @@ et4000w32p_out(uint16_t addr, uint8_t val, void *p)
uint32_t add2addr = 0; uint32_t add2addr = 0;
if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1)) if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1))
addr ^= 0x60; addr ^= 0x60;
switch (addr) { switch (addr) {
case 0x3c2: case 0x3c2:
@@ -311,7 +311,7 @@ et4000w32p_in(uint16_t addr, void *p)
svga_t *svga = &et4000->svga; svga_t *svga = &et4000->svga;
if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1)) if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1))
addr ^= 0x60; addr ^= 0x60;
switch (addr) { switch (addr) {
case 0x3c5: case 0x3c5:
@@ -335,13 +335,25 @@ et4000w32p_in(uint16_t addr, void *p)
case 0x3d5: case 0x3d5:
return svga->crtc[svga->crtcreg]; return svga->crtc[svga->crtcreg];
case 0x3da:
svga->attrff = 0;
/*Bit 1 of the Input Status Register is required by OS/2 ET4000W32/I drivers to be set otherwise
the guest will loop infinitely upon reaching the GUI*/
if (svga->cgastat & 0x01)
svga->cgastat &= ~0x32;
else
svga->cgastat ^= 0x32;
return svga->cgastat;
case 0x210a: case 0x211a: case 0x212a: case 0x213a: case 0x210a: case 0x211a: case 0x212a: case 0x213a:
case 0x214a: case 0x215a: case 0x216a: case 0x217a: case 0x214a: case 0x215a: case 0x216a: case 0x217a:
return et4000->index; return et4000->index;
case 0x210B: case 0x211B: case 0x212B: case 0x213B: case 0x210B: case 0x211B: case 0x212B: case 0x213B:
case 0x214B: case 0x215B: case 0x216B: case 0x217B: case 0x214B: case 0x215B: case 0x216B: case 0x217B:
if (et4000->index == 0xec) if (et4000->index == 0xec) {
return (et4000->regs[0xec] & 0xf) | (et4000->rev << 4); return (et4000->regs[0xec] & 0xf) | (et4000->rev << 4);
}
if (et4000->index == 0xee) { if (et4000->index == 0xee) {
if (svga->bpp == 8) { if (svga->bpp == 8) {
if ((svga->gdcreg[5] & 0x60) >= 0x40) if ((svga->gdcreg[5] & 0x60) >= 0x40)
@@ -889,7 +901,10 @@ et4000w32_blit_start(et4000w32p_t *et4000)
} }
et4000->acl.pattern_back = et4000->acl.pattern_addr; et4000->acl.pattern_back = et4000->acl.pattern_addr;
if (!(et4000->acl.internal.pattern_wrap & 0x40)) { if (!(et4000->acl.internal.pattern_wrap & 0x40)) {
et4000->acl.pattern_y = (et4000->acl.pattern_addr / (et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.pattern_wrap >> 4) & 7] - 1); if ((et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1) == 0x00)
et4000->acl.pattern_y = (et4000->acl.pattern_addr / (0x7f + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.pattern_wrap >> 4) & 7] - 1);
else
et4000->acl.pattern_y = (et4000->acl.pattern_addr / (et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.pattern_wrap >> 4) & 7] - 1);
et4000->acl.pattern_back &= ~(((et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1) * et4000w32_wrap_y[(et4000->acl.internal.pattern_wrap >> 4) & 7]) - 1); et4000->acl.pattern_back &= ~(((et4000w32_wrap_x[et4000->acl.internal.pattern_wrap & 7] + 1) * et4000w32_wrap_y[(et4000->acl.internal.pattern_wrap >> 4) & 7]) - 1);
} }
et4000->acl.pattern_x_back = et4000->acl.pattern_x; et4000->acl.pattern_x_back = et4000->acl.pattern_x;
@@ -902,7 +917,10 @@ et4000w32_blit_start(et4000w32p_t *et4000)
et4000->acl.source_back = et4000->acl.source_addr; et4000->acl.source_back = et4000->acl.source_addr;
if (!(et4000->acl.internal.source_wrap & 0x40)) { if (!(et4000->acl.internal.source_wrap & 0x40)) {
et4000->acl.source_y = (et4000->acl.source_addr / (et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.source_wrap >> 4) & 7] - 1); if ((et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1) == 0x00)
et4000->acl.source_y = (et4000->acl.source_addr / (0x7f + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.source_wrap >> 4) & 7] - 1);
else
et4000->acl.source_y = (et4000->acl.source_addr / (et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1)) & (et4000w32_wrap_y[(et4000->acl.internal.source_wrap >> 4) & 7] - 1);
et4000->acl.source_back &= ~(((et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1) * et4000w32_wrap_y[(et4000->acl.internal.source_wrap >> 4) & 7]) - 1); et4000->acl.source_back &= ~(((et4000w32_wrap_x[et4000->acl.internal.source_wrap & 7] + 1) * et4000w32_wrap_y[(et4000->acl.internal.source_wrap >> 4) & 7]) - 1);
} }
et4000->acl.source_x_back = et4000->acl.source_x; et4000->acl.source_x_back = et4000->acl.source_x;
@@ -1655,7 +1673,7 @@ static const device_config_t et4000w32p_config[] =
const device_t et4000w32_device = const device_t et4000w32_device =
{ {
"Tseng Labs ET4000/w32", "Tseng Labs ET4000/w32 ISA",
DEVICE_ISA | DEVICE_AT, ET4000W32, DEVICE_ISA | DEVICE_AT, ET4000W32,
et4000w32p_init, et4000w32p_close, NULL, et4000w32p_init, et4000w32p_close, NULL,
{ et4000w32_available }, { et4000w32_available },
@@ -1666,7 +1684,7 @@ const device_t et4000w32_device =
const device_t et4000w32_onboard_device = const device_t et4000w32_onboard_device =
{ {
"Tseng Labs ET4000/w32 (On-board)", "Tseng Labs ET4000/w32 (ISA) (On-Board)",
DEVICE_ISA | DEVICE_AT, ET4000W32, DEVICE_ISA | DEVICE_AT, ET4000W32,
et4000w32p_init, et4000w32p_close, NULL, et4000w32p_init, et4000w32p_close, NULL,
{ et4000w32_available }, { et4000w32_available },
@@ -1677,7 +1695,7 @@ const device_t et4000w32_onboard_device =
const device_t et4000w32i_isa_device = const device_t et4000w32i_isa_device =
{ {
"Tseng Labs ET4000/w32i ISA", "Tseng Labs ET4000/w32i Rev. B ISA",
DEVICE_ISA | DEVICE_AT, ET4000W32I, DEVICE_ISA | DEVICE_AT, ET4000W32I,
et4000w32p_init, et4000w32p_close, NULL, et4000w32p_init, et4000w32p_close, NULL,
{ et4000w32i_isa_available }, { et4000w32i_isa_available },
@@ -1688,7 +1706,7 @@ const device_t et4000w32i_isa_device =
const device_t et4000w32i_vlb_device = const device_t et4000w32i_vlb_device =
{ {
"Tseng Labs ET4000/w32i VLB", "Tseng Labs ET4000/w32i Rev. B VLB",
DEVICE_VLB, ET4000W32I, DEVICE_VLB, ET4000W32I,
et4000w32p_init, et4000w32p_close, NULL, et4000w32p_init, et4000w32p_close, NULL,
{ et4000w32i_vlb_available }, { et4000w32i_vlb_available },
@@ -1721,7 +1739,7 @@ const device_t et4000w32p_revc_pci_device =
const device_t et4000w32p_noncardex_vlb_device = const device_t et4000w32p_noncardex_vlb_device =
{ {
"Tseng Labs ET4000/w32p VLB", "Tseng Labs ET4000/w32p Rev. D VLB",
DEVICE_VLB, ET4000W32P, DEVICE_VLB, ET4000W32P,
et4000w32p_init, et4000w32p_close, NULL, et4000w32p_init, et4000w32p_close, NULL,
{ et4000w32p_noncardex_available }, { et4000w32p_noncardex_available },
@@ -1732,7 +1750,7 @@ const device_t et4000w32p_noncardex_vlb_device =
const device_t et4000w32p_noncardex_pci_device = const device_t et4000w32p_noncardex_pci_device =
{ {
"Tseng Labs ET4000/w32p PCI", "Tseng Labs ET4000/w32p Rev. D PCI",
DEVICE_PCI, ET4000W32P, DEVICE_PCI, ET4000W32P,
et4000w32p_init, et4000w32p_close, NULL, et4000w32p_init, et4000w32p_close, NULL,
{ et4000w32p_noncardex_available }, { et4000w32p_noncardex_available },
@@ -1743,7 +1761,7 @@ const device_t et4000w32p_noncardex_pci_device =
const device_t et4000w32p_cardex_vlb_device = const device_t et4000w32p_cardex_vlb_device =
{ {
"Tseng Labs ET4000/w32p VLB (Cardex)", "Tseng Labs ET4000/w32p Rev. D VLB (Cardex)",
DEVICE_VLB, ET4000W32P_CARDEX, DEVICE_VLB, ET4000W32P_CARDEX,
et4000w32p_init, et4000w32p_close, NULL, et4000w32p_init, et4000w32p_close, NULL,
{ et4000w32p_cardex_available }, { et4000w32p_cardex_available },
@@ -1754,7 +1772,7 @@ const device_t et4000w32p_cardex_vlb_device =
const device_t et4000w32p_cardex_pci_device = const device_t et4000w32p_cardex_pci_device =
{ {
"Tseng Labs ET4000/w32p PCI (Cardex)", "Tseng Labs ET4000/w32p Rev. D PCI (Cardex)",
DEVICE_PCI, ET4000W32P_CARDEX, DEVICE_PCI, ET4000W32P_CARDEX,
et4000w32p_init, et4000w32p_close, NULL, et4000w32p_init, et4000w32p_close, NULL,
{ et4000w32p_cardex_available }, { et4000w32p_cardex_available },
@@ -1765,7 +1783,7 @@ const device_t et4000w32p_cardex_pci_device =
const device_t et4000w32p_vlb_device = const device_t et4000w32p_vlb_device =
{ {
"Tseng Labs ET4000/w32p VLB (Diamond)", "Tseng Labs ET4000/w32p Rev. D VLB (Diamond Stealth32)",
DEVICE_VLB, ET4000W32P_DIAMOND, DEVICE_VLB, ET4000W32P_DIAMOND,
et4000w32p_init, et4000w32p_close, NULL, et4000w32p_init, et4000w32p_close, NULL,
{ et4000w32p_available }, { et4000w32p_available },
@@ -1776,7 +1794,7 @@ const device_t et4000w32p_vlb_device =
const device_t et4000w32p_pci_device = const device_t et4000w32p_pci_device =
{ {
"Tseng Labs ET4000/w32p PCI (Diamond)", "Tseng Labs ET4000/w32p Rev. D PCI (Diamond Stealth32)",
DEVICE_PCI, ET4000W32P_DIAMOND, DEVICE_PCI, ET4000W32P_DIAMOND,
et4000w32p_init, et4000w32p_close, NULL, et4000w32p_init, et4000w32p_close, NULL,
{ et4000w32p_available }, { et4000w32p_available },

View File

@@ -231,7 +231,7 @@ uint8_t paradise_in(uint16_t addr, void *p)
case 0x3cf: case 0x3cf:
if (svga->gdcaddr >= 9 && svga->gdcaddr <= 0x0e) { if (svga->gdcaddr >= 9 && svga->gdcaddr <= 0x0e) {
if ((paradise->pr5 & 7) != 5) if (paradise->pr5 & 0x10)
return 0xff; return 0xff;
} }
switch (svga->gdcaddr) { switch (svga->gdcaddr) {
@@ -354,8 +354,11 @@ void paradise_recalctimings(svga_t *svga)
} }
if (paradise->type < WD90C30) { if (paradise->type < WD90C30) {
if (svga->bpp >= 8 && !svga->lowres) if (svga->bpp >= 8 && !svga->lowres) {
if ((svga->crtc[0x17] == 0xc2) && (svga->crtc[0x14] & 0x40))
paradise->check = 1;
svga->render = svga_render_8bpp_highres; svga->render = svga_render_8bpp_highres;
}
} else { } else {
if (svga->bpp >= 8 && !svga->lowres) { if (svga->bpp >= 8 && !svga->lowres) {
if (svga->bpp == 16) { if (svga->bpp == 16) {