.TITLE FCB ; PROGRAM FCB FILE CONTROL BLOCK ; WRITTEN BY: FRANK PENNER ; JULY 1979 ; MODIFIED: OCTOBER 1979 DISABLE CONTEXT SWITCHING RSX-11M V3.2 ; THIS PRIVILEGED TASK WILL DISPLAY THE FCB'S FOR ALL ; THE OPEN FILES ON A GIVEN DEVICE ; TO USE, TYPE: ; FCB 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 FHDOF$ DEF$L ;DEFINE FILE-HEADER BLOCK OFFSETS LOCAL 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 132. READLB: QIOW$ IO.RLB,DLUN,DEFL,,IOST,, DLUN= 1 DEFL= 1 BLKH= 0 BLKL= 1 LEN= 512. HEDBUF: .BLKB 512. LUN: ALUN$ DLUN,0,0 MAX=100. ;MAX OF 40 OPEN FILES ARGBLK: .BLKW MAX*11. ;11 WORDS FOR EACH ARGBLK PACKET ISTRNG: .ASCIZ /%45<%40<%35<%16<%P%S[%O,%O]%16>%X%35>%M%40>%M%45>%M/ PRTHED: .ASCII /FCB ADD ACC LOCK WRIT/ PRTHES=.-PRTHED .EVEN UISAR1 =177642 ;DEFINE SYMBOL FOR USER APR 1 UISAR2 =177644 ;AND USER APR 2 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 MOV $HEADR,R0 ;GET OUR HEADER ADDRESS MOV H.LUN(R0),R1 ;SINCE ASS LUN, 1ST ADD IN LUT IS UCB 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.PCB(R3),R3 ;POINT R3 TO PCB FOR ACP MOV P.REL(R3),R3 ;GET PHYSICAL START OF ACP 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 V.FCB(R0),R1 ;PUT ADDRESS OF 1ST FCB IN R1 MOV #ARGBLK,R2 ;PUT ADDRESS OF ARGBLK IN R2 CLR R3 ;USE R3 TO COUNT # OF FILES PROLOP: ;BEGINNING OF FCB PROCESSING LOOP INC R3 ;ONE MORE FILE, SO INC TALLY MOV R1,(R2)+ ;PUT FCB ADDRESS IN ARGBLK CMP #120000,R1 ;IS ADDRESS OF FCB IN F11ACP ? BHI 2$ ;NO, SO BRANCH 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 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$: 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 DIR$ #QIODPB ;PRINT OUT PRINT HEADING ON TERMINAL MOV #OUTBUF,QIODPB+Q.IOPL ;PUT ADDRESS OF OUTPUT BUFFER IN DPB MOV #ARGBLK,R2 ;PUT ADDRESS OF ARGBLK IN R2 FOR EDMSG PRTLOP: TST (R2)+ ;BUMP ARGBLK PTR PAST FCB ADDRESS MOV (R2)+,READLB+Q.IOPL+6. ;PUT HIGH BLOCK # IN DPB MOV (R2),READLB+Q.IOPL+8. ;PUT OTHER LOW BLOCK # IN DPB TST -(R2) ;BACK UP ARGBLK POINTER DIR$ #READLB ;READ FILE HEADER BLOCK MOVB HEDBUF+H.PROJ,(R2)+ ;PUT PROJECT # IN ARG BLK MOVB #0,(R2)+ ;ROUND ARGBLK POINTER TO EVEN WORD MOVB HEDBUF+H.PROG,(R2)+ ;PUT PROGRAMMER # IN ARG BLK MOVB #0,(R2)+ ;ROUND ARGBLK POINTER TO EVEN WORD MOV #HEDBUF+S.HDHD,R0 ;PUT ADDRESS OF FILESPEC IN R0 MOV #5,R1 ;PUT # OF WORDS TO TRANSFER IN R1 1$: MOV (R0)+,(R2)+ ;FILESPEC FROM HEADER BLK TO ARGBLK SOB R1,1$ ;DO WHOLE FILESPEC SUB #16.,R2 ;RESET R2 TO BEGINNING OF PACKET MOV #OUTBUF,R0 ;ADDRESS OF OUTPUT BUFFER FOR EDMSG MOV #ISTRNG,R1 ;INPUT STRING FOR EDMSG CALL $EDMSG ;CALL EDIT MESSAGE ROUTINE MOV R1,QIODPB+Q.IOPL+2 ;SIZE OF MESSAGE TO PRINT DIR$ #QIODPB ;PRINT OUT INFO ON TERMINAL SOB R3,PRTLOP ;PRINT OUT ALL LUNS ERROR: EXIT: EXIT$S FCBSAV: ;SAVE FCB SUBROUTINE MOV F.HDLB(R1),(R2)+ ;SAVE HIGH HEADER-BLOCK # IN ARGBLK MOV F.HDLB+2(R1),(R2)+ ;SAVE LOW HEADER-BLK # IN ARGBLK ADD #10.,R2 ;SKIP 5 WORDS OF ARG BLK MOVB F.NACS(R1),(R2)+ ;SAVE ACCESS COUNT IN ARGBLK TSTB (R2)+ ;POINT ARGBLK TO WORD MOVB F.NLCK(R1),(R2)+ ;SAVE # OF LOCKS COUNT TSTB (R2)+ ;POINT ARGBLK TO WORD MOVB F.NWAC(R1),(R2)+ ;SAVE # OF WRITE ACCESSORS TSTB (R2)+ ;POINT ARGBLK TO WORD MOV F.LINK(R1),R1 ;POINT R1 TO NEXT FCB RTS PC ;END OF SAVE FCB SUBROUTINE .END START