.TITLE $INSHD - INSTALL HEADER ROUTINE .IDENT /03.1/ ;HJL050 ; ;**-1 ; COPYRIGHT (C) 1974, 1976 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ; ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE ; MADE AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH ; SYSTEM AND TO ONE WHO AGREES TO THESE LICENSE TERMS. TITLE ; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; VERSION: 02 ; BY: H. LEV ; DATE: 10/02/73 ; MODIFIED: 12/10/74 ADD LOGICAL DEVICE ASSIGNMENT ; 3/10/75 CHANGE DEVICE ASSIGNMENT TO USE ALUN$ ; ; HJL002 9/19/75 ADD MULTI-USER PROTECTION SUPPORT ; ; HJL005 10/30/75 CHANGES TO WRITE TASK FILE ID INTO TASK ; HEADER TO BE ABLE TO SUPPORT DISK COMPRESSION ; ; HJL025 3/12/76 CHANGE PCB, TCB, AND TASK HEADER FORMAT ; 6/8/76 ADD DEFAULT PRIORITY TO TCB ; ; ; HJL050 13-JAN-77 ADD $CLIPT AND U.CLI SUPPORT ;HJL050 ; ;HJL050 ; JAK002 14-JUN-77 FLAG CLI FLAG IN T.ST3 ;HJL050 ; ;HJL050 ; ;HJL050 ; ; THIS MODULE READS AND FILLS IN THE TASK HEADER FOR THE ; INSTALL MCR COMMAND .MCALL ALUN$,CALL,DEVDF$,DIR$,HDRDF$,RETURN,TCBDF$ DEVDF$ ; DEFINE DCB, UCB, AND SCB OFFSETS HDRDF$ ; DEFINE TASK HEADER OFFSETS TCBDF$ ; DEFINE TCB OFFSETS ; ; LOCAL DATA ; LUN3 = 3 ; DEVICE ASSIGNMENT LUN ; ALUN: ALUN$ LUN3,XX,0 ; ASSIGN LUN DPB .SBTTL LOCAL DATA ERR1: .ASCIZ <15>/INS -- ILLEGAL UIC/ ERR2: .ASCIZ <15>/INS -- TOO MANY LUNS/ ERR3: .ASCIZ <15>%INS -- ILLEGAL DEVICE % .EVEN TSKTB: .RAD50 /...MCR/ ; ;HJL050 .WORD $MCRPT ; ;HJL050 ;HJL050 .IF DF C$$LIS ;HJL050 ;HJL050 .RAD50 /...DCL/ ; ;HJL050 .WORD $CLIPT ; ;HJL050 ;HJL050 .IFTF ;HJL050 ;HJL050 .RAD50 /SHF.../ ; ;HJL050 .WORD $SHFPT ; ;HJL050 .RAD50 /TKTN / ; ;HJL050 .WORD $TKNPT ; ;HJL050 .WORD 0 ; END OF TABLE ;HJL050 ; ;+ ; *** - $INSHD MCR INSTALL COMMAND HEADER OVERLAY ; THIS OVERLAY VERIFIES THE TASK HEADER, SETS THE ; LUN ASSIGNMENT IN THE HEADER AND WRITES THE ; MODIFIED HEAD BACK TO DISK. IT RECEIVES CONTROL ; FROM $INSLB WHICH READS THE 1ST RECORD OF ; THE LABEL BLOCK AND HEADER BLOCK INTO CORE AND ; SETS UP THE PCB POINTERS IN THE HEADER. ALSO ; A TCB HAS BEEN ALLOCATED AND IS FILLED IN. ; ;- $INSHD::MOV #$LBLBF,R0 ; SET BUFFER POINTER MOV R0,R5 ; SAVE LABEL BLOCK ADDRESS MOV #$LBLBN,R1 ; GET ADDRESS OF LOGICAL BLOCK NUMBER ADD #1,(R1) ; POINT TO ADC 2(R1) ; SECOND BLOCK OF LABEL CALL $READ ; READ 2ND RECORD OF LABEL BLOCK MOV #$HDRBF,R4 ; GET HEADER BLOCK ADDRESS TST $UIC ; IS UIC DEFINED ON COMMAND? BEQ 10$ ; NO MOV $UIC,H.CUIC(R4) ; SET DEFAULT UIC BR 20$ ; SKIP 10$: MOV H.DUIC(R4),H.CUIC(R4) ; SET CURRENT UIC FROM DEFAULT UIC 20$: TSTB H.CUIC(R4) ; IS UIC VALID? BEQ 30$ ; NO TSTB H.CUIC+1(R4) ; MAYBE BEQ 30$ ; DEFINITELY NO MOV H.NLUN(R4),R3 ; GET NUMBER OF LUNS CMP R3,#255. ; VALID NUMBER? BHI 32$ ; NO ADD #H.LUN,R4 ; POINT TO FIRST LUN TST R3 ; ANY LUNS? BEQ 90$ ; NO, NO NEED TO ASSIGN THEM BR 40$ ; SKIP AROUND JUMPS 30$: JMP INSHD1 ; ILLEGAL UIC 32$: JMP INSHD2 ; TOO MANY LUNS ; ; GET NEXT LUN AND ASSIGN IT ; 40$: TST (R5) ; IS LUN DEFINED? BNE 42$ ; YES, THEN GO SEARCH DEVICE TABLE CLR (R4)+ ; UPDATE LUN POINTER BR 85$ ; 42$: CMP (R5),#"OV ; OVERLAY PSUEDO DEVICE? BNE 50$ ; NO MOV $TCB,R0 ; YES, GET TASK LOAD MOV T.LDV(R0),R2 ; DEVICE UCB ADDRESS FROM TCB BR 80$ ; 50$: MOV (R5),ALUN+A.LUNA ; SET DEVICE NAME MOV 2(R5),ALUN+A.LUNU ; AND UNIT DIR$ #ALUN ; ASSIGN LUN BCS 55$ ; DPB ERROR TST $DSW ; ANY ERRORS? BPL 60$ ; NO 55$: CALL INSHD3 ; YES, ILLEGAL DEVICE CLR (R4)+ ; DON'T ASSIGN IT BR 85$ ; 60$: CALL $SWSTK,80$ ; SWITCH TO SYSTEM STATE MOV $HEADR,R2 ; GET TASK HEADER ADDRESS MOV H.LUN+<*4>(R2),6(SP) ; SET UCB ADDRESS IN R2 RETURN ; RETURN TO USER STATE 80$: MOV R2,(R4)+ ; PUT UCB ADDRESS IN HEADER LUT 85$: CALL $RDHDR ; UPDATE HEADER POINTER CLR (R4)+ ; UPDATE HEADER POINTER CALL $RDHDR ; UPDATE HEADER POINTER TST (R5)+ ; UPDATE LABEL POINTER CALL RDLBL ; READ LABEL BLOCK IF NECESSARY TST (R5)+ ; UPDATE LABEL POINTER CALL RDLBL ; READ LABEL BLOCK IF NECESSARY DEC R3 ; ALL UNITS ASSIGNED? BNE 40$ ; NO, DO NEXT ONE 90$: MOV (R4)+,R3 ; GET COUNT OF WINDOW BLOCKS 92$: ADD #W.BLGH,R4 ; SKIP OVER ALL WINDOWS DEC R3 ; DONE? BGT 92$ ; NO, LOOP UNTIL DONE CALL $RDHDR ; UPDATE HEADER BLOCK MOV #$FDB,R5 ; GET FDB ADDRESS MOV F.FNB(R5),(R4)+ ; MOVE IN FILE ID CALL $RDHDR ; MOV F.FNB+2(R5),(R4)+ ; MOVE IN FILE SEQUENCE NUMBER CALL $RDHDR ; MOV F.FNB+4(R5),(R4)+ ; MOVE IN VOLUME SEQUENCE NUMBER CMP (R4)+,(R4)+ ; SKIP TO AREA FOR TASK NAME CALL $RDHDR ; MOV $TCB,R5 ; GET ADDRESS OF TCB MOV T.NAM+2(R5),(R4)+ ; STORE SECOND PART IN R2 CALL $RDHDR ; MOV T.NAM(R5),(R4)+ ; STORE FIRST PART IN R1 ADD #512.,R4 ; FORCE WRITE OF TASK HEADER CALL $RDHDR ; AND DO IT ; ; INSERT TCB INTO STD ; 981$: MOV $TCB,R0 ; GET TCB ADDRESS MOV R0,R1 ; COPY TCB ADDRESS MOV R0,R2 ; TWICE ADD #T.RCVL,R1 ; SET ADDRESS OF RECIEVE LIST HEAD ADD #T.ASTL,R2 ; SET ADDRESS OF AST LIST HEAD MOV R1,T.RCVL+2(R0) ; SET RECIEVE LIST BACK POINTER MOV R2,T.ASTL+2(R0) ; SET AST LIST BACK POINTER BIT #FE.PLA,$FMASK ; PLAS SUPPORTED? BEQ 985$ ; NO MOV R0,R1 ; GET ADDRESS OF ATTACHMENT LIST HEAD ADD #T.ATT,R1 ; MOV R1,T.ATT+2(R0) ; AND SET BACK POINTER MOV R0,R1 ; GET ADDRESS OF RECEIVE BY ADD #T.RRFL,R1 ; REFERENCE LIST HEAD MOV R1,T.RRFL+2(R0) ; SET BACK POINTER TO IT 985$: BIS #TS.OUT!TS.EXE,T.STAT(R0) ; SET OUT AND NOT EXECUTING BIS #T3.PMD,T.ST3(R0) ; SET NO PMD BIT #100,$FLGS ; POST MORTEM DUMP REQUESTED? BNE 99$ ; NO BIC #T3.PMD,T.ST3(R0) ; YES, CLEAR BLOCKING BIT 99$: CALL $SWSTK,180$ ; SWITCH TO SYSTEM STACK MOV #$TSKHD,R1 ; GET POINTER TO TCBS SUB #T.TCBL,R1 ; FAKE IT OUT TO LOOK LIKE REAL TCB 100$: MOV T.TCBL(R1),R2 ; POINT TO NEXT TCB TST T.TCBL(R2) ; IS THIS THE NULL TASK TCB? BEQ 110$ ; YES, SO INSERT NEW TASK BEFORE IT. CMPB T.DPRI(R0),T.DPRI(R2) ; NEW TASK PRI > THIS ONE? BHI 110$ ; YES MOV R2,R1 ; NO, MAKE CURRENT TCB INTO PREVIOUS ONE BR 100$ ; LOOP 110$: MOV R2,T.TCBL(R0) ; SET NEW TCB TO POINT TO CURRENT TCB MOV R0,T.TCBL(R1) ; SET PREVIOUS TCB TO POINT TO NEW TCB. 120$: MOV #TSKTB,R1 ; GET ADDRESS OF SPECIAL TASK NAME TABLE ;HJL050 125$: TST (R1) ; END OF TABLE? ;HJL050 BEQ 150$ ; YES ;HJL050 CMP T.NAM(R0),(R1) ; NO, NAMES THE SAME? ;HJL050 BNE 127$ ; NO ;HJL050 CMP T.NAM+2(R0),2(R1) ; MAYBE ;HJL050 BEQ 130$ ; YES ;HJL050 127$: ADD #6,R1 ; NO, GET ADDRESS OF NEXT ENTRY ;HJL050 BR 125$ ; LOOP ;HJL050 ;HJL050 .IFT ;HJL050 ;HJL050 130$: CMP 4(R1),#$CLIPT ; IS THIS DCLS TCB POINTER? ;HJL050 BNE 140$ ; NO ;HJL050 BIS #T3.CLI,T.ST3(R0) ; FLAG AS CLI ;JAK002 BIT #FE.MUP,$FMASK ; YES, MULTI-USER PROTECTION SUPPORTED? ;HJL050 BEQ 150$ ; NO, DON'T SET POINTER ;HJL050 ;HJL050 .IFF ;HJL050 ;HJL050 130$: ;HJL050 ;HJL050 .ENDC ;HJL050 ;HJL050 140$: MOV R0,@4(R1) ; SET UP ADDRESS OF TASK ;HJL050 150$: BIT #2,$FLGS ; RUN TASK NOW? ;**-25 BEQ 180$ ; NO MOV R0,-(SP) ; SAVE TCB ADDRESS MOV $TKTCB,R2 ; GET OUR TCB ADDRESS MOV T.UCB(R2),R2 ; GET TI TO USE FOR THIS TASK MOV $UIC,R1 ; GET SPECIFIED UIC IF ANY BNE 160$ ; GO IT MOV U.UIC(R2),R1 ; OTHERWISE DEFAULT TO TI UIC 160$: MOV R1,R3 ; COPY UIC BIT #FE.MUP,$FMASK ; MULTI-USER PROTECTION? BEQ 167$ ; NO BIT #U2.PRV,U.CW2(R2) ; YES, IS THIS PRIVILEGED USER? BNE 167$ ; YES, USE R1 AS PROTECTION UIC MOV U.LUIC(R2),R1 ; NO, GET LOGIN UIC FOR PROTECTION 167$: CALL $TSKRP ; REQUEST TASK WITH PROTECTION MOV (SP)+,R0 ; RETRIEVE TCB ADDRESS BIT #4,$FLGS ; REMOVE AFTER RUN? BEQ 170$ ; NO BIS #T3.REM,T.ST3(R0) ; YES, SET REMOVE ON EXIT FLAG 170$: BIT #20,$FLGS ; ESCAPE TERMINATE COMMAND? BEQ 171$ ; NO BIS #T3.MCR,T.ST3(R0) ; YES, SET TO PROMPT ON EXIT 171$: BIT #10000,$FLGS ; PRM= SPECIFIED? [RJDK005] BEQ 180$ ; NO [RJDK005] MOV R0,R5 ; SAVE PTR [RJDK005] MOV #84.,R1 ; LENGTH OF MCRBUFF [RJDK005] CALL $ALOCB ;GET BUFFER [RJDK005] BCS 180$ ;FORGET IF PROBLEMS [RJDK005] MOV R0,R1 ;SAVE MCR BUF PTR [RJDK005] TST (R1)+ ;SKIP LIST HEADER [RJDK005] MOV R5,(R1)+ ;INSERT UCB PTR [RJDK005] MOV #PRMBUF,R3 ;POINT TO TEXT [RJDK005] MOV #40.,R2 ;40 WORDS [RJDK005] 179$: MOV (R3)+,(R1)+ ;MOVE 1 WORD [RJDK005] SOB R2,179$ ;AND MORE [RJDK005] MOV $MCRCB,(R0) ;LINK INTO LIST [RJDK005] MOV R0,$MCRCB ; [RJDK005] 180$: RETURN ; RETURN TO USER STATE AND ROOT .SBTTL SUBROUTINES ;+ ; *** - RDLBL - READ NEXT RECORD OF LABEL IF END OF BUFFER HAS ; BEEN REACHED. ; ; THIS ROUTINE READS THE NEXT BLOCK OF THE HEADER IN ; ; IF THE BUFFER POINTER POINTS BEYOND THE BUFFER ; ; INPUT: ; R5 - BUFFER POINTER, POINTS TO NEXT LOCATION IN BUFFER ; ; OUTPUT: ; R5 - POINTS TO NEXT LOCATION IN BUFFER ; (UPDATED IF READ, LEFT ALONE IF NOT) ; ;- RDLBL: CMP R5,#$LBLBF+512. ; LABEL BLOCK EMTPY? BLO 10$ ; NO MOV #$LBLBF,R0 ; YES, GET BUFFER ADDRESS MOV R0,R5 ; MOV #$LBLBN,R1 ; READ IN ADD #1,(R1) ; POINT TO NEXT ADC 2(R1) ; LABEL BLOCK CALL $READ ; 10$: RETURN ; .SBTTL ERROR PROCESSING INSHD1: MOV #ERR1,R0 ; BR INSHDE ; INSHD2: MOV #ERR2,R0 ; BR INSHDE ; INSHD3: MOV #ERR3,R0 ; GET ERROR MESSAGE ADDRESS MOV R0,-(SP) ; COPY IT ADD #23.,R0 ; SKIP TO END OF MESSAGE MOVB (R5),(R0)+ ; PUT IN DEVICE NAME MOVB 1(R5),(R0)+ ; CLR R2 ; SET TO SUPPRESS LEADING ZEROES MOV 2(R5),R1 ; GET UNIT NUMBER CALL $CBOMG ; CONVERT TO OCTAL MOVB #':,(R0)+ ; PUT IN COLON CLRB (R0) ; MARK TERMINATOR MOV (SP)+,R0 ; RESTORE BUFFER ADDRESS BIS #40,$FLGS ; SET TO RETURN FROM ERROR PRINTING CALL $INSER ; PRINT ERROR RETURN ; INSHDE: TST (SP)+ ; POP OFF RETURN ADDRESS JMP $INSER ; .END