/*
 * $Log:	osbind.h,v $
 * Revision 1.2  89/03/08  22:18:03  bammi
 * Many hacks etc. Version as distributed with gcc V1.34
 * 
 *
 */

/*
 *	OSBIND.H	Mnemonic names for operating system calls
 *
 * Adapted from Dale Schumacher's version to Mark Johnson C by Eric Gisin.
 */

/* hacked by jrd for GNU */

/*
 * more hacks
 *	inline the traps
 *
 *		++jrb bammi@dsrgsun.ces.cwru.edu
 */
#ifdef __STDC__
#ifndef __NO_PROTO__
static long trap_1_w(short);
static long trap_1_ww(short, short);
static long trap_1_wl(short, long);
static long trap_1_wlw(short, long, short);
static long trap_1_wwll(short, short, long, long);
static long trap_1_wlww(short, long, short, short);
static long trap_1_www(short, short, short);
static long trap_1_wll(short, long, long);
static long trap_1_wwlll(short, short, long, long, long);
static long trap_13_wl(short, long);
static long trap_13_w(short);
static long trap_13_ww(short, short);
static long trap_13_www(short, short, short);
static long trap_13_wwlwww(short, short, long, short, short, short);
static long trap_13_wwl(short, short, long);
static long trap_14_wwll(short, short, long, long);
static long trap_14_ww(short, short);
static long trap_14_w(short);
static long trap_14_wllw(short, long, long, short);
static long trap_14_wl(short, long);
static long trap_14_www(short, short, short);
static long trap_14_wllwwwww(short, long, long, short, short, short, short, short);
static long trap_14_wllwwwwlw(short, long, long, short, short, short, short, long, short);
static long trap_14_wwwwwww(short, short, short, short, short, short, short);
static long trap_14_wlll(short, long, long, long);
static long trap_14_wllww(short, long, long, short, short);
static long trap_14_wwwwl(short, short, short, short, long);
#endif
#endif

/*	
 *	GEMDOS	(trap1)
 */
#define	Pterm0() 						\
	(void)trap_1_w((short)(0x00))
#define	Cconin() 						\
	(long)trap_1_w((short)(0x01))
#define	Cconout(c) 						\
	(void)trap_1_ww((short)(0x02),(short)(c))
#define	Cauxin() 						\
	(short)trap_1_w((short)(0x03))
#define	Cauxout(c) 						\
	(void)trap_1_ww((short)(0x04),(short)(c))
#define	Cprnout(c) 						\
	(void)trap_1_ww((short)(0x05),(short)(c))
#define	Crawio(data) 						\
	(long)trap_1_ww((short)(0x06),(short)(data))
#define	Crawcin() 						\
	(long)trap_1_w((short)(0x07))
#define	Cnecin() 						\
	(long)trap_1_w((short)(0x08))
#define	Cconws(s) 						\
	(void)trap_1_wl((short)(0x09),(char *)(s))
#define	Cconrs(buf) 						\
	(void)trap_1_wl((short)(0x0A),(char *)(buf))
#define	Cconis() 						\
	(short)trap_1_w((short)(0x0B))
#define	Dsetdrv(d) 						\
	(long)trap_1_ww((short)(0x0E),(short)(d))
#define	Cconos() 						\
	(short)trap_1_w((short)(0x10))
#define	Cprnos() 						\
	(short)trap_1_w((short)(0x11))
#define	Cauxis() 						\
	(short)trap_1_w((short)(0x12))
#define	Cauxos() 						\
	(short)trap_1_w((short)(0x13))
#define	Dgetdrv() 						\
	(short)trap_1_w((short)(0x19))
#define	Fsetdta(dta) 						\
	(void)trap_1_wl((short)(0x1A),(void *)(dta))
#define	Super(ptr) 						\
	(long)trap_1_wl((short)(0x20),(void *)(ptr))
#define	Tgetdate() 						\
	(short)trap_1_w((short)(0x2A))
#define	Tsetdate(date) 						\
	(short)trap_1_ww((short)(0x2B),(short)(date))
#define	Tgettime() 						\
	(short)trap_1_w((short)(0x2C))
#define	Tsettime(time) 						\
	(short)trap_1_ww((short)(0x2D),(short)(time))
#define	Fgetdta() 						\
	(long)trap_1_w((short)(0x2F))
