.TITLE VDDRV - VD: DRIVER .SBTTL VDDRV - TITLE PAGE .IDENT /V02.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: V02.00 ; ; AUTHOR: R.W. STAMERJOHN MAPC 15-MAR-79 ; ; MODIFICATION HISTORY: ; ; V02.00 04-APR-80 T. PANG, L. M. FRASER ; ; CONVERT FOR RSX-11M-PLUS OPERATING SYSTEM. ; ; ;********************************************************************** ; ; .PAGE .SBTTL VDDRV - DECLARATIONS ; ; MACRO LIBRARY CALLS: ; .MCALL PKTDF$ ;DEFINE PACKET SYMBOLICS PKTDF$ .MCALL SCBDF$ ;DEFINE SCB SYMBOLICS SCBDF$ .MCALL UCBDF$ ;DEFINE UCB SYMBOLICS UCBDF$ ; ; 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 IO.RLB ;READ LOGICAL BLOCK .PAGE .SBTTL VDDRV - LOCAL DATA ; ; LOCAL DATA: ; ; DEVICE DISPATCH TABLE ; $VDTBL:: ;REF. LABEL DDT$ VD, ,NONE, , ,NEW .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: NOP ; LEAVE ROOM FOR BREAKPOINT GTPKT$ VD,V$$D11,VDXIT ;GET PACKET ; ; BLOCK CHECK FOR VIRTUAL DISK. ; CALL $BLKCK ;BLOCK CHECK PARAMETERS ; ; PARAMETERS OK, CHECK IF ACCESS ALLOWED. ; 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? ; PARSE DOESN'T LIKE THE FOLLOWING WAY OF SETTING READ ONLY ******** ;;;; BIT #DV.SWL,U.CW1(R5) ; IS UNIT WRITE PROTECTED? 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 2020$: CALLR $IOALT ;RETURN PACKET TO USER ; ; POWER FAIL DOES NOT SET 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 $VDINT:: ;NO-OP VDXIT: RETURN ;RETURN TO CALLER ; ; REJECT ALL CONNECT ONLINE/OFFLINE OPERATIONS NOT DONE BY AVD/DVD ; VDKRB: VDUCB: MOVB #IE.ABO,$SCERR ; REJECT MANUAL CONNECT/DISCONNECT ; OPERATIONS RETURN .END