/*
 * MAC  Version 2.0           Author :  Vincent Hayward
 *                                      School of Electrical Engineering
 *                                      Purdue University
 *      Dir     : sys
 *      File    : dr11.c
 *      Remarks : drives the fifo interface
 *      Usage   : make install
 */

#include "../h/which.h"
#include "../h/fifoio.h"

/*
 * Called from LSI-11 clock inter routine..
 * ib is a pointer for input buffer (short)
 * ob is a pointer for output buffer (short)
 * first word of buffers is word count;
 * this routine
 * 1) Interrupts VAX.
 * 2) writes ob to it (16 bit words)
 * 3) reads words back from vax to "ib".
 * 4) returns -1 for error
 */

dr11(ib, ob)
struct fifobuf *ib, *ob;
{
	register struct drcdevice *dp;
	register short wc;
	register short *bp;

	dp = DRC_ADDR;

	/*
	 * Check FIFO empty
	 */
	if ((dp->drccsr & FIFO_EMPTY) == 0) {
		return(-1);
	}

	/*
	 * write obwc words to VAX from ob.
	 */
	bp = ob->data;
	dp->drcbuf = wc = ob->wc;
	while (wc--) {
		dp->drcbuf = *bp++;
	}

	/*
	 * set VAX interrupt
	 */
	dp->drccsr = DRC_INT;

	/*
	 * Let VAX drain FIFO
	 */
	while ((dp->drccsr & FIFO_EMPTY) == 0)
		;

	/*
	 * Provide timing before retesting
	 */
	for (wc = 100; wc--; )
		;

	/*
	 * Wait for VAX start filling FIFO
	 */
	while (dp->drccsr & FIFO_EMPTY)
		;
	/*
	 * read words from the VAX
	 */
	bp = ib->data;
	ib->wc = wc = dp->drcbuf;
	while (wc--) {
		*bp++ = dp->drcbuf;
	}
	/*
	 * Check FIFO empty
	 */
	if ((dp->drccsr & FIFO_EMPTY) == 0) {
		return(-2);
	}
	return(0);
}
