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