[comp.sources.atari.st] v02i079: gcclib2-patch1 -- Patch for GCC library

koreth%panarthea.ebay@sun.com (Steven Grimm) (08/21/89)

Submitted-by: uunet.UU.NET!unido!sbsvax!roeder (Edgar Roeder)
Posting-number: Volume 2, Issue 79
Archive-name: gcclib2-patch1

Once again Murphy has caught me. In the GCC library posted was a little bug.
When seeking on an output file (like stdout) the old code tried to read in a
new buffer from that 'file'. On stdout this means that on every fflush-call
the program reads one line of text. There was also a typo in the CR/LF
conversion of fgetc.
The files in the appended shar archive should replace the corresponding files
of the library.

	- Edgar

--------------------------------------------------------------------------------
#!/bin/sh
# shar:	Shell Archiver  (v1.22)
#
#	Run the following text with /bin/sh to create:
#	  console.c
#	  fgetc.c
#	  fseek.c
#	  read.c
#	  include/osbind.h
#
sed 's/^X//' << 'SHAR_EOF' > console.c &&
X/* console IO stuff.  Abstracted out here cause I'm having so much trouble
X   getting Bconout and Cconout to work.
X
X   Well, after a lot of fooling around, it looks like I can almost get the
X   effect I want (single byte read with no echo) by doing Freads with 
X   length 1.  That does everything right except that it echos printable
X   ascii chars; ie anything #x20 .. #x7F.  We kludge around that by
X   arranging for the caller (read) to know which chars have been echoed.
X   Sigh.
X
X   There seem to be some people in the atari st community who have never
X   heard about the st's character set. There are some chars > 0x7F which
X   can be printed. And they will be printed.
X   This code assumes that nowbody tries to read from stderr if stdin is
X   redirected to AUX:.	(er)
X   If we use Crawcin()/Cconis() we avoid problems with typeahead.
X*/
X
X#include <osbind.h>
X#include <file.h>
X
Xint console_read_byte(gem_handle)
Xint gem_handle;
X{
X  /* char c[1]; */
X
X  return(Crawcin());		/* isatty(gem_handle) == TRUE */
X/*  Fread(gem_handle, 1L, &c[0]);
X  return(c[0] & 0xFF); */
X}
X
Xconsole_write_byte(gem_handle, c)
Xint gem_handle;
Xchar c;
X{
X  char ch[1];
X
X/*  if (gem_handle < 0)
X	Cconout(c);
X    else */
X	{
X	ch[0] = c;
X	Fwrite(gem_handle, 1L, &ch[0]);
X	}
X}
X
X/* return status (nbytes pending)
X   This is completely brain-dead.  always return 0 for now */
Xint console_status(gem_handle)
Xint gem_handle;
X{
X  return(Cconis());
X/*  return(0); */
X/*
X  if (gem_handle < 2)
X	return(Bconstat(2));
X    else
X  if (handle == 2)
X	return(Bconstat(1));
X    else
X	return(Bconstat(handle));	/* it'd sure be nice to know if this
X					   is right.  Too bad Atari doesn't
X					   want anyone to see their 
X					   documentation... */
X}
SHAR_EOF
chmod 0644 console.c || echo "restore of console.c fails"
sed 's/^X//' << 'SHAR_EOF' > fgetc.c &&
X
X/* fgetc */
X
X#include <file.h>
X#include "std-guts.h"
X
Xstatic int fgetc_internal(f)
Xstruct file * f;
X{
X
X  if (!f) return(EOF);
X  if (f->eof_p) return(EOF);
X  if (!f->open_p) return(EOF);
X  if ((f->flags & 0x03) == O_WRONLY) return(EOF);
X  if (f->buf_max > f->buf_index)
X	{
X	int result = f->buf[f->buf_index] & 0xFF;
X
X	f->buf_index++;
X/*
X#ifdef DEBUG
X	fprintf(stderr, " >%02X", result);
X#endif
X*/
X	return(result);
X	}
X
X/* ok, get a new buf */
X  f->file_position += f->buf_max;	/* base pos for next buf */
X  f->buf_max = read(f->handle, &f->buf, BUFSIZE);
X  f->buf_index = 0;
X  if (f->buf_max <= f->buf_index)	/* didn't get anything? */
X	{
X	f->eof_p = 1;			/* remember the eof */
X	if (f->buf_max < 0)
X		f->last_file_error = f->buf_max;
X	    else
X		f->last_file_error = 0;
X#ifdef DEBUG
X	fprintf(stderr, "fgetc(%X)->EOF\r\n", f);
X#endif
X	return(EOF);
X	}
X    else
X	{
X	int result = f->buf[f->buf_index] & 0xFF;
X
X	f->buf_index++;
X#ifdef DEBUG
X	fprintf(stderr, "fgetc(%X)->%02X\r\n", f, result);
X#endif
X	return(result);
X	}
X}
X
Xint fgetc(f)
Xstruct file * f;
X{
X  int ch;
X  int next_ch;
X  
X  ch = fgetc_internal(f);
X  if ((ch == '\r') && !(f->flags & FILE_BINARY_P) && !isatty(fileno(f)))
X  /* ttys are doing this with CRMOD in read */
X  	{
X	/* next char '\n'?  if so, just return the linefeed, else put it
X	   back and return the cr */
X	next_ch = fgetc_internal(f);
X	if (next_ch == '\n')
X		ch = next_ch;
X	    else
X		ungetc(next_ch, f);	/* doesn't deal with EOF right... BFD */
X	}
X  return(ch);
X}
SHAR_EOF
chmod 0644 fgetc.c || echo "restore of fgetc.c fails"
sed 's/^X//' << 'SHAR_EOF' > fseek.c &&
X#include <file.h>
X#include "std-guts.h"
X#include <errno.h>
X
Xlong fseek(f, pos, mode)
Xstruct file * f;
Xlong pos;
Xint mode;
X{
X  long new_pos;
X
X  f->eof_p = 0;					/* just in case */
X  switch (mode)
X	{
X	case L_SET:  { new_pos = pos; break; };
X	case L_INCR: { new_pos = f->file_position + f->buf_index + pos;
X		       mode = L_SET;
X		       break; };
X	case L_XTND: { new_pos = pos; break; };
X	default:     { errno = EBADARG ; return(-1); };
X	};
X#ifdef DEBUG
X	fprintf(stderr, "fseek: %d,%d.  filepos %d, idx %d max %d\n",
X		 pos, mode, f->file_position, f->buf_index, f->buf_max);
X#endif
X  if ((mode != L_XTND) &&		/* always really seek in extend mode */
X      (f->file_position <= new_pos) &&
X      ((f->file_position + f->buf_max) > new_pos))	/* have it already? */
X	{
X	f->buf_index = new_pos - f->file_position;	/* yes, point at it */
X#ifdef DEBUG
X	fprintf(stderr, "  same buf: new idx %d\n", f->buf_index);
X#endif
X	return(0);
X	}
X  if (file_output_p(f))					/* output; flush buf */
X	fflush(f);
X  f->buf_index = f->buf_max = 0;	/* flush buf */
X
X  if (file_input_p(f)) {
X/* the requested index is not in the current buffer.  if it's less than the 
X   current file-position, assume we're walking backwards thru the file, and
X   set the real position to a half bufferful before the requested pos, and set
X   indices accordingly */
X
X  if (new_pos < f->file_position)
X	{
X	if (new_pos < (BUFSIZE / 2))	/* too close to a bufferful? */
X		{
X		f->buf_index = new_pos;	/* say the idx is this far in */
X		new_pos = 0;		/*  and start at beginning */
X		}
X	    else
X		{
X		new_pos -= ((BUFSIZE / 2) - 1);	/*  set up to seek to pos - bufsize + 1 */
X		f->buf_index = (BUFSIZE / 2) - 1; /* and point at last byte */
X		}
X	}	
X  new_pos = lseek(f->handle, new_pos, mode);
X  if (new_pos >= 0)
X	{
X	f->file_position = new_pos;
X	f->buf_max = read(f->handle, &f->buf, BUFSIZE);
X	}
X  } else {
X	new_pos = lseek(f->handle, new_pos, mode);
X	if (new_pos >= 0) f->file_position = new_pos;
X  }
X#ifdef DEBUG
X  fprintf(stderr, "  seeked to %d\n", f->file_position);
X#endif
X  if (new_pos < 0)
X	return (new_pos);
X    else
X	return (0);
X}
SHAR_EOF
chmod 0644 fseek.c || echo "restore of fseek.c fails"
sed 's/^X//' << 'SHAR_EOF' > read.c &&
X/*
X *		Cross Development System for Atari ST 
X *     Copyright (c) 1988, Memorial University of Newfoundland
X *
X * $Header: read.c,v 1.2 88/02/03 22:56:30 m68k Exp $
X *
X * $Log:	read.c,v $
X *
X * 1.5		er
X *
X * Added /dev/null dummy handle.
X * Fix it : When adding 'continue' after raise(SIGINT) and raise(SIGQUIT), get
X * 	    unexpected results in Emacs (perhaps problems with EOF in fgetc()).
X * Moved __col_pos to write.c (it's always included because of fflush in exit)
X *
X * 1.4		er
X *
X * Revision 1.4	 89/01/15
X * Added support for function keys (they give an Esc-sequence with the
X * scan-code as parameter), META-key (Alternate sets the highest bit) and
X * O_NDELAY mode (no waiting if there is no available input). META-translation
X * is controled via the META-bit in __ttymode (set by ioctl()).
X *
X * 1.3		jrd
X *
X * Revision 1.2  88/02/03  22:56:30  m68k
X * Added unix like tty driver stuff
X * 
X * Revision 1.1  88/01/29  17:31:39  m68k
X * Initial revision
X * 
X */
X#include	<osbind.h>
X#include	<ioctl.h>
X#include	<file.h>
X#include	<errno.h>
X#include	<signal.h>
X#include	"tchars.h"
X
X#define META_MASK	0x80
X#define DEL		0x7f
X
X#define	iswhite(c)	((c) == ' ' || (c) == '\t')
X#define	isvisable(c)	((c) >= ' ' && (c) < DEL)
X#define	echochar(c)	if (__ttymode & ECHO) (void) _echochar(c, fd); else
X#define	delchar(n)	if (__ttymode & ECHO) _delchar(n, fd); else
X
X# ifndef	NULL
X#  define	NULL	0
X# endif	/* NULL */
X
Xstatic int str_length(unsigned char * p, int n);
X
Xextern int	__col_pos;
Xstatic int	start_col;
Xstatic unsigned char	*thebuf;
X
Xstatic	int	_echochar();
Xstatic	int	str_length();
Xstatic	void	_delchar();
X
Xunion key {
X	int	i;
X	struct {
X		char	shift_state;
X		char	scan_code;
X		char	filler;
X		unsigned char	ascii_code;
X	} k;
X};
X
X/* possible shift_state's */
X#define	SHIFT_RIGHT	1
X#define	SHIFT_LEFT	2
X#define SHIFT	(SHIFT_LEFT|SHIFT_RIGHT)
X#define	CONTROL		4
X#define	ALTERNATE	8
X#define	CAPS_LOCK	16
X#define	MOUSE_RIGHT	32
X#define	MOUSE_LEFT	64
X#define	MOUSE	(MOUSE_LEFT|MOUSE_RIGHT)
X
Xstatic	enum { Esc, Number, Key }	_fn_state;
Xstatic	char	_fn_key;
X
Xint
Xread(int fd, unsigned char *buf, int nbytes)
X{
X#ifdef DEBUG
X  char dbgbuf[64];
X#endif
X
X  int	rval;
X  int	cnt = 0;
X  unsigned char	*p = buf;
X  union key	ch;
X
X  if (fd == 1234 || nbytes <= 0) return(0);	/* /dev/null */
X  if ((fd >= 0) && (!isatty(fd)))
X	{
X	if ((rval = Fread(fd, nbytes, (char *) buf)) < 0) 
X		{
X		errno = -rval;
X		rval = -1;
X		}
X#ifdef DEBUG
X	sprintf(dbgbuf, "read(%d, %X, %d)->%d\r\n", fd, buf, nbytes, rval);
X	dbgstr(dbgbuf);
X#endif
X	return rval;
X        }
X  if ((__handle_stat[fd] & O_NDELAY) && _fn_state == Esc && !console_status(fd)) {
X    errno = EAGAIN;
X    return -1;
X  }
X  thebuf = buf;
X  start_col = __col_pos;
X  while (1) {
X        switch (_fn_state) {
X                case Number :
X			*p = '#';
X			_fn_state = Key;
X			break;
X		case Key :
X			*p = _fn_key;
X			_fn_state = Esc;
X			break;
X		case Esc :
X			ch.i = console_read_byte(fd);
X			if((__ttymode & META) && !ch.k.shift_state) {
X				struct sgttyb	sg;
X
X				ioctl(fd, TIOCGETP, &sg);
X				ioctl(fd, TIOCSETN, &sg);
X				ch.k.shift_state = Kbshift(-1);
X			}
X			if((__ttymode & META) &&
X			    (ch.k.ascii_code & META_MASK)) {
X				/* these values are on the german keyboard */
X				switch(ch.k.ascii_code) {
X					case 0x81 :
X						ch.k.ascii_code = '@'; break;
X					case 0x84 :
X						ch.k.ascii_code = ']'; break;
X					case 0x8E :
X						ch.k.ascii_code = '}'; break;
X					case 0x94 :
X						ch.k.ascii_code = '['; break;
X					case 0x99 :
X						ch.k.ascii_code = '{'; break;
X					case 0x9A :
X						ch.k.ascii_code = '\\'; break;
X				}
X			}
X			if (ch.k.scan_code == 0x72 && ch.k.ascii_code == '\r')
X				ch.k.ascii_code = '\n';
X			else
X			/* 3B = F1, 72 = Enter, 53 = Delete, 60 = '<' */
X			if ((ch.k.scan_code >= 0x3B && ch.k.scan_code <= 0x72
X			  && ch.k.scan_code != 0x53 && ch.k.scan_code != 0x60))
X			{
X				if (ch.k.ascii_code) _fn_key = ch.k.ascii_code;
X				else _fn_key = ch.k.scan_code;
X				ch.k.ascii_code = 0x1B;	/* ESC */
X				_fn_state = Number;
X			}
X			*p = ch.k.ascii_code;
X			/* Alternate as META-key sets the highest bit */
X			if ((__ttymode & META) &&
X			    (ch.k.shift_state & ALTERNATE)) {
X				if (_fn_state != Esc) _fn_key |= META_MASK;
X				else {
X					if (ch.k.shift_state & SHIFT)
X			ch.k.ascii_code = __keytab->shift[ch.k.scan_code];
X					else if (ch.k.shift_state & CAPS_LOCK)
X			ch.k.ascii_code = __keytab->capslock[ch.k.scan_code];
X					else
X			ch.k.ascii_code = __keytab->unshift[ch.k.scan_code];
X					if (!ch.k.ascii_code)
X			ch.k.ascii_code = ch.k.scan_code; /* Alt 0 - Alt 9 */
X					if (ch.k.shift_state & CONTROL)
X						ch.k.ascii_code &= 0x3F;
X					*p = ch.k.ascii_code | META_MASK;
X				}
X			}
X			break;
X		}
X	if (__ttymode & RAW) 
X	        {
X		if (__ttymode & ECHO) 
X		        {
X			console_write_byte(fd, *p);
X			if (*p == '\r')
X			        __col_pos = 0;
X			    else
X			if (isvisable(*p))
X				__col_pos++;
X			}
X		if (++cnt >= nbytes || !(short)console_status(fd))
X			return cnt;
X		p++;
X		continue;
X		}
X	if ((__ttymode & CRMOD) && *p == '\r')
X		*p = '\n';
X	if (*p == __tchars[TC_INTRC]) 
X		{
X		/* Do the bsd thing here, i.e. flush buffers
X		 * and continue to read after the interupt
X		 */
X		echochar(*p);
X		p = buf;
X		cnt = 0;
X		raise(SIGINT);
X		} 
X	    else 
X	if (*p == __tchars[TC_QUITC]) 
X		{
X		echochar(*p);
X		p = buf;
X		cnt = 0;
X		raise(SIGQUIT);
X		}
X            else
X	if (*p == __tchars[TC_SUSPC]) 
X		{
X		echochar(*p);
X		p = buf;
X		cnt = 0;
X		raise(SIGTSTP);
X		continue;
X		}
X	if (__ttymode & CBREAK) 
X		{
X		if (*p == __tchars[TC_LNEXTC])
X			*p = console_read_byte(fd);
X		if (__ttymode & ECHO) 
X			{
X			if (*p == '\n' && (__ttymode & CRMOD)) 
X				{
X				console_write_byte(fd, '\n');
X				console_write_byte(fd, '\r');
X				__col_pos = 0;
X				}
X			    else
X				(void) _echochar(*p);
X			}
X		if (++cnt >= nbytes || !(short)console_status(fd))
X			return cnt;
X		p++;
X		} 
X	    else
X	if (*p == __tchars[TC_LNEXTC]) 
X		{
X		if (__ttymode & ECHO)
X		        {
X			console_write_byte(fd, '^');
X			console_write_byte(fd, '\b');
X			}
X		*p = console_read_byte(fd);
X		echochar(*p++);
X		cnt++;
X		}
X	    else
X	if (*p == __tchars[TC_EOFC]) 
X		{
X		if (__ttymode & ECHO)
X			{
X			int i = _echochar(*p);
X			__col_pos -= i;
X			while (i-- > 0)
X				console_write_byte(fd, '\b');
X			}
X		return cnt;
X		}
X	    else
X	if (*p == '\n' || *p == __tchars[TC_BRKC]) 
X		{
X		if (__ttymode & ECHO)
X			if (*p == '\n')
X				{
X				console_write_byte(fd, '\n');
X				if (__ttymode & CRMOD) 
X					{
X					console_write_byte(fd, '\r');
X					__col_pos = 0;
X					}
X				}
X			    else
X				(void) _echochar(*p);
X		return ++cnt;
X		}
X	    else
X	if (*p == __tchars[TC_ERASE])
X		{
X		if (cnt) 
X			{
X			p--;
X			delchar(--cnt);
X			}
X		}
X	    else
X	if (*p == __tchars[TC_KILL]) 
X		{
X		while (--cnt >= 0) 
X			{
X			delchar(cnt);
X			p--;
X			}
X		cnt = 0;
X		} 
X	    else
X	if (*p == __tchars[TC_WERASC]) 
X	        {
X		p--;
X		while (cnt && iswhite(*p)) 
X		        {
X			delchar(--cnt);
X			p--;
X		        }
X		while (cnt && !iswhite(*p)) 
X		        {
X			delchar(--cnt);
X			p--;
X		        }
X		p++;
X	        }
X	    else
X	if (*p == __tchars[TC_RPRNTC]) 
X	        {
X		unsigned char	*s;
X
X		echochar(__tchars[TC_RPRNTC]);
X		console_write_byte(fd, '\r');
X		console_write_byte(fd, '\n');
X		__col_pos = 0;
X		start_col = 0;
X		if (__ttymode & ECHO)
X		        for (s = buf ; s < p ; s++)
X			        echochar(*s);
X	        } 
X	    else
X	        {
X		echochar(*p++);
X		cnt++;
X		}
X        if (cnt >= nbytes)
X	        return cnt;
X        }
X	/*NOTREACHED*/
X}
X
Xstatic	int
X_echochar(c, fd)
Xunsigned char c;
Xint fd;
X{
X  int	len = 0;
X
X  if (c & META_MASK)
X  	{
X	console_write_byte(fd, 'M');
X	console_write_byte(fd, '-');
X	c &= ~META_MASK;
X	len += 2;
X	}
X  if (c < ' ') 
X  	{
X	if (c == '\t') 
X		{
X		int	i;
X
X		len = ((__col_pos | 7) + 1) - __col_pos;
X		if (__ttymode & XTABS)
X			for (i = len ; i-- ;)
X				console_write_byte(fd, ' ');
X		    else
X			console_write_byte(fd, '\t');
X		}
X	    else
X	        {
X		console_write_byte(fd, '^');
X		console_write_byte(fd, c + 0x40);
X		len += 2;
X	        }
X        }
X    else
X      if (c == DEL) 
X	{
X	console_write_byte(fd, '^');
X	console_write_byte(fd, '?');
X	len += 2;
X	}
X      else
X	{
X	console_write_byte(fd, c);
X	len++;
X	}
X  __col_pos += len;
X  return len;
X}
X
Xstatic	void
X_delchar(n, fd)
Xint n;
Xint fd;
X{
X  int	len;
X  unsigned char	c = thebuf[n];
X
X  if (c & META_MASK) {
X    len = 2;
X    c &= ~META_MASK;
X  } else
X    len = 0;
X  if (c < ' ' || c == DEL)
X	{
X	if (c == '\t')
X		len = __col_pos - str_length(thebuf, n);
X	    else
X		len += 2;
X	}
X    else
X	len++;
X
X  __col_pos -= len;
X  while (len--) 
X	{
X	console_write_byte(fd, '\b');
X	console_write_byte(fd, ' ');
X	console_write_byte(fd, '\b');
X	}
X}
X
Xstatic int str_length(p, n)
Xunsigned char	*p;
Xint	n;
X{
X  int	pos = start_col;
X  unsigned char	c;
X
X  while (n--) {
X	c = *p++;
X	if (c & META_MASK) 
X		{
X		pos += 2;
X		c &= ~META_MASK;
X		}
X        if (c < ' ' || c == DEL)
X		{
X		if (c == '\t')
X			pos = (pos | 7) + 1;
X		    else
X			pos += 2;
X		}
X		else
X			pos++;
X	}
X  return pos;
X}
SHAR_EOF
chmod 0644 read.c || echo "restore of read.c fails"
sed 's/^X//' << 'SHAR_EOF' > include/osbind.h &&
X#ifndef _OSBIND_H
X#define _OSBIND_H
X/*
X *	OSBIND.H	Mnemonic names for operating system calls
X *
X * Adapted from Dale Schumacher's version to Mark Johnson C by Eric Gisin.
X */
X
X/* (er)	11.8.89 changed macros to inline functions */
X/*	this is ABSOLUTELY necessary for Super(),  */
X/*	because the changed stack would be changed */
X/*	back by the unlk instruction               */
X
X#pragma once
X
X/* ..sb correction of the calls 19/11/88 */
X/* hacked by jrd for GNU */
X
X/*	
X *	GEMDOS	(trap1)
X */
X
Xstatic __inline volatile void
XPterm0(void)
X{
X	__asm("movew #0x00,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	/* we will never come back, so we don't have to correct the stack */
X}
X
Xstatic __inline long
XCconin(void)
X{
X	long	ret;
X
X	__asm("movew #0x00,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #2,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline void
XCconout(short c)
X{
X	__asm("movew %0,sp@-" :: "g" (c));
X	__asm("movew #0x02,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #4,sp");
X}
X
Xstatic __inline long
XCauxin(void)
X{
X	long	ret;
X
X	__asm("movew #0x03,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #2,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline void
XCauxout(short c)
X{
X	__asm("movew %0,sp@-" :: "g" (c));
X	__asm("movew #0x04,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #4,sp");
X}
X
Xstatic __inline void
XCprnout(short c)
X{
X	__asm("movew %0,sp@-" :: "g" (c));
X	__asm("movew #0x05,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #4,sp");
X}
X
Xstatic __inline long
XCrawio(short data)
X{
X	long	ret;
X
X	__asm("movew %0,sp@-" :: "g" (data));
X	__asm("movew #0x06,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #4,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline long
XCrawcin(void)
X{
X	long	ret;
X
X	__asm("movew #0x07,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #2,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline long
XCnecin(void)
X{
X	long	ret;
X
X	__asm("movew #0x08,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #2,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline void
XCconws(char *s)
X{
X	__asm("movel %0,sp@-" :: "g" (s));
X	__asm("movew #0x09,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #6,sp");
X}
X
Xstatic __inline void
XCconrs(char *buf)
X{
X	__asm("movel %0,sp@-" :: "g" (buf));
X	__asm("movew #0x0A,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #6,sp");
X}
X
Xstatic __inline short
XCconis(void)
X{
X	short	ret;
X
X	__asm("movew #0x0B,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #2,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline const void
XDsetdrv(short d)
X{
X	__asm("movew %0,sp@-" :: "g" (d));
X	__asm("movew #0x0E,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #4,sp");
X}
X
Xstatic __inline short
XCconos(void)
X{
X	short	ret;
X
X	__asm("movew #0x10,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #2,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline short
XCprnos(void)
X{
X	short	ret;
X
X	__asm("movew #0x11,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #2,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline short
XCauxis(void)
X{
X	short	ret;
X
X	__asm("movew #0x12,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #2,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline short
XCauxos(void)
X{
X	short	ret;
X
X	__asm("movew #0x13,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #2,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline long
XDgetdrv(void)
X{
X	long	ret;
X
X	__asm("movew #0x19,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #2,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline long
XFsetdta(void *dta)
X{
X	long	ret;
X
X	__asm("movel %0,sp@-" :: "g" (dta));
X	__asm("movew #0x1A,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #6,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
X/*
X * The next binding is not quite right if used in another than the usual ways:
X *	1. Super(1L) from either user or supervisor mode
X *	2. ret = Super(0L) from user mode and after this Super(ret) from
X *	   supervisor mode
X * We get the following situations (usp, ssp relative to the start of Super):
X *	Parameter	Userstack	Superstack	Calling Mode	ret
X *	   1L		   usp		   ssp		    user	 0L
X *	   1L		   usp		   ssp		 supervisor	-1L
X *	   0L		  usp-6		   usp		    user	ssp
X *	   0L		   ssp		  ssp-6		 supervisor   ssp-6
X *	  ptr		  usp-6		  ptr+6		    user	ssp
X *	  ptr		  usp+6		   ptr		 supervisor	 sr
X * The usual C-bindings are safe only because the "unlk a6" is compensating
X * the errors when you invoke this function. In this binding the "unlk a6" at
X * the end of the calling function compensates the error made in sequence 2
X * above (the usp is 6 to low after the first call which is not corrected by
X * the second call).
X */
Xstatic __inline long
XSuper(long ptr)
X{
X	long	ret;
X
X	__asm("movel %0,sp@-" :: "g" (ptr));
X	__asm("movew #0x20,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #6,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline long
XTgetdate(void)
X{
X	long	ret;
X
X	__asm("movew #0x2A,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #2,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline void
XTsetdate(long date)
X{
X	__asm("movel %0,sp@-" :: "g" (date));
X	__asm("movew #0x2B,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #6,sp");
X}
X
Xstatic __inline long
XTgettime(void)
X{
X	long	ret;
X
X	__asm("movew #0x2C,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #2,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline void
XTsettime(long time)
X{
X	__asm("movel %0,sp@-" :: "g" (time));
X	__asm("movew #0x2D,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #6,sp");
X}
X
Xstatic __inline long
XFgetdta(void)
X{
X	long	ret;
X
X	__asm("movew #0x2F,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #2,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline const short
XSversion(void)
X{
X	short	ret;
X
X	__asm("movew #0x30,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #2,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline volatile void
XPtermres(long save, short rv)
X{
X	__asm("movew %0,sp@-" :: "g" (rv));
X	__asm("movel %0,sp@-" :: "g" (save));
X	__asm("movew #0x31,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	/* if we don't call Ptermres(save,-32) and ignore SIGINT, */
X	/* we can't come back */
X	__asm("addql #8,sp");
X}
X
Xstatic __inline long
XDfree(void *buf, short d)
X{
X	long	ret;
X
X	__asm("movew %0,sp@-" :: "g" (d));
X	__asm("movel %0,sp@-" :: "g" (buf));
X	__asm("movew #0x36,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #8,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline short
XDcreate(char *path)
X{
X	short	ret;
X
X	__asm("movel %0,sp@-" :: "g" (path));
X	__asm("movew #0x39,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #6,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline short
XDdelete(char *path)
X{
X	short	ret;
X
X	__asm("movel %0,sp@-" :: "g" (path));
X	__asm("movew #0x3A,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #6,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline short
XDsetpath(char *path)
X{
X	short	ret;
X
X	__asm("movel %0,sp@-" :: "g" (path));
X	__asm("movew #0x3B,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #6,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline short
XFcreate(char *fn,short mode)
X{
X	short	ret;
X
X	__asm("movew %0,sp@-" :: "g" (mode));
X	__asm("movel %0,sp@-" :: "g" (fn));
X	__asm("movew #0x3C,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #8,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline short
XFopen(char *fn,short mode)
X{
X	short	ret;
X
X	__asm("movew %0,sp@-" :: "g" (mode));
X	__asm("movel %0,sp@-" :: "g" (fn));
X	__asm("movew #0x3D,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #8,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline long
XFclose(short handle)
X{
X	long	ret;
X
X	__asm("movew %0,sp@-" :: "g" (handle));
X	__asm("movew #0x3E,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #4,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline long
XFread(short handle,long cnt,char *buf)
X{
X	long	ret;
X
X	__asm("movel %0,sp@-" :: "g" (buf));
X	__asm("movel %0,sp@-" :: "g" (cnt));
X	__asm("movew %0,sp@-" :: "g" (handle));
X	__asm("movew #0x3F,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addw #12,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline long
XFwrite(short handle,long cnt,char *buf)
X{
X	long	ret;
X
X	__asm("movel %0,sp@-" :: "g" (buf));
X	__asm("movel %0,sp@-" :: "g" (cnt));
X	__asm("movew %0,sp@-" :: "g" (handle));
X	__asm("movew #0x40,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addw #12,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline short
XFdelete(char *fn)
X{
X	short	ret;
X
X	__asm("movel %0,sp@-" :: "g" (fn));
X	__asm("movew #0x41,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #6,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline long
XFseek(long where,short handle,short how)
X{
X	long	ret;
X
X	__asm("movew %0,sp@-" :: "g" (how));
X	__asm("movew %0,sp@-" :: "g" (handle));
X	__asm("movel %0,sp@-" :: "g" (where));
X	__asm("movew #0x42,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addw #10,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline short
XFattrib(char *fn,short rwflag,short attr)
X{
X	short	ret;
X
X	__asm("movew %0,sp@-" :: "g" (attr));
X	__asm("movew %0,sp@-" :: "g" (rwflag));
X	__asm("movel %0,sp@-" :: "g" (fn));
X	__asm("movew #0x43,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addw #10,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline short
XFdup(short handle)
X{
X	short	ret;
X
X	__asm("movew %0,sp@-" :: "g" (handle));
X	__asm("movew #0x45,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #4,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline short
XFforce(short Hstd,short Hnew)
X{
X	short	ret;
X
X	__asm("movew %0,sp@-" :: "g" (Hnew));
X	__asm("movew %0,sp@-" :: "g" (Hstd));
X	__asm("movew #0x46,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #6,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline short
XDgetpath(char *buf,short d)
X{
X	short	ret;
X
X	__asm("movew %0,sp@-" :: "g" (d));
X	__asm("movel %0,sp@-" :: "g" (buf));
X	__asm("movew #0x47,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #8,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline long
XMalloc(long size)
X{
X	long	ret;
X
X	__asm("movel %0,sp@-" :: "g" (size));
X	__asm("movew #0x48,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #6,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline void
XMfree(void *ptr)
X{
X	__asm("movel %0,sp@-" :: "g" (ptr));
X	__asm("movew #0x49,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #6,sp");
X}
X
Xstatic __inline short
XMshrink(void *ptr,long size)
X{
X	short	ret;
X
X	__asm("movel %0,sp@-" :: "g" (size));
X	__asm("movel %0,sp@-" :: "g" (ptr));
X	__asm("clrw sp@-");
X	__asm("movew #0x4A,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addw #12,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline long
XPexec(short mode,char *prog,char *tail,char *env)
X{
X	long	ret;
X
X	__asm("movel %0,sp@-" :: "g" (env));
X	__asm("movel %0,sp@-" :: "g" (tail));
X	__asm("movel %0,sp@-" :: "g" (prog));
X	__asm("movew %0,sp@-" :: "g" (mode));
X	__asm("movew #0x4B,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addw #16,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline /* volatile */ void
XPterm(short rv)
X{
X	__asm("movew %0,sp@-" :: "g" (rv));
X	__asm("movew #0x4C,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	/* if we don't call Pterm(-32) and ignore SIGINT, we can't come back */
X	__asm("addql #4,sp");
X}
X
Xstatic __inline short
XFsfirst(char *filespec,short attr)
X{
X	short	ret;
X
X	__asm("movew %0,sp@-" :: "g" (attr));
X	__asm("movel %0,sp@-" :: "g" (filespec));
X	__asm("movew #0x4E,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #8,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline short
XFsnext(void)
X{
X	short	ret;
X
X	__asm("movew #0x4F,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #2,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline short
XFrename(char *old,char *new)
X{
X	short	ret;
X
X	__asm("movel %0,sp@-" :: "g" (new));
X	__asm("movel %0,sp@-" :: "g" (old));
X	__asm("clrw sp@-");
X	__asm("movew #0x56,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addw #12,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline void
XFdatime(long *timeptr,short handle,short rwflag)
X{
X	__asm("movew %0,sp@-" :: "g" (rwflag));
X	__asm("movew %0,sp@-" :: "g" (handle));
X	__asm("movel %0,sp@-" :: "g" (timeptr));
X	__asm("movew #0x57,sp@-");
X	__asm("trap #1" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addw #10,sp");
X}
X
X
X/* codes for Pexec */
X
X#define	PE_LOADGO		0		/* load & go */
X#define	PE_LOAD			1		/* just load */
X#define	PE_CBASEPAGE		2		/* just create basepage */
X#define	PE_GO			3		/* just go */
X
X/* zzz do the rest later */
X
X/*
X *	BIOS	(trap13)
X */
X
Xstatic __inline void
XGetmpb(void *mpb)
X{
X	__asm("movew #0,sp@-");
X	__asm("trap #13" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #2,sp");
X}
X
Xstatic __inline short
XBconstat(short DEV)
X{
X	short	ret;
X
X	__asm("movew %0,sp@-" :: "g" (DEV));
X	__asm("movew #1,sp@-");
X	__asm("trap #13" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #4,sp");
X	__asm volatile ("movew d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline long
XBconin(short DEV)
X{
X	long	ret;
X
X	__asm("movew %0,sp@-" :: "g" (DEV));
X	__asm("movew #2,sp@-");
X	__asm("trap #13" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #4,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline void
XBconout(short DEV,short c)
X{
X	__asm("movew %0,sp@-" :: "g" (c));
X	__asm("movew %0,sp@-" :: "g" (DEV));
X	__asm("movew #3,sp@-");
X	__asm("trap #13" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #6,sp");
X}
X
Xstatic __inline long
XRwabs(short rwflag,void *buf,short n,short sector,short d)
X{
X	long	ret;
X
X	__asm("movew %0,sp@-" :: "g" (d));
X	__asm("movew %0,sp@-" :: "g" (sector));
X	__asm("movew %0,sp@-" :: "g" (n));
X	__asm("movel %0,sp@-" :: "g" (buf));
X	__asm("movew %0,sp@-" :: "g" (rwflag));
X	__asm("movew #4,sp@-");
X	__asm("trap #13" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addw #14,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline void *
XSetexc(short vnum,void *vptr)
X{
X	void	*ret;
X
X	__asm("movel %0,sp@-" :: "g" (vptr));
X	__asm("movew %0,sp@-" :: "g" (vnum));
X	__asm("movew #5,sp@-");
X	__asm("trap #13" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #8,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline long
XTickcal(void)
X{
X	long	ret;
X
X	__asm("movew #6,sp@-");
X	__asm("trap #13" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #2,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline void *
XGetbpb(short d)
X{
X	void	*ret;
X
X	__asm("movew %0,sp@-" :: "g" (d));
X	__asm("movew #7,sp@-");
X	__asm("trap #13" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #4,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline long
XBcostat(short DEV)
X{
X	long	ret;
X
X	__asm("movew %0,sp@-" :: "g" (DEV));
X	__asm("movew #8,sp@-");
X	__asm("trap #13" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #4,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline long
XMediach(short d)
X{
X	long	ret;
X
X	__asm("movew %0,sp@-" :: "g" (d));
X	__asm("movew #9,sp@-");
X	__asm("trap #13" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #4,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline long
XDrvmap(void)
X{
X	long	ret;
X
X	__asm("movew #10,sp@-");
X	__asm("trap #13" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #2,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
Xstatic __inline long
XKbshift(short mode)
X{
X	long	ret;
X
X	__asm("movew %0,sp@-" :: "g" (mode));
X	__asm("movew #11,sp@-");
X	__asm("trap #13" ::: "d0", "d1", "d2", "a0", "a1", "a2");
X	__asm("addql #4,sp");
X	__asm volatile ("movel d0,%0" : "=g" (ret));
X	return(ret);
X}
X
X#define Getshift()	Kbshift(-1)
X
X/*
X *	XBIOS	(trap14)
X */
X#define	Initmous(type,param,vptr)	trap_14_wwll(0,type,param,vptr)
X#define	Physbase()			trap_14_www(2)
X#define	Logbase()			trap_14_www(3)
X#define	Getrez()			(int)trap_14_www(4)
X#define	Setscreen(lscrn,pscrn,rez)	trap_14_wllw(5,lscrn,pscrn,rez)
X#define	Setpallete(palptr)		trap_14_wllw(6,palptr)
X#define	Setcolor(colornum,mixture)	trap_14_wwll(7,colornum,mixture)
X#define	Floprd(buf,x,d,sect,trk,side,n)	trap_14_wllwwwwwlw(8,buf,x,d,sect,trk,side,n)
X#define	Flopwr(buf,x,d,sect,trk,side,n)	trap_14_wllwwwwwlw(9,buf,x,d,sect,trk,side,n)
X#define	Flopfmt(b,x,d,spt,trk,sd,i,m,v)	trap_14_wllwwwwwlw(10,b,x,d,spt,trk,sd,i,m,v)
X#define	Midiws(cnt,ptr)			trap_14_wwll(12,cnt,ptr)
X#define	Mfpint(vnum,vptr)		trap_14_wwll(13,vnum,vptr)
X#define	Iorec(ioDEV)			trap_14_wwll(14,ioDEV)
X#define	Rsconf(baud,flow,uc,rs,ts,sc)	trap_14_wwwwwww(15,baud,flow,uc,rs,ts,sc)
X#define	Keytbl(nrml,shft,caps)		trap_14_wlll(16,nrml,shft,caps)
X#define	Random()			trap_14_www(17)
X#define	Protobt(buf,serial,dsktyp,exec)	trap_14_wllwwwwwlw(18,buf,serial,dsktyp,exec)
X#define	Flopver(buf,x,d,sect,trk,sd,n)	trap_14_wllwwwwwlw(19,buf,x,d,sect,trk,sd,n)
X#define	Scrdmp()			trap_14_www(20)
X#define	Cursconf(func,rate)		trap_14_www(21,func,rate)
X#define	Settime(time)			trap_14_wllw(22,time)
X#define	Gettime()			trap_14_www(23)
X#define	Bioskeys()			trap_14_www(24)
X#define	Ikbdws(len_minus1,ptr)		trap_14_wwll(25,len_minus1,ptr)
X#define	Jdisint(vnum)			trap_14_www(26,vnum)
X#define	Jenabint(vnum)			trap_14_www(27,vnum)
X#define	Giaccess(data,reg)		trap_14_www(28,data,reg)
X#define	Offgibit(ormask)		trap_14_www(29,ormask)
X#define	Ongibit(andmask)		trap_14_www(30,andmask)
X#define	Xbtimer(timer,ctrl,data,vnum)	trap_14_wwwwl(31,timer,ctrl,data,vnum)
X#define	Dosound(ptr)			trap_14_wllw(32,ptr)
X#define	Setprt(config)			trap_14_www(33,config)
X#define	Kbdvbase()			trap_14_www(34)
X#define	Kbrate(delay,reprate)		trap_14_www(35,delay,reprate)
X#define	Prtblk(pblkptr)			trap_14_wllw(36,pblkptr)
X#define	Vsync()				trap_14_www(37)
X#define	Supexec(funcptr)		trap_14_wllw(38,funcptr)
X#define Blitmode(flag)			trap_14_www(64,flag)
X#endif /* _OSBIND_H */
SHAR_EOF
chmod 0644 include/osbind.h || echo "restore of include/osbind.h fails"
exit 0