*** /mit/release.73/source/bsd-4.3/common/sys/machineio.vax_bsd43/sm.c	Sat Oct 28 06:56:06 1989
--- machineio.vax_bsd43/sm.c	Sun Oct 20 04:48:18 1991
***************
*** 215,220 ****
--- 215,221 ----
  	int shift;			/* state variables	*/
  	int cntrl;
  	int lock;
+ 	int meta;
  	int hold;
  	char last;			/* last character	*/
  } sm_keyboard;
***************
*** 993,998 ****
--- 994,1003 ----
  			sm_keyboard.cntrl ^= 0xffff;
  			return;
  
+ 	    case META:
+ 			sm_keyboard.meta  ^= 0xffff;
+ 			return;
+ 			
  	    case ALLUP:
  			sm_keyboard.cntrl = sm_keyboard.shift = 0;
  			return;
***************
*** 1055,1062 ****
  		string = q_special[ c & 0x7f ];
  		while( *string )
  		    (*linesw[tp->t_line].l_rint)(*string++, tp);
! 	    } else
  		    (*linesw[tp->t_line].l_rint)(c, tp);
  	    if (sm_keyboard.hold &&((tp->t_state & TS_TTSTOP) == 0)) {
  		    sm_key_out( LK_LED_DISABLE );
  		    sm_key_out( LED_4 );
--- 1060,1074 ----
  		string = q_special[ c & 0x7f ];
  		while( *string )
  		    (*linesw[tp->t_line].l_rint)(*string++, tp);
! 	    } else {
! 		    if( sm_keyboard.meta )
! #ifdef META_8BIT
! 			    c |= 0x80;
! #else
! 		    (*linesw[tp->t_line].l_rint)(0x1b, tp);
! #endif
  		    (*linesw[tp->t_line].l_rint)(c, tp);
+ 	    }
  	    if (sm_keyboard.hold &&((tp->t_state & TS_TTSTOP) == 0)) {
  		    sm_key_out( LK_LED_DISABLE );
  		    sm_key_out( LED_4 );
***************
*** 1399,1404 ****
--- 1411,1424 ----
   **                                                              **
   ******************************************************************/
  
+ 
+ /*
+  * Values for character attribute bit mask
+  */
+ #define CHAR_NONE      0
+ #define CHAR_REVERSE   1
+ #define CHAR_UNDERLINE 2
+ 
  sm_blitc( c )
  register char c;
  {
***************
*** 1411,1416 ****
--- 1431,1437 ----
      NORM = 0, ESC, ESCBRAK,
    } state = NORM;
    static int num_row=0, num_col=0, cur_num=0;
+   static char_attr=0;
  	
    c &= 0x7f;
    switch (state) {
***************
*** 1477,1497 ****
  
  	/* inline expansion for speed */
  
! 	*b_row = *f_row++; b_row += ote;
! 	*b_row = *f_row++; b_row += ote;
! 	*b_row = *f_row++; b_row += ote;
! 	*b_row = *f_row++; b_row += ote;
! 	*b_row = *f_row++; b_row += ote;
! 	*b_row = *f_row++; b_row += ote;
! 	*b_row = *f_row++; b_row += ote;
! 	*b_row = *f_row++; b_row += ote;
! 	*b_row = *f_row++; b_row += ote;
! 	*b_row = *f_row++; b_row += ote;
! 	*b_row = *f_row++; b_row += ote;
! 	*b_row = *f_row++; b_row += ote;
! 	*b_row = *f_row++; b_row += ote;
! 	*b_row = *f_row++; b_row += ote;
! 	*b_row = *f_row++; b_row += ote;
  	/* the following is so that ansi marginning works... */
  	if( ++qp->col >=  qp->max_col ) {
  	  qp->col = 0 ;
--- 1498,1523 ----
  
  	/* inline expansion for speed */
  
! 	*b_row = (char_attr & CHAR_REVERSE)?(*f_row++ ^ 0xff):(*f_row++); b_row += ote;
! 	*b_row = (char_attr & CHAR_REVERSE)?(*f_row++ ^ 0xff):(*f_row++); b_row += ote;
! 	*b_row = (char_attr & CHAR_REVERSE)?(*f_row++ ^ 0xff):(*f_row++); b_row += ote;
! 	*b_row = (char_attr & CHAR_REVERSE)?(*f_row++ ^ 0xff):(*f_row++); b_row += ote;
! 	
! 	*b_row = (char_attr & CHAR_REVERSE)?(*f_row++ ^ 0xff):(*f_row++); b_row += ote;
! 	*b_row = (char_attr & CHAR_REVERSE)?(*f_row++ ^ 0xff):(*f_row++); b_row += ote;
! 	*b_row = (char_attr & CHAR_REVERSE)?(*f_row++ ^ 0xff):(*f_row++); b_row += ote;
! 	*b_row = (char_attr & CHAR_REVERSE)?(*f_row++ ^ 0xff):(*f_row++); b_row += ote;
! 	
! 	*b_row = (char_attr & CHAR_REVERSE)?(*f_row++ ^ 0xff):(*f_row++); b_row += ote;
! 	*b_row = (char_attr & CHAR_REVERSE)?(*f_row++ ^ 0xff):(*f_row++); b_row += ote;
! 	*b_row = (char_attr & CHAR_REVERSE)?(*f_row++ ^ 0xff):(*f_row++); b_row += ote;
! 	*b_row = (char_attr & CHAR_REVERSE)?(*f_row++ ^ 0xff):(*f_row++); b_row += ote;
! 
! 	*b_row = (char_attr & CHAR_REVERSE)?(*f_row++ ^ 0xff):(*f_row++); b_row += ote;
! 	*b_row = (char_attr & CHAR_UNDERLINE)?((char_attr & CHAR_REVERSE)?0:0xff):
!                 ((char_attr & CHAR_REVERSE)?(*f_row ^ 0xff):(*f_row)); f_row++; b_row += ote;
! 	*b_row = (char_attr & CHAR_REVERSE)?(*f_row++ ^ 0xff):(*f_row++); b_row += ote;
! 			    
  	/* the following is so that ansi marginning works... */
  	if( ++qp->col >=  qp->max_col ) {
  	  qp->col = 0 ;
***************
*** 1588,1598 ****
--- 1614,1650 ----
        state = NORM;
        return(0);
        
+     case 'm':
+       /* \E[7m = reverse video
+        * \E[m  = disable modes
+        * \E[16m = bitrot characters
+        */
+       
+       switch(cur_num) {
+       case 0:
+ 	/* clear modes */
+ 	char_attr = CHAR_NONE;
+ 	break;
+       case 4:
+ 	/* set reverse video */
+ 	char_attr |= CHAR_UNDERLINE;
+ 	break;
+       case 7:
+ 	/* set reverse video */
+ 	char_attr |= CHAR_REVERSE;
+ 	break;
+       }
+ 
+       cur_num = 0;
+       state = NORM;
+       return(0);
+       
      default:
        state = NORM;
        return(0);
      }
      break;
+ 
    default:
      state = NORM;
      return(0);
