ASMB,R,Q,C
      HED RSM   91750-16172 REV 2013 * (C) HEWLETT-PACKARD CO. 1980 
      NAM RSM,19,20 91750-16172 REV.2013 800314 RTE-IVB W/S.M.
      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 HEWLETT-PACKARD COMPANY.       *
******************************************************************
      SPC 2 
      EXT .CLGN,.CLGF,#DFUN,#PASS,#POOL,#RSAX 
      EXT #RQUE,#LDEF,#RSM,#RPB,#NRVS,#MNUM 
      EXT #SLAV,$OPSY,DTACH,$LIBR,$LIBX,#GETR 
      EXT #NODE,#BREJ,$TIME,#QCLM 
      EXT .DRCT,.LBT,.CBT,.MBT,.MVW,$CVT1 
      EXT EXEC,LUSES,IDRPD
* 
RQB   EQU #RPB
* 
      SUP 
* 
* NAME:   RSM 
* SOURCE: 91750-18172 
* RELOC:  91750-16172 
* PGMR:   JIM HARTSELL
* 
* 
*  <RSM> IS THE DS/1000 REMOTE SESSION-MONITOR INTERFACE  MODULE. 
*  <RSM> RUNS IN ALL SESSION-MONITOR NODES AND INSURES THAT REMOTE-USER 
*  ACCESS TO THIS NODE FALLS UNDER THE SAME SYSTEM PROTECTION PROVIDED
*  BY THE SESSION MONITOR.
* 
*  THE FIRST REQUEST SENT FROM EACH REMOTE MASTER WILL TYPICALLY NOT
*  CONTAIN A DESTINATION SESSION ID IN THE HEADER.  <GRPM> RETHREADS
*  THESE REQUESTS TO <RSM>.  IF THE REQUEST IS AN EXPLICIT LOG-ON REQUEST 
*  (VIA <REMAT> SW/AT COMMANDS OR <DLGON> LOG-ON CALL), <RSM> WILL CREATE 
*  A SESSION FOR THE SPECIFIED USER-NAME.  OTHERWISE, <RSM> WILL CREATE A 
*  SESSION FOR THE DEFAULT USER-NAME SPECIFIED DURING <DINIT> INITIALIZATION. 
*  ALL SUBSEQUENT REQUESTS BY THE MASTER USER WILL CONTAIN THE IDENTIFIER 
*  FOR THE SESSION AND WILL BE PASSED BY <GRPM> DIRECTLY TO THE SERVING 
*  SLAVE MONITOR (<RFAM>, <EXECM>, ETC.).  THE SLAVE MONITORS WILL ATTACH 
*  TO THE SPECIFIED SESSION FOR THE EXECUTION OF THE REQUEST, THEN DETACH.
* 
*  SESSIONS WILL BE LOGGED OFF ON REQUEST OF THE USER (<REMAT> DE/EX
*  COMMANDS OR <DLGON> LOG-OFF) OR BY <UPLIN> AFTER THE PROGRAM TERMINATES. 
* 
*  ALL ACCESS FROM "OLD NODES" (MESSAGE FORMAT LEVEL 0) WILL BE ASSIGNED
*  TO THE SAME PERMANENT DEFAULT SESSION, SUCH THAT THE RESULTING SHARED
*  ACCESS WILL APPEAR TO THE USER AS A NON-SESSION-MONITOR SYSTEM.
      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 
A     EQU 0 
B     EQU 1 
* 
RSM   EQU * 
      LDB $OPSY 
      RBR,SLB       SKIP IF NON-DMS 
      CLA,RSS 
      JMP DTCH
      STA MOD1
* 
DTCH  JSB DTACH     DETACH FROM SESSION.
      DEF *+1 
* 
RSGET JSB #GETR     HANG ON CLASS: READ ENTIRE REQUEST
      DEF *+4        INTO RSM AND SAVE S.A.M. BUFFER. 
      DEF #RSM
      DEF RQB       REQUEST BUFFER
      DEF C#MXR     MAXIMUM LENGTH. 
* 
      JMP RSGET     ERROR RETURN. 
* 
*  SUCCESSFUL READ COMPLETION LOGIC FOLLOWS 
* 
      CLA 
      STA SID 
      STA PDFLG 
      STA LGERR     CLEAR ERROR REPLY VALUES. 
      STA LGTYP 
      STA LGQLF 
* 
      JSB #NRVS     GET +NODE NUMBER AND UPGRADE LEVEL
      DEF *+6         OF SOURCE NODE. 
      DEF RQB+#SRC  -LU OR +NODE FOR SEARCH.
      DEF TEMP      DUMMY (MASTER TIME-OUT).
      DEF SLEVL     SOURCE UPGRADE LEVEL RETURNED.
      DEF TEMP      DUMMY (NEIGHBOR). 
      DEF SNODE     +SOURCE NODE # IF CALLED WITH -LU.
      NOP           ERROR RETURN. 
* 
      LDA RQB+#SRC  WAS #NRVS CALL MADE WITH +NODE? 
      SSA,RSS 
      STA SNODE     YES. STORE ORIGINAL SOURCE NODE PARAM.
