.TITLE VTXLDR -- MULTIUSER TASK PURE SECTION INITIALIZATION .IDENT /M2602/ ; ; VTXLDR -- INITIALIZE VTECO'S PURE SECTION ; .LIST MEB ; .MCALL RDBBK$,CRRG$,CRAW$,WDBBK$,ATRG$,FDBDF$,FDRC$A,FDBK$A .MCALL FDOP$A,NBOF$L,FDOF$L,FCSBT$,DIR$ .MCALL OFNB$,QIOW$,WSIG$S,GMCR$,CLOSE$ ; .PSECT IMPURE,RW,D ; ; ; VTXRDB::RDBBK$ <4096./32>,0,GEN,,146314 RGNAME == VTXRDB+R.GNAM RDBPRO == VTXRDB+R.GPRO ; CREPUR: CRRG$ VTXRDB ; CWEPUR: CRAW$ VTXWDB ; VTXWDB::WDBBK$ 0,0,0,0,0, ; ATEPUR: ATRG$ VTXRDB ; VTXLUN = 1 ; VTXFDB::FDBDF$ FDRC$A FD.RWM FDBK$A ,512.,, FDOP$A VTXLUN,0,0,FO.RD NBOF$L FDOF$L FCSBT$ ; $X1=. .=VTXFDB+F.FNB+N.FNAM .RAD50 /VTXPUR TSK/ .WORD 0 .=VTXFDB+F.FNB+N.DVNM .IIF NDF,D$$BUG .ASCII /LB/ .IIF DF,D$$BUG .ASCII /SY/ .WORD 0 .=$X1 ; READ: QIOW$ IO.RVB,VTXLUN,1,,RDSTS,,<0,512.,,0,3> ; RDSTS: .WORD 0,0 ; .PSECT VTXLDR,RO,I VTXLDR:: MOVB VTXWDB+W.NAPR,R0 ; Get the APR number from WDB CLRB VTXWDB+W.NID ; Clear out the window ID number ROR R0 ; Make APR number into an address ROR R0 ROR R0 ROR R0 BIC #^C<160000>,R0 ; Mask pertinent bits MOV R0,READ+Q.IOPL ; Stick into disk read function CLR R2 ; Leave marker in R2 17$: DIR$ #ATEPUR ;TRY TO ATTACH REGION BCC 10$ ; If CC, went OK CMP #IE.PNS,@#$DSW ; Else is it in the system? BEQ 20$ ; If not in the system, go make it CMP #IE.UPN,@#$DSW ; Else out of pool space? BNE 15$ ; If not, must be real bad WSIG$S ; If pool problem, wait to clear BR 17$ ; And try again 15$: MOV @#$DSW,R1 ; If bad problem, leave a trace IOT ; And crash the program 10$: MOV R.GSIZ+VTXRDB,W.NSIZ+VTXWDB;PUT REGION SIZE INTO WINDOW SIZE MOV R.GSIZ+VTXRDB,W.NLEN+VTXWDB;AND LENGTH TO MAP MOV R.GID+VTXRDB,W.NRID+VTXWDB;MOVE IN REGION ID MOV #1,R2 ; Mark create window function DIR$ #CWEPUR,ERRC1 ;CREATE WINDOW RTS PC ; 20$: CLR VTXFDB+F.FNB+N.FVER ; Try to open most recent version. OFNB$ #VTXFDB ;OPEN THE PURE SECTION FILE BCC 22$ ; If CC, it went ok MOV #2,R2 ; Mark OPEN for failure MOV VTXFDB+F.ERR,R1 ; Else leave a trace IOT ; And crash 22$: MOV F.HIBK+2(R0),R0 ;GET HIGH BLOCK OF FILE SUB #2,R0 ; Remove file header information MOV R0,R3 ; Hold number of blocks to read ASH #3,R0 ;MAKE INTO MAPPING OFFSET MOV R0,R.GSIZ+VTXRDB ;PUT INTO RDB AS REGION SIZE MOV #3,R2 ; Mark the create region for failure DIR$ #CREPUR,ERRC1 ;CREATE REGION ; MOV R.GSIZ+VTXRDB,W.NSIZ+VTXWDB;PUT REGION SIZE INTO WINDOW SIZE MOV R.GSIZ+VTXRDB,W.NLEN+VTXWDB;AND LENGTH TO MAP MOV R.GID+VTXRDB,W.NRID+VTXWDB;MOVE IN REGION ID MOV #4,R2 ; Mark the create window for failure DIR$ #CWEPUR,ERRC1 ;CREATE WINDOW MOV #3,READ+Q.IOPL+10 ; 60$: DIR$ #READ,ERRC1 ;READ A BLOCK INTO REGION CMPB #IS.SUC,RDSTS ; If CC, check I/O status BEQ 55$ ; If EQ, it went ok MOV #5,R2 ; Leave trace of function MOV RDSTS,R1 ; If bad, leave a trace IOT ; And die 55$: INC READ+Q.IOPL+10 ;BUMP UP BLOCK NUMBER ADD #512.,READ+Q.IOPL ;BUMP UP MEMORY LOC SOB R3,60$ ; Loop until all blocks read CLOSE$ #VTXFDB ; Terminate the FDB RTS PC ; Go back to the caller ; ERRC1: CMP #IE.UPN,@#$DSW ; Check if problem was with pool BNE 10$ ; If NE, must be a bad problem WSIG$S ; Else wait for pool SUB #14,(SP) ; Move PC back to the directive RTS PC ; And go back ; 10$: MOV @#$DSW,R1 ; Leave a trace behind IOT ; And die ; .END