Updated puae patch
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user