aboutsummaryrefslogtreecommitdiff
path: root/SrcShared/Switches.h
diff options
context:
space:
mode:
Diffstat (limited to 'SrcShared/Switches.h')
-rw-r--r--SrcShared/Switches.h267
1 files changed, 267 insertions, 0 deletions
diff --git a/SrcShared/Switches.h b/SrcShared/Switches.h
new file mode 100644
index 0000000..0dc0ca8
--- /dev/null
+++ b/SrcShared/Switches.h
@@ -0,0 +1,267 @@
+/* -*- mode: C++; tab-width: 4 -*- */
+/* ===================================================================== *\
+ Copyright (c) 1998-2001 Palm, Inc. or its subsidiaries.
+ All rights reserved.
+
+ This file is part of the Palm OS Emulator.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+\* ===================================================================== */
+
+#ifndef _SWITCHES_H_
+#define _SWITCHES_H_
+
+// Use convention: for the preprocessor symbols in this file used to
+// turn features on and off, we follow the "if 0 or not 0" convention,
+// not the "if defined or not defined" convention. Thus, to turn
+// off a feature, set the symbol to 0. To turn on a feature, set the
+// symbol to 1.
+
+// BYTESWAP is used by Byteswapping.h/.cpp to determine if
+// byteswapping should actually occur. If not, it's a NOP.
+
+#if PLATFORM_WINDOWS || defined (HAVE_ENDIAN_H)
+
+ #include <endian.h>
+
+#elif PLATFORM_MAC || defined (HAVE_MACHINE_ENDIAN_H)
+
+ #include <machine/endian.h>
+
+#elif defined(HAVE_SYS_ISA_DEFS_H)
+
+ // This should handle both Solaris/Sparc and Solaris/Intel
+ #include <sys/isa_defs.h> // Defines either _BIG_ENDIAN or _LITTLE_ENDIAN
+
+#else
+
+ #error "You need to define __BYTE_ORDER for this platform."
+
+ // You can either define __BYTE_ORDER here, or you can provide
+ // a file called endian.h. If you take the latter course, rerun
+ // the configure script so that it can rebuild the makefile with
+ // HAVE_ENDIAN_H defined.
+
+ #define __LITTLE_ENDIAN 1234
+ #define __BIG_ENDIAN 4321
+ #define __PDP_ENDIAN 3412
+ #define __BYTE_ORDER <one of the above>
+
+#endif
+
+// Settle on a canonical name.
+
+#if defined (__BYTE_ORDER)
+
+ #define EM_LITTLE_ENDIAN __LITTLE_ENDIAN
+ #define EM_BIG_ENDIAN __BIG_ENDIAN
+ #define EM_PDP_ENDIAN __PDP_ENDIAN
+ #define EM_HOST_BYTE_ORDER __BYTE_ORDER
+
+#elif defined (BYTE_ORDER)
+
+ #define EM_LITTLE_ENDIAN LITTLE_ENDIAN
+ #define EM_BIG_ENDIAN BIG_ENDIAN
+ #define EM_PDP_ENDIAN PDP_ENDIAN
+ #define EM_HOST_BYTE_ORDER BYTE_ORDER
+
+#elif defined (_BIG_ENDIAN) || defined (_LITTLE_ENDIAN)
+
+ #define EM_LITTLE_ENDIAN 1234
+ #define EM_BIG_ENDIAN 4321
+ #define EM_PDP_ENDIAN 3412
+
+ #if defined (_BIG_ENDIAN)
+ #define EM_HOST_BYTE_ORDER EM_BIG_ENDIAN
+ #else
+ #define EM_HOST_BYTE_ORDER EM_LITTLE_ENDIAN
+ #endif
+
+#else
+
+ #error "Neither BYTE_ORDER nor __BYTE_ORDER defined for this platform."
+
+#endif
+
+
+#if (EM_HOST_BYTE_ORDER == EM_LITTLE_ENDIAN)
+ #define BYTESWAP 1
+ #define WORDSWAP_MEMORY 1 // Gives us 12% speedup.
+
+ // (adam) When WORDSWAP_MEMORY is defined, a sequence of bytes which is stored in memory on
+ // the Pilot in the sequence A, B, C, D is stored in Windows memory in the sequence B, A, D, C.
+ // This means that if p is the address of a byte in Pilot memory, (p ^ 1) is its address in
+ // Windows memory. This is fast because we can load a 16-bit word from Windows memory without doing any
+ // byte swapping and without having to mutate its address, and because we can load a 32-bit int
+ // from Windows memory just by flipping the 16 high-order bits with the 16 low-order bits.
+ //
+ // I thought about whether we could store the above bytes in Windows memory in the "longswapped" sequence
+ // D, C, B, A, which would allow us to load a 32-bit int without doing any byte swapping at all;
+ // we would then have to mutate a pointer p to a 16-bit-word into (p ^ 2). That would probably
+ // be even better than word swapping if all 32-bit accesses were 32-bit aligned. Since the 68000
+ // allows 32-bit accesses on arbitrary 16-bit boundaries, however, this scheme won't work. For
+ // example, suppose that the 68000 contains a sequence of bytes starting at address 0x1000:
+ // 1, 2, 3, 4, 5, 6, 7, 8
+ // And suppose that we store these bytes in the emulator as
+ // 4, 3, 2, 1, 8, 7, 6, 5
+ // Now if we load a 32-bit int starting at 0x1000 simply by reading it from Intel memory, we get
+ // the value 0x01020304, which is correct.
+ // But if we load a 32-bit int starting at 0x1002, we get the value 0x07080102, whereas we wanted
+ // the value 0x03040506.
+ // We could still make this work if we checked for 32-bit accesses which were not aligned on
+ // 32-bit boundaries, but I'm not sure whether it would be worth the performance gain.
+ // I don't know whether the "12% speedup" listed above is a speedup over storing bytes in Windows
+ // memory exactly as they are stored in 68000 memory, or over storing bytes in this "longswapped" way.
+ //
+ // (keith) The former. I never implemented "longswapped" for the reasons you gave.
+#else
+ #define BYTESWAP 0
+ #define WORDSWAP_MEMORY 0
+#endif
+
+
+// Define UNALIGNED_LONG_ACCESS to 1 if the host processor can
+// access 32-bit values on all 16-bit boundaries. Setting it to
+// 0 will cause the emulator to fetch 32-bit values with two
+// 16-bit operations.
+
+#if defined (sparc)
+ #define UNALIGNED_LONG_ACCESS 0
+#else
+ #define UNALIGNED_LONG_ACCESS 1
+#endif
+
+// Define a utility symbol that is guaranteed to be one in debug mode
+// and zero in non-debug mode (I don't know what _DEBUG is actually
+// defined to, so I'm not going to make any assumptions...)
+
+#if defined (_DEBUG)
+ #define ON_IN_DEBUG_MODE 1
+#else
+ #define ON_IN_DEBUG_MODE 0
+#endif
+
+
+// Define PROFILE_MEMORY to 1 to turn on profiling of memory access.
+// Profiling means collecting how often various sections of memory
+// are accessed and how they are accessed (read vs. write, byte vs.
+// word vs. long.)
+
+#define PROFILE_MEMORY 0
+
+
+// Define REGISTER_HISTORY to 1 to keep a history of the last 512
+// register states.
+
+#define REGISTER_HISTORY ON_IN_DEBUG_MODE
+
+
+// Define EXCEPTION_HISTORY to 1 to keep a history of the last 512
+// exceptions encountered.
+
+#define EXCEPTION_HISTORY ON_IN_DEBUG_MODE
+
+
+// The number of ticks between calls to WaitNextEvent (Mac only).
+
+#define EVENT_THRESHHOLD 6
+
+
+// Define NATIVE_DISPATCHING to 1 to have the emulator manage
+// the dispatching of SYSTRAP functions. Otherwise, the ROM
+// handles the dispatching. The advantage of having the emulator
+// do the dispatching is that it's faster.
+
+#define NATIVE_DISPATCHING 1
+
+
+// Define HAS_TRACER to 1 to include Tracer facility.
+
+#if PLATFORM_MAC || PLATFORM_WINDOWS
+ #define HAS_TRACER 1
+#else
+ #define HAS_TRACER 0
+#endif
+
+
+// Define HAS_OMNI_THREAD 1 to if this platform uses that facility
+// for multi-threading.
+
+#if PLATFORM_UNIX || PLATFORM_WINDOWS
+ #define HAS_OMNI_THREAD 1
+#else
+ #define HAS_OMNI_THREAD 0
+#endif
+
+
+// Define sub-flags for specific internal features.
+
+
+
+// The emulator can optionally check all access to memory to flag questionable
+// or illegal accesses. There are two ways this checking can be controlled.
+//
+// At the first level, there are runtime variables that turn on and off
+// this checking. The variables control a fine-grain level of checking:
+// there are read and write flags for DRAM, SRAM, ROM, and "unmapped
+// memory" (for 8 flags in all). Additionally, we have flags for checking
+// for accesses to Dragonballs registers and low-memory, for 12 flags in
+// all.
+//
+// These flags can be turned on and off at runtime. However, there is
+// still the penalty of constantly checking these flags at runtime, even
+// if they are turned off. Therefore, we can opt to compile those checks
+// out for maximum performance. For each runtime flag, there is a
+// corresponding compile time flag that controls whether or not the
+// runtime check is made. If the compile time flag is true, the check
+// is made based on the value of the runtime flag. If the compile time
+// flag is false, then the code for the runtime check is removed.
+//
+// With the compile and runtime flags turned on, startup time on
+// my Mac is about 1622 msecs. With the compile-time flags turned
+// off, startup time is about 1407 msecs. With the compile-time flags
+// turned on, but the runtime flags turned off, startup time is
+// about 1508 msecs.
+
+#define VALIDATE_DUMMY_GET 1
+#define VALIDATE_DUMMY_SET 1
+#define VALIDATE_REGISTER_GET 0
+#define VALIDATE_REGISTER_SET 0
+#define VALIDATE_DRAM_GET 1
+#define VALIDATE_DRAM_SET 1
+#define VALIDATE_SRAM_GET 0
+#define VALIDATE_SRAM_SET 0
+#define VALIDATE_ROM_GET 0
+#define VALIDATE_ROM_SET 1
+
+#define PREVENT_USER_LOWMEM_GET 1
+#define PREVENT_USER_LOWMEM_SET 1
+#define PREVENT_USER_GLOBAL_GET 1
+#define PREVENT_USER_GLOBAL_SET 1
+#define PREVENT_USER_SCREEN_GET 1
+#define PREVENT_USER_SCREEN_SET 1
+#define PREVENT_USER_SRAM_GET 0
+#define PREVENT_USER_SRAM_SET 1
+#define PREVENT_USER_ROM_GET 0
+#define PREVENT_USER_ROM_SET 1
+#define PREVENT_USER_REGISTER_GET 1
+#define PREVENT_USER_REGISTER_SET 1
+
+#define PREVENT_SYSTEM_LOWMEM_GET 1
+#define PREVENT_SYSTEM_LOWMEM_SET 1
+#define PREVENT_SYSTEM_ROM_GET 0
+#define PREVENT_SYSTEM_ROM_SET 1
+
+#define CHECK_FOR_ADDRESS_ERROR 1
+#define CHECK_FOR_LOW_STACK_ACCESS 1
+#define CHECK_CHUNK_ACCESS 0
+
+#define MASTER_RUNTIME_VALIDATE_SWITCH 1
+#define MASTER_RUNTIME_PREVENT_SWITCH 1
+
+#endif /* _SWITCHES_H_ */
+
+