*DECK CMMR
          IDENT  CMM.R
  
          TITLE  COMMON MEMORY MANAGER, V1.0 - RESIDENT SUBROUTINES 
          LIST   X
*CALL CMMCOM
          COMMENT  "SUBSYS"RESIDENT SUBROUTINES.
 CPYRT    DATA   H*COPYRIGHT CONTROL DATA CORP. 1976,1977,1978,1979,1980
,1981,1982* 
          ORG    CPYRT
          B1=1
 CMM.AUS  TITLE  CMM.AUS - ADJUST USED SPACE
**        CMM.AUS - ADJUST USED SPACE.
* 
* 
*              THIS ROUTINE EXISTS FOR THE FUNCTION CMM.GSS IN ORDER
*         TO KEEP CURRENT THE MAXIMUM AMOUNT OF ALLOCATED SPACE.  IT
*         SHOULD BE CALLED WHENEVER ANY KIND OF A FREEING OPERATION 
*         OCCURS AND WHENEVER THE CMM.GSS FUNCTION IS BEING PROCESSED.
* 
*         ENTRY  (X1) = AMOUNT OF SPACE BEING FREED  (MAY BE ZERO). 
*                (B1) = 1.
*                (A0) = FL. 
* 
*         EXIT   (X6) = MAXIMUM WORDS ALLOCATED AT THIS TIME. 
*                (B1) = 1.
*                (A0) = FL. 
* 
*         USES   X - 2, 3, 6. 
*                B - NONE.
*                A - 2, 3, 6. 
  
  
          ENTRY  CMM.AUS
 CMM.AUS  EQ     *+400000B   ENTRY / EXIT 
          SA2    A0-CURALL   CURRENT AMOUNT ALLOCATED 
          IX6    X2-X1       REDUCE BY AMOUNT BEING FREED 
          SA6    A2 
          SA3    A0-MAXALL
          IX6    X3-X2       SET MAXALL = MAX(CURALL,MAXALL)
          BX3    X3-X2
          AX6    59 
          BX3    -X6*X3 
          BX6    X3-X2
          SA6    A3 
          EQ     CMM.AUS     RETURN 
 CMM.CFL  TITLE  CMM.CFL - CHANGE FIELD LENGTH
**        CMM.CFL - CHANGE FIELD LENGTH.
* 
* 
*              THIS ROUTINE PERFORMS ALL THE CHANGES OF THE FIELD 
*         LENGTH DONE BY CMM, EXCEPT FOR THOSE DONE INITIALLY BY
*         CMM.ICM.
* 
*         ENTRY  (X4) = AMOUNT OF CHANGE, UNROUNDED, PLUS OR MINUS. 
*                (B1) = 1.
*                (A0) = CURRENT FL. 
* 
*         EXIT   (B1) = 1.
*                (B6) = CHANGE, AFTER ROUNDING. 
*                (A0) = NEW FL. 
* 
*         USES   X - 1, 2, 3, 4, 6, 7.
*                B - 6, 7.
*                A - 1, 2, 3, 4, 6, 7.
  
  
          ENTRY  CMM.CFL
 CMM.CFL  EQ     *+400000B   ENTRY / EXIT 
          SA2    RA65 
          SB6    X4+77B 
          SX7    A0+B6
          AX7    6
          LX7    6           (X7) = NEW FL
          SB6    X7 
          SB7    X2+B6       (NEW FL) - DABA
          SB6    A0-B6       (B6) = DECREASE IN FL, AFTER ROUNDING
          SA3    A0-FLDOWN
          LE     B7,B1,*+1S17  SYSTEM ERROR 
          GT     B6,B0,CFL6  IF DECREASE REQUESTED
          ZR     B6,CMM.CFL  IF NO CHANGE IS THE RESULT 
          SA3    A0-FLUP
          SA2    A0-FLMAX    UPDATE MAXIMUM FL ATTAINED 
          IX6    X2-X7
          BX2    X2-X7
          AX6    59 
          BX2    -X6*X2 
          BX6    X2-X7
          SA6    A2 
  
