From 7fec4a20fac2548aed87f0615d0d4fe3dc0ef8a1 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 2 Dec 2019 20:15:30 +0100 Subject: [PATCH] The mem.c fix needed for the PCnet not to BSoD. --- src/mem.c | 37 +++++++++++++++++++++---------------- src/mem_new.c | 37 +++++++++++++++++++++---------------- 2 files changed, 42 insertions(+), 32 deletions(-) diff --git a/src/mem.c b/src/mem.c index e90fb8efe..4610e7ee2 100644 --- a/src/mem.c +++ b/src/mem.c @@ -12,7 +12,7 @@ * the DYNAMIC_TABLES=1 enables this. Will eventually go * away, either way... * - * Version: @(#)mem.c 1.0.21 2019/10/19 + * Version: @(#)mem.c 1.0.22 2019/12/02 * * Authors: Sarah Walker, * Miran Grca, @@ -866,12 +866,12 @@ mem_readb_phys(uint32_t addr) { mem_mapping_t *map = read_mapping[addr >> MEM_GRANULARITY_BITS]; - mem_logical_addr = 0xffffffff; - - if (map && map->read_b) - return map->read_b(addr, map->p); - - return 0xff; + if (_mem_exec[addr >> MEM_GRANULARITY_BITS]) + return _mem_exec[addr >> MEM_GRANULARITY_BITS][addr & MEM_GRANULARITY_MASK]; + else if (map && map->read_b) + return map->read_b(addr, map->p); + else + return 0xff; } @@ -879,13 +879,18 @@ uint16_t mem_readw_phys(uint32_t addr) { mem_mapping_t *map = read_mapping[addr >> MEM_GRANULARITY_BITS]; + uint16_t temp; - mem_logical_addr = 0xffffffff; + if (_mem_exec[addr >> MEM_GRANULARITY_BITS]) + return ((uint16_t *) _mem_exec[addr >> MEM_GRANULARITY_BITS])[(addr >> 1) & MEM_GRANULARITY_HMASK]; + else if (map && map->read_w) + return map->read_w(addr, map->p); + else { + temp = mem_readb_phys(addr + 1) << 8; + temp |= mem_readb_phys(addr); + } - if (map && map->read_w) - return map->read_w(addr, map->p); - - return mem_readb_phys(addr) | (mem_readb_phys(addr + 1) << 8); + return temp; } @@ -894,10 +899,10 @@ mem_writeb_phys(uint32_t addr, uint8_t val) { mem_mapping_t *map = write_mapping[addr >> MEM_GRANULARITY_BITS]; - mem_logical_addr = 0xffffffff; - - if (map && map->write_b) - map->write_b(addr, val, map->p); + if (_mem_exec[addr >> MEM_GRANULARITY_BITS]) + _mem_exec[addr >> MEM_GRANULARITY_BITS][addr & MEM_GRANULARITY_MASK] = val; + else if (map && map->write_b) + map->write_b(addr, val, map->p); } diff --git a/src/mem_new.c b/src/mem_new.c index 554a07b75..199c7cd20 100644 --- a/src/mem_new.c +++ b/src/mem_new.c @@ -12,7 +12,7 @@ * the DYNAMIC_TABLES=1 enables this. Will eventually go * away, either way... * - * Version: @(#)mem.c 1.0.21 2019/10/19 + * Version: @(#)mem.c 1.0.22 2019/12/02 * * Authors: Sarah Walker, * Miran Grca, @@ -843,12 +843,12 @@ mem_readb_phys(uint32_t addr) { mem_mapping_t *map = read_mapping[addr >> MEM_GRANULARITY_BITS]; - mem_logical_addr = 0xffffffff; - - if (map && map->read_b) - return map->read_b(addr, map->p); - - return 0xff; + if (_mem_exec[addr >> MEM_GRANULARITY_BITS]) + return _mem_exec[addr >> MEM_GRANULARITY_BITS][addr & MEM_GRANULARITY_MASK]; + else if (map && map->read_b) + return map->read_b(addr, map->p); + else + return 0xff; } @@ -856,13 +856,18 @@ uint16_t mem_readw_phys(uint32_t addr) { mem_mapping_t *map = read_mapping[addr >> MEM_GRANULARITY_BITS]; + uint16_t temp; - mem_logical_addr = 0xffffffff; + if (_mem_exec[addr >> MEM_GRANULARITY_BITS]) + return ((uint16_t *) _mem_exec[addr >> MEM_GRANULARITY_BITS])[(addr >> 1) & MEM_GRANULARITY_HMASK]; + else if (map && map->read_w) + return map->read_w(addr, map->p); + else { + temp = mem_readb_phys(addr + 1) << 8; + temp |= mem_readb_phys(addr); + } - if (map && map->read_w) - return map->read_w(addr, map->p); - - return mem_readb_phys(addr) | (mem_readb_phys(addr + 1) << 8); + return temp; } @@ -871,10 +876,10 @@ mem_writeb_phys(uint32_t addr, uint8_t val) { mem_mapping_t *map = write_mapping[addr >> MEM_GRANULARITY_BITS]; - mem_logical_addr = 0xffffffff; - - if (map && map->write_b) - map->write_b(addr, val, map->p); + if (_mem_exec[addr >> MEM_GRANULARITY_BITS]) + _mem_exec[addr >> MEM_GRANULARITY_BITS][addr & MEM_GRANULARITY_MASK] = val; + else if (map && map->write_b) + map->write_b(addr, val, map->p); }