[comp.os.minix] support for monochrome VGA displays

kjh@pollux.usc.edu (Kenneth J. Hendrickson) (06/08/91)

This release of my kernel diffs includes the following:

New:

o ----> support for one-colour VGA displays (paper-white)

Old:

o	improved handling of ansi sequences for all display types

o	screen blanking

o	^U instead of @ for the KILL character, and handling
	similar to the BSD method (erasing the line)
	
o	^C instead of DEL for the INT character

o	change of time slice for better scheduling of compute intensive
	background tasks.  Other people's schedulers aren't included
	(yet), but eventually I'll get around to getting this in my
	own kernel.

o	EGA 43-line mode and VGA 50-line mode

Discussion:

Here are my most recent enhancements to the Minix kernel.  This release
mostly has what was previously released, but a significant improvement
is included here for those who (like myself) have a monochrome VGA
display, that displays about 256 shades of grey in graphics modes, and
16 shades of grey in text modes (like the old monochrome CGA displays).

If you have such a display, use these mods, and define VGAMONO in the
makefile.  This will get you a paper-white display, with black text on
a white background.  Bold text will *really* be a darker shade of black
than the normal text!  (This is the only way in existance to get real bold
on a paper-white display.)  All normal video modes will have a darker shade
of text than the background shade, and all reverse video modes will have
a lighter shade of text than the background.  Underlining is shown by
changing the background shade.  Blinking works.  All combinations of:
bold, underlined, reverse video, and blinking work correctly.  A file
called 'attrib' is included to show you various attributes.  All commands
to change the screen colour are ignored (because you don't have a colour
screen, and this would mess up the attributes anyway).

If you don't have a one-colour VGA display, you DON'T want to define
VGAMONO in your makefile.  Instead, you should edit console.c, after 
the #else, and select your favourite colour combination for the constant
BLANK.  I like green on black.  You *could* simulate a pagewhite display
by choosing black text on a white background.  In this case, underline
will show up as blue, and bold will show up as a brighter shade of the
foreground colour.  Bold won't be available in reverse video modes (due
to a limitiation of your hardware).  Blinking would of course work.
(I like black text on white background, because the letters look continuous
rather than being made up of dots.  The background is made up of dots
[lines] but your brain doesn't seem to notice this.  The display looks
like it has higher resolution that it really does.)  A file called 'colour'
is included to show you various colours, and different attributes also.

If you have a monochrome VGA display, or simulate one on your colour
VGA display, you probably want to define WHITE_BORDER to turn on a
white border.

For all monitor types, defining SCNBLANK will get you a screen blanking
feature.  If the standard bit-diddling method doesn't work with your
hardware, the SCNBLANK_ARRAY_METHOD will, with all hardware types, at
the expense of a little extra memory required by the kernel.  The time
constant is set near the end of const.h to 15 minutes.

Two makefiles are included.  makefile.bcc is for people who are running
Minix-386.  makefile.ack is for those who aren't.

The following is a shar file.  Remove the beginning, and feed it to
unshar or sh.  If wanted, I can post this again uuencoded for BITNET
and IBM {ugh! :-(} people.  Why can't IBM get with the world?  {Did I
just ruin my chances for future employment there?  :-)}

