[comp.os.minix] rs232 kernel: some bug fixes

7103_300@uwovax.uwo.ca (Eric Smith) (03/03/89)

Firstly, I'd like to express my thanks to Howard C. Johnson for his
recently posted rs232 cdiffs. I'm particularly impressed by the clean
way he allows the user to select various options. I think the rs232 kernel
would make a good unofficial standard, pending ST-Minix 1.2, and I'd
encourage everyone to apply the patches. (In a side note, Jwahar Bammi
did an incredible job in porting Minix to the GCC, but his kernel is, alas,
incompatible with ACK and hence not as good a candidate for a standard).

I have noticed a few bugs in the rs232 kernel (most of them in my
screen and mouse drivers) and one omission -- Simon Poole's enhanced
keyboard. I've fixed the bugs and added the enhanced keyboard, as well
as an enhancement to the mouse driver to allow the use of the ALT key
as a third mouse button. The diffs are wrapped up in the following
shar file.
--
Eric R. Smith                     email:
Dept. of Mathematics            7103_300@uwovax.uwo.ca
University of Western Ontario   7103_300@uwovax.bitnet
London, Ont. Canada N6A 5B7     (a shared mailbox: put my name on
ph: (519) 661-3638              the message, please!)
---------------------------- cut here ----------------------------
#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  README fs.cdiff kernel.cdiff lib.cdiff mm.cdiff
# Wrapped by root@Eric's Minix/ST on Thu Mar  2 20:27:20 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(1779 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
XHere are some bug fixes and enhancements to the recently posted rs232
Xkernel:
X
Xbug fixes:
X1) changed the Makefile for mm to include trace.c
X2) in connection with the above: added a sys_trace call to the ACK
X   library (I missed the MDB posting, so I didn't have this; I was
X   able to piece it together from some context diffs that came with
X   the GCC, and from the kernel source code. If you have the library
X   fixes that came with MDB, use those.)
X3) applied previously posted fix to screen driver (to check for
X   illegal arguments)
X4) fixed bug in the mouse driver (corrected the check for the number
X   of characters to read)
X
Xenhancements:
X1) added Simon Poole's excellent keyboard fixes.
X2) changed the mouse driver to treat the "Alt" key as a middle mouse
X   button, and changed the left mouse button value to be compatible with
X   the Sun mouse (this will make porting stuff easier).
X
XThis shar file contains several files with a .cdiff extension; each should
Xbe applied in the appropriate directory (e.g. kernel.cdiff in the directory
Xwhere you keep the kernel source).
X
Xfs.cdiff: just an aesthetic fix, to a comment
Xmm.cdiff: fixes the Makefile; don't bother if you've already done it
Xkernel.cdiff: the keyboard enhancements and the mouse/screen fixes. You
X  should definitely apply these, then read the comments to stkbd.c to
X  decide how you want to configure the keyboard.
Xlib.cdiff: sys_trace call, for those who don't have it but want to be
X  able to compile with HAVEPTRACE == 1
X--
XEric R. Smith                     email:
XDept. of Mathematics            7103_300@uwovax.uwo.ca
XUniversity of Western Ontario   7103_300@uwovax.bitnet
XLondon, Ont. Canada N6A 5B7     (a shared mailbox: put my name on
Xph: (519) 661-3638              the message, please!)
X
END_OF_FILE
if test 1779 -ne `wc -c <'README'`; then
    echo shar: \"'README'\" unpacked with wrong size!
fi
# end of 'README'
fi
if test -f 'fs.cdiff' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'fs.cdiff'\"
else
echo shar: Extracting \"'fs.cdiff'\" \(517 characters\)
sed "s/^X//" >'fs.cdiff' <<'END_OF_FILE'
X*** /tmp/,RCSt1000027	Tue Feb 28 17:12:10 1989
X--- table.c	Tue Feb 28 03:31:59 1989
X***************
X*** 149,155 ****
X      tape_open, rw_dev,    tape_close,    TAPE,    /* 9 = /dev/tape   */
X  #endif
X  #if HAVEMOUSE
X!     no_call,   rw_dev,      no_call,    MOUSE,     /* 10 = /dev/lp   */
X  #endif
X  };
X  
X--- 149,155 ----
X      tape_open, rw_dev,    tape_close,    TAPE,    /* 9 = /dev/tape   */
X  #endif
X  #if HAVEMOUSE
X!     no_call,   rw_dev,      no_call,    MOUSE,     /* 10 = /dev/mouse   */
X  #endif
X  };
X  
END_OF_FILE
if test 517 -ne `wc -c <'fs.cdiff'`; then
    echo shar: \"'fs.cdiff'\" unpacked with wrong size!
