*COMDECK  COMAERR            ERROR MACROS 
          CTEXT  COMAERR - ERROR MACROS.
 COMAERR  SPACE  4,10 
***       DIAGNOSTICS SECTION OF COMPILER.
* 
*         GENERAL DISCUSSION OF DIAGNOSTICS --
* 
*         ALL DIAGNOSTICS FOR SOURCE FORTRAN MUST BE CONTAINED WITHIN 
*         THIS SECTION OF THE COMPILER. WHEN A NEW DIAGNOSTIC IS TO BE
*         ADDED THE FOLLOWING GENERAL RULES MUST BE ADHERED TO -- 
*         1.  ALL DIAGNOSTICS MUST START WITH  E.XXX
* 
*             WHERE XXX HAS SOME MEANING AS TO THE SECTION WHERE THE
*             ERROR WAS DETECTED. 
* 
*         2.  ANY DIAGNOSTIC THAT USES A FILL. AND DOES NOT PRESET IT TO
*             INTERNAL FORM MUST HAVE EITHER *S* OR *V* AS THE SECOND 
*             CHARACTER SPECIFIED IN THE DIAGNOSTIC DEFINITION. 
*                *S* FORM = FILL. IS ALREADY IN 0L FORM.
*                *V* FORM = FILL. SHOULD BE FORMED FROM *SB* STARTING 
*                           AT B4.
* 
*         3.  ALL *ANSI* DIAGNOSTICS SHOULD USE *ANSI* MACRO TO OUTPUT
*             GIVEN ANSI ERROR. (THIS WILL IMPROVE THE SPEED OF 
*             COMPILATION WHEN *ANSI* ERRORS ARE NOT REQUESTED.)
* 
*         4.  ALL COLON/SEMICOLON BREAKS IN DIAGNOSTICS MUST USE *--* 
*             TO REPRESENT BREAK. 
* 
*         5.  DIAGNOSTICS MAY BE ANY OF THE FOLLOWING TYPES 
*            (ONLY THE FIRST CHARACTER OF TYPE IS USED...)
* 
*            A - ANSI.  USAGE DOES NOT CONFORM TO AMERICAN NATIONAL 
*                STANDARD FORTRAN, X3J3/90-1977.
* 
*            C - CONTINUATION.  THIS IS A CONTINUATION OF A PREVIOUS
*                DIAGNOSTIC.  IT WILL GET PRINTED OR NOT ACCORDING TO 
*                WHETHER THE PREVIOUS ERROR WAS SELECTED. 
  
*            D - DEBUG.  INFORMATIVE FOR MAINTENANCE.  TEST MODE ONLY.
* 
*            F - FATAL.  FATAL TO EXECUATION.  INHIBITS BINARY OUTPUT.
* 
*            K - CATASTROPHIC.  FATAL TO COMPILATION.  RESUME WITH NEXT 
*                PROGRAM UNIT.
* 
*            T - TRIVIAL.  NO ACTUAL VIOLATION OF THE LANGUAGE, BUT THE 
*                STATEMENT SO FLAGGED MAY RESULT IN NO ACTION.  (E.G.,
*                NULL TRANSFERS)
* 
*            W - WARNING.  A MORE SEVERE ERROR THAN TRIVIAL.  LANGUAGE
*                MAY HAVE BEEN VIOLATED, BUT COMPILER COULD FIGURE OUT
*                WHAT WAS INTENDED. 
 LIMITS   SPACE  4,20 
***       ------    LIMITATIONS ON DIAGNOSTICS    ------
* 
* 
*         1.  NO DIAGNOSTIC MAY EXCEED 16 WORDS, NOR MAY IT BE TOO LONG 
*             TO FIT ON ONE TTY LINE (UP TO 72 CHARACTERS MAY BE LISTED)
* 
*         2.  NO DIAGNOSTIC MAY USE A COLON.
* 
*         3.  NUMBER OF WORDS IN DICTIONARY MUST NOT EXCEED 
*             512 WORDS.
* 
*         4.  NO DIAGNOSTIC MAY USE A SPECIAL CHARACTER > 65B DPC AS THE
*             LAST CHARACTER IN A 10H WORD. 
* 
*         5.  SPECIAL CARE SHOULD BE USED WHEN A WORD IN THE ERROR
*             MESSAGE CONTAINS EITHER A *(* OR *)*. 
 ERFMT    SPACE  4,30 
