*DECK CMMPOA
          IDENT  CMM.POA
  
          TITLE  COMMON MEMORY MANAGER, V1.0, CMM.POA - PROCESS OVERFLOW
, ACTION
*CALL CMMCOM
          COMMENT  "SUBSYS"PROCESS OVERFLOW ACTION. 
          B1=1
 CMM.POA  SPACE  4,10 
**        CMM.POA - PROCESS OVERFLOW ACTION.
* 
* 
*              THIS ROUTINE IS CALLED AFTER THE FAILURE OF ANY OF THE 
*         CMM FUNCTIONS WHICH MAY TRIGGER OVERFLOW MODE.  IT DETERMINES 
*         WHICH, IF ANY, OF THE OVERFLOW-ACTION SUBROUTINES SHOULD
*         BE CALLED.  IT THEN SETS CMM IN OVERFLOW MODE, CALLS ONE
*         OF THE OVERFLOW-ACTION SUBROUTINES; UPON RETURN FROM SAME,
*         IT CLEARS OVERFLOW MODE, AND RETURNS. 
* 
*              THE SELECTION IS ACCOMPLISHED BY COMPUTING A PRIORITY
*         FOR EACH ENTRY, AS FOLLOWS: 
* 
*         ((( PUT THE FORMULA AND DEFINITIONS HERE )) 
* 
*         ENTRY  (X1) = 0 - CALL-NUM WILL BE RESET TO ONE (1) IN ALL
*                           OF THE ENTRIES.  AN O-A-S WILL BE CALLED
*                           ONLY IF A TRIGGER IS EXCEEDED (SEE ABOVE).
*                           X6 IS RETURNED AS DESCRIBED BELOW.
*                       1 - SAME AS ABOVE, EXCEPT CALL-NUMS ARE NOT 
*                           RESET.
*                       2 - CALL-NUMS ARE NOT RESET.  AN O-A-S IS CALLED
*                           REGARDLESS OF TRIGGERING, EXCEPT, IF ALL
*                           HAVE CALL-NUM = 6, THE JOB IS ABORTED.
*                (X2) = AMOUNT OF SPACE NEEDED TO SATISFY ORIGINAL
*                       REQUEST.
*                (B1) = 1.
*                (A0) = FL. 
* 
*         EXIT   (X6) = 0 IF AN O-A-S WAS NOT CALLED. 
*                       1 IF AN O-A-S WAS CALLED. 
*                       ABOVE APPLIES ONLY IF (X1) = 0 OR 1 ON ENTRY. 
*                (B1) = 1.
*                (A0) = FL. 
* 
*         USES   X - 1, 2, 3, 4, 6, 7.
*                B - 4, 5, 6, 7.
*                A - 1, 2, 3, 4, 5, 6, 7. 
  
  
          ENTRY  CMM.POA
 CMM.POA  EQ     *+400000B   ENTRY / EXIT 
          SA3    A0-P.OAS 
          AX3    18 
          SX3    X3 
          NZ     X3,POA4     IF O-A STACK NOT EMPTY 
  
*         OVERFLOW-ACTION STACK IS EMPTY. IT MAY HAVE BEEN MADE THAT
*         WAY SINCE OVERFLOW-ACTION PROCESSING BEGAN.  IN ANY CASE, 
*         IF A TYPE 2 CALL, ABORT.  OTHERWISE, INDICATE THAT NO 
*         OVERFLOW-ACTION SUBROUTINE WAS CALLED.
  
          SB7    X1 
          GT     B7,B1,POA13  IF TYPE 2 CALL, ERROR 
          SX1    B1           ? SO TO ABORT IF DEFAULT UL EXCEEDED
          RJ     =XCMM.CUL   -- COMPUTE UTILIZATION LEVEL --
          MX6    0           (X6) = 0 - NO O-A-S CALLED 
          EQ     CMM.POA     RETURN 
  
 POA4     SX6    B2-B0       SAVE B2
          SX7    B3-B0       SAVE B3
          SA6    POASV
          SA7    A6+B1
          BX6    X0          SAVE X0
          LX7    X5          SAVE X5
          SA6    A7+B1
          SA7    A6+B1
          SB2    X1          (B2) = TYPE OF CALL
          SX6    X2          SAVE SIZE PARAMETER
          SA6    POASZ
          SA6    OASIZE      SIZE PASSED TO O-A SUBROUTINE
          BX1    X2-X2        ? SO TO RETURN UL AND MC
          RJ     =XCMM.CUL   -- COMPUTE UTILIZATION LEVEL --
  
*         COMPUTE PRIORITY FOR EACH OVERFLOW-ACTION STACK ENTRY.  IF NOT
*         A TYPE 2 CALL, RETURN IF THE HIGHEST PRIORITY IS NOT GREATER
*         THAN 2. 
  
          SB3    B0          (B3) = ORD = 0 
          BX0    X0-X0       (X0) = MAXPRI = 0
          SB4    B0          (B4) = HIORD = 0 
 POA6     SA3    A0-P.OAS 
          SB7    X3 
          AX3    18 
          SB6    X3          O-A-S LENGTH 
          EQ     B3,B6,POA12  IF ALL O-A-S ENTRIES PROCESSED
          SB7    B7-B6       TOP+1 ENTRY
          SB3    B3+2        ADVANCE ORD
          SA4    B7+B3       NEXT O-A-S ENTRY 
          MX6    6
          NZ     B2,POA7     IF NOT TYPE 0 CALL 
          SX5    B1          RESET CALL-NUM = 1 
          BX4    -X6*X4 
          LX5    54 
          BX4    X4+X5
          BX7    X4 
          SA7    A4 
 POA7     BX6    X6*X4
          LX6    6           CALL-NUM 
          SB5    X6-6        (CALL-NUM) - 6 
          ZR     B5,POA6     IF CN=6, PRI=0 
          SB5    -B5         (B5) = T3 = 6-(CALL-NUM) 
          SA5    A4-B1       (X5) = TL
          SA3    =1.0 
          FX6    X1-X5       UL-TL
          FX3    X3+X6       (X3) = T1 = 1.0+UL-TL
          SX7    X4          (X7) = TC
          MX6    18 
          IX4    X7-X2       TC-MC
          LX6    18 
          IX4    X6+X4       777777B+TC-MC
          PX4                (X4) = T2 = (777777B+TC-MC)/777777B
          PX6 
          NX4 
          NX6 
          FX4    X4/X6
          FX3    X3+X4       (X3) = T6 = T1+T2
          BX4    X4-X4       (X4) = T4 = 0
          FX6    X5-X1       TL-UL
          PL     X6,POA8     IF PERCENT-TRIGGER NOT EXCEEDED
          SA5    =2.0        (X4) = T4 = 2.0+UL-TL
          FX4    X5-X6
 POA8     BX5    X0-X0       (X5) = T5 = 0
          PX7                TC 
          PX6    X2          MC 
          FX6    X6-X7       MC-TC
          PL     X6,POA9     IF CONTIG-TRIGGER NOT EXCEEDED 
          NX6                MC-TC
          NX7                TC 
          SA5    =2.0 
          BX6    -X6         TC-MC
          FX7    X6/X7       (TC-MC)/TC 
          FX5    X5+X7       (X5) = T5 = 2+[(TC-MC)/TC] 
 POA9     SX6    B5          T3 
          PX6 
          NX6 
          FX7    X4+X5       T4+T5
          FX4    X6*X7       (X4) = T7 = T3(T4+T5)
          FX3    X3+X4       (X3) = PRI = T6+T7 
          FX6    X0-X3       MAXPRI-PRI 
          PL     X6,POA6     IF THIS ENTRY NOT HIGHEST PRIORITY SO FAR
          SB4    B3          SET HIORD = CURRENT ORD
          BX0    X3          SET MAXPRI = CURRENT PRI 
          EQ     POA6        LOOP THRU O-A-S
  
 POA12    LE     B2,B1,POA14  IF NOT TYPE 2 CALL
          NZ     B4,POA16    IF AT LEAST ONE NZ PRIORITY FOUND
 POA13    MERR   ERRNOA      NO MORE OVERFLOW-ACTION CALLS POSSIBLE 
  
 POA14    SA2    =2.0        MAXPRI @ 2 IF NO TRIGGERS EXCEEDED 
          FX3    X2-X0       2.0-MAXPRI 
          MX6    0           SET FOR RETURN TO SHOW NO O-A-SUBR CALLED
          PL     X3,POA30    IF NO TRIGGERS EXCEEDED
  
*         DO THE FOLLOWING IN PREPARATION TO CALLING THE SELECTED 
*         OVERFLOW-ACTION SUBROUTINE: 
* 
*         1) FLAG OVERFLOW MODE.
*         2) SAVE INPUT PARAMETERS AND OTHER VALUES CURRENTLY IN THE
*            HIGH-CORE SAVE AREA. 
*         3) SAVE ENTRY-ID IN ORDER TO KNOW IN WHICH ENTRY TO UPDATE
*            CALL-NUM WHEN THE O-A SUBROUTINE RETURNS.
*         4) SET UP PARAMETER AREA PASSED TO THE O-A SUBROUTINE.
  
 POA16    SX6    B1          SET OVERFLOW MODE
          SA6    A0-OVERFLOW
          SX1    MNEND-MNARGS ? (X1) = NO. OF VALUES TO BE SAVED
          SX2    A0-MNEND+1   ? (X2) = SOURCE ADDRESS IN HIGH CORE
          SX3    SVARGS       ? (X3) = DESTINATION ADDRESS
          RJ     =XMVE=      -- MOVE DATA --
          SA1    A0-P.OAS    RE-FETCH O-A-S ENTRY SELECTED
          SB6    X1 
          AX1    18 
          SB7    X1 
          SB6    B6-B7
          SA2    B6+B4
          AX2    18          FORM RJ TO O-A SUBROUTINE
          SX3    X2 
          SX6    B1 
          LX6    54 
          LX3    30 
          BX6    X6+X3
          SA6    POA20
          AX2    18          SAVE ENTRY-ID
          SX7    X2 
          SA7    SVEID
          AX2    18          STORE CALL-NUM IN PARAMETER AREA 
          BX6    X2 
          SA6    OACN 
          SA1    OAPARAM     (A1) = FWA PARAMETER AREA
          RJ     POA19       CLEAR STACK
 POA19    EQ     *+1S17 
  
 POA20    RJ     0           ---- PLUGGED WITH RJ TO O-A SUBROUTINE ----
  
