*COMDECK ALMODPARS
      SUBROUTINE MODPARS(ERRTN) 
C 
C 
C 
C        THIS ROUTINE PARSES THE SUBPARAMETERS ON THE MOD 
C        DIRECTIVE, AND PLACES THE RESULTANT VALUES IN THE
C        PROPER MODTABL ENTRY.  UPON RETURN, ERRTN IS SET TRUE
C        IF AN ERROR OCCURRED.
C 
C 
*CALL ALCOMMON
      LOGICAL ERR,ERRTN,ALFANUM,PAGEGVN,EOFFLAG,NUM,NPFLAG,STARTED
      LOGICAL GOTNAME 
C 
      DIMENSION SUBPARM(7),PPARM(4) 
C 
C 
      DATA PARMMAX,SUBPARM / 7, "P","OVLY","PAGE","ADDR","TH","APPL", 
     1   "MADDR"/ 
      DATA PPARMAX,PPARM / 4, "R","P","NP","F"/ 
      DATA ADLNMAX, HIGHBIT, MODULE / 1024, 40000000000000000000B, 2 /
      DATA FILL / "FILL" /
C 
C 
C 
C 
C        INITIALIZE THE ERROR FLAG AND THE PAGE= SUPPLIED FLAG. 
C 
      PAGEGVN = .FALSE. 
      NPFLAG = .FALSE.
      ERRTN = .FALSE. 
      STARTED = .FALSE. 
      GOTNAME = .FALSE. 
C 
C        GET THE MODULE NAME. 
C 
    6 CALL GETPARM(MNAME,ERR) 
      IF (MNAME.EQ.BLANKS) GO TO 1100 
      GOTNAME = .TRUE.
      IF (ERR) GO TO 900
C 
C        IF IT DID NOT END WITH A LEFT PARENTHESIS, 
C        CHECK FOR CONTINUATION.
C 
    5 IF (CARD(CARDPTR).EQ.LPAREN) GO TO 4
      IF (CARD(CARDPTR).EQ.BLANK) GO TO 1100
      GO TO 900 
C 
C        OTHERWISE, STASH THE NAME. 
C 
    4 STARTED = .TRUE.
      MODCNTR = MODCNTR + 1 
      MODTABL(1,MODCNTR) = AND(MNAME,MODNAME) 
C 
C        POINT TO THE NEXT COLUMN.
C 
    1 CARDPTR = CARDPTR + 1 
C 
C        BRANCH IF A CONTINUATION IS INDICATED. 
C 
      IF (CARD(CARDPTR).EQ.BLANK) GO TO 1100
C 
C        GET THE SUB-PARAMETER AND MAKE SURE IT IS FOLLOWED BY AN 
C        EQUALS SIGN. 
C 
      CALL GETPARM(PARAM,ERR) 
      IF (PARAM.EQ.FILL) GO TO 70 
      IF (PARAM .EQ. "SAM") GO TO 80
      IF (ERR .OR. CARD(CARDPTR).NE.EQUALS) GO TO 910 
C 
C        LOCATE THE SUB-PARAMETER IN THE LIST OF VALID PARAMETERS,
C        AND BRANCH TO PROCESS THE ERROR IF IT CANNOT BE FOUND. 
C 
      DO 2 I=1,PARMMAX
      IF (PARAM.EQ.SUBPARM(I)) GO TO 3
    2 CONTINUE
      GO TO 910 
C 
C        INCREMENT THE COLUMN POINTER AND BRANCH ACCORDING TO 
C        THE SUB-PARAMETER. 
C 
    3 CARDPTR = CARDPTR + 1 
      GO TO (10,20,30,40,50,60,90), I 
C 
C 
C        P= PARAMETER 
C 
C        SET THE P= SPECIFIED FLAG
C 
   10 MODTABL(4,MODCNTR) = OR(MODTABL(4,MODCNTR),PGVNMSK) 
C 
C        GET THE TYPE OF PAGING ATTRIBUTE.
C 
      CALL GETPARM(PARAM,ERR) 
      IF (ERR) GO TO 915
C 
C        SEARCH FOR IT IN THE TABLE OF VALID ATTRIBUTES, AND
C        BRANCH TO PROCESS THE ERROR IF IT IS NOT IN THERE. 
C 
      DO 11 I=1,PPARMAX 
      IF (PARAM.EQ.PPARM(I)) GO TO 12 
   11 CONTINUE
      GO TO 915 
C 
C        INSERT THE SPECIFIED P VALUE.
C 
   12 VALUE = AND(MODTABL(5,MODCNTR),COMPL(PVALMSK))
      MODTABL(5,MODCNTR) = OR(VALUE,SHIFT(I-1,PVALSHF)) 
      IF (I.EQ.3) NPFLAG = .TRUE. 
