comoutput.c,v

来自「TCP-IP红宝书源代码」· C,V 代码 · 共 150 行

C,V
150
字号
head	1.1;
access;
symbols;
locks
	dls:1.1; strict;
comment	@ * @;


1.1
date	97.09.21.19.23.38;	author dls;	state Dist;
branches;
next	;


desc
@pre-3e code
@


1.1
log
@Initial revision
@
text
@/* comoutput.c - computc, comwrite */

#include <conf.h>
#include <kernel.h>
#include <tty.h>
#include <com.h>    

/*------------------------------------------------------------------------
 *  computc - write one character to the PC physical monitor
 *------------------------------------------------------------------------
 */
int
computc(pdev, c)
struct devsw	*pdev;
unsigned char	c;
{
	STATWORD	ps;
	struct devsw	*pttydev;
	struct comsoft	*pcom = &comtab[pdev->dvminor];
	struct tty	*ptty = 0;
	int		pos, rv;

	disable(ps);
	if (pttydev = (struct devsw *)pdev->dvioblk)
		ptty = (struct tty *) pttydev->dvioblk;
	if (ptty && (ptty->tty_oflags & TOF_SYNC)) {
/*		comflush(pdev); */
		rv = comsputc(pdev, c);
		restore(ps);
		return rv;
	}
	wait(pcom->com_osema);
	if (c == '\n') {
		wait(pcom->com_osema);	/* need 2 for \r\n */
		pos = pcom->com_start + pcom->com_count;
		if (pos >= COMBUFSZ)
			pos -= COMBUFSZ;
		pcom->com_buf[pos] = '\r';
		pcom->com_count++;
		++pos;
	} else
		pos = pcom->com_start + pcom->com_count;
	if (pos >= COMBUFSZ)
		pos -= COMBUFSZ;
	pcom->com_buf[pos] = c;
	pcom->com_count++;
	comwstrt(&comtab[pdev->dvminor]);
	restore(ps);
	return OK;
}

/*------------------------------------------------------------------------
 * comflush - flush output buffer synchronously
 *------------------------------------------------------------------------
 */
int
comflush(pdev)
struct devsw	*pdev;
{
	struct comsoft	*pcom = &comtab[pdev->dvminor];
	int		ier;
	int		csr = pdev->dvcsr;

	ier = inb(csr + MCR);
	ier &= ~IER_TX;
	outb(csr + IER, ier);
	while (pcom->com_count) {
		while ((inb(csr+LSR) & LSR_THRE) == 0)
			/* empty */;
		outb(csr+DATA, pcom->com_buf[pcom->com_start]);
		pcom->com_start++;
		if (pcom->com_start >= COMBUFSZ)
			pcom->com_start = 0;
		pcom->com_count--;
		signal(pcom->com_osema);
	}
	ier = inb(csr + MCR);
	ier |= IER_TX;
	outb(csr + IER, ier);
	return OK;
}

/*------------------------------------------------------------------------
 * comsputc - do synchronous putc to a com device
 *------------------------------------------------------------------------
 */
int
comsputc(pdev, c)
struct devsw	*pdev;
unsigned char	c;
{
	int		csr = pdev->dvcsr;

	while ((inb(csr+LSR) & LSR_THRE) == 0)
		/* empty */;
	outb(csr+DATA, c);
	if (c == '\n') {
		while ((inb(csr+LSR) & LSR_THRE) == 0)
			/* empty */;
		outb(csr+DATA, '\r');
	}
	return OK;
}


/*------------------------------------------------------------------------
 *  comwrite - write to the PC physical monitor
 *------------------------------------------------------------------------
 */
int
comwrite(pdev, buf, count)
struct	devsw	*pdev;
char		*buf;
int		count;
{
	if (count < 0)
		return SYSERR;
	if (count == 0)
		return OK;

	for (; count>0 ; count--)
		computc(pdev, *buf++);
	return OK;
}
@

⌨️ 快捷键说明

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