ASMB,R,Q,C
      HED #SCSM 91750-1X033 REV 2013 * (C) HEWLETT-PACKARD CO. 1980 
      NAM #SCSM,7 91750-1X033 REV.2013 800507 ALL 
      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 #SCSM 
* 
      EXT $DSCS,#RPB,#POOL,#CLON
      EXT $LIBR,$LIBX,$OPSY,.DRCT,.MVW
* 
RQB   EQU #RPB
* 
      SUP 
* 
* NAME:   #SCSM 
* SOURCE: 91750-18033 
* RELOC:  PART OF 91750-12014, -12015 
* PGMR:   JIM HARTSELL
* 
* 
* 
* SUBROUTINE TO PERFORM SESSION-MONITOR PREPROCESSING AND POSTPROCESSING
* OF DEXEC SCHEDULE REQUESTS FOR THE EXECW MODULE AND FOR POPEN, FINIS
* REQUESTS FOR THE PTOPM MODULE.
* 
*  CALLING SEQUENCES: 
* 
*      PREPROCESSING: 
* 
*        CLA
*        JSB #SCSM
*         P+1       ERROR RETURN. COULD NOT PERFORM REQUESTED CLONING.
*         P+2       NORMAL RETURN.
* 
* 
*      POSTPROCESSING...WHEN SCHEDULED PROGRAM TERMINATES:
* 
*        (A) = ADDRESS OF PROGRAM NAME
*        JSB #SCSM
      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 
* DXBLK-START 
* 
******************************************************************
*                                                                *
*      D E X E C   B L O C K                REV 2013 800221      *
*                                                                *
*      OFFSETS INTO DS/1000 DEXEC MESSAGE BUFFERS, USED BY:      *
*                                                                *
*       DEXEC, EXECM, EXECW, RQCNV, RPCNV, FLOAD, REMAT          *
*                                                                *
******************************************************************
* 
* OFFSETS INTO DEXEC REQUEST BUFFERS. 
* 
#ICD  EQU #REQ      ICODE FOR DEXEC(ALL)
#CNW  EQU #ICD+1    CONWD FOR DEXEC(1,2,3,13) 
#CWX  EQU #CNW+1    DLUEX EXTENSION FOR DEXEC(1,2,3,13) 
#BFL  EQU #CWX+1    IBUFL FOR DEXEC(1,2)
#PM1  EQU #BFL+1    IPRM1 FOR DEXEC(1,2)
#PM2  EQU #PM1+1    IPRM2 FOR DEXEC(1,2)
#ZOF  EQU #PM1      Z-BUFFER OFFSET FOR DEXEC(1,2,3,13) 
#ZLN  EQU #PM2      Z-BUFFER LENGTH FOR DEXEC(1,2,3,13) 
#PR2  EQU #PM2+1    2ND OPT. PARAMETER FOR DEXEC(3) [RTE-L].
#KEY  EQU #PR2+1    KEYWORD(RN) FOR DEXEC(1,2,3) [RTE-L]. 
#PRM  EQU #CWX+1    IPRAM FOR DEXEC(3)
#PGN  EQU #ICD+1    PRGNM FOR DEXEC(6,9,10,12,23,24,99) 
#INU  EQU #PGN+3    INUMB FOR DEXEC(6)
#DPM  EQU #INU+1    PARMS FOR DEXEC(6)         (5-WORD AREA)
#PMS  EQU #PGN+3    PARMS FOR DEXEC(9,10,23,24)(5-WORD AREA)
#IBF  EQU #PMS+5    IBUFR FOR DEXEC(9,10,23,24) 
#IBL  EQU #IBF+1    IBUFL FOR DEXEC(9,10,23,24) 
#FNO  EQU #IBL+1    FNOD  FOR DEXEC(9)          (APLDR) 
#RSL  EQU #PGN+3    IRESL FOR DEXEC(12) 
#MPL  EQU #RSL+1    MTPLE FOR DEXEC(12) 
#HRS  EQU #MPL+1    IHRS  FOR DEXEC(12) 
#MIN  EQU #HRS+1    IMIN  FOR DEXEC(12) 
#SEC  EQU #MIN+1    ISECS FOR DEXEC(12) 
#MSC  EQU #SEC+1    MSECS FOR DEXEC(12) 
#PAR  EQU #ICD+1    PARTI FOR DEXEC(25)        (PARTITION #)
#IST  EQU #PGN+3    ISTAT FOR DEXEC(99) 
* 
* OFFSETS INTO DEXEC REPLY BUFFERS. 
* 
#EQ5  EQU #EC1      EQT 5 FOR DEXEC(1,2,3)
#XML  EQU #EC2      TRANSMISSION LOG (DEXEC 1,2)
#RPM  EQU #REP      PRAMS FOR DEXEC(9,23)      (5-WORD AREA)
#TMS  EQU #REP      MSEC  FOR DEXEC(11) 
#TSC  EQU #TMS+1    SEC   FOR DEXEC(11) 
#TMN  EQU #TSC+1    MIN   FOR DEXEC(11) 
#THR  EQU #TMN+1    HRS   FOR DEXEC(11) 
#TDA  EQU #THR+1    DAY   FOR DEXEC(11) 
#TYR  EQU #TDA+1    YEAR  FOR DEXEC(11) 
#ST1  EQU #REP      ISTA1 FOR DEXEC(13) 
#ST2  EQU #ST1+1    ISTA2 FOR DEXEC(13) 
#ST3  EQU #ST2+1    ISTA3 FOR DEXEC(13) 
#ST4  EQU #ST3+1    ISTA4 FOR DEXEC(13) [RTE-L].
#PAG  EQU #REP      IPAGE FOR DEXEC(25) 
#IPN  EQU #PAG+1    IPNUM FOR DEXEC(25) 
#PST  EQU #IPN+1    ISTAT FOR DEXEC(25) 
#KST  EQU #REP      ISTAT FOR DEXEC(99) 
* 
* MAXIMUM SIZE OF DEXEC REQUEST/REPLY BUFFER. 
* 
#DLW  EQU #MHD+11+#LSZ   M A X I M U M   S I Z E   ! ! !
* 
* MAXIMUM SIZE OF DEXEC/EXECM DATA BUFFER.
* 
#DBS  EQU 512            M A X I M U M  S I Z E    ! ! !
* 
* DXBLK-END 
      SPC 5 