**               THE N-WORD FORMAT IS --
* 
**T  FIRST    9/ERWD1,9/ERWD2,9/ERWD3,9/ERWD4,5/ERTYP,1/M,18/ERXIT
**T  REST     9/ERWD1,9/ERWD2,9/ERWD3,9/ERWD4,9/ERWD5,9/ERWD6,5/0,1/M 
* 
*         ERWD(I) = DICTIONARY ORDINAL OF THE TEXT WORD.  A ZERO ORDINAL
*                INDICATES THE END OF THE MESSAGE.
*         ERTYPE = ORDINAL OF THE ERROR-TYPE-SELECTION SWITCH.  DEFINED 
*                BY THE *ERRTYP* MACRO, AND LINKED TO BY *ERROR* MACRO. 
*                *PEM* WILL LIST THIS ERROR IF THE CELL POINTED TO BY 
*                THE INDICATED SWITCH IS NEGATIVE.
*         M    = IF SET, MORE SKELETON WORDS FOLLOW.
*                IF CLEAR, THE MESSAGE IS OVER. 
*         ERXIT = IF POSITIVE, ADDRESS TO RETURN TO AFTER PROCESSING. 
*                 IF NEGATIVE, EXIT IS TO *PWE1*, AND (ERXIT)-4S15 IS 
*                THE SPECIAL FORMATTING ADDRESS.
* 
*         THE LAST CHARACTER OF EACH WORD IN THE DICTIONARY INDICATES 
*         HOW MANY CHARACTERS ARE IN THAT WORD.  THIS IS DONE SO *PEM*
*         DOES NOT HAVE TO LOOP ON EACH CHARACTER.  IF THE WORD CONTAINS
*         TEN CHARACTERS, THE LAST CHARACTER IS UNMODIFIED.  IF THE WORD
*         CONTAINS FEWER THAN TEN CHARACTERS, THE LAST CHARACTER IS SET 
*         = DT.BIAS + (LENGTH OF WORD).  THE *ERROR* AND *ERRLIT* MACROS
*         CREATE SUCH WORDS, AND PUT THEM IN THE LITERAL POOL.  THUS, 
*         THE ASSEMBLER ELIMINATES DUPLICATES AUTOMATICALLY.
* 
*         IF THE ERROR MESSAGE WORD IS .GT. 10 CHARACTERS THE DICTIONARY
*         WORD WILL CONTAIN 9 CHARACTERS FOLLOWED BY A COLON AND THE
*         MESSAGE WORD WILL BE CONTINUED INTO THE NEXT DICTIONARY WORD. 
 ERROR    SPACE  4,15 
**        ERROR - MACRO TO DEFINE ERROR MESSAGES. 
* 
*         ALL ERROR MESSAGES MUST BE DEFINED BY THIS MACRO. 
*         TRANSLATES THE DIAGNOSTIC TEXT INTO THE FORM DISCUSSED ABOVE, 
*         WHILE GENERATING A DICTIONARY OF LITERALS.
* 
* 
* LOC     ERROR  TYPE,EXIT,(TEXT) 
* 
*         TYPE   =  ONE OR TWO CHARACTER ERROR-TYPE INDICATOR.
*                1.  FIRST CHARACTER DESCRIBES THE SEVERITY OF THE
*                    ERROR -- VALID CHARACTERS ARE DEFINED BY *ERRTYP*
*                    MACRO, Q.V.
*                2.  SECOND CHARACTER SELECTS SPECIAL FILL. FORMATTING
*                    BY THE ERROR PROCESSOR.  SEE *PEM* FOR DETAILS.
* 
*         EXIT   =  ADDRESS TO RETURN TO AFTER PRINTING THE DIAGNOSTIC. 
*                IF IT IS "*" (STAR, 46B DPC), THEN CONTROL RETURNS TO
*                CALLER, AND ERROR MUST BE REFERENCED BY ANSI, FATAL, 
*                NOTE, OR WARN MACRO. 
*                OTHERWISE, IT IS SIMPLY THE ADDRESS TO RETURN TO AFTER 
*                PROCESSING THE ERROR.
* 
*         TEXT   =  FROM ONE TO 16 WORDS OF TEXT.  WORDS ARE SEPARATED
*                BY BLANKS.  NO WORD MAY CONTAIN A NEGATION (^ 76B), OR 
*                SEMI-COLON (; 77B).  THE TENTH CHARACTER OF A WORD MAY 
*                NOT BE A CHARACTER WITH DPC .GE.65B NOR MAY IT BE A
*                COLON. 
  
  
          MACRO  ERROR,LOC,TYPE,EXIT,MSG
