COMCSRI 
COMMON
          CTEXT  COMCSRI - STAGE REQUEST INTERFACE. 
 SRI      SPACE  4,10 
          IF     -DEF,QUAL$,1 
          QUAL   COMCSRI
          BASE   D
*         COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
 SRI      SPACE  4,10 
***       SRI - STAGE REQUEST INTERFACE.
*         W. C. WELLS.       86/01/27.
*         P. C. SMITH.       87/04/07.
 SRI      SPACE  4,10 
***       *COMCSRI* HANDLES THE INTERFACE BETWEEN *MAGNET* AND THE
*         VARIOUS TAPE ALTERNATE STORAGE ROUTINES WHICH NEED TO 
*         RETRIEVE STAGE REQUESTS.  *COMCSRI* HAS THE FOLLOWING 
*         ENTRY POINTS -
* 
*         GSR - GET STAGE REQUEST.
*         RSR - REQUEUE STAGE REQUEST.
*         SRM - SEND REQUEST TO *MAGNET*. 
*         TCM - TERMINATE CONNECTION WITH *MAGNET*. 
 GSR      SPACE  4,40 
**        GSR - GET STAGE REQUEST.
* 
*         DEPENDING ON THE STATE OF THE CALLING JOB (IN *MAGNET*-S
*         ACTIVE STAGE JOB TABLE), *GSR* DOES ONE OF THREE THINGS.
* 
*         1. IF THE CALLING JOB IS A NORMAL STAGE JOB AND HAS A VSN 
*         ASSIGNED, RETURN ANY STAGE REQUEST WHICH HAS A MATCHING VSN.
*         IF THE *INITIALIZE* BIT IS STILL SET FOR THIS JOB, TELL 
*         *MAGNET* TO CLEAR IT. 
* 
*         2. IF THE CALLING JOB DOES NOT HAVE A VSN ASSIGNED (OR, FOR 
*         *PFHELPR*, IF IT HAS THE *INITIALIZE* BIT SET), RETURN ANY
*         STAGE REQUEST WHOSE VSN DOES NOT MATCH A VSN ASSIGNED TO
*         ANY OTHER ACTIVE STAGE JOB. 
* 
*         3. IF THE CALLING JOB IS *PFHELPR* AND DOES NOT HAVE THE
*         *INITIALIZE* BIT SET, COUNT ALL REQUESTS WHOSE VSN DOES NOT 
*         MATCH A VSN ASSIGNED TO ANY ACTIVE STAGE JOB.  IF THE COUNT 
*         EXCEEDS 100D, RETURN A STATUS TO *PFHELPR*.  NOTE - THIS
*         STATUS WILL ONLY BE RETURNED IF ALL NORMAL STAGE JOBS ARE 
*         ACTIVE. 
* 
*         EXIT   (B6) = FWA OF REQUEST BLOCK, IF REQUEST FOUND. 
*                (B6) = 0, IF NO REQUEST FOUND. 
*                (B6) = -1, IF UNABLE TO COMMUNICATE WITH *MAGNET*. 
*                (B6) = 1, IF HELPER SHOULD CLEAN *MAGNET*-S REQUESTS.
*                       (THIS MODE IS SET *ONLY* FOR *PFHELPR*).
* 
*         USES   X - 1, 2, 3, 4, 6, 7.
*                A - 1, 2, 3, 4, 6, 7.
*                B - 2, 6.
* 
*         CALLS  RTP, SRM.
* 
*         MACROS SYSTEM.
  
  
 GSR14    SB6    -1          INDICATE ERROR 
  
  
 GSR      SUBR               ENTRY/EXIT 
          SB6    B0+         SET *NO ENTRY FOUND* EXIT CONDITION
          SA4    JTSI        GET CURRENT OFFSET 
          NZ     X4,GSR5     IF NOT NEW SCAN
  
