*COMDECK /DFDCRM/ 
*#
*1CD  THE ERR$RM SUBPROGRAM 
*0D   PURPOSE 
*0        HANDLE ALL CRM ERROR AND NOTE PROCESSING. 
*0D   CALLING SEQUENCE
*0              (SB3       MESSAGE INSERT LIST ADDRESS) 
*               (SX5       RETURN ADDRESS)
*                SX6       PARAMETERS 
*                EQ        =XERR$RM 
*      (RETURN   BSS       0) 
*0D   PARAMETERS
*0        A0-    FIT ADDRESS
*         B1-    1
*         B3-    MESSAGE INSERT LIST ADDRESS
*         X5-    RETURN ADDRESS 
*         X6-    (VFD 42D/0,1/FNF,1/NTE,1/DME,1/INF,1/EES,4/SES,9D/ES)
*                FNF- 1=FATAL ERROR 
*                NTE- 1=MESSAGE IS A NOTE 
*                DME- 1=DATA MANAGER CALL 
*                INP- 1=B3 CONTAINS FWA OF MESSAGE INSERT LIST
*                EES- 1=SUPPRESS USER ERROR EXIT
*                SES- PARITY ERROR SEVERITY 
*                ES-  MESSAGE CODE
*0D   ACTIONS 
*0        IF A NOTE CALL AND DAYFILE AND ERROR FILE NOTE PRODUCTION IS
*         SUPPRESSED RETURN TO CALLER.  IF A NOTE PROCEDE TO STEP 2.
*0     1. SET FIT FIELDS FROM PARAMETER REGISTER.  IF ERROR IS FATAL
*         PROCEDE TO STEP 2.  IF DAYFILE OR ERROR FILE PRODUCTION OF
*         ERRORS IS TURNED ON PROCEDE TO STEP 2.  PROCEDE TO STEP 9.
*0     2. CONSTRUCT THE BASIC DISPLAYING MESSAGE CONTAINING INDICATION
*         OF FATAL, ERROR OR NOTE, AND RM/DM SOURCE OF MESSAGE.  INCLUDE
*         THE OCTAL MESSAGE CODE AND FILE NAME.  INCLUDE THE FIRST ITEM 
*         IF THE MESSAGE INSERT LIST IN THE CASE OF NOTE IF THE LIST IS 
*         PRESENT.  IF THIS IS AN ERROR MESSAGE PROCEDURE TO STEP 3.  IF
*         DAYFILE NOTES ARE SUPPESSED PROCEDE TO STEP 6, ELSE STEP 4. 
*0     3. IF DAYFILE ERROR PRODUCTION IS SUPPRESSED AND THE ERROR IS
*         NON-FATAL PROCEDE TO STEP 5.  IF ERROR DIFFERS FROM LAST
*         PREVIOUS AND OLD COUNT "0 PERFORM THE OE$CRM PROCEDURE, SET 
*         OLD CODE P NEW CODE, ZERO THE OLD ERROR COUNT, AND PROCEDE TO 
*         STEP 4. ELSE, INCREMENT THE OLD ERROR COUNT.  IF THE COUNT IS 
*         > 99 THAN PERFORM OE$CRM AND PROCEDE TO STEP 5. 
*0     4. WRITE THE DAYFILE MESSAGE.  IF A NOTE PROCEDE TO STEP 6.
*0     5. IF ERROR FILE ERROR PRODUCTION SUPPRESSED PROCEDE TO STEP 8,
*         ELSE STEP 7.
*0     6. IF THE ERROR FILE NOTE PRODUCTION IS SUPPRESSED RETURN TO 
*         CALLER. 
*0     7. PERFORM THE EF$CRM PROCEDURE TO RECORD THE MESSAGE ON THE 
*         ERROR FILE.  IF THE MESSAGE IS A NOTE RETURN TO CALLER. 
*0     8. IF ERROR IS FATAL PROCEDE TO STEP 10. 
*0     9. IF TRIVIAL ERROR COUNT IS \ LIMIT SET PARAMETER WORD ES TO
*         356B AND PARAMETER WORD FNF TO 1 AND PROCEDE TO STEP 1. 
*         INCREMENT THE TRIVIAL ERROR COUNT.
*0    10. IF ERROR EXIT IS SUPPRESSED RETURN TO CALLER, ELSE PERFORM
*         THE EX$CRM PROCEDURE FOR USER ERROR EXIT. 
*0D   REGISTERS 
*0        B017,A0 PRESERVED 
*0D   OTHER CODE REQUIRED 
*0        MACROS-   F.RM,SET.RM,MESSAGE,ABORT,ON.RM,OFF.RM,INC.RM 
*         CAP.RM,LGO.RM,FAKEPL,COMPOSED 
*         PROGRAMS- MSG=,EF$CRM,SYS=
*#
          LIST      F,X 
 #DFCN#   MICRO     1,,/0,15B,1,57,1,1/ 1= NOTES TO DAYFILE (SDS) 
 #DFCE#   MICRO     1,,/0,15B,1,56,1,1/ 1= ERRORS TO DAYFILE
 DFC      COMPOSED  DFCN,1,DFCE,1 
 #EFCN#   MICRO     1,,/0,15B,1,55,1,1/ 1= NOTES TO ERROR FILE
 #EFCE#   MICRO     1,,/0,15B,1,54,1,1/ 1= ERRORS TO ERROR FILE (EXD) 
 EFC      COMPOSED  EFCN,1,EFCE,1 
 #SEES#   MICRO     1,,/0,13D,13D,18D,1,1/  SES AND ES
 SEES     COMPOSED  SES,4,ES,9
 #SEEES#  MICRO     1,,/0,13D,14D,18D,1,1/  EES AND SES AND ES
 SEEES    COMPOSED  EES,1,SEES,13 
 FOC      COMPOSED  FNF,1,OC,2     CODE SHIFTS FOC TO RIGHT JUSTIFY FNF.
 FWRD.RM  MICRO     1,,/15B/
 XREG.RM  MICRO     1,,/5/
