Imported PCem commit #d12b9ef (mem.ch/386_dynarec.c fix) and updated it.
This commit is contained in:
@@ -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;
|
||||
|
||||
14
src/mem.c
14
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, <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)
|
||||
{
|
||||
|
||||
40
src/mem.h
40
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, <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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user