Proper masking of VIA IDE registers

This commit is contained in:
RichardG867
2020-10-14 16:33:30 -03:00
parent 8e6a52dd32
commit d876534e63

View File

@@ -170,8 +170,8 @@ pipc_reset_hard(void *priv)
dev->ide_regs[0x34] = 0xc0;
dev->ide_regs[0x3c] = 0x0e;
if (dev->local < VIA_PIPC_686A)
dev->ide_regs[0x40] = 0x08;
if (dev->local <= VIA_PIPC_586B)
dev->ide_regs[0x40] = 0x04;
dev->ide_regs[0x41] = 0x02;
dev->ide_regs[0x42] = 0x09;
dev->ide_regs[0x43] = (dev->local >= VIA_PIPC_686A) ? 0x0a : 0x3a;
@@ -426,7 +426,7 @@ pipc_read(int func, int addr, void *priv)
else if ((func <= (pm_func + 2)) && !(dev->pci_isa_regs[0x85] & ((func == (pm_func + 1)) ? 0x04 : 0x08))) /* AC97 / MC97 */
ret = dev->ac97_regs[func - pm_func - 1][addr];
pipc_log("PIPC: read(%d, %02X) = %02X\n", func, addr, ret);
if (func == 1) pipc_log("PIPC: read(%d, %02X) = %02X\n", func, addr, ret);
return ret;
}
@@ -461,7 +461,7 @@ pipc_write(int func, int addr, uint8_t val, void *priv)
if (func > dev->max_func)
return;
pipc_log("PIPC: write(%d, %02X, %02X)\n", func, addr, val);
if (func == 1) pipc_log("PIPC: write(%d, %02X, %02X)\n", func, addr, val);
if (func == 0) { /* PCI-ISA bridge */
/* Read-only addresses */
@@ -656,10 +656,37 @@ pipc_write(int func, int addr, uint8_t val, void *priv)
break;
case 0x40:
dev->ide_regs[0x40] = val;
if (dev->local <= VIA_PIPC_586B) {
dev->ide_regs[0x40] = val & 0x03;
dev->ide_regs[0x40] |= 0x04;
} else
dev->ide_regs[0x40] = val & 0x0f;
pipc_ide_handlers(dev);
break;
case 0x50: case 0x52:
if (dev->local <= VIA_PIPC_586B)
dev->ide_regs[addr] = val & 0xe3;
else if (dev->local <= VIA_PIPC_596B)
dev->ide_regs[addr] = val & 0xeb;
else if (dev->local <= VIA_PIPC_686A)
dev->ide_regs[addr] = val & 0xef;
else
dev->ide_regs[addr] = val & 0xf7;
break;
case 0x51: case 0x53:
if (dev->local <= VIA_PIPC_596B)
dev->ide_regs[addr] = val & 0xe3;
else if (dev->local <= VIA_PIPC_686A)
dev->ide_regs[addr] = val & 0xe7;
else
dev->ide_regs[addr] = val & 0xf7;
break;
case 0x61: case 0x69:
dev->ide_regs[addr] = val & 0x0f;
break;
default:
dev->ide_regs[addr] = val;
break;