* CALL /EPCOM/               /EPCOM/  *COMDECK /EPCOM/
*CALL /EPCOM/ 
*                     +         +         +         + 
          ENTRY     MS$BUF
 MS$BUF   DIS       ,/ RM ERROR NNNN ON LFN XXXXXXX           / 
 MOBUF    DIS       ,/ RM ERROR NNN NN MORE TIMES ON XXXXXXX  / 
          SPACE     1 
          BSSZ      1              THIS WORD WILL STAY ZERO IF STATIC 
 DF$CRM   CAP.RM
          SA3       CAPSTAT        NAME OF CAPSULE
          BX7       X3-X6 
          AX7       18
          NZ        X7,STA
          SA6       A3-1           REMEMBER IF DYNAMIC
 STA      BX6       X1             ERROR NUM, ETC 
          ZR        X6,EX$CRM      IF JUST TAKE ERROR EXIT
          MX0       60-RTN.S
          MX1       60-PAR.S
          SX2       B3             MESSAGE INSERT LIST ADDRESS
          BX3       -X0*X5         UNDO POSSIBLE SIGN EXTENSION 
          BX2       -X0*X2
          LX2       60-INA.P-INA.S
          BX4       -X1*X6         REMOVE POSSIBLE SIGN EXTENSION 
          LX3       60-RTN.P-RTN.S
          BX6       X4+X2          PACK INA AND RTN 
          IX0       X6+X3          INTO X0 PARAMETER WORD 
 15B      PUT.IN    5 
          BX7       X0
          SA2       =10H RM NOTE
          LX7       NTE.P 
          MI        X7,DMT         IF NOTE
 FITSTO   BSS       0 
          ERRNZ     FNF.S-1 
          BX2       X0
          LX2       FNF.P+FNF.S 
          SET.RM    FNF,X2,,,CHOP 
          ERRNZ     SES.P+SES.S-ES.P
          ERRNZ     EES.P+EES.S-SES.P 
          BX2       X0
          LX2       EES.P+EES.S+SES.S+ES.S
          SET.RM    SEEES,X2,,,CHOP 
          BX1       X0
          SA2       =10H RM FATAL 
          LX1       FNF.P 
          MI        X1,DMT         IF FATAL ERROR 
          SA2       =10H RM ERROR 
          ON.RM     DFCE,DMT       IF ERRORS TO DAYFILE 
          OFF.RM    EFCE,ECTT      IF ERRORS NOT TO ERROR FILE
 DMT      BSS       0 
          BX1       X0
          LX1       DME.P 
          PL        X1,DME         IF BAM 
          SX3       1RR&1RD 
          LX3       8*6 
          BX2       X2-X3          CHANGE  RM  TO  DM 
 DME      BSS       0 
          BX7       X2
          SA7       MS$BUF         STORE FIRST WORD OF MESSAGE
          BX3       X0
          MX2       60-ES.S 
          LX3       ES.P+ES.S 
          BX1       -X2*X3
          BX2       X0
          SA3       =10H0000 ON LF
          LX2       NTE.P 
          BX7       X3
          PL        X2,LT1000B
          SX6       1R0&1R1        MUST BE LEADING ZERO ON ERROR CODES
          LX6       -6
          BX7       X7-X6          CHANGE  B000  TO  1000 
 LT1000B  BSS       0 
