Updated puae patch

This commit is contained in:
pelya
2011-08-29 18:27:41 +03:00
parent 39457725f6
commit e273541156

View File

@@ -654,6 +654,748 @@ index 831d376..8a8a877 100644
#include "identify.h"
const struct mem_labels int_labels[] =
diff --git a/src/include/memory.h b/src/include/memory.h
deleted file mode 100644
index 1a6b086..0000000
--- a/src/include/memory.h
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
- * UAE - The Un*x Amiga Emulator
- *
- * memory management
- *
- * Copyright 1995 Bernd Schmidt
- */
-
-extern void memory_reset (void);
-extern void a1000_reset (void);
-
-#ifdef JIT
-extern int special_mem;
-#define S_READ 1
-#define S_WRITE 2
-
-extern uae_u8 *cache_alloc (int);
-extern void cache_free (uae_u8*);
-
-int init_shm (void);
-void preinit_shm (void);
-extern bool canbang;
-extern int candirect;
-#endif
-
-#ifdef ADDRESS_SPACE_24BIT
-#define MEMORY_BANKS 256
-#define MEMORY_RANGE_MASK ((1<<24)-1)
-#else
-#define MEMORY_BANKS 65536
-#define MEMORY_RANGE_MASK (~0)
-#endif
-
-typedef uae_u32 (REGPARAM3 *mem_get_func)(uaecptr) REGPARAM;
-typedef void (REGPARAM3 *mem_put_func)(uaecptr, uae_u32) REGPARAM;
-typedef uae_u8 *(REGPARAM3 *xlate_func)(uaecptr) REGPARAM;
-typedef int (REGPARAM3 *check_func)(uaecptr, uae_u32) REGPARAM;
-
-extern uae_u8 *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, allocated_z3fastmem2, allocated_z3chipmem;
-extern uae_u32 max_z3fastmem;
-extern uae_u32 allocated_a3000mem;
-extern uae_u32 allocated_cardmem;
-
-extern uae_u32 wait_cpu_cycle_read (uaecptr addr, int mode);
-extern void wait_cpu_cycle_write (uaecptr addr, int mode, uae_u32 v);
-extern uae_u32 wait_cpu_cycle_read_ce020 (uaecptr addr, int mode);
-extern void wait_cpu_cycle_write_ce020 (uaecptr addr, int mode, uae_u32 v);
-
-#undef DIRECT_MEMFUNCS_SUCCESSFUL
-#include "machdep/maccess.h"
-#include "osdep/memory.h"
-
-#define chipmem_start 0x00000000
-#define bogomem_start 0x00C00000
-#define cardmem_start 0x00E00000
-#define kickmem_start 0x00F80000
-extern uaecptr z3fastmem_start, z3fastmem2_start, z3chipmem_start;
-extern uaecptr p96ram_start;
-extern uaecptr fastmem_start;
-extern uaecptr a3000lmem_start, a3000hmem_start;
-
-extern bool ersatzkickfile;
-extern bool cloanto_rom, kickstart_rom;
-extern uae_u16 kickstart_version;
-extern bool uae_boot_rom;
-extern int uae_boot_rom_size;
-extern uaecptr rtarea_base;
-
-extern uae_u8* baseaddr[];
-
-enum { ABFLAG_UNK = 0, ABFLAG_RAM = 1, ABFLAG_ROM = 2, ABFLAG_ROMIN = 4, ABFLAG_IO = 8, ABFLAG_NONE = 16, ABFLAG_SAFE = 32 };
-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
- * 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(). */
- xlate_func xlateaddr;
- /* To prevent calls to abort(), use check before calling xlateaddr.
- * It checks not only that the memory bank can do xlateaddr, but also
- * 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;
- TCHAR *name;
- /* for instruction opcode/operand fetches */
- mem_get_func lgeti, wgeti;
- int flags;
-} addrbank;
-
-#define CE_MEMBANK_FAST 0
-#define CE_MEMBANK_CHIP 1
-#define CE_MEMBANK_CIA 2
-#define CE_MEMBANK_FAST16BIT 3
-extern uae_u8 ce_banktype[65536], ce_cachable[65536];
-
-extern uae_u8 *filesysory;
-extern uae_u8 *rtarea;
-
-extern addrbank chipmem_bank;
-extern addrbank chipmem_agnus_bank;
-extern addrbank chipmem_bank_ce2;
-extern addrbank kickmem_bank;
-extern addrbank custom_bank;
-extern addrbank clock_bank;
-extern addrbank cia_bank;
-extern addrbank rtarea_bank;
-extern addrbank expamem_bank;
-extern addrbank fastmem_bank;
-extern addrbank gfxmem_bank;
-extern addrbank gayle_bank;
-extern addrbank gayle2_bank;
-extern addrbank mbres_bank;
-extern addrbank akiko_bank;
-extern addrbank cardmem_bank;
-
-extern void rtarea_init (void);
-extern void rtarea_init_mem (void);
-extern void rtarea_setup (void);
-extern void expamem_init (void);
-extern void expamem_reset (void);
-extern void expamem_next (void);
-
-extern uae_u32 gfxmem_start;
-extern uae_u8 *gfxmemory;
-extern uae_u32 gfxmem_mask;
-extern uae_u16 last_custom_value1;
-
-/* Default memory access functions */
-
-extern int REGPARAM3 default_check(uaecptr addr, uae_u32 size) REGPARAM;
-extern uae_u8 *REGPARAM3 default_xlate(uaecptr addr) REGPARAM;
-/* 680x0 opcode fetches */
-extern uae_u32 REGPARAM3 dummy_lgeti (uaecptr addr) REGPARAM;
-extern uae_u32 REGPARAM3 dummy_wgeti (uaecptr addr) REGPARAM;
-
-#define bankindex(addr) (((uaecptr)(addr)) >> 16)
-
-extern addrbank *mem_banks[MEMORY_BANKS];
-
-#ifdef JIT
-extern uae_u8 *baseaddr[MEMORY_BANKS];
-#endif
-
-#define get_mem_bank(addr) (*mem_banks[bankindex(addr)])
-
-#ifdef JIT
-#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*)(((uae_u8*)b)+1); \
-} while (0)
-#else
-#define put_mem_bank(addr, b, realstart) \
- (mem_banks[bankindex(addr)] = (b));
-#endif
-
-extern void memory_init (void);
-extern void memory_cleanup (void);
-extern void map_banks (addrbank *bank, int first, int count, int realsize);
-extern void map_overlay (int chip);
-extern void memory_hardreset (void);
-extern void free_fastmemory (void);
-
-#define longget(addr) (call_mem_get_func(get_mem_bank(addr).lget, addr))
-#define wordget(addr) (call_mem_get_func(get_mem_bank(addr).wget, addr))
-#define byteget(addr) (call_mem_get_func(get_mem_bank(addr).bget, addr))
-#define longgeti(addr) (call_mem_get_func(get_mem_bank(addr).lgeti, addr))
-#define wordgeti(addr) (call_mem_get_func(get_mem_bank(addr).wgeti, addr))
-#define longput(addr,l) (call_mem_put_func(get_mem_bank(addr).lput, addr, l))
-#define wordput(addr,w) (call_mem_put_func(get_mem_bank(addr).wput, addr, w))
-#define byteput(addr,b) (call_mem_put_func(get_mem_bank(addr).bput, addr, b))
-
-STATIC_INLINE uae_u32 get_long (uaecptr addr)
-{
- return longget (addr);
-}
-STATIC_INLINE uae_u32 get_word (uaecptr addr)
-{
- return wordget (addr);
-}
-STATIC_INLINE uae_u32 get_byte (uaecptr addr)
-{
- return byteget (addr);
-}
-STATIC_INLINE uae_u32 get_longi(uaecptr addr)
-{
- return longgeti (addr);
-}
-STATIC_INLINE uae_u32 get_wordi(uaecptr addr)
-{
- return wordgeti (addr);
-}
-
-/*
- * Read a host pointer from addr
- */
-#if SIZEOF_VOID_P == 4
-# define get_pointer(addr) ((void *)get_long (addr))
-#else
-# if SIZEOF_VOID_P == 8
-STATIC_INLINE void *get_pointer (uaecptr addr)
-{
- const unsigned int n = SIZEOF_VOID_P / 4;
- union {
- void *ptr;
- uae_u32 longs[SIZEOF_VOID_P / 4];
- } p;
- unsigned int i;
-
- for (i = 0; i < n; i++) {
-#ifdef WORDS_BIGENDIAN
- p.longs[i] = get_long (addr + i * 4);
-#else
- p.longs[n - 1 - i] = get_long (addr + i * 4);
-#endif
- }
- return p.ptr;
-}
-# else
-# error "Unknown or unsupported pointer size."
-# endif
-#endif
-
-STATIC_INLINE void put_long (uaecptr addr, uae_u32 l)
-{
- longput(addr, l);
-}
-STATIC_INLINE void put_word (uaecptr addr, uae_u32 w)
-{
- wordput(addr, w);
-}
-STATIC_INLINE void put_byte (uaecptr addr, uae_u32 b)
-{
- byteput(addr, b);
-}
-
-extern void put_long_slow (uaecptr addr, uae_u32 v);
-extern void put_word_slow (uaecptr addr, uae_u32 v);
-extern void put_byte_slow (uaecptr addr, uae_u32 v);
-extern uae_u32 get_long_slow (uaecptr addr);
-extern uae_u32 get_word_slow (uaecptr addr);
-extern uae_u32 get_byte_slow (uaecptr addr);
-
-
-/*
- * Store host pointer v at addr
- */
-#if SIZEOF_VOID_P == 4
-# define put_pointer(addr, p) (put_long ((addr), (uae_u32)(p)))
-#else
-# if SIZEOF_VOID_P == 8
-STATIC_INLINE void put_pointer (uaecptr addr, void *v)
-{
- const unsigned int n = SIZEOF_VOID_P / 4;
- union {
- void *ptr;
- uae_u32 longs[SIZEOF_VOID_P / 4];
- } p;
- unsigned int i;
-
- p.ptr = v;
-
- for (i = 0; i < n; i++) {
-#ifdef WORDS_BIGENDIAN
- put_long (addr + i * 4, p.longs[i]);
-#else
- put_long (addr + i * 4, p.longs[n - 1 - i]);
-#endif
- }
-}
-# endif
-#endif
-
-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)
-{
- return get_mem_bank (addr).check(addr, size);
-}
-
-extern int addr_valid (TCHAR*, uaecptr,uae_u32);
-
-/* For faster access in custom chip emulation. */
-extern uae_u32 REGPARAM3 chipmem_lget (uaecptr) REGPARAM;
-extern uae_u32 REGPARAM3 chipmem_wget (uaecptr) REGPARAM;
-extern uae_u32 REGPARAM3 chipmem_bget (uaecptr) REGPARAM;
-extern void REGPARAM3 chipmem_lput (uaecptr, uae_u32) REGPARAM;
-extern void REGPARAM3 chipmem_wput (uaecptr, uae_u32) REGPARAM;
-extern void REGPARAM3 chipmem_bput (uaecptr, uae_u32) REGPARAM;
-
-extern uae_u32 REGPARAM3 chipmem_agnus_lget (uaecptr) REGPARAM;
-extern uae_u32 REGPARAM3 chipmem_agnus_wget (uaecptr) REGPARAM;
-extern uae_u32 REGPARAM3 chipmem_agnus_bget (uaecptr) REGPARAM;
-extern void REGPARAM3 chipmem_agnus_lput (uaecptr, uae_u32) REGPARAM;
-extern void REGPARAM3 chipmem_agnus_wput (uaecptr, uae_u32) REGPARAM;
-extern void REGPARAM3 chipmem_agnus_bput (uaecptr, uae_u32) REGPARAM;
-
-extern uae_u32 chipmem_mask, kickmem_mask;
-extern uae_u8 *kickmemory;
-extern int kickmem_size;
-extern addrbank dummy_bank;
-
-/* 68020+ Chip RAM DMA contention emulation */
-extern uae_u32 REGPARAM3 chipmem_lget_ce2 (uaecptr) REGPARAM;
-extern uae_u32 REGPARAM3 chipmem_wget_ce2 (uaecptr) REGPARAM;
-extern uae_u32 REGPARAM3 chipmem_bget_ce2 (uaecptr) REGPARAM;
-extern void REGPARAM3 chipmem_lput_ce2 (uaecptr, uae_u32) REGPARAM;
-extern void REGPARAM3 chipmem_wput_ce2 (uaecptr, uae_u32) REGPARAM;
-extern void REGPARAM3 chipmem_bput_ce2 (uaecptr, uae_u32) REGPARAM;
-
-extern uae_u32 (REGPARAM3 *chipmem_lget_indirect)(uaecptr) REGPARAM;
-extern uae_u32 (REGPARAM3 *chipmem_wget_indirect)(uaecptr) REGPARAM;
-extern uae_u32 (REGPARAM3 *chipmem_bget_indirect)(uaecptr) REGPARAM;
-extern void (REGPARAM3 *chipmem_lput_indirect)(uaecptr, uae_u32) REGPARAM;
-extern void (REGPARAM3 *chipmem_wput_indirect)(uaecptr, uae_u32) REGPARAM;
-extern void (REGPARAM3 *chipmem_bput_indirect)(uaecptr, uae_u32) REGPARAM;
-extern int (REGPARAM2 *chipmem_check_indirect)(uaecptr, uae_u32);
-extern uae_u8 *(REGPARAM2 *chipmem_xlate_indirect)(uaecptr);
-
-#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;
-
-#endif
-
-extern uae_u8 *mapped_malloc (size_t, const TCHAR*);
-extern void mapped_free (uae_u8 *);
-extern void clearexec (void);
-extern void mapkick (void);
-extern void a3000_fakekick (int);
-
-extern uaecptr strcpyha_safe (uaecptr dst, const uae_char *src);
-extern uae_char *strcpyah_safe (uae_char *dst, uaecptr src, int maxsize);
-extern void memcpyha_safe (uaecptr dst, const uae_u8 *src, int size);
-//extern void memcpyha (uaecptr dst, const uae_u8 *src, int size);
-extern void memcpyah_safe (uae_u8 *dst, uaecptr src, int size);
-extern void memcpyah (uae_u8 *dst, uaecptr src, int size);
-
diff --git a/src/include/uae_memory.h b/src/include/uae_memory.h
new file mode 100644
index 0000000..1a6b086
--- /dev/null
+++ b/src/include/uae_memory.h
@@ -0,0 +1,365 @@
+/*
+ * UAE - The Un*x Amiga Emulator
+ *
+ * memory management
+ *
+ * Copyright 1995 Bernd Schmidt
+ */
+
+extern void memory_reset (void);
+extern void a1000_reset (void);
+
+#ifdef JIT
+extern int special_mem;
+#define S_READ 1
+#define S_WRITE 2
+
+extern uae_u8 *cache_alloc (int);
+extern void cache_free (uae_u8*);
+
+int init_shm (void);
+void preinit_shm (void);
+extern bool canbang;
+extern int candirect;
+#endif
+
+#ifdef ADDRESS_SPACE_24BIT
+#define MEMORY_BANKS 256
+#define MEMORY_RANGE_MASK ((1<<24)-1)
+#else
+#define MEMORY_BANKS 65536
+#define MEMORY_RANGE_MASK (~0)
+#endif
+
+typedef uae_u32 (REGPARAM3 *mem_get_func)(uaecptr) REGPARAM;
+typedef void (REGPARAM3 *mem_put_func)(uaecptr, uae_u32) REGPARAM;
+typedef uae_u8 *(REGPARAM3 *xlate_func)(uaecptr) REGPARAM;
+typedef int (REGPARAM3 *check_func)(uaecptr, uae_u32) REGPARAM;
+
+extern uae_u8 *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, allocated_z3fastmem2, allocated_z3chipmem;
+extern uae_u32 max_z3fastmem;
+extern uae_u32 allocated_a3000mem;
+extern uae_u32 allocated_cardmem;
+
+extern uae_u32 wait_cpu_cycle_read (uaecptr addr, int mode);
+extern void wait_cpu_cycle_write (uaecptr addr, int mode, uae_u32 v);
+extern uae_u32 wait_cpu_cycle_read_ce020 (uaecptr addr, int mode);
+extern void wait_cpu_cycle_write_ce020 (uaecptr addr, int mode, uae_u32 v);
+
+#undef DIRECT_MEMFUNCS_SUCCESSFUL
+#include "machdep/maccess.h"
+#include "osdep/memory.h"
+
+#define chipmem_start 0x00000000
+#define bogomem_start 0x00C00000
+#define cardmem_start 0x00E00000
+#define kickmem_start 0x00F80000
+extern uaecptr z3fastmem_start, z3fastmem2_start, z3chipmem_start;
+extern uaecptr p96ram_start;
+extern uaecptr fastmem_start;
+extern uaecptr a3000lmem_start, a3000hmem_start;
+
+extern bool ersatzkickfile;
+extern bool cloanto_rom, kickstart_rom;
+extern uae_u16 kickstart_version;
+extern bool uae_boot_rom;
+extern int uae_boot_rom_size;
+extern uaecptr rtarea_base;
+
+extern uae_u8* baseaddr[];
+
+enum { ABFLAG_UNK = 0, ABFLAG_RAM = 1, ABFLAG_ROM = 2, ABFLAG_ROMIN = 4, ABFLAG_IO = 8, ABFLAG_NONE = 16, ABFLAG_SAFE = 32 };
+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
+ * 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(). */
+ xlate_func xlateaddr;
+ /* To prevent calls to abort(), use check before calling xlateaddr.
+ * It checks not only that the memory bank can do xlateaddr, but also
+ * 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;
+ TCHAR *name;
+ /* for instruction opcode/operand fetches */
+ mem_get_func lgeti, wgeti;
+ int flags;
+} addrbank;
+
+#define CE_MEMBANK_FAST 0
+#define CE_MEMBANK_CHIP 1
+#define CE_MEMBANK_CIA 2
+#define CE_MEMBANK_FAST16BIT 3
+extern uae_u8 ce_banktype[65536], ce_cachable[65536];
+
+extern uae_u8 *filesysory;
+extern uae_u8 *rtarea;
+
+extern addrbank chipmem_bank;
+extern addrbank chipmem_agnus_bank;
+extern addrbank chipmem_bank_ce2;
+extern addrbank kickmem_bank;
+extern addrbank custom_bank;
+extern addrbank clock_bank;
+extern addrbank cia_bank;
+extern addrbank rtarea_bank;
+extern addrbank expamem_bank;
+extern addrbank fastmem_bank;
+extern addrbank gfxmem_bank;
+extern addrbank gayle_bank;
+extern addrbank gayle2_bank;
+extern addrbank mbres_bank;
+extern addrbank akiko_bank;
+extern addrbank cardmem_bank;
+
+extern void rtarea_init (void);
+extern void rtarea_init_mem (void);
+extern void rtarea_setup (void);
+extern void expamem_init (void);
+extern void expamem_reset (void);
+extern void expamem_next (void);
+
+extern uae_u32 gfxmem_start;
+extern uae_u8 *gfxmemory;
+extern uae_u32 gfxmem_mask;
+extern uae_u16 last_custom_value1;
+
+/* Default memory access functions */
+
+extern int REGPARAM3 default_check(uaecptr addr, uae_u32 size) REGPARAM;
+extern uae_u8 *REGPARAM3 default_xlate(uaecptr addr) REGPARAM;
+/* 680x0 opcode fetches */
+extern uae_u32 REGPARAM3 dummy_lgeti (uaecptr addr) REGPARAM;
+extern uae_u32 REGPARAM3 dummy_wgeti (uaecptr addr) REGPARAM;
+
+#define bankindex(addr) (((uaecptr)(addr)) >> 16)
+
+extern addrbank *mem_banks[MEMORY_BANKS];
+
+#ifdef JIT
+extern uae_u8 *baseaddr[MEMORY_BANKS];
+#endif
+
+#define get_mem_bank(addr) (*mem_banks[bankindex(addr)])
+
+#ifdef JIT
+#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*)(((uae_u8*)b)+1); \
+} while (0)
+#else
+#define put_mem_bank(addr, b, realstart) \
+ (mem_banks[bankindex(addr)] = (b));
+#endif
+
+extern void memory_init (void);
+extern void memory_cleanup (void);
+extern void map_banks (addrbank *bank, int first, int count, int realsize);
+extern void map_overlay (int chip);
+extern void memory_hardreset (void);
+extern void free_fastmemory (void);
+
+#define longget(addr) (call_mem_get_func(get_mem_bank(addr).lget, addr))
+#define wordget(addr) (call_mem_get_func(get_mem_bank(addr).wget, addr))
+#define byteget(addr) (call_mem_get_func(get_mem_bank(addr).bget, addr))
+#define longgeti(addr) (call_mem_get_func(get_mem_bank(addr).lgeti, addr))
+#define wordgeti(addr) (call_mem_get_func(get_mem_bank(addr).wgeti, addr))
+#define longput(addr,l) (call_mem_put_func(get_mem_bank(addr).lput, addr, l))
+#define wordput(addr,w) (call_mem_put_func(get_mem_bank(addr).wput, addr, w))
+#define byteput(addr,b) (call_mem_put_func(get_mem_bank(addr).bput, addr, b))
+
+STATIC_INLINE uae_u32 get_long (uaecptr addr)
+{
+ return longget (addr);
+}
+STATIC_INLINE uae_u32 get_word (uaecptr addr)
+{
+ return wordget (addr);
+}
+STATIC_INLINE uae_u32 get_byte (uaecptr addr)
+{
+ return byteget (addr);
+}
+STATIC_INLINE uae_u32 get_longi(uaecptr addr)
+{
+ return longgeti (addr);
+}
+STATIC_INLINE uae_u32 get_wordi(uaecptr addr)
+{
+ return wordgeti (addr);
+}
+
+/*
+ * Read a host pointer from addr
+ */
+#if SIZEOF_VOID_P == 4
+# define get_pointer(addr) ((void *)get_long (addr))
+#else
+# if SIZEOF_VOID_P == 8
+STATIC_INLINE void *get_pointer (uaecptr addr)
+{
+ const unsigned int n = SIZEOF_VOID_P / 4;
+ union {
+ void *ptr;
+ uae_u32 longs[SIZEOF_VOID_P / 4];
+ } p;
+ unsigned int i;
+
+ for (i = 0; i < n; i++) {
+#ifdef WORDS_BIGENDIAN
+ p.longs[i] = get_long (addr + i * 4);
+#else
+ p.longs[n - 1 - i] = get_long (addr + i * 4);
+#endif
+ }
+ return p.ptr;
+}
+# else
+# error "Unknown or unsupported pointer size."
+# endif
+#endif
+
+STATIC_INLINE void put_long (uaecptr addr, uae_u32 l)
+{
+ longput(addr, l);
+}
+STATIC_INLINE void put_word (uaecptr addr, uae_u32 w)
+{
+ wordput(addr, w);
+}
+STATIC_INLINE void put_byte (uaecptr addr, uae_u32 b)
+{
+ byteput(addr, b);
+}
+
+extern void put_long_slow (uaecptr addr, uae_u32 v);
+extern void put_word_slow (uaecptr addr, uae_u32 v);
+extern void put_byte_slow (uaecptr addr, uae_u32 v);
+extern uae_u32 get_long_slow (uaecptr addr);
+extern uae_u32 get_word_slow (uaecptr addr);
+extern uae_u32 get_byte_slow (uaecptr addr);
+
+
+/*
+ * Store host pointer v at addr
+ */
+#if SIZEOF_VOID_P == 4
+# define put_pointer(addr, p) (put_long ((addr), (uae_u32)(p)))
+#else
+# if SIZEOF_VOID_P == 8
+STATIC_INLINE void put_pointer (uaecptr addr, void *v)
+{
+ const unsigned int n = SIZEOF_VOID_P / 4;
+ union {
+ void *ptr;
+ uae_u32 longs[SIZEOF_VOID_P / 4];
+ } p;
+ unsigned int i;
+
+ p.ptr = v;
+
+ for (i = 0; i < n; i++) {
+#ifdef WORDS_BIGENDIAN
+ put_long (addr + i * 4, p.longs[i]);
+#else
+ put_long (addr + i * 4, p.longs[n - 1 - i]);
+#endif
+ }
+}
+# endif
+#endif
+
+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)
+{
+ return get_mem_bank (addr).check(addr, size);
+}
+
+extern int addr_valid (TCHAR*, uaecptr,uae_u32);
+
+/* For faster access in custom chip emulation. */
+extern uae_u32 REGPARAM3 chipmem_lget (uaecptr) REGPARAM;
+extern uae_u32 REGPARAM3 chipmem_wget (uaecptr) REGPARAM;
+extern uae_u32 REGPARAM3 chipmem_bget (uaecptr) REGPARAM;
+extern void REGPARAM3 chipmem_lput (uaecptr, uae_u32) REGPARAM;
+extern void REGPARAM3 chipmem_wput (uaecptr, uae_u32) REGPARAM;
+extern void REGPARAM3 chipmem_bput (uaecptr, uae_u32) REGPARAM;
+
+extern uae_u32 REGPARAM3 chipmem_agnus_lget (uaecptr) REGPARAM;
+extern uae_u32 REGPARAM3 chipmem_agnus_wget (uaecptr) REGPARAM;
+extern uae_u32 REGPARAM3 chipmem_agnus_bget (uaecptr) REGPARAM;
+extern void REGPARAM3 chipmem_agnus_lput (uaecptr, uae_u32) REGPARAM;
+extern void REGPARAM3 chipmem_agnus_wput (uaecptr, uae_u32) REGPARAM;
+extern void REGPARAM3 chipmem_agnus_bput (uaecptr, uae_u32) REGPARAM;
+
+extern uae_u32 chipmem_mask, kickmem_mask;
+extern uae_u8 *kickmemory;
+extern int kickmem_size;
+extern addrbank dummy_bank;
+
+/* 68020+ Chip RAM DMA contention emulation */
+extern uae_u32 REGPARAM3 chipmem_lget_ce2 (uaecptr) REGPARAM;
+extern uae_u32 REGPARAM3 chipmem_wget_ce2 (uaecptr) REGPARAM;
+extern uae_u32 REGPARAM3 chipmem_bget_ce2 (uaecptr) REGPARAM;
+extern void REGPARAM3 chipmem_lput_ce2 (uaecptr, uae_u32) REGPARAM;
+extern void REGPARAM3 chipmem_wput_ce2 (uaecptr, uae_u32) REGPARAM;
+extern void REGPARAM3 chipmem_bput_ce2 (uaecptr, uae_u32) REGPARAM;
+
+extern uae_u32 (REGPARAM3 *chipmem_lget_indirect)(uaecptr) REGPARAM;
+extern uae_u32 (REGPARAM3 *chipmem_wget_indirect)(uaecptr) REGPARAM;
+extern uae_u32 (REGPARAM3 *chipmem_bget_indirect)(uaecptr) REGPARAM;
+extern void (REGPARAM3 *chipmem_lput_indirect)(uaecptr, uae_u32) REGPARAM;
+extern void (REGPARAM3 *chipmem_wput_indirect)(uaecptr, uae_u32) REGPARAM;
+extern void (REGPARAM3 *chipmem_bput_indirect)(uaecptr, uae_u32) REGPARAM;
+extern int (REGPARAM2 *chipmem_check_indirect)(uaecptr, uae_u32);
+extern uae_u8 *(REGPARAM2 *chipmem_xlate_indirect)(uaecptr);
+
+#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;
+
+#endif
+
+extern uae_u8 *mapped_malloc (size_t, const TCHAR*);
+extern void mapped_free (uae_u8 *);
+extern void clearexec (void);
+extern void mapkick (void);
+extern void a3000_fakekick (int);
+
+extern uaecptr strcpyha_safe (uaecptr dst, const uae_char *src);
+extern uae_char *strcpyah_safe (uae_char *dst, uaecptr src, int maxsize);
+extern void memcpyha_safe (uaecptr dst, const uae_u8 *src, int size);
+//extern void memcpyha (uaecptr dst, const uae_u8 *src, int size);
+extern void memcpyah_safe (uae_u8 *dst, uaecptr src, int size);
+extern void memcpyah (uae_u8 *dst, uaecptr src, int size);
+
diff --git a/src/inputdevice.c b/src/inputdevice.c
index 8704829..84a6e24 100644
--- a/src/inputdevice.c