The virtual disc software.Summary. In order to simplify file maintenance on the winchester for the PDP-11 computers a virtual disc system has been developed. With this virtual disc system it is possible to maintain several discs on one physical big disc. Furthermore each virt. disc can have its own directory structure; so there are no conflicts between same directories as for instance exist between user software and the RSX release kit. Another advantage is that backups can be made of each induvidual virt. disc so the size of a backup can be kept acceptable. Besides that only virtual discs updated need to be backuped instead of each time the whole disc. The virtual disc driver. On the main disc virtual discs are treated as large files so the room is reserved here. By renaming the directory file of the directory in which the virt. discs are kept these files won't show up in directories. When making a backup of the main disc the backup utility does not see them. The virtual disc driver supports seven virt. discs. The virtual discs can be assigned to a logical device by the program IVD. This program fills the Unit Control Block(UCB) of the driver with location(device), place(offset) and size. Virtual discs can be created by the program CVD. The following code is part of the virtual disc driver. |
; ; DRIVER INITIATOR ENTRY POINT ; RET: RETURN VDINI: CALL $GTPKT ; GET AN I/O PACKET BCS RET ; IF CS NO PACKET CMPB #IO.RLB/256.,I.FCN+1(R1) ;TRANSFER FUNCTION? BHIS 5$ ; IF HIS YES MOV #IE.IFC&377,R0 ; ELSE ILLEGAL FUNCTION CALLR $IOALT ; FINISH I/O 5$: CALL $BLKCK ; CHECK LBN CLRB S.STS(R4) ; CLEAR CONTROLLER BUSY BICB #US.BSY,U.STS(R5) ; CLEAR UNIT BUSY ; ADD #36,R5 ; POINT TO HOST DATA ADD (R5)+,(R1) ; ADD LOW LBN OFFSET ADC -(R1) ; ADD CARRY TO HIGH LBN ADD (R5)+,(R1) ; ADD HIGH LBN OFFSET MOV (R5),R5 ; UCB ADDRESS FOR $DRQRQ MOV R5,I.UCB(R3) ; STORE IN I/O PACKET ALSO MOV R3,R1 ; I/O PACKET ADDRESS FOR $DRQRQ CALL $DRQRQ ; Q I/O TO HOST RETURN ; $VDDAT:: ; REF POINT FOR LOA(D) ; ; DEVICE CONTROL BLOCK (DCB) ; VDDCB: .WORD 0 ; POINTER TO NEXT DCB ; D.LNK .WORD .VD0 ; POINTER TO FIRST UCB ; D.UCB .ASCII /VD/ ; GENERIC DEVICE NAME ; D.NAM .BYTE 0 ; LOW UNIT # FOR DCB ; D.UNIT .BYTE 7 ; HIGH UNIT # ; D.UNIT+1 .WORD VDND-VDST ; LENGHT OF UCB IN BYTES ;D.UCBL .WORD 0 ; ADDRESS DRIVER DISPATCH TABLE ; D.DSP .WORD 177037 ; LEGAL FUNCTION MASKS 0-15 ; D.MSK .WORD 30 ; CONTROL FUNCTION MASKS 0-15 .WORD 0 ; NO-OP'ED FUNCTION MASKS 0-15 .WORD 177000 ; ACP FUNCTION MASKS 0-15 .WORD 377 ; LEGAL FUNCTION MASKS 16-31 .WORD 0 ; CONTROL FUNCTION MASKS 16-31 .WORD 0 ; NO-OP'ED FUNCTION MASKS 16-31 .WORD 377 ; ACP FUNCTION MASKS 16-31 ; .IF DF L$$DRV ; LOADABLE DRIVER SUPPORT? ; .WORD 0 ; ADDR. PARTITION CONTROL BLOCK ; D.PCB ; .ENDC ; ; UNIT CONTROL BLOCK ; VDST=. .IF DF M$$MUP ; MULTI USER SUPPORT ? ; .WORD 0 ; OWNING TERMINAL USB ADDRESS; U.OWN ; .ENDC ; .VD0:: .WORD VDDCB ; BACK POINTER TO DCB ; U.DCB .WORD .-2 ; REDIRECT POINTER ; U.RED ; .BYTE UC.ALG!UC.NPR!1 ; CONTROL FLAG ; U.CTL .BYTE UC.ALG!1 ; CONTROL FLAG ; U.CTL .BYTE US.MNT ; UNIT STATUS ; U.STS .BYTE 0 ; PHYSICAL UNIT # ; U.UNIT .BYTE US.RED!US.OFL ; STATUS EXTENSION ; U.ST2 .WORD DV.DIR!DV.MNT!DV.F11!DV.MSD ; CHARACTERISTICS WORD #1 ; U.CW1 .WORD 0 ; CHARACTERISTICS WORD #2 ; U.CW2 .WORD 0 ; CHARACTERISTICS WORD #3 ; U.CW3 .WORD 512. ; CHARACTERISTICS WORD #4; U.CW4 .WORD $VD0 ; POINTER TO SCB .BLKW 9. VDND=. ; .IF DF M$$MUP ; MULTI USER SUPPORT ? ; .WORD 0 ; OWNING TERMINAL USB ADDRESS; U.OWN ; .ENDC |
The following sample shows part of the code the create a virtual
disc on a physical disk. Note all the macros which build the necessary
data structures. For file IO fdat$a - build attributes during assembly (as opposed to during runtime) fdop$a - build open section during assembly For commandline processing: |
.TITLE CVD .IDENT /V6.0/ ; ;AUTHOR: F. SEMPLONIUS DATE: 22-FEB-88 ; ;FUNCTION: CREATE A VIRTUAL DISC ; ; THE PROGRAM TAKES A COMMANDLINE AS FOLLOWS: ; ; CVD <FILENAME>/BL:XXX ; ; WHERE FILENAME IS THE NAME OF THE VIRTUAL DISC AND HAS TO ; BE USED WITH THE PROGRAM IVD - INITIALIZE VIRTUAL DISC ; XXX IS THE SIZE IN BLOCKS OF THE VIRTUAL DISC ; ; .MCALL FSRSZ$,FDBDF$,FDAT$A,FDBK$A,FDOP$A,FDBF$A,FDRC$A,NMBLK$ .MCALL FINIT$,FDOP$R,WRITE$,OPEN$W,CLOSE$,OPEN$R .MCALL GCMLB$,CSI$,GCML$,CSI$1,CSI$2,CSI$SW,CSI$SV,CSI$ND .MCALL EXIT$S ; ; DATA STRUCTURES - FCB'S ; 000000 FSRSZ$ 0 000000 FDBORG: FDBDF$ ; DEFINE WORK FCB 000140 FDAT$A R.FIX,,512. 000140 FDBK$A LSTBLK,512. 000140 FDOP$A 1,,DFDEV ; LUN 1 000140 FDBF$A 3 ; EFENT FLAG 3 000140 FDRC$A FD.RWM ; [ part deleted ] 000220 FDBDSR: FDBDF$ ; FDB DESIRED FILENAME -> [0,0]111111.DIR 000360 FDAT$A R.FIX,,512. 000360 FDOP$A 2,DSRDST,DFDEV ; LUN 2 000360 FDBF$A 2 ; EFENT FLAG 2 ; 000360 000000 000000 DSRDST: .WORD 0,0 000364 000005 000154' .WORD DIRS,DIR 000370 000014 000173' .WORD DFILS,DFIL ; 000374 DFDEV: NMBLK$ ; DEF. DEVICE / FILETYPE FOR VIRT. DISC FILENAME ; 000432 124 110 111 LSTBLK: .ASCII /THIS IS THE LAST BLOCK/ 001432' .=LSTBLK+512. ; ; DATA STRUCTURES FOR COMMAND LINE PROCESSING ; 001432 GCL: GCMLB$ ,CVD,,5 ; USE LUN 5 002022 CSI$ 002022 CSI: .BLKB C.SIZE .EVEN ; 002076 SWTBL: CSI$SW BL,1,,,,VLTBL 002106 CSI$ND 002110 VLTBL: CSI$SV DECIMAL,BLKS,4 002114 BLKS: .BLKW 2 002120 WBLK: .BLKW 2 ; ; HERE STARTS THE PROGRAM CODE ; .ENABL LSB 002124 START: FINIT$ ; INITIALIZE FILE SYSTEM 002130 012704 002706' MOV #MESGCL,R4 002134 GCML$ #GCL ; GET THE COMMANDLINE 002150 103461 BCS ERR1 002152 CSI$1 #CSI,GCL+G.CMLD+2,GCL+G.CMLD ; PARSE COMMANDLINE 002176 103446 BCS ERR1 002200 CSI$2 ,OUTPUT,#SWTBL ; GET FILENAME 002216 103436 BCS ERR1 002220 032767 000001 177620 BIT #1,CSI+C.MKW1 ; BL SWITCH PRESENT ? 002226 001432 BEQ ERR1 ; IF EQ NO 002230 016700 177660 MOV BLKS,R0 ; SIZE SPECIFIED ? 002234 056700 177656 BIS BLKS+2,R0 002240 001425 BEQ ERR1 ; IF EQ NO 002242 012704 002743' MOV #MESDIR,R4 002246 005767 177562 TST CSI+C.DIRD 002252 001020 BNE ERR1 ; DIRECTORY NOT ALLOWED 002254 012700 000000' MOV #FDBORG,R0 ; SET UP FOR .PRSDV - FDB 002260 012701 000374' MOV #DFDEV,R1 ; FNBL TO BE FILLED IN 002264 012702 002030' MOV #CSI+C.DSDS,R2 ; DATASET DESCRIPTOR 002270 005003 CLR R3 ; DEFAULT FNBL - NOT NEEDED 002272 012704 003007' MOV #MESDEV,R4 002276 004767 000000G CALL .PRSDV ; INIT DEFAULT DEVICE 002302 103404 BCS ERR1 002304 022761 042126 000032 CMP #"VD,N.DVNM(R1) ; DON'T CREATE VIRT. DISC ON A VIRT. DISC 002312 001002 BNE 1$ 002314 000167 000326 ERR1: JMP ERROR 002320 012761 014474 000014 1$: MOV #^RDAT,N.FTYP(R1) ; SET UP DEFAULT .DAT;1 002326 012761 000001 000016 MOV #1,N.FVER(R1) |
|