*         ISSUE SYSTEM REQUEST TO INCREASE FL.
  
          LX7    30 
          RJ     =XCMM.MEM
  
*         MOVE CMM INTERNAL AREA BY AMOUNT OF THE CHANGE. 
  
 CFL6     SB7    NIB+1
          SB6    -B6         (B6) = INCREASE IN FL
          SX6    X3+B1
          SA6    A3          ADVANCE COUNT OF FL INCREASES OR DECREASES 
          SX1    B6          (X1) = CHANGE
 CFL7     SA2    A0-B7       ADJUST ADDRESSES IN HIGH-CORE POINTERS 
          IX6    X2+X1
          SA6    A2 
          SB7    B7-B1
          NE     B7,B0,CFL7 
          SA3    X2          ADJUST FWD POINTER IN PREVIOUS HEADER
          AX3    18 
          SA4    X3 
          IX7    X4+X1
          MX3    2
          ID     X4,CFL8     IF HIGHEST REGION IS A FIXED BLOCK 
          SA7    A4          STORE ADJUSTED HEADER
          MX6    0
          SA6    HSAVE
          SB7    X7          END OF NEW FREE REGION 
          SB7    A4-B7       COMPARE IT TO ADDRESS OF FREE HEADER 
          NZ     B7,CFL8A    IF FREE REGION STILL EXISTS
          AX4    18          (X4) = FWA OF BLOCK BEFORE FREE REGION 
          LX4    18          CLEAR BOTTOM BITS
          BX7    X4+X3
          SA7    A3          RESET HEADER OF TRAILER REGION 
          EQ     CFL8A
  
 CFL8     SX7    A4          FORM NEW FREE REGION HEADER TO STORE AT
          LX7    18           PREVIOUS LOCATION OF TRAILER
          BX7    X6+X7
          SA7    HSAVE
          SX7    A3          FORM TRAILER TO POINT TO NEW FREE REGION 
          LX7    18 
          BX7    X7+X3
          SA7    A3 
 CFL8A    SB7    X2           ? (X1) = WORD COUNT FOR MOVE
          SX1    A0-B7               = (PREV FL) - (PREV ADR OF TRAILER)
          SX2    X2           ? (X2) = PREVIOUS TRAILER ADDRESS 
          SX3    X2+B6        ? (X3) = NEW TRAILER ADDRESS
          SX7    B1          (X7) = +1 IF DOWNWARD MOVE 
          IX6    X2-X3              -1 IF UPWARD MOVE 
          AX6    59 
          BX7    X7-X6
          SB7    -B1         (B7) = -1
          SX4    X1+B7       ADJUST STARTING ADDRESSES TO TOP OF THE
          BX4    X6*X4        AREA IF UPWARD MOVE 
          IX2    X2+X4
          IX3    X3+X4
 CFL9     SA4    X2          MOVE LOOP
          BX6    X4 
          IX2    X2+X7
          SA6    X3 
          IX3    X3+X7
          SX1    X1+B7
          NZ     X1,CFL9
          SA0    A0+B6       (A0) = NEW FL
          SA2    RA65        STORE NEW FL AT DABA 
          MX3    2
          BX2    -X2
          SX6    A0 
          BX7    X6+X3
          SA7    X2 
          SA2    A0-B1       STORE NEW FREE REGION HEADER IF NECESSARY
          SA2    X2 
          SA3    HSAVE
          ZR     X3,CFL103   IF NO FREE REGION HEADER TO STORE
          LX2    -18         STORE SAVED NEW FREE REGION HEADER AS
          BX7    X3           LAST REGION 
          SA7    X2 
 CFL103   BSS    0
          PL     B6,CMM.CFL  IF INCREASE
  
