*DECK HFNTSM
USETEXT NIPDEF
USETEXT ACB 
USETEXT AHEADER 
USETEXT APPSTAT 
USETEXT AT
USETEXT DRHDR 
USETEXT DUMPFLG 
USETEXT MSGIDX
USETEXT NWLNTRY 
USETEXT OVERLAY 
USETEXT PARAMS
USETEXT PT
USETEXT RELFILE 
USETEXT SSTCOM
USETEXT STPRESP 
USETEXT SUPMSG
PRGM HFNTSM ; 
STARTIMS ;
 #
*1DC  HFNTSM
* 
*     1. PROC NAME        AUTHOR           DATE 
*        HFNTSM           LIEM T. NGUYEN   88/04/11 
* 
*     2. FUNCTIONAL DESCRIPTION 
*        THIS ROUTINE PROCESSES THE FNT SUPERVISORY MESSAGE.
*                 FNT/DMS 
*                 FNT/DSM 
*                 FNT/IFL 
*                 FNT/IFR 
*                 FNT/RLT 
*                 FNT/RLT 
* 
*     3. METHOD USED
* 
*     4. ENTRY PARAMETERS 
*        PARAMS1 = TRIGGER TO THE STATE TABLE PROCESSOR.
*        PARAMS2 = ACB POINTER OF THE SENDING S.M. APPLICATION. 
* 
*     5. FOR INFORMATION ABOUT OUTPUT PARAMETERS, AS WELL AS
*            DAYFILE MESSAGES,TEXTS ETC. REFER TO THE 
*            IMS OF EACH SPECIFIC ROUTINE.
* 
 #
STOPIMS ; 
    XREF
      BEGIN 
      LABEL RJMAIN ;
      PROC BLINK ;
      PROC MGETS ;
      PROC OSREQ ;
      PROC OMSG ; 
      PROC OSCHAPP ;
      PROC OVLCALL ;
      FUNC XCDD C(10) ; 
      PROC XSTTP ;
      END 
# 
      INTERNAL VARIABLES
# 
# 
                    JUMP TABLE FOR UCP-PFC/SFC PROCEDURES 
# 
  
 SWITCH FNTACTS FDMS,             # PROCESS FNT/DMS/R AND FNT/DSM/R    #
                SFTS,             # SWITCH FILE FROM MASTER TO SLAVE   #
                RFTM,             # RETURN FILE FROM SLAVE TO MASTER   #
                RSFS,             # RESEND FILE TO SLAVE               #
                RSFM,             # RESEND FILE TO MASTER              #
                SMRA,             # SET MASTER REQUEST SLAVE TO ABORT F#
                CIOR,             # FILE AT NIP, DO CIO RETURN         #
                SFTN,             # SLAVE NETTING OFF, SWITCH FNT TO NP#
                SOFM,             # SLAVE NETTED OFF, AFTER IAR/R      #
                PABT,             # PARTNER ABORTED                    #
                SDXA,             # SEND DMS/A OR DSM/A TO SENDING APPL#
                RIAR,             # RE-PROCESS FNT/IAR/R               #
                SBIM,             # SET BITS IN AT OF MASTER           #
                IMSA,             # INFORM MASTER SLAVE ABORTED        #
                SPAP,             # SET PARTNER ADDRESS POINTER        #
                RFWE,             # RETURN FILE WITH ERROR FNT/IFL/A   #
                ABRF,             # ABNORMAL RESPONSE, RETURN FILE     #
                FEND ;
  
    ARRAY RELBUFF S(8) ;
      BEGIN 
      ITEM RELW0  U(00,00,60) ; 
      ITEM RELBID U(00,00,06) ; 
      ITEM RELBBS U(00,06,AL) = [8] ; 
      ITEM RELW1  U(01,00,60) ; 
      ITEM RELW2  U(02,00,60) ; 
      ITEM RELW3  U(03,00,60) ; 
      ITEM RELW4  U(04,00,60) ; 
      ITEM RELW5  U(05,00,60) ; 
      ITEM RELW6  U(06,00,60) ; 
      ITEM RELW7  U(07,00,60) ; 
      END 
    ARRAY ILL$MSG S(6) ;
      BEGIN 
      ITEM ILL$TRG$MSG C(00,00,52) =
            [" HFNTSM   MAST SLAV, ILLEGAL TRIGGER TRG= TT  ST= SS"] ;
      ITEM ILL$MASTER C(01,00,04) ; 
      ITEM ILL$SLAVE  C(01,30,04) ; 
      ITEM ILL$MSG$TR C(04,12,02) ; 
      ITEM ILL$MSG$ST C(05,00,02) ; 
      ITEM ILL$ZERO   U(05,48,12) = [0] ; 
      END 
  
    ITEM CURST         ;
    ITEM OLDTRIG       ;
    ITEM TRIGGER       ;
  
    ITEM BUFADDR       ;
    ITEM CLEARFNT B    ;
    ITEM CURPFCSFC = 0 ;
    ITEM FILEORD       ;
    ITEM FOUND B       ;
    ITEM INDEX         ;
    ITEM OTHERAN       ;
    ITEM REASON U      ;
    ITEM RESP          ;
    ITEM PTNR$ACB U    ;
    ITEM SEND$ACB U    ;
    ITEM SCRATCH C(10) ;
  
    BEGIN                           # HFNTSM                           #
      P<AT>     = PTAT[0] ;            # APPLICATION TABLE             #
      P<ACB>    = 0 ; 
      OTHERAN   = 0 ; 
      SEND$ACB  = ATACBA[PARAMS2] ;    # ACB OF SENDING APPLICATION    #
      PTNR$ACB  = 0 ; 
      REASON    = 0 ; 
      CLEARFNT  = FALSE ; 
  
      IF PARAMS3 NQ 0 
      THEN
        BEGIN 
        P<SUPMSG> = PARAMS3 ; 
        P<SMNVF>  = P<SUPMSG> ; 
        CURPFCSFC = PFCSFC[0] ; 
        END 
  
      CURST   = ACBFNTST[SEND$ACB] ;# CURRENT STATE OF THAT APPLI.     #
      OLDTRIG = ACBFNTCTR[SEND$ACB] ; # LAST TRIGGER TO THIS CALL      #
      TRIGGER = PARAMS1 ; 
      XSTTP(FNORD,CURST,TRIGGER,RESP);
  
      P<STRESP> = LOC(RESP);     #  RESPONSE WORD                      #
  
      IF LEGTRIG[0] 
      THEN
        BEGIN                # LEGAL TRIGGER                           #
        IF ACTION[0] NQ NOCHG 
        THEN
          GOTO FNTACTS[ACTION[0]];     # EXECUTE PROPER ACTION         #
        ELSE
          GOTO FEND ; 
  
FDMS:                   # PROCESS FNT/DMS/R OR FNT/DSM/R               #
        FOUND = FALSE ;                # PRESET FLAG                   #
  
        FOR INDEX = 1 STEP 1 WHILE
                        INDEX LQ ATHAN[0] AND NOT FOUND 
        DO
          BEGIN                        # LOOP TO SEARCH                #
          IF ATACBA[INDEX] NQ 0 
          THEN
            BEGIN                      # ACB EXISTED                   #
            IF ACBJOBSQN[ATACBA[INDEX]] EQ FNTJSNC[0]  # MATCHING JSN  #
               AND NOT ATNVFN[INDEX]        # AND THIS APPL NOT NETOFF #
                  AND NOT ATNVFF[INDEX]     # NOR FAILED YET           #
            THEN
              BEGIN 
              FOUND   = TRUE ;         # THIS IS THE RIGHT ONE         #
              OTHERAN = INDEX ; 
              END 
            END                        # ACB EXISTED                   #
          END                          # LOOP TO SEARCH                #
        IF FOUND
        THEN
          BEGIN                        # FOUND ACB                     #
          IF ACBPTNRAN[SEND$ACB] EQ 0  # NO OUTSTANDING LOANNING YET   #
          THEN
            BEGIN 
            PTNR$ACB = ATACBA[OTHERAN] ; # LOOK AT THE PARTNER ACB     #
            IF ACBPTNRAN[PTNR$ACB] NQ 0 
              AND ACBPTNRAN[PTNR$ACB] NQ PARAMS2
            THEN
              REASON = MSR"PAS" ;      # PARTNER ALREADY SELECT ANOTHER#
                                       # APPLICATION                   #
            ELSE
              BEGIN                    # OTHER APPL. READY TO BE       #
              ACBPTNRAN[SEND$ACB] = OTHERAN ; 
              ACBPTJSN [SEND$ACB] = FNTJSNC[0] ;  # JSN OF PARTNER     #
              IF PFCSFC[0] EQ FNTDMS
              THEN
                ACBFNTMAS[SEND$ACB] = TRUE ;  # THIS IS THE MASTER     #
              ELSE
                ACBFNTSLA[SEND$ACB] = TRUE ;   # THIS IS A SLAVE       #
  
              IF ACBPTNRAN[PTNR$ACB] NQ 0        # PARTNER IS READY TOO#
              THEN
                NEWSTATE[0] = FNTIDLE ;          # CHANGE TO STATE 2   #
              ELSE
                PTNR$ACB = 0 ;              #DONT UP DATE PARTNER      #
              END                      # OTHER IS READY TO BE PARTNER  #
            END 
          ELSE
            BEGIN                    # MASTER ALREADY SENT FNT/DMS     #
            REASON  = MSR"PAS" ;     # MAY BE ANOTHER LOAN ALREADY EXT #
            END                      # MASTER ALREADY SENT FNT/DMS     #
          END                          # FOUND ACB                     #
        ELSE
          BEGIN                        # NO MATCHED ACB                #
          REASON   = MSR"UNA" ;        # PARTNER UNAVAILABLE           #
          END                          # NO MATCHED ACB                #
  
        CREATB ;                       # GET BUFFER FOR THE RESPONSE SM#
        PFCSFC[0] = CURPFCSFC ; 
        RC[0] = REASON ;
        IF REASON NQ 0
        THEN
          BEGIN 
          EB[0] = TRUE ;              # AB-NORMAL RESPONSE             #
          END 
        ELSE
          BEGIN 
          RB[0] = TRUE ;              # NORMAL RESPONSE                #
          END 
  
        BLINK(BUFADDR,SEND$ACB) ;     # SEND MESSAGE TO APPLICATION    #
  
      GOTO FEND ; 
  