fi
# end of 'fs.cdiff'
fi
if test -f 'kernel.cdiff' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'kernel.cdiff'\"
else
echo shar: Extracting \"'kernel.cdiff'\" \(14189 characters\)
sed "s/^X//" >'kernel.cdiff' <<'END_OF_FILE'
X*** /tmp/,RCSt1000025	Thu Mar  2 19:49:59 1989
X--- memory.c	Tue Feb 28 03:50:43 1989
X***************
X*** 158,164 ****
X    /* Determine address where data is to go or to come from. */
X    rp = proc_addr(m_ptr->PROC_NR);
X    user_phys = umap(rp, D, (vir_bytes) m_ptr->ADDRESS, (vir_bytes) count);
X!   if (user_phys == 0) return(E_BAD_ADDR);
X  
X    /* Copy the data. Origin above EM_ORIGIN means AT extended memory */
X  #ifdef i8088
X--- 158,164 ----
X    /* Determine address where data is to go or to come from. */
X    rp = proc_addr(m_ptr->PROC_NR);
X    user_phys = umap(rp, D, (vir_bytes) m_ptr->ADDRESS, (vir_bytes) count);
X!   if (user_phys == (phys_bytes)0) return(E_BAD_ADDR);
X  
X    /* Copy the data. Origin above EM_ORIGIN means AT extended memory */
X  #ifdef i8088
X***************
X*** 241,246 ****
X--- 241,249 ----
X  		return EINVAL;
X  
X  	user_buf = umap(rp,D,(vir_bytes) m_ptr->TTY_SPEK,(vir_bytes) count);
X+ 	if (user_buf == (phys_bytes)0)
X+ 		return(E_BAD_ADDR);
X+ 
X  	if (set)
X  		phys_copy(user_buf, our_buf, (long) count);
X  
X*** /tmp/,RCSt1000030	Thu Mar  2 19:50:28 1989
X--- stmouse.c	Wed Mar  1 00:38:28 1989
X***************
X*** 99,105 ****
X  	}
X  	mb.m_buttons = msg.MOUSE_BUT;
X  
X! 	count = MIN(count, sizeof(mb));
X  	rp = proc_addr(m_ptr->PROC_NR);
X  	user_phys = umap(rp, D, (vir_bytes) m_ptr->ADDRESS, (vir_bytes) count);
X  	if (user_phys == 0) return(E_BAD_ADDR);
X--- 99,105 ----
X  	}
X  	mb.m_buttons = msg.MOUSE_BUT;
X  
X! 	count = MIN((unsigned)m_ptr->COUNT, (unsigned)sizeof(mb));
X  	rp = proc_addr(m_ptr->PROC_NR);
X  	user_phys = umap(rp, D, (vir_bytes) m_ptr->ADDRESS, (vir_bytes) count);
X  	if (user_phys == 0) return(E_BAD_ADDR);
X*** /tmp/,RCSt1000035	Thu Mar  2 19:51:07 1989
X--- stvdu.c	Wed Mar  1 00:41:43 1989
X***************
X*** 45,50 ****
X--- 45,52 ----
X  
X  EXTERN char font16[];
X  EXTERN char font8[];
X+ EXTERN int keypad;
X+ EXTERN int app_mode;
X  
X  /*===========================================================================*
X   *				start					     *
X***************
X*** 324,331 ****
X  	return;
X    case 'l': /* RM: reset mode */
X    case 'h': /* SM: set mode */
X! 	if (v->next[0] == '?' && v->next[1] == '5' && v->mono)
X! 		VIDEO->vd_rgb[0] = c == 'l' ? RGB_BLACK : RGB_WHITE;
X  	return;
X    case '~': /* Minix-ST specific escape sequence */
X  	/*
X--- 326,337 ----
X  	return;
X    case 'l': /* RM: reset mode */
X    case 'h': /* SM: set mode */
X! 	if (v->next[0] == '?') { /* DEC private modes */
X! 		if (v->next[1] == '5' && v->mono) /* DECSCNM */
X! 			VIDEO->vd_rgb[0] = c == 'l' ? RGB_BLACK : RGB_WHITE;
X! 		else if (v->next[1] == '1')	  /* DECCKM */
X! 			app_mode = c == 'l' ? TRUE : FALSE;
X! 	}
X  	return;
X    case '~': /* Minix-ST specific escape sequence */
X  	/*
X***************
X*** 400,405 ****
X--- 406,417 ----
X  	v->savcrow = v->crow;
X  	v->savattr = v->attr;
X  	return;
X+   case '=': /* DECKPAM: keypad application mode */
X+ 	keypad = TRUE;
X+ 	return;
X+   case '>': /* DECKPNM: keypad numeric mode */
X+ 	keypad = FALSE;
X+ 	return;
X    case 'E': /* NEL: next line */
X  	vductrl(015);
X  	/* fall through */
X***************
X*** 417,422 ****
X--- 429,436 ----
X    case 'c': /* RIS: reset to initial state */
X  	vduinit(&tty_struct[CONSOLE]);
X  	vducursor(0);
X+ 	keypad = FALSE;
X+ 	app_mode = FALSE;
X  	return;
X    default:
X  	return;
X***************
X*** 724,730 ****
X  {}
X  
X  /*===========================================================================*
X!  *				vduinit				     *
X   *===========================================================================*/
X  PUBLIC vduinit()
X  {
X--- 738,744 ----
X  {}
X  
X  /*===========================================================================*
X!  *				vduinit					     *
X   *===========================================================================*/
X  PUBLIC vduinit()
X  {
X*** /tmp/,RCSt1000051	Thu Mar  2 19:58:56 1989
X--- stkbd.c	Thu Mar  2 19:54:10 1989
X***************
X*** 2,7 ****
X--- 2,16 ----
X  #ifdef ATARI_ST
X  /*
X   * The ACIA driver for the Atari ST, both MDI and KBD
X+  *
X+  * Modified the original 1.1 code to support more
X+  * function keys and provide a robust way of determing
X+  * which keys are function keys.
X+  * Note: defining COMPAT will result in key definitions
X+  *       that are the same as for Minix 1.1 with the
X+  *       exception that <Shift><ClrHome> works and
X+  *       <Insert> generates ESC [I
X+  *                                    S.Poole 21.1.89
X   */
X  #include "../h/const.h"
X  #include "../h/type.h"
X***************
X*** 103,108 ****
X--- 112,265 ----
X  /*78*/	   0,   0,   0,   0,   0,   0,   0,   0
X  };
X  
X+ /*
X+  * Flag for keypad mode
X+  * this can be set by code in stvdu.c
X+  */
X+ #ifdef COMPAT
X+ PUBLIC int keypad = FALSE;
X+ #else
X+ PUBLIC int keypad = TRUE;
X+ #endif
X+ /*
X+  * Flag for arrow key application mode
X+  * this can be set by code in stvdu.c
X+  */
X+ PUBLIC int app_mode = FALSE;
X+ /*
X+  * Map function keys to an index into the
X+  * table of function key values
X+  */
X+ PRIVATE unsigned char f_keys[] = {
X+ /*00*/	   0,   0,   0,   0,   0,   0,   0,   0,
X+ /*08*/	   0,   0,   0,   0,   0,   0,   0,   0,
X+ /*10*/	   0,   0,   0,   0,   0,   0,   0,   0,
X+ /*18*/	   0,   0,   0,   0,   0,   0,   0,   0,
X+ /*20*/	   0,   0,   0,   0,   0,   0,   0,   0,
X+ /*28*/	   0,   0,   0,   0,   0,   0,   0,   0,
X+ /*30*/	   0,   0,   0,   0,   0,   0,   0,   0,
X+ /*38*/	   0,   0,   0,   1,   2,   3,   4,   5,
X+ /*40*/	   6,   7,   8,   9,  10,   0,   0,  17,
X+ /*48*/	  16,   0,  26,  13,   0,  15,  30,   0,
X+ /*50*/	  14,   0,  18,   0,   1,   2,   3,   4,
X+ /*58*/	   5,   6,   7,   8,   9,  10,   0,   0,
X+ /*60*/	   0,  11,  12,  19,  20,  21,  22,  23,
X+ /*68*/	  24,  25,  27,  28,  29,  31,  32,  33,
X+ /*70*/	  34,  35,  36,   0,   0,   0,   0,   0,
X+ /*78*/	   0,   0,   0,   0,   0,   0,   0,   0
X+ };
X+ 
X+ /*
X+  * Numbering of the function keys, this scheme was chosen
X+  * so that it easy to determine which function to call to actually
X+  * generate the string.
X+  *
X+  * Note: the <Help> and <Undo> keys are considered to be function
X+  *       keys 11 and 12.
X+  *
X+  * F-keys:    -----------------------------------------
X+  *            | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10|
X+  *            -----------------------------------------
X+  *
X+  * Arrow-Keys:    -------------
X+  *                |  12 |  11 |
X+  *                -------------
X+  *                | 18| 16| 17|
X+  *                -------------
X+  *                | 13| 14| 15|
X+  *                -------------
X+  *
X+  * Keypad:    -----------------
X+  *            | 19| 20| 21| 22|
X+  *            -----------------
X+  *            | 23| 24| 25| 26|
X+  *            -----------------
X+  *            | 27| 28| 29| 30|
X+  *            -----------------
X+  *            | 31| 32| 33|   |
X+  *            ------------- 36|
X+  *            |   34  | 35|   |
X+  *            -----------------
X+  */
X+ 
X+ /*
X+  * There is no problem with  expanding this struct to
X+  * have a field for <Control> and <Alternate> (and combinations
X+  * of them),  but who needs > 152 function keys?
X+  */
X+ struct fkey {
X+ 	char norm, shift;
X+ };
X+ 
X+ PRIVATE struct fkey ftbl[] = {
X+ #ifdef COMPAT
X+ 	/* 1  = F1      */ {'P',   0},
X+ 	/* 2  = F2      */ {'Q',   0},
X+ 	/* 3  = F3      */ {'R',   0},
X+ 	/* 4  = F4      */ {'S',   0},
X+ 	/* 5  = F5      */ {'T',   0},
X+ 	/* 6  = F6      */ {'U',   0},
X+ 	/* 7  = F7      */ {'V',   0},
X+ 	/* 8  = F8      */ {'W',   0},
X+ 	/* 9  = F9      */ {'X',   0},
X+ 	/* 10 = F10     */ {'Y',   0},
X+ 	/* 11 = Undo    */ {  0,   0},
X+ 	/* 12 = Help    */ {  0,   0},
X+ #else
X+ /*
X+  * So that we can produce VT200 style function-key codes,
X+  * the values here are integer values that are converted
X+  * to a string in kbdpf().
X+  *
X+  * The assignment of numbers to keys is rather chaotic,
X+  * but at least all the VT200 keys are there.
X+  */
X+ 	/* ST key       */		/* VT200 key	*/
X+ 	/* 1  = F1      */ {  1,  21},	/* Find	  F10	*/
X+ 	/* 2  = F2      */ {  2,  23},	/* Insert F11	*/
X+ 	/* 3  = F3      */ {  3,  24},	/* Remove F12	*/
X+ 	/* 4  = F4      */ {  4,  25},	/* Select F13	*/
X+ 	/* 5  = F5      */ {  5,  26},	/* Prev.  F14	*/
X+ 	/* 6  = F6      */ {  6,  31},	/* Next	  F17	*/
X+ 	/* 7  = F7      */ { 17,  32},	/* F6	  F18	*/
X+ 	/* 8  = F8      */ { 18,  33},	/* F7	  F19	*/
X+ 	/* 9  = F9      */ { 19,  34},	/* F8	  F20	*/
X+ 	/* 10 = F10     */ { 20,  35},	/* F9		*/
X+ 	/* 11 = Undo    */ { 36,  37},	/*		*/
X+ 	/* 12 = Help    */ { 28,  29},	/* Help	  Do	*/
X+ #endif
X+ /*
X+  * The following codes are more conventional
X+  */
X+ 	/* 13 = Left    */ {'D',   0},
X+ 	/* 14 = Down    */ {'B',   0},
X+ 	/* 15 = Right   */ {'C',   0},
X+ 	/* 16 = Up      */ {'A',   0},
X+ 	/* 17 = ClrHome */ {'H', 'J'},
X+ 	/* 18 = Insert  */ {'I',   0},
X+ /*
X+  * Keypad starts here
X+  */
X+ 	/* 19 = (       */ {'P',   0},
X+ 	/* 20 = )       */ {'Q',   0},
X+ 	/* 21 = /       */ {'R',   0},
X+ 	/* 22 = *       */ {'S',   0},
X+ 	/* 23 = 7       */ {'w',   0},
X+ 	/* 24 = 8       */ {'x',   0},
X+ 	/* 25 = 9       */ {'y',   0},
X+ 	/* 26 = -       */ {'m',   0},
X+ 	/* 27 = 4       */ {'t',   0},
X+ 	/* 28 = 5       */ {'u',   0},
X+ 	/* 29 = 6       */ {'v',   0},
X+ 	/* 30 = +       */ {'l',   0},
X+ 	/* 31 = 1       */ {'q',   0},
X+ 	/* 32 = 2       */ {'w',   0},
X+ 	/* 33 = 3       */ {'s',   0},
X+ 	/* 34 = 0       */ {'p',   0},
X+ 	/* 35 = .       */ {'n',   0},
X+ 	/* 36 = Enter   */ {'M',   0}
X+ };
X+ 
X  PRIVATE int	shift1, shift2, capslock, control, alt;	
X  				/* keep track of key statii */
X  PRIVATE char	kbdbuf[2*MAX_OVERRUN+2];
X***************
X*** 160,166 ****
X  	}
X  	if (mousekeys == 0) {	/* mouse packet finished */
X  		kbdmes.m_type = MOUSE_INT;
X! 		kbdmes.MOUSE_BUT = (leftmouse << 1) | rightmouse;
X  		kbdmes.MOUSE_X = mousex;
X  		kbdmes.MOUSE_Y = mousey;
X  		interrupt(MOUSE, &kbdmes);
X--- 317,323 ----
X  	}
X  	if (mousekeys == 0) {	/* mouse packet finished */
X  		kbdmes.m_type = MOUSE_INT;
X! 		kbdmes.MOUSE_BUT = (leftmouse << 2) | (alt << 1) | rightmouse;
X  		kbdmes.MOUSE_X = mousex;
X  		kbdmes.MOUSE_Y = mousey;
X  		interrupt(MOUSE, &kbdmes);
X***************
X*** 220,227 ****
X   *===========================================================================*/
X  PRIVATE kbdkey(code)
X  {
X!   register c;
X  
X    if (shift1 || shift2)
X  	c = keyshft[code];
X    else if (capslock)
X--- 377,385 ----
X   *===========================================================================*/
X  PRIVATE kbdkey(code)
X  {
X!   register int c,f,fc;
X  
X+   f = f_keys[code];
X    if (shift1 || shift2)
X  	c = keyshft[code];
X    else if (capslock)
X***************
X*** 228,234 ****
X  	c = keycaps[code];
X    else
X  	c = keynorm[code];
X!   if (c) {
X  	if (alt)
X  		c = national(code, c | 0x80);
X  	if (control) {
X--- 386,395 ----
X  	c = keycaps[code];
X    else
X  	c = keynorm[code];
X!   /*
X!    * check if the key is not a function key
X!    */
X!   if (!f) {
X  	if (alt)
X  		c = national(code, c | 0x80);
X  	if (control) {
X***************
X*** 256,297 ****
X  	kbdput(code - 0x3B + 1, OPERATOR);
X  	return;
X    }
X!   switch (code) {
X!   case 0x3B:	/* PF1 */
X! 	kbdpf('P'); return;
X!   case 0x3C:	/* PF2 */
X! 	kbdpf('Q'); return;
X!   case 0x3D:	/* PF3 */
X! 	kbdpf('R'); return;
X!   case 0x3E:	/* PF4 */
X! 	kbdpf('S'); return;
X!   case 0x3F:	/* PF5 */
X! 	kbdpf('T'); return;
X!   case 0x40:	/* PF6 */
X! 	kbdpf('U'); return;
X!   case 0x41:	/* PF7 */
X! 	kbdpf('V'); return;
X!   case 0x42:	/* PF8 */
X! 	kbdpf('W'); return;
X!   case 0x43:	/* PF9 */
X! 	kbdpf('X'); return;
X!   case 0x44:	/* PF10 */
X! 	kbdpf('Y'); return;
X!   case 0x47:	/* Home/Clr */
X! 	kbdansi('H');
X! 	if (shift1 || shift2)
X! 		kbdansi('J');
X! 	return;
X!   case 0x48:	/* Up */
X! 	kbdansi('A'); return;
X!   case 0x4B:	/* Left */
X! 	kbdansi('D'); return;
X!   case 0x4D:	/* Right */
X! 	kbdansi('C'); return;
X!   case 0x50:	/* Down */
X! 	kbdansi('B'); return;
X!   default:
X! 	return;
X    }
X  }
X  
X--- 417,453 ----
X  	kbdput(code - 0x3B + 1, OPERATOR);
X  	return;
X    }
X!   f--; /* correct for index into ftbl */
X!   if (shift1 || shift2)
X! 	fc = ftbl[f].shift;
X!   else
X! 	fc = ftbl[f].norm;
X!   /*
X!    * f naturally has to be >= 0 for this piece
X!    * of code to work
X!    */
X!   if (fc) {
X! 	if (f < 12)
X! #ifdef COMPAT
X! 		kbdkeypad(fc);
X! #else
X! 		kbdpf(fc);
X! #endif
X! 	else if (f < 18) {
X! #ifndef COMPAT
X! 		if (app_mode)
X! 			kbdkeypad(fc);
X! 		else
X! #endif
X! 			kbdarrow(fc);
X! 	}
X! 	else if (keypad)
X! 		/*
X! 		 * keypad should be set by stvdu
X! 		 */
X! 		kbdkeypad(fc);
X! 	else
X! 		kbdput(c,CONSOLE);
X    }
X  }
X  
X***************
X*** 375,383 ****
X  }
X  
X  /*
X!  * Input escape sequence for function keys
X   */
X! PRIVATE kbdpf(c)
X  {
X  	kbdput('\033', CONSOLE);
X  	kbdput('O', CONSOLE);
X--- 531,539 ----
X  }
X  
X  /*
X!  * Input escape sequence for keypad keys
X   */
X! PRIVATE kbdkeypad(c)
X  {
X  	kbdput('\033', CONSOLE);
X  	kbdput('O', CONSOLE);
X***************
X*** 385,398 ****
X  }
X  
X  /*
X!  * Input ANSI escape sequence
X   */
X! PRIVATE kbdansi(c)
X  {
X  	kbdput('\033', CONSOLE);
X  	kbdput('[', CONSOLE);
X  	kbdput(c, CONSOLE);
X  }
X  
X  /*===========================================================================*
X   *				kb_timer				     *
X--- 541,573 ----
X  }
X  
X  /*
X!  * Input escape sequence for arrow keys
X   */
X! PRIVATE kbdarrow(c)
X  {
X  	kbdput('\033', CONSOLE);
X  	kbdput('[', CONSOLE);
X  	kbdput(c, CONSOLE);
X  }
X+ 
X+ #ifndef COMPAT
X+ /*
X+  * Input escape sequence for function keys
X+  */
X+ PRIVATE kbdpf(c)
X+ register char c;
X+ {
X+ 	register int t;
X+ 
X+ 	kbdput('\033', CONSOLE);
X+ 	kbdput('[', CONSOLE);
X+ 	/* this stuff is not robust */
X+ 	if ((t = c / 10) > 0)
X+ 	  kbdput(t + '0', CONSOLE);
X+ 	kbdput((c % 10) + '0', CONSOLE);
X+ 	kbdput('~', CONSOLE);
X+ }
X+ #endif
X  
X  /*===========================================================================*
X   *				kb_timer				     *
X*** /tmp/,RCSt1000056	Thu Mar  2 19:59:36 1989
X--- mouse.h	Thu Mar  2 19:51:58 1989
X***************
X*** 6,11 ****
X  	short m_dy;	/* change in y since last read */
X  };
X  
X! #define M_LEFT_BUTTON	0x02
X  #define M_RIGHT_BUTTON	0x01
X- #define M_MID_BUTTON	0x00	/* there is none! */
X--- 6,11 ----
X  	short m_dy;	/* change in y since last read */
X  };
X  
X! #define M_LEFT_BUTTON	0x04
X! #define M_MID_BUTTON	0x02	/* really the Alternate key on the ST */
X  #define M_RIGHT_BUTTON	0x01
END_OF_FILE
if test 14189 -ne `wc -c <'kernel.cdiff'`; then
    echo shar: \"'kernel.cdiff'\" unpacked with wrong size!
