.TITLE VOL .IDENT /001B/ ; AUTHOR -- TERRY MONTLICK ; TASK "VOL" -- THIS PRIVILEGED MCR FUNCTION ALLOWS ONE TO CHANGE VOLUME ; CHARACTERISTICS OF A PREVIOUSLY INITVOLED RSX VOLUME. ; ; WRITTEN 8/10/75 ; REVISED 2/24/76 ; ; BUILD FILE: ; ; VOL/PR/-FP/-CP/MU/-TA,VOL/-SP=VOL,[1,1]EXEC.STB/SS ; / ; TASK=...VOL ; PRI=200 ; STACK=32 ; // ; ; .MCALL DIR$,WTSE$S,MOUT$,GTSK$,ALUN$,GMCR$,QIOW$,EXIT$S .MCALL ISTAT$,STATE$,TRAN$ .MCALL HMBOF$ ; ; STRING DESCRIPTOR MACRO .MACRO STRING S,?L1,?L2 .WORD L2-L1,L1 L1: .ASCII /S/ L2: .EVEN .ENDM STRING ; ; STACK PUSH AND POP MACROS .MACRO PUSH A,B,C,D,E,F,G .IRP X, .IF NB X MOV X,-(SP) .ENDC .ENDM .ENDM PUSH ; .MACRO POP A,B,C,D,E,F,G .IRP X, .IF NB X MOV (SP)+,X .ENDC .ENDM .ENDM POP ; ; .PSECT PURE,REL,RO ; HMBOF$ DEF$L ;DEFINE HOME BLOCK OFFSETS ; ; ; HERE IS WHERE WE START ; FIRST GET COMMAND LINE AND CHECK USER PRIVILEGES ; START: DIR$ #GTSK ;GET TASK PARAMETERS DIR$ #GMCR ;GET MCR COMMAND LINE CMPB G+G.TSGC,#10 ;ARE WE PRIVILEGED? BLE 1$ ;YES --OK MOV #ILLEGL,MOUT+M.OSTR ;NO--PRIVILEGE VIOLATION JMP MOUTDR ; ; NOW PARSE OUT DEVICE NAME ; 1$: MOV #1,R1 ;SET UP FOR TPARSE CALL MOV #KEYTAB,R2 ;ADDR OF KEYWORD TABLE MOV $DSW,R3 ;LENGTH OF COMMAND LINE BPL 5$ JMP SYNTAX ;EXIT IF ERROR 5$: MOV #GMCR+G.MCRB,R4 ;MCR LINE ADDRESS MOV #PRESCN,R5 ;STARTING STATE CALL .TPARS ;PRESCAN PAST MCR TASK NAME BCC 10$ JMP SYNTAX ;ERROR 10$: CLR R1 ;IGNORE BLANKS MOV #SCAN1,R5 ;NEXT STARTING STATE CALL .TPARS ;GET DEVICE NAME BCC 12$ JMP SYNTAX ;ERROR ; ; ASSIGN A LUN TO THIS DEVICE ; 12$: DIR$ #A ;ASSIGN LUN ; ; NOW CHECK THE PUD OF THE DEVICE TO MAKE SURE ITS LEGAL ; MOV .PUDBA,R0 ;GET PUD ADDRESS BR 20$ 15$: ADD #U.SZ,R0 ;GO TO NEXT ENTRY CMP R0,.PUDEA ;END OF PUD? BNE 20$ ;NO MOV #NODEVC,MOUT+M.OSTR ;DEVICE NOT IN SYSTEM JMP MOUTDR 20$: CMP (R0),A+A.LUNA ;DOES DEVICE TYPE MATCH? BNE 15$ ;NO CMPB U.UN(R0),A+A.LUNU ;YES--DOES UNIT # MATCH? BNE 15$ ;NO MOV #140010,R1 ;SET PUD PATTERN FOR FILES-11 DEVICE BIC U.C1(R0),R1 ;CHECK IF ALL BITS ARE SET BEQ 25$ ;DEVICE OK MOV #NOTF11,MOUT+M.OSTR JMP MOUTDR ;DEVICE NOT FILES-11 ; ; MAKE SURE VOLUME NOT MOUNTED AS FILES-11 VOLUME ; 25$: TST U.VA(R0) ;IS THERE A VCB EXTENSION? BEQ 30$ ;NO--VOLUME NOT MOUNTED MOV #NOMOUN,MOUT+M.OSTR JMP MOUTDR ;VOLUME MOUNTED ; ; NOW SEARCH FOR A VALID HOME BLOCK ; 30$: MOV U.LBH(R0),TOTH ;GET #BLOCKS ON DEVICE (HIGH) MOV U.LBN(R0),TOTL ;LOW BR 33$ ;GO GET 1ST BLOCK 31$: BIC #1,Q+Q.IOPL+10 ADD #400,Q+Q.IOPL+10 ;UPDATE BLOCK ADDRESS ADC Q+Q.IOPL+6 CMP Q+Q.IOPL+6,TOTH ;EXCEED VOLUME LIMIT? BGT 32$ ;YES BLT 33$ ;NO CMP Q+Q.IOPL+10,TOTL BLT 33$ ;NO 32$: MOV #NOHOME,MOUT+M.OSTR ;NO HOME BLOCK JMP MOUTDR 33$: DIR$ #Q ;GET POSSIBLE HOME BLOCK ON DEVICE TST $DSW ;CHECK DIRECTIVE STATUS BPL 35$ JMP DIRERR ;GO TO ERROR ROUTINE 35$: TSTB IOST ;CHECK IO STATUS BPL 40$ JMP IOERR ;GO TO ERROR ROUTINE 40$: MOV #BUF,R0 ;SEE IF THIS IS HOME BLOCK MOV #H.CHK1/2,R1 ;GET FIRST CHECKSUM CALL CHECKS ;DO IT CMP R1,@R0 ;CHECKSUM GOOD? BNE 31$ ;NO --TRY NEXT BLOCK MOV #BUF,R0 ;COMPUTE 2ND CHECKSUM MOV #H.CHK2/2,R1 CALL CHECKS CMP R1,@R0 ;GOOD CHECKSUM? BNE 31$ ;NO GOOD -TRY NEXT BLOCK TST BUF+H.IBSZ ;BIT MAP SIZE NONZERO? BEQ 31$ ;YES -- NO GOOD TST BUF+H.FMAX ;MAX FILES SPECIFIED? BEQ 31$ ;NO --NO GOOD ;YES--IT PASSES! ; ; VOLUME HAS A VALID HOME BLOCK -- PARSE AND PROCESS SWITCHES ; CLR R1 ;SET UP FOR TPARS CALL MOV #SCAN2,R5 ;STARTING STATE CALL .TPARS ;GO PARSE AND PROCESS BCC 50$ JMP SYNTAX ; ; PARSE ROUTINE HAS PROCESSED SWITCH VALUES AND MODIFIED HOME BLOCK ; ACCORDINGLY. NOW RECALCULATE CHECKSUMS, WRITE HOME BLOCK, AND EXIT ; 50$: MOV #BUF,R0 ;SET UP TO CALCULATE CHECKSUM 1 MOV #H.CHK1/2,R1 CALL CHECKS MOV R1,@R0 ;SET CHECKSUM MOV #BUF,R0 ;CALCULATE 2ND CHECKSUM MOV #H.CHK2/2,R1 CALL CHECKS MOV R1,@R0 ;SET CHECKSUM MOV #IO.WLB,Q+Q.IOFN ;GET READY TO WRITE THE BLOCK BACK DIR$ #Q ;WRITE IT MOV WRITE,PAR+4 ;SET WRITE SD IN MSG PARAMETER LIST MOV WRITE+2,PAR+6 TST $DSW ;ANY ERRORS BMI DIRERR ;YES TSTB IOST ;IO STATUS OK? BMI IOERR ;NO BR EXIT ;ALL OK --EXIT ; ; ERROR CONDITION PROCESSING ; SYNTAX: MOV #SYNERR,MOUT+M.OSTR ;SYNTAX ERROR BR MOUTDR BADVAL: MOV #BADKEY,MOUT+M.OSTR ;BAD KEYWORD VALUE BR MOUTDR DIRERR: MOV #QIOERR,MOUT+M.OSTR ;DIRECTIVE ERROR BR MOUTDR IOERR: CMPB IOST,#IE.DNR BNE 5$ MOV #DEVNRD,MOUT+M.OSTR ;DEVICE NOT READY BR MOUTDR 5$: CMPB IOST,#IE.VER BNE 15$ MOV #PARERR,MOUT+M.OSTR ;PARITY ERROR BR MOUTDR 15$: CMPB IOST,#IE.WLK BNE 20$ MOV #WRITEP,MOUT+M.OSTR ;WRITE PROTECTED BR MOUTDR 20$: MOV #RWFAIL,MOUT+M.OSTR ;READ OR WRITE FAILURE MOUTDR: DIR$ #MOUT ;TYPE ERROR MESSAGE WTSE$S #30. ;WAIT FOR MESSAGE COMPLETION EXIT: EXIT$S ;ALL DONE--EXIT ; ; ILLEGL: STRING <%VA -- ILLEGAL FUNCTION FOR NONPRIVILEGED USER> NODEVC: STRING <%VA -- DEVICE NOT IN SYSTEM> NOTF11: STRING <%VA -- NOT A FILES-11 DEVICE> NOMOUN: STRING <%VA -- VOLUME MUST BE DISMOUNTED> NOHOME: STRING <%VA -- CAN'T FIND HOME BLOCK> SYNERR: STRING <%VA -- SYNTAX ERROR> QIOERR: STRING <%VA -- QIO DIRECTIVE ERROR> DEVNRD: STRING <%VA -- DEVICE NOT READY> PARERR: STRING <%VA -- FATAL %VA ERROR - PARITY ERROR ON DEVICE> BADKEY: STRING <%VA -- ILLEGAL KEYWORD VALUE> WRITEP: STRING <%VA -- DEVICE WRITE PROTECTED> RWFAIL: STRING <%VA -- HOME BLOCK %VA FAILURE> ; ; HERE IS THE STATE TABLE FOR COMMAND LINE PARSING ; ; ISTAT$ STB,KEYTAB .GLOBL PRESCN .GLOBL SCAN1 .GLOBL SCAN2 ; ; PRESCAN MCR LINE PAST OUR TASK NAME STATE$ PRESCN TRAN$ $STRNG STATE$ TRAN$ $BLANK,$EXIT TRAN$ $LAMDA,$EXIT ; ;SCAN MCR LINE FOR DEVICE INFORMATION STATE$ SCAN1 TRAN$ $ANY,,DEV1 STATE$ TRAN$ $ANY,,DEV2 STATE$ TRAN$ ':,$EXIT TRAN$ $NUMBR,,DEVNUM STATE$ TRAN$ ':,$EXIT ; ; SCAN MCR LINE FOR SWITCHES STATE$ SCAN2 TRAN$ '/,S1 TRAN$ $EOS,$EXIT STATE$ S1 TRAN$ "LABEL",NA TRAN$ "UIC",UI TRAN$ "PRO",PR TRAN$ "FPRO",FP TRAN$ "EXT",EX TRAN$ "WIN",WI TRAN$ "MXF",MX TRAN$ "CHA",CH TRAN$ "LRU",LR ; ; VOLUME NAME GIVEN STATE$ NA TRAN$ '= STATE$ TRAN$ $STRNG,SCAN2,LABEL ; ;VOLUME OWNER GIVEN STATE$ UI TRAN$ '= STATE$ TRAN$ '[ STATE$ TRAN$ $NUMBR,,UIC1 STATE$ TRAN$ <',> STATE$ TRAN$ $NUMBR,,UIC2 STATE$ TRAN$ '],SCAN2 ; ; VOLUME PROTECTION GIVEN STATE$ PR TRAN$ '= STATE$ TRAN$ '[,SPRO,PGROUP ; ; NUMBER OF PRE-ACCESSED DIRECTORIES GIVEN STATE$ LR TRAN$ '= STATE$ TRAN$ $NUMBR,SCAN2,LRU ; ; DEFAULT FILE PROTECTION GIVEN STATE$ FP TRAN$ '= STATE$ TRAN$ '[,SPRO,FGROUP ; ; DEFAULT FILE EXTENTION SIZE GIVEN STATE$ EX TRAN$ '= STATE$ TRAN$ $NUMBR,SCAN2,EXTENT ; ; DEFAULT WINDOW SIZE GIVEN STATE$ WI TRAN$ '= STATE$ TRAN$ $NUMBR,SCAN2,WINDOW ; ; MAX FILES ON VOLUME GIVEN STATE$ MX TRAN$ '= STATE$ TRAN$ $NUMBR,SCAN2,MAXFIL ; ; VOLUME CHARACTERISTICS GIVEN STATE$ CH TRAN$ '= STATE$ TRAN$ '[ STATE$ CH0 TRAN$ '],SCAN2,ENDCHA TRAN$ <',>,CH0 TRAN$ "ATCH",CH0,ATCH TRAN$ "DCF",CH0,DCF ; ; COMMON PROTECTION CODE SCAN STATE$ SPRO TRAN$ '],SCAN2,ENDGRP TRAN$ <',>,SPRO,NXGRP TRAN$ 'R,SPRO,SETRP TRAN$ 'W,SPRO,SETWP TRAN$ 'E,SPRO,SETEP TRAN$ 'D,SPRO,SETDP ; STATE$ ; ; ; SUBROUTINES FOR COMMAND PARSER ; DEV1: MOVB .PCHAR,A+A.LUNA ;1ST CHAR OF DEVICE FOR ALUN$ RETURN DEV2: MOVB .PCHAR,A+A.LUNA+1 ;2ND CHAR OF DEVICE NAME RETURN ; DEVNUM: MOV .PNUMB,A+A.LUNU ;DEVICE NUMBER RETURN ; LABEL: PUSH R0,R1,R2 MOV .PSTPT,R0 ;GET VOLUME LABEL POINTER MOV #BUF+H.VNAM,R1 ;SET ADDRESS IN BUFFER FOR VOL NAME MOV .PSTCN,R2 ;SET CHARACTER COUNT BEQ 7$ ;IF ZERO, SKIP TRANSFER 5$: MOVB (R0)+,(R1)+ ;SET NEW VOLUME LABEL SOB R2,5$ 7$: MOV #12.,R2 ;CLEAR REST OF VOLUME LABEL SUB .PSTCN,R2 BLE 15$ ;IF CHARS > OR = 12.,ALL DONE 10$: CLRB (R1)+ SOB R2,10$ 15$: POP R2,R1,R0 RETURN ; UIC1: MOVB .PNUMB,BUF+H.VOWN+1 ;SET UIC GROUP CODE RETURN UIC2: MOVB .PNUMB,BUF+H.VOWN ;SET UIC MEMBER CODE RETURN ; PGROUP: MOV #BUF+H.VPRO,PRADDR ;SET VOLUME PROTECTION ADDRESS MOV #4,GRCNT BR NXGRP ; FGROUP: MOV #BUF+H.FPRO,PRADDR ;SET DEFAULT FILE PRO ADDRESS MOV #4,GRCNT BR NXGRP ; NXGRP: SEC ;FORCE ONES ROR UPRO ASR UPRO ;SHIFT TO NEXT GROUP ASR UPRO ASR UPRO DEC GRCNT ;COUNT GROUPS BGE 10$ JMP SYNTAX ;TOO MANY IS AN ERROR 10$: RETURN ; SETRP: BIC #10000,UPRO ;SET READ PERMITTED RETURN ; SETWP: BIC #20000,UPRO ;SET WRITE PERMITTED RETURN ; SETEP: BIC #40000,UPRO ;SET EXTEND PERMITTED RETURN ; SETDP: BIC #100000,UPRO ;SET DELETE PERMITTED RETURN ; ENDGRP: TST GRCNT ;CHECK GROUP COUNT BEQ 10$ JMP SYNTAX ;MUST HAVE 3 SHIFTS 10$: MOV UPRO,@PRADDR ;SET PROTECTION RETURN ; EXTENT: CALL BYTCHK ;MAKE SURE NUMBER NOT > 1 BYTE BCC 10$ JMP BADVAL 10$: MOVB .PNUMB,BUF+H.FIEX ;SET NEW FILE EXTEND DEFAULT RETURN ; WINDOW: CALL BYTCHK ;MAKE SURE NUMBER NOT > 1 BYTE BCC 10$ JMP BADVAL 10$: MOVB .PNUMB,BUF+H.WISZ ;SET #WINDOW RETRIEVAL POINTERS RETURN ; LRU: CALL BYTCHK ;MAKE SURE NUMBER NOT > 1 BYTE BCC 10$ JMP BADVAL 10$: MOVB .PNUMB,BUF+H.WISZ+2 ;SET # OF PREACCESSED DIRECTORIES RETURN ; BYTCHK: TSTB .PNUMB+1 ;CHECK FOR NUMBER > ONE BYTE BEQ 10$ BR 15$ 10$: TST .PNUMH BEQ 20$ 15$: SEC ;IF TOO BIG, SET CARRY BR 30$ 20$: CLC 30$: RETURN ; MAXFIL: TST .PNUMH ;MAKE SURE MAX FILE NOT >65535. BEQ 10$ ;OK JMP SYNTAX ;NO GOOD 10$: PUSH R0,R1 ;SAVE R0 AND R1 MOV TOTL,R1 ;LOAD REGISTERS WITH MAX VOLUME BLOCKS MOV TOTH,R0 ASHC #-1,R0 ;DIVIDE BY TWO TST R0 ;IS RESULT > 65535? BNE 30$ ;YES -- MAX BLOCKS OK CMP R1,.PNUMB ;NO -- IS RESULT < MAX FILES GIVEN? BGE 30$ ;NO --OK JMP SYNTAX ;YES --NO GOOD 30$: MOV .PNUMB,BUF+H.FMAX ;MAX FILES OK --SET IT POP R1,R0 RETURN ; ATCH: BIS #20,VOLCHA ;ALLOW ATTACH RETURN ; DCF: BIS #10,VOLCHA ;ALLOW DEVICE CONTROL FUNCTIONS RETURN ; ENDCHA: BIS #30,BUF+H.VCHA ;SET VOLUME CHARACTERISTICS BIC VOLCHA,BUF+H.VCHA RETURN ; ; ; CHECKSUM ROUTINE ; CHECKS: ;CALCULATE CHECKSUM ;IN: R0=START ADDR ; R1=COUNT ;OUT: R1=CHECKSUM PUSH R2 MOV R1,R2 ;PUT COUNT IN R2 CLR R1 ;CLEAR CHECKSUM 10$: ADD (R0)+,R1 ;COMPUTE CHECKSUM SOB R2,10$ POP R2 ;RESTORE R2 RETURN ; ; TASK BUFFERS AND DPB ; .PSECT ; ; BUF: .BLKW 256. ;HOME BLOCK BUFFER Q: QIOW$ IO.RLB,1,1,,IOST,, A: ALUN$ 1,SY,0 GMCR: GMCR$ MOUT: MOUT$ ILLEGL,PAR,,,SY$STM GTSK: GTSK$ G G: .BLKW 16. IOST: .BLKW 2 TOTL: .WORD 0 ;LOW MAX BLOCKS TOTH: .WORD 0 ;HIGH MAX BLOCKS PAR: .WORD 3,GMCR+G.MCRB ;MSG PARMETER LIST .WORD 4,READ READ: .ASCII /READ/ WRITE: .WORD 5,WRIT WRIT: .ASCII /WRITE/ .EVEN PRADDR: .WORD 0 ;POINTER TO PROTECTION WORD ADDRESS GRCNT: .WORD 0 ;BOOK-KEEPING FOR PROTECTION STUFF UPRO: .WORD 0 ;PROTECTION WORD VOLCHA: .WORD 0 ;CHARACTERISTICS WORD .MOLUN==MOUT+M.OLUN ;DEFINE MO LUN ; ; .END START