SFTS:                        # PROCESSING FNT/IFL/R FROM MASTER        #
                             # SWITCH FILE FROM MASTER TO SLAVE        #
      IF ACBPTNRAN[SEND$ACB] NQ 0 
      THEN
        BEGIN                     # PARTNER IS READY FOR FILE          #
                                  # I.E. SLAVE ALREADY SENT FNT/DSM/R  #
        PTNR$ACB = ATACBA[ACBPTNRAN[SEND$ACB]] ;  # ACB OF PARTNER     #
  
        ACBFNTFILE[SEND$ACB] = FNTFILE[0] ; # FILE TO BE SENT TO SLAVE #
        ACBFORDNAL[SEND$ACB] = FNTFNTO[0] ; # FILE ORDINAL FROM MASTER #
  
        SWFTON(SEND$ACB,REASON) ;           # SWITCH FILE FROM SENDING #
                                  # APPL. (MASTER) TO NIP C.P.         #
        IF REASON EQ 0
        THEN
          BEGIN                # SST REQUEST WENT O.K.                 #
  
          SWFTOAP(PTNR$ACB,REASON) ;            # SWITCH FILE TO SLAVE #
          IF REASON NQ 0
          THEN
            BEGIN                   # ABNORMAL REASON CODE FROM SST    #
            IF NOT DONE 
            THEN
              BEGIN                 # WORKLIST HAS BEEN SUSPENDED      #
              # CHANGE STATE OF APPLS TO 4, FILE IS AT NIP C.P., WHEN  #
              # FNT/IFL/R GETS RE-PROCESSED, FILE WILL BE SWITCHED TO  #
              # SLAVE VIA ACTION RSFS (RESEND FILE TO SLAVE).          #
  
              NEWSTATE[0]           = FNTANIP ; 
              ACBFNTANIP [SEND$ACB] = TRUE ;     # SET FILE AT NIP FLAG#
              ACBFNTANIP [PTNR$ACB] = TRUE ;     # SET FILE AT NIP FLAG#
                                    # EXIT THIS ROUTINE, PROCESS AGAIN #
              END 
            ELSE
              BEGIN                 # UNABLE TO SWITCH FILE TO SLAVE   #
                                    # RETURN FILE BACK TO MASTER       #
                                    # THIS IS A PUT ERROR, FILE ALRAEDY#
              SWFTOAP(SEND$ACB,REASON) ;              # AT NIP C.P.,   #
                                       # SEND      IT BACK TO MASTER   #
              IF REASON NQ 0
              THEN
                BEGIN                  # PROBLEM WITH SENDING FILE BACK#
                CIORETF(SEND$ACB) ;    # TO MASTER RETURN IT           #
  
                REASON = RFL"RERR" ;   # ERROR IN RETURNNING FILE TO MS#
                END 
              ELSE
                                    # FILE WENT BACK TO MASTER O.K.    #
                REASON = RFL"PERR" ;  # ERROR IN PUTTING FILE TO SLAVE #
  
              DONE = TRUE ;         # WORKLIST IS COMPLETED            #
              END                   # PUT ERROR                        #
            END                     # ABNORMAL REASON CODE             #
          END                       # SST REQUEST WENT O.K.            #
        ELSE
          BEGIN                     # CANOT GET FILE FROM MASTER       #
          NEWSTATE[0] = CURST ;     # RESTORE CURRENT STATE IF DONE = F#
          REASON = RFL"GERR" ;      # SEND FNT/IFL/A IF FATAL, DONE = T#
          END                       # CAN NOT GET FILE FROM MASTER     #
        END                       # LET LOOK AT THE PARTNER ACB        #
      ELSE
        REASON = RFL"SUNA" ;      # SLAVE IS NOT READY FOR FNT/IFL YET #
  
      IF DONE 
      THEN
        BEGIN                     # THIS PUT WORKLIST DID NOT GET SUSPE#
        CREATB ;                  # GET BUFFER FOR FNT/IFL/N OR IFL/A  #
        IF REASON NQ 0
        THEN
          BEGIN                   # SEND ABNORMAL FNT/IFL TO MASTER    #
          PFCSFC[0] = FNTIFLA ; 
          RC[0]     = REASON ;
          CLEARFNT  = TRUE ;      # SIGNAL TO CLEAR ALL FNT INFO IN ACB#
          END 
        ELSE
          BEGIN                   # NORMAL RESPONSE SENDING            #
          PFCSFC[0] = FNTIFLN ;   # SEND FNT/IFL/N TO MASTER           #
          END 
  
        FNTFNTO[0] = ACBFORDNAL[SEND$ACB] ; 
        BLINK(BUFADDR,SEND$ACB) ;      # LINK IT TO ACB OF MASTER      #
  
        END                       # WORKLIST NOT SUSPENDED             #
                                  # ELSE, WORK LIST IS SUSPENDED, UPDTE#
                                  # STATES, WORLIST WILL BE RE-PROCESSE#
  
      GOTO FEND ; 
RFTM:                        # RETURN FILE FROM SLAVE TO MASTER        #
                             # MASTER SENT FNT/IFR/R TO TERMINATE      #
      PTNR$ACB = ATACBA[ACBPTNRAN[SEND$ACB]] ;   # ACB OF PARTNER (SLV)#
  
      SWFTON(PTNR$ACB,REASON) ;        # SWITCH FILE FROM SLAVE TO NIP #
      IF REASON EQ 0
      THEN
        BEGIN                # SST REQUEST WENT O.K.                   #
        SWFTOAP(SEND$ACB,REASON) ;     # RETURN        FILE TO MASTER  #
        IF REASON NQ 0
        THEN
          BEGIN                   # CAN NOT RETURN FILE TO MASTER      #
          IF NOT DONE 
          THEN
            BEGIN                 # WORKLIST HAS BEEN SUSPENDED        #
            # CHANGE STATE OF APPLS TO 4, FILE IS AT NIP C.P., WHEN    #
            # FNT/IFR/R GETS RE-PROCESSED, FILE WILL BE SWITCHED TO    #
            # MASTER VIA ACTION RSFM (RESEND FILE TO MASTER) .         #
  
            NEWSTATE[0]           = FNTANIP ; 
            ACBFNTANIP [SEND$ACB] = TRUE ;       # SET FILE AT NIP FLAG#
            ACBFNTANIP [PTNR$ACB] = TRUE ;       # SET FILE AT NIP FLAG#
                                  # EXIT THIS ROUTINE, PROCESS AGAIN   #
            END 
          ELSE
            BEGIN                 # OTHER NON-ZERO REASON CODE FROM SST#
            CIORETF(SEND$ACB) ;   # CAN NOT PUT THE FILE BACK TO MASTER#
            REASON = RFL"RERR" ;  # RETURN ERROR IN FNT/IFR TO MASTER  #
            END                   # RETURN FILE TO CIO                 #
          END                     # CAN NOT RETURN FILE TO MASTER      #
        END                       # SST REQUEST WENT O.K.              #
      ELSE
        BEGIN 
        NEWSTATE[0] = CURST ;     # STAY AT SAME STATE FOR WL SUSPENDED#
        REASON = RFL"GERR" ;      # GET ERROR IN FNT/IFR/A TO MASTER   #
        END 
  
      IF DONE 
      THEN
        BEGIN                     # THIS PUT WORKLIST DID NOT GET SUSPE#
        CREATB ;                  # GET BUFFER FOR FNT/IFR/N OR IFR/A  #
        FNTFNTO[0] = ACBFORDNAL[SEND$ACB] ; 
        IF REASON NQ 0
        THEN
          BEGIN                   # SEND ABNORMAL FNT/IFR TO MASTER    #
          PFCSFC[0] = FNTIFRA ; 
          RC[0]     = REASON ;
          CLEARFNT  = TRUE ;      # CLEAR ALL INFORMATIONS             #
          END 
        ELSE
          BEGIN                   # NORMAL RESPONSE SENDING            #
          PFCSFC[0]   = FNTIFRN ;   # SEND FNT/IFR/N TO SLAVE          #
          NEWSTATE[0] = FNTIDLE ;      # CHANGE TO STATE 2, READY FOR  #
                                       # ANOTHER FILE (I.E. FNT/IFL/R) #
          ACBFNTW1[SEND$ACB]   = 0 ;   # CLEAR THE FILE NAME/ORDINAL   #
          ACBMREQABT[SEND$ACB] = FALSE ;   # CLEAR MASTER REQUEST ABT  #
          ACBFNTW1[PTNR$ACB]   = 0 ;   # CLEAR THE FILE NAME/ORDINAL   #
          ACBMREQABT[PTNR$ACB] = FALSE ;   # CLEAR MASTER REQUEST ABT  #
          END 
  
        BLINK(BUFADDR,SEND$ACB) ; # LINK IT TO MASTER ACB              #
  
        END                       # WORKLIST NOT SUSPENDED             #
                                  # ELSE WORKLIST BEEN SUSPENED, UPDATE#
                                  # STATE, THIS WL WILL BE RE-PROCESSED#
  
      GOTO FEND ; 
