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

📄 dz.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
/* *	DZ11 driver * CAUTION -- MODIFIED FROM WORKING VERSION BUT NEVER PROPERLY TESTED */#include "../h/param.h"#include "../h/dir.h"#include "../h/user.h"#include "../h/tty.h"struct device *dz_addr[] = { (struct device *)0160100, (struct device *)0160110};int	dz_cnt = 16;struct tty dz_tty[16];char	dz_stat;char	dz_speeds[] = {	0, 020, 021, 022, 023, 024, 0, 025,	026, 027, 030, 032, 034, 036, 0, 0,	};#define	BITS7	020#define	BITS8	030#define	TWOSB	040#define	PENABLE	0100#define	OPAR	0200#define	RCVENA	010000#define	IE	040140#define	PERROR	010000#define	FRERROR	020000#define	SSPEED	7	/* standard speed: 300 baud */struct device {	int	dzcsr, dzrbuf;	char	dztcr, dzdtr;	char	dztbuf, dzbrk;};#define	dzlpr	dzrbuf#define	dzmsr	dzbrk#define	ON	1#define	OFF	0dzopen(dev, flag){	register struct tty *tp;	int x;	extern dzstart(), dzscan();	x = dev;	dev = minor(dev);	if (dev >= dz_cnt) {		u.u_error = ENXIO;		return;	}	tp = &dz_tty[dev];	if ((tp->t_state&(ISOPEN|WOPEN)) == 0) {		tp->t_oproc = dzstart;		tp->t_iproc = NULL;		ttychars(tp);		tp->t_ispeed = SSPEED;		tp->t_ospeed = SSPEED;		tp->t_flags = ODDP|EVENP|ECHO;		dzparam(dev);	}	dzmodem(dev, ON);	spl6();	while ((tp->t_state&CARR_ON)==0) {		tp->t_state |= WOPEN;		sleep((caddr_t)&tp->t_rawq, TTIPRI);	}	ttyopen(x,tp);	spl0();}dzclose(dev){	register struct tty *tp;	dev = minor(dev);	tp = &dz_tty[dev];	wflushtty(tp);	if (tp->t_state&HUPCLS) {		dzmodem(dev, OFF);	}	tp->t_state &= CARR_ON;}dzread(dev){	dev = minor(dev);	ttread(&dz_tty[dev]);}dzwrite(dev){	dev = minor(dev);	ttwrite(&dz_tty[dev]);}dzioctl(dev, cmd, addr, flag){	register struct tty *tp;	dev = minor(dev);	tp = &dz_tty[dev];	if (ttioccomm(cmd, tp, (caddr_t)addr, dev)) {		if (cmd==TIOCSETP||cmd==TIOCSETN)			dzparam(dev);	} else {		u.u_error = ENOTTY;	}}dzparam(dev){	register struct tty *tp;	register struct device *dzaddr;	register lpr;	tp = &dz_tty[dev];	dzaddr= dz_addr[dev>>3];	dzaddr->dzcsr = IE;	if (dz_stat==0) {		dzscan();		dz_stat++;	}	if (tp->t_ispeed==0) {	/* Hang up line */		dzmodem(dev, OFF);		return;	}	lpr = (dz_speeds[tp->t_ispeed]<<8)|(dev&07);	if (tp->t_flags&RAW)		lpr |= BITS8;	else		lpr |= BITS7|PENABLE;	if ((tp->t_flags&EVENP)==0)		lpr |= OPAR;	if (tp->t_ispeed == 3)	/* 110 baud */		lpr |= TWOSB;	dzaddr->dzlpr = lpr;}dzrint(dev){	register struct tty *tp;	register c;	register struct device *dzaddr;	dzaddr = dz_addr[dev];	while ((c = dzaddr->dzrbuf) < 0) {	/* char. present */		tp = &dz_tty[((c>>8)&07)|(dev<<3)];		if (tp >= &dz_tty[dz_cnt])			continue;		if((tp->t_state&ISOPEN)==0) {			wakeup((caddr_t)&tp->t_rawq);			continue;		}		if (c&FRERROR)		/* break */			if (tp->t_flags&RAW)				c = 0;		/* null (for getty) */			else				c = 0177;	/* DEL (intr) */		if (c&PERROR)			if ((tp->t_flags&(EVENP|ODDP))==EVENP			 || (tp->t_flags&(EVENP|ODDP))==ODDP )				continue;		ttyinput(c, tp);	}}dzxint(dev){	register struct tty *tp;	register struct device *dzaddr;	dzaddr = dz_addr[dev];	while(dzaddr->dzcsr<0) {	/* TX rdy */		tp = &dz_tty[((dev<<3)|(dzaddr->dzcsr>>8)&07)];		dzaddr->dztbuf = tp->t_char;		tp->t_state &= ~BUSY;		dzstart(tp);	}}dzstart(tp)register struct tty *tp;{	register unit, c;	int s;	struct device *dzaddr;	extern ttrstrt();	unit = tp - dz_tty;	dzaddr = dz_addr[unit>>3];	unit = 1<<(unit&07);	s = spl5();	if (tp->t_state&(TIMEOUT|BUSY)) {		splx(s);		return;	}	if (tp->t_state&TTSTOP) {		dzaddr->dztcr &= ~unit;		splx(s);		return;	}	if ((c=getc(&tp->t_outq)) >= 0) {		if (c>=0200 && (tp->t_flags&RAW)==0) {			dzaddr->dztcr &= ~unit;			tp->t_state |= TIMEOUT;			timeout(ttrstrt, (caddr_t)tp, (c&0177)+6);		} else {			tp->t_char = c;			tp->t_state |= BUSY;			dzaddr->dztcr |= unit;		}		if (tp->t_outq.c_cc<=TTLOWAT && tp->t_state&ASLEEP) {			tp->t_state &= ~ASLEEP;			wakeup((caddr_t)&tp->t_outq);		}	} else		dzaddr->dztcr &= ~unit;	splx(s);}dzmodem(dev, flag){	register struct device *dzaddr;	register bit;	dzaddr = dz_addr[dev>>3];	bit = 1<<(dev&07);	if (flag==OFF)		dzaddr->dzdtr &= ~bit;	else	dzaddr->dzdtr |= bit;}dzscan(){	register i;	register struct device *dzaddr;	register struct tty *tp;	char	bit;	for (i=0; i<dz_cnt; i++) {		dzaddr = dz_addr[i>>3];		tp = &dz_tty[i];		bit = 1<<(i&07);		if (dzaddr->dzmsr&bit) {			if ((tp->t_state&CARR_ON)==0) {				wakeup((caddr_t)&tp->t_rawq);				tp->t_state |= CARR_ON;			}		} else {			if (tp->t_state&CARR_ON) {				if (tp->t_state&ISOPEN) {					signal(tp->t_pgrp, SIGHUP);					dzaddr->dzdtr &= ~bit;					flushtty(tp);				}				tp->t_state &= ~CARR_ON;			}		}	}	timeout(dzscan, (caddr_t)0, 120);}

⌨️ 快捷键说明

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