xref: /original-bsd/sys/news3400/bm/vt100.c (revision cbbda00f)
133c0386eSmckusick /*
2*cbbda00fSbostic  * Copyright (c) 1992, 1993
3*cbbda00fSbostic  *	The Regents of the University of California.  All rights reserved.
433c0386eSmckusick  *
533c0386eSmckusick  * This code is derived from software contributed to Berkeley by
633c0386eSmckusick  * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
733c0386eSmckusick  *
833c0386eSmckusick  * %sccs.include.redist.c%
933c0386eSmckusick  *
1033c0386eSmckusick  * from: $Hdr: vt100.c,v 4.300 91/06/09 06:14:56 root Rel41 $ SONY
1133c0386eSmckusick  *
12*cbbda00fSbostic  *	@(#)vt100.c	8.1 (Berkeley) 06/10/93
1333c0386eSmckusick  */
1433c0386eSmckusick 
15b3d62609Sutashiro #include <sys/types.h>
16b3d62609Sutashiro #include <sys/param.h>
17b3d62609Sutashiro #include <sys/systm.h>
18b3d62609Sutashiro #include <news3400/iop/framebuf.h>
19b3d62609Sutashiro #include <news3400/iop/kbreg.h>
20b3d62609Sutashiro #include <news3400/iop/keyboard.h>
21b3d62609Sutashiro #include <news3400/fb/fbdefs.h>
22b3d62609Sutashiro #include <news3400/bm/vt100.h>
23b3d62609Sutashiro #include <news3400/bm/bitmapif.h>
2433c0386eSmckusick 
2533c0386eSmckusick #ifdef IPC_MRX
2633c0386eSmckusick #include "config.h"
2733c0386eSmckusick #define kbd_ioctl(chan, cmd, argp) { \
2833c0386eSmckusick 	if (kb_ioctl) \
2933c0386eSmckusick 		(*kb_ioctl)(chan, cmd, argp); \
3033c0386eSmckusick }
3133c0386eSmckusick #endif
3233c0386eSmckusick 
3333c0386eSmckusick #ifdef IPC_MRX
3433c0386eSmckusick #include "mrx.h"
3533c0386eSmckusick #include "process.h"
3633c0386eSmckusick #include "object.h"
3733c0386eSmckusick #include "console.h"
3833c0386eSmckusick #endif
3933c0386eSmckusick 
4033c0386eSmckusick #ifdef CPU_SINGLE
414bc075a6Sutashiro #include <news3400/sio/scc.h>
4233c0386eSmckusick #endif
4333c0386eSmckusick 
4433c0386eSmckusick extern Key_string key_str;
4533c0386eSmckusick extern int tmode;
4633c0386eSmckusick static unsigned int first_code;
4733c0386eSmckusick 
4833c0386eSmckusick #ifdef IPC_MRX
4933c0386eSmckusick #define SCC_KEYBOARD	0
5033c0386eSmckusick #endif
5133c0386eSmckusick 
5233c0386eSmckusick SCREEN screen;
5333c0386eSmckusick struct cursor inner_buf_csr;
5433c0386eSmckusick int inner_buf_tstat;
5533c0386eSmckusick char c_pos_mess[C_MESS_SIZ];
5633c0386eSmckusick extern struct csr_buf local_csr_buf;
5733c0386eSmckusick 
5833c0386eSmckusick #ifdef IPC_MRX
5933c0386eSmckusick int bitmap_use;
6033c0386eSmckusick #ifdef IPC_3CPU
6133c0386eSmckusick #include "../../ubdev/msgio.h"
6233c0386eSmckusick extern int ipc_ready;
6333c0386eSmckusick #endif /* IPC_3CPU */
6433c0386eSmckusick extern struct cons_devsw vt100_cons;
6533c0386eSmckusick #endif /* IPC_MRX */
6633c0386eSmckusick 
6733c0386eSmckusick #ifdef CPU_DOUBLE
6833c0386eSmckusick int auto_dimmer();
6933c0386eSmckusick #endif
7033c0386eSmckusick 
7133c0386eSmckusick #if CPU_SINGLE
7233c0386eSmckusick extern int hz;
7333c0386eSmckusick extern kbd_profun_init();
7433c0386eSmckusick #endif
7533c0386eSmckusick 
7633c0386eSmckusick lRectangle char_r1;
7733c0386eSmckusick lRectangle font_r1;
7833c0386eSmckusick lRectangle char_r2;
7933c0386eSmckusick lRectangle font_r2;
8033c0386eSmckusick 
8133c0386eSmckusick int	font_len1;
8233c0386eSmckusick int	font_len2;
8333c0386eSmckusick 
8433c0386eSmckusick int	fcolor;
8533c0386eSmckusick int	bcolor;
8633c0386eSmckusick 
8733c0386eSmckusick int	font_w;
8833c0386eSmckusick int	font_h;
8933c0386eSmckusick int	char_w;
9033c0386eSmckusick int	char_h;
9133c0386eSmckusick int	scr_w;
9233c0386eSmckusick int	scr_h;
9333c0386eSmckusick int	ch_pos;
9433c0386eSmckusick int	ul_pos;
9533c0386eSmckusick int	x_ofst;
9633c0386eSmckusick int	y_ofst;
9733c0386eSmckusick int	rit_m;
9833c0386eSmckusick int	btm_m;
9933c0386eSmckusick int	bell_len;
10033c0386eSmckusick int	dim_cnt;
10133c0386eSmckusick int	a_dim_on;
10233c0386eSmckusick 
10333c0386eSmckusick unsigned short fbuf[256];
10433c0386eSmckusick int	fp;
10533c0386eSmckusick int	fpn;
10633c0386eSmckusick lPoint	fpp;
10733c0386eSmckusick int	fpa;
10833c0386eSmckusick 
vt100init()10933c0386eSmckusick vt100init()
11033c0386eSmckusick {
11133c0386eSmckusick 	register int i;
11233c0386eSmckusick 	register SCREEN	*sp = &screen;
11333c0386eSmckusick 
11433c0386eSmckusick 	sp->s_term_mode = 0;
11533c0386eSmckusick 	sp->s_term_mode |= (SRM|DECSCLM|DECAWM|DECARM|DECCSR_ACTV);
11633c0386eSmckusick 	sp->s_current_stat = 0;
11733c0386eSmckusick 	sp->s_csr.csr_x = 1;
11833c0386eSmckusick 	sp->s_csr.csr_y = 1;
11933c0386eSmckusick 	sp->s_csr.csr_p.x = x_ofst;
12033c0386eSmckusick 	sp->s_csr.csr_p.y = y_ofst;
12133c0386eSmckusick 	sp->s_csr.csr_attributes = NORMALM;
12233c0386eSmckusick 	sp->s_region.top_margin = TOP_M;
12333c0386eSmckusick 	sp->s_region.btm_margin = btm_m;
12433c0386eSmckusick 	sp->s_plane = consfb->planemask;
12533c0386eSmckusick 	sp->s_bgcol = 0;
12633c0386eSmckusick 	fcolor = sp->s_plane;
12733c0386eSmckusick 	bcolor = sp->s_bgcol;
12833c0386eSmckusick 	for (i = 0; i < RIT_M_MAX; i++)
12933c0386eSmckusick 		sp->s_tab_pos[i] = 0;
13033c0386eSmckusick 	for (i = 9; i < RIT_M_MAX; i +=8)
13133c0386eSmckusick 		sp->s_tab_pos[i] = 1;
13233c0386eSmckusick 
13333c0386eSmckusick 	esc_store_csr(sp);
13433c0386eSmckusick 	inner_buf_tstat = sp->s_term_mode & (DECOM|DECAWM);
13533c0386eSmckusick 	local_csr_buf.csr_number = 1;
13633c0386eSmckusick 
13733c0386eSmckusick 	cursor_on(&sp->s_csr.csr_p);
13833c0386eSmckusick }
13933c0386eSmckusick 
ncp_str(p,q,n)14033c0386eSmckusick ncp_str(p, q, n)
14133c0386eSmckusick 	register char *p, *q;
14233c0386eSmckusick 	register int n;
14333c0386eSmckusick {
14433c0386eSmckusick 	while (n-- > 0)
14533c0386eSmckusick 		*q++ = *p++;
14633c0386eSmckusick }
14733c0386eSmckusick 
14833c0386eSmckusick /*
14933c0386eSmckusick  *  default parameter set
15033c0386eSmckusick  */
set_default_param()15133c0386eSmckusick set_default_param()
15233c0386eSmckusick {
15333c0386eSmckusick 	register struct fbdev *cfb = consfb;
15433c0386eSmckusick 
15533c0386eSmckusick 	font_w = cfb->font_w;
15633c0386eSmckusick 	font_h = cfb->font_h;
15733c0386eSmckusick 	char_w = cfb->char_w;
15833c0386eSmckusick 	char_h = cfb->char_h;
15933c0386eSmckusick 	scr_w  = cfb->scr_w;
16033c0386eSmckusick 	scr_h  = cfb->scr_h;
16133c0386eSmckusick 	ch_pos = cfb->ch_pos;
16233c0386eSmckusick 	ul_pos = cfb->ul_pos;
16333c0386eSmckusick 	x_ofst = cfb->x_offset;
16433c0386eSmckusick 	y_ofst = cfb->y_offset;
16533c0386eSmckusick 	rit_m  = cfb->rit_m;
16633c0386eSmckusick 	btm_m  = cfb->btm_m;
16733c0386eSmckusick 	a_dim_on = 1;
16833c0386eSmckusick 
16933c0386eSmckusick 	font_r1.extent.x = font_w;
17033c0386eSmckusick 	font_r1.extent.y = font_h;
17133c0386eSmckusick 	font_r2.extent.x = font_w * 2;
17233c0386eSmckusick 	font_r2.extent.y = font_h;
17333c0386eSmckusick 	font_len1 = (font_w + 0x0f) >> 4;
17433c0386eSmckusick 	font_len2 = (font_w*2 + 0x0f) >> 4;
17533c0386eSmckusick 	char_r1.extent.x = char_w;
17633c0386eSmckusick 	char_r1.extent.y = char_h;
17733c0386eSmckusick 	char_r2.extent.x = char_w * 2;
17833c0386eSmckusick 	char_r2.extent.y = char_h;
17933c0386eSmckusick 
18033c0386eSmckusick 	dim_cnt = DIM_CNT_DFLT;
18133c0386eSmckusick 	bell_len = BELL_LEN_DFLT;
18233c0386eSmckusick }
18333c0386eSmckusick 
vt100_open()18433c0386eSmckusick vt100_open()
18533c0386eSmckusick {
18633c0386eSmckusick 	static int only_one = 0;
18733c0386eSmckusick 	extern char **ext_fnt_addr;
18833c0386eSmckusick 
18933c0386eSmckusick 	set_default_param();
19033c0386eSmckusick 	vt100init();
19133c0386eSmckusick 	bitmapinit();
19233c0386eSmckusick 	if (only_one == 0) {
19333c0386eSmckusick #ifdef IPC_MRX
19433c0386eSmckusick #ifdef IPC_3CPU
19533c0386eSmckusick 		while (ipc_ready == 0)
19633c0386eSmckusick 			proc_sleep_self(100);
19733c0386eSmckusick #endif
19833c0386eSmckusick 		while ((bitmap_use = object_query(BITMAP)) <= 0)
19933c0386eSmckusick 			proc_sleep_self(100);
20033c0386eSmckusick 
20133c0386eSmckusick 		proc_create("auto_dimmer", auto_dimmer, 401, 512, 0);
20233c0386eSmckusick #endif /* IPC_MRX */
20333c0386eSmckusick 		only_one = 1;
20433c0386eSmckusick 	}
20533c0386eSmckusick #define	INIT_STRING	"\033[42;1H"
20633c0386eSmckusick 	vt100_write(0, INIT_STRING, sizeof(INIT_STRING) - 1);
20733c0386eSmckusick #ifdef CPU_SINGLE
20833c0386eSmckusick 	kbd_open(SCC_KEYBOARD);
20933c0386eSmckusick #endif
21033c0386eSmckusick }
21133c0386eSmckusick 
21233c0386eSmckusick #ifdef IPC_MRX
vt100_cons_setup()21333c0386eSmckusick vt100_cons_setup()
21433c0386eSmckusick {
21533c0386eSmckusick 	int vt100_open(), vt100_read(), vt100_write(), vt100_ioctl();
21633c0386eSmckusick 
21733c0386eSmckusick 	vt100_cons.open = vt100_open;
21833c0386eSmckusick 	vt100_cons.read = vt100_read;
21933c0386eSmckusick 	vt100_cons.write = vt100_write;
22033c0386eSmckusick 	vt100_cons.ioctl = vt100_ioctl;
22133c0386eSmckusick }
22233c0386eSmckusick 
22333c0386eSmckusick #define DIMMER_RESET	0
22433c0386eSmckusick #define DIMMER_ON	1
22533c0386eSmckusick #define DIMMER_OFF	2
22633c0386eSmckusick #define DIMMER_INTERVAL	60		/* sec */
22733c0386eSmckusick 
22833c0386eSmckusick static int dimmer_stdport;
22933c0386eSmckusick 
auto_dimmer()23033c0386eSmckusick auto_dimmer()
23133c0386eSmckusick {
23233c0386eSmckusick 	register int select, i;
23333c0386eSmckusick 	register int dimm_counter = DIM_CNT_DFLT;
23433c0386eSmckusick 	register int dimm_level = 0;
23533c0386eSmckusick 	int ports[2], *mode;
23633c0386eSmckusick 
23733c0386eSmckusick 	spl0();
23833c0386eSmckusick 	ports[0] = dimmer_stdport = STDPORT;
23933c0386eSmckusick 	ports[1] = port_create("auto_dimmer_sub");
24033c0386eSmckusick 	register_interval(ports[1], DIMMER_INTERVAL);
24133c0386eSmckusick 	for(;;) {
24233c0386eSmckusick 		select = msg_select(2, ports);
24333c0386eSmckusick 		if (select == 0) {
24433c0386eSmckusick 			msg_recv(ports[0], NULL, &mode, NULL, 0);
24533c0386eSmckusick 			switch (*mode) {
24633c0386eSmckusick 			case DIMMER_RESET:
24733c0386eSmckusick 				if (!a_dim_on)
24833c0386eSmckusick 					break;
24933c0386eSmckusick 				dimm_counter = dim_cnt;
25033c0386eSmckusick 				if (dimm_level > 0) {
25133c0386eSmckusick 					dimm_level =0;
25233c0386eSmckusick 					for (i = 0; i < nfbdev; i++)
25333c0386eSmckusick 						fbbm_set_dimmer(&fbdev[i], 0);
25433c0386eSmckusick 				}
25533c0386eSmckusick 				break;
25633c0386eSmckusick 			case DIMMER_ON:
25733c0386eSmckusick 				dimm_counter = dim_cnt;
25833c0386eSmckusick 				dimm_level =0;
25933c0386eSmckusick 				for (i = 0; i < nfbdev; i++)
26033c0386eSmckusick 					fbbm_set_dimmer(&fbdev[i], dimm_level);
26133c0386eSmckusick 				a_dim_on = 1;
26233c0386eSmckusick 				break;
26333c0386eSmckusick 			case DIMMER_OFF:
26433c0386eSmckusick 				dimm_counter = dim_cnt;
26533c0386eSmckusick 				dimm_level =0;
26633c0386eSmckusick 				for (i = 0; i < nfbdev; i++)
26733c0386eSmckusick 					fbbm_set_dimmer(&fbdev[i], dimm_level);
26833c0386eSmckusick 				a_dim_on = 0;
26933c0386eSmckusick 				break;
27033c0386eSmckusick 			}
27133c0386eSmckusick 		} else {
27233c0386eSmckusick 			msg_recv(ports[1], NULL, NULL, NULL, 0);
27333c0386eSmckusick 			if (a_dim_on && (dimm_counter-- <= 0)) {
27433c0386eSmckusick 				if (dimm_level < 3) {
27533c0386eSmckusick 					dimm_level++;
27633c0386eSmckusick 				}
27733c0386eSmckusick 				for (i = 0; i < nfbdev; i++)
27833c0386eSmckusick 					fbbm_set_dimmer(&fbdev[i], dimm_level);
27933c0386eSmckusick 				dimm_counter = dim_cnt;
28033c0386eSmckusick 			}
28133c0386eSmckusick 		}
28233c0386eSmckusick 	}
28333c0386eSmckusick }
28433c0386eSmckusick 
rst_dimmer_cnt()28533c0386eSmckusick rst_dimmer_cnt()
28633c0386eSmckusick {
28733c0386eSmckusick 	register int diff;
28833c0386eSmckusick 	static unsigned last_time;
28933c0386eSmckusick 	extern unsigned sys_time;
29033c0386eSmckusick 	int mode = DIMMER_RESET;
29133c0386eSmckusick 
29233c0386eSmckusick 	diff = sys_time - last_time;
29333c0386eSmckusick 	if (diff > DIMMER_INTERVAL*HZ || diff < 0) {
29433c0386eSmckusick 		dimmer(DIMMER_RESET);
29533c0386eSmckusick 		last_time = sys_time;
29633c0386eSmckusick 	}
29733c0386eSmckusick }
29833c0386eSmckusick 
auto_dimmer_on()29933c0386eSmckusick auto_dimmer_on()
30033c0386eSmckusick {
30133c0386eSmckusick 	dimmer(DIMMER_ON);
30233c0386eSmckusick }
30333c0386eSmckusick 
auto_dimmer_off()30433c0386eSmckusick auto_dimmer_off()
30533c0386eSmckusick {
30633c0386eSmckusick 	dimmer(DIMMER_OFF);
30733c0386eSmckusick }
30833c0386eSmckusick 
dimmer(mode)30933c0386eSmckusick dimmer(mode)
31033c0386eSmckusick 	int mode;
31133c0386eSmckusick {
31233c0386eSmckusick 	if (dimmer_stdport)
31333c0386eSmckusick 		msg_send(dimmer_stdport, 0, &mode, sizeof(mode), 0);
31433c0386eSmckusick }
31533c0386eSmckusick #else /* IPC_MRX */
31633c0386eSmckusick 
31733c0386eSmckusick static int dimmer_counter = DIM_CNT_DFLT;
31833c0386eSmckusick static int dim_level = 0;
31933c0386eSmckusick 
32033c0386eSmckusick #ifdef CPU_SINGLE
auto_dimmer()32133c0386eSmckusick auto_dimmer()
32233c0386eSmckusick {
32333c0386eSmckusick 	register int s, i;
32433c0386eSmckusick 
32533c0386eSmckusick 	s = spl4();
32633c0386eSmckusick 	if (a_dim_on && (dimmer_counter-- <= 0)) {
32733c0386eSmckusick 		if (dim_level < 3)
32833c0386eSmckusick 			dim_level++;
32933c0386eSmckusick 		for (i = 0; i < nfbdev; i++)
33033c0386eSmckusick 			fbbm_set_dimmer(&fbdev[i], dim_level);
33133c0386eSmckusick 		dimmer_counter = dim_cnt;
33233c0386eSmckusick 	}
33333c0386eSmckusick 	splx(s);
33433c0386eSmckusick 	timeout(auto_dimmer, (caddr_t) 0, 60 * hz);
33533c0386eSmckusick }
33633c0386eSmckusick #endif
33733c0386eSmckusick 
rst_dimmer_cnt()33833c0386eSmckusick rst_dimmer_cnt()
33933c0386eSmckusick {
34033c0386eSmckusick 	register int	s, i;
34133c0386eSmckusick 
34233c0386eSmckusick 	if (!a_dim_on)
34333c0386eSmckusick 		return;
34433c0386eSmckusick #ifdef CPU_SINGLE
34533c0386eSmckusick 	s = spl4();
34633c0386eSmckusick #endif
34733c0386eSmckusick 	dimmer_counter = dim_cnt;
34833c0386eSmckusick 
34933c0386eSmckusick 	if (dim_level > 0) {
35033c0386eSmckusick 		dim_level =0;
35133c0386eSmckusick 		for (i = 0; i < nfbdev; i++)
35233c0386eSmckusick 			fbbm_set_dimmer(&fbdev[i], 0);
35333c0386eSmckusick 	}
35433c0386eSmckusick 	splx(s);
35533c0386eSmckusick }
35633c0386eSmckusick 
auto_dimmer_on()35733c0386eSmckusick auto_dimmer_on()
35833c0386eSmckusick {
35933c0386eSmckusick 	register int s, i;
36033c0386eSmckusick 
36133c0386eSmckusick #ifdef CPU_SINGLE
36233c0386eSmckusick 	s = spl4();
36333c0386eSmckusick #endif
36433c0386eSmckusick 	dimmer_counter = dim_cnt;
36533c0386eSmckusick 	dim_level =0;
36633c0386eSmckusick 	for (i = 0; i < nfbdev; i++)
36733c0386eSmckusick 		fbbm_set_dimmer(&fbdev[i], dim_level);
36833c0386eSmckusick 	a_dim_on = 1;
36933c0386eSmckusick 	splx(s);
37033c0386eSmckusick }
37133c0386eSmckusick 
auto_dimmer_off()37233c0386eSmckusick auto_dimmer_off()
37333c0386eSmckusick {
37433c0386eSmckusick 	register int s, i;
37533c0386eSmckusick 
37633c0386eSmckusick #ifdef CPU_SINGLE
37733c0386eSmckusick 	s = spl4();
37833c0386eSmckusick #endif
37933c0386eSmckusick 	dimmer_counter = dim_cnt;
38033c0386eSmckusick 	dim_level =0;
38133c0386eSmckusick 	for (i = 0; i < nfbdev; i++)
38233c0386eSmckusick 		fbbm_set_dimmer(&fbdev[i], dim_level);
38333c0386eSmckusick 	a_dim_on = 0;
38433c0386eSmckusick 	splx(s);
38533c0386eSmckusick }
38633c0386eSmckusick #endif /* IPC_MRX */
38733c0386eSmckusick /*
38833c0386eSmckusick  *  The routine `_putc(sp, c)' only prints a character c with the cursor
38933c0386eSmckusick  *  attributes by using `copy_char(x, y, c, attributes)'.
39033c0386eSmckusick  *  And when IRM (terminal insertion-replacement mode) is set, the characters
39133c0386eSmckusick  *  righthand side of the cursor are shifted right and lost when they passed
39233c0386eSmckusick  *  beyond the right margin.
39333c0386eSmckusick  *  The position is specified by the sp pointer of the structure SCREEN.
39433c0386eSmckusick  *
39533c0386eSmckusick  */
39633c0386eSmckusick static
_putc(sp,c,kanji)39733c0386eSmckusick _putc(sp, c, kanji)
39833c0386eSmckusick 	register SCREEN	*sp;
39933c0386eSmckusick 	unsigned int c;
40033c0386eSmckusick {
40133c0386eSmckusick 	if (sp->s_term_mode & IRM) {
40233c0386eSmckusick 		vt_flush(&(sp->s_csr));
40333c0386eSmckusick 		move_chars(sp->s_csr.csr_x, sp->s_csr.csr_y,
40433c0386eSmckusick 			   rit_m - sp->s_csr.csr_x - ((kanji)? 1: 0),
40533c0386eSmckusick 			   sp->s_csr.csr_x + ((kanji) ? 2: 1));
40633c0386eSmckusick 		copy_char(sp, c, kanji);
40733c0386eSmckusick 	}
40833c0386eSmckusick 	if (fp) {
40933c0386eSmckusick 		fbuf[fp++] = c;
41033c0386eSmckusick 		fpn += kanji + 1;
41133c0386eSmckusick 	} else {
41233c0386eSmckusick 		fbuf[fp++] = c;
41333c0386eSmckusick 		fpp = sp->s_csr.csr_p;
41433c0386eSmckusick 		fpa = sp->s_csr.csr_attributes;
41533c0386eSmckusick 		fpn = kanji + 1;
41633c0386eSmckusick 	}
41733c0386eSmckusick }
41833c0386eSmckusick 
41933c0386eSmckusick /*
42033c0386eSmckusick  *  Scroll up and down in the scroll region.
42133c0386eSmckusick  *  New oriented line must be cleared with terminal mode, that is whether
42233c0386eSmckusick  *  the screen is reverse mode or not.
42333c0386eSmckusick  */
scroll_up(top,bottom,revsw,fcol,bcol)42433c0386eSmckusick scroll_up(top, bottom, revsw, fcol, bcol)
42533c0386eSmckusick 	int top;
42633c0386eSmckusick 	int bottom;
42733c0386eSmckusick 	int revsw;
42833c0386eSmckusick 	int fcol;
42933c0386eSmckusick 	int bcol;
43033c0386eSmckusick {
43133c0386eSmckusick 	move_lines(top + 1, bottom - top, top);
43233c0386eSmckusick 	clear_lines(bottom, 1, revsw, fcol, bcol);
43333c0386eSmckusick }
43433c0386eSmckusick 
scroll_down(top,bottom,revsw,fcol,bcol)43533c0386eSmckusick scroll_down(top, bottom, revsw, fcol, bcol)
43633c0386eSmckusick 	int top;
43733c0386eSmckusick 	int bottom;
43833c0386eSmckusick 	int revsw;
43933c0386eSmckusick 	int fcol;
44033c0386eSmckusick 	int bcol;
44133c0386eSmckusick {
44233c0386eSmckusick 	move_lines(top, bottom - top, top + 1);
44333c0386eSmckusick 	clear_lines(top, 1, revsw, fcol, bcol);
44433c0386eSmckusick }
44533c0386eSmckusick 
44633c0386eSmckusick /*
44733c0386eSmckusick  *  Back space
44833c0386eSmckusick  *  back_space(sp) moves cursor next to left at current cursor position.
44933c0386eSmckusick  *  The cursor can not move beyond left or right margin.
45033c0386eSmckusick  */
back_space(sp)45133c0386eSmckusick back_space(sp)
45233c0386eSmckusick 	register SCREEN *sp;
45333c0386eSmckusick {
45433c0386eSmckusick 	register struct cursor *spc = &sp->s_csr;
45533c0386eSmckusick 
45633c0386eSmckusick 	cursor_off();
45733c0386eSmckusick 	if (spc->csr_x > LFT_M) {
45833c0386eSmckusick 		spc->csr_x -= 1;
45933c0386eSmckusick 		spc->csr_p.x -= char_w;
46033c0386eSmckusick 	}
46133c0386eSmckusick 	cursor_on(&spc->csr_p);
46233c0386eSmckusick }
46333c0386eSmckusick 
46433c0386eSmckusick /*
46533c0386eSmckusick  *  Tab stop
46633c0386eSmckusick  *  next_tab_stop(sp) moves cursor to next tab stop.
46733c0386eSmckusick  */
next_tab_stop(sp)46833c0386eSmckusick next_tab_stop(sp)
46933c0386eSmckusick 	register SCREEN *sp;
47033c0386eSmckusick {
47133c0386eSmckusick 	register int i;
47233c0386eSmckusick 
47333c0386eSmckusick 	cursor_off();
47433c0386eSmckusick 	for (i = sp->s_csr.csr_x + 1; i < rit_m; i++)
47533c0386eSmckusick 		if (sp->s_tab_pos[i] == 1)
47633c0386eSmckusick 			break;
4772b8a9184Sbostic 	sp->s_csr.csr_x = min(i, rit_m);
47833c0386eSmckusick 	sp->s_csr.csr_p.x = (sp->s_csr.csr_x - 1) * char_w + x_ofst;
47933c0386eSmckusick 	cursor_on(&sp->s_csr.csr_p);
48033c0386eSmckusick }
48133c0386eSmckusick 
48233c0386eSmckusick /*
48333c0386eSmckusick  *  Carriage return
48433c0386eSmckusick  *  carriage_ret(sp) moves cursor at beginning of the current line.
48533c0386eSmckusick  */
carriage_ret(sp)48633c0386eSmckusick carriage_ret(sp)
48733c0386eSmckusick 	register SCREEN *sp;
48833c0386eSmckusick {
48933c0386eSmckusick 	cursor_off();
49033c0386eSmckusick 	sp->s_csr.csr_x = LFT_M;
49133c0386eSmckusick 	sp->s_csr.csr_p.x = x_ofst;
49233c0386eSmckusick 	cursor_on(&sp->s_csr.csr_p);
49333c0386eSmckusick }
49433c0386eSmckusick 
49533c0386eSmckusick /*
49633c0386eSmckusick  *  Bell
49733c0386eSmckusick  */
49833c0386eSmckusick static
bell()49933c0386eSmckusick bell()
50033c0386eSmckusick {
50133c0386eSmckusick #ifdef news1800
50233c0386eSmckusick 	static int port;
50333c0386eSmckusick 
50433c0386eSmckusick 	if (port == 0)
50533c0386eSmckusick 		port = port_create("port_cons_bell");
50633c0386eSmckusick 	kbd_ioctl(port, KIOCBELL, &bell_len);
50733c0386eSmckusick #else
50833c0386eSmckusick 	kbd_ioctl(SCC_KEYBOARD, KIOCBELL, &bell_len);
50933c0386eSmckusick #endif
51033c0386eSmckusick 	return (0);
51133c0386eSmckusick }
51233c0386eSmckusick 
51333c0386eSmckusick int
Putchar(c,eob)51433c0386eSmckusick Putchar(c, eob)
51533c0386eSmckusick 	unsigned int c;
51633c0386eSmckusick {
51733c0386eSmckusick 	register SCREEN *sp = &screen;
51833c0386eSmckusick 	unsigned int sftjis_to_jis();
51933c0386eSmckusick 
52033c0386eSmckusick 	c &= 0xff;
52133c0386eSmckusick 
52233c0386eSmckusick 	if (eob) {
52333c0386eSmckusick 		vt_flush(&(sp->s_csr));
52433c0386eSmckusick 		return(0);
52533c0386eSmckusick 	}
52633c0386eSmckusick 
52733c0386eSmckusick 	if (c == 0x1b) {	/*  c == esc */
52833c0386eSmckusick 		vt_flush(&(sp->s_csr));
52933c0386eSmckusick 		recover(sp);
53033c0386eSmckusick 		sp->s_current_stat |= ESCAPE;
53133c0386eSmckusick 		return;
53233c0386eSmckusick 	} else if (sp->s_current_stat & ESCAPE) {
53333c0386eSmckusick 		(*sp->s_esc_handler)(sp, c);
53433c0386eSmckusick 		return;
53533c0386eSmckusick 	} else if (sp->s_current_stat & SKANJI) {
53633c0386eSmckusick 		c = sftjis_to_jis(first_code, c);
53733c0386eSmckusick 		if (sp->s_current_stat & JKANJI) {
53833c0386eSmckusick 			addch(sp, c);
53933c0386eSmckusick 		} else {
54033c0386eSmckusick 			sp->s_current_stat |= JKANJI;
54133c0386eSmckusick 			addch(sp, c);
54233c0386eSmckusick 			sp->s_current_stat &= ~JKANJI;
54333c0386eSmckusick 		}
54433c0386eSmckusick 		sp->s_current_stat &= ~SKANJI;
54533c0386eSmckusick 		goto set_csr;
54633c0386eSmckusick 	} else if (sp->s_current_stat & EKANJI) {
54733c0386eSmckusick 		c = (c & 0x7f) | (first_code << 8);
54833c0386eSmckusick 		if (sp->s_current_stat & JKANJI) {
54933c0386eSmckusick 			addch(sp, c);
55033c0386eSmckusick 		} else {
55133c0386eSmckusick 			sp->s_current_stat |= JKANJI;
55233c0386eSmckusick 			addch(sp, c);
55333c0386eSmckusick 			sp->s_current_stat &= ~JKANJI;
55433c0386eSmckusick 		}
55533c0386eSmckusick 		sp->s_current_stat &= ~EKANJI;
55633c0386eSmckusick 		goto set_csr;
55733c0386eSmckusick 	} else if (sp->s_current_stat & JKANJI) {
55833c0386eSmckusick 		jiskanji(sp, c);
55933c0386eSmckusick 		goto set_csr;
56033c0386eSmckusick 	} else if (sp->s_current_stat & EKANA) {
56133c0386eSmckusick 			sp->s_current_stat &= ~EKANA;
56233c0386eSmckusick 			addch(sp, c);
56333c0386eSmckusick 		goto set_csr;
56433c0386eSmckusick 	}
56533c0386eSmckusick 	if (c < 0x20) {		/*  control code	*/
56633c0386eSmckusick 		vt_flush(&(sp->s_csr));
56733c0386eSmckusick 		switch (c) {
56833c0386eSmckusick 		case  0x00:	/*  ignore  */
56933c0386eSmckusick 			break;
57033c0386eSmckusick 		case  0x07:	/*  bell  */
57133c0386eSmckusick 			bell();
57233c0386eSmckusick 			break;
57333c0386eSmckusick 		case  0x08:	/*  back space  */
57433c0386eSmckusick 			back_space(sp);
57533c0386eSmckusick 			break;
57633c0386eSmckusick 		case  0x09:	/*  tabulation  */
57733c0386eSmckusick 			next_tab_stop(sp);
57833c0386eSmckusick 			break;
57933c0386eSmckusick 		case  0x0a:	/*  line feed  */
58033c0386eSmckusick 		case  0x0b:	/*  vertical feed  */
58133c0386eSmckusick 		case  0x0c:	/*  form feed  */
58233c0386eSmckusick 			esc_index(sp);
58333c0386eSmckusick 			break;
58433c0386eSmckusick 		case  0x0d:	/*  carriage return  */
58533c0386eSmckusick 			carriage_ret(sp);
58633c0386eSmckusick 			break;
58733c0386eSmckusick 		case  0x0e:	/*  shift out  */
58833c0386eSmckusick 			break;
58933c0386eSmckusick 		case  0x0f:	/*  shift in  */
59033c0386eSmckusick 			break;
59133c0386eSmckusick 		case  0x11:	/*  xon  */
59233c0386eSmckusick 			break;
59333c0386eSmckusick 		case  0x13:	/*  xoff  */
59433c0386eSmckusick 			break;
59533c0386eSmckusick 		case  0x18:	/*  cancel  */
59633c0386eSmckusick 			sp->s_current_stat &= ~ESCAPE;
59733c0386eSmckusick 			break;
59833c0386eSmckusick 		case  0x1b:	/*  escape  */
59933c0386eSmckusick 			/*	NOT REACHED	*/
60033c0386eSmckusick 			recover(sp);
60133c0386eSmckusick 			sp->s_current_stat |= ESCAPE;
60233c0386eSmckusick 			break;
60333c0386eSmckusick 		case  0x7f:	/*  delete  */
60433c0386eSmckusick 			break;
60533c0386eSmckusick 
60633c0386eSmckusick 		default:
60733c0386eSmckusick 			break;
60833c0386eSmckusick 		}
60933c0386eSmckusick 	} else {
61033c0386eSmckusick 		switch (tmode) {
61133c0386eSmckusick #ifdef KM_SJIS
61233c0386eSmckusick 		case KM_SJIS:
61333c0386eSmckusick 			if ((c >= JVR1S && c <= JVR1E) ||
61433c0386eSmckusick 				(c >= JVR2S && c <= JVR2E)) {
61533c0386eSmckusick 				sp->s_current_stat |= SKANJI;
61633c0386eSmckusick 				first_code = c;
61733c0386eSmckusick 			}
61833c0386eSmckusick 			else
61933c0386eSmckusick 				addch(sp, c);
62033c0386eSmckusick 			break;
62133c0386eSmckusick #endif
62233c0386eSmckusick #ifdef KM_EUC
62333c0386eSmckusick 		case KM_EUC:
62433c0386eSmckusick 			if (c >= CS1S && c <= CS1E) {
62533c0386eSmckusick 				sp->s_current_stat |= EKANJI;
62633c0386eSmckusick 				first_code = c & 0x7f;
62733c0386eSmckusick 			}
62833c0386eSmckusick 			else if (c == SS2)
62933c0386eSmckusick 				sp->s_current_stat |= EKANA;
63033c0386eSmckusick 			else
63133c0386eSmckusick 				addch(sp, c);
63233c0386eSmckusick 			break;
63333c0386eSmckusick #endif
63433c0386eSmckusick #ifdef KM_JIS
63533c0386eSmckusick 		case KM_JIS:
63633c0386eSmckusick #endif
63733c0386eSmckusick #ifdef KM_ASCII
63833c0386eSmckusick 		case KM_ASCII:
63933c0386eSmckusick #endif
64033c0386eSmckusick 		default:
64133c0386eSmckusick 			addch(sp, c);
64233c0386eSmckusick 		}
64333c0386eSmckusick 	}
64433c0386eSmckusick 
64533c0386eSmckusick set_csr:
64633c0386eSmckusick 	cursor_on(&sp->s_csr.csr_p);
64733c0386eSmckusick 		/*  altered	*/
64833c0386eSmckusick 	return ;
64933c0386eSmckusick }
65033c0386eSmckusick 
65133c0386eSmckusick /*
65233c0386eSmckusick  *  A printable character is printed in this routine by using
65333c0386eSmckusick  *  the routine `_putc()'.
65433c0386eSmckusick  *  Anyway, a character is printed in replacement mode or insertion
65533c0386eSmckusick  *  mode and if the terminal is autowrap then it takes place wrapping
65633c0386eSmckusick  *  and if cursor is bottom margin of the scroll region then it takes
65733c0386eSmckusick  *  place scroll up.
65833c0386eSmckusick  *  The escape sequence handling is another routine.
65933c0386eSmckusick  *
66033c0386eSmckusick  */
addch(sp,c)66133c0386eSmckusick addch(sp, c)
66233c0386eSmckusick 	register SCREEN	*sp;
66333c0386eSmckusick 	unsigned int c;
66433c0386eSmckusick {
66533c0386eSmckusick 	register struct cursor *spc = &(sp->s_csr);
66633c0386eSmckusick 	register struct region *spr = &(sp->s_region);
66733c0386eSmckusick 
66833c0386eSmckusick 	if (spc->csr_x >= rit_m ||
66933c0386eSmckusick 		((sp->s_current_stat & JKANJI) && (spc->csr_x >= rit_m - 1))) {
67033c0386eSmckusick 		vt_flush(spc);
67133c0386eSmckusick 		if (sp->s_term_mode & DECAWM) {
67233c0386eSmckusick 			if ((sp->s_current_stat & WRAP) || (spc->csr_x == rit_m
67333c0386eSmckusick 					&& sp->s_current_stat & JKANJI)) {
67433c0386eSmckusick 				if (spc->csr_y == spr->btm_margin) {
67533c0386eSmckusick 					cursor_off();
67633c0386eSmckusick 					scroll_up(spr->top_margin,
67733c0386eSmckusick 						  spr->btm_margin,
67833c0386eSmckusick 						  sp->s_term_mode & DECSCNM,
67933c0386eSmckusick 						  sp->s_plane, sp->s_bgcol);
68033c0386eSmckusick 					cursor_on(&(spc->csr_p));
68133c0386eSmckusick 				} else if (spc->csr_y < btm_m) {
68233c0386eSmckusick 					spc->csr_y += 1;
68333c0386eSmckusick 					spc->csr_p.y += char_h;
68433c0386eSmckusick 				}
68533c0386eSmckusick 				spc->csr_x = LFT_M;
68633c0386eSmckusick 				spc->csr_p.x = x_ofst;
68733c0386eSmckusick 				addch(sp, c);
68833c0386eSmckusick 				return;
68933c0386eSmckusick 			}
69033c0386eSmckusick 			sp->s_current_stat |= WRAP;
69133c0386eSmckusick 		}
69233c0386eSmckusick 		if (sp->s_current_stat & JKANJI) {
69333c0386eSmckusick 			if (spc->csr_x != rit_m) {
69433c0386eSmckusick 				_putc(sp, c, 1);
69533c0386eSmckusick 			}
69633c0386eSmckusick 		} else {
69733c0386eSmckusick 			_putc(sp, c, 0);
69833c0386eSmckusick 		}
69933c0386eSmckusick 		if (spc->csr_x < rit_m) {
70033c0386eSmckusick 			spc->csr_x += 1;
70133c0386eSmckusick 			spc->csr_p.x += char_w;
70233c0386eSmckusick 		}
70333c0386eSmckusick 
70433c0386eSmckusick 		return ;
70533c0386eSmckusick 	}
70633c0386eSmckusick 	if (sp->s_current_stat & JKANJI) {
70733c0386eSmckusick 		_putc(sp, c, 1);
70833c0386eSmckusick 		spc->csr_x++;
70933c0386eSmckusick 		spc->csr_p.x += char_w;
71033c0386eSmckusick 	} else {
71133c0386eSmckusick 		_putc(sp, c, 0);
71233c0386eSmckusick 	}
71333c0386eSmckusick 
71433c0386eSmckusick 	spc->csr_x++;	/*  altered   */
71533c0386eSmckusick 	spc->csr_p.x += char_w;
71633c0386eSmckusick 
71733c0386eSmckusick 	sp->s_current_stat &= ~WRAP;
71833c0386eSmckusick 	return ;
71933c0386eSmckusick }
720