RSFS:                        # RESEND FILE TO SLAVE APPLICATION        #
                             # THIS ACTION IS EXECUTED WHEN FNT/IFL/R  #
                             # GETS RE-PROCESSED                       #
      PTNR$ACB = ATACBA[ACBPTNRAN[SEND$ACB]] ;   # ACB OF SLAVE        #
  
      SWFTOAP(PTNR$ACB,REASON) ;              # SWITCH FILE TO SLAVE   #
  
      IF REASON EQ 0
      THEN
        BEGIN                # EVERYTHING WENT O.K. THIS TIME          #
        CREATB ;             # GET BUFFER TO SEND FNT/IFL/N TO MASTER  #
        PFCSFC[0]  = FNTIFLN ;    # SEND FNT/IFL/N TO MASTER           #
        FNTFNTO[0] = ACBFORDNAL[SEND$ACB] ; 
        BLINK(BUFADDR,SEND$ACB) ;      # LINK IT TO ACB OF MASTER      #
        END                       # EVERYTHING WENT O.K. THIS TIME     #
      ELSE
        BEGIN                     # NOT O.K.                           #
        IF DONE 
        THEN                      # WORKLIST DIDNOT GET SUSPENDED      #
          BEGIN 
          # UNABLE TO SWITCH FILE TO SLAVE, RETURN FILE BACK TO MASTER #
          # RESPONSE FNT/IFL/A WITH REASON CODE IS PUT ERROR.          #
          SWFTOAP(SEND$ACB,REASON) ;   # AT NIP C.P., SEND IT BACK TO  #
                                       # MASTER                        #
          IF REASON NQ 0
          THEN
            BEGIN 
            CIORETF(SEND$ACB) ;        # NO WAY TO RETURN FILE TO MST  #
            REASON = RFL"RERR" ;       # DO CIO RETURN IT              #
            END 
          ELSE
                                  # FILE WENT BACK TO MASTER O.K.      #
            REASON = RFL"PERR" ;    # ERROR IN PUTTING FILE TO SLAVE   #
  
          DONE = TRUE ;           # WORKLIST IS COMPLETED              #
          CREATB ;             # GET BUFFER TO SEND FNT/IFL/A TO MASTER#
          PFCSFC[0]  = FNTIFLA ;    # SEND FNT/IFL/A TO MASTER         #
          RC[0]      = REASON ; 
          FNTFNTO[0] = ACBFORDNAL[SEND$ACB] ; 
          BLINK(BUFADDR,SEND$ACB) ;      # LINK IT TO ACB OF MASTER    #
          CLEARFNT = TRUE ; 
          END                       # NOT O.K.                         #
        ELSE                        # IF WL BEEN SUSPENDED, NO STATE   #
          NEWSTATE[0] = CURST ;     # CHANGED. WL WILL BE RE-PROCESSED #
        END 
  
      GOTO FEND ; 
RSFM:                        # SWITCH FILE TO MASTER  APPLICATION      #
                             # FNT/IAR/R OR FNT/IFR/R GET REPROCESSED  #
                             # FILE NEEDS TO BE SENT TO MASTER         #
      PTNR$ACB = ATACBA[ACBPTNRAN[SEND$ACB]] ;   # ACB OF SLAVE        #
      SWFTOAP(SEND$ACB,REASON) ;              # SWITCH FILE TO MASTER  #
  
      IF REASON EQ 0
      THEN
        BEGIN                # EVERYTHING WENT O.K. THIS TIME          #
                                  # UPDATE ACB FOR SLAVE               #
        CREATB ;                  # GET BUFFER FOR FNT/NORMAL RESPONSE #
        PFCSFC[0]  = CURPFCSFC ;
        RB[0]      = TRUE ;       # SET THE NORMAL RESPONSE BIT        #
        FNTFNTO[0] = ACBFORDNAL[SEND$ACB] ; 
        BLINK(BUFADDR,SEND$ACB) ;      # LINK IT TO SLAVE              #
        IF PFCSFC[0] EQ FNTIFRN 
        THEN
          BEGIN 
          NEWSTATE[0] = FNTIDLE ;      # READY FOR ANOTHER FILE        #
          ACBFNTW1  [SEND$ACB] = 0 ;   # CLEAR THE FILE NAME/ORDINAL   #
          ACBMREQABT[SEND$ACB] = FALSE ;   # CLEAR MASTER REQUEST ABT  #
          ACBFNTW1  [PTNR$ACB] = 0 ;   # CLEAR THE FILE NAME/ORDINAL   #
          ACBMREQABT[PTNR$ACB] = FALSE ;   # CLEAR MASTER REQUEST ABT  #
          END 
        ELSE
          CLEARFNT = TRUE ;            # IT IS FNT/IAR/N, CLEAR INFORMA#
        END                       # EVERYTHING WENT O.K. THIS TIME     #
      ELSE
        BEGIN                     # NOT O.K.                           #
        IF DONE 
        THEN                      # WORKLIST DIDNOT GET SUSPENDED      #
          BEGIN 
          CIORETF(SEND$ACB) ;     # RETURN FILE TO CIO                 #
          CREATB ;             # GET BUFFER TO SEND ABNORMAL TO MASTER #
          PFCSFC[0]  = CURPFCSFC ;  # SEND FNT/IAR/A OR FNT/IFR/A TO MS#
          EB[0]      = TRUE ;          # SET THE ABNORMAL BIT          #
          FNTFNTO[0] = ACBFORDNAL[SEND$ACB] ; 
          RC[0] = RFL"RERR" ;          # COULD NOT PUT FILE BACK TO MST#
          BLINK(BUFADDR,SEND$ACB) ;    # LINK IT TO ACB OF MASTER      #
          CLEARFNT = TRUE ; 
          END                       # NOT O.K.                         #
        ELSE
          NEWSTATE[0] = CURST ;        # NO STATE CHANGED, WL SUSPENDED#
        END 
  
      GOTO FEND ; 