#define	Sversion() 						\
	(short)trap_1_w((short)(0x30))
#define	Ptermres(save,rv) 					\
	(void)trap_1_wlw((short)(0x31),(long)(save),(short)(rv))
#define	Dfree(buf,d) 						\
	(void)trap_1_wlw((short)(0x36),(void *)(buf),(short)(d))
#define	Dcreate(path) 						\
	(short)trap_1_wl((short)(0x39),(char *)(path))
#define	Ddelete(path) 						\
	(short)trap_1_wl((short)(0x3A),(char *)(path))
#define	Dsetpath(path) 						\
	(short)trap_1_wl((short)(0x3B),(char *)(path))
#define	Fcreate(fn,mode) 					\
	(short)trap_1_wlw((short)(0x3C),(char *)(fn),(short)(mode))
#define	Fopen(fn,mode) 						\
	(short)trap_1_wlw((short)(0x3D),(char *)(fn),(short)(mode))
#define	Fclose(handle) 						\
	(short)trap_1_ww((short)(0x3E),(short)(handle))
#define	Fread(handle,cnt,buf) 					\
	(long)trap_1_wwll((short)(0x3F),(short)(handle),	\
			  (long)(cnt),(char *)(buf))
#define	Fwrite(handle,cnt,buf) 					\
	(long)trap_1_wwll((short)(0x40),(short)(handle), 	\
			  (long)(cnt),(char *)(buf))
#define	Fdelete(fn) 						\
	(short)trap_1_wl((short)(0x41),(char *)(fn))
#define	Fseek(where,handle,how) 				\
	(long)trap_1_wlww((short)(0x42),(long)(where), 		\
			  (short)(handle),(short)(how))
#define	Fattrib(fn,rwflag,attr) 				\
	(short)trap_1_wlww((short)(0x43),(char *)(fn), 		\
			   (short)(rwflag),(short)(attr))
#define	Fdup(handle) 						\
	(short)trap_1_ww((short)(0x45),(short)(handle))
#define	Fforce(Hstd,Hnew) 					\
	(short)trap_1_www((short)(0x46),(short)(Hstd),(short)(Hnew))
#define	Dgetpath(buf,d) 					\
	(void)trap_1_wlw((short)(0x47),(char *)(buf),(short)(d))
#define	Malloc(size) 						\
	(long)trap_1_wl((short)(0x48),(long)(size))
#define	Mfree(ptr) 						\
	(short)trap_1_wl((short)(0x49),(void *)(ptr))
#define	Mshrink(ptr,size) 					\
	(short)trap_1_wll((short)(0x4A),(short)0,(void *)(ptr),(long)(size))
#define	Pexec(mode,prog,tail,env)				\
	(short)trap_1_wwlll((short)(0x4B),(short)(mode),(char *)(prog),	\
			    (char *)(tail),(char *)(env))
#define	Pterm(rv) 						\
	(void)trap_1_ww((short)(0x4C),(short)(rv))
#define	Fsfirst(filespec,attr) 					\
	(short)trap_1_wlw((short)(0x4E),(char *)(filespec),(short)(attr))
#define	Fsnext() 						\
	(short)trap_1_w((short)(0x4F))
#define	Frename(zero,old,new) 					\
	(short)trap_1_wwll((short)(0x56),(short)(zero), 	\
			   (char *)(old),(char *)(new))
#define	Fdatime(timeptr,handle,rwflag)				\
	(void)trap_1_wlww((short)(0x57),(long)(timeptr), 	\
			  (short)(handle),(short)(rwflag))


/* codes for Pexec */

#define	PE_LOADGO		0		/* load & go */
#define	PE_LOAD			1		/* just load */
#define	PE_CBASEPAGE		2		/* just create basepage */
#define	PE_GO			3		/* just go */


/*
 *	BIOS	(trap13)
 */
#define Getmpb(ptr)						\
    	(void)trap_13_wl((short)(0x00),(void *)(ptr))
#define	Bconstat(dev) 						\
	(short)trap_13_ww((short)(0x01),(short)(dev))
#define	Bconin(dev) 						\
	(long)trap_13_ww((short)(0x02),(short)(dev))
#define	Bconout(dev,c) 						\
	(void)trap_13_www((short)(0x03),(short)(dev),(short)((c) & 0xFF))
