Fixed the Riva 128 and TNT PCI handlers.

This commit is contained in:
OBattler
2017-01-03 03:54:58 +01:00
parent 8818686ef4
commit 4a8414231b

View File

@@ -1776,9 +1776,17 @@ static void riva128_pci_write(int func, int addr, uint8_t val, void *p)
case PCI_REG_COMMAND:
riva128->pci_regs[PCI_REG_COMMAND] = val & 0x27;
io_removehandler(0x03c0, 0x0020, riva128_in, NULL, NULL, riva128_out, NULL, NULL, riva128);
mem_mapping_disable(&svga->mapping);
mem_mapping_disable(&riva128->mmio_mapping);
mem_mapping_disable(&riva128->linear_mapping);
mem_mapping_disable(&riva128->ramin_mapping);
if (val & PCI_COMMAND_IO)
{
io_sethandler(0x03c0, 0x0020, riva128_in, NULL, NULL, riva128_out, NULL, NULL, riva128);
}
if (val & PCI_COMMAND_MEM)
{
uint32_t mmio_addr = riva128->pci_regs[0x13] << 24;
uint32_t linear_addr = riva128->pci_regs[0x17] << 24;
if (!mmio_addr && !linear_addr)
@@ -1796,14 +1804,6 @@ static void riva128_pci_write(int func, int addr, uint8_t val, void *p)
svga->linear_base = linear_addr;
}
}
else
{
io_removehandler(0x03c0, 0x0020, riva128_in, NULL, NULL, riva128_out, NULL, NULL, riva128);
mem_mapping_disable(&svga->mapping);
mem_mapping_disable(&riva128->mmio_mapping);
mem_mapping_disable(&riva128->linear_mapping);
mem_mapping_disable(&riva128->ramin_mapping);
}
return;
case 0x05:
@@ -1818,14 +1818,11 @@ static void riva128_pci_write(int func, int addr, uint8_t val, void *p)
{
riva128->pci_regs[addr] = val;
uint32_t mmio_addr = riva128->pci_regs[0x13] << 24;
mem_mapping_disable(&riva128->mmio_mapping);
if (mmio_addr)
{
mem_mapping_set_addr(&riva128->mmio_mapping, mmio_addr, 0x1000000);
}
else
{
mem_mapping_disable(&riva128->mmio_mapping);
}
return;
}
@@ -1833,33 +1830,26 @@ static void riva128_pci_write(int func, int addr, uint8_t val, void *p)
{
riva128->pci_regs[addr] = val;
uint32_t linear_addr = riva128->pci_regs[0x17] << 24;
mem_mapping_disable(&riva128->linear_mapping);
mem_mapping_disable(&riva128->ramin_mapping);
if (linear_addr)
{
mem_mapping_set_addr(&riva128->linear_mapping, linear_addr, 0xc00000);
mem_mapping_set_addr(&riva128->ramin_mapping, linear_addr + 0xc00000, 0x200000);
svga->linear_base = linear_addr;
}
else
{
mem_mapping_disable(&riva128->linear_mapping);
mem_mapping_disable(&riva128->ramin_mapping);
}
return;
}
case 0x30: case 0x32: case 0x33:
riva128->pci_regs[addr] = val;
mem_mapping_disable(&riva128->bios_rom.mapping);
if (riva128->pci_regs[0x30] & 0x01)
{
uint32_t addr = (riva128->pci_regs[0x32] << 16) | (riva128->pci_regs[0x33] << 24);
// pclog("RIVA 128 bios_rom enabled at %08x\n", addr);
mem_mapping_set_addr(&riva128->bios_rom.mapping, addr, 0x8000);
}
else
{
// pclog("RIVA 128 bios_rom disabled\n");
mem_mapping_disable(&riva128->bios_rom.mapping);
}
return;
case 0x3c:
@@ -1886,9 +1876,16 @@ static void rivatnt_pci_write(int func, int addr, uint8_t val, void *p)
case PCI_REG_COMMAND:
riva128->pci_regs[PCI_REG_COMMAND] = val & 0x27;
io_removehandler(0x03c0, 0x0020, riva128_in, NULL, NULL, riva128_out, NULL, NULL, riva128);
mem_mapping_disable(&svga->mapping);
mem_mapping_disable(&riva128->mmio_mapping);
mem_mapping_disable(&riva128->linear_mapping);
if (val & PCI_COMMAND_IO)
{
io_sethandler(0x03c0, 0x0020, riva128_in, NULL, NULL, riva128_out, NULL, NULL, riva128);
}
if (val & PCI_COMMAND_MEM)
{
uint32_t mmio_addr = riva128->pci_regs[0x13] << 24;
uint32_t linear_addr = riva128->pci_regs[0x17] << 24;
if (!mmio_addr && !linear_addr)
@@ -1905,13 +1902,6 @@ static void rivatnt_pci_write(int func, int addr, uint8_t val, void *p)
svga->linear_base = linear_addr;
}
}
else
{
io_removehandler(0x03c0, 0x0020, riva128_in, NULL, NULL, riva128_out, NULL, NULL, riva128);
mem_mapping_disable(&svga->mapping);
mem_mapping_disable(&riva128->mmio_mapping);
mem_mapping_disable(&riva128->linear_mapping);
}
return;
case 0x05:
@@ -1926,14 +1916,11 @@ static void rivatnt_pci_write(int func, int addr, uint8_t val, void *p)
{
riva128->pci_regs[addr] = val;
uint32_t mmio_addr = riva128->pci_regs[0x13] << 24;
mem_mapping_disable(&riva128->mmio_mapping);
if (mmio_addr)
{
mem_mapping_set_addr(&riva128->mmio_mapping, mmio_addr, 0x1000000);
}
else
{
mem_mapping_disable(&riva128->mmio_mapping);
}
return;
}
@@ -1941,31 +1928,24 @@ static void rivatnt_pci_write(int func, int addr, uint8_t val, void *p)
{
riva128->pci_regs[addr] = val;
uint32_t linear_addr = riva128->pci_regs[0x17] << 24;
mem_mapping_disable(&riva128->linear_mapping);
if (linear_addr)
{
mem_mapping_set_addr(&riva128->linear_mapping, linear_addr, 0x1000000);
svga->linear_base = linear_addr;
}
else
{
mem_mapping_disable(&riva128->linear_mapping);
}
return;
}
case 0x30: case 0x32: case 0x33:
riva128->pci_regs[addr] = val;
mem_mapping_disable(&riva128->bios_rom.mapping);
if (riva128->pci_regs[0x30] & 0x01)
{
uint32_t addr = (riva128->pci_regs[0x32] << 16) | (riva128->pci_regs[0x33] << 24);
// pclog("RIVA TNT bios_rom enabled at %08x\n", addr);
mem_mapping_set_addr(&riva128->bios_rom.mapping, addr, 0x10000);
}
else
{
// pclog("RIVA TNT bios_rom disabled\n");
mem_mapping_disable(&riva128->bios_rom.mapping);
}
return;
case 0x3c: