xref: /csrg-svn/sys/vax/uba/ps.c (revision 9552)
1*9552Ssam /*	ps.c	4.8	82/12/05	*/
27296Ssam 
37296Ssam /*
47296Ssam  * Evans and Sutherland Picture System 2 driver
57296Ssam  */
67296Ssam 
77296Ssam /*
87296Ssam  *	Still to be done:
97296Ssam  *		WAIT_HIT
107296Ssam  */
117296Ssam 
127296Ssam #include "ps.h"
137296Ssam #if NPS > 0
147296Ssam 
157296Ssam #define EXTERNAL_SYNC
167296Ssam 
177296Ssam #include "../h/param.h"
187296Ssam #include "../h/systm.h"
19*9552Ssam #include "../h/ioctl.h"
207296Ssam #include "../h/pte.h"
217296Ssam #include "../h/map.h"
227296Ssam #include "../h/buf.h"
237296Ssam #include "../h/conf.h"
247296Ssam #include "../h/dir.h"
257296Ssam #include "../h/user.h"
267730Sroot #include "../h/uio.h"
277296Ssam 
288477Sroot #include "../vaxuba/ubareg.h"
298477Sroot #include "../vaxuba/ubavar.h"
308477Sroot #include "../vaxuba/psreg.h"
318477Sroot 
327296Ssam int	psprobe(), psattach(), psintr();
337296Ssam struct	uba_device *psdinfo[NPS];
347296Ssam u_short	psstd[] = { 0 };
357296Ssam struct	uba_driver psdriver =
367296Ssam     { psprobe, 0, psattach, 0, psstd, "ps", psdinfo };
377296Ssam 
387296Ssam #define	PSUNIT(dev)	(minor(dev))
397296Ssam 
407296Ssam #define MAXAUTOREFRESH			(4)
417296Ssam #define MAXAUTOMAP			(4)
427296Ssam #define MAXDBSIZE			(0177777/2)
437296Ssam 
447296Ssam #define PSPRI				(PZERO+1)
457296Ssam 
467296Ssam #define PSWAIT() {register short int i, j; i=20000; while((i-- != 0)\
477296Ssam 	&& (((j=psaddr->ps_iostat)&DIOREADY)==0));}
487296Ssam 
497296Ssam struct ps {
507296Ssam 	char		ps_open;
517296Ssam 	short int 	ps_uid;
527296Ssam 	struct {
537296Ssam 		enum { SINGLE_STEP_RF, AUTO_RF } state;
547296Ssam 		enum { RUNNING_RF, SYNCING_RF, WAITING_MAP } mode;
557296Ssam 		unsigned short int sraddrs[MAXAUTOREFRESH];
567296Ssam 		short int nsraddrs;
577296Ssam 		short int srcntr;
587296Ssam 		char waiting;
597296Ssam 		char stop;
607296Ssam 		int icnt;
617296Ssam 	} ps_refresh;
627296Ssam 	struct {
637296Ssam 		enum { ON_DB, OFF_DB } state;
647296Ssam 		unsigned short int dbaddrs[2];
657296Ssam 		unsigned short int dbsize;
667296Ssam 		short int rbuffer;
677296Ssam 	} ps_dbuffer;
687296Ssam 	struct {
697296Ssam 		enum { SINGLE_STEP_MAP, AUTO_MAP } state;
707296Ssam 		enum { RUNNING_MAP, WAITING_RF, WAITING_START } mode;
717296Ssam 		unsigned short int maddrs[MAXAUTOMAP];
727296Ssam 		short int nmaddrs;
737296Ssam 		short int mcntr;
747296Ssam 		short int outputstart;
757296Ssam 		char waiting;
767296Ssam 		char stop;
777296Ssam 		int icnt;
787296Ssam 	} ps_map;
797296Ssam 	struct {
807296Ssam 		short int ticked;
817296Ssam 		short int missed;
827296Ssam 		int icnt;
837296Ssam 	} ps_clock;
847296Ssam 	struct {
857296Ssam 		int icnt;
867296Ssam 	} ps_hit;
877296Ssam 	int ps_strayintr;
887296Ssam 	int last_request;
897296Ssam 	int strayrequest;
907296Ssam } ps[NPS];
917296Ssam 
927296Ssam psprobe(reg)
937296Ssam 	caddr_t reg;
947296Ssam {
957296Ssam 	register int br, cvec;
967296Ssam 	register struct psdevice *psaddr = (struct psdevice *) reg;
977296Ssam 
987296Ssam 	psaddr->ps_iostat = PSRESET;
997296Ssam 	DELAY(200);
1007296Ssam 	psaddr->ps_addr = RTCIE;
1017296Ssam 	PSWAIT();
1027296Ssam 	psaddr->ps_data = 01;
1037296Ssam 	psaddr->ps_iostat = PSIE;
1047296Ssam 	psaddr->ps_addr = RTCSR;
1057296Ssam 	PSWAIT();
1067296Ssam 	psaddr->ps_data = (SYNC|RUN);
1077296Ssam 	DELAY(200000);
1087296Ssam 	psaddr->ps_addr = RTCREQ;
1097296Ssam 	PSWAIT();
1107296Ssam 	psaddr->ps_data = 01;
1117296Ssam 	psaddr->ps_iostat = 0;
1127296Ssam 	psaddr->ps_iostat = PSRESET;
1137418Skre 	return (sizeof (struct psdevice));
1147296Ssam }
1157296Ssam 
1167296Ssam /*ARGSUSED*/
1177296Ssam psattach(ui)
1187296Ssam 	register struct uba_device *ui;
1197296Ssam {
1208572Sroot 
1217296Ssam }
1227296Ssam 
1237296Ssam psopen(dev)
1247296Ssam 	dev_t dev;
1257296Ssam {
1267296Ssam 	register struct ps *psp;
1277296Ssam 	register struct uba_device *ui;
1287296Ssam 	register int unit = PSUNIT(dev);
1297296Ssam 
1308572Sroot 	if (unit >= NPS || (psp = &ps[minor(dev)])->ps_open ||
1318572Sroot 	    (ui = psdinfo[unit]) == 0 || ui->ui_alive == 0)
1328572Sroot 		return (ENXIO);
1337296Ssam 	psp->ps_open = 1;
1347296Ssam 	psp->ps_uid = u.u_uid;
1357296Ssam 	psp->ps_strayintr = 0;
1367296Ssam 	psp->ps_refresh.state = SINGLE_STEP_RF;
1377296Ssam 	psp->ps_refresh.waiting = 0;
1387296Ssam 	psp->ps_refresh.stop = 0;
1397296Ssam 	psp->ps_dbuffer.state = OFF_DB;
1407296Ssam 	psp->ps_map.state = SINGLE_STEP_MAP;
1417296Ssam 	psp->ps_map.waiting = 0;
1427296Ssam 	psp->ps_map.stop = 0;
1437296Ssam 	psp->ps_clock.ticked = 0;
1447296Ssam 	psp->ps_refresh.icnt = psp->ps_map.icnt = psp->ps_clock.icnt = 0;
1457296Ssam 	maptouser(ui->ui_addr);
1468572Sroot 	return (0);
1477296Ssam }
1487296Ssam 
1497296Ssam psclose(dev)
1507296Ssam 	dev_t dev;
1517296Ssam {
1527296Ssam 	register struct psdevice *psaddr =
1537296Ssam 			(struct psdevice *) psdinfo[PSUNIT(dev)]->ui_addr;
1547296Ssam 
1557296Ssam 	ps[PSUNIT(dev)].ps_open = 0;
1567296Ssam 	psaddr->ps_iostat = 0;		/* clear IENABLE */
1577296Ssam 	PSWAIT();
1587296Ssam 	psaddr->ps_addr = RFSR;		/* set in auto refresh mode */
1597296Ssam 	PSWAIT();
1607296Ssam 	psaddr->ps_data = AUTOREF;
1617296Ssam 	unmaptouser(psaddr);
1627296Ssam }
1637296Ssam 
1647296Ssam /*ARGSUSED*/
1657730Sroot psread(dev, uio)
1667296Ssam 	dev_t dev;
1677730Sroot 	struct uio *uio;
1687296Ssam {
1697296Ssam }
1707296Ssam 
1717296Ssam /*ARGSUSED*/
1727730Sroot pswrite(dev, uio)
1737296Ssam 	dev_t dev;
1747730Sroot 	struct uio *uio;
1757296Ssam {
1767296Ssam }
1777296Ssam 
1787296Ssam /*ARGSUSED*/
1797632Ssam psioctl(dev, cmd, data, flag)
1807632Ssam 	register caddr_t data;
1817296Ssam {
1827296Ssam 	register struct uba_device *ui = psdinfo[PSUNIT(dev)];
1837296Ssam 	register struct ps *psp = &ps[PSUNIT(dev)];
1847632Ssam 	int *waddr = *(int **)data;
1857296Ssam 	int n, arg, i;
1867296Ssam 
1877296Ssam 	switch (cmd) {
1887632Ssam 
1897632Ssam 	case PSIOGETADDR:
1907632Ssam 		*(caddr_t *)data = ui->ui_addr;
1917296Ssam 		break;
1927632Ssam 
1937632Ssam 	case PSIOAUTOREFRESH:
1947296Ssam 		n = fuword(waddr++);
1958572Sroot 		if (n == -1)
1968572Sroot 			return (EFAULT);
1978572Sroot 		if (n < 0 || n > MAXAUTOREFRESH)
1988572Sroot 			return (EINVAL);
1998572Sroot 		for (i = 0; i < n; i++) {
2008572Sroot 			if ((arg = fuword(waddr++)) == -1)
2018572Sroot 				return (EFAULT);
2028572Sroot 			psp->ps_refresh.sraddrs[i] = arg;
2037296Ssam 		}
2048572Sroot 		psp->ps_refresh.state = AUTO_RF;
2058572Sroot 		psp->ps_refresh.nsraddrs = n;
2068572Sroot 		psp->ps_refresh.srcntr = 0;
2078572Sroot 		psp->ps_refresh.mode = WAITING_MAP;
2087296Ssam 		break;
2097632Ssam 
2107632Ssam 	case PSIOAUTOMAP:
2117296Ssam 		n = fuword(waddr++);
2128572Sroot 		if (n == -1)
2138572Sroot 			return (EFAULT);
2148572Sroot 		if (n < 0 || n > MAXAUTOMAP)
2158572Sroot 			return (EINVAL);
2168572Sroot 		for (i = 0; i < n; i++) {
2178572Sroot 			if ((arg = fuword(waddr++)) == -1)
2188572Sroot 				return (EFAULT);
2198572Sroot 			psp->ps_map.maddrs[i] = arg;
2207296Ssam 		}
2218572Sroot 		if ((arg = fuword(waddr++)) == -1)
2228572Sroot 			return (EFAULT);
2238572Sroot 		psp->ps_map.outputstart = arg;
2248572Sroot 		psp->ps_map.state = AUTO_MAP;
2258572Sroot 		psp->ps_map.nmaddrs = n;
2268572Sroot 		psp->ps_map.mcntr = 0;
2278572Sroot 		psp->ps_map.mode = WAITING_START;
2287296Ssam 		break;
2297632Ssam 
2307632Ssam 	case PSIOSINGLEREFRESH:
2317296Ssam 		psp->ps_refresh.state = SINGLE_STEP_RF;
2327296Ssam 		break;
2337632Ssam 
2347632Ssam 	case PSIOSINGLEMAP:
2357296Ssam 		psp->ps_map.state = SINGLE_STEP_MAP;
2367296Ssam 		break;
2377632Ssam 
2387632Ssam 	case PSIODOUBLEBUFFER:
2398572Sroot 		if ((arg = fuword(waddr++)) == -1)
2408572Sroot 			return (EFAULT);
2418572Sroot 		psp->ps_dbuffer.dbaddrs[0] = arg;
2428572Sroot 		if ((arg = fuword(waddr++)) == -1)
2438572Sroot 			return (EFAULT);
2448572Sroot 		if (arg <= 0 || arg > MAXDBSIZE)
2458572Sroot 			return (EINVAL);
2468572Sroot 		psp->ps_dbuffer.dbsize = arg;
2478572Sroot 		psp->ps_dbuffer.dbaddrs[1] =
2488572Sroot 		    psp->ps_dbuffer.dbaddrs[0]+arg;
2498572Sroot 		psp->ps_dbuffer.state = ON_DB;
2508572Sroot 		psp->ps_dbuffer.rbuffer = 0;
2517296Ssam 		}
2527296Ssam 		break;
2537632Ssam 
2547632Ssam 	case PSIOSINGLEBUFFER:
2557296Ssam 		psp->ps_dbuffer.state = OFF_DB;
2567296Ssam 		break;
2577632Ssam 
2587632Ssam 	case PSIOWAITREFRESH:
2598572Sroot 		if (psp->ps_refresh.mode != RUNNING_RF)	/* not running */
2608572Sroot 			return (0);				/* dont wait */
2618572Sroot 		/* fall into ... */
2627632Ssam 
2637632Ssam 	case PSSIOTOPREFRESH:
2648572Sroot 		if (cmd == PSSTOPREFRESH)
2657296Ssam 			psp->ps_refresh.stop = 1;
2667296Ssam 		spl5();
2677296Ssam 		psp->ps_refresh.waiting = 1;
2688572Sroot 		while (psp->ps_refresh.waiting)
2697296Ssam 			sleep(&psp->ps_refresh.waiting, PSPRI);
2707296Ssam 		spl0();
2717296Ssam 		break;
2727632Ssam 
2737632Ssam 	case PSIOWAITMAP:
2748572Sroot 		if (psp->ps_map.mode != RUNNING_MAP)	/* not running */
2758572Sroot 			return (0);				/* dont wait */
2768572Sroot 		/* fall into ... */
2777632Ssam 
2787632Ssam 	case PSIOSTOPMAP:
2798572Sroot 		if (cmd == PSSTOPMAP)
2807296Ssam 			psp->ps_map.stop = 1;
2817296Ssam 		spl5();
2827296Ssam 		psp->ps_map.waiting = 1;
2838572Sroot 		while (psp->ps_map.waiting)
2847296Ssam 			sleep(&psp->ps_map.waiting, PSPRI);
2857296Ssam 		spl0();
2867296Ssam 		break;
2877632Ssam 
2887296Ssam 	default:
2898572Sroot 		return (ENOTTY);
2907296Ssam 		break;
2917296Ssam 	}
2928572Sroot 	return (0);
2937296Ssam }
2947296Ssam 
2957296Ssam #define SAVEPSADDR() {register short int i, x;x=spl6();i=psaddr->ps_addr;\
2967296Ssam 		while(((i=psaddr->ps_iostat)&DIOREADY)==0);\
2977296Ssam 		savepsaddr=psaddr->ps_data;splx(x);}
2987296Ssam #define RESTORPSADDR() {register int x,i;x=spl6();\
2997296Ssam 		while(((i=psaddr->ps_iostat)&DIOREADY)==0);\
3007296Ssam 		psaddr->ps_addr=savepsaddr;splx(x);}
3017296Ssam 
3027296Ssam psclockintr(dev)
3037296Ssam 	dev_t dev;
3047296Ssam {
3057296Ssam 	register struct psdevice *psaddr =
3067296Ssam 			(struct psdevice *) psdinfo[PSUNIT(dev)]->ui_addr;
3077296Ssam 	register struct ps *psp = &ps[PSUNIT(dev)];
3087296Ssam 	int savepsaddr;
3097296Ssam 
3108572Sroot 	if (!psp->ps_open)
3117296Ssam 		return;
3127296Ssam 	psp->ps_clock.icnt++;
3137296Ssam 	SAVEPSADDR();
3147296Ssam #ifndef EXTERNAL_SYNC
3158572Sroot 	if (psp->ps_refresh.state == AUTO_RF) {
3168572Sroot 		if (psp->ps_refresh.mode == SYNCING_RF) {
3177296Ssam 			psrfnext(psp, psaddr);
3187296Ssam 		} else {
3197296Ssam 			psp->ps_clock.ticked++;
3207296Ssam 			psp->ps_clock.missed++;
3217296Ssam 		}
3227296Ssam 	}
3237296Ssam #endif
3247296Ssam 	PSWAIT();
3257296Ssam 	psaddr->ps_addr = RTCREQ;
3267296Ssam 	PSWAIT();
3277296Ssam 	psaddr->ps_data = 01;		/* clear the request bits */
3287296Ssam 	RESTORPSADDR();
3297296Ssam }
3307296Ssam 
3317296Ssam /*ARGSUSED*/
3327296Ssam pssystemintr(dev)
3337296Ssam 	dev_t dev;
3347296Ssam {
3357296Ssam 	register struct psdevice *psaddr =
3367296Ssam 			(struct psdevice *) psdinfo[PSUNIT(dev)]->ui_addr;
3377296Ssam 	register struct ps *psp = &ps[PSUNIT(dev)];
3387296Ssam 	short int request;
3397296Ssam 	register int savepsaddr, x;
3407296Ssam 
3418572Sroot 	if (!psp->ps_open)
3427296Ssam 		return;
3437296Ssam 	SAVEPSADDR();
3447296Ssam 	PSWAIT();
3457296Ssam 	psaddr->ps_addr = SYSREQ;
3467296Ssam 	PSWAIT();
3477296Ssam 	request = psaddr->ps_data;
3487296Ssam 	psp->last_request = request;
3497296Ssam 	PSWAIT();
3507296Ssam 	psaddr->ps_addr = SYSREQ;
3517296Ssam 	PSWAIT();
3527296Ssam 	psaddr->ps_data = request&(~(HALT_REQ|MOSTOP_REQ));   /* acknowledge */
3537296Ssam 
3548572Sroot 	if (request & (MOSTOP_REQ|HALT_REQ)) {	/* Map stopped */
3557296Ssam 		psp->ps_map.icnt++;
3567296Ssam 		psmapstop(psaddr);		/* kill it dead */
3578572Sroot 		if (psp->ps_map.waiting) {
3587296Ssam 			psp->ps_map.waiting = 0;
3597296Ssam 			wakeup(&psp->ps_map.waiting);
3608572Sroot 			if (psp->ps_map.stop) {
3617296Ssam 				psp->ps_map.stop = 0;
3627296Ssam 				goto tryrf;
3637296Ssam 			}
3647296Ssam 		}
3658572Sroot 		if (psp->ps_map.state == AUTO_MAP)
3668572Sroot 			if (!psmapnext(psp, psaddr)) {
3677296Ssam 				psp->ps_map.mcntr = 0;
3687296Ssam 				/* prepare for next round */
3697296Ssam 				pssetmapbounds(psp, psaddr);
3708572Sroot 				if (psp->ps_refresh.mode == WAITING_MAP) {
3718572Sroot 					if (psp->ps_dbuffer.state == ON_DB)
3727296Ssam 						/* fill other db */
3737296Ssam 						psdbswitch(psp, psaddr);
3747296Ssam 					else
3757296Ssam 						psp->ps_map.mode = WAITING_RF;
3767296Ssam 					psrfnext(psp, psaddr);	/* start rf */
3777296Ssam 				} else
3787296Ssam 					psp->ps_map.mode = WAITING_RF;
3797296Ssam 			}
3807296Ssam 	}
3817296Ssam tryrf:
3828572Sroot 	if (request & RFSTOP_REQ) {		/* Refresh stopped */
3837296Ssam 		psp->ps_refresh.icnt++;
3847296Ssam 		psrfstop(psaddr, psp);
3858572Sroot 		if (psp->ps_refresh.waiting) {
3867296Ssam 			psp->ps_refresh.waiting = 0;
3877296Ssam 			wakeup(&psp->ps_refresh.waiting);
3888572Sroot 			if (psp->ps_refresh.stop) {
3897296Ssam 				psp->ps_refresh.stop = 0;
3907296Ssam 				goto tryhit;
3917296Ssam 			}
3927296Ssam 		}
3938572Sroot 		if (psp->ps_refresh.state == AUTO_RF)
3948572Sroot 			if (!psrfnext(psp, psaddr)) {	/* at end of refresh cycle */
3958572Sroot 				if (psp->ps_map.state == AUTO_MAP &&
3967296Ssam 						psp->ps_map.mode==WAITING_RF) {
3978572Sroot 					if (psp->ps_dbuffer.state == ON_DB)
3987296Ssam 						psdbswitch(psp, psaddr);
3997296Ssam 					else
4007296Ssam 						psmapnext(psp, psaddr);
4017296Ssam 				}
4027296Ssam 				psp->ps_refresh.srcntr = 0;
4037296Ssam #ifdef EXTERNAL_SYNC
4047296Ssam 				x = spl6();
4057296Ssam #endif
4068572Sroot 				if (!psp->ps_clock.ticked ||
4077296Ssam 						!psrfnext(psp, psaddr)) {
4087296Ssam 					psp->ps_refresh.mode = SYNCING_RF;
4097296Ssam 				}
4107296Ssam 				psp->ps_clock.ticked = 0;
4117296Ssam 				psp->ps_refresh.mode = SYNCING_RF;
4127296Ssam #ifdef EXTERNAL_SYNC
4137296Ssam 				splx(x);
4147296Ssam #endif
4157296Ssam 			}
4167296Ssam 	}
4177296Ssam tryhit:
4188572Sroot 	if (request & HIT_REQ) {		/* Hit request */
4197296Ssam 		psp->ps_hit.icnt++;
4207296Ssam 	}
4218572Sroot 	if (request == 0)
4227296Ssam 		psp->ps_strayintr++;
4237296Ssam 	RESTORPSADDR();
4247296Ssam }
4257296Ssam 
4267296Ssam psrfnext(psp, psaddr)
4277296Ssam 	register struct ps *psp;
4287296Ssam 	register struct psdevice *psaddr;
4297296Ssam {
4307296Ssam 
4318572Sroot 	if (psp->ps_refresh.srcntr < psp->ps_refresh.nsraddrs)
4327296Ssam 		psrfstart(psp->ps_refresh.sraddrs[psp->ps_refresh.srcntr++],
4337296Ssam 						psp, psaddr);
4348572Sroot 	else if (psp->ps_refresh.srcntr == psp->ps_refresh.nsraddrs
4357296Ssam 				&& psp->ps_dbuffer.state == ON_DB) {
4367296Ssam 		psrfstart(psp->ps_dbuffer.dbaddrs[psp->ps_dbuffer.rbuffer],
4377296Ssam 						psp, psaddr);
4387296Ssam 		psp->ps_refresh.srcntr++;	/* flag for after dbuffer */
4397296Ssam 	} else
4407296Ssam 		return(0);
4417296Ssam 	return(1);
4427296Ssam }
4437296Ssam 
4447296Ssam psrfstart(dfaddr, psp, psaddr)
4457296Ssam 	short int dfaddr;
4467296Ssam 	register struct ps *psp;
4477296Ssam 	register struct psdevice *psaddr;
4487296Ssam {
4497296Ssam 	int dummy;
4507296Ssam 
4517296Ssam 	PSWAIT();
4527296Ssam 	psaddr->ps_addr = RFASA;
4537296Ssam 	PSWAIT();
4547296Ssam 	psaddr->ps_data = dfaddr;
4557296Ssam 	PSWAIT();
4567296Ssam 	dummy = psaddr->ps_data;	/* just access to get to status reg */
4577296Ssam 	PSWAIT();
4587296Ssam 	psaddr->ps_data = RFSTART;	/* may want to | this value in */
4597296Ssam 	psp->ps_refresh.mode = RUNNING_RF;
4607296Ssam }
4617296Ssam 
4627296Ssam psrfstop(psaddr, psp)
4637296Ssam 	register struct psdevice *psaddr;
4647296Ssam 	register struct ps *psp;
4657296Ssam {
4667296Ssam 
4677296Ssam 	PSWAIT();
4687296Ssam 	psaddr->ps_addr = RFSR;
4697296Ssam 	PSWAIT();
4707296Ssam 	psaddr->ps_data = 0;
4717296Ssam }
4727296Ssam 
4737296Ssam psdbswitch(psp, psaddr)
4747296Ssam 	register struct ps *psp;
4757296Ssam 	register struct psdevice *psaddr;
4767296Ssam {
4777296Ssam 
4787296Ssam 	psp->ps_dbuffer.rbuffer = !psp->ps_dbuffer.rbuffer;
4797296Ssam 	pssetmapbounds(psp, psaddr);
4807296Ssam 	psmapnext(psp, psaddr);
4817296Ssam }
4827296Ssam 
4837296Ssam psmapnext(psp, psaddr)
4847296Ssam 	register struct ps *psp;
4857296Ssam 	register struct psdevice *psaddr;
4867296Ssam {
4877296Ssam 
4888572Sroot 	if (psp->ps_map.mcntr < psp->ps_map.nmaddrs)
4897296Ssam 		psmapstart(psp->ps_map.maddrs[psp->ps_map.mcntr++], psp, psaddr);
4907296Ssam 	else
4917296Ssam 		return(0);
4927296Ssam 	return(1);
4937296Ssam }
4947296Ssam 
4957296Ssam pssetmapbounds(psp, psaddr)
4967296Ssam 	register struct ps *psp;
4977296Ssam 	register struct psdevice *psaddr;
4987296Ssam {
4997296Ssam 	unsigned short int start;
5007296Ssam 
5017296Ssam 	PSWAIT();
5027296Ssam 	psaddr->ps_addr = MAOL;
5037296Ssam 	PSWAIT();
5048572Sroot 	if (psp->ps_dbuffer.state == ON_DB) {
5057296Ssam 		psaddr->ps_data = (start = psp->ps_dbuffer.dbaddrs[!psp->ps_dbuffer.rbuffer])
5067296Ssam 				+psp->ps_dbuffer.dbsize-2;   /* 2 for a refresh halt command */
5077296Ssam 		PSWAIT();
5087296Ssam 		psaddr->ps_data = start;
5097296Ssam 	} else {
5107296Ssam 		start = psaddr->ps_data;	/* dummy: don't update limit */
5117296Ssam 		PSWAIT();
5127296Ssam 		psaddr->ps_data = psp->ps_map.outputstart;
5137296Ssam 	}
5147296Ssam }
5157296Ssam 
5167296Ssam psmapstart(dfaddr, psp, psaddr)
5177296Ssam 	int dfaddr;
5187296Ssam 	register struct ps *psp;
5197296Ssam 	register struct psdevice *psaddr;
5207296Ssam {
5217296Ssam 	int data;
5227296Ssam 
5237296Ssam 	PSWAIT();
5247296Ssam 	psaddr->ps_addr = MAIA;
5257296Ssam 	PSWAIT();
5267296Ssam 	psaddr->ps_data = dfaddr;
5277296Ssam 	PSWAIT();
5287296Ssam 	psaddr->ps_data = MAO|MAI;	/* may want more here */
5297296Ssam 	psp->ps_map.mode = RUNNING_MAP;
5307296Ssam }
5317296Ssam 
5327296Ssam psmapstop(psaddr)
5337296Ssam 	register struct psdevice *psaddr;
5347296Ssam {
5357296Ssam 
5367296Ssam 	PSWAIT();
5377296Ssam 	psaddr->ps_addr = MASR;
5387296Ssam 	PSWAIT();
5397296Ssam 	psaddr->ps_data = 0;	/* zero MAI bit */
5407296Ssam 	PSWAIT();
5417296Ssam 	psaddr->ps_addr = MAIA;
5427296Ssam 	PSWAIT();
5437296Ssam 	psaddr->ps_data = 0;	/* zero input address register */
5447296Ssam 	PSWAIT();
5457296Ssam 	psaddr->ps_addr = SYSREQ;
5467296Ssam 	PSWAIT();
5477296Ssam 	psaddr->ps_data = HALT_REQ|MOSTOP_REQ;	/* overkill?? */
5487296Ssam }
5497296Ssam 
5507296Ssam /*ARGSUSED*/
5517296Ssam psdeviceintr(dev)
5527296Ssam 	dev_t dev;
5537296Ssam {
5547296Ssam 
5557296Ssam 	printf("ps device intr\n");
5567296Ssam }
5577296Ssam 
5587296Ssam /*ARGSUSED*/
5597296Ssam psdmaintr(dev)
5607296Ssam 	dev_t dev;
5617296Ssam {
5627296Ssam 
5637296Ssam 	printf("ps dma intr\n");
5647296Ssam }
5657296Ssam 
5667296Ssam psreset(uban)
5677296Ssam 	int uban;
5687296Ssam {
5697296Ssam }
5707296Ssam 
5717296Ssam psextsync(PC, PS) {
5727296Ssam 	register int n;
5737296Ssam 	register struct psdevice *psaddr;
5747296Ssam 	register struct ps *psp;
5757296Ssam 	register int savepsaddr;
5767296Ssam 
5777296Ssam #ifdef EXTERNAL_SYNC
5788572Sroot 	for (psp = ps, n = 0; n < NPS; psp++, n++) {
5798572Sroot 		if (!psp->ps_open)
5807296Ssam 			continue;
5818572Sroot 		if (psp->ps_refresh.mode == SYNCING_RF) {
5827296Ssam 			psaddr = (struct psdevice *) psdinfo[n]->ui_addr;
5837296Ssam 			SAVEPSADDR();
5847296Ssam 			psrfnext(psp, psaddr);
5857296Ssam 			RESTORPSADDR();
5867296Ssam 		} else {
5877296Ssam 			psp->ps_clock.ticked++;
5887296Ssam 			psp->ps_clock.missed++;
5897296Ssam 		}
5907296Ssam 	}
5917296Ssam #endif
5927296Ssam }
5937296Ssam #endif
594