#define	Rwabs(rwflag,buf,n,sector,d)				\
	(short)trap_13_wwlwww((short)(0x04),(short)(rwflag),(void *)(buf), \
			      (short)(n),(short)(sector),(short)(d))
#define	Setexc(vnum,vptr) 					\
	(void (*)())trap_13_wwl((short)(0x05),(short)(vnum),(void (*)())(vptr))
#define	Tickcal() 						\
	(long)trap_13_w((short)(0x06))
#define	Getbpb(d) 						\
	(void *)trap_13_w((short)(0x07),(short)(d))
#define	Bcostat(dev) 						\
	(short)trap_13_ww((short)(0x08),(short)(dev))
#define	Mediach(dev) 						\
	(short)trap_13_ww((short)(0x09),(short)(dev))
#define	Drvmap() 						\
	(long)trap_13_w((short)(0x0A))
#define	Getshift() 						\
	(short)trap_13_w((short)(0x0B))

#if 0 /* huh ? */
#define	Kbshift(data) 						\
	trap_13_ww((short)(0x0B),(short)(data))
#endif


/*
 *	XBIOS	(trap14)
 */

#define	Initmous(type,param,vptr)				\
	(void)trap_14_wwll((short)(0x00),(short)(type),         \
			   (void *)(param),(void *)(vptr))
#define Ssbrk(size)						\
    	(void *)trap_14_ww((short)(0x01),(short)(size))
#define	Physbase() 						\
	(void *)trap_14_w((short)(0x02))
#define	Logbase() 						\
	(void *)trap_14_w((short)(0x03))
#define	Getrez() 						\
	(short)trap_14_w((short)(0x04))
#define	Setscreen(lscrn,pscrn,rez)				\
	(void)trap_14_wllw((short)(0x05),(void *)(lscrn),(void *)(pscrn), \
			   (short)(rez))
#define	Setpallete(palptr) 					\
	(void)trap_14_wl((short)(0x06),(void *)(palptr))
#define	Setcolor(colornum,mixture)				\
	(short)trap_14_www((short)(0x07),(short)(colornum),(short)(mixture))
#define	Floprd(buf,x,d,sect,trk,side,n)				\
	(short)trap_14_wllwwwww((short)(0x08),(void *)(buf),(long)(x), \
	  (short)(d),(short)(sect),(short)(trk),(short)(side),(short)(n))
#define	Flopwr(buf,x,d,sect,trk,side,n)				\
	(short)trap_14_wllwwwww((short)(0x09),(void *)(buf),(long)(x), \
		(short)(d),(short)(sect),(short)(trk),(short)(side),(short)(n))
#define	Flopfmt(buf,x,d,spt,sd,i,m,v) 			\
	(void *)trap_14_wllwwwwlw((short)(0x0A),(void *)(buf),(long)(x), \
          (short)(d),(short)(spt),(short)(sd),(short)(i),(long)(m),(short)(v))
#define	Midiws(cnt,ptr) 					\
	(void)trap_14_wwl((short)(0x0C),(short)(cnt),(void *)(ptr))
#define	Mfpint(vnum,vptr) 					\
	(void)trap_14_wwl((short)(0x0D),(short)(vnum),(void (*)())(vptr))
#define	Iorec(ioDEV) 						\
	(void *)trap_14_ww((short)(0x0E),(short)(ioDEV))
#define	Rsconf(baud,flow,uc,rs,ts,sc)				\
	(void)trap_14_wwwwwww((short)(0x0F),(short)(baud),(short)(flow), \
	                   (short)(uc),(short)(rs),(short)(ts),(short)(sc))
#define	Keytbl(nrml,shft,caps) 					\
    	(void *)trap_14_wlll((short)(0x10),(void *)(nrml), \
			     (void *)(shft),(void *)(caps))
#define	Random() 						\
	(long)trap_14_w((short)(0x11))
#define	Protobt(buf,serial,dsktyp,exec)				\
	(void)trap_14_wllww((short)(0x12),(void *)(buf),(long)(serial), \
			    (short)(dsktyp),(short)(exec))
#define	Flopver(buf,x,d,sect,trk,sd,n)				\
	(void)trap_wllwwwww((short)(0x13),(void *)(buf),(long)(x),(short)(d), \
		(short)(sect),(short)(trk),(short)(sd),(short)(n))
#define	Scrdmp() 						\
	(void)trap_14_w((short)(0x14))
