*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 = PTAT[0] ; # APPLICATION TABLE # P = 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 = PARAMS3 ; P = P ; 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 = 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 = LOC(RELBUFF) ; P = P + 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; 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 = BUFADDR + BLKHSIZE ; ABHABT [0] = APPCMD ; ABHACT [0] = CT60TRANS ; ABHTLC [0] = LFNTRSP ; P = P + ABHSIZE ; RETURN ; END # CREATB # END TERM