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 
                                                                                                                                                    