mirror of
https://github.com/86Box/86Box.git
synced 2026-02-26 14:03:16 -07:00
Overhauled DMA bus master reads and writes and cleaned up the AMD PCnet code a bit (network queue implementation is pending).
This commit is contained in:
99
src/mem.c
99
src/mem.c
@@ -133,6 +133,9 @@ static uint8_t ff_pccache[4] = { 0xff, 0xff, 0xff, 0xff };
|
||||
#endif
|
||||
|
||||
|
||||
#define USE_PHYS_EXEC
|
||||
|
||||
|
||||
#ifdef ENABLE_MEM_LOG
|
||||
int mem_do_log = ENABLE_MEM_LOG;
|
||||
|
||||
@@ -1373,9 +1376,14 @@ mem_readb_phys(uint32_t addr)
|
||||
{
|
||||
mem_mapping_t *map = read_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
|
||||
mem_logical_addr = 0xffffffff;
|
||||
|
||||
#ifdef USE_PHYS_EXEC
|
||||
if (_mem_exec[addr >> MEM_GRANULARITY_BITS])
|
||||
return _mem_exec[addr >> MEM_GRANULARITY_BITS][addr & MEM_GRANULARITY_MASK];
|
||||
else if (map && map->read_b)
|
||||
else
|
||||
#endif
|
||||
if (map && map->read_b)
|
||||
return map->read_b(addr, map->p);
|
||||
else
|
||||
return 0xff;
|
||||
@@ -1386,12 +1394,20 @@ uint16_t
|
||||
mem_readw_phys(uint32_t addr)
|
||||
{
|
||||
mem_mapping_t *map = read_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
uint16_t temp, *p;
|
||||
uint16_t temp;
|
||||
#ifdef USE_PHYS_EXEC
|
||||
uint16_t *p;
|
||||
#endif
|
||||
|
||||
mem_logical_addr = 0xffffffff;
|
||||
|
||||
#ifdef USE_PHYS_EXEC
|
||||
if ((addr <= MEM_GRANULARITY_HBOUND) && (_mem_exec[addr >> MEM_GRANULARITY_BITS])) {
|
||||
p = (uint16_t *) &(_mem_exec[addr >> MEM_GRANULARITY_BITS][addr & MEM_GRANULARITY_MASK]);
|
||||
return *p;
|
||||
} else if ((addr <= MEM_GRANULARITY_HBOUND) && (map && map->read_w))
|
||||
} else
|
||||
#endif
|
||||
if ((addr <= MEM_GRANULARITY_HBOUND) && (map && map->read_w))
|
||||
return map->read_w(addr, map->p);
|
||||
else {
|
||||
temp = mem_readb_phys(addr + 1) << 8;
|
||||
@@ -1406,12 +1422,20 @@ uint32_t
|
||||
mem_readl_phys(uint32_t addr)
|
||||
{
|
||||
mem_mapping_t *map = read_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
uint32_t temp, *p;
|
||||
uint32_t temp;
|
||||
#ifdef USE_PHYS_EXEC
|
||||
uint32_t *p;
|
||||
#endif
|
||||
|
||||
mem_logical_addr = 0xffffffff;
|
||||
|
||||
#ifdef USE_PHYS_EXEC
|
||||
if ((addr <= MEM_GRANULARITY_QBOUND) && (_mem_exec[addr >> MEM_GRANULARITY_BITS])) {
|
||||
p = (uint32_t *) &(_mem_exec[addr >> MEM_GRANULARITY_BITS][addr & MEM_GRANULARITY_MASK]);
|
||||
return *p;
|
||||
} else if ((addr <= MEM_GRANULARITY_QBOUND) && (map && map->read_l))
|
||||
} else
|
||||
#endif
|
||||
if ((addr <= MEM_GRANULARITY_QBOUND) && (map && map->read_l))
|
||||
return map->read_l(addr, map->p);
|
||||
else {
|
||||
temp = mem_readw_phys(addr + 2) << 16;
|
||||
@@ -1422,14 +1446,39 @@ mem_readl_phys(uint32_t addr)
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
mem_read_phys(void *dest, uint32_t addr, int transfer_size)
|
||||
{
|
||||
uint8_t *pb;
|
||||
uint16_t *pw;
|
||||
uint32_t *pl;
|
||||
|
||||
if (transfer_size == 4) {
|
||||
pl = (uint32_t *) dest;
|
||||
*pl = mem_readl_phys(addr);
|
||||
} else if (transfer_size == 2) {
|
||||
pw = (uint16_t *) dest;
|
||||
*pw = mem_readw_phys(addr);
|
||||
} else if (transfer_size == 4) {
|
||||
pb = (uint8_t *) dest;
|
||||
*pb = mem_readb_phys(addr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
mem_writeb_phys(uint32_t addr, uint8_t val)
|
||||
{
|
||||
mem_mapping_t *map = write_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
|
||||
mem_logical_addr = 0xffffffff;
|
||||
|
||||
#ifdef USE_PHYS_EXEC
|
||||
if (_mem_exec[addr >> MEM_GRANULARITY_BITS])
|
||||
_mem_exec[addr >> MEM_GRANULARITY_BITS][addr & MEM_GRANULARITY_MASK] = val;
|
||||
else if (map && map->write_b)
|
||||
else
|
||||
#endif
|
||||
if (map && map->write_b)
|
||||
map->write_b(addr, val, map->p);
|
||||
}
|
||||
|
||||
@@ -1438,12 +1487,19 @@ void
|
||||
mem_writew_phys(uint32_t addr, uint16_t val)
|
||||
{
|
||||
mem_mapping_t *map = write_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
#ifdef USE_PHYS_EXEC
|
||||
uint16_t *p;
|
||||
#endif
|
||||
|
||||
mem_logical_addr = 0xffffffff;
|
||||
|
||||
#ifdef USE_PHYS_EXEC
|
||||
if ((addr <= MEM_GRANULARITY_HBOUND) && (_mem_exec[addr >> MEM_GRANULARITY_BITS])) {
|
||||
p = (uint16_t *) &(_mem_exec[addr >> MEM_GRANULARITY_BITS][addr & MEM_GRANULARITY_MASK]);
|
||||
*p = val;
|
||||
} else if ((addr <= MEM_GRANULARITY_HBOUND) && (map && map->write_w))
|
||||
} else
|
||||
#endif
|
||||
if ((addr <= MEM_GRANULARITY_HBOUND) && (map && map->write_w))
|
||||
map->write_w(addr, val, map->p);
|
||||
else {
|
||||
mem_writeb_phys(addr, val & 0xff);
|
||||
@@ -1456,12 +1512,19 @@ void
|
||||
mem_writel_phys(uint32_t addr, uint32_t val)
|
||||
{
|
||||
mem_mapping_t *map = write_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
#ifdef USE_PHYS_EXEC
|
||||
uint32_t *p;
|
||||
#endif
|
||||
|
||||
mem_logical_addr = 0xffffffff;
|
||||
|
||||
#ifdef USE_PHYS_EXEC
|
||||
if ((addr <= MEM_GRANULARITY_QBOUND) && (_mem_exec[addr >> MEM_GRANULARITY_BITS])) {
|
||||
p = (uint32_t *) &(_mem_exec[addr >> MEM_GRANULARITY_BITS][addr & MEM_GRANULARITY_MASK]);
|
||||
*p = val;
|
||||
} else if ((addr <= MEM_GRANULARITY_QBOUND) && (map && map->write_l))
|
||||
} else
|
||||
#endif
|
||||
if ((addr <= MEM_GRANULARITY_QBOUND) && (map && map->write_l))
|
||||
map->write_l(addr, val, map->p);
|
||||
else {
|
||||
mem_writew_phys(addr, val & 0xffff);
|
||||
@@ -1470,6 +1533,26 @@ mem_writel_phys(uint32_t addr, uint32_t val)
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
mem_write_phys(void *src, uint32_t addr, int transfer_size)
|
||||
{
|
||||
uint8_t *pb;
|
||||
uint16_t *pw;
|
||||
uint32_t *pl;
|
||||
|
||||
if (transfer_size == 4) {
|
||||
pl = (uint32_t *) src;
|
||||
mem_writel_phys(addr, *pl);
|
||||
} else if (transfer_size == 2) {
|
||||
pw = (uint16_t *) src;
|
||||
mem_writew_phys(addr, *pw);
|
||||
} else {
|
||||
pb = (uint8_t *) src;
|
||||
mem_writeb_phys(addr, *pb);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
uint8_t
|
||||
mem_read_ram(uint32_t addr, void *priv)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user