[interp] Simplify memory bindings a bit
This commit is contained in:
parent
f15d08f1f9
commit
c9c88f3560
65
cpu.c
65
cpu.c
|
@ -856,60 +856,41 @@ const u32 spsr_masks[4] = { 0x00000000, 0x000000EF, 0xF0000000, 0xF00000EF };
|
||||||
#define aligned_address_mask16 0xF0000001
|
#define aligned_address_mask16 0xF0000001
|
||||||
#define aligned_address_mask32 0xF0000003
|
#define aligned_address_mask32 0xF0000003
|
||||||
|
|
||||||
#define fast_read_memory(size, type, addr, dest) \
|
#define fast_read_memory(size, type, addr, dest, readfn) \
|
||||||
{ \
|
{ \
|
||||||
u8 *map; \
|
u8 *map; \
|
||||||
u32 _address = addr; \
|
u32 _address = addr; \
|
||||||
\
|
\
|
||||||
if(_address < 0x10000000) \
|
if(_address < 0x10000000) \
|
||||||
{ \
|
{ \
|
||||||
memory_region_access_read_##type[_address >> 24]++; \
|
/* Account for cycles and other stats */ \
|
||||||
|
u8 region = _address >> 24; \
|
||||||
|
memory_region_access_read_##type[region]++; \
|
||||||
memory_reads_##type++; \
|
memory_reads_##type++; \
|
||||||
} \
|
} \
|
||||||
if(((_address >> 24) == 0) && (pc >= 0x4000)) \
|
\
|
||||||
|
if ( \
|
||||||
|
(((_address >> 24) == 0) && (pc >= 0x4000)) || /* BIOS reading */ \
|
||||||
|
(_address & aligned_address_mask##size) || /* Unaligned access */ \
|
||||||
|
!(map = memory_map_read[_address >> 15]) /* Unmapped memory */ \
|
||||||
|
) \
|
||||||
{ \
|
{ \
|
||||||
dest = (type)(reg[REG_BUS_VALUE] >> ((_address & 0x03) << 3)); \
|
dest = (type)(readfn)(_address); \
|
||||||
} \
|
} \
|
||||||
else \
|
else \
|
||||||
\
|
|
||||||
if(((_address & aligned_address_mask##size) == 0) && \
|
|
||||||
(map = memory_map_read[_address >> 15])) \
|
|
||||||
{ \
|
{ \
|
||||||
|
/* Aligned and mapped read */ \
|
||||||
dest = (type)readaddress##size(map, (_address & 0x7FFF)); \
|
dest = (type)readaddress##size(map, (_address & 0x7FFF)); \
|
||||||
} \
|
} \
|
||||||
else \
|
|
||||||
{ \
|
|
||||||
dest = (type)read_memory##size(_address); \
|
|
||||||
} \
|
|
||||||
} \
|
} \
|
||||||
|
|
||||||
#define fast_read_memory_s16(address, dest) \
|
|
||||||
{ \
|
|
||||||
u8 *map; \
|
|
||||||
u32 _address = address; \
|
|
||||||
if(_address < 0x10000000) \
|
|
||||||
{ \
|
|
||||||
memory_region_access_read_s16[_address >> 24]++; \
|
|
||||||
memory_reads_s16++; \
|
|
||||||
} \
|
|
||||||
if(((_address & aligned_address_mask16) == 0) && \
|
|
||||||
(map = memory_map_read[_address >> 15])) \
|
|
||||||
{ \
|
|
||||||
dest = (s16)readaddress16(map, (_address & 0x7FFF)); \
|
|
||||||
} \
|
|
||||||
else \
|
|
||||||
{ \
|
|
||||||
dest = (s16)read_memory16_signed(_address); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
|
|
||||||
|
|
||||||
#define fast_write_memory(size, type, address, value) \
|
#define fast_write_memory(size, type, address, value) \
|
||||||
{ \
|
{ \
|
||||||
u32 _address = (address) & ~(aligned_address_mask##size & 0x03); \
|
u32 _address = (address) & ~(aligned_address_mask##size & 0x03); \
|
||||||
if(_address < 0x10000000) \
|
if(_address < 0x10000000) \
|
||||||
{ \
|
{ \
|
||||||
memory_region_access_write_##type[_address >> 24]++; \
|
u8 region = _address >> 24; \
|
||||||
|
memory_region_access_write_##type[region]++; \
|
||||||
memory_writes_##type++; \
|
memory_writes_##type++; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
@ -922,7 +903,9 @@ const u32 spsr_masks[4] = { 0x00000000, 0x000000EF, 0xF0000000, 0xF00000EF };
|
||||||
u8 *map = memory_map_read[_address >> 15]; \
|
u8 *map = memory_map_read[_address >> 15]; \
|
||||||
if(_address < 0x10000000) \
|
if(_address < 0x10000000) \
|
||||||
{ \
|
{ \
|
||||||
memory_region_access_read_u32[_address >> 24]++; \
|
/* Account for cycles and other stats */ \
|
||||||
|
u8 region = _address >> 24; \
|
||||||
|
memory_region_access_read_u32[region]++; \
|
||||||
memory_reads_u32++; \
|
memory_reads_u32++; \
|
||||||
} \
|
} \
|
||||||
if(_address < 0x10000000 && map) \
|
if(_address < 0x10000000 && map) \
|
||||||
|
@ -940,26 +923,28 @@ const u32 spsr_masks[4] = { 0x00000000, 0x000000EF, 0xF0000000, 0xF00000EF };
|
||||||
u32 _address = address; \
|
u32 _address = address; \
|
||||||
if(_address < 0x10000000) \
|
if(_address < 0x10000000) \
|
||||||
{ \
|
{ \
|
||||||
memory_region_access_write_u32[_address >> 24]++; \
|
/* Account for cycles and other stats */ \
|
||||||
|
u8 region = _address >> 24; \
|
||||||
|
memory_region_access_write_u32[region]++; \
|
||||||
memory_writes_u32++; \
|
memory_writes_u32++; \
|
||||||
} \
|
} \
|
||||||
cpu_alert = write_memory32(_address, value); \
|
cpu_alert = write_memory32(_address, value); \
|
||||||
} \
|
} \
|
||||||
|
|
||||||
#define load_memory_u8(address, dest) \
|
#define load_memory_u8(address, dest) \
|
||||||
fast_read_memory(8, u8, address, dest) \
|
fast_read_memory(8, u8, address, dest, read_memory8) \
|
||||||
|
|
||||||
#define load_memory_u16(address, dest) \
|
#define load_memory_u16(address, dest) \
|
||||||
fast_read_memory(16, u16, address, dest) \
|
fast_read_memory(16, u16, address, dest, read_memory16) \
|
||||||
|
|
||||||
#define load_memory_u32(address, dest) \
|
#define load_memory_u32(address, dest) \
|
||||||
fast_read_memory(32, u32, address, dest) \
|
fast_read_memory(32, u32, address, dest, read_memory32) \
|
||||||
|
|
||||||
#define load_memory_s8(address, dest) \
|
#define load_memory_s8(address, dest) \
|
||||||
fast_read_memory(8, s8, address, dest) \
|
fast_read_memory(8, s8, address, dest, read_memory8) \
|
||||||
|
|
||||||
#define load_memory_s16(address, dest) \
|
#define load_memory_s16(address, dest) \
|
||||||
fast_read_memory_s16(address, dest) \
|
fast_read_memory(16, s16, address, dest, read_memory16_signed) \
|
||||||
|
|
||||||
#define store_memory_u8(address, value) \
|
#define store_memory_u8(address, value) \
|
||||||
fast_write_memory(8, u8, address, value) \
|
fast_write_memory(8, u8, address, value) \
|
||||||
|
|
Loading…
Reference in New Issue