More RTL8029AS fixes from TheCollector1995;

FDC now updates the floppy drive's DENSEL on receiving updates from the Super I/O chip;
Commented out ASIS P/I-P55TP4XE and ASUS P/I-P55T2P4 because they are too buggy;
Completely illegal instructions now also log the second byte for purposes of prefixed instruction identification;
PIC now sets mask to 0 on reset.
This commit is contained in:
OBattler
2016-08-13 17:29:14 +02:00
parent 91075fb627
commit f1367357b0
5 changed files with 52 additions and 23 deletions

View File

@@ -39,6 +39,7 @@
#include "ibm.h"
#include "device.h"
#include "config.h"
#include "nethandler.h"
#include "io.h"
@@ -878,7 +879,7 @@ void ne2000_page0_write(ne2000_t *ne2000, uint32_t offset, uint32_t value, unsig
// Auto-transmit disable very suspicious
if (value & 0x08)
pclog("TCR write, auto transmit disable not supported\m");
pclog("TCR write, auto transmit disable not supported\n");
// Allow collision-offset to be set, although not used
ne2000->TCR.coll_prio = ((value & 0x08) == 0x08);
@@ -1462,13 +1463,13 @@ void ne2000_rx_frame(void *p, const void *buf, int io_len)
}
uint8_t ne2000_readb(uint32_t addr, void *p)
uint8_t ne2000_readb(uint16_t addr, void *p)
{
ne2000_t *ne2000 = (ne2000_t *)p;
return ne2000_read(ne2000, addr, 1);
}
uint16_t ne2000_readw(uint32_t addr, void *p)
uint16_t ne2000_readw(uint16_t addr, void *p)
{
ne2000_t *ne2000 = (ne2000_t *)p;
if (ne2000->DCR.wdsize & 1)
@@ -1477,19 +1478,19 @@ uint16_t ne2000_readw(uint32_t addr, void *p)
return ne2000_read(ne2000, addr, 1);
}
uint32_t ne2000_readl(uint32_t addr, void *p)
uint32_t ne2000_readl(uint16_t addr, void *p)
{
ne2000_t *ne2000 = (ne2000_t *)p;
return ne2000_read(ne2000, addr, 4);
}
void ne2000_writeb(uint32_t addr, uint8_t val, void *p)
void ne2000_writeb(uint16_t addr, uint8_t val, void *p)
{
ne2000_t *ne2000 = (ne2000_t *)p;
ne2000_write(ne2000, addr, val, 1);
}
void ne2000_writew(uint32_t addr, uint16_t val, void *p)
void ne2000_writew(uint16_t addr, uint16_t val, void *p)
{
ne2000_t *ne2000 = (ne2000_t *)p;
if (ne2000->DCR.wdsize & 1)
@@ -1498,7 +1499,7 @@ void ne2000_writew(uint32_t addr, uint16_t val, void *p)
ne2000_write(ne2000, addr, val, 1);
}
void ne2000_writel(uint32_t addr, uint32_t val, void *p)
void ne2000_writel(uint16_t addr, uint32_t val, void *p)
{
ne2000_t *ne2000 = (ne2000_t *)p;
ne2000_write(ne2000, addr, val, 4);
@@ -1558,23 +1559,25 @@ uint8_t ne2000_pci_regs[256];
bar_t ne2000_pci_bar[2];
int bios_addr = 0xD0000;
uint32_t bios_addr = 0xD0000;
uint32_t old_base_addr = 0;
uint32_t bios_size = 0;
uint32_t bios_mask = 0;
void ne2000_io_set(uint16_t addr, ne2000_t *ne2000)
{
old_base_addr = addr;
io_sethandler(addr, 0x0010, ne2000_readb, ne2000_readw, ne2000_readl, ne2000_writeb, ne2000_writew, ne2000_writel, ne2000);
io_sethandler(addr+0x10, 0x0010, ne2000_readb, ne2000_readw, ne2000_readl, ne2000_writeb, ne2000_writew, ne2000_writel, ne2000);
io_sethandler(addr+0x1f, 0x0001, ne2000_readb, ne2000_readw, ne2000_readl, ne2000_writeb, ne2000_writeb, ne2000_writel, ne2000);
io_sethandler(addr+0x1f, 0x0001, ne2000_readb, ne2000_readw, ne2000_readl, ne2000_writeb, ne2000_writew, ne2000_writel, ne2000);
}
void ne2000_io_remove(uint16_t addr, ne2000_t *ne2000)
void ne2000_io_remove(ne2000_t *ne2000)
{
io_removehandler(addr, 0x0010, ne2000_readb, ne2000_readw, ne2000_readl, ne2000_writeb, ne2000_writew, ne2000_writel, ne2000);
io_removehandler(addr+0x10, 0x0010, ne2000_readb, ne2000_readw, ne2000_readl, ne2000_writeb, ne2000_writew, ne2000_writel, ne2000);
io_removehandler(addr+0x1f, 0x0001, ne2000_readb, ne2000_readw, ne2000_readl, ne2000_writeb, ne2000_writew, ne2000_writel, ne2000);
io_removehandler(old_base_addr, 0x0010, ne2000_readb, ne2000_readw, ne2000_readl, ne2000_writeb, ne2000_writew, ne2000_writel, ne2000);
io_removehandler(old_base_addr+0x10, 0x0010, ne2000_readb, ne2000_readw, ne2000_readl, ne2000_writeb, ne2000_writew, ne2000_writel, ne2000);
io_removehandler(old_base_addr+0x1f, 0x0001, ne2000_readb, ne2000_readw, ne2000_readl, ne2000_writeb, ne2000_writew, ne2000_writel, ne2000);
}
uint8_t ne2000_pci_read(int func, int addr, void *p)
@@ -1654,9 +1657,14 @@ void ne2000_pci_write(int func, int addr, uint8_t val, void *p)
{
case 0x04:
if (val & PCI_COMMAND_IO)
{
ne2000_io_remove(ne2000);
ne2000_io_set(ne2000->base_address, ne2000);
}
else
ne2000_io_remove(ne2000->base_address, ne2000);
{
ne2000_io_remove(ne2000);
}
break;
case 0x10:
@@ -1665,7 +1673,7 @@ void ne2000_pci_write(int func, int addr, uint8_t val, void *p)
case 0x11: case 0x12: case 0x13:
/* I/O Base set. */
/* First, remove the old I/O, if old base was >= 0x280. */
ne2000_io_remove(ne2000->base_address, ne2000);
ne2000_io_remove(ne2000);
/* Then let's set the PCI regs. */
ne2000_pci_bar[0].addr_regs[addr & 3] = val;
/* Then let's calculate the new I/O base. */
@@ -2119,7 +2127,7 @@ return ne2000;
void ne2000_close(void *p)
{
ne2000_t *ne2000 = (ne2000_t *)p;
ne2000_io_remove(ne2000->base_address, ne2000);
ne2000_io_remove(ne2000);
free(ne2000);
if(net_is_slirp) {