.TITLE CNTFCB - COUNT FILE CONTROL BLOCKS .IDENT "0003" ; ; MODULE: FILES-11 ACTIVITY REPORTING TASK -- COUNT FILE CONTROL BLOCKS ; ; VERSION: 0003 ; ; AUTHOR: ANDY PUTNINS ; ; DATE: 20-NOV-78 ; ; MODIFICATIONS: ; 14-DEC-78 A. PUTNINS ADD FILE ATTRIBUTES LOGIC ; 10-APR-79 A. PUTNINS USE DYNAMIC MEMORY FEATURE ; ; PURPOSE: ; COUNT THE NUMBER OF PRIMARY FILE CONTROL BLOCKS FOR THIS VCB (EXCLUDING ; FILE HEADER EXTENSION FCB'S). SUBTOTALS OF FCB'S ALLOCATED IN THE ACP, IN ; FCPCOM, AND IN SCOM ARE ALSO TALLIED. EACH FCB POINTER IS CHECKED FOR ; "REASONABLENESS", MEANING THAT IT IS WITHIN THE ADDRESS LIMITS OF THE ACP, ; FCPCOM, OR SCOM. THE FCB LIST IS NOT CHECKED FOR CIRCULARITY OTHER THAN ; ENSURING THAT A POINTER DOESN'T POINT TO ITSELF. ; ; IF THE USER WANTS A LIST OF OPEN FILES FOR A SPECIFIC DEVICE OR FOR ALL ; DEVICES, WE ALLOCATE FILE ATTRIBUTE BLOCKS AND SAVE THE FILE ID'S. (WE ; CANNOT READ THE FILE ATTRIBUTES WITH ACP QIO'S UNTIL OUR RUN PRIORITY ; IS BACK TO NORMAL.) ; ; INPUTS: ; R1=ATL ENTRY ADDR ; R2=VCB ADDR ; R5=ADDR OF STATISTICS BLOCK ENTRY ; THIS TASK MUST BE RUNNING AT A HIGHER PRIORITY THAN ANY ACP'S ; ; OUTPUTS: ; CARRY SET IF FCB POINTER ERROR ; ; REGISTER USAGE: ; R0=ADDR OF FILE ATTRIBUTES BLOCK ENTRY ; R1=ATL ADDR ; R2=VCB ADDR ; R3=CURRENT FCB ADDR ; R4=PREVIOUS FCB ADDR ; R5=ADDR OF STATISTICS BLOCK ENTRY ; .MCALL F11DF$ F11DF$ ;DEFINE ACP DATA STRUCTURE OFFSETS .PAGE .PSECT CNTFCB,RO,I CNTFCB:: PUSH BIT #SW.FI,SWMASK ;DOES USER WANT ALL FILES LISTED? BEQ 10$ BIS #F.FI,.SBFLG(R5) ;YES - SET FLAG IN STAT BLOCK 10$: MOV V.FCB(R2),R3 ;MAKE FIRST FCB THE CURRENT ONE CLR R4 ;NO PREVIOUS NXTFCB: TST R3 ;END OF LIST? BNE 10$ ;NO JMP NORMAL ;YES - ALL DONE 10$: CMP R3,R4 ;HAVE WE JUST BEEN HERE? BNE 20$ 15$: JMP ERROR ;YES - POINTER ERROR 20$: MOV R3,R4 ;NO - SET PREVIOUS = CURRENT FCB ; ; ALLOCATE AND INITIALIZE FILE ATTRIBUTE BLOCK, IF NEEDED ; BIT #F.FI,.SBFLG(R5) ;LIST FILES FOR THIS DEVICE? BEQ 30$ ;NO PUSH MOV R5,R4 ;POINT TO ATTRIBUTE BLOCK LISTHEAD ADD #LH.AB,R4 ;... MOV #L.AB,R3 ;LENGTH OF ATTRIBUTE BLOCK CALL ADDQ ;ALLOCATE & INITIALIZE ATTRIB BLOCK MOV R5,R0 ;R0=ADDR OF ATTRIB BLOCK POP BCC 40$ ;NO MORE SPACE? BIS #F.NFAT,.SBFLG(R5) ;YES - SET FLAG IN STAT BLOCK 30$: CLR R0 ;SHOW NO ATTRIB BLOCK ; ; FCB ALLOCATED FROM SCOM ; 40$: TST R3 ;IS FCB IN SCOM? BPL 70$ ;NO IF SIGN BIT CLEAR CMP R3,.POLBE ;BELOW BEGINNING OF SCOM? BLO 15$ ;YES - POINTER ERROR CMP R3,.PUDBA ;ABOVE SCOM NODE POOL? BHI 15$ ;YES - ERROR BIT #FC.DIR,F.STAT(R3) ;IS THIS A PRE-ACCESSED DIRECTORY FCB? BEQ 50$ ;NO INC C.LRU(R5) ;YES - BUMP COUNT 50$: INC C.SFCB(R5) ;BUMP SCOM SUBTOTAL ADD #</8.>,SCALLO ;BUMP COUNT OF SCOM NODES TST R0 ;DO WE HAVE AN ATTRIBUTE BLOCK ENTRY? BEQ 60$ ;NO IF ZERO BIS #F.SCM,.ABFLG(R0) ;YES - SET SCOM FLAG MOV F.FNUM(R3),.FNUM(R0) ;AND SAVE FILE ID MOV F.FSEQ(R3),.FSEQ(R0) BIT #FC.DIR,F.STAT(R3) ;PREACCESSED DIRECTORY? BEQ 60$ ;NO BIS #F.DIR,.ABFLG(R0) ;YES - SET FLAG IN ATTRIB BLOCK 60$: MOV (R3),R3 ;GET NEXT FCB BR 140$ ;UPDATE GRAND TOTAL ; ; FCB ALLOCATED FROM FCPCOM ; 70$: CMP R3,#.FRLH ;ABOVE BEGINNING OF FCPCOM? BLO 100$ ;NO - CHECK ACP INTERNAL AREA CMP R3,#.F1END ;BELOW END OF FCPCOM? BHI ERROR ;NO - POINTER ERROR BIT #FC.DIR,F.STAT(R3) ;PRE-ACCESSED DIRECTORY? BEQ 80$ ;NO INC C.LRU(R5) ;YES - COUNT IT 80$: INC C.FFCB(R5) ;BUMP FCPCOM SUBTOTAL TST R0 ;DO WE HAVE AN ATTRIB BLOCK ENTRY? BEQ 90$ ;NO BIS #F.FCM,.ABFLG(R0) ;YES - SET FCPCOM FLAG MOV F.FNUM(R3),.FNUM(R0) ;AND SAVE FILE ID MOV F.FSEQ(R3),.FSEQ(R0) BIT #FC.DIR,F.STAT(R3) ;PREACCESSED DIRECTORY? BEQ 90$ ;NO BIS #F.DIR,.ABFLG(R0) ;YES - SET FLAG IN ATTRIB BLOCK 90$: MOV (R3),R3 ;GET NEXT FCB BR 140$ ;UPDATE GRAND TOTAL ; ; FCB ALLOCATED FROM ACP INTERNAL AREA ; 100$: MOV #77402,-(SP) ;PDR CONTENTS FOR READ-ONLY ACCESS MOV A.HA(R1),-(SP) ;MAP APR3 OVER ACP TASK HEADER CALL ..SPD3 ; PUSH ;SAVE ATL, FCB, AND OLD FCB ADDRS MOV R3,R2 ;VIRTUAL ADDR OF FCB IN R3 MOV #F.LGTH,R3 ;LENGTH OF FCB CALL ..VVAD ;VERIFY VIRTUAL ADDRESS BCC 110$ ;OK - ENTIRE FCB IN ACP'S ADDRESS SPACE POP ;ERROR - RESTORE REGS AND MAPPING CALL ..SPD3 CMP (SP)+,(SP)+ BR ERROR ;POINTER ERROR 110$: MOV 2(SP),R2 ;CURRENT FCB VIRTUAL ADDR IN R2 CALL ..ADDC ;GET PAR VALUE IN R2 AND OFFSET IN R3 MOV #1002,-(SP) ;PDR CONTENTS TO MAP 2 BLOCKS FOR RO ACCESS MOV R2,-(SP) ;REAL MEMORY BLOCK # CALL ..SPD3 ;MAP TO START OF FCB CMP (SP)+,(SP)+ ;DISCARD ACP HEADER MAPPING REGS BIT #FC.DIR,60000+F.STAT(R3) ;PRE-ACCESSED DIRECTORY? BEQ 120$ ;NO INC C.LRU(R5) ;YES 120$: INC C.AFCB(R5) ;BUMP ACP INTERNAL SUBTOTAL TST R0 ;DO WE HAVE AN ATTRIB BLOCK ENTRY? BEQ 130$ ;NO BIS #F.ACP,.ABFLG(R0) ;YES - SET ACP INTERNAL FLAG MOV 60000+F.FNUM(R3),.FNUM(R0) ;AND SAVE FILE ID MOV 60000+F.FSEQ(R3),.FSEQ(R0) BIT #FC.DIR,60000+F.STAT(R3) ;PREACCESSED DIRECTORY? BEQ 130$ ;NO BIS #F.DIR,.ABFLG(R0) ;YES 130$: MOV 60000(R3),2(SP) ;NEXT FCB POP ;RESTORE REGISTERS CALL ..SPD3 ;REMAP TO FCPCOM CMP (SP)+,(SP)+ ;DISCARD ACP MAPPING REGS ; ; UPDATE GRAND TOTAL AND LOOP FOR NEXT FCB ; 140$: INC C.TFCB(R5) ;INCREMENT GRAND TOTAL OF FCB'S JMP NXTFCB ;CHECK THE NEW FCB NORMAL: CLC ;NORMAL RETURN POP RETURN ERROR: SEC ;ERROR RETURN RETURN .END