.TITLE VDDRV - VD: DRIVER .SBTTL VDDRV - 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 * ; * ; ************************************************************************ ; ; VD: (VIRTUAL DISK) DEVICE DRIVER. ; ; VERSION: V01.00 ; ; AUTHOR: R.W. STAMERJOHN MAPC 15-MAR-79 ; ; MODIFICATION HISTORY: ; ; R.S. MEARNS, INFORMATICS INC. 30-MAR-81 ; MODIFIED TO RUN UNDER RSX-11/M+ V1.0 ; ALL CHANGES ASSOCIATED WITH 11M+ ARE DENOTED BY ; CONDITIONAL ASSEMBLY BASED ON THE SYMBOL 'R$$MPL'. ; ; R.S. MEARNS 30-MAR-81 ; ADDED VD: UNIT OFFLINE TEST. THIS IS NECESSARY IN ORDER ; TO PREVENT A SYSTEM CRASH WHEN A VD: UNIT (VD1: IN THIS ; EXAMPLE) IN ACCESSED UNDER CIRCUMSTANCES SIMILAR TO THE ; FOLLOWING SCENARIO: 1) VD0: IS ASSIGNED (W/ AVD) AND ; MOUNTED, THEN 2) VD1: IS ASSIGNED ON VD0: AND MOUNTED, ; AND FINALLY 3) VD0: IS DISMOUNTED AND DEASSIGNED (W/DVD). ; .SBTTL VDDRV - DECLARATIONS ; ; MACRO LIBRARY CALLS: ; .MCALL PKTDF$ ;DEFINE PACKET SYMBOLICS PKTDF$ .MCALL SCBDF$ ;DEFINE SCB SYMBOLICS SCBDF$ .MCALL UCBDF$ ;DEFINE UCB SYMBOLICS UCBDF$ .IF DF,R$$MPL .MCALL DDT$ ;DEFINE DRIVER DISPATCH TABLE .ENDC ; ; GLOBAL DECLARATIONS: ; .GLOBL $VDTBL ;DRIVER DISPATCH TABLE ; ; GLOBAL REFERENCES: ; .GLOBL $BLKCK ;BLOCK CHECK I/O FUNCTION .GLOBL $DRQRQ ;QUEUE I/O REQUEST .GLOBL $GTPKT ;GET I/O PACKET ROUTINE .GLOBL $IOALT ;FINISH I/O PACKET .GLOBL IE.IFC ;ILLEGAL FUNCTION CODE .GLOBL IE.WLK ;DEVICE WRITE LOCKED .GLOBL IE.OFL ;DEVICE OFFLINE .GLOBL IO.RLB ;READ LOGICAL BLOCK .SBTTL VDDRV - LOCAL DATA ; ; LOCAL DATA: ; ; DEVICE DISPATCH TABLE ; .IF NDF,R$$MPL ;FOR RSX11M ------------------------- $VDTBL:: ;REF. LABEL .WORD VDINI ;DEVICE INITIATOR .WORD VDCAN ;CANCEL I/O .WORD VDOUT ;DEVICE TIMEOUT .WORD VDPWF ;POWER RECOVERY .IFF ;FOR RSX11M+ ------------------------ DDT$ VD,0,NONE,,,NEW .ENDC ;----------------------------------- .SBTTL VDDRV * DRIVER CODE ; ; THIS DRIVER MEARLY RELOCATES THE LOGICAL BLOCK TO THE REAL LOGICAL ; BLOCK WITHIN THE DISK. THE MCR TASK AVD IS USED TO SETUP THE UCB ; FOR THIS OPERATION. ; VDINI: CALL $GTPKT ;GET PACKET BCS VDXIT ; IF CS - NO PACKET ; ; BLOCK CHECK FOR VIRTUAL DISK. ; CALL $BLKCK ;BLOCK CHECK PARAMETERS ; ; PARAMETERS OK, CHECK IF ACCESS ALLOWED. ; BITB #US.OFL,U.ST2(R5) ;IS UNIT OFFLINE? ;RSM BNE 2015$ ; IF NE - YES, ERROR ;RSM MOV U.NXT(R5),R0 ;GET EXTENSION BLOCK ADDRESS CMPB #IO.RLB/400,I.FCN+1(R3) ;CHECK FOR LEGAL FUNCTION BLO 2000$ ; IF LO - BAD FUNCTION BEQ 1000$ ;SKIP WRITE CHECK BIT #XF.RON,X.FLG(R0) ;IS WRITE ACCESS ALLOWED? BNE 2010$ ; IF NE - NO, ERROR 1000$: ADD X.OFF+2(R0),(R1) ;ADD IN LOW OFFSET ADC -(R1) ; IN DOUBLE PRECISION ADD X.OFF+0(R0),(R1) ;ADD IN HIGH OFFSET ; ; MARK THIS DRIVER NOT BUSY AND QUEUE PACKET TO NEXT DEVICE. ; BICB #US.BSY,U.STS(R5) ;CLEAR UCB BUSY CLRB S.STS(R4) ;CLEAR SCB BUSY MOV R3,R1 ;COPY PACKET ADDRESS MOV X.UCB(R0),R5 ;GET NEXT UCB CLR I.LNK(R1) ;CLEAR LINK WORD MOV R5,I.UCB(R1) ;SET NEW UCB CALLR $DRQRQ ;QUEUE TO REAL DRIVER ; ; RETURN ERRORS TO USER. ; 2000$: MOV #IE.IFC&377,R0 ;SET ERROR CODE BR 2020$ ; CONTINUE 2010$: MOV #IE.WLK&377,R0 ;SET ERROR CODE BR 2020$ ; CONTINUE ;RSM 2015$: MOV #IE.OFL&377,R0 ;SET ERROR CODE ;RSM 2020$: BICB #US.BSY,U.STS(R5) ;CLEAR UCB BUSY CLRB S.STS(R4) ;CLEAR SCB BUSY CLR R1 ;CLEAR 2ND I/O STATUS WORD CALLR $IOFIN ;RETURN PACKET TO USER ; ; POWER FAIL SETS UCB OFFLINE. ALL OTHER DRIVER ENTRIES ARE NO-OP'S. ; VDPWF: BISB #US.OFL,U.ST2(R5) ;MARK DRIVE OFFLINE VDCAN: ;NO-OP VDOUT: ;NO-OP VDKRB: ;CNTROLLER STAT CHNG (NO-OP, NO-CTLR!) VDUCB: ;UNIT STATUS CHANGE (NO-OP) VDXIT: RETURN ;RETURN TO CALLER .END