--- SheepShaver/src/Unix/sysdeps.h 2002/02/21 15:12:12 1.2 +++ SheepShaver/src/Unix/sysdeps.h 2003/09/07 14:19:25 1.5 @@ -59,15 +59,28 @@ # endif #endif -// Are we using a PPC emulator or the real thing? -#ifdef __powerpc__ -#define EMULATED_PPC 0 -#else -#define EMULATED_PPC 1 -#endif +// Define for external components +#define SHEEPSHAVER 1 + +// Mac and host address space are the same +#define REAL_ADDRESSING 1 #define POWERPC_ROM 1 +#if EMULATED_PPC +// Mac ROM is write protected when banked memory is used +#if REAL_ADDRESSING || DIRECT_ADDRESSING +# define ROM_IS_WRITE_PROTECTED 0 +# define USE_SCRATCHMEM_SUBTERFUGE 1 +#else +# define ROM_IS_WRITE_PROTECTED 1 +#endif +#else +// Mac ROM is write protected +#define ROM_IS_WRITE_PROTECTED 1 +#define USE_SCRATCHMEM_SUBTERFUGE 0 +#endif + // Data types typedef unsigned char uint8; typedef signed char int8; @@ -92,12 +105,77 @@ typedef long int32; #if SIZEOF_LONG == 8 typedef unsigned long uint64; typedef long int64; +#define VAL64(a) (a ## l) +#define UVAL64(a) (a ## ul) #elif SIZEOF_LONG_LONG == 8 typedef unsigned long long uint64; typedef long long int64; +#define VAL64(a) (a ## LL) +#define UVAL64(a) (a ## uLL) #else #error "No 8 byte type, you lose." #endif +#if SIZEOF_VOID_P == 4 +typedef uint32 uintptr; +typedef int32 intptr; +#elif SIZEOF_VOID_P == 8 +typedef uint64 uintptr; +typedef int64 intptr; +#else +#error "Unsupported size of pointer" +#endif + +// Helper functions to byteswap data +#ifdef HAVE_BYTESWAP_H +#include +#endif + +#ifndef bswap_16 +#define bswap_16 generic_bswap_16 +#endif + +static inline uint16 generic_bswap_16(uint16 x) +{ + return ((x & 0xff) << 8) | ((x >> 8) & 0xff); +} + +#ifndef bswap_32 +#define bswap_32 generic_bswap_32 +#endif + +static inline uint32 generic_bswap_32(uint32 x) +{ + return (((x & 0xff000000) >> 24) | + ((x & 0x00ff0000) >> 8) | + ((x & 0x0000ff00) << 8) | + ((x & 0x000000ff) << 24) ); +} + +#ifndef bswap_64 +#define bswap_64 generic_bswap_64 +#endif + +static inline uint64 generic_bswap_64(uint64 x) +{ + return (((x & UVAL64(0xff00000000000000)) >> 56) | + ((x & UVAL64(0x00ff000000000000)) >> 40) | + ((x & UVAL64(0x0000ff0000000000)) >> 24) | + ((x & UVAL64(0x000000ff00000000)) >> 8) | + ((x & UVAL64(0x00000000ff000000)) << 8) | + ((x & UVAL64(0x0000000000ff0000)) << 24) | + ((x & UVAL64(0x000000000000ff00)) << 40) | + ((x & UVAL64(0x00000000000000ff)) << 56) ); +} + +#ifdef WORDS_BIGENDIAN +static inline uint16 tswap16(uint16 x) { return x; } +static inline uint32 tswap32(uint32 x) { return x; } +static inline uint64 tswap64(uint64 x) { return x; } +#else +static inline uint16 tswap16(uint16 x) { return bswap_16(x); } +static inline uint32 tswap32(uint32 x) { return bswap_32(x); } +static inline uint64 tswap64(uint64 x) { return bswap_64(x); } +#endif // Time data type for Time Manager emulation #ifdef HAVE_CLOCK_GETTIME @@ -127,13 +205,19 @@ typedef struct rgb_color { #define CallMacOS6(type, tvect, arg1, arg2, arg3, arg4, arg5, arg6) call_macos6((uint32)tvect, (uint32)arg1, (uint32)arg2, (uint32)arg3, (uint32)arg4, (uint32)arg5, (uint32)arg6) #define CallMacOS7(type, tvect, arg1, arg2, arg3, arg4, arg5, arg6, arg7) call_macos7((uint32)tvect, (uint32)arg1, (uint32)arg2, (uint32)arg3, (uint32)arg4, (uint32)arg5, (uint32)arg6, (uint32)arg7) -extern "C" uint32 call_macos(uint32 tvect); -extern "C" uint32 call_macos1(uint32 tvect, uint32 arg1); -extern "C" uint32 call_macos2(uint32 tvect, uint32 arg1, uint32 arg2); -extern "C" uint32 call_macos3(uint32 tvect, uint32 arg1, uint32 arg2, uint32 arg3); -extern "C" uint32 call_macos4(uint32 tvect, uint32 arg1, uint32 arg2, uint32 arg3, uint32 arg4); -extern "C" uint32 call_macos5(uint32 tvect, uint32 arg1, uint32 arg2, uint32 arg3, uint32 arg4, uint32 arg5); -extern "C" uint32 call_macos6(uint32 tvect, uint32 arg1, uint32 arg2, uint32 arg3, uint32 arg4, uint32 arg5, uint32 arg6); -extern "C" uint32 call_macos7(uint32 tvect, uint32 arg1, uint32 arg2, uint32 arg3, uint32 arg4, uint32 arg5, uint32 arg6, uint32 arg7); +#ifdef __cplusplus +extern "C" { +#endif +extern uint32 call_macos(uint32 tvect); +extern uint32 call_macos1(uint32 tvect, uint32 arg1); +extern uint32 call_macos2(uint32 tvect, uint32 arg1, uint32 arg2); +extern uint32 call_macos3(uint32 tvect, uint32 arg1, uint32 arg2, uint32 arg3); +extern uint32 call_macos4(uint32 tvect, uint32 arg1, uint32 arg2, uint32 arg3, uint32 arg4); +extern uint32 call_macos5(uint32 tvect, uint32 arg1, uint32 arg2, uint32 arg3, uint32 arg4, uint32 arg5); +extern uint32 call_macos6(uint32 tvect, uint32 arg1, uint32 arg2, uint32 arg3, uint32 arg4, uint32 arg5, uint32 arg6); +extern uint32 call_macos7(uint32 tvect, uint32 arg1, uint32 arg2, uint32 arg3, uint32 arg4, uint32 arg5, uint32 arg6, uint32 arg7); +#ifdef __cplusplus +} +#endif #endif