*         ISSUE SYSTEM REQUEST TO DECREASE FL.
  
          SA3    B1+B1       A3 WAS > NEW FL
          SA4    B1+B1       A4 WAS > NEW FL
          SX7    A0          SET SYSTEM REQUEST 
          LX7    30 
          RJ     =XCMM.MEM   DECREASE FL
          EQ     CMM.CFL     RETURN 
 HSAVE    CON    0           SAVE AREA FOR FREE REGION HEADER 
 CMM.CUL  TITLE  CMM.CUL - COMPUTE UTILIZATION LEVEL
**        CMM.CUL - COMPUTE UTILIZATION LEVEL.
* 
* 
*              THIS ROUTINE COMPUTES: 
* 
*         (PERCENT UTILIZATION LEVEL) = (USED SPACE BETWEEN MAXFL-DABA) 
*                                       / (MAXFL - DABA)
* 
*              IT ALSO DETERMINES THE MAXIMUM AMOUNT OF CONTIGUOUS
*         FREE SPACE. 
* 
*         ENTRY  (X1) = 0 IF TO RETURN IN ANY CASE. 
*                       1 IF TO ABORT IF THE DEFAULT PERCENT
*                         UTILIZATION LEVEL IS EXCEEDED.
*                (B1) = 1.
*                (A0) = FL. 
* 
*         EXIT   (X1) = UTILIZATION LEVEL  (F. P. FRACTION).
*                (X2) = MAXIMUM CONTIGUOUS FREE SPACE.
*                (X3) = TOTAL SPACE (NORMALIZED). 
*                (X7) = USED SPACE (NORMALIZED).
*                (B1) = 1.
*                (A0) = FL. 
* 
*         USES   X - 1, 2, 3, 4, 6, 7.
*                B - 4, 5, 6, 7.
*                A - 1, 2, 3, 4, 6, 7.
  
  
          ENTRY  CMM.CUL
 CMM.CUL  EQ     *+400000B   ENTRY / EXIT 
          SX4    X1          (X4) = RETURN TYPE FLAG
          SA2    A0-MAXFL 
          SX3    A0          (X3) = FL
          IX6    X2-X3       (X6) = INITIAL MAX CONTIG = MAXFL - FL 
          SA1    RA65        (B4) = DABA+1
          BX1    -X1
          SB4    X1+B1
          SB5    X1          (B5) = DABA
          ERRNZ  P.ENDZ-1 
          SA1    A0-B1       (X7) = INITIAL USED SPACE = SIZE OF CMM
          IX7    X3-X1        INTERNAL SPACE + 1 WORD FOR DABA
          SX7    X7+B1         CONTAINING FL
          SB6    X2          (B6) = MAXFL 
          EQ     CUL6        ENTER LOOP 
  
*         REGION LOOP.
  
 CUL2     SX7    X7+B1       ADD VP REGION HEADER TO USED SPACE 
          AX3    36 
          SA1    X3          1ST BLOCK HEADER 
 CUL4     SX2    X1          FWD POINTER
          AX1    36          ADD LENGTH+4 TO USED SPACE 
          SX3    X1+4 
          IX7    X7+X3
          SA1    X2          NEXT BLOCK HEADER
          NZ     X2,CUL4     IF NOT LAST BLOCK
 CUL6     SA3    B4          NEXT REGION HEADER 
          SB4    X3          (B4) = NEXT REGION FWA 
          ZR     B4,CUL10    IF ALL REGIONS SCANNED 
          SB7    A3 
          SX1    B4-B7       (X1) = TOTAL REGION SIZE 
          DF     X3,CUL8     IF NOT A FIXED BLOCK 
          IX7    X7+X1       ADVANCE USED SPACE BY SIZE 
          EQ     CUL6        LOOP 
  
 CUL8     MI     X3,CUL2     IF A VP REGION 
          IX3    X1-X6       UPDATE MAX CONTIG
          BX1    X1-X6        = MAX[(MAX CONTIG),(REGION SIZE)] 
          AX3    59 
          BX1    -X3*X1 
          BX6    X1-X6
          EQ     CUL6        LOOP 
  
  