*         START OF NEW SCAN OF REQUEST TABLE. 
  
 GSR1     RJ     RTP         READ TABLE POINTERS
          ZR     X6,GSR14    IF UNABLE TO READ POINTERS 
          SA1    RQJT        READ JOB TABLE 
          MX6    -48
          BX6    -X6*X1      CLEAR PREVIOUS STATUS
          SA6    A1 
          SYSTEM RSB,R,A6,MTSI  READ JOB TABLE
          SA1    RQJT 
          PL     X1,GSR14    IF NOT PROCESSED 
          SA1    JTIN        GET POINTER INTO TABLE 
          SA3    JTEC        GET OUR VERSION OF JOB TABLE ENTRY 
          NG     X1,GSR2     IF NO POINTER
          SA2    X1+ASJT     READ *MAGNET*-S VERSION
          MX6    24 
          BX7    X2-X3       COMPARE
          BX6    X6*X7
          SA1    MODC        GET OUR MODIFICATION COUNT 
          NZ     X6,GSR14    IF NO LONGER OUR ENTRY 
          SX6    B0+         CLEAR COUNTER FOR HELPER 
          SA6    SRCH 
          SA4    PFTM 
          BX1    X1-X4
          BX1    X1+X7       ADD IN COMPARISON CHANGES (FOR HELPER) 
          ZR     X1,GSRX     IF STILL NO CHANGE IN MODIFICATION COUNT 
          BX6    X2 
          SA6    A3          UPDATE OUR VERSION (NEEDED FOR HELPER) 
          EQ     GSR5        SCAN TABLE 
  
*         SEARCH FOR JOB ENTRY OF CALLING JOB.
  
 GSR2     GETJN  JTEC        GET JSN OF CALLING JOB 
          SA1    JTEC 
          SA2    AJTP        GET LENGTH OF ACTIVE JOB TABLE 
          AX2    48 
          SB2    X2-1 
          MX7    24 
 GSR3     SA2    ASJT+B2     CHECK NEXT JOB TABLE ENTRY 
          BX3    X2-X1
          BX4    X7*X3
          ZR     X4,GSR4     IF JSN-S MATCH 
          SB2    B2-B1
          PL     B2,GSR3     IF MORE ENTRIES TO CHECK 
          EQ     GSR14       CALLING JOB NOT IN ACTIVE JOB TABLE
  
*         JOB FOUND IN JOB TABLE.  IF THIS JOB HAS VSN ASSIGNED AND 
*         HAS INITIALIZATION BIT SET, TELL *MAGNET* TO CLEAR BIT. 
  
 GSR4     BX6    X2          JOB TABLE ENTRY FOR THIS JOB 
          SX7    B2          INDEX INTO JOB TABLE FOR THIS JOB
          SA7    JTIN 
          SA6    JTEC 
          SX2    X6          EXTRACT LOWER 18 BITS OF VSN 
          ZR     X7,GSR1     IF SPECIAL HELPER JOB (ORDINAL 0)
          ZR     X2,GSR1     IF NO VSN ASSIGNED (IF *RESEX*)
          LX6    59-24
          PL     X6,GSR1     IF INITIALIZATION BIT NOT SET
          SA1    RQAI        SET *ALTER INITIALIZATION BIT* REQUEST 
          SA2    JTEC        GET JSN
          LX2    -12
          MX6    24 
          LX6    -12
          BX2    X6*X2       EXTRACT JSN
          BX1    -X6*X1      MERGE JSN WITH REQUEST 
          BX7    X2+X1
          SA7    A1 
          SB2    A7          INFORM *MAGNET* THAT FILE IS RELEASED
          RJ     SRM
          EQ     GSR1        RE-READ TABLES 
  
*         THERE COULD BE A REQUEST - SCAN STAGE REQUEST TABLE.
  
 GSR5     SA3    PFTL        GET LENGTH OF TABLE
          SA4    JTSI        GET NEXT TABLE OFFSET
          IX6    X4-X3       VERIFY WITHIN TABLE
          NG     X6,GSR7     IF NOT OUTSIDE OF TABLE
  