* PPBLK-START 
* 
******************************************************************
*                                                                *
*      P T O P   B L O C K                 REV 2013 791119       *
*                                                                *
*      OFFSETS INTO DS/1000 PTOP MESSAGE BUFFERS, USED BY:       *
*                                                                *
*   POPEN, PTOPM, GET/ACEPT/REJCT, RQCNV, RPCNV, DINIT, REMAT    *
*   #SCSM                                                        *
******************************************************************
* 
* OFFSETS INTO PTOP REQUEST AND REPLY BUFFERS.
* 
#FCD  EQU #REP      FUNCTION CODE.
#PCB  EQU #FCD+1    PCB AREA (3 WORDS). 
#TAG  EQU #PCB+3    TAG AREA (20 WORDS).
* 
* MAXIMUM SIZE OF PTOP REQUEST/REPLY BUFFER.
* 
#PLW  EQU #MXR      M A X I M U M   S I Z E    ! ! !
* 
* PPBLK-END 
      SKP 
A     EQU 0 
B     EQU 1 
* 
* 
#SCSM NOP           ENTRY.
      LDB $OPSY 
      RBR,SLB       SKIP IF NON-DMS.
      CLB,RSS 
      JMP ENTYP 
      STB MOD1      DMS.
* 
ENTYP SZA           CHECK TYPE OF ENTRY.
      JMP UNCLO     GO HANDLE TERMINATION.
* 
      LDB #POOL     IF #POOL NOT SET UP,
      SZB,RSS 
      JMP EXIT        DON'T DO ANYTHING.
