ASMB,R,L,C
      HED * <#REQU> - CLASS REQUEUEING * (C) HEWLETT-PACKARD CO. 1979 * 
      NAM #REQU,30 91740-16028 REV 1913 790131
      SPC 1 
      ENT #REQU,#QCNT,#PRLX 
      EXT $CLAS,$DLAY,$LIBR,$LIBX,$OPSY,$SCD3,.ENTP,DRTEQ 
*    NAME:   #REQU
*    SOURCE: 91740-18028
*    RELOC:  91740-16028
*    PGMR:   C. HAMILTON  [  1/31/79 ]
* 
*  ***************************************************************
*  * (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.       *
*  ***************************************************************
* 
*  #REQU IS A CORE-RESIDENT SYSTEM LIBRARY MODULE, USED BY THE
*   DISTRIBUTED SYSTEMS SOFTWARE PACKAGE IN THE RTE-M DISC-BASED
*   RTE OPERATING SYSTEMS ENVIRONMENTS. ITS PURPOSE IS TO PROVIDE A FAST, 
*   CORE-SAVING METHOD FOR TRANSFERRING PREVIOUSLY-QUEUED CLASS I/O 
*   BUFFERS FROM ONE CLASS TO ANOTHER CLASS. ALTERNATELY, IT CAN BE 
*   USED TO RE-QUEUE THE COMPLETED CLASS-TRANSACTION ONTO AN EQUIPMENT
*   TABLE ENTRY.
* 
*   THE ADVANTAGES GAINED THROUGH THE USE OF <#REQU> INCLUDE: 
*    1. ONCE GRANTED ADEQUATE SYSTEM AVAILABLE MEMORY(SAM) FOR THE INITIAL
*       CLASS READ OPERATION, INCOMING TRANSACTIONS WILL NOT BE IMPEDED 
*       IN THEIR PROGRESSION THROUGH THE VARIOUS NETWORK-PROCESSING 
*       MODULES, DUE TO INABILITY TO ALLOCATE SUFFICIENT S.A.M. FOR USE 
*       IN THE EXCHANGE OF DATA BETWEEN THE NETWORK PROGRAMS. THE INITIALLY 
*       ALLOCATED S.A.M. BUFFER IS RETAINED FOR THE LIFE OF THE 
*       TRANSACTION, AND IS SIMPLY EXCHANGED AMONGST THE VARIOUS MODULES. 
*    2. INTERMEDIATE PROCESSORS REQUIRE ONLY MINIMUM SIZE LOCAL BUFFERS.
*       THE QUEUEING ROUTINES NEED NOT ALLOCATE BUFFER SPACE FOR THE
*       ENTIRE TRANSACTION, PRIOR TO PASSING IT ON TO THE NEXT
*       PROCESSOR'S CLASS.
*    3. SYSTEM OVERHEAD IS MINIMIZED, DUE TO THE AVOIDANCE OF INTER-
*       MEDIATE ALLOCATION/DE-ALLOCATION OF S.A.M., AND ALSO, BY
*       AVOIDING WORD-MOVE TRANSFERS BETWEEN USER'S BUFFERS AND S.A.M.
* 
*  #REQU OPERATION: 
* 
*    1. ON FIRST ENTRY, CONFIGURE THE MODULE. 
*      A. OBTAIN A DIRECT ADDRESS FOR THE CLASS TABLE.
*      B. IF BIT #1 OF $OPSY =1, THEN OP-SYSTEM USES DMS HARDWARE,
*         REQUIRING THE USE OF DMS FIRMWARE MACRO INSTRUCTIONS. 
*      C. IF DMS, THEN CLEAR THE DMS-BYPASSING 'JMP' INSTRUCTIONS.
*      D. IF NON-DMS, ALLOW 'JMP' INSTRUCTIONS TO REMAIN. 
*      E. CLEAR THE PATH TO THE INITIALIZATION ROUTINE. 
* 
*    2. GET PARAMETERS & SAVE LOCALLY, IN PREPARATION FOR DMS MAP SWITCH. 
*      A. IF PRIORITY PARAMETER NEGATIVE, REJECT; IF MISSING, USE 32767.
*      B. IF DMS SYSTEM, SAVE MAP STATUS & SWITCH TO SYSTEM MAP.
* 
*    3. GET THE SOURCE-CLASS PARAMETER & CHECK ITS VALIDITY.
*      A. IF 0, OR GREATER THAN MAX. CLASS NO., THEN--ERROR -1! 
*      B. COMPUTE & SAVE CLASS-TABLE ENTRY ADDRESS. 
*      C. IF ENTRY =0, THEN NOT ASSIGNED--ERROR -2! 
*      D. IF SOURCE-CLASS, VERIFY THAT SOMETHING IS QUEUED; ELSE--ERROR -2! 
*      E. SAVE ADDRESS OF QUEUED ENTRY (ADDRESS POINTS TO S.A.M.) 
*      F. TRACK DOWN & SAVE CLASS-HEADER ADDRESS; IF LINK WORD=0: ERROR -9! 
*      G. COMPARE SECURITY CODES; IF MIS-MATCH--ERROR -3! 
*      H. ENSURE THAT NO ONE IS WAITING ON SOURCE-CLASS; ELSE--ERROR -4!
*      I. RETURN TO MAINLINE PROCESSING.
* 
*    4. SAVE SOURCE-CLASS ADDRESS POINTERS. 
* 
*    5. CHECK VALIDITY OF DESTINATION-CLASS PARAMETER (VIA 3.A.). 
*      A. IF -1, RESET NEG. BLOCK SIZE VALUE TO POS.; IGNORE OTHER PARAMS.
*      B. IF NEW BLOCK COUNT > MAX.  NO. OF BLOCKS ALLOWED: ERROR -10!
* 
*    6. CHECK FOR 'LU' SPECIFICATION. 
*      A. IF NOT SUPPLIED, GO TO 10. TO DE-QUEUE THE COMPLETED REQUEST. 
*      B. IF SPECIFIED, CHECK FOR VALID LU (NON-ZERO EQT,DEVICE NOT DOWN, 
*         & NOT LINKED TO A DISC FILE);  ELSE--ERROR -5!
*      C. SAVE THE EQT ADDRESS. 
* 
*    7. CHECK FOR 'CONWD' SPECIFICATION.
*      A. IF NOT SUPPLIED, GO TO 10. TO DE-QUEUE THE COMPLETED REQUEST. 
*      B. IF SPECIFIED,VERIFY THAT REQUEST CODE(BITS#1-0) #0--ELSE ERROR -6.
*      C. IF CONTROL REQUEST, SKIP LENGTH CHECKS. GO TO 10. 
* 
*    8. CHECK FOR-AND VERIFY-USER BUFFER LENGTH/CONTROL PARAMETER SPEC. 
*      A. IF NOT SUPPLIED(OR =100000B),GO TO 10.TO DE-QUEUE CURRENT REQUEST.
*      B. VERIFY THAT USER'S LENGTH < = AVAILABLE BUFFER IN S.A.M. BLOCK. 
*      C. IF SIZE EXCEEDED: ERROR -8! 
* 
*    9. CHECK FOR REQUEST TO OVERLAY THE OPTIONAL PARAMETERS. 
*      A. IF NOT SPECIFIED(OR =100000B), GO TO 10. TO DE-QUEUE THE REQUEST; 
* 
*   10. DE-QUEUE COMPLETED CLASS REQUEST FROM SOURCE-CLASS QUEUE. 
*      A. RE-LINK REMAINING ENTRIES BACK INTO SOURCE-CLASS QUEUE. 
* 
*   11. CHECK (AGAIN) FOR 'LU' SPECIFICATION. 
*      A. IF NOT SUPPLIED, GO TO 13. TO RE-QUEUE THE REQUEST. 
*      B. IF LU & CONWORD WERE SUPPLIED, REPLACE CONWORD IN COMPLETED 
*         REQUEST WITH USER-SUPPLIED PARAMETER. 
*      C. ENSURE 'T'-FIELD OF CONWORD =3, AND THAT BIT #11 =0 (FOR RTIOC).
*      D. OVERLAY WORD #3 OF COMPLETED REQUEST WITH THE USER'S PRIORITY.
*         --IF NONE, USE LOWEST PRIORITY VALUE: 32767. NEGATIVE: ERROR -7!
*      E. IF WRITE-REQUE, NEGATE BLOCK SIZE(WORD #4) TO PREVENT RTIOC'S 
*         ARBITRARY RELEASE OF THE DATA BUFFER. IF ALREADY NEG. MAKE POS. 
*      F. REPLACE WORD #5 OF COMPLETED REQUEST WITH THE DESTINATION-
*         CLASS PARAMETER.
*      G. IF BL/CP SUPPLIED, REPLACE WORD#6 WITH USER'S PARAMETER.
*      H. IF OPTIONAL PARAMETERS SUPPLIED, REPLACE WORDS#7,8 WITH USER'S. 
*      I. ADD 1 TO THE DESTINATION-CLASS PENDING REQUEST COUNT, IF < 255. 
* 
* 
      SKP 
*   12. LINK THE NEW REQUEST (ACCORDING TO PRIORITY) INTO THE EQT QUEUE.
*      A. IF THE EQT IS CURRENTLY ACTIVE, THE DEED IS DONE--RETURN. 
*      B. IF INACTIVE, INITIATE I/O OPERATION VIA $DLAY IN RTIOC & RETURN.
* 
*   13. RE-QUEUE THE COMPLETED REQUEST ONTO THE DESTINATION-CLASS.
*      A. LINK NEW REQUEST TO END OF DESTINATION-CLASS QUEUE. 
*      B. SET CONWD REQ. CODE(BITS#1,0)=0 TO INDICATE CLASS-TO-CLASS REQUE. 
*      C. IF NEG. BLOCK LENGTH IN WORD#4 OF CLASS HEADER, MAKE IT POSITIVE. 
*      D. OVERLAY WORD #5 OF COMPLETED REQUEST WITH DESTINATION-CLASS NO. 
*      E. IF NEWLY-ADDED REQUEST IS ONLY ENTRY IN QUEUE, THEN GO TO 13.G
*         TO CHECK FOR A WAITING PROGRAM. 
*      F. IF OTHER ENTRIES ARE PRESENT, THEN RETURN TO THE CALLER.
*      G. CHECK CLASS-HEADER FOR PROGRAM-WAITING BIT(#14); IF NONE, RETURN. 
*      H. IF A PROGRAM IS WAITING, SCHEDULE IT AND RETURN TO THE CALLER.
      SKP 
*      JSB #REQU    * * * #REQU CALLING SEQUENCE * * *
*      DEF *+3 [OR *+3+N (N=1,TO 6 OPTIONAL PARAMETERS)]
*      DEF SORCE    SOURCE-CLASS NUMBER 
*      DEF DESTN    DESTINATION-CLASS NUMBER
*     [DEF LU   ]   OPTIONAL LOGICAL UNIT NUMBER
*     [DEF CONWD]   OPTIONAL DRIVER CONTROL WORD
*     [DEF PRIOR]   OPTIONAL PRIORITY VALUE 
*     [DEF BL/CP]   OPTIONAL BUFFER LENGTH OR CONTROL PARAMETER 
*     [DEF IRTN1]   OPTIONAL FIRST GET-RETURN-PARAMETER 
*     [DEF IRTN2]   OPTIONAL SECOND GET-RETURN-PARAMETER
*     < RETURN >    RETURN--NORMAL: <A&B>=0  ERROR: <A>=-N, <B>=0 
* 
*   WHERE:
*      SORCE = CLASS NUMBER, FROM WHICH THE FIRST-QUEUED COMPLETED REQUEST
*              IS TO BE REMOVED.
* 
*      DESTN = CLASS NUMBER, ONTO WHICH THE COMPLETED REQUEST IS TO BE
*              RE-QUEUED  OR, THE CLASS WHICH IS TO RECEIVE I/O COMPLETION
*              INFORMATION, WHEN THE REQUEST HAS BEEN RE-QUEUED ONTO
*              AN EQUIPMENT TABLE ENTRY. IF -1, OTHER PARAMETERS ARE IGNORED
*              AND THE CURRENTLY-QUEUED SOURCE-CLASS BLOCK SIZE IS MADE POS.
* 
*      LU    = OPTIONAL LOGICAL UNIT NUMBER, ONTO WHOSE ASSOCIATED EQT
*              ENTRY, THE COMPLETED SOURCE-CLASS REQUEST IS TO BE RE- 
*              QUEUED FOR INITIATION OF A NEW CLASS I/O OPERATION,
*              UTILIZING THE EXISTING DATA OR BUFFER SPACE. 
* 
*      * NOTE: IF LU NOT SUPPLIED, CLASS TO CLASS RE-QUEUEING WILL
*              BE PERFORMED.
* 
*      CONWD = OPTIONAL DRIVER CONTROL WORD, WHICH MAY BE SUPPLIED AS 
*              THE NEW OPERATIONAL SPECIFICATION, FOR RE-QUEUEING THE 
*              REQUEST ONTO AN EQT. [ LU MUST BE SPECIFIED ]. 
* 
*                BITS #15,14 = DON'T CARE (#REQU SETS EACH =1). 
*                BIT  #13    = MSB OF SUBCHANNEL NUMBER.
*                BIT  #12    = 'Z'-BIT (OPTIONAL BUFFER SPECIFICATION). 
*                BIT  #11    = NOT USED (FORCED TO 0, FOR RTIOC). 
*                BITS #10-6  = DRIVER SUB-FUNCTION SPECIFICATION. 
*                BITS #5-2   = REMAINDER OF SUBCHANNEL NUMBER.
*                BITS #1-0   = REQUEST CODE: 1,2,3. 
* 
*      PRIOR = OPTIONAL PRIORITY (0-32767), USED TO ESTABLISH RELATIVE
*              POSITION OF NEWLY-LINKED REQUEST IN THE EQT QUEUE. 
*              IF NOT SUPPLIED, LOWEST PRIORITY (32767) IS USED.
*              [ IGNORED, IF LU & CONWD PARAMETERS NOT SPECIFIED ]
* 
*      * NOTE: FOR THE FOLLOWING OPTIONAL PARAMETERS, A VALUE =100000B
*              MAY BE SUPPLIED-AS A PLACE HOLDER-TO SPECIFY THAT THE
*              CORRESPONDING CLASS-HEADER ELEMENT IS NOT TO BE CHANGED. 
* 
*      BL/CP = OPTIONAL BUFFER LENGTH/CONTROL PARAMETER FOR A DRIVER. 
* 
*      IRTN1 = OPTIONAL PARAMETER WHICH MAY BE RETURNED ON NEXT CLASS-GET.
*      IRTN2 = OPTIONAL PARAMETER WHICH MAY BE RETURNED ON NEXT CLASS-GET.
      SKP 
* 
*  #REQU ERROR INDICATIONS: 
* 
*    ERROR DETECTION WILL RESULT IN A RETURN TO THE CALLER, WITH THE
*    REQUESTED ACTION NOT PERFORMED.
* 
*    THE <B>-REGISTER WILL ALWAYS =0. <A> IS NEGATIVE, AS FOLLOWS:
* 
*    <A> = -1: CLASS NUMBER =0, OR IS GREATER THAN THE MAXIMUM NUMBER 
*              OF CLASSES AVAILABLE.
* 
*    <A> = -2: CLASS NOT ASSIGNED, OR NOTHING IS QUEUED ON THE SOURCE-CLASS.
* 
*    <A> = -3: INVALID CLASS SECURITY CODE; OR PENDING REQUESTS = 255 (MAX).
* 
*    <A> = -4: PROGRAM IS WAITING FOR SOURCE CLASS ENTRY (CANNOT DE-QUEUE 
*              THE ENTRY).
* 
*    <A> = -5: LOGICAL UNIT NUMBER INVALID, OR THE DEVICE IS DOWN.
* 
*    <A> = -6: CONWD REQUEST CODE (BITS#1-0) =0.
* 
*    <A> = -7: NEGATIVE PRIORITY CODE.
* 
*    <A> = -8: BUFFER LENGTH(BL/CP) EXCEEDS CLASS BUFFER SIZE.
* 
*    <A> = -9: CLASS QUEUE IMPROPERLY LINKED (LINK WORD =0).
* 
*    <A> =-10: NEW BLOCK WILL EXCEED MAX. BLOCKS ALLOWED FOR DEST. CLASS. 
* 
      SKP 
SORCE NOP           SOURCE CLASS NUMBER.
DESTN NOP           DESTINATION CLASS NUMBER. 
LU    NOP           OPTIONAL LOGICAL UNIT NUMBER. 
CONWD NOP           OPTIONAL DRIVER CONTROL WORD. 
PRIOR NOP           OPTIONAL PRIORITY CODE. 
BL/CP NOP           OPTIONAL BUFFER LENGTH/CONTROL PARAMETER. 
IRTN1 NOP           OPTIONAL GET-RETURN-PARAMETER #1. 
IRTN2 NOP           OPTIONAL GET-RETURN-PARAMETER #2. 
      SUP           SUPPRESS EXTRANEOUS LISTING.
#REQU NOP           ENTRY/EXIT. 
      JSB $LIBR     DECLARE THIS TO BE
      NOP            A PRIVILEGED ROUTINE.
      JSB .ENTP     OBTAIN DIRECT ADDRESSES 
PRPTR DEF SORCE      FOR ALL PARAMETERS.
      CLA           <A>=0 FOR 'CONFG' & 'ERR' INITIALIZATION
INIT  JMP CONFG     CONFIGURE: RTE-II/III; NOP,THEREAFTER.
      STA ERR       INITIALIZE THE ERROR COUNT =0.
      LDB DM8       INITIALIZE A
      STB TEMP       COUNTER FOR PARAMETER PROCESSING.
      LDB PRPTR     GET POINTER TO PARAMETER ADDRESSES. 
* 
PLOOP LDA B,I       GET THE PARAMETER ADDRESS (OR ZERO).
      CCE,SZA,RSS   PREPARE TO IGNORE PARAMETER. SUPPLIED?
      SLA,ERA        NO. SET IGNORE-FLAG(100000B) & SKIP. 
      LDA A,I        YES. GET THE USER-SUPPLIED PARAMETER.
      STA B,I       SAVE PARAMETER (OR 100000B), LOCALLY. 
      INB           ADVVANCE PARAMETER ADDRESS POINTER. 
      ISZ TEMP      ALL PARAMETERS PROCESSED? 
      JMP PLOOP      NO. CONTINUE PROCESSING. 
* 
      LDA PRIOR     GET THE CALLER-SPECIFIED PRIORITY.
      CPA BIT15     NOT SUPPLIED/IGNORE ? 
      LDA LOWPR      YES. USE DEFAULT VALUE: 32767 (LOWEST).
      SSA           IF PRIORITY PARAMETER IS NEGATIVE,
      JMP ERR7        THEN THE REQUEST CANNOT BE HONORED. 
      STA PRIOR     ESTABLISH USER'S OR DEFAULT PRIORITY. 
* 
MAPSW JMP BYDMS     BYPASS MAP CODE:NON-DMS / NOP:DMS 
      RSA           GET CURRENT MAP STATUS. 
      RAL,RAL       POSITION CURRENT STATUS FOR RESTORATION.
      STA DMSTS     SAVE FOR RESTORATION, UPON EXIT.
      SJP BYDMS     ENABLE SYSTEM MAP, AND CONTINUE.
* 
BYDMS LDA SORCE     GET THE SOURCE CLASS-WORD.
      JSB CLCHK     GO TO DETERMINE ITS VALIDITY. 
      DLD BLKAD     SAVE THE SOURCE-CLASS 
      DST SBLK       ADDRESS POINTERS.
* 
      LDA DESTN     GET THE DESTINATION CLASS-WORD. 
      CPA DM1       IF THE PARAMETER IS =-1, THEN 
      JMP RESET      GO TO RESET POSSIBLE NEG. BLOCK SIZE;
      JSB CLCHK       ELSE, GO TO VERIFY ITS VALIDITY.
* 
      SKP 
* 
      LDB QCNT      GET BLOCK COUNT FOR DESTINATION CLASS.
      ADB #QCNT     SUBTRACT MAXIMUM ALLOWABLE COUNT. 
      CLE,SSB,RSS   IF MAXIMUM EXCEEDED, REJECT THE REQUEST.
      JMP ERR10       THEN ANOTHER BLOCK IS NOT ACCEPTABLE. 
* 
      LDA LU        GET THE USER-SPECIFIED LU, IF ANY.
      CPA BIT15     IF NONE WAS SUPPLIED, THEN
      JMP DEQUE      BYPASS LU VERIFICATION.
      JSB DRTEQ     GO TO CHECK THE LU'S VALIDITY,
      DEF *+4        AND TO OBTAIN THE EQT ADDRESS
      DEF LU          FOR ITS ASSOCIATED EQT ENTRY. 
      DEF TEMP      IGNORE THE DRT CONTENTS,
      DEF EQTAD      AND RETAIN THE EQT ADDRESS.
      SSB,RSS       IF INVALID, SKIP TO REPORT THE ERROR. 
      SZB,RSS       RE-QUEUEING ON EQT#0 IS ALSO INVALID! 
      JMP ERR5      * INFORM THE CALLER OF THE ERROR! 
* 
      ADB D4        POINT TO WORD #5 OF THE EQT ENTRY.
      LDA B,I       GET THE CONTENTS. 
      RAL,SLA       IF THE DEVICE IS BUSY, OR IT IS 
      JMP *+3        WAITING FOR DMA--CONTINUE; 
      SSA             ELSE, IF IT IS DOWN,
      JMP ERR5         THEN REJECT THE REQUEST! 
* 
      AND B74K      ISOLATE THE EQUIPMENT TYPE CODE.
      CPA B30K      IF THE EQT IS LINKED TO A DISC FILE,
      JMP ERR5        * ERROR: INVALID LU!
* 
      LDA HEDAD,I   GET THE DESTINATION-CLASS HEADER. 
      AND B377      ISOLATE THE PENDING REQUEST COUNT.
      CPA B377      IF IT HAS ALREADY REACHED MAXIMUM (255),
      JMP ERR3       THEN REJECT THE NEW REQUEST! 
* 
      LDA CONWD     GET THE CONTROL WORD--IF ANY. 
      CPA BIT15     WAS IT SPECIFIED? 
      JMP DEQUE      NO. IGNORE BUFFER CHECKS.
* 
      AND D3        ISOLATE THE REQUEST CODE(BITS#1-0). 
      SZA,RSS       IF NOT SPECIFIED, 
      JMP ERR6       THEN REJECT THE REQUEST! 
* 
      CPA D3        IF THIS IS A CONTROL REQUEST, 
      JMP DEQUE      THEN LENGTH CHECKING IS NOT NEEDED.
* 
      LDA BL/CP     GET THE USER'S SPECIFIED LENGTH.
      CPA BIT15     IGNORE THE PARAMETER? 
      JMP DEQUE      YES. GO TO DE-QUEUE THE REQUEST. 
* 
      SSA,RSS       IF CHARACTERS WERE SPECIFIED, SKIP; 
      CMA,INA,RSS    ELSE, FORM NEGATIVE WORD COUNT & SKIP; 
      ARS            CONVERT CHARACTERS TO NEGATIVE WORDS,
      SZA,RSS         AND IF THE LENGTH =0, 
      JMP DEQUE        NO LENGTH CHECKING IS REQUIRED.
* 
      LDB SBLK      GET THE CONTROL-BLOCK ADDRESS.
      ADB D3        POINT TO THE BLOCK-SIZE WORD(#4). 
      LDB B,I       GET THE TOTAL BLOCK SIZE. 
      SSB           IF THE BLOCK SIZE IS ALREADY NEGATIVE,
      CMB,INB        MAKE IT POSITIVE, FOR THE LENGTH CHECK.
      ADB DM8       SUBTRACT HEADER: REMAINDER= BUFFER SIZE.
      ADA B         ADD USER'S SIZE TO ACTUAL BUFFER SIZE.
      SSA           USER'S REQUEST > ACTUAL BUFFER SIZE?
      JMP ERR8       YES! REJECT THE REQUEST: ERROR -8. 
* 
      SKP 
DEQUE LDA SCLAS     IF THE REQUEST IS TO
      LDB SBLK       RE-QUEUE ONTO THE SAME CLASS,
      CPB HEDAD       AND ONLY ONE ENTRY IS PRESENT,
      STA HEDAD        THEN POINT TO CORRECT HEADER ADDRESS.
      LDA B,I       DE-QUEUE THE COMPLETED CLASS REQUEST
      STA SCLAS,I    FROM THE SOURCE-CLASS QUEUE. 
      LDA LU        GET THE USER-SPECIFIED LU, IF ANY.
      CPA BIT15     IF NONE WAS SUPPLIED, THEN
      JMP REQUE      RE-QUEUE REQUEST ON DESTINATION CLASS. 
* 
      CLE,INB       POINT TO CONWORD IN COMPLETED REQUEST.
      LDA CONWD     GET THE OPTIONAL CONTROL WORD.
      CPA BIT15     IF NONE WAS SUPPLIED, 
      JMP GETPR      THEN IGNORE IT;
      AND CLR11       ELSE, ENSURE THAT BIT #11 IS CLEAR, 
      IOR CLAST        THAT T-FIELD =3, 
      STA B,I           AND USE THE SUPPLIED PARAMETER. 
      CCE,SLA       SET <E> =1 FOR WRITE REQUEST. 
      CLA,CLE       SET <E> =0 FOR READ/CONTROL.
* 
GETPR LDA PRIOR     GET THE EQT QUEUEING PRIORITY NUMBER. 
      INB           POINT TO WORD #3 OF COMPLETED REQUEST.
      STA B,I       STORE THE PRIORITY INTO THE ENTRY.
      INB           POINT TO THE BLOCK SIZE (WORD#4). 
      LDA B,I       GET THE BLOCK LENGTH, AND MAKE IT 
      CMA,SSA,INA    NEGATIVE -OR POSITIVE, IF ALREADY NEG. 
      SEZ           IF IT'S A WRITE REQUEST, SAVE NEG. SIZE 
      STA B,I        TO PREVENT 'RTIOC' FROM RELEASING S.A.M. 
* 
      LDA DESTN     STORE THE CLASS-WORD FOR THE PROGRAM
      CLE,INB        TO BE SCHEDULED ON COMPLETION, INTO
      STA B,I         THE 5TH WORD OF THE CLASS REQUEST.
      INB           POINT TO WORD#6 OF COMPLETED REQUEST. 
      LDA BL/CP     GET THE BUFFER LENGTH/CONTROL PARAMETER.
      CPA BIT15     IGNORE THE PARAMETER? 
      JMP *+2        YES. GO TO CHECK NEXT PARAMETER. 
      STA B,I        NO. OVERLAY WORD#6 WITH CALLER'S VALUE.
      INB           POINT TO WORD #7 OF COMPLETED REQUEST.
      LDA IRTN1     GET OPTIONAL GET-RETURN-PARAMETER #1. 
      CPA BIT15     IGNORE IT?
      JMP *+2        YES. GO TO CHECK FOR FINAL PARAMETER.
      STA B,I        NO. OVERLAY WORD#7 OF COMPLETED REQUEST. 
      INB           POINT TO LAST WORD OF COMPLETED REQUEST.
      LDA IRTN2     GET THE OPTIONAL GET-RETURN-PARAMETER.
      CPA BIT15     IGNORE IT?
      JMP *+2        YES. GO ADVANCE PENDING-REQUEST COUNT. 
      STA B,I        NO. OVERLAY WORD#8 OF COMPLETED REQUEST. 
* 
      ISZ HEDAD,I   ADD 1 TO THE PENDING-REQUEST COUNT. 
      JSB LINK      LINK INTO EQT QUEUE BY PRIORITY.
      SEZ           IF THE EQT WAS ACTIVE,
      JMP EXIT       RETURN TO THE CALLER; ELSE,
      LDA EQTAD       GET THE EQT ADDRESS, AND
      JSB $DLAY        GO TO INITIATE THE I/O OPERATION.
      JMP EXIT      RETURN--OPERATION COMPLETE. 
* 
REQUE LDA HEDAD,I   GET DESTINATION CLASS-HEADER. 
      STA B,I       END-OF-QUEUE = 1RST WORD OF NEW ENTRY.
      STB HEDAD,I   LINK THE NEW ENTRY AT END-OF-QUEUE. 
* 
      INB           POINT TO THE CONWORD. 
      LDA B,I       GET THE CONWORD.
      AND D3        SET THE 
      XOR B,I        REQUEST CODE =0, 
      STA B,I         TO INDICATE CLASS-TO-CLASS REQUE. 
* 
      ADB D2        POINT TO THE BLOCK SIZE(WORD#4).
      LDA B,I       GET THE BLOCK LENGTH. IF IT IS
      CMA,SSA,INA,RSS  NEGATIVE, MAKE IT POSITIVE, AND
      STA B,I           RESTORE THE BLOCK SIZE VALUE. 
      INB           POINT TO THE CLASS-WORD IN THE NEW ENTRY. 
      LDA DESTN     GET THE DESTINATION CLASS-WORD, 
      STA B,I        AND REPLACE THE OLD WITH THE NEW.
* 
      LDA CLTBA     IF THE CLASS-HEADER IS THE ONLY THING 
      CPA HEDAD      IN THE CLASS-TABLE ENTRY, THEN 
      RSS             ANY WAITING PROGRAM MUST BE SCHEDULED;
      JMP EXIT         ELSE: OPERATION COMPLETE--RETURN.
* 
      LDB SBLK,I    GET THE CLASS-HEADER FROM ITS NEW LOCN. 
      RBL,CLE,ELB   POSITION WAIT-BIT(#14) TO <E>.
      SEZ,RSS       IF SOMEONE IS WAITING, SKIP TO SCHEDULE;
      JMP EXIT       ELSE: OPERATION COMPLETE--RETURN.
* 
      RBR,RBR       REPOSITION CLASS-HEADER (LESS BIT#14),
      STB SBLK,I     AND RESTORE IT TO ITS RIGHTFUL PLACE.
* 
      JSB $SCD3    SCHEDULE WAITER(<A>=CLASS-TABLE ADDRESS) 
* 
EXIT  CLA           NORMAL EXIT: <A>=0,  <B>=0
ERREX CLB           ERROR  EXIT: <A>=-N, <B>=0
      STB SORCE     CLEAR ALL OF
      STB DESTN      THE PARAMETERS,
      STB LU          IN PREPARATION
      STB CONWD        FOR NEXT ENTRY 
      STB PRIOR         TO THE ROUTINE. 
      STB BL/CP 
      STB IRTN1 
      STB IRTN2 
* 
EXIT2 JMP LBEX      BYPASS MAP CODE: NON-DMS / NOP: DMS 
      JRS DMSTS LBEX *** RESTORE THE APPROPRIATE MAPS. ***
* 
LBEX  JSB $LIBX     RETURN TO THE CALLER, VIA THE 
      DEF #REQU      RTE PRIVILEGED ROUTINE PROCESSOR.
* 
      SKP 
*  ERROR PROCESSING SECTION.
      SPC 1 
ERR10 ISZ ERR      -10: NEW BLOCK WIL EXCEED #QLIM WD. CNT. 
ERR9  ISZ ERR       -9: CLASS QUEUE IMPROPERLY LINKED.
ERR8  ISZ ERR       -8: BUFFER LENGTH > CLASS BUFFER SIZE.
ERR7  ISZ ERR       -7: NEGATIVE PRIORITY CODE. 
ERR6  ISZ ERR       -6: CONWD REQUEST CODE =0 (BITS#1-0). 
ERR5  ISZ ERR       -5: INVALID LU OR DOWN DEVICE.
ERR4  ISZ ERR       -4: PGM. WAITING ON SOURCE--CAN'T DEQUE!
ERR3  ISZ ERR       -3: INVALID CLASS SECURITY CODE.
ERR2  ISZ ERR       -2: CLASS NOT ASSIGNED, OR NO Q (SOURCE)
ERR1  ISZ ERR       -1: CLASS =0, OR > MAX. NO. ALLOCATED.
      LDA ERR       GET THE ERROR NUMBER, 
      CMA,INA        AND MAKE IT NEGATIVE.
      JMP ERREX     GO TO RETURN THE ERROR-REPORT.
* 
      SPC 3 
*  RESET CURRENTLY-QUEUED SOURCE-CLASS BLOCK SIZE WORD TO A POSITIVE VALUE. 
* 
*[RE-QUEUED CLASS WRITES HAVE NEGATIVE BLOCK SIZE TO PREVENT BUFFER RELEASE]
* 
RESET LDB SBLK      GET THE BLOCK ADDRESS.
      ADB D3        POINT TO THE BLOCK SIZE (WORD#4). 
      LDA B,I       GET THE BLOCK SIZE VALUE. 
      CMA,SSA,INA,RSS  IF IT'S NEGATIVE, MAKE IT POSITIVE,
      STA B,I           AND RESTORE THE CORRECT VALUE.
      JMP EXIT      RETURN. 
* 
      SKP 
* 
CLCHK NOP           ENTRY/EXIT: CLASS VALIDITY CHECKING 
      STA TEMP      SAVE THE CLASS-WORD FOR LATER USE.
      AND B377      ISOLATE THE CLASS NUMBER
      STA B         SAVE IT FOR A TABLE INDEX.
      CMA,CLE,INA,SZA,RSS IF THE NUMBER IS ZERO,
      CLE,RSS              PREPARE FOR AN ERROR-EXIT. 
      ADA $CLAS     IF IT IS GREATER THAN MAXIMUM,
      CLA,SEZ,RSS    THEN TAKE THE
      JMP ERR1        ERROR EXIT. 
* 
      STA QCNT      INITIALIZE CLASS QUEUE BLK CNT. =0. 
      ADB DFCLS     COMPUTE, AND SAVE,
      STB CLTBA      THE CLASS-TABLE ENTRY ADDRESS. 
* 
      LDA TEMP      GET THE CLASS WORD. 
      LDB B,I       GET THE CLASS-TABLE ENTRY.
      CPA SORCE     IF THE SOURCE-CLASS IS BEING CHECKED, 
      SSB,RSS        THEN CONFIRM THAT SOMETHING IS QUEUED. 
      SZB,RSS       ALSO VERIFY THAT THE CLASS IS ASSIGNED. 
      JMP ERR2      * ERROR: NOT ASSIGNED OR NO QUEUE.
* 
      SSB           IF THIS IS THE CLASS-HEADER, THEN 
      LDB CLTBA      GET THE CORRECT ADDRESS. 
      STB BLKAD     SAVE THE CLASS-QUEUE POINTER, IF ANY. 
* 
LOOP  ISZ QCNT      COUNT NUMBER OF QUEUED BLOCKS.
      NOP 
      LDA B,I       TRACK DOWN
      SSA            DOWN THE 
      JMP SAVAD       CLASS HEADER. 
      SZA,RSS       IF THE LINK WORD IS ZERO, 
      JMP ERR9       THEN THE CLASS QUEUE IS CORRUPT! 
* 
      LDB B,I       LAST QUEUE NOT YET LOCATED, 
      JMP LOOP       SO CONTINUE THE SEARCH.
* 
SAVAD STB HEDAD     SAVE THE CLASS-HEADER ADDRESS.
      CPB CLTBA     IF NOTHING IS QUEUED, THEN
      JMP GETSC      THE WORD COUNT REMAINS =0; 
* 
GETSC LDA TEMP      ISOLATE THE 
      AND SCMSK      USER-SPECIFIED SECURITY CODE,
      STA B           AND SAVE IT FOR COMPARISON. 
      LDA HEDAD,I   GET THE CLASS-HEADER. 
      AND SCMSK     ISOLATE ITS SECURITY CODE.
      CPA B         IF THEY COMPARE, THEN 
      RSS            ALL'S WELL--PROCEDE; 
      JMP ERR3        ELSE, REPORT THE ERROR! 
* 
      LDA TEMP      GET THE CLASS-WORD, AGAIN.
      CPA SORCE     IF IT'S THE SOURCE-CLASS, THEN
      RSS            SKIP TO CHECK FOR WAITERS; 
      JMP CLCHK,I     ELSE, RETURN TO THE CALLER. 
* 
      LDB HEDAD,I   GET THE CLASS-HEADER. 
      RBL           POSITION THE WAIT-BIT(#14) FOR TEST.
      SSB           IF SOMEONE IS WAITING,
      JMP ERR4       THEN RE-QUEUEING IS IMPROPER!
* 
      JMP CLCHK,I   VALID CLASS: RETURN--POINTERS SET.
* 
QCNT  NOP           CLASS QUEUE BLOCK COUNT ACCUMULATION. 
#PRLX EQU 0         LU FOR PROGL MESSAGES: DEFAULT = NONE.
#QCNT DEC -11       -[(MAX. ALLOWABLE QUEUED BLOCKS)+1] 
                                                                                                                                                                                                                                    