*         PROCESS END OF STAGE REQUEST TABLE. 
  
          BX6    X6-X6
          SA1    PFTM        GET CURRENT MODIFICATION COUNTER 
          SA6    A4+         RESET OFFSET TO START
          SA2    MODC        GET PREVIOUS MODIFICATION COUNTER
          BX6    X1 
          IX2    X1-X2       COMPARE ENTRIES
          SA1    JTIN        CHECK FOR SPECIAL HELPER PASS
          NZ     X1,GSR6     IF NOT HELPER
          SA1    JTEC 
          LX1    59-24
          NG     X1,GSR6     IF INITIALIZE SET (NOT SPECIAL HELPER PASS)
          SA1    SRCH        GET COUNT OF UNASSIGNED ENTRIES
          SX1    X1-100D
          NG     X1,GSRX     IF NOT ENOUGH REQUESTS 
          SB6    B1          FLAG SPECIAL 
          EQ     GSRX        RETURN 
  
*         RESTART SCAN AT START OF TABLE. 
  
 GSR6     SA6    A2          SET COUNTER AT START OF PASS 
          BX4    X4-X4       SET STARTING AT FRONT
          ZR     X3,GSRX     IF NO LENGTH 
          ZR     X2,GSRX     IF NO CHANGE SINCE START OF LAST PASS
 GSR7     MX7    -6          SEE IF NEXT BUFFER NEEDED
          BX6    -X7*X4 
          NZ     X6,GSR9     IF STILL IN PREVIOUS BUFFER
          SA2    PFTF        GET FWA OF TABLE 
  
*         READ NEXT BUFFER FROM STAGE REQUEST TABLE.
  
          SX6    SRQBL       WORDS TO READ
          BX1    X3-X4
          IX2    X2+X4       READ OFFSET IN TABLE 
          AX1    6
          NZ     X1,GSR8     IF NOT LAST BLOCK
          BX6    -X7*X3      GET PARTIAL LENGTH 
 GSR8     LX6    36          READ NEXT BLOCK OF STAGE REQUEST TABLE 
          SX7    SRQB 
          LX2    18 
          BX7    X7+X6
          IX6    X7+X2
          SA6    RQSR 
          SYSTEM RSB,R,A6,MTSI  READ NEXT BLOCK 
          SA1    RQSR 
          PL     X1,GSR14    IF NOT SUCCESSFUL
  
*         CHECK NEXT STAGE REQUEST ENTRY IN BUFFER. 
  
 GSR9     SX6    X4+PFTBL    ADVANCE OFFSET 
          MX7    -6 
          BX3    -X7*X4      EXTRACT OFFSET WITHIN BUFFER 
          SA1    SRQB+X3     READ ENTRY 
          SA6    JTSI 
          ZR     X1,GSR5     IF NOTHING THERE 
          SA2    A1+B1       LOAD ASA (VSN) WORD
          SA3    JTEC        LOAD OUR JOB TABLE ENTRY 
          MX6    -24         MASK OF VSN ENTRY
          BX7    X2-X3
          BX7    -X6*X7 
          ZR     X7,GSR13    IF VSN MATCHES VSN ASSIGNED TO THIS JOB
          BX7    X6+X3       (X7) = -0, IF CALLER IS *PFHELPR*
          MX4    1
          LX3    59-24
          BX3    X4*X3       EXTRACT INITIALIZATION BIT 
          BX7    -X3*X7 
          ZR     X7,GSR10    IF HELPER SCANNING FOR POTENTIALS
          PL     X3,GSR5     IF NOT INITIALIZE (NOT ACCEPTING ALL)
  
*         SCAN JOB TABLE TO SEE IF VSN IS ACTIVE UNDER ANOTHER JOB. 
  
 GSR10    SA3    AJTP 
          AX3    48          GET LENGTH OF TABLE
          BX1    -X6*X2      ISOLATE VSN
 GSR11    SA2    ASJT+X3-1   LOAD JOB ENTRY 
          SX3    X3-1 
          NZ     X2,GSR12    IF STAGE ENTRY IN USE
          SX4    B0+         FLAG EMPTY STAGE JOB TABLE SLOT FOUND
 GSR12    BX2    -X6*X2      EXTRACT PACKED VSN FROM JOB TABLE ENTRY
          BX2    X1-X2
          ZR     X2,GSR5     IF STAGE REQUEST MATCHES VSN FOR OTHER JOB 
          NZ     X3,GSR11    IF MORE ENTRIES TO SCAN (0 IS SPECIAL) 
          NZ     X7,GSR13    IF JOB IS GETTING UNASSIGNED REQUESTS
  