fi
# end of 'kernel.cdiff'
fi
if test -f 'lib.cdiff' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'lib.cdiff'\"
else
echo shar: Extracting \"'lib.cdiff'\" \(824 characters\)
sed "s/^X//" >'lib.cdiff' <<'END_OF_FILE'
X*** /tmp/,RCSt1000048	Thu Mar  2 20:25:59 1989
X--- syslib.c	Tue Feb 28 23:55:00 1989
X***************
X*** 123,132 ****
X    ptr[3] = M.CHILD_STIME;
X  }
X  
X- 
X- 
X- 
X- 
X  PUBLIC sys_abort()
X  {
X  /* Something awful has happened.  Abandon ship. */
X--- 123,128 ----
X***************
X*** 161,166 ****
X--- 157,176 ----
X    callx(SYSTASK, SYS_KILL);
X  }
X  
X+ PUBLIC int sys_trace(req, procnr, addr, data_p)
X+ int req, procnr;
X+ long addr, *data_p;
X+ {
X+   int r;
X+ 
X+   M.m2_i1 = procnr;
X+   M.m2_i2 = req;
X+   M.m2_l1 = addr;
X+   M.m2_l2 = (long) data_p;
X+   r = callx(SYSTASK, SYS_TRACE);
X+   if (data_p) *data_p = M.m2_l2;
X+   return r;
X+ }
X  
X  PUBLIC int tell_fs(what, p1, p2, p3)
X  int what, p1, p2, p3;
X***************
X*** 177,179 ****
X--- 187,190 ----
X   */
X    callm1(FS, what, p1, p2, p3, NIL_PTR, NIL_PTR, NIL_PTR);
X  }
X+ 
END_OF_FILE
if test 824 -ne `wc -c <'lib.cdiff'`; then
    echo shar: \"'lib.cdiff'\" unpacked with wrong size!
