.TITLE ONVOL .IDENT /01/ .NLIST BEX,TOC .PSECT ; ; VERSION 01 ; ; DAVE BIRCHBAUER 15-SEP-81 ; ; MODIFIED BY: ; ; UTILITY TO DISPLAY TERMINALS MOUNTED TO SPECIFIED VOLUMES ; ; MACRO CALLS ; .MCALL GCML$,CSI$,CSI$1,GCMLB$,QIO$S,EXIT$S,FSRSZ$,GMCR$ .MCALL CSI$2,CSI$SW,CSI$ND .MCALL EXIT$S,UCBDF$,DCBDF$ FSRSZ$ 1 CSI$ DCBDF$ UCBDF$ ; ; EQUATED SYMBOLS ; AMSK=100000 ; OFFSETS TO DEVICE LIST RECORD DL.TYPE=0 ;DEVICE TYPE DL.UNIT=2 ;UNIT NUMBER DL.CHR=3 ;CHARACTERISTIC BYTE DL.TT=4 ;TT LIST ; OFFSETS TO CHARACTERISTIC BYTE OF DEVICE LIST RECORD CH.NMT=1 ;DEVICE NOT MOUNTED CH.VPM=2 ;DEVICE PUBLIC MOUNTED CH.MDM=4 ;DEVICE MARKED FOR DISMOUNT CH.F11=10 ;NOT FILES - 11 DEVICE ; OFFSETS TO MOUNTLIST NODE M.NEXT=0 ;POINTER TO NEXT NODE OF MOUNT LIST M.VUCB=4 ;VOLUMES UCB ADDRESS M.TUCB=6 ;TI'S UCB ADDRESS ; ; LOCAL MACROS ; ; ; LOCAL DATA ; DVLST: .BLKW 200. FLAG: .WORD 0 GETCL: GCMLB$ ,ONV,,5 CSIBLK: .BLKB C.SIZE MASK: .WORD 0 SWTBL: CSI$SW ALL,AMSK,MASK,SET CSI$ND .EVEN BITTBL: .WORD 1 ;WILL HANDLE 16 TI'S .WORD 2 .WORD 4 .WORD 10 .WORD 20 .WORD 40 .WORD 100 .WORD 200 .WORD 400 .WORD 1000 .WORD 2000 .WORD 4000 .WORD 10000 .WORD 20000 .WORD 40000 .WORD 100000 .EVEN ;+ ; ONVOL - INPUTS A COMMAND LINE, THEN DISPLAYS MOUNT INFORMATION CORRESPONDING ; TO SPECIFIED VOLUMES ; ; INPUTS: ; COMMAND LINE ONV /ALL, OR ONV DD:, OR ONV DDn ; OUTPUTS: ; MOUNT INFORMATION TO INPUT TI: ; EFFECTS: ; ;- ONVOL: GCML$ #GETCL ;GET COMMAND LINE CSI$1 #CSIBLK,GETCL+G.CMLD+2,GETCL+G.CMLD ;PARSE FOR SYNTAX ERROR BCS 40$ ;BRANCH ON ERROR CSI$2 #CSIBLK,OUTPUT,#SWTBL ;TEST FOR DEVICE OR SWITCH BCS 40$ ;BRANCH ON SYNTAX ERROR MOV $DEVHD,R0 ;R0 - DCB ADDRESS MOV #DVLST,R2 ;OUTPUT DEVICE LIST TST MASK ;TEST FOR /ALL SWITCH BGE 10$ ;GE - NO SWITCH CALL GETALL ;GET MOUNT INFO FOR ALL MOUNTABLE DEVICES BR 30$ ;EXIT 10$: BITB #CS.DVF,CSIBLK+C.STAT ;TEST FOR DEVICE INPUT BEQ 40$ ;IF NO DEVICE SPECIFIED THEN SYNTAX ERROR MOV CSIBLK+C.DEVD+2,R3 ;R3 - ADDRESS OF INPUT DEVICE NAME CMP CSIBLK+C.DEVD,#2 ;UNIT SPECIFIED? BNE 20$ ;YES - BRANCH CALL GETTYP ;NO - GET MOUNT INFO FOR ALL GIVEN VOLUMES BR 30$ ;EXIT 20$: CALL GETUNT ;GET MOUNT INFO FOR GIVEN DEVICE 30$: CLR (R2) ;END OF DEVICE LIST CALL DSPDEV ;DISPLAY DEVICE INFORMATION BR 50$ 40$: CALL ERRMSG ;SYNTAX ERROR 50$: EXIT$S ; ; GETALL - GET MOUNT MOUNT INFORMATION FOR ALL MOUNTABLE VOLUMES ; ; INPUTS ; R0 - DCB ADDRESS ; R2 - DEVICE LIST ADDRESS ; R3 - ADDRESS OF INPUT DEVICE NAME ; OUTPUTS ; NONE ; EFFECTS ; MOUNT INFORMATION IN DEVICE LIST ; GETALL: CALL DCBDEV ;GET MOUNT INFO FOR CURRENT DCB MOV D.LNK(R0),R0 ;GET NEXT DCB IN DCB LIST BNE GETALL ;IF <> 0 THEN MORE DCB'S TO TEST RETURN ; ; GETTYP - GET MOUNT INFORMATION FOR A GIVEN DEVICE TYPE ; ; INPUTS ; R0 - DCB ADDRESS ; R2 - DEVICE LIST ADDRESS ; R3 - ADDRESS OF INPUT DEVICE NAME ; OUTPUTS ; NONE ; EFFECTS ; MOUNT INFORMATION IN DEVICE LIST ; GETTYP: CLR FLAG ;CLEAR FOUND FLAG 10$: CMP (R3),D.NAM(R0) ;COMPARE INPUT DEVICE NAME WITH DCB TYPE BNE 20$ ;IF NOT EQUAL THEN TEST NEXT DCB CALL DCBDEV ;IF EQUAL THEN TEST UCB'S INC FLAG ;INDICATE FOUND 20$: MOV D.LNK(R0),R0 ;GET NEXT DCB ADDRESS BNE 10$ ;UNTIL ALL DCB'S CHECKED TST FLAG ;HAS THE VOLUME BEEN FOUND? BNE 30$ ;YES - RETURN BISB #CH.F11,DL.CHR(R2) ;NO - SET ERROR BIT MOV (R3),DL.TYPE(R2) ;INSERT DEVICE TYPE NAME INTO DEVICE LIST CLRB DL.UNIT(R2) ADD #6,R2 ;POINT TO NEXT RECORD OF DEVICE LIST 30$: RETURN ; ; GETUNT - GET MOUNT INFORMATION FOR SPECIFIED UNIT ; ; INPUTS ; R0 - DCB ADDRESS ; R2 - DEVICE LIST ADDRESS ; R3 - ADDRESS OF INPUT DEVICE NAME ; OUTPUTS ; NONE ; EFFECTS ; MOUNT INFORMATION IN DEVICE LIST ; GETUNT: CLR FLAG MOV (R3),DL.TYPE(R2) ;INSERT DEVICE NAME INTO DEVICE LIST MOVB 2(R3),R4 ;GET UNIT NUMBER SUB #60,R4 ;CONVERT TO BINARY MOVB 2(R3),DL.UNIT(R2) ;INSERT UNIT NUMBER INTO DEVICE LIST 10$: CMP (R3),D.NAM(R0) ;CORRECT DCB? BNE 25$ ;NO - TRY NEXT DCB MOV D.UCB(R0),R1 ;GET FIRST UCB ADDRESS 20$: CMPB U.UNIT(R1),R4 ;SAME UNIT NUMBER? BEQ 30$ ;YES - GET MOUNT INFORMATION ADD D.UCBL(R0),R1 ;GET NEXT UCB CMP U.DCB(R1),R0 ;CORRECT UCB? BEQ 20$ ;YES - TEST NEW UCB 25$: MOV D.LNK(R0),R0 ;GET NEXT DCB ADDRESS BNE 10$ ;REPEAT WITH NEW DCB BISB #CH.F11,DL.CHR(R2) ;END OF DCB'S - SET ERROR BIT BR 40$ ;RETURN ; CORRECT DEVICE FOUND 30$: INC FLAG ;INDICATE FOUND BITB #DV.F11,U.CW1(R1) ;IS IT FILES - 11 BNE 35$ ;NO - SET ERROR BIT CALL GETMOU ;YES - GET MOUNT INFORMATION BR 40$ ;RETURN 35$: BISB #CH.F11,DL.CHR(R2) ;SET ERROR BIT 40$: ADD #6,R2 ;POINT TO NEXT RECORD OF DEVICE LIST RETURN ; ; DCBDEV - GETS MOUNT INFORMATION FOR ALL UNITS OF A GIVEN DCB ; ; INPUTS ; R0 - DCB ADDRESS ; R2 - DEVICE LIST ADDRESS ; R3 - ADDRESS OF INPUT DEVICE NAME ; OUTPUTS ; NONE ; EFFECTS ; MOUNT INFORMATION IN DEVICE LIST ; DCBDEV: MOV D.UCB(R0),R1 ;R1 - UCB ADDRESS 10$: BIT #DV.MNT,U.CW1(R1) ;MOUNTABLE DEVICE? BEQ 20$ ;NO - GET NEXT UCB MOV D.NAM(R0),DL.TYPE(R2) ;INSERT DEVICE NAME INTO DEVICE LIST MOVB U.UNIT(R1),R4 ;GET UNIT NUMBER ADD #60,R4 ;CONVERT TO ASCII MOVB R4,DL.UNIT(R2) ;INSERT DEVICE NUMBER INTO DEVICE LIST CALL GETMOU ;GET MOUNT INFORMATION FOR DEVICE ADD #6,R2 ;POINT TO NEXT RECORD OF DEVICE LIST 20$: ADD D.UCBL(R0),R1 ;GET NEXT UCB CMP R0,U.DCB(R1) ;CORRECT DCB? BEQ 10$ ;YES - TEST NEXT DEVICE RETURN ; ; GETMOU - GETS MOUNT INFORMATION FOR SPECIFIED DEVICE ; ; INPUTS ; R0 - DCB ADDRESS ; R1 - UCB ADDRESS ; R2 - DEVICE LIST ADDRESS ; OUTPUTS ; NONE ; EFFECTS ; MOUNT INFORMATION IN MOUNT LIST ; GETMOU: BITB #US.MNT,U.STS(R1) ;IS DEVICE MOUNTED BEQ 10$ ;YES - TEST FOR PUBLIC MOUNTED BISB #CH.NMT,DL.CHR(R2) ;NO - SET ERROR BIT BR 100$ ;RETURN 10$: BITB #US.PUB,U.ST2(R1) ;IS DEVICE PUBLIC MOUNTED? BEQ 20$ ;NO - TEST FOR DISMOUNT BISB #CH.VPM,DL.CHR(R2) ;YES - SET ERROR BIT BR 100$ ;RETURN 20$: BITB #US.MDM,U.STS(R1) ;MARKED FOR DISMOUNT? BEQ 30$ ;NO - SEARCH BISB #CH.MDM,DL.CHR(R2) ;YES - SET ERROR BIT BR 100$ ;RETURN 30$: CALL SEARCH ;SEARCH MOUNT LIST 100$: RETURN ; ; SEARCH - SEARCHES THE MOUNT LIST FOR MOUNT INFORMATION ; ; INPUTS ; R0 - DCB ADDRESS ; R1 - UCB ADDRESS ; R2 - DEVICE LIST ADDRESS ; OUTPUTS ; NONE ; EFFECTS ; MOUNT INFORMATION IN DEVICE LIST ; SEARCH: CALL $SWSTK,100$ ;;SWITCH TO SYSTEM STATE MOV $MOULS,R5 ;;GET ADDRESS OF FIRST NODE OF MOUNT LIST 10$: CMP R1,M.VUCB(R5) ;;SAME UCB? BNE 30$ ;;NO - GET NEXT NODE MOV M.TUCB(R5),R4 ;;R4 - TI'S UCB MOV U.SCB(R4),R4 ;;R4 - TI'S STATUS CONTROL BLOCK MOV S.CON(R4),R4 ;;R4 - CONTROLLER INDEX = CONTROLLER NUMBER*2 BIS BITTBL(R4),DL.TT(R2) ;;SET BIT CORRISPONDING TO TI NUMBER 30$: MOV M.NEXT(R5),R5 ;;GET NEXT NODE BNE 10$ ;IF POINTER = 0 THEN END OF LIST 100$: RETURN ;RETURN FROM SUBROUTINE ; ; DSPDEV - DISPLAY MOUNT INFORMATION ON TI: ; ; INPUTS ; DEVICE LIST ; OUTPUTS ; MESSAGE TO INPUT TI: ; EFFECTS ; NONE ; OUTBLK: .BLKW 80. ARGBLK: .BLKW 50. MSG: .ASCIZ '%N%I' ;MESSAGE STRING DEVMSG: .ASCIZ '%VA: %I' NMTMSG: .ASCIZ 'VOLUME NOT MOUNTED %I' VPMMSG: .ASCIZ 'VOLUME PUBLIC MOUNTED %I' MDMMSG: .ASCIZ 'VOLUME MARKED FOR DISMOUNT %I' F11MSG: .ASCIZ 'VOLUME NOT FILES - 11 %I' TTMSG: .ASCIZ 'TT%O: %I' ENDLN: .ASCIZ '%N' SPACE: .ASCIZ '%S' ;TERMINATE PRIOR ASCIZ STRINGS .EVEN DSPDEV: MOV #DVLST,R1 ;STARTING ADDRESS OF DEVICE LIST 10$: MOV #ARGBLK,R0 ;ADDRESS OF EDMSG ARGUMENT BLOCK MOV #DEVMSG,(R0)+ ;ADDRESS OF DEVICE MESSAGE MOV #2,(R0) ;NUMBER OF CHARCTERS IN DEVICE NAME CMPB #' ,DL.UNIT(R1) ;TEST FOR NO UNIT NUMBER BEQ 15$ ;ON SWITCH THEIR WILL BE A 3 CHARACTER NAME INC (R0) ;3 CHARACTER NAME 15$: TST (R0)+ ;NEXT WORD OF ARG BLOCK MOV R1,(R0)+ ;ADDRESS OF DEVICE TYPE NAME AND UNIT TSTB DL.CHR(R1) ;TEST FOR ERROR MESSAGES BEQ 50$ ;BRANCH ON NO ERROR MESSAGES BITB #CH.NMT,DL.CHR(R1) ;TEST FOR NOT MOUNTED BEQ 20$ ;BRANCH ON NO ERROR MOV #NMTMSG,(R0)+ ;ADDRESS OF ERROR MESSAGE BR 100$ ;OUTPUT MESSAGE 20$: BITB #CH.VPM,DL.CHR(R1) ;TEST FOR PUBLIC MOUNTED BEQ 30$ ;TEST NEXT BIT MOV #VPMMSG,(R0)+ ;ADDRESS OF ERROR MESSAGE BR 100$ ;OUTPUT MESSAGE 30$: BITB #CH.MDM,DL.CHR(R1) ;MARKED FOR DISMOUNT BEQ 40$ ;BIT NOT SET MOV #MDMMSG,(R0)+ ;ADDRESS OF ERROR MESSAGE BR 100$ ;OUTPUT MESSAGE 40$: MOV #F11MSG,(R0)+ ;ADDRESS OF LAST MESSAGE BR 100$ ;OUTPUT MESSAGE 50$: MOV #BITTBL,R2 ;BIT TABLE ADDRESS MOV #16.,R3 ;NUMBER OF TI'S ON SYSTEM CLR R4 ;START WITH TT0 60$: BIT (R2)+,DL.TT(R1) ;IF BIT IS SET THEN TI IS MOUNTED BEQ 70$ ;NOT SET, TRY NEXT BIT MOV #TTMSG,(R0)+ ;INSERT 'TT' INTO OUTPUT BUFFER MOV R4,(R0)+ ;GET TT NUMBER 70$: INC R4 ;NEXT TI SOB R3,60$ ;UNTIL ALL TI'S ARE CHECKED 100$: MOV #SPACE,(R0)+ ;FINISH WITH A SPACE CALL PRIOUT ;PRINT OUT TO TI: ADD #6,R1 ;NEXT RECORD OF DEVICE LIST TST (R1) ;TEST FOR END OF LIST BNE 10$ RETURN ; ; ERRMSG - PROCEDURE TO DISPLAY ERROR MESSAGE ; ; INPUT ; NONE ; OUTPUT ; NONE ; EFFECTS ; ERROR: .ASCIZ 'ONV -- SYNTAX ERROR' .EVEN ERRMSG: MOV #ERROR,ARGBLK CALL PRIOUT RETURN ; ; PRIOUT - PROCEDURE TO CALL EDMSG AND DISPLAY LINE TO TI ; ; INPUT ; ARGBLK ; OUTPUT ; MESSAGE TO TI ; EFFECTS ; PRIOUT: MOV R1,-(SP) ;SAVE R1 MOV #OUTBLK,R0 ;EDMSG PARAMETERS MOV #MSG,R1 MOV #ARGBLK,R2 CALL $EDMSG ;PROCESS OUTPUT LINE QIO$S #IO.WAL,#5,#5,,,,<#OUTBLK,R1> ;OUTPUT TO TI MOV (SP)+,R1 RETURN .END ONVOL