* 
      LDA RQB+#STR  CHECK TYPE OF REQUEST.
      AND B77 
      CPA B3
      JMP SCSM1 
      CPA B4
      JMP SCSM2 
      JMP SMNOD 
* 
SCSM1 JSB .DRCT     DEXEC(9) REQUEST: 
      DEF RQB+#PGN    GET ADDR OF PROGRAM NAME. 
      STA NAMAD 
      LDA RQB+#ICD    IF BIT 11 OF ICODE
      ALF               IS SET, 
      JMP SCSM3         SET "CLONE FLAG". 
* 
SCSM2 JSB .DRCT     POPEN REQUEST:
      DEF RQB+#PCB    GET ADDR OF SLAVE PROG NAME.
      STA NAMAD 
      LDA RQB+#FCD    IF BIT 13 OF FCODE
      RAL,RAL           IS SET, 
SCSM3 CLB               SET "CLONE FLAG". 
      SSA 
      INB 
      STB CFLAG 
* 
SMNOD LDA $DSCS     SESSION MONITOR NODE? 
      SSA,RSS 
      JMP CLONE     YES. GO CHECK FOR CLONING.
* 
* NON-SESSION NODE.  BUILD A TEMPORARY #POOL ENTRY FROM WHICH THE 
* SCHEDULED PROGRAM'S #MSSM ROUTINE CAN FIND THE SOURCE NODE AND
* SESSION FROM WHICH THE PROGRAM WAS SCHEDULED.  THIS IS USED FOR 
* REDIRECTING THE PROGRAM'S REMOTE REQUESTS TO THE ORIGINATING SESSION
* AT AN HP 1000 OR AN HP 3000.
* >>>> CAUTION! <<<<  WHEN EXECW GETS THE SMARTS TO SCHEDULE MORE 
* THAN ONE PROGRAM AT A TIME, THERE CAN BE MORE THAN ONE #POOL ENTRY
* WITH THE SAME PROGRAM NAME (AND NO POOL SESSION ID)... WILL NEED
* A WAY FOR #MSSM'S "ROOTS" ROUTINE (CASE 3) TO TELL WHICH ONE. 
* 
      LDA RQB+#SID  SOURCE SESSION ID IN REQUEST? 
      ALF,ALF         (OR MPE PROCESS NUMBER) 
      AND B377
      SZA,RSS 
      JMP EXIT      NO. RETURN. 
* 
      STA SSID      YES.  SAVE THE SOURCE SESSION ID. 
      LDB #POOL     FIND AN AVAILABLE #POOL ENTRY.
      JSB LODWD     GET # POOL ENTRIES (NEGATIVE).
      STA TEMP
      INB           POINT TO 1ST POOL ENTRY.
LOOP  JSB LODWD     (CROSS) LOAD WORD 1 OF ENTRY. 
      SSA,RSS       IS SIGN BIT SET?
      JMP IDFND     NO. THIS ENTRY IS AVAILABLE.
      ADB POOSZ     BUMP ADDR TO NEXT ENTRY.
      ISZ TEMP      END OF POOL?
      JMP LOOP      NO. CONTINUE. 
* 
      JMP EXIT      YES. CAN'T REDIRECT FOR THIS USER!
* 
IDFND IOR BIT15     SET SIGN BIT FOR "IN USE".
      JSB STUFF     STORE BACK TO S.A.M.
      STB POOLA     SAVE ADDRESS OF #POOL ENTRY.
* 
      INB           BUILD THE TEMP #POOL ENTRY. 
      LDA RQB+#SRC  STORE SOURCE NODE NUMBER. 
      JSB STUFF 
      INB 
      LDA SSID      STORE SOURCE SESSION ID.
      JSB STUFF 
CNAME INB 
      LDA NAMAD 
      STA ADDR
      LDA ADDR,I    STORE SCHEDULEE'S NAME. 
      JSB STUFF 
      INB 
      ISZ ADDR
      LDA ADDR,I
      JSB STUFF 
      INB 
      ISZ ADDR
      LDA ADDR,I
      JSB STUFF 
