.TITLE PDQ - PROGRAM DEVELOPMENT QURUE .IDENT /01.2/ ;+ ; WRITTEN BY: ; JAMES G. DOWNWARD ; KMS FUSION, INC. ; 3941 RESEARCH PARK DR ; ANN ARBOR, MICH. 48104 ; (313)-769-8500 ; 22-AUG-80 ; ; PDQ is an MCR Program Development Despooler. Using the rsx11m v3.2 ; queue manager, command files may be queued up for execution at logged ; on terminals. For instance two program development queues may be ; running. This will limit the system to only ever trying to do 2 TKB'S ; at one time. The EXEC command (a CCL goodie) synthesizes the command ; ; PRINT MCRQUE:=FILENAME.PRC ; ; FILENAME.PRC will be sent to the first free despooler. Now the issuing ; terminal must still be logged on(or else!!). When MCx starts up at ; the issuing TI:, it will pack an MCR command with the name of the file ; and spawn a command of the form ; ; PIN FILENAME or @FILENAME. ; ; which command is issued depends on the extension of the filename. If it ; is '.PRC' then PIN gets the command. If it is '.CMD', then the command is ; sent to ...AT. ; ; For V4.0 this task must be both slave and privileged. Being privileged ; is required so that it may correctly switch to the TI: of the issuing ; terminal. ; ; MODIFIED: ; 16-JAN-81 J. DOWNWARD ; JGD1 UPDATE FOR V4.0 OF RSX11M. ; THE QMG START OF JOB PACKET ; CHANGED. UCB ADDRESS IS NOW IN ; SON OF START OF JOB. ; ; 16-FEB-81 J. DOWNWARD ; JGD2 ALLOW 13 CHARACTER FILENAMES ;- .MCALL QIOW$,EXIT$S,DIR$,EXST$S,STSE$,SPWN$,GLUN$ .MCALL RCST$,GTSK$,USTP$,GTSK$,SDAT$ .MACRO PRINT STRING MOV #STRING,R0 CALL PNTLIN .ENDM PRINT ; DPB'S QIODPB: QIOW$ IO.WVB,2,2,,,,<0,0,40> ; WRITE TO TERMINAL GETLUN: GLUN$ 2,GLNBUF ; GET TERMINAL INFORMATION SPAWN: SPWN$ MCR...,,,,,1,,IEXBLK ; SPAWN TO TI: VIA MCR... RCVDAT: RCST$ QMG...,BUF ; RECIEVE DATA OR STOP SNDDAT: SDAT$ QMG...,SNDBUF ; SEND DATA TO QMG... GETTSK: GTSK$ TSKBUF ; GET OUR TASK PARAMETERS STOP: STSE$ 1 ; STOP FOR EVENT FLAG UNSTOP: USTP$ QMG... ; UNSTOP QMG ; DATA ;-----DON'T SEPERATE THE NEXT TWO VARIABLES--------------------- BUF: .BLKW 2 RCVBUF: .BLKW 13. ; FOR RECIEVE DATA ;---------------------------------------------------------------- SNDBUF: .BLKW 15. ; FOR SENDING DATA TO QMG... TSKBUF: .BLKW 16. ; FOR GETTSK UCBADR: .WORD 0 ; STORE UCB ADDRESS OF TI: TO BE USED IEXBLK: .BLKW 8. ; EXIT STATUS BLOCK GLNBUF: .BLKW 6 ; BUFFER FOR GETLUN DIRECTIVE ; ERROR MESSAGES ; MSG01: .ASCIZ /-- GOT AN EXIT PACKET, EXITING/<15><12> MSG02: .ASCIZ /-- GOT A START PACKET/<15><12> MSG03: .ASCIZ /-- UNKNOWN PACKET TYPE/<15><12> MSG04: .ASCIZ /-- WE MISSED SOJ /<15><12> MSG05: .ASCIZ /-- .PRC OR .CMD TYPE FILES ONLY/<15><12> PINMSG: .ASCIZ /PIN / TSKNAM: .ASCII / / .BLKW 80. ; BUFFER FOR REST OF MESSAGE .EVEN ; ; READ AND DECODE THE COMMAND LINE ; PDQ:: DIR$ #RCVDAT ; RECIEVE DATA OR STOP CMP #IS.SUC,$DSW ; IS ALL OK: BNE PDQ ; NO, WE MUST KEEP TRYING DIR$ #GETTSK ; GET OUR TASK PARAMETERS MOV #TSKNAM,R0 ; WHERE TO PUT OUR NAME MOV TSKBUF,R1 ; FIRST PART OF TASKNAME CALL $C5TA ; CONVERT FIRST THREE BYTES MOV TSKBUF+2,R1 ; SECOND PART OF TASKNAME CALL $C5TA ; CONVERT SECOND THREE BYTES MOVB RCVBUF,R0 ; GET DATA PACKET TYPE CMP R0,#0 ; IS IT START OF JOB BEQ 100$ ; IF EQ, YES CMP R0,#1 ; IS IT 'PROCESS FILE' BEQ 200$ ; CMP R0,#2 ; IS IS 'STOP PACKET' BEQ 300$ ; CMP R0,#3 ; IS IT 'CONTINUE' PACKET BEQ 400$ ; CMP R0,#4 ; IS IT 'EOJ' PACKET BEQ 500$ ; CMP R0,#5 ; IS IT START PACKET BEQ 600$ ; CMP R0,#6 ; IS IT EXIT PACKET BEQ 700$ ; JMP 1000$ ; UNKNOWN PACKET TYPE 100$: ; GOT START OF JOB ; **********NOT VALID AS OF BL29************************************** ; MOV RCVBUF+30,UCBADR ; GET SUBMITTING TERMINAL UCB ADDRESS ; ******************************************************************** DIR$ #RCVDAT ; GET SON OF START OF JOB CMP $DSW,#IS.SUC ; DID WE GET IT BEQ 110$ ; GOT IT OK PRINT MSG04 ; SAYING PACKET GOT MISSED BR PDQ ; 110$: ; GOT SON OF START OF JOB MOV RCVBUF+24,UCBADR; GET SUBMITTING TERMINAL UCB ADDRESS ; JGD1 MOV $TKTCB,R0 ; GET OUR TASK TCB MOV UCBADR,T.UCB(R0); PLACE UCB ADDR TO SET TI: CMP RCVBUF+16,#^RCMD; IS EXTENSION '.CMD' BNE 120$ ; NO, ASSUME IT'S .PRC MOV #"@ ,PINMSG ; MOVE IN '@" MOV #" ,PINMSG+2 ; CLEAR OUT OLD STUFF MOV #PINMSG+1,R0 ; POINT TO WHERE TO INSERT FILENAME BR 130$ ; SKIP TO COMMON CODE 120$: CMP RCVBUF+16,#^RPRC; IS IT A '.PRC' FILE FOR PIN BEQ 125$ ; IF EQ, YES PRINT MSG05 ; WARN USERS OF BAD FILE TYPE JMP PDQ ; BACK FOR MORE 125$: MOV #PINMSG+4,R0 ; 130$: MOV RCVBUF+10,R1 ; CALL $C5TA ; MOV RCVBUF+12,R1 ; CALL $C5TA ; CONVERT MOV RCVBUF+14,R1 ; CALL $C5TA ; CONVERT CLRB (R0) ; TERMINATE STRING ; PRINT PINMSG ; ** FOR DEBUGGING ** MOV #PINMSG,SPAWN+S.PWCA ; SET ADDRESS OF COMMAND TO SPAWN MOV #13.,SPAWN+S.PWCL; SET MAXIMUM POSSIBLE LENGTH DIR$ #SPAWN ; SPAWN COMMAND TO MCR DIR$ #STOP ; STOP UNTIL MCR IS DONE JMP PDQ ; TRY FOR PROCESS FILE PACKET 200$: ; PROCESS FILE PACKET MOV #100,SNDBUF ; SET END OF FILE CODE DIR$ #SNDDAT ; SEND OF DATA TO QMG... DIR$ #UNSTOP ; UNSTOP QMG... JMP PDQ ; 300$: MOV #101,SNDBUF ; TELL QMG WE ARE STOPPING DIR$ #SNDDAT ; SEND OFF DATA DIR$ #UNSTOP ; UNSTOP QMG... DIR$ #STOP ; STOP OURSELVES JMP PDQ ; AND LOOP BACK 400$: JMP PDQ ; 'CONTINUE' IS A NO-OP 500$: MOV #1100,SNDBUF ; SET 'DONE' CODE IN SEND BUFFER DIR$ #SNDDAT ; SEND DATA DIR$ #UNSTOP ; UNSTOP QMG... JMP PDQ ; AND TRY FOR ANOTHER PACKET 600$: ; ; PRINT MSG02 ; SAY ITS START PACKET **DEBUG JMP PDQ ; AND BACK FOR MORE 700$: ; ; PRINT MSG01 ; SAY ITS EXIT PACKET **DEBUG EXIT$S ; AND EXIT 1000$: ; PRINT MSG03 ; SAY WE HAVE UNKNOWN PACKET TYPE JMP PDQ ; AND TRY AGAIN ;+ ; PNTLIN ; ; THIS ROUTINE WILL PRINT AN ASCIZ LINE WITH THE TASKNAME AS THE ; FIRST SIX CHARACTERS. ; R0,R1, R2 ARE LOST ;- PNTLIN: MOV #TSKNAM,R2 ; ADDRESS OF TASKNAME MOV #-1,R1 ; GET COUNT INITIALIZED MOV R2,QIODPB+Q.IOPL ; STORE BUFFER ADDRESS ADD #6,R2 ; POINT AFTER TASK NAME 170$: INC R1 ; INCREMENT COUNTER MOVB (R0)+,(R2)+ ; IS THIS THE LAST BYTE? BNE 170$ ; NO. KEEP GOING ADD #6,R1 ; ADD IN TASKNAME MOV R1,QIODPB+Q.IOPL+2 ; STORE BYTE COUNT DIR$ #QIODPB RETURN .END PDQ