.TITLE DIRSPL--SPOOLING ROUTINE FOR DIRECTORY TASK .IDENT /V1.0/ ; ;+ ;***** ; ; THIS MODULE SPAWNS TO EITHER THE QUEUE MANAGER, ; OR PIP TO PRINT ON LP0: THE DEFAULT DIRECTORY ; OUTPUT FILE "DIRECTORY.LST". THE SPAWN TO QMG INCLUDES THE DELETE ; ON SPOOLING SWITCH TO DELETE THIS FILE AFTER IT IS PRINTED. THE ; SPAWN TO PIP SIMPLY DIRECTS THE FILE TO LP0: THEN SPAWNS TO ; PIP A SECOND TIME TO DELETE THE FILE. ; A THIRD POSSIBILITY IS TO SUPPORT THE SERIAL PRINT DESPOOLER ; AND SPAWN TO PIP WITH THE "/SP" SWITCH. IN THIS CASE, IT IS ; NOT POSSIBLE (I THINK) TO DELETE THE FILE, AS CONTROL WILL REVERT ; BACK TO THE PARENT TASK PRIOR TO DESPOOLING. TO SUPPORT THE ; SERIAL DESPOOLER, SEE THE COMMENTS IN DIRROT AND CHANGE THAT ; SEGMENT BACK TO A CALL TO .PRINT (OLD SRD STYLE). NOTE ALSO ; THAT A CHANGE WILL HAVE TO BE MADE IN DIRBLD.ODL TO ACCOMODATE ; .PRINT. ; ; PAUL SORENSON ; DEPARTMENT OF PHYSIOLOGY ; MICHIGAN STATE UNIVERSITY ; ; LAST UPDATE 8/80--PRS ; UPDATE 11/80--PRS; CHANGE LISTING FILE FROM DEFAULT UIC TO PROTECTION ; UIC, ALTER SPAWN FILE SPEC. TO REFLECT THIS ; ;***** ;- ; ; LOCAL SYMBOL FOR DEBUGGING PURPOSES ; ;DEBUG=0 ; ; .MCALL SPWN$,DIR$,EXST$,STSE$S,GTSK$ .IF DF DEBUG .MCALL WTSE$S,EXST$S,QIO$S .ENDC ;DEBUG .PSECT $PDATA,RO,D,LCL,CON,REL $$$GLB=0 ;DEFINE $$$GLB SO SPWN$ WON'T GENERATE A DPB SPWN$ ;SPAWN HERE TO DEFINE LOCAL SYMBOLIC OFFSETS GTSK$ ;DEFINE TASK PARAMETER OFFSETS SPAWN1: .ASCIZ 'DIRECTORY.LST;0/DE' ;DELETE MOST RECENT VERSION .EVEN .PSECT $CODE1,RO,I,LCL,CON,REL .DRSPL:: MOV #PRMPT+2,R2 ;USE PRMPT TO STORE FILE SPEC MOV #"SY,(R2)+ ;SET UP DEFAULT DEVICE SPEC MOV #"0:,(R2)+ MOV PARBF$+G.TSDU,R3 ;FETCH PROTECTION UIC--NOT ;NECESSARILY THE DEFAULT UIC CLR R4 ;SET UP TO SUPPRESS LEADING 0'S AND ;INSERT "[,]" SEPARATORS CALL .PPASC ;CONVERT BINARY UIC TO ASCII DIRECTORY MOV #SPAWN1,R0 ;POINT TO DEFAULT FILE NAME 10$: MOVB (R0)+,(R2)+ ;COPY OVER FILENAME BNE 10$ ;TILL DONE SUB #PRMPT+3,R2 ;DETERMINE FILE SPEC LENGTH-DON'T ;INCLUDE THE TRAILING NULL MOV R2,PRMPT ;AND STORE IT MOV #LINBUF,R2 ;CREATE SPAWN COMMAND LINE IN LINBUF MOV R2,R3 ;COPY START ADDRESS IN R3 MOV #"PR,(R2)+ ;SET UP FOR SPAWN TO PRINT--SPAWN MOV #"I ,(R2)+ ;TO QMG (OR MAYBE CCL WILL HANDLE IT) MOV PRMPT,R1 ;FIND FILE SPEC LENGTH MOV #PRMPT+2,R0 ;AND START ADDRESS CALL DOIT ;TRY SPAWN BCC 100$ ;BR IF SUCCESSFUL MOV R3,R2 ;SET COMMAND START ADDRESS AGAIN MOV #"PI,(R2)+ ;CHANGE TO SPAWN PIP MOV #"P ,(R2)+ ;DIRECTING FILE TO LP: MOV #"LP,(R2)+ MOV #":=,(R2)+ MOV PRMPT,R1 ;FETCH FILE SPEC LENGTH MOV #PRMPT+2,R0 ;AND START ADDRESS SUB #3,R1 ;SUBTRACT 3 TO SKIP "/DE" CALL DOIT ;TRY SPAWN BCS 99$ ;BRANCH IF FAILED MOV R3,R2 ;SUCCESS, NOW DELETE FILE ADD #4,R2 ;SKIP OVER "PIP " MOV PRMPT,R1 ;FETCH FILE SPEC LENGTH MOV #PRMPT+2,R0 ;AND START ADDRESS CALL DOIT ;TRY SPAWN BCC 100$ ;BRANCH IF SUCCESSFUL DIAG NODELT ;SEND DIAGNOSTIC THAT DELETE ;MAY HAVE FAILED BR 100$ 99$: DIAG NOPRNT ;SEND DIAGNOSTIC THAT PROBABLY ;DIDN'T PRINT 100$: RETURN ;+ ;***** ; ; SUBROUTINE DOIT--TRANSFERS PART OF COMMAND POINTED TO BY R0 WITH ; LENGTH=R1 INTO COMMAND BUFFER WITH START ADDRESS IN R3 AND CURRENT ; POINTER LOCATION IN R2, TRIES TO SPAWN COMMAND TO MCR, CHECKS ; EXIT STATUS OF SPAWNED TASK RETURNING CARRY BIT CLEAR ON SUCCESS ; OR SET ON FAILURE ; ;***** ;- ; DOIT: 1$: MOVB (R0)+,(R2)+ ;COPY OVER REST OF COMMAND SOB R1,1$ ;TILL DONE SUB R3,R2 ;COMPUTE COMMAND LINE LENGTH .IF DF DEBUG MOV R3,R0 ;SET ADDRESS FOR DEBUG ROUTINE MOV R2,R1 ;AND LENGTH CALL DEBUG ;SHOW IT TO ME .ENDC ;DEBUG MOV R3,SPWNIT+S.PWCA ;SET COMMAND ADDRESS INTO SPAWN MOV R2,SPWNIT+S.PWCL ;SET COMMAND LENGTH INTO SPAWN CLC ;CLEAR CARRY BIT DIR$ #SPWNIT ;SPAWN COMMAND STSE$S #LSTEFN ;WAIT FOR TASK TO EXIT CMP IOSB$,#EX$SUC ;CHECK EXIT STATUS BEQ 10$ ;BRANCH IF SUCCESSFUL SEC ;ELSE SET CARRY BIT 10$: RETURN ;***** ; ; SUBROUTINE DEBUG-OUPUT LINE USING QIO READ AFTER PROMPT ; TO SHOW A LINE TO TERMINAL AND WAIT FOR CARRAIGE RETURN. ; WHEN CALLED RO=POINTER TO STUFF TO OUTPUT, R1=#CHARACTERS TO OUTPUT. ; USES HDBUF$FOR RESPONSE BUFFER. ; ;***** .IF DF DEBUG DEBUG: QIOW$S #IO.RPR,#TILUN,#TIEFN,,#IOSB$,,<#HDBUF$,#2.,,R0,R1,#044> ;OUTPUT IT AND WAIT FOR CONTINUE TSTB IOSB$ ;CHECK ERROR STATUS BGT 5$ ;NO ERROR, LEAVE MOV #EXIT,(SP) ;ALTER RETURN POINT ON ERROR TO EXIT 5$: RETURN EXIT: EXST$S EX$ERR .ENDC ;DEBUG .END