* 
      LDA SEQNO     BUMP #POOL ENTRY "EXECW SEQUENCE
      CPA B377        NUMBER" THAT #MSSM USES TO DETECT 
      CLA             A NEW SCHEDULE OF A CORE-RESIDENT 
      INA             PROGRAM BY EXECW (AND CAN THEN
      STA SEQNO       CLEAR PRIOR NETWORK ACC'T TABLE). 
      LDB POOLA 
      ADB B2        STORE EXECW SEQ # IN #POOL ENTRY. 
      JSB LODWD       (FETCH SEQNO WORD,
      AND B377         CLEAR OLD SEQNO, 
      ALF,ALF          SWITCH BYTES,
      IOR SEQNO        INSERT NEW SEQNO,
      ALF,ALF          AND SWITCH BACK.)
      JSB STUFF 
* 
EXIT  ISZ #SCSM     EXIT TO NORMAL EXECW/PTOPM PROCESSING.
      JMP #SCSM,I 
* 
* SESSION NODE.  CREATE A COPY OF THE PROGRAM IF "RW" FROM REMAT, 
* OR IF SPECIAL "CLONE" POPEN REQUEST.
* 
CLONE CLA           INITIALIZE "CLONED" FLAG
      STA CLONF       FOR #POOL ENTRY.
      LDA CFLAG     IS CLONING REQUESTED? 
      SZA,RSS 
      JMP CATLG     NO. 
* 
      LDA RQB+#SID  YES. GET DESTINATION SESSION ID.
      AND B377
      STA TEMP      SAVE FOR #POOL SEARCH.
      CPA D254      IF USER HAS NON-SESSION ACCESS, 
      JMP EXIT          DON'T CLONE (NO #POOL ENTRY). 
* 
      LDA RQB+#STR  IF REQUEST IS FROM A 3000,
      SSA             IGNORE "LOCAL NODE" TEST. 
      JMP CLON1 
      LDA RQB+#SRC  IF DESTINATION NODE = 
      CPA RQB+#DST    SOURCE NODE,
      JMP EXIT        DON'T CLONE (NO #POOL ENTRY). 
* 
CLON1 LDA TEMP      GET DESTINATION SID.
      LDB NAMAD     GET ADDRESS OF PROGRAM NAME.
* 
      JSB #CLON     CLONE THE PROGRAM.
      JMP #SCSM,I   COULD NOT CLONE SP'D PROGRAM. 
      JMP CATLG     PROG KNOWN TO SYS BUT CAN'T CLONE IT. 
* 
      LDA B         PROGRAM WAS CLONED. 
      LDB NAMAD     MOVE NEW NAME TO
      JSB .MVW        DEXEC/POPEN REQUEST.
      DEF B3
      NOP 
* 
      LDA BIT14     SET "CLONED" FLAG 
      STA CLONF       FOR #POOL ENTRY.
* 
CATLG LDB #POOL     FIND #POOL ENTRY AND STORE
      JSB LODWD       NAME (CAN BE CLONED NAME).
      STA CNTR
      INB 
LOOP2 JSB LODWD     (CROSS) LOAD NEXT POOL SID. 
      SSA,RSS 
      JMP NEXT1     NOT IN USE. 
      AND B377      IN USE. COMPARE DEST SID. 
      CPA TEMP
      JMP FOUND     FOUND.
NEXT1 ADB POOSZ     GO TO NEXT #POOL ENTRY. 
      ISZ CNTR
      JMP LOOP2 
      JMP EXIT      NOT IN #POOL. 
* 
FOUND STB POOLA     SAVE ADDRESS OF #POOL ENTRY.
      JSB LODWD     SET "CLONED" BIT IN #POOL ENTRY 
      IOR CLONF       IF PROGRAM WAS CLONED.
      JSB STUFF 
      ADB B2        BUMP POINTER. 
* 
      JMP CNAME     GO STORE PROGRAM NAME IN ENTRY. 
      SKP 
* 
* PERFORM PROCESSING FOR TERMINATION OF EXECW-SCHEDULED PROGRAMS
* AND FOR PTOP SLAVE PROGRAMS.
* 
UNCLO EQU * 
      STA NAMAD     SAVE ADDR OF PROGRAM NAME.
* 
* SEE IF PROGRAM NAME IN IN A #POOL ENTRY (WHETHER S.M. NODE OR NOT). 
* 
      LDB #POOL     GET ADDR OF SID POOL. 
      SZB,RSS       IF NOT SET UP,
      JMP #SCSM,I     DON'T DO ANYTHING.
      JSB LODWD     GET NEG. # OF POOL ENTRIES. 
      STA CNTR      SAVE COUNTER. 
      INB           POINT TO WORD 1 OF 1ST ENTRY. 
      STB POOLA 
* 
LOOP1 LDA NAMAD     RESET NAME ARRAY POINTER. 
      STA PTR 
      LDB POOLA 
      JSB LODWD     (CROSS) LOAD NEXT POOL SID. 
      SSA,RSS 
      JMP NEXT      NOT IN USE. 
* 
      ADB B3        IN USE. COMPARE PROGRAM NAMES.
      JSB LODWD 
      CPA PTR,I 
      RSS 
      JMP NEXT
      INB 
      JSB LODWD 
      ISZ PTR 
      CPA PTR,I 
      RSS 
      JMP NEXT
      INB 
      JSB LODWD 
      AND B1774 
      STA TEMP
      ISZ PTR 
      LDA PTR,I 
      AND B1774 
      CPA TEMP
      JMP CKSID     NAMES MATCH. POOLA = POOL ENTRY ADDR. 
* 
NEXT  LDB POOLA     NO MATCH. 
      ADB POOSZ 
      STB POOLA 
      ISZ CNTR
      JMP LOOP1     GO CHECK NEXT #POOL ENTRY.
* 
      JMP #SCSM,I   NAME NOT FOUND IN #POOL.
* 
* NAME FOUND IN A #POOL ENTRY.
* 
CKSID LDA $DSCS     SESSION NODE? 
      SSA 
      JMP RPOOL     NO. 
* 
* CHECK IF PROGRAM WAS CLONED & RELEASE ITS ID SEGMENT. 
* 
      LDB POOLA     CHECK "CLONED" BIT IN #POOL ENTRY.
      JSB LODWD 
      RAL             (CHECK BIT 14)
      SSA,RSS 
      JMP CLNAM     NOT CLONED. GO CLEAR NAME.
* 
      ELA,CLE,ERA   CLONED. CLEAR FLAG IN #POOL ENTRY.
      RAR 
      JSB STUFF 
      CLA 
      LDB NAMAD 
      JSB #CLON     RELEASE CLONED ID SEGMENT.
* 
CLNAM LDA N3        CLEAR PROG NAME IN #POOL ENTRY. 
      STA TEMP
      LDB POOLA 
      ADB B2
      CLA 
      JMP CLENT 
* 
* RELEASE TEMPORARY #POOL ENTRY.
* 
RPOOL LDB POOLA 
      JSB LODWD     GET WORD 1. 
      AND B377      CLEAR 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 #SCSM,I   RETURN TO CALLER. 
      SKP 
* 
* 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. 
      SPC 5 
* 
* SUBROUTINE TO STORE A WORD IN S.A.M.
* 
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     RETURN. 
      DEF STUFF 
      SKP 
* 
* CONSTANTS AND STORAGE.
* 
B377  OCT 377 
BIT14 OCT 40000 
BIT15 OCT 100000
B2    OCT 2 
B3    OCT 3 
B4    OCT 4 
B77   OCT 77
B1774 OCT 177400
D254  DEC 254 
N3    DEC -3
POOSZ DEC 7         SIZE OF #POOL ENTRY.
SEQNO OCT 0 
CLONF NOP 
CFLAG NOP 
ADDR  NOP 
SSID  NOP 
NAMAD NOP 
CNTR  NOP 
POOLA NOP 
PTR   NOP 
TEMP  NOP 
* 
      BSS 0         SIZE OF #SCSM.
* 
      END 
                                                                                  