*COMDECK CSV
          TITLE  COMMON MEMORY MANAGER, V1.0, CMM.CSV - CHANGE SPECS VAR
,YING 
*CALL CMMCOM
          COMMENT  "SUBSYS"CHANGE SPECS VARYING.
          LIST   F
          B1=1
 CMM.CSV  SPACE  4,10 
***       CMM.CSV - CHANGE SPECS VARYING. 
* 
* 
*              IF NEW-SIZE-CODE IS NOT -1, THE SIZE-CODE VALUE FOR THE
*         BLOCK WHOSE CURRENT FWA IS BLOCK-FWA IS CHANGED TO NEW-SIZE-
*         CODE.  IF NEW-TYPE-CODE IS NOT -1, THE TYPE-CODE VALUE FOR
*         THE BLOCK WHOSE CURRENT FWA IS BLOCK-FWA IS CHANGED TO
*         NEW-TYPE-CODE.  IF NEW-AUX1 IS NOT -1, THE AUX1 VALUE FOR THE 
*         BLOCK WHOSE CURRENT FWA IS BLOCK-FWA IS CHANGED TO NEW-AUX1.
*         IF NEW-AUX2 IS NOT -1, THE AUX2 VALUE FOR THE BLOCK WHOSE 
*         CURRENT FWA IS BLOCK-FWA IS CHANGED TO NEW-AUX2.
*              IF THIS CALL RESULTS IN THE SPECIFICATION OF A NEW 
*         POINTER WORD FOR A TYPE 1 OR TYPE 3 BLOCK, THEN THIS (NEW)
*         WORD IS INITIALIZED WITH THE CURRECT VALUES BY CMM. 
*         THENCEFORTH THE NEW POINTER WORD MAY NOT BE MODIFIED BY THE 
*         USER AND THE RESTRICTION ON USER MODIFICATION OF THE OLD
*         POINTER WORD NO LONGER APPLIES. 
*              IF THIS CALL RESULTS IN THE FINAL BLOCK TYPE BEING 2,
*         THEN THE (POSSIBLY NEW) POINTER-MAINTENANCE SUBROUTINE IS 
*         CALLED IMMEDIATELY. 
* 
*         ENTRY  (X1) = BITS 59-30 -- NOT REFERENCED BY CMM.
*                       BITS 29-0  -- BLOCK-FWA.
*                (X2) = NEW-SIZE-CODE.
*                (X3) = NEW-TYPE-CODE.
*                (X4) = NEW-AUX1. 
*                (X6) = NEW-AUX2. 
* 
*         EXIT   (X1) = UNIQUE-ID IF NEW-TYPE-CODE = 4 AND NEW-AUX1 = 0,
*                       ELSE UNDEFINED. 
*                (B1) = 1.
* 
*         SAVES  X - 0, 5.
*                B - 2, 3.
*                A - 0. 
  
  
          CMMENT  CSV 
 CMM.CSV  EQ     *+400000B   ENTRY / EXIT 
          SB1    1
          SB4    X4          (B4) = NEW-AUX1
          SB5    X6          (B5) = NEW-AUX2
          SX6    B2-B0       SAVE B2
          SX7    B3-B0       SAVE B3
          SA6    CSVSV
          SA7    A6+B1
          SA4    RA65 
          SX6    A0          SAVE A0
          BX4    -X4
  
 IS       IFSAFE
          SX1    X1 
          SX4    X4 
          PL     X4,CSV102
          UERR   CMEFST,0,3RCSV  ILLEGAL 1ST CALL TO CMM
  
 CSV102   BSS    0
 IS       ENDIF 
  
          SA4    X4          (A0) = FL
          SA0    X4 
          SA6    A0-MNSAVEA0  SAVE A0 
  
 IS       IFSAFE
          SX7    3RCSV       SAVE FUNCTION NAME 
          SA7    A0-MNFNAME 
          SA4    CMM.CSV     SAVE RETURN ADDRESS
          LX4    30 
          BX6    X4 
          SA6    A0-MNRETURN
          SA4    A0-IMAPM 
          ZR     X4,CSV104
          UERR   CMEPMR,0  CALLED FROM POINTER-MAINTENANCE ROUTINE
  
 CSV104   SB7    B1           ? (B7) = 1 - VARIABLE BLOCK 
          RJ     =XCMM.CAB   -- CHECK ACTIVE BLOCK -- 
          SA4    X1-3        (X4) = HEADER WORD 1 
          MX6    2           TC-1 
          BX6    X6*X4
          NZ     X6,CSV114   IF NOT TYPE-CODE 1 
          LX4    -18         AUX2 
          SX6    X4 
          ZR     X6,CSV114   IF NO TYPE 3 BLOCK POINTER WORDS 
          MI     X2,CSV106   IF NO CHANGE TO SIZE-CODE
          MX7    -2 
          BX7    X7*X2
          NZ     X7,CSV112   IF ILLEGAL SIZE-CODE 
 CSV106   SB7    X3          NEW-TYPE-CODE
          MI     B7,CSV108   IF NO CHANGE TO TYPE-CODE
          NE     B7,B1,CSV112  IF NEW-TYPE-CODE OTHER THAN 1
 CSV108   MI     B4,CSV110   IF NO CHANGE TO AUX1 
          LX4    18          AUX1 
          SB7    X4 
          NE     B4,B7,CSV112  IF NEW-AUX1 OTHER THAN AUX1
 CSV110   MI     B5,CSV114   IF ANY CHANGE TO AUX2
          ZR     B5,CSV114   IF NEW VALUE IS ZERO, IGNORE IT
 CSV112   UERR   CMECTP3     BAD CHG TO BLOCK WITH TYPE 3 PTR WDS 
  
 CSV114   BSS    0
 IS       ENDIF 
  
          SA4    X1-3        HEADER WORD 1
          MI     X2,CSV4     IF NO CHANGE TO SIZE-CODE
  
 IS       IFSAFE
          SX6    X2-20B 
          MI     X6,CSV116
          UERR   CMESC,0     IMPROPERLY SPECIFIED SIZE-CODE 
  
 CSV116   BSS    0
 IS       ENDIF 
  
          MX6    -4          SET NEW-SIZE-CODE IN HEADER WORD 1 
          LX4    -54
          BX4    X6*X4
          IX4    X4+X2
          LX4    54 
 CSV4     SB2    X4          (B2) = AX1 = AUX1
          LX4    -18         (B3) = AX2 = AUX2
          SB3    X4 
          LX4    18 
          MI     B4,CSV5     IF NO CHANGE TO AUX1 
          SB2    B4          AX1 = NEW VALUE FOR AUX1 
 CSV5     MI     B5,CSV6     IF NO CHANGE TO AUX2 
          SB3    B5          AX2 = NEW VALUE FOR AUX2 
 CSV6     SB7    X3          (B7) = NEW-TYPE-CODE 
          MX6    2
          BX6    X6*X4
          LX6    2
          SX6    X6-2 
          NZ     X6,CSV8     IF CURRENT TYPE-CODE " 3 
          SA2    X4          DECREMENT AUX2 OF CURRENT ASSOCIATED 
          SA2    X2-3         TYPE 1 BLOCK
          SX6    B1 
          LX6    18 
          IX6    X2-X6
          SA6    A2 
 CSV8     SX3    B7-B1       (X3) = (NEW-TYPE-CODE) - 1 
          NE     B7,B1,CSV14  IF NOT CHANGING TO TYPE-CODE 1
  
*         RESULTING BLOCK = TYPE-CODE 1.
  
 CSV10    BSS    0
  
 IS       IFSAFE
          SA2    RA65        (B6) = DABA
          BX2    -X2
          SB6    X2 
          LT     B2,B6,CSV122  IF AX1 < DABA
 CSV120   UERR   CMEAUX      IMPROPERLY SPECIFIED AUX1 OR AUX2
  
 CSV122   SB5    B5+B1       (NEW-AUX2) + 1 
          GT     B5,B1,CSV120  AUX2 ILLEGAL IF > 0
 IS       ENDIF 
  
          LX4    -18
          SB6    X4          AUX2 
          SB3    B0          SET FOR NEW-AUX2 = 0 
          LX4    18 
          SB7    -B1         NX = -1
          MX6    2
          BX6    X6*X4
          NZ     X6,CSV50    IF NOT TYPE-CODE 1 
          SB3    B6          SET NEW-AUX2 = CURRENT VALUE 
          EQ     CSV50
  
 CSV14    SB6    B1+B1
          NE     B7,B6,CSV16  IF NOT NEW-TYPE-CODE 2
  
*         RESULTING BLOCK = TYPE-CODE 2.
  
 CSV15    BSS    0
  
 IS       IFSAFE
          SA2    RA65 
          BX2    -X2
          SB6    X2 
          GE     B2,B6,CSV120  IF AUX1 \ DABA 
          MI     B3,CSV120   IF AUX2 \ 2**17
 IS       ENDIF 
  
          SB7    -B1         NX = -1
          EQ     CSV50
  
 CSV16    SB6    B6+B1
          NE     B7,B6,CSV19  IF NOT NEW-TYPE-CODE 3
  