SMRA:                             # MASTER SENDS FNT/IAR/R TO REQUEST  #
                                  # SLAVE APPL. NETOFF.                #
  
      PTNR$ACB = ATACBA[ACBPTNRAN[SEND$ACB]] ;        # ACB OF PARTNER #
  
      ACBSLVGONE[SEND$ACB] = FALSE ;  # CLEAR SLAVE IS GONE FLAG       #
      ACBIARRC  [SEND$ACB] = 0 ;      # CLEAR REASON CODE FIELD        #
  
      ACBMREQABT[PTNR$ACB] = TRUE ; # SET MASTER REQUEST SLAVE TO ABORT#
                                  # FLAG IN SLAVE  ACB                 #
      ATASBI[ACBAN[SEND$ACB]] = TRUE ;               # FORCE THIS TO T #
      ATASBS[ACBAN[SEND$ACB]] = TRUE ;               # SET SWAP OUT BIT#
      DONE = FALSE ;              # SUSPEND TO PROCESS WL FOR MASTER   #
  
      GOTO FEND ; 
CIOR: 
      PTNR$ACB = ATACBA[ACBPTNRAN[SEND$ACB]] ;        # ACB OF PARTNER #
  
      CIORETF(SEND$ACB) ;         # DO CIO RETURN ON FILE, FILE AT NIP #
      GOTO FEND ; 
  
SFTN:                             # SLAVE NETTING OFF, SWITCH FILE TO  #
                                  # NIP                                #
  
      PTNR$ACB = ATACBA[ACBPTNRAN[SEND$ACB]] ;        # ACB OF PARTNER #
      SWFTON(SEND$ACB,REASON) ; 
      ACBSLVGONE[PTNR$ACB] = TRUE ;    # SLAVE IS GONE FLAG TO TRUE    #
      IF REASON NQ 0
      THEN
        BEGIN                # SST REQUEST WAS NO O.K.                 #
        NEWSTATE[0] = FNTLOST ;        # CHANGE TO STATE 5, INSTEAD 4  #
        DONE = TRUE ;                  # WORKLIST COMPLETED            #
        END 
      ELSE
        BEGIN                     # FILE IS AT NIP CP                  #
        ACBFNTANIP[PTNR$ACB] = TRUE ;  # SET FILE IS AT NIP FLAG       #
        ACBIARRC  [PTNR$ACB] = 0 ;
        END                       # FILE IS AT NIP CP                  #
  
      GOTO FEND ; 
  
SOFM:                        # SLAVE NETOFF AFTER MASTER REQUEST SLAVE #
                             # TO NETOFF IA FNT/IAR/R (PROCESS BY SMRA)#
                             # SWITCH FILE FROM SLAVE TO NIP THEN TO   #
                             # MASTER, AND SEND FNT/IAR/N              #
      PTNR$ACB = ATACBA[ACBPTNRAN[SEND$ACB]] ;        # ACB OF MASTER  #
      SWFTON(SEND$ACB,REASON) ;        # SWITCH FILE FROM SLAVE TO NIP #
      ACBSLVGONE[PTNR$ACB] = TRUE ;    # SLAVE IS GONE NOW IN MASTER   #
      IF REASON NQ 0
      THEN
        ACBIARRC[PTNR$ACB] = RFL"RERR" ;     # RETURN ERROR REASON CODE#
      ELSE
        BEGIN 
        ACBIARRC  [PTNR$ACB] = 0 ;
        ACBFNTANIP[PTNR$ACB] = TRUE ;  # SET FILE IS AT NIP FLAG       #
        END 
      DONE = TRUE ;                    # SLAVE WL COMPLETED            #
  
      GOTO FEND ; 
  
PABT:                        # PARTNER APPLICATION ABORTED             #
      PTNR$ACB = ATACBA[ACBPTNRAN[SEND$ACB]] ;        # ACB OF PARTNER #
      CLEARFNT = TRUE ; 
  
      GOTO FEND ; 
SDXA:                             # MASTER OR SLAVE ABORTED BEFORE     #
                                  # FNT/DMS/R OR FNT/DSM/R RECEIVED    #
      CREATB ;                    # GET BUFFER FOR ABNORMAL S.M.       #
      PFCSFC[0] = CURPFCSFC ; 
      EB[0]     = TRUE ;          # MAKE THIS IS AN ABNORMAL S.M.      #
      RC[0]     = MSR"UNA" ;      # RC = PARTNER UNAVAILABLE           #
      CLEARFNT = TRUE ; 
      BLINK(BUFADDR,SEND$ACB) ;   # SEND IT TO SENDING APPL.           #
      GOTO FEND ; 
  