*         COMPUTE UTILIZATION LEVEL.
  
 CUL10    SX3    B6-B5       TOTAL SPACE = MAXFL-DABA 
          PX3    X3          (X1) = UTILIZATION LEVEL 
          PX7    X7               = USED / TOTAL
          NX3    X3 
          NX7    X7 
          FX1    X7/X3
          BX2    X6          (X2) = MAX CONTIG
          ZR     X4,CMM.CUL  IF TO RETURN IN ANY CASE 
          SA3    A0-OWNFG 
          NZ     X3,CMM.CUL  IF IN USER ERROR EXIT MODE 
          SA3    =0."DEFTRIG" 
          FX6    X3-X1
          PL     X6,CMM.CUL  IF STILL OK
          MERR   ERRUTL      DEFAULT PERCENT EXCEEDED 
 CMM.ICM  TITLE  CMM.ICM - INITIALIZE CMM 
**        CMM.ICM - INITIALIZE CMM. 
* 
* 
*              THIS ROUTINE IS CALLED AT THE START OF EVERY FUNCTION
*         WHICH MAY LEGALLY BE THE FIRST CALL TO CMM.  IF IT IS, IN 
*         FACT, THE FIRST CALL, THE *DABA* FIELD IN RA+65B, BITS 0-17,
*         WILL STILL BE POSITIVE.  CMM WILL, IN THIS CASE, COMPLIMENT 
*         THIS FIELD AND INITIALIZE THE DYNAMIC AREA. 
* 
*         ENTRY  (B1) = 1.
*                RA+65B, BITS 0-17, CONTAINS *DABA*, EITHER POSITIVE
*                   OR NEGATIVE.
* 
*         EXIT   (A0) = FL. 
*                (B1) = 1.
*                RA+65B, BITS 0-17, IS NEGATIVE TO INDICATE CMM IS
*                   ACTIVE. 
* 
*         USES   X - 6, 7.
*                B - 4, 5, 6, 7.
*                A - 1, 2, 3, 6, 7. 
  
  
*         COME HERE IMMEDIATELY ON ALL EXCEPT THE INITIAL CALL. 
  
 ICM10    BX1    -X1         (A0) = FL (FROM DABA)
          SA1    X1 
          SA0    X1 
 SF1      IFNE   DEFVER,0    IF ERROR CHECKING (SAFE) VERSION 
          SA1    CMS.FL      GET LATEST FL
          NZ     X1,ICMC1    JP IF SET
*      LOCAL FL NOT SET - MAY BE IN OVERLAY WHICH WAS JUST LOADED 
          MX7    0
          RJ     =XCMM.MEM   GET CURRENT FL 
          MX7    1
          SA7    CMS.ACT     SET AS ACTIVE ANYHOW 
 ICMC1    BSS    0
          SX7    A0 
          IX7    X1-X7
          NG     X7,ICMER1   JP IF ACTUAL FL LS THAT IN DABA
          SA1    CMS.ACT     GET LOCAL CMM ACTIVE FLAG
          NZ     X1,ICM10A   JP IF CMM IS ACTIVE BY LOCAL FLAG
 ICMER1   BSS    0           ERROR - SOMETHING WRONG WITH RA+65B
          SA1    CMM.ICM
          AX1    30 
          SX1    X1-1        ADDR OF CALLER TO CMM.ICM
          LX1    45          POSITION FOR CONVERSION
          SB2    6
          MX7    60-3 
          MX4    0
 ICMER1L  BSS    0           CONVERT ADDR TO DISPLAY CODE 
          BX3    -X7*X1 
          SX3    X3+33B 
          BX4    X4+X3
          LX4    6
          LX1    3
          SB2    B2-B1
          NZ     B2,ICMER1L 
          SX1    CMEUSER     FIRST MESSAGE NBR
          SX2    3RICM       INSERT 
          SX3    CMERA65
          RJ     =XCMM.ERR
          ABORT 
 ICM10A   BSS    0
 SF1      ENDIF 
          SA1    ICMSV+1     MOVE SAVED A0 TO HIGH-CORE SAVE AREA 
          BX6    X1 
          SA6    A0-MNSAVEA0
          SA1    A1-B1       RESTORE X1 
  
          ENTRY  CMM.ICM
 CMM.ICM  EQ     *+400000B   ENTRY / EXIT 
  
