*DECK DB$FLOP 
          IDENT  DB$FLOP
          COMMENT   FLOW POINT PROCESSOR
          DATA   10L  DB$FLOP 
          TITLE  DB$FLOP  -- PROCESS FLOW POINT REQUESTS -- 
*#
* *   DB$FLOP - FLOW POINT PROCESSOR             PAGE  1
* *   R L MCALLESTER                             DATE  05/21/80 
* 
* DC  PURPOSE 
* 
*     RECORD EACH OCCURENCE OF THE FLOW POINT BY FLOW POINT NAME. 
*     THE RECORD INCLUDES A COUNT AND A SEQUENCE NUMBER OF THE LAST 
*     FOUR OCCURENCES.
* 
* DC  ENTRY CONDITIONS
* 
*     PARAMETER = FLOW POINT NAME 
* 
* DC  EXIT CONDITIONS 
* 
*     THE FLOW POINT OCCURENCE IS RECORDED IN THE FLOW POINT TABLE. 
* 
* DC  CALLING ROUTINES
* 
*     MOST CDCS SYMPL PROCEDURES (CONDITIONAL)
* 
* DC  CALLED ROUTINES 
* 
*     NONE
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     NONE
* 
* DC  DESCRIPTION 
* 
*     A BINARY SEARCH LOCATES THE FLOW POINT NAME IN THE TABLE. 
*     IF IT IS NOT THERE, AN ENTRY IS CREATED FOR IT. 
*     THE NUMBER OF OCCURENCES OF EACH FLOW POINT NAME IS COUNTED.
*     A STACK OF OCCURENCE SEQUENCE NUMBERS IS RECORDED FOR EACH NAME.
*     THESE ARE RECORDED FOUR DEEP.  OLDER ONES ARE DISCARDED.
*#
 DB$FLOP  SPACE  3,8
* 
*     LOCAL VARIABLES 
* 
*         FLOW POINT TABLE -- 
*                            THE ENTRIES MUST BE IN THE PRESCRIBED ORDER
  
ENTRIES   EQU    300
  
          ENTRY  DB$FLPT
DB$FLPT   BSS    0
BASE      CON    2           TABLE HEADER - NUMBER +1 OF NAMES IN TABLE 
          CON    0           FILLER WORD
          VFD    42/7L...0000,18/0  DUMMY FLOW POINT NAME (OVERFLOW)
          CON    0           STACK OF TABLE OVERFLOW SEQUENCES
  
          BSSZ   ENTRIES*2   MAXIMUM NUMBER OF NAMES TIMES TWO
ENDTABLE  BSS    0
  
SEQUENCE  CON    0           CURRENT FLOW POINT SEQUENCE NUMBER 
          SPACE  5,10 
*         FLOW POINT USER ID TABLE
* 
*         CONTAINS THE RUN-UNIT ID OF THE LAST -FLUTL- JOBS SCHEDULED 
*         BY DB$SCHD.  MAY BE USED FOR OTHER FLOW POINTS WHERE A DEPTH
*         IS REQUIRED THAT IS GREATER THAN FOUR.
* 
*           (RUID/42,3/0,15/SEQ)
* 
*         THE 15 BIT SEQ FIELD IS INITIALLY SET = -37777B (40000B). 
*         DB$FLRP BYPASSES THIS LOW VALUE IF ANY ARE LEFT IN THE TABLE. 
  
FLUTL     EQU    700
          ENTRY  DB$FLUT
DB$FLUT   CON    *+2         IN POINTER 
          CON    *+FLUTL+1   LIMIT
          DUP    FLUTL,1
          CON    40000B 
  
  
PUNTNAME  DATA   10L LOOPING   PARAMETER FOR DB$PUNT CALL ON CDCS LOOP
PUNTP     CON    PUNTNAME 
 DB$FLOP  SPACE  4,8
*     B E G I N   D B $ F L O P   E X E C U T A B L E   C O D E . 
  
  
          ENTRY  DB$FLOP
DB$FLOP   EQ   *+1S17 
  
*                PROCEDURE INITIALIZATION 
  
          SA1    X1          GET THE FLOW POINT NAME, IT IS A PARAMETER 
          MX0    -18
          SB4    BASE        HEADER WORD OF THE FLOW POINT TABLE
          SA2    B4 
          BX1    X0*X1       EXTRACT SEVEN CHARACTER FLOW POINT NAME
          SB1    1
          LX1    -18         RIGHT JUSTIFY ARGUMENT FOR COMPARISON
          SB2    B1          INITIALIZE ORDINAL OF LOWEST NAME IN TABLE 
          SA3    SEQUENCE 
          SX6    X3+B1       ADD ONE TO THE SEQUENCE COUNTER
          SA6    SEQUENCE 
  
