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

📄 kl.c

📁 著名的AT&T UNIX v6 源码
💻 C
字号:
/* *   KL/DL-11 driver */#include "../h/param.h"#include "../h/conf.h"#include	"../h/dir.h"#include "../h/user.h"#include "../h/tty.h"#include "../h/systm.h"#include "../h/uba.h"/* base address */#define	KLBASE	((struct device *)(UBA0_DEV+0176500))	/* kl and dl11-a */#define	DLBASE	((struct device *)(UBA0_DEV+0175610))	/* dl-e */#define	NKL11	1#define	NDL11	0#define DSRDY	02#define	RDRENB	01#define	DLDELAY	4	/* Extra delay for DL's (double buff) */#define	NL1	000400#define	NL2	001000#define	CR2	020000#define	FF1	040000#define	TAB1	002000struct	tty kl11[NKL11+NDL11];int	klstart();int	ttrstrt();char	partab[];struct device {	short	rcsr;	short	rbuf;	short	tcsr;	short	tbuf;};klopen(dev, flag)dev_t dev;{	register struct device *addr;	register struct tty *tp;	register d;	d = minor(dev);	if(d >= NKL11+NDL11) {		u.u_error = ENXIO;		return;	}	tp = &kl11[d];	/*	 * set up minor 0 to address KLADDR	 * set up minor 0 thru NKL11-1 to address from KLBASE	 * set up minor NKL11 on to address from DLBASE	 */	if(d<NKL11)		addr = KLBASE + d;	else		addr = DLBASE + (d-NKL11);	tp->t_addr = (caddr_t)addr;	tp->t_oproc = klstart;	if ((tp->t_state&ISOPEN) == 0) {		tp->t_state = ISOPEN|CARR_ON;		tp->t_flags = EVENP|LCASE|ECHO|XTABS|CRMOD|CR2;		tp->t_erase = CERASE;		tp->t_kill = CKILL;	}	addr->rcsr |= IENABLE|DSRDY|RDRENB;	addr->tcsr |= IENABLE;	ttyopen(dev, tp);}klclose(dev)dev_t dev;{	register struct tty *tp;	tp = &kl11[minor(dev)];	ttyclose(tp);}klread(dev)dev_t dev;{	ttread(&kl11[minor(dev)]);}klwrite(dev)dev_t dev;{	ttwrite(&kl11[minor(dev)]);}klxint(dev)dev_t dev;{	register struct tty *tp;	tp = &kl11[minor(dev)];	ttstart(tp);	if (tp->t_outq.c_cc == 0 || tp->t_outq.c_cc == TTLOWAT)		wakeup((caddr_t)&tp->t_outq);}klrint(dev)dev_t dev;{	register int c;	register struct device *addr;	register struct tty *tp;	tp = &kl11[minor(dev)];	addr = (struct device *)tp->t_addr;	c = addr->rbuf;	addr->rcsr |= RDRENB;	ttyinput(c, tp);}klioctl(dev, cmd, addr, flag)caddr_t addr;dev_t dev;{	if (ttioccom(cmd, &kl11[minor(dev)], addr, dev)==0)		u.u_error = ENOTTY;}klstart(tp)register struct tty *tp;{	register c;	register struct device *addr;	addr = (struct device *)tp->t_addr;	if((addr->tcsr&DONE) == 0)		return;	if ((c=getc(&tp->t_outq)) >= 0) {		if (tp->t_flags&RAW)			addr->tbuf = c;		else if (c<=0177)			addr->tbuf = c | (partab[c]&0200);		else {			timeout(ttrstrt, (caddr_t)tp, (c&0177) + DLDELAY);			tp->t_state |= TIMEOUT;		}	}}

⌨️ 快捷键说明

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