*DECK HPAWL 
USETEXT NIPDEF
USETEXT ACB 
USETEXT APPSTAT 
USETEXT AT
USETEXT STATTAB 
 PROC HPAWL;
  
 STARTIMS;
 #
*1DC  HPAWL 
* 
*     1. PROC NAME           AUTHOR              DATE 
*        HPAWL               E. GEE              78/01/25 
* 
*     2. FUNCTIONAL DESCRIPTION.
*          WRITE AWL BACK TO APPLICATION
* 
*     3. METHOD USED. 
*          CREATE FUNCTION LIST TO WRITE AWL (IF ONE) AND CLEAR SHORT 
*            TERM CONNECTION
*          ISSUE SYSTEM CONTROL POINT FUNCTION
*          PROCESS SCP FUNCTION RETURN CODE 
* 
*     4. ENTRY PARAMETERS.
*          ACBADDR           ACB ADDRESS
* 
*     5. EXIT PARAMETERS. 
*          ABTAPPF           ABORT FLG SET IF NIP GOT SCP RC = RCUCPAOOR
*          FAILADR           FAIL FLG SET IF NIP GOT SCP RC = RCUCPGONE 
* 
*     6. COMDECKS CALLED AND SYMPL TEXTS USED.
*        ACB     APPSTAT     AT 
*        NIPDEF 
*        STATTAB             STATISTICS TABLE 
* 
*     7. ROUTINES AND OVERLAYS CALLED.
*          HRELWWL           RELEASE THE WHOLE WORKLIST 
*          OSCCALL           ISSUE SYSTEM CONTROL POINT FUNCTION
*          OSCHAPP           SCHEDULE APPLICATION 
*          OTIME             GET SYSTEM RTIME 
*          XTRACE            RECORD PROCEDURE CALLS 
* 
*     8. DAYFILE MESSAGES AND OTHER IMPORTANT INFORMATION.
*        THIS PROCEDURE IS CALLED BY HWLP.
* 
 #
 STOPIMS; 
# 
                    EXTERNAL VARIABLES
# 
 XREF 
   BEGIN
   PROC HRELWWL;                       # RELEASE THE WHOLE NWL         #
   PROC OSCCALL;                       # ISSUE SCP CALL                #
   PROC OSCHAPP;
   PROC OTIME;                         # GET SYSTEM RTIME              #
   PROC XTRACE;                        # TRACE CALLS                   #
   END
# 
                    INTERNAL VARIABLES
# 
  
 CONTROL IFEQ STAT,1; 
   ARRAY STIME P(1);                   # RTIME BUFFER FOR STARTING TIME#
     BEGIN
     ITEM SMILS U(0,24,36);            # STARTING TIME IN MILLESECONDS #
     END
   ARRAY ETIME P(1);                   # RTIME BUFFER FOR ENDING TIME  #
     BEGIN
     ITEM EMILS U(0,24,36);            # ENDING TIME IN MILLESECONDS   #
     END
  
   ITEM STTEMP;                        # TEMPORARY STATISTICS VARIABLE #
 CONTROL FI;
  
  
 ARRAY FL$BUF [0:2];                   # ARRAY OF SCP FUNCTION REQUESTS#
   BEGIN
   ITEM FL$RC     U(00,00,06) = [3(0)];   # RETURN CODE FROM SCP CALL  #
   ITEM FL$FP     U(00,06,12) = [2,6,0];  # FUNCTION PARAMETER         #
   ITEM FL$UCPA   U(00,18,18) = [3(0)];   # UCP ADDRESS                #
   ITEM FL$SCPA   U(00,36,18) = [3(0)];   # SCP ADDRESS                #
   ITEM FL$FC     U(00,54,06) = [SFLIST,SFWRITE,SFENDT];  # SCP FUNC CD#
   ITEM FL$CB     U(00,59,01);         # SCP FUNCTION COMPLETION BIT   #
   ITEM FL$WD0    U(00,00,60);         # WORD 0 OF SCP FUNCTION BUFFER #
   END
  
 ARRAY FLE$BUF S(4);                   # ARRAY FOR ISSUING SCP REQUEST #
   BEGIN
   ITEM FLE$HRC    U(00,00,06);        # SCP RETURN CODE               #
   ITEM FLE$HUCPA  U(00,18,18);        # UCP ADDRESS                   #
   ITEM FLE$HSCPA  U(00,36,18);        # SCP ADDRESS                   #
   ITEM FLE$HWD    U(00,00,60);        # SCP FUNCTION CODE WORD        #
   ITEM FLE$JSNWD  U(01,00,60);        # UCP JSN / EJT ORDINAL WORD    #
   ITEM FLE$1UCPA  U(02,18,18);        # UCP ADR FOR SF.WRITE SCP FUNC #
   ITEM FLE$1SCPA  U(02,36,18);        # SCP ADR FOR SF.WRITE SCP FUNC #
   ITEM FLE$1WD    U(02,00,60);        # SCP FUNCTION CODE WORD        #
   ITEM FLE$2UCPA  U(03,18,18);        # UCP ADR FOR SF.ENDT SCP FUNC  #
   ITEM FLE$2SCPA  U(03,36,18);        # SCP ADR FOR SF.ENDT SCP FUNC  #
   ITEM FLE$2WD    U(03,00,60);        # SCP FUNCTION CODE WORD        #
   END
  
 ITEM AN;                              # APPLICATION NUMBER            #
  
