.TITLE DVD - DEASSIGN VIRTUAL DISK .SBTTL DVD - TITLE PAGE .IDENT /V02.00/ .ENABL LC ; ; ************************************************************************ ; * ; 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: ; ; R. B. DENNY CSD 08-JUL-82 ; ; Make error messages lower case per 'M V4.0 ; U.NXT and U.UFD defined globally in VDTBL.MAC ; ; R. B. DENNY CSD 10-AUG-82 ; ; Add error logging of deassigns. ; .PAGE .SBTTL Error Logger Data Subpacket Description ; ; ***************************************** ; * RSX-11M V4.0 Error Logger Interface * ; ***************************************** ; ; DVD now communicates with the RSX-11M V4.0 Error Logger via a non-DEC ; packet type, 9. By choosing to make the packet type non-DEC, I avoided ; massive edits of DEC ".CNF" files. Instead, since the "DISPATCH.CNF" ; module calls a packet processing module based on the packet type code ; (E$HTYC in the header subpacket), all I had to do was to modify DISPATCH ; to accept a code of 9, which I have dubbed "Special System Information". ; I then created a brand new packet processing module, DSP9M1.CNF, in which ; the Subpacket types are defined, along with their corresponding data ; subpacket structures. The SMSG$ directive works just dandy for generating ; error logger packets with user-defined data subpacket structures (the ; "message" referred to in the SMSG documentation is really the data ; subpacket contents, but it's not obvious. Read ERROR.MAC in the exec!). ; I could go on about this for a lot longer, but if you'll generate listings ; of DISPATCH.CNF, DSP9M1.CNF and a few other CNF modules, and look over ; this code, you ought to get the drift of the fine points. ; ; (Bob Denny) ; ; The following is extracted from SPCCTL.MAC, which I usually keep in [1,6] ; along with the current versions of DISPATCH (shouldn't have to change ; unless DEC decides to use packet type 9), and DSP9M1, to which I seem to ; keep adding new subtypes for various of my own purposes, like for our ; "special" ACP's (File Server, Virtual Ethernet, etc.). You could just ; delete all of this and assemble DVD with SPCCTL.MAC. ; ; ; Define the "Special System Information" Packet Type ; E$CSSI == 9. ; Code for E$HTYC == "Special System Info" ; ; Define the Special System Info Packet subtypes, in offset E$HTYS of ; the header subpacket. ; E$SAVD == 1 ; Assign Virtual Disk E$SDVD == 2 ; Deassign Virtual Disk E$SAC1 == 3 ; ACP Startup (issued by ENABLE) E$SAC2 == 4 ; ACP Shutdown (issued by DISABL) E$SAC3 == 5 ; ACP Service Message (Issued by special ACP) .PAGE ; ; Data Subpacket for Assign/Deassign Virtual Disk ; ; ** SUBTYPE = E$SAVD & E$SDVD ** ; ; |-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-| ; VD.VDS | Operation flags (AVD only) | (0) ; |-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-| ; VD.PDV | Physical Device/Unit | (2) ; |- -|- -| ; | (6 bytes ASCII) | ; |- -|- -| ; | | ; |-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-| ; VD.PFL | Physical File Spec | (10) ; |- -|- -| ; | (32(10) bytes ASCII) | ; |- -|- -| ; | | ; \ \ ; \ \ ; | | ; |-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-| ; VD.CRE | Creation size, blocks | (50) ; |- -| ; | (32-bits, only if VD.CR set) | ; |-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-| ; VD.PLC | Placement LBN | (54) ; |- -| ; | (32-bits, only if VD.PL set) | ; |-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-| ; ; Length of data subpacket = VD.LEN = 60(8) ; ; ; Define the data subpacket for E$SAVD and E$SDVD ; VD.VDS == 0 ; AVD operation flags (see below) VD.PDV == 2 ; Physical Device/Unit (6 bytes ASCII w/":") VD.PFL == 8. ; Physical File Spec (32 bytes) VD.CRE == 40. ; Creation Size (32 bits) (if VD.CR set) VD.PLC == 44. ; Placement LBN (32 bits) (if VD.PL set) VD.LEN == 48. ; Length of data subpacket ; ; Define bits for VD.VDS ; VD.RO == 000001 ; Assigned Read-Only VD.CR == 000002 ; File created by AVD VD.PL == 000004 ; File created with placement control .PAGE .SBTTL DVD - 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 .IF DF E$$LOG .MCALL SMSG$ ; SEND ERROR LOGGER MESSAGE .ENDC ; ; GLOBAL DECLARATIONS: ; .GLOBL DVD ;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 .IF DF E$$LOG .GLOBL $CBTMG ; CONVERT DEVICE UNIT .GLOBL .PPASC ; CONVERT UIC .GLOBL $EDMSG ; CONVERT FILENAME .ENDC ; ; SPECIAL UCB EXTENSION WORDS ; .GLOBL U.NXT ;VIRTUAL EXTENSION UCB OFFSET .GLOBL U.UFD ;FILE UIC IN UCB ; ; RSX11M SYSTEM ROUTINES, VARIABLES. ; .GLOBL $DEACB ;DEALLOCATE CORE BLOCK .GLOBL $HEADR ;CURRENT TASK HEADER ADDRESS .SBTTL DVD - 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 DVD - LOCAL DATA ; ; LOCAL SYMBOLS: ; ; LOGICAL UNITS/EVENT FLAGS. ; TSTLUN = 1 ;DVD 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,,,, .IF DF E$$LOG ; ; Directive to create an error log packet, specifying ; the contents of the data subpacket, and signalling ; that the Device Information subpacket is to be included ; per the device assigned to TSTLUN (the VD: device!). ; ERLDPB: SMSG$ SM.SER,ERLMSG,VD.LEN, ; ; Data Subpacket buffer ; ERLMSG: .BLKB VD.LEN ; ; Formatting string for filespec ; FMT1: .ASCIZ "%X" .ENDC ; ; ERROR MESSAGE STRING. ; ERRMSG: .ASCIZ <15><12>/DVD -- / 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 ;VD: UCB ADDRESS EXTADR: .WORD 0 ;VIRTUAL EXTENSION BLOCK ADDRESS .IF DF E$$LOG UIC: .WORD 0 ; UIC OF FILE .ENDC .SBTTL DVD * MAIN-LINE TASK CODE ; ;+ ; THIS SECTION CONTAINS THE ENTRY LEVEL CODE FOR THE DVD 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. ; ; DVD VDN: ; ; VDN: VIRTUAL DISK TO DEASSIGN. ; ; OUTPUT: ; ; VIRTUAL DISK DEASSIGNED FROM FILE OR ERROR MESSAGE ; OUTPUT TO USER'S TERMINAL. ; ;- ; DVD:: ;REF. LABEL. ; ; SETUP SST VECTOR TABLE FOR PROCESSING. ; SVTK$S #SSTTBL,#SSTSIZ ;SETUP SST VECTOR TABLE ; ; ZERO VARIOUS VARIABLES. ; CLR UCBADR ;CLEAR VDN: 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 VDX:. ; 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 #'D,(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,#"VD,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 MOV $HEADR,R5 ;;GET OUR TASK HEADER MOV H.LUN(R5),R5 ;;GET VD: 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 .IF DF E$$LOG MOV U.UFD(R5),UIC ;; SAVE UIC FOR FORMATTING .ENDC CLR U.NXT(R5) ;;MARK VIRTUAL DISK UNASSIGNED 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$: .IF DF E$$LOG ; ; Fill in the Data Subpacket and send the packet to error logger ; MOV #ERLMSG,R0 ; R0 --> SUBPACKET BUFFER CLR (R0)+ ; CLEAR THE FLAGS WORD CALL FILSPC ; FORMAT THE FILE SPEC DIR$ #ERLDPB ; SEND THE MESSAGE .ENDC 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 F11QIO WATDPB,3030$ ;CLEAR UNLOCK BIT BR 4000$ ; CONTINUE ON SUCCESS 3030$: FATAL ;DECLARE ERROR ; ; ALL DONE, EXIT TASK. ; 4000$: EXIT$S ;EXIT TASK .IF DF E$$LOG .SBTTL FILSPC - Format full file specification ;+ ; FILSPC: Subroutine - Format "DDnnn:[g,m]filename.ext;ver" ; ; The device unit number is converted with 3 digits, leading ; zeroes, as required for the error logger packet. ; ; Inputs: ; R0 --> buffer ; ; Outputs: ; R0 --> first cell after formatted filespec ; Uses R1, R2, R3 ;- FILSPC: MOV #FILFNB+N.DVNM,R1 ; R1 --> ASCII DEVICE NAME MOVB (R1)+,(R0)+ ; COPY TO OUTPUT MOVB (R1)+,(R0)+ ; R1 --> UNIT NUMBER MOVB (R1),R1 ; R1 = UNIT NUMBER MOV #1,R2 ; NO ZERO SUPRESSION CALL $CBTMG ; CONVERT TO 3 DIGIT OCTAL MOVB #':,(R0)+ ; ADD A ":" MOV R0,R2 ; R2 --> 1ST CELL PAST DEVICE NAME MOV UIC,R3 ; R3 = UIC OF ASSIGNED FILE CLR R4 ; SIGNAL .PPASC TO INCLUDE "[ , ]" CALL .PPASC ; CONVERT. R2 --> FIRST FREE CELL MOV R2,R0 ; R0 --> FIRST FREE CELL AFTER UIC STR. MOV #FMT1,R1 ; R1 --> FILE NAME FORMAT STRING MOV #FILFNB+N.FNAM,R2 ; R2 --> ARGBLK (FNB) CALLR $EDMSG ; FORMAT OUTPUT, RETURN .ENDC .PAGE .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 DVD