ASMB,R,Q,C,Z IFZ HED #MSSM 91750-1X020 REV 2013 * (C) HEWLETT-PACKARD CO. 1980 NAM #MSSM,7 91750-1X020 REV.2013 801013 RTE-IVB W/S.M. XIF IFN HED #MSSM 91750-1X021 REV 2013 * (C) HEWLETT-PACKARD CO. 1980 NAM #MSSM,7 91750-1X021 REV.2013 801013 ALL, W/O S.M. XIF * * "Z" OPTION FOR SESSION MONITOR NODE, "N" OPTION IF NON-SESSION NODE. SPC 1 ****************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* * * THE PRIOR WRITTEN CONSENT OF THE HEWLETT-PACKARD COMPANY. * ****************************************************************** SPC 1 ENT #MSSM,#NAT,#NASR,#OVR,D$OVR,#DFSN,#NEWX * EXT SESSN,RNRQ,#RSAX,#LDEF,#TBRN,$OPSY,#POOL,#IDSG EXT #RQB,PGMAD,LUTRU,.CBT,.MVW,#MHCT,LOGLU,#NODE EXT #BREJ,#NRVS,#GRPM,EXEC,#OTCV,#LEVL,$DSCS,XLUEX RQB EQU #RQB IFN EXT $LIBR,$LIBX XIF IFZ EXT ISMVE,$SMII XIF * * NAME: #MSSM * SOURCE: 91750-18020 * RELOC: PART OF 91750-12014 ("Z"), -12015 ("N") * PGMR: JIM HARTSELL * * SUBROUTINES TO PERFORM OPTIONAL SESSION-MONITOR PROCESSING * OF DS/1000 REQUESTS FOR THE #MAST MODULE. * * THIS MODULE, CALLED BY #MAST, IS APPENDED TO USER PROGRAMS FOR * RFA, DEXEC, PTOP, DLIST, AND DMESS REQUESTS. IT CONTAINS THE * NETWORK ACCOUNT TABLE WHICH IS USED TO KEEP TRACK OF EVERY REMOTE * NODE ACCESSED BY THIS USER AND THE SESSION ID AT THAT NODE. THE * SESSION ID CAN BE 0 (NO SESSION MONITOR AT THE NODE) OR 254 (SPECIAL * NON-SESSION ACCESS TO SESSION MONITOR NODE). * * ********************************************************** * * * * * R E M O T E S E S S I O N O V E R R I D E * * * * * * < FOR OVERRIDE, USER MUST SET (EXT) #OVR NON-ZERO > * * * < #MSSM DOES NOT RESET #OVR > * * * * * ********************************************************** SKP * * CALLING SEQUENCES: * * STORE SOURCE AND DESTINATION SESSION ID IN REQUEST, IF APPLICABLE. * IF DESTINATION NODE = SOURCE NODE, SET DESTINATION SESSION ID = * SOURCE SESSION ID. IF DEST ID IS NOT IN NETWORK ACCOUNT TABLE, * LOOK FOR FATHER PROGRAM WITH A REMOTE SESSION ID AND BUILD * LOCAL NAT ENTRY. IF NO FATHER SESSION, LOOK FOR LOCAL SESSION * ID IN #POOL AND BUILD NAT ENTRY (SESSION WAS CREATED FROM * REMOTE NODE). NEXT, SEE IF PROGRAM WAS SCHEDULED IN A NON-SESSION * NODE FROM A SESSION NODE AND BUILD NAT ENTRY IF APPLICABLE. * IF NONE OF THE ABOVE, SET FLAG TO TELL "#MSDF" THAT THE REPLY WILL * CONTAIN A DEFAULT SESSION ID AND IF SO, A NAT ENTRY WILL BE NEEDED. * * CLA * JSB #MSSM * P+1 ERROR RETURN. (A,B) = ASCII ERROR CODE. * P+2 NORMAL RETURN. * * * * RETRIEVE DEFAULT SESSION ID FROM REPLY IF FLAG IS SET AND * BUILD NETWORK ACCOUNT TABLE AND PROCESS NUMBER LIST ENTRIES: * * CLA,INA * JSB #MSSM * * * FIND SPECIFIC ENTRY FOR A NODE NUMBER OR NEXT AVAILABLE ENTRY * IN THE NETWORK ACCOUNT TABLE. * * (A) = NODE NUMBER, OR ZERO TO FIND AVAILABLE ENTRY. * JSB #NASR * (A) = SESSION ID * (B) = ADDR OF ENTRY, ZERO IF NOT FOUND. SKP * GLBLK-START * ****************************************************************** * * * G L O B A L B L O C K REV 2013 791213 * * * * GLOBAL OFFSETS INTO DS/1000 MESSAGE BUFFERS, USED BY: * * * * REMAT, RFMST, DEXEC, DMESS, FLOAD, POPEN, #MAST * * GET, #SLAV, RQCNV, RPCNV, GRPM, DINIT, PTOPM * * EXECM, EXECW, OPERM, RFAM1, RFAM2, DLIST, DLIS3 * * DSTIO, LUMAP, #CMGT, INCNV, OTCNV, RMTIO * * RSM, DLGON, #DISM, #DSSM, #MSSM, #SCSM, #UPSM * ****************************************************************** * ***!!!!! THE ORDER OF THE FIRST 8 WORDS (#STR THRU #LVL) IS * ***!!!!! FIXED BY THE REQUIREMENT THAT THE STREAM, ADDRESSES * ***!!!!! ERROR CODES & LEVEL # ALWAYS BE IN THE SAME PLACE, * ***!!!!! REGARDLESS OF MESSAGE FORMAT. THIS ALSO MAKES * ***!!!!! STORE-AND-FORWARD CODE MUCH SIMPLER. * #STR EQU 0 STREAM WORD. #SEQ EQU #STR+1 SEQUENCE NUMBER. #SRC EQU #SEQ+1 SOURCE NODE #. #DST EQU #SRC+1 DEST. NODE #. #EC1 EQU #DST+1 REPLY ECOD1. #EC2 EQU #EC1+1 REPLY ECOD2. #ENO EQU #EC2+1 NUMBER OF NODE REPORTING ERROR. #ECQ EQU #ENO+1 ERROR CODE QUALIFIER (BITS 4 TO 7) #LVL EQU #ECQ MESSAGE FORMAT LEVEL (BITS 0 TO 3) * #MAS EQU #LVL+1 MA "SEND" SEQ. # #MAR EQU #MAS+1 MA "RECV" SEQ. # #MAC EQU #MAR+1 MA "CANCEL" FLAGS #HCT EQU #MAC+1 HOP COUNT #SID EQU #HCT+1 SESSION ID WORD * #EHD EQU #SID LAST ITEM OF HEADER #MHD EQU #EHD+1 MINIMUM HEADER SIZE #REQ EQU #MHD START OF REQUEST SPECIFIC AREA #REP EQU #MHD START OF REPLY SPECIFIC AREA * #MXR EQU #MHD+24 <<< MAXIMUM DS REQ/REPLY BUFFER SIZE >>> #LSZ EQU 2 <<< SIZE OF LOCAL APPENDAGE AREA >>> * ****************************************************************** * * GLBLK-END SKP * OPBLK-START * ****************************************************************** * * * O P R E Q B L O C K REV 2013 791119 * * * * OFFSETS INTO DS/1000 OPREQ MESSAGE BUFFERS, USED BY: * * * * DMESS, OPERM, RQCNV, RPCNV * * RSM, DLGON, #MSSM, #UPSM * ****************************************************************** * * OFFSETS INTO OPREQ REQUEST AND REPLY BUFFERS. * #CML EQU #REQ COMMAND LENGTH. #CMS EQU #CML+1 COMMAND STRING. #LGC EQU #CMS+1 LOGON REQUEST CODE #LNL EQU #LGC+1 LENGTH OF USER NAME #LUN EQU #LNL+1 LOGON USER NAME * #RLN EQU #REP REPLY LENGTH. #MSG EQU #RLN+1 REPLY MESSAGE. * * MAXIMUM SIZE OF OPREQ REQUEST/REPLY BUFFER. * #OLW EQU #CMS+23 M A X I M U M S I Z E ! ! ! * * OPBLK-END SKP * * STORE SOURCE AND DESTINATION SESSION IDENTIFIER (IF ANY) IN * REQUEST (SOURCE OR DESTINATION NODE MAY OR MAY NOT BE UNDER * SESSION MONITOR CONTROL). * * SESSION ID 0 = NO SESSION MONITOR * 1 = SPECIAL NON-SESSION ACCESS TO S.M. NODE * N>1 = NORMAL SESSION ID * SUP A EQU 0 B EQU 1 * #MSSM NOP SZA CHECK TYPE OF ENTRY. JMP MSDF GO RETRIEVE DEFAULT SESSION ID. * STA DFALT CLEAR "DEFAULT SESSION" FLAG. * JSB #NEWX CHECK FOR NEW EXECUTION. * LDA LOCID GET SAVED LOCAL SESSION ID. SSA IF NEGATIVE, GO DO FIRST-TIME FETCH JSB GTLOC OF LOCAL ID (EXCEPT FOR RTE-M3). * AND B377 ALF,ALF STORE SOURCE (LOCAL) ID IN LEFT BYTE STA B (CAN BE 254 IF FROM SYS CONSOLE IN LDA RQB+#SID A SESSION-MONITOR NODE) AND B377 IOR B STA RQB+#SID OF REQUEST SESSION ID WORD. * LDA RQB+#STR IF AND B77 CPA K7 REQUEST RSS JMP CKOVR FROM LDA RQB+#CML CPA K2 DLGON/DLGOF/DLGNS, RSS JMP CKOVR EXIT LDA RQB+#CMS CPA "XX" NOW. JMP RETRN * CKOVR LDA K254 TEST SPECIAL OVERRIDE FLAG. LDB #OVR SZB JMP STSID SET. ALLOW NON-SESSION ACCESS (ID=254). * LDA LOCID GET LOCAL (SOURCE) SESSION ID. LDB RQB+#DST IF REQUEST IS TO THE LOCAL NODE, CPB RQB+#SRC SET DESTINATION SID = JMP STSID SOURCE SID (NO NAT ENTRY). * LDA RQB+#DST SEE IF DEST NODE IS IN THIS USER'S JSB #NASR NETWORK ACCOUNT TABLE (NAT). SZB,RSS IF NOT, GO LOOK FOR ANCESTOR JMP FNROO THAT HAS AN ACTIVE SESSION, ETC. * JSB SEQCK FOUND. CHECK IF CORE-RES RESTART. JMP HAVE NO. * FNROO JSB ROOTS GO LOOK FOR ANCESTOR, ETC. * HAVE AND B377 ISOLATE DESTINATION SESSION ID. * SZA,RSS IF NO SESSION ID RETURNED, JMP RETRN RETURN TO CALLER. * LDB SLAVE USER SCHEDULED FROM A SZB SESSION AT REMOTE NODE? JMP STSID YES. GO STORE DEST. SESSION ID. * STA TEMP NO. SAVE DEST SID. VERIFY BY CCB SEARCHING PNL. ADB #LDEF ADDRESS OF PNL HEADER ADDRESS. LDB B,I GET ADDR OF FIRST ENTRY. STLST SZB,RSS END OF LIST? JMP GONE YES. DEST SID NOT FOUND. JSB LODWD NO. GET NEXT ADDRESS. STA NXTAD SAVE NEXT ADDRESS. ADB K4 POINT TO ID SEG ADDRESS. JSB LODWD GET IT. SSA JMP NXLST IGNORE BAD ENTRIES. INB POINT TO DEST SID WORD. JSB LODWD GET DEST SESSION ID. CPA TEMP SAME? JMP STSID YES. GO STORE SID IN REQUEST. NXLST LDB NXTAD NO. GET NEXT ADDRESS. JMP STLST GO CHECK NEXT ENTRY. * STSID AND B377 STORE DEST. SESSION ID IOR RQB+#SID IN RIGHT BYTE OF REQUEST STA RQB+#SID SESSION ID WORD. * JMP RETRN RETURN TO CALLER. SKP * ******************************************************************* * * THE FOLLOWING CODE IN SUBROUTINE #MSSM IS ONLY DONE ONCE * PER USER PROGRAM EXECUTION. * ******************************************************************* SPC 2 * * LOCAL USER HAS A NETWORK ACCOUNT TABLE (NAT) ENTRY FOR THE DESTINATION * NODE BUT THERE IS NO PROCESS NUMBER LIST (PNL) ENTRY (FOR THIS * PARTICULAR NODE). IF THE LOCAL PROGRAM OWNED THE REMOTE SESSION, THE * PROGRAM MUST BE MEMORY RESIDENT OR TERMINATED PREVIOUSLY WITH RESOURCE * SAVE. THE NAT ENTRY REPRESENTS A PRIOR-EXECUTION REMOTE SESSION THAT * WAS LOGGED OFF BY UPLIN (USER DID NOT LOG OFF). SINCE THIS IS A NEW * EXECUTION OF THE PROGRAM, RELEASE ALL NAT ENTRIES (AND NATX, IF ANY). * IF THE LOCAL PROGRAM IS A SON, WHERE A FATHER OWNED THE REMOTE SESSION, * CLEAR THE NAT ENTRY AND RETURN A "RS01" ERROR. * GONE LDA RQB+#DST JSB #NASR GET SESSION ID WORD. SSA,RSS DID FATHER OWN SESSION? JMP GONE1 NO. WE MUST BE A NEW EXECUTION. * CLA YES. RELEASE SINGLE NAT ENTRY. STA B,I JMP RS01 RETURN WITH "RS01" (SESSION GONE). * GONE1 JSB CLNAT RELEASE OLD NAT. * CLA CLEAR FLAGS. STA SLAVE STA XEQT INA SET FLAG TO SIGNAL "WAITING STA DFALT FOR DEFAULT SESSION. JMP RETRN RETURN TO CALLER. SKP * * PERFORM ONE-TIME RETRIEVAL OF LOCAL SESSION IDENTIFIER (IF ANY). * GTLOC NOP * CLA STA BUFR STA LOCID * JSB PGMAD GET USER'S ID SEG ADDR. DEF *+3 DEF BUFR DEF XEQT * JSB SESSN SEE IF UNDER SESSION. DEF *+2 DEF XEQT * SEZ,RSS RUNNING UNDER SESSION? JMP GTSID YES. GO GET SESSION ID. * JSB LOGLU NO. GET SYSTEM LU (NOT IN SESSION) DEF *+2 OF SCHEDULING TERMINAL. DEF TEMP DUMMY PARAM. (A) = LU. * LDB $DSCS IF THIS IS A SESSION-MONITOR SSB,RSS NODE, SET LOCAL SESSION ID = 254 LDA K254 FOR NON-SESSION "RETURN" ACCESS. STA LOCID SLAVE MONITOR "ATACH" WILL CHECK JMP GTLOC,I FIRST TO SEE IF IN A SESSION NODE. * GTSID STB TEMP GET SESSION TERM. LU (SESSION ID). * (MIGHT HAVE BEEN SCHEDULED BY EXECW * AND "LOGLU" WON'T DO.) IFZ JSB ISMVE MOVE DATA FROM SCB. DEF *+5 DEF TEMP SESSION WORD FROM ID SEG. DEF $SMII POINT TO SESSION IDENTIFIER. DEF LOCID LOCATION TO BE FILLED. DEF K1 GET 1 WORD. XIF * LDA LOCID GET LOCAL SESSION ID. JMP GTLOC,I GO STORE IN REQUEST BUFFER. SKP * * CHECK FOR NEW EXECUTION. * #NEWX NOP * JSB #IDSG GET PROGRAM SEQUENCE COUNTER DEF *+5 FROM USER'S ID SEGMENT. DEF K0 OURSELF. DEF K1 TENTATIVE ITEM NUMBER. DEF CNTR RETURNED SEQUENCE COUNTER. DEF TEMP RETURNED OP SYSTEM TYPE. * LDA TEMP IS THIS RTE-M3? CPA N5 JMP RTEM3 YES. WE DON'T HAVE PRG SEQ #. * LDA CNTR GET PROGRAM SEQUENCE COUNTER. CPA PGSEQ SAME AS BEFORE? (CAN BE ZERO). JMP #NEWX,I YES. RETURN. STA PGSEQ NO. SET NEW NUMBER. * JSB CLNAT RELEASE NETWORK ACCOUNT TABLE. * CCA RESET LOCAL ID (FOR ALL STA LOCID SYSTEMS EXCEPT RTE-MIII). * CLA CLEAR FLAG. STA SLAVE * JMP #NEWX,I RETURN TO CALLER. * PGSEQ OCT 0 CURRENT PROGRAM SEQUENCE NUMBER. * * ***** BEGIN SPECIAL CODE FOR RTE-MIII SYSTEMS ***** * * DETECT NEW EXECUTION AS FOLLOWS: IF THERE ARE NO ACTIVE PNL ENTRIES * FOR THIS PROCESS, AND THE USER WAS NOT SCHEDULED BY EXECW (IN A SLAVE * PROCESS), THEN IT IS SAFE TO CLEAR THE NAT. IN THIS CASE, IT WILL * EITHER BE A NEW EXECUTION OR ALL REMOTE SESSIONS HAVE BEEN LOGGED OFF. * IF RUNNING IN A SLAVE PROCESS, THE "EXECW SEQ #" WILL BE USED IN * "SEQCK" TO DETECT NEW EXECUTION. * NOTE: IF #OVR SET, THERE WILL BE NO PNL ENTRIES. * RTEM3 EQU * IFN LDA #OVR REMOTE SESSION OVERRIDE? SZA JMP #NEWX,I YES. FORGET NEW EXECUTION TEST. * JSB GTLOC GET LOCAL [SESSION] ID, IF ANY. * CLA CLEAR "HAVE PNL" FLAG. STA TEMP2 * JSB $LIBR GO PRIVILEDGED. NOP * CCB SEARCH PNL FOR AN ENTRY BELONGING ADB #LDEF TO THIS PROCESS. LDB B,I ADDRESS OF PNL HEADER. NEWX1 JSB LODWD GET ADDR OF NEXT PNL ENTRY. SZA,RSS JMP NEWX5 END OF LIST. * LDB A STB NXTAD SAVE ADDR OF NEXT PNL ENTRY ADDR. ADB K3 FIRST, CHECK IF THIS PNL IS FOR JSB LODWD THIS PROCESS (SAME TERMINAL LU). AND B377 CPA LOCID RSS JMP NEWX3 NO. * INB SECOND, CHECK IF GOOD PNL ENTRY. JSB LODWD SSA JMP NEWX3 NO. * CMA,INA THIRD, SEE IF OWNER IS ALIVE. STA TEMP * JSB PGMAD GET STATUS OF PROGRAM. DEF *+3 DEF BUFR DEF TEMP * SSB JMP NEWX2 TIME LIST. SZB,RSS JMP NEWX3 DORMANT. * NEWX2 CLB,INB SET "HAVE PNL" FLAG. STB TEMP2 * NEWX3 LDB NXTAD GO CHECK NEXT PNL ENTRY. JMP NEWX1 * NEWX5 LDA TEMP2 IS THERE A PNL FOR THIS PROCESS? SZA JMP LBEX YES. * LDA XEQT NO. CHECK IF PROGRAM SCHEDULED STA IDPTR FROM A REMOTE NODE (BY EXECW). * NEWX4 CLA STA BUFR LDA IDPTR CMA,INA STA TEMP * JSB PGMAD GET ID SEG ADDR OF FATHER. DEF *+6 DEF BUFR DEF TEMP DEF TEMP1 DEF TEMP1 DEF FATHR * LDA FATHR FATHER PROGRAM? SZA,RSS JMP NEWX9 NO. STA IDPTR YES. CMA,INA STA FATHR * JSB PGMAD GET FATHER'S NAME. DEF *+3 DEF BUFR DEF FATHR * LDA BUFAD IS HIS NAME EXECW? LDB @EXCW (IF SO, THE "EXECW SEQ #" IN THE JSB .CBT #POOL AND NAT ENTRIES WILL BE DEF K5 USED TO DETECT NEW EXECUTION.) NOP * JMP LBEX YES. "SEQCK" WILL CATCH NEW EXECUTION. NOP NO, JMP NEWX4 CHECK FOR FATHER'S FATHER. * NEWX9 JSB CLNAT RELEASE OLD NAT ENTRIES. CLA STA SLAVE CLEAR FLAG. * LBEX JSB $LIBX RETURN. DEF #NEWX * @EXCW DEF *+1 ASC 3,EXECW XIF JMP #NEWX,I INSURE AGAINST WRONG LIBRARY. * * ***** END SPECIAL CODE FOR RTE-MIII SYSTEMS ***** * * * SUBROUTINE TO RELEASE ALL NETWORK ACCOUNT TABLE ENTRIES. * CLNAT NOP LDB #NAT RELEASE OLD NAT ENTRIES. STB TEMP LDA NAT# STA CNTR * CLN1 LDA B,I WAS THIS NAT ENTRY IN USE? SZA,RSS ((B) = "TEMP") JMP NXENT NO. GO CHECK NEXT NAT ENTRY. ADB K2 YES. WAS THERE A NATX (IF REMAT)? LDA B,I CPA #DFSN (SKIP "DEFAULT SESSION") CLA CLB SZA STB A,I YES. RELEASE NATX ENTRY. CLA STA TEMP,I RELEASE NAT ENTRY. NXENT LDB TEMP BUMP TO NEXT NAT ENTRY. ADB K4 STB TEMP ISZ CNTR JMP CLN1 JMP CLNAT,I RETURN. SKP * * (REQUIRED ONLY FOR RTE-M BECAUSE IT HAS NO PROG SEQ CNT IN ID SEGMENT.) * CHECK FOR NEW EXECUTION OF A CORE RESIDENT PROGRAM SCHEDULED-WITH-WAIT * FROM A REMOTE NODE (IF THE NAT ENTRY FOR THE DESTINATION NODE HAS * A NON-ZERO "EXECW SEQ #", AND THERE IS NO #POOL ENTRY CONTAINING THIS * SEQ #, THEN THIS IS A NEW EXECUTION). * IF NEW EXECUTION, RELEASE ALL NETWORK ACCOUNT TABLE (NAT) ENTRIES. * SEQCK NOP (A) = DEST SID, (B) = ADDR OF NAT. STA SAVA SAVE (A) FOR P+1 EXIT. * ADB K3 LDA B,I GET "EXECW SEQ #" FROM NAT ENTRY. AND B377 SZA,RSS SCHEDULED BY EXECW? JMP EXIT1 NO. EXIT P+1. STA SEQNO YES. SAVE SEQUENCE NUMBER. * LDB #POOL GET ADDR OF SID POOL. SZB,RSS JMP EXIT1 GET OUT IF NONE. JSB LODWD STA CNTR SAVE NEG. # POOL ENTRIES. INB * SEQLP JSB LODWD GET NEXT "IN USE" POOL ENTRY. SSA,RSS JMP NXSEQ STB POOLA SAVE ADDR OF ENTRY. ADB K2 JSB LODWD GET EXECW SEQ #. ALF,ALF AND B377 CPA SEQNO SAME AS ONE IN NAT ENTRY? JMP EXIT1 YES. TAKE P+1 EXIT. LDB POOLA NO. * NXSEQ ADB POOSZ CHECK NEXT POOL ENTRY. ISZ CNTR JMP SEQLP * JSB CLNAT NOT FOUND. RELEASE ALL NAT ENTRIES. * ISZ SEQCK TAKE P+2 EXIT FOR NEW EXECUTION. EXIT1 LDA SAVA RESTORE SID FOR P+1 EXIT. JMP SEQCK,I RETURN TO CALLER. SKP ************************************************************************ * * R O O T S ********* R O O T S * ************************************************************************ * * FIRST, PERFORM ONE-TIME SEARCH FOR AN ANCESTOR IN A SCHEDULE-WITH-WAIT * CHAIN THAT ALREADY HAS A SESSION ESTABLISHED AT THE DESTINATION * NODE. IF FOUND, LATCH THIS USER ONTO THAT SESSION. * ROOTS NOP LDA XEQT SET POINTER TO THIS STA IDPTR USER'S ID SEGMENT. CLA CLEAR "SCHEDULED FROM STA SLAVE REMOTE SESSION" FLAG. STA SEQNO CLEAR "EXECW SEQ #". * CHKFW CLA SIGNAL PGMAD ROUTINE. STA BUFR LDA IDPTR CMA,INA STA TEMP * JSB PGMAD FIND ID SEG ADDR OF NEXT ANCESTOR. DEF *+6 BUFAD DEF BUFR DEF TEMP NEGATIVE ID SEGMENT ADDRESS. DEF TEMP1 DUMMY. DEF TEMP1 DUMMY. DEF FATHR RETURNED ID SEG ADDR OF FATHER. * LDA FATHR NEXT ANCESTOR WAITING? SZA,RSS JMP FPOOL NO. CHECK SESSION ID POOL. STA IDPTR YES. * LDB #LDEF SEARCH PROCESS NUMBER LIST (PNL) ADB N1 FOR ANCESTOR'S IDSEG ADDR. LDB B,I ADDR OF PNL HEADER. JSB LODWD IF NO PNL ENTRIES, NO SZA,RSS SENSE IN CHASING DOWN JMP FPOOL FATHER PROGRAMS. * PNLST JSB LODWD (CROSS) LOAD ADDR OF NEXT PNL ENTRY. SZA,RSS (A) = ADDR OF NEXT ENTRY. JMP CHKFW NOT FOUND. CHECK NEXT ANCESTOR. * LDB A POINT TO 5TH WORD IN PNL ENTRY. ADB K4 JSB LODWD (CROSS) LOAD 5TH WORD. CPA IDPTR DO IDSEG ADDRESSES MATCH? JMP CKNOD YES. GO CHECK NODE NUMBER. * ADB N4 NO (ALSO NO MATCH IF "BAD ENTRY" JMP PNLST BIT IS SET IN PNL ENTRY). * CKNOD ADB N2 POINT TO REMOTE NODE # IN PNL. LDA RQB+#DST GET REQUESTED NODE NUMBER. STA TEMP1 SAVE FOR COMPARE. JSB LODWD DOES PNL ENTRY HAVE EXPECTED CPA TEMP1 DESTINATION NODE NUMBER? JMP GETID YES. ADB N2 NO. KEEP LOOKING (FATHER HAS A JMP PNLST SESSION AT ANOTHER NODE). * GETID ADB K3 YES. GET ID OF ANCESTOR'S JSB LODWD SESSION AT REMOTE NODE. AND B377 IOR BIT15 SET "FATHER OWNS SESSION" BIT. STA TEMP * BLNAT CLA BUILD NETWORK ACCOUNT TABLE JSB #NASR ENTRY FOR THIS REMOTE NODE. SZB,RSS (B) = ADDR OF AVAIL. ENTRY. JMP NROOM NO ROOM. * LDA TEMP1 STORE NODE #. STA B,I INB LDA TEMP STORE SESSION ID WORD. STA B,I INB CLA CLEAR ADDR OF ASCII USER NAME. STA B,I INB LDA SEQNO STORE "EXECW SEQ #", IF ANY. STA B,I * LDA TEMP DESTINATION SESSION ID. JMP ROOTS,I GO STORE ID IN REQUEST. * * SECOND, PERFORM ONE-TIME SEARCH FOR LOCAL SESSION ID IN THE SESSION ID * POOL (#POOL). IF THERE, THIS SESSION WAS CREATED FROM A REMOTE * NODE: IF THE USER'S DESTINATION NODE IS THE SESSION-ORIGINATING NODE, * LATCH USER ONTO THE REMOTE SESSION (IF ANY) AT THE ORIGINATING NODE * FOR INTER-SESSION COMMUNICATION. * FPOOL LDA $DSCS THIS NODE UNDER REMOTE SESSION? SSA JMP NONSM NO. CAN'T BE A SLAVE SESSION. * LDB #POOL GET ADDR OF SID POOL. SZB,RSS JMP PROCS GET OUT IF NONE. JSB LODWD GET NEG. # OF POOL ENTRIES. STA CNTR SAVE COUNTER. INB POINT TO WORD 1 OF 1ST ENTRY. * LOOP JSB LODWD (CROSS) LOAD A POOL SESSION ID. SSA,RSS JMP NEXT ENTRY NOT IN USE. AND B377 ENTRY IN USE: CPA LOCID SAME AS THE LOCAL SESSION ID? JMP RMSSN YES. NEXT ADB POOSZ NO. GO TO NEXT ENTRY. ISZ CNTR JMP LOOP JMP PROCS NOT FOUND. GO CHECK "PROCESS". * RMSSN INB FOUND. JSB LODWD RETRIEVE ORIGINATOR'S NODE # STA TEMP1 (BECOMES DESTINATION NODE). * CPA RQB+#DST MAKE SURE MASTER IS TALKING RSS TO NODE THAT CREATED SESSION! JMP SDFLT NO. GO TAKE DEFAULT SESSION. * INB RETRIEVE ORIGINATOR'S SESSION ID JSB LODWD (BECOMES DESTINATION SESSION). AND B377 STA TEMP * JSB LODWD RETRIEVE "EXECW SEQ #". ALF,ALF AND B377 STA SEQNO SAVE FOR NAT ENTRY. * CLA,INA SET "SCHEDULED FROM STA SLAVE REMOTE SESSION" FLAG. * JMP BLNAT GO FINISH UP. * * THIRD, SEE IF PROGRAM, OR * FOURTH, A FATHER PROGRAM WAS SCHEDULED IN A NON-SESSION NODE FROM * A SESSION NODE. IF FOUND, SET UP TO DIRECT MASTER REQUESTS BY THIS * USER TO THE ORIGINATOR'S SESSION. * NONSM LDA XEQT NO. SET POINTER TO THIS STA IDPTR USER'S ID SEGMENT. * NXTPG LDA IDPTR NEGATE ID SEG ADDR FOR CALL. CMA,INA STA TEMP * JSB PGMAD GET ASCII NAME FROM DEF *+6 INDICATED ID SEGMENT. DEF BUFR DEF TEMP DEF TEMP1 DEF TEMP1 DEF FATHR ALSO GET ID SEG ADDR OF FATHER. * LDB #POOL SEARCH #POOL FOR ASCII NAME. SZB,RSS JMP PROCS GET OUT IF NONE. JSB LODWD NEG. # OF POOL ENTRIES. STA CNTR SAVE COUNTER. INB POINT TO 1ST WORD OF 1ST ENTRY. STB ADDR * NLOOP JSB LODWD (CROSS) LOAD A NULL "POOL SID". SSA,RSS JMP NNEXT ENTRY NOT IN USE. * INB DOES THE ORIGINATING NODE JSB LODWD NUMBER MATCH THE MASTER CPA RQB+#DST USER'S DESTINATION NODE? RSS JMP NNEXT NO. * ADB K2 YES. MOVE NAME FROM #POOL ENTRY JSB LODWD IN S.A.M. TO LOCAL BUFFER. STA NAME INB JSB LODWD STA NAME+1 INB JSB LODWD STA NAME+2 * LDB NAMAD RBL BYTE ADDR OF NAME FROM POOL ENTRY. LDA BUFAD RAL BYTE ADDR OF USER'S NAME. JSB .CBT COMPARE 5-CHAR PROG NAMES. DEF K5 NOP JMP NSFND MATCH. NOP MISMATCH. NNEXT LDB ADDR MISMATCH. GO TO NEXT ENTRY. ADB POOSZ STB ADDR ISZ CNTR JMP NLOOP * LDA FATHR PROGRAM NAME NOT IN #POOL. SZA,RSS IS A FATHER PROGRAM WAITING? JMP PROCS NO. GO CHECK "PROCESS". STA IDPTR YES. JMP NXTPG GO CHECK FOR FATHER'S NAME IN #POOL. * NSFND LDB ADDR PROG NAME FOUND IN #POOL ENTRY. JMP RMSSN GO BUILD NAT ENTRY. * * FIFTH, IF THIS PROGRAM HAS THE SAME SCHEDULING LU AS SOME OTHER * PROGRAM (SAME "PROCESS"), AND THE OTHER PROGRAM HAS A PNL ENTRY * FOR A REMOTE SESSION AT THE DESTINATION NODE, DEFAULT THIS * PROGRAM TO THE EXISTING REMOTE SESSION FOR THIS "PROCESS". * (FOR PROGRAMS SCHEDULED WITHOUT WAIT.) * PROCS JSB LOGLU GET SCHEDULING LU. DEF *+2 DEF TEMP (DUMMY PARAM) * SZA,RSS JMP SDFLT IF ZERO, GO USE DEFAULT. STA TEMP SAVE SCHEDULING LU. * JSB LUTRU MAKE SURE ITS A SYSTEM LU. DEF *+3 DEF TEMP DEF REALU (USE FOR PNL ENTRY) * LDB #LDEF SEARCH PNL. ADB N1 LDB B,I ADDR OF PNL HEADER. PNLSR JSB LODWD GET ADDR OF NEXT PNL ENTRY. SZA,RSS JMP SDFLT NOT FOUND. GO TAKE DEFAULT. * LDB A POINT TO WORD 3 OF PNL ENTRY. ADB K2 JSB LODWD GET REMOTE NODE #. CPA RQB+#DST SAME AS USER'S DESTINATION? JMP *+3 YES. GO CHECK TERMINAL LU. ADB N2 NO. GO TO NEXT PNL ENTRY. JMP PNLSR STA TEMP1 SAVE NODE # FOR NAT ENTRY. INB POINT TO LOCAL TERMINAL LU. JSB LODWD GET TERMINAL LU. AND B377 CPA REALU SAME AS OUR SCHEDULING LU? RSS JMP PNLNX NO. GO CHECK NEXT PNL ENTRY. INB YES. BAD ID SEGMENT? JSB LODWD SSA,RSS JMP ALIVE NO. USE THIS SESSION. ADB N1 YES. IGNORE THIS PNL ENTRY PNLNX ADB N3 (COULD BE GOOD ONE AFTER THIS ONE). JMP PNLSR * ALIVE INB GET EXISTING REMOTE SESSION ID. JSB LODWD AND B377 STA TEMP JMP BLNAT GO BUILD A NAT ENTRY. * * SIXTH, USER DOES NOT HAVE AN ANCESTOR WITH A REMOTE SESSION. SET FLAG * FOR #MSDF TO WATCH FOR ASSIGNMENT OF DEFAULT SESSION BY THE REMOTE * SESSION MONITOR (RSM) WHEN THE REPLY ARRIVES (IF REMOTE NODE IS UNDER * SESSION MONITOR CONTROL). * SDFLT CLA MAKE SURE A NAT SLOT WILL JSB #NASR BE THERE WHEN WE NEED IT SZB,RSS (AVOID LOG-ON IF NOT). JMP NROOM ERROR - NO ROOM. * CLA,INA HAVE ROOM. GET DEFAULT SESSION. STA DFALT CLA JMP ROOTS,I RETURN. * RS01 LDA "RS" LDB "01" JMP ERTN NROOM LDA "RS" LDB "03" JMP ERTN RETRN ISZ #MSSM SET FOR P+2 NORMAL RETURN. ERTN JMP #MSSM,I RETURN TO CALLER. SKP * * PERFORM ONE-TIME RETRIEVAL OF DEFAULT SESSION ID (OR ZERO) * FROM THIS FIRST REPLY BUFFER AND BUILD AN ENTRY IN THE * NETWORK ACCOUNT TABLE (NAT), EVEN IF THERE IS NO SESSION * MONITOR AT THE REMOTE NODE. * MSDF LDA DFALT LOOKING FOR POSSIBLE ASSIGNMENT SZA,RSS OF DEFAULT SESSION? JMP CKRS1 NO. GO CHECK FOR "RS01". * * THE FOLLOWING CODE IN SUBROUTINE #MSDF IS ONLY DONE ONCE PER * USER PROGRAM EXECUTION. IF DEST NODE DOES NOT HAVE S.M. OR S.M. NOT * INITIALIZED, RETURNED DESTINATION SESSION ID WILL BE ZERO. * CLA YES. CLEAR THE FLAG. STA DFALT LDA RQB+#ENO IS SIGN BIT SET IN SSA,RSS IN ERROR NODE WORD? JMP MSDF1 NO. * LDA RQB+#SID YES. WAS A SESSION CREATED? AND B377 SZA JSB KILIT YES. GET RID OF IT JMP #MSSM,I AND RETURN. * MSDF1 CLA JSB #NASR BUILD NAT ENTRY SZB,RSS FOR THIS REMOTE NODE. JMP NOMOR NO ROOM. (SHOULD NOT HAPPEN.) * STB TEMP SAVE NAT ENTRY ADDRESS. LDA RQB+#DST STORE NODE # IN NAT ENTRY. STA TEMP,I STA TEMP1 SAVE FOR PNL ENTRY. ISZ TEMP LDA RQB+#SID STORE DEST SESSION ID WORD AND B377 IN NAT ENTRY STA TEMP,I (CAN BE ZERO). ISZ TEMP CLB SZA DEPENDING ON SESSION ID, LDB #DFSN STB TEMP,I STORE 0 OR ADDR OF ASCII "DEFAULT" ISZ TEMP IN NAT ENTRY. CLB STB TEMP,I CLEAR "EXECW SEQ #" IN NAT ENTRY. * SZA,RSS ID = 0 (NO SESSION MONITOR)? JMP #MSSM,I YES. RETURN. STA TEMP NO. SAVE SESSION ID FOR PNL. * CLA,INA INIT SCHEDULING SYSTEM LU STA REALU FOR PNL ENTRY. * JSB LOGLU GET SCHEDULING LU. DEF *+2 DEF TEMP2 (DUMMY). * SZA,RSS JMP CRNRQ IF ZERO, USE REALU = 1. STA TEMP2 * JSB LUTRU MAKE SURE WE HAVE DEF *+3 PHYSICAL SCHEDULING LU. DEF TEMP2 DEF REALU * CRNRQ JSB RNRQ BUILD PROCESS # LIST ENTRY. DEF *+4 WAIT FOR AVAIL LIST ENTRY SPACE. DEF LGW LOCK GLOBAL RN/WAIT/NO ABORT. DEF #TBRN TABLE-ACCESS RN. DEF TEMP2 DUMMY. JMP RESER ERROR. * JSB #RSAX ADD PNL ENTRY. DEF *+6 DEF K8 REQUEST CODE. DEF REALU LOGGING LU. DEF TEMP SESSION ID. DEF TEMP1 DESTINATION NODE. DEF RTBIT MPE/RTE BIT = RTE. * SSB,RSS SKIP IF ERROR. JMP #MSSM,I RETURN. * RESER JSB KILIT GET RID OF BAD REMOTE SESSION. LDA "DS" LDB "07" SEND "DS07" JMP ERRUP NOMOR JSB KILIT GET RID OF BAD REMOTE SESSION. LDA "RS" LDB "03" SEND "RS03" ERRUP DST RQB+#EC1 STORE IN REPLY BUFFER. LDA #NODE IOR BIT15 SET ENODE "ASCII ERROR" BIT. STA RQB+#ENO JMP #MSSM,I RETURN TO CALLER. SPC 3 * * CHECK FOR "RS01" ON REPLY (REMOTE SLAVE MONITOR COULD NOT * ATTACH TO THE DESTINATION SESSION ID). * CKRS1 LDA RQB+#ENO ASCII ERROR RETURNED? SSA,RSS JMP #MSSM,I NO. LDA RQB+#EC1 YES. "RS01"? CPA "RS" RSS JMP #MSSM,I NO. LDA RQB+#EC2 CPA "01" RSS YES. JMP #MSSM,I NO. * * "RS01" CAME BACK. RELEASE PNL (IF ANY) AND NAT ON THIS END, SINCE * THE REMOTE SESSION IS NO LONGER AVAILABLE. * LDA RQB+#SID GET THE "BAD" DEST SESSION ID. AND B377 STA TEMP * JSB #RSAX RELEASE THE PNL ENTRY, EVEN IF A DEF *+4 FATHER PROGRAM OWNS IT. IGNORE DEF K10 ERROR IN CASE NO ENTRY EXISTS. DEF TEMP DESTINATION SESSION ID. DEF RQB+#DST DESTINATION NODE NUMBER. * LDA RQB+#DST FIND THE NAT ENTRY FOR JSB #NASR THE DESTINATION NODE. SZB,RSS JMP #MSSM,I NONE THERE. STB TEMP SAVE ADDR OF NAT ENTRY. * ADB K2 SEE IF THERE IS A NATX ENTRY LDB B,I (IF THIS IS REMAT). SZB,RSS JMP FLNAT NO. CPB #DFSN JMP FLNAT (SKIP "DEFAULT SESSION") * CLA YES. CLEAR THE NATX ENTRY. STA B,I LDA B INB JSB .MVW DEF K10 NOP * FLNAT LDB TEMP RELEASE THE NAT ENTRY. CLA STA B,I LDA B INB JSB .MVW DEF K4 NOP * JMP #MSSM,I ALL DONE. SKP * * ROUTINE TO PERFORM A NON-DLGOF LOG-OFF OF A SESSION THAT * CANNOT BE USED DUE TO A LOCAL ERROR. SIMILAR ROUTINE IN #UPSM & #DISM * (BUT BUILT FROM INFORMATION IN THE REPLY BUFFER). * KILIT NOP CLA RESET. STA LGF+#SEQ STA LGF+#MAR STA LGF+#MAC LDA K7 BUILD STREAM WORD. IOR #BREJ IOR BIT12 SET "LEVEL 1 & ABOVE" BIT. STA LGF+#STR LDA RQB+#SRC STORE SOURCE NODE NUMBER. STA LGF+#SRC LDA RQB+#DST STORE DESTINATION NODE NUMBER. STA LGF+#DST CLA,INA STORE UPGRADE LEVEL. STA LGF+#LVL LDA N2 SET TO BYPASS MESSAGE ACCOUNTING. STA LGF+#MAS LDA #MHCT SET HOP COUNT. STA LGF+#HCT LDA RQB+#SID STORE SOURCE SESSION ID ONLY. AND B1774 STA LGF+#SID LDA K2 STORE COMMAND LENGTH. STA LGF+#CML LDA "XX" STORE "XX" COMMAND. STA LGF+#CMS CCA STORE "NO-REPLY" REQ CODE. STA LGF+#LGC LDA RQB+#SID STORE SESSION ID TO BE LOGGED OFF. AND B377 STA LGF+#LNL * JSB #NRVS SEARCH NRV (LU RETURNED IN (A)). DEF *+4 DEF LGF+#DST NODE # FOR SEARCH. DEF TEMP DUMMY. DEF TEMP1 UPGRADE LEVEL OF DEST. NODE. JMP KILEX ERROR. NODE NOT IN NRV. * IOR BIT15 BYPASS SESSION SST. STA LU SAVE COMMUNICATIONS LINK LU. LDB #GRPM GRPM'S CLASS NUMBER. STB CLASS * LDA #LEVL IS LOCAL UPGRADE LEVEL CMA,INA HIGHER THAN ADA TEMP1 THAT OF DEST. NODE? SSA,RSS JMP WRITE NO. NO CONVERSION NEEDED. * LDA #OTCV YES. SEND TO MESSAGE CONVERTER. STA CLASS CLA STA LU * WRITE LDA L#LNL GET LENGTH OF REQUEST. ADA C#LSZ BUMP FOR LOCAL BUFFER. STA LEN CCB ADB @RQB ADB A (B) -> LAST WORD OF REQUEST. LDA B,I IOR BIT8 SET "DS STATUS" BIT. STA B,I * JSB XLUEX DO CLASS WRITE/READ TO DEST. LU. DEF *+8 DEF CLS20 NO ABORT. DEF LU DEST. LU & CONTROL WORD. DEF TEMP NO DATA. DEF K0 @RQB DEF LGF REQUEST BUFFER. DEF LEN REQUEST LENGTH. DEF CLASS I/O CLASS. NOP IGNORE ERROR. * KILEX JMP KILIT,I RETURN. * LGF BSS #LNL+1 "NO-REPLY" LOGOFF REQ BUFFER. BSS 2 "APPENDAGE" AREA. LU NOP OCT 10100 (LU+1) "Z" BIT & "WRITE" INDICATOR. SKP * * SUBROUTINE TO FIND ENTRY IN NETWORK ACCOUNT TABLE (NAT) * FOR A GIVEN NODE NUMBER. FIND AVAILABLE ENTRY BY SPECIFYING * NODE = 0. * * (A) = NODE NUMBER * JSB #NASR * (A) = SESSION ID * (B) = ADDR OF ENTRY, ZERO IF NOT FOUND * #NASR NOP STA NDNUM SAVE NODE NUMBER. LDB #NAT FWA NETWORK ACCOUNT TABLE. LDA NAT# SET FOR # ENTRIES. STA CNTR * SCAN LDA B,I GET NODE FROM NAT ENTRY. CPA NDNUM COMPARE TO REQUESTED NODE. JMP FOUND FOUND. * ADB K4 KEEP LOOKING. ISZ CNTR JMP SCAN * CLB NOT FOUND: (B) = 0. CLA JMP #NASR,I * FOUND LDA B FOUND: (B) = ENTRY ADDR. INA LDA A,I (A) = SESSION ID WORD. JMP #NASR,I * SPC 3 * * LOAD WORD FROM S.A.M., CROSS-LOAD IF DMS SYSTEM. * LODWD NOP LDA $OPSY OPERATING SYSTEM TYPE. RAR,SLA SKIP IF NON-DMS. JMP *+3 DMS. GO EXECUTE XLA. LDA B,I NON-DMS. PICK UP SAM WORD. JMP LODWD,I RETURN. XLA B,I CROSS-LOAD SAM WORD. JMP LODWD,I RETURN. SKP * CONSTANTS AND STORAGE. * K0 DEC 0 K1 DEC 1 K2 DEC 2 K3 DEC 3 K4 DEC 4 K5 DEC 5 K7 DEC 7 K8 DEC 8 K10 DEC 10 K254 DEC 254 B77 OCT 77 B377 OCT 377 BIT8 OCT 400 BIT12 OCT 10000 BIT15 OCT 100000 B1774 OCT 177400 N1 DEC -1 N2 DEC -2 N3 DEC -3 N4 DEC -4 N5 DEC -5 "01" ASC 1,01 "03" ASC 1,03 "07" ASC 1,07 "DS" ASC 1,DS "XX" ASC 1,XX "RS" ASC 1,RS LGW OCT 40002 POOSZ DEC 7 SIZE OF #POOL ENTRY. SLAVE OCT 0 SEQNO NOP SAVA NOP CLASS NOP LEN NOP CLS20 OCT 100024 NXTAD NOP FATHR NOP REALU NOP ADDR NOP RTBIT NOP LOCID OCT -1 NDNUM NOP POOLA NOP CNTR NOP TEMP NOP TEMP1 NOP TEMP2 NOP NAMAD DEF NAME NAME BSS 3 BUFR BSS 3 IDPTR NOP DFALT NOP XEQT NOP #OVR OCT 0 SPECIAL OVERRIDE FLAG. D$OVR EQU #OVR #DFSN DEF DFN DFN ASC 22,DEFAULT SESSION L#LNL ABS #LNL+1 C#LSZ ABS #LSZ SPC 5 * * NETWORK ACCOUNT TABLE (NAT). 16 ENTRIES: * NODE #, SESSION ID, ADDR OF ASCII USER NAME, RESERVED WORD. * NAT# DEC -16 NEGATIVE # ENTRIES. #NAT DEF *+1 ADDR OF NETWORK ACCOUNT TABLE. REP 64 OCT 0 * BSS 0 SIZE OF #MSSM. * END