RIAR:                             # RE-PROCESS FNT/IAR/R TO SWITCH FILE#
                                  # FROM NIP C.P. TO MASTER            #
      IF ACBSLVGONE[SEND$ACB] 
      THEN
        BEGIN                     # SLAVE IS GONE NOW, FILE MAY BE AT  #
        IF ACBIARRC[SEND$ACB] EQ 0                 # NIP CONTROL POINT #
        THEN
          BEGIN                # FILE IS AT NIP CP, SWITCH IT TO MASTER#
          SWFTOAP(SEND$ACB,REASON) ;        #   SWITCH FILE TO MASTER  #
          IF REASON NQ 0
          THEN                    # FILE STILL AT NP CP. RETURN IT     #
            CIORETF(SEND$ACB) ;   # CAN NOT PUT THE FILE BACK TO MASTER#
          END 
        ELSE
          REASON = ACBIARRC[SEND$ACB] ; 
  
        DONE = TRUE ;             # FORCE IT TO BE DONE                #
        CREATB ;               # GET BUFFER FOR FNT/IAR/N OR FNT/IAR/A #
        IF REASON NQ 0
        THEN
          BEGIN 
          PFCSFC[0] = FNTIARA ;   # SEND FNT/IAR/A WITH RC = RERR      #
          RC[0]     = RFL"RERR" ; # ERROR OCCURED IN RETURNNING FILE   #
          END 
        ELSE
          BEGIN 
          PFCSFC[0] = FNTIARN ; 
          END 
  
        CLEARFNT = TRUE ;         # CLEAR ALL FNT RELATED INFORMATIONS #
  
        FNTFNTO[0] = ACBFORDNAL[SEND$ACB] ; 
        BLINK(BUFADDR,SEND$ACB) ;      # LINK THIS SM TO MASTER ACB    #
        END 
      ELSE
        BEGIN                     # CONTINUE TO SUSPEND THIS WL TIL SLV#
        DONE = FALSE ;                                # IS GONE        #
        ATASBI[ACBAN[SEND$ACB]] = TRUE ;             # FORCE THIS TO T #
        ATASBS[ACBAN[SEND$ACB]] = TRUE ;             # SET SWAP OUT BIT#
        NEWSTATE[0] = CURST ;     # STAY AT THE SAME STATE             #
        END 
  
      GOTO FEND ; 
  
SBIM:                             # SET BITS IN MASTER TO HAVE FNT/IAR #
                                  # WL REPROCESSED                     #
  
      DONE = FALSE ;              # CONTINUE TO SUSPEND THIS WL UNTIL  #
                                  # SLAVE IS GONE                      #
      ATASBI[ACBAN[SEND$ACB]] = TRUE ;               # FORCE THIS TO T #
      ATASBS[ACBAN[SEND$ACB]] = TRUE ;               # SET SWAP OUT BIT#
  
      GOTO FEND ; 
  
IMSA:                        # INFORM MASTER SLAVE ABORTED I.E. SET    #
                             # FLAGS AND REASON ODE IN MASTER ACB      #
      PTNR$ACB = ATACBA[ACBPTNRAN[SEND$ACB]] ;        # ACB OF MASTER  #
      ACBSLVGONE[PTNR$ACB] = TRUE ;    # SLAVE IS GONE NOW IN MASTER   #
      ACBIARRC[PTNR$ACB] = RFL"RERR" ;       # RETURN ERROR REASON CODE#
  
      GOTO FEND ; 
SPAP:                        # SET PARTNER AB ADDRESS POINTER          #
  
      PTNR$ACB = ATACBA[ACBPTNRAN[SEND$ACB]] ;        # ACB OF MASTER  #
      GOTO FEND ; 
RFWE:                        # RETURN FILE WITH ERROR, BEFORE OR DURING#
                             # PROCESSING FNT/ILF/R, SLAVE ABORTED,    #
                             # RETURN IFL/A RC=PERR AND RETURN FILE TO #
                             # MASTER IF FILE IS ALREADY AT NIP CP.    #
      IF ACBFNTANIP[SEND$ACB] 
      THEN
        BEGIN                     # FILE IS AT NIP CP                  #
        SWFTOAP(SEND$ACB,REASON) ;            # SWITCH FILE TO MASTER  #
        IF REASON NQ 0
        THEN
          BEGIN              # CAN NOT SEND FILE BACK TO MASTER, CIO IT#
          CIORETF(SEND$ACB) ; 
          END 
        END                       # FILE IS AT NIP CP                  #
      CREATB ;                    # GET BUFFER FOR ABNORMAL S.M.       #
      PFCSFC[0] = FNTIFLA ; 
      RC[0]     = RFL"PERR" ;     # RC = PARTNER UNAVAILABLE           #
      FNTFNTO[0] = ACBFORDNAL[SEND$ACB] ; 
      BLINK(BUFADDR,SEND$ACB) ;   # SEND IT TO SENDING APPL.           #
      CLEARFNT = TRUE ; 
      GOTO FEND ; 
  
ABRF:                        # ABNORMAL RSP RETURN FILE. BEFORE OR DUR-#
                             # ING PROCESSING FNT/ILR/R, SLAVE ABORTED,#
                             # RETURN IFR/A RC=RERR AND RETURN FILE TO #
                             # MASTER IF FILE IS ALREADY AT NIP CP.    #
      CREATB ;                    # GET BUFFER FOR ABNORMAL S.M.       #
      IF ACBFNTANIP[SEND$ACB] 
      THEN
        BEGIN                     # FILE IS AT NIP CP                  #
        SWFTOAP(SEND$ACB,REASON) ;            # SWITCH FILE TO MASTER  #
        IF REASON NQ 0
        THEN
          BEGIN              # CAN NOT SEND FILE BACK TO MASTER, CIO IT#
          CIORETF(SEND$ACB) ; 
          PFCSFC[0] = FNTIFRA ; 
          RC [0] = RFL"RERR" ;         # NO FILE BACK TO MASTER        #
          END 
        ELSE
          BEGIN              # FILE WENT BACK TO MASTER OK             #
          PFCSFC[0] = FNTIFRN ; 
          END                # FILE WENT BACK TO MASTER OK             #
        END                       # FILE IS AT NIP CP                  #
      ELSE
        BEGIN                     # FILE IS NOT AT NIP                 #
        PFCSFC[0] = FNTIFRA ; 
        RC[0]     = RFL"RERR" ; 
        END 
      FNTFNTO[0] = ACBFORDNAL[SEND$ACB] ; 
      BLINK(BUFADDR,SEND$ACB) ;   # SEND IT TO SENDING APPL.           #
      CLEARFNT = TRUE ; 
      GOTO FEND ; 
  
