.TITLE $INSPS - INSTALL COMMAND PARSER .IDENT "03" ; ; 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: 03 ; BY: H. LEV ; DATE: 10/01/73 ; MODIFIED: 12/10/74 ADD PMD SWITCH ; 3/11/75 REMOVE NON-FILE SYSTEM CODE ; 4/24/75 ADD SYSTEM CONTROLLED PARTITION SUPPORT ; ; HJL025 3/12/76 CHANGE PCB, TCB AND TASK HEADER FORMAT ; ; HJL035 6/28/76 ADD SUPPORT FOR DYNAMIC ALLOCATION OF ; CHECKPOINT SPACE. ; ; ; ; THIS MODULE CONTAINS THE PARSER FOR THE MCR INSTALL COMMAND ; .MCALL CALL,RETURN,DIR$ .SBTTL EQUATED SYMBOLS CR = 015 ; CARRIAGE RETURN SPA = 040 ; SPACE ESC = 033 ; ESCAPE (ALTMODE) EFN1 = 1 ; EVENT FLAG LUN1 = 1 ; TASK IMAGE DEVICE .SBTTL LOCAL DATA ; ; ERROR FLAG - PLACE TO SAVE CARRY BIT WHEN ON SYSTEM STACK ; ERRFLG: .WORD 0 ; KEYFLG: .WORD 0 ; KEYWORD FLAG WORD - INDICATES SWITCHES FOUND ; 1 ; PRIORITY BIT ; 2 ; TASK BIT ; 4 ; UIC BIT ; 10 ; CKP BIT ; 20 ; RUN BIT ; 40 ; PAR BIT ; 100 ; PMD BIT ; 200 ; PMD FLAG SEEN ; 400 ; INC BIT ; 1000 ; SLV BIT ; 2000 ; SLV FLAG SEEN ; 4000 ; CKP FLAG SEEN ; ; KEYWORD TABLES ; FORMAT OF ENTRIES: ; WORD 1 - ADDRESS OF KEYWORD TEXT ; WORD 2 - ADDRESS OF KEYWORD PROCESSING ROUTINE ; END OF TABLE IS INDICATED BY ZERO WORD ; KEYTAB: .WORD 10$ ; KEYWORD POINTER TABLE .WORD INSPRI ; .WORD 20$ ; .WORD INSTSK ; .WORD 30$ ; .WORD INSUIC ; .WORD 40$ ; .WORD INSCKP ; .WORD 50$ ; .WORD INSRUN ; .WORD 60$ .WORD INSPAR .WORD 70$ ; .WORD INSPMD ; .IF DF M$$MGE .WORD 80$ ; .WORD INSINC ; .ENDC .WORD 90$ ; .WORD INSSLV ; .WORD 0 ; END OF KEYWORD POINTER TABLE 10$: .ASCIZ /PRI/ ; KEYWORDS 20$: .ASCIZ /TASK/ ; 30$: .ASCIZ /UIC/ ; 40$: .ASCIZ /CKP/ ; 50$: .ASCIZ /RUN/ ; 60$: .ASCIZ /PAR/ ; 70$: .ASCIZ /PMD/ ; 80$: .ASCIZ /INC/ ; 90$: .ASCIZ /SLV/ ; .EVEN INSDEV: .WORD 0 ; DEVICE MNEMONIC INSUNT: .WORD 0 ; UNIT NUMBER .SBTTL ERROR MESSAGES ERR2: .ASCIZ <15>/INS -- SYNTAX ERROR/ ERR3: .ASCIZ <15>/INS -- INVALID KEYWORD/ ERR4: .ASCIZ <15>/INS -- ILLEGAL PRIORITY/ ERR5: .ASCIZ <15>/INS -- ILLEGAL UIC/ ERR6: .ASCIZ <15>/INS -- NO ROOM AVAILABLE IN STD FOR NEW TASK/ .EVEN .SBTTL OVERLAY CODE ;+ ; *** - INSPS - MCR INSTALL COMMAND PARSER OVERLAY ; THIS OVERLAY OBTAINS THE COMMAND LINE FROM MCR ; AND PARSES IT. BEFORE PASSING THE LINE TO THIS ROUTINE ; MCR HAS REMOVED ALL TABS AND MULTIPLE SPACES. ; THIS OVERLAY OBTAINS THE FILE NAME AND KEYWORD PARAMETERS, ; SETS THESE PARAMETERS IN $MPARS OPENS THE TASK IMAGE FILE, ; AND ALLOCATES SPACE FOR A TCB. ; ;- $INSPS:: MOV R5,R0 ; GET BUFFER POINTER MOVB (R0)+,R2 ; GET NEXT CHARACTER CLR KEYFLG ; ZERO KEYWORD FLAG MOV #$PRIO,R1 ; GET ADDRESS OF PARAMETER AREA MOV #<$FNAME-$PRIO>/2,R3 ; SET WORD COUNT 90$: CLR (R1)+ ; CLEAR WORD DEC R3 ; DONE BNE 90$ ; NO, LOOP MOV #100,$FLGS ; SET DEFAULT TO NO POST-MORTEM DUMP ; TEST FOR ANOTHER KEYWORD ; .ENABL LSB INSKEY: CMPB R2,#SPA ; IS NEXT CHAR A SPACE ? BNE 10$ ; NO MOVB (R0)+,R2 ; YES, SKIP IT BR INSKEY ; 10$: CMPB R2,#'/ ; ANOTHER KEYWORD COMING? BEQ INSKWD ; YES GO GET IT CMPB R2,#CR ; END OF LINE? BEQ 15$ ; YES CMPB R2,#ESC ; ESCAPE? BNE 20$ ; NO, ERROR BIS #20,$FLGS ; YES, SET ESCAPE FLAG 15$: JMP INSOPN ; 20$: JMP INSPS2 ; SYNTAX ERROR 25$: JMP INSPS4 ; INVALID PRIORITY ; ; GET KEYWORD NAME ; INSKWD: MOV #KEYTAB,R5 ; GET KEYWORD TABLE ADDRESS MOV #1,R4 ; SET KEYWORD FLAG 40$: MOV (R5)+,R1 ; GET ADDRESS OF NEXT KEYWORD BEQ 45$ ; ZERO, MEANS END OF TABLE CALL .KEYWD ; TEST FOR IT BCC 50$ ; FOUND IT ASL R4 ; NO, NOT THIS KEYWORD TST (R5)+ ; SKIP PROCESSING ROUTINE ADDRESS BR 40$ ; LOOP 45$: JMP INSPS3 ; INVALID KEYWORD ; ; GOOD KEYWORD FOUND JUMP TO PROCESSING ROUTINE IF NOT A DUPLICATE ; 50$: BVC 60$ ; EQUALS FOUND, GOOD BIT #20,R4 ; RUN? BEQ 70$ ; NO, ERROR BIS #2,$FLGS ; YES, SET RUN FLAG BR INSKEY ; 60$: BIT R4,KEYFLG ;HAVE WE SEEN THIS ONE BEFORE? BNE 70$ ; YES, SYNTAX ERROR BIS R4,KEYFLG ; NO, SET FLAG JMP @(R5) ; GO PROCESS KEYWORD 70$: JMP INSPS2 ; SYNTAX ERROR ; ; PRIORITY ; INSPRI: CALL $GTNUM ; GET PRIORITY AND CONVERT TO BINARY CMP R1,#250. ; IS IT A VALID PRIORITY? BGT 25$ ; NO INVALID PRIORITY MOV R1,$PRIO ; YES, SAVE IT BR INSKEY ; ; ; TASK NAME AND PARTITION NAME ; INSPAR: MOV #$PAR,R4 ; SET POINTER TO PARTITION NAME BR INSNAM ; SKIP INSTSK: MOV #$TASK,R4 ; SET POINTER TO TASK NAME .DSABL LSB INSNAM: MOV PC,R1 ; SET TO ALLOW PERIODS CALL $CAT5 ; GET 1ST 3 CHARS OF NAME MOV R1,(R4) ; STORE THEM BCS 10$ ; SKIP IF LESS THAN 3 CHARS CALL $CAT5 ; GET 2ND 3 CHARS MOV R1,2(R4) ; STORE THEM BCS 10$ ; SKIP IF LESS THAN 3 CHARS MOVB (R0)+,R2 ; GET NEXT CHARACTER 10$: TST (R4) ; DID WE GET A NAME? BNE INSKEY ; YES INSYNE: JMP INSPS2 ; NO, SYNTAX ERROR INSILL: JMP INSPS5 ; ILLEGAL UIC ; ; UIC ; INSUIC: MOVB (R0)+,R2 ; GET NEXT CHARACTER CMPB R2,#'[ ; BRACKET? BNE INSYNE ; NO, SYNTAX ERROR CALL $GTNUM ; YES, GET PROJECT NUMBER MOVB R1,$UIC+1 ; STORE IT BEQ INSILL ; ZERO IS ILLEGAL UIC CMP R1,#377 ; IS IT LEGAL? BHI INSILL ; NO, ILLEGAL UIC CMPB R2,#', ; SEPARATED FROM PROGRAMMER BY COMMA? BNE INSPS2 ; NO, ILLEGAL UIC CALL $GTNUM ; GET PROGRAMMER CODE MOVB R1,$UIC ; SAVE IT BEQ INSPS5 ; ZERO IS ILLEGAL, ERROR! CMP R1,#377 ; IS IT LEGAL? BHI INSPS5 ; NO CMPB R2,#'] ; END BRACKET? BNE INSPS2 ; NO, SYNTAX ERROR MOVB (R0)+,R2 ; GET NEXT CHARACTER BR INSKEY ; ; ; SLAVE FLAG ; INSSLV: MOV #1000,R1 ; SET BIT FOR SLAVE TASK BIS #2000,$FLGS ; SET SLAVE FLAG SEEN BR INSYN ; ; ; CHECKPOINT FLAG ; INSCKP: MOV #1,R1 ; SET BIT FOR CHECKPOINT BIS #4000,$FLGS ; SET CKP SWITCH SEEN BR INSYN ; ; ; POST MORTEM DUMP FLAG ; INSPMD: MOV #100,R1 ; SET BIT FOR POST MORTEM DUMP BIS #200,$FLGS ; SET PMD SWITCH SEEN INSYN: MOVB (R0)+,R2 ; GET NEXT CHARACTER CMPB R2,#SPA ; SPACE? BEQ INSYN ; YES, SKIP IT CMPB R2,#'Y ; "YES"? BEQ 10$ ; YES CMPB R2,#'N ; "NO"? BNE INSPS2 ; NO, SYNTAX ERROR TSTB (R0)+ ; SKIP "O" BIS R1,$FLGS ; SET DISABLE FLAG OPTION BR 20$ ; 10$: CMPB (R0)+,(R0)+ ; SKIP "ES" BIC R1,$FLGS ; ENABLE OPTION 20$: MOVB (R0)+,R2 ; GET NEXT CHARACTER JMP INSKEY ; ; ; RUN TASK AFTER INSTALL ; INSRUN: MOVB (R0)+,R2 ; GET NEXT CHARACTER CMPB R2,#SPA ; IS IT A SPACE BEQ INSRUN ; YES, SKIP IT CMPB R2,#'R ; NO, "REM"? BNE INSPS2 ; NO , ERROR CMPB (R0)+,#'E ; BNE INSPS2 ; NO, ERROR CMPB (R0)+,#'M ; BNE INSPS2 ; NO, ERROR BIS #6,$FLGS ; YES, SET RUN AND REMOVE FLAG MOVB (R0)+,R2 ; GET NEXT CHARACTER JMP INSKEY ; GET NEXT KEYWORD ; ; INCREASE TASK SIZE ; INSINC: CALL $GTNUM ; GET SIZE TO INCREASE TASK BY ADD #37,R1 ; ROUND UP TO NEXT 32 WORD BLOCK ASR R1 ; CONVERT TO 32 WORD BLOCKS BIC #100000,R1 ; CLEAR SIGN BIT ASR R1 ; ASR R1 ; ASR R1 ; ASR R1 ; BIT #FE.PLA,$FMASK ; PLAS SUPPORTED BNE 10$ ; YES, SKIP TEST CMP R1,#2000 ; INCREASING BY 32K? BGE INSPS2 ; YES, ERROR 10$: MOV R1,$EXTSZ ; SET EXTEND SIZE BIS #400,$FLGS ; SET /INC SWITCH SEEN JMP INSKEY ; GET NEXT KEYWORD ; ; COMMAND HAS BEEN PARSED, ALLOCATE SPACE FOR TCB ; INSOPN: CALL $SWSTK,5$ ; SWITCH TO SYSTEM STACK MOV #T.LGTH,R1 ; SET LENGTH OF TCB CALL $ALOCB ; ALLOCATE IT ROR ERRFLG ; SAVE CARRY BIT MOV R0,$TCB ; SAVE ADDRESS RETURN ; RETURN TO USER STACK 5$: ROL ERRFLG ; RESTORE CARRY BIT BCS INSPS6 ; ERROR, NO SPACE FOR TCB MOV $TCB,R0 ; GET TCB ADDRESS MOV #T.LGTH,R1 ; GET LENGTH OF TCB ASR R1 ; CONVERT TO WORD COUNT 10$: CLR (R0)+ ; ZERO IT OUT DEC R1 ; DONE BNE 10$ ; NO LOOP RETURN ; RETURN TO ROOT .SBTTL ERROR PROCESSING INSPS2: MOV #ERR2,R0 ; COMMAND SYNTAX ERROR BR INSPSE ; INSPS3: MOV #ERR3,R0 ; UNKOWN KEYWORD IDENTIFIER BR INSPSE ; INSPS4: MOV #ERR4,R0 ; ILLEGAL PRIORITY BR INSPSE ; INSPS5: MOV #ERR5,R0 ; ILLEGAL UIC BR INSPSE ; INSPS6: MOV #ERR6,R0 ; NO ROOM AVAILABLE IN STD FOR NEW TASK .IF NDF M$$FCS BR INSPSE ; INSPS9: MOV #ERR9,R0 ; ILLEGAL DEVICE/VOLUME .ENDC INSPSE: TST (SP)+ ; POP OFF RETURN ADDRESS JMP $INSER ; .END