vs.c
来自「莱昂氏UNIX源代码分析UNIXv6src.tar.gz」· C语言 代码 · 共 123 行
C
123 行
#/* *//* * Screw Works interface via DC-11 */#include "../tty.h"#define VSADDR 0174150#define CDLEAD 01#define B1200 030#define STOP1 0400#define CLSEND 02#define RQSEND 01#define MAGIC_MAP 0377struct { int vsrcsr; int vsrbuf; int vsxcsr; int vsxbuf;};struct { struct clist iq; struct clist oq;} vs;vsopen(dev){ VSADDR->vsrcsr = IENABLE|B1200|CDLEAD; VSADDR->vsxcsr = STOP1|IENABLE|B1200; vschar(0);}vsclose(dev){ vschar(0); VSADDR->vsrcsr =& ~IENABLE; while (getc(&vs.iq) >= 0);}vswrite(dev){ register int count, c; count = 0; while ((c=cpass()) >= 0) { if (--count <= 0) { count = 60; vschar(0); } vschar(c); } vschar(0);}vschar(c){ c =^ MAGIC_MAP; spl5(); while (vs.oq.c_cc > 60) { vsxintr(); sleep(&vs.oq, TTIPRI); } putc(c, &vs.oq); vsxintr(); spl0();}vsxintr(){ static lchar; register c; register int *xcsr; xcsr = &VSADDR->vsxcsr; if (*xcsr&DONE) { if (lchar==MAGIC_MAP) { *xcsr =& ~RQSEND; lchar = 0; if (vs.oq.c_cc==0) goto wake; } if ((*xcsr&CLSEND) == 0) { *xcsr =& ~RQSEND; *xcsr =| RQSEND; if ((*xcsr&CLSEND) == 0) goto wake; } if ((c = getc(&vs.oq)) >= 0) VSADDR->vsxbuf = lchar = c; if (vs.oq.c_cc <= 15) wake: wakeup(&vs.oq); }}vsread(dev){ register int c; spl5(); while ((c = getc(&vs.iq)) < 0) sleep(&vs.iq, TTIPRI); spl0(); passc("?0*#?546?213?879?"[c&017]);}vsrintr(){ register int c; c = VSADDR->vsrbuf; if (vs.iq.c_cc<=10) putc(c, &vs.iq); wakeup(&vs.iq);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?