1 #ifndef AROS_MORPHOS_CPU_H
2 #define AROS_MORPHOS_CPU_H
4 Copyright � 1995-2010, The AROS Development Team. All rights reserved.
7 NOTE: This file must compile *without* any other header !
9 Desc: cpu.h include file for morphos arch
13 /* Information about size and alignment,
14 * the defines have to be numeric constants */
15 #define AROS_STACK_GROWS_DOWNWARDS 1 /* Stack direction */
16 #define AROS_BIG_ENDIAN 1 /* Big or little endian */
17 #define AROS_SIZEOFULONG 4 /* Size of an ULONG */
18 #define AROS_SIZEOFPTR 4 /* Size of a PTR */
19 #define AROS_WORDALIGN 2 /* Alignment for WORD */
20 #define AROS_LONGALIGN 2 /* Alignment for LONG */
21 #define AROS_QUADALIGN 2 /* Alignment for QUAD */
22 #define AROS_PTRALIGN 2 /* Alignment for PTR */
23 #define AROS_IPTRALIGN 2 /* Alignment for IPTR */
24 #define AROS_DOUBLEALIGN 2 /* Alignment for double */
25 #define AROS_WORSTALIGN 8 /* Worst case alignment */
29 * Some (or maybe even all) PowerPC machines expect the stack to be aligned on 16-byte boundary.
30 * This is the reason number one for AROS_WORSTALIGN=16. The second reason is, the 440 CPU will
31 * generate an alignment exception if floating point data *crosses* the 16-byte boundary.
34 #define AROS_32BIT_TYPE int
35 /* For ABI V1 this should be done in common cpu.h */
36 #define AROS_LARGEST_TYPE long long
38 /* Note that MorphOS ABI DOES have linear varargs as an option */
39 #define __stackparm __attribute__((varargs68k))
41 #define AROS_SLOWSTACKTAGS 1
42 #define AROS_SLOWSTACKMETHODS 1
43 #define AROS_SLOWSTACKHOOKS 1
45 /* types and limits for sig_atomic_t */
46 #define AROS_SIG_ATOMIC_T int
47 #define AROS_SIG_ATOMIC_MIN (-0x7fffffff-1)
48 #define AROS_SIG_ATOMIC_MAX 0x7fffffff
50 #if defined(__GNUC__) && !defined(__clang__)
51 register unsigned char* AROS_GET_SP
__asm__("%sp");
55 An offset value sometimes added to
56 or subtracted from the stack limits.
59 #define SP_OFFSET 0x10
62 One entry in a libraries' jumptable. For assembler compatibility, the
63 field jmp should contain the code for an absolute jmp to a 32bit
64 address. There are also a couple of macros which you should use to
65 access the vector table from C.
69 unsigned long addis
; // simplified: lis 11, a@h
70 unsigned long ori
; // : li 11, a@l
71 unsigned long mtspr
; // : mtctr 11
72 unsigned long jmp
; // bcctr : bctr 11
74 /* browse MPCFPE32B.pdf to understand opcode creation */
75 #define __AROS_SET_FULLJMP(v,a)\
77 struct FullJumpVec *_v = (v); \
78 _v->addis = (15 << 26) | (11 << 21) | ((ULONG)(a) >> 16); \
79 _v->ori = (24 << 26) | (11 << 21) | (11 << 16) | ((ULONG)(a) & 0x0000FFFF);\
80 _v->mtspr = (31 << 26) | (11 << 21) | ( 9 << 16) | (467 << 1); \
81 _v->jmp = (19 << 26) | (20 << 21) | (528 << 1); \
91 #define __AROS_SET_VEC(v,a) (*(ULONG*)(v)->vec=(ULONG)(a))
92 #define __AROS_GET_VEC(v) ((APTR)(*(ULONG*)(v)->vec))
94 /* Use these to acces a vector table */
95 #define LIB_VECTSIZE (sizeof (struct JumpVec))
96 #define __AROS_GETJUMPVEC(lib,n) (&((struct JumpVec *)lib)[-(n)])
97 #define __AROS_GETVECADDR(lib,n) (__AROS_GET_VEC(__AROS_GETJUMPVEC(lib,n)))
98 #define __AROS_SETVECADDR(lib,n,addr) (__AROS_SET_VEC(__AROS_GETJUMPVEC(lib,n),(APTR)(addr)))
99 #define __AROS_INITVEC(lib,n) __AROS_GETJUMPVEC(lib,n)->jmp = TRAP_LIB, \
100 __AROS_SETVECADDR(lib,n,_aros_not_implemented)
103 Code used to generate stub functions.
104 It must be *printed* with a function like printf into
105 a file to be compiled with gcc.
107 - The first parameter is the function name,
108 - The second parameter is the basename,
109 i.e. bname is the address of a pointer to the library base,
110 - The third parameter is the library vector to be called.
112 It's value must be computed by the stub generator with this code:
113 &(__AROS_GETJUMPVEC(0, n+1)->vec), where n is the library vector position in
114 the library vectors list.
117 #define STUBCODE_INIT \
118 "#define EMITSTUB(fname, bname, vec) " \
121 "lis 11,bname@ha; " \
122 "lwz 11,bname@l(11); " \
126 "#define EMITALIAS(fname, alias) " \
127 ".weak alias; .set alias, fname\n"
129 "EMITSTUB(%s, %s, %d) "
131 "EMITALIAS(%s, %s)\n"
133 We want to activate the execstubs and preserve all registers
134 when calling obtainsemaphore, obtainsemaphoreshared, releasesemaphore,
135 getcc, permit, forbid, enable, disable
138 #define UseExecstubs 1
140 /* Macros to test/set failure of AllocEntry() */
141 #define AROS_ALLOCENTRY_FAILED(memType) \
142 ((struct MemList *)((IPTR)(memType) | 0x80ul<<(sizeof(APTR)-1)*8))
143 #define AROS_CHECK_ALLOCENTRY(memList) \
144 (!((IPTR)(memList) & 0x80ul<<(sizeof(APTR)-1)*8))
147 Find the next valid alignment for a structure if the next x bytes must
150 #define AROS_ALIGN(x) (((x)+AROS_WORSTALIGN-1)&-AROS_WORSTALIGN)
153 extern void _aros_not_implemented (char *);
155 /* How much stack do we need ? Lots :-) */
156 #define AROS_STACKSIZE 32768
158 /* How to map function arguments to CPU registers */
160 /* What to do with the library base in header, prototype and call */
161 #define __AROS_LH_BASE(basetype,basename) basetype basename = (basetype)REG_A6
162 #define __AROS_LP_BASE(basetype,basename) basetype __base = basename
163 #define __AROS_LC_BASE(basetype,basename) REG_A6 = (LONG)__base
164 #define __AROS_LD_BASE(basetype,basename) basetype basename
166 /* How to transform an argument in header, opt prototype, call and forced
168 #define __AROS_LHA(type,name,reg) type name = (type) REG_##reg
169 #define __AROS_LPA(type,name,reg) type r##reg = name
170 #define __AROS_LCA(type,name,reg) REG_##reg = (LONG)r##reg
171 #define __AROS_LDA(type,name,reg) type
172 #define __AROS_UFHA(type,name,reg) type name = (type) REG_##reg
173 #define __AROS_UFPA(type,name,reg) type r##reg = name
174 #define __AROS_UFCA(type,name,reg) REG_##reg = (LONG)r##reg
175 #define __AROS_UFDA(type,name,reg) type
176 #define __AROS_LHAQUAD(type,name,reg1,reg2) type name
177 #define __AROS_LPAQUAD(type,name,reg1,reg2) type
178 #define __AROS_LCAQUAD(type,name,reg1,reg2) name
179 #define __AROS_LDAQUAD(type,name,reg1,reg2) type
181 /* Prefix for library function in header, prototype and call */
182 #define __AROS_LH_PREFIX /* eps */
183 #define __AROS_LP_PREFIX /* eps */
184 #define __AROS_LC_PREFIX /* eps */
185 #define __AROS_LD_PREFIX /* eps */
186 #define __AROS_UFH_PREFIX /* eps */
187 #define __AROS_UFP_PREFIX /* eps */
188 #define __AROS_UFC_PREFIX /* eps */
189 #define __AROS_UFD_PREFIX /* eps */
191 #define __UFC3R(_t,_n,t1,n1,r1,t2,n2,r2,t3,n3,r3,p) \
193 long _n1 = (long)(n1);\
194 long _n2 = (long)(n2);\
195 long _n3 = (long)(n3);\
197 __asm__ __volatile__(\
203 "stwu 1,-16(1)\n\t" \
213 : "=r"(_re), "=m"(*(APTR *)p)\
214 : "r"(_n), "r"(_n1), "r"(_n2), "r"(_n3)\
215 : "cc", "memory", "0", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13");\
218 #define AROS_UFC3R(t,n,a1,a2,a3,p,ss) __UFC3R(t,n,a1,a2,a3,p)
220 /* Library prototypes expand to nothing */
221 #define __AROS_CPU_SPECIFIC_LP
223 #define AROS_LPQUAD1(t,n,a1,bt,bn,o,s)
224 #define AROS_LPQUAD2(t,n,a1,a2,bt,bn,o,s)
226 #define AROS_LP0(t,n,bt,bn,o,s)
227 #define AROS_LP1(t,n,a1,bt,bn,o,s)
228 #define AROS_LP2(t,n,a1,a2,bt,bn,o,s)
229 #define AROS_LP3(t,n,a1,a2,a3,bt,bn,o,s)
230 #define AROS_LP4(t,n,a1,a2,a3,a4,bt,bn,o,s)
231 #define AROS_LP5(t,n,a1,a2,a3,a4,a5,bt,bn,o,s)
232 #define AROS_LP6(t,n,a1,a2,a3,a4,a5,a6,bt,bn,o,s)
233 #define AROS_LP7(t,n,a1,a2,a3,a4,a5,a6,a7,bt,bn,o,s)
234 #define AROS_LP8(t,n,a1,a2,a3,a4,a5,a6,a7,a8,bt,bn,o,s)
235 #define AROS_LP9(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,bt,bn,o,s)
236 #define AROS_LP10(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,bt,bn,o,s)
237 #define AROS_LP11(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,bt,bn,o,s)
238 #define AROS_LP12(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,bt,bn,o,s)
239 #define AROS_LP13(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,bt,bn,o,s)
240 #define AROS_LP14(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,bt,bn,o,s)
241 #define AROS_LP15(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,bt,bn,o,s)
243 #define AROS_LP0I(t,n,bt,bn,o,s)
244 #define AROS_LP1I(t,n,a1,bt,bn,o,s)
245 #define AROS_LP2I(t,n,a1,a2,bt,bn,o,s)
246 #define AROS_LP3I(t,n,a1,a2,a3,bt,bn,o,s)
247 #define AROS_LP4I(t,n,a1,a2,a3,a4,bt,bn,o,s)
248 #define AROS_LP5I(t,n,a1,a2,a3,a4,a5,bt,bn,o,s)
249 #define AROS_LP6I(t,n,a1,a2,a3,a4,a5,a6,bt,bn,o,s)
250 #define AROS_LP7I(t,n,a1,a2,a3,a4,a5,a6,a7,bt,bn,o,s)
251 #define AROS_LP8I(t,n,a1,a2,a3,a4,a5,a6,a7,a8,bt,bn,o,s)
252 #define AROS_LP9I(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,bt,bn,o,s)
253 #define AROS_LP10I(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,bt,bn,o,s)
254 #define AROS_LP11I(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,bt,bn,o,s)
255 #define AROS_LP12I(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,bt,bn,o,s)
256 #define AROS_LP13I(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,bt,bn,o,s)
257 #define AROS_LP14I(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,bt,bn,o,s)
258 #define AROS_LP15I(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,bt,bn,o,s)
260 /* Library function calls. They are made through m68k emulator. */
261 #define __AROS_CPU_SPECIFIC_LC
263 /* Call a library function which requires the libbase */
264 #define AROS_LC0(t,n,bt,bn,o,s) \
266 __AROS_LP_BASE(bt,bn); \
267 __AROS_LC_BASE(bt,bn); \
268 (t)MyEmulHandle->EmulCallDirectOS(-6 * o); \
271 #define AROS_LC1(t,n,a1,bt,bn,o,s) \
274 __AROS_LP_BASE(bt,bn); \
276 __AROS_LC_BASE(bt,bn); \
277 (t)MyEmulHandle->EmulCallDirectOS(-6 * o); \
279 #define AROS_LC2(t,n,a1,a2,bt,bn,o,s) \
283 __AROS_LP_BASE(bt,bn); \
286 __AROS_LC_BASE(bt,bn); \
287 (t)MyEmulHandle->EmulCallDirectOS(-6 * o); \
289 #define AROS_LC3(t,n,a1,a2,a3,bt,bn,o,s) \
294 __AROS_LP_BASE(bt,bn); \
298 __AROS_LC_BASE(bt,bn); \
299 (t)MyEmulHandle->EmulCallDirectOS(-6 * o); \
301 #define AROS_LC4(t,n,a1,a2,a3,a4,bt,bn,o,s) \
307 __AROS_LP_BASE(bt,bn); \
312 __AROS_LC_BASE(bt,bn); \
313 (t)MyEmulHandle->EmulCallDirectOS(-6 * o); \
315 #define AROS_LC5(t,n,a1,a2,a3,a4,a5,bt,bn,o,s) \
322 __AROS_LP_BASE(bt,bn); \
328 __AROS_LC_BASE(bt,bn); \
329 (t)MyEmulHandle->EmulCallDirectOS(-6 * o); \
331 #define AROS_LC6(t,n,a1,a2,a3,a4,a5,a6,bt,bn,o,s) \
339 __AROS_LP_BASE(bt,bn); \
346 __AROS_LC_BASE(bt,bn); \
347 (t)MyEmulHandle->EmulCallDirectOS(-6 * o); \
349 #define AROS_LC7(t,n,a1,a2,a3,a4,a5,a6,a7,bt,bn,o,s) \
358 __AROS_LP_BASE(bt,bn); \
366 __AROS_LC_BASE(bt,bn); \
367 (t)MyEmulHandle->EmulCallDirectOS(-6 * o); \
369 #define AROS_LC8(t,n,a1,a2,a3,a4,a5,a6,a7,a8,bt,bn,o,s) \
379 __AROS_LP_BASE(bt,bn); \
388 __AROS_LC_BASE(bt,bn); \
389 (t)MyEmulHandle->EmulCallDirectOS(-6 * o); \
391 #define AROS_LC9(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,bt,bn,o,s) \
402 __AROS_LP_BASE(bt,bn); \
412 __AROS_LC_BASE(bt,bn); \
413 (t)MyEmulHandle->EmulCallDirectOS(-6 * o); \
415 #define AROS_LC10(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,bt,bn,o,s) \
427 __AROS_LP_BASE(bt,bn); \
438 __AROS_LC_BASE(bt,bn); \
439 (t)MyEmulHandle->EmulCallDirectOS(-6 * o); \
441 #define AROS_LC11(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,bt,bn,o,s) \
454 __AROS_LP_BASE(bt,bn); \
466 __AROS_LC_BASE(bt,bn); \
467 (t)MyEmulHandle->EmulCallDirectOS(-6 * o); \
469 #define AROS_LC12(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,bt,bn,o,s) \
483 __AROS_LP_BASE(bt,bn); \
496 __AROS_LC_BASE(bt,bn); \
497 (t)MyEmulHandle->EmulCallDirectOS(-6 * o); \
499 #define AROS_LC13(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,bt,bn,o,s) \
514 __AROS_LP_BASE(bt,bn); \
528 __AROS_LC_BASE(bt,bn); \
529 (t)MyEmulHandle->EmulCallDirectOS(-6 * o); \
531 #define AROS_LC14(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,bt,bn,o,s) \
547 __AROS_LP_BASE(bt,bn); \
562 __AROS_LC_BASE(bt,bn); \
563 (t)MyEmulHandle->EmulCallDirectOS(- 6 *o); \
565 #define AROS_LC15(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,bt,bn,o,s) \
582 __AROS_LP_BASE(bt,bn); \
598 __AROS_LC_BASE(bt,bn); \
599 (t)MyEmulHandle->EmulCallDirectOS(-6 * o); \
602 /* Call a library function which doesn't require the libbase */
603 #define AROS_LC0I(t,n,bt,bn,o,s) \
604 AROS_LC0(t,n,bt,bn,o,s)
605 #define AROS_LC1I(t,n,a1,bt,bn,o,s) \
606 AROS_LC1(t,n,a1,bt,bn,o,s)
607 #define AROS_LC2I(t,n,a1,a2,bt,bn,o,s) \
608 AROS_LC2(t,n,a1,a2,bt,bn,o,s)
609 #define AROS_LC3I(t,n,a1,a2,a3,bt,bn,o,s) \
610 AROS_LC3(t,n,a1,a2,a3,bt,bn,o,s)
611 #define AROS_LC4I(t,n,a1,a2,a3,a4,bt,bn,o,s) \
612 AROS_LC4(t,n,a1,a2,a3,a4,bt,bn,o,s)
613 #define AROS_LC5I(t,n,a1,a2,a3,a4,a5,bt,bn,o,s) \
614 AROS_LC5(t,n,a1,a2,a3,a4,a5,bt,bn,o,s)
615 #define AROS_LC6I(t,n,a1,a2,a3,a4,a5,a6,bt,bn,o,s) \
616 AROS_LC6(t,n,a1,a2,a3,a4,a5,a6,bt,bn,o,s)
617 #define AROS_LC7I(t,n,a1,a2,a3,a4,a5,a6,a7,bt,bn,o,s) \
618 AROS_LC7(t,n,a1,a2,a3,a4,a5,a6,a7,bt,bn,o,s)
619 #define AROS_LC8I(t,n,a1,a2,a3,a4,a5,a6,a7,a8,bt,bn,o,s) \
620 AROS_LC8(t,n,a1,a2,a3,a4,a5,a6,a7,a8,bt,bn,o,s)
621 #define AROS_LC9I(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,bt,bn,o,s) \
622 AROS_LC9(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,bt,bn,o,s)
623 #define AROS_LC10I(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,bt,bn,o,s) \
624 AROS_LC10(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,bt,bn,o,s)
625 #define AROS_LC11I(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,bt,bn,o,s) \
626 AROS_LC11(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,bt,bn,o,s)
627 #define AROS_LC12I(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,bt,bn,o,s) \
628 AROS_LC12(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,bt,bn,o,s)
629 #define AROS_LC13I(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,bt,bn,o,s) \
630 AROS_LC13(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,bt,bn,o,s)
631 #define AROS_LC14I(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,bt,bn,o,s) \
632 AROS_LC14(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,bt,bn,o,s)
633 #define AROS_LC15I(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,bt,bn,o,s) \
634 AROS_LC15(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,bt,bn,o,s)
636 /* asmcall stuff follows. Also use m68k emulator traps as entry points. */
637 #define __AROS_CPU_SPECIFIC_ASMCALLS
639 #define AROS_ASMSYMNAME(s) (&s##_Gate)
641 #if !(UseRegisterArgs && defined(AROS_COMPILER_NO_REGARGS))
642 /* Function headers for user functions */
643 #define AROS_UFH0(t,n) \
644 __AROS_UFH_PREFIX t n##_Func (void); \
645 const struct EmulLibEntry n##_Gate = { TRAP_LIB, 0, (void(*))n##_Func }; \
646 __AROS_UFH_PREFIX t n##_Func(void) \
649 #define AROS_UFH1(t,n,a1) \
650 __AROS_UFH_PREFIX t n##_Func (void); \
651 const struct EmulLibEntry n##_Gate = { TRAP_LIB, 0, (void(*))n##_Func }; \
652 __AROS_UFH_PREFIX t n##_Func(void) \
656 #define AROS_UFH2(t,n,a1,a2) \
657 __AROS_UFH_PREFIX t n##_Func (void); \
658 const struct EmulLibEntry n##_Gate = { TRAP_LIB, 0, (void(*))n##_Func }; \
659 __AROS_UFH_PREFIX t n##_Func(void) \
664 #define AROS_UFH3(t,n,a1,a2,a3) \
665 __AROS_UFH_PREFIX t n##_Func (void); \
666 const struct EmulLibEntry n##_Gate = { TRAP_LIB, 0, (void(*))n##_Func }; \
667 __AROS_UFH_PREFIX t n##_Func(void) \
673 #define AROS_UFH3S(t,n,a1,a2,a3) \
674 static __AROS_UFH_PREFIX t n##_Func (void); \
675 static const struct EmulLibEntry n##_Gate = { TRAP_LIB, 0, (void(*))n##_Func }; \
676 static __AROS_UFH_PREFIX t n##_Func(void) \
682 #define AROS_UFH4(t,n,a1,a2,a3,a4) \
683 __AROS_UFH_PREFIX t n##_Func (void); \
684 const struct EmulLibEntry n##_Gate = { TRAP_LIB, 0, (void(*))n##_Func }; \
685 __AROS_UFH_PREFIX t n##_Func(void) \
692 #define AROS_UFH5(t,n,a1,a2,a3,a4,a5) \
693 __AROS_UFH_PREFIX t n##_Func (void); \
694 const struct EmulLibEntry n##_Gate = { TRAP_LIB, 0, (void(*))n##_Func }; \
695 __AROS_UFH_PREFIX t n##_Func(void) \
703 #define AROS_UFH5S(t,n,a1,a2,a3,a4,a5) \
704 __AROS_UFH_PREFIX static t n##_Func (void); \
705 static const struct EmulLibEntry n##_Gate = { TRAP_LIB, 0, (void(*))n##_Func }; \
706 __AROS_UFH_PREFIX static t n##_Func(void) \
714 #define AROS_UFH6(t,n,a1,a2,a3,a4,a5,a6) \
715 __AROS_UFH_PREFIX t n##_Func (void); \
716 const struct EmulLibEntry n##_Gate = { TRAP_LIB, 0, (void(*))n##_Func }; \
717 __AROS_UFH_PREFIX t n##_Func(void) \
726 #define AROS_UFH7(t,n,a1,a2,a3,a4,a5,a6,a7) \
727 __AROS_UFH_PREFIX t n##_Func (void); \
728 const struct EmulLibEntry n##_Gate = { TRAP_LIB, 0, (void(*))n##_Func }; \
729 __AROS_UFH_PREFIX t n##_Func(void) \
739 #define AROS_UFH8(t,n,a1,a2,a3,a4,a5,a6,a7,a8) \
740 __AROS_UFH_PREFIX t n##_Func (void); \
741 const struct EmulLibEntry n##_Gate = { TRAP_LIB, 0, (void(*))n##_Func }; \
742 __AROS_UFH_PREFIX t n##_Func(void) \
753 #define AROS_UFH9(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9) \
754 __AROS_UFH_PREFIX t n##_Func (void); \
755 const struct EmulLibEntry n##_Gate = { TRAP_LIB, 0, (void(*))n##_Func }; \
756 __AROS_UFH_PREFIX t n##_Func(void) \
768 #define AROS_UFH10(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) \
769 __AROS_UFH_PREFIX t n##_Func (void); \
770 const struct EmulLibEntry n##_Gate = { TRAP_LIB, 0, (void(*))n##_Func }; \
771 __AROS_UFH_PREFIX t n##_Func(void) \
784 #define AROS_UFH11(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) \
785 __AROS_UFH_PREFIX t n##_Func (void); \
786 const struct EmulLibEntry n##_Gate = { TRAP_LIB, 0, (void(*))n##_Func }; \
787 __AROS_UFH_PREFIX t n##_Func(void) \
801 #define AROS_UFH12(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12) \
802 __AROS_UFH_PREFIX t n##_Func (void); \
803 const struct EmulLibEntry n##_Gate = { TRAP_LIB, 0, (void(*))n##_Func }; \
804 __AROS_UFH_PREFIX t n##_Func(void) \
819 #define AROS_UFH13(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13) \
820 __AROS_UFH_PREFIX t n##_Func (void); \
821 const struct EmulLibEntry n##_Gate = { TRAP_LIB, 0, (void(*))n##_Func }; \
822 __AROS_UFH_PREFIX t n##_Func(void) \
838 #define AROS_UFH14(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14) \
839 __AROS_UFH_PREFIX t n##_Func (void); \
840 const struct EmulLibEntry n##_Gate = { TRAP_LIB, 0, (void(*))n##_Func }; \
841 __AROS_UFH_PREFIX t n##_Func(void) \
858 #define AROS_UFH15(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15) \
859 __AROS_UFH_PREFIX t n##_Func (void); \
860 const struct EmulLibEntry n##_Gate = { TRAP_LIB, 0, (void(*))n##_Func }; \
861 __AROS_UFH_PREFIX t n##_Func(void) \
879 /* Call a user function */
880 #define AROS_UFC0(t,n) \
881 ((t)MyEmulHandle->EmulCallDirect68k((APTR)(n)))
883 #define AROS_UFC1(t,n,a1) \
887 (t)MyEmulHandle->EmulCallDirect68k((APTR)(n)); \
890 #define AROS_UFC2(t,n,a1,a2) \
896 (t)MyEmulHandle->EmulCallDirect68k((APTR)(n)); \
899 #define AROS_UFC3(t,n,a1,a2,a3) \
907 (t)MyEmulHandle->EmulCallDirect68k((APTR)(n)); \
910 #define AROS_UFC4(t,n,a1,a2,a3,a4) \
920 (t)MyEmulHandle->EmulCallDirect68k((APTR)(n)); \
923 #define AROS_UFC5(t,n,a1,a2,a3,a4,a5) \
935 (t)MyEmulHandle->EmulCallDirect68k((APTR)(n)); \
938 #define AROS_UFC6(t,n,a1,a2,a3,a4,a5,a6) \
952 (t)MyEmulHandle->EmulCallDirect68k((APTR)(n)); \
955 #define AROS_UFC7(t,n,a1,a2,a3,a4,a5,a6,a7) \
971 (t)MyEmulHandle->EmulCallDirect68k((APTR)(n)); \
974 #define AROS_UFC8(t,n,a1,a2,a3,a4,a5,a6,a7,a8) \
992 (t)MyEmulHandle->EmulCallDirect68k((APTR)(n)); \
995 #define AROS_UFC9(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9) \
1015 (t)MyEmulHandle->EmulCallDirect68k((APTR)(n)); \
1018 #define AROS_UFC10(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) \
1040 (t)MyEmulHandle->EmulCallDirect68k((APTR)(n)); \
1043 #define AROS_UFC11(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) \
1067 (t)MyEmulHandle->EmulCallDirect68k((APTR)(n)); \
1070 #define AROS_UFC12(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12) \
1096 (t)MyEmulHandle->EmulCallDirect68k((APTR)(n)); \
1099 #define AROS_UFC13(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13) \
1127 (t)MyEmulHandle->EmulCallDirect68k((APTR)(n)); \
1130 #define AROS_UFC14(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14) \
1160 (t)MyEmulHandle->EmulCallDirect68k((APTR)(n)); \
1163 #define AROS_UFC15(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15) \
1195 (t)MyEmulHandle->EmulCallDirect68k((APTR)(n)); \
1198 #endif /* !(UseRegisterArgs && defined(AROS_COMPILER_NO_REGARGS)) */
1200 /* Prototypes for user functions */
1201 # define AROS_UFP0(t,n) \
1202 extern const struct EmulLibEntry n##_Gate;
1204 # define AROS_UFP1(t,n,a1) \
1205 extern const struct EmulLibEntry n##_Gate;
1207 # define AROS_UFP2(t,n,a1,a2) \
1208 extern const struct EmulLibEntry n##_Gate;
1210 # define AROS_UFP3(t,n,a1,a2,a3) \
1211 extern const struct EmulLibEntry n##_Gate;
1213 # define AROS_UFP3S(t,n,a1,a2,a3) \
1214 extern const struct EmulLibEntry n##_Gate;
1216 # define AROS_UFP4(t,n,a1,a2,a3,a4) \
1217 const struct EmulLibEntry Xj(n,_Gate);
1219 # define AROS_UFP5(t,n,a1,a2,a3,a4,a5) \
1220 extern const struct EmulLibEntry n##_Gate;
1222 # define AROS_UFP5S(t,n,a1,a2,a3,a4,a5) \
1223 extern const struct EmulLibEntry n##_Gate;
1224 # define AROS_UFP6(t,n,a1,a2,a3,a4,a5,a6) \
1225 extern const struct EmulLibEntry n##_Gate;
1227 # define AROS_UFP7(t,n,a1,a2,a3,a4,a5,a6,a7) \
1228 extern const struct EmulLibEntry n##_Gate;
1230 # define AROS_UFP8(t,n,a1,a2,a3,a4,a5,a6,a7,a8) \
1231 extern const struct EmulLibEntry n##_Gate;
1233 # define AROS_UFP9(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9) \
1234 extern const struct EmulLibEntry n##_Gate;
1236 # define AROS_UFP10(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) \
1237 extern const struct EmulLibEntry n##_Gate;
1239 # define AROS_UFP11(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11) \
1240 extern const struct EmulLibEntry n##_Gate;
1242 # define AROS_UFP12(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12) \
1243 extern const struct EmulLibEntry n##_Gate;
1245 # define AROS_UFP13(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13) \
1246 extern const struct EmulLibEntry n##_Gate;
1248 # define AROS_UFP14(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14) \
1249 extern const struct EmulLibEntry n##_Gate;
1251 # define AROS_UFP15(t,n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15) \
1252 extern const struct EmulLibEntry n##_Gate;
1254 #endif /* AROS_MORPHOS_CPU_H */