1 #ifndef __INLINE_MACROS_H
    2 #define __INLINE_MACROS_H
    3 
    4 /*
    5 	MorphOS PowerPC inline macros
    6 
    7 	Copyright © 1999-2020 The MorphOS Development Team, All Rights Reserved.
    8 */
    9 
   10 #ifndef EMUL_EMULINTERFACE_H
   11 #include <emul/emulinterface.h>
   12 #endif
   13 #ifndef EMUL_EMULREGS_H
   14 #include <emul/emulregs.h>
   15 #endif
   16 
   17 
   18 #define __CACHE_START(start) ((void *) ((unsigned long int) (start) & ~31))
   19 #define __CACHE_LENGTH(start,length) ({ unsigned long int __clstart = (unsigned long int) (start); (((length) + __clstart + 31) & ~31) - (__clstart & ~31); })
   20 
   21 
   22 #ifndef __MORPHOS_NODIRECTCALL
   23 
   24 /*
   25  * Use directcalls, faster.
   26  */
   27 #define	REG_d0	REG_D0
   28 #define	REG_d1	REG_D1
   29 #define	REG_d2	REG_D2
   30 #define	REG_d3	REG_D3
   31 #define	REG_d4	REG_D4
   32 #define	REG_d5	REG_D5
   33 #define	REG_d6	REG_D6
   34 #define	REG_d7	REG_D7
   35 #define	REG_a0	REG_A0
   36 #define	REG_a1	REG_A1
   37 #define	REG_a2	REG_A2
   38 #define	REG_a3	REG_A3
   39 #define	REG_a4	REG_A4
   40 #define	REG_a5	REG_A5
   41 #define	REG_a6	REG_A6
   42 #define	REG_a7	REG_A7
   43 
   44 
   45 #define LP0(offs, rt, name, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
   46 ({                                                        \
   47 	REG_A6             = (ULONG) (bn);                \
   48 	(rt) (*MyEmulHandle->EmulCallDirectOS)(-offs);    \
   49 })
   50 
   51 #define LP0NR(offs, name, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
   52 ({                                                        \
   53 	REG_A6             = (ULONG) (bn);                \
   54 	(void) (*MyEmulHandle->EmulCallDirectOS)(-offs);  \
   55 })
   56 
   57 #define LP1(offs, rt, name, t1, v1, r1, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
   58 ({                                                        \
   59 	t1 _##name##_v1 = v1;                             \
   60 	ULONG _##name##_b  = (ULONG) (bn);                \
   61 	REG_##r1           = (ULONG) _##name##_v1;        \
   62 	REG_A6             = _##name##_b;                 \
   63 	(rt) (*MyEmulHandle->EmulCallDirectOS)(-offs);    \
   64 })
   65 
   66 #define LP1NR(offs, name, t1, v1, r1, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
   67 ({                                                        \
   68 	t1 _##name##_v1 = v1;                             \
   69 	ULONG _##name##_b  = (ULONG) (bn);                \
   70 	REG_##r1           = (ULONG) _##name##_v1;        \
   71 	REG_A6             = _##name##_b;                 \
   72 	(void) (*MyEmulHandle->EmulCallDirectOS)(-offs);  \
   73 })
   74 
   75 #define LP1FP(offs, rt, name, t1, v1, r1, bt, bn, fpt, cm1, cs1, cl1, cm2, cs2, cl2 )   \
   76 ({                                                        \
   77 	typedef fpt;                                      \
   78 	t1 _##name##_v1 = v1;                             \
   79 	ULONG _##name##_b  = (ULONG) (bn);                \
   80 	REG_##r1           = (ULONG) _##name##_v1;        \
   81 	REG_A6             = _##name##_b;                 \
   82 	(rt) (*MyEmulHandle->EmulCallDirectOS)(-offs);    \
   83 })
   84 
   85 #define LP2(offs, rt, name, t1, v1, r1, t2, v2, r2, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
   86 ({                                                        \
   87 	t1 _##name##_v1 = v1;                             \
   88 	t2 _##name##_v2 = v2;                             \
   89 	ULONG _##name##_b  = (ULONG) (bn);                \
   90 	REG_##r1           = (ULONG) _##name##_v1;        \
   91 	REG_##r2           = (ULONG) _##name##_v2;        \
   92 	REG_A6             = _##name##_b;                 \
   93 	(rt) (*MyEmulHandle->EmulCallDirectOS)(-offs);    \
   94 })
   95 
   96 #define LP2NR(offs, name, t1, v1, r1, t2, v2, r2, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
   97 ({                                                        \
   98 	t1 _##name##_v1 = v1;                             \
   99 	t2 _##name##_v2 = v2;                             \
  100 	ULONG _##name##_b  = (ULONG) (bn);                \
  101 	REG_##r1           = (ULONG) _##name##_v1;        \
  102 	REG_##r2           = (ULONG) _##name##_v2;        \
  103 	REG_A6             = _##name##_b;                 \
  104 	(void) (*MyEmulHandle->EmulCallDirectOS)(-offs);  \
  105 })
  106 
  107 #define LP2UB(offs, rt, name, t1, v1, r1, t2, v2, r2, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  108 ({                                                        \
  109 	t1 _##name##_v1 = v1;                             \
  110 	t2 _##name##_v2 = v2;                             \
  111 	REG_##r1           = (ULONG) _##name##_v1;        \
  112 	REG_##r2           = (ULONG) _##name##_v2;        \
  113 	(rt) (*MyEmulHandle->EmulCallDirectOS)(-offs);    \
  114 })
  115 
  116 #define LP2FP(offs, rt, name, t1, v1, r1, t2, v2, r2, bt, bn, fpt, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  117 ({                                                        \
  118 	typedef fpt;                                      \
  119 	t1 _##name##_v1 = v1;                             \
  120 	t2 _##name##_v2 = v2;                             \
  121 	ULONG _##name##_b  = (ULONG) (bn);                \
  122 	REG_##r1           = (ULONG) _##name##_v1;        \
  123 	REG_##r2           = (ULONG) _##name##_v2;        \
  124 	REG_A6             = _##name##_b;                 \
  125 	(rt) (*MyEmulHandle->EmulCallDirectOS)(-offs);    \
  126 })
  127 
  128 #define LP3(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  129 ({                                                        \
  130 	t1 _##name##_v1 = v1;                             \
  131 	t2 _##name##_v2 = v2;                             \
  132 	t3 _##name##_v3 = v3;                             \
  133 	ULONG _##name##_b  = (ULONG) (bn);                \
  134 	REG_##r1           = (ULONG) _##name##_v1;        \
  135 	REG_##r2           = (ULONG) _##name##_v2;        \
  136 	REG_##r3           = (ULONG) _##name##_v3;        \
  137 	REG_A6             = _##name##_b;                 \
  138 	(rt) (*MyEmulHandle->EmulCallDirectOS)(-offs);    \
  139 })
  140 
  141 #define LP3NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  142 ({                                                        \
  143 	t1 _##name##_v1 = v1;                             \
  144 	t2 _##name##_v2 = v2;                             \
  145 	t3 _##name##_v3 = v3;                             \
  146 	ULONG _##name##_b  = (ULONG) (bn);                \
  147 	REG_##r1           = (ULONG) _##name##_v1;        \
  148 	REG_##r2           = (ULONG) _##name##_v2;        \
  149 	REG_##r3           = (ULONG) _##name##_v3;        \
  150 	REG_A6             = _##name##_b;                 \
  151 	(void) (*MyEmulHandle->EmulCallDirectOS)(-offs);  \
  152 })
  153 
  154 #define LP3UB(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  155 ({                                                        \
  156 	t1 _##name##_v1 = v1;                             \
  157 	t2 _##name##_v2 = v2;                             \
  158 	t3 _##name##_v3 = v3;                             \
  159 	REG_##r1           = (ULONG) _##name##_v1;        \
  160 	REG_##r2           = (ULONG) _##name##_v2;        \
  161 	REG_##r3           = (ULONG) _##name##_v3;        \
  162 	(rt) (*MyEmulHandle->EmulCallDirectOS)(-offs);    \
  163 })
  164 
  165 #define LP3NRUB(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  166 ({                                                        \
  167 	t1 _##name##_v1 = v1;                             \
  168 	t2 _##name##_v2 = v2;                             \
  169 	t3 _##name##_v3 = v3;                             \
  170 	REG_##r1           = (ULONG) _##name##_v1;        \
  171 	REG_##r2           = (ULONG) _##name##_v2;        \
  172 	REG_##r3           = (ULONG) _##name##_v3;        \
  173 	(void) (*MyEmulHandle->EmulCallDirectOS)(-offs);  \
  174 })
  175 
  176 #define LP3FP(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, bt, bn, fpt, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  177 ({                                                        \
  178 	typedef fpt;                                      \
  179 	t1 _##name##_v1 = v1;                             \
  180 	t2 _##name##_v2 = v2;                             \
  181 	t3 _##name##_v3 = v3;                             \
  182 	ULONG _##name##_b  = (ULONG) (bn);                \
  183 	REG_##r1           = (ULONG) _##name##_v1;        \
  184 	REG_##r2           = (ULONG) _##name##_v2;        \
  185 	REG_##r3           = (ULONG) _##name##_v3;        \
  186 	REG_A6             = _##name##_b;                 \
  187 	(rt) (*MyEmulHandle->EmulCallDirectOS)(-offs);\
  188 })
  189 
  190 #define LP3NRFP(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, bt, bn, fpt, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  191 ({                                                        \
  192 	typedef fpt;                                      \
  193 	t1 _##name##_v1 = v1;                             \
  194 	t2 _##name##_v2 = v2;                             \
  195 	t3 _##name##_v3 = v3;                             \
  196 	ULONG _##name##_b  = (ULONG) (bn);                \
  197 	REG_##r1           = (ULONG) _##name##_v1;        \
  198 	REG_##r2           = (ULONG) _##name##_v2;        \
  199 	REG_##r3           = (ULONG) _##name##_v3;        \
  200 	REG_A6             = _##name##_b;                 \
  201 	(void) (*MyEmulHandle->EmulCallDirectOS)(-offs);  \
  202 })
  203 
  204 #define LP4(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  205 ({                                                        \
  206 	t1 _##name##_v1 = v1;                             \
  207 	t2 _##name##_v2 = v2;                             \
  208 	t3 _##name##_v3 = v3;                             \
  209 	t4 _##name##_v4 = v4;                             \
  210 	ULONG _##name##_b  = (ULONG) (bn);                \
  211 	REG_##r1           = (ULONG) _##name##_v1;        \
  212 	REG_##r2           = (ULONG) _##name##_v2;        \
  213 	REG_##r3           = (ULONG) _##name##_v3;        \
  214 	REG_##r4           = (ULONG) _##name##_v4;        \
  215 	REG_A6             = _##name##_b;                 \
  216 	(rt) (*MyEmulHandle->EmulCallDirectOS)(-offs);    \
  217 })
  218 
  219 #define LP4NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  220 ({                                                        \
  221 	t1 _##name##_v1 = v1;                             \
  222 	t2 _##name##_v2 = v2;                             \
  223 	t3 _##name##_v3 = v3;                             \
  224 	t4 _##name##_v4 = v4;                             \
  225 	ULONG _##name##_b  = (ULONG) (bn);                \
  226 	REG_##r1           = (ULONG) _##name##_v1;        \
  227 	REG_##r2           = (ULONG) _##name##_v2;        \
  228 	REG_##r3           = (ULONG) _##name##_v3;        \
  229 	REG_##r4           = (ULONG) _##name##_v4;        \
  230 	REG_A6             = _##name##_b;                 \
  231 	(void) (*MyEmulHandle->EmulCallDirectOS)(-offs);  \
  232 })
  233 
  234 #define LP4FP(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, bt, bn, fpt, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  235 ({                                                        \
  236 	typedef fpt;                                      \
  237 	t1 _##name##_v1 = v1;                             \
  238 	t2 _##name##_v2 = v2;                             \
  239 	t3 _##name##_v3 = v3;                             \
  240 	t4 _##name##_v4 = v4;                             \
  241 	ULONG _##name##_b  = (ULONG) (bn);                \
  242 	REG_##r1           = (ULONG) _##name##_v1;        \
  243 	REG_##r2           = (ULONG) _##name##_v2;        \
  244 	REG_##r3           = (ULONG) _##name##_v3;        \
  245 	REG_##r4           = (ULONG) _##name##_v4;        \
  246 	REG_A6             = _##name##_b;                 \
  247 	(rt) (*MyEmulHandle->EmulCallDirectOS)(-offs);    \
  248 })
  249 
  250 #define LP5(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  251 ({                                                        \
  252 	t1 _##name##_v1 = v1;                             \
  253 	t2 _##name##_v2 = v2;                             \
  254 	t3 _##name##_v3 = v3;                             \
  255 	t4 _##name##_v4 = v4;                             \
  256 	t5 _##name##_v5 = v5;                             \
  257 	ULONG _##name##_b  = (ULONG) (bn);                \
  258 	REG_##r1           = (ULONG) _##name##_v1;        \
  259 	REG_##r2           = (ULONG) _##name##_v2;        \
  260 	REG_##r3           = (ULONG) _##name##_v3;        \
  261 	REG_##r4           = (ULONG) _##name##_v4;        \
  262 	REG_##r5           = (ULONG) _##name##_v5;        \
  263 	REG_A6             = _##name##_b;                 \
  264 	(rt) (*MyEmulHandle->EmulCallDirectOS)(-offs);    \
  265 })
  266 
  267 #define LP5NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  268 ({                                                        \
  269 	t1 _##name##_v1 = v1;                             \
  270 	t2 _##name##_v2 = v2;                             \
  271 	t3 _##name##_v3 = v3;                             \
  272 	t4 _##name##_v4 = v4;                             \
  273 	t5 _##name##_v5 = v5;                             \
  274 	ULONG _##name##_b  = (ULONG) (bn);                \
  275 	REG_##r1           = (ULONG) _##name##_v1;        \
  276 	REG_##r2           = (ULONG) _##name##_v2;        \
  277 	REG_##r3           = (ULONG) _##name##_v3;        \
  278 	REG_##r4           = (ULONG) _##name##_v4;        \
  279 	REG_##r5           = (ULONG) _##name##_v5;        \
  280 	REG_A6             = _##name##_b;                 \
  281 	(void) (*MyEmulHandle->EmulCallDirectOS)(-offs);  \
  282 })
  283 
  284 #define LP5FP(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, bt, bn, fpt, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  285 ({                                                        \
  286 	typedef fpt;                                      \
  287 	t1 _##name##_v1 = v1;                             \
  288 	t2 _##name##_v2 = v2;                             \
  289 	t3 _##name##_v3 = v3;                             \
  290 	t4 _##name##_v4 = v4;                             \
  291 	t5 _##name##_v5 = v5;                             \
  292 	ULONG _##name##_b  = (ULONG) (bn);                \
  293 	REG_##r1           = (ULONG) _##name##_v1;        \
  294 	REG_##r2           = (ULONG) _##name##_v2;        \
  295 	REG_##r3           = (ULONG) _##name##_v3;        \
  296 	REG_##r4           = (ULONG) _##name##_v4;        \
  297 	REG_##r5           = (ULONG) _##name##_v5;        \
  298 	REG_A6             = _##name##_b;                 \
  299 	(rt) (*MyEmulHandle->EmulCallDirectOS)(-offs);    \
  300 })
  301 
  302 #define LP6(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  303 ({                                                        \
  304 	t1 _##name##_v1 = v1;                             \
  305 	t2 _##name##_v2 = v2;                             \
  306 	t3 _##name##_v3 = v3;                             \
  307 	t4 _##name##_v4 = v4;                             \
  308 	t5 _##name##_v5 = v5;                             \
  309 	t6 _##name##_v6 = v6;                             \
  310 	ULONG _##name##_b  = (ULONG) (bn);                \
  311 	REG_##r1           = (ULONG) _##name##_v1;        \
  312 	REG_##r2           = (ULONG) _##name##_v2;        \
  313 	REG_##r3           = (ULONG) _##name##_v3;        \
  314 	REG_##r4           = (ULONG) _##name##_v4;        \
  315 	REG_##r5           = (ULONG) _##name##_v5;        \
  316 	REG_##r6           = (ULONG) _##name##_v6;        \
  317 	REG_A6             = _##name##_b;                 \
  318 	(rt) (*MyEmulHandle->EmulCallDirectOS)(-offs);    \
  319 })
  320 
  321 #define LP6NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  322 ({                                                        \
  323 	t1 _##name##_v1 = v1;                             \
  324 	t2 _##name##_v2 = v2;                             \
  325 	t3 _##name##_v3 = v3;                             \
  326 	t4 _##name##_v4 = v4;                             \
  327 	t5 _##name##_v5 = v5;                             \
  328 	t6 _##name##_v6 = v6;                             \
  329 	ULONG _##name##_b  = (ULONG) (bn);                \
  330 	REG_##r1           = (ULONG) _##name##_v1;        \
  331 	REG_##r2           = (ULONG) _##name##_v2;        \
  332 	REG_##r3           = (ULONG) _##name##_v3;        \
  333 	REG_##r4           = (ULONG) _##name##_v4;        \
  334 	REG_##r5           = (ULONG) _##name##_v5;        \
  335 	REG_##r6           = (ULONG) _##name##_v6;        \
  336 	REG_A6             = _##name##_b;                 \
  337 	(void) (*MyEmulHandle->EmulCallDirectOS)(-offs);  \
  338 })
  339 
  340 #define LP7(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  341 ({                                                        \
  342 	t1 _##name##_v1 = v1;                             \
  343 	t2 _##name##_v2 = v2;                             \
  344 	t3 _##name##_v3 = v3;                             \
  345 	t4 _##name##_v4 = v4;                             \
  346 	t5 _##name##_v5 = v5;                             \
  347 	t6 _##name##_v6 = v6;                             \
  348 	t7 _##name##_v7 = v7;                             \
  349 	ULONG _##name##_b  = (ULONG) (bn);                \
  350 	REG_##r1           = (ULONG) _##name##_v1;        \
  351 	REG_##r2           = (ULONG) _##name##_v2;        \
  352 	REG_##r3           = (ULONG) _##name##_v3;        \
  353 	REG_##r4           = (ULONG) _##name##_v4;        \
  354 	REG_##r5           = (ULONG) _##name##_v5;        \
  355 	REG_##r6           = (ULONG) _##name##_v6;        \
  356 	REG_##r7           = (ULONG) _##name##_v7;        \
  357 	REG_A6             = _##name##_b;                 \
  358 	(rt) (*MyEmulHandle->EmulCallDirectOS)(-offs);    \
  359 })
  360 
  361 #define LP7NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  362 ({                                                        \
  363 	t1 _##name##_v1 = v1;                             \
  364 	t2 _##name##_v2 = v2;                             \
  365 	t3 _##name##_v3 = v3;                             \
  366 	t4 _##name##_v4 = v4;                             \
  367 	t5 _##name##_v5 = v5;                             \
  368 	t6 _##name##_v6 = v6;                             \
  369 	t7 _##name##_v7 = v7;                             \
  370 	ULONG _##name##_b  = (ULONG) (bn);                \
  371 	REG_##r1           = (ULONG) _##name##_v1;        \
  372 	REG_##r2           = (ULONG) _##name##_v2;        \
  373 	REG_##r3           = (ULONG) _##name##_v3;        \
  374 	REG_##r4           = (ULONG) _##name##_v4;        \
  375 	REG_##r5           = (ULONG) _##name##_v5;        \
  376 	REG_##r6           = (ULONG) _##name##_v6;        \
  377 	REG_##r7           = (ULONG) _##name##_v7;        \
  378 	REG_A6             = _##name##_b;                 \
  379 	(void) (*MyEmulHandle->EmulCallDirectOS)(-offs);  \
  380 })
  381 
  382 #define LP8(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  383 ({                                                        \
  384 	t1 _##name##_v1 = v1;                             \
  385 	t2 _##name##_v2 = v2;                             \
  386 	t3 _##name##_v3 = v3;                             \
  387 	t4 _##name##_v4 = v4;                             \
  388 	t5 _##name##_v5 = v5;                             \
  389 	t6 _##name##_v6 = v6;                             \
  390 	t7 _##name##_v7 = v7;                             \
  391 	t8 _##name##_v8 = v8;                             \
  392 	ULONG _##name##_b  = (ULONG) (bn);                \
  393 	REG_##r1           = (ULONG) _##name##_v1;        \
  394 	REG_##r2           = (ULONG) _##name##_v2;        \
  395 	REG_##r3           = (ULONG) _##name##_v3;        \
  396 	REG_##r4           = (ULONG) _##name##_v4;        \
  397 	REG_##r5           = (ULONG) _##name##_v5;        \
  398 	REG_##r6           = (ULONG) _##name##_v6;        \
  399 	REG_##r7           = (ULONG) _##name##_v7;        \
  400 	REG_##r8           = (ULONG) _##name##_v8;        \
  401 	REG_A6             = _##name##_b;                 \
  402 	(rt) (*MyEmulHandle->EmulCallDirectOS)(-offs);    \
  403 })
  404 
  405 #define LP8NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  406 ({                                                        \
  407 	t1 _##name##_v1 = v1;                             \
  408 	t2 _##name##_v2 = v2;                             \
  409 	t3 _##name##_v3 = v3;                             \
  410 	t4 _##name##_v4 = v4;                             \
  411 	t5 _##name##_v5 = v5;                             \
  412 	t6 _##name##_v6 = v6;                             \
  413 	t7 _##name##_v7 = v7;                             \
  414 	t8 _##name##_v8 = v8;                             \
  415 	ULONG _##name##_b  = (ULONG) (bn);                \
  416 	REG_##r1           = (ULONG) _##name##_v1;        \
  417 	REG_##r2           = (ULONG) _##name##_v2;        \
  418 	REG_##r3           = (ULONG) _##name##_v3;        \
  419 	REG_##r4           = (ULONG) _##name##_v4;        \
  420 	REG_##r5           = (ULONG) _##name##_v5;        \
  421 	REG_##r6           = (ULONG) _##name##_v6;        \
  422 	REG_##r7           = (ULONG) _##name##_v7;        \
  423 	REG_##r8           = (ULONG) _##name##_v8;        \
  424 	REG_A6             = _##name##_b;                 \
  425 	(void) (*MyEmulHandle->EmulCallDirectOS)(-offs);  \
  426 })
  427 
  428 #define LP9(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  429 ({                                                        \
  430 	t1 _##name##_v1 = v1;                             \
  431 	t2 _##name##_v2 = v2;                             \
  432 	t3 _##name##_v3 = v3;                             \
  433 	t4 _##name##_v4 = v4;                             \
  434 	t5 _##name##_v5 = v5;                             \
  435 	t6 _##name##_v6 = v6;                             \
  436 	t7 _##name##_v7 = v7;                             \
  437 	t8 _##name##_v8 = v8;                             \
  438 	t9 _##name##_v9 = v9;                             \
  439 	ULONG _##name##_b  = (ULONG) (bn);                \
  440 	REG_##r1           = (ULONG) _##name##_v1;        \
  441 	REG_##r2           = (ULONG) _##name##_v2;        \
  442 	REG_##r3           = (ULONG) _##name##_v3;        \
  443 	REG_##r4           = (ULONG) _##name##_v4;        \
  444 	REG_##r5           = (ULONG) _##name##_v5;        \
  445 	REG_##r6           = (ULONG) _##name##_v6;        \
  446 	REG_##r7           = (ULONG) _##name##_v7;        \
  447 	REG_##r8           = (ULONG) _##name##_v8;        \
  448 	REG_##r9           = (ULONG) _##name##_v9;        \
  449 	REG_A6             = _##name##_b;                 \
  450 	(rt) (*MyEmulHandle->EmulCallDirectOS)(-offs);    \
  451 })
  452 
  453 #define LP9NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  454 ({                                                        \
  455 	t1 _##name##_v1 = v1;                             \
  456 	t2 _##name##_v2 = v2;                             \
  457 	t3 _##name##_v3 = v3;                             \
  458 	t4 _##name##_v4 = v4;                             \
  459 	t5 _##name##_v5 = v5;                             \
  460 	t6 _##name##_v6 = v6;                             \
  461 	t7 _##name##_v7 = v7;                             \
  462 	t8 _##name##_v8 = v8;                             \
  463 	t9 _##name##_v9 = v9;                             \
  464 	ULONG _##name##_b  = (ULONG) (bn);                \
  465 	REG_##r1           = (ULONG) _##name##_v1;        \
  466 	REG_##r2           = (ULONG) _##name##_v2;        \
  467 	REG_##r3           = (ULONG) _##name##_v3;        \
  468 	REG_##r4           = (ULONG) _##name##_v4;        \
  469 	REG_##r5           = (ULONG) _##name##_v5;        \
  470 	REG_##r6           = (ULONG) _##name##_v6;        \
  471 	REG_##r7           = (ULONG) _##name##_v7;        \
  472 	REG_##r8           = (ULONG) _##name##_v8;        \
  473 	REG_##r9           = (ULONG) _##name##_v9;        \
  474 	REG_A6             = _##name##_b;                 \
  475 	(void) (*MyEmulHandle->EmulCallDirectOS)(-offs);  \
  476 })
  477 
  478 #define LP10(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, ta, va, ra, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  479 ({                                                        \
  480 	t1 _##name##_v1 = v1;                             \
  481 	t2 _##name##_v2 = v2;                             \
  482 	t3 _##name##_v3 = v3;                             \
  483 	t4 _##name##_v4 = v4;                             \
  484 	t5 _##name##_v5 = v5;                             \
  485 	t6 _##name##_v6 = v6;                             \
  486 	t7 _##name##_v7 = v7;                             \
  487 	t8 _##name##_v8 = v8;                             \
  488 	t9 _##name##_v9 = v9;                             \
  489 	ta _##name##_va = va;                             \
  490 	ULONG _##name##_b  = (ULONG) (bn);                \
  491 	REG_##r1           = (ULONG) _##name##_v1;        \
  492 	REG_##r2           = (ULONG) _##name##_v2;        \
  493 	REG_##r3           = (ULONG) _##name##_v3;        \
  494 	REG_##r4           = (ULONG) _##name##_v4;        \
  495 	REG_##r5           = (ULONG) _##name##_v5;        \
  496 	REG_##r6           = (ULONG) _##name##_v6;        \
  497 	REG_##r7           = (ULONG) _##name##_v7;        \
  498 	REG_##r8           = (ULONG) _##name##_v8;        \
  499 	REG_##r9           = (ULONG) _##name##_v9;        \
  500 	REG_##ra           = (ULONG) _##name##_va;        \
  501 	REG_A6             = _##name##_b;                 \
  502 	(rt) (*MyEmulHandle->EmulCallDirectOS)(-offs);    \
  503 })
  504 
  505 #define LP10NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, ta, va, ra, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  506 ({                                                        \
  507 	t1 _##name##_v1 = v1;                             \
  508 	t2 _##name##_v2 = v2;                             \
  509 	t3 _##name##_v3 = v3;                             \
  510 	t4 _##name##_v4 = v4;                             \
  511 	t5 _##name##_v5 = v5;                             \
  512 	t6 _##name##_v6 = v6;                             \
  513 	t7 _##name##_v7 = v7;                             \
  514 	t8 _##name##_v8 = v8;                             \
  515 	t9 _##name##_v9 = v9;                             \
  516 	ta _##name##_va = va;                             \
  517 	ULONG _##name##_b  = (ULONG) (bn);                \
  518 	REG_##r1           = (ULONG) _##name##_v1;        \
  519 	REG_##r2           = (ULONG) _##name##_v2;        \
  520 	REG_##r3           = (ULONG) _##name##_v3;        \
  521 	REG_##r4           = (ULONG) _##name##_v4;        \
  522 	REG_##r5           = (ULONG) _##name##_v5;        \
  523 	REG_##r6           = (ULONG) _##name##_v6;        \
  524 	REG_##r7           = (ULONG) _##name##_v7;        \
  525 	REG_##r8           = (ULONG) _##name##_v8;        \
  526 	REG_##r9           = (ULONG) _##name##_v9;        \
  527 	REG_##ra           = (ULONG) _##name##_va;        \
  528 	REG_A6             = _##name##_b;                 \
  529 	(void) (*MyEmulHandle->EmulCallDirectOS)(-offs);  \
  530 })
  531 
  532 #define LP11(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, ta, va, ra, tb, vb, rb, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  533 ({                                                        \
  534 	t1 _##name##_v1 = v1;                             \
  535 	t2 _##name##_v2 = v2;                             \
  536 	t3 _##name##_v3 = v3;                             \
  537 	t4 _##name##_v4 = v4;                             \
  538 	t5 _##name##_v5 = v5;                             \
  539 	t6 _##name##_v6 = v6;                             \
  540 	t7 _##name##_v7 = v7;                             \
  541 	t8 _##name##_v8 = v8;                             \
  542 	t9 _##name##_v9 = v9;                             \
  543 	ta _##name##_va = va;                             \
  544 	tb _##name##_vb = vb;                             \
  545 	ULONG _##name##_b  = (ULONG) (bn);                \
  546 	REG_##r1           = (ULONG) _##name##_v1;        \
  547 	REG_##r2           = (ULONG) _##name##_v2;        \
  548 	REG_##r3           = (ULONG) _##name##_v3;        \
  549 	REG_##r4           = (ULONG) _##name##_v4;        \
  550 	REG_##r5           = (ULONG) _##name##_v5;        \
  551 	REG_##r6           = (ULONG) _##name##_v6;        \
  552 	REG_##r7           = (ULONG) _##name##_v7;        \
  553 	REG_##r8           = (ULONG) _##name##_v8;        \
  554 	REG_##r9           = (ULONG) _##name##_v9;        \
  555 	REG_##ra           = (ULONG) _##name##_va;        \
  556 	REG_##rb           = (ULONG) _##name##_vb;        \
  557 	REG_A6             = _##name##_b;                 \
  558 	(rt) (*MyEmulHandle->EmulCallDirectOS)(-offs);    \
  559 })
  560 
  561 #define LP11NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, ta, va, ra, tb, vb, rb, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  562 ({                                                        \
  563 	t1 _##name##_v1 = v1;                             \
  564 	t2 _##name##_v2 = v2;                             \
  565 	t3 _##name##_v3 = v3;                             \
  566 	t4 _##name##_v4 = v4;                             \
  567 	t5 _##name##_v5 = v5;                             \
  568 	t6 _##name##_v6 = v6;                             \
  569 	t7 _##name##_v7 = v7;                             \
  570 	t8 _##name##_v8 = v8;                             \
  571 	t9 _##name##_v9 = v9;                             \
  572 	ta _##name##_va = va;                             \
  573 	tb _##name##_vb = vb;                             \
  574 	ULONG _##name##_b  = (ULONG) (bn);                \
  575 	REG_##r1           = (ULONG) _##name##_v1;        \
  576 	REG_##r2           = (ULONG) _##name##_v2;        \
  577 	REG_##r3           = (ULONG) _##name##_v3;        \
  578 	REG_##r4           = (ULONG) _##name##_v4;        \
  579 	REG_##r5           = (ULONG) _##name##_v5;        \
  580 	REG_##r6           = (ULONG) _##name##_v6;        \
  581 	REG_##r7           = (ULONG) _##name##_v7;        \
  582 	REG_##r8           = (ULONG) _##name##_v8;        \
  583 	REG_##r9           = (ULONG) _##name##_v9;        \
  584 	REG_##ra           = (ULONG) _##name##_va;        \
  585 	REG_##rb           = (ULONG) _##name##_vb;        \
  586 	REG_A6             = _##name##_b;                 \
  587 	(void) (*MyEmulHandle->EmulCallDirectOS)(-offs);  \
  588 })
  589 
  590 #define LP12NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, ta, va, ra, tb, vb, rb, tc, vc, rc, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  591 ({                                                        \
  592 	t1 _##name##_v1 = v1;                             \
  593 	t2 _##name##_v2 = v2;                             \
  594 	t3 _##name##_v3 = v3;                             \
  595 	t4 _##name##_v4 = v4;                             \
  596 	t5 _##name##_v5 = v5;                             \
  597 	t6 _##name##_v6 = v6;                             \
  598 	t7 _##name##_v7 = v7;                             \
  599 	t8 _##name##_v8 = v8;                             \
  600 	t9 _##name##_v9 = v9;                             \
  601 	ta _##name##_va = va;                             \
  602 	tb _##name##_vb = vb;                             \
  603 	tc _##name##_vc = vc;                             \
  604 	ULONG _##name##_b  = (ULONG) (bn);                \
  605 	REG_##r1           = (ULONG) _##name##_v1;        \
  606 	REG_##r2           = (ULONG) _##name##_v2;        \
  607 	REG_##r3           = (ULONG) _##name##_v3;        \
  608 	REG_##r4           = (ULONG) _##name##_v4;        \
  609 	REG_##r5           = (ULONG) _##name##_v5;        \
  610 	REG_##r6           = (ULONG) _##name##_v6;        \
  611 	REG_##r7           = (ULONG) _##name##_v7;        \
  612 	REG_##r8           = (ULONG) _##name##_v8;        \
  613 	REG_##r9           = (ULONG) _##name##_v9;        \
  614 	REG_##ra           = (ULONG) _##name##_va;        \
  615 	REG_##rb           = (ULONG) _##name##_vb;        \
  616 	REG_##rc           = (ULONG) _##name##_vc;        \
  617 	REG_A6             = _##name##_b;                 \
  618 	(void) (*MyEmulHandle->EmulCallDirectOS)(-offs);  \
  619 })
  620 
  621 #else
  622 
  623 #define LP0(offs, rt, name, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  624 ({                                                           \
  625 	struct EmulCaos _##name##_caos;                      \
  626 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  627 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  628 	(rt) (*MyEmulHandle->EmulCallOS)(&_##name##_caos);   \
  629 })
  630 
  631 #define LP0NR(offs, name, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  632 ({                                                           \
  633 	struct EmulCaos _##name##_caos;                      \
  634 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  635 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  636 	(void) (*MyEmulHandle->EmulCallOS)(&_##name##_caos); \
  637 })
  638 
  639 #define LP1(offs, rt, name, t1, v1, r1, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  640 ({                                                           \
  641 	struct EmulCaos _##name##_caos;                      \
  642 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  643 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  644 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  645 	(rt) (*MyEmulHandle->EmulCallOS)(&_##name##_caos);   \
  646 })
  647 
  648 #define LP1NR(offs, name, t1, v1, r1, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  649 ({                                                           \
  650 	struct EmulCaos _##name##_caos;                      \
  651 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  652 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  653 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  654 	(void) (*MyEmulHandle->EmulCallOS)(&_##name##_caos); \
  655 })
  656 
  657 #define LP1FP(offs, rt, name, t1, v1, r1, bt, bn, fpt, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  658 ({                                                           \
  659 	typedef fpt;                                         \
  660 	struct EmulCaos _##name##_caos;                      \
  661 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  662 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  663 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  664 	(rt) (*MyEmulHandle->EmulCallOS)(&_##name##_caos);   \
  665 })
  666 
  667 #define LP2(offs, rt, name, t1, v1, r1, t2, v2, r2, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  668 ({                                                           \
  669 	struct EmulCaos _##name##_caos;                      \
  670 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  671 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  672 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  673 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  674 	(rt) (*MyEmulHandle->EmulCallOS)(&_##name##_caos);   \
  675 })
  676 
  677 #define LP2NR(offs, name, t1, v1, r1, t2, v2, r2, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  678 ({                                                           \
  679 	struct EmulCaos _##name##_caos;                      \
  680 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  681 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  682 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  683 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  684 	(void) (*MyEmulHandle->EmulCallOS)(&_##name##_caos); \
  685 })
  686 
  687 #define LP2UB(offs, rt, name, t1, v1, r1, t2, v2, r2, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  688 ({                                                           \
  689 	struct EmulCaos _##name##_caos;                      \
  690 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  691 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  692 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  693 	(rt) (*MyEmulHandle->EmulCallOS)(&_##name##_caos);   \
  694 })
  695 
  696 #define LP2FP(offs, rt, name, t1, v1, r1, t2, v2, r2, bt, bn, fpt, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  697 ({                                                           \
  698 	typedef fpt;                                         \
  699 	struct EmulCaos _##name##_caos;                      \
  700 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  701 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  702 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  703 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  704 	(rt) (*MyEmulHandle->EmulCallOS)(&_##name##_caos);   \
  705 })
  706 
  707 #define LP3(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  708 ({                                                           \
  709 	struct EmulCaos _##name##_caos;                      \
  710 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  711 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  712 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  713 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  714 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  715 	(rt) (*MyEmulHandle->EmulCallOS)(&_##name##_caos);   \
  716 })
  717 
  718 #define LP3NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  719 ({                                                           \
  720 	struct EmulCaos _##name##_caos;                      \
  721 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  722 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  723 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  724 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  725 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  726 	(void) (*MyEmulHandle->EmulCallOS)(&_##name##_caos); \
  727 })
  728 
  729 #define LP3UB(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  730 ({                                                           \
  731 	struct EmulCaos _##name##_caos;                      \
  732 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  733 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  734 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  735 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  736 	(rt) (*MyEmulHandle->EmulCallOS)(&_##name##_caos);   \
  737 })
  738 
  739 #define LP3NRUB(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  740 ({                                                           \
  741 	struct EmulCaos _##name##_caos;                      \
  742 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  743 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  744 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  745 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  746 	(void) (*MyEmulHandle->EmulCallOS)(&_##name##_caos); \
  747 })
  748 
  749 #define LP3FP(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, bt, bn, fpt, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  750 ({                                                           \
  751 	typedef fpt;                                         \
  752 	struct EmulCaos _##name##_caos;                      \
  753 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  754 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  755 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  756 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  757 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  758 	(rt) (*MyEmulHandle->EmulCallOS)(&_##name##_caos);   \
  759 })
  760 
  761 #define LP3NRFP(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, bt, bn, fpt, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  762 ({                                                           \
  763 	typedef fpt;                                         \
  764 	struct EmulCaos _##name##_caos;                      \
  765 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  766 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  767 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  768 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  769 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  770 	(void) (*MyEmulHandle->EmulCallOS)(&_##name##_caos); \
  771 })
  772 
  773 #define LP4(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  774 ({                                                           \
  775 	struct EmulCaos _##name##_caos;                      \
  776 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  777 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  778 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  779 	_##name##_caos.reg_##r4           = (ULONG) (v4);    \
  780 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  781 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  782 	(rt) (*MyEmulHandle->EmulCallOS)(&_##name##_caos);   \
  783 })
  784 
  785 #define LP4NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  786 ({                                                           \
  787 	struct EmulCaos _##name##_caos;                      \
  788 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  789 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  790 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  791 	_##name##_caos.reg_##r4           = (ULONG) (v4);    \
  792 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  793 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  794 	(void) (*MyEmulHandle->EmulCallOS)(&_##name##_caos); \
  795 })
  796 
  797 #define LP4FP(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, bt, bn, fpt, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  798 ({                                                           \
  799 	typedef fpt;                                         \
  800 	struct EmulCaos _##name##_caos;                      \
  801 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  802 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  803 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  804 	_##name##_caos.reg_##r4           = (ULONG) (v4);    \
  805 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  806 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  807 	(rt) (*MyEmulHandle->EmulCallOS)(&_##name##_caos);   \
  808 })
  809 
  810 #define LP5(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  811 ({                                                           \
  812 	struct EmulCaos _##name##_caos;                      \
  813 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  814 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  815 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  816 	_##name##_caos.reg_##r4           = (ULONG) (v4);    \
  817 	_##name##_caos.reg_##r5           = (ULONG) (v5);    \
  818 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  819 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  820 	(rt) (*MyEmulHandle->EmulCallOS)(&_##name##_caos);   \
  821 })
  822 
  823 #define LP5NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  824 ({                                                           \
  825 	struct EmulCaos _##name##_caos;                      \
  826 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  827 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  828 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  829 	_##name##_caos.reg_##r4           = (ULONG) (v4);    \
  830 	_##name##_caos.reg_##r5           = (ULONG) (v5);    \
  831 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  832 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  833 	(void) (*MyEmulHandle->EmulCallOS)(&_##name##_caos); \
  834 })
  835 
  836 #define LP5FP(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, bt, bn, fpt, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  837 ({                                                           \
  838 	typedef fpt;                                         \
  839 	struct EmulCaos _##name##_caos;                      \
  840 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  841 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  842 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  843 	_##name##_caos.reg_##r4           = (ULONG) (v4);    \
  844 	_##name##_caos.reg_##r5           = (ULONG) (v5);    \
  845 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  846 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  847 	(rt) (*MyEmulHandle->EmulCallOS)(&_##name##_caos);   \
  848 })
  849 
  850 #define LP6(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  851 ({                                                           \
  852 	struct EmulCaos _##name##_caos;                      \
  853 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  854 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  855 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  856 	_##name##_caos.reg_##r4           = (ULONG) (v4);    \
  857 	_##name##_caos.reg_##r5           = (ULONG) (v5);    \
  858 	_##name##_caos.reg_##r6           = (ULONG) (v6);    \
  859 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  860 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  861 	(rt) (*MyEmulHandle->EmulCallOS)(&_##name##_caos);   \
  862 })
  863 
  864 #define LP6NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  865 ({                                                           \
  866 	struct EmulCaos _##name##_caos;                      \
  867 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  868 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  869 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  870 	_##name##_caos.reg_##r4           = (ULONG) (v4);    \
  871 	_##name##_caos.reg_##r5           = (ULONG) (v5);    \
  872 	_##name##_caos.reg_##r6           = (ULONG) (v6);    \
  873 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  874 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  875 	(void) (*MyEmulHandle->EmulCallOS)(&_##name##_caos); \
  876 })
  877 
  878 #define LP7(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  879 ({                                                           \
  880 	struct EmulCaos _##name##_caos;                      \
  881 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  882 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  883 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  884 	_##name##_caos.reg_##r4           = (ULONG) (v4);    \
  885 	_##name##_caos.reg_##r5           = (ULONG) (v5);    \
  886 	_##name##_caos.reg_##r6           = (ULONG) (v6);    \
  887 	_##name##_caos.reg_##r7           = (ULONG) (v7);    \
  888 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  889 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  890 	(rt) (*MyEmulHandle->EmulCallOS)(&_##name##_caos);   \
  891 })
  892 
  893 #define LP7NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  894 ({                                                           \
  895 	struct EmulCaos _##name##_caos;                      \
  896 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  897 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  898 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  899 	_##name##_caos.reg_##r4           = (ULONG) (v4);    \
  900 	_##name##_caos.reg_##r5           = (ULONG) (v5);    \
  901 	_##name##_caos.reg_##r6           = (ULONG) (v6);    \
  902 	_##name##_caos.reg_##r7           = (ULONG) (v7);    \
  903 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  904 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  905 	(void) (*MyEmulHandle->EmulCallOS)(&_##name##_caos); \
  906 })
  907 
  908 #define LP8(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  909 ({                                                           \
  910 	struct EmulCaos _##name##_caos;                      \
  911 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  912 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  913 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  914 	_##name##_caos.reg_##r4           = (ULONG) (v4);    \
  915 	_##name##_caos.reg_##r5           = (ULONG) (v5);    \
  916 	_##name##_caos.reg_##r6           = (ULONG) (v6);    \
  917 	_##name##_caos.reg_##r7           = (ULONG) (v7);    \
  918 	_##name##_caos.reg_##r8           = (ULONG) (v8);    \
  919 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  920 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  921 	(rt) (*MyEmulHandle->EmulCallOS)(&_##name##_caos);   \
  922 })
  923 
  924 #define LP8NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  925 ({                                                           \
  926 	struct EmulCaos _##name##_caos;                      \
  927 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  928 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  929 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  930 	_##name##_caos.reg_##r4           = (ULONG) (v4);    \
  931 	_##name##_caos.reg_##r5           = (ULONG) (v5);    \
  932 	_##name##_caos.reg_##r6           = (ULONG) (v6);    \
  933 	_##name##_caos.reg_##r7           = (ULONG) (v7);    \
  934 	_##name##_caos.reg_##r8           = (ULONG) (v8);    \
  935 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  936 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  937 	(void) (*MyEmulHandle->EmulCallOS)(&_##name##_caos); \
  938 })
  939 
  940 #define LP9(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  941 ({                                                           \
  942 	struct EmulCaos _##name##_caos;                      \
  943 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  944 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  945 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  946 	_##name##_caos.reg_##r4           = (ULONG) (v4);    \
  947 	_##name##_caos.reg_##r5           = (ULONG) (v5);    \
  948 	_##name##_caos.reg_##r6           = (ULONG) (v6);    \
  949 	_##name##_caos.reg_##r7           = (ULONG) (v7);    \
  950 	_##name##_caos.reg_##r8           = (ULONG) (v8);    \
  951 	_##name##_caos.reg_##r9           = (ULONG) (v9);    \
  952 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  953 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  954 	(rt) (*MyEmulHandle->EmulCallOS)(&_##name##_caos);   \
  955 })
  956 
  957 #define LP9NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  958 ({                                                           \
  959 	struct EmulCaos _##name##_caos;                      \
  960 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  961 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  962 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  963 	_##name##_caos.reg_##r4           = (ULONG) (v4);    \
  964 	_##name##_caos.reg_##r5           = (ULONG) (v5);    \
  965 	_##name##_caos.reg_##r6           = (ULONG) (v6);    \
  966 	_##name##_caos.reg_##r7           = (ULONG) (v7);    \
  967 	_##name##_caos.reg_##r8           = (ULONG) (v8);    \
  968 	_##name##_caos.reg_##r9           = (ULONG) (v9);    \
  969 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  970 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  971 	(void) (*MyEmulHandle->EmulCallOS)(&_##name##_caos); \
  972 })
  973 
  974 #define LP10(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, t10, v10, r10, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  975 ({                                                           \
  976 	struct EmulCaos _##name##_caos;                      \
  977 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  978 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  979 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  980 	_##name##_caos.reg_##r4           = (ULONG) (v4);    \
  981 	_##name##_caos.reg_##r5           = (ULONG) (v5);    \
  982 	_##name##_caos.reg_##r6           = (ULONG) (v6);    \
  983 	_##name##_caos.reg_##r7           = (ULONG) (v7);    \
  984 	_##name##_caos.reg_##r8           = (ULONG) (v8);    \
  985 	_##name##_caos.reg_##r9           = (ULONG) (v9);    \
  986 	_##name##_caos.reg_##r10          = (ULONG) (v10);   \
  987 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
  988 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
  989 	(rt) (*MyEmulHandle->EmulCallOS)(&_##name##_caos);   \
  990 })
  991 
  992 #define LP10NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, t10, v10, r10, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
  993 ({                                                           \
  994 	struct EmulCaos _##name##_caos;                      \
  995 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
  996 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
  997 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
  998 	_##name##_caos.reg_##r4           = (ULONG) (v4);    \
  999 	_##name##_caos.reg_##r5           = (ULONG) (v5);    \
 1000 	_##name##_caos.reg_##r6           = (ULONG) (v6);    \
 1001 	_##name##_caos.reg_##r7           = (ULONG) (v7);    \
 1002 	_##name##_caos.reg_##r8           = (ULONG) (v8);    \
 1003 	_##name##_caos.reg_##r9           = (ULONG) (v9);    \
 1004 	_##name##_caos.reg_##r10          = (ULONG) (v10);   \
 1005 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
 1006 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
 1007 	(void) (*MyEmulHandle->EmulCallOS)(&_##name##_caos); \
 1008 })
 1009 
 1010 #define LP11(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, t10, v10, r10, t11, v11, r11, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
 1011 ({                                                           \
 1012 	struct EmulCaos _##name##_caos;                      \
 1013 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
 1014 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
 1015 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
 1016 	_##name##_caos.reg_##r4           = (ULONG) (v4);    \
 1017 	_##name##_caos.reg_##r5           = (ULONG) (v5);    \
 1018 	_##name##_caos.reg_##r6           = (ULONG) (v6);    \
 1019 	_##name##_caos.reg_##r7           = (ULONG) (v7);    \
 1020 	_##name##_caos.reg_##r8           = (ULONG) (v8);    \
 1021 	_##name##_caos.reg_##r9           = (ULONG) (v9);    \
 1022 	_##name##_caos.reg_##r10          = (ULONG) (v10);   \
 1023 	_##name##_caos.reg_##r11          = (ULONG) (v11);   \
 1024 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
 1025 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
 1026 	(rt) (*MyEmulHandle->EmulCallOS)(&_##name##_caos);   \
 1027 })
 1028 
 1029 #define LP11NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, t10, v10, r10, t11, v11, r11, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
 1030 ({                                                           \
 1031 	struct EmulCaos _##name##_caos;                      \
 1032 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
 1033 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
 1034 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
 1035 	_##name##_caos.reg_##r4           = (ULONG) (v4);    \
 1036 	_##name##_caos.reg_##r5           = (ULONG) (v5);    \
 1037 	_##name##_caos.reg_##r6           = (ULONG) (v6);    \
 1038 	_##name##_caos.reg_##r7           = (ULONG) (v7);    \
 1039 	_##name##_caos.reg_##r8           = (ULONG) (v8);    \
 1040 	_##name##_caos.reg_##r9           = (ULONG) (v9);    \
 1041 	_##name##_caos.reg_##r10          = (ULONG) (v10);   \
 1042 	_##name##_caos.reg_##r11          = (ULONG) (v11);   \
 1043 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
 1044 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
 1045 	(void) (*MyEmulHandle->EmulCallOS)(&_##name##_caos); \
 1046 })
 1047 
 1048 #define LP12NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, t10, v10, r10, t11, v11, r11, t12, v12, r12, bt, bn, cm1, cs1, cl1, cm2, cs2, cl2 ) \
 1049 ({                                                           \
 1050 	struct EmulCaos _##name##_caos;                      \
 1051 	_##name##_caos.reg_##r1           = (ULONG) (v1);    \
 1052 	_##name##_caos.reg_##r2           = (ULONG) (v2);    \
 1053 	_##name##_caos.reg_##r3           = (ULONG) (v3);    \
 1054 	_##name##_caos.reg_##r4           = (ULONG) (v4);    \
 1055 	_##name##_caos.reg_##r5           = (ULONG) (v5);    \
 1056 	_##name##_caos.reg_##r6           = (ULONG) (v6);    \
 1057 	_##name##_caos.reg_##r7           = (ULONG) (v7);    \
 1058 	_##name##_caos.reg_##r8           = (ULONG) (v8);    \
 1059 	_##name##_caos.reg_##r9           = (ULONG) (v9);    \
 1060 	_##name##_caos.reg_##r10          = (ULONG) (v10);   \
 1061 	_##name##_caos.reg_##r11          = (ULONG) (v11);   \
 1062 	_##name##_caos.reg_##r12          = (ULONG) (v12);   \
 1063 	_##name##_caos.reg_a6             = (ULONG) (bn);    \
 1064 	_##name##_caos.caos_Un.Offset     =       -(offs);   \
 1065 	(void) (*MyEmulHandle->EmulCallOS)(&_##name##_caos); \
 1066 })
 1067 
 1068 #endif /* __MORPHOS_NODIRECTCALL */
 1069 #endif /* __INLINE_MACROS_H */