xref: /csrg-svn/sys/news3400/bm/vt100esc.c (revision 53889)
1*53889Smckusick /*
2*53889Smckusick  * Copyright (c) 1992 The Regents of the University of California.
3*53889Smckusick  * All rights reserved.
4*53889Smckusick  *
5*53889Smckusick  * This code is derived from software contributed to Berkeley by
6*53889Smckusick  * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
7*53889Smckusick  *
8*53889Smckusick  * %sccs.include.redist.c%
9*53889Smckusick  *
10*53889Smckusick  * from: $Hdr: vt100esc.c,v 4.300 91/06/09 06:14:59 root Rel41 $ SONY
11*53889Smckusick  *
12*53889Smckusick  *	@(#)vt100esc.c	7.1 (Berkeley) 06/04/92
13*53889Smckusick  */
14*53889Smckusick 
15*53889Smckusick /*
16*53889Smckusick  *  vt100 escape sequence handler
17*53889Smckusick  */
18*53889Smckusick 
19*53889Smckusick #include "../include/fix_machine_type.h"
20*53889Smckusick 
21*53889Smckusick #ifdef IPC_MRX
22*53889Smckusick #include "../../h/param.h"
23*53889Smckusick #include "../../iop/framebuf.h"
24*53889Smckusick #else
25*53889Smckusick #include "param.h"
26*53889Smckusick #include "../iop/framebuf.h"
27*53889Smckusick #endif
28*53889Smckusick 
29*53889Smckusick #include "../bm/vt100.h"
30*53889Smckusick #include "../bm/bitmapif.h"
31*53889Smckusick 
32*53889Smckusick #include "../fb/fbdefs.h"
33*53889Smckusick 
34*53889Smckusick #ifdef IPC_MRX
35*53889Smckusick #include "../../iop/kbreg.h"
36*53889Smckusick #include "../../iop/keyboard.h"
37*53889Smckusick #else
38*53889Smckusick #include "../iop/kbreg.h"
39*53889Smckusick #include "../iop/keyboard.h"
40*53889Smckusick #endif
41*53889Smckusick 
42*53889Smckusick #if CPU_SINGLE
43*53889Smckusick #include "../sio/scc.h"
44*53889Smckusick #endif
45*53889Smckusick 
46*53889Smckusick #ifdef IPC_MRX
47*53889Smckusick #include "config.h"
48*53889Smckusick #define kbd_ioctl(chan, cmd, argp) { \
49*53889Smckusick 	if (kb_ioctl) \
50*53889Smckusick 		(*kb_ioctl)(chan, cmd, argp); \
51*53889Smckusick }
52*53889Smckusick #endif
53*53889Smckusick 
54*53889Smckusick /*
55*53889Smckusick  *  escape sequece functions
56*53889Smckusick  */
57*53889Smckusick int	esc_csi();
58*53889Smckusick int	esc_csi_ansi();
59*53889Smckusick int	esc_csi_dec();
60*53889Smckusick int	esc_store_csr();
61*53889Smckusick int	esc_restore_csr();
62*53889Smckusick int	esc_index();
63*53889Smckusick int	esc_next_line();
64*53889Smckusick int	esc_tab_set();
65*53889Smckusick int	esc_rev_index();
66*53889Smckusick int	esc_numeric_kpad();
67*53889Smckusick int	esc_application_kpad();
68*53889Smckusick int	esc_line_size();
69*53889Smckusick int	esc_char_setr();
70*53889Smckusick int	esc_char_setl();
71*53889Smckusick int	esc_kanji_set();
72*53889Smckusick int	esc_parm_set();
73*53889Smckusick int	esc_pf_define();
74*53889Smckusick int	esc_ignore();
75*53889Smckusick 
76*53889Smckusick struct  esc_sequence esc_seq_table[] = {
77*53889Smckusick 	{'[', "ABCDfgHhJKLlMmnPr", esc_csi},
78*53889Smckusick 	{'7', "", esc_store_csr},
79*53889Smckusick 	{'8', "", esc_restore_csr},
80*53889Smckusick 	{'D', "", esc_index},
81*53889Smckusick 	{'E', "", esc_next_line},
82*53889Smckusick 	{'H', "", esc_tab_set},
83*53889Smckusick 	{'M', "", esc_rev_index},
84*53889Smckusick 	{'=', "", esc_application_kpad},
85*53889Smckusick 	{'>', "", esc_numeric_kpad},
86*53889Smckusick 	{'#', "34568", esc_line_size},
87*53889Smckusick 	{'(', "0ABJH", esc_char_setr},
88*53889Smckusick 	{')', "0AB", esc_char_setl},
89*53889Smckusick 	{'$', "B@", esc_kanji_set},
90*53889Smckusick 	{'~', "fcpsomdbDiGCBTtE", esc_parm_set},
91*53889Smckusick 	{'P', "pPZiI", esc_pf_define},
92*53889Smckusick 	{'\0', "", esc_ignore},
93*53889Smckusick };
94*53889Smckusick 
95*53889Smckusick struct	key_pad	key_pad[] = {
96*53889Smckusick 	{ '0', 'p' },	/*	0	*/
97*53889Smckusick 	{ '1', 'q' },	/*	1	*/
98*53889Smckusick 	{ '2', 'r' },	/*	2	*/
99*53889Smckusick 	{ '3', 's' },	/*	3	*/
100*53889Smckusick 	{ '4', 't' },	/*	4	*/
101*53889Smckusick 	{ '5', 'u' },	/*	5	*/
102*53889Smckusick 	{ '6', 'v' },	/*	6	*/
103*53889Smckusick 	{ '7', 'w' },	/*	7	*/
104*53889Smckusick 	{ '8', 'x' },	/*	8	*/
105*53889Smckusick 	{ '9', 'y' },	/*	9	*/
106*53889Smckusick 	{ '.', 'n' },	/*  period	*/
107*53889Smckusick 	{ '-', 'm' },	/*  minus	*/
108*53889Smckusick 	{ '+', 'k' },	/*  plus	*/
109*53889Smckusick 	{ ',', 'l' },	/*  comma	*/
110*53889Smckusick 	{ '\n', 'M' },	/*  enter	*/
111*53889Smckusick 	{ 'A', 'A' },	/*  cursor up	*/
112*53889Smckusick 	{ 'B', 'B' },	/*  cursor down	*/
113*53889Smckusick 	{ 'C', 'C' },	/*  cursor right */
114*53889Smckusick 	{ 'D', 'D' },	/*  cursor left	*/
115*53889Smckusick 	{ '\0', '\0' }	/*	*/
116*53889Smckusick };
117*53889Smckusick 
118*53889Smckusick static	char	esc_buf[ESC_BUF_SIZ];
119*53889Smckusick static	char	*esc_bp = esc_buf;
120*53889Smckusick extern	char	c_pos_mess[];
121*53889Smckusick 
122*53889Smckusick Key_string	key_str;
123*53889Smckusick Pfk_string	pfk_str;
124*53889Smckusick 
125*53889Smckusick unsigned  int	first_jcode;
126*53889Smckusick 
127*53889Smckusick /*
128*53889Smckusick  *  put out jis-code kanji
129*53889Smckusick  */
130*53889Smckusick jiskanji(sp, c)
131*53889Smckusick 	register SCREEN *sp;
132*53889Smckusick 	register unsigned int c;
133*53889Smckusick {
134*53889Smckusick 	if (first_jcode) {
135*53889Smckusick 		addch(sp, c | (first_jcode << 8));
136*53889Smckusick 		first_jcode = 0;
137*53889Smckusick 	} else {
138*53889Smckusick 		first_jcode = c;
139*53889Smckusick 	}
140*53889Smckusick }
141*53889Smckusick 
142*53889Smckusick /*
143*53889Smckusick  *  This routine is the command analiser using second character.
144*53889Smckusick  *  If a command has found then switch to particular escape handling
145*53889Smckusick  *  routine, and directly called by mother routine.
146*53889Smckusick  *  The arguments are passed through the routine.
147*53889Smckusick  */
148*53889Smckusick esc_top_level(sp, c)
149*53889Smckusick 	register SCREEN	*sp;
150*53889Smckusick 	char c;
151*53889Smckusick {
152*53889Smckusick 	register  struct  esc_sequence	*estp;
153*53889Smckusick 
154*53889Smckusick 	for (estp = esc_seq_table; estp->command ; estp++) {
155*53889Smckusick 		if (estp->command == c) {
156*53889Smckusick 					/* command found  */
157*53889Smckusick 			sp->s_estp = estp;
158*53889Smckusick 			if (*estp->terminators == '\0') {
159*53889Smckusick 				(*estp->esc_func)(sp);
160*53889Smckusick 				sp->s_current_stat &= ~ESCAPE;
161*53889Smckusick 			} else {
162*53889Smckusick 				sp->s_esc_handler = estp->esc_func;
163*53889Smckusick 			}
164*53889Smckusick 			return;
165*53889Smckusick 		}
166*53889Smckusick 	}
167*53889Smckusick 	sp->s_current_stat &= ~ESCAPE;
168*53889Smckusick }
169*53889Smckusick 
170*53889Smckusick /*
171*53889Smckusick  *  Undo the ESCAPE flag, escape buffer
172*53889Smckusick  *  and the esc_handler routine
173*53889Smckusick  *  This routine has to be called when escape sequence has started.
174*53889Smckusick  */
175*53889Smckusick recover(sp)
176*53889Smckusick 	register SCREEN *sp;
177*53889Smckusick {
178*53889Smckusick 	register int *ip = (int *) esc_buf;
179*53889Smckusick 	register int *sup = (int *) (esc_buf + ESC_BUF_SIZ);
180*53889Smckusick 
181*53889Smckusick 	sp->s_current_stat &= ~ESCAPE;
182*53889Smckusick 	sp->s_esc_handler = esc_top_level;
183*53889Smckusick 	while (ip < sup)
184*53889Smckusick 		*ip++ = 0;
185*53889Smckusick 	esc_bp = esc_buf;
186*53889Smckusick }
187*53889Smckusick 
188*53889Smckusick /*
189*53889Smckusick  *  This routine in_str(c, string) returns
190*53889Smckusick  *  if string contains c then TRUE (1) else FALSE (0)
191*53889Smckusick  */
192*53889Smckusick in_str(c, string)
193*53889Smckusick 	char c;
194*53889Smckusick 	register char *string;
195*53889Smckusick {
196*53889Smckusick 	while(*string)
197*53889Smckusick 		if (c == *string++)
198*53889Smckusick 			return(TRUE);
199*53889Smckusick 	return(FALSE);
200*53889Smckusick }
201*53889Smckusick 
202*53889Smckusick /*
203*53889Smckusick  *  Control sequence introducer (CSI)
204*53889Smckusick  *  Which begins `^[[' and terminates one of `ABCDfgHhJKLlMmPr'
205*53889Smckusick  */
206*53889Smckusick esc_csi(sp, c)
207*53889Smckusick 	register SCREEN *sp;
208*53889Smckusick 	unsigned int c;
209*53889Smckusick {
210*53889Smckusick 	static int bufc = 0;
211*53889Smckusick 
212*53889Smckusick 	if (in_str(c, sp->s_estp->terminators)) {
213*53889Smckusick 		esc_csi_ansi(sp, esc_bp, c);
214*53889Smckusick 		sp->s_current_stat &= ~ESCAPE;
215*53889Smckusick 		bufc = 0;
216*53889Smckusick 		return;
217*53889Smckusick 	}
218*53889Smckusick 	/*  buffering arguments  */
219*53889Smckusick 	if (bufc < ESC_BUF_SIZ) {
220*53889Smckusick 		if (c >= '0' && c <= '9') {
221*53889Smckusick 			*esc_bp = *esc_bp *10 + (c - '0');
222*53889Smckusick 		} else if (c == ';') {
223*53889Smckusick 			esc_bp++;
224*53889Smckusick 			bufc++;
225*53889Smckusick 		} else if (c == '?') {
226*53889Smckusick 			if (esc_bp == esc_buf) {
227*53889Smckusick 				sp->s_esc_handler = esc_csi_dec;
228*53889Smckusick 			} else {
229*53889Smckusick 				esc_buf[0] = INVALID;
230*53889Smckusick 			}
231*53889Smckusick 		} else {
232*53889Smckusick 			sp->s_current_stat &= ~ESCAPE;
233*53889Smckusick 			bufc = 0;
234*53889Smckusick 		}
235*53889Smckusick 	}
236*53889Smckusick }
237*53889Smckusick 
238*53889Smckusick #ifdef IPC_MRX
239*53889Smckusick #define SCC_KEYBOARD	0
240*53889Smckusick #endif
241*53889Smckusick 
242*53889Smckusick /*
243*53889Smckusick  *  Ansi standard csi handler
244*53889Smckusick  */
245*53889Smckusick esc_csi_ansi(sp, esc_bp, terminator)
246*53889Smckusick 	register SCREEN *sp;
247*53889Smckusick 	char *esc_bp;
248*53889Smckusick 	char terminator;
249*53889Smckusick {
250*53889Smckusick 	register char *cp = esc_buf;
251*53889Smckusick 	register struct cursor *spc = &sp->s_csr;
252*53889Smckusick 	register char *p;
253*53889Smckusick 	register int i;
254*53889Smckusick 
255*53889Smckusick 	if (*cp == INVALID)
256*53889Smckusick 		return;
257*53889Smckusick 
258*53889Smckusick 	cursor_off();
259*53889Smckusick 	switch (terminator) {
260*53889Smckusick 	case 'A':		/*  CUU	 */
261*53889Smckusick 		if (spc->csr_y < sp->s_region.top_margin) {
262*53889Smckusick 			spc->csr_y = MAX(spc->csr_y - MAX(*cp, 1)
263*53889Smckusick 					,TOP_M);
264*53889Smckusick 		} else {
265*53889Smckusick 			spc->csr_y = MAX(spc->csr_y - MAX(*cp, 1)
266*53889Smckusick 					,sp->s_region.top_margin);
267*53889Smckusick 		}
268*53889Smckusick 		spc->csr_p.y = (spc->csr_y - 1) * char_h + y_ofst;
269*53889Smckusick 		sp->s_current_stat &= ~WRAP;
270*53889Smckusick 		break;
271*53889Smckusick 	case 'B':		/*  CUD	 */
272*53889Smckusick 		if (spc->csr_y > sp->s_region.btm_margin) {
273*53889Smckusick 			spc->csr_y = MIN(spc->csr_y + MAX(*cp, 1)
274*53889Smckusick 					,btm_m);
275*53889Smckusick 		} else {
276*53889Smckusick 			spc->csr_y = MIN(spc->csr_y + MAX(*cp, 1)
277*53889Smckusick 					,sp->s_region.btm_margin);
278*53889Smckusick 		}
279*53889Smckusick 		spc->csr_p.y = (spc->csr_y - 1) * char_h + y_ofst;
280*53889Smckusick 		sp->s_current_stat &= ~WRAP;
281*53889Smckusick 		break;
282*53889Smckusick 	case 'C':		/*  CUF	 */
283*53889Smckusick 		spc->csr_x = MIN(spc->csr_x + MAX(*cp, 1), rit_m);
284*53889Smckusick 		spc->csr_p.x = (spc->csr_x - 1) * char_w + x_ofst;
285*53889Smckusick 		sp->s_current_stat &= ~WRAP;
286*53889Smckusick 		break;
287*53889Smckusick 	case 'D':		/*  CUB	 */
288*53889Smckusick 		spc->csr_x = MAX(spc->csr_x - MAX(*cp, 1), LFT_M);
289*53889Smckusick 		spc->csr_p.x = (spc->csr_x - 1) * char_w + x_ofst;
290*53889Smckusick 		sp->s_current_stat &= ~WRAP;
291*53889Smckusick 		break;
292*53889Smckusick 	case 'g':		/*  TBC	 */
293*53889Smckusick 		switch (*cp) {
294*53889Smckusick 		case 0:
295*53889Smckusick 			sp->s_tab_pos[spc->csr_x] = 0;
296*53889Smckusick 			break;
297*53889Smckusick 		case 3:
298*53889Smckusick 			for (i = 0; i <= rit_m; i++)
299*53889Smckusick 				sp->s_tab_pos[i] = 0;
300*53889Smckusick 			break;
301*53889Smckusick 		default:
302*53889Smckusick 			break;
303*53889Smckusick 		}
304*53889Smckusick 		break;
305*53889Smckusick 	case 'f':		/*  HVP	 */
306*53889Smckusick 	case 'H':		/*  CUP  same as HVP	*/
307*53889Smckusick 		csr_pos(sp, cp[1], cp[0]);
308*53889Smckusick 		sp->s_current_stat &= ~WRAP;
309*53889Smckusick 		break;
310*53889Smckusick 	case 'J':		/*  ED	*/
311*53889Smckusick 		erase_disp(sp, cp[0]);
312*53889Smckusick 		sp->s_current_stat &= ~WRAP;
313*53889Smckusick 		break;
314*53889Smckusick 	case 'K':		/*  EL	*/
315*53889Smckusick 		erase_line(sp, cp[0]);
316*53889Smckusick 		sp->s_current_stat &= ~WRAP;
317*53889Smckusick 		break;
318*53889Smckusick 	case 'L':		/*  IL	*/
319*53889Smckusick 		insert_line(sp, cp[0]);
320*53889Smckusick 		break;
321*53889Smckusick 	case 'M':		/*  DL	*/
322*53889Smckusick 		delete_line(sp, cp[0]);
323*53889Smckusick 		break;
324*53889Smckusick 	case 'P':		/*  DCH	 */
325*53889Smckusick 		delete_char(sp, cp[0]);
326*53889Smckusick 		sp->s_current_stat &= ~WRAP;
327*53889Smckusick 		break;
328*53889Smckusick 	case 'r':		/*  DECSTBM	*/
329*53889Smckusick 		cp[2] = MAX(cp[0] == 0 ? TOP_M: cp[0], TOP_M);
330*53889Smckusick 		cp[3] = MIN(cp[1] == 0 ? btm_m: cp[1], btm_m);
331*53889Smckusick 		if (cp[2] >= cp[3])
332*53889Smckusick 			break;
333*53889Smckusick 
334*53889Smckusick 		sp->s_region.top_margin = cp[2];
335*53889Smckusick 		sp->s_region.btm_margin = cp[3];
336*53889Smckusick 
337*53889Smckusick 		spc->csr_x = LFT_M;
338*53889Smckusick 		spc->csr_p.x = x_ofst;
339*53889Smckusick 		if (sp->s_term_mode & DECOM) {
340*53889Smckusick 			spc->csr_y = sp->s_region.top_margin;
341*53889Smckusick 			spc->csr_p.y = (spc->csr_y - 1) * char_h + y_ofst;
342*53889Smckusick 		} else {
343*53889Smckusick 			spc->csr_y = TOP_M;
344*53889Smckusick 			spc->csr_p.y = y_ofst;
345*53889Smckusick 		}
346*53889Smckusick 		break;
347*53889Smckusick 	case 'm':		/*  CRA	 */
348*53889Smckusick 		while (cp <= esc_bp) {
349*53889Smckusick 			switch (*cp++) {
350*53889Smckusick 			case 0:
351*53889Smckusick 				spc->csr_attributes &= NORMALM;
352*53889Smckusick 				if (sp->s_term_mode & DECSCNM) {
353*53889Smckusick 					fcolor = sp->s_bgcol;
354*53889Smckusick 					bcolor = sp->s_plane;
355*53889Smckusick 				}
356*53889Smckusick 				else {
357*53889Smckusick 					fcolor = sp->s_plane;
358*53889Smckusick 					bcolor = sp->s_bgcol;
359*53889Smckusick 				}
360*53889Smckusick 				break;
361*53889Smckusick 			case 1:		/*  bold	*/
362*53889Smckusick 				spc->csr_attributes |= BOLD;
363*53889Smckusick 				break;
364*53889Smckusick 			case 4:		/*  under score	 */
365*53889Smckusick 				spc->csr_attributes |= USCORE;
366*53889Smckusick 				break;
367*53889Smckusick 			case 5:		/*  blinking	*/
368*53889Smckusick 				spc->csr_attributes |= BLINK;
369*53889Smckusick 				break;
370*53889Smckusick 			case 7:		/*  reverse	*/
371*53889Smckusick 				spc->csr_attributes |= REVERSE;
372*53889Smckusick 				if (sp->s_term_mode & DECSCNM) {
373*53889Smckusick 					fcolor = sp->s_plane;
374*53889Smckusick 					bcolor = sp->s_bgcol;
375*53889Smckusick 				}
376*53889Smckusick 				else {
377*53889Smckusick 					fcolor = sp->s_bgcol;
378*53889Smckusick 					bcolor = sp->s_plane;
379*53889Smckusick 				}
380*53889Smckusick 				break;
381*53889Smckusick 			case 22:	/*  unbold	*/
382*53889Smckusick 				spc->csr_attributes &= ~BOLD;
383*53889Smckusick 				break;
384*53889Smckusick 			case 24:	/*  no under score	*/
385*53889Smckusick 				spc->csr_attributes &= ~USCORE;
386*53889Smckusick 				break;
387*53889Smckusick 			case 25:	/*  no blinking	 */
388*53889Smckusick 				spc->csr_attributes &= ~BLINK;
389*53889Smckusick 				break;
390*53889Smckusick 			case 27:	/*  re-reverse	*/
391*53889Smckusick 				spc->csr_attributes &= ~REVERSE;
392*53889Smckusick 				if (sp->s_term_mode & DECSCNM) {
393*53889Smckusick 					fcolor = sp->s_bgcol;
394*53889Smckusick 					bcolor = sp->s_plane;
395*53889Smckusick 				}
396*53889Smckusick 				else {
397*53889Smckusick 					fcolor = sp->s_plane;
398*53889Smckusick 					bcolor = sp->s_bgcol;
399*53889Smckusick 				}
400*53889Smckusick 				break;
401*53889Smckusick 			default:
402*53889Smckusick 				break;
403*53889Smckusick 			}
404*53889Smckusick 		}
405*53889Smckusick 		break;
406*53889Smckusick 	case 'n':
407*53889Smckusick 		while (cp <= esc_bp) {	/*  DSR(status request)	*/
408*53889Smckusick 			switch (*cp++) {
409*53889Smckusick 			case 6:		/*  inquiry cursor position	*/
410*53889Smckusick 				key_str.key_string = c_pos_mess;
411*53889Smckusick 				key_str.key_length = spr(c_pos_mess,
412*53889Smckusick 				    "\033[%d;%dR", (sp->s_term_mode & DECOM) ?
413*53889Smckusick 				    spc->csr_y - sp->s_region.top_margin + 1:
414*53889Smckusick 				    spc->csr_y, spc->csr_x);
415*53889Smckusick 				kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str);
416*53889Smckusick 				break;
417*53889Smckusick 			default:
418*53889Smckusick 				break;
419*53889Smckusick 			}
420*53889Smckusick 		}
421*53889Smckusick 		break;
422*53889Smckusick 	case 'h':		/*  SM	*/
423*53889Smckusick 		while (cp <= esc_bp) {
424*53889Smckusick 			switch (*cp++) {
425*53889Smckusick 			case 2:		/*  Keyboard Action	*/
426*53889Smckusick 				sp->s_term_mode |= KAM;
427*53889Smckusick 				break;
428*53889Smckusick 			case 4:		/*  Insert Replace	*/
429*53889Smckusick 				sp->s_term_mode |= IRM;
430*53889Smckusick 				break;
431*53889Smckusick 			case 12:	/*  Local echo disable	*/
432*53889Smckusick 				sp->s_term_mode |= SRM;
433*53889Smckusick 				break;
434*53889Smckusick 			case 20:	/*  Linefeed newline	*/
435*53889Smckusick 				sp->s_term_mode |= LNM;
436*53889Smckusick 				break;
437*53889Smckusick 			default:
438*53889Smckusick 				break;
439*53889Smckusick 			}
440*53889Smckusick 		}
441*53889Smckusick 		break;
442*53889Smckusick 	case 'l':		/*  RM	*/
443*53889Smckusick 		while (cp <= esc_bp) {
444*53889Smckusick 			switch (*cp++) {
445*53889Smckusick 			case 2:		/*  Keyboard Action	*/
446*53889Smckusick 				sp->s_term_mode &= ~KAM;
447*53889Smckusick 				break;
448*53889Smckusick 			case 4:		/*  Insert Replace	*/
449*53889Smckusick 				sp->s_term_mode &= ~IRM;
450*53889Smckusick 				break;
451*53889Smckusick 			case 12:	/*  Local echo disable	*/
452*53889Smckusick 				sp->s_term_mode &= ~SRM;
453*53889Smckusick 				break;
454*53889Smckusick 			case 20:	/*  Linefeed newline	*/
455*53889Smckusick 				sp->s_term_mode &= ~LNM;
456*53889Smckusick 				break;
457*53889Smckusick 			default:
458*53889Smckusick 				break;
459*53889Smckusick 			}
460*53889Smckusick 		}
461*53889Smckusick 		break;
462*53889Smckusick 	default:
463*53889Smckusick 		break;
464*53889Smckusick 	}
465*53889Smckusick 	cursor_on(&spc->csr_p);
466*53889Smckusick 	sp->s_current_stat &= ~ESCAPE;
467*53889Smckusick }
468*53889Smckusick 
469*53889Smckusick 
470*53889Smckusick /*
471*53889Smckusick  *  Cursor position.
472*53889Smckusick  *  csr_pos(sp, x, y) moves the cursor to (x, y).
473*53889Smckusick  */
474*53889Smckusick csr_pos(sp, x, y)
475*53889Smckusick 	register SCREEN *sp;
476*53889Smckusick 	register int x, y;
477*53889Smckusick {
478*53889Smckusick 	if (sp->s_term_mode & DECOM) {
479*53889Smckusick 		sp->s_csr.csr_y = MIN(sp->s_region.top_margin +
480*53889Smckusick 				MAX(y, 1) - 1, sp->s_region.btm_margin);
481*53889Smckusick 	} else {
482*53889Smckusick 		sp->s_csr.csr_y = MIN(TOP_M + MAX(y, 1) - 1, btm_m);
483*53889Smckusick 	}
484*53889Smckusick 	sp->s_csr.csr_x = MAX(MIN(x, rit_m), LFT_M);
485*53889Smckusick 	sp->s_csr.csr_p.x = (sp->s_csr.csr_x -1) * char_w + x_ofst;
486*53889Smckusick 	sp->s_csr.csr_p.y = (sp->s_csr.csr_y -1) * char_h + y_ofst;
487*53889Smckusick }
488*53889Smckusick 
489*53889Smckusick 
490*53889Smckusick /*
491*53889Smckusick  *  Erase in display.
492*53889Smckusick  *  erase_disp(sp, pn) erases display from the cursor to the end, from
493*53889Smckusick  *  the beginning to the cursor or completely according to pn = 0, 1 or 2
494*53889Smckusick  *  respectively.
495*53889Smckusick  */
496*53889Smckusick erase_disp(sp, pn)
497*53889Smckusick 	register SCREEN *sp;
498*53889Smckusick 	register int pn;
499*53889Smckusick {
500*53889Smckusick 	register  struct  cursor  *spc = &sp->s_csr;
501*53889Smckusick 
502*53889Smckusick 	switch (pn) {
503*53889Smckusick 	case 0:		/*  cursor to end	*/
504*53889Smckusick 		erase_line(sp, 0);
505*53889Smckusick 		clear_lines(MIN(spc->csr_y + 1, btm_m),
506*53889Smckusick 			btm_m - spc->csr_y, sp->s_term_mode & DECSCNM,
507*53889Smckusick 			sp->s_plane, sp->s_bgcol);
508*53889Smckusick 		break;
509*53889Smckusick 	case 1:		/*  beginning to cursor	*/
510*53889Smckusick 		erase_line(sp, 1);
511*53889Smckusick 		clear_lines(TOP_M, spc->csr_y - TOP_M, sp->s_term_mode & DECSCNM,
512*53889Smckusick 			sp->s_plane, sp->s_bgcol);
513*53889Smckusick 		break;
514*53889Smckusick 	case 2:		/*  whole	*/
515*53889Smckusick 		clear_lines(TOP_M, btm_m - TOP_M + 1,
516*53889Smckusick 			sp->s_term_mode & DECSCNM,
517*53889Smckusick 			sp->s_plane, sp->s_bgcol);
518*53889Smckusick 		break;
519*53889Smckusick 	default:
520*53889Smckusick 		break;
521*53889Smckusick 	}
522*53889Smckusick }
523*53889Smckusick 
524*53889Smckusick 
525*53889Smckusick 
526*53889Smckusick /*
527*53889Smckusick  *  Erase in line.
528*53889Smckusick  *  erase_line(sp, pn) erases line from the cursor to the end, from the
529*53889Smckusick  *  beginning to the cursor or completely according to pn = 0, 1 or 2
530*53889Smckusick  *  respectively.
531*53889Smckusick  */
532*53889Smckusick erase_line(sp, pn)
533*53889Smckusick 	register SCREEN *sp;
534*53889Smckusick 	register int pn;
535*53889Smckusick {
536*53889Smckusick 	register struct cursor *spc = &sp->s_csr;
537*53889Smckusick 
538*53889Smckusick 	switch(pn) {
539*53889Smckusick 	case 0:
540*53889Smckusick 		clear_chars(spc->csr_x, spc->csr_y,
541*53889Smckusick 			rit_m - spc->csr_x + 1, sp->s_term_mode & DECSCNM,
542*53889Smckusick 			sp->s_plane, sp->s_bgcol);
543*53889Smckusick 		break;
544*53889Smckusick 	case 1:
545*53889Smckusick 		clear_chars(LFT_M, spc->csr_y,
546*53889Smckusick 			spc->csr_x - LFT_M + 1, sp->s_term_mode & DECSCNM,
547*53889Smckusick 			sp->s_plane, sp->s_bgcol);
548*53889Smckusick 		break;
549*53889Smckusick 	case 2:
550*53889Smckusick 		clear_lines(spc->csr_y, 1, sp->s_term_mode & DECSCNM,
551*53889Smckusick 			sp->s_plane, sp->s_bgcol);
552*53889Smckusick 		break;
553*53889Smckusick 	default:
554*53889Smckusick 		break;
555*53889Smckusick 	}
556*53889Smckusick }
557*53889Smckusick 
558*53889Smckusick /*
559*53889Smckusick  *  Insert line.
560*53889Smckusick  *  insert_line(sp, pn) inserts pn lines in scroll region
561*53889Smckusick  */
562*53889Smckusick insert_line(sp, pn)
563*53889Smckusick 	register SCREEN *sp;
564*53889Smckusick 	register int pn;
565*53889Smckusick {
566*53889Smckusick 	register struct cursor *spc = &sp->s_csr;
567*53889Smckusick 	register struct region *spr = &sp->s_region;
568*53889Smckusick 
569*53889Smckusick 	pn = MAX(pn, 1);
570*53889Smckusick 	if (spc->csr_y < spr->top_margin || spc->csr_y > spr->btm_margin)
571*53889Smckusick 		return;
572*53889Smckusick 	if (pn <= spr->btm_margin - spc->csr_y) {
573*53889Smckusick 		move_lines(spc->csr_y, spr->btm_margin - pn - spc->csr_y + 1,
574*53889Smckusick 			spc->csr_y + pn);
575*53889Smckusick 	}
576*53889Smckusick 	clear_lines(spc->csr_y,
577*53889Smckusick 		MIN(spc->csr_y + pn - 1, spr->btm_margin) - spc->csr_y + 1,
578*53889Smckusick 		sp->s_term_mode & DECSCNM, sp->s_plane, sp->s_bgcol);
579*53889Smckusick 	spc->csr_x = LFT_M;
580*53889Smckusick 	spc->csr_p.x = x_ofst;
581*53889Smckusick }
582*53889Smckusick 
583*53889Smckusick /*
584*53889Smckusick  *  Delete line.
585*53889Smckusick  *  delete_line(sp, pn) deletes pn lines in scroll region
586*53889Smckusick  */
587*53889Smckusick delete_line(sp, pn)
588*53889Smckusick 	register SCREEN *sp;
589*53889Smckusick 	register int pn;
590*53889Smckusick {
591*53889Smckusick 	register struct cursor *spc = &sp->s_csr;
592*53889Smckusick 	register struct region *spr = &sp->s_region;
593*53889Smckusick 	register int aux;
594*53889Smckusick 
595*53889Smckusick 	pn = MAX(pn, 1);
596*53889Smckusick 	if (spc->csr_y < spr->top_margin || spc->csr_y > spr->btm_margin)
597*53889Smckusick 		return;
598*53889Smckusick 	if (pn <= spr->btm_margin - spc->csr_y) {
599*53889Smckusick 		aux = spc->csr_y + pn;
600*53889Smckusick 		move_lines(aux, spr->btm_margin - aux + 1, spc->csr_y);
601*53889Smckusick 	}
602*53889Smckusick 	aux = MAX(spr->btm_margin - pn + 1, spc->csr_y);
603*53889Smckusick 	clear_lines(aux, spr->btm_margin - aux + 1, sp->s_term_mode & DECSCNM,
604*53889Smckusick 		sp->s_plane, sp->s_bgcol);
605*53889Smckusick 	spc->csr_x = LFT_M;
606*53889Smckusick 	spc->csr_p.x = x_ofst;
607*53889Smckusick }
608*53889Smckusick 
609*53889Smckusick /*
610*53889Smckusick  *  Delete character.
611*53889Smckusick  *  delete_char(sp, pn) deletes pn characters right side of the cursor.
612*53889Smckusick  */
613*53889Smckusick delete_char(sp, pn)
614*53889Smckusick 	register SCREEN *sp;
615*53889Smckusick 	register int pn;
616*53889Smckusick {
617*53889Smckusick 	register struct cursor *spc = &sp->s_csr;
618*53889Smckusick 	register int aux;
619*53889Smckusick 
620*53889Smckusick 	pn = MAX(pn, 1);
621*53889Smckusick 	if (pn < rit_m - spc->csr_x + 1) {
622*53889Smckusick 		move_chars(spc->csr_x + pn, spc->csr_y,
623*53889Smckusick 			rit_m - spc->csr_x - pn + 1 ,spc->csr_x);
624*53889Smckusick 	}
625*53889Smckusick 	aux = MAX(rit_m - pn + 1, spc->csr_x);
626*53889Smckusick 	clear_chars(aux, spc->csr_y, rit_m - aux + 1,
627*53889Smckusick 		sp->s_term_mode & DECSCNM, sp->s_plane, sp->s_bgcol);
628*53889Smckusick }
629*53889Smckusick 
630*53889Smckusick /*
631*53889Smckusick  *  This escape control sequence begins `^[[?' and ends `h' or `l'
632*53889Smckusick  */
633*53889Smckusick esc_csi_dec(sp, c)
634*53889Smckusick 	register SCREEN *sp;
635*53889Smckusick 	char c;
636*53889Smckusick {
637*53889Smckusick 	register char *cp;
638*53889Smckusick 
639*53889Smckusick 	if (in_str(c, sp->s_estp->terminators)) {
640*53889Smckusick 		if (esc_buf[0] != INVALID) {
641*53889Smckusick 			cursor_off();
642*53889Smckusick 			switch (c) {
643*53889Smckusick 			case 'h':	/*  set mode	*/
644*53889Smckusick 			for (cp = esc_buf; cp <= esc_bp; cp++) {
645*53889Smckusick 				switch (*cp) {
646*53889Smckusick 				case 1:		/*  cursor key application  */
647*53889Smckusick 					sp->s_term_mode |= DECCKM;
648*53889Smckusick 					change_csr_key_pad(APPLIC);
649*53889Smckusick 					break;
650*53889Smckusick 				case 3:		/*  132 column mode	*/
651*53889Smckusick 					sp->s_term_mode |= DECCOLM;
652*53889Smckusick 					break;
653*53889Smckusick 				case 4:		/*  jump scroll	*/
654*53889Smckusick 					sp->s_term_mode |= DECSCLM;
655*53889Smckusick 					break;
656*53889Smckusick 				case 5:		/*  reverse	*/
657*53889Smckusick 					if ((sp->s_term_mode & DECSCNM) == 0)
658*53889Smckusick 						reverse_rec(sp->s_bgcol,
659*53889Smckusick 							sp->s_plane);
660*53889Smckusick 					sp->s_term_mode |= DECSCNM;
661*53889Smckusick 					if (sp->s_csr.csr_attributes & REVERSE)
662*53889Smckusick 					{
663*53889Smckusick 						fcolor = sp->s_plane;
664*53889Smckusick 						bcolor = sp->s_bgcol;
665*53889Smckusick 					} else {
666*53889Smckusick 						fcolor = sp->s_bgcol;
667*53889Smckusick 						bcolor = sp->s_plane;
668*53889Smckusick 					}
669*53889Smckusick 					break;
670*53889Smckusick 				case 6:		/*  origin	*/
671*53889Smckusick 					sp->s_term_mode |= DECOM;
672*53889Smckusick 					sp->s_csr.csr_x = LFT_M;
673*53889Smckusick 					sp->s_csr.csr_y =
674*53889Smckusick 						sp->s_region.top_margin;
675*53889Smckusick 					sp->s_csr.csr_p.x = x_ofst;
676*53889Smckusick 					sp->s_csr.csr_p.y =
677*53889Smckusick 					   (sp->s_csr.csr_y - 1) * char_h +
678*53889Smckusick 						y_ofst;
679*53889Smckusick 					break;
680*53889Smckusick 				case 7:		/*  auto wrap	*/
681*53889Smckusick 					sp->s_term_mode |= DECAWM;
682*53889Smckusick 					break;
683*53889Smckusick 				case 8:		/*  auto repeat	 */
684*53889Smckusick 					if ((sp->s_term_mode & DECARM) == 0) {
685*53889Smckusick 						kbd_ioctl(SCC_KEYBOARD, KIOCREPT,
686*53889Smckusick 							  (int *)0);
687*53889Smckusick 					}
688*53889Smckusick 					sp->s_term_mode |= DECARM;
689*53889Smckusick 					break;
690*53889Smckusick 				case 25:	/* cursor active */
691*53889Smckusick 					sp->s_term_mode |= DECCSR_ACTV;
692*53889Smckusick 					break;
693*53889Smckusick 				default:
694*53889Smckusick 					break;
695*53889Smckusick 				}
696*53889Smckusick 			}
697*53889Smckusick 			break;
698*53889Smckusick 			case 'l':	/*  reset mode	*/
699*53889Smckusick 			for (cp = esc_buf; cp <= esc_bp; cp++) {
700*53889Smckusick 				switch (*cp) {
701*53889Smckusick 				case 1:		/*  cursor key application  */
702*53889Smckusick 					sp->s_term_mode &= ~DECCKM;
703*53889Smckusick 					change_csr_key_pad(NUMERIC);
704*53889Smckusick 					break;
705*53889Smckusick 				case 3:		/*  132 column mode	*/
706*53889Smckusick 					sp->s_term_mode &= ~DECCOLM;
707*53889Smckusick 					break;
708*53889Smckusick 				case 4:		/*  jump scroll	*/
709*53889Smckusick 					sp->s_term_mode &= ~DECSCLM;
710*53889Smckusick 					break;
711*53889Smckusick 				case 5:		/*  reverse	*/
712*53889Smckusick 					if (sp->s_term_mode & DECSCNM)
713*53889Smckusick 						reverse_rec(sp->s_plane,
714*53889Smckusick 							sp->s_bgcol);
715*53889Smckusick 					sp->s_term_mode &= ~DECSCNM;
716*53889Smckusick 					if (sp->s_csr.csr_attributes & REVERSE)
717*53889Smckusick 					{
718*53889Smckusick 						fcolor = sp->s_bgcol;
719*53889Smckusick 						bcolor = sp->s_plane;
720*53889Smckusick 					} else {
721*53889Smckusick 						fcolor = sp->s_plane;
722*53889Smckusick 						bcolor = sp->s_bgcol;
723*53889Smckusick 					}
724*53889Smckusick 					break;
725*53889Smckusick 				case 6:		/*  origin	*/
726*53889Smckusick 					sp->s_term_mode &= ~DECOM;
727*53889Smckusick 					sp->s_csr.csr_x = LFT_M;
728*53889Smckusick 					sp->s_csr.csr_y = TOP_M;
729*53889Smckusick 					sp->s_csr.csr_p.x = x_ofst;
730*53889Smckusick 					sp->s_csr.csr_p.y = y_ofst;
731*53889Smckusick 					break;
732*53889Smckusick 				case 7:		/*  auto wrap	*/
733*53889Smckusick 					sp->s_term_mode &= ~DECAWM;
734*53889Smckusick 					break;
735*53889Smckusick 				case 8:		/*  auto repeat	 */
736*53889Smckusick 					if (sp->s_term_mode & DECARM) {
737*53889Smckusick 						kbd_ioctl(SCC_KEYBOARD, KIOCNRPT,
738*53889Smckusick 							(int *) 0);
739*53889Smckusick 					}
740*53889Smckusick 					sp->s_term_mode &= ~DECARM;
741*53889Smckusick 					break;
742*53889Smckusick 				case 25:	/* cursor non-active */
743*53889Smckusick 					sp->s_term_mode &= ~DECCSR_ACTV;
744*53889Smckusick 					break;
745*53889Smckusick 				default:
746*53889Smckusick 					break;
747*53889Smckusick 				}
748*53889Smckusick 			}
749*53889Smckusick 			break;
750*53889Smckusick 			default:
751*53889Smckusick 				break;
752*53889Smckusick 			}
753*53889Smckusick 			cursor_on(&sp->s_csr.csr_p);
754*53889Smckusick 		}
755*53889Smckusick 		sp->s_current_stat &= ~ESCAPE;
756*53889Smckusick 	} else {	/*  buffering  arguments	*/
757*53889Smckusick 		if (c >= '0' && c <= '9') {
758*53889Smckusick 			*esc_bp = *esc_bp * 10 + (c - '0');
759*53889Smckusick 		} else if (c == ';') {
760*53889Smckusick 			esc_bp++;
761*53889Smckusick 		} else if (c == '?') {
762*53889Smckusick 			esc_buf[0] = INVALID;
763*53889Smckusick 		} else {
764*53889Smckusick 			sp->s_current_stat &= ~ESCAPE;
765*53889Smckusick 		}
766*53889Smckusick 	}
767*53889Smckusick }
768*53889Smckusick 
769*53889Smckusick /*
770*53889Smckusick  *  changes cursor key pad to ansi_ctl
771*53889Smckusick  */
772*53889Smckusick static
773*53889Smckusick change_csr_key_pad(applic)
774*53889Smckusick 	register int applic;
775*53889Smckusick {
776*53889Smckusick 	char pad[4];
777*53889Smckusick 	register Pfk_string *pfk = &pfk_str;
778*53889Smckusick 	register Key_string *kys = &pfk_str.pfk_string;
779*53889Smckusick 	register struct key_pad  *kpd;
780*53889Smckusick 	register int i;
781*53889Smckusick 
782*53889Smckusick 	kpd = &key_pad[UP-N0];
783*53889Smckusick 	pad[0] = '\033';
784*53889Smckusick 	pad[1] = (applic) ? 'O': '[';
785*53889Smckusick 	for (i = UP; i <= LEFT; i++) {
786*53889Smckusick 		pfk->pfk_num = i;
787*53889Smckusick 		kys->key_length = (applic) ? 3: 3;
788*53889Smckusick 		pad[2] = (applic) ? kpd->kpd_applic: kpd->kpd_numeric;
789*53889Smckusick 		kys->key_string = pad;
790*53889Smckusick 		kpd++;
791*53889Smckusick 		pfk->pfk_shift = PF_NORMAL;
792*53889Smckusick 		kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk);
793*53889Smckusick 		pfk->pfk_shift = PF_SHIFT;
794*53889Smckusick 		kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk);
795*53889Smckusick 	}
796*53889Smckusick }
797*53889Smckusick 
798*53889Smckusick extern struct cursor inner_buf_csr;
799*53889Smckusick extern int inner_buf_tstat;
800*53889Smckusick /*
801*53889Smckusick  *  Store cursor position and attributes.
802*53889Smckusick  *  The SCREEN structure is stored inner structure.
803*53889Smckusick  */
804*53889Smckusick esc_store_csr(sp)
805*53889Smckusick 	register SCREEN *sp;
806*53889Smckusick {
807*53889Smckusick 	inner_buf_csr = sp->s_csr;
808*53889Smckusick 	inner_buf_tstat = (DECOM|DECAWM) & sp->s_term_mode;
809*53889Smckusick }
810*53889Smckusick 
811*53889Smckusick /*
812*53889Smckusick  *  Restore cursor position and attributes.
813*53889Smckusick  *  The SCREEN structure  is restored from inner structure.
814*53889Smckusick  *  Prevail error from unexpected use of this command, inner structure
815*53889Smckusick  *  must be initialized.
816*53889Smckusick  */
817*53889Smckusick esc_restore_csr(sp)
818*53889Smckusick 	register SCREEN *sp;
819*53889Smckusick {
820*53889Smckusick 	cursor_off();
821*53889Smckusick 	sp->s_csr = inner_buf_csr;
822*53889Smckusick 	sp->s_term_mode = (sp->s_term_mode & ~(DECOM|DECAWM)) | inner_buf_tstat;
823*53889Smckusick 	cursor_on(&sp->s_csr.csr_p);
824*53889Smckusick }
825*53889Smckusick 
826*53889Smckusick /*
827*53889Smckusick  *  index()
828*53889Smckusick  *  esc_index(sp) moves the cursor down if the cursor is not at
829*53889Smckusick  *  bottom margin. If the cursor is at the bottom margin then
830*53889Smckusick  *  scroll up.
831*53889Smckusick  */
832*53889Smckusick esc_index(sp)
833*53889Smckusick 	register SCREEN *sp;
834*53889Smckusick {
835*53889Smckusick 	cursor_off();
836*53889Smckusick 	if (sp->s_csr.csr_y == sp->s_region.btm_margin)
837*53889Smckusick 		scroll_up(sp->s_region.top_margin,
838*53889Smckusick 			sp->s_region.btm_margin, sp->s_term_mode & DECSCNM,
839*53889Smckusick 			sp->s_plane, sp->s_bgcol);
840*53889Smckusick 	else {
841*53889Smckusick 		if (sp->s_csr.csr_y < btm_m) {
842*53889Smckusick 			sp->s_csr.csr_y += 1;
843*53889Smckusick 			sp->s_csr.csr_p.y += char_h;
844*53889Smckusick 		}
845*53889Smckusick 	}
846*53889Smckusick 	sp->s_current_stat &= ~WRAP;
847*53889Smckusick 	cursor_on(&sp->s_csr.csr_p);
848*53889Smckusick }
849*53889Smckusick 
850*53889Smckusick /*
851*53889Smckusick  *  next line
852*53889Smckusick  *  esc_next_line(sp) moves the cursor down like index but the cursor
853*53889Smckusick  *  position is the beginning of the next line.
854*53889Smckusick  */
855*53889Smckusick esc_next_line(sp)
856*53889Smckusick 	register SCREEN *sp;
857*53889Smckusick {
858*53889Smckusick 	sp->s_csr.csr_x = LFT_M;
859*53889Smckusick 	sp->s_csr.csr_p.x = x_ofst;
860*53889Smckusick 	esc_index(sp);
861*53889Smckusick }
862*53889Smckusick 
863*53889Smckusick /*
864*53889Smckusick  *  tabulation set
865*53889Smckusick  *  esc_tab_set(sp) sets tabulation stop at the current cursor point.
866*53889Smckusick  */
867*53889Smckusick esc_tab_set(sp)
868*53889Smckusick 	register SCREEN *sp;
869*53889Smckusick {
870*53889Smckusick 	sp->s_tab_pos[sp->s_csr.csr_x] = 1;
871*53889Smckusick }
872*53889Smckusick 
873*53889Smckusick /*
874*53889Smckusick  *  reverse index
875*53889Smckusick  *  esc_rev_index(sp) moves the cursor up if the cursor is not at the top
876*53889Smckusick  *  margin. If the cursor is at the top margin then the screen takes place
877*53889Smckusick  *  scroll down.
878*53889Smckusick  */
879*53889Smckusick esc_rev_index(sp)
880*53889Smckusick 	register SCREEN *sp;
881*53889Smckusick {
882*53889Smckusick 	cursor_off();
883*53889Smckusick 	if (sp->s_csr.csr_y == sp->s_region.top_margin)
884*53889Smckusick 		scroll_down(sp->s_region.top_margin,
885*53889Smckusick 			sp->s_region.btm_margin, sp->s_term_mode & DECSCNM,
886*53889Smckusick 			sp->s_plane, sp->s_bgcol);
887*53889Smckusick 	else {
888*53889Smckusick 		if (sp->s_csr.csr_y > TOP_M) {
889*53889Smckusick 			sp->s_csr.csr_y -= 1;
890*53889Smckusick 			sp->s_csr.csr_p.y -= char_h;
891*53889Smckusick 		}
892*53889Smckusick 	}
893*53889Smckusick 	sp->s_current_stat &= ~WRAP;
894*53889Smckusick 	cursor_on(&sp->s_csr.csr_p);
895*53889Smckusick }
896*53889Smckusick 
897*53889Smckusick /*
898*53889Smckusick  *  numeric key pad
899*53889Smckusick  *  esc_numeric_kpad(sp) changes key pad of cursor to numeric one.
900*53889Smckusick  *  This sequence is used in vi.
901*53889Smckusick  *  currently not supported
902*53889Smckusick  */
903*53889Smckusick esc_numeric_kpad(sp)
904*53889Smckusick 	register SCREEN *sp;
905*53889Smckusick {
906*53889Smckusick 	change_aux_key_pad(NUMERIC);
907*53889Smckusick 	sp->s_current_stat &= ~ESCAPE;
908*53889Smckusick }
909*53889Smckusick 
910*53889Smckusick /*
911*53889Smckusick  *  application key pad
912*53889Smckusick  *  esc_application_kpad(sp) changes key pad of cursor to application one.
913*53889Smckusick  *  This sequence is also used in vi.
914*53889Smckusick  *  currently not supported.
915*53889Smckusick  */
916*53889Smckusick esc_application_kpad(sp)
917*53889Smckusick 	register SCREEN *sp;
918*53889Smckusick {
919*53889Smckusick 	change_aux_key_pad(APPLIC);
920*53889Smckusick 	sp->s_current_stat &= ~ESCAPE;
921*53889Smckusick }
922*53889Smckusick 
923*53889Smckusick /*
924*53889Smckusick  *  change auxiliary keypad
925*53889Smckusick  */
926*53889Smckusick static
927*53889Smckusick change_aux_key_pad(applic)
928*53889Smckusick 	register int applic;
929*53889Smckusick {
930*53889Smckusick 	char pad[4];
931*53889Smckusick 	register Pfk_string *pfk = &pfk_str;
932*53889Smckusick 	register Key_string *kys = &pfk_str.pfk_string;
933*53889Smckusick 	register struct key_pad *kpd;
934*53889Smckusick 	register int i;
935*53889Smckusick 
936*53889Smckusick 	kpd = &key_pad[0];
937*53889Smckusick 	if (applic) {
938*53889Smckusick 		pad[0] = '\033';
939*53889Smckusick 		pad[1] = 'O';
940*53889Smckusick 	}
941*53889Smckusick 	for (i = N0; i <= NENTER; i++) {
942*53889Smckusick 
943*53889Smckusick 		pfk->pfk_num = i;
944*53889Smckusick 		kys->key_length = (applic) ? 3: 1;
945*53889Smckusick 		if (applic) {
946*53889Smckusick 			pad[2] = kpd->kpd_applic;
947*53889Smckusick 		} else {
948*53889Smckusick 			pad[0] = kpd->kpd_numeric;
949*53889Smckusick 		}
950*53889Smckusick 		kys->key_string = pad;
951*53889Smckusick 		kpd++;
952*53889Smckusick 		pfk->pfk_shift = PF_NORMAL;
953*53889Smckusick 		kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk);
954*53889Smckusick 		pfk->pfk_shift = PF_SHIFT;
955*53889Smckusick 		kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk);
956*53889Smckusick 	}
957*53889Smckusick 	if (!applic) {
958*53889Smckusick 		pfk->pfk_shift = PF_SHIFT;
959*53889Smckusick 		kys->key_length = 1;
960*53889Smckusick 
961*53889Smckusick 		pfk->pfk_num = MINUS;
962*53889Smckusick 		kys->key_string = "/";
963*53889Smckusick 		kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk);
964*53889Smckusick 
965*53889Smckusick 		pfk->pfk_num = PLUS;
966*53889Smckusick 		kys->key_string = "*";
967*53889Smckusick 		kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk);
968*53889Smckusick 
969*53889Smckusick 		pfk->pfk_num = COMMA;
970*53889Smckusick 		kys->key_string = "=";
971*53889Smckusick  		kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk);
972*53889Smckusick 	}
973*53889Smckusick }
974*53889Smckusick 
975*53889Smckusick extern	struct	csr_buf	local_csr_buf;
976*53889Smckusick /*
977*53889Smckusick  *  change line size
978*53889Smckusick  *  esc_line_size(sp, pn) changes line size.
979*53889Smckusick  *	c = `3'	double side double height(top half)
980*53889Smckusick  *	c = `4'	double side double height(bottom half)
981*53889Smckusick  *	c = `5'	sigle width line
982*53889Smckusick  *	c = `6'	double width line
983*53889Smckusick  *  currently not supported
984*53889Smckusick  */
985*53889Smckusick esc_line_size(sp, c)
986*53889Smckusick 	register SCREEN *sp;
987*53889Smckusick 	char c;
988*53889Smckusick {
989*53889Smckusick 	register int i;
990*53889Smckusick 	register int j;
991*53889Smckusick 	int save_f, save_b;
992*53889Smckusick 
993*53889Smckusick 	cursor_off();
994*53889Smckusick 	switch (c) {
995*53889Smckusick 	case '5':
996*53889Smckusick 		local_csr_buf.csr_number = 1;
997*53889Smckusick 		break;
998*53889Smckusick 	case '6':
999*53889Smckusick 		local_csr_buf.csr_number = 2;
1000*53889Smckusick 		break;
1001*53889Smckusick 	case '8':
1002*53889Smckusick 		sp->s_region.top_margin = TOP_M;
1003*53889Smckusick 		sp->s_region.btm_margin = btm_m;
1004*53889Smckusick 		save_f = fcolor;
1005*53889Smckusick 		save_b = bcolor;
1006*53889Smckusick 		fcolor = sp->s_bgcol;
1007*53889Smckusick 		bcolor = sp->s_plane;
1008*53889Smckusick 		sp->s_csr.csr_p.y = y_ofst;
1009*53889Smckusick 		for (i = TOP_M; i <= btm_m; i++) {
1010*53889Smckusick 			sp->s_csr.csr_p.x = x_ofst;
1011*53889Smckusick 			sp->s_csr.csr_y = i;
1012*53889Smckusick 			for (j = LFT_M; j <= rit_m; j++) {
1013*53889Smckusick 				sp->s_csr.csr_x = j;
1014*53889Smckusick 				copy_char(sp, 'E', 0);
1015*53889Smckusick 				sp->s_csr.csr_p.x += char_w;
1016*53889Smckusick 			}
1017*53889Smckusick 			sp->s_csr.csr_p.y += char_h;
1018*53889Smckusick 		}
1019*53889Smckusick 		sp->s_csr.csr_x = LFT_M;
1020*53889Smckusick 		sp->s_csr.csr_y = TOP_M;
1021*53889Smckusick 		sp->s_csr.csr_p.x = x_ofst;
1022*53889Smckusick 		sp->s_csr.csr_p.y = y_ofst;
1023*53889Smckusick 		fcolor = save_f;
1024*53889Smckusick 		bcolor = save_b;
1025*53889Smckusick 		break;
1026*53889Smckusick 	default:
1027*53889Smckusick 		break;
1028*53889Smckusick 	}
1029*53889Smckusick 	cursor_on(&sp->s_csr.csr_p);
1030*53889Smckusick 	sp->s_current_stat &= ~ESCAPE;
1031*53889Smckusick }
1032*53889Smckusick 
1033*53889Smckusick /*
1034*53889Smckusick  *  character set
1035*53889Smckusick  *  esc_char_setr sets which character set you use in right graphic set.
1036*53889Smckusick  *  currently not supported
1037*53889Smckusick  */
1038*53889Smckusick esc_char_setr(sp, c)
1039*53889Smckusick 	register SCREEN *sp;
1040*53889Smckusick 	int c;
1041*53889Smckusick {
1042*53889Smckusick #if defined(IPC_MRX) || defined(CPU_SINGLE)
1043*53889Smckusick 	switch (c) {
1044*53889Smckusick 	case 'J':
1045*53889Smckusick 	case 'H':
1046*53889Smckusick 		font_jisroman();
1047*53889Smckusick #ifdef CPU_SINGLE
1048*53889Smckusick 		font_jisroman24();
1049*53889Smckusick #endif
1050*53889Smckusick 		sp->s_current_stat &= ~JKANJI;
1051*53889Smckusick 		break;
1052*53889Smckusick 	case 'B':
1053*53889Smckusick 		font_ascii();
1054*53889Smckusick #ifdef CPU_SINGLE
1055*53889Smckusick 		font_ascii24();
1056*53889Smckusick #endif
1057*53889Smckusick 		sp->s_current_stat &= ~JKANJI;
1058*53889Smckusick 		break;
1059*53889Smckusick 	}
1060*53889Smckusick #else /* IPC_MRX || CPU_SINGLE */
1061*53889Smckusick 	if (c == 'B' || c == 'J' || c == 'H') {
1062*53889Smckusick 		sp->s_current_stat &= ~JKANJI;
1063*53889Smckusick 	}
1064*53889Smckusick #endif /* IPC_MRX || CPU_SINGLE */
1065*53889Smckusick 	sp->s_current_stat &= ~ESCAPE;
1066*53889Smckusick }
1067*53889Smckusick 
1068*53889Smckusick /*
1069*53889Smckusick  *  character set to left graphic set
1070*53889Smckusick  *  esc_char_setl sets which character set you use in left graphic set.
1071*53889Smckusick  *  currently not supported
1072*53889Smckusick  */
1073*53889Smckusick esc_char_setl(sp, c)
1074*53889Smckusick 	register SCREEN *sp;
1075*53889Smckusick 	int c;
1076*53889Smckusick {
1077*53889Smckusick 	sp->s_current_stat &= ~ESCAPE;
1078*53889Smckusick }
1079*53889Smckusick 
1080*53889Smckusick extern tmode;
1081*53889Smckusick extern  unsigned  int	first_jcode;
1082*53889Smckusick /*
1083*53889Smckusick  *  character set to kanji
1084*53889Smckusick  *  esc_kanji_set sets kanji
1085*53889Smckusick  */
1086*53889Smckusick esc_kanji_set(sp, c)
1087*53889Smckusick 	register SCREEN *sp;
1088*53889Smckusick 	int c;
1089*53889Smckusick {
1090*53889Smckusick 
1091*53889Smckusick #ifdef KM_JIS
1092*53889Smckusick 	if (tmode == KM_JIS && (c == 'B' || c == '@')) {
1093*53889Smckusick 		sp->s_current_stat |= JKANJI;
1094*53889Smckusick 		first_jcode = 0;
1095*53889Smckusick 	}
1096*53889Smckusick #endif
1097*53889Smckusick 	sp->s_current_stat &= ~ESCAPE;
1098*53889Smckusick }
1099*53889Smckusick 
1100*53889Smckusick static short parm_buf[PARM_BUF_SIZ];
1101*53889Smckusick static short *parm_bp = parm_buf;
1102*53889Smckusick static int sensitive = 0;
1103*53889Smckusick static int pval = 0;
1104*53889Smckusick /*
1105*53889Smckusick  *  terminal parameter set command
1106*53889Smckusick  *  esc_parm_set(sp, c)  sets terminal parameters such as font-width,
1107*53889Smckusick  *  font-height, character-width, character-height, character-position,
1108*53889Smckusick  *  underlind-position, screen-width, screen-height, x-offset, y-offset,
1109*53889Smckusick  *  right-mergin, bottom-mergin, dimmer-count, bell-length.
1110*53889Smckusick  */
1111*53889Smckusick esc_parm_set(sp, c)
1112*53889Smckusick 	register SCREEN *sp;
1113*53889Smckusick 	register unsigned int c;
1114*53889Smckusick {
1115*53889Smckusick 	static int bufc = 0;
1116*53889Smckusick 
1117*53889Smckusick 	if (in_str(c, sp->s_estp->terminators)) {
1118*53889Smckusick 		if (sensitive) {
1119*53889Smckusick 			*parm_bp++ = pval;
1120*53889Smckusick 		} else {
1121*53889Smckusick 			*parm_bp++ = -1;
1122*53889Smckusick 		}
1123*53889Smckusick 		*parm_bp++ = -1;
1124*53889Smckusick 		parm_set(sp, parm_buf, c);
1125*53889Smckusick 		sp->s_current_stat &= ~ESCAPE;
1126*53889Smckusick 		sensitive = pval = 0;
1127*53889Smckusick 		parm_bp = parm_buf;
1128*53889Smckusick 		bufc = 0;
1129*53889Smckusick 		return;
1130*53889Smckusick 	}
1131*53889Smckusick 	/*  buffering arguments  */
1132*53889Smckusick 	if (bufc < PARM_BUF_SIZ) {
1133*53889Smckusick 		if (c >= '0' && c <= '9') {
1134*53889Smckusick 			pval = pval *10 + (c - '0');
1135*53889Smckusick 			sensitive = 1;
1136*53889Smckusick 		} else if (c == ';') {
1137*53889Smckusick 			if (sensitive) {
1138*53889Smckusick 				*parm_bp++ = pval;
1139*53889Smckusick 			} else {
1140*53889Smckusick 				*parm_bp++ = -1;
1141*53889Smckusick 			}
1142*53889Smckusick 			sensitive = pval = 0;
1143*53889Smckusick 			bufc++;
1144*53889Smckusick 		} else {
1145*53889Smckusick 			sp->s_current_stat &= ~ESCAPE;
1146*53889Smckusick 			sensitive = pval = 0;
1147*53889Smckusick 			parm_bp = parm_buf;
1148*53889Smckusick 			bufc = 0;
1149*53889Smckusick 		}
1150*53889Smckusick 	}
1151*53889Smckusick }
1152*53889Smckusick 
1153*53889Smckusick static	char	an_buf[AN_BUF_SIZ];
1154*53889Smckusick 
1155*53889Smckusick parm_set(sp, parm, terminator)
1156*53889Smckusick 	SCREEN *sp;
1157*53889Smckusick 	short *parm;
1158*53889Smckusick 	unsigned int terminator;
1159*53889Smckusick {
1160*53889Smckusick 	register char *bp = an_buf;
1161*53889Smckusick 	register char *p;
1162*53889Smckusick 
1163*53889Smckusick 	switch (terminator) {
1164*53889Smckusick 	case 'f':
1165*53889Smckusick 		if (parm[0] >= FONT_W_MIN && parm[0] <= consfb->font_w &&
1166*53889Smckusick 							parm[0] < char_w)
1167*53889Smckusick 			font_w =  parm[0];
1168*53889Smckusick 
1169*53889Smckusick 		if (parm[1] >= FONT_H_MIN && parm[1] <= consfb->font_h &&
1170*53889Smckusick 					parm[1] <= (char_h - ch_pos))
1171*53889Smckusick 			font_h = parm[1];
1172*53889Smckusick 		break;
1173*53889Smckusick 	case 'c':
1174*53889Smckusick 		if (parm[0] >= CHAR_W_MIN && parm[0] > font_w &&
1175*53889Smckusick 						parm[0] <= CHAR_W_MAX)
1176*53889Smckusick 			char_w = parm[0];
1177*53889Smckusick 
1178*53889Smckusick 		if (parm[1] >= CHAR_H_MIN && parm[1] >= (font_h + ch_pos) &&
1179*53889Smckusick 				parm[1] > ul_pos && parm[1] <= CHAR_H_MAX)
1180*53889Smckusick 			char_h = parm[1];
1181*53889Smckusick 
1182*53889Smckusick 		break;
1183*53889Smckusick 	case 'p':
1184*53889Smckusick 		if (parm[0] >= UL_POS_MIN && parm[0] <= UL_POS_MAX &&
1185*53889Smckusick 						parm[0] < char_h) {
1186*53889Smckusick 			ul_pos = parm[0];
1187*53889Smckusick 		}
1188*53889Smckusick 		if (parm[1] >= CH_POS_MIN && parm[1] <= CH_POS_MAX &&
1189*53889Smckusick 					parm[1] < (char_h - font_h)) {
1190*53889Smckusick 			ch_pos = parm[1];
1191*53889Smckusick 		}
1192*53889Smckusick 		break;
1193*53889Smckusick 	case 's':
1194*53889Smckusick 		if (parm[0] > SCR_W_MIN && parm[0] <= consfb->scr_w)
1195*53889Smckusick 			scr_w = (parm[0] < char_w) ? char_w: parm[0];
1196*53889Smckusick 		if (parm[1] > SCR_H_MIN && parm[1] <= consfb->scr_h)
1197*53889Smckusick 			scr_h = (parm[1] < char_h) ? char_h: parm[1];
1198*53889Smckusick 		break;
1199*53889Smckusick 	case 'o':
1200*53889Smckusick 		if (parm[0] >= X_OFST_MIN && parm[0] <= X_OFST_MAX)
1201*53889Smckusick 			x_ofst = (parm[0] > scr_w - char_w) ?
1202*53889Smckusick 				(scr_w - char_w): parm[0];
1203*53889Smckusick 		if (parm[1] >= Y_OFST_MIN && parm[1] <= Y_OFST_MAX)
1204*53889Smckusick 			y_ofst = (parm[1] > scr_h - char_h) ?
1205*53889Smckusick 				(scr_h - char_h): parm[1];
1206*53889Smckusick 		break;
1207*53889Smckusick 	case 'm':
1208*53889Smckusick 		if (parm[0] >= RIT_M_MIN) {
1209*53889Smckusick 			if (parm[0] > RIT_M_MAX /* consfb->rit_m */) {
1210*53889Smckusick 				parm[0] = consfb->rit_m;
1211*53889Smckusick 			}
1212*53889Smckusick 			rit_m = (parm[0] > (scr_w - x_ofst)/char_w) ?
1213*53889Smckusick 				(scr_w - x_ofst)/char_w: parm[0];
1214*53889Smckusick 		}
1215*53889Smckusick 		if (parm[1] >= BTM_M_MIN) {
1216*53889Smckusick 			if (parm[1] > BTM_M_MAX /* consfb->btm_m */) {
1217*53889Smckusick 				parm[1] = consfb->btm_m;
1218*53889Smckusick 			}
1219*53889Smckusick 			btm_m = (parm[1] > (scr_h - y_ofst)/char_h) ?
1220*53889Smckusick 				(scr_h - y_ofst)/char_h: parm[1];
1221*53889Smckusick 		}
1222*53889Smckusick 		break;
1223*53889Smckusick 	case 'd':
1224*53889Smckusick 		if (parm[0] >= DIM_CNT_MIN && parm[0] <= DIM_CNT_MAX)
1225*53889Smckusick 			dim_cnt = a_dim_on = parm[0];
1226*53889Smckusick 		else
1227*53889Smckusick 			a_dim_on = 0;
1228*53889Smckusick 		break;
1229*53889Smckusick 	case 'b':
1230*53889Smckusick 		if (parm[0] >= BELL_LEN_MIN && parm[0] <= BELL_LEN_MAX)
1231*53889Smckusick 			bell_len = parm[0];
1232*53889Smckusick 		break;
1233*53889Smckusick 	case 'D':
1234*53889Smckusick 		set_default_param();
1235*53889Smckusick 		vt100init();
1236*53889Smckusick 		bitmapinit();
1237*53889Smckusick 		break;
1238*53889Smckusick 	case 'i':
1239*53889Smckusick 		cursor_off();
1240*53889Smckusick 		csr_pos(sp, LFT_M, TOP_M);
1241*53889Smckusick 		key_str.key_string = c_pos_mess;
1242*53889Smckusick 		key_str.key_length = spr(c_pos_mess, "f=(%d,%d), ",
1243*53889Smckusick 							font_w, font_h);
1244*53889Smckusick 		kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str);
1245*53889Smckusick 
1246*53889Smckusick 		key_str.key_length = spr(c_pos_mess, "c=(%d,%d), ",
1247*53889Smckusick 							char_w, char_h);
1248*53889Smckusick 		kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str);
1249*53889Smckusick 
1250*53889Smckusick 		csr_pos(sp, LFT_M, (TOP_M - 1));
1251*53889Smckusick 		key_str.key_string = c_pos_mess;
1252*53889Smckusick 		key_str.key_length = spr(c_pos_mess, "p=(%d,%d), ",
1253*53889Smckusick 							ul_pos, ch_pos);
1254*53889Smckusick 		kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str);
1255*53889Smckusick 		key_str.key_length = spr(c_pos_mess, "s=(%d,%d), ",
1256*53889Smckusick 							scr_w, scr_h);
1257*53889Smckusick 		kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str);
1258*53889Smckusick 
1259*53889Smckusick 		csr_pos(sp, LFT_M, (TOP_M - 2));
1260*53889Smckusick 		key_str.key_string = c_pos_mess;
1261*53889Smckusick 		key_str.key_length = spr(c_pos_mess, "o=(%d,%d), ",
1262*53889Smckusick 							x_ofst, y_ofst);
1263*53889Smckusick 		kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str);
1264*53889Smckusick 		key_str.key_length = spr(c_pos_mess, "m=(%d,%d)",
1265*53889Smckusick 							rit_m, btm_m);
1266*53889Smckusick 		kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str);
1267*53889Smckusick 
1268*53889Smckusick 		cursor_on(&sp->s_csr.csr_p);
1269*53889Smckusick 		return;
1270*53889Smckusick 	case 'G':
1271*53889Smckusick 		line(parm);
1272*53889Smckusick 		return;
1273*53889Smckusick 	case 'C':
1274*53889Smckusick 		if (parm[0] >= 0) {
1275*53889Smckusick 			sp->s_plane = fbbm_get_pixel(consfb, parm[0]);
1276*53889Smckusick 		}
1277*53889Smckusick 		if (parm[1] >= 0) {
1278*53889Smckusick 			sp->s_bgcol = fbbm_get_pixel(consfb, parm[1]);
1279*53889Smckusick 		}
1280*53889Smckusick 		cursor_off();
1281*53889Smckusick 		if ((sp->s_csr.csr_attributes & REVERSE) ^
1282*53889Smckusick 			(sp->s_term_mode & DECSCNM)) {
1283*53889Smckusick 			fcolor = sp->s_bgcol;
1284*53889Smckusick 			bcolor = sp->s_plane;
1285*53889Smckusick 		}
1286*53889Smckusick 		else {
1287*53889Smckusick 			fcolor = sp->s_plane;
1288*53889Smckusick 			bcolor = sp->s_bgcol;
1289*53889Smckusick 		}
1290*53889Smckusick 		cursor_on(&sp->s_csr.csr_p);
1291*53889Smckusick 		return;
1292*53889Smckusick 	case 'T':
1293*53889Smckusick 		if (parm[0] < 0 || consfb->Mono)
1294*53889Smckusick 			return;
1295*53889Smckusick 		/*
1296*53889Smckusick 		 *  what value is defined on pallet N?
1297*53889Smckusick 		 *    put string in an_buf
1298*53889Smckusick 		 */
1299*53889Smckusick 		*bp++ = '\033';
1300*53889Smckusick 		*bp++ = '~';
1301*53889Smckusick 		bp += itoa(bm_pallet_read(parm[0]), 10, bp);
1302*53889Smckusick 		*bp++ = 'a';
1303*53889Smckusick 		key_str.key_length = bp - an_buf;
1304*53889Smckusick 		key_str.key_string = an_buf;
1305*53889Smckusick 		kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str);
1306*53889Smckusick 		return;
1307*53889Smckusick 	case 't':
1308*53889Smckusick 		if (parm[0] >= 0 && !consfb->Mono) {
1309*53889Smckusick 			bm_pallet_write(parm[0],
1310*53889Smckusick 					(unsigned) parm[1] << 16
1311*53889Smckusick 					| (unsigned) parm[2] << 8
1312*53889Smckusick 					| (unsigned) parm[3]
1313*53889Smckusick 			);
1314*53889Smckusick 		}
1315*53889Smckusick 		return;
1316*53889Smckusick 	default:
1317*53889Smckusick 		return;
1318*53889Smckusick 	}
1319*53889Smckusick 	if (char_w < font_w) char_w = font_w;
1320*53889Smckusick 	if (char_h < font_h) char_h = font_h;
1321*53889Smckusick 	if (ch_pos > char_h - font_h) {
1322*53889Smckusick 		ch_pos = char_h - font_h;
1323*53889Smckusick 		ul_pos = char_h - 1;
1324*53889Smckusick 	}
1325*53889Smckusick 	if (rit_m > (scr_w - x_ofst)/char_w)
1326*53889Smckusick 		rit_m = (scr_w - x_ofst)/char_w;
1327*53889Smckusick 	if (btm_m > (scr_h - y_ofst)/char_h)
1328*53889Smckusick 		btm_m = (scr_h - y_ofst)/char_h;
1329*53889Smckusick 	sp->s_region.top_margin = TOP_M;
1330*53889Smckusick 	sp->s_region.btm_margin = btm_m;
1331*53889Smckusick 	font_r1.extent.x = font_w;
1332*53889Smckusick 	font_r1.extent.y = font_h;
1333*53889Smckusick 	font_r2.extent.x = font_w * 2;
1334*53889Smckusick 	font_r2.extent.y = font_h;
1335*53889Smckusick 	font_len1 = (font_w + 0x0f)>>4;
1336*53889Smckusick 	font_len2 = (font_w*2 + 0x0f)>>4;
1337*53889Smckusick 	cursor_off();
1338*53889Smckusick 	char_r1.extent.x = char_w;
1339*53889Smckusick 	char_r1.extent.y = char_h;
1340*53889Smckusick 	char_r2.extent.x = char_w * 2;
1341*53889Smckusick 	char_r2.extent.y = char_h;
1342*53889Smckusick 	csr_pos(sp, sp->s_csr.csr_x, sp->s_csr.csr_y);
1343*53889Smckusick 	sp->s_csr.csr_p.x = (sp->s_csr.csr_x - 1) * char_w + x_ofst;
1344*53889Smckusick 	sp->s_csr.csr_p.y = (sp->s_csr.csr_y - 1) * char_h + y_ofst;
1345*53889Smckusick 	cursor_on(&sp->s_csr.csr_p);
1346*53889Smckusick }
1347*53889Smckusick 
1348*53889Smckusick /* VARARGS */
1349*53889Smckusick spr(s, fmt, ad, dummy)
1350*53889Smckusick 	register char *s, *fmt;
1351*53889Smckusick 	u_int ad;
1352*53889Smckusick {
1353*53889Smckusick 	register int b, c;
1354*53889Smckusick 	register u_int *adx = &ad;
1355*53889Smckusick 	char *base = s;
1356*53889Smckusick 
1357*53889Smckusick 	for (;;) {
1358*53889Smckusick 		while ((c = *fmt++) != '%') {
1359*53889Smckusick 			*s++ = c;
1360*53889Smckusick 			if (c == '\0')
1361*53889Smckusick 				return (s - base - 1);
1362*53889Smckusick 		}
1363*53889Smckusick 
1364*53889Smckusick 		c = *fmt++;
1365*53889Smckusick 		switch (c) {
1366*53889Smckusick 
1367*53889Smckusick 		case 'x': case 'X':
1368*53889Smckusick 			b = 16;
1369*53889Smckusick 			goto number;
1370*53889Smckusick 		case 'd': case 'D':
1371*53889Smckusick 			b = 10;
1372*53889Smckusick 			goto number;
1373*53889Smckusick 		case 'o': case 'O':
1374*53889Smckusick 			b = 8;
1375*53889Smckusick number:
1376*53889Smckusick 			s += itoa(*adx, b, s);
1377*53889Smckusick 			break;
1378*53889Smckusick 
1379*53889Smckusick 		case 'c':
1380*53889Smckusick 			*s++ = *adx;
1381*53889Smckusick 			break;
1382*53889Smckusick 
1383*53889Smckusick 		case '%':
1384*53889Smckusick 			*s++ = c;
1385*53889Smckusick 			break;
1386*53889Smckusick 		}
1387*53889Smckusick 		adx++;
1388*53889Smckusick 	}
1389*53889Smckusick }
1390*53889Smckusick 
1391*53889Smckusick static int pfn = -1;
1392*53889Smckusick static int active_buf = 0;
1393*53889Smckusick /*
1394*53889Smckusick  *  define the programable function keys and answer back message.
1395*53889Smckusick  *  the vt100 facilities do not contain this command!
1396*53889Smckusick  *  command sequence is as follows:
1397*53889Smckusick  *       "^[Pn|n1;n2;...;nmp"		(normal mode)
1398*53889Smckusick  *  or
1399*53889Smckusick  *       "^[Pn|n1;n2;...;nmP"		(shift mode)
1400*53889Smckusick  *  or
1401*53889Smckusick  *       "^[Pn|n1;n2;...;nmZ"		(answer backe message)
1402*53889Smckusick  *  where, `n' denotes the decimal number asigned to function key,
1403*53889Smckusick  *          from `n1' to `nm' denote hexa number, finally,
1404*53889Smckusick  *	    `p' , `E' or `Z' tells that the sequence has terminated.
1405*53889Smckusick  *  remark:
1406*53889Smckusick  *	  when the terminator is `Z', the function number `n' can be omitted,
1407*53889Smckusick  *	  and even though the number is specified, there is no affection to
1408*53889Smckusick  *	  the result.
1409*53889Smckusick  *
1410*53889Smckusick  *
1411*53889Smckusick  *  ADDITION:
1412*53889Smckusick  *	  there is a question: what strings are defined in programable function
1413*53889Smckusick  *	  key of key-number n?
1414*53889Smckusick  *	  in order to anwer this question, another escape sequence has appended.
1415*53889Smckusick  *	  command sequence is as follows:
1416*53889Smckusick  *
1417*53889Smckusick  *	   "^[Pn|i"			(normal mode)
1418*53889Smckusick  *  or
1419*53889Smckusick  *	   "^[Pn|I"			(shift	mode)
1420*53889Smckusick  *
1421*53889Smckusick  *	  then the answer is
1422*53889Smckusick  *
1423*53889Smckusick  *	   "^[Pn|n1;n2;...;nmr"		(normal	mode)
1424*53889Smckusick  *  or
1425*53889Smckusick  *	   "^[Pn|n1;n2;...;nmR"		(shift	mode)
1426*53889Smckusick  *
1427*53889Smckusick  */
1428*53889Smckusick esc_pf_define(sp, c)
1429*53889Smckusick 	SCREEN *sp;
1430*53889Smckusick 	unsigned int c;
1431*53889Smckusick {
1432*53889Smckusick 	static bufc = 0;
1433*53889Smckusick 
1434*53889Smckusick 	if (in_str(c, sp->s_estp->terminators)) {
1435*53889Smckusick 		pf_define(pfn, esc_bp - esc_buf + active_buf, c);
1436*53889Smckusick 		sp->s_current_stat &= ~ESCAPE;
1437*53889Smckusick 		active_buf = 0;
1438*53889Smckusick 		pfn = -1;
1439*53889Smckusick 		bufc = 0;
1440*53889Smckusick 		return;
1441*53889Smckusick 	}
1442*53889Smckusick 	/*  buffering arguments  */
1443*53889Smckusick 	if (bufc < ESC_BUF_SIZ) {
1444*53889Smckusick 		if (pfn < 0) {
1445*53889Smckusick 			if (c >= '0' && c <= '9') {
1446*53889Smckusick 				*esc_bp = *esc_bp *10 + (c - '0');
1447*53889Smckusick 			} else if (c == '|') {
1448*53889Smckusick 				pfn = *esc_bp;
1449*53889Smckusick 				*esc_bp = 0;
1450*53889Smckusick 			} else {
1451*53889Smckusick 				sp->s_current_stat &= ~ESCAPE;
1452*53889Smckusick 				active_buf = 0;
1453*53889Smckusick 				pfn = -1;
1454*53889Smckusick 			}
1455*53889Smckusick 		} else {
1456*53889Smckusick 			active_buf = 1;
1457*53889Smckusick 			if (c >= '0' && c <= '9') {
1458*53889Smckusick 				*esc_bp = *esc_bp * 16 + (c - '0');
1459*53889Smckusick 			} else if (c >= 'a' && c <= 'f') {
1460*53889Smckusick 				*esc_bp = *esc_bp * 16 + (c - 'a' + 10);
1461*53889Smckusick 			} else if (c >= 'A' && c <= 'F') {
1462*53889Smckusick 				*esc_bp = *esc_bp * 16 + (c - 'A' + 10);
1463*53889Smckusick 			} else if (c == ';') {
1464*53889Smckusick 				esc_bp++;
1465*53889Smckusick 				bufc++;
1466*53889Smckusick 			} else {
1467*53889Smckusick 				sp->s_current_stat &= ~ESCAPE;
1468*53889Smckusick 				pfn = -1;
1469*53889Smckusick 				active_buf = 0;
1470*53889Smckusick 				bufc = 0;
1471*53889Smckusick 			}
1472*53889Smckusick 		}
1473*53889Smckusick 	} else {
1474*53889Smckusick 		active_buf = 0;
1475*53889Smckusick 	}
1476*53889Smckusick }
1477*53889Smckusick 
1478*53889Smckusick pf_define(pfn, length, terminator)
1479*53889Smckusick 	int pfn;
1480*53889Smckusick 	int length;
1481*53889Smckusick 	unsigned int terminator;
1482*53889Smckusick {
1483*53889Smckusick 	register Pfk_string *pfk = &pfk_str;
1484*53889Smckusick 	register Key_string *kys = &pfk_str.pfk_string;
1485*53889Smckusick 
1486*53889Smckusick 	if (terminator == 'Z')
1487*53889Smckusick 		return;
1488*53889Smckusick 
1489*53889Smckusick 	if (pfn < 0 || pfn > N_PFK)
1490*53889Smckusick 		return;
1491*53889Smckusick 	if (terminator == 'i' || terminator == 'I') {
1492*53889Smckusick 		pf_answer(pfn, terminator);
1493*53889Smckusick 		return;
1494*53889Smckusick 	}
1495*53889Smckusick 	pfk->pfk_num = pfn ? pfn: 1;
1496*53889Smckusick 	pfk->pfk_shift = (terminator == 'p') ? PF_NORMAL: PF_SHIFT;
1497*53889Smckusick 	kys->key_length = length;
1498*53889Smckusick 	kys->key_string = esc_buf;
1499*53889Smckusick  	kbd_ioctl(SCC_KEYBOARD, KIOCSETS, pfk);
1500*53889Smckusick }
1501*53889Smckusick 
1502*53889Smckusick /*
1503*53889Smckusick  *  pf_answer(pfn, terminator)
1504*53889Smckusick  *  this routine answers what strings defined on pfn.
1505*53889Smckusick  */
1506*53889Smckusick 
1507*53889Smckusick char def_seq[ESC_BUF_SIZ];
1508*53889Smckusick 
1509*53889Smckusick pf_answer(pfn, terminator)
1510*53889Smckusick 	int pfn;
1511*53889Smckusick 	unsigned int terminator;
1512*53889Smckusick {
1513*53889Smckusick 	register Pfk_string *pfk = &pfk_str;
1514*53889Smckusick 	register Key_string *kys = &pfk_str.pfk_string;
1515*53889Smckusick 	register char *bp = an_buf;
1516*53889Smckusick 	register char *p = def_seq;
1517*53889Smckusick 	register int length;
1518*53889Smckusick 	register int j;
1519*53889Smckusick 
1520*53889Smckusick 	/*
1521*53889Smckusick 	 *  function key inquiry
1522*53889Smckusick 	 *    get string in def_seq
1523*53889Smckusick 	 */
1524*53889Smckusick 	pfk->pfk_num = pfn ? pfn: 1;
1525*53889Smckusick 	pfk->pfk_shift = (terminator == 'i') ? PF_NORMAL: PF_SHIFT;
1526*53889Smckusick 	kys->key_length = ESC_BUF_SIZ;
1527*53889Smckusick 	kys->key_string = def_seq;
1528*53889Smckusick 	kbd_ioctl(SCC_KEYBOARD, KIOCGETS, pfk);
1529*53889Smckusick 	length = kys->key_length;
1530*53889Smckusick 
1531*53889Smckusick 	/*
1532*53889Smckusick 	 *  function key answer
1533*53889Smckusick 	 *    put string in an_buf
1534*53889Smckusick 	 */
1535*53889Smckusick 	*bp++ = '\033';
1536*53889Smckusick 	*bp++ = 'P';
1537*53889Smckusick 	bp += itoa(pfn, 10, bp);
1538*53889Smckusick 	*bp++ = '|';
1539*53889Smckusick 	key_str.key_length = bp - an_buf;
1540*53889Smckusick 	key_str.key_string = an_buf;
1541*53889Smckusick 	kbd_ioctl(SCC_KEYBOARD, KIOCBACK, &key_str);
1542*53889Smckusick 
1543*53889Smckusick 	bp = an_buf;
1544*53889Smckusick 	if (length--) {
1545*53889Smckusick 		bp += itoa(*p++ & 0xff, 16, bp);
1546*53889Smckusick 	}
1547*53889Smckusick 	while (length > 0) {
1548*53889Smckusick 		for (j = 0; (j < 10) && (length-- > 0); j++) {
1549*53889Smckusick 			*bp++ = ';';
1550*53889Smckusick 			bp += itoa(*p++ & 0xff, 16, bp);
1551*53889Smckusick 		}
1552*53889Smckusick 		key_str.key_length = bp - an_buf;
1553*53889Smckusick 		kbd_ioctl(SCC_KEYBOARD, KIOCBACK, (int *)&key_str);
1554*53889Smckusick 		bp = an_buf;
1555*53889Smckusick 	}
1556*53889Smckusick 	*bp++ = (terminator == 'i') ? 'r': 'R';
1557*53889Smckusick 	key_str.key_length = bp - an_buf;
1558*53889Smckusick 	kbd_ioctl(SCC_KEYBOARD, KIOCBACK, (int *)&key_str);
1559*53889Smckusick }
1560*53889Smckusick 
1561*53889Smckusick /*
1562*53889Smckusick  *  ignore
1563*53889Smckusick  *  esc_ignore(sp) is not called ordinally work.
1564*53889Smckusick  */
1565*53889Smckusick esc_ignore(sp)
1566*53889Smckusick 	register SCREEN *sp;
1567*53889Smckusick {
1568*53889Smckusick 	sp->s_current_stat &= ~ESCAPE;
1569*53889Smckusick }
1570*53889Smckusick 
1571*53889Smckusick static  char	*nmr = "0123456789abcdef";
1572*53889Smckusick /*
1573*53889Smckusick  *  itoa
1574*53889Smckusick  *  this routine converts binary to ascii decimal or hexa number
1575*53889Smckusick  *  according to mod.
1576*53889Smckusick  */
1577*53889Smckusick static
1578*53889Smckusick itoa(n, mod, buf)
1579*53889Smckusick 	register int n;
1580*53889Smckusick 	register int mod;
1581*53889Smckusick 	register char *buf;
1582*53889Smckusick {
1583*53889Smckusick 	register  int	i = 0;
1584*53889Smckusick 	register  int	cnt;
1585*53889Smckusick 	int	first = 1;
1586*53889Smckusick 	int	k;
1587*53889Smckusick 
1588*53889Smckusick 	n &= 0xffff;
1589*53889Smckusick 	for (cnt = mod*mod*mod*mod*mod*mod*mod; cnt > 0; cnt /= mod) {
1590*53889Smckusick 		k = n / cnt;
1591*53889Smckusick 		n -= k * cnt;
1592*53889Smckusick 		if (k == 0) {
1593*53889Smckusick 			if (first == 0) {
1594*53889Smckusick 				*buf++ = nmr[k];
1595*53889Smckusick 				i++;
1596*53889Smckusick 			}
1597*53889Smckusick 		} else {
1598*53889Smckusick 			*buf++ = nmr[k];
1599*53889Smckusick 			i++;
1600*53889Smckusick 			first = 0;
1601*53889Smckusick 		}
1602*53889Smckusick 	}
1603*53889Smckusick 	if (first == 1) {
1604*53889Smckusick 		*buf++ = '0';
1605*53889Smckusick 		i++;
1606*53889Smckusick 	}
1607*53889Smckusick 	return(i);
1608*53889Smckusick }
1609