--- hatari/src/uae-cpu/maccess.h 2019/04/01 07:09:16 1.1 +++ hatari/src/uae-cpu/maccess.h 2019/04/09 08:53:24 1.1.1.5 @@ -1,56 +1,109 @@ - /* - * UAE - The Un*x Amiga Emulator - * - * Memory access functions + /* + * UAE - The Un*x Amiga Emulator - CPU core + * + * Big endian memory access functions. * * Copyright 1996 Bernd Schmidt + * + * Adaptation to Hatari by Thomas Huth, Eero Tamminen + * + * 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. */ -static __inline__ uae_u32 do_get_mem_long(uae_u32 *a) +#ifndef UAE_MACCESS_H +#define UAE_MACCESS_H + + +/* Can the actual CPU access unaligned memory? */ +#ifndef CPU_CAN_ACCESS_UNALIGNED +# if defined(__i386__) || defined(powerpc) || defined(__mc68020__) +# define CPU_CAN_ACCESS_UNALIGNED 1 +# else +# define CPU_CAN_ACCESS_UNALIGNED 0 +# endif +#endif + + +/* If the CPU can access unaligned memory, use these accelerated functions: */ +#if CPU_CAN_ACCESS_UNALIGNED + +#include + + +static inline uae_u32 do_get_mem_long(void *a) +{ + return SDL_SwapBE32(*(uae_u32 *)a); +} + +static inline uae_u16 do_get_mem_word(void *a) +{ + return SDL_SwapBE16(*(uae_u16 *)a); +} + + +static inline void do_put_mem_long(void *a, uae_u32 v) { - uae_u8 *b = (uae_u8 *)a; - - return (*b << 24) | (*(b+1) << 16) | (*(b+2) << 8) | (*(b+3)); + *(uae_u32 *)a = SDL_SwapBE32(v); } -static __inline__ uae_u16 do_get_mem_word(uae_u16 *a) +static inline void do_put_mem_word(void *a, uae_u16 v) { - uae_u8 *b = (uae_u8 *)a; - - return (*b << 8) | (*(b+1)); + *(uae_u16 *)a = SDL_SwapBE16(v); } -static __inline__ uae_u8 do_get_mem_byte(uae_u8 *a) + +#else /* Cpu can not access unaligned memory: */ + + +static inline uae_u32 do_get_mem_long(void *a) { - return *a; + uae_u8 *b = (uae_u8 *)a; + + return (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3]; } -static __inline__ void do_put_mem_long(uae_u32 *a, uae_u32 v) +static inline uae_u16 do_get_mem_word(void *a) { - uae_u8 *b = (uae_u8 *)a; - - *b = v >> 24; - *(b+1) = v >> 16; - *(b+2) = v >> 8; - *(b+3) = v; + uae_u8 *b = (uae_u8 *)a; + + return (b[0] << 8) | b[1]; } -static __inline__ void do_put_mem_word(uae_u16 *a, uae_u16 v) + +static inline void do_put_mem_long(void *a, uae_u32 v) { - uae_u8 *b = (uae_u8 *)a; - - *b = v >> 8; - *(b+1) = v; + uae_u8 *b = (uae_u8 *)a; + + b[0] = v >> 24; + b[1] = v >> 16; + b[2] = v >> 8; + b[3] = v; } -static __inline__ void do_put_mem_byte(uae_u8 *a, uae_u8 v) +static inline void do_put_mem_word(void *a, uae_u16 v) { - *a = v; + uae_u8 *b = (uae_u8 *)a; + + b[0] = v >> 8; + b[1] = v; } -#define call_mem_get_func(func, addr) ((*func)(addr)) -#define call_mem_put_func(func, addr, v) ((*func)(addr, v)) -#undef NO_INLINE_MEMORY_ACCESS -#undef MD_HAVE_MEM_1_FUNCS +#endif /* CPU_CAN_ACCESS_UNALIGNED */ + + +/* These are same for all architectures: */ + +static inline uae_u8 do_get_mem_byte(uae_u8 *a) +{ + return *a; +} + +static inline void do_put_mem_byte(uae_u8 *a, uae_u8 v) +{ + *a = v; +} + +#endif /* UAE_MACCESS_H */