*DECK DIAGS 
          IDENT  DIAGS
          ENTRY  PDT
          ENTRY  DIAPARM
          ENTRY  DIAGPTR
          COMMENT DIAGNOSTIC/HELP TEXT PROCESSING ROUTINES. 
          TITLE  DIAGS - DIAGNOSTIC/HELP TEXT PROCESSING ROUTINES.
          SPACE  4,10 
*****     DIAGS - DIAGNOSTIC/HELP TEXT PROCESSING ROUTINES. 
* 
*         G. E. LOGG         77/03/16 
          SPACE  4,10 
***              THIS PROGRAM PROCESSES ALL DIAGNOSTIC AND HELP TEXT
*         MESSAGES BY FINGING THE APPROPRIATE OVERLAY TO LOAD,
*         LOADING IT AND SEARCHING FOR THE DESIRED TEXT WITHIN THE
*         OVERLAY.  *DIAGXEQ* IS CALLED TO DO THE ACTUAL PROCESSING 
*         AND WRITING OF THE MESSAGE.  THIS PROGRAM ALSO CONTAINS THE 
*         COMPASS ROUTINES NEEDED BY *DIAGXEQ*. 
          SPACE  4,10 
**        GLOBAL DEFINITIONS. 
  
  
*CALL COMSOVL 
  
  
 DIAGFWA  CON    0           FWA OF DIAGNOSTIC/HELP TEXT
 DIAGLEN  CON    0           LENGTH OF DIAGNOSTIC/HELP TEXT 
 DIAGPTR  CON    0           POINTER TO TEXT OF MESSAGE FOR *DIAGXEQ* 
          SPACE  4,10 
**        BUFFERS.
  
  
 BUF      BSS    OL+5        DIAGNOSTIC OVERLAY + LOADER TABLE HEADER 
 CHKCUR   SPACE  4,10 
**        CHKCUR - CHECK IF *CURWORD* IS DEFINED. 
* 
*                THIS BOOLEAN FUNCTION CHECKS THE EXTERNALS *CURWORD* 
*         AND *CURLENG* AND RETURNS A TRUE IF BOTH ARE SATISFIED. 
* 
*         EXIT   (X6) = 0 FOR FALSE ELSE TRUE.
  
  
 CHKCUR   SUBR   =           ENTRY/EXIT 
          SX1    =XCURWORD
          SX2    =XCURLENG
          BX3    X1+X2
          MX6    1
          BX3    -X3
          BX6    X6*X3       (X6) " 0 IF BOTH ARE SATISFIED 
          EQ     EXIT.
 CHKNEX   SPACE  4,10 
**        CHKNEX - CHECK IF *NEXWORD* IS DEFINED. 
* 
*                THIS BOOLEAN FUNCTION CHECKS THE EXTERNALS *NEXWORD* 
*         AND *NEXLENG* AND RETURNS A TRUE IF BOTH ARE SATISFIED. 
* 
*         EXIT   (X6) = 0 FOR FALSE ELSE TRUE.
  
  
 CHKNEX   SUBR   =           ENTRY/EXIT 
          SX1    =XNEXWORD
          SX2    =XNEXLENG
          BX3    X1+X2
          MX6    1
          BX3    -X3
          BX6    X6*X3       (X6) " 0 IF BOTH ARE SATISFIED 
          EQ     EXIT.
 DIAPARM  SPACE  4,10 
**        DIAPARM - GET DIAGNOSTIC PARAMETER. 
* 
*                THE NEXT DIAGNOSTIC PARAMETER IS FETCHED FOR THE 
*         ROUTINE WHICH IS ADDING THEM TO THE MESSAGE.
* 
*         USES   X - 1, 2, 6, 7.
*                B - NONE.
*                A - 1, 2, 7. 
  
  
 DIAPARM  SUBR               ENTRY/EXIT 
          SA1    =XDIAGPRM
          SA2    X1+1        GET NEXT PARAMETER ADDRESS 
          SX7    A2 
          SA7    =XDIAGPRM   SAVE INCREMENTED ADDRESS FOR NEXT CALL 
          LX6    X2          RETURN ADDRESS VALUE IN X6 
          EQ     EXIT.
 FDO      SPACE  4,8
