.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: J.Goodman 17-JUL-84 for MPLUS to be able to handle ; both regular and external headers. ; map external header through APR6 ; map NON-POOL FCB'S with APR 0,1,2 ; program also assumes that the WCB ; retrieval pointers are in SEC.POOL ; Map R.POINTERS with APR 6 ; ; 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.WVB,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 /%58<%51<%46<%38<%34<%17<%2A%O:%2A%O:[%O,%O]%17>%X%34>%M%38>%T%46>%M%51>%T%58>%T/ HED: .ASCII <11><11><11><11>/ ACC FILE RTVL MAPPED BLOCKS/ .ASCII <15><12> .ASCII <11><11><11><11>/ CNT SIZE PTRS FIRST NUMBER/ 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 (MAP TO F11ACP) M6: .BLKW 1 ;save APR6 (while mapping SECPOOL R.PTR) SAVEM6: .BLKW 1 ; SPACE SAVE APR6 (MAP EXTERNAL HEADER) ; in the case where both external headers and SECPOOL retreival pointers ; need to be mapped to in the same program two memory locations are ; needed to save the APR6 mappings. SAVED0: .BLKW 1 ; SPACE TO SAVE PDRS SAVED1: .BLKW 1 SAVED2: .BLKW 1 SAVED6: .BLKW 1 ;SAVE PDR FOR APR 6 D6: .BLKW 1 ;save space;PDR-6 for secpool mapping 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 MOV T.PCB(R0),R2 ; get PCB so can check if BIT #PS.OUT,P.STAT(R2) ; partition is out of memory ; (RSX11M checks TS.OUT) BEQ .+6 ;TASK IN MEMORY, SO CONTINUE JMP ERROR ;TASK OUT OF MEMORY, SO QUIT MOV P.HDR(R2),R0 ;point R0 to task header ; TST R0 ; if R0=0, then external header BNE COMON ; branch to common code if not extern MOV @#UISAR6,SAVEM6 ; else, is external header MOV @#UISDR6,SAVED6 ; save APR6 and PDR6 to remap MOVB #1,$CXDBL ; dissable context swith because remap. MOV P.REL(R2),@#UISAR6 ; map beginning of header with U-APR6 MOV @#UISDR5,@#UISDR6 ; make sure PDR allows access to UISAR6 MOV #140000,R0 ; virt. base adr of APR6=TASK HEADER ; now, R0 contains pointer to beginning of task header. ; (whether external or non-external header) now execute common code. COMON: 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 TST R4 ;check if WINDOW address exists BEQ 5$ ;IF NULL THEN NO WINDOW BLOCK MOV U.CW1(R5),R3 ;GET DEVICE CHAR FROM UCB BIC #^C,R3 ;MASK OUT NON-FILES11 BITS CMP #DV.MNT!DV.F11!DV.DIR,R3 ;DISK DEVICE? BNE 5$ ;skip over if not reg FILES11 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.OFF(R3),-(SP) ; save offset to task begin. (on stack) MOV T.PCB(R3),R3 ;POINT R3 TO PCB FOR ACP MOV P.REL(R3),R3 ;GET PHYSICAL START OF ACP ADD (SP)+,R3 ; add offset to start of task INCB $CXDBL ; disable context switching (unless ; already disabled, for extern.head.) 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 @#UISDR0,SAVED0 ; PDR for APR0 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 MOV @#UISDR1,@#UISDR0 ; copy PDR of APR1; fully mapped 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 MOV SAVED0,@#UISDR0 ; restore original PDR for APR0 DECB $CXDBL ; renenable context switching,( unless ; xternal header.) BR 3$ ;SKIP PAST NO RE-MAP CODE 12$: ; use this as a booster; JMP PROLOP ; sloppy, but SOB range is small 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,12$ ; do rest of LUNS (need booster for SOB ; ; RE-ENABLE CONTEXT SWITCHING IF EXTERNAL HEADERS TSTB $CXDBL ; CHECK TO SEE IF CONTEXT SW. DISABL. BEQ PRINT ; IF CONTEXT NOT DISABLED, GO PRINT MOV SAVEM6,@#UISAR6 ; REMAP U-APR6 BACK TO ORIGINAL MOV SAVED6,@#UISDR6 ; DITTO FOR PDR6 CLRB $CXDBL ; FINALLY, RE-ENABLE CONTEX. SWITCH. ; ;END OF GATHERING INFO ;BEGIN PRINTOUT PRINT: 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 ; ; Subroutine DCBSAV assumes that R5 contains the ; UCB address when it is fist entered. 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) ;save the UCB address JSR PC,DEVSAV ;GO DO DEVICE SAVE ROUTINE MOV (SP)+,R5 ;restore UCB address 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 ; ; The window Block save routine has been modified. It now expects ; all retrieval pointers to be in Secondary Pool. ; R4 contains the WCB address before it enters this routine ; and offset W.MAP(R4), should contain SECPOOL address of R.Pointers. ; WBSAV: ;SAVE WINDOW BLOCK ROUTINE MOV R0,-(SP) ;PUSH LUT PTR TO BUY REGISTER MOV R4,-(SP) ;Push WCB ptr, to buy another register ADD #18.,R2 ;POINT TO RETRIVAL PTRS IN ARGBLK MOV @#UISAR6,M6 ;save user-data- APR6 MOV @#UISDR6,D6 ;save PDR for APR6 INCB $CXDBL ;dissable context switching MOV W.MAP(R4),@#UISAR6 ;map to R.pointers in SECPOOL MOV @#UISDR5,@#UISDR6 ;make sure fully APR6 fully mapped MOV #140000,R4 ;R4, now points to R.PTRs.(base of APR6) 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 M6,@#UISAR6 ;restore APR6 MOV D6,@#UISDR6 ;restore PDR6 DECB $CXDBL ;enable context switch (unless xheader) MOV (SP)+,R4 ;POP WCB Ptr. back in R4 MOV (SP)+,R0 ;POP LUT PTR TO RESTORE R0 RTS PC ;END OF WINDOW BLOCK SAVE ROUTINE ; ; Assume that R5 contains FCB address when jump into FCBSAV 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