Commented out APIC support for network and SCSI - tested with Windows 98, Epox P55-VA, and SCSI, and ended with Windows reporting a Fatal exception 0E. Will be restored when Sarah fixes the APIC emulation.
This commit is contained in:
@@ -155,6 +155,7 @@ typedef struct s3_t
|
|||||||
uint64_t status_time;
|
uint64_t status_time;
|
||||||
|
|
||||||
uint8_t subsys_cntl, subsys_stat;
|
uint8_t subsys_cntl, subsys_stat;
|
||||||
|
uint8_t status_9ae9;
|
||||||
} s3_t;
|
} s3_t;
|
||||||
|
|
||||||
#define INT_VSY (1 << 0)
|
#define INT_VSY (1 << 0)
|
||||||
@@ -444,70 +445,88 @@ static void s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val)
|
|||||||
|
|
||||||
static void s3_accel_out_fifo_w(s3_t *s3, uint16_t port, uint16_t val)
|
static void s3_accel_out_fifo_w(s3_t *s3, uint16_t port, uint16_t val)
|
||||||
{
|
{
|
||||||
if (s3->accel.cmd & 0x100)
|
if (port & 0x8000)
|
||||||
{
|
{
|
||||||
if ((s3->accel.multifunc[0xa] & 0xc0) == 0x80)
|
s3_accel_out_fifo(s3, port, val);
|
||||||
{
|
s3_accel_out_fifo(s3, port + 1, val >> 8);
|
||||||
if (s3->accel.cmd & 0x1000)
|
}
|
||||||
val = (val >> 8) | (val << 8);
|
else
|
||||||
if ((s3->accel.cmd & 0x600) == 0x000)
|
{
|
||||||
s3_accel_start(8, 1, val | (val << 16), 0, s3);
|
if (s3->accel.cmd & 0x100)
|
||||||
else
|
{
|
||||||
s3_accel_start(16, 1, val | (val << 16), 0, s3);
|
if ((s3->accel.multifunc[0xa] & 0xc0) == 0x80)
|
||||||
}
|
{
|
||||||
else
|
if (s3->accel.cmd & 0x1000)
|
||||||
{
|
val = (val >> 8) | (val << 8);
|
||||||
if ((s3->accel.cmd & 0x600) == 0x000)
|
if ((s3->accel.cmd & 0x600) == 0x000)
|
||||||
s3_accel_start(1, 1, 0xffffffff, val | (val << 16), s3);
|
s3_accel_start(8, 1, val | (val << 16), 0, s3);
|
||||||
else
|
else
|
||||||
s3_accel_start(2, 1, 0xffffffff, val | (val << 16), s3);
|
s3_accel_start(16, 1, val | (val << 16), 0, s3);
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
|
{
|
||||||
|
if ((s3->accel.cmd & 0x600) == 0x000)
|
||||||
|
s3_accel_start(1, 1, 0xffffffff, val | (val << 16), s3);
|
||||||
|
else
|
||||||
|
s3_accel_start(2, 1, 0xffffffff, val | (val << 16), s3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void s3_accel_out_fifo_l(s3_t *s3, uint16_t port, uint32_t val)
|
static void s3_accel_out_fifo_l(s3_t *s3, uint16_t port, uint32_t val)
|
||||||
{
|
{
|
||||||
if (s3->accel.cmd & 0x100)
|
if (port & 0x8000)
|
||||||
{
|
{
|
||||||
if ((s3->accel.multifunc[0xa] & 0xc0) == 0x80)
|
s3_accel_out_fifo(s3, port, val);
|
||||||
{
|
s3_accel_out_fifo(s3, port + 1, val >> 8);
|
||||||
if (s3->accel.cmd & 0x400)
|
s3_accel_out_fifo(s3, port + 2, val >> 16);
|
||||||
{
|
s3_accel_out_fifo(s3, port + 3, val >> 24);
|
||||||
if (s3->accel.cmd & 0x1000)
|
}
|
||||||
val = ((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24);
|
else
|
||||||
s3_accel_start(32, 1, val, 0, s3);
|
{
|
||||||
}
|
if (s3->accel.cmd & 0x100)
|
||||||
else if ((s3->accel.cmd & 0x600) == 0x200)
|
{
|
||||||
{
|
if ((s3->accel.multifunc[0xa] & 0xc0) == 0x80)
|
||||||
if (s3->accel.cmd & 0x1000)
|
{
|
||||||
val = ((val & 0xff00ff00) >> 8) | ((val & 0x00ff00ff) << 8);
|
if (s3->accel.cmd & 0x400)
|
||||||
s3_accel_start(16, 1, val, 0, s3);
|
{
|
||||||
s3_accel_start(16, 1, val >> 16, 0, s3);
|
if (s3->accel.cmd & 0x1000)
|
||||||
}
|
val = ((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24);
|
||||||
else
|
s3_accel_start(32, 1, val, 0, s3);
|
||||||
{
|
}
|
||||||
if (s3->accel.cmd & 0x1000)
|
else if ((s3->accel.cmd & 0x600) == 0x200)
|
||||||
val = ((val & 0xff00ff00) >> 8) | ((val & 0x00ff00ff) << 8);
|
{
|
||||||
s3_accel_start(8, 1, val, 0, s3);
|
if (s3->accel.cmd & 0x1000)
|
||||||
s3_accel_start(8, 1, val >> 16, 0, s3);
|
val = ((val & 0xff00ff00) >> 8) | ((val & 0x00ff00ff) << 8);
|
||||||
}
|
s3_accel_start(16, 1, val, 0, s3);
|
||||||
}
|
s3_accel_start(16, 1, val >> 16, 0, s3);
|
||||||
else
|
}
|
||||||
{
|
else
|
||||||
if (s3->accel.cmd & 0x400)
|
{
|
||||||
s3_accel_start(4, 1, 0xffffffff, val, s3);
|
if (s3->accel.cmd & 0x1000)
|
||||||
else if ((s3->accel.cmd & 0x600) == 0x200)
|
val = ((val & 0xff00ff00) >> 8) | ((val & 0x00ff00ff) << 8);
|
||||||
{
|
s3_accel_start(8, 1, val, 0, s3);
|
||||||
s3_accel_start(2, 1, 0xffffffff, val, s3);
|
s3_accel_start(8, 1, val >> 16, 0, s3);
|
||||||
s3_accel_start(2, 1, 0xffffffff, val >> 16, s3);
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
s3_accel_start(1, 1, 0xffffffff, val, s3);
|
if (s3->accel.cmd & 0x400)
|
||||||
s3_accel_start(1, 1, 0xffffffff, val >> 16, s3);
|
s3_accel_start(4, 1, 0xffffffff, val, s3);
|
||||||
}
|
else if ((s3->accel.cmd & 0x600) == 0x200)
|
||||||
}
|
{
|
||||||
}
|
s3_accel_start(2, 1, 0xffffffff, val, s3);
|
||||||
|
s3_accel_start(2, 1, 0xffffffff, val >> 16, s3);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
s3_accel_start(1, 1, 0xffffffff, val, s3);
|
||||||
|
s3_accel_start(1, 1, 0xffffffff, val >> 16, s3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void s3_accel_write_fifo(s3_t *s3, uint32_t addr, uint8_t val)
|
static void s3_accel_write_fifo(s3_t *s3, uint32_t addr, uint8_t val)
|
||||||
@@ -1257,7 +1276,7 @@ uint8_t s3_accel_in(uint16_t port, void *p)
|
|||||||
if (!FIFO_EMPTY)
|
if (!FIFO_EMPTY)
|
||||||
temp |= 0x02; /*Hardware busy*/
|
temp |= 0x02; /*Hardware busy*/
|
||||||
else
|
else
|
||||||
temp |= 0x04; /*FIFO empty*/
|
temp |= s3->status_9ae9; /*FIFO empty*/
|
||||||
if (FIFO_FULL)
|
if (FIFO_FULL)
|
||||||
temp |= 0xf8; /*FIFO full*/
|
temp |= 0xf8; /*FIFO full*/
|
||||||
return temp;
|
return temp;
|
||||||
@@ -1642,6 +1661,15 @@ void s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat
|
|||||||
|
|
||||||
s3->accel.dest = s3->accel.cy * s3->width;
|
s3->accel.dest = s3->accel.cy * s3->width;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s3->status_9ae9 = 4; /*To avoid the spam from OS/2's drivers*/
|
||||||
|
|
||||||
|
if ((s3->accel.cmd & 0x100) && !cpu_input)
|
||||||
|
{
|
||||||
|
s3->status_9ae9 = 2; /*To avoid the spam from OS/2's drivers*/
|
||||||
|
return; /*Wait for data from CPU*/
|
||||||
|
}
|
||||||
|
|
||||||
if ((s3->accel.cmd & 0x100) && !cpu_input) return; /*Wait for data from CPU*/
|
if ((s3->accel.cmd & 0x100) && !cpu_input) return; /*Wait for data from CPU*/
|
||||||
|
|
||||||
frgd_mix = (s3->accel.frgd_mix >> 5) & 3;
|
frgd_mix = (s3->accel.frgd_mix >> 5) & 3;
|
||||||
|
|||||||
@@ -1636,6 +1636,7 @@ nic_pci_write(int func, int addr, uint8_t val, void *priv)
|
|||||||
nic_update_bios(dev);
|
nic_update_bios(dev);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
#if 0
|
||||||
case 0x3C: /* PCI_ILR */
|
case 0x3C: /* PCI_ILR */
|
||||||
if (val != 0xFF) {
|
if (val != 0xFF) {
|
||||||
nelog(1, "%s: IRQ now: %i\n", dev->name, val);
|
nelog(1, "%s: IRQ now: %i\n", dev->name, val);
|
||||||
@@ -1643,6 +1644,7 @@ nic_pci_write(int func, int addr, uint8_t val, void *priv)
|
|||||||
}
|
}
|
||||||
dev->pci_regs[addr] = dev->base_irq;
|
dev->pci_regs[addr] = dev->base_irq;
|
||||||
return;
|
return;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2219,7 +2221,6 @@ static device_config_t ne2000_config[] =
|
|||||||
|
|
||||||
static device_config_t rtl8029as_config[] =
|
static device_config_t rtl8029as_config[] =
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
{
|
{
|
||||||
"irq", "IRQ", CONFIG_SELECTION, "", 10,
|
"irq", "IRQ", CONFIG_SELECTION, "", 10,
|
||||||
{
|
{
|
||||||
@@ -2243,7 +2244,6 @@ static device_config_t rtl8029as_config[] =
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
#endif
|
|
||||||
#if 1
|
#if 1
|
||||||
/*
|
/*
|
||||||
* WTF.
|
* WTF.
|
||||||
|
|||||||
@@ -532,14 +532,16 @@ BuslogicLog(const char *format, ...)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#define pclog BuslogicLog
|
/* #define pclog BuslogicLog */
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
BuslogicInterrupt(Buslogic_t *bl, int set)
|
BuslogicInterrupt(Buslogic_t *bl, int set)
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
if (bl->chip != CHIP_BUSLOGIC_PCI)
|
if (bl->chip != CHIP_BUSLOGIC_PCI)
|
||||||
{
|
{
|
||||||
|
#endif
|
||||||
if (set)
|
if (set)
|
||||||
{
|
{
|
||||||
picint(1 << bl->Irq);
|
picint(1 << bl->Irq);
|
||||||
@@ -548,18 +550,20 @@ BuslogicInterrupt(Buslogic_t *bl, int set)
|
|||||||
{
|
{
|
||||||
picintc(1 << bl->Irq);
|
picintc(1 << bl->Irq);
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (set)
|
if (set)
|
||||||
{
|
{
|
||||||
pci_set_irq(bl->Card, PCI_INTA);
|
pci_set_irq(bl->Card, PCI_INTD);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pci_clear_irq(bl->Card, PCI_INTA);
|
pci_clear_irq(bl->Card, PCI_INTD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1254,7 +1258,14 @@ BuslogicWrite(uint16_t Port, uint8_t Val, void *p)
|
|||||||
|
|
||||||
case 0x0B:
|
case 0x0B:
|
||||||
bl->DataBuf[0] = (1 << bl->DmaChannel);
|
bl->DataBuf[0] = (1 << bl->DmaChannel);
|
||||||
bl->DataBuf[1] = (1<<(bl->Irq-9));
|
if ((bl->Irq >= 9) && (bl->Irq <= 15))
|
||||||
|
{
|
||||||
|
bl->DataBuf[1] = (1<<(bl->Irq-9));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
bl->DataBuf[1] = 0;
|
||||||
|
{
|
||||||
|
}
|
||||||
bl->DataBuf[2] = 7; /* HOST ID */
|
bl->DataBuf[2] = 7; /* HOST ID */
|
||||||
bl->DataReplyLeft = 3;
|
bl->DataReplyLeft = 3;
|
||||||
break;
|
break;
|
||||||
@@ -2127,7 +2138,7 @@ BuslogicPCIRead(int func, int addr, void *p)
|
|||||||
case 0x3C:
|
case 0x3C:
|
||||||
return bl->Irq;
|
return bl->Irq;
|
||||||
case 0x3D:
|
case 0x3D:
|
||||||
return 1;
|
return 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
@@ -2138,16 +2149,17 @@ static void
|
|||||||
BuslogicPCIWrite(int func, int addr, uint8_t val, void *p)
|
BuslogicPCIWrite(int func, int addr, uint8_t val, void *p)
|
||||||
{
|
{
|
||||||
Buslogic_t *bl = (Buslogic_t *)p;
|
Buslogic_t *bl = (Buslogic_t *)p;
|
||||||
|
uint8_t valxor;
|
||||||
|
|
||||||
switch (addr) {
|
switch (addr) {
|
||||||
case 0x04:
|
case 0x04:
|
||||||
io_removehandler(bl->PCIBase, 4,
|
valxor = (val & 0x27) ^ buslogic_pci_regs[addr];
|
||||||
|
if (valxor & PCI_COMMAND_IO) {
|
||||||
|
io_removehandler(bl->PCIBase, 4,
|
||||||
BuslogicRead, BuslogicReadW, BuslogicReadL,
|
BuslogicRead, BuslogicReadW, BuslogicReadL,
|
||||||
BuslogicWrite, BuslogicWriteW, BuslogicWriteL,
|
BuslogicWrite, BuslogicWriteW, BuslogicWriteL,
|
||||||
bl);
|
bl);
|
||||||
mem_mapping_disable(&bl->mmio_mapping);
|
if ((bl->PCIBase != 0) && (val & PCI_COMMAND_IO)) {
|
||||||
if (val & PCI_COMMAND_IO) {
|
|
||||||
if (bl->PCIBase != 0) {
|
|
||||||
io_sethandler(bl->PCIBase, 0x0020,
|
io_sethandler(bl->PCIBase, 0x0020,
|
||||||
BuslogicRead, BuslogicReadW,
|
BuslogicRead, BuslogicReadW,
|
||||||
BuslogicReadL, BuslogicWrite,
|
BuslogicReadL, BuslogicWrite,
|
||||||
@@ -2155,13 +2167,14 @@ BuslogicPCIWrite(int func, int addr, uint8_t val, void *p)
|
|||||||
bl);
|
bl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (val & PCI_COMMAND_MEM) {
|
if (valxor & PCI_COMMAND_MEM) {
|
||||||
if (bl->PCIBase != 0) {
|
mem_mapping_disable(&bl->mmio_mapping);
|
||||||
|
if ((bl->MMIOBase != 0) & (val & PCI_COMMAND_MEM)) {
|
||||||
mem_mapping_set_addr(&bl->mmio_mapping,
|
mem_mapping_set_addr(&bl->mmio_mapping,
|
||||||
bl->MMIOBase, 0x20);
|
bl->MMIOBase, 0x20);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
buslogic_pci_regs[addr] = val;
|
buslogic_pci_regs[addr] = val & 0x27;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x10:
|
case 0x10:
|
||||||
@@ -2215,6 +2228,7 @@ BuslogicPCIWrite(int func, int addr, uint8_t val, void *p)
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
#if 0
|
||||||
case 0x3C:
|
case 0x3C:
|
||||||
buslogic_pci_regs[addr] = val;
|
buslogic_pci_regs[addr] = val;
|
||||||
if (val != 0xFF) {
|
if (val != 0xFF) {
|
||||||
@@ -2222,6 +2236,7 @@ BuslogicPCIWrite(int func, int addr, uint8_t val, void *p)
|
|||||||
bl->Irq = val;
|
bl->Irq = val;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2291,9 +2306,11 @@ BuslogicInit(int chip)
|
|||||||
|
|
||||||
buslogic_pci_bar[0].addr_regs[0] = 1;
|
buslogic_pci_bar[0].addr_regs[0] = 1;
|
||||||
buslogic_pci_bar[1].addr_regs[0] = 0;
|
buslogic_pci_bar[1].addr_regs[0] = 0;
|
||||||
buslogic_pci_regs[0x04] = 1;
|
buslogic_pci_regs[0x04] = 3;
|
||||||
|
#if 0
|
||||||
buslogic_pci_regs[0x05] = 0;
|
buslogic_pci_regs[0x05] = 0;
|
||||||
buslogic_pci_regs[0x07] = 2;
|
buslogic_pci_regs[0x07] = 2;
|
||||||
|
#endif
|
||||||
buslogic_pci_bar[2].addr = 0;
|
buslogic_pci_bar[2].addr = 0;
|
||||||
|
|
||||||
mem_mapping_add(&bl->mmio_mapping, 0xfffd0000, 0x20,
|
mem_mapping_add(&bl->mmio_mapping, 0xfffd0000, 0x20,
|
||||||
|
|||||||
Reference in New Issue
Block a user