.TITLE VDA Virtual Disk Assignments .ENABL LC ; ; ;****************************************************************************** ; ; This software is provided on an "as is" basis only. Caterpillar Tractor Co., ; disclaims all warranties on the program, including without limitation, all ; implied warranties of merchantablity and fitness. ; ; Full permission and consent is hereby given to DECUS and to the DECUS ; special interest groups to reproduce, distribute, and publish and permit ; others to reproduce in whole or in part, in any form and without restriction ; this program and any information relating thereto ; ;****************************************************************************** ; ; This program is used to display the current virtual disk ; assignments on a system. It is invoked as follows: ; ; VDA [/sw] ; or ; VDA VDn ; ; where /sw can be one of the following: ; ; /OFL - Display only VD's that are offline (IE.not assigned) ; /ALL - Display all VD's whether offline or online ; /ONL - Display only online VD's (default if no switch specified) ; /HE - Displays this text ; /dev - Displays VD's on device 'dev' only, where 'dev' is the device ; mnemonic and unit (if no unit then unit 0 is displayed) ; (example: /DK /DK0 /DK1) ; VDA VDn - Displays status of VD unit 'n' only ; ; The display will contain the VD unit, associated file name, ; disk size and the label of the disk if mounted (*none* if disk ; has no label and *dismounted* if disk is not mounted). If the ; disk is mounted, it will also display the number of free blocks ; on the disk, the maximum number of files allowed on the disk ; and the current transaction count for the disk. ; ; ; Rick Webster ; Caterpillar Tractor Co., MSDGO ; 12/10/80 ; .MACRO TPARS OPT,KEYPT,LTH,ADDR,STLABL ; *** TPARS MACRO TO INVOKE THE TABLE DRIVEN PARSER MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV OPT,R1 ;BLANK AND TAB SUPPRESS OPTION MOV KEYPT,R2 ;ADDRESS OF KEY TABLE MOV LTH,R3 ;LENGTH OF STRING TO BE PARSED MOV ADDR,R4 ;ADDRESS OF STRING TO BE PARSED MOV STLABL,R5 ;LABEL OF FIRST STATE CALL .TPARS ;PARSE STRING MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 .ENDM .MCALL EXIT$S,EDMWRT,TTATCH,GMCR$,DIR$,ISTAT$,STATE$,TRAN$ .MCALL UCBDF$,DCBDF$,FHDOF$,FSRSZ$,F11DF$ F11DF$ UCBDF$ DCBDF$ FHDOF$ DEF$G ; .NLIST BEX FREE: .WORD 0,0 UNITS: .WORD 0 GETMCR: GMCR$ ARGBLK=GETMCR+G.MCRB ; LABEL: .BLKB 12. HDRFLG: .BYTE 0 NOLABL: .ASCII / *none* / H1: .ASCII /%NVDA This program is used to display the current virtual disk/ .ASCII \%N assignments on a system. It is invoked as follows:\ .ASCIZ \%N%N VDA [/sw]%N or%N VDA VDn\ H2: .ASCII \%N where /sw can be one of the following:\ .ASCII \%N%N /OFL - Display only VD's that are offline (IE.not assigned)\ .ASCIZ \%N /ALL - Display all VD's whether offline or online\ H3: .ASCII \%N /ONL - Display only online VD's (default if no switch specified)\ .ASCII \%N /HE - Displays this text\ .ASCIZ \%N /dev - Displays VD's on device 'dev' only, where 'dev' is the device\ H4: .ASCII \%N mnemonic and unit (if no unit then unit 0 is displayed)\ .ASCII \%N (example: /DK /DK0 /DK1)\ .ASCII \%N VDA VDn - Displays status of VD unit 'n' only\ .ASCIZ \%N%N The display will contain the VD unit, associated file name,\ H5: .ASCII \%N disk size and the label of the disk if mounted (*none* if disk\ .ASCII \%N has no label and *dismounted* if disk is not mounted). If the\ .ASCIZ \%N disk is mounted, it will also display the number of free blocks\ H6: .ASCII \%N on the disk, the maximum number of files allowed on the disk\ .ASCIZ \%N and the current transaction count for the disk.\ MSGHDR: .ASCIZ /%N%N%N%28SVirtual Disk Assignments/ MSGHD2: .ASCII /%NDisk%13SFile name%11SSize%7SLabel%6SFree Maxfile Tran/ .ASCIZ /%N----%13S---------%11S----%7S-----%6S---- ------- ----/ OFLHDR: .ASCII /%N%N%N *Offline* Virtual Disks/ .ASCIZ /%N -----------------------/ SGLHDR: .ASCII /%N%N%N%28SStatus of %5/ .ASCIZ /%N%28S---------------/ MSGOFL: .ASCIZ /%N%7*** not assigned ***/ MSGLOC: .ASCII /%N%7%30<%2A%O:[%O,%O]%X%30>%8<%T.%8>%12A / .ASCIZ /%7<%T.%7>%8<%M.%8>%7<%M./ MSGFOR: .ASCIZ /%N%7%30<%2A%O:[%O,%O]%X%30>%8<%T.%8> *foreign*/ MSGDMO: .ASCIZ /%N%7%30<%2A%O:[%O,%O]%X%30>%8<%T.%8>*dismounted*/ DFSNER: .ASCIZ /%N%7%30<%2A%O:[%O,%O]%X%30>Directory file sequence number error/ FSNERR: .ASCIZ /%N%7%30<%2A%O:[%O,%O]%X%30>File sequence number error/ INDXER: .ASCIZ \%N%7%30<%2A%O:[%O,%O]%X%30>Index file I/O error\ DELERR: .ASCIZ /%N%7%30<%2A%O:[%O,%O]%X%30>File header is deleted/ DDELER: .ASCIZ /%N%7%30<%2A%O:[%O,%O]%X%30>Directory is deleted/ SYNERR: .ASCIZ \%N%NVDA -- Syntax error, use VDA /HE for help\ .EVEN FSRSZ$ 0 VDA: TTATCH #5 ;ATTACH TERMINAL DIR$ #GETMCR ;GET MCR COMMAND LINE TST $DSW ;ANYTHING ENTERED? BGT 1$ ;YES - BRANCH JMP 10$ ;NO - BRANCH 1$: TPARS #0,#KEYTBL,$DSW,#GETMCR+G.MCRB,#SWITCH BCC 5$ EDMWRT #SYNERR,#ARGBLK JMP 230$ 5$: BIT #VD.HLP,SWFLAG ;/HE ENTERED? BEQ 6$ ;NO - BRANCH EDMWRT #H1,#ARGBLK ;YES - OUTPUT HELP MESSAGE EDMWRT #H2,#ARGBLK EDMWRT #H3,#ARGBLK EDMWRT #H4,#ARGBLK EDMWRT #H5,#ARGBLK EDMWRT #H6,#ARGBLK JMP 230$ ;GO EXIT 6$: BIT #VD.OFL,SWFLAG ;/OFL ENTERED? BEQ 9$ ;NO - BRANCH EDMWRT #OFLHDR,#ARGBLK ;WRITE OFFLINE HEADER INC HDRFLG ;INDICATE THAT HEADER HAS BEEN WRITTEN BR 10$ 9$: BIT #VD.SGL,SWFLAG ;REPORT ON A SINGLE VD? BEQ 10$ ;NO - BRANCH MOV UNIT,ARGBLK ;PUT UNIT IN MESSAGE EDMWRT #SGLHDR,#ARGBLK ;WRITE OUT APPROPRIATE HEADER INC HDRFLG ;INDICATE THAT HEADER HAS BEEN WRITTEN 10$: MOV $DEVHD,R4 20$: CMP D.NAM(R4),#"VD BEQ 30$ MOV D.LNK(R4),R4 BNE 20$ EXIT$S 30$: MOV D.UNIT(R4),UNITS MOV D.UCB(R4),R5 MOVB UNITS+1,R3 MOVB UNITS,R0 SUB R0,R3 INC R3 MOV R3,UNITS TSTB HDRFLG ;HAS HEADER BEEN WRITTEN? BNE 40$ ;YES - BRANCH EDMWRT #MSGHDR,#ARGBLK EDMWRT #MSGHD2,#ARGBLK 40$: MOV U.NXT(R5),R2 CLR ARGBLK MOVB U.UNIT(R5),ARGBLK ;PUT VD UNIT IN ARGBLK BITB #US.OFL,U.ST2(R5) ;DEVICE OFFLINE? BEQ 60$ ;NO - BRANCH BIT #VD.SGL,SWFLAG ;REPORT ON SINGLE UNIT REQUESTED? BEQ 45$ ;NO - BRANCH CMPB U.UNIT(R5),UNIT ;YES - IS THIS THE UNIT ASKED FOR? BEQ 46$ ;YES - BRANCH BR 50$ 45$: BIT #VD.OFL!VD.ALL,SWFLAG ;SHOULD WE NOT PRINT OFFLINE VD'S? BEQ 50$ ;NO - BRANCH 46$: EDMWRT #MSGOFL,#ARGBLK ;PRINT 'VDn not assigned' 50$: JMP 220$ ;GET NEXT UNIT 60$: BIT #VD.OFL,SWFLAG ;ONLY LIST OFFLINE VD'S? BEQ 70$ ;NO - BRANCH JMP 220$ 70$: ADD #X.FNB,R2 ;R2 POINTS TO FILE NAME BLOCK MOV R2,ARGBLK+2 ;ARGBLK+2 HAS ADDRESS OF DEVICE ADD #N.DVNM,ARGBLK+2 ; MNEMONIC MOV N.UNIT(R2),ARGBLK+4 ;ARGBLK+4 HAS UNIT NUMBER BIT #VD.DEV,SWFLAG ;SPECIFIC REAL DEVICE ASKED FOR? BEQ 81$ ;NO - BRANCH CMP RDEV,@ARGBLK+2 ;YES - DO DEVICES MATCH? BNE 80$ ;NO - BRANCH CMP UNIT,ARGBLK+4 ;DO UNITS MATCH? BEQ 90$ ;YES - BRANCH 80$: JMP 220$ 81$: BIT #VD.SGL,SWFLAG ;REPORT ON SINGLE VD REQUESTED? BEQ 90$ ;NO - BRANCH CMPB U.UNIT(R5),UNIT ;YES - IS THIS THE UNIT ASKED FOR? BNE 80$ ;NO - SKIP IT EDMWRT #MSGHD2,#ARGBLK ;WRITE OUT 2ND LINE OF HEADER 90$: MOV N.FNAM(R2),ARGBLK+12 ;LOAD FILE NAME STRING INTO ARGBLK MOV N.FNAM+2(R2),ARGBLK+14 ; " MOV N.FNAM+4(R2),ARGBLK+16 ; " MOV N.FTYP(R2),ARGBLK+20 ;LOAD FILE TYPE INTO ARGBLK MOV N.FVER(R2),ARGBLK+22 ;LOAD FILE VERSION INTO ARGBLK MOV N.DID(R2),IDXFID ;LOAD DIRECTORY FILE ID TO SEARCH FOR MOV N.DID+2(R2),IDXFSN ;LOAD DIRECTORY FILE SEQ NUM MOV N.DVNM(R2),IDDV ;LOAD DEVICE TO SEARCH MOV N.UNIT(R2),IDUNIT ;LOAD UNIT TO SEARCH CLR ARGBLK+6 CLR ARGBLK+8. CALL GETIDX TST IDXERR ;ANY ERRORS? BEQ 120$ ;NO - BRANCH CMP IDXERR,#-1 ;FILE SEQ NUM ERROR? BNE 100$ ;NO - BRANCH EDMWRT #DFSNER,#ARGBLK ;OUTPUT ERROR JMP 220$ ;GET NEXT VD 100$: CMP IDXERR,#-2 ;FILE DELETED? BNE 110$ ;NO - BRANCH EDMWRT #DDELER,#ARGBLK ;OUTPUT DIRECTORY DELETED JMP 220$ ;GET NEXT VD 110$: EDMWRT #INDXER,#ARGBLK ;OUTPUT INDEX FILE ERROR JMP 220$ ;GET NEXT VD 120$: MOVB INDEX+H.PROJ,ARGBLK+6 ;PUT UIC GROUP INTO ARGBLK MOVB INDEX+H.PROG,ARGBLK+8. ;PUT OWNER INTO ARGBLK MOV N.FID(R2),IDXFID ;LOAD FILE ID TO SEARCH FOR MOV N.FID+2(R2),IDXFSN ;LOAD FILE SEQ NUM CALL GETIDX TST IDXERR ;ANY ERRORS? BEQ 150$ ;NO - BRANCH CMP IDXERR,#-1 ;FILE SEQ NUM ERR? BNE 130$ ;NO BRANCH EDMWRT #FSNERR,#ARGBLK ;OUTPUT FILE SEQ NUM ERROR BR 220$ ;GET NEXT VD 130$: CMP IDXERR,#-2 ;FILE DELETED? BNE 140$ ;NO - BRANCH EDMWRT #DELERR,#ARGBLK ;OUTPUT FILE DELETED BR 220$ ;GET NEXT VD 140$: EDMWRT #INDXER,#ARGBLK ;OUTPUT INDEX FILE ERROR BR 220$ 150$: MOV R5,ARGBLK+24 ;LOAD ADDRESS OF DISK SIZE ADD #U.CW2,ARGBLK+24 ; " MOV U.VCB(R5),R2 ;R2 HAS ADDRESS OF VOLUME CONTROL BLK BEQ 200$ ;VOLUME NOT MOUNTED IF EQUAL .IFDF V.TYPE ;If RSX11M V4.0 or greater then TSTB V.TYPE(R2) ;Anything in the volume type desc.? BEQ 205$ ;no, foreign volume, branch .ENDC MOV R3,-(SP) ;SAVE R3 MOV R2,R3 ;PUT ADDRESS OF VOLUME LABEL INTO ADD #V.LABL,R3 ; R3 TSTB (R3) ;DOES DISK HAVE A LABEL? BNE 160$ ;YES - BRANCH MOV #NOLABL,ARGBLK+26 ;PUT ADDR OF NO LABEL MSG IN ARGBLK BR 190$ 160$: MOV #12.,R0 ;R0 HAS LOOP COUNT MOV #LABEL,R1 ;R1 HAS ADDRESS OF LABEL WITH SPACES 170$: MOVB #40,(R1) ;INITIALIZE TO SPACE TSTB (R3) ;IS THE THERE A CHAR IN THIS POSITION? BEQ 180$ ;NO - BRANCH MOVB (R3),(R1) 180$: TSTB (R1)+ ;INCREMENT R1 TSTB (R3)+ ;INCREMENT R3 SOB R0,170$ ;CONTINUE LOOP UNTIL LABEL IS LOADED MOV #LABEL,ARGBLK+26 ;PUT ADDR OF LABEL INTO ARGBLK 190$: MOV (SP)+,R3 ;RESTORE R3 MOV V.FRBK(R2),FREE ;STORE NUMBER OF FREE BLOCKS ON MOV V.FRBK+2(R2),FREE+2 ; DISK BIC #177400,FREE ;CLEAR OUT HIGH BYTE MOV #FREE,ARGBLK+30 ;PUT FREE SPACE INTO ARGBLK MOV V.FMAX(R2),ARGBLK+32 ;PUT NUMBER OF MAX FILES INTO ARGBLK MOV V.TRCT(R2),ARGBLK+34 ;PUT VOLUME TRANSACTION COUNT ARGBLK EDMWRT #MSGLOC,#ARGBLK ;OUTPUT ASSIGNMENT MESSAGE BR 220$ 200$: EDMWRT #MSGDMO,#ARGBLK ;OUTPUT DISMOUNTED MESSAGE BR 220$ 205$: EDMWRT #MSGFOR,#ARGBLK ;Output foreign volume message BR 220$ 210$: JMP 40$ 220$: ADD D.UCBL(R4),R5 ;GET NEXT UCB SOB R3,210$ ;GET NEXT UNIT IF ANY 230$: EXIT$S .PAGE .SBTTL STATE TABLES FOR .TPARS VD.OFL=1 VD.ONL=2 VD.DEV=4 VD.ALL=10 VD.HLP=20 VD.SGL=40 SWFLAG: .WORD 0 RDEV: .ASCII / / UNIT: .WORD 0 ISTAT$ STATE1,KEYTBL STATE$ SWITCH TRAN$ $STRNG ;BYPASS PROGRAM NAME 'VDA' STATE$ TRAN$ 'V,VDCHK,,VD.SGL,SWFLAG TRAN$ $EOS,$EXIT TRAN$ '/,VALSW STATE$ VDCHK TRAN$ 'D STATE$ GUNIT TRAN$ $NUMBR,SWEND,STUNIT TRAN$ $EOS,$EXIT STATE$ VALSW TRAN$ "OFL",SWEND,,VD.OFL,SWFLAG TRAN$ "ONL",SWEND,,VD.ONL,SWFLAG TRAN$ "ALL",SWEND,,VD.ALL,SWFLAG TRAN$ "HE",$EXIT,,VD.HLP,SWFLAG TRAN$ $ALPHA,,MNEM1 STATE$ TRAN$ $ALPHA,,MNEM2 STATE$ TRAN$ $EOS,$EXIT,,VD.DEV,SWFLAG TRAN$ '/,VALSW,,VD.DEV,SWFLAG TRAN$ $NUMBR,,STUNIT,VD.DEV,SWFLAG STATE$ SWEND TRAN$ $LAMDA,$EXIT STATE$ ; ; MNEM1: MOVB .PCHAR,RDEV RETURN MNEM2: MOVB .PCHAR,RDEV+1 RETURN STUNIT: MOV .PNUMB,UNIT RETURN .PAGE .SBTTL GETIDX GET INFO FROM INDEX FILE .MCALL FDBDF$,FSRSZ$,FDBK$A,FDOP$A,OPEN$R,READ$,WAIT$,CLOSE$ .MCALL NMBLK$ IDFDB: FDBDF$ FSRSZ$ 0 INDEX: .BLKW 256. STBLK: .BLKW 5 IOSTAT: .WORD 0,0 IDXERR: .WORD 0 IDXFID: .WORD 0 IDXFSN: .WORD 0 IDBKVB: .WORD 0,0 IDXFNB: NMBLK$ INDEXF,SYS IDUNIT: .WORD 0 IDDV: .ASCII /XX/ .EVEN IDXDSP: .WORD 0,0 .WORD IDDRSZ,IDDR .WORD 0,0 IDDR: .ASCII /[0,0]/ IDDRSZ=.-IDDR .EVEN FDBK$A INDEX,512.,,10,IOSTAT FDOP$A 2,IDXDSP,IDXFNB GETIDX: CLR IDXERR MOV IDDV,IDXFNB+N.DVNM MOV IDUNIT,IDXFNB+N.UNIT MOV #STBLK,IDFDB+F.STBK OPEN$R #IDFDB,#2,#IDXDSP,#FD.RWM BCC 10$ 5$: INC IDXERR RETURN 10$: MOV STBLK+4,IDFDB+F.HIBK MOV STBLK+4,IDFDB+F.EFBK MOV STBLK+6,IDFDB+F.HIBK+2 MOV STBLK+6,IDFDB+F.EFBK+2 ADD #1,IDFDB+F.EFBK+2 ADC IDFDB+F.EFBK CLR IDBKVB MOV #2,IDBKVB+2 READ$ #IDFDB,,,#IDBKVB TSTB IDFDB+F.ERR BLE 50$ WAIT$ #IDFDB TST IOSTAT BLE 50$ MOV INDEX,IDBKVB+2 ADD #2,IDBKVB+2 ADD IDXFID,IDBKVB+2 READ$ #IDFDB,,,#IDBKVB TSTB IDFDB+F.ERR BLE 50$ WAIT$ #IDFDB TST IOSTAT BLE 50$ CMP INDEX+H.FSEQ,IDXFSN BEQ 25$ MOV #-1,IDXERR BR 30$ 25$: TST INDEX+H.FNUM BNE 30$ MOV #-2,IDXERR 30$: CLOSE$ #IDFDB RETURN 50$: INC IDXERR BR 30$ .END VDA