📄 tek.c
字号:
int x, y;{ register struct tek *tp; tp = (struct tek *) dp; if (tp->mode == GIN) { tp->tekpos.x = x; tp->tekpos.y = y; tek_move(tp->tdata, tp->tekpos.x, tp->tekpos.y); }}#endif/********************* internal routines********************/static voidtek_putchar(tp, c) register struct tek *tp; register u_char c;{ register struct Point *tfsp; c &= 0xff; tfsp = &tekfontsize[tp->font]; if (c == TAB) c = SP; if (c >= 0x20) { tek_char(tp->tdata, c); tp->tekpos.x += tfsp->x; if (tp->tekpos.x >= TXSIZE) { tp->tekpos.y -= tfsp->y; if (tp->tekpos.y < 0) { /* use other margin */ if (tp->straps & MARG1) { if (tp->straps & ACOPY) { tek_makecopy(tp->tdata); tek_page(tp); tp->full = 0; } else if (!tp->full) { tek_pagefull_on(tp->tdata); tp->full = 1; } tp->margin = 0; } else if (tp->margin == 0) { tp->margin = TXSIZE / 2; } else { if (tp->straps & MARG2) { if (tp->straps & ACOPY) { tek_makecopy(tp->tdata); tek_page(tp); tp->full = 0; } else if (!tp->full) { tek_pagefull_on(tp->tdata); tp->full = 1; } } tp->margin = 0; } tp->tekpos.y = TYSIZE - 1; } tp->tekpos.x = tp->margin; } } else { switch (c) { case LF: tp->tekpos.y -= tfsp->y; if (tp->tekpos.y < 0) { /* use other margin */ if (tp->straps & MARG1) { if (tp->straps & ACOPY) { tek_makecopy(tp->tdata); tek_page(tp); tp->full = 0; } else if (!tp->full) { tek_pagefull_on(tp->tdata); tp->full = 1; } tp->margin = 0; } else if (tp->margin == 0) { tp->margin = TXSIZE / 2; if (tp->tekpos.x < TXSIZE / 2) tp->tekpos.x += TXSIZE / 2; } else { if (tp->straps & MARG2) { if (tp->straps & ACOPY) { tek_makecopy(tp->tdata); tek_page(tp); tp->full = 0; } else if (!tp->full) { tek_pagefull_on(tp->tdata); tp->full = 1; } } tp->margin = 0; if (tp->tekpos.x >= TXSIZE / 2) tp->tekpos.x -= TXSIZE / 2; } tp->tekpos.y = TYSIZE - 1; } break; case CR: tp->tekpos.x = tp->margin; break; case BS: tp->tekpos.x -= tfsp->x; if (tp->tekpos.x < tp->margin) tp->tekpos.x = tp->margin; break; case VT: /* can this back up a margin on the real thing? */ tp->tekpos.y += tfsp->y; if (tp->tekpos.y >= TYSIZE) tp->tekpos.y = TYSIZE - 1; break; case BEL: tek_bell(tp->tdata); break; case FF: tek_clearscreen(tp->tdata); tp->tekpos.x = 0; tp->tekpos.y = TYSIZE - 1; tp->margin = 0; } } tek_move(tp->tdata, tp->tekpos.x, tp->tekpos.y);}static voidtek_reset(tp) register struct tek *tp;{ tp->lce = FALSE; tp->bypass = FALSE; tp->darkvec = TRUE; tp->got_loy = FALSE; tp->extra = 0; tp->tekgfxpos.x = 0; tp->tekgfxpos.y = 0; tp->vtype = VT_NORMAL; tp->vstyle = VS_NORMAL; tek_displaymode(tp->tdata, tp->vstyle, tp->vtype); tp->margin = 0; tp->tekpos.x = 0; tp->tekpos.y = TYSIZE - 1; tp->font = 0; tp->mode = ALPHA; tek_move(tp->tdata, tp->tekpos.x, tp->tekpos.y); tek_chfont(tp->tdata, 0); tek_cursormode(tp->tdata, ALPHACURSOR);}static voidtek_page(tp) register struct tek *tp;{ tp->bypass = FALSE; tp->margin = 0; tp->vtype = VT_NORMAL; tp->vstyle = VS_NORMAL; tek_displaymode(tp->tdata, tp->vstyle, tp->vtype); tp->tekpos.x = 0; tp->tekpos.y = TYSIZE - 1; tek_move(tp->tdata, tp->tekpos.x, tp->tekpos.y); tek_newmode(tp, ALPHA); tek_putchar(tp, FF);}/* * decode graphics addresses and draw vectors as needed */static voidtek_gfxdecode(tp, c) register struct tek *tp; register u_char c;{ c &= 0x7f; switch (CTYPE(c)) { case LOX: tp->tekgfxpos.x = CHARTOADDR(tp->tekgfxpos.x, c, LO); tp->got_loy = FALSE; tp->tekpos = tp->tekgfxpos; if (tp->darkvec) { tp->darkvec = FALSE; tek_move(tp->tdata, tp->tekpos.x, tp->tekpos.y);#ifdef DEBUG fprintf(debug, "moving to %d,%d\n", tp->tekpos.x, tp->tekpos.y );#endif } else { if (tp->mode == GRAPH) { tek_draw(tp->tdata, tp->tekpos.x, tp->tekpos.y);#ifdef DEBUG fprintf(debug, "drawing vector to %d,%d\n", tp->tekpos.x, tp->tekpos.y );#endif } else { /* point plot modes */ tek_move(tp->tdata, tp->tekpos.x, tp->tekpos.y); tek_draw(tp->tdata, tp->tekpos.x, tp->tekpos.y);#ifdef DEBUG fprintf(debug, "point at %d,%d\n", tp->tekpos.x, tp->tekpos.y );#endif } } break; case HIYX: if (tp->got_loy) { tp->tekgfxpos.x = CHARTOADDR(tp->tekgfxpos.x, c, HI); } else { tp->tekgfxpos.y = CHARTOADDR(tp->tekgfxpos.y, c, HI); } break; case LOYE: if ((c == 0x7f) && !(tp->straps & DELLOY)) break; if (tp->got_loy) { tp->tekgfxpos.x = EXTRATOADDR(tp->tekgfxpos.x, tp->extra, XEXTRA); tp->tekgfxpos.y = EXTRATOADDR(tp->tekgfxpos.y, tp->extra, YEXTRA); } tp->tekgfxpos.y = CHARTOADDR(tp->tekgfxpos.y, c, LO); tp->got_loy = TRUE; tp->extra = c; break; }}/* ARGSUSED */static voidtek_spptdecode(tp, c) register struct tek *tp; register u_char c;{}static voidtek_incdecode(tp, c) register struct tek *tp; register u_char c;{#define incpos(X,Y) tp->tekpos.x += X; tp->tekpos.y += Y; switch (c) { case ' ': tp->darkvec = TRUE; return; case 'P': tp->darkvec = FALSE; return; case 'D': incpos(0, 1); break; case 'E': incpos(1, 1); break; case 'A': incpos(1, 0); break; case 'I': incpos(1, -1); break; case 'H': incpos(0, -1); break; case 'J': incpos(-1, -1); break; case 'B': incpos(-1, 0); break; case 'F': incpos(-1, 1); break; } if (tp->tekpos.x < 0) tp->tekpos.x = 0; if (tp->tekpos.x >= TXSIZE) tp->tekpos.x = TXSIZE - 1; if (tp->tekpos.y < 0) tp->tekpos.y = 0; if (tp->tekpos.y >= TYSIZE) tp->tekpos.y = TYSIZE - 1; if (tp->darkvec == FALSE) { tek_draw(tp->tdata, tp->tekpos.x, tp->tekpos.y);#ifdef DEBUG fprintf(debug, "drawing vector to %d,%d\n", tp->tekpos.x, tp->tekpos.y );#endif } else { tek_move(tp->tdata, tp->tekpos.x, tp->tekpos.y);#ifdef DEBUG fprintf(debug, "moving to %d,%d\n", tp->tekpos.x, tp->tekpos.y );#endif }}/* * enter new terminal mode */static voidtek_newmode(tp, nmode) register struct tek *tp; register enum tmode nmode;{ if (tp->full && nmode != ALPHA) { tek_pagefull_off(tp->tdata); tp->full = 0; } switch (nmode) { case ALPHA: if (tp->mode != ALPHA) { tp->margin = 0; /* this is not strictly right */ } tek_cursormode(tp->tdata, ALPHACURSOR); break; case GIN: tek_cursormode(tp->tdata, GFXCURSOR); break; case GRAPH: case PTPLOT: case INCPLOT: case SPPTPLOT: tek_cursormode(tp->tdata, NOCURSOR); if (nmode == INCPLOT) tp->darkvec = FALSE; else tp->darkvec = TRUE; break; } tp->mode = nmode;}/* * send terminal status */static voidtek_sendstatus(tp) register struct tek *tp;{ register u_char status; if (tp->straps & LOCAL) return; status = STATUS; if (tp->mode == GRAPH) status |= SGRAPH; if (tp->margin != 0) status |= SMARGIN2; tek_ttyoutput(tp->tdata, status);}/* * send position */static voidtek_sendpos(tp) register struct tek *tp;{#ifndef DISPLAY_ONLY#ifdef DEBUG fprintf(debug, "sending status ");#endif if (tp->straps & LOCAL) return; tek_ttyoutput(tp->tdata, (SADDR | ADDRTOCHAR(tp->tekpos.x, HI))); tek_ttyoutput(tp->tdata, (SADDR | ADDRTOCHAR(tp->tekpos.x, LO))); tek_ttyoutput(tp->tdata, (SADDR | ADDRTOCHAR(tp->tekpos.y, HI))); tek_ttyoutput(tp->tdata, (SADDR | ADDRTOCHAR(tp->tekpos.y, LO)));#ifdef DEBUG fprintf(debug, " 0x%x", (SADDR | ADDRTOCHAR(tp->tekpos.x, HI))); fprintf(debug, " 0x%x", (SADDR | ADDRTOCHAR(tp->tekpos.x, LO))); fprintf(debug, " 0x%x", (SADDR | ADDRTOCHAR(tp->tekpos.y, HI))); fprintf(debug, " 0x%x", (SADDR | ADDRTOCHAR(tp->tekpos.y, LO)));#endif /* * send GIN terminator sequence be carefull to auto echo CR since this * will clear bypass the above stuff and EOT won't */ switch (tp->straps & GINTERM) { case GINNONE: break; case GINCR: /* send CR */ tek_ttyoutput(tp->tdata, CR); if (tp->straps & AECHO) tek_ttyinput(tp, CR);#ifdef DEBUG fprintf(debug, " 0x%x ", CR);#endif break; case GINCRE: /* send CR EOT */ tek_ttyoutput(tp->tdata, CR); tek_ttyoutput(tp->tdata, EOT); if (tp->straps & AECHO) tek_ttyinput(tp, CR);#ifdef DEBUG fprintf(debug, " 0x%x ", CR); fprintf(debug, " 0x%x ", EOT);#endif break; }#ifdef DEBUG fprintf(debug, "\n");#endif#endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -