ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/Unix/sysdeps.h
Revision: 1.20
Committed: 2001-07-12T19:48:27Z (23 years, 4 months ago) by cebix
Content type: text/plain
Branch: MAIN
Changes since 1.19: +3 -0 lines
Log Message:
- Implemented AppleTalk-over-UDP tunnelling, activated by setting "udptunnel"
  to "true". This uses the BSD socket API, so it's fairly portable (currently
  only imeplemented under Unix, though). This works by sending raw Ethernet
  packets as UDP packets to a fixed port number ("udpport", default is 6066),
  using IP broadcasts to simulate Ethernet broad- and multicasts. Currently
  only tested with AppleTalk.

File Contents

# Content
1 /*
2 * sysdeps.h - System dependent definitions for Unix
3 *
4 * Basilisk II (C) 1997-2001 Christian Bauer
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21 #ifndef SYSDEPS_H
22 #define SYSDEPS_H
23
24 #ifndef __STDC__
25 #error "Your compiler is not ANSI. Get a real one."
26 #endif
27
28 #include "config.h"
29 #include "user_strings_unix.h"
30
31 #ifndef STDC_HEADERS
32 #error "You don't have ANSI C header files."
33 #endif
34
35 #ifdef HAVE_UNISTD_H
36 # include <sys/types.h>
37 # include <unistd.h>
38 #endif
39
40 #include <netinet/in.h>
41 #include <assert.h>
42 #include <stdio.h>
43 #include <stdlib.h>
44 #include <string.h>
45
46 #ifdef HAVE_FCNTL_H
47 # include <fcntl.h>
48 #endif
49
50 #ifdef TIME_WITH_SYS_TIME
51 # include <sys/time.h>
52 # include <time.h>
53 #else
54 # ifdef HAVE_SYS_TIME_H
55 # include <sys/time.h>
56 # else
57 # include <time.h>
58 # endif
59 #endif
60
61
62 #ifdef ENABLE_NATIVE_M68K
63
64 /* Mac and host address space are the same */
65 #define REAL_ADDRESSING 1
66
67 /* Using 68k natively */
68 #define EMULATED_68K 0
69
70 /* Mac ROM is not write protected */
71 #define ROM_IS_WRITE_PROTECTED 0
72 #define USE_SCRATCHMEM_SUBTERFUGE 1
73
74 #else
75
76 /* Mac and host address space are distinct */
77 #ifndef REAL_ADDRESSING
78 #define REAL_ADDRESSING 0
79 #endif
80
81 /* Using 68k emulator */
82 #define EMULATED_68K 1
83
84 /* The m68k emulator uses a prefetch buffer ? */
85 #define USE_PREFETCH_BUFFER 0
86
87 /* Mac ROM is write protected when banked memory is used */
88 #if REAL_ADDRESSING || DIRECT_ADDRESSING
89 # define ROM_IS_WRITE_PROTECTED 0
90 # define USE_SCRATCHMEM_SUBTERFUGE 1
91 #else
92 # define ROM_IS_WRITE_PROTECTED 1
93 #endif
94
95 #endif
96
97 /* Direct Addressing requires Video on SEGV signals */
98 #if DIRECT_ADDRESSING && !ENABLE_VOSF
99 # undef ENABLE_VOSF
100 # define ENABLE_VOSF 1
101 #endif
102
103 /* ExtFS is supported */
104 #define SUPPORTS_EXTFS 1
105
106 /* BSD socket API supported */
107 #define SUPPORTS_UDP_TUNNEL 1
108
109
110 /* Data types */
111 typedef unsigned char uint8;
112 typedef signed char int8;
113 #if SIZEOF_SHORT == 2
114 typedef unsigned short uint16;
115 typedef short int16;
116 #elif SIZEOF_INT == 2
117 typedef unsigned int uint16;
118 typedef int int16;
119 #else
120 #error "No 2 byte type, you lose."
121 #endif
122 #if SIZEOF_INT == 4
123 typedef unsigned int uint32;
124 typedef int int32;
125 #elif SIZEOF_LONG == 4
126 typedef unsigned long uint32;
127 typedef long int32;
128 #else
129 #error "No 4 byte type, you lose."
130 #endif
131 #if SIZEOF_LONG == 8
132 typedef unsigned long uint64;
133 typedef long int64;
134 #define VAL64(a) (a ## l)
135 #define UVAL64(a) (a ## ul)
136 #elif SIZEOF_LONG_LONG == 8
137 typedef unsigned long long uint64;
138 typedef long long int64;
139 #define VAL64(a) (a ## LL)
140 #define UVAL64(a) (a ## uLL)
141 #else
142 #error "No 8 byte type, you lose."
143 #endif
144 #if SIZEOF_VOID_P == 4
145 typedef uint32 uintptr;
146 typedef int32 intptr;
147 #elif SIZEOF_VOID_P == 8
148 typedef uint64 uintptr;
149 typedef int64 intptr;
150 #else
151 #error "Unsupported size of pointer"
152 #endif
153
154 /* Time data type for Time Manager emulation */
155 #ifdef HAVE_CLOCK_GETTIME
156 typedef struct timespec tm_time_t;
157 #else
158 typedef struct timeval tm_time_t;
159 #endif
160
161 /* UAE CPU data types */
162 #define uae_s8 int8
163 #define uae_u8 uint8
164 #define uae_s16 int16
165 #define uae_u16 uint16
166 #define uae_s32 int32
167 #define uae_u32 uint32
168 #define uae_s64 int64
169 #define uae_u64 uint64
170 typedef uae_u32 uaecptr;
171
172 /* Alignment restrictions */
173 #if defined(__i386__) || defined(__powerpc__) || defined(__m68k__)
174 # define CPU_CAN_ACCESS_UNALIGNED
175 #endif
176
177 /* Timing functions */
178 extern uint64 GetTicks_usec(void);
179 extern void Delay_usec(uint32 usec);
180
181 /* UAE CPU defines */
182 #ifdef WORDS_BIGENDIAN
183
184 #ifdef CPU_CAN_ACCESS_UNALIGNED
185
186 /* Big-endian CPUs which can do unaligned accesses */
187 static inline uae_u32 do_get_mem_long(uae_u32 *a) {return *a;}
188 static inline uae_u32 do_get_mem_word(uae_u16 *a) {return *a;}
189 static inline void do_put_mem_long(uae_u32 *a, uae_u32 v) {*a = v;}
190 static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {*a = v;}
191
192 #else /* CPU_CAN_ACCESS_UNALIGNED */
193
194 #ifdef sgi
195 /* The SGI MIPSPro compilers can do unaligned accesses given enough hints.
196 * They will automatically inline these routines. */
197 #ifdef __cplusplus
198 extern "C" { /* only the C compiler does unaligned accesses */
199 #endif
200 extern uae_u32 do_get_mem_long(uae_u32 *a);
201 extern uae_u32 do_get_mem_word(uae_u16 *a);
202 extern void do_put_mem_long(uae_u32 *a, uae_u32 v);
203 extern void do_put_mem_word(uae_u16 *a, uae_u32 v);
204 #ifdef __cplusplus
205 }
206 #endif
207
208 #else /* sgi */
209
210 /* Big-endian CPUs which can not do unaligned accesses (this is not the most efficient way to do this...) */
211 static inline uae_u32 do_get_mem_long(uae_u32 *a) {uint8 *b = (uint8 *)a; return (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3];}
212 static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint8 *b = (uint8 *)a; return (b[0] << 8) | b[1];}
213 static inline void do_put_mem_long(uae_u32 *a, uae_u32 v) {uint8 *b = (uint8 *)a; b[0] = v >> 24; b[1] = v >> 16; b[2] = v >> 8; b[3] = v;}
214 static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {uint8 *b = (uint8 *)a; b[0] = v >> 8; b[1] = v;}
215 #endif /* sgi */
216
217 #endif /* CPU_CAN_ACCESS_UNALIGNED */
218
219 #else /* WORDS_BIGENDIAN */
220
221 #ifdef __i386__
222
223 /* Intel x86 */
224 #define X86_PPRO_OPT
225 static inline uae_u32 do_get_mem_long(uae_u32 *a) {uint32 retval; __asm__ ("bswap %0" : "=r" (retval) : "0" (*a) : "cc"); return retval;}
226 #ifdef X86_PPRO_OPT
227 static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint32 retval; __asm__ ("movzwl %w1,%k0\n\tshll $16,%k0\n\tbswapl %k0\n" : "=&r" (retval) : "m" (*a) : "cc"); return retval;}
228 #else
229 static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint32 retval; __asm__ ("xorl %k0,%k0\n\tmovw %w1,%w0\n\trolw $8,%w0" : "=&r" (retval) : "m" (*a) : "cc"); return retval;}
230 #endif
231 #define HAVE_GET_WORD_UNSWAPPED
232 #define do_get_mem_word_unswapped(a) ((uae_u32)*((uae_u16 *)(a)))
233 static inline void do_put_mem_long(uae_u32 *a, uae_u32 v) {__asm__ ("bswap %0" : "=r" (v) : "0" (v) : "cc"); *a = v;}
234 #ifdef X86_PPRO_OPT
235 static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {__asm__ ("bswapl %0" : "=&r" (v) : "0" (v << 16) : "cc"); *a = v;}
236 #else
237 static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {__asm__ ("rolw $8,%0" : "=r" (v) : "0" (v) : "cc"); *a = v;}
238 #endif
239 #define HAVE_OPTIMIZED_BYTESWAP_32
240 /* bswap doesn't affect condition codes */
241 static inline uae_u32 do_byteswap_32(uae_u32 v) {__asm__ ("bswap %0" : "=r" (v) : "0" (v)); return v;}
242 #define HAVE_OPTIMIZED_BYTESWAP_16
243 #ifdef X86_PPRO_OPT
244 static inline uae_u32 do_byteswap_16(uae_u32 v) {__asm__ ("bswapl %0" : "=&r" (v) : "0" (v << 16) : "cc"); return v;}
245 #else
246 static inline uae_u32 do_byteswap_16(uae_u32 v) {__asm__ ("rolw $8,%0" : "=r" (v) : "0" (v) : "cc"); return v;}
247 #endif
248
249 #elif defined(CPU_CAN_ACCESS_UNALIGNED)
250
251 /* Other little-endian CPUs which can do unaligned accesses */
252 static inline uae_u32 do_get_mem_long(uae_u32 *a) {uint32 x = *a; return (x >> 24) | (x >> 8) & 0xff00 | (x << 8) & 0xff0000 | (x << 24);}
253 static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint16 x = *a; return (x >> 8) | (x << 8);}
254 static inline void do_put_mem_long(uae_u32 *a, uae_u32 v) {*a = (v >> 24) | (v >> 8) & 0xff00 | (v << 8) & 0xff0000 | (v << 24);}
255 static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {*a = (v >> 8) | (v << 8);}
256
257 #else /* CPU_CAN_ACCESS_UNALIGNED */
258
259 /* Other little-endian CPUs which can not do unaligned accesses (this needs optimization) */
260 static inline uae_u32 do_get_mem_long(uae_u32 *a) {uint8 *b = (uint8 *)a; return (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3];}
261 static inline uae_u32 do_get_mem_word(uae_u16 *a) {uint8 *b = (uint8 *)a; return (b[0] << 8) | b[1];}
262 static inline void do_put_mem_long(uae_u32 *a, uae_u32 v) {uint8 *b = (uint8 *)a; b[0] = v >> 24; b[1] = v >> 16; b[2] = v >> 8; b[3] = v;}
263 static inline void do_put_mem_word(uae_u16 *a, uae_u32 v) {uint8 *b = (uint8 *)a; b[0] = v >> 8; b[1] = v;}
264
265 #endif /* CPU_CAN_ACCESS_UNALIGNED */
266
267 #endif /* WORDS_BIGENDIAN */
268
269 #ifndef HAVE_OPTIMIZED_BYTESWAP_32
270 static inline uae_u32 do_byteswap_32(uae_u32 v)
271 { return (((v >> 24) & 0xff) | ((v >> 8) & 0xff00) | ((v & 0xff) << 24) | ((v & 0xff00) << 8)); }
272 #endif
273
274 #ifndef HAVE_OPTIMIZED_BYTESWAP_16
275 static inline uae_u32 do_byteswap_16(uae_u32 v)
276 { return (((v >> 8) & 0xff) | ((v & 0xff) << 8)); }
277 #endif
278
279 #define do_get_mem_byte(a) ((uae_u32)*((uae_u8 *)(a)))
280 #define do_put_mem_byte(a, v) (*(uae_u8 *)(a) = (v))
281
282 #define call_mem_get_func(func, addr) ((*func)(addr))
283 #define call_mem_put_func(func, addr, v) ((*func)(addr, v))
284 #define __inline__ inline
285 #define CPU_EMU_SIZE 0
286 #undef NO_INLINE_MEMORY_ACCESS
287 #undef MD_HAVE_MEM_1_FUNCS
288 #define ENUMDECL typedef enum
289 #define ENUMNAME(name) name
290 #define write_log printf
291
292 #ifdef X86_ASSEMBLY
293 #define ASM_SYM_FOR_FUNC(a) __asm__(a)
294 #else
295 #define ASM_SYM_FOR_FUNC(a)
296 #endif
297
298 #ifndef REGPARAM
299 # define REGPARAM
300 #endif
301 #define REGPARAM2
302
303 #endif