---------- CUT HERE ----------
echo x - clock.c.cdif
sed '/^X/s///' > clock.c.cdif << '/'
X*** clock.c	Sun Nov  4 00:50:39 1990
X--- /usr/src/kernel/clock.c	Fri Jul 20 01:19:11 1990
X***************
X*** 32,38 ****
X  #include "proc.h"
X  
X  /* Constant definitions. */
X! #define MILLISEC	18	/* how often to call the scheduler (msec) */
X  #define SCHED_RATE (MILLISEC*HZ/1000)	/* number of ticks per schedule */
X  
X  /* Clock parameters. */
X--- 32,38 ----
X  #include "proc.h"
X  
X  /* Constant definitions. */
X! #define MILLISEC         100	/* how often to call the scheduler (msec) */
X  #define SCHED_RATE (MILLISEC*HZ/1000)	/* number of ticks per schedule */
X  
X  /* Clock parameters. */
X***************
X*** 86,106 ****
X  
X       lock();
X       realtime += pending_ticks;	/* transfer ticks from low level handler */
X-      unlock();
X- #ifdef SCNBLANK     
X-      if (displaytime > 0) {
X- 	     lock();
X- 	     displaytime -= pending_ticks;	/* */
X- 	     unlock();
X- 	     if (displaytime <= 0) {
X- 		lock();	     
X- 		displaytime = -1;
X- 		unlock();
X- 		scr_disable ();
X- 	     }
X-      }
X- #endif     
X-      lock();
X       pending_ticks = 0;
X       unlock();
X  
X--- 86,91 ----
X***************
X*** 231,241 ****
X  {
X  /* Initialize channel 0 of the 8253A timer to e.g. 60 Hz. */
X  
X- #ifdef SCNBLANK
X-   lock();
X-   displaytime = dtimeout = DISPLAY_TIMEOUT;	/* display timeout timer */
X-   unlock();
X- #endif 
X    out_byte(TIMER_MODE, SQUARE_WAVE);	/* set timer to run continuously */
X    out_byte(TIMER0, TIMER_COUNT);	/* load timer low byte */
X    out_byte(TIMER0, TIMER_COUNT >> 8);	/* load timer high byte */
X--- 216,221 ----
/
echo x - console.c.cdif
sed '/^X/s///' > console.c.cdif << '/'
X*** console.c	Fri Jun  7 03:27:04 1991
X--- /usr/src/kernel/console.c	Fri Jul 20 01:19:12 1990
X***************
X*** 8,69 ****
X  #include "tty.h"
X  
X  /* Definitions used by the console driver. */
X- #ifdef SCNBLANK
X- #define VID_ENABLE    0x0D	/* mask for enable */
X- #define VID_DISABLE   0x05	/* mask for disable */
X- #endif
X  #define C_VID_MASK    0x3FFF	/* mask for 16K video RAM */
X  #define M_VID_MASK    0x0FFF	/* mask for  4K video RAM */
X  #define C_RETRACE     0x0300	/* how many characters to display at once */
X  #define M_RETRACE     0x7000	/* how many characters to display at once */
X! 
X! #ifdef VGAMONO
X! #define BLANK         0x7200	/* determines cursor colour on blank screen */
X! 				/* VM_xyz for VGA MONO characteristics
X! 				 * x == r	non-reverse video
X! 				 * x == R	reverse video
X! 				 * y == b	non-bold
X! 				 * y == B	bold
X! 				 * z == u	non-underlined
X! 				 * z == U	underlined
X! 				 * blinking is handled normally */
X! #define VM_rbu        0x7200	/* green/white, same as BLANK */
X! #define VM_rBu        0x7000	/* black/white */
X! #define VM_rbU        0x3200	/* green/cyan */
X! #define VM_rBU        0x3000	/* black/cyan */
X! #define VM_Rbu        0x0700	/* white/black */
X! #define VM_RBu        0x0f00	/* bright white/black */
X! #define VM_RbU        0x3700	/* white/cyan */
X! #define VM_RBU        0x3f00	/* bright white/cyan */
X! #else
X! #define BLANK         0x0700	/* determines cursor colour on blank screen */
X! #endif
X! /* Bit 14 (0x4000) is for background Red
X!  * Bit 13 (0x2000) is for background Green
X!  * Bit 12 (0x1000) is for background Blue
X!  * Bit 10 (0x0400) is for foreground Red
X!  * Bit  9 (0x0200) is for foreground Green
X!  * Bit  8 (0x0100) is for foreground Blue
X!  * It is probably unwise to set bits 15 or 11 of BLANK.
X!  * Bit 15 (0x8000) is for foreground blinking
X!  * Bit 11 (0x0800) is for foreground intensity
X!  *
X!  * 0x0200 is green on black
X!  * 0x0700 is white on black
X!  * 0x7000 is black on white
X!  */
X! 
X! #define LINE_WIDTH        80	/* # characters on a line */
X! #ifdef EGA43
X! #define SCR_LINES         43	/* # lines on the screen */
X! #endif
X! #ifdef VGA50
X! #define SCR_LINES         50	/* # lines on the screen */
X! #endif
X! #ifndef SCR_LINES
X! #define SCR_LINES         25    /* # lines on the screen */
X! #endif
X! 
X  #define GO_FORWARD         0	/* scroll forward */
X  #define GO_BACKWARD        1	/* scroll backward */
X  
X--- 8,21 ----
X  #include "tty.h"
X  
X  /* Definitions used by the console driver. */
X  #define C_VID_MASK    0x3FFF	/* mask for 16K video RAM */
X  #define M_VID_MASK    0x0FFF	/* mask for  4K video RAM */
X  #define C_RETRACE     0x0300	/* how many characters to display at once */
X  #define M_RETRACE     0x7000	/* how many characters to display at once */
X! #define BLANK         0x0700	/* determines  cursor color on blank screen */
X! #define LINE_WIDTH        80	/* # characters on a line */
X! #define SCR_LINES         25	/* # lines on the screen */
X! #define SCR_BYTES	8000	/* size video RAM. multiple of 2*LINE_WIDTH */
X  #define GO_FORWARD         0	/* scroll forward */
X  #define GO_BACKWARD        1	/* scroll backward */
X  
X***************
X*** 71,82 ****
X  #define M_6845         0x3B0	/* port for 6845 mono */
X  #define C_6845         0x3D0	/* port for 6845 color */
X  #define EGA            0x3C0	/* port for EGA card */
X- #ifdef SCNBLANK
X- #define M_MODE         0x3B8	/* mono mode register */
X- #define C_MODE         0x3D8	/* color mode register */
X- #define CRT_STAT_MONO  0x3BA	/* CRT status register port (monochrome) */
X- #define CRT_STAT_COLR  0x3DA	/* CRT status register port (colour) */
X- #endif
X  #define INDEX              4	/* 6845's index register */
X  #define DATA               5	/* 6845's data register */
X  #define CUR_SIZE          10	/* 6845's cursor size register */
X--- 23,28 ----
X***************
X*** 90,99 ****
X  /* Global variables used by the console driver. */
X  PUBLIC int vid_mask;		/* 037777 for color (16K) or 07777 for mono */
X  PUBLIC int vid_port;		/* I/O port for accessing 6845 */
X! #ifdef SCNBLANK
X! PUBLIC int mode_port;		/* I/O port for accessing mode */
X! #endif
X! PUBLIC int blank_color = BLANK; /* display code for blank */
X  
X  /* Private variables used by the console driver. */
X  PRIVATE vid_retrace;		/* how many characters to display per burst */
X--- 36,42 ----
X  /* Global variables used by the console driver. */
X  PUBLIC int vid_mask;		/* 037777 for color (16K) or 07777 for mono */
X  PUBLIC int vid_port;		/* I/O port for accessing 6845 */
X! PUBLIC int blank_color = 0x0700; /* display code for blank */
X  
X  /* Private variables used by the console driver. */
X  PRIVATE vid_retrace;		/* how many characters to display per burst */
X***************
X*** 101,126 ****
X  PRIVATE unsigned vid_base;	/* base of video ram (0xB000 or 0xB800) */
X  PRIVATE int one_con_attribute;	/* current attribute byte << 8 */
X  
X! #ifdef SCNBLANK
X! #ifdef SCNBLANK_ARRAY_METHOD
X! /* in the ARRAY_METHOD, screen contents are copied to vid_buf for blanking */
X! /* in the other method, bits in the video controller card are diddled */
X! #define VID_BUF_SIZE	(2*LINE_WIDTH*(SCR_LINES))
X! PRIVATE char vid_buf[VID_BUF_SIZE];	/* holds screen while blanked */
X! #endif
X! #endif
X! 
X! #ifdef VGAMONO
X! PRIVATE char VM_bold = 0;		/* 1 if bold */
X! PRIVATE char VM_underline = 0;		/* 1 if underlined */
X! PRIVATE char VM_rev_video = 0;		/* 1 if reverse video */
X! PRIVATE char VM_blink = 0;		/* 1 if blinking */
X! #endif
X! 
X! #ifndef VGAMONO
X! /* Map from ANSI colors to the attributes used by the PC */
X! PRIVATE int ansi_colors[8] = {0, 4, 2, 6, 1, 5, 3, 7};
X! #endif
X  
X  FORWARD void beep();
X  FORWARD void do_escape();
X--- 44,51 ----
X  PRIVATE unsigned vid_base;	/* base of video ram (0xB000 or 0xB800) */
X  PRIVATE int one_con_attribute;	/* current attribute byte << 8 */
X  
X! /* Map from ANSI colors to the attributes used by the PC */
X! PRIVATE int ansi_colors[8] = {0, 4, 2, 6, 1, 5, 3, 7};
X  
X  FORWARD void beep();
X  FORWARD void do_escape();
X***************
X*** 132,140 ****
X  FORWARD void scroll_screen();
X  FORWARD void set_6845();
X  FORWARD void stop_beep();
X- #ifdef VGAMONO
X- FORWARD void VM_set();
X- #endif
X  
X  /*===========================================================================*
X   *				console					     *
X--- 57,62 ----
X***************
X*** 210,227 ****
X  register struct tty_struct *tp;	/* pointer to tty struct */
X  char c;				/* character to be output */
X  {
X! 
X! #ifdef SCNBLANK
X!   if (tp == &tty_struct[0]) {	/* check for console activity */
X! 	if (displaytime < 0)
X! 		scr_enable();	/* enable the screen, after inactivity */
X! 	lock();
X! 	displaytime = dtimeout;
X! 	unlock();	
X!   }	
X! #endif  
X! 
X!   /* Output a character on the console.  Check for escape sequences first. */
X    if (tp->tty_esc_state > 0) {
X  	parse_escape(tp, c);
X  	return;
X--- 132,138 ----
X  register struct tty_struct *tp;	/* pointer to tty struct */
X  char c;				/* character to be output */
X  {
X! /* Output a character on the console.  Check for escape sequences first. */
X    if (tp->tty_esc_state > 0) {
X  	parse_escape(tp, c);
X  	return;
X***************
X*** 437,444 ****
X   *   ESC [nM deletes n lines at cursor
X   *   ESC [nP deletes n chars at cursor
X   *   ESC [n@ inserts n chars at cursor
X!  *   ESC [nm enables rendition n
X! 	(0=normal, 1=bold, 4=underlined, 5=blinking, 7=reverse)
X   *   ESC M scrolls the screen backwards if the cursor is on the top line
X   */
X  
X--- 348,354 ----
X   *   ESC [nM deletes n lines at cursor
X   *   ESC [nP deletes n chars at cursor
X   *   ESC [n@ inserts n chars at cursor
X!  *   ESC [nm enables rendition n (0=normal, 4=bold, 5=blinking, 7=reverse)
X   *   ESC M scrolls the screen backwards if the cursor is on the top line
X   */
X  
X***************
X*** 543,549 ****
X  			break;
X  
X  		    case 'J':		/* ESC [J clears screen from cursor */
X! 			if (/*value == 0*/ 1) {
X  				n=2*((SCR_LINES-(tp->tty_row+1))*LINE_WIDTH
X  					      + LINE_WIDTH - (tp->tty_column));
X  				vx = tp->tty_vid;
X--- 453,459 ----
X  			break;
X  
X  		    case 'J':		/* ESC [J clears screen from cursor */
X! 			if (value == 0) {
X  				n=2*((SCR_LINES-(tp->tty_row+1))*LINE_WIDTH
X  					      + LINE_WIDTH - (tp->tty_column));
X  				vx = tp->tty_vid;
X***************
X*** 552,558 ****
X  			break;
X  
X  		    case 'K':		/* ESC [K clears line from cursor */
X! 			if (/*value == 0*/ 1) {
X  				n = 2 * (LINE_WIDTH - (tp->tty_column));
X  				vid_copy(NIL_PTR, vid_base, tp->tty_vid, n/2);
X  			}
X--- 462,468 ----
X  			break;
X  
X  		    case 'K':		/* ESC [K clears line from cursor */
X! 			if (value == 0) {
X  				n = 2 * (LINE_WIDTH - (tp->tty_column));
X  				vid_copy(NIL_PTR, vid_base, tp->tty_vid, n/2);
X  			}
X***************
X*** 619,710 ****
X  	   	    case 'm':		/* ESC [nm enables rendition n */
X  	 		switch (value) {
X   			    case 1: /*  BOLD  */
X! #ifdef VGAMONO
X! 				VM_bold = 1;
X! 				VM_set();
X! #else
X! 	 			one_con_attribute |= 0x0800; /* inten */
X! #endif
X   				break;
X   
X   			    case 4: /*  UNDERLINE */
X! #ifdef VGAMONO
X! 				VM_underline = 1;
X! 				VM_set();
X! #else
X! 				if (color)
X! 					if ((attr & 0x6000) == 0)
X! 						/* cyan on [black|blue] bg
X! 						 * This is not standard,
X! 						 * but it is easier to see.
X! 						 */
X! 						one_con_attribute =
X! 						(attr & 0xf8ff) | 0x0300;
X! 					else
X! 						/* blue on other bg */
X! 						one_con_attribute =
X! 						(attr & 0xf8ff) | 0x0100;
X  				else
X  					one_con_attribute = /* ul */
X  					 (attr & 0x8900);
X- #endif
X   				break;
X   
X   			    case 5: /*  BLINKING */
X! 				/* VGA, EGA, CGA, and MONO can all blink */
X! #ifdef VGAMONO
X! 				VM_blink = 1;
X! #endif
X! 	 			one_con_attribute |= 0x8000; /* blink */
X   				break;
X   
X   			    case 7: /*  REVERSE  (black on light grey)  */
X! #ifdef VGAMONO
X! 				VM_rev_video = 1;
X! 				VM_set();
X! #else
X! 				if (color)
X! 	 				one_con_attribute = 
X! 					 ((attr & 0x7000) >> 4) |
X! 					 ((attr & 0x0700) << 4) |
X! 					 (attr & 0x8800);
X  				else if ((attr & 0x7000) == 0)
X  					one_con_attribute =
X  					 (attr & 0x8800) | 0x7000;
X  				else
X  					one_con_attribute =
X  					 (attr & 0x8800) | 0x0700;
X! #endif
X!   				break;
X! 
X!  			    default:
X! #ifdef VGAMONO
X! 				/* colours can't change on VGA MONO */
X! 				if (value == 0) {
X! 					VM_bold = 0;
X! 					VM_underline = 0;
X! 					VM_rev_video = 0;
X! 					VM_blink = 0;
X! 					VM_set();
X! 				}
X! #else
X! 				if (value >= 30 && value <= 37) {
X! 					one_con_attribute = 
X! 					 (attr & 0xf8ff) |
X! 					 (ansi_colors[(value - 30)] << 8);
X! 					blank_color = 
X! 					 (blank_color & 0xf8ff) |
X  					 (ansi_colors[(value - 30)] << 8);
X  				} else if (value >= 40 && value <= 47) {
X  					one_con_attribute = 
X! 					 (attr & 0x8fff) |
X! 					 (ansi_colors[(value - 40)] << 12);
X! 					blank_color =
X! 					 (blank_color & 0x8fff) |
X  					 (ansi_colors[(value - 40)] << 12);
X  				} else
X  	 				one_con_attribute = blank_color;
X- #endif
X    				break;
X  	 		}
X  			break;
X--- 529,588 ----
X  	   	    case 'm':		/* ESC [nm enables rendition n */
X  	 		switch (value) {
X   			    case 1: /*  BOLD  */
X! 				if (color)
X! 	 				one_con_attribute = /* red fg */
X! 					 	(attr & 0xf0ff) | 0x0400;
X! 				else
X! 		 			one_con_attribute |= 0x0800; /* inten*/
X   				break;
X   
X   			    case 4: /*  UNDERLINE */
X! 				if (color)
X! 					one_con_attribute = /* blue fg */
X! 					 (attr & 0xf0ff) | 0x0100;
X  				else
X  					one_con_attribute = /* ul */
X  					 (attr & 0x8900);
X   				break;
X   
X   			    case 5: /*  BLINKING */
X! 				if (color) /* can't blink color */
X! 					one_con_attribute = /* magenta fg */
X! 					 (attr & 0xf0ff) | 0x0500;
X! 				else
X! 		 			one_con_attribute |= /* blink */
X! 					 0x8000;
X   				break;
X   
X   			    case 7: /*  REVERSE  (black on light grey)  */
X! 				if (color)
X! 	 				one_con_attribute = 
X! 					 ((attr & 0xf000) >> 4) |
X! 					 ((attr & 0x0f00) << 4);
X  				else if ((attr & 0x7000) == 0)
X  					one_con_attribute =
X  					 (attr & 0x8800) | 0x7000;
X  				else
X  					one_con_attribute =
X  					 (attr & 0x8800) | 0x0700;
X!   				break;
X! 
X!  			    default: if (value >= 30 && value <= 37) {
X! 					one_con_attribute = 
X! 					 (attr & 0xf0ff) |
X! 					 (ansi_colors[(value - 30)] << 8);
X! 					blank_color = 
X! 					 (blank_color & 0xf0ff) |
X  					 (ansi_colors[(value - 30)] << 8);
X  				} else if (value >= 40 && value <= 47) {
X  					one_con_attribute = 
X! 					 (attr & 0x0fff) |
X! 					 (ansi_colors[(value - 40)] << 12);
X! 					blank_color =
X! 					 (blank_color & 0x0fff) |
X  					 (ansi_colors[(value - 40)] << 12);
X  				} else
X  	 				one_con_attribute = blank_color;
X    				break;
X  	 		}
X  			break;
X***************
X*** 717,747 ****
X    tp->tty_esc_state = 0;
X  }
X  
X- #ifdef VGAMONO
X- /*===========================================================================*
X-  *				VM_set					     *
X-  *===========================================================================*/
X- PRIVATE void VM_set()
X- {
X- /* Set screen colour on monochrome VGA according to attributes. */
X-   int attrib = (VM_rev_video << 8) | (VM_bold << 4) | (VM_underline);
X- 
X-   switch (attrib) {
X- 	case 0x000:	one_con_attribute = VM_rbu;	break;
X- 	case 0x001:	one_con_attribute = VM_rbU;	break;
X- 	case 0x010:	one_con_attribute = VM_rBu;	break;
X- 	case 0x011:	one_con_attribute = VM_rBU;	break;
X- 	case 0x100:	one_con_attribute = VM_Rbu;	break;
X- 	case 0x101:	one_con_attribute = VM_RbU;	break;
X- 	case 0x110:	one_con_attribute = VM_RBu;	break;
X- 	case 0x111:	one_con_attribute = VM_RBU;	break;
X- 	default:	one_con_attribute = VM_rbu;	break;
X-   }
X-   if (VM_blink)
X- 	one_con_attribute |= 0x8000;
X- }
X- #endif
X- 
X  /*===========================================================================*
X   *				long_vid_copy				     *
X   *===========================================================================*/
X--- 595,600 ----
X***************
X*** 903,919 ****
X  	vid_mask = C_VID_MASK;
X  	vid_port = C_6845;
X  	vid_retrace = C_RETRACE;
X- #ifdef SCNBLANK	
X- 	mode_port = C_MODE;
X- #endif	
X    } else {
X  	vid_base = protected_mode ? MONO_SELECTOR : physb_to_hclick(MONO_BASE);
X  	vid_mask = M_VID_MASK;
X  	vid_port = M_6845;
X  	vid_retrace = M_RETRACE;
X- #ifdef SCNBLANK	
X- 	mode_port = M_MODE;
X- #endif	
X    }
X  
X    if (ega) {
X--- 756,766 ----
X***************
X*** 921,929 ****
X  	vid_retrace = C_VID_MASK + 1;
X    }
X  
X! #ifndef LINE_CURSOR
X!   set_6845(CUR_SIZE, CURSOR_SHAPE);	/* set cursor shape (block) */
X! #endif
X    set_6845(VID_ORG, 0);			/* use page 0 of video ram */
X    move_to(&tty_struct[0], 0, SCR_LINES-1); /* move cursor to lower left */
X  }
X--- 768,774 ----
X  	vid_retrace = C_VID_MASK + 1;
X    }
X  
X!   set_6845(CUR_SIZE, CURSOR_SHAPE);	/* set cursor shape */
X    set_6845(VID_ORG, 0);			/* use page 0 of video ram */
X    move_to(&tty_struct[0], 0, SCR_LINES-1); /* move cursor to lower left */
X  }
X***************
X*** 958,1048 ****
X    printf("\033[H\033[J%sware scrolling enabled.\n",
X  	 softscroll ? "Soft" : "Hard");
X  }
X- 
X- 
X- #ifdef SCNBLANK
X- /*===========================================================================*
X-  *				screen blanking				     *
X-  *===========================================================================*/
X- 
X- PUBLIC void scr_enable()
X- {
X-   int	seq_addr_reg;	/* contents of sequencer address register (VGA only) */
X- 
X- #ifdef WHITE_BORDER
X-   white_border();
X- #endif
X-   if (ega) {
X- #ifndef SCNBLANK_ARRAY_METHOD
X- 	lock();
X- 	in_byte(CRT_STAT_MONO);			/* reset flip/flop if mono */
X- 	in_byte(CRT_STAT_COLR);			/* reset flip/flop if colour */
X- 	out_byte(EGA,0x20);			/* enable video */
X- 	unlock();
X- #else	
X- 
X- 	/* restore the screen from vid_buf[] */
X- 	lock();
X- 	vid_copy(vid_buf, vid_base, tty_struct[0].tty_org, VID_BUF_SIZE/2);
X- 	unlock();
X- 
X- 	/* and turn the cursor back on */
X- 	move_to(&tty_struct[0], tty_struct[0].tty_column, tty_struct[0].tty_row);
X- #endif
X-   } else {
X- 	lock();
X- 	out_byte(mode_port, VID_ENABLE);	/* set the mode register */
X- 	unlock();
X-   }
X- }
X- 
X- PUBLIC void scr_disable()
X- {
X-   int	seq_addr_reg;	/* contents of sequencer address register (VGA only) */
X- 
X- #ifdef WHITE_BORDER
X-   /* screen blanking doesn't work, unless the border is black */
X-   black_border();				/* prepare for blanking */
X- #endif
X-   if (ega) {
X- 	u16_t	offset;
X- 
X- #ifndef SCNBLANK_ARRAY_METHOD
X- 	lock();
X- 	in_byte(CRT_STAT_MONO);			/* reset flip/flop if mono */
X- 	in_byte(CRT_STAT_COLR);			/* reset flip/flop if colour */
X- 	out_byte(EGA,0x00);			/* disable video */
X- 	unlock();
X- #else	
X- 	char	blackblank[2];
X- 
X- 	/* save the screen data into vid_buf[] */
X- 	lock();
X- 	for (offset = 0; offset < VID_BUF_SIZE; offset++)
X- 	  vid_buf[offset] = (char) get_byte(vid_base, tty_struct[0].tty_org+offset);
X- 
X- 	/* blank the screen; be careful: blank_color might not be black */
X- 	/* #define PAGEWHITE for some pagewhite monitors, that display all
X- 	 * text in reverse video in order to achieve the pagewhite effect.
X- 	 */
X- 	blackblank[0] = ' ';
X- #ifndef PAGEWHITE
X- 	blackblank[1] = 0x00;		/* black background and foreground */
X- #else
X- 	blackblank[1] = 0x77;		/* white (will be black on pagewhite) */
X- #endif
X- 	for (offset = 0; offset < VID_BUF_SIZE; offset += 2)
X- 	  vid_copy(blackblank, vid_base, tty_struct[0].tty_org+offset, 1);
X- 	unlock();
X- 
X- 	/* and turn the cursor off by moving it off the screen */
X- 	set_6845(CURSOR, (tty_struct[0].tty_org - 2) >> 1);
X- #endif
X-   } else {
X- 	lock();
X- 	out_byte(mode_port, VID_DISABLE);	/* set the mode register */
X- 	unlock();
X-   }
X- }
X- 
X- #endif
X--- 803,805 ----
/
echo x - const.h.cdif
sed '/^X/s///' > const.h.cdif << '/'
X*** const.h	Fri Jun  7 05:51:53 1991
X--- /usr/src/kernel/const.h	Fri Jul 20 01:19:13 1990
X***************
X*** 153,159 ****
X  #endif
X  
X  #define printf        printk	/* the kernel really uses printk, not printf */
X- 
X- #ifdef SCNBLANK
X- #define DISPLAY_TIMEOUT (time_t)15*3600	/* about 15 minutes for 60 Hz */
X- #endif
X--- 153,155 ----
/
echo x - glo.h.cdif
sed '/^X/s///' > glo.h.cdif << '/'
X*** glo.h	Fri Jun  7 01:09:18 1991
X--- /usr/src/kernel/glo.h	Fri Jul 20 01:19:15 1990
X***************
X*** 42,57 ****
X  EXTERN int ega;			/* nonzero if console is EGA */
X  EXTERN int scan_code;		/* scan code of key pressed to start minix */
X  EXTERN int snow;		/* nonzero if screen needs snow removal */
X- #ifdef SCNBLANK
X- EXTERN time_t displaytime;	/* display timeout timer */
X- EXTERN time_t dtimeout;		/* display timeout timer */
X- EXTERN void scr_enable();	/* turn screen on */
X- EXTERN void scr_disable();	/* turn screen off (blank) */
X- #endif
X- #ifdef WHITE_BORDER
X- EXTERN void white_border();	/* set screen border (overscan) to white */
X- EXTERN void black_border();	/* set screen border (overscan) to black */
X- #endif
X  
X  /* Memory sizes. */
X  EXTERN unsigned ext_memsize;	/* initialized by assembler startup code */
X--- 42,47 ----
/
echo x - keyboard.c.cdi
sed '/^X/s///' > keyboard.c.cdi << '/'
X*** keyboard.c	Sun Nov  4 00:51:11 1990
X--- /usr/src/kernel/keyboard.c	Fri Jul 20 01:19:16 1990
X***************
X*** 262,275 ****
X    kb = kb_addr(-NR_CONS);
X    *kb->iptr = code;
X    if (kb->iptr < kb->ibufend) {
X! #ifdef SCNBLANK	
X! 	if (displaytime < 0)
X! 		scr_enable();
X! 	lock();				/* protect shared variable */
X! 	displaytime = dtimeout;
X! 	unlock();
X! #endif	
X! 	lock();				/* protect shared variable */
X  	tty_events += EVENT_THRESHOLD;	/* C doesn't guarantee atomic */
X  	unlock();
X  	++kb->iptr;
X--- 262,268 ----
X    kb = kb_addr(-NR_CONS);
X    *kb->iptr = code;
X    if (kb->iptr < kb->ibufend) {
X! 	lock();			/* protect shared variable */
X  	tty_events += EVENT_THRESHOLD;	/* C doesn't guarantee atomic */
X  	unlock();
X  	++kb->iptr;
/
echo x - main.c.cdif
sed '/^X/s///' > main.c.cdif << '/'
X*** main.c	Fri Jun  7 04:21:20 1991
X--- /usr/src/kernel/main.c	Fri Jul 20 01:19:18 1990
X***************
X*** 55,67 ****
X    mpx_2hook(); 
X    klib_2hook(); 
X  
X- #ifdef WHITE_BORDER
X-   /* Initially turn on the border on the console.
X-    * We can't do this until we are fully in 32-bit mode.
X-    */
X-   white_border();
X- #endif
X- 
X    /* Clear the process table.
X     * Set up mappings for proc_addr() and proc_number() macros.
X     */
X--- 55,60 ----
/
echo x - start.x.cdif
sed '/^X/s///' > start.x.cdif << '/'
X*** start.x	Fri Jun  7 05:50:38 1991
X--- /usr/src/kernel/start.x	Fri Jul 20 01:19:24 1990
X***************
X*** 50,81 ****
X  #define SET_PROTECT_VEC		0x15	/* set protected mode */
X  #	define SET_PROTECT_FUNC 0x89
X  #define VIDEO			0x10
X! #	define ALTERNATE_SELECT	0x12	/* alternate select (Prt-Sc) */
X! #	define A_S_INFO		0x10
X! #	define SET_VID_MOD	0x00	/* set video mode function */
X! #	define TEXT80		0x03	/* 80x25 16-colour text mode */
X! #	define CHAR_GEN		0x11	/* character generator interface */
X! #	define LOAD_8x8		0x12	/* load the ROM BIOS 8x8 char set */
X! #	define CRTC_PORT	0x3d4	/* CRTC address for colour (EGA) */
X! #	define CUR_SVAL		0x06	/* cursor start value (underscore) */
X! #	define CUR_EVAL		0x00	/* cursor end value (underscore) */
X! #	define CUR_SREG		0x0a	/* cursor start register number */
X! #	define CUR_EREG		0x0b	/* cursor end register number */
X! #	define PRT_SC		0x20	/* select alternate Prt-Sc routine */
X! #	define SCRL_WINUP	0x06	/* scroll window up function */
X! #	define VIDATT		0x02	/* video attributes green/black */
X! #	define LINE_WIDTH	80	/* number of characters per line */
X! #	ifdef EGA43
X! #		define SCR_LINES 43	/* number of lines on the screen */
X! #		define EGA_OR_VGA
X! #	endif
X! #	ifdef VGA50
X! #		define SCR_LINES 50	/* number of lines on the screen */
X! #		define EGA_OR_VGA
X! #	endif
X! #	ifndef SCR_LINES
X! #		define SCR_LINES 25	/* number of lines on the screen */
X! #	endif
X  
X  	.text
X  |*===========================================================================*
X--- 50,57 ----
X  #define SET_PROTECT_VEC		0x15	/* set protected mode */
X  #	define SET_PROTECT_FUNC 0x89
X  #define VIDEO			0x10
X! #	define ALTERNATE_SELECT	0x12
X! #	define A_S_INFO		0x10
X  
X  	.text
X  |*===========================================================================*
X***************
X*** 198,250 ****
X  	movb	al,bl		| success is determined by knowing
X  	movb	ah,#0		| a successful call will change bl
X  	sub	ax,#A_S_INFO	| nonzero means it is EGA
X- 	push	ax		| save correct return value
X- 
X- #ifdef EGA_OR_VGA
X- 	jz	no_43		| non-EGA can't do 43-line mode
X- 
X- | If the display is an EGA (or VGA),
X- |	Then establish 43-line (50-line) mode.
X- |	We have to do this now, as we can't do it in protected mode.
X- 
X- 	movb	ah,#SET_VID_MOD	| set video mode function
X- 	movb	al,#TEXT80	| 80x25 16-colour text mode
X- 	int	VIDEO
X- 
X- 	movb	ah,#CHAR_GEN	| character generator interface function
X- 	movb	al,#LOAD_8x8	| load the ROM BIOS 8x8 character set
X- 	movb	bl,#0		| bl = block to load
X- 	int	VIDEO		| load 8x8 characters into RAM
X- 
X- 				| set up for underscore cursor
X- 				| console.c code will change to block cursor
X- 				|	unless disabled by compiling with
X- 				|	-DLINE_CURSOR
X- 	mov	dx,#CRTC_PORT	| CRTC address port for colour
X- 	movb	ah,#CUR_SVAL	| cursor start value
X- 	movb	al,#CUR_SREG	| cursor start register number
X- 	outw			| update CRTC Cursor Start register
X- 	movb	ah,#CUR_EVAL	| cursor end value
X- 	movb	al,#CUR_EREG	| cursor end register number
X- 	outw			| update CRTC Cursor End register
X- 
X- 	movb	ah,#ALTERNATE_SELECT	| alternate select function
X- 	movb	bl,#PRT_SC	| use alternate video BIOS Prt-Sc routine
X- 	int	VIDEO		| update INT 5 vector (print screen)
X- #endif
X- 
X- no_43:
X- 				| Use scroll window to clear screen
X- 	movb	ah,#SCRL_WINUP	| scroll window up
X- 	movb	al,#0		| number of lines to scroll
X- 	movb	bh,#VIDATT	| and set the video attributes
X- 	xor	cx,cx
X- 	movb	dh,#SCR_LINES-1	| number of lines on the screen
X- 	movb	dl,#LINE_WIDTH-1 | number of characters per line
X- 	int	VIDEO
X- 
X- 	pop	ax		| pass correct return value
X- 				| (from 7th line after _get_ega: label)
X  	ret
X  
X  
X--- 174,179 ----
/
echo x - tty.c.cdif
sed '/^X/s///' > tty.c.cdif << '/'
X*** tty.c	Mon Jul 23 03:52:35 1990
X--- /usr/src/kernel/tty.c	Fri Jul 20 01:19:27 1990
X***************
X*** 281,291 ****
X  
X  		/* Now do kill processing (remove current line). */
X  		if (ch == tp->tty_kill && tp->tty_escaped == NOT_ESCAPED) {
X! 			while(chuck(tp) == OK)
X! 				/* keep looping */
X! 				back_over(tp);
X! 			/* echo(tp, tp->tty_kill); */
X! 			/* echo(tp, '\n'); */
X  			return;
X  		}
X  
X--- 281,289 ----
X  
X  		/* Now do kill processing (remove current line). */
X  		if (ch == tp->tty_kill && tp->tty_escaped == NOT_ESCAPED) {
X! 			while(chuck(tp) == OK)	/* keep looping */ ;
X! 			echo(tp, tp->tty_kill);
X! 			echo(tp, '\n');
X  			return;
X  		}
X  
/
echo x - tty.h.cdif
sed '/^X/s///' > tty.h.cdif << '/'
X*** tty.h	Mon Jul 23 03:43:20 1990
X--- /usr/src/kernel/tty.h	Fri Jul 20 01:19:27 1990
X***************
X*** 9,17 ****
X  #define MAX_ESC_PARMS      2	/* number of escape sequence params allowed */
X  
X  #define ERASE_CHAR      '\b'	/* default erase character */
X! #define KILL_CHAR        025	/* default kill character ^U (was '@') */
X! #define INTR_CHAR        003	/* default interrupt character ^C (was 0177) */
X! #define QUIT_CHAR (char) 034	/* default quit character ^\ */
X  #define XOFF_CHAR (char) 023	/* default x-off character (CTRL-S) */
X  #define XON_CHAR  (char) 021	/* default x-on character (CTRL-Q) */
X  #define EOT_CHAR  (char) 004	/* CTRL-D */
X--- 9,17 ----
X  #define MAX_ESC_PARMS      2	/* number of escape sequence params allowed */
X  
X  #define ERASE_CHAR      '\b'	/* default erase character */
X! #define KILL_CHAR        '@'	/* default kill character */
X! #define INTR_CHAR (char)0177	/* default interrupt character */
X! #define QUIT_CHAR (char) 034	/* default quit character */
X  #define XOFF_CHAR (char) 023	/* default x-off character (CTRL-S) */
X  #define XON_CHAR  (char) 021	/* default x-on character (CTRL-Q) */
X  #define EOT_CHAR  (char) 004	/* CTRL-D */
X***************
X*** 75,82 ****
X  
X    /* User settable characters: erase, kill, interrupt, quit, x-on; x-off. */
X    char tty_erase;		/* char used to erase 1 char (init ^H) */
X!   char tty_kill;		/* char used to erase a line (init ^U was @) */
X!   char tty_intr;		/* char used to send SIGINT  (init ^C was DEL) */
X    char tty_quit;		/* char used for core dump   (init CTRL-\) */
X    char tty_xon;			/* char used to start output (init CTRL-Q)*/
X    char tty_xoff;		/* char used to stop output  (init CTRL-S) */
X--- 75,82 ----
X  
X    /* User settable characters: erase, kill, interrupt, quit, x-on; x-off. */
X    char tty_erase;		/* char used to erase 1 char (init ^H) */
X!   char tty_kill;		/* char used to erase a line (init @) */
X!   char tty_intr;		/* char used to send SIGINT  (init DEL) */
X    char tty_quit;		/* char used for core dump   (init CTRL-\) */
X    char tty_xon;			/* char used to start output (init CTRL-Q)*/
X    char tty_xoff;		/* char used to stop output  (init CTRL-S) */
/
echo x - console1.x
sed '/^X/s///' > console1.x << '/'
X
X| This file contains two assembly language routines,
X| for changing the colour of the screen border.
X
X| written by Kenneth J. Hendrickson, kjh@usc.edu
X
X| These routines used to be in start.x, which was fine as
X| long as Minix-386 was not used.  These routines need to
X| be assembled in 32-bit mode, and called in 32-bit mode,
X| for Minix-386.
X
X#ifdef WHITE_BORDER
X.define		_white_border	| set console overscan (border) to white
X.define		_black_border	| set console overscan (border) to black
X
X#define VIDEO	0x10		| used in BIOS methods
X
X	.text
X
X|*===========================================================================*
X|*				white_border				     *
X|*===========================================================================*
X
X| PUBLIC void white_border();
X| Set the border on the console to white.
X
X_white_border:
X| The following 2 BIOS methods cannot be used if Minix is to run
X| in protected mode.  They are provided here for informational
X| purposes only, and are appropriately commented out.
X
X| This method DOESN'T work for EGA/VGA!  It was designed primarily for CGA.
X| In fact, this code puts the display into 40x25 mode for OAK VGA!  :-(
X| 40x25 mode isn't initiated in Genoa VGA.
X|	movb	ah,0x0b
X|	movb	bh,0		| select border colour	
X|	movb	bl,0x07		| colour 7=white
X|	int	VIDEO		| select white border for pagewhite
X
X| Use this method for EGA/VGA.
X|	movb	ah,#0x10	| set palette registers, set attributes
X|	movb	al,1		| select overscan (border) colour
X|	movb	bh,0x07		| colour 7=white
X|				|	1=blue, 2=green, 4=red
X|	int	VIDEO		| select white border for pagewhite
X
X| Since the BIOS methods don't work, we program the video controller directly.
X#ifdef INTEL_32BITS
X	mov	edx,#0x03da	| we should check for mono; mono uses 0x03ba
X#else
X	mov	dx,#0x03da	| we should check for mono; mono uses 0x03ba
X#endif
Xwhite0:	in
X	testb	al,#8
X	jnz	white0		| wait here for something?  (BIOS does this.)
Xwhite1:	in
X	testb	al,#8
X	jz	white1
X#ifdef INTEL_32BITS
X	mov	edx,#0x03c0
X#else
X	mov	dx,#0x03c0
X#endif
X	movb	al,#0x11	| select overscan register
X	out
X	movb	al,#0x07	| colour 7=white
X	out
X	movb	al,#0x20
X	out
X	ret
X
X
X|*===========================================================================*
X|*				black_border				     *
X|*===========================================================================*
X
X| PUBLIC void black_border();
X| Set the border on the console to black to prepare for screen blanking.
X
X_black_border:
X| The following 2 BIOS methods cannot be used if Minix is to run
X| in protected mode.  They are provided here for informational
X| purposes only, and are appropriately commented out.
X
X| This method DOESN'T work for EGA/VGA!  It was designed primarily for CGA.
X| In fact, this code puts the display into 40x25 mode for OAK VGA!  :-(
X| 40x25 mode isn't initiated in Genoa VGA.
X|	movb	ah,0x0b
X|	movb	bh,0		| select border colour	
X|	movb	bl,0x00		| colour 0=black
X|	int	VIDEO		| select black border for screen blanking
X
X| Use this method for EGA/VGA.
X|	movb	ah,#0x10	| set palette registers, set attributes
X|	movb	al,1		| select overscan (border) colour
X|	movb	bh,0x00		| colour 7=white
X|				|	1=blue, 2=green, 4=red
X|	int	VIDEO		| select white border for pagewhite
X
X| Since the BIOS methods don't work, we program the video controller directly.
X#ifdef INTEL_32BITS
X	mov	edx,#0x03da	| we should check for mono; mono uses 0x03ba
X#else
X	mov	dx,#0x03da	| we should check for mono; mono uses 0x03ba
X#endif
Xblack0:	in
X	testb	al,#8
X	jnz	black0		| wait here for something?  (BIOS does this.)
Xblack1:	in
X	testb	al,#8
X	jz	black1
X#ifdef INTEL_32BITS
X	mov	edx,#0x03c0
X#else
X	mov	dx,#0x03c0
X#endif
X	movb	al,#0x11	| select overscan register
X	out
X	movb	al,#0x00	| colour 0=black
X	out
X	movb	al,#0x20
X	out
X	ret
X
X#endif
/
echo x - makefile.bcc
sed '/^X/s///' > makefile.bcc << '/'
X#Makefile for kernel using Bruce's Minix directory layout and compiler.
X#The following nonstandard flags are used:
X#-0:	produce 16-bit (8086) object code
X#-3:	produce 32-bit (80386) object code
X#-DEGA43	use 43-line mode on EGA displays
X#-DVGA50	use 50-line mode on VGA displays
X#-DSCNBLANK	use automatic screen blanking
X#-DVGAMONO	use a monochrome VGA display (black text on white background)
X#		-DWHITE_BORDER is recommended with VGAMONO
X#-DWHITE_BORDER	use a white border (for pagewhite)
X
X#modified by Kenneth J. Hendrickson, kjh@usc.edu, 6 June 1991
X
XAS		=as
XCC		=bcc -3
XCC88		=bcc -0
XCFLAGS		=-DINTEL_32BITS -DLINE_CURSOR -DSCNBLANK -DVGAMONO -DWHITE_BORDER
XCPP		=/lib/gnu-cpp
XCPPFLAGS	=-P -DINTEL_32BITS -traditional -DLINE_CURSOR -DSCNBLANK -DVGAMONO -DWHITE_BORDER
XLD		=ld -3
XLDFLAGS		=-i
XLIBS		=/usr/local/lib/i386/libc.a
XLONGLIB		=longlib.a
XSTART		=start.o
X
Xa		=kernel.h $h/config.h $h/const.h $h/type.h \
X		 $s/types.h $i/limits.h $i/errno.h \
X		 const.h type.h proto.h glo.h
Xh		=/usr/include/minix
Xi		=/usr/include
Xs		=/usr/include/sys
Xm		=makefile
X
X.c.o:
X	$(CC) $(CFLAGS) \
X	-c $<
X
XKEROBJS		=cstart.o protect.o protect1.o klib.o mpx.o wini.o \
X	table.o main.o tty.o floppy.o system.o proc.o \
X	clock.o memory.o console.o rs232.o rs2.o printer.o \
X	dmp.o exception.o i8259.o misc.o keyboard.o console1.o
XSOBJS		=start.s klib.s mpx.s rs2.s console1.s
X
X#Rules.
X.SUFFIXES: .x		# .x files are .s files which need C-preprocessing
X.x.s:
X	$(CPP) $(CPPFLAGS) \
X	$< >$@
X.s.o:
X	$(AS) -3 $< -o $@
X.x.o:
X	$(CPP) $(CPPFLAGS) \
X	$< >$@
X	$(AS) -3 $< -o $@
X
X#What to make.
Xkernel: $(START) $(KEROBJS) $(LIBS) $(END) $(LONGLIB)
X	$(LD) $(LDFLAGS) -o kernel \
X	$(START) $(KEROBJS) \
X	$(LIBS) $(LONGLIB) $(END)
X
Xclean:
X	rm -f $(START) $(KEROBJS) $(SOBJS)
X
Xklib.s: $h/config.h $h/const.h const.h protect.h sconst.h klib.x
Xmpx.s: $h/config.h $h/const.h $h/com.h const.h protect.h sconst.h mpx.x
Xrs2.s: $h/config.h $h/const.h const.h sconst.h rs2.x
Xstart.s: $h/config.h $h/const.h $h/com.h const.h protect.h sconst.h start.x $m
Xstart.o: start.s
X	$(AS) -0 -a start.s -o start.o
Xconsole1.s: console1.x $m
X
Xclock.o:	$a
Xclock.o:	$i/signal.h
Xclock.o:	$h/callnr.h
Xclock.o:	$h/com.h
Xclock.o:	proc.h
Xclock.o:	$m
X
Xconsole.o:	$a
Xconsole.o:	$i/sgtty.h
Xconsole.o:	$h/callnr.h
Xconsole.o:	$h/com.h
Xconsole.o:	protect.h
Xconsole.o:	tty.h
Xconsole.o:	$m
X
Xconsole1.o:	$m
X
Xcstart.o:	$a
Xcstart.o:	$h/boot.h
Xcstart.o:	$m
Xcstart.o:	cstart.c
X	$(CC88) $(CFLAGS) \
X	-c cstart.c
X
Xdmp.o:		$a
Xdmp.o:		$h/callnr.h
Xdmp.o:		$h/com.h
Xdmp.o:		proc.h
Xdmp.o:		$m
X
Xexception.o:	$a
Xexception.o:	$i/signal.h
Xexception.o:	proc.h
Xexception.o:	$m
X
Xfloppy.o:	$a
Xfloppy.o:	$h/callnr.h
Xfloppy.o:	$h/com.h
Xfloppy.o:	$m
X
Xi8259.o:	$a
Xi8259.o:	$m
X
Xkeyboard.o:	$a
Xkeyboard.o:	$i/sgtty.h
Xkeyboard.o:	$i/signal.h
Xkeyboard.o:	$h/callnr.h
Xkeyboard.o:	$h/com.h
Xkeyboard.o:	tty.h
Xkeyboard.o:	$m
X
Xmain.o:		$a
Xmain.o:		$i/signal.h
Xmain.o:		$h/callnr.h
Xmain.o:		$h/com.h
Xmain.o:		proc.h
Xmain.o:		$m
X
Xmemory.o:	$a
Xmemory.o:	$h/callnr.h
Xmemory.o:	$h/com.h
Xmemory.o:	$m
X
Xmisc.o:		$a
Xmisc.o:		$h/com.h
Xmisc.o:		$m
X
Xprinter.o:	$a
Xprinter.o:	$h/callnr.h
Xprinter.o:	$h/com.h
Xprinter.o:	$m
X
Xproc.o:		$a
Xproc.o:		$h/callnr.h
Xproc.o:		$h/com.h
Xproc.o:		proc.h
Xproc.o:		$m
X
Xprotect.o:	$a
Xprotect.o:	protect.h
Xprotect.o:	$m
Xprotect.o:	protect1.c
X	$(CC88) $(CFLAGS) \
X	-c protect.c
X
Xprotect1.o:	$a
Xprotect1.o:	proc.h
Xprotect1.o:	protect.h
Xprotect1.o:	$m
X
Xrs232.o:	$a
Xrs232.o:	$i/sgtty.h
Xrs232.o:	tty.h
Xrs232.o:	$m
X
Xsystem.o:	$a
Xsystem.o:	$i/signal.h
Xsystem.o:	$h/boot.h
Xsystem.o:	$h/callnr.h
Xsystem.o:	$h/com.h
Xsystem.o:	proc.h
Xsystem.o:	protect.h
Xsystem.o:	$m
X
Xtable.o:	$a
Xtable.o:	$h/com.h
Xtable.o:	proc.h
Xtable.o:	tty.h
Xtable.o:	$m
X
Xtty.o:		$a
Xtty.o:		$i/sgtty.h
Xtty.o:		$i/signal.h
Xtty.o:		$h/callnr.h
Xtty.o:		$h/com.h
Xtty.o:		tty.h
Xtty.o:		$m
X
Xwini.o:		$a
Xwini.o:		$h/callnr.h
Xwini.o:		$h/com.h
Xwini.o:		$h/partition.h
Xwini.o:		$m
/
echo x - makefile.ack
sed '/^X/s///' > makefile.ack << '/'
X# Makefile for kernel using standard Minix directory layout and compiler.
X# CPP may need changing to /usr/lib/cpp.
X# The following nonstandard flags are used:
X# -F:	run cpp and cem sequentially (used when memory is tight)
X# -T.:	put temporaries in working directory (when RAM disk is small)
X# -DEGA43	use 43-line mode on EGA displays
X# -DVGA50	use 50-line mode on VGA displays
X# -DSCNBLANK	use automatic screen blanking
X# -DVGAMONO	use a monochrome VGA display (black text on white background)
X#		-DWHITE_BORDER is recommended with VGAMONO
X# -DWHITE_BORDER use a white border (for pagewhite)
X
X# modified by Kenneth J. Hendrickson, kjh@usc.edu, 7 June 1991
X
XBIN		=.
XCC		=cc
XCFLAGS		=-DVGAMONO -DWHITE_BORDER -DLINE_CURSOR -DSCNBLANK
XCPP		=/lib/cpp
XCPPFLAGS	=-DASLD -P -DVGAMONO -DWHITE_BORDER -DLINE_CURSOR -DSCNBLANK
XEND		=/lib/end.s
XLD		=asld
XLDFLAGS		=-i
XLIBS		=/lib/libc.a
XSTART		=start.s
X
Xa		=kernel.h $h/config.h $h/const.h $h/type.h \
X		 $s/types.h $i/limits.h $i/errno.h \
X		 const.h type.h proto.h glo.h
Xh		=/usr/include/minix
Xi		=/usr/include
Xs		=/usr/include/sys
Xm		=makefile
X
XKEROBJS		=cstart.s protect.s protect1.s klib.s mpx.s wini.s \
X	table.s main.s tty.s floppy.s system.s proc.s \
X	clock.s memory.s console.s rs232.s rs2.s printer.s \
X	dmp.s exception.s i8259.s misc.s keyboard.s console1.s
XSOBJS		=start.s klib.s mpx.s rs2.s console1.s
X
X# Rules.
X.SUFFIXES: .x		# .x files are .s files which need C-preprocessing
X.x.s:
X	$(CPP) $(CPPFLAGS) $< >$@
X
X# What to make.
Xdummy: $(BIN)/kernel	# this line fixes a bug in RAL's latest make
X
X$(BIN)/kernel: $(START) $(KEROBJS) $(LIBS) $(END)
X	$(LD) $(LDFLAGS) -o $(BIN)/kernel \
X	$(START) $(KEROBJS) \
X	$(LIBS) $(END) -s > kernel.sym
X	ast -X $(BIN)/kernel kernel.sym
X	@rm kernel.sym
X
Xclean:
X	@rm -f $(START) $(KEROBJS) $(SOBJS)
X
Xklib.s: $h/config.h $h/const.h const.h protect.h sconst.h klib.x
Xmpx.s: $h/config.h $h/const.h $h/com.h const.h protect.h sconst.h mpx.x
Xrs2.s: $h/config.h $h/const.h const.h sconst.h rs2.x
Xstart.s: $h/config.h $h/const.h $h/com.h const.h protect.h sconst.h start.x $m
X
Xclock.s:	$a
Xclock.s:	$i/signal.h
Xclock.s:	$h/callnr.h
Xclock.s:	$h/com.h
Xclock.s:	proc.h
Xclock.s:	$m
X
Xconsole.s:	$a
Xconsole.s:	$i/sgtty.h
Xconsole.s:	$h/callnr.h
Xconsole.s:	$h/com.h
Xconsole.s:	protect.h
Xconsole.s:	tty.h
Xconsole.s:	$m
X
Xconsole1.s:	$m
X
Xcstart.s:	$a
Xcstart.s:	$h/boot.h
Xcstart.s:	cstart.c
Xcstart.s:	$m
X
Xdmp.s:		$a
Xdmp.s:		$h/callnr.h
Xdmp.s:		$h/com.h
Xdmp.s:		proc.h
Xdmp.s:		$m
X
Xexception.s:	$a
Xexception.s:	$i/signal.h
Xexception.s:	proc.h
Xexception.s:	$m
X
Xfloppy.s:	$a
Xfloppy.s:	$h/callnr.h
Xfloppy.s:	$h/com.h
Xfloppy.s:	$m
X
Xi8259.s:	$a
Xi8259.s:	$m
X
Xkeyboard.s:	$a
Xkeyboard.s:	$i/sgtty.h
Xkeyboard.s:	$i/signal.h
Xkeyboard.s:	$h/callnr.h
Xkeyboard.s:	$h/com.h
Xkeyboard.s:	tty.h
Xkeyboard.s:	$m
X
Xmain.s:		$a
Xmain.s:		$i/signal.h
Xmain.s:		$h/callnr.h
Xmain.s:		$h/com.h
Xmain.s:		proc.h
Xmain.s:		$m
X
Xmemory.s:	$a
Xmemory.s:	$h/callnr.h
Xmemory.s:	$h/com.h
Xmemory.s:	$m
X
Xmisc.s:		$a
Xmisc.s:		$h/com.h
Xmisc.s:		$m
X
Xprinter.s:	$a
Xprinter.s:	$h/callnr.h
Xprinter.s:	$h/com.h
Xprinter.s:	$m
X
Xproc.s:		$a
Xproc.s:		$h/callnr.h
Xproc.s:		$h/com.h
Xproc.s:		proc.h
Xproc.s:		$m
X
Xprotect.s:	$a
Xprotect.s:	protect.h
Xprotect.s:	protect1.c
Xprotect.s:	$m
X
Xprotect1.s:	$a
Xprotect1.s:	proc.h
Xprotect1.s:	protect.h
Xprotect1.s:	$m
X
Xrs232.s:	$a
Xrs232.s:	$i/sgtty.h
Xrs232.s:	tty.h
Xrs232.s:	$m
X
Xsystem.s:	$a
Xsystem.s:	$i/signal.h
Xsystem.s:	$h/boot.h
Xsystem.s:	$h/callnr.h
Xsystem.s:	$h/com.h
Xsystem.s:	proc.h
Xsystem.s:	protect.h
Xsystem.s:	$m
X
Xtable.s:	$a
Xtable.s:	$h/com.h
Xtable.s:	proc.h
Xtable.s:	tty.h
Xtable.s:	$m
X
Xtty.s:		$a
Xtty.s:		$i/sgtty.h
Xtty.s:		$i/signal.h
Xtty.s:		$h/callnr.h
Xtty.s:		$h/com.h
Xtty.s:		tty.h
Xtty.s:		$m
X
Xwini.s:		$a
Xwini.s:		$h/callnr.h
Xwini.s:		$h/com.h
Xwini.s:		$h/partition.h
Xwini.s:		$m
X
X
/
echo x - attrib.uue
sed '/^X/s///' > attrib.uue << '/'
Xtable
X !"#$%&'()*+,-./0123456789:;<=>?
X@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
Xbegin 644 attrib
XM3F]R;6%L('1E>'0N"AM;,6U";VQD(%1E>'0N&ULP;0H;6S1M56YD97)L:6YEz
XM9"!497AT+@H;6S%M0F]L9" F(%5N9&5R;&EN960@5&5X="X;6S!M"AM;-VU2y
XM979E<G-E(%9I9&5O(%1E>'0N"AM;,6U";VQD(%)E=F5R<V4@5FED96\@5&5Xx
XM="X;6S!M"AM;-VT;6S1M56YD97)L:6YE9"!2979E<G-E(%9I9&5O(%1E>'0Nw
XM"AM;,6U";VQD("8@56YD97)L:6YE9"!2979E<G-E(%9I9&5O(%1E>'0N&ULPv
X9;0H;6S5M0FQI;FMI;F<@=&5X="X;6S!M"G9Eu
X t
Xend
/
echo x - colours.uue
sed '/^X/s///' > colours.uue << '/'
Xtable
X !"#$%&'()*+,-./0123456789:;<=>?
X@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
Xbegin 644 colours
XM&ULP;1M;-#!M&ULS,&T@8FQA8VL@&ULS,6T@<F5D(!M;,S)M(&=R965N(!M;z
XM,S-M(&)R;W=N(" ;6S,T;2!B;'5E(!M;,S5M('9I;VQE=" ;6S,V;2!C>6%Ny
XM(!M;,S=M('=H:71E( H;6S0Q;1M;,S!M(&)L86-K(!M;,S%M(')E9" ;6S,Rx
XM;2!G<F5E;B ;6S,S;2!B<F]W;B @&ULS-&T@8FQU92 ;6S,U;2!V:6]L970@w
XM&ULS-FT@8WEA;B ;6S,W;2!W:&ET92 *&ULT,FT;6S,P;2!B;&%C:R ;6S,Qv
XM;2!R960@&ULS,FT@9W)E96X@&ULS,VT@8G)O=VX@(!M;,S1M(&)L=64@&ULSu
XM-6T@=FEO;&5T(!M;,S9M(&-Y86X@&ULS-VT@=VAI=&4@"AM;-#-M&ULS,&T@t
XM8FQA8VL@&ULS,6T@<F5D(!M;,S)M(&=R965N(!M;,S-M(&)R;W=N(" ;6S,Ts
XM;2!B;'5E(!M;,S5M('9I;VQE=" ;6S,V;2!C>6%N(!M;,S=M('=H:71E( H;r
XM6S0T;1M;,S!M(&)L86-K(!M;,S%M(')E9" ;6S,R;2!G<F5E;B ;6S,S;2!Bq
XM<F]W;B @&ULS-&T@8FQU92 ;6S,U;2!V:6]L970@&ULS-FT@8WEA;B ;6S,Wp
XM;2!W:&ET92 *&ULT-6T;6S,P;2!B;&%C:R ;6S,Q;2!R960@&ULS,FT@9W)Eo
XM96X@&ULS,VT@8G)O=VX@(!M;,S1M(&)L=64@&ULS-6T@=FEO;&5T(!M;,S9Mn
XM(&-Y86X@&ULS-VT@=VAI=&4@"AM;-#9M&ULS,&T@8FQA8VL@&ULS,6T@<F5Dm
XM(!M;,S)M(&=R965N(!M;,S-M(&)R;W=N(" ;6S,T;2!B;'5E(!M;,S5M('9Il
XM;VQE=" ;6S,V;2!C>6%N(!M;,S=M('=H:71E( H;6S0W;1M;,S!M(&)L86-Kk
XM(!M;,S%M(')E9" ;6S,R;2!G<F5E;B ;6S,S;2!B<F]W;B @&ULS-&T@8FQUj
XM92 ;6S,U;2!V:6]L970@&ULS-FT@8WEA;B ;6S,W;2!W:&ET92 *&ULQ;1M;i
XM-#!M&ULS,&T@8FQA8VL@&ULS,6T@<F5D(!M;,S)M(&=R965N(!M;,S-M('EEh
XM;&QO=R ;6S,T;2!B;'5E(!M;,S5M('9I;VQE=" ;6S,V;2!C>6%N(!M;,S=Mg
XM('=H:71E( H;6S0Q;1M;,S!M(&)L86-K(!M;,S%M(')E9" ;6S,R;2!G<F5Ef
XM;B ;6S,S;2!Y96QL;W<@&ULS-&T@8FQU92 ;6S,U;2!V:6]L970@&ULS-FT@e
XM8WEA;B ;6S,W;2!W:&ET92 *&ULT,FT;6S,P;2!B;&%C:R ;6S,Q;2!R960@d
XM&ULS,FT@9W)E96X@&ULS,VT@>65L;&]W(!M;,S1M(&)L=64@&ULS-6T@=FEOc
XM;&5T(!M;,S9M(&-Y86X@&ULS-VT@=VAI=&4@"AM;-#-M&ULS,&T@8FQA8VL@b
XM&ULS,6T@<F5D(!M;,S)M(&=R965N(!M;,S-M('EE;&QO=R ;6S,T;2!B;'5Ea
XM(!M;,S5M('9I;VQE=" ;6S,V;2!C>6%N(!M;,S=M('=H:71E( H;6S0T;1M;z
XM,S!M(&)L86-K(!M;,S%M(')E9" ;6S,R;2!G<F5E;B ;6S,S;2!Y96QL;W<@y
XM&ULS-&T@8FQU92 ;6S,U;2!V:6]L970@&ULS-FT@8WEA;B ;6S,W;2!W:&ETx
XM92 *&ULT-6T;6S,P;2!B;&%C:R ;6S,Q;2!R960@&ULS,FT@9W)E96X@&ULSw
XM,VT@>65L;&]W(!M;,S1M(&)L=64@&ULS-6T@=FEO;&5T(!M;,S9M(&-Y86X@v
XM&ULS-VT@=VAI=&4@"AM;-#9M&ULS,&T@8FQA8VL@&ULS,6T@<F5D(!M;,S)Mu
XM(&=R965N(!M;,S-M('EE;&QO=R ;6S,T;2!B;'5E(!M;,S5M('9I;VQE=" ;t
XM6S,V;2!C>6%N(!M;,S=M('=H:71E( H;6S0W;1M;,S!M(&)L86-K(!M;,S%Ms
XM(')E9" ;6S,R;2!G<F5E;B ;6S,S;2!Y96QL;W<@&ULS-&T@8FQU92 ;6S,Ur
XM;2!V:6]L970@&ULS-FT@8WEA;B ;6S,W;2!W:&ET92 *&ULS-VT;6S0P;2 @q
XM(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @p
XM(" @(" @(" @(" @(" @"AM;,6UB;VQD&ULP;2 ;6S1M=6YD97)L:6YE9!M;o
XM,&T@&ULU;6)L:6YK:6YG&ULP;2 ;6S=M<F5V97)S92!V:61E;QM;,&T@;F]Rn
XM;6%L("AW:&ET92!O;B!B;&%C:RD*(" @(" @(" @(" @(" @(" @(" @(" @m
XM(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" *&ULS-VT;l
XM6S0T;2 @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @k
XM(" @(" @(" @(" @(" @(" @(" @"AM;,6UB;VQD&ULP;2 ;6S1M=6YD97)Lj
XM:6YE9!M;,&T@&ULU;6)L:6YK:6YG&ULP;2 ;6S=M<F5V97)S92!V:61E;QM;i
XM,&T@;F]R;6%L("AW:&ET92!O;B!B;'5E("D*(" @(" @(" @(" @(" @(" @h
XM(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" *g
XM&ULS,FT;6S0P;2 @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @f
XM(" @(" @(" @(" @(" @(" @(" @(" @(" @"AM;,6UB;VQD&ULP;2 ;6S1Me
XM=6YD97)L:6YE9!M;,&T@&ULU;6)L:6YK:6YG&ULP;2 ;6S=M<F5V97)S92!Vd
XM:61E;QM;,&T@;F]R;6%L("AG<F5E;B!O;B!B;&%C:RD*(" @(" @(" @(" @c
XM(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @b
XM(" @(" *&ULS,&T;6S0W;2 @(" @(" @(" @(" @(" @(" @(" @(" @(" @a
XM(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @"AM;,6UB;VQD&ULPz
XM;2 ;6S1M=6YD97)L:6YE9!M;,&T@&ULU;6)L:6YK:6YG&ULP;2 ;6S=M<F5Vy
XM97)S92!V:61E;QM;,&T@;F]R;6%L("AB;&%C:R!O;B!W:&ET92D*(" @(" @x
XM(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @w
X,(" @(" @(" @(" *v
X u
Xend
/
---------- CUT HERE ----------

-- 
favourite oxymorons:   student athlete, military justice, mercy killing
Ken Hendrickson N8DGN/6       kjh@usc.edu      ...!uunet!usc!pollux!kjh