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