*                TEST FOR OVERFLOW OF THE SEQUENCE COUNTER
  
          MX3    46 
          BX6    -X3-X6 
          NZ   X6,LOW        NO OVERFLOW, PROCEED TO THE BINARY SEARCH
  
          RJ     OVFLO       SEQUENCE NUMBER OVERFLOW 
 DB$FLOP  SPACE  4,8
*         BINARY SEARCH ROUTINE 
* 
*         INITIAL ENTRY IS AT LABEL -LOW-.
* 
*         REGISTERS ON ENTRY
*                B1 = 1 
*                B2 = ORDINAL OF LOWEST FLOW POINT NAME IN THE TABLE
*                B4 = BASE ADDRESS OF FLOW POINT TABLE
* 
*                X0 = 42 BIT MASK 
*                X1 = ARGUMENT,  THE FLOW POINT NAME TO BE FOUND
*                X2 = ORDINAL OF HIGHEST FLOW PT NAME IN THE TABLE +1 
  
  
LOW       BSS    0           ARGUMENT IS LOWER THAN LAST COMPARED NAME
          SB3    X2-1        ADJUST HIGH END ORDINAL
          LT   B3,B2,NOFIND  THE ARGUMENT IS NOT IN THE TABLE 
  
SEARCH    BSS    0
          SX2    B2+B3       LOW ORDINAL PLUS HIGH ORDINAL
          AX2    1           MEDIAN ORDINAL IN CURRENT SEARCH RANGE 
          LX3    B1,X2       TWO TIMES MEDIAN ORDINAL 
          SA4    X3+B4       READ MEDIAN NAME 
          BX5    X0*X4       MASK OFF THE COUNT FIELD 
          LX5    -18         RIGHT JUSTIFY MEDIAN NAME FOR COMPARISON 
          IX5    X1-X5       COMPARE ARGUMENT AND MEDIAN
          MI   X5,LOW        THE ARGUMENT IS LOWER THAN THE MEDIAN
          ZR   X5,FOUND      EQUAL COMPARE, THE ENTRY HAS BEEN FOUND
  
*                            THE ARGUMENT IS HIGH 
          SB2    X2+1        ADJUST THE LOW END ORDINAL 
          GE   B3,B2,SEARCH 
 DB$FLOP  SPACE  4,8
*         NOT FOUND          THE ARGUMENT IS NOT IN THE TABLE.
*                            CREATE AN ENTRY. 
* 
*         MOVE EXISTING ENTRIES TO MAKE SPACE FOR THE NEW ONE.
*                B2 = ORDINAL AT WHICH THE ARGUMENT IS TO BE INSERTED.
*                B3 = B2 - 1
  
  
NOFIND    BSS    0
          SA2    BASE        GET CURRENT TABLE SIZE 
          SB7    X2 
          SB7    B7-B2       SET NUMBER OF ENTRIES TO BE MOVED
          SX3    X2-ENTRIES-2  TEST IF TABLE IS FULL
          NZ   X3,STILLOK 
  
*         THE TABLE IS FULL.  PROCESS THIS NAME AS IF IT WERE (...NNNN).
  
          SA4    ENDTABLE-2 
          EQ   FOUND
  
STILLOK   BSS    0
          SX6    X2+B1       INCREASE HIGH ORDINAL BY ONE 
          SA6    A2 
          LX2    1           OFFSET FROM BASE TO TOP OF USED TABLE
          SB6    B1+B1       B6 = 2  (SLOT SIZE)
          SA3    X2+BASE-1   LAST STACK OF SEQUENCES
          SA2    X2+BASE-2   NAME OF LAST ENTRY 
  
MOVELOOP  BSS    0
          BX6    X2 
          BX7    X3 
          SA6    A2+B6       MOVE UP ONE SLOT 
          SA7    A3+B6
          SB7    B7-B1       ADJUST NUMBER OF ENTRIES REMAINING 
          ZR   B7,SETNEW
          SA2    A2-B6
          SA3    A3-B6
          EQ   MOVELOOP 
  
SETNEW    BSS    0           SET UP THE NEW ENTRY 
          LX1    18          LEFT JUSTIFY NAME
          BX6    X1 
          SX7    B0 
          SA6    A2          WRITE THE FLOW POINT NAME INTO THE TABLE 
          SA7    A3 
          SA4    A2          ESTABLISH A4/X4 FOR ROUTINE (FOUND)
 DB$FLOP  SPACE  4,8
*                            FOUND -- UPDATE THE FLOW POINT ENTRY 
* 
*         THE FLOW POINT NAME ENTRY HAS BEEN FOUND OR CREATED.
*         ADD ONE TO THE COUNT OF OCCURENCES. 
*         INSERT A FLOW SEQUENCE NUMBER IN THE SEQUENCE STACK.
* 
*                A4 CONTAINS THE ADDRESS OF THE NAME ENTRY. 
*                X4 CONTAINS THE FLOW POINT NAME AND OCCURENCE COUNT. 
  
