.TITLE LUT ; PROGRAM LUT LOGICAL UNIT TABLE ; WRITTEN BY: FRANK PENNER ; JULY 1979 ; MODIFIED: OCTOBER 1979 FOR 2-4 WINDOW SUPPORT RSX11M V3.2 ; AND DISABLE CONTEXT SWITCHING ; MODIFIED: NOVEMBER 1981 CHANGED FORMAT OF OUTPUT *** SLD ; THIS PRIVILEGED TASK WILL PEEK AT THE LUT TABLE OF AN ; ACTIVE, RESIDENT TASK AND DISPLAY VARIOUS AND SUNDRY ; INFORMATION ; TO USE, TYPE: ; LUT TASK ; WHERE TASK IS THE NAME OF THE TASK YOU WANT TO LOOK AT .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 OFFSET LOCAL GMCR: GMCR$ TSKNAM =GMCR+G.MCRB+4 ;START OF TYPED INPUT TASKNAME TSKNAR: .BLKW 2 ;SPACE FOR RAD 50 TASKNAME 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=20. ;MAX OF 20 LUNS KLUDGE: .BLKW 8.*MAX ;8 OTHER WORDS FOR PLACE FOR PTR TO PT A=KLUDGE ARGBLK: ;ARGUMENT BLOCK FOR EDMSG ROUTINE .REPT MAX .WORD A ;1ST WORD OF ARGBLK POINTS TO DEV NAME A=A+2 .BLKW 1 ;SECOND WORD IS UNIT NUMBER .WORD A ;THIRD WORD IS PONTER TO PHYS DEV NAME A=A+2 .BLKW 9. ;NOW 9 WORDS FOR: ;4TH WORD FOR PHYS UNIT NUMBER ;5TH AND 6TH WORDS UIC ;7,8,9,10, AND 11TH FILE NAME ;12TH WORD FOR ACCESS COUNT .WORD A ;13TH WORD IS PTR FOR FILE SIZE A=A+4 .BLKW 1 ;14TH WORD IS # OF RTV PTRS .WORD A ;15TH WORD IS PTR FOR BEG VIR BLOCK # A=A+4 .WORD A ;16TH WORD IS PTR FOR # OF MAPPED BLOCK A=A+4 .ENDR ISTRNG: .ASCIZ /%72<%65<%55<%46<%39<%24<%15<%9<%S%2A%O:%9>%2A%O:%15>[%O,%O]%24>%X%39>%M%46>%T%55>%M%65>%T%72>%T/ *** SLD HED: .ASCII <15><12><12> .ASCII / LOGICAL UNIT TABLE TASK INFORMATION/ *** SLD .ASCII <15><12><12> .ASCII /LOGICAL PHYSICAL ACCESS FILE RETRIEVAL -MAPPED BLOCK-/ *** SLD .ASCII <15><12> .ASCII /DEVICE DEVICE FILE NAME COUNT SIZE POINTERS FIRST NUMBER/ *** SLD .ASCII <15><12> .ASCII /----------------------------------------------------------------------------/ *** SLD HEDS=.-HED .EVEN UISAR1 =177642 ;DEFINE SYMBOL FOR USER APR 1 UISAR2 =177644 ;DEFINE SYMBOL FOR USER APR 2 SAVEM0: .BLKW 1 ;SPACE TO SAVE MEMORY MANAGEMENT REGS SAVEM1: .BLKW 1 ;SPACE TO SAVE APR'S 0 AND 1 SAVEM2: .BLKW 1 ;SPACE TO SAVE APR 2 NUMLUN: .WORD 0 ;SPACE TO SAVE NUMBER OF LUNS .EVEN START: DIR$ #GMCR ;PICK UP COMMAND LINE MOV #TSKNAM,R0 ;ADDRESS OF ASCII STRING TO CONV MOV #1,R1 ;SPECIFY . AS VALID CHAR CALL $CAT5 ;DO ASCII TO RAD 50 CONV BCC .+6 ;IF C CLEAR SUCCESS JMP ERROR ;IF C SET ERROR MOV #TSKNAR,R3 ;POINT R3 TO SPACE FOR OUTPUT MOV R1,(R3)+ ;STORE RAD 50 IN BUFFER MOV #1,R1 ;SET R1 AGAIN CALL $CAT5 ;DO SECOND 3 CHARS MOV R1,(R3)+ ;STORE THESE TOO MOV #TSKNAR,R3 ;POINT TO RAD50 TASKNAME CALL SRATD ;FIND TCB (TCB ADD==>R0) BCC .+6 ;C CLEAR IS SUCCESS JMP ERROR ;TASK NOT ACTIVE BIT #TS.OUT,T.STAT(R0) ;IS TASK OUT OF MEMORY? BEQ .+6 ;TASK IN MEMORY, SO CONTINUE JMP ERROR ;TASK OUT OF MEMORY, SO QUIT MOV T.PCB(R0),R1 ;POINT R1 TO PCB MOV P.HDR(R1),R0 ;POINT R0 TO TASK HEADER MOV H.NLUN(R0),R1 ;# OF LUNS ==> R1 CMP R1,#MAX ;IS # OF LUNS GREATER THAN MAX ? BLE 1$ ;IF NOT GREATER THAN O.K. MOV #MAX,R1 ;ELSE, SET # OF LUNS AT MAX 1$: MOV R1,NUMLUN ;SAVE # OF LUNS FOR PRINT LATER ON ADD #H.LUN,R0 ;POINT R0 TO LUT IN TASK HEADER MOV #ARGBLK,R2 ;POINT R2 TO TEMP STORAGE AREA PROLOP: ;BEGIN PROCESSING OF DCB AND UCB MOV (R0)+,R5 ;R5 NOW POINTS TO UCB BEQ 4$ ;BRANCH, IF NULL LUN JSR PC,DCBSAV ;GO DO DCB AND UCB SAVE ROUTINE ;BEGIN PROCESSING OF WINDOW BLK & FCB MOV (R0)+,R4 ;POINT R4 TO WINDOW BLOCK BIC #1,R4 ;CLEAR WINDOW TURN BIT BEQ 5$ ;IF NULL THEN NO WINDOW BLOCK MOV U.CW1(R5),R3 ;GET DEVICE CHAR FROM UCB BIC #^C,R3 ;MASK OUT UNWANTED BITS CMP #DV.MNT!DV.F11!DV.DIR,R3 ;DISK DEVICE? BNE 5$ ;IF NOT EQUAL NOT A DISK JSR PC,WBSAV ;GO DO SAVE WINDOW BLOCK INFORMATION MOV W.FCB(R4),R5 ;POINT R5 TO FCB BEQ 5$ ;IF NULL THEN NO FCB CMP #120000,R5 ;IS ADDRESS IN F11ACP ? BHI 2$ ;NO, SO BRANCH MOV -4(R0),R3 ;POINT R3 TO UCB 1$: MOV R3,R4 ;SAVE UCB ADDRESS IN R4 MOV U.RED(R4),R3 ;PUT UCB REDIRECT ADDRESS IN R3 CMP R3,R4 ;IS REDIRECT ADDRESS SAME ? BNE 1$ ;KEEP FOLLOWING REDIRECT TILL END MOV U.ACP(R3),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 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 ;PAR FOR APR 2 MOV R3,@#UISAR0 ;REMAP TO F11 ACP ADD #200,R3 ;BUMP UP TO NEXT 4K MOV R3,@#UISAR1 ;THESE WORDS HAVE PAR FOR F11ACP ADD #200,R3 ;BUMP UP TO NEXT 4K MOV R3,@#UISAR2 ;3 APR'S FOR 10K F11ACP SUB #120000,R5 ;SUBTRACT 120000 SO WE USE APR 0 AND 1 JSR PC,FCBSAV ;GO DO SAVE FCB INFORMATION MOV SAVEM0,@#UISAR0 ;RESTORE MEMORY MANAGEMENT REGISTRERS MOV SAVEM1,@#UISAR1 ;POINT PAR'S 0 AND 1 BACK TO EXEC MOV SAVEM2,@#UISAR2 ;APR 2 ALSO CLRB $CXDBL ;RENABLE CONTEXT SWITCHING BR 3$ ;SKIP PAST NO RE-MAP CODE 2$: JSR PC,FCBSAV ;GO DO SAVE FCB INFORMATION 3$: BR 6$ ;BRANCH TO END OF SOB LOOP 4$: MOV #20040,@(R2)+ ;PUT 2 SPACES IN ASCII DEV NAME BUFFER CLR (R2)+ ;CLEAR UNIT NUMBER MOV #20040,@(R2)+ ;PUT 2 SPACES IN PHYS DEV NAME BUF CLR (R2)+ ;CLEAR PHYS UNIT NUMBER TST (R0)+ ;BUMP PAST WINDOW BLOCK PTR IN LUT 5$: ADD #18.,R2 ;BUMP POINTER PAST FCB SAVE AREA 6$: ADD #6.,R2 ;SKIP ALREADY PUT IN ARGBLK RTV PTRS SOB R1,PROLOP ;GO DO REST OF LUNS IN TABLE ;END OF GATHERING INFO ;BEGIN PRINTOUT DIR$ #QIODPB ;PRINT OUT HEADING ON TERMINAL MOV #OUTBUF,QIODPB+Q.IOPL ;PUT ADDRESS OF OUT BUFFER IN QIODPB MOV #ARGBLK,R2 ;PUT ADDRESS OF ARGBLK IN R2 FOR EDMSG MOV NUMLUN,R3 ;# OF LUNS IN R3 FOR SOB LOOP PRTLOP: CLR R0 ;USE R0 AS FLAG FOR NO FILE SPEC CMP (R2)+,(R2)+ ;SKIP PAST LOGICAL DEV SPEC MOV @(R2)+,LUN+A.LUNA ;PUT ASCII DEV NAME IN ATTACH LUN DPB MOV (R2)+,LUN+A.LUNU ;PUT BINARY UNIT # IN ATTACH LUN DPB MOV (R2)+,READLB+Q.IOPL+6. ;PUT HIGH BLOCK # IN DPB BNE 1$ ;IF NOT ZERO DON'T SET FLAG MOV #1,R0 ;SET FLAG FOR NO FILE SPEC 1$: MOV (R2),READLB+Q.IOPL+8. ;PUT OTHER LOW BLOCK # IN DPB BNE 2$ ;A FILE SPEC SO BRANCH TST R0 ;WAS FLAG SET? BEQ 2$ ;NOT SET SO VALID FILE SPEC SUB #10.,R2 ;BUMP BACK R2 TO POINT TO START OF PACK BR 3$ ;SKIP FILE SPEC STUFF 2$: TST -(R2) ;BACK UP ARGBLK POINTER DIR$ #LUN ;ASSIGN DISK LUN TO PROPER DEVICE DIR$ #READLB ;READ FILE HEADER BLOCK MOVB HEDBUF+H.PROJ,(R2)+ ;PUT PROJECT # IN ARG BLK CLRB (R2)+ ;ROUND ARGBLK POINTER TO EVEN WORD MOVB HEDBUF+H.PROG,(R2)+ ;PUT PROGRAMMER # IN ARG BLK CLRB (R2)+ ;ROUND ARGBLK POINTER TO EVEN WORD MOV #HEDBUF+S.HDHD,R0 ;PUT ADDRESS OF FILESPEC IN R0 MOV (R0)+,(R2)+ ;FILESPEC FROM HEADER BLK TO ARGBLK MOV (R0)+,(R2)+ ;FILESPEC FROM HEADER BLK TO ARGBLK MOV (R0)+,(R2)+ ;FILESPEC FROM HEADER BLK TO ARGBLK MOV (R0)+,(R2)+ ;FILESPEC FROM HEADER BLK TO ARGBLK MOV (R0)+,(R2)+ ;FILESPEC FROM HEADER BLK TO ARGBLK SUB #22.,R2 ;RESET R2 TO BEGINNING OF PACKET 3$: 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 DCBSAV: ;SAVE DCB AND UCB ROUTINE MOV R5,-(SP) ;PUSH R5 TO SAVE UCB ADDRESS JSR PC,DEVSAV ;GO DO DEVICE SAVE ROUTINE MOV (SP)+,R5 ;POP UCB ADDRESS TO RESTORE R5 1$: MOV R5,R4 ;SAVE UCB ADDRESS IN R4 MOV U.RED(R4),R5 ;PUT REDIRECT UCB ADDRESS IN R5 CMP R5,R4 ;IS REDIRECT ADDRESS SAME ? BNE 1$ ;KEEP FOLLOWING REDIRECT UNTIL END MOV R5,-(SP) ;PUSH R5 TO SAVE UCB ADDRESS JSR PC,DEVSAV ;GO DO DEVICE SAVE ROUTINE MOV (SP)+,R5 ;POP UCB ADDRESS TO RESTORE R5 RTS PC ;END OF UCB AND DCB SAVE ROUTINE DEVSAV: ;DEVICE SAVE ROUTINE MOV U.DCB(R5),R3 ;R3 NOW POINTS TO DCB MOV D.NAM(R3),@(R2)+ ;SAVE DEVICE NAME IN KLUDGE BUFF SUB D.UCB(R3),R5 ;SUBTRACT 1ST UCB ADDRESS FROM MINE CLR R4 ;CLEAR R4 FOR HIGH WORD FOR DIV DIV D.UCBL(R3),R4 ;DIVIDE UCB DIFFERENCE BY UCB LENGTH MOVB D.UNIT(R3),R5 ;PUT LOWEST UNIT # IN R5 ADD R5,R4 ;ADD LOWEST UNIT # TO DEV UNIT # MOVB R4,(R2)+ ;SAVE DEVICE UNIT IN ARGBLK CLRB (R2)+ ;BUMP UP ARGBLK POINTER TO WORD RTS PC ;END OF SAVE DEVICE ROUTINE ; END OF DEVICE CONTROL BLOCK AND UNIT CONTROL BLOCK PROCESSING WBSAV: ;SAVE WINDOW BLOCK ROUTINE MOV R0,-(SP) ;PUSH LUT PTR TO BUY REGISTER ADD #18.,R2 ;POINT TO RETRIVAL PTRS IN ARGBLK MOVB W.CTL(R4),R3 ;PUT # OF RTV PTRS IN R3 MOV R3,(R2)+ ;PUT # OF RTV PTRS IN ARGBLK MOV (R2)+,R0 ;PUT ADDRESS OF DUB PREC BLK IN R0 MOVB W.VBN(R4),R5 ;PUT HIGH BYTE OF VBN IN R5 MOV R5,(R0)+ ;PUT HIGH WORD OF VBN IN ARGBLK MOV W.VBN+2(R4),(R0)+ ;PUT LOW WORD VBN IN ARGBLK MOV (R2)+,R0 ;PUT ADDRESS OF DUB PREC BLK CNT IN R0 CLR (R0) ;CLEAR ARGBLK SUM OF # OF MAPPED BLOCKS CLR 2(R0) ;CLEAR HIGH WORD OF SUM TST R3 ;R3 HAS # OF RETRIVAL PTRS BEQ 2$ ;IF ZERO THEN SKIP SOB ROUTINE MOV R4,R5 ;PUT WINDOW BLOCK ADDRESS IN R5 ADD #W.RTRV,R5 ;POINT R5 TO FIRST # OF VBNS BYTE 1$: ADD (R5)+,2(R0) ;ADD COUNT TO TALLY OF # OF VBN'S ADC (R0) ;PUT CARRY IN HIGH WORD CMP (R5)+,(R5)+ ;POINT TO NEXT VBN COUNT SOB R3,1$ ;DO ALL THE RTV PTRS 2$: SUB #24.,R2 ;POINT R2 BACK TO FILE SPEC ARGBLK MOV (SP)+,R0 ;POP LUT PTR TO RESTORE R0 RTS PC ;END OF WINDOW BLOCK SAVE ROUTINE FCBSAV: ;SAVE FCB SUBROUTINE MOV F.HDLB(R5),(R2)+ ;SAVE HIGH HEADER-BLOCK # IN ARGBLK MOV F.HDLB+2(R5),(R2)+ ;SAVE LOW HEADER-BLK # IN ARGBLK ADD #10.,R2 ;SKIP 10 WORDS OF ARG BLK MOVB F.NACS(R5),(R2)+ ;SAVE ACCESS COUNT IN ARGBLK CLRB (R2)+ ;POINT ARGBLK TO WORD AND NEXT PACKET MOV (R2)+,R4 ;PUT ADDRESS OF DUB PREC PTR IN R4 MOV F.SIZE(R5),(R4)+ ;SAVE FILE SIZE IN ARGBLK (HIGH WORD) MOV F.SIZE+2(R5),(R4)+ ;SAVE LOW WORD OF FILE SIZE RTS PC ;END OF SAVE FCB SUBROUTINE SRATD: ;SEARCH ACTIVE TASK DIRECTORY ;STOLEN FROM EXEC $SRSTD MOV $ACTHD,R0 ;POINT TO FIRST TCB IN LIST 10$: CMP T.NAM(R0),(R3) ;FIRST HALF OF NAME MATCH ? BNE 20$ ;IF NE NO CMP T.NAM+2(R0),2(R3) ;SECOND HALF OF NAME MATCH ? BEQ 30$ ;IF EQUALS YES 20$: MOV T.ACTL(R0),R0 ;GET LINK TO NEXT TCB TST T.ACTL(R0) ;NULL TASK ? BNE 10$ ;IF NOT EQUALS NO SEC ;INDICATE FAILURE 30$: RETURN ;END OF SEARCH ACTIVE TASK DIRECTORY .END START