fi
# end of 'lib.cdiff'
fi
if test -f 'mm.cdiff' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'mm.cdiff'\"
else
echo shar: Extracting \"'mm.cdiff'\" \(677 characters\)
sed "s/^X//" >'mm.cdiff' <<'END_OF_FILE'
X*** /tmp/,RCSt1000289	Wed Mar  1 00:35:20 1989
X--- Makefile	Tue Feb 28 10:16:43 1989
X***************
X*** 6,12 ****
X  CFLAGS	= -O -DATARI_ST
X  
X  OBJ	= main.o forkexit.o break.o exec.o signal.o getset.o \
X! 	  alloc.o utility.o table.o putc.o 
X  HDR	= ../h/callnr.h ../h/com.h ../h/const.h ../h/error.h \
X  	  ../h/signal.h ../h/stat.h ../h/type.h \
X  	  const.h glo.h mproc.h param.h
X--- 6,13 ----
X  CFLAGS	= -O -DATARI_ST
X  
X  OBJ	= main.o forkexit.o break.o exec.o signal.o getset.o \
X! 	  alloc.o utility.o table.o putc.o trace.o
X! 
X  HDR	= ../h/callnr.h ../h/com.h ../h/const.h ../h/error.h \
X  	  ../h/signal.h ../h/stat.h ../h/type.h \
X  	  const.h glo.h mproc.h param.h
END_OF_FILE
if test 677 -ne `wc -c <'mm.cdiff'`; then
    echo shar: \"'mm.cdiff'\" unpacked with wrong size!
fi
# end of 'mm.cdiff'
fi
echo shar: End of shell archive.
exit 0