⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pc.c

📁 UNIX v6 源代码
💻 C
字号:
#/* *//* * PC-11 Paper tape reader/punch driver */#include "../param.h"#include "../conf.h"#include "../user.h"#define	PCADDR	0177550#define	CLOSED	0#define	WAITING	1#define	READING	2#define	EOF	3#define	RDRENB	01#define	IENABLE	0100#define	DONE	0200#define	BUSY	04000#define	ERROR	0100000#define	PCIPRI	30#define	PCOPRI	40#define	PCOLWAT	50#define	PCOHWAT	100#define	PCIHWAT	250struct {	int pcrcsr;	int pcrbuf;	int pcpcsr;	int pcpbuf;};struct clist {	int	cc;	int	cf;	int	cl;};struct pc11 {	int	pcstate;	struct	clist pcin;	struct	clist pcout;} pc11;pcopen(dev, flag){	extern lbolt;	if (flag==0) {		if (pc11.pcstate!=CLOSED) {			u.u_error = ENXIO;			return;		}		pc11.pcstate = WAITING;		while(pc11.pcstate==WAITING) {			PCADDR->pcrcsr = IENABLE|RDRENB;			sleep(&lbolt, PCIPRI);		}	} else {		PCADDR->pcpcsr =| IENABLE;		pcleader();	}}pcclose(dev, flag){	if (flag==0) {		spl4();		while (getc(&pc11.pcin) >= 0);		PCADDR->pcrcsr = 0;		pc11.pcstate = CLOSED;		spl0();	} else		pcleader();}pcread(){	register int c;	spl4();	do {		while ((c = getc(&pc11.pcin)) < 0) {			if (pc11.pcstate==EOF)				goto out;			if ((PCADDR->pcrcsr&(ERROR|BUSY|DONE))==0)				PCADDR->pcrcsr =| IENABLE|RDRENB;			sleep(&pc11.pcin, PCIPRI);		}	} while (passc(c)>=0);out:	spl0();}pcwrite(){	register int c;	while ((c=cpass())>=0)		pcoutput(c);}pcstart(){	register int c;	if (PCADDR->pcpcsr&DONE && (c = getc(&pc11.pcout)) >= 0)		PCADDR->pcpbuf = c;}pcrint(){	if (pc11.pcstate==WAITING) {		if (PCADDR->pcrcsr&ERROR)			return;		pc11.pcstate = READING;	}	if (pc11.pcstate==READING) {		if (PCADDR->pcrcsr&ERROR)			pc11.pcstate = EOF;		else {			putc(PCADDR->pcrbuf, &pc11.pcin);			if (pc11.pcin.cc < PCIHWAT)				PCADDR->pcrcsr =| IENABLE|RDRENB;		}		wakeup(&pc11.pcin);	}}pcpint(){	pcstart();	if (pc11.pcout.cc <= PCOLWAT)		wakeup(&pc11.pcout);}pcoutput(c){	if (PCADDR->pcpcsr&ERROR) {		u.u_error = EIO;		return;	}	if (pc11.pcout.cc >= PCOHWAT)		sleep(&pc11.pcout, PCOPRI);	putc(c, &pc11.pcout);	spl4();	pcstart();	spl0();}pcleader(){	register int i;	i = 100;	do		pcoutput(0);	while (--i);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -