--- hatari/src/uae-cpu/memory.h 2019/04/01 07:09:16 1.1.1.1 +++ hatari/src/uae-cpu/memory.h 2019/04/09 08:55:51 1.1.1.8 @@ -4,10 +4,20 @@ * memory management * * Copyright 1995 Bernd Schmidt + * + * Adaptation to Hatari by Thomas Huth + * + * This file is distributed under the GNU General Public License, version 2 + * or at your option any later version. Read the file gpl.txt for details. */ -#ifndef UAEMEMORY -#define UAEMEMORY +#ifndef UAE_MEMORY_H +#define UAE_MEMORY_H + +#include "maccess.h" + +#define call_mem_get_func(func, addr) ((*func)(addr)) +#define call_mem_put_func(func, addr, v) ((*func)(addr, v)) /* Enabling this adds one additional native memory reference per 68k memory @@ -18,9 +28,6 @@ #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; @@ -28,40 +35,19 @@ typedef uae_u8 *(*xlate_func)(uaecptr) R typedef int (*check_func)(uaecptr, uae_u32) REGPARAM; 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 "machdep/maccess.h"*/ - -#ifndef CAN_MAP_MEMORY -#undef USE_COMPILER -#endif - -#if defined(USE_COMPILER) && !defined(USE_MAPPED_MEMORY) -#define USE_MAPPED_MEMORY -#endif - -#define ROMmem_size TOSSize -#define ROMmem_start TOSAddress - -#define STmem_start 0x00000000 -#define TTmem_start 0x01000000 - -#define IOmem_start 0x00FF8000 -#define IOmem_size 32768 +enum +{ + ABFLAG_UNK = 0, ABFLAG_RAM = 1, ABFLAG_ROM = 2, ABFLAG_ROMIN = 4, ABFLAG_IO = 8, + ABFLAG_NONE = 16, ABFLAG_SAFE = 32, ABFLAG_INDIRECT = 64, ABFLAG_NOALLOC = 128, + ABFLAG_RTG = 256, ABFLAG_THREADSAFE = 512, ABFLAG_DIRECTMAP = 1024 +}; typedef struct { /* These ones should be self-explanatory... */ mem_get_func lget, wget, bget; mem_put_func lput, wput, bput; - /* Use xlateaddr to translate an Amiga address to a uae_u8 * that can + /* Use xlateaddr to translate an Atari address to a uae_u8 * that can * be used to address memory without calling the wget/wput functions. * This doesn't work for all memory banks, so this function may call * abort(). */ @@ -71,29 +57,16 @@ 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; + int flags; + uae_u32 mask; + uae_u32 start; } addrbank; -extern uae_u8 filesysory[65536]; - -extern addrbank STmem_bank; -extern addrbank ROMmem_bank; -extern addrbank custom_bank; -extern addrbank TTmem_bank; - -extern void rtarea_init (void); -extern void rtarea_setup (void); -extern void expamem_init (void); -extern void expamem_reset (void); - -extern uae_u32 gfxmem_start; -extern uae_u8 *gfxmemory; -extern uae_u32 gfxmem_mask; -extern int address_space_24; - -/* Default memory access functions */ - -extern int default_check(uaecptr addr, uae_u32 size) REGPARAM; -extern uae_u8 *default_xlate(uaecptr addr) REGPARAM; #define bankindex(addr) (((uaecptr)(addr)) >> 16) @@ -107,7 +80,9 @@ extern addrbank mem_banks[65536]; #define put_mem_bank(addr, b) (mem_banks[bankindex(addr)] = *(b)) #endif -extern void memory_init(void); +extern bool memory_region_bus_error ( uaecptr addr ); +extern void memory_init(uae_u32 nNewSTMemSize, uae_u32 nNewTTMemSize, uae_u32 nNewRomMemStart); +extern void memory_uninit (void); extern void map_banks(addrbank *bank, int first, int count); #ifndef NO_INLINE_MEMORY_ACCESS @@ -132,59 +107,46 @@ extern void byteput(uaecptr addr, uae_u3 #endif -#ifndef MD_HAVE_MEM_1_FUNCS - -#define longget_1 longget -#define wordget_1 wordget -#define byteget_1 byteget -#define longput_1 longput -#define wordput_1 wordput -#define byteput_1 byteput - -#endif -STATIC_INLINE uae_u32 get_long(uaecptr addr) +static inline uae_u32 get_long(uaecptr addr) { - return longget_1(addr); + return longget(addr); } -STATIC_INLINE uae_u32 get_word(uaecptr addr) + +static inline uae_u32 get_word(uaecptr addr) { - return wordget_1(addr); + return wordget(addr); } -STATIC_INLINE uae_u32 get_byte(uaecptr addr) + +static inline uae_u32 get_byte(uaecptr addr) { - return byteget_1(addr); + return byteget(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); + longput(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); + wordput(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); + byteput(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; - -#endif /* UAEMEMORY */ +#endif /* UAE_MEMORY_H */