FOUND     BSS    0
          SX6    X4+B1       ADD ONE TO THE OCCURENCE COUNT 
          BX6    -X0*X6      RESTRICT IT TO 18 BITS 
          BX4    X0*X4
          BX6    X4+X6
          MX1    -15
          SA6    A4 
          SA2    SEQUENCE 
          SA3    A4+B1       GET THE SEQUENCE STACK 
          LX3    15          SHIFT THE STACK
          BX3    X1*X3       MASK OUT THE OLDEST SEQUENCE 
          BX7    X3+X2       INSERT THE CURRENT SEQUENCE
          SA7    A3 
          EQ   DB$FLOP       RETURN 
DB$FLUI   SPACE  4,8
*                DB$FLUI -- FLOW POINT USER IDENTIFICATION
  
*#
* *   DB$FLOP                                    PAGE  1
* *   DB$FLUI -- FLOW POINT RUN-UNIT IDENTIFICATION 
* *   BOB MCALLESTER                             DATE  12/01/80 
* 
* DC  PURPOSE 
* 
*     RECORD A SEVEN CHARACTER NAME FOR IDENTIFICATION OF THE RUN-UNIT
*     IN THE FLOW POINT REPORT. 
* 
* DC  ENTRY CONDITIONS
* 
*     PARAMETER = FLOW POINT USER ID
* 
* DC  EXIT CONDITIONS 
* 
*     THE USER ID IS RECORDED IN THE FLOW POINT USER TABLE (DB$FLUT). 
* 
* DC  CALLING ROUTINES
* 
*     DB$SCHD                CDCS TASK SCHEDULER
* 
* DC  CALLED ROUTINES 
* 
*     NONE
* 
* DC  NON-LOCAL VARIABLES MODIFIED
* 
*     NONE
* 
* DC  DESCRIPTION 
* 
*     THE SEVEN CHARACTER USER ID IS STORED IN THE USER ID TABLE. 
*     A SEQUENCE NUMBER IS ASSIGNED TO THE ENTRY AND STORED WITH IT.
*     THE SEQUENCE NUMBER IS TAKEN FROM THE SAME SERIES THAT IS USED
*     FOR THE FLOW POINT REPORT TABLE.  THIS PERMITS THE ENTRIES FROM 
*     THE TWO TABLES TO BE MERGED IN A SINGLE REPORT GIVING THE ORDER 
*     OF EXECUTION. 
*     THE ENTRIES ARE RECORDED IN A CIRCULAL ORDER IN THE USER ID TABLE.
*     THE TABLE CONTAINS THE LAST "FLUTL" ENTRIES.
* 
*     DB$FLUI IS INTENDED FOR RECORDING THE USER ID OF THE SCHEDULED
*     TASKS.  IT CAN BE USED TO RECORD ANY SEVEN CHARACTER STRING.
*     THE NUMBER SAVED CAN BE ADJUSTED BY CHANGING "FLUTL". 
*#
DB$FLUI   SPACE  5,10 
          ENTRY  DB$FLUI
DB$FLUI   EQ   *+1S17 
          SA3    SEQUENCE 
          SB1    1
          SX6    X3+B1
          SA6    SEQUENCE 
  
*                TEST FOR OVERFLOW OF THE SEQUENCE COUNTER
  
          MX3    46 
          BX6    -X3-X6 
          NZ   X6,FLU04 
  
          RJ     OVFLO       SEQUENCE NUMBER OVERFLOW 
  
FLU04     BSS    0
          SA1    X1          (X1) = RUN-UNIT ID 
          SA3    SEQUENCE    (X3) = SEQUENCE NUMBER 
          MX0    -18
          SA2    DB$FLUT     (X2) = IN POINTER TO DB$FLUT 
          BX6    X0*X1
          BX6    X6+X3       (X6) = 42/RUID,3/0,15/SEQ
          SX7    X2+B1       (X7) = IN POINTER FOR NEXT ENTRY 
          SA4    A2+B1       (X4) = LIMIT OF DB$FLUT
          SA6    X2          PLACE THE NEW ENTRY IN THE TABLE 
          IX4    X4-X7
          NZ   X4,FLU08 
  
          SX7    DB$FLUT+2   RESET THE IN POINTER TO THE START OF TABLE 
  
FLU08     BSS    0
          SA7    A2          WRITE THE NEW IN POINTER 
          EQ   DB$FLUI
OVFLO     SPACE  4,8
*         SEQUENCE NUMBER OVERFLOW
* 
*         ADJUST THE SEQUENCE NUMBERS CONTAINED IN THE FLOW POINT TABLE.
  
OVFLO     EQ   *+1S17 
          MX7    15 
          SX6    B1 
          MX4    1
          SA6    A3          RESET SEQUENCE COUNTER TO ONE
  
