.TITLE DVE - DEASSIGN VIRTUAL DISK .SBTTL DVE - TITLE PAGE .IDENT /V01.00/ ; ; ************************************************************************ ; * ; THIS PROGRAM IS PROVIDED ON AN "AS IS" BASIS ONLY. DIGITAL EQUIPMENT * ; COMPUTER USER'S SOCIETY, DIGITAL EQUIPMENT CORPORATION, MONSANTO, AND * ; THE AUTHOR DISCLAIM 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 * ; * ; ************************************************************************ ; ; DEASSIGN VIRTUAL DISK DEVICE FROM FILE. ; ; VERSION: V01.00 ; ; AUTHOR: R.W. STAMERJOHN MAPC 19-MAR-79 ; ; MODIFICATION HISTORY: ; ; NONE TO DATE .SBTTL DVE - DECLARATIONS .DSABL GBL ; ; MACRO LIBRARY CALLS: ; ; SYMBOLIC DEFINITIONS. ; .MCALL HDRDF$ ;DEFINE TASK HEADER OFFSETS HDRDF$ .MCALL UCBDF$ ;DEFINE UCB OFFSETS UCBDF$ ; ; DIRECTIVE MACROS. ; .MCALL DIR$ ;ISSUE DIRECTIVE .MCALL ALUN$S ;ASSIGN LUN .MCALL EXIT$S ;EXIT SYSTEM .MCALL GMCR$ ;GET MCR COMMAND LINE .MCALL QIOW$ ;ISSUE QIO AND WAIT .MCALL SVTK$S ;SETUP SST VECTOR TABLE ; ; CSI MACROS. ; .MCALL CSI$ ;DEFINE CSI OFFSETS CSI$ .MCALL CSI$1,CSI$2 ;PARSE COMMAND LINE ; ; FCS MACROS. ; .MCALL NBOF$L ;DEFINE FNB OFFSETS NBOF$L ; ; OTHER MACROS. ; .MCALL CALL,CALLR,RETURN ;SUBROUTINE MACROS ; ; GLOBAL DECLARATIONS: ; .GLOBL DVE ;TASK ENTRY ; ; GLOBAL REFERENCES: ; ; SYSTEM LIBRARY ROUTINES, SYMBOLS. ; .GLOBL $COTB ;CONVERT OCTAL TO BINARY .GLOBL IO.WAT ;WRITE ATTRIBUTES .GLOBL IO.WVB ;WRITE VIRTUAL BLOCK .GLOBL IS.SUC ;I/O SUCCESS CODE .GLOBL $DSW ;DIRECTIVE STATUS WORD ; ; RSX11M SYSTEM ROUTINES, VARIABLES. ; .GLOBL $DEACB ;DEALLOCATE CORE BLOCK .GLOBL $HEADR ;CURRENT TASK HEADER ADDRESS .SBTTL DVE - MACROS ; ; DEFINE ERROR DECLARATION MACRO. ; .MACRO FATAL MSG TRAP 1 .ASCIZ #MSG# .EVEN .ENDM FATAL ; ; DEFINE SYSTEM STATE MACRO. ; .MACRO SYSTEM ADR EMT 376 .WORD ADR .ENDM SYSTEM ; ; DEFINE FILES-11 QIO MACRO. ; .MACRO F11QIO DPB,ADR DIR$ #DPB .IF NB ADR BCS ADR CMPB #IS.SUC,IOSTAT BNE ADR .ENDC .ENDM F11QIO .SBTTL DVE - LOCAL DATA ; ; LOCAL SYMBOLS: ; ; LOGICAL UNITS/EVENT FLAGS. ; TSTLUN = 1 ;DVE WORKING LUN TTYLUN = 2 ;TERMINAL I/O LUN FILLUN = 3 ;FILE I/O LUN EV.QIO = 1 ;QIO WAIT EVENT FLAG ; ; LOCAL DATA: ; ; DIRECTIVES. ; GETCMD: GMCR$ ;GET COMMAND LINE WATDPB: QIOW$ IO.WAT,FILLUN,EV.QIO,,IOSTAT,, ERRDPB: QIOW$ IO.WVB,TTYLUN,EV.QIO,,,, ; ; ERROR MESSAGE STRING. ; ERRMSG: .ASCIZ <15><12>/DVE -- / ERRSTR: .BLKB 40. .EVEN ; ; STT VECTOR TABLE. ; SSTTBL: .WORD 0 ;ODD ADDRESS .WORD 0 ;MEMORY PROTECTION .WORD 0 ;T-BIT TRAP OR BPT .WORD 0 ;IOT TRAP .WORD 0 ;RESERVED INSTRUCTION .WORD 0 ;NON-RSX EMT INSTRUCTION .WORD ERRSRV ;TRAP INSTRUCTION SSTSIZ = <.-SSTTBL>/2 ; ; CSI CONTROL BLOCK. ; CSIBLK: .BLKB C.SIZE ;DEFINE CSI EXTENSION BLOCK .EVEN ; ; FILENAME BLOCK. ; FILFNB: .BLKB S.FNB ;FILENAME BLOCK ; ; WRITE ATTRIBUTE LIST. ; WATLST: .BYTE 03,01 ;WRITE USER CHARACTERISTICS .WORD WATATT ; .BYTE 0,0 ;END-OF-LIST WATATT: .BYTE 200 ;CLEAR LOCK BIT, LEAVE CONTIGIOUS ON .EVEN ; ; OTHER VARIOUS BUFFERS. ; IOSTAT: .WORD 0,0 ;I/O STATUS BLOCK UCBADR: .WORD 0 ;VE: UCB ADDRESS EXTADR: .WORD 0 ;VIRTUAL EXTENSION BLOCK ADDRESS .SBTTL DVE * MAIN-LINE TASK CODE ; ;+ ; THIS SECTION CONTAINS THE ENTRY LEVEL CODE FOR THE DVE TASK. ; IN GENERAL, THE STEPS PERFORMED ARE AS FOLLOWS: ; ; 1. GET THE COMMAND LINE. ; 2. PARSE COMMAND INTO ELEMENTS. ; 3. DEALLOCTE VIRTUAL DISK. ; ; INPUT: ; ; MCR COMMAND LINE IN FORM SHOWN BELOW. ; ; DVE VEN: ; ; VEN: VIRTUAL DISK TO DEASSIGN. ; ; OUTPUT: ; ; VIRTUAL DISK DEASSIGNED FROM FILE OR ERROR MESSAGE ; OUTPUT TO USER'S TERMINAL. ; ;- ; DVE:: ;REF. LABEL. ; ; SETUP SST VECTOR TABLE FOR PROCESSING. ; SVTK$S #SSTTBL,#SSTSIZ ;SETUP SST VECTOR TABLE ; ; ZERO VARIOUS VARIABLES. ; CLR UCBADR ;CLEAR VEN: UCB ADDRESS CLR EXTADR ;CLEAR EXTENSION BLOCK ADDRESS ; ; GET COMMAND LINE, ERROR IF NONE AVAIABLE. ; DIR$ #GETCMD ;GET MCR COMMAND LINE BCC 1000$ ; IF CC - OK, CONTINUE FATAL ;DECLARE ERROR ; ; SETUP FOR COMMAND PARSING. ; 1000$: MOV #GETCMD+G.MCRB,R1 ;GET START OF COMMAND LINE MOV $DSW,R2 ;GET LENGTH OF COMMAND LINE 1100$: CMPB #' ,(R1)+ ;SCAN FOR FIRST BLANK CHARACTER BEQ 1200$ ; IF EQ - FOUND CHARACTER SOB R2,1100$ ;LOOP THROUGH ENTIRE LINE FATAL ;DECLARE ERROR ; ; CHECK COMMAND FOR SYNTACICAL CORRECTNESS. ; 1200$: DEC R2 ;CORRECT LINE LENGTH CSI$1 #CSIBLK,R1,R2 ;CHECK COMMAND LINE SYNTAX BCC 1210$ ; IF CC - OK, CONTINUE FATAL ;DECLARE ERROR 1210$: BITB #CS.EQU,C.STAT(R0) ;IS THERE AN EQUAL SIGN? BEQ 1300$ ; IF EQ - YES, CONTINUE FATAL ;DECLARE ERROR ; ; GET INPUT FILENAME. MUST ONLY BE VEX:. ; 1300$: CSI$2 #CSIBLK,OUTPUT ;GET INPUT SPECIFICATION BCS 1310$ ; IF CS - BAD, ERROR BITB #CS.NMF!CS.DIF!CS.MOR,C.STAT(R0) ;IS OUTPUT ONLY DEVICE? BNE 1310$ ; IF NE - NO, ERROR BITB #CS.DVF,C.STAT(R0) ;WAS A DEVICE SPECIFIED? BEQ 1310$ ; IF EQ - NO, ERROR MOV C.DEVD+2(R0),R0 ;GET DEVICE FIELD ADDRESS CMPB #'V,(R0)+ ;CHECK FIRST CHARACTER OF NAME BNE 1310$ ; IF NE - BAD, ERROR CMPB #'E,(R0)+ ;CHECK SECOND CHARACTER OF NAME BNE 1310$ ; IF NE - BAD, ERROR CALL $COTB ;CONVERT UNIT NUMBER CMPB #':,R2 ;CHECK FOR PROPER TERMINATOR BEQ 1400$ ; IF EQ - OK, CONTINUE 1310$: FATAL ; ; ASSIGN VIRTUAL DISK TO LUN. ; 1400$: ALUN$S #TSTLUN,#"VE,R1 ;ASSIGN VIRTUAL DISK BCC 2000$ ; IF CC - OK, CONTINUE FATAL ;DECLARE ERROR ; ; GET VIRTUAL DISK UCB AND DEASSIGN IF POSSIBLE. ; 2000$: SYSTEM 2020$ ;;ENTER SYSTEM STATE .IF NDF,X$$HDR MOV $HEADR,R5 ;;GET OUR TASK HEADER .IFF MOV $SAHDB,KISAR6 ;;POINT AT HEADER MOV $SAHPT,R5 ;;VIA APR6 .ENDC MOV H.LUN(R5),R5 ;;GET VE: UCB ADDRESS MOV U.NXT(R5),R0 ;;IS VCB ALLOCATED? BEQ 2010$ ;; IF EQ - YES, ERROR MOV R5,UCBADR ;;SAVE UCB ADDRESS BITB #US.MNT,U.STS(R5) ;;IS DISK MOUNTED? BEQ 2010$ ;; IF EQ - YES, CANNOT DEASSIGN BITB #US.MDM,U.STS(R5) ;;IS DISK BEING DISMOUNTED? BNE 2010$ ;; IF NE - YES, CANNOT DEASSIGN MOV R0,EXTADR ;;SET DISK DEASSIGNED CLR U.NXT(R5) ;;MARK VIRTUAL DISK UNASSIGNED CLR U.CW2(R5) ;;ZERO LENGTH TOO CLR U.CW3(R5) ;;FOR ANY LATER AVE'S BISB #US.OFL,U.ST2(R5) ;; AND SET OFFLINE 2010$: RETURN ;;RETURN TO USER STATE 2020$: TST UCBADR ;WAS DISK ALLOCATED? BNE 2030$ ; IF NE - YES, CONTINUE FATAL ;DECLARE ERROR 2030$: MOV EXTADR,R0 ;WAS EXTENSION BLOCK DEALLOCATED? BNE 3000$ ; IF NE - YES, CONTINUE FATAL ;DECLARE ERROR ; ; UNLOCK VIRTUAL DISK FILE, USING FNB STORED IN EXTENSION BLOCK. ; 3000$: ADD #X.FNB,R0 ;POINT TO FILENAME BLOCK MOV #FILFNB,R4 ;GET OUR FILENAME BLOCK MOV #S.FNB/2,R1 ;GET FILENAME BLOCK WORD SIZE 3010$: MOV (R0)+,(R4)+ ;COPY FILENAME BLOCK SOB R1,3010$ ; AND LOOP TILL DONE SYSTEM 3020$ ;;ENTER SYSTEM STATE MOV EXTADR,R0 ;;GET BACK BLOCK ADDRESS MOV #X.LGTH,R1 ;;GET BLOCK LENGTH CALLR $DEACB ;;DEALLOCATE EXTENSION BLOCK 3020$: MOV FILFNB+N.DVNM,R0 ;GET DEVICE NAME MOV FILFNB+N.UNIT,R1 ;GET UNIT NUMBER ALUN$S #FILLUN,R0,R1 ;ASSIGN DEVICE BCS 3030$ ; IF CS - ERROR .IF NDF,M$VE$$ F11QIO WATDPB,3030$ ;CLEAR UNLOCK BIT .ENDC BR 4000$ ; CONTINUE ON SUCCESS 3030$: .IF NDF,M$VE$$ FATAL ;DECLARE ERROR .ENDC ; ; ALL DONE, EXIT TASK. ; 4000$: EXIT$S ;EXIT TASK .SBTTL ERRSRV * ERROR MESSAGE PROCESSING ; ;+ ; THIS ROUTINE IS ENTERED BY AN SST TRAP INSTRUCTION. IT OUTUTS ; THE ERROR MESSAGE AND EXITS THE TASK. ; ; INPUTS: ; ; THE TRAP CAUSED BY THE FATAL MACRO. THE STACK SHOULD ; BE SETUP AS SHOWN BELOW: ; ; SP+04 PS ; SP+02 PC OF TRAP+2 ; SP+00 TRAP OPERAND*2 ; ; THE TRAP INSTRUCTION IS FOLLOWED BY THE ASCIZ ERROR MESSAGE. ; ; OUTPUTS: ; ; THE ERROR MESSAGE IS OUTPUT TO THE USER'S TERMINAL AND ; THE TASK EXITS. ;- ; ERRSRV: MOV #ERRSTR,R0 ;GET START OF VARIABLE ERROR MOV 2(SP),R1 ;GET START OF ERROR MESSAGE 1100$: MOVB (R1)+,(R0)+ ;MOVE ERROR MESSAGE BNE 1100$ ; AND LOOP IF NOT DONE MOVB #15,-1(R0) ;MOVE IN EXTRA MOVB #12,(R0)+ ;MOVE IN EXTRA SUB #ERRMSG,R0 ;GET LENGTH OF STRING MOV R0,ERRDPB+Q.IOPL+2 ;STORE IN QIO DPB DIR$ #ERRDPB ;ISSUE OUTPUT EXIT$S ;EXIT TASK .END DVE