.TITLE PRINT ;PRINT QUEUING SUBROUTINE .IDENT 'V001A' ; ; THIS ROUTINE IS RE-ENTRANT AND POSITION-INDEPENDENT. ; ; THIS SUBROUTINE QUEUES A FILE FOR PRINTING BY EITHER THE MULTI-DEVICE ; DESPOOLER (SPR2..) OR THE SPECIAL LV11 GRAPHIC DESPOOLER TASK ; (SPG...). UNLIKE THE ".PRINT" SUBROUTINE INCLUDED IN FCS, THIS ; ROUTINE SUPPORTS ALL OF THE OPTIONS OF THE DESPOOLERS AND THE SPOOLER ; QUEUE MANAGER (SPR...), INCLUDING ADDITIONAL OPTIONS FOR ; GRAPHIC DESPOOLING. THE FILE TO BE PRINTED MUST BE OPEN BEFORE ; CALLING "PRINT"; IT IS CLOSED UPON RETURN. THE "C" BIT IS SET ; ON RETURN IF AN ERROR OCCURS IN EITHER THE CLOSE OPERATION OR THE ; SEND-AND-REQUEST DIRECTIVE WHICH QUEUES THE FILE FOR PRINTING. THE ; CALLING PROGRAM SHOULD FIRST EXAMINE OFFSET F.ERR IN THE FDB, THEN THE ; DSW, TO DETERMINE THE CAUSE OF THE ERROR. ; ; ENTERED WITH R0=FDB ADDRESS FOR FILE TO BE PRINTED ; 16(SP)=PRINTER DEVICE NAME (0 INPLIES DEFAULT = LP:) ; 14(SP)=PRINTER UNIT NUMBER ; 12(SP)=PRIORITY OF OUTPUT SELECTION (0 IMPLIES DEFAULT = ; CALLING TASK PRIORITY) ; 10(SP)=OUTPUT FORM CODE (0 TO 7) ; 6(SP)=NUMBER OF COPIES TO PRINT (0 IMPLIES DEFAULT = 1) ; 4(SP)=PRESERVE FLAG (NON-ZERO IMPLIES DON'T DELETE FILE ; AFTER PRINTING) ; 2(SP)=GRAPHIC DESPOOLING FLAG (NON-ZERO IMPLIES GRAPHIC ; DESPOOLING) ; (SP)=DOUBLESIZE FLAG (NON-ZERO IMPLIES DOUBLE SIZE PLOT FOR ; GRAPHIC DESPOOLING) ; ; RETURNS WITH REGISTERS UNCHANGED AND 8 ARGUMENTS REMOVED FROM STACK. ; ; ERRORS: CLOSE FAILED ; SEND AND REQUEST DIRECTIVE FAILED ; ; MACRO CALLS: ; .MCALL CLOSE$,GTSK$S,VSDR$S ; ; DEFINITIONS: ; GTSKLN = 16. ;LENGTH OF GTSK$ DATA BLOCK IN WORDS DEFDEV = "LP ;DEFAULT PRINTER DEVICE NAME GRPH = 100000 ;GRAPHIC DESPOOLING FLAG BIT MASK PRES = 40000 ;PRESERVE FILE FLAG BIT MASK DBLE = 20000 ;DOUBLE SIZE GRAPH FLAG BIT MASK ; .PSECT PRNTRO,RO ; PRINT:: MOV R1,-(SP) ;SAVE REGISTERS MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) TST F.BDB(R0) ;IS FILE OPEN? BEQ 8$ ;NO, QUIT RIGHT NOW TST F.SPDV(R0) ;IS FILE DESTINED FOR AUTOSPOOLED DEVICE? BEQ 1$ ;NO MOV F.SPDV(R0),32(SP);YES, OVERRIDE SPECIFIED DEVICE MOVB F.SPUN(R0),30(SP);ALSO UNIT NUMBER CLR F.SPDV(R0) ;NOW INSURE FCS DOESN'T SPOOL FOR US... CLRB F.SPUN(R0) BICB #200,F.BKP1(R0) ;...BY PRETENDING IT NEVER HAPPENED 1$: CLOSE$ R0 ;CLOSE FILE BCS 8$ ;FAILED! DON'T QUEUE IT BITB #FD.REC,F.RCTL(R0);IS OUTPUT DEVICE RECORD-ORIENTED? BNE 8$ ;YES, CAN'T QUEUE THE FILE MOV 24(SP),R1 ;GET FORM NUMBER ASH #5,R1 ;PUT INTO BITS 5-7 BIC #177437,R1 ;REMOVE OTHER JUNK BIC #177740,22(SP) ;LIMIT COPIES TO RANGE 1 TO 31. BNE 2$ ;IT'S NON-ZERO, OK INC R1 ;ZERO, MAKE IT ONE 2$: BIS 22(SP),R1 ;COMBINE WITH FORM NUMBER TST 20(SP) ;PRESERVE FILE FROM DELETION? BEQ 3$ ;NO BIS #PRES,R1 ;YES, SET PRESERVE BIT 3$: TST 16(SP) ;GRAPHIC MODE DESPOOLING? BEQ 4$ ;NO BIS #GRPH,R1 ;YES, SET GRAPHIC MODE BIT TST 14(SP) ;DOUBLE SIZE GRAPH MODE? BEQ 4$ ;NO BIS #DBLE,R1 ;YES, SET DOUBLE SIZE BIT 4$: CLR R2 ;GET... BISB 26(SP),R2 ;...OUTPUT PRIORITY BNE 5$ ;NON-ZERO, USE IT SUB #2*GTSKLN,SP ;RESERVE SPACE ON STACK MOV SP,R3 ;SET R3 TO POINT TO IT GTSK$S R3 ;GET TASK PARAMETERS BISB G.TSPR(R3),R2 ;USE CALLING TASK'S PRIORITY ADD #2*GTSKLN,SP ;TAKE JUNK OFF STACK NOW 5$: MOVB 30(SP),R3 ;GET PRINTER UNIT NO. MOV 32(SP),R4 ;GET PRINTER DEVICE NAME BNE 6$ ;NON-ZERO, USE IT MOV #DEFDEV,R4 ;ZERO, USE DEFAULT 6$: MOV SP,R5 ;SAVE STACK POSITION MOV F.FNB+N.FVER(R0),-(SP);PUSH FILE VERSION, MOV F.FNB+N.FTYP(R0),-(SP);TYPE, MOV F.FNB+N.FNAM+4(R0),-(SP);FILE NAME (3 WORDS), MOV F.FNB+N.FNAM+2(R0),-(SP) MOV F.FNB+N.FNAM(R0),-(SP) MOV F.FNB+N.DID+4(R0),-(SP);DIRECTORY ID (3 WORDS), MOV F.FNB+N.DID+2(R0),-(SP) MOV F.FNB+N.DID(R0),-(SP) MOV F.FNB+N.UNIT(R0),-(SP);UNIT, MOV F.FNB+N.DVNM(R0),-(SP);AND DEVICE NAME MOV R1,-(SP) ;PUSH FORM/COPY/FLAGS WORD MOVB R3,-(SP) ;PUSH PRINTER UNIT NO. MOVB R2,1(SP) ;PUT PRIORITY IN HIGH BYTE MOV R4,-(SP) ;PUSH PRINTER DEVICE MOV SP,R3 ;ADDRESS OF DESPOOLER PARAMETER BLOCK MOV (PC)+,-(SP) ;PUSH DESPOOLER TASK NAME .RAD50 '...' MOV (PC)+,-(SP) ;(2 WORDS) .RAD50 'SPR' BIT #GRPH,R1 ;BUT IS IT GRAPHIC DESPOOLING? BEQ 7$ ;NO MOV (PC)+,(SP) ;YES, USE DIFFERENT NAME .RAD50 'SPG' 7$: MOV SP,R1 ;ADDRESS OF TASK NAME VSDR$S R1,,,,,R3,,,R2 ;SEND DATA AT R3 TO TASK AT R1 WITH ;PRIORITY R2 MOV R5,SP ;CLEAN STUFF FROM STACK 8$: MOV (SP)+,R5 ;RESTORE REGISTERS MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP),20(SP) ;MOVE PC BACK ON STACK FOR RTS ROR R0 ;SAVE "C" BIT ADD #20,SP ;REMOVE ARGUMENTS FROM STACK ASL R0 ;RESTORE "C" BIT & FDB ADDRESS RTS PC ;RETURN ; .END