#define	Cursconf(rate,attr) 					\
	(short)trap_14_www((short)(0x15),(short)(rate),(short)(attr))
#define	Settime(time) 						\
	(void)trap_14_wl((short)(0x16),(long)(time))
#define	Gettime() 						\
	(long)trap_14_w((short)(0x17))
#define	Bioskeys() 						\
	(void)trap_14_w((short)(0x18))
#define	Ikbdws(len_minus1,ptr) 					\
	(void)trap_14_wwl((short)(0x19),(short)(len_minus1),(void *)(ptr))
#define	Jdisint(vnum) 						\
	(void)trap_14_ww((short)(0x1A),(short)(vnum))
#define	Jenabint(vnum) 						\
	(void)trap_14_ww((short)(0x1B),(short)(vnum))
#define	Giaccess(data,reg) 					\
	(short)trap_14_www((short)(0x1C),(short)(data),(short)(reg))
#define	Offgibit(ormask) 					\
	(void)trap_14_ww((short)(0x1D),(short)(ormask))
#define	Ongibit(andmask) 					\
	(void)trap_14_ww((short)(0x1E),(short)(andmask))
#define	Xbtimer(timer,ctrl,data,vptr)				\
	(void)trap_14_wwwwl((short)(0x1E),(short)(timer),(short)(ctrl), \
			    (short)(data),(void (*)())(vptr))
#define	Dosound(ptr) 						\
	(void)trap_14_wl((short)(0x20),(void *)(ptr))
#define	Setprt(config) 						\
	(short)trap_14_ww((short)(0x21),(short)(config))
#define	Kbdvbase() 						\
	(void (**)())trap_14_w((short)(0x22))
#define	Kbrate(delay,reprate) 					\
	(short)trap_14_www((short)(0x23),(short)(delay),(short)(reprate))
#define	Prtblk(pblkptr) 					\
	(void)trap_14_wl((short)(0x24),(void *)(pblkptr)) /* obsolete ? */
#define	Vsync() 						\
	(void)trap_14_w((short)(0x25))
#define	Supexec(funcptr) 					\
	(void)trap_14_wl((short)(0x26),(void (*)())(funcptr))

/*
 * functions
 *
 */
