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.
|
* 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>
|
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
@@ -96,7 +96,34 @@ int oddeven=0;
|
|||||||
uint32_t rmdat32;
|
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;
|
eal_r = eal_w = NULL;
|
||||||
easeg = cpu_state.ea_seg->base;
|
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
|
* The Port92 stuff should be moved to devices/system/memctl.c
|
||||||
* as a standard device.
|
* 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>
|
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
@@ -117,6 +117,18 @@ static uint8_t port_92_reg = 0,
|
|||||||
port_92_mask = 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
|
void
|
||||||
resetreadlookup(void)
|
resetreadlookup(void)
|
||||||
{
|
{
|
||||||
|
|||||||
40
src/mem.h
40
src/mem.h
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Definitions for the memory interface.
|
* 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>
|
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
* Sarah Walker, <tommowalker@tommowalker.co.uk>
|
* 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 void mem_reset_page_blocks(void);
|
||||||
|
|
||||||
|
extern int mem_addr_is_ram(uint32_t addr);
|
||||||
|
|
||||||
extern void flushmmucache(void);
|
extern void flushmmucache(void);
|
||||||
extern void flushmmucache_cr3(void);
|
extern void flushmmucache_cr3(void);
|
||||||
extern void flushmmucache_nopc(void);
|
extern void flushmmucache_nopc(void);
|
||||||
@@ -249,35 +251,21 @@ extern void port_92_reset(void);
|
|||||||
|
|
||||||
|
|
||||||
#ifdef EMU_CPU_H
|
#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)
|
static __inline uint32_t get_phys_noabrt(uint32_t addr)
|
||||||
{
|
{
|
||||||
if (! (cr0 >> 31))
|
uint32_t phys_addr;
|
||||||
|
|
||||||
|
if (!(cr0 >> 31))
|
||||||
return addr & rammask;
|
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
|
#endif
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user