/* * (C) 1984 UniSoft Corp. of Berkeley CA * * UniPlus Source Code. This program is proprietary * with Unisoft Corporation and is not to be reproduced * or used in any manner except as authorized in * writing by Unisoft. * * Interrupt handler for level 1 interrupts. * parallel port 0, sony, and video circuit controller * * Since the Parallel Port hard disk interrupt comes in at this level * as well as the Sony and vertical retrace (clock) we have included * this so we may only call the actual interrupt routine when really * necessary. */ #include "sys/param.h" #include "sys/config.h" #include "sys/types.h" #include "sys/systm.h" #include "sys/dir.h" #include "sys/signal.h" #include "sys/user.h" #include "sys/proc.h" #include "sys/errno.h" #include "sys/file.h" #include "sys/tty.h" #include "sys/termio.h" #include "sys/conf.h" #include "sys/sysinfo.h" #include "sys/var.h" #include "sys/reg.h" #include "setjmp.h" #include "sys/mmu.h" #include #include #include unsigned char msvrcnt; extern struct msparms mparm; extern struct proc *msproc; extern char msblkd; extern char msvrmsk; l1intr(ap) struct args *ap; { unsigned char a; register struct device_d *devp = PPADDR; register struct device_e *f = COPSADDR; a = devp->d_ifr; /* read intr flag register */ if (a & (FCA1 | FTIMER1)) { ap->a_dev = 0; /* set to port number instead of clock value */ ppintr(ap); /* built in parallel port */ } else { if ((f->e_irb & FDIR) != 0) snintr(); /* sony interrupt */ else { /* verticle retrace interrupt */ if ((mparm.mp_flags & MF_VRT) != 0) { VROFF = 1; if (msvrcnt++ >= msvrmsk) { msvrcnt = 0; if (msblkd) { msblkd = 0; wakeup((caddr_t)&msblkd); } psignal(msproc,SIGMOUS); } VRON = 1; } else { do { VROFF = 1; VRON = 1; } while ((STATUS & S_VR) == 0); } clock(ap); } } }