static inline long trap_1_w(short n)
{
	register long retvalue;

	asm volatile
	("\
		movw	%1,sp@-; \
		trap	#1; 	 \
		addqw 	#2,sp;	 \
		movl d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n)				/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}


static inline long trap_1_ww(short n, short a)
{
	register long retvalue;

	asm volatile
	("\
                movw	%2,sp@-; \
		movw	%1,sp@-; \
		trap	#1; 	 \
		addqw 	#4,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n), "g"(a)			/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}

static inline long trap_1_wl(short n, long a)
{
	register long retvalue;

	asm volatile
	("\
                movl	%2,sp@-; \
		movw	%1,sp@-; \
		trap	#1; 	 \
		addqw 	#6,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n), "g"(a)			/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}


static inline long trap_1_wlw(short n, long a, short b)
{
	register long retvalue;

	asm volatile
	("\
 		movw	%3,sp@-; \
                movl	%2,sp@-; \
		movw	%1,sp@-; \
		trap	#1; 	 \
		addqw 	#8,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n), "g"(a), "g"(b)		/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}


static inline long trap_1_wwll(short n, short a, long b, long c)
{
	register long retvalue;

	asm volatile
	("\
 		movl	%4,sp@-; \
 		movl	%3,sp@-; \
                movw	%2,sp@-; \
		movw	%1,sp@-; \
		trap	#1; 	 \
		addw 	#12,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n), "g"(a), "g"(b), "g"(c)	/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}


static inline long trap_1_wlww(short n, long a, short b, short c)
{
	register long retvalue;

	asm volatile
	("\
 		movw	%4,sp@-; \
 		movw	%3,sp@-; \
                movl	%2,sp@-; \
		movw	%1,sp@-; \
		trap	#1; 	 \
		addw 	#10,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n), "g"(a), "g"(b), "g"(c)	/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}


static inline long trap_1_www(short n, short a, short b)
{
	register long retvalue;

	asm volatile
	("\
 		movw	%3,sp@-; \
                movw	%2,sp@-; \
		movw	%1,sp@-; \
		trap	#1; 	 \
		addqw 	#6,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n), "g"(a), "g"(b)		/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}


static inline long trap_1_wll(short n, long a, long b)
{
	register long retvalue;

	asm volatile
	("\
 		movl	%3,sp@-; \
                movl	%2,sp@-; \
		movw	%1,sp@-; \
		trap	#1; 	 \
		addw 	#10,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n), "g"(a), "g"(b)		/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}


static inline long trap_1_wwlll(short n, short a, long b, long c, long d)
{
	register long retvalue;

	asm volatile
	("\
 		movl	%4,sp@-; \
 		movl	%3,sp@-; \
 		movl	%2,sp@-; \
                movw	%1,sp@-; \
		movw	%0,sp@-; "
	 :			/* outputs */
         : "g"(n), "g"(a), "g"(b), "g"(c), "g"(d) /* inputs  */
	);
	/* no more than 5 operand allowed in asm() -- therefore the split */

	asm volatile
	("\
 		trap	#1; 	 \
		addw 	#16,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : 					/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}


static inline long trap_13_wl(short n, long a)
{
	register long retvalue;

	asm volatile
	("\
                movl	%2,sp@-; \
		movw	%1,sp@-; \
		trap	#13; 	 \
		addqw 	#6,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n), "g"(a)			/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}

static inline long trap_13_w(short n)
{
	register long retvalue;

	asm volatile
	("\
		movw	%1,sp@-; \
		trap	#13; 	 \
		addqw 	#2,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n)				/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}


static inline long trap_13_ww(short n, short a)
{
	register long retvalue;

	asm volatile
	("\
                movw	%2,sp@-; \
		movw	%1,sp@-; \
		trap	#13; 	 \
		addqw 	#4,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n), "g"(a)			/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}


static inline long trap_13_www(short n, short a, short c)
{
	register long retvalue;

	asm volatile
	("\
 		movw	%3,sp@-; \
                movw	%2,sp@-; \
		movw	%1,sp@-; \
		trap	#13; 	 \
		addqw 	#6,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n), "g"(a), "g"(c)		/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}

static inline long trap_13_wwlwww(short n, short a, long c, short d,
				  short e, short f)
{
	register long retvalue;

	asm volatile
	("\
 		movw	%4,sp@-; \
 		movw	%3,sp@-; \
 		movw	%2,sp@-; \
 		movl	%1,sp@-; \
                movw	%0,sp@-  "
	 : 					/* outputs */
         : "g"(a), "g"(c), "g"(d), "g"(e), "g"(f) /* inputs  */
	);

        asm volatile
        ("\
		movw	%1,sp@-; \
		trap	#13; 	 \
		addw 	#14,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n)			        /* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);

	return retvalue;
}

static inline long trap_13_wwl(short n, short a, long c)
{
	register long retvalue;

	asm volatile
	("\
 		movl	%3,sp@-; \
                movw	%2,sp@-; \
		movw	%1,sp@-; \
		trap	#13; 	 \
		addqw 	#8,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n), "g"(a), "g"(c)		/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}


static inline long trap_14_wwll(short n, short a, long c, long d)
{
	register long retvalue;

	asm volatile
	("\
 		movl	%4,sp@-; \
 		movl	%3,sp@-; \
                movw	%2,sp@-; \
		movw	%1,sp@-; \
		trap	#14; 	 \
		addw 	#12,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n), "g"(a), "g"(c), "g"(d)	/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}

static inline long trap_14_ww(short n, short a)
{
	register long retvalue;

	asm volatile
	("\
                movw	%2,sp@-; \
		movw	%1,sp@-; \
		trap	#14; 	 \
		addqw 	#4,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n), "g"(a)			/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}

static inline long trap_14_w(short n)
{
	register long retvalue;

	asm volatile
	("\
		movw	%1,sp@-; \
		trap	#14; 	 \
		addqw 	#2,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n)				/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}


static inline long trap_14_wllw(short n, long a, long c, short d)
{
	register long retvalue;

	asm volatile
	("\
 		movw	%4,sp@-; \
 		movl	%3,sp@-; \
                movl	%2,sp@-; \
		movw	%1,sp@-; \
		trap	#14; 	 \
		addw 	#12,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n), "g"(a), "g"(c), "g"(d)	/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}


static inline long trap_14_wl(short n, long a)
{
	register long retvalue;

	asm volatile
	("\
                movl	%2,sp@-; \
		movw	%1,sp@-; \
		trap	#14; 	 \
		addqw 	#6,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n), "g"(a)			/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}


static inline long trap_14_www(short n, short a, short c)
{
	register long retvalue;

	asm volatile
	("\
 		movw	%3,sp@-; \
                movw	%2,sp@-; \
		movw	%1,sp@-; \
		trap	#14; 	 \
		addqw 	#6,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n), "g"(a), "g"(c)		/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}


static inline long trap_14_wllwwwww(short n, long a, long b, short c,
				    short d, short e, short f, short g)
{
	register long retvalue;

	asm volatile
	("\
 		movw	%4,sp@-; \
 		movw	%3,sp@-; \
 		movw	%2,sp@-; \
 		movw	%1,sp@-; \
 		movw	%0,sp@-  "
	 : 					  /* outputs */
         : "g"(c), "g"(d), "g"(e), "g"(f), "g"(g) /* inputs  */
	);

	asm volatile
	("\
 		movl	%3,sp@-; \
                movl	%2,sp@-; \
		movw	%1,sp@-; \
		trap	#14; 	 \
		addw 	#20,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n), "g"(a), "g"(b)	 	/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}


static inline long trap_14_wllwwwwlw(short n, long a, long b, short c,
				     short d, short e, short f, long g,
				     short h)
{
	register long retvalue;

	asm volatile
	("\
 		movw	%4,sp@-; \
 		movl	%3,sp@-; \
 		movw	%2,sp@-; \
 		movw	%1,sp@-; \
 		movw	%0,sp@-; "
	 : 					/* outputs */
         : "g"(d), "g"(e), "g"(f), "g"(g), "g"(h) /* inputs  */
	);

	asm volatile
	("\
 		movw	%4,sp@-; \
 		movl	%3,sp@-; \
                movl	%2,sp@-; \
		movw	%1,sp@-; \
		trap	#14; 	 \
		addw 	#24,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n), "g"(a), "g"(b), "g"(c)	/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}


static inline long trap_14_wwwwwww(short n, short a, short b, short c,
				    short d, short e, short f)
{
	register long retvalue;

	asm volatile
	("\
 		movw	%4,sp@-; \
 		movw	%3,sp@-; \
 		movw	%2,sp@-; \
 		movw	%1,sp@-; \
 		movw	%0,sp@-; "
	 : 					/* outputs */
         : "g"(b), "g"(c), 
	   "g"(d), "g"(e), "g"(f)		/* inputs  */
	);

	asm volatile
	("\
                movw	%2,sp@-; \
		movw	%1,sp@-; \
		trap	#14; 	 \
		addw 	#14,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n), "g"(a)			/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}

static inline long trap_14_wlll(short n, long a, long b, long c)
{
	register long retvalue;

	asm volatile
	("\
 		movl	%4,sp@-; \
 		movl	%3,sp@-; \
                movl	%2,sp@-; \
		movw	%1,sp@-; \
		trap	#14; 	 \
		addw 	#14,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n), "g"(a), "g"(b), "g"(c) 	/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}


static inline long trap_14_wllww(short n, long a, long b, short c,
				 short d)
{
	register long retvalue;

	asm volatile
	("\
 		movw	%3,sp@-; \
 		movw	%2,sp@-; \
 		movl	%1,sp@-; \
                movl	%0,sp@-; "
	 : 					/* outputs */
         : "g"(a), "g"(b), "g"(c), "g"(d) 	/* inputs  */
	);

	asm volatile
	("\
		movw	%1,sp@-; \
		trap	#14; 	 \
		addw 	#14,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n)				/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}


static inline long trap_14_wwwwl(short n, short a, short b, short c,
				 long d)
{
	register long retvalue;

	asm volatile
	("\
 		movl	%5,sp@-; \
 		movw	%4,sp@-; \
 		movw	%3,sp@-; \
                movw	%2,sp@-; "
	 : 					/* outputs */
         : "g"(a), "g"(b), "g"(c), "g"(d)	/* inputs  */
	);

	asm volatile
	("\
		movw	%1,sp@-; \
		trap	#14; 	 \
		addw 	#12,sp;	 \
		movl 	d0,%0"
	 : "=r"(retvalue)			/* outputs */
         : "g"(n)				/* inputs  */
	 : "d0", "d1", "d2", "a0", "a1", "a2" 	/* clobbered regs */
	);
	return retvalue;
}
