.TITLE PRT ;QUEUE FILE FOR PRINTING .IDENT 'V001A' ; ; MCR FUNCTION TASK TO QUEUE A FILE OR FILES FOR PRINTING. ; ; THIS TASK SUPPLEMENTS THE QUEUING (BUT NOT QUEUE-LISTING OR QUEUE- ; MODIFYING) FACILITIES OF THE "QUE" COMMAND FOR RSX11D. IT ALLOWS ; FILES TO BE QUEUED FOR PRINTING BY EITHER THE USUAL MULTI-DEVICE ; OUTPUT DESPOOLER OR THE SPECIAL LV11 GRAPHIC DESPOOLER TASK. SYNTAX ; OF THE "PRT" COMMAND IS: ; ; PRT [DEV:=] FILE [,FILE]... [/SWITCHES] ; ; WHERE "DEV" IS A PRINTER OR TERMINAL DEVICE AND UNIT NUMBER (THE ; DEFAULT IS LP0: IF OMITTED), "FILE" REPRESENTS A FILE OR SET OF ; FILES (USING WILDCARDS) TO BE PRINTED, AND THE FOLLOWING SWITCHES ; MAY OPTIONALLY BE SPECIFIED: ; ; /PR:# SET PRIORITY OF OUTPUT SELECTION TO # (1 TO 255 ALLOWED) ; /FO:# USE OUTPUT FORMS TYPE # (0 TO 7). IGNORED BY GRAPHIC DESPOOLER. ; /CO:# SET NUMBER OF COPIES TO PRINT TO # (1 TO 31). ; /DE DELETE FILE AFTER PRINTING ; /-DE DON'T DELETE FILE AFTER PRINTING ; /GR PERFORM GRAPHIC DESPOOLING ; /-GR PERFORM NORMAL (NON-GRAPHIC) DESPOOLING ; /DB SELECT DOUBLE SIZE FOR PLOT (GRAPHIC DESPOOLING ONLY) ; /-DB SELECT SINGLE SIZE FOR PLOT ; ; SWITCHES THAT APPLY BY DEFAULT ARE: /PR:50 /FO:0 /CO:1 /-DE /-GR /-DB ; ; INDIRECT FILE SPECIFICATIONS OF THE FORM "PRT @FILE" MAY ALSO BE USED, ; TO A MAXIMUM NEST LEVEL OF 3. ; ; LINKS TO SGAS: ; (4K) RO LIBRARY: SYSRES -- FOR FCS ROUTINES ; ; TASK ATTRIBUTES: /AB /CP /DS /-FP /FX /HD /MU /-PI /-PR /-TA /-TR ; ; LUN ASSIGNMENTS: ; TI:1 (COMMAND INPUT) ; SY:2 (PRINT FILE INPUT) ; ; TASKNAME: ...PRT ; PARTITION: GEN ; POOL LIMIT: 100 (IN CASE WE QUEUE MANY FILES) ; PRIORITY: 50 ; STACK: 256 ; UIC: [1,1] ; UNITS: 2 (PLUS "MO") ; ; MACRO CALLS: ; RSXMAC: .MCALL CALL .MCALL MOUT$S,EXIT$S .MCALL FSRSZ$,FDBDF$,FDOP$A,NMBLK$ .MCALL FINIT$,OFID$R .MCALL GCMLB$,CSI$,CSI$SW,CSI$ND,CSI$SV .MCALL GCML$,CSI$1,CSI$2,RCML$ ; ; DEFINITIONS: ; CMILUN = 1 ;COMMAND INPUT LUN PRTLUN = 2 ;PRINT FILE INPUT LUN NFILES = 40. ;MAXIMUM NO. OF FILE SPECIFICATIONS NEST = 3 ;MAXIMUM INDIRECT NEST LEVEL ; FSRSZ$ 1 ;RESERVE SPACE FOR ONE OPEN FILE ; ; READ-ONLY INSTRUCTION AREA: ; .PSECT PRTRO,RO ; PRTQUE::FINIT$ ;INITIALIZE FCS GCMDL: GCML$ #GCLBLK ;GET A COMMAND LINE BCC 1$ ;WORKED CMPB G.ERR(R0),#GE.EOF;ERROR, WAS IT EOF? BNE CMDERR ;NO, MORE SERIOUS EXIT$S ;YES, SO GO AWAY QUIETLY 1$: CLR PRIO ;DEFAULT PRIORITY = TASK'S PRIORITY CLR FORM ;DEFAULT FORM NO. = 0 CLR COPS ;DEFAULT COPIES = 1 MOV #1,HOLD ;DEFAULT = /-DE CLR GRPH ;DEFAULT = /-GR CLR DBLE ;DEFAULT = /-DB CLR PRTDEV ;DEFAULT DEVICE = LP CLR PRTUNI ;DEFAULT UNIT NO. = 0 CSI$1 #CSIBLK,GCLBLK+G.CMLD+2,GCLBLK+G.CMLD;DECODE COMMAND BCS CMDERR ;BAD COMMAND STRING CLR R4 ;INPUT FILE COUNTER MOV #PRTDSP,R5 ;ADDR. OF PRINT FILE DATASET POINTERS MOVB #CS.OUT,C.TYPR(R0);SET UP TO DECODE OUTPUT FILES BITB #CS.EQU,C.STAT(R0);WAS AN "=" IN COMMAND STRING? BEQ DECOD ;NO (NO OUTPUT DEVICE GIVEN) CSI$2 R0,,#SWTAB ;DECODE OUTPUT FILESPEC BCS CMDERR ;BAD SWITCH GIVEN TST C.DIRD(R0) ;WAS DIRECTORY SPECIFIED? BNE CMDERR ;YES, A MISTAKE TST C.FILD(R0) ;WAS FILENAME SPECIFIED? BNE CMDERR ;YES, THAT'S BAD TST C.DEVD(R0) ;WAS DEVICE SPECIFIED? BEQ 2$ ;NO MOV R0,-(SP) ;YES, SAVE CSI BLOCK ADDRESS MOV C.DEVD+2(R0),R0 ;GET ADDRESS OF DEVICE NAME MOVB (R0)+,PRTDEV ;SAVE NAME MOVB (R0)+,PRTDEV+1 ;(2 LETTERS) JSR PC,$COTB ;CONVERT UNIT NO. TO BINARY MOV (SP)+,R0 ;RESTORE CSI BLOCK ADDRESS MOV R1,PRTUNI ;SAVE UNIT NUMBER 2$: MOVB #CS.INP,C.TYPR(R0);SET UP TO DECODE INPUT FILES DECOD: CSI$2 R0,,#SWTAB ;DECODE A FILESPEC BCC SAVFIL ;WORKED CMDERR: MOUT$S #GCSTR,,,,#SY$STM;BAD SYNTAX, COMPLAIN RCML$ #GCLBLK ;GET NEXT COMMAND FROM KEYBOARD BR GCMDL ;TRY AGAIN SAVFIL: CMP R4,#NFILES ;EXCEED MAXIMUM NO. OF FILES? BGE 2$ ;YES, STOP NOW INC R4 ;NO, COUNT ANOTHER ONE MOV R0,R3 ;GET ADDRESS... ADD #C.DSDS,R3 ;...OF DATASET DESCRIPTOR MOV #6,R2 ;NO. OF WORDS IN DESCRIPTOR 1$: MOV (R3)+,(R5)+ ;COPY THEM ALL... SOB R2,1$ ;...TO SAVE AREA BITB #CS.MOR,C.STAT(R0);ANY MORE FILES? BNE DECOD ;YES, DO THEM TOO 2$: MOV #PRTFDB,R0 ;PRINT FILE FDB ADDRESS MOV R0,R1 ;NOW GET ADDRESS... ADD #F.FNB,R1 ;...OF THE FILENAME BLOCK MOV #PRTDSP,R2 ;DATASET POINTER ADDRESS (FOR FIRST FILE) MOV #PRTDFN,R3 ;DEFAULT FILENAME BLOCK ADDRESS GETFIL: CALL .PARSE ;PARSE THE FILE SPECIFICATION BCS 4$ ;PARSING ERROR 1$: CALL .FIND ;LOOK UP THE FILE IN THE UFD BCC 2$ ;FOUND THE FILE CMPB F.ERR(R0),#IE.NSF;NOT FOUND: WAS THERE NO SUCH FILE? BNE 4$ ;NO, MORE SERIOUS PROBLEMS MOUT$S #NFSTR,,,,#SY$STM;YES, INFORM PEOPLE IT DOESN'T EXIST BR 8$ 2$: OFID$R R0 ;OPEN FILE FOR READING BY FILE ID BCS 4$ ;OPEN FAILURE PRINT R0,,,PRTDEV,PRTUNI,PRIO,FORM,COPS,HOLD,GRPH,DBLE ;QUEUE FILE FOR PRINTING BCC 3$ ;NO PROBLEMS TST @#$DSW ;WAS THERE A DIRECTIVE ERROR? BEQ 4$ ;NO, MUST BE FCS-RELATED MOV @#$DSW,-(SP) ;YES, PUSH DSW (ERROR CODE) BR 5$ ;GO PRINT DIRECTIVE ERROR MESSAGE 3$: BIT #NB.SVR!NB.STP!NB.SNM,N.STAT(R1);ANY WILD CARDS? BEQ NEWFIL ;NO, GO TO NEXT FILESPEC CALL .FIND ;YES, LOOK UP NEXT FILE BCC 2$ ;FOUND ONE CMPB F.ERR(R0),#IE.NSF;NOT FOUND, IS THERE NO SUCH FILE? BEQ NEWFIL ;YES, SO TRY NEXT FILESPEC 4$: MOVB F.ERR(R0),R5 ;SIGN-EXTEND ERROR CODE TO 16 BITS MOV R5,-(SP) ;PUSH IT TSTB F.ERR+1(R0) ;IS IT DIRECTIVE OR I/O ERROR? BPL 6$ ;IT'S I/O 5$: MOV SP,R5 ;DIRECTIVE ERROR: R5 POINTS TO ERROR CODE MOUT$S #DISTR,R5,,,#SY$STM;PRINT MESSAGE BR 7$ 6$: MOV SP,R5 ;I/O ERROR; R5 POINTS TO ERROR CODE MOUT$S #IOSTR,R5,,,#SY$STM;PRINT MESSAGE 7$: TST (SP)+ ;CLEAN STACK 8$: MOV R1,R5 ;GET ADDRESS... ADD #N.FNAM,R5 ;...OF FILENAME INVOLVED MOUT$S #FLSTR,R5,,,#SY$STM;PRINT OUT NAME NEWFIL: ADD #12.,R2 ;GO TO NEXT FILE DATASET POINTER DEC R4 ;COUNT ANOTHER FILE DONE BLE 1$ ;FINISHED ALL JMP GETFIL ;MORE, GET NEXT FILE 1$: JMP GCMDL ;DONE ALL, GET ANOTHER COMMAND ; ; READ/WRITE DATA AREA: ; .PSECT PRTRW,D ; PRIO: .WORD 0 ;OUTPUT PRIORITY FORM: .WORD 0 ;FORM NUMBER COPS: .WORD 0 ;NO. OF COPIES HOLD: .WORD 0 ;PRESERVE FILE FLAG GRPH: .WORD 0 ;GRAPHIC DESPOOLING FLAG DBLE: .WORD 0 ;DOUBLE SIZE PLOT FLAG PRTDEV: .WORD 0 ;PRINTER DEVICE PRTUNI: .WORD 0 ;PRINTER UNIT NUMBER ; ; GET COMMAND LINE BLOCK: ; GCLBLK: GCMLB$ NEST,PRT,,CMILUN;NEST, PROMPT, LUN ; ; COMMAND STRING INTERPRETER BLOCK: ; CSI$ ;DEFINE OFFSETS CSIBLK: .BLKB C.SIZE ;CSI BLOCK ; ; PRINT FILE DATASET POINTER SAVE AREA ; PRTDSP: .BLKW 6*NFILES ;6 WORDS PER FILE, "NFILES" FILES ; ; PRINT FILE DESCRIPTOR BLOCK: ; PRTFDB: FDBDF$ FDOP$A PRTLUN ;LUN # ; ; READ-ONLY DATA AREA: ; .PSECT PRTRD,RO,D ; ; "MO" STRING DESCIPTORS: ; GCSTR: .WORD GCSTRL ;COMMAND LINE ERROR .WORD GCSTRA NFSTR: .WORD NFSTRL ;NO SUCH FILE EXISTS .WORD NFSTRA DISTR: .WORD DISTRL ;DIRECTIVE ERROR .WORD DISTRA IOSTR: .WORD IOSTRL ;I/O ERROR .WORD IOSTRA FLSTR: .WORD FLSTRL ;FILE NAME MESSAGE .WORD FLSTRA .MOLUN::.BLKW 1 ;"MO" LUN # ; ; CSI SWITCH TABLE: ; SWTAB: CSI$SW PR,1,,,,PRVAL ;/PR:# CSI$SW FO,1,,,,FOVAL ;/FO:# CSI$SW CO,1,,,,COVAL ;/CO:# CSI$SW DE,1,HOLD,CLEAR,NEG;/DE & /-DE CSI$SW GR,1,GRPH,,NEG ;/GR & /-GR CSI$SW DB,1,DBLE,,NEG ;/DB & /-DB CSI$ND ; ; SWITCH VALUE TABLES: ; PRVAL: CSI$SV DECIMAL,PRIO,2 ;2 BYTE PRIORITY CSI$ND ; FOVAL: CSI$SV DECIMAL,FORM,2 ;2 BYTE FORM NO. CSI$ND ; COVAL: CSI$SV DECIMAL,COPS,2 ;2 BYTE NO. OF COPIES CSI$ND ; ; PRINT FILE DEFAULT FILE NAME BLOCK: ; PRTDFN: NMBLK$ ,LST,,SY ;DEFAULT TYPE .LST, DEVICE SY: ; ; STRINGS: ; GCSTRA: .ASCII 'PRT -- INVALID COMMAND STRING' GCSTRL = .-GCSTRA ; NFSTRA: .ASCII 'PRT -- NO SUCH FILE(S)' NFSTRL = .-NFSTRA ; DISTRA: .ASCII 'PRT -- DIRECTIVE ERROR %D' DISTRL = .-DISTRA ; IOSTRA: .ASCII 'PRT -- I/O ERROR %D' IOSTRL = .-IOSTRA ; FLSTRA: .ASCII 'FILE NAME %X' FLSTRL = .-FLSTRA ; .END PRTQUE