.TITLE LUT .SBTTL INTRO PAGE ; PROGRAM LUT LOGICAL UNIT TABLE ; WRITTEN BY: FRANK PENNER ; JULY 1979 ; MOD BY : FRANK BORGER TO IAS ; SEPT 1979 ; THIS PRIVILEGED TASK WILL PEEK AT THE LUT TABLE OF AN ; ACTIVE, RESIDENT TASK AND DISPLAY VARIOUS AND SUNDRY ; INFORMATION ; ; CALLING SEQUENCE ; ; MCR>LUT NNNNNN[/TI:TTNN] WHERE ; NNNNNN=TASK NAME ; TTNN=TI OF TASK IF OTHER THAN YOUR OWN ; .MCALL QIOW$,EXIT$S,DIR$,ALUN$ .MCALL F11DF$,CALL,RETURN,GMCR$ .MCALL FHDOF$ R$$11D=1 R$$IAS=1 F11DF$ ;DEFINE F11 OFSETS (VCB,FCB,WINDOW) FHDOF$ DEF$L ;DEFINE FILE-HEADER BLOCK OFFSETS LOCAL .PAGE .SBTTL DATA AREAS AND DPB'S GMCR: GMCR$ TSKNAM =GMCR+G.MCRB+4 ;START OF TYPED INPUT TASKNAME TSKNAR: .BLKW 2 ;SPACE FOR RAD 50 TASKNAME TSKATL: .WORD 0 ;SPACE FOR TASK ATL ADDRESS TINAME: .WORD 0 ;ASCII TI NUMBER TINUMB: .WORD 0 ;OCTAL TI NUMBER LUN: ALUN$ DLUN,0,0 NUMLUN: .WORD 0 ;SAVE # OF LUNS PDR4K: .WORD 77406 ;A 4K READ/WRITE PAGE DESCRIPTOR REGISTER SAVPAR: .WORD 0 ;SAVED AREA FOR OLD PAR SAVPDR: .WORD 0 ;SAVED AREA FOR OLD PDR SAVACP: .WORD 0 ;ACP STD ADDRESS FOR CURRENT LUN FCPPAR: .WORD 0 ;PAGE ADDRESS REGISTER FOR FCPCOM FCPRAD: .RAD50 /FCP/ COMRAD: .RAD50 /COM/ ;RAD50 FCPCOM PAR3=60000 ;OFFSET TO USE PAR/PDR SET 3 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. MAX=20. ;MAX OF 20 LUNS ; ;CONTENTS OFFSET SIZE ;LUN 0. 2. ;PTR TO DEV NAME 2. 2. ;DEV NUMBER 4. 2. ;UIC 6. 4. (INIT CONTAINS ABS BL # OF FILE HEADER) ;FILE DESCRIPTOR 10. 10. ;ACCESS COUNT 20. 2. ;# OF RETRIVAL POINTERS 22. 2. ;WINDOW SIZE 24. 2. ;FIRST BLOCK # 26. 4. ;NUMBER OF BLOCKS 30. 2. KLUDGE: .BLKW MAX ;1 OTHER WORD FOR ASCII DEVICE NAME A=KLUDGE X=1 ARGBLK: ;ARGUMENT BLOCK FOR EDMSG ROUTINE .REPT MAX .WORD X ;LOGICAL UNIT NUMBER X=X+1 .WORD A ;2ND WORD OF ARGBLK POINTS TO DEV NAME A=A+2 .BLKW 14. ;15. WORDS (TOTAL) FOR EACH ARGBLK PACKET .ENDR .PAGE .SBTTL ASCII DATA & BUFFERS ISTRNG: .ASCII /%54<%47<%43<%38<%33<%16<%3%2A%O:[%O,%O]%16>%X%33>%M%38>%M%43>%M%47>%M%M%54>%M/ HED: .ASCII /LUN/<11><11><11>/ ACC RTV WIND FIRST # OF BLOCKS/ .ASCII <15><12> .ASCII <11><11><11>/ CNT PTRS SIZE BLOCK MAPPED/ HEDS=.-HED .EVEN .PAGE .SBTTL ASCII ERROR MESSAGES ERRMS0: .ASCII /*** LUT SYNTAX ERROR IN COMMAND ***/ ERRLN0=.-ERRMS0 ERRMS1: .ASCII /*** LUT TASK NOT ACTIVE AT SPECIFIED TI ***/ ERRLN1=.-ERRMS1 ERRMS2: .ASCII /*** LUT TASK ON MRL (CAN'T READ TASK HEADER) ***/ ERRLN2=.-ERRMS2 ERRMS3: .ASCII /*** LUT CAN'T FIND PROPER ATL ADDRESS FOR FXXACP ***/ ERRLN3=.-ERRMS3 .EVEN .PAGE .SBTTL GET AND DECODE COMMAND LINE START: DIR$ #GMCR ;GET COMAND LINE MOV #GMCR+2,R0 ;POINT TO START OF COMMAND LINE MOV R0,R1 ;SET TO MAKE END OF LINE POINTER ADD @#$DSW,R1 ;HAVE END POINTER 1$: CMPB (R0)+,#40 ;FOUND FIRST SPACE AFTER "INF" BEQ 2$ ;YES CMP R0,R1 ;PAST END OF COMMAND BLE 1$ ;YES 99$: JMP ERROR ;NO, AN ERROR 2$: ;POINTING AT TASK NAME MOV #1,R1 ;. IS LEGAL CHARACTER JSR PC,$CAT5 ;CONVERT TO RAD 50 BCC 111$ ;BR IF OK CMPB R2,#'/ ;TERMINATED ON / OF SWITCH ? BNE 111$ ;NO DEC R0 ;PUT R0 AT TERMINATOR 111$: MOV R1,TSKNAR ;FILL IN FIRST HALF OF NAME MOV #1,R1 ;DO AGAIN FOR 2ND HALF JSR PC,$CAT5 BCC 222$ ;BR IF OK CMPB R2,#'/ ;TERMINATED ON / OF SWITCH ? BNE 222$ ;NO DEC R0 ;PUT R0 AT TERMINATOR 222$: MOV R1,TSKNAR+2 ;FILL IN 2ND HALF CMPB (R0),#'/ ;TERMINATED ON SWITCH ? BNE MYTI ;IF NOT USE MY TI INC R0 ;BUMP PAST "/" CMPB (R0)+,#'T ;CHECK SYNTAX BNE 99$ CMPB (R0)+,#'I BNE 99$ CMPB (R0)+,#': BNE 99$ MOVB (R0)+,TINAME ;SAVE NAME MOVB (R0)+,TINAME+1 JSR PC,$COTB ;CONVERT UNIT NUMBER TO OCTAL MOV R1,TINUMB ;SAVE TI NUMBER BR FINDTA ;AND FIND TASK MYTI: MOV .CRTSK,R0 ;GET MY TI MOV A.TI(R0),R0 ;GET MY PUD POINTER MOV U.DN(R0),TINAME ;SAVE MY TI NAME MOVB U.UN(R0),TINUMB ;AND NUMBER .PAGE .SBTTL SEARCH ATL FOR TASK IN QUESTION FINDTA: ;NOW CAN SEARCH ATL FOR TASK MOV #.ATLLH,R0 ;R0 POINTS AT ATLLH LOOP: MOV (R0),R0 ;GET NEXT ATL LISTHEAD CMP R0,#.ATLLH ;THROUGH LIST ? BNE 1$ ;BR IF NOT JMP ERROR1 ;ELSE AN ERROR 1$: MOV A.TD(R0),R1 ;GET STD CMP S.TN(R1),TSKNAR ;DO NAMES MATCH BNE LOOP ;NO, TRY AGAIN CMP S.TN+2(R1),TSKNAR+2 BNE LOOP ;NO TRY AGAIN MOV A.TI(R0),R1 ;GET TI POINTER CMP U.DN(R1),TINAME ;DO TI'S MATCH BNE LOOP CMPB U.UN(R1),TINUMB ;LAST TEST BNE LOOP ;NO MATCH MOV R0,TSKATL ;SAVE TASK ATL JUST IN CASE ;AND TRY TO MAP TO TASK CMP A.TS(R0),#TS.MRL ;IS TASK IN CORE BLT GETCOM ;YES, TRY CMP A.TS(R0),#TS.MRR ;CHECK UPPER LIMIT BGT GETCOM ;YES, TRY JMP ERROR2 ;NO, TASK IS ON MRL SO REPORT GETCOM: ;GET DATA FOR ACPCOM MOV #.GCDLH,R5 ;GET START OF GCD NXTCOM: MOV (R5),R5 ;GET NEXT/FIRST GCD CMP R5,#.GCDLH ;END OF GCD ? BNE 99$ ;NO CHECK A GCD ENTRY EXIT$S ;EXIT IF CAN'T FIND ACPCOM 99$: CMP G.BN(R5),FCPRAD ;IS THIS FCPCOM ? BNE NXTCOM ;NO CMP G.BN+2(R5),COMRAD ;IS THIS FCPCOM BNE NXTCOM ;NO MOV G.BA(R5),FCPPAR ;YES, SAVE HIS CORE ADDRESS MOV PDR4K,-(SP) ;MAP TO THE TASK HEADER MOV A.HA(R0),-(SP) ;PDR FOR TASK IN QUESTION TO STACK JSR PC,..SPD3 ;MAP PAR/PDR 3 TO TASK HEADER MOV PAR3+H.LUT,R1 ;POINT R1 TO TASK LOG UNIT TABLE 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 MOV #PAR3+H.LUT+2,R0 ;POINT R0 TO FIRST PUD/WINDOW PAIR MOV #ARGBLK,R2 ;POINT R2 TO TEMP STORAGE AREA .PAGE .SBTTL SAVE DEV NAME, WINDOW BLOCK AND FCB FOR EACH LUN PROLOP: ;BEGIN PROCESSING OF DCB AND UCB ADD #2,R2 ;BUMP R2 OVER LUN # MOV (R0)+,R5 ;R5 NOW POINTS TO PUD BEQ 4$ ;BRANCH, IF NULL LUN CMP R5,#1 ;IS IT TI ? BNE 1$ ;NO MOV #"TI,@(R2)+ ;FAKE A TI DEVICE CMP (R2)+,(R0)+ ;BUMP PAST DEVICE INFO IN ARG BLOCK BR 5$ ;AND PROCESS AS IF NO FILES OPEN 1$: MOV U.DN(R5),@(R2)+ ;SAVE DEVICE NAME MOVB U.UN(R5),(R2)+ ;PUT OCTAL DEV # IN BUFFER JSR PC,..REDS ;NOW FOLLOW RE-DIRECT CHAIN TO DISK MOV U.ACP(R5),SAVACP ;SAVE ACP STD ADDRESS FOR LATER TSTB (R2)+ ;WORD ALIGN AGAIN ;BEGIN PROCESSING OF WINDOW BLK AND FCB MOV (R0)+,R4 ;POINT R4 TO WINDOW BLOCK BEQ 5$ ;IF NULL THEN NO WINDOW BLOCK CMP R4,#100000 ;IS THIS WINDOW BLOCK IN SCOM ? BLO 12$ ;NO, ITS IN FCPCOM, SO RE-MAP US JSR PC,WBSAV ;YES - SAVE WINDOW BLOCK INFO MOV W.FCB(R4),R5 ;AND GET FCB ADDRESS NOW BR 66$ ;BRANCH TO SAVE FCB INFO 12$: CMP R4,#60000 ;IS WINDOW BLOCK IN FCPCOM OR ACP BLO 11$ ;BRANCH IF IT'S IN THE FCP ITSELF JSR PC,SWAFCP ;ELSE SWAP TO FCPCOM BR 13$ 11$: JSR PC,SWAACP ;SWAP TO THE ACP ADD #60000,R4 ;AND FAKE OUT SO WE USE PAR/PDR 3 13$: JSR PC,WBSAV ;SAVE WINDOW BLOCK INFO MOV W.FCB(R4),R5 ;SAVE FDB ADDRESS JSR PC,RESTAS ;RESTORE TO TASK HEADER 66$: TST R5 ;CHECK FCB POINTER BEQ 5$ ;IF NULL THEN NO FCB CMP R5,#100000 ;IS THIS FCB IN SCOM ? BLO 2$ ;NO, ITS IN FCPCOM, SO RE-MAP US JSR PC,FCBSAV ;YES - SAVE FCB BLOCK INFORMATION BR 6$ ;BRANCH TO END OF SOB LOOP 2$: CMP R5,#60000 ;IS THIS FCB IN FCPCOM OR THE ACP BLO 21$ ;BRANCH IF ITS IN THE ACP JSR PC,SWAFCP ;SWAP TO FCPCOM BR 22$ 21$: JSR PC,SWAACP ;SWAP TO THE ACP ADD #60000,R5 ;AND FAKE THINGS SO WE USE PAR/PDR 3 22$: JSR PC,FCBSAV ;SAVE FCB INFO JSR PC,RESTAS ;RESTORE BACK TO TASK BR 6$ ;BRANCH TO END OF SOB LOOP 4$: MOV #20040,@(R2)+ ;PUT 2 SPACES IN ASCII DEV NAME BUFFER CMP (R2)+,(R0)+ ;BUMP PAST DEVICE INFO IN ARGBLK 5$: ADD #16.,R2 ;BUMP POINTER PAST FCB SAVE AREA 6$: ADD #10.,R2 ;SKIP ALREADY PUT IN ARGBLK RTV PTRS DEC R1 ;COUNT A LUN BLE 99$ ;BR IF DONE JMP PROLOP ;GO BACK FOR MORE 99$: .PAGE .SBTTL ASSEMBLE AND PRINT FILE INFORMATION ;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 ADD #2,R2 ;BUMP TO DEVICE NAME 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 #8.,R2 ;BUMP BACK R2 TO POINT TO START OF PACK BR 4$ ;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 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 3$: MOV (R0)+,(R2)+ ;FILESPEC FROM HEADER BLK TO ARGBLK SOB R1,3$ ;DO WHOLE FILESPEC SUB #20.,R2 ;RESET R2 TO BEGINNING OF PACKET 4$: 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 EXIT: EXIT$S .PAGE .SBTTL ERROR HANDLING ; ; ERROR: ;COMMAND STRING SYNTAX ERROR MOV #ERRMS0,QIODPB+Q.IOPL MOV #ERRLN0,QIODPB+Q.IOPL+2 BR ERRCOM ; ERROR1: ;TASK NOT IN ATL MOV #ERRMS1,QIODPB+Q.IOPL MOV #ERRLN1,QIODPB+Q.IOPL+2 BR ERRCOM ; ERROR2: ;TASK ON MRL SO HEADER NOT AVAILABLE MOV #ERRMS2,QIODPB+Q.IOPL MOV #ERRLN2,QIODPB+Q.IOPL+2 BR ERRCOM ; ERROR3: ;COULDN'T FIND PROPER ACP ATL ADDRESS MOV #ERRMS3,QIODPB+Q.IOPL MOV #ERRLN3,QIODPB+Q.IOPL+2 ; ERRCOM: DIR$ #QIODPB ;REPORT ERROR EXIT$S ;AND LEAVE .PAGE .SBTTL SAVE WINDOW BLOCK AND FCB SUBROUTINES ;ENTER BOTH ROUTINES WITH R2 OFFSET 4. BYTES INTO DATA BUFFER WBSAV: ;SAVE WINDOW BLOCK ROUTINE ADD #16.,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 MOVB W.WISZ(R4),R3 ;WINDOW SIZE IN R3 MOV R3,(R2)+ ;PUT WINDOW SIZE IN ARGBLK MOVB W.VBN(R4),R5 ;PUT HIGH BYTE OF VBN IN R5 MOV R5,(R2)+ ;PUT HIGH WORD OF VBN IN ARGBLK MOV W.VBN+2(R4),(R2)+ ;PUT LOW WORD VBN IN ARGBLK CLR (R2) ;CLEAR ARGBLK SUM OF # OF MAPPED BLOCKS TST R3 ;R3 HAS # OF RETRIVAL PTRS BEQ 2$ ;IF ZERO THEN SKIP SOB ROUTINE CLR -(SP) ;USE STACK FOR BYTE TO WORD CONVERSION MOV R4,R5 ;PUT WINDOW BLOCK ADDRESS IN R5 ADD #W.RTRV,R5 ;POINT R5 TO FIRST RETRIEVAL POINTER 1$: ADD (R5),(R2) ;ADD COUNT TO TALLY OF # OF BLOCKS ADD #6,R5 ;POINT TO NEXT VBN COUNT SOB R3,1$ ;DO ALL THE RTV PTRS TST (SP)+ ;RESET STACK POINTER 2$: SUB #24.,R2 ;POINT R2 BACK TO FILE SPEC ARGBLK 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 TSTB (R2)+ ;POINT ARGBLK TO WORD AND NEXT PACKET RTS PC ;END OF SAVE FCB SUBROUTINE ; .PAGE .SBTTL SUBS TO SWAP TO FCPCOM AND BACK AGAIN SWAFCP: MOV PDR4K,-(SP) ;SET TO MAP TO FCPCOM MOV FCPPAR,-(SP) ;WITH PREV SAVED ADDRESS JSR PC,..SPD3 ;SWAP PAR/PDR 3 MOV (SP)+,SAVPAR ;SAVE PAR AND RESTORE STACK MOV (SP)+,SAVPDR ;SAVE PDR AND RESTORE STACK RTS PC ;AND RETURN ; RESTAS: MOV SAVPDR,-(SP) ;PUT OLD PDR ON STACK MOV SAVPAR,-(SP) ;PUT OLD PAR ON STACK JSR PC,..SPD3 ;AND SWAP BACK TO OLD VALUES CMP (SP)+,(SP)+ ;AND RESTORE STACK RTS PC ;AND RETURN ; ;IF ITS THE ACP WE HAVE A LITTLE MORE WORK ; SWAACP: MOV R0,-(SP) MOV #.ATLLH,R0 ;R0 POINTS AT ATLLH 1$: MOV (R0),R0 ;GET NEXT ATL LISTHEAD CMP R0,#.ATLLH ;THROUGH LIST ? BNE 2$ ;NO, OK JMP ERROR3 2$: CMP A.TD(R0),SAVACP ;IS THIS CORRECT ATL ENTRY ? BNE 1$ ;NO, TRY AGAIN MOV A.HA(R0),R0 ;YES, GET ADDRESS OF FCP ADD #4,R0 ;F12ACP HEADER IS 400 BYTES MOV PDR4K,-(SP) ;SET TO MAP TO FXXACP MOV R0,-(SP) JSR PC,..SPD3 MOV (SP)+,SAVPAR ;SAVE PAR MOV (SP)+,SAVPDR ;AND PDR MOV (SP)+,R0 RTS PC .END START