Unix V6 /usr/sys/dmr/cat.c

/*
 * GP DR11C driver used for C/A/T
 */
 
#include "../param.h"
#include "../user.h"
#include "../tty.h"
 
#define	CATADDR	0167750
#define	PCAT	9
#define	CATHIWAT	60
#define	CATLOWAT	15
 
struct {
	int	catlock;
	struct	clist	oq;
} cat;
 
struct {
	int	catcsr;
	int	catbuf;
};
 
ctopen(dev)
{
	if (cat.catlock==0) {
		cat.catlock++;
		CATADDR->catcsr =| IENABLE;
	} else
		u.u_error = ENXIO;
}
 
ctclose()
{
	cat.catlock = 0;
}
 
ctwrite(dev)
{
	register c;
	extern lbolt;
 
	while ((c=cpass()) >= 0) {
		spl5();
		while (cat.oq.c_cc > CATHIWAT)
			sleep(&cat.oq, PCAT);
		while (putc(c, &cat.oq) < 0)
			sleep(&lbolt, PCAT);
		catintr();
		spl0();
	}
}
 
catintr()
{
	register int c;
 
	if (CATADDR->catcsr&DONE && (c=getc(&cat.oq))>=0) {
		CATADDR->catbuf = c;
		if (cat.oq.c_cc==0 || cat.oq.c_cc==CATLOWAT)
			wakeup(&cat.oq);
	} else {
		if (cat.catlock==0)
			CATADDR->catcsr = 0;
	}
}
 
unix-history/unix-v6/usr/sys/dmr/cat.c.txt · Последние изменения: 2006/07/26 07:34
 
Copyright (C) 1996-2013 Serge Vakulenko
serge@vak.ru