diff --git a/src/cpu/386_dynarec.c b/src/cpu/386_dynarec.c index 8f4f202..20e2666 100644 --- a/src/cpu/386_dynarec.c +++ b/src/cpu/386_dynarec.c @@ -8,7 +8,7 @@ * * Implementation of the CPU's dynamic recompiler. * - * Version: @(#)386_dynarec.c 1.0.9 2019/04/21 + * Version: @(#)386_dynarec.c 1.0.10 2019/04/27 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -96,7 +96,34 @@ int oddeven=0; uint32_t rmdat32; -static INLINE void fetch_ea_32_long(uint32_t rmdat) +static INLINE uint32_t +get_phys(uint32_t addr) +{ + if (! ((addr ^ get_phys_virt) & ~0xfff)) + return get_phys_phys | (addr & 0xfff); + + get_phys_virt = addr; + + if (! (cr0 >> 31)) { + get_phys_phys = (addr & rammask) & ~0xfff; + + return addr & rammask; + } + + if (readlookup2[addr >> 12] != -1) + get_phys_phys = ((uintptr_t)readlookup2[addr >> 12] + (addr & ~0xfff)) - (uintptr_t)ram; + else { + get_phys_phys = (mmutranslatereal(addr, 0) & rammask) & ~0xfff; + + if (!cpu_state.abrt && mem_addr_is_ram(get_phys_phys)) + addreadlookup(get_phys_virt, get_phys_phys); + } + + return get_phys_phys | (addr & 0xfff); +} + +static INLINE void +fetch_ea_32_long(uint32_t rmdat) { eal_r = eal_w = NULL; easeg = cpu_state.ea_seg->base; diff --git a/src/mem.c b/src/mem.c index 14b563f..7f51003 100644 --- a/src/mem.c +++ b/src/mem.c @@ -12,7 +12,7 @@ * The Port92 stuff should be moved to devices/system/memctl.c * as a standard device. * - * Version: @(#)mem.c 1.0.32 2019/04/26 + * Version: @(#)mem.c 1.0.33 2019/04/27 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -117,6 +117,18 @@ static uint8_t port_92_reg = 0, port_92_mask = 0; +int +mem_addr_is_ram(uint32_t addr) +{ + mem_map_t *map = read_mapping[addr >> 14]; + + return (map == &ram_low_mapping) || + (map == &ram_high_mapping) || + (map == &ram_mid_mapping) || + (map == &ram_remapped_mapping); +} + + void resetreadlookup(void) { diff --git a/src/mem.h b/src/mem.h index 633d0ee..a816ee2 100644 --- a/src/mem.h +++ b/src/mem.h @@ -8,7 +8,7 @@ * * Definitions for the memory interface. * - * Version: @(#)mem.h 1.0.16 2019/04/25 + * Version: @(#)mem.h 1.0.17 2019/04/27 * * Authors: Fred N. van Kempen, * Sarah Walker, @@ -229,6 +229,8 @@ extern void mem_flush_write_page(uint32_t addr, uint32_t virt); extern void mem_reset_page_blocks(void); +extern int mem_addr_is_ram(uint32_t addr); + extern void flushmmucache(void); extern void flushmmucache_cr3(void); extern void flushmmucache_nopc(void); @@ -249,35 +251,21 @@ extern void port_92_reset(void); #ifdef EMU_CPU_H -static __inline uint32_t get_phys(uint32_t addr) -{ - if (! ((addr ^ get_phys_virt) & ~0xfff)) - return get_phys_phys | (addr & 0xfff); - - get_phys_virt = addr; - - if (! (cr0 >> 31)) { - get_phys_phys = (addr & rammask) & ~0xfff; - - return addr & rammask; - } - - get_phys_phys = (mmutranslatereal(addr, 0) & rammask) & ~0xfff; - -#if 1 - return get_phys_phys | (addr & 0xfff); -#else - return mmutranslatereal(addr, 0) & rammask; -#endif -} - - static __inline uint32_t get_phys_noabrt(uint32_t addr) { - if (! (cr0 >> 31)) + uint32_t phys_addr; + + if (!(cr0 >> 31)) return addr & rammask; - return mmutranslate_noabrt(addr, 0) & rammask; + if (readlookup2[addr >> 12] != -1) + return ((uintptr_t)readlookup2[addr >> 12] + addr) - (uintptr_t)ram; + + phys_addr = mmutranslate_noabrt(addr, 0) & rammask; + if (phys_addr != 0xffffffff && mem_addr_is_ram(phys_addr)) + addreadlookup(addr, phys_addr); + + return phys_addr; } #endif