* 
      LDA RQB+#STR  GET STREAM WORD.
      AND B77 
      CPA B7        OPERATOR COMMAND? 
      RSS 
      JMP DEFLT     NO. DEFAULT SESSION NEEDED. 
* 
      LDA RQB+#CML  YES. COMMAND LEN = 2? 
      ADA N2
      SSA 
      JMP DEFLT     NO. USER WANTS DEFAULT SESSION. 
* 
      LDA RQB+#CMS  YES. COMMAND = "XX"?
      CPA "XX"
      JMP ACCNT     YES. LOGON/LOGOF/NON-SESSION. 
* 
* DEFAULT SESSION REQUIRED. 
* 
DEFLT LDA SLEVL     REQUEST FROM OLD NODE (LEVEL 0)?
      SZA 
      JMP DFLT1     NO. 
* 
* REQUEST IS FROM AN OLD LEVEL 0 NODE (NO SESSION ID FIELD IN HEADER).
* USE PERMANENT DEFAULT SESSION CREATED SOLELY FOR OLD NODES.  THIS 
* SESSION IS CREATED WHEN IT IS FIRST NEEDED, AND FROM THEN ON EVERY
* OLD NODE REQUEST WILL PASS THRU HERE AND BE ASSIGNED THE "OLD NODE
* PERMANENT DEFAULT SESSION" ID.  OLD NODES CANNOT SEND LOG-OFF REQUESTS
* FOR THIS SESSION. 
* 
      LDA PDFID     HAVE WE CREATED THE "PERMANENT" 
      SZA,RSS         "OLD NODE" SESSION? 
      JMP DPERM     NO. GO CREATE IT. 
* 
      JSB LUSES     YES. IS IT STILL UP?
      DEF *+2 
      DEF PDFID 
* 
      SZA,RSS 
      JMP SGONE     NO. 
      LDA PDFID     YES. PUT SESSION ID IN REQUEST
      STA SID         AND DISPATCH TO PROPER MONITOR. 
      JMP STID1 
* 
SGONE LDA PDFEN     GET ADDRESS OF "PERM DEFAULT" ENTRY.
      JSB RLEAS     RELEASE THE POOL ENTRY. 
* 
DPERM CLA,INA       FLAG THAT THIS IS TO BE THE OLD 
      STA PDFLG       NODE "PERMANENT" DEFAULT SESSION. 
* 
* SET UP TO CREATE DEFAULT SESSION.  ALL "NEW NODE" USERS GET THEIR 
* OWN SESSIONS SO THAT INTER-SESSION COMMUNICATION CAN TAKE PLACE.
* 
DFLT1 CLA           CLEAR "LOGON" FLAG. 
      STA LGFLG 
* 
      JSB .DRCT     MOVE DEFAULT USER NAME
      DEF #DFUN 
      LDB DLGBF      TO LOGON BUFFER. 
      JSB .MVW
      DEF D11 
      NOP 
      LDA D21       SET LENGTH IN BYTES.
      STA LGLEN 
      JMP SCAN      GO FIND SESSION ID. 
* 
* EXPLICIT DLGON/DLGOF/DLGNS REQUEST. 
* 
ACCNT CLA,INA       SET "LOGON" FLAG. 
      STA LGFLG 
* 
      LDA RQB+#LGC  GET REQUEST CODE. 
      CPA B1
      JMP RLGON     GO DO LOG-ON. 
      CPA B2
      JMP NONSM     GO DO NON-SESSION.
      JMP RLGOF     GO DO LOG-OFF (O OR -1).
* 
RLGON LDA RQB+#LNL  GET # BYTES IN USER NAME. 
      ADA N33       CHECK LIMIT,
      LDB RQB+#LNL    AND IF NECESSARY, 
      SSA,RSS           TRUNCATE TO THE 
      LDB D32             MAXIMUM OF 32 CHARACTERS. 
      STB LGLEN 
      JSB .DRCT     MOVE REQUESTED USER NAME
      DEF RQB+#LUN
      RAL 
      LDB DLGBF      TO LOGON BUFFER. 
      RBL 
      JSB .MBT
      DEF LGLEN 
      NOP 
