ASMB,R,L,C
      HED  <RES> DS/1000 RESIDENT STORAGE * (C) HEWLETT-PACKARD CO. 1979 *
      NAM RES,30 91740-16031 REV.2026 800429
      SPC 1 
      ENT #BUSY,#FWAM,#GRPM,#BREJ,#LDEF,#MNUM,#MRTH 
      ENT #PNLH,#TRCL,#TRCN,#CL3K 
      ENT #RDLY,#PRLU 
      ENT #MSTO,#NODE,#NCNT, #NRV,#NULL, #QRN,#RSAX,#RTRY 
      ENT #ST00,#ST01,#ST02,#ST03,#ST04,#ST05,#ST06,#ST07 
      ENT #ST08,#ST09,#ST10,#SVTO,#TBRN,#WAIT,#CNOD,#LNOD 
      ENT #QCLM,#NCLR,#SCLR,#SWRD,#PLOG,#RFSZ,#SAVM 
      ENT #RPCV,#RQCV,#LU3K,#QZRN,#QXCL,#TST
      ENT D$LID,D$RID 
      SPC 1 
      EXT #PRLX 
      EXT $ALC,$CGRN,$LIBR,$LIBX,$OPSY,$RTN,.ENTP 
* 
*    NAME:   RES
*    SOURCE: 91740-18031
*    RELOC:  91740-16031
*    PGMR:   C. HAMILTON  [ 03/02/77 ]
*            D. TRIBBY    [ 03/17/77 ]  * HP3000 MODIFICATIONS *
*            LYLE WEIMAN  [ 08/05/78 ]
*            TOM MILNER   [ 04/29/80 ]  * REMOVED 'LSTEN' CHECKS *
* 
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  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 5 
*  RES IS A MEMORY-RESIDENT SYSTEM LIBRARY MODULE USED BY THE 
*   DS/1000 (DISTRIBUTED SYSTEMS) SOFTWARE PACKAGE TO PROVIDE 
*   CONTROLLED-ACCESS COMMON STORAGE. ITEMS STORED IN <RES> ARE NETWORK 
*   GLOBAL CONSTANTS & VARIOUS LISTS WHICH CONTAIN THE TRANSACTION-BLOCK
*   RECORDS OF CURRENT TRANSACTIONS-IN-PROCESS ON THE NETWORK.
* 
      SPC 5 
*  #RSAX IS A PRIVILEGED LIBRARY ROUTINE EMBEDDED IN RES
*   WHICH CONTROLS ACCESS TO, AND ALLOWS MAINTENANCE OF, THE
*   NETWORK'S TRANSACTION-CONTROL-BLOCKS (TCB'S) FOR CURRENT REQUESTS.
* 
      SKP 
*  #RSAX OPERATION: 
      SPC 1 
*   1. ON FIRST ENTRY, VERIFY THAT CALLER IS <LSTEN>  ELSE, ERROR #1! 
*     A. SAVE <LSTEN> I.D. SEGMENT ADDRESS FOR S.A.M. VALIDITY CHECKS.
*     B. IF BIT #1 OF $OPSY =1, THEN OP-SYSTEM USES DMS HARDWARE, 
*        REQUIRING THE USE OF OF DMS FIRMWARE MACRO INSTRUCTIONS. 
*     C. IF DMS, THEN CLEAR THE DMS-BYPASSING JUMP INSTRUCTIONS.
*     D. IF NON-DMS, ALLOW BYPASS INSTRUCTIONS TO REMAIN. 
*     E. CLEAR THE 'JSB' TO THE INITIALIZATION ROUTINE. 
      SPC 1 
*   2. GET PARAMETERS & SAVE LOCALLY, IN PREPARATION FOR DMS MAP SWITCHING. 
*     A. IF DMS SYSTEM, THEN SAVE MAP STATUS AND SWITCH TO SYSTEM MAP.
      SPC 1 
*   3. CHECK MODE OF OPERATION: 
*     A. IF =0, GO TO 7. TO ALLOCATE SYSTEM MEMORY. 
*     B. IF =1, GO TO 7. TO DE-ALLOCATE SYSTEM MEMORY.
*     C. IF =2, GO TO 4. TO ADD NEW ENTRY TO MASTER-REQUEST LIST. 
*     D. IF =3, GO TO 5. TO ADD NEW ENTRY TO A SLAVE-STREAM LIST. 
*     E. IF =4, GO TO 6. TO SEARCH FOR A MASTER TCB ENTRY.
*     F. IF =5, GO TO 6. TO SEARCH FOR A SLAVE TCB ENTRY. 
*     G. IF =6, GO TO 6. TO REMOVE A MASTER ENTRY & RETURN IT TO THE POOL.
*     H. IF =7, GO TO 6. TO REMOVE A SLAVE ENTRY & RETURN IT TO THE POOL. 
*     I. IF =8, GO TO 4. TO ADD AN HP3000 PROCESS.
*     J. IF=10, GO TO 6. TO REMOVE AN HP3000 PROCESS. 
*     K. IF NONE OF THE ABOVE - ERROR #2 --- REJECT!
      SPC 1 
