*DECK HPFL
USETEXT NIPDEF
USETEXT ACB 
USETEXT APPSTAT 
USETEXT AT
USETEXT DRHDR 
USETEXT FLIST 
USETEXT PT
 PRGM HPFL; 
  
 STARTIMS;
 STOPIMS; 
 #
*1DC  HPFL
* 
*     1. PROC NAME           AUTHOR              DATE 
*        HPFL                E. GEE              78/01/25 
* 
*     2. FUNCTIONAL DESCRIPTION.
*          REISSUE ACB SCP FUNCTION LIST
* 
*     3. METHOD USED. 
*          CLEAR COMPLETION BITS AND RETURN CODES FROM SCP FUNCTION.
*            LIST 
*          REISSUE SCP FUNCTION 
*          PROCESS SCP FUNCTION RETURN CODE 
* 
*     4. ENTRY PARAMETERS.
*          ACBADDR           ACB ADDRESS
* 
*     5. EXIT PARAMETERS. 
*          ABTADDR           BUF ADR FOR XABTAPP TO USE IF ABORTING APP 
*          ABTAPPF           ABORT FLG SET IF NIP GOT SCP RC = RCUCPAOOR
*          FAILADR           FAIL FLG SET IF NIP GET SCP RC = RCUCPGONE 
* 
*     6. COMDECKS CALLED AND SYMPL TEXTS USED.
*        ACB     APPSTAT     AT     FLIST 
*        NIPDEF  OPSIZE      PT 
* 
*     7. ROUTINES AND OVERLAYS CALLED.
*          HWLP              PROCESS WORKLIST 
*          MRELS             RELEASE BUFFER SPACE 
*          OSCCALL           ISSUE SCP FUNCTION 
*          OSCHAPP           SCHEDULE APPLICATION 
*          XTRACE            RECORD PROCEDURE CALLS 
* 
*     8. DAYFILE MESSAGES AND OTHER IMPORTANT INFORMATION.
* 
*        THIS PROGRAM IS A PRIMARY OVERLAY LOADED BY SUBOURTINE OVLCALL.
*        WHEN EXECUTION HAS COMPLETED, A JUMP IS MADE TO LOCATION RJMAIN
*        TO RETURN TO THE CALLING PROGRAM.
* 
*        W A R N I N G - THIS PROGRAM CANNOT EXCEED THE PRIMARY 
*CALL OPSIZE
* 
*        THIS OVERLAY IS CALLED BY XSACB. 
* 
 #
# 
                    EXTERNAL VARIABLES
# 
 XREF 
   BEGIN
   PROC HWLP;                # PROCESS NWL WORKLIST ENTRIES            #
   PROC MRELS;               # RELEASE BUFFER SPACE                    #
   PROC OSCCALL;             # ISSUE SCP CALLS                         #
   PROC OSCHAPP;             # SCHEDULE APPLICATION                    #
   PROC XTRACE;              # RECORD PROCEDURE CALLS                  #
   LABEL RJMAIN;             # RETURN ADDRESS IN OVCALL                #
   END
# 
                    INTERNAL VARIABLES
# 
      ITEM EXTRAWORD;        # EXTRA ONE WORD FOR SFXLST FUNCTION LIST #
 ITEM FLW;                   # INDEX FOR ZEROING RC AND CB IN FUNC LIST#
 ITEM RELADDR;               # ADDR OF BUFFER TO RELEASE               #
  
#**********************************************************************#
  
      BEGIN 
  
      CONTROL IFEQ DEBUG,1; 
       XTRACE("HPFL ") ;
      CONTROL FI; 
  
      P<ACB> = ACBADDR;      # ACB ADDRESS                             #
      P<FLHEAD> = ACBFLIST[0]; # FUNCTION LIST ADDRESS                 #
      FLCB[0] = 0;
      FLRC[0] = 0;
      IF FLFC[0] EQ SFLIST
      OR FLFC[0] EQ SFXLST
      THEN                   # SF.LIST SCP REQUEST                     #
        BEGIN  # CLEAR ALL COMPLETE BITS/RC ON LIST ENTRIES            #
        IF FLFC[0] EQ SFXLST
        THEN  # EXTENDED READ/WRITE LIST REQUEST                       #
          EXTRAWORD = 1;  # A 4-WORD FLHEAD/2 WORD ENTRY               #
        ELSE  # NORMAL READ/WRITE LIST REQUEST                         #
          EXTRAWORD = 0;  # A 3-WORD FLHEAD/1-WORD ENTRY               #
      FOR FLW=FLSIZE + EXTRAWORD STEP (FLESIZE + EXTRAWORD) 
      UNTIL (FLBS[0] - BLKHSIZE)
      DO  # LOOP THROUGH ALL LIST ENTRIES                              #
          BEGIN 
          P<FLE> = ACBFLIST[0] + FLW; 
          FLERC[0] = 0; 
          FLECB[0] = 0; 
          END 
        END 
# 
      REISSUE SCP FUNCTION
# 
      P<FLE> = ACBFLIST[0] + FLHSIZE; # SCP CALL WORD                  #
      OSCCALL(FLE);          #ISSUE SCP CALL                           #
# 
      PROCESS SCP FUNCTION RETURN CODE
# 
      IF FLRC[0] EQ 0 
      THEN                   # SCP FUNCTION COMPLETED OK               #
        BEGIN 
        IF ACBWRADDR[0] NQ 0
        THEN                 # WRITE BUF IN NIP TO RELEASE             #
          BEGIN 
          IF ACBWRADDR[0] LS ACBADDR # CHECK IF WRADDR OUT OF ACB AREA #
             OR ACBWRADDR[0] GQ ACBADDR + ACBSIZE 
          THEN
            BEGIN 
            MRELS(ACBWRADDR[0]);  # WRITE BUF IN NIP TO RELEASE        #
            END 
          ACBWRADDR[0] = 0;  # CLEAR ACBWRADDR POINTER ADDRESS         #
          END 
        MRELS(ACBFLIST[0]);  # RELEASE FUNCTION LIST BUFFER            #
        ACBFLIST[0] = 0;
        HWLP;                # PROCESS REST OF NWL                     #
        END 
      ELSE
        BEGIN 
        IF FLRC[0] EQ RCSWAPPEDOUT
        THEN                 # APP IS SWAPPED OUT AGAIN                #
          BEGIN 
          ATASBS[ACBAN[0]] = TRUE;  # APP-AWAPPED-OUT FLAG IN ACB      #
          OSCHAPP(ACBADDR);  # SCHEDULE APPLICATION                    #
          END 
        ELSE
          BEGIN 
          IF FLRC[0] EQ RCUCPAOOR 
          THEN               # APP GAVE BAD AWL ADDR SO ABORT IT       #
            BEGIN 
            ABTAPPF = XFLERR;   # SET ABORT-APPLICATION FLAG           #
            ABTADDR = ACBADDR; # ACB ADDRESS                           #
            END 
          ELSE               # APP IS NO LONGER IN SYSTEM              #
            FAILADR = ACBADDR; # SET APPLICATION-FAILED FLAG           #
          END 
        END 
      GOTO RJMAIN;           # RETURN TO CALLING PROGRAM               #
      END 
TERM
