Imported PCem commit #d12b9ef (mem.ch/386_dynarec.c fix) and updated it.

This commit is contained in:
waltje
2019-04-28 01:23:40 -05:00
parent 636fcfbacb
commit dbc810235b
3 changed files with 56 additions and 29 deletions

View File

@@ -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, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com>
@@ -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;

View File

@@ -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, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com>
@@ -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)
{

View File

@@ -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, <decwiz@yahoo.com>
* Sarah Walker, <tommowalker@tommowalker.co.uk>
@@ -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