*DECK CMMPUA
          IDENT  CMM.PUA
  
          TITLE  COMMON MEMORY MANAGER, V1.0, CMM.PUA - PROCESS UNLOAD A
,CTION
*CALL CMMCOM
          COMMENT  "SUBSYS"PROCESS UNLOAD ACTION. 
          B1=1
 CMM.PUA  SPACE  4
**        CMM.PUA - PROCESS UNLOAD ACTION.
* 
* 
*              THIS ROUTINE CALLS ANY AND ALL OF THE UNLOAD-ACTION
*         SUBROUTINES WHICH ARE PENDING FOR THE AREA SPECIFIED BY 
*         THE CALL.  A FLAG BIT MUST BE USED TO KEEP TRACK OF WHICH 
*         ENTRIES HAVE BEEN PROCESSED, SINCE AN UNLOAD-ACTION 
*         SUBROUTINE MAY CAUSE ONE OR MORE NEW ENTRIES TO BE ADDED. 
*              WHEN THE ABOVE IS COMPLETED, ANY ENTRIES FOR UNLOAD- 
*         ACTION SUBROUTINES WITHIN THE SPECIFIED AREA ARE DELETED. 
* 
*         ENTRY  (X1) = FWA OF AREA TO BE UNLOADED. 
*                (X2) = LWA+1 OF AREA TO BE UNLOADED. 
*                (B1) = 1.
*                (A0) = FL. 
* 
*         EXIT   (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.PUA
 CMM.PUA  EQ     *+400000B   ENTRY / EXIT 
          SB1    1
  
*         SAVE REGISTERS.  ALL REGISTER CONTENTS ARE UNDEFINED AFTER
*         THE RETURN FROM AN UNLOAD-ACTION SUBROUTINE.
  
          SX6    B2-B0       SAVE B2
          SX7    B3-B0       SAVE B3
          SA6    PUASV
          SA7    A6+B1
          BX6    X0          SAVE X0
          LX7    X5          SAVE X5
          SA6    A7+B1
          SA7    A6+B1
          BX6    X1          SAVE ARGUMENTS 
          LX7    X2 
          SA6    PUAARGS
          SA7    A6+B1
  
*         FIND AN ENTRY IN THE LIST OF UNLOAD-ACTION SUBRS WHICH HAS
*         NOT YET BEEN PROCESSED AND CALL THAT ENTRY IF APPROPRIATE.
  
 PUA1     SB2    B1+B1       (B2) = 2 
          SA1    A0-P.UAS 
          SA5    X1+B2
          AX1    18 
          SB3    X1 
 PUA2     ZR     B3,PUA10    IF ALL ENTRIES PROCESSED 
          SA5    A5-B2       NEXT ENTRY 
          SB3    B3-B2
          MI     X5,PUA2     IF THIS ONE ALREADY PROCESSED
          MX6    1           SET ALREADY-PROCESSED FLAG 
          BX6    X6+X5
          SA6    A5 
          SA1    PUAARGS     (X1) = FWA OF UNLOADED AREA
          SA2    A1+B1       (X2) = LWA (+1) OF UNLOADED AREA 
          SX3    X5          (X3) = TRIGGER-FWA 
          AX5    18          (X4) = TRIGGER-LWA 
          SX4    X5 
          IX6    X1-X4       (UNLOAD-FWA) - (TRIGGER-LWA) 
          PL     X6,PUA2     IF TRIGGER AREA TOTALLY BELOW UNLOAD AREA
          IX7    X3-X2       (TRIGGER-FWA) - (UNLOAD-LWA) 
          PL     X7,PUA2     IF TRIGGER AREA TOTALLY ABOVE UNLOAD AREA
          SX6    X3          STORE ARGS FOR CALL TO U-A-S 
          SA6    PUAPASS     TRIGGER-FWA
          SX7    X4 
          SA7    A6+B1       TRIGGER-LWA
          IX0    X1-X3       AFWA = MAX[(TRIGGER-FWA),(UNLOAD-FWA)] 
          BX1    X1-X3
          AX0    59 
          BX1    -X0*X1 
          BX7    X1-X3
          SA7    A7+B1
          IX0    X2-X4       ALWA = MIN[(TRIGGER-LWA),(UNLOAD-LWA)] 
          BX4    X2-X4
          AX0    59 
          BX4    -X0*X4 
          BX7    X4-X2
          SA7    A7+B1
          AX5    18          FINAL ARG TO PASS = UNLOAD-ID
          SX7    X5 
          SA7    PUAPASU
          SA7    A0-IMAUA    SET UNLOAD-ACTION FLAG 
          SA1    A6          (A1) = FWA CALLING SEQUENCE
          SA2    A5-B1       2ND WORD OF U-A ENTRY
          SX6    B1          FORM RJ TO SUBR
          LX6    54 
          LX2    30 
          BX6    X6+X2
          SA6    PUA8 
          RJ     PUA7        CLEAR STACK
 PUA7     EQ     *+1S17 
  
 PUA8     RJ     0           ---- PLUGGED WITH CALL TO U-A-SUBR ----
          SB1    1           RESTORE B1 
          SA2    RA65        RESTORE FL IN A0 
          BX2    -X2
          SA1    X2 
          SA0    X1 
          MX6    0           CLEAR UNLOAD-ACTION FLAG 
          SA6    A0-IMAUA 
          EQ     PUA1        PROCESS ANOTHER ENTRY
  
*         REMOVE ALL ENTRIES FROM UNLOAD-ACTION LIST WHICH HAVE SUBR
*         ADDRESSES WITHIN THE UNLOAD AREA. 
  
 PUA10    MX2    0           (X2) = NO. OF WORDS TO FREE FROM P.UAS 
          SB7    B1+B1       (B7) = 2 
          SA1    A0-P.UAS 
          SB2    X1          (B2) = FETCH ADDRESS 
          SB3    X1          (B3) = STORE ADDRESS 
          AX1    18 
          SB4    X1          (B4) = P.UAS LENGTH
 PUA11    ZR     B4,PUA14    IF ALL ENTRIES EXAMINED
          SA1    B2 
          MX6    1           CLEAR ALREADY-PROCESSED FLAG 
          BX6    -X6*X1 
          SA6    A1 
          SB2    B2-B7       ADVANCE FETCH ADDRESS
          SB4    B4-B7
          SA5    A1-B1       (X5) = SUBR ADDRESS
          SA3    PUAARGS     (X3) = UNLOAD-FWA
          SA4    A3+B1       (X4) = UNLOAD-LWA
          IX0    X5-X3       SUBR - (UNLOAD-FWA)
          MI     X0,PUA12    IF SUBR BELOW UNLOAD AREA
          IX0    X5-X4       SUBR - (UNLOAD-LWA)
          PL     X0,PUA12    IF SUBR ABOVE UNLOAD AREA
          SX2    X2-2        IT IS WITHIN -- ADVANCE FREE COUNT 
          EQ     PUA11       LOOP 
  
 PUA12    SA6    B3          MOVE ENTRY DOWN
          BX7    X5 
          SA7    A6-B1
          SB3    B3-B7       ADVANCE STORE ADDRESS
          EQ     PUA11       LOOP 
  
 PUA14    SX1    P.UAS        ? (X1) = BLOCK NUMBER 
                              ? (X2) = COUNT
          RJ     =XCMM.CIA   -- CHANGE INTERNAL AREA -- 
          SA1    PUASV       RESTORE B2 
          SB2    X1-0 
          SA1    A1+B1       RESTORE B3 
          SB3    X1-0 
          SA2    A1+B1       RESTORE X0 
          BX0    X2 
          SA5    A2+B1       RESTORE X5 
          EQ     CMM.PUA     RETURN 
  
 PUAPASS  BSS    4           AREA TO PASS PARAMETERS TO U-A-SUBR
          VFD    42/0,18/PUAPASU
          DATA   0
 PUAPASU  BSS    1
 PUASV    BSS    4           SAVE AREA FOR B2, B3, X0, X5 
 PUAARGS  BSS    2           SAVE AREA FOR ARGUMENTS TO CMM.PUA 
  
          END 
