.NLIST BEX .TITLE VOL - MCR VOLUME DISPLAY TASK .IDENT /WBCCII/ .MCALL QIOW$,DIR$,RQST$,GMCR$,EXIT$S ; ; VOL IS AN MCR TASK WHICH DISPLAYS THE VOLUME CHARACTERISTICS OF ALL MOUNTABLE, ; FILES-11, DIRECTORY-STRUCTURED DEVICES IN THE PUD. IT DISPLAYS WHETHER THE ; DEVICE IS OFF-LINE, REDIRECTED, MOUNTED AS A FOREIGN VOLUME, OR MOUNTED AS A ; FILES-11 VOLUME. IF A FILES-11 VOLUME IS MOUNTED ON A DEVICE, VOL DISPLAYS ; THE VOLUME'S LABEL AND ITS NUMBER OF USERS. ; ; ASSEMBLY INSTRUCTIONS: ; MCR>MAC VOLUME,VOLUME=VOLUME ; ; TASK-BUILD INSTRUCTIONS: ; MCR>TKB ; TKB>[11,1]VOLUME/PR/MU/-CP/-FP/-TA,VOLUME=VOLUME ; TKB>SY:[1,1]EXEC.STB/SS ; TKB>/ ; ENTER OPTIONS: ; TKB>TASK=...VOL ! UIC=[1,1] ! PRI=221 ! PAR=GEN ! STACK=100 ; TKB>// ; ; INSTALLATION INSTRUCTIONS: ; MCR>INS [11,1]VOLUME ; ; VOL IS INVOKED AS FOLLOWS: ; MCR>VOL OR ; ; MACROS USED ; .MACRO PUSH,LIST .IRP .I., .IF IDN,<.I.>,<*> CLR -(SP) .IFF MOV .I.,-(SP) .ENDC .ENDR .ENDM .MACRO POP,LIST .IRP .I., .IF IDN,<.I.>,<*> TST (SP)+ .IFF MOV (SP)+,.I. .ENDC .ENDR .ENDM .PAGE ; ; EQUATES ; LUN = 5 ;DISPLAY LINE LUN FLAG = 10. ;DISPLAY LINE EVENT FLAG EOM = -1 ;END-OF-MESSAGE INDICATOR MAXLNG = 80. ;MAXIMUM MESSAGE LENGTH V.TRCT = 0 ;VCB EXTENSION USER NUMBER OFFSET V.LABL = 40 ;VCB EXTENSION VOLUME LABEL OFFSET V.LENG = 12. ;VOLUME LABEL LENGTH ; ; DIRECTIVES ; THEQIO: QIOW$ IO.WVB,LUN,FLAG,,IOSTAT,,<0,0,40> GETMCR: GMCR$ IOSTAT: .WORD 0,0 ;I/O STATUS BLOCK ; ; MESSAGES ; DV1MSG: .ASCII /DVN: / MOUMSG: .ASCII /XXXXXXXXXXXX/ BLANK: .ASCII / MOUNTED HAS / USER: .ASCII /DDDDD USER/ S: .ASCII /S/ REDMSG: .ASCII /REDIRECTED TO / .EVEN DV2MSG: .ASCII /DVN:/ DMOMSG: .ASCII /DISMOUNT PENDING/ FORMSG: .ASCII /MOUNTED AS FOREIGN/ DUFMSG: .ASCII /CONTROLLER OFF-LINE/ VOFMSG: .ASCII /VOLUME OFF-LINE/ DH1MSG: .ASCII /DEVICE HANDLER RESIDENT/ DH2MSG: .ASCII /DEVICE HANDLER NON-RESIDENT/ BADMSG: .ASCII /BAD VCB EXTENSION/ SEPMSG: .ASCII / - / .EVEN .PAGE ; ; INITIALIZATION ; VOLUME: DIR$ #GETMCR ;GET AN MCR COMMAND LINE SUB #MAXLNG,SP ;ALLOCATE SPACE FOR THE MESSAGE LINE MOV SP,THEQIO+Q.IOPL ;PUT ITS ADDRESS IN THE QIO PARAMETER LIST MOV .PUDBA,R4 ;SET THE START OF THE PUD TABLE ; ; CHECK FOR PUD REDIRECTION ; CHKRED: MOV R4,R5 ;SET THE CURRENT PUD ADDRESS 10$: CMP U.RP(R5),R5 ;IF THE PUD IS REDIRECTED TO ITSELF, BEQ CHKUC1 ;THAT'S THE END OF THE REDIRECTION MOV U.RP(R5),R5 ;OTHERWISE, SET THE REDIRECTED PUD BR 10$ ;ADDRESS AND CHECK IT FOR REDIRECTION ; ; CHECK CHARACTERISTICS WORD 1 ; CHKUC1: BIT #UC.DIR,U.C1(R5) ;CHECK IF THE DEVICE IS DIRECTORY-STRUCTURED BEQ 10$ BIT #UC.MNT,U.C1(R5) ;CHECK IF THE DEVICE IS MOUNTABLE BEQ 10$ BIT #UC.F11,U.C1(R5) ;CHECK IF THE DEVICE IS FILES-11 STRUCTURED BNE SETDV1 10$: JMP NXTPUD ;IF ANY CHECK FAILS => NEXT PUD ; ; SET THE DEVICE MESSAGE ; SETDV1: MOV U.DN(R4),DV1MSG ;SET THE DEVICE NAME MOVB U.UN(R4),DV1MSG+2 ;SET THE UNIT NUMBER BISB #'0,DV1MSG+2 ;MAKE IT AN ASCII CHARACTER PUSH #DV1MSG ;ADD THE DEVICE MESSAGE CMP R4,R5 ;CHECK FOR REDIRECTION BEQ CHKUFB ;IF FOUND, MOV U.DN(R5),DV2MSG ;SET THE REDIRECTED DEVICE NAME MOVB U.UN(R5),DV2MSG+2 ;SET THE REDIRECTED UNIT NUMBER BISB #'0,DV2MSG+2 ;MAKE IT AN ASCII CHARACTER PUSH #REDMSG ;BUILD THE REDIRECTED DEVICE MESSAGE BR MESAGE ; ; CHECK THE FLAGS BYTE ; CHKUFB: BITB #UF.OFL,U.FB(R4) ;CHECK IF THE CONTROLLER IS OFF-LINE BEQ CHKUCH MOV #DH1MSG,R1 ;IF IT IS, BITB #UF.RH,U.FB(R4) BNE 10$ ;CHECK IF THE DEVICE HANDLER IS RESIDENT MOV #DH2MSG,R1 10$: PUSH <#DUFMSG,#SEPMSG,R1> ;THEN BUILD THE OFF-LINE MESSAGE BR MESAGE .PAGE ; ; CHECK THE CHARACTERISTIC FLAGS BYTE ; CHKUCH: BITB #CH.OFF,U.CH(R4) ;CHECK IF THE VOLUME IS OFF-LINE BEQ 10$ PUSH #VOFMSG ;IF SO => BUILD THE VOLUME OFF-LINE MESSAGE BR MESAGE 10$: BITB #CH.FOR,U.CH(R4) ;CHECK IF THE VOLUME IS MOUNTED AS FOREIGN BEQ CHKVCB PUSH #FORMSG ;IF SO => BUILD THE VOLUME MOUNTED AS BR CHKUNL ;FOREIGN MESSAGE ; ; EXTRACT THE MOUNT INFORMATION FROM THE VCB EXTENSION AREA ; CHKVCB: MOV U.VA(R4),R5 ;SET THE VCB EXTENSION ADDRESS BNE 10$ PUSH #BADMSG ;IF IT'S ZERO => BUILD THE BAD VCB MESSAGE BR CHKUNL 10$: MOV #USER,R0 ;OTHERWISE, MOV V.TRCT(R5),R1 MOVB #'S,S ;PUT THE NUMBER OF USERS OF THE VOLUME CMP #1,R1 ;INTO THE VOLUME MOUNTED MESSAGE BNE 20$ CLRB S 20$: MOV #5,R2 MOV R0,R3 30$: CLRB (R3)+ SOB R2,30$ CALL $CBDMG MOV #MOUMSG,R0 ;NEXT, ADD #V.LABL,R5 ;PUT THE VOLUME LABEL INTO MOV #V.LENG/2,R1 ;THE VOLUME MOUNTED MESSAGE CLR R2 40$: BIS (R5),R2 MOV (R5)+,(R0)+ SOB R1,40$ MOVB #40,BLANK TST R2 BNE 50$ CLRB BLANK 50$: PUSH #MOUMSG ; ; CHECK IF A DISMOUNT IS PENDING ; CHKUNL: BITB #CH.UNL,U.CH(R4) ;CHECK IF A DISMOUNT IS PENDING BEQ MESAGE ;ON THE VOLUME PUSH <#SEPMSG,#DMOMSG> .PAGE ; ; BUILD AND DISPLAY THE DEVICE MESSAGE ; MESAGE: MOV THEQIO+Q.IOPL,R0 ;SET THE STARTING ADDRESS OF MOV R0,R1 ;THE MESSAGE LINE AREA MOV R1,R2 SUB SP,R0 ;CALCULATE THE NUMBER OF MESSAGE BLOCKS ASR R0 ;TO BE COMBINED INTO THE DISPLAY LINE BEQ NXTPUD 10$: MOV -(R1),R3 20$: MOVB (R3)+,(R2)+ ;BUILD THE DISPLAY LINE, SKIPPING NULLS AND BGT 20$ ;STOPPING AT THE END-OF-MESSAGE INDICATOR TSTB -(R2) BEQ 20$ SOB R0,10$ ;AFTER THE DISPLAY LINE IS ASSEMBLED, SUB THEQIO+Q.IOPL,R2 ;CALCULATE ITS LENGTH BEQ NXTPUD MOV R2,THEQIO+Q.IOPL+2 ;DISPLAY THE MESSAGE DIR$ #THEQIO CMPB #IS.SUC,IOSTAT ;CHECK FOR AN ERROR BNE EXIT ; ; ADVANCE TO THE NEXT PUD ; NXTPUD: MOV THEQIO+Q.IOPL,SP ;RESET THE STACK POINTER ADD #U.SZ,R4 ;POINT AT THE NEXT PUD ENTRY CMP .PUDEA,R4 ;CHECK FOR THR END OF THE PUD TABLE BLOS EXIT JMP CHKRED ; ; AT THE END OF THE PUD TABLE => EXIT ; EXIT: EXIT$S .END VOLUME