*     CONVERT ERROR NUMBER TO DISPLAY CODE
          MX3       -3
          LX1       -6*4           POSITION ERROR NUMBER
          SB4       B1+B1 
          LX3       -6*4           POSITION MASK
  
 BD.ERR   BX6       -X3*X1
          LX3       6 
          SB4       B4-B1 
          IX7       X7+X6 
          LX1       3 
          GE        B4,BD.ERR      LOOP 3 TIMES 
  
          SA7       A7+B1          STORE WORD 2 OF MESSAGE
          SA1       A0             .... BLANK FILL THE LFN
          MX7       42             ?
          SX3       B1             ?
          BX1       X1*X7          ?
          IX7       X1-X3          ?
          SA3       =40404040404040404040B
          BX7       -X1*X7         ?
          BX7       X7*X3          ?
          BX3       X7             ?
          LX7       55             ?
          IX2       X3-X7          ?
          BX3       X3+X2          ?
          SA2       =2AN           ?  CONCATENATE REMAINDER OF WORD 2 
          BX3       X2*X3          ?OF MESSAGE. 
          IX7       X3+X1          ?
          LX7       6*8            .... DONE
          BX2       X0
          SA7       A7+B1          STORE WORD 3 OF MESSAGE
          LX2       NTE.P 
          BX3       X0
          BX1       0              MSG TERMINATOR 
          LX3       INF.P 
          BX2       X2*X3          IF MESSAGE IS AN ERROR, OR---
          PL        X2,NOINS       IF MESSAGE HAS NO INSERT (WORD4=BLNK)
          BX2       X0
          LX2       INA.P+INA.S 
          SA3       X2             LOAD FIRST ELEMENT OF MSG INSERT LIST
          BX4       X3
          MX2       MODE.S
          LX4       MODE.P
          BX7       X2*X4          EXTRACT INSERT MODE
          ZR        X7,NOINS       IF MORE IS CONTAINED AVOID RANGE ERR.
          BX4       X3
          LX4       DIS.P 
          PL        X4,NOINS       IF DISPLAY OF INSERT NOT CALLED FOR. 
          LX3       LOC.P+LOC.S 
          SA1       X3+            LOAD MESSAGE INSERT (DISPLAYABLE)
 NOINS    BSS       0 
          BX7       X1
          SA7       A7+B1          STORE LAST WORD OF MESSAGE 
          BX2       X0
          LX2       NTE.P 
          PL        X2,ERT         IF ERROR MESSAGE 
          ON.RM     DFCN,OUTMSG    IF NOTE GOES TO DAYFILE
          EQ        EFPC           NOTE GOES TO ERROR FILE
          SPACE     1 
 ERT      BSS       0 
          ON.RM     DFCE,ESEQ      IF ERROR TO DAYFILE
          BX2       X0
          LX2       FNF.P 
          PL        X2,ETEF        IF ERROR NON-FATAL 
 ESEQ     BSS       0 
          BX2       X0
          MX1       60-ES.S 
          LX2       ES.P+ES.S 
          BX4       -X1*X2         EXTRACT ERROR CODE PARAMETER 
          F.RM      OLDE,3         LAST PREVIOUS ERROR CODE 
          IX2       X4-X3 
          ZR        X2,SAME        IF SAME ERROR AS LAST PREVIOUS 
          SB5       OERTN 
          STO.REG   KEEP
          EQ        OE$CRM         DISPLAY TIMES PREVIOUS ENCOUNTERED 
 OERTN    BSS       0 
          SET.RM    OLDE,X4        OLD ERROR GET TO CURRENT ERROR 
          BX2       X0
          MX7       59
          LX2       DME.P+DME.S 
          BX2       -X7*X2
          SET.RM    OEDM,X2 
 OUTMSG   BSS       0 
          MESSAGE   MS$BUF,,RECALL DISPLAY MESSAGE TO DAYFILE 
          BX2       X0
          LX2       NTE.P 
          PL        X2,ETEF        IF AN ERROR
          ON.RM     EFCN,EFPC      IF NOTE GOES TO ERROR FILE 
          EQ        RETURN         ELSE RETURN TO CALLER
          SPACE     1 
 ETEF1    SA"XREG.RM"   A0+"FWRD.RM"
 ETEF     BSS       0 
          OFF.RM    EFCE,FNFT      IF ERROR NOT TO BE ON ERROR FILE 
          BX7       X"XREG.RM"
          SA7       A0+"FWRD.RM"
 EFPC     BSS       0 
          BX5       X0             TRANSFER PARAMETERS IN X5
                                   (RETURNS IN X0 AGAIN)
          LGO.RM    EF
 EF       FAKEPL    =YEF$CRM
          ENTRY     EFR$CRM 
 EFR$CRM  BSS       0 
          SA"XREG.RM" A0+"FWRD.RM"
          BX2       X0
          LX2       NTE.P 
          MI        X2,RETURN      IF A NOTE
 FNFT     BSS       0 
          BX2       X0
          LX2       FNF.P 
          MI        X2,EXCK        IF ERROR IS FATAL
 ECTT     BSS       0 
          F.RM      ERL,3 
          ZR        X3,EXCK        IF 0 ERL INFINITE
          F.RM      ECT,2 
          SX2       X2+B1          INCREMENT TRIVIAL ERROR COUNT
          IX4       X2-X3 
          SET.RM    ECT,X2
          PL        X4,ER356       IF TRIVIAL ERROR LIMIT REACHED 
 EXCK     BSS       0 
          BX2       X0
          LX2       EES.P 
          PL        X2,EXGO        IF ERROR EXIT NOT SUPPRESSED 
 RETURN   BSS       0 
          AX0       60-RTN.P-RTN.S
          SB3       X0+            GOING BACK TO CALLER 
          MX2       0              OFCT DECREMENT 
          EQ        ALLXIT
          SPACE     1 
 EXGO     BSS       0 
          STO.REG 
