SRI-NOSC/dmr/oldstuff/gld.c

Compare this file to the similar file:
Show the results in this format:

#

/*	gould 4800 printer driver   -   11/50 interface
	expects a three word header on each packet
	1.  first word has function to be put in csr.
	2.  seconf word has number of raster lines to space down 
	    after each write.
	3.  third word is the number of bytes to transfer to the gould.

*/
#include "../../h/param.h"
#include "../../h/buf.h"
#include "../../h/conf.h"
#include "../../h/user.h"

struct	{
	int	csr;
	int	count;
	int	bar;
	};

struct devtab gldtab;
struct buf    gldbuf;


int gldline;
int gldbusy;

#define GLDCUT		02
#define GLDEF		0212
#define LPADDR		0164020
#define IENABLE		6
#define BIT89		001400
#define BIT895_0	001477
#define WORKING		040000
#define GLDACK		1
#define GLDNR		0400

gldstrategy(abp)
struct buf *abp;
{
	register struct buf *bp;
	bp = abp;
	if( bp->b_flags & B_READ )  
		iodone(bp);
	else
	{
		gldwait();
		LPADDR->csr = GLDACK;
		LPADDR->bar = bp->b_addr+2;
		LPADDR->csr = GLDEF;
		bp->b_resid = 0;
		iodone( bp );
		if(++gldline == 72)
		{
			gldline = 0;
			gldwait();
			LPADDR->csr = GLDCUT;
		}
	}
}
gldwait()
{
	int i;
	i = 010000;
	while(i--);
}

gldint()
{
	/*  since interrupts from the gould dont wwk not needed  */
	int i;
	i = 0;
}

gldread(dev)
{
	physio(&gldstrategy, &gldbuf, dev, B_READ);
}

gldwrite(dev)
{
	physio(&gldstrategy, &gldbuf, dev, B_WRITE);
}

gldopen()
{
	if (gldbusy)
		u.u_error = ENXIO;
	else
	{
		while(LPADDR->csr & GLDNR);
		gldline = 0;
		gldbusy = 1;
	}
}

gldclose()
{
	gldbusy = 0;
}