*         TO GET HERE, THE CALLING JOB MUST BE *PFHELPR* AND THE
*         INITIALIZATION BIT MUST BE CLEAR.  THIS COMBINATION MEANS 
*         THAT *PFHELPR* IS LOOKING FOR UNASSIGNED REQUESTS TO
*         DETERMINE IF IT SHOULD ATTACH THE INTERLOCK/REQUEST FILE
*         AND CLEAR OUT *MAGNET*-S REQUEST TABLE.  AT THIS TIME, WE 
*         SIMPLY COUNT THE REQUESTS.  IF ALL NORMAL STAGE JOBS ARE
*         ACTIVE AND THERE ARE AT LEAST 100 REQUESTS, WE WILL INFORM
*         THE HELPER TO ATTACH THE FILE.
  
          ZR     X4,GSR5     IF NOT ALL NORMAL STAGE JOBS ARE ACTIVE
          SA1    SRCH        INCREMENT COUNT
          SX6    X1+B1
          SA6    A1 
          EQ     GSR5        CHECK NEXT REQUEST 
  
*         SET ADDRESS OF REQUEST AND TELL *MAGNET* TO REMOVE ENTRY. 
  
 GSR13    SB6    A1          ADDRESS OF STAGE REQUEST 
          MX6    -30
          SX2    RER         *REMOVE EXISTING REQUEST* FUNCTION 
          SA3    B6+6        GET UNIQUE ID VALUE
          SX7    B1 
          LX2    48-0 
          BX3    -X6*X3      EXTRACT UNIQUE ID VALUE
          BX6    X2+X7       SET LENGTH OF 1
          LX3    18 
          BX7    X3+X6
          SA7    RQRE        SET REQUEST INTO BUFFER
          SB2    A7          ASK *MAGNET* TO REMOVE REQUEST FROM BUFFER 
          RJ     SRM
          ZR     X1,GSRX     IF NO ERROR
          SB6    -1          INDICATE COMMUNICATION ERROR 
          EQ     GSRX        RETURN 
 RSR      SPACE  4,10 
**        RSR - REQUEUE STAGE REQUEST.
* 
*         ENTRY  (A1) = FWA OF STAGE REQUEST BLOCK. 
* 
*         EXIT   (X1) = 0, IF REQUEST TRANSFERRED SUCCESSFULLY. 
* 
*         USES   X - 1, 2, 3, 6, 7. 
*                A - 1, 2, 3, 6, 7. 
* 
*         CALLS  SRM. 
  
  
 RSR      SUBR               ENTRY/EXIT 
          SA1    A1          TRANSFER INFORMATION TO REQUEST BLOCK
          SA2    A1+B1       +1 
          BX6    X1 
          LX7    X2 
          SA6    RSRA+1 
          SA7    A6+B1
          SA3    A2+B1       +2 
          SA2    A3+B1       +3 
          BX6    X3 
          LX7    X2 
          SA6    A7+B1
          SA7    A6+B1
          SA3    A2+B1       +4 
          SA2    A3+B1       +5 
          BX6    X3 
          LX7    X2 
          SA6    A7+B1
          SA7    A6+B1
          SA3    A2+B1       +6 
          SA2    A3+B1       +7 
          BX6    X3 
          SA6    A7+B1
          SX6    PFTBL
          MX7    24 
          SX3    QSR
          BX2    X7*X2       EXTRACT RETRY INFORMATION
          LX3    48-0        POSITION FUNCTION CODE 
          LX2    24-36       POSITION RETRY INFORMATION 
          BX6    X6+X3
          BX7    X2+X6
          SA7    RSRA        SET INTO REQUEST BLOCK 
          SB2    A7          ASK *MAGNET* TO REQUEUE REQUEST
          RJ     SRM
          EQ     RSRX        RETURN 
  
  
 RSRA     BSS    PFTBL       BUFFER FOR REQUEST TO REQUEUE
 RTP      SPACE  4,10 
