*DECK CMMGOA
          IDENT  CMM.GOA
  
          TITLE  COMMON MEMORY MANAGER, V1.0, CMM.GOA - GENERAL OVERFLOW
, ACTION
*CALL CMMCOM
          COMMENT  "SUBSYS"GENERAL OVERFLOW ACTION. 
          B1=1
 CMM.GOA  SPACE  4,10 
**        CMM.GOA - GENERAL OVERFLOW ACTION.
* 
* 
*              THIS ROUTINE IS THE MAIN INTERFACE TO OVERFLOW-ACTION
*         PROCESSING.  IT RETRIES THE #EASY# ATTEMPT AS LONG AS AT
*         LEAST ONE TRIGGER IS EXCEEDED, AND IF THAT FAILS TO FULFILL 
*         THE FUNCTION, IT RETRIES THE # HARD# ATTEMPT AS MANY TIMES AS 
*         NECESSARY UNTIL ALL CALL-NUMS REACH 6, AT WHICH TIME, THE 
*         JOB IS ABORTED.  IF THIS ROUTINE IS CALLED FROM A FUNCTION
*         CALLED IN OVERFLOW MODE, IT MAKES ONE #HARD# ATTEMPT, WHICH 
*         MUST SUCCEED, OR THE JOB IS ABORTED.
* 
*         ENTRY  (X1) = EASY SUBROUTINE ADDRESS.
*                (X2) = HARD SUBROUTINE ADDRESS.
*                (X3) = AMOUNT OF SPACE CALLER IS TRYING TO GET.
*                (B1) = 1.
*                (A0) = FL. 
* 
*         EXIT   FUNCTION HAS BEEN COMPLETED SUCCESSFULLY.
*                (X1) = RETURN (NZ) FROM EASY OR HARD PROCESSOR.
*                (X2) = (X2) RETURNED FROM HARD OR EASY ROUTINE 
*                (B1) = 1.
*                (A0) = FL. 
* 
*         USES   X - 1, 2, 3, 4, 6, 7.
*                B - 7. 
*                A - 1, 2, 3, 4, 6, 7.
  
  
          ENTRY  CMM.GOA
 CMM.GOA  EQ     *+400000B   ENTRY / EXIT 
          SX6    B1          PLUG RJ TO #HARD# FOR CASE WHERE ALREADY 
          LX6    54           IN OVERFLOW MODE
          LX2    30 
          BX7    X6+X2
          SA7    GOA1 
          SA4    A0-OVERFLOW
          ZR     X4,GOA3     IF NOT IN OVERFLOW MODE
          RJ     GOA1Z       CLEAR STACK
 GOA1Z    EQ     *+1S17 
  
 GOA1     RJ     0           ---- PLUGGED WITH RJ TO #HARD# ROUTINE ----
          NZ     X1,CMM.GOA  IF SUCCESS 
          MERR   ERRFAOV     CANNOT COMPLETE - IN OVERFLOW MODE 
  
 GOA3     SA7    GOA8        PLUG RJ TO #HARD#
          LX1    30          PLUG RJ TO #EASY#
          BX6    X6+X1
          SA6    GOA6 
          SA4    CMM.GOA     SAVE RETURN ADDRESS
          BX6    X3          SAVE SPACE NEEDED
          LX7    X4 
          SA6    GOASZ
          LX7    30 
          SA7    GOARET 
          MX1    0            ? (X1) = 0 - CALL AN O-A-S ONLY IF A
                                           TRIGGER IS EXCEEDED; ALSO
                                           RESET ALL CALL-NUMS
          BX2    X3           ? (X2) = SPACE NEEDED 
          RJ     =XCMM.POA   -- PROCESS OVERFLOW ACTION --
          ZR     X6,GOA8     IF NO O-A-S CALLED 
 GOA6     RJ     0           ---- PLUGGED WITH RJ TO #EASY# ROUTINE ----
          NZ     X1,GOA10    IF SUCCESS 
          SA2    GOASZ        ? (X2) = SPACE NEEDED 
          SX1    B1           ? (X1) = 1 - CALL AN O-A-S ONLY IF A
                                           TRIGGER IS EXCEEDED; DO NOT
                                           RESET CALL-NUMS
          RJ     =XCMM.POA   -- PROCESS OVERFLOW ACTION --
          NZ     X6,GOA6     IF AN O-A-S WAS CALLED 
 GOA8     RJ     0           ---- PLUGGED WITH RJ TO #HARD# ROUTINE ----
          NZ     X1,GOA10    IF SUCCESS 
          SA2    GOASZ        ? (X2) = SPACE NEEDED 
          SX1    2            ? (X1) = 2 - CALL AN O-A-S REGARDLESS OF
                                           TRIGGERING; ABORT IF ALL 
                                           CALL-NUMS = 6
          RJ     =XCMM.POA   -- PROCESS OVERFLOW ACTION --
          EQ     GOA8        LOOP, UNTIL EITHER SUCCESS OR CMM.POA ABORT
  
 GOA10    SA3    GOARET      RETURN THRU SAVED RETURN ADDRESS 
          SB7    X3 
          JP     B7 
  
 GOASZ    BSS    1           SPACE NEEDED TO PASS TO O-A-S SUBRS
 GOARET   BSS    1           RETURN ADDRESS 
  
          END 
