1 /** 2 * @ingroup lib_emu68 3 * @file emu68/type68.h 4 * @brief Type definitions header. 5 * @date 1999/03/13 6 * @author Benjamin Gerard 7 */ 8 9 /* Copyright (c) 1998-2015 Benjamin Gerard */ 10 11 #ifndef EMU68_TYPE68_H 12 #define EMU68_TYPE68_H 13 14 #ifdef HAVE_STDINT_H 15 # include <stdint.h> 16 #else 17 typedef int32_t int_fast32_t; /**< @nodoc */ 18 typedef uint32_t uint_fast32_t; /**< @nodoc */ 19 #endif 20 21 #ifdef HAVE_SYS_TYPES_H 22 # include <sys/types.h> 23 #endif 24 25 /** 26 * @defgroup lib_emu68_types Type definitions 27 * @ingroup lib_emu68 28 * 29 * Definition of types used by EMU68 and SC68 related projects. 30 * 31 * @{ 32 */ 33 34 /** 35 * @name Fixed size integer types. 36 * @{ 37 */ 38 39 typedef uint8_t u8; /**< Must be an unsigned 8 bit integer. */ 40 typedef int8_t s8; /**< Must be a signed 8 bit integer. */ 41 42 typedef uint16_t u16; /**< Must be an unsigned 16 bit integer. */ 43 typedef int16_t s16; /**< Must be a signed 16 bit integer. */ 44 45 typedef uint32_t u32; /**< Must be an unsigned 32 bit integer. */ 46 typedef int32_t s32; /**< Must be a signed 32 bit integer. */ 47 48 typedef uint64_t u64; /**< Must be an unsigned 64 bit integer. */ 49 typedef int64_t s64; /**< Must be a signed 64 bit integer. */ 50 51 /** 52 * @} 53 */ 54 55 #ifndef INT68_BITS 56 57 /* Commonly used int (should be fastest at least 32 bit type). */ 58 typedef int_fast32_t int68_t; /**< fast signed integer type. */ 59 typedef int68_t sint68_t; /**< fast signed integer type. */ 60 typedef uint_fast32_t uint68_t; /**< fast unsigned integer type. */ 61 62 #elif INT68_BITS == 32 63 64 typedef s32 int68_t; /**< 32bit signed integer type. */ 65 typedef s32 sint68_t; /**< 32bit signed integer type. */ 66 typedef u32 uint68_t; /**< 32bit unsigned integer type. */ 67 68 #elif INT68_BITS == 64 69 70 typedef s64 int68_t; /**< 64bit signed integer type. */ 71 typedef s64 sint68_t; /**< 64bit signed integer type. */ 72 typedef u64 uint68_t; /**< 64bit unsigned integer type. */ 73 74 #else 75 # error "invalid define INT68_BITS" 76 #endif 77 78 typedef unsigned int uint_t; /**< natural unsigned int. */ 79 typedef uint68_t cycle68_t; /**< Type for cycle counters. */ 80 typedef int68_t addr68_t; /**< Type for 68k memory addressing. */ 81 typedef struct io68_s io68_t; /**< IO chip instance type. */ 82 typedef struct emu68_s emu68_t; /**< 68k emulator instance type. */ 83 84 /** 68k memory access function. */ 85 typedef void (*memfunc68_t)(emu68_t * const); 86 87 /** 88 * @} 89 */ 90 91 #ifdef EMU68_EXPORT 92 /* Should be only needed when compiling emu68 */ 93 94 #define BASE_FIX (sizeof(int68_t)<<3) /* number of bit of int68_t type. */ 95 #define BYTE_FIX (BASE_FIX-8) /* shift to normalize byte operands. */ 96 #define WORD_FIX (BASE_FIX-16) /* shift to normalize word operands. */ 97 #define LONG_FIX (BASE_FIX-32) /* shift to normalize long operands. */ 98 #define SIGN_FIX (BASE_FIX-1) /* sign bit raw. */ 99 #define SIGN_BIT SIGN_FIX /* sign bit raw. */ 100 #define SIGN_MSK ( (int68_t) ( (int68_t) 1 << SIGN_FIX ) ) /* sign mask. */ 101 102 #define BYTE_MSK ( (int68_t) 0xFFFFFF00 ) 103 #define WORD_MSK ( (int68_t) 0xFFFF0000 ) 104 #define LONG_MSK ( (int68_t) 0x00000000 ) 105 106 #define NRM_BYTE_MSK ( (int68_t) ( (int68_t) 0x000000FF << BYTE_FIX ) ) 107 #define NRM_WORD_MSK ( (int68_t) ( (int68_t) 0x0000FFFF << WORD_FIX ) ) 108 #define NRM_LONG_MSK ( (int68_t) ( (int68_t) 0xFFFFFFFF << LONG_FIX ) ) 109 /* L={7,15,31} */ 110 #define NRM_MSK(L) ( (int68_t) ( (int68_t) ((int68_t) 1 << SIGN_BIT) >> (L))) 111 112 #define NRM_BYTE_ONE ( (int68_t) ( (int68_t) 0x00000001 << BYTE_FIX ) ) 113 #define NRM_WORD_ONE ( (int68_t) ( (int68_t) 0x00000001 << WORD_FIX ) ) 114 #define NRM_LONG_ONE ( (int68_t) ( (int68_t) 0x00000001 << LONG_FIX ) ) 115 116 #endif 117 118 #endif 119