* 
* CHECK FOR "HELLO" FOLLOWED BY "HELLO" FROM AN HP 3000.  ALSO, 
* CHECK FOR ABANDONED SESSION THAT MAY HAVE BEEN CREATED FROM THE 
* SOURCE STATION LU (SOURCE SESSION ID).  THIS CAN HAPPEN WHEN THE
* SOURCE NODE IS REBOOTED WITHOUT A LOG-OFF.  IF ONE IS FOUND, LOG IT OFF.
* (...IF SOURCE SID IS ZERO, SESSION WAS CREATED FROM A PROGRAM OR
* TERMINAL IN A NON-MTM/SESSION NODE OR FROM THE SYSTEM CONSOLE IN AN 
* MTM/SESSION NODE... NOTHING CAN BE DONE HERE UNTIL FUTURE ENHANCEMENTS
* TIE SEQUENCE NUMBERS TO ALL SESSION IDENTIFIERS.
* 
SCAN  LDA RQB+#SID
      ALF,ALF 
      AND B377      SOURCE SESSION ID (STATION LU, ZERO,
      STA OSID        254, MTM LU, OR MPE "FROM PROCESS #").
      SZA,RSS       TAKE JUMP IF NO SOURCE SESSION ID (COULD
      JMP FLUSH     BE FROM "OLD" NODE OR "AUTO-SCHED" PROG.
* 
      LDB #POOL     GET ADDR OF SID POOL. 
      JSB LODWD 
      STA TEMP      SAVE # POOL ENTRIES (NEGATIVE). 
      INB 
* 
SCANL STB POOLA     SAVE POOL ENTRY ADDRESS.
      JSB LODWD     (CROSS) LOAD WORD 1 OF NEXT ENTRY.
      SSA,RSS       SIGN BIT SET (IN USE)?
      JMP BUMPI     NO. GO TO NEXT ENTRY. 
* 
      INB           YES. CHECK SOURCE NODE #. 
      JSB LODWD       (IF 3000 2ND HELLO, SOURCE NODE # WILL
      CPA SNODE        BE LOCAL NODE # IN REQUEST & IN #POOL.)
      RSS 
      JMP BUMPJ     NO MATCH. 
      INB           MATCH. CHECK SOURCE SESSION ID
      JSB LODWD       OR MPE "FROM PROCESS #".
      AND B377
      CPA OSID
      RSS 
      JMP BUMPK     NO MATCH. 
* 
      LDB POOLA     MATCH. GET DEST. SESSION ID.
      JSB LODWD 
      AND B377      ISOLATE.
      IOR BIT13     SET BIT 13 TO KILL ACTIVE PROGS.
      STA OSID      STORE FOR LOG OFF.
* 
      JSB .CLGF     LOG OFF PRIOR (OR ABANDONED) SESSION. 
OSID  OCT 0 
*                                   (A) = COMPLETION CLASS #. 
      SSA,RSS       IF SESSION NOT INITIALIZED (!), 
      SZA,RSS         OR IF SCB NOT FOUND,
      JMP RPOOL       SKIP THE CLASS FLUSH. 
* 
      JSB LRSPN     FLUSH RESPONSE FROM "LOGON".
      CLA           IGNORE LOGOF ERROR BY 
      STA LGTYP       CLEARING ANY RETURNED 
      STA LGERR       ERROR CODES.
* 
RPOOL JSB RLEAS     RELEASE #POOL ENTRY AT "POOLA". 
      JMP FLUSH     GO FLUSH ID POOL. 
* 
BUMPI INB 
BUMPJ INB 
BUMPK ADB POOSZ 
      ADB N2        (FOR POOSZ-2) 
      ISZ TEMP
      JMP SCANL     LOOP TILL DONE. 
* 
* FLUSH ID POOL OF ALL "IN USE" ENTRIES FOR WHICH A SESSION NO LONGER 
* EXISTS, INCLUDING THE FIRST ENTRY (PERMANENT "OLD NODE" DEFAULT SESSION). 
* 
FLUSH LDB #POOL     GET ADDRESS OF SID POOL.
      JSB LODWD     GET # POOL ENTRIES (NEGATIVE).
      STA CNT 
      INB           POINT TO 1ST POOL ENTRY.
FLOOP JSB LODWD     (CROSS) LOAD WORD 1 OF POOL ENTRY.
      SSA,RSS       IS ENTRY IN USE (CHECK BIT 15)? 
      JMP FNEXT     NO. GO TO NEXT POOL ENTRY.
* 
      STB POOLA     YES. SAVE ADDRESS OF POOL ENTRY.
      AND B377      ISOLATE "IN-USE" SESSION ID.
      STA IOP1
* 
      JSB LUSES     IS THE SESSION FOR THIS 
      DEF *+2         #POOL ENTRY STILL AROUND? 
      DEF IOP1
* 
      LDB POOLA     (RESTORE B-REGISTER)
      SZA 
      JMP FNEXT     YES. ENTRY IS GOOD. 
      JSB RLEAS     NO. RELEASE POOL ENTRY AT "POOLA".
      LDA IOP1      WAS THIS THE PERM. DEFAULT SESSION? 
      CLB 
      CPA PDFID 
      STB PDFID     YES. INDICATE THAT IT IS GONE.
      LDB POOLA 
* 
FNEXT ADB POOSZ     ADVANCE TO NEXT POOL ENTRY. 
      ISZ CNT 
      JMP FLOOP     LOOP TILL DONE. 
* 
* FIND AN AVAILABLE SESSION IDENTIFIER IN SESSION ID POOL. EACH 
* POOL ENTRY CONSISTS OF: SESSION ID (BIT 15 SET IF IN USE), OWNER'S
* NODE NUMBER, OWNER'S SOURCE SESSION ID, AND THREE WORDS FOR NAME OF 
* PROGRAM SCHEDULED IN THIS SESSION FROM A REMOTE NODE. 
* THE FIRST ENTRY IS DEDICATED FOR USE AS THE PERMANENT "OLD NODE"
* DEFAULT SESSION.
* 
      LDB #POOL     GET ADDR OF SID POOL. 
      JSB LODWD     GET # POOL ENTRIES (NEGATIVE).
      STA CNT 
      INB           POINT TO 1ST POOL ENTRY.
* 
      LDA PDFLG     ARE WE CREATING THE PERMANENT 
      SZA,RSS         "OLD NODE" DEFAULT SESSION? 
      JMP NXENT     NO.  ADVANCE TO 2ND #POOL ENTRY.
      JSB LODWD     YES. FIRST ENTRY IS FOR 
      JMP IDFND          THIS PURPOSE.
* 
LOOP  JSB LODWD     (CROSS) LOAD WORD 1 OF NEXT ENTRY.
      SSA,RSS       IS SIGN BIT SET?
      JMP IDFND     NO. THIS ID IS AVAILABLE. 
* 
NXENT ADB POOSZ     BUMP ADDR TO NEXT ID. 
      ISZ CNT       END OF POOL?
      JMP LOOP      NO, CONTINUE. 
* 
      JMP RS03      GIVE A "SESSION LIMIT" ERROR. 
* 
IDFND AND B377
      STA SID       SAVE SESSION ID.
      STB POOLA     SAVE ADDRESS OF SID POOL ENTRY. 
* 
      JSB LUSES     DOES SOME OTHER SUBSYSTEM HAVE A
      DEF *+2         SESSION FOR THIS ID?
      DEF SID         (NOT EXPECTED)
* 
      LDB POOLA     (RESTORE (B)) 
      SZA 
      JMP NXENT     YES.  GO TO NEXT #POOL ENTRY. 
* 
      LDA SID       NO.  ALL CLEAR. 
      IOR BIT15     SET SIGN BIT FOR "IN USE".
      JSB STUFF     STORE BACK TO #POOL ENTRY.
* 
* STORE OWNER'S NODE # AND SOURCE SESSION ID IN POOL ENTRY. 
* IF PERMANENT "OLD NODE" DEFAULT SESSION, ONLY THE CREATING NODE 
* WILL BE DESCRIBED.
* 
      INB 
      LDA SNODE 
      JSB STUFF     STORE NODE NUMBER.
      INB 
      LDA RQB+#SID
      ALF,ALF 
      AND B377
      JSB STUFF     STORE SOURCE SESSION ID.
* 
* PERFORM PROGRAMMATIC LOG-ON.
* 
      LDB DLGBF     ADDRESS OF ACCOUNT NAME.
      LDA LGLEN     LENGTH OF ACCOUNT NAME IN BYTES.
      CMA,INA       NEGATIVE # BYTES. 
* 
      JSB .CLGN     CALL LOGON. 
SID   OCT 0         SESSION IDENTIFIER. 
*                                   (A) = COMPLETION CLASS #. 
      SSA,RSS       IF SESSION NOT INITIALIZED (!), 
      JMP GETRS 
      LDA "SM"        SET FOR "REMOTE SESSION 
      STA LGTYP         NOT INITIALIZED" ERROR, 
      LDA "00"
      STA LGERR 
      JMP RLESP         AND SEND REPLY. 
* 
GETRS JSB LRSPN     GET RESPONSE FROM "LOGON".
* 
      SZA,RSS       IF NO ERROR,
      JMP RSLT        GO FINISH UP. 
* 
RLESP JSB RLEAS     ERROR. RELEASE POOL ENTRY (IF ANY). 
      CLA 
      STA SID       CLEAR SESSION ID. 
* 
      JMP REPLY     SEND REPLY. 
* 
RSLT  JSB DTACH     DETACH FROM "LOG-ON" SESSION. 
      DEF *+1 
* 
      LDA LGFLG     WAS THIS AN EXPLICIT LOG-ON REQ?
      SZA,RSS 
      JMP STID      NO. 
* 
* SEND A REPLY FOR LOG-ON, LOG-OFF, OR NON-SESSION ACCESS REQUEST 
* REGARDLESS OF WHETHER IT CAME FROM AN HP 1000 OR HP 3000, AND 
* WHETHER OR NOT A LOGON/LOGOF ERROR OCCURRED.
* SEND REPLIES FOR SLAVE MONITORS WHEN DEFAULT SESSION LOG-ON FAILED. 
* 
REPLY LDA RQB       SET REPLY BIT.
      IOR RPBIT 
      STA RQB 
      LDA RQB+#SID  STORE DEST SESSION ID (IF ANY). 
      AND B1774 
      IOR SID 
      STA RQB+#SID
      LDA LGERR     STORE LOGON ERROR CODE (IF ANY).
      STA RQB+#EC2
      LDB LGTYP     STORE ERROR TYPE CODE (IF ANY). 
      STB RQB+#EC1
      LDA #NODE     GET LOCAL NODE NUMBER.
      SZB           IF LGTYP NOT ZERO,
      IOR BIT15       SET SIGN BIT. 
      STA RQB+#ENO  STORE REPORTING NODE NUMBER.
      LDB LGQLF     GET QUALIFIER.
      BLF           POSITION. 
      LDA RQB+#ECQ
      AND NOTQ
      IOR B         PLACE QUALIFIER (IF ANY) IN REPLY.  
      STA RQB+#ECQ
* 
SNRPY JSB #SLAV     SEND THE REPLY. 
      DEF *+4       (CAN ALSO GO TO RPCNV.) 
      DEF C#MHD 
      DEF B0
      DEF B0
      NOP           IGNORE ERROR RETURN.
* 
* RELEASE THE BUFFER IN S.A.M.
* 
CLEAR LDA #RSM
      ALR,RAR       CLEAR "SAVE BUFFER" FLAG. 
      STA CLASS 
* 
      JSB EXEC      DO DUMMY GET TO CLEAR 
      DEF *+5         CLASS BUFFER. 
      DEF SD21
      DEF CLASS 
      DEF RQB 
      DEF B0
      NOP           IGNORE ERROR. 
* 
      JMP RSGET     GO BACK TO GET. 
* 
* RETHREAD "CORRECTED" HP 1000 REQUESTS TO PROPER MONITOR.
* 
STID  LDA PDFLG     IS THIS THE PERMANENT DEFAULT 
      SZA,RSS         SESSION FOR OLD NODES?
      JMP STID1     NO. 
      LDA SID       YES. SAVE 
      STA PDFID          SESSION ID 
      LDA POOLA          AND
      STA PDFEN          POOL ENTRY ADDRESS.
      CLA           CLEAR THE FLAG. 
      STA PDFLG 
* 
STID1 LDA RQB+#SID  GET SESSION ID WORD OF REQ. 
      AND B1774     CLEAR OLD DEST SESSION ID.
      IOR SID       STORE DEST SESSION ID.
      STA RQB+#SID
* 
      LDA RQB+#STR  FIND MONITOR'S CLASS #. 
      AND B77       ISOLATE STREAM. 
      ADA #LDEF 
      ADA B2        POINT TO LIST HEADER POINTER. 
      LDB A,I       POINT TO LIST HEADER. 
      INB           ADDR OF CLASS #.
      LDA B,I       GET MONITOR'S CLASS #.
      RAL,CLE,ERA   CLEAR SIGN BIT. 
      STA CLASS 
* 
      JSB #RQUE     RETHREAD TO MONITOR.
      DEF *+9 
      DEF K20N        ICODE.
      DEF B10K        REQUE WITH Z BIT SET. 
      DEF B0          NO DATA.
      DEF B0
      DEF RQB         SPECIFY 14-WORD OVERLAY.
      DEF D14 
      DEF CLASS       DEST. CLASS #.
      DEF #RSM        SOURCE CLASS #. 
* 
      RSS           ERROR RETURN. 
      JMP RSGET     NORMAL RETURN.
* 
      CPA "DS"      LOOK FOR DS08 ERROR.
      RSS 
      JSB ERR1      (JSB IS FOR COMPUTING RELATIVE ADDR)
      CPB "08"
      RSS           IF DS08, THEN BUSY ERROR. 
      JSB ERR1      (JSB IS FOR COMPUTING RELATIVE ADDR)
* 
      STA RQB+#EC1  RETURN BUSY ERROR.
      STB RQB+#EC2
      LDA #NODE 
      IOR BIT15 
      STA RQB+#ENO
      LDA RQB+#STR
      AND RTYCT 
      IOR RPBIT 
      IOR #BREJ 
      STA RQB+#STR
      JMP SNRPY     GO SEND REPLY.
      SKP 
* 
* REQUEST FOR NON-SESSION ACCESS. 
* 
NONSM LDA #PASS     IS "RES" PASSWORD BLANK?
      CPA BLNKS 
      JMP NSID      YES. ALLOW ACCESS.
* 
      LDA N10       FIND # CHAR IN "RES" PASSWORD.
      STA TEMP
      CLA 
      STA CNT       INITIALIZE CHARACTER COUNT. 
      JSB .DRCT 
      DEF #PASS 
      LDB A 
      RBL 
COUNT JSB .LBT
      CPA B40 
      JMP CKSLS 
      ISZ CNT       COUNT CHARACTERS UNTIL BLANK
      ISZ TEMP        OR END OF FIELD.
      JMP COUNT 
* 
CKSLS LDA RQB+#LUN  SET "SLASH FIX" DEPENDING WHETHER 
      ALF,ALF         REQUEST PASSWORD BEGINS WITH
      AND B377        A SLASH OR NOT. 
      CLB 
      CPA SLASH 
      INB 
      STB SLSHF     0 = NO SLASH, 1 = SLASH PRESENT.
      CMB,INB       PRIME TO SUBTRACT "SLASH FIX".
* 
      ADB RQB+#LNL  COMPARE PASSWORD LENGTHS. 
      CPB CNT 
      RSS 
      JMP RS05      DIFFERENT LENGTHS. ERROR. 
* 
      JSB .DRCT     COMPARE PASSWORDS.
      DEF #PASS       PASSWORD IN "RES".
      RAL 
      STA B 
      JSB .DRCT 
      DEF RQB+#LUN    PASSWORD IN REQUEST BUFFER. 
      RAL 
      ADA SLSHF       ADD "SLASH FIX".
      JSB .CBT
      DEF CNT 
      NOP 
      JMP NSID      PASSWORD MATCHES. 
      JMP RS05      MISMATCH, 
      JMP RS05        MISMATCH.  ERROR. 
* 
NSID  LDA D254      MATCH. ALLOW ACCESS.
      STA SID       SET SESSION ID = 254. 
      JMP REPLY     GO SEND REPLY.
      SKP 
* 
* REQUEST FOR LOG-OFF.  CAN BE A "NO-REPLY" REQUEST!!!
* 
RLGOF LDA RQB+#LNL  GET LOG-OFF SESSION ID. 
      AND B377      ISOLATE.
      STA OFFID 
* 
      LDB #POOL     GET ADDR OF SID POOL. 
      JSB LODWD     GET # POOL ENTRIES (NEGATIVE).
      STA TEMP
      INB           POINT TO 1ST POOL ENTRY.
LOOP1 JSB LODWD     (CROSS) LOAD WORD 1 OF NEXT ENTRY.
      SSA,RSS       ENTRY IN USE? 
      JMP NEXTP     NO. GO CHECK NEXT ENTRY.
      AND B377
      CPA OFFID     YES. DEST SESSION ID? 
      JMP SAVAD     YES.
NEXTP ADB POOSZ     NO. GO CHECK NEXT ENTRY.
      ISZ TEMP
      JMP LOOP1 
      JMP CKREP     NOT FOUND.
* 
SAVAD STB POOLA     FOUND. SAVE ADDR OF POOL ENTRY. 
* 
      LDA RQB+#LGC  IS THIS AN UPLIN LOG-OFF FOR A
      INA,SZA         TERMINATED/ABORTED MASTER PROGRAM?
      JMP KILL      NO. 
* 
      JSB LODWD     YES. TELL DS SLAVE MONITORS (#ATCH) NOT 
      IOR BIT13       TO ATTACH TO THIS DYING SESSION.
      JSB STUFF       (SET BIT 13 OF 1ST WORD IN #POOL ENTRY.)
* 
      JSB LUSES     GET SCB POINTER FOR THIS SESSION. 
      DEF *+2 
      DEF OFFID 
      SZA,RSS 
      JMP KILL1 
      STA SCBP      SAVE THE SCB POINTER. 
* 
      JSB $LIBR     GO PRIVILEGED.
      NOP 
* 
      LDA KEYWD     GET ADDRESS OF KEYWORD TABLE. 
      STA KEYPT     SET POINTER TO TOP OF TABLE.
SLOOP LDB KEYPT,I   GET NEXT ID SEGMENT ADDRESS.
      SZB,RSS 
      JMP IDEND     END OF LIST.
      ADB D32       POINT TO SCB POINTER WORD.
      LDA B,I       GET SCB POINTER, IF ANY.
      CPA SCBP      IS THIS ID SEGMENT ATTACHED TO THE
      RSS             SESSION TO BE LOGGED OFF? 
      JMP NXTID     NO. GO CHECK NEXT ID SEGMENT. 
* 
      ADB N20       YES. CHECK IF IT'S A DS SLAVE MONITOR.
      CLE,ELB 
      STB ADDR      BYTE ADDR OF NAME IN ID SEGMENT.
      LDA #MNUM     NUMBER OF SLAVE-STREAM TYPES. 
      CMA,INA 
      STA CNT       SET COUNTER.
* 
      LDB #LDEF     SEARCH SLAVE MONITOR NAMES
      ADB B2          FOR ID-SEGMENT NAME.
      STB TEMP      ADDR OF 1ST SLAVE-STREAM HEADER ADDR. 
HLOOP LDB TEMP,I    NEXT SLAVE-STREAM HEADER ADDR.
      ADB B2        ADDR OF MONITOR NAME IN ENTRY.
      CLE,ELB       BYTE ADDR OF MONITOR NAME.
      LDA ADDR      BYTE ADDR OF NAME IN ID SEGMENT.
      JSB .CBT      COMPARE THE NAMES.
      DEF B5
      NOP 
      JMP DTCHM     MATCH. GO DETACH THE DS MONITOR.
      NOP 
      ISZ TEMP      NO MATCH. GO TO NEXT SLAVE HEADER ADDR. 
      ISZ CNT 
      JMP HLOOP     LOOP TILL END OF HEADERS. 
      JMP NXTID     ATTACHED PROG NOT A DS MONITOR. 
* 
DTCHM LDB KEYPT,I   DETACH THE DS SLAVE MONITOR 
      ADB D32         FROM THE SESSION BY 
      CLA             CLEARING THE SCB POINTER WORD 
      STA B,I         IN THE ID SEGMENT.
* 
NXTID ISZ KEYPT     POINT TO NEXT ID SEGMENT. 
      JMP SLOOP     GO CHECK IT OUT.
* 
IDEND JSB $LIBX     GO UN-PRIVILEGED. 
      DEF *+1 
      DEF *+1 
* 
KILL  LDA OFFID     SET BIT 13 TO KILL ACTIVE PROGS.
      IOR BIT13 
      STA OFFID 
* 
      JSB .CLGF     CALL LOGOF. 
OFFID OCT 0         SESSION ID. 
*                                   (A) = COMPLETION CLASS #. 
      SSA,RSS       IF SESSION NOT INITIALIZED (!), 
      SZA,RSS         OR SCB NOT FOUND, 
      JMP *+2         SKIP THE CLASS BUFFER FLUSH.
* 
      JSB LRSPN     GET RESPONSE FROM LOGOF.
* 
KILL1 JSB RLEAS     RELEASE #POOL ENTRY AT "POOLA". 
* 
      CLA 
      STA SID 
* 
CKREP LDA RQB+#LGC  CHECK IF "NO-REPLY" LOG-OFF.
      INA,SZA 
      JMP REPLY     GO SEND A REPLY.
* 
      JSB #RSAX     NO REPLY. RELEASE "OPERM'S" TCB.
      DEF *+4 
      DEF B7
      DEF RQB+#SEQ    (SEQ # = 0) 
      DEF RQB+#STR    (STREAM 7 ) 
* 
      JMP CLEAR     GO RELEASE S.A.M. BUFFER. 
      SKP 
* 
* SUBR. TO PROCESS RESPONSE BUFFERS FROM REPLY CLASS OF LOGON AND LOGOF.
*     SET (A) = REPLY CLASS NUMBER PASSED FROM LOGON/LOGOF. 
*     RETURNS WITH ERROR CODE (OR ZERO) IN (A) AND IN "LGERR".
* 
LRSPN NOP 
      STA CLASS     STORE REPLY CLASS NUMBER. 
      LDA "RS"      PRE-LOADED IN CASE THERE IS 
      STA LGTYP       AN I/O CLASS ERROR ON LOGON STATUS. 
* 
LRSP1 JSB EXEC      GET RESPONSE FROM LOGON/LOGOF.
      DEF *+8 
      DEF SD21
      DEF CLASS     CLASS NUMBER. 
      DEF LGBUF     BUFR FOR ASCII MSGS.
      DEF B0        LENGTH. (NORMALLY 128 WORDS, BUT ASCII
      DEF IOP1        INFO NOT DISPL SINCE NOT INTERACTIVE. 
      DEF IOP2      PARAM FROM LOGON. 
      DEF CALL
      JMP LRSPE     ERROR RETURN. 
* 
      LDA CALL      FETCH CALL TYPE.
      CPA B1        MUST BE READ OR WRITE/READ. 
      RSS 
      JMP LRSP1     TRY AGAIN.
* 
      LDA IOP2      FETCH LOGON/LOGOF STATUS. 
      SSA,RSS       IF NEGATIVE (ERROR TERMINATION) 
      SZA,RSS         OR ZERO (GOOD LOGON/LOGOF RETURN) 
      RSS               CONTINUE, 
      JMP LRSP1       ELSE GET NEXT MESSAGE.
* 
      CLA           NO "RS" ERROR FROM LOGON STATUS,
      STA LGTYP       SO CLEAR THE ERROR TYPE.
      LDA CLASS     REMOVE "SAVE CLASS" BIT.
      XOR BIT13 
      STA CLASS 
* 
AGAIN JSB EXEC      RELEASE THE LOGON/LOGOF CLASS.
      DEF *+5 
      DEF SD21
      DEF CLASS 
      DEF LGBUF 
      DEF B0
      RSS 
      JMP AGAIN 
* 
      LDA IOP2      EXTRACT LOGON/LOGOF ERROR CODE
      ALF,ALF         (IF ANY). 
      RAL,RAL 
      AND B77 
      LDB "SM"      IF LOGON/OF ERROR,
      SZA,RSS 
      JMP LEXIT 
      STB LGTYP       SET ERROR TYPE = "SM".
      RSS 
LRSPE LDA B2        FORCED ERROR CODE FOR CLASS GET.
      CCE 
      JSB $CVT1     CONVERT ERROR CODE TO ASCII.
      IOR LB60      MAKE SURE LEFT BYTE IS ACSII. 
LEXIT STA LGERR     (ERROR TYPE ALREADY SET)
* 
      JMP LRSPN,I   RETURN TO CALLER. 
      SKP 
* 
* SUBROUTINE TO RELEASE #POOL ENTRY.
* 
RLEAS NOP 
      LDB POOLA     ADDR OF POOL ENTRY TO RELEASE.
      SZB,RSS 
      JMP RLEAS,I   EXIT IF NONE. 
* 
      JSB LODWD     GET WORD 1. 
      RAL           CHECK BIT 14 FOR CLONED PROG. 
      SSA,RSS 
      JMP RCLR      NO CLONED ID SEGMENT. 
* 
      LDB POOLA     GET NAME OF CLONED PROGRAM
      ADB B3          FROM #POOL ENTRY
      JSB LODWD       INTO LOCAL STORAGE. 
      STA BUF 
      INB 
      JSB LODWD 
      STA BUF+1 
      INB 
      JSB LODWD 
      STA BUF+2 
* 
      JSB IDRPD     RELEASE CLONED ID SEGMENT.
      DEF *+3 
      DEF BUFAD       ADDR OF PROGRAM NAME. 
      DEF TEMP        RETURNED ERROR CODE.
* 
RCLR  LDB POOLA     RELEASE #POOL ENTRY.
      JSB LODWD     GET WORD 1. 
      AND B377      CLEAR ALL LEFT BYTE FLAGS.
      JSB STUFF     STORE BACK. 
* 
      LDA POOSZ     CLEAR WORDS 2-LAST. 
      CMA,INA 
      INA 
      STA TEMP
      LDB POOLA 
      CLA 
CLENT INB 
      JSB STUFF 
      ISZ TEMP
      JMP CLENT 
* 
      JMP RLEAS,I   RETURN. 
      SKP 
* 
* SUBROUTINE TO STORE A WORD IN SAM.
* 
STUFF NOP 
      JSB $LIBR     GO PRIVILEGED.
      NOP 
MOD1  JMP STUF2     NOP HERE IF DMS.
      XSA B,I       STORE IN ALTERNATE MAP. 
      RSS 
STUF2 STA B,I 
      JSB $LIBX 
      DEF STUFF 
* 
* 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 
      SKP 
* 
* ERROR SECTION FOR ALL RSM-GENERATED ERRORS. 
* ("RS02" IS DONE IN THE "LRSPN" SUBROUTINE.) 
* 
RS03  CLA,INA       SET QUALIFIER = 1.
      STA LGQLF 
      LDA "03"      NODAL SESSION LIMIT EXCEEDED. 
      JMP ERTN1 
RS05  LDA "05"      WRONG PASSWORD FOR NON-SESSION. 
* 
ERTN1 STA LGERR     STORE AS LOGON ERROR CODE.
      LDA "RS"      SET ERROR CODE TYPE.
      STA LGTYP 
      CLA           CLEAR SESSION ID. 
      STA SID 
      LDA RQB+#STR  INITIALIZE RETRY COUNTERS.
      AND RTYCT 
      IOR #BREJ 
      STA RQB+#STR
* 
      JMP REPLY     SEND REPLY. 
* 
*  THIS REQUEST IS NON-RECOVERABLE, CLEAR, LOG, THEN IGNORE IT
* 
ERR1  NOP           HERE TO REPORT IRRECOVERABLE ERROR
      DST RQB+5     SAVE REGS FOR QCLM
      LDA @RSM      GET BASE ADDR OF "RSM". 
      CMA,INA       GET RELATIVE ERROR ADDRESS
      ADA ERR1        AND 
      STA RQB+4     PASS ERROR ADDR TO QCLM.
      DLD $TIME     RECORD TIME OF ERROR
      DST RQB+7 
      LDA PNAME     PASS PROGRAM NAME (RSM).
      STA RQB+9 
      DLD PNAME+1 
      DST RQB+10
      LDA #QCLM 
      SZA,RSS       IF NO QCLM, 
      JMP CLEAR       FORGET MESSAGE. 
* 
      JSB EXEC      MAILBOX WRITE/READ TO QCLM
      DEF *+8 
      DEF K20N
      DEF B0
      DEF RQB 
      DEF D12 
      DEF B0
      DEF B0
      DEF #QCLM 
      NOP 
* 
      JMP CLEAR     GO CLEAR BUFFER IN SAM. 
      SKP 
* 
*     CONSTANTS AND STORAGE 
* 
KEYWD EQU 1657B 
B0    OCT 0 
B1    OCT 1 
B2    OCT 2 
B3    OCT 3 
B5    OCT 5 
B7    OCT 7 
B40   OCT 40
B10K  OCT 010000
BIT13 OCT 020000
BIT15 OCT 100000
B77   OCT 77
B377  OCT 377 
B1774 OCT 177400
NOTQ  OCT 177417
SD21  OCT 100025
SLASH OCT 57
LB60  OCT 30000 
POOSZ DEC 7         SIZE OF #POOL ENTRY.
D11   DEC 11
D12   DEC 12
D14   DEC 14
D21   DEC 21
D32   DEC 32
D254  DEC 254 
N2    DEC -2
N10   DEC -10 
N20   DEC -20 
N33   DEC -33 
K20N  OCT 100024
C#MHD ABS #MHD
SNODE NOP 
SLEVL NOP 
POOLA NOP 
LGTYP NOP 
LGERR NOP 
LGQLF NOP 
LGFLG NOP 
PDFLG OCT 0 
PDFID OCT 0 
PDFEN NOP 
SLSHF NOP 
TEMP  NOP 
CLASS NOP 
CALL  NOP 
CNT   NOP 
SCBP  NOP 
ADDR  NOP 
KEYPT NOP 
IOP1  NOP 
IOP2  NOP 
@RSM  DEF RSM 
PNAME ASC 3,RSM 
LGBUF BSS 1         CAN BE MADE 128 WORDS IF NEED ARISES. 
DLGBF DEF LOGBF 
LOGBF BSS 16
LGLEN NOP 
BUFAD DEF BUF 
BUF   BSS 3 
RPBIT OCT 40000 
RTYCT OCT 170077    STREAM WORD RETRY COUNT MASK
* 
"RS"  ASC 1,RS
"SM"  ASC 1,SM
"XX"  ASC 1,XX
BLNKS ASC 1,
"00"  ASC 1,00
"03"  ASC 1,03
"05"  ASC 1,05
"08"  ASC 1,08
"DS"  ASC 1,DS
C#MXR ABS #MXR
* 
      BSS 0         SIZE OF RSM.
* 
      END RSM 
                                                                                                                                                                                                                                          