FEND: 
  
      IF CLEARFNT 
      THEN
        BEGIN                     # CLEAR ALL FNT WORD IN ACB'S        #
        ACBFNTW0[SEND$ACB] = 0 ;
        ACBFNTW1[SEND$ACB] = 0 ;
        IF PTNR$ACB NQ 0
        THEN
          BEGIN                   # ACB OF PARTNER APPLICATION         #
          ACBFNTW0[PTNR$ACB] = 0 ;
          ACBFNTW1[PTNR$ACB] = 0 ;
          END 
        END 
      ELSE
        BEGIN 
                                  # UPDATE STATE/TRIGGER FOR SENDING AP#
        ACBFNTLST[SEND$ACB] = ACBFNTST[SEND$ACB] ;
        ACBFNTLTR[SEND$ACB] = ACBFNTCTR[SEND$ACB] ; 
        ACBFNTST [SEND$ACB] = NEWSTATE[0] ; 
        ACBFNTCTR[SEND$ACB] = PARAMS1 ; 
                                  # UPDATE STATE/TRIGGER FOR PARTNER AP#
        IF PTNR$ACB NQ 0
        THEN
          BEGIN 
          ACBFNTLST[PTNR$ACB] = ACBFNTST[SEND$ACB] ;
          ACBFNTLTR[PTNR$ACB] = ACBFNTCTR[SEND$ACB] ; 
          ACBFNTST [PTNR$ACB] = NEWSTATE[0] ; 
          ACBFNTCTR[PTNR$ACB] = PARAMS1 ; 
          END 
        END 
  
      GOTO RJMAIN ; 
  
      END                           # LEGAL TRIGGER                    #
    ELSE
      BEGIN                         # ILLEGAL TRIGGER                  #
      ILL$MASTER[0] = ACBJOBSQN[SEND$ACB] ; 
      IF PTNR$ACB NQ 0
      THEN
        ILL$SLAVE [0] = ACBJOBSQN[PTNR$ACB] ; 
      ELSE
        ILL$SLAVE [0] = "    " ;
      SCRATCH       = XCDD(TRIGGER) ; # CONVERT TRIGGER NUM TO DISPLAY #
      ILL$MSG$TR[0] = C<8,2> SCRATCH ;
      SCRATCH       = XCDD(CURST) ;   # CONVERT STATE NUM TO DISPLAY   #
      ILL$MSG$ST[0] = C<8,2> SCRATCH ;
      OMSG (ILL$TRG$MSG,0) ;
      IF PARAMS3 NQ 0 
      THEN
        BEGIN 
        CREATB ;                       # GET BUFFER FOR THE RESPONSE SM#
        PFCSFC[0] = CURPFCSFC ; 
        RC[0]     = RFL"ILSQ" ; 
        EB[0]     = TRUE ;            # AB-NORMAL RESPONSE             #
        BLINK(BUFADDR,SEND$ACB) ;     # SEND MESSAGE TO APPLICATION    #
        END 
      GOTO RJMAIN ; 
      END                           # ILLEGAL TRIGGERS                 #
  
  
                                                 CONTROL EJECT; 
  
  
      PROC SWFTON(ACBD,REASON) ;
# 
      SWITCH FILE FROM APPLICATION CONTROL POINT TO NIP CONTROL POINT 
# 
  
      ITEM ACBD U ;                # ACB ADDRESS                       #
      ITEM PTNR U ;                # ACB OF PARTNER                    #
      ITEM REASON U ;              # REASON CODE RETURNED              #
  
        BEGIN                        # SWITCH FILE TO NIP C.P.         #
        SSTPARAM[0] = 0;                   # CLEAR SST PARAMETER WORD  #
        SSTFNTS[0]  = ACBFORDNAL[ACBD] ;   # FILE ORDINAL              #
        SSTFC[0]    = SSTSQFFUCP;          # SST FUNCTION CODE         #
        SSTJOBID[0] = ACBJNWD[ACBD] ;      # ADD JOB IDENTIFICATION    #
        SSTPADDR[0] = LOC(SSTPARAM[0]);    # FWA OF SST PARAMETER BLOCK#
  
  
        OSREQ(SSTCALL[0]);           # ISSUE SST RA+1 CALL             #
  
        REASON = SSTRC[0];           # SST COMPLETION STATUS           #
        PTNR = ATACBA[ACBPTNRAN[ACBD]] ;        # ACB OF PARTNER       #
  
        IF REASON NQ 0
        THEN                         # SST ERROR PROCESSING            #
          BEGIN 
          INDEX = REASON/8; 
          D14M2[0] = INDEX*O"100" + REASON - INDEX*8 + O"3333"; 
          D14M3[0] = SSTJSN[0]; 
          OMSG(DFMSG14,0);             # DAYFILE SST RETURN STATUS     #
  
          IF REASON EQ RC$UCPSO OR   # APP SWAPPED OUT BY OS           #
             REASON EQ RC$UCPNF      # APP FAILED                      #
          THEN
            BEGIN 
  
            IF REASON EQ RC$UCPSO 
            THEN                     # RESUME HOST WORKLIST PROC       #
              BEGIN                  # WHEN APP IS SWAPPED BACK IN     #
              IF ACBFNTMAS[ACBD]          # THIS IS THE MASTER         #
              THEN
                BEGIN 
                ATASBS[ACBAN[ACBD]] = TRUE;        # APP SWAPPED OUT   #
                ATASBI[ACBAN[ACBD]] = TRUE ;       # FORCE THIS TO T   #
                END 
              ELSE
                BEGIN 
                ATASBS[ACBAN[PTNR]] = TRUE;          # APP SWAPPED OUT #
                ATASBI[ACBAN[PTNR]] = TRUE ;         # FORCE THIS TO T #
                END 
  
              OSCHAPP(ACBD) ;          # SCHEDULE APPLICATION          #
              END 
            DONE = FALSE ;           # SUSPEND THE WORKLIST PROCESSING #
            END 
          END 
        ELSE
          BEGIN                        # FILE SWITCHING WENT O.K.      #
          ACBFORDNAL[ACBD] = SSTFNTR[0] ; # UPDATE THE ORDINAL OF FILE #
          ACBFORDNAL[PTNR] = SSTFNTR[0] ; 
          END 
  
        RETURN ;
        END 
  
                                       CONTROL EJECT ;
  
      PROC CIORETF(ACBD) ;             # ISSUE CIO (070) RETURN FILE   #
      ITEM ACBD U ;                    # ACB ADDRESS                   #
        BEGIN                          # RETFILE                       #
  
        P<DRHDRWD> = LOC(RELBUFF) ; 
        P<PARAMB>  = P<DRHDRWD> + BLKHSIZE ;
        RELBID     = CPCRIDVALUE ;
        RELBBS     = PARSIZE + BLKHSIZE ; 
                                        # PARAMETER BLOCK ADDRESS      #
        FET$LFN   [0] = ACBFNTFILE [ACBD]; # LOCAL FILE NAME           #
        REQWORD   [0] = 0;           # ZERO PP CALL WORD               #
        PADDR     [0] = P<PARAMB>;
        PPNAME    [0] = PP$CIO; 
        FET$STAT  [0] = CIORETURN;   # CIO FUNCTION REQUEST CODE       #
        FET$UP    [0] = TRUE;        # SET USER PROCESSING FLAG        #
        FET$EP    [0] = TRUE;        # SET ERROR PROCESSING FLAG       #
        FET$CIOFNT[0] = ACBFORDNAL[ACBD] ;
  
        OSREQ(REQWORD[0]) ;          # ISSUE THE OS CALL               #
        RETURN ;
        END 
  
                                       CONTROL EJECT ;
  
      PROC SWFTOAP(ACBD,REASON) ; 