*#
*1CD  THE EX$CRM SUBPROGRAM 
*0D   PURPOSE 
*0        PERFORM USER ERROR EXIT IF PRESENT ELSE RETURN TO USER. 
*0D   CALLING SEQUENCE
*0        EQ        =XEX$CRM
*0D   PARAMETERS
*0        A0-    FIT ADDRESS
*         B1-    1
*0D   ACTIONS 
*0        IF ES CONTAINS 115B ABORT THE JOB.  IF THE RETURN STACK IS
*         LOCATED BELOW FWA OF LOAD OR IF THE STACK CONTAINS ZERO 
*         PROCEDE TO STEP 1.  EXTRACT THE FIRST ADDRESS IN THE STACK. 
*0     1. IF SBF IS ON OR EX=0 RETURN TO USER (FIRST ADDRESS IN STACK)
*         STORE JP TO USER RETURN ADDRESS INTO THE ENTRY POINT OF THE 
*         USERS ERROR EXIT AND BRANCH TO EX+1.
*0D   REGISTERS 
*0        USES   A237,B246,X12347 
*0D   OTHER CODE
*0        MACROS-   F.RM,ON.RM,ABORT
*         PROGRAMS- SYS=
*#
 EX$CRM   BSS       0 
          PUT.IN
          F.RM      ES,2
          SB2       X2-115B 
          SB3       B6
          NZ        B2,CONTIN      IF NOT 115 ERROR 
          ABORT                    ABORT THE JOB
          SPACE     1 
 CONTIN   BSS       0 
          ON.RM     OEDM,CON1      IF DATA MANAGER ERROR
          F.RM      LOP,X1,-#OP#
          NZ        X1,CON1        IF NOT DETECTED BY OPEN
          F.RM      OC,X1,-#OPE#
          ZR        X1,CON1        IF FILE OPENED 
          SB4       B3+0           SAVE RETURN ADDRESS
