*DECK DFTABLE 
          IDENT  DFTABLE
 DFTABLE  TITLE  DFTABLE - COBOL 5 COMPILER DIAGNOSTIC TEXT TABLE 
          COMMENT  "COMRTN" 
          COMMENT  DIAGNOSTIC TEXT TABLE
  
 DFTABLE  SPACE  4
**        DFTABLE - COBOL 5 COMPILER DIAGNOSTIC TEXT TABLE
* 
*         THIS TABLE CONTAINS THE DIAGNOSTIC NUMBER, THE ERROR LEVEL, 
*         AND THE TEXT FOR ALL COMPILER ISSUED ERROR MESSAGES.  IT IS 
*         DESIGNED TO FACILITATE MAINTENANCE. 
* 
*         EACH ENTRY CONSISTS OF TWO OR MORE CARDS: 
*                FIRST A -DIAGP- CARD GIVING DIAG NR + ERROR LEVEL; 
*                SECOND, A -DIAGT- CARD GIVING THE COMPLETE TEXT OF THE 
*                MESSAGE.  THIS CARD MAY BE CONTINUED IF NECESSARY. 
* 
*         THE FORMATS OF THESE CARDS ARE AS FOLLOWS:  
* 
*         DIAGP  LVL,NR 
*                WHERE LVL MAY BE:  
*                            T     TRIVIAL
*                            W     WARNING
*                            F     FATAL
*                            C     CATASTROPHIC 
*                            N     NON-ANSI 
*                AND NR IS THE DIAGNOSTIC NUMER IN THE FORM PXXX WHERE
*                            P     IS THE PHASE-ID OF THE OVERLAY 
*                                  ISSUING THE DIAGNOSTIC.
*                            XXX   IS THE DIAGNOSTIC NUMBER FOR THAT
*                                  PHASE. 
* 
* 
*         DIAGT  (*TEXT*) 
*                WHERE -TEXT- MAY CONTAIN ANY CHARS EXCEPT -*-, -"-,
*                            -_-, AND -^-.
* 
* 
*         ENTRY POINTS: 
          ENTRY  FINDIAG
          ENTRY  NOTXT
  
 MACROS   EJECT 
 #        MACRO 
          ENDM
  
 DEF      SPACE  4
**        DEF MACRO - PICK UP DIAG LETTER AND ENCODING NUMERS 
*                TO MATCH D$FORMAT. 
* 
 DEF      MACRO  NAME 
 CHR      MICRO  1,1,^_NAME_^ 
 LLVL     SET    LLVL+1 
 L_"CHR"  EQU    LLVL 
          ENDM
  
 LLVL     SET    0
 DIAGLVL  SPACE  4
*CALL DIAGLVL 
  
  
 DIAGP    SPACE  4
**        DIAGP MACRO - DIAGNOSTIC PARAMETERS 
*                CALLED:  DIAGP   LVL,NR
*                                  WHERE LVL = DIAGNOSTIC LEVEL (T, W,
*                                  F, C, OR N)
*                                    AND NR IS THE DIAGNOSTIC NUMBER
* 
*                NR MUST BE IN ASCENDING ORDER OR AN ASSEMBLY ERROR WILL
*                RESULT.
* 
 DIAGP    MACRO  LVL,NR 
          IFNE   PFLG,0,1 
 O        ERR                MACROS OUT OF PROPER ORDER 
          IFLE   NR,DNR,1 
 A        ERR                DIAGNOSTIC NUMBERS OUT OF SEQUENCE 
 PFLG     SET    1
 BSSNR     SET    NR-DNR-1
 DNR      SET    NR 
 IFA      IFGT   BSSNR,0
          USE    POINTER
          DUP    BSSNR,1
-         VFD    6/LC$,6/3,18/NOTXT 
          USE    *
 IFA      ENDIF 
 DLVL     SET    L_LVL
 DDNR     DECMIC DNR,4
          ENDM
 DIAGT    SPACE  4
**        DIAGT MACRO - DIAGNOSTIC TEXT DEFINITION
*                THIS MACRO CALL MUST FOLLOW A DIAGP CALL TO DEFINE THE 
*                ERROR NUMBER AND LEVEL.  IT IS CALLED AS:  
*                                  DIAGT  (*TEXT*)
* 
* 
 DIAGT    MACRO  TEXT 
          IFNE   PFLG,1,1 
 O        ERR                MACRO CALLS OUT OF PROPER ORDER
 PFLG     SET    0
 SCNT     SET    2
          NOREF  D_"DDNR" 
 LLVL     SET    *
 D_"DDNR" DATA   H_TEXT 
 DLN      SET    *-LLVL 
          USE    POINTER
-         VFD    6/DLVL,6/DLN,18/D_"DDNR" 
          USE    *
          ENDM
 TERM     SPACE  4