C 
C        FLAG AN ERROR IF THE USER SPECIFIES P=NP, BUT HAS
C        ALSO GIVEN THE PAGE= PARAMETER.
C 
   14 IF (I.EQ.3 .AND. PAGEGVN) GO TO 920 
C 
C        BRANCH IF AT THE END OF THE PARAMETER. 
C 
   13 IF (CARD(CARDPTR).EQ.RPAREN) GO TO 1000 
C 
C        BRANCH IF THERE IS ANOTHER PARAMETER FOLLOWING.
C 
      IF (CARD(CARDPTR).EQ.COMMA) GO TO 1 
C 
C        OTHERWISE, WE HAVE AN ERROR. 
C 
      GO TO 925 
C 
C 
C        OVLY= PARAMETER
C 
C        GET THE OVERLAY NAME.
C 
   20 CALL GETPARM(VALUE,ERR) 
      IF (ERR) GO TO 930
C 
C        INSERT THE NAME INTO THE MODTABL ENTRY.
C 
      MODTABL(5,MODCNTR) = OR(MODTABL(5,MODCNTR),AND(VALUE,OVNAMSK))
      GO TO 13
C 
C 
C        PAGE= PARAMETER
C 
C        INDICATE THAT THIS PARAMETER WAS SUPPLIED
C 
   30 PAGEGVN = .TRUE.
C 
C        GET THE PAGE NUMBER. 
C 
      CALL GETNUM (VALUE,ERR) 
      IF (ERR) GO TO 935
C 
C        FLAG AN ERROR IF THE USER ALSO SPECIFIED P=NP. 
C 
   31 IF (NPFLAG) GO TO 920 
      MODTABL(5,MODCNTR) = OR(AND(MODTABL(5,MODCNTR), 
     1     COMPL(PGVLMSK)),SHIFT(VALUE+1,PGVLSHF),
     1     SHIFT(PAGABLE,PVALSHF))
      GO TO 13
C 
C 
C        ADDR= PARAMETER
C 
C        BRANCH IF THIS IS AN ABSOLUTE ADDRESS. 
C 
   40 IF (NUM(CARD(CARDPTR))) GO TO 45
C 
C        ALPHA ADDRESSES ARE NOT CURRENTLY ACCEPTED, ALTHOUGH MOST OF 
C        THE CODE IS HERE TO DO IT. 
C 
      GO TO 940 
C 
C        IF AN ABSOLUTE LOAD ADDRESS IS GIVEN, CONVERT IT RIGHT HERE. 
C 
45       CONTINUE 
   46 CALL GETNUM(ADDR,ERR) 
      IF (ERR) GO TO 940
C 
C        DETERMINE WHETHER THE MODULE BEGINS AT LOCATION $0000. 
C        IF SO, SAVE THE MODULE NAME FOR LATER USE. 
C 
      IF (ADDR .NE. 0) GO TO 48 
      IF (ZEROFLG)     GO TO 48 
      ZEROFLG = .TRUE.
      ZERONAM = AND(MODTABL(1,MODCNTR),MODNAME) 
C 
C        WHEN ALL DONE, INSERT THE CURRENT ADDRESS VALUE INTO 
C        THE PROPER MODTABL ENTRY.
C 
   48 MODTABL(1,MODCNTR) = OR(MODTABL(1,MODCNTR),ADDR)
      MODTABL(4,MODCNTR) = OR(MODTABL(4,MODCNTR),ADRFLAG) 
      GO TO 13
C 
C 
C        TH= PARAMETER
C 
C        GET THE TOPHAT NAME
C 
   50 CALL GETPARM(VALUE,ERR) 
      IF (ERR) GO TO 945
      MODTABL(4,MODCNTR) = OR(MODTABL(4,MODCNTR),AND(VALUE,THNMASK))
      GO TO 13
C 
C 
C        APPL= PARAMETER
C 
C        SET THE APPLICATIONS BIT MAP TO ZERO.
C 
   60 APPLBIT = 0 
C 
C        GET AN APPLICATION NAME. 
C 
   61 CALL GETPARM(VALUE,ERR) 
      IF (ERR) GO TO 950
C 
C        MAKE SURE THE APPLICATION WAS DEFINED IN AN APPL DIRECTIVE.
C        BRANCH TO PROCESS THE ERROR IF NOT.
C 
      DO 62 I=1,APPLCTR 
      IF (AND(VALUE,ANAMASK) .EQ. AND(APPLNAM(I),ANAMASK)) GO TO 63 
   62 CONTINUE
      GO TO 950 