# 
      SWITCH FILE FROM NIP CONTROL POINT TO APPLICATION CONTROL POINT 
# 
  
      ITEM ACBD   U ;              # ACB ADDRESS                       #
      ITEM PTNR   U ;              # ACB OF PARTNER                    #
      ITEM FNTORD U ;              # ORDINAL OF FILE                   #
      ITEM INDEX    ; 
      ITEM REASON U ;              # REASON CODE RETURNED              #
  
  
      BEGIN                        # BEGIN OF SWFTOAP                  #
  
      SSTPARAM[0] = 0;                 # CLEAR SST PARAMETER WORD      #
      SSTFNTS [0] = ACBFORDNAL[ACBD] ;    # FILE-S FNT ORDINAL IN NAM  #
      SSTFC   [0] = SSTSQFTUCP;           # SST FUNCTION CODE          #
      SSTJOBID[0] = ACBJNWD[ACBD] ;    # APP JOB IDENTIFICATION        #
      SSTPADDR[0] = LOC(SSTPARAM[0]);  # FWA OF SST PARAMETER BLOCK    #
  
  
#     IF ATASBSO[ACBAN[ACBD]] #        # APPLICATION SWAPPED OUT       #
#     THEN    # 
#       BEGIN # 
#       REASON = RC$UCPSO #            # NO NEED TO ISSUE SST CALL     #
#       END   # 
#     ELSE    # 
        BEGIN 
        OSREQ(SSTCALL[0]);             # ISSUE SST RA+1 CALL           #
        REASON = SSTRC[0];             # SST COMPLETION STATUS         #
        END 
  
      PTNR = ATACBA[ACBPTNRAN[ACBD]] ;
  
      IF REASON NQ 0
      THEN                             # SST ERROR PROCESSING          #
        BEGIN 
        INDEX = REASON/8; 
        D14M2[0] = INDEX*O"100" + REASON - INDEX*8 + O"3333"; 
        D14M3[0] = SSTJSN[0]; 
        OMSG(DFMSG14,0);             # DAYFILE SST RETURN STATUS       #
  
        IF REASON EQ RC$UCPSO OR       # APP SWAPPED OUT BY OS         #
           REASON EQ RC$UCPNF          # APP FAILED                    #
        THEN
          BEGIN 
          IF REASON EQ RC$UCPSO 
          THEN                     # RESUME HOST WORKLIST PROC         #
            BEGIN                  # WHEN APP IS SWAPPED BACK IN       #
            IF ACBFNTMAS[ACBD]              # THIS IS THE MASTER       #
            THEN
              BEGIN 
              ATASBS[ACBAN[ACBD]] = TRUE;            # APP SWAPPED OUT #
              ATASBI[ACBAN[ACBD]] = TRUE ;           # FORCE THIS TO T #
              END 
            ELSE
              BEGIN 
              ATASBS[ACBAN[PTNR]] = TRUE;            # APP SWAPPED OUT #
              ATASBI[ACBAN[PTNR]] = TRUE ;           # FORCE THIS TO T #
              END 
  
            OSCHAPP(ACBD) ;        # SCHEDULE APPLICATION              #
            END 
          ELSE
            FAILADR = ACBD ;           # APPLICATION-S ACB ADDRESS     #
          DONE = FALSE ;           # SUSPEND THE WORKLIST PROCESSING   #
          END 
        END 
      ELSE
        BEGIN                          # FILE SWITCHING WENT O.K.      #
        ACBFORDNAL[ACBD] = SSTFNTR[0] ;   # UPDATE THE ORDINAL IN APP1 #
        ACBFORDNAL[PTNR] = SSTFNTR[0] ;   # UPDATE THE ORDINAL IN APP2 #
        END 
  
      RETURN ;
  
      END 
  
                                       CONTROL EJECT; 
  
  
      PROC CREATB ; 
        BEGIN                          # CREATB                        #
        MGETS(LFNTRSP+BLKHSIZE+ABHSIZE,BUFADDR,TRUE) ; # GET BUFFER FOR#
                                            #    RESPONSE  S.M.        #
        P<AHEADER> = BUFADDR + BLKHSIZE ; 
        ABHABT [0] = APPCMD ; 
        ABHACT [0] = CT60TRANS ;
        ABHTLC [0] = LFNTRSP ;
        P<SUPMSG> = P<AHEADER> + ABHSIZE ;
  
        RETURN ;
        END                            # CREATB                        #
    END 
    TERM
