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:
40
src/ne2000.c
40
src/ne2000.c
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user