From ee0188e7af403d58fbe0f40720b7eb117b372cc4 Mon Sep 17 00:00:00 2001 From: TomW Date: Thu, 18 Jul 2013 21:20:05 +0100 Subject: [PATCH] Added missing SiS496 files from last commit. --- src/sis496.c | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/sis496.h | 1 + 2 files changed, 138 insertions(+) create mode 100644 src/sis496.c create mode 100644 src/sis496.h diff --git a/src/sis496.c b/src/sis496.c new file mode 100644 index 0000000..09829fb --- /dev/null +++ b/src/sis496.c @@ -0,0 +1,137 @@ +#include +#include "ibm.h" +#include "device.h" +#include "io.h" +#include "mem.h" +#include "pci.h" + +#include "sis496.h" + +typedef struct sis496_t +{ + uint8_t pci_conf[256]; +} sis496_t; + +void sis496_recalcmapping(sis496_t *sis496) +{ + if (sis496->pci_conf[0x44] & 0x10) + { + if (sis496->pci_conf[0x45] & 0x01) + mem_sethandler(0xe0000, 0x8000, mem_read_ram, mem_read_ramw, mem_read_raml, NULL, NULL, NULL, NULL); + else + mem_sethandler(0xe0000, 0x8000, mem_read_ram, mem_read_ramw, mem_read_raml, mem_write_ram, mem_write_ramw, mem_write_raml, NULL); + } + else + mem_sethandler(0xe0000, 0x8000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_ram, mem_write_ramw, mem_write_raml, NULL); + + if (sis496->pci_conf[0x44] & 0x20) + { + if (sis496->pci_conf[0x45] & 0x01) + mem_sethandler(0xe8000, 0x8000, mem_read_ram, mem_read_ramw, mem_read_raml, NULL, NULL, NULL, NULL); + else + mem_sethandler(0xe8000, 0x8000, mem_read_ram, mem_read_ramw, mem_read_raml, mem_write_ram, mem_write_ramw, mem_write_raml, NULL); + } + else + mem_sethandler(0xe8000, 0x8000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_ram, mem_write_ramw, mem_write_raml, NULL); + + if (sis496->pci_conf[0x44] & 0x40) + { + if (sis496->pci_conf[0x45] & 0x01) + mem_sethandler(0xf0000, 0x8000, mem_read_ram, mem_read_ramw, mem_read_raml, NULL, NULL, NULL, NULL); + else + mem_sethandler(0xf0000, 0x8000, mem_read_ram, mem_read_ramw, mem_read_raml, mem_write_ram, mem_write_ramw, mem_write_raml, NULL); + } + else + mem_sethandler(0xf0000, 0x8000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_ram, mem_write_ramw, mem_write_raml, NULL); + + if (sis496->pci_conf[0x44] & 0x80) + { + if (sis496->pci_conf[0x45] & 0x01) + mem_sethandler(0xf8000, 0x8000, mem_read_ram, mem_read_ramw, mem_read_raml, NULL, NULL, NULL, NULL); + else + mem_sethandler(0xf8000, 0x8000, mem_read_ram, mem_read_ramw, mem_read_raml, mem_write_ram, mem_write_ramw, mem_write_raml, NULL); + } + else + mem_sethandler(0xf8000, 0x8000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_ram, mem_write_ramw, mem_write_raml, NULL); + + flushmmucache(); + shadowbios = (sis496->pci_conf[0x44] & 0xf0); +} + +void sis496_write(int func, int addr, uint8_t val, void *p) +{ + sis496_t *sis496 = (sis496_t *)p; +pclog("sis496_write : addr=%02x val=%02x\n", addr, val); + switch (addr) + { + case 0x44: /*Shadow configure*/ + if ((sis496->pci_conf[0x44] & val) ^ 0xf0) + { + sis496->pci_conf[0x44] = val; + sis496_recalcmapping(sis496); + } + break; + case 0x45: /*Shadow configure*/ + //if (val == 3) + // output = 3; + if ((sis496->pci_conf[0x45] & val) ^ 0x01) + { + sis496->pci_conf[0x45] = val; + sis496_recalcmapping(sis496); + } + break; + } + + if ((addr >= 4 && addr < 8) || addr >= 0x40) + sis496->pci_conf[addr] = val; +} + +uint8_t sis496_read(int func, int addr, void *p) +{ + sis496_t *sis496 = (sis496_t *)p; + + return sis496->pci_conf[addr]; +} + +void *sis496_init() +{ + sis496_t *sis496 = malloc(sizeof(sis496_t)); + memset(sis496, 0, sizeof(sis496_t)); + + pci_add_specific(5, sis496_read, sis496_write, sis496); + + sis496->pci_conf[0x00] = 0x39; /*SiS*/ + sis496->pci_conf[0x01] = 0x10; + sis496->pci_conf[0x02] = 0x96; /*496/497*/ + sis496->pci_conf[0x03] = 0x04; + + sis496->pci_conf[0x04] = 7; + sis496->pci_conf[0x05] = 0; + + sis496->pci_conf[0x06] = 0x80; + sis496->pci_conf[0x07] = 0x02; + + sis496->pci_conf[0x08] = 2; /*Device revision*/ + + sis496->pci_conf[0x09] = 0x00; /*Device class (PCI bridge)*/ + sis496->pci_conf[0x0a] = 0x00; + sis496->pci_conf[0x0b] = 0x06; + + sis496->pci_conf[0x0e] = 0x00; /*Single function device*/ +} + +void sis496_close(void *p) +{ + sis496_t *sis496 = (sis496_t *)p; + + free(sis496); +} + +device_t sis496_device = +{ + "SiS 496/497", + sis496_init, + sis496_close, + NULL, + NULL +}; diff --git a/src/sis496.h b/src/sis496.h new file mode 100644 index 0000000..32a5371 --- /dev/null +++ b/src/sis496.h @@ -0,0 +1 @@ +extern device_t sis496_device;