*CALL /CLSFLOF/ 
          SB3       B4+0           RESTORE RETURN ADDRESS 
 CON1     BSS       0 
          SA2       A0+7           THE B6 STACK 
          SX7       A2-101B        * DONT POP THE STACK 
          ZR        X2,ERR.RM9     * IF STACK WORD ZERO   OR
          NG        X7,ERR.RM9     * IF FIT BELOW FWA OF LOAD 
 ERR.RM8  BSS       0 
          SB3       X2
          AX2       18
          NZ        X2,ERR.RM8     IF MORE RETURNS
          BX7       X2
          SA7       A2+0           ENSURE STACK WORD = 0
 ERR.RM9  BSS       0 
          SB2       B1+B1          SHIFT COUNT FOR FNF OUT OF FOC 
          OFF.RM    SBF,TAKEX 
          F.RM      LOP,1 
          SX7       X1-#GE# 
          ZR        X7,XIT         AFTER GET, DO NOT EX IF SBF IS ON
          SX7       X1-#PU# 
          ZR        X7,XIT         AFTER PUT, DO NOT TAKE EX IF SBF IS ON 
TAKEX     BSS       0 
          F.RM      EX,1                    OR
          ZR        X1,XIT         IF EX=0
          SA3       BLNKJP         JP B0
          SX4       B3
          LX4       30
          IX7       X3+X4 
          SA7       X1             STORE RETURN TO USER INTO EX ENTRY 
          SB3       X1+B1          EX+1 
          MX7       0 
          SA7       A0+7           CLEAR B6 STACK 
 XIT      BSS       0 
          SET.RM    EES,0          SIGNIFY ERROR EXIT PROCESSING DONE 
          F.RM      FOC,2 
          AX3       X2,B2 
          BX2       X3*X2          FATAL LAN OPEN = OFCT DECREMENT
 ALLXIT   BSS       0 
          SA1       =YOFCT$RM      OPEN FILES COUNT 
          BX7       X"XREG.RM"
          IX6       X1-X2          DECREMENT BY ONE OR ZERO 
          SA7       A0+"FWRD.RM"
          SA6       A1+ 
          ZR        X6,FLEF$RM     IF NO OPEN FILES, SHUT DOWN CRMEP. 
          JP        B3             TO CALLER OR USER
          SPACE     1 
 SAME     BSS       0 
          INC.RM    OECT,B1 
          F.RM      OECT,X1,-77B
          NZ        X1,ETEF        IF OLD ERROR COUNT LESS THAN MAX.
          BX7       X"XREG.RM"
          SB5       ETEF1 
          SA7       A0+"FWRD.RM"
