V7/usr/sys/dev/cat.c
#
/*
*/
/*
* GP DR11C driver used for C/A/T
*/
#include "../h/param.h"
#include "../h/dir.h"
#include "../h/user.h"
#include "../h/tty.h"
#define CATADDR ((struct catdev *)0167770)
#define PCAT (PZERO+9)
#define CATHIWAT 100
#define CATLOWAT 30
struct {
int catlock;
struct clist oq;
} cat;
struct catdev {
int catcsr;
int catbuf;
};
ctopen(dev)
{
if (cat.catlock==0) {
cat.catlock++;
CATADDR->catcsr |= IENABLE;
} else
u.u_error = ENXIO;
}
ctclose()
{
cat.catlock = 0;
catintr();
}
ctwrite(dev)
{
register c;
extern lbolt;
while ((c=cpass()) >= 0) {
spl5();
while (cat.oq.c_cc > CATHIWAT)
sleep((caddr_t)&cat.oq, PCAT);
while (putc(c, &cat.oq) < 0)
sleep((caddr_t)&lbolt, PCAT);
catintr();
spl0();
}
}
catintr()
{
register int c;
if (CATADDR->catcsr&DONE) {
if ((c = getc(&cat.oq)) >= 0) {
CATADDR->catbuf = c;
if (cat.oq.c_cc==0 || cat.oq.c_cc==CATLOWAT)
wakeup((caddr_t)&cat.oq);
} else {
if (cat.catlock==0)
CATADDR->catcsr = 0;
}
}
}