xref: /csrg-svn/sys/news3400/bm/vt100.c (revision 63256)
153889Smckusick /*
2*63256Sbostic  * Copyright (c) 1992, 1993
3*63256Sbostic  *	The Regents of the University of California.  All rights reserved.
453889Smckusick  *
553889Smckusick  * This code is derived from software contributed to Berkeley by
653889Smckusick  * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
753889Smckusick  *
853889Smckusick  * %sccs.include.redist.c%
953889Smckusick  *
1053889Smckusick  * from: $Hdr: vt100.c,v 4.300 91/06/09 06:14:56 root Rel41 $ SONY
1153889Smckusick  *
12*63256Sbostic  *	@(#)vt100.c	8.1 (Berkeley) 06/10/93
1353889Smckusick  */
1453889Smckusick 
1557177Sutashiro #include <sys/types.h>
1657177Sutashiro #include <sys/param.h>
1757177Sutashiro #include <sys/systm.h>
1857177Sutashiro #include <news3400/iop/framebuf.h>
1957177Sutashiro #include <news3400/iop/kbreg.h>
2057177Sutashiro #include <news3400/iop/keyboard.h>
2157177Sutashiro #include <news3400/fb/fbdefs.h>
2257177Sutashiro #include <news3400/bm/vt100.h>
2357177Sutashiro #include <news3400/bm/bitmapif.h>
2453889Smckusick 
2553889Smckusick #ifdef IPC_MRX
2653889Smckusick #include "config.h"
2753889Smckusick #define kbd_ioctl(chan, cmd, argp) { \
2853889Smckusick 	if (kb_ioctl) \
2953889Smckusick 		(*kb_ioctl)(chan, cmd, argp); \
3053889Smckusick }
3153889Smckusick #endif
3253889Smckusick 
3353889Smckusick #ifdef IPC_MRX
3453889Smckusick #include "mrx.h"
3553889Smckusick #include "process.h"
3653889Smckusick #include "object.h"
3753889Smckusick #include "console.h"
3853889Smckusick #endif
3953889Smckusick 
4053889Smckusick #ifdef CPU_SINGLE
4157615Sutashiro #include <news3400/sio/scc.h>
4253889Smckusick #endif
4353889Smckusick 
4453889Smckusick extern Key_string key_str;
4553889Smckusick extern int tmode;
4653889Smckusick static unsigned int first_code;
4753889Smckusick 
4853889Smckusick #ifdef IPC_MRX
4953889Smckusick #define SCC_KEYBOARD	0
5053889Smckusick #endif
5153889Smckusick 
5253889Smckusick SCREEN screen;
5353889Smckusick struct cursor inner_buf_csr;
5453889Smckusick int inner_buf_tstat;
5553889Smckusick char c_pos_mess[C_MESS_SIZ];
5653889Smckusick extern struct csr_buf local_csr_buf;
5753889Smckusick 
5853889Smckusick #ifdef IPC_MRX
5953889Smckusick int bitmap_use;
6053889Smckusick #ifdef IPC_3CPU
6153889Smckusick #include "../../ubdev/msgio.h"
6253889Smckusick extern int ipc_ready;
6353889Smckusick #endif /* IPC_3CPU */
6453889Smckusick extern struct cons_devsw vt100_cons;
6553889Smckusick #endif /* IPC_MRX */
6653889Smckusick 
6753889Smckusick #ifdef CPU_DOUBLE
6853889Smckusick int auto_dimmer();
6953889Smckusick #endif
7053889Smckusick 
7153889Smckusick #if CPU_SINGLE
7253889Smckusick extern int hz;
7353889Smckusick extern kbd_profun_init();
7453889Smckusick #endif
7553889Smckusick 
7653889Smckusick lRectangle char_r1;
7753889Smckusick lRectangle font_r1;
7853889Smckusick lRectangle char_r2;
7953889Smckusick lRectangle font_r2;
8053889Smckusick 
8153889Smckusick int	font_len1;
8253889Smckusick int	font_len2;
8353889Smckusick 
8453889Smckusick int	fcolor;
8553889Smckusick int	bcolor;
8653889Smckusick 
8753889Smckusick int	font_w;
8853889Smckusick int	font_h;
8953889Smckusick int	char_w;
9053889Smckusick int	char_h;
9153889Smckusick int	scr_w;
9253889Smckusick int	scr_h;
9353889Smckusick int	ch_pos;
9453889Smckusick int	ul_pos;
9553889Smckusick int	x_ofst;
9653889Smckusick int	y_ofst;
9753889Smckusick int	rit_m;
9853889Smckusick int	btm_m;
9953889Smckusick int	bell_len;
10053889Smckusick int	dim_cnt;
10153889Smckusick int	a_dim_on;
10253889Smckusick 
10353889Smckusick unsigned short fbuf[256];
10453889Smckusick int	fp;
10553889Smckusick int	fpn;
10653889Smckusick lPoint	fpp;
10753889Smckusick int	fpa;
10853889Smckusick 
vt100init()10953889Smckusick vt100init()
11053889Smckusick {
11153889Smckusick 	register int i;
11253889Smckusick 	register SCREEN	*sp = &screen;
11353889Smckusick 
11453889Smckusick 	sp->s_term_mode = 0;
11553889Smckusick 	sp->s_term_mode |= (SRM|DECSCLM|DECAWM|DECARM|DECCSR_ACTV);
11653889Smckusick 	sp->s_current_stat = 0;
11753889Smckusick 	sp->s_csr.csr_x = 1;
11853889Smckusick 	sp->s_csr.csr_y = 1;
11953889Smckusick 	sp->s_csr.csr_p.x = x_ofst;
12053889Smckusick 	sp->s_csr.csr_p.y = y_ofst;
12153889Smckusick 	sp->s_csr.csr_attributes = NORMALM;
12253889Smckusick 	sp->s_region.top_margin = TOP_M;
12353889Smckusick 	sp->s_region.btm_margin = btm_m;
12453889Smckusick 	sp->s_plane = consfb->planemask;
12553889Smckusick 	sp->s_bgcol = 0;
12653889Smckusick 	fcolor = sp->s_plane;
12753889Smckusick 	bcolor = sp->s_bgcol;
12853889Smckusick 	for (i = 0; i < RIT_M_MAX; i++)
12953889Smckusick 		sp->s_tab_pos[i] = 0;
13053889Smckusick 	for (i = 9; i < RIT_M_MAX; i +=8)
13153889Smckusick 		sp->s_tab_pos[i] = 1;
13253889Smckusick 
13353889Smckusick 	esc_store_csr(sp);
13453889Smckusick 	inner_buf_tstat = sp->s_term_mode & (DECOM|DECAWM);
13553889Smckusick 	local_csr_buf.csr_number = 1;
13653889Smckusick 
13753889Smckusick 	cursor_on(&sp->s_csr.csr_p);
13853889Smckusick }
13953889Smckusick 
ncp_str(p,q,n)14053889Smckusick ncp_str(p, q, n)
14153889Smckusick 	register char *p, *q;
14253889Smckusick 	register int n;
14353889Smckusick {
14453889Smckusick 	while (n-- > 0)
14553889Smckusick 		*q++ = *p++;
14653889Smckusick }
14753889Smckusick 
14853889Smckusick /*
14953889Smckusick  *  default parameter set
15053889Smckusick  */
set_default_param()15153889Smckusick set_default_param()
15253889Smckusick {
15353889Smckusick 	register struct fbdev *cfb = consfb;
15453889Smckusick 
15553889Smckusick 	font_w = cfb->font_w;
15653889Smckusick 	font_h = cfb->font_h;
15753889Smckusick 	char_w = cfb->char_w;
15853889Smckusick 	char_h = cfb->char_h;
15953889Smckusick 	scr_w  = cfb->scr_w;
16053889Smckusick 	scr_h  = cfb->scr_h;
16153889Smckusick 	ch_pos = cfb->ch_pos;
16253889Smckusick 	ul_pos = cfb->ul_pos;
16353889Smckusick 	x_ofst = cfb->x_offset;
16453889Smckusick 	y_ofst = cfb->y_offset;
16553889Smckusick 	rit_m  = cfb->rit_m;
16653889Smckusick 	btm_m  = cfb->btm_m;
16753889Smckusick 	a_dim_on = 1;
16853889Smckusick 
16953889Smckusick 	font_r1.extent.x = font_w;
17053889Smckusick 	font_r1.extent.y = font_h;
17153889Smckusick 	font_r2.extent.x = font_w * 2;
17253889Smckusick 	font_r2.extent.y = font_h;
17353889Smckusick 	font_len1 = (font_w + 0x0f) >> 4;
17453889Smckusick 	font_len2 = (font_w*2 + 0x0f) >> 4;
17553889Smckusick 	char_r1.extent.x = char_w;
17653889Smckusick 	char_r1.extent.y = char_h;
17753889Smckusick 	char_r2.extent.x = char_w * 2;
17853889Smckusick 	char_r2.extent.y = char_h;
17953889Smckusick 
18053889Smckusick 	dim_cnt = DIM_CNT_DFLT;
18153889Smckusick 	bell_len = BELL_LEN_DFLT;
18253889Smckusick }
18353889Smckusick 
vt100_open()18453889Smckusick vt100_open()
18553889Smckusick {
18653889Smckusick 	static int only_one = 0;
18753889Smckusick 	extern char **ext_fnt_addr;
18853889Smckusick 
18953889Smckusick 	set_default_param();
19053889Smckusick 	vt100init();
19153889Smckusick 	bitmapinit();
19253889Smckusick 	if (only_one == 0) {
19353889Smckusick #ifdef IPC_MRX
19453889Smckusick #ifdef IPC_3CPU
19553889Smckusick 		while (ipc_ready == 0)
19653889Smckusick 			proc_sleep_self(100);
19753889Smckusick #endif
19853889Smckusick 		while ((bitmap_use = object_query(BITMAP)) <= 0)
19953889Smckusick 			proc_sleep_self(100);
20053889Smckusick 
20153889Smckusick 		proc_create("auto_dimmer", auto_dimmer, 401, 512, 0);
20253889Smckusick #endif /* IPC_MRX */
20353889Smckusick 		only_one = 1;
20453889Smckusick 	}
20553889Smckusick #define	INIT_STRING	"\033[42;1H"
20653889Smckusick 	vt100_write(0, INIT_STRING, sizeof(INIT_STRING) - 1);
20753889Smckusick #ifdef CPU_SINGLE
20853889Smckusick 	kbd_open(SCC_KEYBOARD);
20953889Smckusick #endif
21053889Smckusick }
21153889Smckusick 
21253889Smckusick #ifdef IPC_MRX
vt100_cons_setup()21353889Smckusick vt100_cons_setup()
21453889Smckusick {
21553889Smckusick 	int vt100_open(), vt100_read(), vt100_write(), vt100_ioctl();
21653889Smckusick 
21753889Smckusick 	vt100_cons.open = vt100_open;
21853889Smckusick 	vt100_cons.read = vt100_read;
21953889Smckusick 	vt100_cons.write = vt100_write;
22053889Smckusick 	vt100_cons.ioctl = vt100_ioctl;
22153889Smckusick }
22253889Smckusick 
22353889Smckusick #define DIMMER_RESET	0
22453889Smckusick #define DIMMER_ON	1
22553889Smckusick #define DIMMER_OFF	2
22653889Smckusick #define DIMMER_INTERVAL	60		/* sec */
22753889Smckusick 
22853889Smckusick static int dimmer_stdport;
22953889Smckusick 
auto_dimmer()23053889Smckusick auto_dimmer()
23153889Smckusick {
23253889Smckusick 	register int select, i;
23353889Smckusick 	register int dimm_counter = DIM_CNT_DFLT;
23453889Smckusick 	register int dimm_level = 0;
23553889Smckusick 	int ports[2], *mode;
23653889Smckusick 
23753889Smckusick 	spl0();
23853889Smckusick 	ports[0] = dimmer_stdport = STDPORT;
23953889Smckusick 	ports[1] = port_create("auto_dimmer_sub");
24053889Smckusick 	register_interval(ports[1], DIMMER_INTERVAL);
24153889Smckusick 	for(;;) {
24253889Smckusick 		select = msg_select(2, ports);
24353889Smckusick 		if (select == 0) {
24453889Smckusick 			msg_recv(ports[0], NULL, &mode, NULL, 0);
24553889Smckusick 			switch (*mode) {
24653889Smckusick 			case DIMMER_RESET:
24753889Smckusick 				if (!a_dim_on)
24853889Smckusick 					break;
24953889Smckusick 				dimm_counter = dim_cnt;
25053889Smckusick 				if (dimm_level > 0) {
25153889Smckusick 					dimm_level =0;
25253889Smckusick 					for (i = 0; i < nfbdev; i++)
25353889Smckusick 						fbbm_set_dimmer(&fbdev[i], 0);
25453889Smckusick 				}
25553889Smckusick 				break;
25653889Smckusick 			case DIMMER_ON:
25753889Smckusick 				dimm_counter = dim_cnt;
25853889Smckusick 				dimm_level =0;
25953889Smckusick 				for (i = 0; i < nfbdev; i++)
26053889Smckusick 					fbbm_set_dimmer(&fbdev[i], dimm_level);
26153889Smckusick 				a_dim_on = 1;
26253889Smckusick 				break;
26353889Smckusick 			case DIMMER_OFF:
26453889Smckusick 				dimm_counter = dim_cnt;
26553889Smckusick 				dimm_level =0;
26653889Smckusick 				for (i = 0; i < nfbdev; i++)
26753889Smckusick 					fbbm_set_dimmer(&fbdev[i], dimm_level);
26853889Smckusick 				a_dim_on = 0;
26953889Smckusick 				break;
27053889Smckusick 			}
27153889Smckusick 		} else {
27253889Smckusick 			msg_recv(ports[1], NULL, NULL, NULL, 0);
27353889Smckusick 			if (a_dim_on && (dimm_counter-- <= 0)) {
27453889Smckusick 				if (dimm_level < 3) {
27553889Smckusick 					dimm_level++;
27653889Smckusick 				}
27753889Smckusick 				for (i = 0; i < nfbdev; i++)
27853889Smckusick 					fbbm_set_dimmer(&fbdev[i], dimm_level);
27953889Smckusick 				dimm_counter = dim_cnt;
28053889Smckusick 			}
28153889Smckusick 		}
28253889Smckusick 	}
28353889Smckusick }
28453889Smckusick 
rst_dimmer_cnt()28553889Smckusick rst_dimmer_cnt()
28653889Smckusick {
28753889Smckusick 	register int diff;
28853889Smckusick 	static unsigned last_time;
28953889Smckusick 	extern unsigned sys_time;
29053889Smckusick 	int mode = DIMMER_RESET;
29153889Smckusick 
29253889Smckusick 	diff = sys_time - last_time;
29353889Smckusick 	if (diff > DIMMER_INTERVAL*HZ || diff < 0) {
29453889Smckusick 		dimmer(DIMMER_RESET);
29553889Smckusick 		last_time = sys_time;
29653889Smckusick 	}
29753889Smckusick }
29853889Smckusick 
auto_dimmer_on()29953889Smckusick auto_dimmer_on()
30053889Smckusick {
30153889Smckusick 	dimmer(DIMMER_ON);
30253889Smckusick }
30353889Smckusick 
auto_dimmer_off()30453889Smckusick auto_dimmer_off()
30553889Smckusick {
30653889Smckusick 	dimmer(DIMMER_OFF);
30753889Smckusick }
30853889Smckusick 
dimmer(mode)30953889Smckusick dimmer(mode)
31053889Smckusick 	int mode;
31153889Smckusick {
31253889Smckusick 	if (dimmer_stdport)
31353889Smckusick 		msg_send(dimmer_stdport, 0, &mode, sizeof(mode), 0);
31453889Smckusick }
31553889Smckusick #else /* IPC_MRX */
31653889Smckusick 
31753889Smckusick static int dimmer_counter = DIM_CNT_DFLT;
31853889Smckusick static int dim_level = 0;
31953889Smckusick 
32053889Smckusick #ifdef CPU_SINGLE
auto_dimmer()32153889Smckusick auto_dimmer()
32253889Smckusick {
32353889Smckusick 	register int s, i;
32453889Smckusick 
32553889Smckusick 	s = spl4();
32653889Smckusick 	if (a_dim_on && (dimmer_counter-- <= 0)) {
32753889Smckusick 		if (dim_level < 3)
32853889Smckusick 			dim_level++;
32953889Smckusick 		for (i = 0; i < nfbdev; i++)
33053889Smckusick 			fbbm_set_dimmer(&fbdev[i], dim_level);
33153889Smckusick 		dimmer_counter = dim_cnt;
33253889Smckusick 	}
33353889Smckusick 	splx(s);
33453889Smckusick 	timeout(auto_dimmer, (caddr_t) 0, 60 * hz);
33553889Smckusick }
33653889Smckusick #endif
33753889Smckusick 
rst_dimmer_cnt()33853889Smckusick rst_dimmer_cnt()
33953889Smckusick {
34053889Smckusick 	register int	s, i;
34153889Smckusick 
34253889Smckusick 	if (!a_dim_on)
34353889Smckusick 		return;
34453889Smckusick #ifdef CPU_SINGLE
34553889Smckusick 	s = spl4();
34653889Smckusick #endif
34753889Smckusick 	dimmer_counter = dim_cnt;
34853889Smckusick 
34953889Smckusick 	if (dim_level > 0) {
35053889Smckusick 		dim_level =0;
35153889Smckusick 		for (i = 0; i < nfbdev; i++)
35253889Smckusick 			fbbm_set_dimmer(&fbdev[i], 0);
35353889Smckusick 	}
35453889Smckusick 	splx(s);
35553889Smckusick }
35653889Smckusick 
auto_dimmer_on()35753889Smckusick auto_dimmer_on()
35853889Smckusick {
35953889Smckusick 	register int s, i;
36053889Smckusick 
36153889Smckusick #ifdef CPU_SINGLE
36253889Smckusick 	s = spl4();
36353889Smckusick #endif
36453889Smckusick 	dimmer_counter = dim_cnt;
36553889Smckusick 	dim_level =0;
36653889Smckusick 	for (i = 0; i < nfbdev; i++)
36753889Smckusick 		fbbm_set_dimmer(&fbdev[i], dim_level);
36853889Smckusick 	a_dim_on = 1;
36953889Smckusick 	splx(s);
37053889Smckusick }
37153889Smckusick 
auto_dimmer_off()37253889Smckusick auto_dimmer_off()
37353889Smckusick {
37453889Smckusick 	register int s, i;
37553889Smckusick 
37653889Smckusick #ifdef CPU_SINGLE
37753889Smckusick 	s = spl4();
37853889Smckusick #endif
37953889Smckusick 	dimmer_counter = dim_cnt;
38053889Smckusick 	dim_level =0;
38153889Smckusick 	for (i = 0; i < nfbdev; i++)
38253889Smckusick 		fbbm_set_dimmer(&fbdev[i], dim_level);
38353889Smckusick 	a_dim_on = 0;
38453889Smckusick 	splx(s);
38553889Smckusick }
38653889Smckusick #endif /* IPC_MRX */
38753889Smckusick /*
38853889Smckusick  *  The routine `_putc(sp, c)' only prints a character c with the cursor
38953889Smckusick  *  attributes by using `copy_char(x, y, c, attributes)'.
39053889Smckusick  *  And when IRM (terminal insertion-replacement mode) is set, the characters
39153889Smckusick  *  righthand side of the cursor are shifted right and lost when they passed
39253889Smckusick  *  beyond the right margin.
39353889Smckusick  *  The position is specified by the sp pointer of the structure SCREEN.
39453889Smckusick  *
39553889Smckusick  */
39653889Smckusick static
_putc(sp,c,kanji)39753889Smckusick _putc(sp, c, kanji)
39853889Smckusick 	register SCREEN	*sp;
39953889Smckusick 	unsigned int c;
40053889Smckusick {
40153889Smckusick 	if (sp->s_term_mode & IRM) {
40253889Smckusick 		vt_flush(&(sp->s_csr));
40353889Smckusick 		move_chars(sp->s_csr.csr_x, sp->s_csr.csr_y,
40453889Smckusick 			   rit_m - sp->s_csr.csr_x - ((kanji)? 1: 0),
40553889Smckusick 			   sp->s_csr.csr_x + ((kanji) ? 2: 1));
40653889Smckusick 		copy_char(sp, c, kanji);
40753889Smckusick 	}
40853889Smckusick 	if (fp) {
40953889Smckusick 		fbuf[fp++] = c;
41053889Smckusick 		fpn += kanji + 1;
41153889Smckusick 	} else {
41253889Smckusick 		fbuf[fp++] = c;
41353889Smckusick 		fpp = sp->s_csr.csr_p;
41453889Smckusick 		fpa = sp->s_csr.csr_attributes;
41553889Smckusick 		fpn = kanji + 1;
41653889Smckusick 	}
41753889Smckusick }
41853889Smckusick 
41953889Smckusick /*
42053889Smckusick  *  Scroll up and down in the scroll region.
42153889Smckusick  *  New oriented line must be cleared with terminal mode, that is whether
42253889Smckusick  *  the screen is reverse mode or not.
42353889Smckusick  */
scroll_up(top,bottom,revsw,fcol,bcol)42453889Smckusick scroll_up(top, bottom, revsw, fcol, bcol)
42553889Smckusick 	int top;
42653889Smckusick 	int bottom;
42753889Smckusick 	int revsw;
42853889Smckusick 	int fcol;
42953889Smckusick 	int bcol;
43053889Smckusick {
43153889Smckusick 	move_lines(top + 1, bottom - top, top);
43253889Smckusick 	clear_lines(bottom, 1, revsw, fcol, bcol);
43353889Smckusick }
43453889Smckusick 
scroll_down(top,bottom,revsw,fcol,bcol)43553889Smckusick scroll_down(top, bottom, revsw, fcol, bcol)
43653889Smckusick 	int top;
43753889Smckusick 	int bottom;
43853889Smckusick 	int revsw;
43953889Smckusick 	int fcol;
44053889Smckusick 	int bcol;
44153889Smckusick {
44253889Smckusick 	move_lines(top, bottom - top, top + 1);
44353889Smckusick 	clear_lines(top, 1, revsw, fcol, bcol);
44453889Smckusick }
44553889Smckusick 
44653889Smckusick /*
44753889Smckusick  *  Back space
44853889Smckusick  *  back_space(sp) moves cursor next to left at current cursor position.
44953889Smckusick  *  The cursor can not move beyond left or right margin.
45053889Smckusick  */
back_space(sp)45153889Smckusick back_space(sp)
45253889Smckusick 	register SCREEN *sp;
45353889Smckusick {
45453889Smckusick 	register struct cursor *spc = &sp->s_csr;
45553889Smckusick 
45653889Smckusick 	cursor_off();
45753889Smckusick 	if (spc->csr_x > LFT_M) {
45853889Smckusick 		spc->csr_x -= 1;
45953889Smckusick 		spc->csr_p.x -= char_w;
46053889Smckusick 	}
46153889Smckusick 	cursor_on(&spc->csr_p);
46253889Smckusick }
46353889Smckusick 
46453889Smckusick /*
46553889Smckusick  *  Tab stop
46653889Smckusick  *  next_tab_stop(sp) moves cursor to next tab stop.
46753889Smckusick  */
next_tab_stop(sp)46853889Smckusick next_tab_stop(sp)
46953889Smckusick 	register SCREEN *sp;
47053889Smckusick {
47153889Smckusick 	register int i;
47253889Smckusick 
47353889Smckusick 	cursor_off();
47453889Smckusick 	for (i = sp->s_csr.csr_x + 1; i < rit_m; i++)
47553889Smckusick 		if (sp->s_tab_pos[i] == 1)
47653889Smckusick 			break;
47755762Sbostic 	sp->s_csr.csr_x = min(i, rit_m);
47853889Smckusick 	sp->s_csr.csr_p.x = (sp->s_csr.csr_x - 1) * char_w + x_ofst;
47953889Smckusick 	cursor_on(&sp->s_csr.csr_p);
48053889Smckusick }
48153889Smckusick 
48253889Smckusick /*
48353889Smckusick  *  Carriage return
48453889Smckusick  *  carriage_ret(sp) moves cursor at beginning of the current line.
48553889Smckusick  */
carriage_ret(sp)48653889Smckusick carriage_ret(sp)
48753889Smckusick 	register SCREEN *sp;
48853889Smckusick {
48953889Smckusick 	cursor_off();
49053889Smckusick 	sp->s_csr.csr_x = LFT_M;
49153889Smckusick 	sp->s_csr.csr_p.x = x_ofst;
49253889Smckusick 	cursor_on(&sp->s_csr.csr_p);
49353889Smckusick }
49453889Smckusick 
49553889Smckusick /*
49653889Smckusick  *  Bell
49753889Smckusick  */
49853889Smckusick static
bell()49953889Smckusick bell()
50053889Smckusick {
50153889Smckusick #ifdef news1800
50253889Smckusick 	static int port;
50353889Smckusick 
50453889Smckusick 	if (port == 0)
50553889Smckusick 		port = port_create("port_cons_bell");
50653889Smckusick 	kbd_ioctl(port, KIOCBELL, &bell_len);
50753889Smckusick #else
50853889Smckusick 	kbd_ioctl(SCC_KEYBOARD, KIOCBELL, &bell_len);
50953889Smckusick #endif
51053889Smckusick 	return (0);
51153889Smckusick }
51253889Smckusick 
51353889Smckusick int
Putchar(c,eob)51453889Smckusick Putchar(c, eob)
51553889Smckusick 	unsigned int c;
51653889Smckusick {
51753889Smckusick 	register SCREEN *sp = &screen;
51853889Smckusick 	unsigned int sftjis_to_jis();
51953889Smckusick 
52053889Smckusick 	c &= 0xff;
52153889Smckusick 
52253889Smckusick 	if (eob) {
52353889Smckusick 		vt_flush(&(sp->s_csr));
52453889Smckusick 		return(0);
52553889Smckusick 	}
52653889Smckusick 
52753889Smckusick 	if (c == 0x1b) {	/*  c == esc */
52853889Smckusick 		vt_flush(&(sp->s_csr));
52953889Smckusick 		recover(sp);
53053889Smckusick 		sp->s_current_stat |= ESCAPE;
53153889Smckusick 		return;
53253889Smckusick 	} else if (sp->s_current_stat & ESCAPE) {
53353889Smckusick 		(*sp->s_esc_handler)(sp, c);
53453889Smckusick 		return;
53553889Smckusick 	} else if (sp->s_current_stat & SKANJI) {
53653889Smckusick 		c = sftjis_to_jis(first_code, c);
53753889Smckusick 		if (sp->s_current_stat & JKANJI) {
53853889Smckusick 			addch(sp, c);
53953889Smckusick 		} else {
54053889Smckusick 			sp->s_current_stat |= JKANJI;
54153889Smckusick 			addch(sp, c);
54253889Smckusick 			sp->s_current_stat &= ~JKANJI;
54353889Smckusick 		}
54453889Smckusick 		sp->s_current_stat &= ~SKANJI;
54553889Smckusick 		goto set_csr;
54653889Smckusick 	} else if (sp->s_current_stat & EKANJI) {
54753889Smckusick 		c = (c & 0x7f) | (first_code << 8);
54853889Smckusick 		if (sp->s_current_stat & JKANJI) {
54953889Smckusick 			addch(sp, c);
55053889Smckusick 		} else {
55153889Smckusick 			sp->s_current_stat |= JKANJI;
55253889Smckusick 			addch(sp, c);
55353889Smckusick 			sp->s_current_stat &= ~JKANJI;
55453889Smckusick 		}
55553889Smckusick 		sp->s_current_stat &= ~EKANJI;
55653889Smckusick 		goto set_csr;
55753889Smckusick 	} else if (sp->s_current_stat & JKANJI) {
55853889Smckusick 		jiskanji(sp, c);
55953889Smckusick 		goto set_csr;
56053889Smckusick 	} else if (sp->s_current_stat & EKANA) {
56153889Smckusick 			sp->s_current_stat &= ~EKANA;
56253889Smckusick 			addch(sp, c);
56353889Smckusick 		goto set_csr;
56453889Smckusick 	}
56553889Smckusick 	if (c < 0x20) {		/*  control code	*/
56653889Smckusick 		vt_flush(&(sp->s_csr));
56753889Smckusick 		switch (c) {
56853889Smckusick 		case  0x00:	/*  ignore  */
56953889Smckusick 			break;
57053889Smckusick 		case  0x07:	/*  bell  */
57153889Smckusick 			bell();
57253889Smckusick 			break;
57353889Smckusick 		case  0x08:	/*  back space  */
57453889Smckusick 			back_space(sp);
57553889Smckusick 			break;
57653889Smckusick 		case  0x09:	/*  tabulation  */
57753889Smckusick 			next_tab_stop(sp);
57853889Smckusick 			break;
57953889Smckusick 		case  0x0a:	/*  line feed  */
58053889Smckusick 		case  0x0b:	/*  vertical feed  */
58153889Smckusick 		case  0x0c:	/*  form feed  */
58253889Smckusick 			esc_index(sp);
58353889Smckusick 			break;
58453889Smckusick 		case  0x0d:	/*  carriage return  */
58553889Smckusick 			carriage_ret(sp);
58653889Smckusick 			break;
58753889Smckusick 		case  0x0e:	/*  shift out  */
58853889Smckusick 			break;
58953889Smckusick 		case  0x0f:	/*  shift in  */
59053889Smckusick 			break;
59153889Smckusick 		case  0x11:	/*  xon  */
59253889Smckusick 			break;
59353889Smckusick 		case  0x13:	/*  xoff  */
59453889Smckusick 			break;
59553889Smckusick 		case  0x18:	/*  cancel  */
59653889Smckusick 			sp->s_current_stat &= ~ESCAPE;
59753889Smckusick 			break;
59853889Smckusick 		case  0x1b:	/*  escape  */
59953889Smckusick 			/*	NOT REACHED	*/
60053889Smckusick 			recover(sp);
60153889Smckusick 			sp->s_current_stat |= ESCAPE;
60253889Smckusick 			break;
60353889Smckusick 		case  0x7f:	/*  delete  */
60453889Smckusick 			break;
60553889Smckusick 
60653889Smckusick 		default:
60753889Smckusick 			break;
60853889Smckusick 		}
60953889Smckusick 	} else {
61053889Smckusick 		switch (tmode) {
61153889Smckusick #ifdef KM_SJIS
61253889Smckusick 		case KM_SJIS:
61353889Smckusick 			if ((c >= JVR1S && c <= JVR1E) ||
61453889Smckusick 				(c >= JVR2S && c <= JVR2E)) {
61553889Smckusick 				sp->s_current_stat |= SKANJI;
61653889Smckusick 				first_code = c;
61753889Smckusick 			}
61853889Smckusick 			else
61953889Smckusick 				addch(sp, c);
62053889Smckusick 			break;
62153889Smckusick #endif
62253889Smckusick #ifdef KM_EUC
62353889Smckusick 		case KM_EUC:
62453889Smckusick 			if (c >= CS1S && c <= CS1E) {
62553889Smckusick 				sp->s_current_stat |= EKANJI;
62653889Smckusick 				first_code = c & 0x7f;
62753889Smckusick 			}
62853889Smckusick 			else if (c == SS2)
62953889Smckusick 				sp->s_current_stat |= EKANA;
63053889Smckusick 			else
63153889Smckusick 				addch(sp, c);
63253889Smckusick 			break;
63353889Smckusick #endif
63453889Smckusick #ifdef KM_JIS
63553889Smckusick 		case KM_JIS:
63653889Smckusick #endif
63753889Smckusick #ifdef KM_ASCII
63853889Smckusick 		case KM_ASCII:
63953889Smckusick #endif
64053889Smckusick 		default:
64153889Smckusick 			addch(sp, c);
64253889Smckusick 		}
64353889Smckusick 	}
64453889Smckusick 
64553889Smckusick set_csr:
64653889Smckusick 	cursor_on(&sp->s_csr.csr_p);
64753889Smckusick 		/*  altered	*/
64853889Smckusick 	return ;
64953889Smckusick }
65053889Smckusick 
65153889Smckusick /*
65253889Smckusick  *  A printable character is printed in this routine by using
65353889Smckusick  *  the routine `_putc()'.
65453889Smckusick  *  Anyway, a character is printed in replacement mode or insertion
65553889Smckusick  *  mode and if the terminal is autowrap then it takes place wrapping
65653889Smckusick  *  and if cursor is bottom margin of the scroll region then it takes
65753889Smckusick  *  place scroll up.
65853889Smckusick  *  The escape sequence handling is another routine.
65953889Smckusick  *
66053889Smckusick  */
addch(sp,c)66153889Smckusick addch(sp, c)
66253889Smckusick 	register SCREEN	*sp;
66353889Smckusick 	unsigned int c;
66453889Smckusick {
66553889Smckusick 	register struct cursor *spc = &(sp->s_csr);
66653889Smckusick 	register struct region *spr = &(sp->s_region);
66753889Smckusick 
66853889Smckusick 	if (spc->csr_x >= rit_m ||
66953889Smckusick 		((sp->s_current_stat & JKANJI) && (spc->csr_x >= rit_m - 1))) {
67053889Smckusick 		vt_flush(spc);
67153889Smckusick 		if (sp->s_term_mode & DECAWM) {
67253889Smckusick 			if ((sp->s_current_stat & WRAP) || (spc->csr_x == rit_m
67353889Smckusick 					&& sp->s_current_stat & JKANJI)) {
67453889Smckusick 				if (spc->csr_y == spr->btm_margin) {
67553889Smckusick 					cursor_off();
67653889Smckusick 					scroll_up(spr->top_margin,
67753889Smckusick 						  spr->btm_margin,
67853889Smckusick 						  sp->s_term_mode & DECSCNM,
67953889Smckusick 						  sp->s_plane, sp->s_bgcol);
68053889Smckusick 					cursor_on(&(spc->csr_p));
68153889Smckusick 				} else if (spc->csr_y < btm_m) {
68253889Smckusick 					spc->csr_y += 1;
68353889Smckusick 					spc->csr_p.y += char_h;
68453889Smckusick 				}
68553889Smckusick 				spc->csr_x = LFT_M;
68653889Smckusick 				spc->csr_p.x = x_ofst;
68753889Smckusick 				addch(sp, c);
68853889Smckusick 				return;
68953889Smckusick 			}
69053889Smckusick 			sp->s_current_stat |= WRAP;
69153889Smckusick 		}
69253889Smckusick 		if (sp->s_current_stat & JKANJI) {
69353889Smckusick 			if (spc->csr_x != rit_m) {
69453889Smckusick 				_putc(sp, c, 1);
69553889Smckusick 			}
69653889Smckusick 		} else {
69753889Smckusick 			_putc(sp, c, 0);
69853889Smckusick 		}
69953889Smckusick 		if (spc->csr_x < rit_m) {
70053889Smckusick 			spc->csr_x += 1;
70153889Smckusick 			spc->csr_p.x += char_w;
70253889Smckusick 		}
70353889Smckusick 
70453889Smckusick 		return ;
70553889Smckusick 	}
70653889Smckusick 	if (sp->s_current_stat & JKANJI) {
70753889Smckusick 		_putc(sp, c, 1);
70853889Smckusick 		spc->csr_x++;
70953889Smckusick 		spc->csr_p.x += char_w;
71053889Smckusick 	} else {
71153889Smckusick 		_putc(sp, c, 0);
71253889Smckusick 	}
71353889Smckusick 
71453889Smckusick 	spc->csr_x++;	/*  altered   */
71553889Smckusick 	spc->csr_p.x += char_w;
71653889Smckusick 
71753889Smckusick 	sp->s_current_stat &= ~WRAP;
71853889Smckusick 	return ;
71953889Smckusick }
720