*         DO THE FOLLOWING AFTER RETURNING FROM THE OVERFLOW-ACTION 
*         SUBROUTINE: 
* 
*         1) RESTORE INPUT PARAMETERS.
*         2) ADVANCE CALL-NUM OF O-A STACK ENTRY CALLED IF IT IS
*            STILL IN THE O-A STACK.
*         3) ADVANCE COUNT OF OVERFLOW-ACTION CALLS.
*         4) CLEAR OVERFLOW MODE. 
  
          SA1    RA65        RESTORE FL IN A0 
          SB1    1           RESTORE B1 
          BX1    -X1
          SA5    X1 
          SA0    X5 
          SX1    MNEND-MNARGS ? (X1) = NO. OF ENTRIES 
          SX2    SVARGS       ? (X2) = SOURCE ADDRESS 
          SX3    A0-MNEND+1   ? (X3) = DESTINATION ADDRESS
          RJ     =XMVE=      -- MOVE DATA --
          SA1    A0-P.OAS    FIND SELECTED ENTRY IN THE OVERFLOW
          SB4    X1           ACTION STACK AS IT EXISTS NOW 
          AX1    18 
          SB5    X1 
          SB7    2
 POA22    ZR     B5,POA24    IF ENTRY NO LONGER PRESENT 
          SA2    B4          NEXT-LOWER ENTRY 
          SB5    B5-B7
          LX2    -36         COMPARE ENTRY-ID 
          SB4    B4-B7
          SA4    SVEID
          SX3    X2 
          IX4    X4-X3
          NZ     X4,POA22    IF NO MATCH
          SX6    B1          ADVANCE CALL-NUM BY 1
          LX6    18 
          IX6    X6+X2
          LX6    36 
          SA6    A2 
 POA24    SA4    A0-OACALLS  ADVANCE COUNT OF O-A CALLS 
          SX6    X4+B1
          BX7    X7-X7       CLEAR OVERFLOW MODE
          SA6    A4 
          SA7    A0-OVERFLOW
          SX6    B1          (X6) = 1 - O-A SUBROUTINE WAS CALLED 
  
*         RESTORE REGISTERS AND RETURN. 
  
 POA30    SA1    POASV       RESTORE B2 
          SA2    A1+B1       RESTORE B3 
          SA3    A2+B1       RESTORE X0 
          SB2    X1-0 
          SB3    X2-0 
          BX0    X3 
          SA5    A3+B1       RESTORE X5 
          EQ     CMM.POA     RETURN, (X6) = NZ IF AN O-A SUBR CALLED
  
 OAPARAM  VFD    42/0,18/OACN  PARAMETERS FOR O-A SUBROUTINES 
          VFD    42/0,18/OASIZE 
          DATA   0
 OACN     BSS    1           CALL-NUM 
 OASIZE   BSS    1           SIZE 
 POASV    BSS    4           B2, B3, X0, X5 SAVE AREA 
 POASZ    BSS    1           SIZE TO BE PASSED TO O-A SUBROUTINES 
 SVEID    BSS    1           ENTRY-ID 
          ENTRY  CMM.SV 
 CMM.SV   BSS    0
 SVARGS   BSS    MNEND-MNARGS  SAVE AREA FOR PARAMS 
  
          END 