*         SAVE MINIMUM REGISTERS AND CHECK IF 1ST CALL. 
  
          BX6    X1          SAVE X1
          SA6    ICMSV
          SX6    A0          SAVE A0
          SA6    A6+B1
          SA1    RA65 
          SX6    X1 
          MI     X6,ICM10    IF CMM ALREADY ACTIVE
 SF2      IFNE   DEFVER,0    IF ERROR CHECKING (SAFE) VERSION 
          SX7    X6-400B     DABA - MINIMUM EVER POSSIBLE 
          NG     X7,ICMER1   JP IF RA+65 WAY TOO LOW FOR REAL DABS
          SA1    CMS.ACT     GET LOCAL ACTIVE FLAG
          NZ     X1,ICMER1   JP IF LOCAL FLAG SAYS CMM ACTIVE - RA65 BAD
          MX7    1
          SA7    A1          SET LOCAL FLAG AS CMM ACTIVE 
          SA1    RA65        RESTORE X1 
 SF2      ENDIF 
  
*         SET CMM ACTIVE - COMPLIMENT DABA IN RA+65B
  
          SB5    X6          SAVE DABA IN B5
          BX7    -X6
          MX6    42 
          BX7    -X6*X7 
          BX6    X6*X1
          BX7    X6+X7
          SA7    A1 
  
*         SAVE REMAINING NECESSARY REGISTERS. 
  
          BX6    X2          SAVE X2
          SA6    A6+B1
  
*         ISSUE SYSTEM REQUEST TO DETERMINE MAXFL.
  
          MX7    29 
          RJ     =XCMM.MEM
 SCP2     IFC    EQ,/"OS.NMV"/SCOPE 2/
          MX7    -9 
          BX1    X7*X1       ROUND TO NEAREST 1000B 
 SCP2     ENDIF 
          SB7    X1          (B7) = MAXFL 
  
*         ISSUE SYSTEM REQUEST TO DETERMINE FL. 
  
          MX7    0
          RJ     =XCMM.MEM
          SB6    X1          (B6) = (A0) = FL 
          SA0    X1 
          SA2    HHA         SET HHA = MAX[HHA,(INITIAL DABA)]
          MX7    42 
          BX7    X7*X2
          SX2    X2 
          SX1    B5          DABA 
          IX6    X1-X2
          BX1    X1-X2
          AX6    59 
          BX1    -X6*X1 
          BX2    X1-X2       (X2) = HHA 
          BX7    X7+X2
          SA7    A2 
          SX1    B7 
          IX6    X1-X2       MAXFL - HHA
          SX6    X6-ENDSTORE-2  ALLOW SPACE FOR INTERNAL TABLES 
          PL     X6,ICM3
          MESSAGE  (=C* MAXFL LT HHA+100, CMM CANNOT FUNCTION*),,RCL
          ABORT 
  
 ICM3     BSS    0
  
*         ESTABLISH REASONABLE INITIAL FL TO BE AT LEAST
*          = MIN[(HHA+FLINC),MAXFL].
  
          SX2    X2+FLINC    HHA + FLINC
          SX7    B7          MAXFL
          IX6    X2-X7
          BX7    X2-X7
          AX6    59 
          BX7    -X6*X7 
          BX7    X7-X2       MIN[(HHA+FLINC),MAXFL] 
          SX2    B6          FL 
          IX2    X2-X7
          MX6    -6 
          PL     X2,ICM4     IF FL ALREADY THIS HIGH
          IX7    X7-X6
          BX7    X6*X7
          SA0    X7          (A0) = NEW FL
  
