ASMB,R,L,C
      HED * <RES> - DS1 RESIDENT STORAGE * (C) HEWLETT-PACKARD CO. 1976 * 
      NAM RES,14 91700-16129 REV.A 760130 
      SPC 1 
      ENT #BUSY,#FWAM,#GPRN,#GRPM,#LDEF,#MNUM,#MRTH,#MSTO 
      ENT #NULL, #QRN,#RSAX,#RTRY,#SAVM,#SBIT,#SRPM,#ST00 
      ENT #ST01,#ST02,#ST03,#ST04,#ST05,#ST06,#ST07,#ST08 
      ENT #ST09,#ST10,#SVTO,#TBRN,#WAIT,#RXCL,#QCLM,#QLOG 
      ENT #NCLR,#SCLR,#SWRD,#PLOG,#PRMY,#RFSZ,OVFLA 
      EXT $ALC,$CGRN,$LIBR,$LIBX,$RTN,.ENTP 
*    NAME:   RES
*    SOURCE: 91700-18129
*    RELOC:  91700-16129
*    PGMR:   C.C.H. [ 01/30/76 ]
* 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  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.       *
******************************************************************
* 
*  RES IS A CORE-RESIDENT SYSTEM LIBRARY MODULE, USED BY THE
*   DS1 (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.
* 
*  #RSAX IS A PRIVILEGED LIBRARY ROUTINE, EMBEDDED IN RES,
*   WHICH CONTROLS ACCESS TO, AND ALLOWS MAINTENANCE OF, THE
*   NETWORK'S TRANSACTION-CONTROL-BLOCKS FOR CURRENT REQUESTS.
* 
*  #RSAX OPERATION: 
*   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 LOC'N 1742B(BPA1) =2, THEN OP-SYSTEM USES DMS HARDWARE, 
*        REQUIRING CONFIGURATION OF DMS FIRMWARE MACRO INSTRUCTIONS.
*     C. IF NON-DMS: OP-SYSTEM IS RTE-II--CLEAR DMS REFERENCES. 
*     D. CLEAR THE 'JSB' TO THE INITIALIZATION ROUTINE. 
*   2. GET PARAMETERS & CHECK VALIDITY OF SPECIFIED STREAM & LIST.
*     A. IF IMPROPER LIST - ERROR #1 --- REJECT!
*   3. CHECK MODE OF OPERATION: 
*     A. IF =0, GO TO 7. TO ALLOCATE/DE-ALLOCATE SYSTEM MEMORY. 
*     B. IF =1, GO TO 3. TO ADD NEW ENTRY TO MASTER-REQUEST LIST. 
*     C. IF =2, GO TO 4. TO ADD NEW ENTRY TO A SLAVE-STREAM LIST. 
*     D. IF =3, GO TO 5. TO REMOVE AN ENTRY & RETURN IT TO THE POOL.
*     E. IF =4, SEARCH FOR BRK. FLAG--IF FOUND, CLEAR&RETURN ENTRY(GO TO 5.)
*     F. IF =5, SEARCH FOR ENTRY--<A&B>=0:FOUND;<A>=-4: NOT FOUND (GO TO 5.)
*     G. IF NONE OF THE ABOVE - ERROR #2 --- REJECT!
*   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 CLASS NO. 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#4).
*     D. LINK THE NEW ENTRY INTO THE MASTER REQUEST LIST. 
*   4.E. TRANSFER THE CALLER'S DATA INTO THE NEW ENTRY. 
*     F. IF ENTRY POOL NOT DEPLETED, CLEAR TABLE-ACCESS RN & RETURN.
*   5. CHECK FOR AVAILABLE ENTRY, BEFORE ADDING TO THE SLAVE-STREAM LIST. 
*     A. IF NONE, #TBRN NOT CHECKED BEFORE ENTRY - ERROR #3 --- REJECT! 
*     B. LINK THE NEW ENTRY INTO THE SPECIFIED SLAVE-STREAM LIST. 
*     C. TRANSFER CALLER'S DATA INTO THE NEW ENTRY. 
*     D. RETURN VIA 3.F.(ABOVE), TO UPDATE STATUS OF TABLE-ACCESS RN. 
*   6. CHECK LIST SPECIFICATION, BEFORE SEARCHING FOR/CLEARING AN ENTRY.
*     A. IF IMPROPER LIST SPECIFIED - ERROR #1 --- REJECT!
*     B. SEARCH FOR ENTRY. IF MODE=4,CHECK BREAK FLAG & CLEAR ENTRY, IF SET.
*     C. IF MODE=5, RETURN; ELSE, CLEAR ENTRY & RESTORE IT TO ENTRY POOL. 
*     D. RETURN VIA 3.F.(ABOVE), TO UPDATE STATUS OF TABLE-ACCESS RN. 
*   7. VERIFY CALLER TO BE <LSTEN> BEFORE ALLOCATION/DE-ALLOCATION OF S.A.M.
*     A. IF ST/LS = #FWAM GO TO DE-ALLOCATE SYSTEM AVAILABLE MEMORY.
*     B. IF ST/LS # #FWAM REQUEST ALLOCATION OF SYSTEM AVAIL. MEMORY. 
*     C. IF REQUEST GRANTED, STORE BLOCK ADDRESS IN #FWAM, SIZE IN #SAVM. 
*     D. IF REQUEST DENIED, RETURN REASON IN <A&B>, FOR FURTHER ANALYSIS. 
* 
      SKP 
*  #RSAX CALLING SEQUENCE:
* 
*   JSB #RSAX 
*   DEF *+5 
*   DEF MODE      MODE OF OPERATION (0,1,2,3,4,OR 5). 
*   DEF ST/LS     STREAM/LIST, OR ALLOCATE: #WORDS, DE-ALLOCATE: #FWAM
*   DEF KEY       KEYWORD FOR LIST SEARCHES.
*   DEF BUFAD     ADDRESS OF DATA BUFFER FOR NEW ENTRY OR SEARCH. 
*   <RETURN>      NORMAL: <A>=0, <B>=ENTRY ADDRESS; ERROR: <A>=-N,<B>=0;
*                 BREAK-FLAG FOUND:<A>=0,<B>= ENTRY ADDR.; NOT FOUND:<A&B>=0
* 
*   WHERE:
*          MODE =0 - REQUEST ALLOCATION/DE-ALLOCATION OF SYSTEM MEMORY. 
*          MODE =1 - TO ADD A NEW ENTRY TO THE MASTER REQUEST LIST. 
*          MODE =2 - TO ADD A NEW ENTRY TO A SLAVE-STREAM LIST. 
*          MODE =3 - TO REMOVE AN ENTRY FROM A LIST & RETURN IT TO THE POOL.
*          MODE =4 - SEARCH FOR SLAVE-STRM. BREAK FLAG & CLEAR ENTRY IF SET.
*          MODE =5 - SEARCH FOR A MASTER OR SLAVE ENTRY.
* 
*          ST/LS   - MODE =0: ALLOCATE NUMBER OF WORDS SPEC'D. IN ST/LS.
*          ST/LS   - MODE =0: IF ST/LS =(#FWAM), RETURN SYSTEM MEMORY.
*          ST/LS   - MODE=1-5: DUAL-BYTE CODE WORD WHICH IDENTIFIES THE LIST
*                    WHICH IS TO BE MODIFIED. THE UPPER BYTE CONTAINS 
*                    THE SLAVE-STREAM IDENTITY (0-12B); THE LOWER BYTE
*                    CONTAINS THE LIST-TYPE IDENTITY (1=MASTER,2=SLAVE):
* 
*                      LIST IDENTIFICATION   STREAM/LIST  CODE WORD 
*                    -----------------------     --/--     -------
*                    MASTER REQUEST              00/01     000001B
*                    SLAVE-STREAM  0 REQUEST     00/02     000002B
*                    SLAVE-STREAM  1 REQUEST     01/02     000402B
*                    SLAVE-STREAM  2 REQUEST     02/02     001002B
*                    SLAVE-STREAM  3 REQUEST     03/02     001402B
*                    SLAVE-STREAM  4 REQUEST     04/02     002002B
*                    SLAVE-STREAM  5 REQUEST     05/02     002402B
*                    SLAVE-STREAM  6 REQUEST     06/02     003002B
*                    SLAVE-STREAM  7 REQUEST     07/02     003402B
*                    SLAVE-STREAM  8 REQUEST     10/02     004002B
*                    SLAVE-STREAM  9 REQUEST     11/02     004402B
*                    SLAVE-STREAM 10 REQUEST     12/02     005002B
* 
*          KEY     - UNIQUE KEYWORD FOR LIST SEARCHES. IT MUST BE SPECIFIED 
*                    TO BE THE MASTER-REQUESTOR'S CLASS NO., WHEN ADDING TO,
*                    DELETING FROM, OR SEARCHING MASTER LIST (MODE=1,3,5).
*                    'KEY' MUST BE SUPPLIED AS A DUMMY PARAMETER FOR MODE=2.
*                    IT MUST CONTAIN THE SELECT CODE OF THE COMMUNICATION 
*                    LINE I/O CARD (IN THE UPPER BYTE), TO SEARCH FOR OR
*                    DELETE SLAVE-STREAM ENTRIES (MODE=3,4,5; ST/LS=XX/02). 
*                    [OPTIONAL (NOT USED) WHEN MODE =0] 
* 
*          BUFAD   - ADDRESS OF 3-WORD DATA BUFFER(MODE=1,2), WITH ELEMENTS 
*                    TO BE ADDED TO A LIST ENTRY; OR ADDRESS OF 2-WORD
*                    TIME-TAG TO SEARCH/CLEAR SLAVE ENTRIES (MODE=3,4,5). 
*                    [OPTIONAL: CLEAR/SEARCH-FOR MASTER ENTRY (MODE=3,5)].
*                    [OPTIONAL (NOT USED) WHEN MODE =0] 
* 
      SKP 
*       DATA BUFFER FORMAT FOR MASTER-LIST ENTRIES: 
* 
*                 WORD #1 - SELECT CODE OF COMM. LINE DEVICE (BITS#13-8)
*                           REQUEST TIMEOUT COUNT (BITS#7-0). 
* 
*                 WORD #2 - MASTER CLASS NUMBER (BITS#12-0).
* 
*                 WORD #3 - REQUESTOR'S ID SEG. ADDRESS (BITS#14-0).
* 
*       DATA BUFFER FORMAT FOR SLAVE-STREAM LIST ENTRIES: 
* 
*                 WORD #1 - SELECT CODE OF COMM. LINE DEVICE (BITS#13-8)
*                           REQUEST TIMEOUT COUNT (BITS#7-0). 
* 
*                 WORD #2 - TRANSACTION TIME-TAG #1 (LEAST).
* 
*                 WORD #3 - TRANSACTION TIME-TAG #2 (MOST). 
* 
*       DATA BUFFER FORMAT FOR SLAVE-LIST CLEARING/BREAK-FLAG CHECK:
* 
*                 WORD #1 - TRANSACTION TIME-TAG #1 (LEAST).
* 
*                 WORD #2 - TRANSACTION TIME-TAG #2 (MOST). 
* 
*       LIST FORMATS: 
* 
*                          'RES'                 SYSTEM AVAILABLE MEMORY
*             -------------------------------   ------------------------- 
* 
*       #MRTH < ADDR.=1RST MASTER-LIST ENTRY>---<ADDR.=NEXT MASTER ENTRY >
*                                               <I*X*SCODE*TIMEOUT CNTR. >
*                                               <B* MASTER CLASS NUMBER  >
*                                               <B* I.D. SEGMENT ADDRESS >
* 
*       #ST00 <ADDR.=1RST SRTM. 0 LIST-ENTRY>---<ADDR.=NEXT STRM. 0 ENTRY>
*         .   <B*   MONITOR'S CLASS NUMBER  >   <!*D*SCODE*TIMEOUT CNTR. >
*         .   <A*MONITOR I.D.SEGMENT ADDRESS>   < TRANSACTION TIME-TAG#1 >
*         .                                     < TRANSACTION TIME-TAG#2 >
*         . 
*         . 
*       #STXX < ******* FORMAT SAME ******* >---< **** FORMAT SAME ***** >
*             < ********* FOR ALL ********* >   < ******** FOR ********* >
*             < ****** SLAVE STREAMS ****** >   < ******** ALL ********* >
*                                               < *** SLAVE STREAMS **** >
* 
*       WHERE: A(#15) = ABORT O.K. FOR MONITOR; B(#15) = BAD CONTENTS;
* 
*              SCODE(#13-#8) = COMM. LINE DEVICE'S SELECT CODE; 
* 
*              I(#15) = I/O COMPLETION FLAG  X = NOT USED [RESERVED!] 
* 
*              !(#15) = MONITOR BREAK FLAG (TRANSACTION WAS INTERRUPTED). 
* 
*              D(#14) = REQUEST AND DATA TRANSACTION
* 
*       *NOTE: 0 IN LIST HEAD OR FIRST WORD OF ENTRY SIGNALS END OF LIST. 
      SKP 
****************************************************************************
*                                                                          *
*    #SBIT IS A SPECIAL SUBROUTINE TO ALLOW THE COMMUNICATION DRIVER       *
*     TO SET THE I/O COMPLETION FLAG (BIT#15) IN WORD #2 OF MASTER         *
*     REQUEST ENTRIES, AND TO SET THE BREAK FLAG (BIT#15) IN WORD #2       *
*     OF SLAVE-STREAM ENTRIES.                                             *
*                                                                          *
*     NOTE: #SBIT SHOULD ONLY BE ENTERED FROM TYPE-0 PROGRAMS, SINCE       *
*           ACCESS TO THE RTE PRIVILEGED PROCESSORS ($LIBR, $LIBX) IS      *
*           NOT PROVIDED AT THIS ENTRY POINT.                              *
*                                                                          *
*           TYPE-0 PROGRAMS MUST NOT MAKE EXTERNAL REFERENCES TO           *
*           #SBIT, LEST A COPY OF <RES> BE INCORRECTLY APPENDED            *
*           TO THE PROGRAM. THE ADDRESS OF THE ENTRY POINT WILL BE         *
*           PROVIDED TO THE DRIVER WHEN <LSTEN> ENABLES THE LU.            *
*                                                                          *
*                                                                          *
*    #SBIT CALLING SEQUENCE:                                               *
*                                                                          *
*     LDA ST/LS      <A> = LIST IDENTIFIER (SEE ABOVE).                    *
*     LDB KEY        <B> = SEARCH KEY                                      *
*     JSB #SBIT                                                            *
*     <RETURN>       <A> =0: NORMAL; <B> ALWAYS =0.                        *
*                                                                          *
*                    SEARCH KEY IS:                                        *
*                                                                          *
*                    <B> = D-BIT(#14) & SELECT CODE(BITS#13-8)-SLAVE ENTRY *
*                    <B> = CLASS NUMBER (BITS#12-0) - MASTER LIST  ENTRY.  *
*                                                                          *
*    #SBIT ERRORS AT RETURN: <A> =-1 - INVALID LIST                        *
*                            <A> =-4 - ENTRY COULD NOT BE FOUND            *
*                                                                          *
****************************************************************************
      SPC 4 
*    #RSAX ERROR INDICATIONS: 
* 
*     ERROR DETECTION WILL RESULT IN A RETURN TO THE CALLER WITH THE
*     REQUESTED ACTION NOT PERFORMED. <B> WILL BE =0; <A> IS AS FOLLOWS:
* 
*      <A> = -1: AN INVALID LIST IDENTIFIER HAS BEEN SPECIFIED OR 
*                FIRST CALLER IS NOT <LSTEN>. 
* 
*      <A> = -2: THE SPECIFIED MODE OF OPERATION IS UN-DEFINED. 
* 
*      <A> = -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> = -4: THE ENTRY TO BE CLEARED CANNOT BE LOCATED. 
* 
      SKP 
MODE  NOP           MODE OF OPERATION.
ST/LS NOP           STREAM/LIST, #WORDS OR FWA: S.A.M.
KEY   NOP           KEYWORD FOR LIST SEARCHES.
BUFAD NOP           ADDRESS OF NEW ENTRY BUFFER.
      SUP           [SUPPRESS EXTENDED LISTING] 
#RSAX NOP           ENTRY/EXIT
      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.
* 
      LDA KEY,I     GET THE SEARCH KEY, 
      STA KEY        AND SAVE IT LOCALLY. 
      LDA ST/LS,I   GET STREAM/LIST OR S.A.M. PARAMETER.
      STA ST/LS       AND SAVE LOCALLY. 
      LDB MODE,I    GET THE MODE OF OPERATION,
      STB MODE        AND SAVE IT LOCALLY, ALSO.
* 
DMS1  JSB MAPSV     SAVE MAP STATUS: DMS; 'NOP': RTE-II.
* 
      LDB MODE      GET THE MODE OF OPERATION (AGAIN?). 
      SZB,RSS       IF MODE =0, THEN THIS IS A S.A.M. 
      JMP SAM        ALLOCATION/DE-ALLOCATION REQUEST.
* 
      JSB LSTCK     GO CHECK VALIDITY & SET LIST CODE.
      SZA           LIST IDENTIFIER ACCEPTABLE? [<B>=LSTCD] 
      JMP ERR01     * NO. ERROR #1: INVALID LIST! 
* 
      LDA MODE      GET THE MODE OF OPERATION.
      CPA P1        IF MODE =1, GO TO ADD A NEW ENTRY 
      JMP ADENT       TO THE MASTER-REQUESTOR LIST. 
      CPA P2        IF MODE =2, GO TO ADD A NEW ENTRY 
      JMP ADENT       TO THE SLAVE MONITOR'S LIST.
      CPA P3        IF MODE =3, GO CLEAR AN ENTRY AND 
      JMP MD345       RETURN IT TO THE NULL ENTRY POOL. 
      CPA P4        IF MODE =4, GO EXAMINE THE LIST FOR 
      JMP MD345       AN ENTRY WITH THE BREAK-FLAG SET. 
      CPA P5        IF MODE =5, REQUEST IS ENTRY SEARCH.
      JMP MD345     GO TO SEARCH FOR THE ENTRY. 
      JMP ERR02     * ERROR #2: INVALID MODE! 
* 
      SKP 
*  ADD A NEW ENTRY TO THE MASTER OR SLAVE-STREAM LIST.
      SPC 1 
ADENT LDA #NULL     GET THE NULL LIST LINK-WORD.
      CLE,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. 
      LDA MODE      GET THE OPERATION MODE. 
      CPA P2        IF A SLAVE ENTRY IS TO BE ADDED,
      JMP SLVAD       GO TO PROCESS LIST CHANGES.[<B>=LSTCD]
* 
      LDA CLMSK     SET UP CLASS NO. MASK FOR 
      STA KYMSK       SEARCH OF EXISTING MASTER ENTRIES.
      LDB P2        SET UP OFFSET TO ALLOW SEARCH FOR 
      STB OFSET       SECOND WORD OF MASTER ENTRIES.
      ADB BUFAD     FORM ADDRESS OF THE THIRD DATA ELEMENT
GETID LDA B,I       GET NEW ID SEG. ADDR. [XLA B,I: DMS]
      NOP           [DUMMY: RTE-II; DEF B,I: DMS] 
      STA IDSEG     SAVE FOR BAD-ENTRY PROCESSING.
* 
MLOOK JSB SERCH     SEARCH FOR AN OBSOLETE ENTRY. 
      JMP MSTAD     END-OF-LIST: GO TO ADD NEW ENTRY. 
      ADB P3        GET THE 3RD WORD (ID SEGMENT ADDRESS) 
      LDA B,I         FROM ENTRY WITH SAME CLASS NUMBER.
      CPA IDSEG     PREVIOUS ENTRY FROM SAME REQUESTOR? 
      IOR SIGN        YES. ADD BAD-ENTRY FLAG (BIT#15). 
      STA B,I       REPLACE THE MODIFIED WORD.
      JMP MLOOK     SEARCH FOR ADDITIONAL BAD ENTRIES.
* 
MSTAD CLB,INB       ADD AN ENTRY TO THE MASTER LIST.
* 
SLVAD CLA           REMOVE AN ENTRY FROM THE NULL LIST. 
      JSB LNK       GO TO PROCESS LIST CHANGES. 
      SZA           LIST-PROCESSING ERROR?
      JMP ERR04       YES--INFORM THE CALLER! 
* 
      LDA ENTAD     <A>= DESTINATION ADDRESS, WHICH 
      INA             IS THE SECOND WORD OF THE NEW ENTRY.
      STA TEMP      SAVE FOR DESTINATION-BUFFER POINTER.
      LDB M3        GET NEGATIVE COUNT = NUMBER OF MOVES. 
      STB TEMP+1    SAVE FOR WORD-MOVE COUNTER. 
      LDB BUFAD     GET THE SOURCE ADDRESS. 
MVW   LDA B,I       GET THE SOURCE WORD [XLA B,I: DMS]
      NOP           [DUMMY: RTE-II; DEF B,I: DMS] 
      STA TEMP,I    STORE IT INTO THE DESTINATION LOCATION. 
      INB           ADVANCE THE SOURCE-BUFFER POINTER.
      ISZ TEMP      ADVANCE THE DESTINATION BUFFER POINTER. 
      ISZ TEMP+1    ALL WORDS BEEN MOVED? 
      JMP MVW         NO. GO BACK FOR MORE. 
* 
GETAD LDB ENTAD     <B>=ENTRY ADDRESS FOR NORMAL RETURN.
      CLA 
      JMP EXIT      GO TO PREPARE FOR RETURN TO CALLER. 
* 
      SKP 
*  ERROR PROCESSING AND EXIT SECTION. 
      SPC 1 
ERR04 LDA P4        <A> =4: ENTRY CANNOT BE LOCATED.
      JMP ERR01+1 
ERR03 LDA M3        <A> =3: NEW ENTRY NOT AVAILABLE.
      CLB           <B>=0: ERROR-RETURN.
      JMP DMS2      RETURN-DIRECTLY-WITH ERROR INDICATION!
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.
      CLB           <B> =0: FOR ERROR RETURN. 
* 
EXIT  DST TEMP      SAVE <A&B> TEMPORARILY. 
      LDA #NULL     IF NO 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 REGISTER RETURN-DATA. 
* 
DMS2  JSB MPRST     RESTORE MAPS: DMS; 'NOP': RTE-II. 
* 
      JSB $LIBX     RETURN TO THE CALLER, VIA THE RTE 
      DEF #RSAX       PRIVILEGED ROUTINE PROCESSOR. 
* 
      SPC 3 
* 
*  DYNAMIC MAPPING SYSTEM MAP PROCESSING ROUTINES.
      SPC 1 
MAPSV NOP           ENTRY/EXIT: STATUS SAVE 
      RSB           GET CURRENT MAP STATUS. 
      RBL,RBL       POSITION CURRENT STATUS FOR RESTORATION.
      STB DMSTS     SAVE FOR RESTORATION BEFORE EXIT. 
      SJP MAPSV,I   ENABLE SYSTEM MAP AND RETURN. 
* 
DMSTS NOP           DMS MAP-STATUS STORAGE. 
* 
      SPC 1 
MPRST NOP           ENTRY/EXIT: MAP RESTORATION.
      JRS DMSTS MPRST,I RESTORE MAP AND RETURN. 
* 
      SKP 
*  PROCESS: CLEAR(3), BREAK-FLAG CHECK(4), AND SEARCH(5) MODES. 
      SPC 1 
MD345 LDB BUFAD     GET ADDRESS OF USER'S TIME-TAGS.
* 
GTAG1 LDA B,I       GET TAG #1 [XLA B,I: DMS] 
      NOP           [DUMMY: RTE-II; DEF B,I: DMS] 
      INB           POINT TO SECOND TIME-TAG. 
GTAG2 LDB B,I       GET TAG #2 [XLB B,I: DMS] 
      NOP           [DUMMY: RTE-II; DEF B,I: DMS] 
      DST TTAG      SAVE FOR ENTRY COMPARISON.
      LDB LSTCD     GET THE REMOVAL-LIST IDENTIFIER.
      ADB #LDEF     FIND THE TABLE ADDRESS. 
      LDB B,I       GET LIST-HEADER ADDRESS FROM TABLE. 
      LDA B,I       GET THE LINK-WORD.
      SZA,RSS       EMPTY LIST? 
      JMP ERR01     * YES. ERROR #1: INVALID LIST!
* 
      LDA SCMSK     GET MASK FOR SEARCH BY SELECT CODE. 
      CPB MDEF      IF A MASTER ENTRY IS TO BE CLEARED, 
      LDA CLMSK       THEN CLASS NO. MASK MUST BE USED. 
      STA KYMSK     SAVE THE MASK FOR USE BY 'SERCH'. 
      CLA,CLE,INA   SET: KEY= 2ND WORD OF SLAVE ENTRY.
      CPB MDEF      IF A MASTER ENTRY IS TO BE CLEARED, 
      INA             THEN SEARCH KEY IS IN 3RD WORD. 
      STA OFSET     SAVE THE ENTRY-OFFSET FOR 'SERCH'.
      STB TEMP      SAVE THE LIST ADDRESS--TEMPORARILY. 
* 
CLOOP JSB SERCH     SEARCH FOR THE ENTRY TO BE CLEARED. 
      JMP ERR04     * ERROR #4: ENTRY NOT FOUND!
      STB ENTAD     SAVE THE ENTRY ADDRESS. 
* 
      LDA TEMP      GET THE LIST ADDRESS AGAIN. 
      CPA MDEF      IF A MASTER ENTRY IS BEING PROCESSED, 
      JMP MODCK       GO CHECK FOR SEARCH OR CLEAR OPTION.
      ADB P2        POINT TO THE SLAVE TIME-TAG WORDS.
      DLD B,I       GET THE ENTRY'S TIME-TAGS.
      CPA TTAG      IF THE FIRST COMPARES,
      RSS             GO TO CHECK THE SECOND; ELSE, 
      JMP CLOOP         CONTINUE SEARCHING. 
      CPB TTAG+1    IF THE SECOND COMPARES, 
      RSS             GO CLEAR THE ENTRY; ELSE, 
      JMP CLOOP         CONTINUE SEARCH FOR VALID ENTRY.
* 
MODCK LDA MODE      GET THE MODE OF OPERATION.
      CPA P3        IF A CLEAR REQUEST IS IN PROCESS, 
      JMP CLREN       GO-DIRECTLY-TO CLEAR THE ENTRY. 
      CPA P4        IF A BREAK-FLAG SEARCH IS IN PROCESS, 
      CLB,INB,RSS     PREPARE TO EXAMINE ENTRY'S SECOND WORD. 
      JMP GETAD     MODE =5: RETURN WITHOUT ALTERING ENTRY. 
* 
      ADB ENTAD     FORM ADDRESS OF SECOND ENTRY-WORD.
      LDA B,I       GET THE CONTENTS OF THE SECOND WORD.
      CLB           PREPARE TO RETURN NO-BREAK INDICATOR. 
      SSA,RSS       IS THE BREAK-FLAG (BIT#15) SET? 
      JMP GETAD+1     NO. EXIT WITHOUT FURTHER ACTION.
* 
CLREN LDA LSTCD     REMOVE ENTRY FROM SPECIFIED LIST. 
      CLB           ADD ENTRY TO NULL LIST. 
      JSB LNK       GO TO PROCESS LIST CHANGES. 
      SZA           LIST-PROCESSING ERROR?
      JMP ERR04       YES. GO TO INFORM THE CALLER! 
      JMP GETAD       NO. GO TO MAKE NORMAL RETURN. 
* 
      SPC 10
* 
*  SYSTEM AVAILABLE MEMORY ALLOCATION/DE-ALLOCATION PROCESSOR.
      SPC 1 
SAM   LDA XEQT      GET CALLER'S I.D. SEGMENT ADDRESS.
      CPA VALID     IF THIS IS <LSTEN> CALLING, 
      RSS             THEN ALLOW ACCESS; ELSE,
      JMP ERR01        REPORT IMPROPER ACCESS!
* 
      LDA ST/LS     GET THE MEMORY-REQUEST SPECIFICATION. 
      CPA #FWAM     IF CURRENT FWA S.A.M. SPECIFIED,
      JMP RTSAM       THEN THIS IS A DE-ALLOCATION REQUEST. 
* 
      STA SZMEM     ALLOCATE: SAVE NO. OF WORDS REQUESTED.
      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 LDB #SAVM     GET THE NUMBER OF WORDS TO RETURN.
      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. 
* 
VALID NOP           I.D. SEGMENT ADDRESS: LEGAL CALLER. 
* 
      SKP 
*  SUBROUTINE FOR DRIVER MANIPULATION OF LIST ENTRIES.
      SPC 1 
*  ENTER:  <A> = ST/LS; <B> = D-BIT(#14) & SELECT CODE (UPPER BYTE)--SLAVE
*                       <B> = CLASS NO (BITS#12-0)--MASTER
*  RETURN: <A>&<B> =0: NORMAL; <A> =-1, <B> =0: LIST-CODE ERROR.
*                              <A> =-4, <B> =0: NO SUCH ENTRY.
* 
#SBIT NOP           ENTRY/EXIT: DRIVER ACCESS TO LISTS. 
      STB KEY       SAVE KEYWORD FOR LIST SEARCH. 
* 
DMS3  JSB MAPSV     SAVE MAP STATUS: DMS; 'NOP': RTE-II.
* 
      JSB LSTCK     GO CHECK VALIDITY & SET LIST CODE.
      SZA           VALID LIST IDENTIFIER?
      JMP SERR1     * NO. INFORM CALLER OF ERROR. [<A>=-1]
      CLB,CLE,INB   SEARCH COMPARISONS ARE TO BE
      CPB LSTCD      PERFORMED ON 2ND WD. OF SLAVE ENTRIES, 
      INB             OR ON 3RD WD. OF MASTER ENTRIES.
      STB OFSET     SAVE THE KEYWORD OFFSET.
      LDA DSMSK     GET MASK: D-BIT AND SELECT CODE.
      CPB LSTCD     IF MASTER LIST IS TO BE SEARCHED, 
      LDA CLMSK       THEN CLASS NO. MASK MUST BE USED. 
      STA KYMSK     SAVE THE MASK FOR USE BY 'SERCH'. 
      JSB SERCH     SEARCH FOR THE ENTRY TO BE MODIFIED.
      JMP SERR4     * ENTRY NOT FOUND--ERROR! 
      INB           POINT TO THE FLAG WORD. 
      LDA B,I       GET THE WORD TO BE MODIFIED.
      IOR SIGN      INCLUDE THE FLAG (BIT#15).
      STA B,I       REPLACE THE MODIFIED WORD.
* 
      CLA,RSS       <A> =0 FOR NORMAL RETURN. 
SERR4 LDA M4        <A> =-4 FOR UNLOCATED ENTRY.
SERR1 CLB           <B> =0, FOR ALL RETURNS.
* 
DMS4  JSB MPRST     RESTORE MAPS: DMS; 'NOP': RTE-II. 
* 
      JMP #SBIT,I   RETURN TO THE USER. 
* 
DSMSK OCT 77400     SEARCH MASK: D-BIT & SELECT CODE. 
M4    DEC -4
* 
                                  