* 
*                DETERMINE (A)  SPECIAL FORMATTING, AND (B) SEVERITY. 
* 
 A        MICRO  2,1,/TYPE/ 
 B        MICRO  1,1, TYPE
* 
*                SET UP (LOC) CALLING STYLE, AND (X) EXIT ADDRESS.
* 
          ENTRY  LOC
.3        IFC    EQ, EXIT * 
 LOC      EQU    DT.NEXT
 X        MICRO  1,, =XPEM"A"+4S15
.3        ELSE
 LOC      SB7    DT.NEXT
          EQ     =XPEM"A" 
 X        MICRO  1,, =X_EXIT
.3        ENDIF 
* 
          USE    FORMAT.
 T        MICRO  1,,^_MSG_^ 
* 
*                DUP THRU THE MESSAGE FOR EACH WORD.
* 
 L        SET    0
 U        MICRO  1,,
.1        DUP    16 
 L        SET    L+1
 .2       IFC    NE,^^"T"^
          IFC    EQ,/"U"//,2
 S        MICRO  1,, "T"
          SKIP   2
 S        MICRO  1,, "U"
 U        MICRO  1,,
          ERRMIC S
          IFEQ   L,5,1
          VFD    L=ERTYPE/=XERR."B",1/1,L=ERXIT/"X" 
          IFEQ   L,11,1 
          VFD    L=ERMORE/0,1/1 
          VFD    L=ERWORD/1-DICT+=10H"S""A" 
 .2       ELSE   1
          STOPDUP 
.1        ENDD
.4        IFC    NE,^^"T"^
 4        ERR    LOC  -- TOO MANY WORDS IN TEXT -- TRUNCATED AFTER
,                            ("T")
.4        ENDIF 
* 
*                WRAP UP, AND BIND OFF THE SKELETON.
* 
.6        IFEQ   *,DT.NEXT
          POS    P=ERTYPE 
          VFD    L=ERTYPE/=XERR."B",1/0,L=ERXIT/"X" 
.6        ELSE   1
          POS    0
 DT.NEXT  SET    *
          USE    *
          ENDM
  
  
 ERRMIC   MACRO  S
 K        MICCNT S
          IFGT   K,10,5 
 U        MICRO  10,, "S" 
 S        MICRO  1,9, "S" 
 A        MICRO  1,1,/:/
 K        SET    8
          SKIP   3
          IFLT   K,9,1
 S        MICRO  1,9,^"S"        ^
 A        MICRO  K,1,/!&'?<>@\^ / 
 T        MICRO  K+2,,^"T"^ 
 ERRMIC   ENDM
  
  
 DT.BIAS  EQU    1R!-1       MUST AGREE WITH STRING IN ERRMIC 
 ERRLIT   SPACE  4,8
**        ERRLIT - MACRO TO GENERATE A LITERAL OF PROPER FORM FOR ERROR 
*                MESSAGE PROCESSOR. 
* 
*         ERRLIT WORD 
  
  
          MACRO  ERRLIT,LOC,WORD
 S        MICRO  1,,^_WORD_^
          ERRMIC S
 LOC      LIT    10H"S""A"
          IFC    NE,/LOC//,1
          ENTRY  LOC
 ERRLIT   ENDM
  
  
          USE    FORMAT.
 DT.NEXT  SET    *
          USE    *
          NOREF  DT.NEXT
 DICT     SPACE  4,8
**        DICT - THESE MUST BE THE FIRST LITERALS IN THE (1,0) OVERLAY. 
*         THESE LITERALS ARE USED BY ERROR PROCESSING ROUTINES. 
  
 T        MICRO  1,,
  
          ENTRY  DICT,FILL.,FILL.2,FILL.3,L.FILL
 DICT     LIT    1H          BASE ADDRESS OF LITERALS 
          NOREF  DICT 
  
 FILL.    ERRLIT FILL.       THESE ARE FOR MESSAGE FILL-INS 
 FILL.2   ERRLIT FILL.2 
 FILL.3   ERRLIT FILL.3 
 L.FILL   EQU    FILL.3-FILL.+1 LENGTH OF FILL. REGION FOR PEMS.
 COMAERR  ENDX