**        RTP - READ TABLE POINTERS.
* 
*         EXIT   (X6) = 0, IF UNABLE TO READ POINTERS.
*                (MTPR) = TABLE POINTERS FROM *MAGNET*. 
*                *RSB* REQUEST BLOCKS SET (*RQJT* AND *ASJT*).
* 
*         USES   X - 1, 2, 6, 7.
*                A - 1, 2, 6. 
* 
*         MACROS RECALL, SYSTEM.
  
  
 RTP3     SX6    B0+         INDICATE ERROR STATUS
  
  
 RTP      SUBR               ENTRY/EXIT 
 RTP1     SA1    RTPA        CLEAR PREVIOUS STATUS
          MX6    -48
          BX6    -X6*X1 
          SA6    A1 
          SYSTEM RSB,R,RTPA,MTSI    READ LOW CORE VALUES
          SA1    RTPA 
          PL     X1,RTP3     IF ERROR IN TRANSFER 
          SA2    PFTF 
          NZ     X2,RTP2     IF *MAGNET* IS NOT REPACKING THE TABLE 
          RECALL             GIVE UP CPU
          EQ     RTP1        TRY AGAIN
  
*         BUILD JOB TABLE *RSB* REQUEST BLOCK.
  
 RTP2     SA1    AJTP 
          ZR     X2,RTP3     IF TAPE ALTERNATE STORAGE NOT ACTIVE 
          SX2    X1          TABLE FWA
          AX1    48 
          SX6    ASJT 
          SX1    X1          TABLE LENGTH 
          LX2    18 
          BX7    X6+X2
          LX1    36 
          IX6    X7+X1
          SA6    RQJT 
          EQ     RTPX        RETURN 
  
  
 RTPA     VFD    12/,12/TVSP-TSRL+1,18/TSRL,18/MTPR  *RSB* IMAGE
 SRM      SPACE  4,10 
**        SRM - SEND REQUEST TO *MAGNET*. 
* 
*         ENTRY  (B2) = FWA OF BLOCK TO TRANSFER. 
* 
*         EXIT   (X1) = 0, IF SUCCESSFUL. 
* 
*         USES   X - 1, 2, 6. 
*                A - 1, 2, 6. 
* 
*         MACROS RECALL, SYSTEM.
  
  
 SRM      SUBR               ENTRY/EXIT 
 SRM1     SA1    SRMA 
          MX6    30 
          BX6    X6*X1       REMOVE PREVIOUS STATUS 
          SA6    A1 
          SYSTEM SIC,R,A6,B2 SEND REQUEST TO *MAGNET* 
          SA1    SRMA        CHECK *SIC* STATUS 
          SX2    X1-5 
          NZ     X2,SRM2     IF BUFFER NOT BUSY 
          RECALL             GIVE UP CPU
          EQ     SRM1        TRY AGAIN
  
 SRM2     SX1    X1-1        CHECK *SIC* STATUS 
          NZ     X1,SRMX     IF *SIC* UNSUCCESSFUL
  
*         WAIT UNTIL REQUEST HAS BEEN PROCESSED.
  
 SRM3     RECALL             GIVE UP CPU
          SA1    SRMB        CLEAR PREVIOUS STATUS
          MX6    -48
          BX6    -X6*X1 
          SA6    A1 
          SYSTEM RSB,R,SRMB,MTSI  CHECK IF REQUEST HAS BEEN PROCESSED 
          SA1    SRMB 
          PL     X1,SRMX     IF ERROR IN *RSB* TRANSFER 
          SA1    SRMC        CHECK *RCAL* BUFFER WITHIN *MAGNET*
          ZR     X1,SRMX     IF REQUEST PROCESSED 
          SA2    B2          COMPARE *RCAL* WITH THIS REQUEST 
          BX1    X1-X2
          ZR     X1,SRM3     IF THIS REQUEST NOT YET PROCESSED
          SX1    B0          INDICATE SUCCESSFUL COMPLETION 
          EQ     SRMX        RETURN 
  
  
 SRMA     VFD    12/0,18/MTSI,30/  *SIC* CALL IMAGE 
 SRMB     VFD    12/0,12/1,18/RCAL,18/SRMC  *RSB* CALL IMAGE
 SRMC     BSS    1           *RSB* BUFFER 
 TCM      SPACE  4,10 