**        FDO - FIND DIAGNOSTIC OVERLAY.
* 
*                THIS ROUTINE SEARCHES THE INDEX OVERLAY FOR AN ENTRY 
*         CONTAINING THE DESIRED OVERLAY.  THE OVERLAY IS THEN LOADED 
*         INTO THE BUFFER *BUF*.
* 
*              THE INDEX OVERLAY CONSISTS OF INDEX TABLE ENTRIES AS 
*         GIVEN BELOW TERMINATED BY A ZERO WORD.  ALL HELP TEXT 
*         OVERLAYS PRECEDE THE DIAGNOSTIC OVERLAYS.  A NEW OVERLAY IS 
*         STARTED FOR THE FIRST DIAGNOSTIC TEXT SO THAT BOTH HELP AND 
*         DIAGNOSTIC TEXT ARE NOT MIXED IN ONE OVERLAY. 
* 
*         VFD    1/H,23/0,12/L,6/L1,6/L2,12/N 
* 
*         H    = 1 IF THIS IS A HELP TEXT OVERLAY.
*         L    = LENGTH OF A BUFFER THAT WILL HOLD ANY DIAGNOSTIC OR
*                HELP TEXT OVERLAY. 
*         L1   = PRIMARY LEVEL NUMBER OF THIS OVERLAY.
*         L2   = SECONDARY OVERLAY NUMBER FOR THIS OVERLAY. 
*         N    = MAX LEXICAL ID (HELP TEXT OVERLAY) OR DIAGNOSTIC 
*                NUMBER (FOR DIAGNOSTIC AND HELP OVERLAY) WHICH OCCURS
*                IN THIS OVERLAY. 
* 
*         ENTRY  (DIAGN) = DIAGNOSTIC NU8BER OR LEXICAL ID. 
*                (HELPOVL) = 0 IF DIAGNOSTIC OVERLAY DESIRED.  1 IF 
*                HELP OVERLAY DESIRED.
*         EXIT   (X6) = 0 IF NO OVERLAY WITH THIS DIAGNOSTIC. 
*                (BUF) = FWA OF DIAGNOSTIC OVERLAY LOADED.
*         CALLS  FOL.GDE, FOL.LOD 
*         USES   ALL REGISTERS
  
  
 FDO      SUBR               ENTRY/EXIT 
          SA1    =XDIAGN
          SA3    =XHELPOVL
          MX6    -12
          LX3    59-0 
          SB2    =XDIAGBUF+5 START HERE FOR INDEX ENTRIES 
 FDO2     SA2    B2 
          BX4    -X6*X2 
          BX7    X2-X3
          IX4    X4-X1
          SB2    B2+1 
          ZR     X2,FDO4     IF END OF OVERLAY
          MI     X4,FDO2     IF NOT CORRECT OVERLAY 
          MI     X7,FDO2     IF WRONG TYPE OF OVERLAY 
          AX2    12 
          BX1    -X6*X2      LEVEL NUMBERS
          RJ     =XFOL.GDE   GET DIRECTORY ENTRY
          MX1    42 
          SX2    BUF         NEW FWA
          BX1    X1*X6       OVERLAY NAME 
          BX1    X1+X2       ADD FWA TO REQUEST 
          RJ     =XFOL.LOD   LOAD OVERLAY AT SPECIFIED FWA
          MX6    1           (X6) " 0 IF OVERLAY LOADED 
          EQ     EXIT.
  
 FDO4     SX6    B0          (X6) = 0 IF OVERLAY NOT FOUND
          EQ     EXIT.
 FDT      SPACE     4,8 
