; INSTAL.MAC ; ; CALL IS CALL "INSTAL"(I$,J) ; ; WHERE I$ = INSTALL COMMAND LINE MINUS "INS " ; J = SUCCESS CODE ; > 0 SUCCESSFUL INSTALL ; = -1 UNSUCCESSFUL INSTALL ; = -2 BAD INSTALL COMMAND LINE ; ; I.E. CALL "INSTAL"("LB:[11,1]DRS/TASK=...DRS",J) ; ; NOTE: 1) THE DEVICE MUST BE SPECIFIED ; 2) THE ACCOUNT MUST BE SPECIFIED ; 3) THE INSTALLED TASK NAME MUST BE SPECIFIED ; 4) THE 1ST PART OF THE INSTALLED TASK NAME MUST BE '...' ; ; IDENTIFYING INFO: ; .MCALL ULODHD ;CALL MACRO ;IDENTIFY START OF CODE, END OF CODE ;AND ONE ENTRY POINT ULODHD START,END,INSTAL ; .GLOBL ASTOR5 .GLOBL INFSTD .GLOBL INFDEV ; .MCALL DIR$ SPWN$ STSE$S ; AC0=%0 ; ; FOLLOWING MACRO IS USED TO GET THE ABSOLUTE ADDRESS OF A LOCALLY ; DEFINED LABEL IN POSITION INDEPENDENT FASHION (NEEDED FOR LOADABLE ; ROUTINES). ; .MACRO GTABAD ADDRES,LOC .NTYPE ...ATP,LOC .IF GT ...ATP-5 MOV PC,-(SP) ADD #ADDRES-.,(SP) MOV (SP)+,LOC .IFF MOV PC,LOC ADD #ADDRES-.,LOC .ENDC .ENDM GTABAD ; ; NOW THE CODE ITSELF ; START: ;LABLE ACTUAL START OF CODE TSKNAM: .WORD 0 ;RAD-50 TASK NAME (PART 1) TSKNM1: .WORD 0 ; (PART 2) VCPUD: .WORD 0 ;PUD ADDRESS OF VC: STDSW: .WORD 0 ;STORE DSW FROM INSTALL SPAWN INSLEN: .WORD 0 ;COMMAND LINE LENGTH INSMES: .BLKB 120 STOSCA: STSE$S 1 ;STOP UNTIL SPAWNED TASK FINISHES INSSCA: SPWN$ ...INS,GEN,,1,1,1,,,INSMES,INSLEN ;SPAWN INS UNDER UIC [1,1] ; INSTAL: JSR R4,@#GTRGPI ;GO GET ARGUMENTS IN PI FASHION .BYTE 3,2,4,0 ;THIS IS ARG TYPE LIST ;3 = INPUT STRING (TO SUBROUTINE) ;2 = OUTPUT NUMBER (TO MAIN PROG.) ;4 = OUTPUT STRING (TO MAIN PROG.) .EVEN ;WE NOW HAVE THIS DATA ON THE STACK ;SP+16 5 WORD BLOCK ;SP+4 5 WORD BLOCK ;SP> 2-WORD INPUT DESCRIPTOR ; (SP)=LEN, 2(SP)=ADDR JSR PC,@#PARCHK ;CHECK FOR TRAILING RIGHT PAREN ;(ALSO BUMPS TEXT POINTER) MOV R1,-(SP) ;SAVE TEXT PTR ; MOV 4(SP),R1 ;LET'S CHECK COMMAND LINE FOR ':' MOV 2(SP),R2 1$: CMPB (R1)+,#': BEQ 2$ SOB R2,1$ JMP 40$ ;NO ':' (MEANING NO DEVICE SPECIFIED), ERROR ; 2$: MOV 4(SP),R1 ;LET'S CHECK COMMAND LINE FOR '[' MOV 2(SP),R2 3$: CMPB (R1)+,#'[ BEQ 4$ SOB R2,3$ JMP 40$ ;NO '[' (MEANING NO ACCOUNT SPECIFIED), ERROR ; 4$: MOV 4(SP),R0 ;LET'S CHECK FOR '=...' MOV 2(SP),R2 MOV #1,R1 5$: CMPB (R0)+,#'= BEQ 6$ SOB R2,5$ JMP 40$ ;NO '=' (MEANING NO 'TASK=' SPECIFIED), ERROR ; 6$: JSR PC,@#ASTOR5 ;CONVERT 1ST PART OF INSTALLED TASK NAME CMP R1,#^R... ; WHICH SHOULD BE '...' BEQ 7$ JMP 40$ ;NO '...' (MEANING NO '...XXX' TASK NAME), ERROR ; 7$: MOV R1,TSKNAM ;STORE 1ST PART FOR LATER USE MOV #1,R1 JSR PC,@#ASTOR5 ;CONVERT 2ND HALF MOV R1,TSKNM1 ;AND STORE IT TOO (FOR LATER USE) ; ; COMMAND LINE SEEMS TO BE OK, SO LET'S CONTINUE ; ; MOV #INSMES,R0 ;MOVE IN 'INS ' GTABAD INSMES,R0 ;MOVE IN 'INS ' MOVB #'I,(R0)+ MOVB #'N,(R0)+ MOVB #'S,(R0)+ MOVB #' ,(R0)+ ; MOV 4(SP),R1 ;FILL IN REST OF COMMAND LINE MOV 2(SP),R2 10$: MOVB (R1)+,(R0)+ SOB R2,10$ ; MOV #INSMES,R1 GTABAD INSMES,R1 SUB R1,R0 MOV R0,INSLEN ;STORE LENGTH OF INSTALL COMMAND LINE ; ; CLR R0 ;SET UP FOR CALL ; MOV #"CO,R4 ;DEV NAME IN R4 ; CLR R5 ;UNIT # IN R5 ; JSR PC,@#INFDEV ;FIND PUD ADDRESS OF CO ; MOV R5,VCPUD ;SAVE PUD ADDRESS OF VC ; MOV #177777,U.RB(R5) ;MAKE CO PRIV TERM SO INS IS OK ; BIS #UT.PR,U.TF(R5) ;AND MAKE PRIV ALSO ; ; MOV .CRTSK,R4 ;GET MY ATL ; MOV A.TI(R4),-(SP) ;SAVE MY TI POINTER ; MOV VCPUD,A.TI(R4) ;MAKE INSTALL RUN AT VC GTABAD INSSCA,R0 ;GET ADDRESS OF INSTALL SPAWN GTABAD INSMES,R1 ;GET ADDRESS OF INSTALL COMMAND LINE MOV R1,S.PWCA+0(R0) ; AND INSERT SAME MOV INSLEN,R1 ;GET LENGTH OF INSTALL COMMAND LINE MOV R1,S.PWCL+0(R0) ;AND INSERT SAME DIR$ R0 ;SPAWN INSTALL TO INSTALL TASK MOV @#$DSW,STDSW ;STORE DSW FROM INSTALL SPAWN GTABAD STOSCA,R0 ;GET ADDRESS OF INSTALL STOP FOR EVENT DIR$ R0 ;WAIT FOR INSTALL CMP STDSW,#1 ;WAS INSTALL SPAWN SUCCESSFUL BEQ 11$ ;YES, CONTINUE JMP 31$ ;NO, RETURN DSW FROM SPAWN 11$: ; MOV (SP)+,A.TI(R4) ;RESTORE MY TI POINTER ; MOV #TSKNAM,R1 ;POINT TO FULL RAD-50 NAME ; JSR PC,@#INFSTD ;FIND HIS STD ; TST R2 ;BETTER HAVE STD ADDRESS ; BNE 12$ ;BR IF OK ; JMP 30$ ;REPORT ERROR ;12$: BIS #SF.RM,S.FW(R2) ;SET REMOVE-ON-EXIT FLAG ; MOV INSLEN,R0 ;RETURN COMMAND LINE LENGTH LDCIF R0,AC0 ;>0 = SUCCESSFUL INSTALL 20$: MOV SP,R5 ;SET UP ADD #6,R5 ; RETURN ADDRESS JSR PC,@#NSTORE ;AND RETURN THE STATUS TO THE CALLER ; MOV SP,R5 ;SET UP ADD #20,R5 ; RETURN ADDRESS ; MOV #INSMES,R3 ;ADDRESS OF STRING TO BE RETURNED GTABAD INSMES,R3 ;ADDRESS OF STRING TO BE RETURNED MOV INSLEN,R4 ; AND ITS LENGTH JSR PC,@#SSTORE ;AND RETURN THE "INS ..." STRING USED MOV (SP)+,R1 ;RESTORE TEXT PTR ADD #14*2,SP ;CLEAN STACK OF 12 WORDS RTS PC ;AND RETURN ; 30$: LDCIF #-30.,AC0 ;-30. = UNSUCCESSFUL INSTALL BR 32$ 31$: LDCIF STDSW,AC0 ;STORE DSW VALUE 32$: MOV #0,INSLEN ;AND ZERO OUT RETURN STRING LENGTH JMP 20$ ; 40$: LDCIF #-40.,AC0 ;-40. = BAD INSTALL COMMAND LINE MOV #0,INSLEN ;AND ZERO OUT RETURN STRING LENGTH JMP 20$ ; END: ;LABLE END OF CODE .END