.TITLE PRINT - SPOOL FILE COMMAND .ENABL LC .IDENT /V01/ ; ;+ ; ; PRINT -- SPOOLS FILES TO THE PRINT SYMBIONT ; ; PRINT PARSES THE COMMAND LINE AND OPENS FOR READ ONLY ACCESS ; ANY FILES SPECIFIED. THE INFORMATION FILLED INTO THE FILENAME ; BLOCK IS THEN PASSED TO PRT... IN A MESSAGE PACKET DESCRIBED ; IN THE UTILITIES PROCEDURES MANUAL, FIGURE C-1. ; PRT... IS THEN REQUESTED TO RUN TO PRINT THE FILES. ; ; SINCE THE MESSAGE PACKET DOES NOT CONTAIN A FIELD FOR NUMBER ; OF COPIES, MULTIPLE PACKETS ARE SENT TO PERFORM THE SAME ; FUNCTION (PIP DOES THE SAME THING). ; ; THE DELETE SWITCH SETS THE UNCONDITIONAL DELETE BIT IN THE ; MESSAGE BLOCK (SIGN BIT OF UNIT NUMBER WORD). ; ; COMMAND FORMAT: ; ; >PRINT [DDNN:]FILENAME[/SW] ; ; SWITCHES ARE: ; ; /CO[PIES]:N PRINT N (DECIMAL) COPIES ; /[NO]DE[LETE] UNCONDITIONALLY DELETE THE FILE AFTER PRINTING ; (APPLIED ONLY TO THE LAST COPY) ; ; SY0: IS THE DEFAULT DEVICE ; NO FILENAME DEFAULTS OR WILDCARDS ARE ALLOWED (YET) ; ; SWITCH DEFAULTS ARE: /NODE/CO:1 ; ; ASSEMBLY INSTRUCTIONS: ; ; MAC>PRINT,PRINT/-SP=PRINT ; ; TASK BUILD INTSTRUCTIONS: ; ; >TKB ; TKB>PRINT/-FP/-SE,PRINT/-SP=PRINT ; TKB>/ ; ENTER OPTIONS: ; TKB>STACK=32 ; TKB>UNITS=2 ; TKB>ASG=TI:1,SY:2 ; TKB>TASK=...PRI ; TKB>// ; ; MODIFICATIONS: ; ; G L MAXWELL 2-FEB-80 GLM001 ; ; 1. ENABLE LOWER CASE TI: OUTPUT MESSAGES ; 2. IMPLEMENT A HELP COMMAND (PRI /HE[LP]) ;- ; ;TEST=0 ; TEST RUN -- SEND TO PRTTST INSTEAD OF PRT... ; ; MACRO TO PRINT AN ERROR MESSAGE AND EXIT ; .MACRO ERROR MESSAGE .PSECT MSGTXT,RO .NCHR MSGLEN, MSGADR=. .ASCII \MESSAGE\ .EVEN .PSECT PRINT MOV MSGADR,R2 ; CARRIAGE CONTROL IN R2 MSGADR=MSGADR+1 MSGLEN=MSGLEN-1 MOV #MSGADR,R0 ; MESSAGE ADDRESS IN R0 MOV #MSGLEN,R1 ; LENGTH IN R1 JMP PRTERR ; PRINT IT .ENDM .PSECT MSGTXT,RO HMESS:: .ASCII <15><12>^PRINT -- Submit File for Printing^<15><12><12> .ASCII ^Command Syntax:^<15><12><12> .ASCII ^ PRI filespec [/switches]^<15><12><12> .ASCII ^Where:^<15><12><12> .ASCII ^ 'filespec' is a standard RSX-11M file specification^<15><12> .ASCII ^ '/switches' are one or more switches. Legal switches:^<15><12><12> .ASCII ^ /CO:n Spool 'n' copies of the file to the printer^<15><12> .ASCII ^ /DE Delete the file after the last copy is printed^<15><12> .ASCII ^ /HE Print this message (no spooling performed)^<15><12><12> .ASCII ^Default switches: /CO:1/NODE^<15><12> HMLEN = . - HMESS .EVEN ERRLUN = 1 ; ERROR MESSAGE LUN PRTLUN = 2 ; LUN TO OPEN FILE FOR SPOOLING .MCALL FDBDF$,FDRC$A,FDBK$A,FDOP$A,NMBLK$,FSRSZ$,FINIT$,OPEN$R .PSECT FCSFDB PRTFDB::FDBDF$ ; ALLOCATE FDB TO OPEN PRINT FILE FDRC$A FD.RWM ; PRETEND BLOCK I/O DESIRED FDBK$A 0,0 ; NO TRUE BLOCK BUFFER FDOP$A PRTLUN,CSIBLK+C.DSDS,DFNB,FO.RD,FA.ENB!1 ; CSI PARSES FILESPECS DFNB: NMBLK$ ,,,SY,0 ; DEFAULT DDNN: TO SY0: FSRSZ$ 0 ; NO GETS/PUTS USED .MCALL GMCR$,DIR$,SDAT$,RQST$ .MCALL CSI$,CSI$1,CSI$2,CSI$SW,CSI$SV,CSI$ND .PSECT MCRBUF::GMCR$ ; GET MCR DPB AND BUFFER ; ; PRT... SEND DATA BUFFER FORMAT: ; ; WORD CONTENTS ; ; 1 FILENAME IN RAD50 ; 2 ; 3 ; 4 FILE TYPE IN RAD50 ; 5 FILE VERSION (BINARY) ; 6 DEVICE NAME IN ASCII ; 7 UNIT NUMBER (BINARY) ; 8 FILE ID ; 9 ; 10 ; 11 DIRECTORY ID ; 12 ; 13 ; .IF NDF TEST SNDPRT::SDAT$ PRT...,PRTMSG ; PRT... SEND DATA DPB .IFF ;NDF TEST SNDPRT::SDAT$ PRTTST,PRTMSG ; PRTTST SEND DATA DPB .ENDC ;NDF TEST PRTMSG::.BLKW 13. ; MESSAGE .IF NDF TEST RQSPRT::RQST$ PRT... ; PRT... REQUEST DPB .IFF ;NDF TEST RQSPRT::RQST$ PRTTST ; PRTTST REQUEST DPB .ENDC ;NDF TEST CSI$ ; DEFINE CSI CONTROL BLOCK OFFSETS CSIBLK::.BLKB C.SIZE ; ALLOCATE CSI CONTROL BLOCK .EVEN ; SWITCH TABLE MASK BITS COMSK = 100000 ; /CO: DEMSK = 200 ; /DE HLPMSK = 1 ; /HE[LP] ; CSI SWITCH DESCRIPTOR TABLES INTAB: CSI$SW CO,COMSK,,,,COVAL CSI$SW DE,DEMSK,DELETE,SET,NEG CSI$SW HELP,HLPMSK,DELETE CSI$ND ; CSI SWITCH-VALUE DESCRIPTOR TABLES COVAL: CSI$SV DECIMAL,COPIES,2 CSI$ND COPIES::.WORD 1 ; NUMBER OF COPIES TO PRINT (DEFAULT = /CO:1) DELETE::.WORD 0 ; DELETE MASK (DEFAULT = /NODE) .MCALL EXIT$S .PSECT PRINT,RO .ENABLE LSB PRINT:: FINIT$ ; INITIALIZE THE FILE SYSTEM DIR$ #MCRBUF ; GET COMMAND LINE BCC 10$ ERROR < PRINT -- Get command line error> 10$: MOV #MCRBUF+G.MCRB,R1 ; ADDRESS OF COMMAND LINE BUFFER MOV $DSW,R2 ; BYTE COUNT (EXCLUDING TERMINATOR) 20$: CMPB (R1)+,#<' > ; SKIP PRI[...] BEQ 30$ SOB R2,20$ ; FOR AS MANY CHARACTERS AS ENTERED ERROR < PRINT -- No command entered> 30$: DEC R2 ; ADJUST REMAINING BYTE COUNT MOV R1,R0 ; START OF COMMAND MOV R2,R3 ; COPY BYTE COUNT 40$: CMPB (R0)+,#'= ; MANUALLY SCAN FOR EQUAL SIGN BEQ SYNERR ; SYNTAX ERROR IF FOUND SOB R3,40$ ; UNTIL DONE CSI$1 #CSIBLK,R1,R2 ; INITIALIZE CSI COMMAND BLOCK BCS SYNERR ; SYNTAX ERROR CSI$2 #CSIBLK,OUTPUT,#INTAB ; PARSE THE SWITCHES BCS SYNERR ; SYNTAX ERROR BIT #HLPMSK,DELETE ; DOES USER WANT HELP? BEQ 400$ ; NO, SKIP AHEAD JMP HLPOUT ; ELSE GO GIVE HELP! STBITS=CS.EQU!CS.WLD!CS.MOR ; ILLEGAL STATE BITS 400$: BITB #STBITS,CSIBLK+C.STAT ; VALIDATE COMMAND BNE SYNERR ; SYNTAX ERROR BITB #CS.NMF,CSIBLK+C.STAT ; FILENAME IS REQUIRED BEQ SYNERR ; SYNTAX ERROR TST COPIES ; LEGAL NUMBER OF COPIES? BGT 50$ ; YES, CONTINUE SYNERR: ERROR < PRINT -- Syntax error> 50$: OPEN$R #PRTFDB ; ATTEMPT TO OPEN THE FILE SECIFIED BCC 60$ ; MADE IT ERROR < PRINT -- Failed to open file> ; FILL IN MESSAGE BLOCK 60$: MOV #PRTFDB+F.FNB,R0 ; POINT TO FILENAME BLOCK IN FDB MOV #PRTMSG+16,R1 ; POINT TO FILE ID IN PRT MESSAGE .IF NE N.FID .ERROR FNB FILE I.D. MUST BE AT OFFSET 0 .ENDC MOV (R0)+,(R1)+ ; COPY WORD 1 OF FILE ID MOV (R0)+,(R1)+ ; COPY WORD 2 OF FILE ID MOV (R0)+,(R1)+ ; COPY WORD 3 OF FILE ID MOV #PRTMSG,R1 ; POINT TO FILENAME IN PRT MESSAGE .IF NE N.FNAM - 6 .ERROR FNB FILENAME MUST BE AT OFFSET 6 .ENDC MOV (R0)+,(R1)+ ; COPY WORD 1 OF FILE NAME MOV (R0)+,(R1)+ ; COPY WORD 2 OF FILE NAME MOV (R0)+,(R1)+ ; COPY WORD 3 OF FILE NAME .IF NE N.FTYP - 14 .ERROR FNB FILE TYPE MUST BE AT OFFSET 14 .ENDC MOV (R0)+,(R1)+ ; COPY FILE TYPE .IF NE N.FVER - 16 .ERROR FNB FILE VERSION MUST BE AT OFFSET 16 .ENDC MOV (R0)+,(R1)+ ; COPY FILE VERSION ADD #4,R0 ; SKIP FNB STATUS AND .FIND CONTEXT MOV #PRTMSG+24,R1 ; POINT TO DIRECTORY ID IN PRT MESSAGE .IF NE N.DID - 24 .ERROR FNB DIRECTORY ID MUST BE AT OFFSET 24 .ENDC MOV (R0)+,(R1)+ ; COPY WORD 1 OF DIRECTORY ID MOV (R0)+,(R1)+ ; COPY WORD 2 OF DIRECTORY ID MOV (R0)+,(R1)+ ; COPY WORD 3 OF DIRECTORY ID MOV #PRTMSG+12,R1 ; POINT TO DEVICE NAME IN PRT MESSAGE .IF NE N.DVNM - 32 .ERROR FNB DEVICE NAME MUST BE AT OFFSET 32 .ENDC MOV (R0)+,(R1)+ ; COPY DEVICE NAME .IF NE N.UNIT - 34 .ERROR FNB UNIT NUMBER MUST BE AT OFFSET 34 .ENDC MOV (R0),(R1) ; FINISH UP WITH UNIT NUMBER ; SEND N-1 MESSAGES TO PRT... MOV COPIES,R0 ; GET COPIES DEC R0 ; FOR ALL BUT THE LAST BEQ 100$ ; JUST ONE, SKIP THIS STUFF 80$: DIR$ #SNDPRT ; SEND THE MESSAGE TO PRT... BCS 150$ ; SEND FAILURE CALL RUNPRT ; START PRT, IF NECESSARY SOB R0,80$ ; INTIL DONE ; DELETE FLAG ON? 100$: BISB DELETE,PRTMSG+15 ; SET APPROPRIATE BIT FOR DELETE DIR$ #SNDPRT ; SEND REMAINING MESSAGE BCC 160$ 150$: ERROR < PRINT -- Send data failure> 160$: CALL RUNPRT ; START PRT, IF NECESSARY BR EXIT ; ALL DONE EXIT: EXIT$S .PAGE ; ; RUNPRT -- REQUEST PRT'S EXECUTION ; RUNPRT::DIR$ #RQSPRT ; REQUEST PRT... BCC 200$ ; ALL OK, RETURN CMP $DSW,#IE.ACT ; PRT... ALREADY ACTIVE? BEQ 200$ ; YES, THAT'S OK TOO ERROR < PRINT -- PRT... request failure> 200$: RETURN ; RETURN TO CALLER .DSABLE LSB ; ;+ ; ; PRTERR -- PRINT ERROR MESSAGE AND EXIT ; ; R0 = ADDR OF MESSAGE ; R1 = NUMBER OF CHARACTERS ; R2 = CARRIAGE CONTROL BYTE ; ; ISSUE QIOW$S TO TI: AND EXIT. ; ;- ; .MCALL QIOW$S PRTERR:: QIOW$S #IO.WLB,#ERRLUN,#ERRLUN,,,, BR EXIT ;+ ; HLPOUT - CODE TO OUTPUT A HELP MESSAGE ON THE USER TERMINAL ;- HLPOUT:: QIOW$S #IO.WLB,#ERRLUN,#ERRLUN,,,,<#HMESS,#HMLEN,#0> BR EXIT .END PRINT