**        TERM MACRO - TERMINATE A DIAGNOSTIC CENTURY 
*                COMPLETES THE LAST POINTER WORD (IF REQUIRED) AND
*                PUTS AN ENTRY INTO THE -CENT- TABLE FOR THE
*                LAST CENTURY GROUP.
* 
 TERM     MACRO 
          USE    POINTER
          IFEQ   *P,30,1
-         VFD    6/LC$,6/3,18/NOTXT 
 LAST     SET    *
          USE    *
 LNTH     SET    LAST-FIRST 
 LNTH     SET    LNTH*2 
          USE    CENT 
          VFD    30/LNTH,30/FIRST 
          USE    *
          ENDM
  
 CENTURY  SPACE  4
**        CENTURY MACRO - START A DIAGNOSTIC CENTURY
*         NOTE:  THE TERM -CENTURY- IS INCORRECT, BUT THE EASIEST 
*                WAY TO DESCRIBE A GROUP OF 1000 DIAGS... 
* 
*                THIS MACRO MUST PRECEDE THE FIRST DIAGP IN EACH
*                CENTURY (EXCEPT THE 0-S).
*                            CALLING PARAM: 
*                CENTURY     NUMBER 
*                            WHERE NUMBER IS THE FIRST NR IN THE
*                            NEXT CENTURY (I.E. 3000) 
* 
 CENTURY  MACRO  NR 
          IFNE   PFLG,0,1 
 O        ERR                MACROS OUT OF ORDER
          IFLE   NR,DNR,1 
 A        ERR                DIAGNOSTIC NUMBERS OUT OF ORDER
          TERM
 FIRST    SET    LAST 
 DNR      SET    NR-1 
          ENDM
  
          NOREF  SCNT,BSSNR,DLN,DLVL,DNR,PFLG,LLVL
          NOREF  NOTXT,LC$,FIRST,LAST,LNTH
 LC$      EQU    LC          DUMMY FOR DIAGP MACRO
*CALL COBIOM
 FINDIAG  EJECT 
**        FINDIAG - LOCATES DIAGNOSTIC TEXT, ERROR LEVEL AND LENGTH 
*                FOR D$FORMAT 
* 
*                            CALLED:  
*                FINDIAG(NR,LEVEL,LENGTH,TEXT ADDR);
* 
*                            USES NR TO FIND THE REST OF THE INFO.
* 
  
 FINDIAG  DATA   0
          SX5    2097        2**21/1000 
          SA2    X1          DIAGNOSTIC NUMBER
          IX5    X5*X2
          AX5    21          DIVIDE BY 1000 (R. JAMES METHOD) 
          SX6    1000 
          IX6    X5*X6
          IX2    X2-X6       REMAINDER
          SX6    X5-9        C.F. OUT OF RANGE
          SB6    X2 
          PL     X6,FINDERR 
          SA5    X5+CENPTR
          SB7    X5          ADDR OF FIRST POINTER
          LX5    30 
          SB5    X5+0        NR OF DIAGS IN CENTURY 
          GE     B6,B5,FINDERR     OUT OF RANGE 
          SX6    X2 
          AX6    1
          SB1    1
          LX2    59          ODD OR EVEN CHECK
          SA5    B7+X6       FETCH POINTER WORD 
+         NG     X2,FINDIAG1
          LX5    30          EVEN - GET TOP OF WORD 
 FINDIAG1 SB7    X5+0        TEXT ADDR
          SX6    77B
          LX5    36 
          BX2    X5*X6       LEVEL
          LX5    6
          BX5    X5*X6       LENGTH OF TEXT (WORDS) 
  
 FINDIAG2 SA1    A1+B1       NEXT PARAM ADDR
          SX6    X2 
          SA6    X1          STORE LEVEL
          SA1    A1+B1
          LX6    X5,B1       X5*2 
          LX5    3           X5*8 
          IX6    X6+X5       X5*10 (LNTH IN CHARS)
          SA6    X1          STORE LNTH 
          SA1    A1+B1
          SX6    B7 
          SA6    X1+0        STORE ADDR 
          EQ     FINDIAG
  
 FINDERR  SB1    1
          SB7    NOTXT
          SX2    LC$
          SX5    3
          EQ     FINDIAG2    GO -RETURN ERROR 
 ALTFET   SPACE  4
          ENTRY  ALTFET 
 ALTFET   FILEB  EBUF,ERRBFS,(RTP=Z)   ERROR FILE FET 
 EBUF     EQU    0           LET CMM ASSIGN BUFFER SPACE
 DIAGS    EJECT 
 PFLG     SET    0
          USE    POINTER
 DFTABLE  BSS    0
          USE    *
 FIRST    SET    DFTABLE
          USE    CENT 
 CENPTR   BSS    0
          USE    *
 DNR      SET    0
  
DIAGS     SPACE  4
 NOTXT    DATA   30HMISSING DIAGNOSTIC TEXT 
*CALL DIAGTXT 
          END 