#**********************************************************************#
     BEGIN
  
      CONTROL IFEQ DEBUG,1; 
       XTRACE("HPAWL") ;
      CONTROL FI; 
  
      CONTROL IFEQ STAT,1;
        OTIME(STIME);        # GET SYSTEM TIME AT BEGINNING OF PROC    #
      CONTROL FI; 
  
  
      P<ACB> = ACBADDR;      # ACB ADDRESS                             #
# 
      CREATE FUNCTION LIST TO WRITE AWL (IF SOMETHING TO WRITE BACK)
      AND END SHORT TERM CONNECTION BETWEEN APP AND NIP 
# 
      AN = ACBAN[0];         # APPLICATION NUMBER                      #
      FLE$JSNWD[0] = ACBJNWD[0];  # ACB JOB WORD                       #
      IF (ACBAWL0[0] NQ 0) OR   # NO GET/GETL OR NETON OR NETXFR RESP  #
         (ACBAWL2[0] NQ 0) OR   # NO GETMM RESPONSE                    #
         (ACBAWL4[0] NQ 0)      # NO GETSM RESPONSE                    #
      THEN                   # WRITE AWL RESPONSE TO APP               #
        BEGIN 
# 
        UPDATE DATA AVAILABLE FLAGS IN AWL RESPONSE 
# 
        FLE$HWD[0] = FL$WD0[0];  # SF.LIST FUNCTION CODE WORD          #
        FLE$HSCPA[0] = LOC(FLE$1WD);  # ADDR OF SF.LIST ENTRIES        #
        FLE$1WD[0] = FL$WD0[1];  # SF.WRITE FUNCTION CODE WORD         #
        FLE$1UCPA[0] = ACBAWLADDR[0];  # UCP ADDR TO WRITE AWL         #
        FLE$1SCPA[0] = LOC(ACBAWL0[0]); 
        FLE$2WD[0] = FL$WD0[2];  # SF.ENDT FUNCTION CODE WORD          #
        FLE$2UCPA[0] = ACBUCPADR[0];  # UCP COMPLETION BIT ADDR        #
        END 
      ELSE                   # ONLY NEED TO CLEAR SHORT TERM           #
        BEGIN 
        FLE$HWD[0] = FL$WD0[2];  # SF.ENDT SCP FUNCTION WORD           #
        FLE$HUCPA[0]= ACBUCPADR[0];  # UCP COMPLETION BIT ADDR         #
        END 
# 
      ISSUE SCP REQUEST 
# 
      OSCCALL(FLE$BUF); 
# 
      PROCESS SCP FUNCTION RETURN CODE
# 
      IF FLE$HRC[0] NQ RCSWAPPEDOUT 
      THEN                   # ALRIGHT TO RELEASE AWL BUFFER           #
        BEGIN 
        IF FLE$HRC[0] EQ 0
        THEN                 # SCP FUNCTION COMPLETED OK               #
          BEGIN 
          ACBAWLADDR[0] = 0;
          ACBAWL0[0] = 0;    # CLEAR  AWL WORD IN ACB                  #
          ACBAWL2[0] = 0;    # CLEAR AWL WORD IN ACB BLOCK             #
          ACBAWL4[0] = 0 ;
          HRELWWL;           # RELEASE THE WHOLE NWL                   #
          END 
        ELSE                 # SCP FUNCTION NOT COMPLETED OK           #
          BEGIN 
          IF FLE$HRC[0] EQ RCUCPGONE
             OR FLE$HRC[0] EQ RCSTCBAD
          THEN               # UCP IS NO LONGER IN SYSTEM SO           #
            FAILADR = ACBADDR; # SET APPLICATION-FAILED FLAG           #
          ELSE               # UCP GAVE BAD AWL ADDR SO ABORT IT       #
            ABTAPPF = XFLERR;   # SET ABORT-APPLICATION FLAG           #
          END 
        END 
      ELSE                   # APP IS SWAPPED OUT                      #
        BEGIN              # AFTER SWAPIN,HPAWL WILL BE CALLED AGAIN   #
        ATASBS[AN] = TRUE;   # SET APP-SWAPPED-OUT FLAG IN ACB         #
        OSCHAPP(ACBADDR);    # SCHEDULE APPLICATION                    #
        END 
  
      CONTROL IFEQ STAT,1;
        OTIME(ETIME);        # GET SYSTEM TIME AT END OF PROCEDURE     #
        ST$NAW = ST$NAW + 1; # INCREMENT NUMBER OF TIMES HPAWL CALLED  #
        STTEMP = EMILS[0] - SMILS[0];  # TIME SPENT IN THIS ROUTINE    #
        ST$TAW = ST$TAW + STTEMP;  # TOTAL TIME SPENT IN THIS ROUTINE  #
        IF ST$LAW LS STTEMP 
        THEN                 # FOUND LARGER TIME INTERVAL IN ROUTINE   #
          BEGIN 
          ST$LAW = STTEMP;   # NEW LARGEST TIME INTERVAL               #
          END 
      CONTROL FI; 
  
      RETURN; 
      END 
TERM