*         ISSUE SYSTEM REQUEST TO SET NEW FL. 
  
          LX7    30          MEM VALUE
          RJ     =XCMM.MEM
  
*         PRESET CMM INTERNAL STORAGE.
  
 ICM4     SX6    A0-ENDSTORE
          SA6    A0-B1       HIGHEST POINTER
          DUP    NIB,1
          SA6    A6-B1       POINTERS TO VARIABLE-LENGTH INTERNAL BLOCKS
          SB4    X6          (B4) = INITIAL VALUE OF ENDZ 
          SX7    B7          STORE MAXFL, ORIGINAL AND CURRENT
          SA7    A0-MAXFL 
          SA7    A0-MAXFLST 
          SX7    FLINC       STORE INITIAL VALUE OF *FLINC* 
          SA7    A0-FLINC.C 
          SX7    FLF         STORE INITIAL VALUE OF *FLF* 
          SA7    A0-FLF.C 
          MX7    0           CLEAR ITEMS THAT START = 0 
          SA7    A0-OVERFLOW
          SA7    A0-FLUP
          SA7    A0-FLDOWN
          SA7    A0-CRASHES 
          SA7    A0-OACALLS 
          SA7    A0-OP1 
          SA7    A0-OWNFG 
          SA7    A0-IMAPM 
          SA7    A0-IMAUA 
          SA7    A0-GROUPID 
          SA7    A0-ENTRYID 
          SA7    A0-UNLOADID
          MX6    -1          THIS GOES UP BY 2 AND IS AN ODD VALUE
          SA6    A0-UNIQUEID
          SX6    A0          MAXIMUM FL ATTAINED
          SA6    A0-FLMAX 
          SX6    ENDSTORE+2  MAXIMUM AND CURRENT ALLOCATED WORDS
          SA6    A0-MAXALL
          SA6    A0-CURALL
          MX1    2           DUMMY FIXED BLOCK HEADER 
          SX7    A0          STORE FL AND DUMMY FIXED HDR AT DABA 
          BX7    X1+X7
          SA7    B5 
          SX6    B5+B1                                                   CMM0008
          LX6    18          FORM TRAILER AND STORE AT ENDZ 
          BX6    X1+X6
          SA6    B4 
          SX7    B4          STORE FREE REGION HEADER AT DABA+1 
          SX6    B5          BKD = DABA 
          LX6    18 
          BX7    X6+X7
          SA7    B5+B1
  
*         RESTORE REGISTERS AND RETURN. 
  
          SA2    ICMSV+2     RESTORE X2 
          SA1    RA65        (X1) = (RA+65B)
          EQ     ICM10       GO TO EXIT 
  
 ICMSV    BSS    3           STORAGE FOR X1, A0, X2 
 SF3      IFNE   DEFVER,0    IF ERROR CHECKING (SAFE) VERSION 
          ENTRY  CMS.ACT
 CMS.ACT  DATA   0           LOCAL FLAG FOR CMM ACTIVE
          ENTRY  CMS.FL 
 CMS.FL   DATA   0           LOCAL FL 
 SF3      ENDIF 
          SPACE  4,10 
          ENTRY  CMM.SBL
 CMM.SBL  CON    377700B     DEFAULT FOR SMALL BLOCK MEMORY LIMIT 
          ENTRY  CMM.SBM
 CMM.SBM  CON    240B        DEFAULT FOR MAXIMUM SMALL BLOCK SIZE 
 CMM.MEP  TITLE  CMM.MEP - MEMORY ERROR PROCESSOR 