**        TCM - TERMINATE CONNECTION WITH *MAGNET*. 
* 
*         ENTRY  (JTEC) = 24/VSN,36/
* 
*         EXIT   (X1) = 0, IF SUCCESSFUL. 
* 
*         USES   X - 1, 2, 3, 6, 7. 
*                A - 1, 2, 3, 6, 7. 
* 
*         CALLS  SRM. 
  
  
 TCM      SUBR               ENTRY/EXIT 
          SA2    TCMA        GET REQUEST WORD 
          SA1    JTEC        GET JSN
          LX1    -12
          SA3    PFTM        FORCE RECHECK ON NEXT ENTRY
          BX7    X3 
          SA7    MODC 
          BX6    X6-X6       CLEAR JSN IN *JTEC*
          SA6    A1 
          MX6    24 
          LX6    -12
          BX1    X6*X1       EXTRACT JSN
          BX2    -X6*X2      CLEAR JSN FIELD
          ZR     X1,TCMX     IF NO JSN IN *JTEC*
          BX7    X1+X2
          SA7    A2          SET REQUEST INTO BUFFER
          SB2    A7          ASK *MAGNET* TO CLEAR JOB ENTRY
          RJ     SRM
          EQ     TCMX        RETURN 
  
  
 TCMA     VFD    12/TJE,24/,6/,18/1  REQUEST TO TERMINATE JOB ENTRY 
          SPACE  4,10 
*         *MAGNET* TABLE POINTERS.
  
 MTPR     BSSZ   TVSP-TSRL+1     *MAGNET* TABLE POINTERS
 PFTL     EQU    TSRL-TSRL+MTPR  LENGTH OF PF REQUEST TABLE 
 PFTF     EQU    TSRP-TSRL+MTPR  FWA OF PF REQUEST TABLE
 PFTM     EQU    TSRM-TSRL+MTPR  MODIFICATION COUNT OF TABLE
 AJTP     EQU    TAJP-TSRL+MTPR  ACTIVE STAGE JOB TABLE POINTER 
  
  
*         DATA LOCATIONS. 
  
 JTEC     CON    0           JOB TABLE ENTRY FOR CALLING JOB
 JTIN     CON    -1          JOB TABLE INDEX FOR CALLING JOB
 JTSI     CON    0           JOB TABLE SEARCH INDEX 
 MODC     CON    -1          *TSRM* AT START OF NEW SCAN
 RQAI     VFD    12/AIB,24/,6/,18/1 REQUEST TO ALTER INITIALIZATION BIT 
 RQJT     VFD    12/,12/ASJTL,18/**,18/ASJT  REQUEST TO READ JOB TABLE
 RQRE     VFD    12/RER,48/**  REQUEST TO REMOVE STAGE REQUEST
 RQSR     BSS    1           *RSB* REQUEST BLOCK FOR STAGE REQUESTS 
 SRCH     CON    -1          STAGE REQUEST COUNT FOR HELPER 
  
  
*         ACTIVE STAGE JOB TABLE BUFFER.
*         THIS BUFFER IS READ FROM TABLE *TAJP* IN *MAGNET*-S FL. 
  
 ASJT     BSSZ   SJMX+1      ACTIVE STAGE JOB TABLE BUFFER
 ASJTL    EQU    *-ASJT 
  
  
*         STAGE REQUEST BUFFER. 
*         THIS BUFFER IS READ FROM TABLE *TSRP* IN *MAGNET*-S FL. 
  
 SRQB     BSSZ   100B        STAGE REQUEST BUFFER 
 SRQBL    EQU    *-SRQB 
          ERRNZ  SRQBL/PFTBL*PFTBL-SRQBL *SRQBL* NOT MULTIPLE OF *PFTBL*
          SPACE  4,10 
          BASE   *
 QUAL$    IF     -DEF,QUAL$ 
          QUAL   *
 GSR      EQU    /COMCSRI/GSR 
 RSR      EQU    /COMCSRI/RSR 
 SRM      EQU    /COMCSRI/SRM 
 TCM      EQU    /COMCSRI/TCM 
 QUAL$    ENDIF 
          ENDX