*         RESULTING BLOCK = TYPE-CODE 3.
  
 CSV17    BSS    0
  
 IS       IFSAFE
          SB6    X1          SAVE ORIGINAL BLOCK-FWA
          SA1    B2           ? (X1) = FWA OF TYPE 1 BLOCK WITH PTR WDS 
          SB7    B1           ? (B7) = 1 - VARIABLE BLOCK 
          SX1    X1 
          RJ     =XCMM.CAB   -- CHECK ACTIVE BLOCK -- 
          SA2    X1-4        (B7) = LENGTH OF TYPE 1 BLOCK
          AX2    36 
          SB7    X2 
          SX1    B6          RESTORE ORIGINAL BLOCK-FWA 
          GE     B3,B7,CSV120  IF AUX2 \ LENGTH 
          MI     B3,CSV120   IF AUX2 TOO SMALL
 IS       ENDIF 
  
          SB7    B1          NX = 1 
          EQ     CSV50
  
 CSV19    SB6    B7-4 
          NZ     B6,CSV30    IF NOT NEW-TYPE-CODE 4 
  
*         RESULTING BLOCK = TYPE-CODE 4.
  
 CSV20    BSS    0
  
          IFFAST  1 
          NZ     B2,CSV22    IF AUX1 SPECIFIED
  
 IS       IFSAFE
          ZR     B2,CSV140   IF UNIQUE-ID NOT SUPPLIED BY USER
          SX7    B2          VERIFY THAT USER-SUPPLIED AUX1 IS EVEN 
          LX7    59 
          MI     X7,CSV120   IF ODD 
          EQ     CSV22
  
 CSV140   BSS    0
 IS       ENDIF 
  
          SA2    A0-UNIQUEID  ADVANCE UNIQUE-ID 
          SX6    X2+2 
          SA6    A2 
          SA6    CSVRT       SET FOR RETURN 
          SB2    X6          SET AX1 = NEW-AUX1 = UNIQUE-ID 
 CSV22    SB7    -B1         NX = -1
  
          IFSAFE  1 
          NZ     B3,CSV120   IF AUX2 " 0
          EQ     CSV50
  
*         NEW-TYPE-CODE WAS NOT SPECIFIED.
  
 CSV30    BSS    0
  
 IS       IFSAFE
          MI     B7,CSV144
          UERR   CMETC,0     IMPROPERLY SPECIFIED TYPE-CODE 
  
 CSV144   BSS    0
 IS       ENDIF 
  
          MX3    2           (X3) = TC-1
          BX3    X3*X4
          LX3    2
          ZR     X3,CSV10    IF CURRENT TYPE-CODE = 1 
          SB6    X3-1        (B6) = TC-2
          ZR     B6,CSV15    IF CURRENT TYPE-CODE = 2 
          EQ     B6,B1,CSV17  IF CURRENT TYPE-CODE = 3
          EQ     CSV20       CURRENT TYPE-CODE = 4
  
*         INSERT NEW FIELDS IN BLOCK HEADER.
  
 CSV50    LX4    2
          MI     B7,CSV60    IF NOT TO CHANGE AUX2 IN TYPE 1 BLOCK
          SA2    B2          POINTER WORD OF TYPE 1 BLOCK 
          SA2    X2-3        HEADER WORD 1 OF TYPE 1 BLOCK
          SX7    B7          ADJUST AUX2
          LX7    18 
          IX7    X2+X7
          SA7    A2 
 CSV60    MX6    4
          BX6    X6*X4       NSC
          BX6    X6+X3       NSC......................NTC 
          SX2    B2          .......................NAUX1 
          SX3    B3          .......................NAUX2 
          LX3    18 
          BX3    X3+X2       ................NAUX2..NAUX1 
          LX6    -2          NTC..NSC 
          BX6    X6+X3       NTC..NSC........NAUX2..NAUX1 
          SA6    X1-3        STORE NEW HEADER WORD 1
          SX1    A6-B1        ? (X1) = CURRENT HEADER FWA 
          SX2    A6-B1        ? (X2) = NEW HEADER FWA (SAME)
                              ? (B1) = 1 - CALL P-M SUBR IF TC = 2
          RJ     =XCMM.PPM   -- PROCESS POINTER MAINTENANCE --
          SA1    CSVRT       (X1) = UNIQUE-ID IF NEEDED 
          SA2    CSVSV       RESTORE B2 
          SB2    X2-0                                                    CMM0015
          SA3    A2+B1       RESTORE B3 
          SB3    X3-0 
          SA4    A0-MNSAVEA0  RESTORE A0
          SA0    X4 
          EQ     CMM.CSV     RETURN 
  
 CSVSV    BSS    2           B2, B3 SAVE AREA 
 CSVRT    BSS    1           VALUE FOR RETURN 
  
