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 (22 years, 11 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

# User Rev Content
1 cebix 1.1 /*
2     * sysdeps.h - System dependent definitions for Unix
3     *
4 cebix 1.17 * Basilisk II (C) 1997-2001 Christian Bauer
5 cebix 1.1 *
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 cebix 1.3 #include "user_strings_unix.h"
30 cebix 1.1
31     #ifndef STDC_HEADERS
32     #error "You don't have ANSI C header files."
33     #endif
34    
35 cebix 1.2 #ifdef HAVE_UNISTD_H
36     # include <sys/types.h>
37     # include <unistd.h>
38     #endif
39    
40 cebix 1.1 #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 cebix 1.11 #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 cebix 1.14 #define USE_SCRATCHMEM_SUBTERFUGE 1
73 cebix 1.11
74     #else
75    
76     /* Mac and host address space are distinct */
77 gbeauche 1.13 #ifndef REAL_ADDRESSING
78 cebix 1.1 #define REAL_ADDRESSING 0
79 gbeauche 1.13 #endif
80 cebix 1.1
81 cebix 1.11 /* Using 68k emulator */
82 cebix 1.1 #define EMULATED_68K 1
83    
84 gbeauche 1.13 /* The m68k emulator uses a prefetch buffer ? */
85     #define USE_PREFETCH_BUFFER 0
86    
87 cebix 1.14 /* Mac ROM is write protected when banked memory is used */
88 gbeauche 1.13 #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 cebix 1.1
95 cebix 1.11 #endif
96    
97 gbeauche 1.13 /* 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 cebix 1.6 /* ExtFS is supported */
104     #define SUPPORTS_EXTFS 1
105 cebix 1.11
106 cebix 1.20 /* BSD socket API supported */
107     #define SUPPORTS_UDP_TUNNEL 1
108    
109 cebix 1.6
110 cebix 1.1 /* 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 cebix 1.8 #define VAL64(a) (a ## l)
135     #define UVAL64(a) (a ## ul)
136 cebix 1.1 #elif SIZEOF_LONG_LONG == 8
137     typedef unsigned long long uint64;
138     typedef long long int64;
139 cebix 1.8 #define VAL64(a) (a ## LL)
140     #define UVAL64(a) (a ## uLL)
141 cebix 1.1 #else
142     #error "No 8 byte type, you lose."
143 gbeauche 1.13 #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 cebix 1.1 #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 cebix 1.7 #define uae_s64 int64
169     #define uae_u64 uint64
170 cebix 1.1 typedef uae_u32 uaecptr;
171    
172     /* Alignment restrictions */
173 cebix 1.4 #if defined(__i386__) || defined(__powerpc__) || defined(__m68k__)
174 cebix 1.1 # define CPU_CAN_ACCESS_UNALIGNED
175     #endif
176    
177 cebix 1.12 /* Timing functions */
178     extern uint64 GetTicks_usec(void);
179     extern void Delay_usec(uint32 usec);
180    
181 cebix 1.1 /* 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 gbeauche 1.16 #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 cebix 1.1
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 gbeauche 1.16
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 cebix 1.1
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