*#
*1CD  THE OE$CRM SUBPROGRAM 
*0D   PURPOSE 
*0        DISPLAY MORE OF SAME ERROR MESSAGE IF OECT"0
*0D   CALLING SEQUENCE
*0        SB5       RETURN
*         EQ        =XOE$CRM
*0D   PARAMETERS
*0        A0-    FIT ADDRESS
*         B1-    1
*         B5-    RETURN ADDRESS 
*0D   ACTIONS 
*0        IF OECT IS ZERO RETURN,  ENCODE THE OLD ERROR CODE AND THE OLD
*         ERROR COUNT AND ISSUE THE MESSAGE WITH ITS ASSOCIATED LFN TO
*         THE DAYFILE AND RETURN. 
*0D   REGISTERS 
*0        A123567, B24, X123567  DESTROYED
*0D   OTHER CODE REQUIRED 
*0        MACROS-   F.RM,SET.RM,MESSAGE 
*         PROGRAMS- MSG=
*#
          ENTRY     OE$CRM
 OE$CRM   BSS       0              (B5=RETURN ADDRESS)
 31B      PUT.IN    5 
          F.RM      OECT,3
          ZR        X3,RTN3 
          BX6       0 
          SA2       =10H RM ERROR 
          OFF.RM    OEDM,OEDM      IF OLD ERROR IS FROM BAM 
          SX6       1RR&1RD 
 OEDM     BSS       0 
          LX6       8*6 
          BX7       X2-X6          OPTIONALLY CHANGE  RM INTO  DM 
          SA7       MOBUF 
          SX2       52429          CONVERT OECT TO DECIMAL DISPLAY CODES
          DX1       X2*X3 
          AX1       19             NUM/10 
          SX2       100B-10D
          IX1       X2*X1 
          SA2       =10H000 00 MOR
*     10*T+U + 54*T = 100B*T+U
          IX3       X3+X1          2-DIGIT DISPLAY CODE 
          LX3       4*6            POSITION REPEAT COUNT
*     CONVERT ERROR NUMBER TO DISPLAY CODE. 
          F.RM      OLDE,1
          IX7       X2+X3          000 NN MOR 
          MX2       -3
          LX1       -2*ES.S 
          SB4       B1+B1 
          LX2       -2*ES.S 
  
 BD.MOR   BX3       -X2*X1
          LX2       6 
          SB4       B4-B1 
          IX7       X7+X3 
          LX1       3 
          GE        B4,BD.MOR      LOOP 3 TIMES 
  
          SA7       A7+B1          UPDATE SECOND WORD OF MESSAGE
          SA1       A0
          MX7       42
          BX1       X7*X1 
          SX2       1R
          BX7       X1+X2 
          LX7       -6             BLANK, THEN LFN
          SA7       MOBUF+3 
          SET.RM    OECT,0         CLEAR OLD ERROR COUNT
          MESSAGE   MOBUF,,RECALL  DISPLAY MORE SAME ERROR MESSAGE
 RTN3     BSS       0 
          STO.REG 
 15B      PUT.IN    5 
          JP        B5
          SPACE     1 
 ER356    BSS       0 
          ECHO      6,ARG=(ES,FNF),VAL=(356B,1) 
          SX3       VAL 
          LX0       ARG_.P+ARG_.S 
          MX1       60-ARG_.S 
          BX4       X1*X0 
          BX0       X4+X3 
          LX0       60-ARG_.P-ARG_.S
          EQ        FITSTO
  
 BLNKJP   JP        B0             DUMMY JP FOR EX CODE 
  
 FLEF$RM  SPACE     4,10
*#
*1CD  THE FLEF$RM SUBPROGRAM
*0D   PURPOSE 
*         UNLOAD DF$CRM AND EF$CRM
*0D   CALLING SEQUENCE
*0        SB3       RETURN
*         EQ        FLEF$RM 
*0D   PARAMETERS
*0        B1-       1 
*         B3-       RETURN
*         A0-       FIT ADDRESS 
*0D   ACTIONS 
*0        SET UP TO HAVE DF$CRM UNLOADED; CONDITIONALLY JUMP TO 
*         FLEG$RM IN EF$CRM TO TAKE CARE OF THE REST. 
*#
          ENTRY     FLEF$RM 
 FLEF$RM  BSS 
          RJ        =XRM$UTC       UNLOAD ANY TRANSIENT 
          SA1       CAPSTAT-1 
          SB2       B1+B1          INDICATE NO LOAD ON ULJ CALL 
          BX7       X1
          SA7       =XRM$TMP       NON-ZERO IF DYNAMIC
          SB4       =YFLEG$RM 
          PL        B4,=YFLEG$RM   IF ERROR FILE HANDLER LOADED, FLUSH. 
          EQ        =YRM$ULJ       UNLOAD SELF THEN EXIT VIA B3 
* END /DFDCRM/
