.TITLE VPDRV ; ; VPDRV SUPPORTS THE FOLLOWING CODES ; ; 00012 KIL ; 00400 WLB PRINT ; 01400 ATT ; 02000 DET ; 02400 SPP SIMULTANEOUS PRINT/PLOT ; 03000 PLT IO.SPP=2400 IO.PLT=3000 LD$VP=0 ;DEFINE SYMBOL TO CREATE LOADABLE DRIVER .MCALL ABODF$,HWDDF$,PKTDF$,TCBDF$ ABODF$ HWDDF$ PKTDF$ TCBDF$ ; DEFINITIONS FOR COMMAND AND DATA REGISTERS AND INTERRUPT VECTOR PNTCR=177514 PNTDBR=177516 PLTCR=177510 PLTDBR=177512 PNTIV=200 PLTIV=174 ERROR=100000 ENABLE=100 READY=200 RR=2 SPP=1 ; DEFINITION FOR ABORT FLAG KEPT IN U.CW2 ABORT=4000 ; STORAGE AREA FOR ORIGINAL INTERRUPT VECTOR IVSAV: .WORD 0,0 ; STORAGE AREA FOR INTSV$ PARAMETERS UCBADR: .WORD 0 TEMP: .WORD 0 ; RETURN ADDRESS FOR ROUTINES USING INTERRUPT ROUTINE RETLOC: .WORD 0 ; WORDS TO KEEP SPP STATUS SPPFLG: .WORD 0 SPPSET: .WORD 0 ;WORD TO SAVE BYT COUNT BYTCNT: .WORD 0 ; WORD TO SAVE PAGE REG 6 IN ORDER TO IMPLEMENT OUR OWN $GTBYT FOR VPLT SAVPR6: .WORD 0 ; DISPATCH VECTOR $VPTBL::.WORD VPINI,VPCAN,VPOUT,VPPWF VPINI: CALL $GTPKT BCC 10$ RETURN 10$: MOV R5,UCBADR ;SAVE UCB FOR INTERRUPT ROUTINE MOV I.PRM+4(R1),BYTCNT ;SAVE BYTE COUNT CLR U.CW2(R5) ;CLEAR STATUS WORD ; DETERMINE FUNCTION AND BRANCH TO PROCESSING ROUTINE CMP I.FCN(R1),#IO.PLT BEQ VPLT CMP I.FCN(R1),#IO.SPP BEQ VSPP CMP I.FCN(R1),#IO.WLB BEQ VPNT CMP I.FCN(R1),#IO.ATT BEQ VATT CMP I.FCN(R1),#IO.DET BEQ VDET CLR R1 MOV #IE.IFC&377,R0 BR IODON VATT: BIS #RR,@#PLTCR MOV @#PNTIV,IVSAV MOV @#PNTIV+2,IVSAV+2 MOV @#PLTIV,@#PNTIV MOV @#PLTIV+2,@#PNTIV+2 BR SUCFIN VDET: TST SPPSET BNE 10$ JSR PC,MPNTR 10$: JSR PC,MPLTR BIS #RR,@#PLTCR MOV IVSAV,@#PNTIV MOV IVSAV+2,@#PNTIV+2 BR SUCFIN VPLT: TST SPPSET BNE 10$ JSR PC,MPNTR 10$: JSR PC,MPLTR MOV @#KISAR6,SAVPR6 MOV U.BUF(R5),@#KISAR6 20$: TST U.CNT(R5) BEQ RESPR6 BIT #READY,@#PLTCR BEQ 30$ MOVB @U.BUF+2(R5),@#PLTDBR INC U.BUF+2(R5) DEC U.CNT(R5) BR 20$ 30$: MOV SAVPR6,@#KISAR6 BR 10$ RESPR6: MOV SAVPR6,@#KISAR6 SUCFIN: MOV BYTCNT,R1 MOV #IS.SUC&377,R0 IODON: CALL $IODON BR VPINI VPNT: TST SPPSET BEQ 10$ JSR PC,MPLTR 10$: CLR SPPFLG BR PRINT VSPP: TST SPPSET BEQ 10$ JSR PC,MPLTR 10$: MOV #SPP,SPPFLG PRINT: JSR PC,MPNTR MOV SPPFLG,SPPSET BEQ 15$ BIS #SPP,@#PLTCR BR 20$ 15$: BIC #SPP,@#PLTCR 20$: TST U.CNT(R5) BEQ SUCFIN BIT #READY,@#PNTCR BEQ PRINT CALL $GTBYT MOVB (SP)+,@#PNTDBR DEC U.CNT(R5) BR 20$ ; MAKE THE PLOTTER READY MPLTR: BIT #READY,@#PLTCR BEQ 10$ RTS PC ;SET THINGS UP SO THAT INTERRUPT ROUTINE RETURNS TO CALLER 10$: MOV (SP)+,RETLOC MOVB S.ITM(R4),S.CTM(R4) BIT #ERROR,@#PLTCR BNE 20$ BIS #ENABLE,@#PLTCR 20$: RETURN ; MAKE PRINTER READY MPNTR: BIT #READY,@#PNTCR BEQ 10$ RTS PC 10$: TST SPPSET BNE 30$ MOV (SP)+,RETLOC MOVB S.ITM(R4),S.CTM(R4) BIT #ERROR,@#PNTCR BNE 20$ BIS #ENABLE,@#PNTCR 20$: RETURN ; WE HAVE SPP ERROR. THAT IS NOT ENOUGH PLOT LINES FOR CURRENT PRINT LINE 30$: MOV BYTCNT,R1 SUB U.CNT(R5),R1 MOV #IE.IFC&377,R0 TST (SP)+ BR IODON $VPINT:: VPINT: INTSV$ VP,PR4,1,TEMP,UCBADR ;;; R5=ADDR(UCB) MOV U.SCB(R5),R4 ;;; R4=ADDR(SCB) BIC #ENABLE,@#PNTCR ;;; DISABLE PRINTER INTERRUPT BIC #ENABLE,@#PLTCR ;;; DISABLE PLOTTER INTERRUPT BIT #READY,@#PLTCR ;;;IF NOT READY WAIT FOR TIMEOUT BPL 10$ ;;; JMP $INTXT ;;; 10$: CLRB S.CTM(R4) ;;; DISABLE TIMEOUT COUNT CALL $FORK ;;; ; THE ROUTINE THAT ENABLED INTERRUPT SAVED RETURN ADDR AT RETLOC MOV RETLOC,-(SP) RTS PC VPPWF: RETURN ;POWERFAIL HANDLED BY DEVICE TIMEOUT ; ; DEVICE TIMEOUT RESULTS IN NOT READY MESSAGE EVERY 15. SECONDS VPOUT: BIC #ENABLE,@#PNTCR ;;;DISABLE PRINTER INTERRUPTS BIC #ENABLE,@#PLTCR ;;;DISABLE PLOTTER INTERRUPTS MTPS #0 ;;;ALLOW INTERRUPTS ; IF REQUEST IS TO ABORT THEN ISSUE IODON MOV #IE.ABO&377,R0 BIT #ABORT,U.CW2(R5) BEQ 5$ JMP IODON ; IF PLOTTER IS READY CONTINUE WITH PROCESSING 5$: BIT #READY,@#PLTCR BEQ 10$ MOV RETLOC,-(SP) RTS PC ; SET TO BE RECALLED EVERY SECOND. ISSUE MESSAGE EVERY 15 SECONDS 10$: MOV #T.NDNR,R0 MOVB #1,S.CTM(R4) DECB S.STS(R4) BNE VPPWF MOVB #15.,S.STS(R4) CALLR $DVMSG ; ; CANCEL FORCES I/O TO COMPLETE IF DEVICE IS NOT READY VPCAN: CMP R1,I.TCB(R0) ;;;REQUEST FOR CURRENT TASK BNE 10$ ;;;IF NE NO BIS #ABORT,U.CW2(R5);;; 10$: RETURN ;;; .END