.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