*                            CHECK FOR A CDCS LOOP
  
*         SCAN THROUGH THE FLOW POINT TABLE.
*         PROCESS THE FOUR ENTRY SEQUENCE STACK OF EACH FLOW POINT NAME 
*         LOOKING FOR AN ENTRY IN THE RANGE OF 17400 TO 37400 (OCTAL).
*         IF THERE ARE NONE, THIS INDICATES THAT CDCS IS IN A LOOP. 
  
          SA5    BASE+3      INITIATE LOOP SCAN AT FIRST SEQUENCE STACK.
          SB7    4           FOUR PARCELS IN EACH STACK.
  
LCLOOP    BSS    0           OVERFLOW ADJUSTMENT LOOP 
          BX6    X7*X5       EXTRACT ONE PARCEL 
          ZR   X6,LCSHIFT    IF PARCEL IS EMPTY, SHIFT TO THE NEXT
          LX6    15 
          SX6    X6-17400B
          MI   X6,LCSHIFT 
          SX6    X6-20000B
          MI   X6,LCEXIT     FOUND ONE IN THE RANGE, EXIT 
  
LCSHIFT   BSS    0
          LX5    15          SHIFT TO THE NEXT PARCEL 
          SB7    B7-B1       DECREMENT PARCEL COUNT 
          NZ   B7,LCLOOP     LOOP UNTIL FOUR PARCELS ARE DONE 
  
          SA5    A5+2        READ SEQUENCE STACK OF NEXT FLOW PT NAME 
          SB6    A5-ENDTABLE
          SB7    4           RESET PARCEL COUNT 
          NG   B6,LCLOOP     LOOP UNTIL THE END OF THE TABLE
          SA1    PUNTP
          RJ   =XDB$PUNT     CDCS IS IN A LOOP
  
LCEXIT    BSS    0
          SPACE  4,8
*         SCAN THROUGH THE FLOW POINT TABLE.
*         PROCESS THE FOUR ENTRY SEQUENCE STACK OF EACH FLOW POINT NAME.
* 
*         REMOVE THE EXPIRED SEQUENCE ENTRIES.
*           (IF BIT 14 IS SET, CLEAR THE 15 BIT PARCEL) 
* 
*         AGE THOSE CREATED DURING THE MOST RECENT SEQUENCE PERIOD. 
*           (IF BIT 14 IS NOT SET, SET IT)
  
          SA5    BASE+3      INITIATE SCAN AT FIRST SEQUENCE STACK. 
          SB7    4           COUNT FOUR PARCELS IN EACH STACK.
  
OFLOOP    BSS    0           OVERFLOW ADJUSTMENT LOOP 
          BX6    X7*X5       EXTRACT ONE PARCEL 
          ZR   X6,SHIFT      IF PARCEL IS EMPTY, SHIFT TO THE NEXT
          BX5    X4+X5       SET BIT 14 IN THE SEQUENCE PARCEL
          PL   X6,SHIFT 
  
          BX5    -X7*X5      IF BIT 14 WAS ALREADY SET, CLEAR THE PARCEL
  
SHIFT     BSS    0
          LX5    15          SHIFT TO THE NEXT PARCEL 
          SB7    B7-B1       DECREMENT PARCEL COUNT 
          NZ   B7,OFLOOP     LOOP UNTIL FOUR PARCELS ARE DONE 
  
          BX6    X5 
          SA6    A5 
          SA5    A5+2        READ SEQUENCE STACK OF NEXT FLOW PT NAME 
          SB6    A5-ENDTABLE
          SB7    4           RESET PARCEL COUNT 
          NG   B6,OFLOOP     LOOP UNTIL THE END OF THE TABLE
OVFLO     SPACE  5,10 
*         ADJUST SEQUENCE NUMBERS CONTAINED IN THE USER ID TABLE
  
          SA5    DB$FLUT+1
          SB6    A5+B1       (B6) = LOCATION OF THE FIRST DB$FLUT ENTRY 
          SB7    X5          (B7) = LIMIT OF DB$FLUT
          SX7    40000B 
          EQ   OVF40
  
OVF30     BSS    0
          SA6    A5          WRITE THE ADJUSTED ENTRY 
          SB6    B6+B1
          EQ   B6,B7,OVFLO   EXIT WHEN DONE 
  
OVF40     BSS    0
          SA5    B6+0        (X5) = ENTRY TO BE ADJUSTED
          BX6    X7+X5       (X6) = ENTRY WITH BIT 14 SET 
          BX5    X7*X5       (X5) = PRIOR BIT 14 VALUE
          ZR   X5,OVF30 
          BX6    X5          IF BIT 14 PREVIOUSLY SET, SET TO LOW VALUE 
          EQ     OVF30
  
          END 