**        FDT - FIND DIAGNOSTIC TEXT. 
* 
*                THE DIAGNOSTIC OVERLAY IS SEARCHED FOR A HEADER
*         CONTAINING THE CORRECT DIAGNOSTIC NUMBER OR LEXICAL ID AND
*         OF THE DESIRED TYPE (DIAGNOSTIC VERSES HELP).  IF NO SUCH 
*         ENTRY IS FOUND THEN ZERO IS RETURNED SO THAT AN ERROR 
*         MESSAGE CAN BE ISSUED.
* 
*              HELP TEXT OVERLAYS CONSIST OF HELP TEXT ENTRIES AS 
*         GIVEN BELOW TERMINATED BY A ZERO WORD.  EACH HELP TEXT ENTRY
*         HAS A HEADER WORD GIVING THE LEXICAL ID AND THE LENGTH OF THE 
*         TEXT THAT FOLLOWS.  THE TEXT MAY BE MADE UP OF MORE THAN ONE
*         ZERO BYTE TERMINATED LINE.
* 
*         VFD    1/1,35/0,12/L,12/N 
*         DATA   C* HELP TEXT LINE 1 *
*         ...    ...
*         DATA   C* HELP TEXT LINE M *
* 
*         L    = LENGTH OF THE TEXT FOLLOWING THIS HEADER WORD. 
*         N    = LEXICAL ID FOR THIS HELP TEXT. 
* 
* 
*              DIAGNOSTIC TEXT OVERLAYS CONSIST OF DIAGNOSTIC TABLE 
*         ENTRIES GIVEN BELOW TERMINATED BY A ZERO WORD.  EACH ENTRY
*         HAS TWO HEADER WORDS.  ONE FOR THE DIAGNOSTIC PORTION AND 
*         ONE FOR THE HELP TEXT PORTION OF THE DIAGNOSTIC.  THE 
*         DIAGNOSTIC PORTION MUST CONSIST OF ONLY ONE ZERO BYTE 
*         TERMINATED LINE.  THE HELP TEXT PORTION MAY CONSIST OF MANY 
*         ZERO BYTE TERMINATED LINES WITH THE ONLY RESTRICTION THAT 
*         THE ENTIRE DIAGNOSTIC ENTRY FITS IN ONE OVERLAY.
* 
*         VFD    1/0,35/0,12/L3,12/N
*         DATA   C* DIAGNOSTIC TEXT * 
*         VFD    1/1,35/0,12/L4,12/N
*         DATA   C* HELP TEXT LINE 1 *
*         ...    ...
*         DATA   C* HELP TEXT LINE M *
* 
*         L3   = LENGTH OF THE DIAGNOSTIC TEXT THAT FOLLOWS.
*         L4   = LENGTH OF THE HELP TEXT PORTION OF THE TEXT THAT 
*                FOLLOWS. 
*         N    = DIAGNOSTIC NUMBER. 
* 
*         ENTRY  (DIAGN) = DIAGNOSTIC NU8BER OR LEXICAL ID. 
*                (BUF) = FWA OF DIAGNOSTIC OVERLAY LOADED.
*                (HELPFLG) = 0 IF WE WANT DIAGNOSTIC TEXT.  1 IF WE 
*                WANT HELP TEXT.
*         EXIT   (X4) = FATAL DIAGNOSTIC FLAG 
*                (X6) = 0 IF NO TEXT EXISTS FOR THIS DIAGNOSTIC.
*                (X6) = FWA OF TEXT.
*                (X7) = LENGTH OF TEXT. 
*         USES   X - 1, 2, 3, 4, 6, 7.
*                B - 2. 
*                A - 1, 2, 3. 
  
  
 FDT      SUBR               ENTRY/EXIT 
          SA1    =XDIAGN
          SA2    =XHELPFLG
          SB2    BUF+5       (B2) = CURRENT ENTRY IN TEXT OVERLAY 
          MX6    -12
          LX2    59-0 
 FDT1     SA3    B2 
          ZR     X3,FDT4     IF NO SUCH DIAGNOSTIC
          BX4    -X6*X3      DIAG NUMBER
          IX4    X1-X4
          BX7    X2-X3
          LX3    -12
          MI     X4,FDT4     IF TEXT IS NOT PRESENT IN THE OVERLAY
          SB2    B2+1        SKIP HEADER WORD 
          ZR     X4,FDT3     IF A MATCH 
 FDT2     BX4    -X6*X3      LENGTH OF TEXT 
          SB2    B2+X4       SKIP THE TEXT
          EQ     FDT1 
  
 FDT3     MI     X7,FDT2     IF WRONG TYPE OF TABLE 
          BX7    -X6*X3      (X7) = LENGTH OF TEXT
          LX3    -46
          MX6    -1 
          BX4    -X6*X3      (X4) = FATAL DIAGNOSTIC FLAG 
          SX6    B2          (X6) = FWA OF TEXT 
          NZ     X7,EXIT.    IF LENGTH OF TEXT .GT. ZERO
 FDT4     SX6    B0          (X6) = 0 FOR NO TEXT 
          EQ     EXIT.
 PDT      SPACE  4,8
**        PDT - PROCESS DIAGNOSTIC/HELP TEXT. 
* 
*                THE INDEX OVERLAY IS SEARCHED FOR THE APPROPRIATE
*         DIAGNOSTIC/HELP TEXT OVERLAY ENTRY.  THEN THE TEXT OVERLAY
*         IS SEARCHED FOR THE DESIRED TEXT.  FINALLY *DIAGXEQ* IS 
*         CALLED TO WRITE AND PROCESS THE MESSAGE.
* 
*         ENTRY  (HELPFLG) = 0 TO FIND A DIAGNOSTIC TEXT.  1 TO FIND A
*                HELP TEXT. 
*                (HELPOVL) = 0 IF DIAGNOSTIC/HELP TEXT IS IN A
*                DIAGNOSTIC OVERLAY.  1 IF IN A HELP OVERLAY. 
*                (DIAGN) = DIAGNOSTIC OR HELP NUMBER. 
*         CALLS  FDO, FDT, DIAGXEQ
*         USES   ALL REGISTERS
  
  
 PDT      SUBR               ENTRY/EXIT 
          RJ     FDO         FIND DIAGNOSTIC OVERLAY
          ZR     X6,PDT1     IF OVERLAY DOES NOT EXIST
          RJ     FDT         FIND DIAGNOSTIC TEXT 
 PDT1     SA6    DIAGFWA     SAVE FWA OF TEXT 
          SA7    DIAGLEN     SAVE DIAGNOSTIC TEXT LENGTH
          SA6    DIAGPTR
          SX7    X4 
          SA7    =XFATFLAG   SAVE FATAL FLAG
          RJ     =XDIAGXEQ   PRINT DIAGNOSTIC TEXT
          SA1    DIAGFWA
          ZR     X1,EXIT.    IF NO TEXT AT ALL
          MX6    -12
          SA2    X1 
          SA3    DIAGLEN
 PDT2     BX4    -X6*X2      LOOK FOR A ZERO BYTE TERMINATOR
          SX3    X3-1 
          SA2    A2+1 
          ZR     X3,EXIT.    IF NO MORE TEXT
          NZ     X4,PDT2     IF NO ZERO BYTE TERMINATOR YET 
          SX6    A2          NEW FWA OF TEXT
          SX7    X3 
          EQ     PDT1        PRINT NEXT LINE OF TEXT
  
          END 