*   4. CHECK FOR AVAILABLE ENTRY, BEFORE ADDING TO THE MASTER LIST. 
*     A. IF NONE AVAILABLE, CALLER HAS NOT CHECKED AVAILABILITY OF
*        TABLE-ACCESS RN (#TBRN) BEFORE ENTRY - ERROR #3 --- REJECT!
*     B. IF ENTRY AVAILABLE, SEARCH BY ID SEG. ADDR. FOR OBSOLETE 
*        ENTRIES IN THE MASTER REQUEST LIST.
*     C. FLAG ALL OBSOLETE MASTER-REQUEST ENTRIES AS BAD, IF THEY 
*        ORIGINATED WITH SAME REQUESTOR (BIT#15 =1 OF WORD#5).
*     D. LINK THE NEW ENTRY INTO THE MASTER REQUEST LIST. 
*     E. USE TIMEOUT FROM NRV--IF SPECIFIED; ELSE USE DEFAULT: #MSTO. 
*     F. TRANSFER THE CALLER'S DATA INTO THE NEW ENTRY. 
*     G. IF ENTRY POOL NOT DEPLETED, CLEAR TABLE-ACCESS RN & RETURN.
      SPC 1 
*   5. CHECK FOR AVAILABLE ENTRY, BEFORE ADDING TO THE SLAVE-STREAM LIST. 
*     A. IF NONE, #TBRN NOT CHECKED BEFORE ENTRY - ERROR #3 --- REJECT! 
*     B. CHECK STREAM PARAMETER FOR ACCEPTABLE TYPE--ERROR #1, IF INVALID.
*     C. LINK THE NEW ENTRY INTO THE SPECIFIED SLAVE-STREAM LIST. 
*     D. TRANSFER CALLER'S DATA INTO THE NEW ENTRY. 
*     E. RETURN VIA 4.G.(ABOVE), TO UPDATE STATUS OF TABLE-ACCESS RN. 
      SPC 1 
*   6. INITIALIZE LIST POINTERS, BEFORE SEARCHING FOR/CLEARING AN ENTRY.
*     A. IF IMPROPER LIST SPECIFIED - ERROR #1 --- REJECT!
*     B. SEARCH FOR ENTRY. IF ENTRY NOT LOCATED, REJECT---ERROR #4! 
*     C. IF MODE=4/5, GET CONTENTS OF ENTRY WORD#4 & RETURN TO CALLER.
*     D. IF MODE=6/7, GET CONTENTS OF WD#4 & RE-LINK ENTRY IN NULL LIST.
*     E. RETURN VIA 4.G.(ABOVE), TO UPDATE STATUS OF TABLE-ACCESS RN. 
      SPC 1 
*   7. VERIFY CALLER TO BE <LSTEN> BEFORE ALLOCATION/DE-ALLOCATION OF S.A.M.
*     A. IF MODE & #FWAM =0, GO TO ALLOCATE SYSTEM AVAILABLE MEMORY.
*     B. IF REQUEST GRANTED, STORE BLOCK ADDRESS IN #FWAM, SIZE IN #SAVM. 
*     D. IF REQUEST DENIED, RETURN REASON IN <A&B>, FOR FURTHER ANALYSIS. 
*     E. IF MODE=1 & PRAM1=#FWAM, RETURN MEMORY TO THE SYSTEM.
*     F. CLEAR #FWAM & #SAVM, BEFORE RETURNING TO <LSTEN>.
      SKP 
*  #RSAX CALLING SEQUENCE:
* 
*   JSB #RSAX 
*   DEF *+3 [ OR *+4 OR *+5 ] 
*   DEF MODE      MODE OF OPERATION (0 THRU 7)
*   DEF PRAM1     REQUIRED PARAMETER (SEE TABLE, BELOW) 
*   DEF PRAM2     REQUIRED FOR MODES: 2,3,5,7 [OPTIONAL MODES: 0,1,4,6] 
*   DEF PRAM3     REQUIRED FOR MODES 2 & 3 ONLY (NODAL ADDRESS) 
*   <RETURN>      <A&B>: NORMAL-(SEE TABLE); ERROR-(SEE LATER DESCRIPTION)
* 
*  WHERE: 
* 
* +----+------------+--------------+------------+---------+-------+-------+ 
* !MODE!   ACTION   !    PRAM1     !    PRAM2   !  PRAM3  !<A> RTN!<B> RTN! 
* !====+============+==============+============+=========+=======+=======+ 
* !  0 ! GET MEMORY !#WORDS TO GET ! NOT USED   ! NOT USED!FWA SAM! #WORDS! 
* +----+------------+--------------+------------+---------+-------+-------+ 
* !  1 ! RTN MEMORY !FWA SAM BLOCK ! NOT USED   ! NOT USED!   0   !   0   ! 
* +----+------------+--------------+------------+---------+-------+-------+ 
* !  2 ! ADD MASTER !MASTER CLASS# !ID SEG.ADDR.!DEST.NODE!LOC SEQ!TCB ADR! 
* +----+------------+--------------+------------+---------+-------+-------+ 
* !  3 ! ADD SLAVE  !ORIG. SEQ. NO.!SLAVE STREAM!ORIG.NODE!LOC SEQ!TCB ADR! 
* +----+------------+--------------+------------+---------+-------+-------+ 
* !  4 ! FIND MASTER!LOCAL SEQ. NO.! NOT USED   ! NOT USED!CLASS# !TCB ADR! 
* +----+------------+--------------+------------+---------+-------+-------+ 
* !  5 ! FIND SLAVE !LOCAL SEQ. NO.!SLAVE STREAM! NOT USED!ORG SEQ!TCB ADR! 
* +----+------------+--------------+------------+---------+-------+-------+ 
* !  6 !CLEAR MASTER!LOCAL SEQ. NO.! NOT USED   ! NOT USED!CLASS# !   0   ! 
* +----+------------+--------------+------------+---------+-------+-------+ 
* !  7 !CLEAR SLAVE !LOCAL SEQ. NO.!SLAVE STREAM! NOT USED!ORG SEQ!   0   ! 
* +----+------------+--------------+------------+---------+-------+-------+ 
* !  8 ! ADD PNL    ! LOGGING LU # !ID SEG.ADDR.!PROCESS #!LOC.SEQ!TCB ADR! 
* +----+------------+--------------+------------+---------+-------+-------+ 
* ! 10 ! CLEAR PNL  !PROCESS NUMBER! NOT USED   ! NOT USED! LOG LU!   0   ! 
* +----+------------+--------------+------------+---------+-------+-------+ 
* 
*  #RSAX ERROR INDICATIONS: 
* 
*     ERROR DETECTION WILL RESULT IN A RETURN TO THE CALLER WITH THE
*     REQUESTED ACTION NOT PERFORMED. 
* 
*      <A&B> = -1: AN INVALID LIST HAS BEEN SPECIFIED; FIRST CALLER 
*                  IS NOT <LSTEN>; MEMORY ALLOCATION/DE-ALLOCATION IMPROPER.
* 
*      <A&B> = -2: THE SPECIFIED MODE OF OPERATION IS UN-DEFINED. 
* 
*      <A&B> = -3: NO SPACE FOR A NEW ENTRY. THE CALLER DID NOT WAIT FOR
*                  THE TABLE-ACCESS RESOURCE NUMBER (#TBRN) TO BE CLEARED,
*                  PRIOR TO CALLING #RSAX. (THIS SHOULD NOT OCCUR IF ALL
*                  CALLERS ADHERE TO THE RN CONVENTION, PRIOR TO CALLING.)
* 
*      <A&B> = -4: ENTRY CANNOT BE LOCATED; ACCESSING AN EMPTY LIST.
* 
*      MODE 0 (  ALLOCATION ): <A>=-1,<B>=MAXIMUM POSSIBLE NO. OF WORDS.
*                              <A>= 0,<B>=MAXIMUM WORDS AVAILABLE NOW.
*           1 (DE-ALLOCATION): NO ERRORS INDICATED. 
      SKP 
*  LIST FORMATS:
* 
*                          'RES'                 SYSTEM AVAILABLE MEMORY
*             -------------------------------   ------------------------- 
* 
*       #PNLH < ADDR 1ST PROCESS# LIST ENTRY>...<ADDR.=NEXT PRCS # ENTRY >
*                                               < ---------------------- >
*                                               <    PROCESS  NUMBER     >
*                                               <  LOGGING  LU  NUMBER   >
*                                               <B* I.D. SEGMENT ADDRESS >
* 
*       #MRTH < ADDR.=1RST MASTER-LIST ENTRY>...<ADDR.=NEXT MASTER ENTRY >
*                                               < UD------*TIMEOUT CNTR. >
*                                               < LOCAL SEQUENCE NUMBER  >
*                                               <C* MASTER CLASS NUMBER  >
*                                               <B* I.D. SEGMENT ADDRESS >
* 
*       #ST00 <ADDR.=1RST STRM. 0 LIST-ENTRY>...<ADDR.=NEXT STRM. 0 ENTRY>
*         .   <- *  MONITOR'S CLASS NUMBER  >   < UD------*TIMEOUT CNTR. >
*         .   <A*MONITOR I.D.SEGMENT ADDRESS>   < LOCAL SEQUENCE NUMBER  >
*         .                                     < ORIGIN SEQUENCE NUMBER >
*         .                                     <  ORIGIN NODAL ADDRESS  >
*         . 
*         . 
*       #STXX < ******* FORMAT SAME ******* >...< **** FORMAT SAME ***** >
*             < ********* FOR ALL ********* >   < ******** FOR ********* >
*             < ****** SLAVE STREAMS ****** >   < ******** ALL ********* >
*                                               < ******* SLAVE ******** >
*                                               < ****** STREAMS ******* >
* 
*       WHERE: - = RESERVED FOR FUTURE USE.  A(#15) = ABORT OK. 
*              B(#15) = BAD ENTRY.
*              C(#15)  = LONG MASTER TIMEOUT (APPROXIMATELY 20 MIN.)
*              U(#15)  = UPLIN TEMPORARY BIT. D(#14) = HP3000 REQUEST.
* 
*       *NOTE: 0 IN LIST HEAD OR FIRST WORD OF ENTRY SIGNALS END OF LIST. 
* 
* 
*  NETWORK ROUTE VECTOR TABLE:
* 
*       #NCNT < NEGATIVE NUMBER OF NRV PAIRS> 
*       #NRV  <    ADDRESS OF NRV TABLE     >...< NODAL ADDRESS (0-32767)>
*                                               <LU CONNECTING ABOVE NODE>
*                                               <  *** NODAL ADDRESS *** >
*                                               <  *** LOGICAL UNIT ***  >
*                                                           . 
*                                                           : 
* 
      SKP 
MODE  NOP           MODE OF OPERATION.
PRAM1 NOP           USER
PRAM2 NOP            SPECIFIED
PRAM3 NOP             PARAMETERS. 
      SUP           [SUPPRESS EXTENDED LISTING] 
#RSAX NOP           ENTRY/EXIT: TCB MANAGEMENT. 
      JSB $LIBR     DECLARE THIS TO BE
      NOP             A PRIVILEGED ROUTINE. 
      JSB .ENTP     OBTAIN DIRECT ADDRESSES 
      DEF MODE        FOR PARAMETERS & RETURN POINT.
* 
INIT  JSB CONFG     1RST ENTRY: CONFIGURE; 'NOP' THEREAFTER.
* 
      CLA           [PROTECT AGAINST MISSING PARAMETER] 
      LDA PRAM1,I   OBTAIN
      STA PRAM1      PARAMETERS 
      CLA             FOR 
      LDA PRAM2,I      LOCAL USE, 
      STA PRAM2         IN PREPARATION
      CLA                FOR A
      LDA PRAM3,I         POSSIBLE
      STA PRAM3            DMS MAP-SWITCH.
      CLA 
      LDB MODE,I    GET THE MODE OF OPERATION,
      STB MODE        AND SAVE IT LOCALLY, ALSO.
      LDA PRAMA     INITIALIZE THE KEYWORD ADDRESS POINTER
      STA KEYAD      TO REFERENCE FIRST CALLER PARAMETER. 
* 
DMS1  JMP MODCK     BYPASS MAP CODE: RTE-II / 'NOP': RTE-III
* 
      RSA           GET CURRENT MAP STATUS. 
      RAL,RAL       POSITION CURRENT STATUS FOR RESTORATION.
      STA DMSTS     SAVE FOR RESTORATION BEFORE EXIT. 
      SJP MODCK     ENABLE SYSTEM MAP AND CONTINUE. 
* 
DMSTS NOP           DMS MAP-STATUS STORAGE. 
* 
MODCK SZB,RSS       MODE =0?
      JMP SAM        YES, GO TO ALLOCATE MEMORY.
      CPB P1        MODE =1?
      JMP SAM        RETURN MEMORY TO RTE.
      CPB P2        MODE =2?
      JMP ADENT      GO TO CREATE A MASTER TCB ENTRY. 
      CPB P3        MODE =3?
      JMP ADENT      GO TO CREATE A SLAVE TCB ENTRY.
      CPB P4        MODE =4?
      JMP FIND       SEARCH FOR A MASTER TCB ENTRY. 
      CPB P5        MODE =5?
      JMP FIND       SEARCH FOR A SLAVE TCB ENTRY.
      CPB P6        MODE =6?
      JMP FIND       SEARCH FOR/CLEAR A MASTER TCB ENTRY. 
      CPB P7        MODE =7?
      JMP FIND       SEARCH FOR/CLEAR A SLAVE TCB ENTRY.
      CPB P8        MODE =8?
      JMP ADENT      GO TO CREATE A PROCESS # ENTRY.
      CPB P10       MODE =10? (LAST CHANCE!)
      JMP FIND       SEARCH FOR/CLEAR A PROCESS # ENTRY.
* 
      JMP ERR02     * ERROR #2: INVALID MODE! * 
* 
      SPC 10
*  ADD A NEW ENTRY TO THE MASTER OR SLAVE-STREAM LIST.
      SPC 1 
ADENT LDA #NULL     GET THE NULL LIST LINK-WORD.
      SZA,RSS       IS AN ENTRY AVAILABLE FROM THE POOL?
      JMP ERR03     * NO. ERROR #3: NO ENTRY AVAILABLE! 
      STA ENTAD       YES. SAVE ADDRESS OF NEW ENTRY. 
* 
      INA           POINT TO THE SECOND WORD OF THE ENTRY.
      STA ENPNT     SAVE THE POINTER FOR ENTRY BUILDING.
      CLE,SLB       IF THIS IS TO BE A SLAVE ENTRY, 
      JMP SLVAD      THEN SKIP THE SEARCH FOR MASTER ENTRIES. 
* 
      LDA MDEF      INITIALIZE THE LIST 
      CPB P8         POINTER TO REFERENCE 
      LDA PDEF        THE PNL OR THE
      STA LSTAD        MASTER LIST. 
* 
      ISZ KEYAD     SEARCH KEYWORD IS PRAM2 (ID SEG ADDR).
      LDA P4        EXAMINE FIFTH WORD OF EACH MASTER TCB.
MLOOK JSB SERCH     FIND ENTRIES WITH SAME CLASS OR PROCESS #.
      JMP MSTAD     END-OF-LIST: GO TO ADD NEW ENTRY. 
      ADB P4        GET THE 5TH WORD (ID SEGMENT ADDRESS) 
      LDA B,I         FROM ENTRY WITH SAME NUMBER.
      IOR SIGN         ADD BAD-ENTRY FLAG (BIT#15). 
      STA B,I       RETURN MODIFIED WORD.(UPLIN CLEARS TCB).
      JMP MLOOK     SEARCH FOR MORE OBSOLETE ENTRIES.[E=1]. 
* 
MSTAD CCB           CHECK FOR 
      LDA MODE       NEW PROCESS
      CPA P8          NUMBER MODE.
      JMP SETIM+1    YES--GO SET TIMEOUT
* 
      DLD #NCNT     # OF NRV ENTRY PAIRS & NRV ADDRESS
      CAX           COUNT WITH X REG
MST1  LDA B,I       GET NODE # FROM TABLE 
      INB 
      CPA PRAM3     MATCH?
      JMP MST2      YES!
      INB 
      ISX           INCREMENT NRV COUNT 
      JMP MST1      TRY MORE
MST2  LDA B,I       GET TIMEOUT / LU
      LDB B100
      ASR 6         A=TIMEOUT, B=1 (MASTER LIST CODE) 
      SZA,RSS       DEFAULT REQUESTED?
      LDA #MSTO     YES, GET IT 
      JMP SETIM 
* 
SLVAD JSB LSTCK     PREPARE REFERENCES FOR THE SLAVE LIST.
      ADA P2        POINT TO WORD #3 OF SLAVE-STREAM HEAD.
      LDA A,I       GET THE MONITOR I.D. SEGMENT ADDRESS. 
      SZA,RSS       IF THE MONITOR HAS NOT BEEN INITIALIZED,
      JMP ERR01      THEN NOTHING MAY BE ADDED TO THIS LIST!
      LDA #SVTO     VALID LIST: GET SLAVE TIMEOUT VALUE.
* 
SETIM STA ENPNT,I   SET TIMEOUT INTO ENTRY WORD #2
      ISZ ENPNT     POINT TO NEXT WORD OF ENTRY 
      CLA           OBTAIN AN ENTRY FROM THE NULL LIST. 
      JSB LNK       GO PROCESS LIST CHANGES.[B=LIST CODE] 
      SZA           LIST-PROCESSING ERROR?
      JMP ERR04       YES--INFORM THE CALLER! 
* 
      LDA PRAM3     USE THIRD PARAMETER 
      LDB MODE       INSTREAD OF SEQUENCE 
      CPB P8          NUMBER FOR MODE 8.
      JMP STOR3     STORE IN THIRD TCB WORD.
* 
      SKP 
      SPC 3 
      LDA SEQN      GET THE LAST SEQUENCE NUMBER. 
      INA,SZA,RSS   ADVANCE THE COUNT & TEST FOR ZERO.
      CLE,INA        ROLL-OVER: RESET TO ONE. 
      STA SEQN      SAVE THE CURRENT SEQUENCE NUMBER. 
STOR3 STA ENPNT,I   INSERT IT INTO THE THIRD ENTRY WORD.
      ISZ ENPNT     ADVANCE THE ENTRY POINTER.
      LDA MODE      IF A SLAVE-ENTRY IS TO BE 
      CLE,ERA        ADDED, SET <E> =1. 
PRAMA EQU *+1       [INITIAL KEYWORD POINTER TO 'PRAM1']
      DLD PRAM1     GET THE CALLER'S PARAMETERS.
      SEZ           SLAVE-LIST ADDITION?
      LDB PRAM3      YES, GET THE ORIGIN NODAL ADDRESS. 
      DST ENPNT,I   ADD PARAMETERS TO ENTRY WORDS #4,#5.
* 
      LDA SEQN      RETURN WITH: <A>=CURRENT SEQUENCE NO. 
      LDB ENTAD                  <B>=ENTRY ADDRESS. 
      JMP EXIT      GO TO PREPARE FOR RETURN TO CALLER. 
* 
SEQN  NOP           TRANSACTION SEQUENCE NUMBER.
* 
      SPC 3 
*  ERROR PROCESSING AND EXIT SECTION. 
      SPC 1 
ERR04 LDA P4        <A> =4: ENTRY CANNOT BE LOCATED.
      JMP ERR01+1 
ERR03 LDA P3        <A> =3: NEW ENTRY NOT AVAILABLE.
      JMP ERR01+1 
ERR02 LDA P2        <A> =2: INVALID MODE PARAMETER. 
      JMP ERR01+1 
ERR01 CLA,INA       <A> =1: INVALID LIST PARAMETER. 
      CMA,INA       NEGATE THE ERROR CODE.
      STA B         <A&B> ARE THE SAME FOR ERROR RETURN.
* 
EXIT  DST TEMP      SAVE <A&B> TEMPORARILY. 
      CLA           CLEAR PARAMETER ADDRESSES 
      STA MODE       TO FACILITATE CHECKING 
      STA PRAM1       FOR MISSING PARAMETERS
      STA PRAM2        UPON NEXT ENTRY OF <#RSAX>.
      STA PRAM3 
      LDA #NULL     IF NO TCB ENTRIES REMAIN AVAILABLE
      SZA,RSS         IN THE ENTRY POOL, THEN DO NOT
      JMP RETRN         CLEAR THE TABLE-ACCESS RN; ELSE,
      LDA #TBRN     GET THE TABLE-ACCESS RN AND GO TO RTE 
      JSB $CGRN       TO MAKE IT AVAILABLE FOR NEXT ACCESS. 
RETRN DLD TEMP      RESTORE THE RETURN-DATA TO <A> & <B>. 
* 
DMS2  JMP LBEX      BYPASS MAP CODE: RTE-II / 'NOP': RTE-III
      JRS DMSTS LBEX *** RESTORE THE APPROPRIATE MAPS *** 
* 
LBEX  JSB $LIBX     RETURN TO THE CALLER, VIA THE RTE 
      DEF #RSAX       PRIVILEGED ROUTINE PROCESSOR. 
* 
      SKP 
*  SEARCH FOR ENTRIES. CLEAR AND RETURN TO POOL, IF REQUESTED.
      SPC 1 
FIND  LDA MDEF      INITIALIZE
      CPB P10        POINTERS 
      LDA PDEF        TO REFER
      STA LSTAD        TO THE 
      CLA,INA           MASTER LIST 
      CPB P10            OR THE 
      CCA                 PROCESS NUMBER
      STA LSTCD            LIST.
* 
      CLE,SLB       IF THIS IS A SLAVE REQUEST, THEN
      JSB LSTCK      ESTABLISH REFERENCES TO THE SLAVE LIST.
* 
      LDA P2         THIRD WORD OF TCB IS THE SEARCH KEY. 
      JSB SERCH      GO TO LOCATE THE TCB ENTRY [E=0].
      JMP ERR04      * ERROR #4: ENTRY CANNOT BE LOCATED! * 
* 
      STB ENTAD     SAVE THE ENTRY ADDRESS FOR LATER USE. 
      ADB P3        POINT TO THIRD WORD, FOR LATER USE, 
      STB ENPNT      IN RETURNING THE CONTENTS TO CALLER. 
* 
      LDA MODE      GET THE MODE OF OPERATION.
      ADA M6        IF THE MODE 
      CLE,SSA        IS LESS THAN 6,
      JMP FOUND       DO NOT CLEAR THE ENTRY. 
* 
      LDA LSTCD     REMOVE ENTRY FROM THE SPECIFIED LIST. 
      CLB           RETURN IT TO THE NULL LIST. 
      JSB LNK       GO TO PROCESS THE LIST CHANGES. 
      CCE,SZA       LIST PROCESSING ERROR?
      JMP ERR04      YES! GO TO INFORM THE CALLER.
* 
FOUND LDA ENPNT,I   GET WORD #4 FOR RETURN TO CALLER. 
      CLB,SEZ,RSS   IF THIS IS A SEARCH, ONLY,
      LDB ENTAD      THEN GET THE TCB ADDRESS;
      JMP EXIT        ELSE, RETURN WITH <B> =0. 
* 
ENPNT NOP           POINTER INTO TCB ENTRY. 
ENTAD NOP           TCB ADDRESS STORAGE.
* 
      SKP 
*  SYSTEM AVAILABLE MEMORY ALLOCATION/DE-ALLOCATION PROCESSOR.
      SPC 1 
SAM   LDA PRAM1     GET THE CALLER'S PARAMETER. 
      SLB           IF THE REQUEST IS FOR DE-ALLOCATION,
      JMP RTSAM      GO TO RETURN THE MEMORY TO THE SYSTEM. 
* 
      STA SZMEM     ALLOCATE: SAVE NO. OF WORDS REQUESTED.
      LDA #FWAM     IF SYSTEM-AVAILABLE-MEMORY
      SZA            HAS ALREADY BEEN ALLOCATED,
      JMP ERR01       THEN REJECT THE REQUEST!
* 
      JSB $ALC      REQUEST SYSTEM AVAILABLE MEMORY (S.A.M.)
SZMEM DEC 128        IN THE AMOUNT SPECIFIED BY THE CALLER. 
      JMP DMS2      * NEVER AVAILABLE: <A>=-1,<B>=MAX EVER
      JMP DMS2      * NOT AVAILABLE NOW: <A>=0,<B>=MAX NOW
      STA #FWAM     O.K. SAVE THE ADDRESS OF MEMORY BLOCK.
      STB #SAVM          SAVE THE SIZE OF THE MEMORY BLOCK. 
      JMP DMS2      RETURN WITH S.A.M. SPECIFICATIONS.
* 
RTSAM CPA #FWAM     IS CALLER SPECIFYING CORRECT BLOCK? 
      RSS            YES. PROCESS THE DE-ALLOCATION.
      JMP ERR01      NO. ** IGNORE THE REQUEST! **
* 
      LDB #SAVM     GET THE BLOCK-SIZE SPECIFICATION. 
      DST RTN       CONFIGURE THE DE-ALLOCATION REQUEST.
* 
      JSB $RTN      RETURN A SYSTEM-AVAILABLE-MEMORY BLOCK; 
RTN   NOP             BEGINNING AT SPECIFIED ADDRESS, AND 
      NOP               CONTAINING SPECIFIED NO. OF WORDS.
      CLA           CLEAR THE STORAGE LOCATIONS FOR:
      STA #FWAM       MEMORY BLOCK ADDRESS. 
      STA #SAVM       MEMORY BLOCK SIZE.
      JMP DMS2      RETURN TO THE CALLER. 
* 
      SKP 
*  SUBROUTINE TO CHECK LIST PARAMETER & SET LIST CODE & LIST ADDRESS. 
      SPC 1 
*  ENTER:  <A&B> = DON'T CARE.
*  RETURN: <A> =LIST ADDRESS; <B> =LIST CODE. 
*          ERROR - RETURN VIA ERROR EXIT WITH ERROR #1. 
* 
LSTCK NOP           ENTRY/EXIT: LIST ID ROUTINE.
      LDA PRAM2     GET THE STREAM PARAMETER. 
      AND B77      ISOLATE THE STREAM NUMBER. 
      ADA P2        ADD OFFSET FOR NULL & MASTER LISTS. 
      STA LSTCD     SAVE FOR USE ELSEWHERE. 
      STA B         SAVE FOR RETURN TO CALLER.
      ADA NMAX      CHECK FOR SPECIFICATION 
      CLE,SSA,RSS     OF AN UN-DEFINED LIST.
      JMP ERR01     * ERROR #1: INVALID LIST! 
      LDA #LDEF     GET THE LIST-TABLE ADDRESS. 
      ADA B         INDEX TO THE PROPER ENTRY.
      LDA A,I       GET THE LIST ADDRESS. 
      STA LSTAD     SAVE THE ADDRESS FOR LATER USE. 
      JMP LSTCK,I   RETURN TO THE CALLER. 
* 
B77   OCT 77
LSTAD NOP           ADDRESS OF LIST HEADER. 
LSTCD NOP           LIST IDENTIFICATION CODE. 
* 
      SKP 
*  SUBROUTINE TO SEARCH FOR A SPECIFIC LIST ENTRY.
      SPC 1 
*  ENTER:  <A> = OFFSET INTO TCB ENTRY; <B> = DON'T CARE. 
*          <E> =0: SEARCH FROM TOP; <E> =1: CONTINUE SEARCH.
*          'LSTAD' SET TO ADDRESS OF LIST TO BE SEARCHED. 
* 
*  RETURN: P+1 -- ENTRY NOT LOCATED; <A> MEANINGLESS, <B> =0. 
*          P+2 -- ENTRY WAS LOCATED; <A> MEANINGLESS, <B> = ENTRY ADDRESS.
* 
SERCH NOP           ENTRY/EXIT:LIST SEARCH ROUTINE. 
      LDB TEMP+1    GET NEXT-ENTRY ADDRESS TO CONTINUE. 
      SEZ           IS THIS A REQUEST TO CONTINUE?
      JMP SLOOP       YES. GO TO CONTINUE THE SEARCH. 
      STA OFSET     SAVE OFFSET INTO TCB ENTRY. 
      LDB LSTAD     GET TOP-OF-LIST ADDRESS.
* 
SLOOP LDB B,I       GET THE LINK TO THE NEXT ENTRY. 
      SZB,RSS       IS THIS THE END OF THE LIST?
      JMP SERCH,I     YES. TAKE "NOT FOUND" EXIT (P+1). 
* 
      STB TEMP+1    SAVE POINTER TO NEXT ENTRY. 
      ADB OFSET     POINT TO KEYWORD LOCATION.
      LDA B,I       GET THE KEYWORD.
      LDB TEMP+1    PREPARE TO RETURN WITH ENTRY ADDRESS. 
      CPA KEYAD,I   DOES IT MATCH THE CALLER'S KEYWORD? 
      CCE,RSS        YES. SET <E> FOR CONTINUATION--SKIP. 
      JMP SLOOP      NO. CONTINUE SEARCHING.
* 
      ISZ SERCH     ENTRY FOUND: SET RETURN TO P+2. 
      JMP SERCH,I   RETURN TO THE CALLER. 
* 
OFSET NOP           KEYWORD OFFSET INTO TCB ENTRY.
KEYAD NOP           KEYWORD POINTER 
* 
      SKP 
*  SUBROUTINE TO PROCESS LIST LINKAGE.
      SPC 1 
*  ENTER:  <A> = CODE OF REMOVAL LIST; <B> = CODE OF ADDITION LIST. 
*          'ENTAD' SET TO ADDRESS OF ENTRY TO BE REMOVED. 
* 
*  RETURN: <A>&<B> =0: NORMAL; <A> =-1, <B> =UNCHANGED: ERROR.
* 
LNK   NOP           ENTRY/EXIT: LIST LINK ROUTINE.
      STA TEMP      SAVE REMOVAL-LIST CODE, TEMPORARILY.
      ADA #LDEF     FIND THE TABLE ADDRESS. 
      LDA A,I       GET ADDRESS: TOP-OF-REMOVAL-LIST. 
LNK1  STA PNTR      SAVE LIST POINTER.
      LDA A,I       GET THE LINK TO THE NEXT ENTRY. 
      SZA,RSS       IF THIS IS THE END OF THE LIST, 
      JMP LNKER       THEN INFORM THE CALLER OF THE ERROR.
      CPA ENTAD     IS THIS THE ENTRY TO BE REMOVED?
      RSS             YES. SKIP TO REMOVE IT. 
      JMP LNK1        NO. TRY THE NEXT ONE. 
      LDA ENTAD,I   GET THE LINK TO THE FOLLOWING ENTRY,
      STA PNTR,I      AND MOVE IT TO THE PREVIOUS ENTRY.
* 
      ADB #LDEF     FIND THE TABLE ADDRESS. 
      LDB B,I       GET ADDRESS: TOP-OF-ADDITION-LIST.
LNK2  STB PNTR      SAVE LIST POINTER.
      LDB B,I       GET THE LINK TO THE NEXT ENTRY. 
      SZB           IS THIS THE END OF THE LIST?
      JMP LNK2        NO. CONTINUE SEARCHING FOR THE END. 
      STB ENTAD,I     YES. MAKE NEW ENTRY = END-OF-LIST.
      LDA ENTAD     GET THE ADDRESS OF THE NEW ENTRY. 
      STA PNTR,I    SAVE IN LINK-WORD OF PREVIOUS ENTRY.
* 
      LDA MODE      IF MODE IS
      ADA M8         >= 8 THEN
      SSA,RSS         PROCESSING
      JMP LNKER-1      IS ALL DONE. 
* 
      CPB TEMP      REMOVING ENTRY FROM NULL LIST? [<B>=0]
      CLA,INA,RSS     YES. PREPARE TO ADD TO ACTIVE COUNT.
      CCA             NO. PREPARE TO DECREMENT ACTIVE COUNT.
      ADA #BUSY     COMPUTE THE NEW 'ACTIVE-ENTRY' COUNT, 
      STA #BUSY       AND UPDATE THE INDICATOR. 
      CLA,RSS       INDICATE NORMAL RETURN, AND SKIP. 
LNKER CCA           <A> =-1: NO ENTRIES IN REMOVAL LIST.
      JMP LNK,I       RETURN IS MADE TO THE CALLER. 
* 
PNTR  NOP           LIST POINTER STORAGE. 
* 
      SKP 
*  TABLE OF LIST-HEADER ADDRESSES.                         LIST CODES:
      SPC 1 
#LDEF DEF SOT       START-OF-TABLE DEFINITION.
PDEF  DEF #PNLH     HP3000 PROCESS NUMBER HEADER -01
SOT   DEF #NULL     ENTRY-POOL HEADER             00
MDEF  DEF #MRTH     MASTER-REQUEST HEADER         01
SDEF  DEF #ST00     SLAVE-STREAM 00 HEADER        02
      DEF #ST01     SLAVE-STREAM 01 HEADER        03
      DEF #ST02     SLAVE-STREAM 02 HEADER        04
      DEF #ST03     SLAVE-STREAM 03 HEADER        05
      DEF #ST04     SLAVE-STREAM 04 HEADER        06
      DEF #ST05     SLAVE-STREAM 05 HEADER        07
      DEF #ST06     SLAVE-STREAM 06 HEADER        10
      DEF #ST07     SLAVE-STREAM 07 HEADER        11
      DEF #ST08     SLAVE-STREAM 08 HEADER        12
      DEF #ST09     SLAVE-STREAM 09 HEADER        13
      DEF #ST10     SLAVE-STREAM 10 HEADER        14
* NEW ENTRY: .........DEF #STXX.....SLAVE-STREAM XX HEADER........15
* 
NMAX  ABS #LDEF+1-* LIST CODE VALIDITY-CHECKING CONSTANT. 
* 
#MNUM ABS NMAX-SDEF NUMBER OF SLAVE-STREAM TYPES. 
      SPC 1 
*  CONSTANTS AND STORAGE. 
      SPC 1 
M6    DEC -6
M8    DEC -8
P1    DEC 1 
P2    DEC 2 
P3    DEC 3 
P4    DEC 4 
P5    DEC 5 
P6    DEC 6 
P7    DEC 7 
P8    DEC 8 
P10   DEC 10
B100  OCT 100 
SIGN  OCT 100000
TEMP  OCT 0,0       TEMPORARY STORAGE LOCATIONS.
      SPC 1 
*  HP3000 ID SEQUENCE SPECIFICATIONS
* 
D$LID DEF LOC       LOCAL ID SEQUENCE ADDRESS 
D$RID DEF REM       REMOTE ID SEQUENCE ADDRESS
      SPC 1 
#RDLY DEC -200      MAXIMUM RTRY DELAY: 200 CENTOSECONDS (2 SEC.) 
#PRLU DEF #PRLX     DEFAULT LU FOR PROGL MESSAGES: NO MESSAGES
*                   (NOTE: #PRLX IS IN #REQU.  IT MUST BE SEPARATED 
*                   IN ORDER TO ALLOW 'ABS' AT GEN-TIME TO WORK, AS WELL
*                   AS ON-LINE PATCHES TO #PRLU)
* 
*  GENERAL SYSTEM DATA [ INITIALIZED BY 'LSTEN' ].
      SPC 1 
#SCLR DEF #TBRN     START OF AREA CLEARED BY 'LSTEN'. 
#FWAM NOP           ADDRESS OF SYSTEM AVAIL. MEMORY BLOCK.
#SAVM NOP           SIZE OF SYSTEM AVAIL. MEMORY BLOCK. 
#TBRN NOP           TABLE-ACCESS RESOURCE NUMBER. 
#QRN  NOP           QUIESCENT(RN) OR SHUT-DOWN(0).
#GRPM NOP           GENERAL PRE-PROCESS MODULE CLASS NO.
#QCLM NOP           QUEUE CLEAN-UP MONITOR CLASS NUMBER.
#BUSY NOP           NUMBER OF ACTIVE TCB ENTRIES. 
#MSTO NOP           MASTER REQUEST TIMEOUT VALUE. 
#SVTO NOP           SLAVE REQUEST TIMEOUT VALUE.
#RTRY NOP           RETRY-PROCESSOR'S CLASS NUMBER. 
#WAIT NOP           D65MS QUIESCENT WAIT INTERVAL.
#SWRD NOP           NETWORK-NODE SECURITY CODE. 
#BREJ NOP           D65MS RETRY COUNT FOR BUSY REJECT.
#RPCV NOP           HP3000 REPLY CONVERTER CLASS NO.
#RQCV NOP           HP3000 REQUEST CONVERTER CLASS NO.
#LU3K NOP           LU NUMBER OF HP3000 
#QZRN NOP           QUEZ RN FOR "LISTEN MODE" 
#QXCL NOP           QUEX CLASS NO.
#TST  NOP           HP3000 TRANS. STATUS TABLE ADDRESS
      NOP           HP3000 TRANS. STATUS TABLE SIZE,IN ENTRIES
* 
      SKP 
      SKP 
*  LIST HEADERS (REMAINDER OF LISTS LOCATED IN SYSTEM AVAILABLE MEMORY).
      SPC 3 
#PNLH NOP                        HP3000 PROCESS # LIST
      SPC 1 
#NULL NOP           LIST HEADER: ENTRY POOL.
      SPC 1 
#MRTH NOP                        MASTER REQUEST  LIST.
      SPC 1 
#ST00 OCT 0,0,0                  SLAVE-STREAM 00 LIST.
      SPC 1 
#ST01 OCT 0,0,0                  SLAVE-STREAM 01 LIST.
      SPC 1 
#ST02 OCT 0,0,0                  SLAVE-STREAM 02 LIST.
      SPC 1 
#ST03 OCT 0,0,0                  SLAVE-STREAM 03 LIST.
      SPC 1 
#ST04 OCT 0,0,0                  SLAVE-STREAM 04 LIST.
      SPC 1 
#ST05 OCT 0,0,0                  SLAVE-STREAM 05 LIST.
      SPC 1 
#ST06 OCT 0,0,0                  SLAVE-STREAM 06 LIST.
      SPC 1 
#ST07 OCT 0,0,0                  SLAVE-STREAM 07 LIST.
      SPC 1 
#ST08 OCT 0,0,0                  SLAVE-STREAM 08 LIST.
      SPC 1 
#ST09 OCT 0,0,0                  SLAVE-STREAM 09 LIST.
      SPC 1 
#ST10 OCT 0,0,0                  SLAVE-STREAM 10 LIST.
      SPC 1 
* NEW ENTRY: ...#STXX OCT 0,0,0..................SLAVE-STREAM XX LIST.
      SKP 
#RFSZ NOP           MAXIMUM NUMBER OF 'OPEN' RFA FILES. 
      SPC 3 
#PLOG BSS 7         1000 LOGGING PROGRAM'S CLASS NO.
#CL3K BSS 7         3000 LOGGING PROGRAM'S CLASS NO.
      SPC 3 
*  NODAL ADDRESSING SPECIFICATIONS. 
* 
#CNOD NOP           <EXECW> CURRENT-USER-NODE; -1: INACTIVE.
* 
#LNOD NOP           <APLDR> DOWN-LOAD NODE (RTE-M, ONLY). 
* 
#NODE NOP           LOCAL NODE NUMBER.
* 
#NCNT NOP           NEG. NUMBER OF NRV TABLE ENTRIES (PAIRS)
#NRV  NOP           S.A.M. ADDRESS OF NRV TABLE.
#TRCL NOP           'TRACE' CLASS NUMBER
#TRCN NOP           'TRACE' RESOURCE NUMBER 
      SPC 2 
#NCLR ABS #TBRN-*   NEGATIVE NO: LOCATIONS LSTEN CLEARS 
      SPC 3 
* HP3000 ID SEQUENCE SPECIFICATIONS 
* 
LOC   NOP           LOCAL ID SEQUENCE: BYTE COUNT 
      BSS 8                            CHARACTERS 
* 
REM   NOP           REMOTE ID SEQUENCE: RESERVED WORD 
      NOP                               BYTE COUNT
      BSS 8                             CHARACTERS
      SKP 
*  INITIALIZATION SECTION: DMS SETUP & VALIDITY CHECKING. 
* 
*    NOTE: THIS CODE IS USED ONLY UPON INITIAL ENTRY. 
*          IT IS OVERLAYED BY THE SYSTEM SPECIFICATIONS.
* 
      ORG #GRPM     CODE RESIDES IN SYSTEM DATA AREA. 
* 
CONFG NOP           ENTRY/EXIT: INITIALIZATION ROUTINE. 
      LDA $OPSY     GET THE OP-SYSTEM IDENTIFIER. 
      AND P2        ISOLATE THE DMS BIT(#1).
      RAR,CLE,ERA   <A> =0 AND <E> = DMS BIT. 
      SEZ,CLE,RSS   IF DMS SYSTEM, SKIP & ENABLE DMS CODE;
      JMP NODMS      ELSE, MERELY DISABLE CONFIGURATION CALL. 
* 
      STA DMS1      CLEAR THE BYPASS-SWITCHES 
      STA DMS2       TO ENABLE DMS PROCESSING.
* 
NODMS STA INIT      CLEAR ACCESS TO THE CONFIGURATOR. 
      JMP CONFG,I   RETURN TO NORMAL PROCESSING.
* 
A     EQU 0 
B     EQU 1 
      SPC 1 
      ORR           [ INDICATES SIZE OF <RES> ] 
      SPC 1 
      END 
                                                                                                                                                                                