--- uae/src/include/memory.h 2018/04/24 16:40:14 1.1.1.3 +++ uae/src/include/memory.h 2018/04/24 17:00:30 1.1.1.8 @@ -6,14 +6,11 @@ * Copyright 1995 Bernd Schmidt */ -/* Enabling this adds one additional native memory reference per 68k memory - * access, but saves one shift (on the x86). Enabling this is probably - * better for the cache. My favourite benchmark (PP2) doesn't show a - * difference, so I leave this enabled. */ +extern void memory_reset (void); -#if 1 || defined SAVE_MEMORY -#define SAVE_MEMORY_BANKS -#endif +extern int special_mem; +#define S_READ 1 +#define S_WRITE 2 typedef uae_u32 (*mem_get_func)(uaecptr) REGPARAM; typedef void (*mem_put_func)(uaecptr, uae_u32) REGPARAM; @@ -23,9 +20,15 @@ typedef int (*check_func)(uaecptr, uae_u extern char *address_space, *good_address_map; extern uae_u8 *chipmemory; +extern uae_u32 allocated_chipmem; +extern uae_u32 allocated_fastmem; +extern uae_u32 allocated_bogomem; +extern uae_u32 allocated_gfxmem; +extern uae_u32 allocated_z3fastmem; +extern uae_u32 allocated_a3000mem; + #undef DIRECT_MEMFUNCS_SUCCESSFUL -#include "osdep/memory.h" -#include "machdep/memory.h" +#include "machdep/maccess.h" #ifndef CAN_MAP_MEMORY #undef USE_COMPILER @@ -44,6 +47,8 @@ extern uae_u8 *chipmemory; extern int ersatzkickfile; +extern uae_u8* baseaddr[]; + typedef struct { /* These ones should be self-explanatory... */ mem_get_func lget, wget, bget; @@ -58,9 +63,15 @@ typedef struct { * that the pointer points to an area of at least the specified size. * This is used for example to translate bitplane pointers in custom.c */ check_func check; + /* For those banks that refer to real memory, we can save the whole trouble + of going through function calls, and instead simply grab the memory + ourselves. This holds the memory address where the start of memory is + for this particular bank. */ + uae_u8 *baseaddr; } addrbank; -extern uae_u8 filesysory[65536]; +extern uae_u8 *filesysory; +extern uae_u8 *rtarea; extern addrbank chipmem_bank; extern addrbank kickmem_bank; @@ -77,7 +88,6 @@ extern void rtarea_setup (void); extern void expamem_init (void); extern void expamem_reset (void); -extern uae_u32 z3fastmem_size, fastmem_size, chipmem_size, bogomem_size, a3000mem_size, gfxmem_size; extern uae_u32 gfxmem_start; extern uae_u8 *gfxmemory; extern uae_u32 gfxmem_mask; @@ -90,18 +100,19 @@ extern uae_u8 *default_xlate(uaecptr add #define bankindex(addr) (((uaecptr)(addr)) >> 16) -#ifdef SAVE_MEMORY_BANKS extern addrbank *mem_banks[65536]; +extern uae_u8 *baseaddr[65536]; #define get_mem_bank(addr) (*mem_banks[bankindex(addr)]) -#define put_mem_bank(addr, b) (mem_banks[bankindex(addr)] = (b)) -#else -extern addrbank mem_banks[65536]; -#define get_mem_bank(addr) (mem_banks[bankindex(addr)]) -#define put_mem_bank(addr, b) (mem_banks[bankindex(addr)] = *(b)) -#endif +#define put_mem_bank(addr, b, realstart) do { \ + (mem_banks[bankindex(addr)] = (b)); \ + if ((b)->baseaddr) \ + baseaddr[bankindex(addr)] = (b)->baseaddr - (realstart); \ + else \ + baseaddr[bankindex(addr)] = (uae_u8*)(((long)b)+1); \ +} while (0) extern void memory_init(void); -extern void map_banks(addrbank *bank, int first, int count); +extern void map_banks(addrbank *bank, int first, int count, int realsize); #ifndef NO_INLINE_MEMORY_ACCESS @@ -136,37 +147,62 @@ extern void byteput(uaecptr addr, uae_u3 #endif -static __inline__ uae_u32 get_long(uaecptr addr) +STATIC_INLINE uae_u32 get_long(uaecptr addr) { return longget_1(addr); } -static __inline__ uae_u32 get_word(uaecptr addr) +STATIC_INLINE uae_u32 get_word(uaecptr addr) { return wordget_1(addr); } -static __inline__ uae_u32 get_byte(uaecptr addr) +STATIC_INLINE uae_u32 get_byte(uaecptr addr) { return byteget_1(addr); } -static __inline__ void put_long(uaecptr addr, uae_u32 l) +STATIC_INLINE void put_long(uaecptr addr, uae_u32 l) { longput_1(addr, l); } -static __inline__ void put_word(uaecptr addr, uae_u32 w) +STATIC_INLINE void put_word(uaecptr addr, uae_u32 w) { wordput_1(addr, w); } -static __inline__ void put_byte(uaecptr addr, uae_u32 b) +STATIC_INLINE void put_byte(uaecptr addr, uae_u32 b) { byteput_1(addr, b); } -static __inline__ uae_u8 *get_real_address(uaecptr addr) +STATIC_INLINE uae_u8 *get_real_address(uaecptr addr) { return get_mem_bank(addr).xlateaddr(addr); } -static __inline__ int valid_address(uaecptr addr, uae_u32 size) +STATIC_INLINE int valid_address(uaecptr addr, uae_u32 size) { return get_mem_bank(addr).check(addr, size); } + +/* For faster access in custom chip emulation. */ +extern uae_u32 chipmem_lget (uaecptr) REGPARAM; +extern uae_u32 chipmem_wget (uaecptr) REGPARAM; +extern uae_u32 chipmem_bget (uaecptr) REGPARAM; +extern void chipmem_lput (uaecptr, uae_u32) REGPARAM; +extern void chipmem_wput (uaecptr, uae_u32) REGPARAM; +extern void chipmem_bput (uaecptr, uae_u32) REGPARAM; + +#ifdef NATMEM_OFFSET + +typedef struct shmpiece_reg { + uae_u8 *native_address; + int id; + uae_u32 size; + struct shmpiece_reg *next; + struct shmpiece_reg *prev; +} shmpiece; + +extern shmpiece *shm_start; +extern int canbang; + +#endif + +extern uae_u8 *mapped_malloc (size_t, char *);