head 1.9; branch ; access ; symbols ; locks ; comment @ * @; 1.9 date 89.07.06.19.41.33; author pkern; state Exp; branches ; next 1.8; 1.8 date 89.05.19.13.40.55; author pkern; state Exp; branches ; next 1.7; 1.7 date 89.02.15.16.57.28; author pkern; state Exp; branches ; next 1.6; 1.6 date 89.02.03.14.38.32; author pkern; state Exp; branches ; next 1.5; 1.5 date 89.02.01.18.22.24; author pkern; state Exp; branches ; next 1.4; 1.4 date 89.01.31.13.57.12; author pkern; state Exp; branches ; next 1.3; 1.3 date 89.01.31.13.52.01; author pkern; state Exp; branches ; next 1.2; 1.2 date 89.01.31.13.48.54; author pkern; state Exp; branches ; next 1.1; 1.1 date 89.01.31.13.23.45; author pkern; state Exp; branches ; next ; desc @@ 1.9 log @screen saving added. screen blanked if inactive for SAV_CNT units Break/shift-Break misunderstanding corrected. @ text @/* * term.c: * term(): the terminal. * devset(): assigns xmit & recv function pointers and * handles other setings and "devices." * * Copyright (c) 1989 University of Toronto. All rights reserved. * Anyone may use or copy this software, except that it may not be * sold for profit, that this copyright notice remain intact, and that * credit is given where it is due. The University of Toronto and the * author make no warranty and accept no liability for this software. */ static char rcsid[] = "$Header: cterm.c,v 1.8 89/05/19 13:40:55 pkern Exp $"; #include "cterm.h" uchar cx=1, cy=1; /* current cursor position */ uchar tx=0, ty=0; /* cursor "memory" (for wrap, scroll, etc.) */ extern char ansback[]; extern char *cset, *g0, *g1; extern char *usascii, *ukascii; extern char *keypadv[]; extern uchar keyboom; extern uchar m_ansi, m_crskey, m_keypad; extern uchar m_columns, m_wrap, m_newline; extern uchar m_insert, m_repeat, m_reverse; extern uchar srgn_bot, srgn_top; extern uchar local, transparent, echo, xoff, cursor; extern uchar ignrflow, devrep, altkey, vtidnum, txtxfr, scsaver; extern char rxoff; extern unsigned int cntdn; extern int recv_chr(), trns_chr(); extern int xmit_chr(), xmit_lcl(), xmit_eko(); extern int burpc(), insurpc(), ansi(), vt52(); extern int kbdhit(), kbdget(); int avofs = ANSOFS; /* ansi/vt52 keypadv "offset" bits */ int altmask = 0; /* extended key-code mask */ int (*xmit)(), (*recv)(); /* xmit = output to "comm port" */ int (*o_xmit)(), (*o_recv)(); /* recv = input from "comm port" */ int (*burp)(); /* output to "screen" */ int (*keyg)(), (*o_keyg)(); /* input from "keyboard" */ int (*keyhit)(), (*o_keyhit)(); /* check key queue */ /* * term -- the main loop, the guts, "where the action is" * "key" input has priority. Only after the "key type-ahead" * buffer is emptied does it check the input buffer. * (except when rxoff is high (ie. a remote XOFF request)) */ term() { char *p; int zip(); register int c; uchar estat = 0; cset = g0 = g1 = usascii; devset(); while (!keyboom) { if (!keyhit()) goto incoming; cntdn = SAV_CNT; do { /* drain key buffer(s) */ if ((c = keyg()) & 0xff) { /* ascii keys */ xmit(c); if (c < SP) switch (c) { case CR: if (m_newline) xmit(LF); break; case XOFF: xoff++; break; case XON: xoff=0; break; default: break; } } else if ((c = kbdfn(c)) & altmask) /* alt key */ xmit(c >> 8); else if (c & 0x80) /* setup keys */ setups(); else if (c & 0x40) { /* send BREAK or NUL, or hang up */ if (c & 1) xmit(NUL); else if (c & 2) hang_up(); else if (!local) send_brk(); } else { /* function "keys" */ c &= 0xff; /* mask off alt code */ c |= (c & 0x18) ? m_keypad : m_crskey; p = keypadv[c | avofs]; zip(p); if (rxoff) break; } } while (keyhit()); incoming: /* check incoming buffer(s) */ if ((c = recv()) < 0) { if (!scsaver || cntdn) continue; blankit(1); while (!keyhit() && (c = recv()) < 0) ; blankit(0); if (c < 0) continue; } cntdn = SAV_CNT; if (c & 0x60) { /* visible ascii */ if (estat) { /* still in an esc sequence */ /* * continue esc() with new char. * if esc() finishes and if a wraparound * was pending and the cursor was moved * by the esc sequence then reset tx. */ if (!(estat = esc(c, estat)) && tx && !(ty == cy && tx == cx)) tx = 0; continue; } splat: /* * wraparound handling: tx indicates a visible * char was last placed in the final column. * if our line position (cy) hasn't changed * and if m_wrap then if we're at the end of a * scroll region, scroll else move down 1 line. * (phew! got that? :-) */ if (tx && ty == cy && m_wrap) { tx = ty = 0; curs_xy(cx=1, cy); /* CR */ if (cy == srgn_bot) /* scroll it */ #ifdef TI /* * seems TI bios scrolls faster * when burping LF than with * scrl_up(1,1,24), so let's try * to take advantage of that. */ if (srgn_top-1 || cy < 24) scrl_up(1, srgn_top, srgn_bot, cx, cy); else burp(LF, cx, cy); #else scrl_up(1, srgn_top, srgn_bot, cx, cy); #endif else if (cy < 24) curs_xy(cx, ++cy); } burp(cset[c], cx++, cy); /* screen it */ if (cx > m_columns) { /* at last column? */ /* * next char might wraparound * so remember where we are now. * might have to scroll or LF next time. */ ty = cy; tx = cx = m_columns; curs_xy(cx, cy); } continue; } switch (c) { /* control chars */ case CR: tx = 0; curs_xy(cx=1, cy); break; case LF: case VT: case FF: tx = 0; if (cy == srgn_bot) /* scroll it */ #ifdef TI if (cy < 24 || srgn_top-1) scrl_up(1, srgn_top, srgn_bot, cx, cy); else burp(LF, cx, cy); #else scrl_up(1, srgn_top, srgn_bot, cx, cy); #endif else if (cy < 24) curs_xy(cx, ++cy); break; case CAN: /* cancel current esc sequence */ if (!estat) /* no current sequence */ goto splat; /* ... so show it */ estat = 0; /* else start fresh */ break; case ESC: estat = 0; /* start fresh */ if (!(estat = esc(c, estat)) && tx && !(ty == cy && tx == cx)) tx = 0; break; case HT: tx = 0; curs_xy(cx=tab(cx), cy); break; case BS: tx = 0; if (cx > 1) curs_xy(--cx, cy); break; case SO: cset = g1; break; case SI: cset = g0; break; /* case DC1: kb_unlock(); break; /* remote XON */ /* case DC3: kb_lock(); break; /* remote XOFF */ case DC1: rxoff = 0; break; case DC3: if (!ignrflow) rxoff++; break; case BEL: beep(cx, cy); break; case ENQ: p = ansback; zip(p); break; case NUL: break; default: /* not a special ctrl char? */ /* ok burp it, lessee what happens */ goto splat; } } } /* * choose devices(ie. procedures) according to current options. */ devset() { xypos(&cx, &cy); curs_type(cursor); kbautorep(m_repeat); bkgnd(m_reverse); nlmod(m_newline); genstat(cx, cy); if (ignrflow) rxoff = 0; vtidnum = (devrep) ? 1 : 2; /* see misc.c */ avofs = (m_ansi) ? ANSOFS : OFS52; altmask = (altkey) ? 0xff00 : 0x0; /* enable 8th-bit */ xmit = (echo || local)? (echo ? xmit_eko : xmit_lcl): xmit_chr; recv = (transparent) ? trns_chr : recv_chr; burp = (m_insert) ? insurpc : burpc; esc = (m_ansi) ? ansi : vt52; keyg = kbdget; keyhit = kbdhit; o_xmit = xmit; o_recv = recv; o_keyg = keyg; o_keyhit = keyhit; if (txtxfr) /* ... then reassign keyg() */ txtset(); cntdn = SAV_CNT; counter(scsaver); } /* * zip -- xmit string of chars */ zip(p) register char *p; { while (*p) xmit(*p++ & 0x7f); } @ 1.8 log @*** empty log message *** @ text @d13 1 a13 1 static char rcsid[] = "$Header: cterm.c,v 1.7 89/02/15 16:57:28 pkern Exp $"; d31 1 a31 1 extern uchar ignrflow, devrep, altkey, vtidnum, txtxfr; d34 1 d67 3 a69 1 while (keyhit()) { /* drain key buffer(s) */ d88 2 a89 1 else if (c & 0x40) { /* send BREAK or NUL */ d91 1 d101 11 d113 1 a114 3 /* check incoming buffer(s) */ if ((c = recv()) < 0) continue; a217 1 break; /* not reached */ a232 1 init_gfx(); d253 3 @ 1.7 log @ALT key 8-bit code added @ text @d4 1 a4 1 * devset(): assigns xmit & recv and d7 5 a11 1 * copyright (c) University of Toronto, 1988. d13 1 a13 1 static char rcsid[] = "$Header: cterm.c,v 1.6 89/02/03 14:38:32 pkern Exp $"; a25 1 extern uchar m_insert, m_repeat; d28 1 d217 1 @ 1.6 log @beep() added. @ text @d9 1 a9 1 static char rcsid[] = "$Header: cterm.c,v 1.5 89/02/01 18:22:24 pkern Exp $"; d27 1 a27 1 extern uchar ignrflow, devrep, vtidnum, txtxfr; d37 1 d77 3 a79 1 else if ((c = kbdfn(c)) & 0x80) /* setup keys */ d86 1 d190 2 a191 2 /* case DC1: kbunlck(); break; /* XON */ /* case DC3: kblock(); break; /* XOFF */ d220 1 @ 1.5 log @need for delay for xmit-ing strings on PCs is fixed @ text @d9 1 a9 1 static char rcsid[] = "$Header: cterm.c,v 1.4 89/01/31 13:57:12 pkern Exp $"; d137 1 a137 1 burp(*(cset+c), cx++, cy); /* screen it */ d190 1 a190 4 case BEL: /* might want to have another BEL. * in the meantime let bios handle it */ burp(c, cx, cy); break; @ 1.4 log @*** empty log message *** @ text @d9 1 a9 1 static char rcsid[] = "$Header: cterm.c,v 1.3 89/01/31 13:52:01 pkern Exp $"; a65 6 #ifdef PC if (m_newline) { dsleep(1); xmit(LF); } #else a66 1 #endif a241 6 #ifdef PC while (*p) { xmit(*p++ & 0x7f); dsleep(1); } #else a243 1 #endif @ 1.3 log @keyhit now a function pointer, o_keyhit added. TI and PC differences are #ifdef ... #else ... #endif outlined @ text @a5 3 * note: some code gets repeated here and there. * this may not be pretty but it keeps the * main loops from getting bogged down. d9 1 a9 1 static char rcsid[] = "$Header: cterm.c,v 1.2 89/01/31 13:48:54 pkern Exp $"; d120 1 @ 1.2 log @*** empty log message *** @ text @d12 1 a12 1 static char rcsid[] = "$Header$"; d14 1 a14 1 #include "common.h" d24 1 a24 1 extern uchar keyboom, keyhit; d37 1 a37 1 extern int kbdget(); d44 1 d64 1 a64 1 while (keyhit) { /* drain key buffer(s) */ d69 6 d76 1 d128 1 a128 3 #ifndef QUIKSCROLL scrl_up(1, srgn_top, srgn_bot, cx, cy); #else d139 2 d166 1 a166 3 #ifndef QUIKSCROLL scrl_up(1, srgn_top, srgn_bot, cx, cy); #else d171 2 d234 1 d239 1 d251 6 d259 1 @ 1.1 log @Initial revision @ text @d12 1 a12 1 static char *ID = "term.c Oct/88 Univ. of Toronto"; @