*DECK SSFCALL 
USETEXT COMCBEG 
USETEXT COMRQUE 
USETEXT COMRSFC 
      PROC SSFCALL; 
# TITLE - SSFCALL - MAKE CALL FOR SUBSYSTEM FUNCTIONS. #
  
      BEGIN  # SSFCALL #
  
# 
**    SSFCALL - MAKE CALL FOR SUBSYSTEM FUNCTIONS.
* 
*     THIS PROCEDURE MAKES THE SPECIAL SUBSYSTEM FUNCTION (SSF) CALLS.
* 
*     PROC SSFCALL. 
* 
*     ENTRY   -  QU$ADDRESS IS BASED ARRAY CONTAINING REQUIRED
*                  SUBSYSTEM FUNCTIONS. 
* 
*     EXIT    -  SUBSYSTEM REQUESTS COMPLETED IF UCP IN MEMORY. 
*                SWAPIN REQUEST MADE AND REQUEST QUEUED ON WAIT-SWAP
*                  QUEUE IF UCP SWAPPED OUT.
* 
*     PROCESS - IF SINGLE FUNCTION
*                THEN:  
*                  MAKE SSF CALL
*                  WAIT FOR COMPLETION. 
*                ELSE:  "LIST OF FUNCTIONS - SF.LIST" 
*                  WHILE LIST NOT EMPTY AND UCP NOT SWAPPED OUT:  
*                    MAKE SSF CALL
*                    WAIT FOR COMPLETION..
*                IF UCP SWAPPED OUT 
*                THEN:  
*                  INITIATE UCP SWAPIN. 
*                ELSE:  "FUNCTION COMPLETED"
*                  IF SSF CALL ERROR
*                  THEN:  
*                    CALL SSF ERROR PROCESSOR.
*                  FREE QUEUE ENTRY AND ALL RELATED ENTRIES.
*                RETURN 
* 
* 
****  PROC SSFCALL - XREF LIST BEGIN. 
# 
  
      XREF
        BEGIN 
        PROC FREE;                   # RELEASE QUEUE ENTRY #
        PROC CALLSYS;                # MAKE RA+1 REQUEST #
        PROC SSFERRP;                # SSF ERROR PROCESSOR #
        PROC WAIT;                   # WAIT FOR COMPLETION #
        PROC UCPSWPI;                # INITIATE UCP SWAP IN # 
        END 
  
# 
***   PROC SSFCALL - XREF LIST END. 
# 
  
  
      ITEM AUXPTR I;                 # TEMPORARY AUX QUEUE POINTER #
  
CONTROL EJECT;
  
      QU$SFRC1 = 0;                  # CLEAR RETURN CODE #
      QU$SFRC2 = 0; 
      QU$SFRC3 = 0; 
      QU$SFRC4 = 0; 
      QU$SFRC5 = 0; 
  
      IF QU$SFFC1 NE SF$LIST
      THEN
        BEGIN  # NOT LIST FUNCTION #
        SSFADDR = P<QU$ADDRESS> + 1;
        SSFRCL  = FALSE;
        CALLSYS(SSF$CALL);
        WAIT(SSFADDR);
        QU$SFCB1 = FALSE;            # RESET COMPLETE BIT # 
        END 
  
      ELSE
        BEGIN  # LIST FUNCTION #
  
        ASLONGAS QU$SFFP1 NE 0
          AND (QU$SFRC1 EQ 0  OR  QU$SFRC1 EQ SFRC$LERR)
          AND QU$SFRC2 NE SFRC$SWAP 
          AND QU$SFRC3 NE SFRC$SWAP 
          AND QU$SFRC4 NE SFRC$SWAP 
          AND QU$SFRC5 NE SFRC$SWAP 
        DO
          BEGIN  # SF.LIST LOOP # 
          SSFADDR = P<QU$ADDRESS> + 1;
          SSFRCL  = FALSE;
          CALLSYS(SSF$CALL);
          WAIT(SSFADDR);
          QU$SFCB1 = FALSE; 
          END 
  
        END 
  
      IF QU$SFRC1 EQ SFRC$SWAP
        OR QU$SFRC2 EQ SFRC$SWAP
        OR QU$SFRC3 EQ SFRC$SWAP
        OR QU$SFRC4 EQ SFRC$SWAP
        OR QU$SFRC5 EQ SFRC$SWAP
      THEN
        BEGIN  # INITIATE UCP SWAP-IN # 
        UCPSWPI(QU$SFJOBID);
        END 
  
      ELSE
        BEGIN  # FUNCTIONS COMPLETED #
  
        IF QU$SFRC1 NE 0
        THEN
          BEGIN 
          SSFERRP(0); 
          END 
  
        ASLONGAS P<QU$ADDRESS> NE 0 
        DO
          BEGIN  # FREE QUEUE ENTRY AND ASSOCIATED ENTRIES #
          AUXPTR = QU$AUXPTR; 
          FREE; 
          P<QU$ADDRESS> = AUXPTR; 
          END 
  
        END 
  
      RETURN; 
      END  # SSFCALL #
  
      TERM