C 
C        SET THE BIT IN THE APPLICATION BIT MASK. 
C 
   63 APPLBIT = OR(APPLBIT,SHIFT(HIGHBIT,I))
C 
C        IF THE NEXT COLUMN IS A SLASH, GO GET ANOTHER APPLICATION NAME.
C 
      IF (CARD(CARDPTR).NE.SLASH) GO TO 65
      CARDPTR = CARDPTR + 1 
         IF (CARD(CARDPTR) .NE. BLANK) GO TO 61 
         CALL RDACARD (INPUT,EOFFLAG) 
         IF (EOFFLAG) GO TO 955 
         CARDPTR = 1
         GO TO 61 
C 
C        PUT THE MAP IN THE MODTABL ENTRY.
C 
   65 MODTABL(3,MODCNTR) = APPLBIT
      GO TO 13
C 
C 
C 
C        FILL PARAMETER.
C 
C 
   70 MODTABL(4,MODCNTR) = OR(MODTABL(4,MODCNTR),FILLMSK) 
      GO TO 13
* 
*        SAM PARAMETER
* 
80       CONTINUE 
         IF (.NOT. SAMAFLG) GO TO 960 
85       CONTINUE 
         MODTABL(4,MODCNTR) = MODTABL(4,MODCNTR).OR.SAMMASK 
         SAMMFLG = .TRUE. 
         GO TO 13 
* 
*        MADDR= PARAMETER 
* 
90       CONTINUE 
* 
*        GET THE MODULO ADDRESS 
* 
         CALL GETNUM (MADDR,ERR)
         IF (ERR) GO TO 935 
* 
*        BRANCH IF NOT VALID RANGE (2-256)
* 
         IF ((MADDR .LT. 2) .OR. (MADDR .GT. 256)) GO TO 965
* 
*        ENTER MODULO VALUE-1 IN MOD TABLE
* 
         MODTABL(4,MODCNTR) = MODTABL(4,MODCNTR).OR.(MADDR-1) 
         MDUFLAG = .TRUE. 
         GO TO 13 
C 
C 
C 
C 
C        ERROR BRANCHES 
C 
C 
C        INVALID MOD NAME 
C 
  900 CALL ERRMSG(MODULE,18)
      GO TO 1000
C 
C        UNRECOGNIZABLE MOD SUB-PARAMETER 
C 
  910 CALL ERRMSG(MODULE,20)
      GO TO 1000
C 
C        INVALID P= PARAMETER 
C 
  915 CALL ERRMSG(MODULE,21)
      GO TO 14
C 
C        BOTH P=NP AND PAGE=N SPECIFIED 
C 
  920 CALL ERRMSG(MODULE,22)
      GO TO 13
C 
C        INVALID MOD DIRECTIVE TERMINATOR 
C 
  925 CALL ERRMSG(MODULE,23)
      GO TO 1000
C 
C        INVALID OVERLAY NAME 
C 
  930 CALL ERRMSG(MODULE,24)
      GO TO 1000
C 
C        INVALID NUMERIC VALUE
C 
  935 CALL ERRMSG(MODULE,25)
      GO TO 31
C 
C        INVALID ADDRESS SPECIFICATION
C 
  940 CALL ERRMSG(MODULE,26)
      ADLEN = ADLNMAX 
      GO TO 13
C 
C        INVALID TOPHAT NAME
C 
  945 CALL ERRMSG(MODULE,27)
      GO TO 1000
C 
C        INVALID APPLICATION NAME 
C 
  950 CALL ERRMSG(MODULE,28)
      GO TO 1000
C 
C        EOF READ WHEN CONTINUATION EXPECTED
C 
  955 CALL ERRMSG(MODULE,29)
      GO TO 1000
* 
*        SAM ON MOD CARD BUT AREA NOT SPECIFIED 
* 
960      CONTINUE 
         WARNING = .TRUE. 
         CALL ERRMSG (MODULE,60)
         GO TO 85 
* 
*        INVALID MODULO ADDRESS 
* 
965      CONTINUE 
         CALL ERRMSG (MODULE,61)
C 
C 
C        SET THE RETURN ERROR FLAG. 
C 
 1000 ERRTN = ERROR 
      RETURN
C 
C 
C 
C        BRANCH HERE WHEN A CONTINUATION IS INDICATED.  READ
C        THE NEXT CARD AND FLAG AN ERROR IF EOF OCCURS. 
C 
 1100 CALL RDACARD(INPUT,EOFFLAG) 
      IF (EOFFLAG) GO TO 955
      CARDPTR = 0 
      IF (STARTED) GO TO 1
      CARDPTR = 1 
      IF (GOTNAME) GO TO 5
      GO TO 6 
      END 
C 
C 
