.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: ; ; NONE TO DATE .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 .SBTTL VDDRV - LOCAL DATA ; ; LOCAL DATA: ; ; DEVICE DISPATCH TABLE ; $VDTBL:: ;REF. LABEL .WORD VDINI ;DEVICE INITIATOR .WORD VDCAN ;CANCEL I/O .WORD VDTMO ;DEVICE TIMEOUT .WORD VDPWF ;POWER RECOVERY .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. ; 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 2020$: CALLR $IOALT ;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 VDTMO: ;NO-OP VDXIT: RETURN ;RETURN TO CALLER .END