**        CMM.MEP - MEMORY ERROR PROCESSOR. 
* 
* 
*              THIS ROUTINE ISSUES ONE MESSAGE AND ABORTS ON CMM MEMORY 
*         ERRORS.  A ONE-DIGIT CODE, ADDED TO THE MESSAGE, INDICATES
*         THE REASON FOR THE ERROR: 
* 
*                1 - NO OV-ACTION SPECIFIED, ."DEFTRIG" UTIL LEVEL
*                2 - CMM.YYY CANNOT COMPLETE
*                3 - NO MORE OVERFLOW-ACTION CALLS POSSIBLE 
*                4 - CMM.YYY CANNOT COMPLETE - OVERFLOW MODE
*                5 - NO ROOM TO INCREASE CMM INTERNAL AREA
* 
*         ENTRY  (X1) = CODE DESCRIBED ABOVE. 
*                (B1) = 1.
*                (A0) = FL. 
* 
*         EXIT   NONE.
  
  
          ENTRY  CMM.MEP
 CMM.MEP  EQ     *+400000B   ENTRY / EXIT 
          SA2    A0-OWNFG 
          ZR     X2,MEP0     IF NOT IN USER ERROR EXIT MODE 
          MX6    0           RESET FOR NEXT CALL TO CMM 
          SA6    A2 
          SA6    A0-OVERFLOW  CLEAR OVERFLOW MODE IF SET
          SA3    A0-MNRETURN  FORM X1 = 
          LX1    48            VFD 12/(MERR NO.),30/0,18/(CALL ADR) 
          SB7    X2          (B7) = USER ADDRESS
          BX1    X1+X3
          SA4    A0-MNSAVEA0  RESTORE A0
          SA0    X4 
          JP     B7          RETURN TO USER 
  
 MEP0     BSS    0
 SF1      IFNE   DEFVER,0    IF ERROR CHECKING VERSION
          SA3    A0-MNFNAME  NAME OF PRIMARY FUNCTION CALLED
          SX4    3R---       SET FOR NO SAVED NAME
          MX6    -18
          BX4    -X6*X4 
          SA2    A0-OVERFLOW
          ZR     X2,MEP1     IF NOT IN OVERFLOW MODE
          BX4    X3          THIS IS OV-ACTION FUNCTION 
          SA3    =YCMM.SV+MNEND-MNFNAME  GET PRIMARY FUNCTION NAME
 MEP1     SA2    MEPMSG+1    ADD ERROR NUMBER TO MESSAGE
          SX1    X1+1R0      DISPLAY CODE 
          LX1    48 
          MX6    -54
          LX6    54 
          BX2    -X6*X2      CLEAR PREVIOUS ERROR CODE
          IX6    X1+X2
          SA6    A2 
          SA1    A2+B1       INSERT PRIMARY FUNCTION NAME 
          LX3    4*6
          MX6    18 
          LX6    18+24
          BX6    -X6*X1 
          BX6    X6+X3
          SA6    A1 
          SA1    A1+B1       INSERT OV-ACTION FUNCTION NAME 
          LX4    2*6
          MX6    18 
          LX6    18+12
          BX6    -X6*X1 
          BX6    X6+X4
          SA6    A1 
          SX3    A2-B1       ISSUE MESSAGE
          MESSAGE  X3,,RCL
 SF1      ENDIF 
          SA2    A0-MAXFL    GET MAX FIELD LENGTH 
          SB2    6
          LX2    59-17
          MX6    60-3 
          MX7    0
 ERLP1    BSS    0
          LX7    6           CONVERT TO DISPLAY CODE
          LX2    3
          BX4    -X6*X2 
          SX4    X4+33B 
          BX7    X4+X7
          SB2    B2-B1
          NZ     B2,ERLP1 
          LX7    60-36
          SX1    2RB. 
          LX1    12 
          BX7    X7+X1
          SA7    MAXWD       PUT DISPLAY MAXFL AND ZB TERM IN MSG 
          MESSAGE  MAXMS,,RCL      OUTPUT DAYFILE MESSAGE 
          ABORT 
  
 SF2      IFNE   DEFVER,0 
 MEPMSG   DATA   C* CMM ERROR 0, MAIN-CMM.:::, OV-CMM.:::*
 SF2      ENDIF 
 MAXMS    DATA   H*CMM CENTRAL MEMORY LIMIT INSUFFICIENT - MAXFL IS * 
 MAXWD    DATA   0
  
          END 
