.TITLE FCQ ; PROGRAM FCQ FILE CONTROL BLOCK quick ; WRITTEN BY: FRANK PENNER ; JULY 1979 ; MODIFIED: OCTOBER 1979 DISABLE CONTEXT SWITCHING RSX-11M V3.2 ; August 1983 for M+ ; THIS PRIVILEGED TASK WILL DISPLAY summary info for THE FCB'S FOR ALL ; THE OPEN FILES ON A GIVEN DEVICE ; TO USE, TYPE: ; FCQ DB0: ; WHERE DB0: IS THE DEVICE .MCALL QIOW$,EXIT$S,DIR$,ALUN$ .MCALL TCBDF$,CALL,RETURN,GMCR$ .MCALL DCBDF$,F11DF$,HDRDF$,HWDDF$,PCBDF$,UCBDF$ .MCALL FHDOF$ TCBDF$ ;DEFINE TCB OFFSETS DCBDF$ ;DEFINE DCB OFFSETS F11DF$ ;DEFINE F11 OFSETS (VCB,FCB,WINDOW) HDRDF$ ;DEFINE TASK HEADER OFFSETS HWDDF$ ;DEFINE HARDWARE OFFSETS PCBDF$ ;DEFINE PCB OFFSETS UCBDF$ ;DEFINE UCB OFFSETS GMCR: GMCR$ DEVNAM =GMCR+G.MCRB+4 ;START OF TYPED INPUT DEVICE NAME IOST: .BLKW 2 ;I/O STATUS BLOCK QIODPB: QIOW$ IO.WLB,TLUN,TEFL,,IOST,, TLUN= 5 TEFL= 2 VFC= 40 OUTBUF: .BLKB 256. LUN: ALUN$ DLUN,0,0 DLUN= 1 ARGBLH: .BLKW 2 ;space for open files, LRU HSTRNG: .ASCIZ /Trans Cnt= %M LRU= %M/ .EVEN ARGBLE: .WORD 0 ;ending arg blk POOLF: .WORD 0 ;pool FCBs ACPF: .WORD 0 ;ACP FCBs LRUF: .WORD 0 ;LRU FCBs ESTRNG: .ASCIZ /Total= %M Pool= %M ACP= %M LRU= %M/ .EVEN SAVEM0: .BLKW 1 ;SPACE TO SAVE MEMORY SAVEM1: .BLKW 1 ;MANAGEMENT REGISTERS SAVEM2: .BLKW 1 ;APR'S 0,1, AND 2 F11AP0: .BLKW 1 ;SPACE TO KEEP APR'S F11AP1: .BLKW 1 ;TO MAP F11ACP F11AP2: .BLKW 1 ;FOR VOLUME IN QUESTION .EVEN START: DIR$ #GMCR ;PICK UP COMMAND LINE BCC .+6 ;C CLEAR IS SUCESS JMP ERROR ;GET COMMAND LINE ERROR MOV #DEVNAM,R0 ;PUT ADDRESS OF TYPED INPUT IN R0 MOV (R0)+,LUN+A.LUNA ;PUT TYPE ASCII DEV NAME IN ATT LUN DPB CALL $COTB ;CONVERT ASCII NUM IN R0 BUF ADD TO BIN CMPB #':,R2 ;DEVICE SPEC TERMINATED BY : ? BEQ .+6 ;YES SO PROCEED JMP ERROR ;NO, SO ERROR MOV R1,LUN+A.LUNU ;PUT BINARY DEV UNIT IN ASSIGN LUN DPB DIR$ #LUN ;DO ASSIGN LUN DIRECTIVE BCC .+6 ;C CLEAR MEANS DEVICE IS IN SYSTEM JMP ERROR ;C SET MEANS ERROR MOVB #1,$CXDBL ;DISABLE CONTEXT SWITCHING MOV @#UISDR5,@#UISDR6 ;make 6 look like 5 MOV @#UISAR6,SAVEM0 ;SAVE MEMORY MANAGEMENT REGISTERS MOV $SAHDB,@#UISAR6 ;map task header MOV $SAHPT,R0 ;GET OUR HEADER ADDRESS MOV H.LUN(R0),R1 ;SINCE ASS LUN, 1ST ADD IN LUT IS UCB MOV SAVEM0,@#UISAR6 ;RESTORE MEMORY MANAGEMENT REGISTERS CLRB $CXDBL ;RENABLE CONTEXT SWITCHING BITB #US.MNT,U.STS(R1) ;IS VOLUME MOUNTED BEQ .+6 ;YES, SO CONTINUE JMP ERROR ;NO, SO ERROR MOV U.ACP(R1),R3 ;POINT R3 TO TCB OF ACP OF DEV MOV T.OFF(R3),R2 ;get offset to task image in partition MOV T.PCB(R3),R3 ;POINT R3 TO PCB FOR ACP MOV P.REL(R3),R3 ;GET PHYSICAL START OF ACP ADD R2,R3 ;include offset MOV #F11AP0,R2 ;POINT R2 TO SPACE TO SAVE ACP MAP MOV R3,(R2)+ ;SAVE APR 0 TO MAP F11ACP ADD #200,R3 ;BUMP UP TO NEXT 4K MOV R3,(R2)+ ;ALSO APR 1 ADD #200,R3 ;BUMP UP TO NEXT 4K MOV R3,(R2)+ ;3 APR'S FOR 10K F11ACP MOV U.VCB(R1),R0 ;PUT ADDRESS OF VOLUME CONTROL BLOCK R0 MOV #ARGBLH,R2 ;set address for collection of info MOV V.TRCT(R0),(R2)+ ;grab transaction count MOVB V.LRUC(R0),(R2) ;grab LRU count MOV V.FCB(R0),R1 ;PUT ADDRESS OF 1ST FCB IN R1 CLR R3 ;USE R3 TO COUNT # OF FILES PROLOP: ;BEGINNING OF FCB PROCESSING LOOP INC R3 ;ONE MORE FILE, SO INC TALLY CMP #120000,R1 ;IS ADDRESS OF FCB IN F11ACP ? BHI 2$ ;NO, SO BRANCH INC ACPF ;tally a ACP FCB MOVB #1,$CXDBL ;DISABLE CONTEXT SWITCHING MOV @#UISAR0,SAVEM0 ;SAVE MEMORY MANAGEMENT REGISTERS MOV @#UISAR1,SAVEM1 ;PAR FOR APR'S 0 AND 1 MOV @#UISAR2,SAVEM2 ;AND APR 2 MOV F11AP0,@#UISAR0 ;REMAP TO F11 ACP MOV F11AP1,@#UISAR1 ;THESE WORDS HAVE PAR FOR F11ACP MOV F11AP2,@#UISAR2 ;AND APR 2 FOR 10 K F11ACP MOV @#UISDR1,@#UISDR0 ;make 0 look like 1 SUB #120000,R1 ;SUBTRACT 120000 SO WE USE APR 0 AND 1 JSR PC,FCBSAV ;GO DO SAVE FCB INFORMATION MOV SAVEM0,@#UISAR0 ;RESTORE MEMORY MANAGEMENT REGISTERS MOV SAVEM1,@#UISAR1 ;POINT PAR'S 0 AND 1 BACK TO EXEC MOV SAVEM2,@#UISAR2 ;AND APR 2 CLRB $CXDBL ;RENABLE CONTEXT SWITCHING BR 3$ ;SKIP PAST NO RE-MAP CODE 2$: INC POOLF ;tally a pool FCB JSR PC,FCBSAV ;GO DO SAVE FCB INFORMATION 3$: TST R1 ;IS NEXT FCB A VALID LINK? BNE PROLOP ;NON ZERO SO VALID PTR TO NEXT FCB MOV R3,ARGBLE ;save total number of FCBs MOV #OUTBUF,R0 ;ADDRESS OF OUTPUT BUFFER FOR EDMSG MOV #HSTRNG,R1 ;INPUT STRING FOR EDMSG MOV #ARGBLH,R2 ;PUT ADDRESS OF ARGBLK IN R2 FOR EDMSG CALL $EDMSG ;CALL EDIT MESSAGE ROUTINE MOV R1,QIODPB+Q.IOPL+2 ;SIZE OF MESSAGE TO PRINT DIR$ #QIODPB ;PRINT OUT PRINT HEADING ON TERMINAL PRTLOP: MOV #OUTBUF,R0 ;ADDRESS OF OUTPUT BUFFER FOR EDMSG MOV #ESTRNG,R1 ;INPUT STRING FOR EDMSG MOV #ARGBLE,R2 ;PUT ADDRESS OF ARGBLK IN R2 FOR EDMSG CALL $EDMSG ;CALL EDIT MESSAGE ROUTINE MOV R1,QIODPB+Q.IOPL+2 ;SIZE OF MESSAGE TO PRINT DIR$ #QIODPB ;PRINT OUT PRINT HEADING ON TERMINAL ERROR: EXIT: EXIT$S FCBSAV: ;SAVE FCB SUBROUTINE BIT #FC.DIR,F.NWAC(R1) ;is FCB in LRU? BEQ 1$ ;if equal no INC LRUF ;count an LRU FCB 1$: MOV F.LINK(R1),R1 ;POINT R1 TO NEXT FCB RTS PC ;END OF SAVE FCB SUBROUTINE .END START