ASMB,R,L,C
      HED <D65MS> MASTER REQUEST INTERFACE * (C) HEWLETT-PACKARD CO. 1976*
* 
      NAM D65MS,7 91700-16135 REV.A 760331
      SPC 1 
      ENT D65MS 
      SPC 1 
      EXT .ENTR,#RSAX,$TIME,#MSTO,#QRN,#WAIT
      EXT EXEC,D65CL,D65AB,DRTEQ,RNRQ,#TBRN,#PLOG 
* 
*    NAME:   D65MS
*    SOURCE: 91700-18135
*    RELOC:  91700-16135
*    PGMR:   C.C.H. [ 03/31/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.       *
******************************************************************
* 
*  D65MS PROVIDES THE MASTER REQUESTOR WITH AN INTERFACE TO THE 
*   COMMUNICATIONS NETWORK, WHICH GUARDS AGAINST CONFLICTING
*   REQUESTS FROM OTHER USERS WHO MAY ATTEMPT TO GAIN ACCESS TO 
*   THE SAME COMMUNICATION PATH.
* 
*  D65MS OPERATION: 
*   1. GET USER-SUPPLIED PARAMETERS.
*     A. FORM ERROR-REPORT ADDRESS =JSB D65MS, IF [ERRAD] NOT SUPPLIED. 
*     B. SET ERROR-RETURN FLAG IF CONWD PARAMETER BIT#15 =1.
*     C. ISOLATE & REMOVE NO-WAIT BIT(#10) & BLIND REQUEST BIT(#9) IN CONWD.
*     D. ADD MASTER-REQUEST BIT(#9) TO CONTROL WORD.
*     E. SAVE FLAG WORD WITH ERROR-RETURN BIT(#15), NO-WAIT BIT(#1),
*        AND BLIND REQUEST BIT(#0). 
*   2. CHECK <#QRN> IN 'RES': 
*     A. IF IT IS ZERO, THEN DS1 SYSTEM IS SHUT DOWN; ERROR: "DS00".
*     B. IF IT IS NON-ZERO, THEN VALUE IS A RESOURCE NUMBER, WHICH MUST BE
*        CHECKED FOR AVAILABILITY. LOCK & CLEAR THE RN, BEFORE PROCEEDING.
*     C. IF IT IS ALREADY LOCKED, THEN THE SYSTEM HAS BEEN MADE 
*        QUIESCENT--WAIT FOR UN-LOCK BEFORE PROCEEDING. 
*     D. IF IT IS UN-LOCKED, THEN PROCEED WITH THE RN CLEARED.
*     E. IF #QRN IS NOW =0, THEN SYSTEM HAS BEEN CHANGED FROM QUIESCENT 
*        TO SHUT-DOWN STATE. RETURN WITH ERROR: "DS00". 
*   3. GET EQT EXTENSION ADDRESS FOR EQT ASSOCIATED WITH SPECIFIED LU.
*     A. SAVE EQT EXTENSION ADDRESS FOR USE BY 'D65CL'. 
*   4. IF BLIND REQUEST, THEN NO NEED TO CHECK REPLY LENGTH-GO TO 5.; ELSE, 
*      CHECK FOR MINIMUM LENGTH =35 WORDS; <35: ERROR: "DS06".
*   5. GET CLASS NUMBER FROM RTE FOR USE IN RECEIVING REPLY 
*      VIA QUEUE--WAIT IF UNAVAILABLE.
*   6. ADD FRIENDLY SATELLITE BIT(#11) TO FIRST WORD OF PARMB.
*   7. PUT MASTER CLASS NO. IN WORD #2 OF PARMB, FOR LATER USE
*      BY QUEUE, IN FORWARDING THE REPLY. 
*   8. PUT CURRENT SYSTEM TIME IN WORDS #34 & #35 OF PARMB, AND 
*      IN LOCAL STORAGE. TIME-TAG IS USED TO UNIQUELY IDENTIFY
*      THE REPLY AS THE EXPECTED REPLY. 
      SKP 
*   9. WAIT FOR AVAILABILITY OF TABLE-ACCESS RN (#TBRN) BEFORE
*      BUILDING A MASTER REQUESTOR CONTROL TABLE ENTRY; START MASTER TIMER, 
*      UNLESS CONWD BIT#9 =1 (BLIND REQUEST). 
*  10. GO TO 'D65CL' TO FORWARD THE REQUEST, VIA THE COMM. LINE.
*     A. IF #PLOG #0, WRITE PARMB TO PARMB LOGGER'S CLASS NO. 
*  11. IF BLIND REQUEST, RETURN NOW; ELSE, DO A CLASS GET TO AWAIT REPLY. 
*  12. CHECK THE REPLY: 
*     A. ZERO LENGTH =TIMEOUT (COURTESY OF 'UPLIN').
*     B. AT LEAST 35 WORDS (PARMB SIZE) ARE EXPECTED; ELSE, "DS03" ERROR! 
*     C. SAME TIME-TAG  MUST BE RETURNED; ELSE, THIS IS A LATE
*        OR IMPROPER REPLY, AND IS IGNORED: GO TO 11. 
*     D. IF BUSY-REPLY(WORD#1,BIT#13=1) RECEIVED FROM A QUIESCENT 
*        REMOTE, THEN CHECK 'FLAGS' FOR THE NO-WAIT BIT(#1).
*     E. IF NO-WAIT & ERROR-RETURN BITS SET, THEN RETURN VIA <ERROR RETURN> 
*        WITH <A>&<B>="DS08"; ELSE, GO TO 'D65AB' WITH REGISTERS ="DS08". 
*     F. IF NO-WAIT BIT CLEAR, THEN PLACE PROGRAM IN TIME LIST FOR A
*        PERIOD OF SECONDS, AS SPECIFIED BY <#WAIT> IN 'RES'. 
*     G. AFTER THE DELAY, RE-SUBMIT THE REQUEST (GO TO 2.). 
*  13. CHECK FOR A REPLY FROM AN ILLEGAL REQUEST; IF ILLEGAL: "DS03" ERROR! 
*  14. RETURN THE CLASS NUMBER TO THE SYSTEM. 
*  15. CLEAR THE MASTER REQUESTOR CONTROL TABLE ENTRY.
*  16. RETURN TO THE CALLER AT <NORMAL RETURN>, WITH DVR65 INFO IN <A>&<B>. 
* 
*  D65MS CALLING SEQUENCE:
* 
*     JSB D65MS 
*     DEF *+7  [OR *+8] 
*     DEF RCODE     DRIVER REQUEST CODE 
*     DEF CONWD     CONTROL WORD/ERROR-RETURN FLAG (BIT#15).
*     DEF RQBUF     REQUEST BUFFER ADDRESS. 
*     DEF RQLEN     REQUEST LENGTH. (MINIMUM SIZE =35 WORDS)
*     DEF DABUF     DATA BUFFER ADDRESS OR DUMMY PARAMETER. 
*     DEF DALEN     DATA BUFFER LENGTH OR DUMMY PARAMETER.
*    [DEF ERRAD]    [OPTIONAL ADDRESS FOR ERROR-REPORT PRINTOUT.] 
*  <ERROR RETURN >  RETURN HERE UPON ERROR DETECTION. 
*  <NORMAL RETURN>  NORMAL RETURN HERE, UPON COMPLETION.
* 
* 
*    CONWD DESCRIPTION: 
* 
*     BIT#15      - ERROR-RETURN FLAG (SEE D65MS ERROR PROCESSING: ITEM #1).
*     BITS#14,13  - RESERVED FOR USE BY 'RTE'.
*     BIT#12      - 'Z' BIT (DOUBLE BUFFER, AS DESCRIBED IN RTE MANUAL).
*     BIT#11      - RESERVED FOR USE BY 'RTE'.
*     BIT#10      - NO-WAIT (SEE D65MS OPERATION: ITEMS #12.D THRU #12.G).
*     BIT#9       - BLIND REQUEST: NO REPLY EXPECTED, AT THIS TIME. 
*     BITS#8,7,6  - REQUEST TYPE (MODE): 0 - REQUEST ONLY 
*                                        1 - SEND REQUEST & READ DATA 
*                                        2 - SEND REQUEST & SEND DATA 
*                                        3 - READ OR SEND DATA ONLY 
*     BITS#5-#0   - LOGICAL UNIT NO. OF COMMUNICATION LINE INTERFACE. 
* 
*       NOTE: BITS #9,10 -AS SPECIFIED BY THE USER- ARE REMOVED BY 'D65MS', 
*             AND BIT #9 (MASTER REQUEST) IS SET, BEFORE CALLING 'D65CL'. 
      SKP 
* 
*  D65MS ERROR PROCESSING:
* 
*   1. IF SIGN BIT(#15) OF LU PARAMETER IS SET, ASCII ERROR CODES 
*      ARE SUPPLIED TO THE CALLER IN THE <A>&<B> REGISTERS, UPON
*      RETURN TO THE <ERROR RETURN> POINT IN THE CALLING SEQUENCE.
*   2. IF THE SIGN BIT IS NOT SET, THEN THE ROUTINE 'D65AB' IS
*      CALLED TO ABORT THE CALLER'S PROGRAM, AFTER PRINTING AN
*      ERROR MESSAGE ON THE SYSTEM CONSOLE. THE MESSAGE PRINTED 
*      WILL CONTAIN EITHER THE USER-SUPPLIED ERROR ADDRESS (ERRAD), 
*      OR THE ADDRESS OF THE USER'S CALL TO 'D65MS'.
* 
*  D65MS ERROR MESSAGES:
* 
*    "DS00" - DS1 IS SHUT-DOWN! 
* 
*    "DS01" - DVR65 DETECTED ERROR (PARITY, ETC.) - FROM 'D65CL'. 
* 
*    "DS03" - ILLEGAL REPLY - SHORT PARMB.
* 
*    "DS04" - LOGICAL UNIT INVALID OR NO CLCT ENTRY.
* 
*    "DS05" - MASTER REQUEST TIMEOUT (COURTESY OF 'UPLIN'). 
* 
*    "DS06" - ILLEGAL REQUEST.
* 
*    "DS07" - 'RES' TABLE-ACCESS ERROR. 
* 
*    "DS08" - BUSY-REJECT FROM REMOTE [NO-WAIT SET OR RETRIES EXHAUSTED]. 
* 
*    "IOXX" - \ 
*              - RTE SYSTEM DETECTED ERRORS.
*    "RNXX" - / 
* 
* 
* 
      SKP 
      SUP           [SUPPRESS EXTENDED LISTING] 
RCODA NOP           REQUEST CODE ADDRESS. 
CONWD NOP           CONTROL WORD ADDRESS. 
RQBUF NOP           REQUEST BUFFER ADDRESS. 
RQLEN NOP           REQUEST BUFFER LENGTH.
DABUF NOP           DATA BUFFER ADDRESS OR DUMMY PARAMETER. 
DALEN NOP           DATA BUFFER LENGTH OR DUMMY PARAMETER.
ERRAD NOP           OPTIONAL ADDRESS OF ERROR-CAUSING CALL. 
      SPC 1 
D65MS NOP           ENTRY/EXIT
      JSB .ENTR     OBTAIN DIRECT ADDRESSES 
      DEF RCODA       FOR PARAMETERS & RETURN POINT.
      CLB           CLEAR CLASS NUMBER
      STB CLASN       FOR ERROR PROCESSOR.
      LDA ERRAD,I   GET OPTIONAL ERROR-REPORT ADDRESS.
      STB ERRAD     CLEAR PARAMETER FOR NEXT CALL.
      SZA           DID USER SUPPLY AN ADDRESS? 
      JMP STORA       YES, GO TO SAVE IT. 
      LDA D65MS       NO. SET ERROR ADDRESS TO POINT
      ADA DM9           TO CALL TO 'D65MS'. 
STORA STA ERRA      SAVE FOR POSSIBLE ERROR PROCESSING. 
* 
      LDA CONWD,I   GET THE CONTROL WORD. 
      RAL,CLE,ERA   MOVE THE ERROR-RETURN FLAG TO <E>.
      STA B         SAVE IN <B>, TEMPORARILY. 
      AND B3000     ISOLATE NO-WAIT & BLIND REQUEST BITS. 
      SWP           EXCHANGE <A>&<B> FOR BOOLEAN OPERATIONS.
      XOR B         REMOVE NO-WAIT & BLIND REQUEST BITS.
      IOR B1000     ADD THE MASTER-REQUEST FLAG (BIT#9).
      STA CONWD     SAVE THE COMPLETE CONTROL WORD, LOCALLY.
      BLF,BLF       POSITION NO-WAIT & BLIND REQUEST BITS 
      ERB            TO BITS #1,#0; ADD ERROR-RTN: BIT#15.
      STB FLAGS     SAVE THE COMPLETE FLAG WORD.
      SPC 1 
*  CHECK FOR LOCAL SYSTEM SHUT-DOWN OR QUIESCENT STATUS.
      SPC 1 
RETRY LDA #QRN      GET THE QUIESCENT/SHUT-DOWN RN. 
      SZA,RSS       IS THE DS1 SYSTEM SHUT-DOWN?
      JMP DOWN        YES. GO TELL CALLER THE SAD NEWS. 
      SPC 1 
*  REQUESTS WILL BE FORCED TO WAIT HERE, IF LOCAL SYSTEM HAS BEEN QUIESCED. 
      SPC 1 
      JSB RNRQ      GO TO RTE TO CHECK FOR SYSTEM QUIESCENCE. 
      DEF *+4 
      DEF LCGW      LOCK/CLEAR/WAIT/NO-ABORT
      DEF #QRN      CHECK SYSTEM-QUIESCENCE RESOURCE NUMBER.
      DEF TEMP      DUMMY PARAMETER.
      JMP PASER     * RTE ERROR - PASS CODE TO CALLER * 
* 
      LDA #QRN      IF QUIESCENT STATE HAS BEEN CHANGED 
      SZA,RSS         TO SYSTEM SHUT-DOWN STATE,
      JMP DOWN          THEN TELL THE CALLER THE SAD NEWS.
* 
      SKP 
*  LOCATE EQT ADDRESS TO GET DEVICE SELECT CODE & EXTENSION ADDRESS.
      SPC 1 
      JSB DRTEQ     GO TO FIND EQT ADDRESS. 
      DEF *+2 
      DEF CONWD     RETURN INFO FOR THIS LOGICAL UNIT.
* 
      CPA M1        IF INVALID LU DETECTED, 
      JMP LUERR     * ERROR: "DS04" IS REPORTED.
      ADB P3        FORM EQT4 ADDRESS FROM EQT FWA IN <B>.
      LDA B,I       GET CONTENTS OF EQT4. 
      AND B77       ISOLATE THE DEVICE SELECT CODE. 
      STA SCODE     SAVE FOR INSERTION INTO MRCT. 
      INB           POSITION TO EQT5 ADDRESS. 
      LDA B,I       GET CONTENTS OF EQT5. 
      AND EQMSK     ISOLATE THE EQUIPMENT TYPE-CODE.
      CPA TYP65     IS THIS LU LINKED TO DVR65? 
      RSS             YES. SKIP TO FIND THE EQT EXTENSION.
      JMP LUERR       NO. * ERROR: "DS04" - INVALID LU! 
      ADB P8        COMPUTE ADDRESS OF EQT13. 
      LDB B,I       GET A DIRECT
      RBL,CLE,SLB,ERB   ADDRESS FOR THE 
      JMP *-2               EQT EXTENSION.
      STB EXTAD     SAVE FOR USE BY 'D65CL'.
      SPC 2 
*  CHECK FOR MINIMUM REPLY LENGTH OF 35 WORDS.
      SPC 1 
      LDA FLAGS     GET 'FLAGS' FOR BLIND-REQUEST CHECK.
      SLA           IF THIS IS A BLIND-REQUEST, THEN
      JMP GCLAS       NO NEED TO CHECK REPLY LENGTH.
      LDA RQLEN,I   GET REQUEST BUFFER LENGTH.
      ADA M35       IF NEGATIVE, OR <35 WORDS 
      SSA              WERE SPECIFIED, THEN 
      JMP ILRQ           THIS IS AN ILLEGAL REQUEST!
      SPC 2 
*  REQUEST A CLASS NUMBER ALLOCATION FROM RTE.
      SPC 1 
GCLAS LDA BIT13     INITIALIZE CLASS NUMBER 
      STA CLASN       FOR NON-RELEASE USAGE.
      JSB EXEC      GO TO RTE FOR A CLASS NO.--WAIT FOR IT. 
      DEF *+5 
      DEF CLS19     CLASS CONTROL(QUICK ALLOCATE)-NO ABORT. 
      DEF ZERO      LU ='BIT BUCKET' FOR ALLOCATION.
      DEF ZERO      DUMMY PARAMETER FOR ALLOCATION. 
      DEF CLASN     CLASS NUMBER STORAGE ADDRESS. 
      JMP PASER     * RTE ERROR: MESSAGE IN <A>&<B> * 
* 
      JSB EXEC      GO TO RTE TO COMPLETE 
      DEF *+5         PREVIOUS ALLOCATION REQUEST.
      DEF CLS21     CLASS GET--NO ABORT.
      DEF CLASN     CLASS NUMBER STORAGE ADDRESS. 
      DEF ZERO      DUMMY PARAMETER.
      DEF ZERO      DUMMY PARAMETER.
      JMP PASER     * RTE ERROR: MESSAGE IN <A>&<B> * 
* 
      SKP 
*  ADD FRIENDLY SATELLITE BIT(#11) TO FIRST WORD OF PARAMETER BUFFER. 
      SPC 1 
      LDA BIT11     ADD THE 
      LDB RQBUF       FRIENDLY SATELLITE BIT(#11) 
      IOR B,I           TO THE FIRST WORD (STREAM,ETC.) 
      STA B,I             OF THE PARAMETER BUFFER (PARMB).
      SPC 1 
*  ADD CLASS NUMBER & LATE-REPLY TIME TAG TO PARMB. 
      SPC 1 
      LDA CLASN     GET MASTER CLASS NUMBER.
      STA MBUF+1    SAVE FOR MASTER REQUEST TABLE ENTRY.
      INB           POINT TO 2ND WORD (MASTER CLASS NO.)
      STA B,I       SAVE FOR REPLY (USED BY QUEUE). 
      ADB P32       POINT TO WORD #34 OF PARMB. 
      STB TEMP      SAVE TEMPORARILY. 
      DLD $TIME     GET CURRENT SYSTEM TIME.
      DST TEMP,I    SAVE IN PARMB AND LOCAL STORAGE 
      DST TAG         FOR VALID REPLY RECOGNITION.
      SPC 1 
*  BUILD MASTER REQUESTOR LIST-ENTRY IN 'RES'.
      SPC 1 
      LDB FLAGS     GET BLIND-REQUEST FLAG. 
      LDA SCODE     GET COMM. LINE SELECT CODE. 
      ALF,ALF       POSITION TO UPPER BYTE. 
      SLB,RSS       IF BLIND REQUEST, NO TIMER NEEDED--SKIP.
      IOR #MSTO     INCLUDE TIMEOUT COUNT IN LOWER BYTE.
      STA MBUF      SAVE IN FIRST WORD OF ENTRY BUFFER. 
      LDA XEQT      GET I.D. SEG. ADDRESS OF USER'S PROGRAM.
      STA MBUF+2    SAVE IN THIRD WORD OF ENTRY BUFFER. 
      SPC 1 
*  WAIT FOR AVAILABILITY OF LIST-ENTRY SPACE IN 'RES'; ADD NEW ENTRY. 
      SPC 1 
      JSB RNRQ      GO TO RTE TO CHECK THE TABLE-ACCESS RN. 
      DEF *+4 
      DEF LGW       LOCK GLOBAL RN/WAIT FOR IT/NO ABORT.
      DEF #TBRN     TABLE-ACCESS SPACE-AVAILABLE RN.
      DEF TEMP      DUMMY PARAMETER.
      JMP PASER     * RTE ERROR - PASS ERROR CODE TO USER * 
* 
      JSB #RSAX     GO TO 'RES' ACCESS ROUTINE. 
      DEF *+5 
      DEF P1        ADD A MASTER ENTRY. 
      DEF P1        SPECIFY MASTER LIST.
      DEF CLASN     SEARCH FOR OLD ENTRIES, USING CLASS NO. 
      DEF MBUF      ADDRESS OF TABLE ENTRY DATA.
      SZA           ANY ERRORS? 
      JMP RESER     * ERROR: "DS07" (NOT LIKELY). 
* 
      SKP 
*  CALL 'D65CL' TO COMMUNICATE VIA THE COMM. LINE.
      SPC 1 
      JSB D65CL     GO TO COMM. LINE ACCESS ROUTINE.
      DEF *+8 
      DEF RCODA,I   REQUEST CODE ADDRESS. 
      DEF CONWD     CONTROL WORD. 
      DEF RQBUF,I   REQUEST BUFFER ADDRESS. 
      DEF RQLEN,I   REQUEST BUFFER LENGTH ADDRESS.
      DEF DABUF,I   DATA BUFFER ADDRESS OR DUMMY PARAMETER. 
      DEF DALEN,I   DATA BUFFER LENGTH OR DUMMY PARAMETER.
      DEF EXTAD     ADDRESS OF EQT EXTENSION. 
      JMP PASER     * COMM. LINE ERROR: GO PROCESS *
      DST REG       SAVE RETURN INFO FROM DVR65.
* 
      JSB PLOG      GO TO CHECK FOR PARMB LOGGING REQUEST.
* 
      LDA FLAGS     IF THIS WAS A 
      SLA             BLIND REQUEST (FLAGS BIT#0 =1), 
      JMP BLIND         GO TO CLEAN UP; ELSE, 
      SPC 1 
*  DO A CLASS GET TO WAIT FOR A REPLY FOR THIS TRANSACTION. 
      SPC 1 
GETRP JSB EXEC      GO TO RTE TO GET THE REPLY. 
      DEF *+5 
      DEF CLS21     SPECIFY CLASS GET--NO ABORT.
      DEF CLASN     SPECIFY MASTER CLASS NO.--NO RELEASE. 
      DEF RQBUF,I   SPECIFY REPLY ADDRESS.
      DEF RQLEN,I   SPECIFY REPLY LENGTH. 
      JMP PASER     * RTE ERROR: GO TO PROCESS *
      SPC 1 
*  CHECK FOR PROPER REPLY.
      SPC 1 
      SZB,RSS       CHECK FOR ZERO REPLY LENGTH.
      JMP MTOER     * ZERO LENGTH: GO PROCESS TIMEOUT ERROR * 
      ADB M35       WERE AT LEAST 
      SSB             35 WORDS RETURNED?
      JMP RPLER         * NO. REPLY ERROR "DS03" *
      LDB RQBUF     GET REPLY BUFFER ADDRESS. 
      ADB P33       POINT TO WORD #34.
      STB TEMP      SAVE POINTER TEMPORARILY. 
      DLD TEMP,I    GET REPLY WORDS #34 & #35 (TIME TAG). 
      CPA TAG       IF FIRST TAG COMPARES,
      RSS             SKIP TO CHECK SECOND; ELSE, 
      JMP GETRP         NOT EXPECTED REPLY; TRY AGAIN.
      CPB TAG+1     IF SECOND TAG COMPARES, 
      RSS             THEN THIS IS IT; ELSE,
      JMP GETRP         NOT EXPECTED REPLY; TRY AGAIN.
* 
      SKP 
*  CHECK FOR BUSY-REPLY FROM A REMOTE WHICH HAS BEEN MADE QUIESCENT.
      SPC 1 
      LDB RQBUF     GET REPLY BUFFER ADDRESS. 
      LDA B,I       GET THE FIRST WORD OF THE REPLY.
      AND RPMSK     ISOLATE REPLY-BIT(#14) & BUSY-BIT(#13). 
      CPA RPMSK     IS THIS A QUIESCENT-REJECT FROM REMOTE? 
      RSS             YES. SKIP TO PROCESS THE CONDITION. 
      JMP RPLCK       NO. CONTINUE WITH NORMAL PROCESSING.
      XOR B,I       REMOVE THE REPLY & BUSY-REJECT BITS.
      STA B,I       RESTORE THE FIRST WORD OF THE REQUEST.
* 
      LDA FLAGS     GET THE FLAG-WORD.
      AND P2        ISOLATE THE NO-WAIT BIT (#1). 
      SZA           CALLER WISH TO WAIT FOR THE REMOTE? 
      JMP BZYER       NO. TELL HIM IT'S UN-AVAILABLE. 
* 
      JSB EXEC      GO TO THE RTE 'EXEC'
      DEF *+6        IN ORDER TO PLACE
      DEF P12         INTO THE TIME-LIST, 
      DEF ZERO         THIS PROGRAM, FOR A PERIOD 
      DEF P2            OF DELAY IN SECONDS,
      DEF ZERO           (ONCE-ONLY) AS DETERMINED BY A 
      DEF #WAIT           NEGATIVE VALUE <#WAIT> IN 'RES'.
* 
      JSB CLNUP     RETURN CLASS# AND CLEAR TABLE ENTRY;
      JMP RETRY      THEN, RE-SUBMIT THE REQUEST. 
      SPC 1 
*  CHECK FOR A REPLY FROM AN ILLEGAL REQUEST. 
      SPC 1 
RPLCK ADB P2        POSITION TO THIRD WORD. 
      LDA B,I       GET THE WORD. 
      CPA "IL"      IF IT IS ASCII "IL", THEN 
      JMP ILRQ        USER MADE AN ILLEGAL REQUEST ("DS06").
BLIND JSB CLNUP     GO TO CLEAN UP BEFORE EXITING.
      SPC 1 
*  RETURN TO USER AT NORMAL RETURN POINT. 
      SPC 1 
      DLD REG       <A&B> = DVR65 RETURN INFORMATION. 
      ISZ D65MS     SET EXIT POINTER FOR NORMAL RETURN. 
      JMP D65MS,I   RETURN TO THE CALLER. 
* 
      SKP 
*  SUBROUTINE TO RELEASE THE MASTER CLASS AND CLEAR THE MASTER-LIST ENTRY.
      SPC 1 
CLNUP NOP           ENTRY/EXIT
      LDA CLASN     GET THE CLASS NUMBER. 
      SZA,RSS       IF CLASS NEVER ASSIGNED,
      JMP CLNUP,I     RETURN NOW. 
* 
      IOR SIGN      INCLUDE THE NO-WAIT BIT(#15), 
      STA CLASN       AND SAVE FOR RELEASE. 
CREPT CCA           SET THE RELEASE RE-TRY SWITCH 
      STA CEXIT       TO =-1. 
* 
CLRTN JSB EXEC      GO TO RTE TO RELEASE CLASS NUMBER.
      DEF *+5 
      DEF CLS21     SPECIFY CLASS GET/NO ABORT
      DEF CLASN     SPECIFY MASTER CLASS/RELEASE/NO WAIT. 
      DEF ZERO      DUMMY BUFFER ADDRESS. 
      DEF ZERO      DUMMY BUFFER LENGTH.
      RSS           IGNORE ERRORS.
* 
      ISZ CEXIT     RELEASE PROCESSING COMPLETED? 
      JMP CLRES       YES. GO TO CLEAR THE 'RES' ENTRY. 
      CPA M1          NO. ARE ALL PENDING REQUESTS CLEARED? 
      RSS                YES. SKIP TO DE-ALLOCATE THE CLASS.
      JMP CREPT          NO. CONTINUE TO CLEAR REQUESTS.
* 
      LDA CLASN     GET THE CLASS NUMBER AGAIN. 
      AND CLMSK     EXCLUDE THE NO-DE-ALLOCATION BIT(#13).
      STA CLASN     RESTORE THE MODIFIED CLASS WORD.
      JMP CLRTN     RETURN FOR FINAL DE-ALLOCATION. 
* 
CLRES LDA CLASN     GET THE CLASS WORD. 
      XOR SIGN      REMOVE THE NO-WAIT BIT(#15).
      STA CLASN     SAVE VIRGIN CLASS NO. FOR LIST SEARCH.
* 
      JSB #RSAX     GO TO 'RES' ACCESS ROUTINE. 
      DEF *+5 
      DEF P3        CLEAR A LIST ENTRY. 
      DEF P1        SPECIFY MASTER LIST.
      DEF CLASN     SEARCH, USING CLASS NUMBER. 
      DEF ZERO      DUMMY PARAMETER.
      JMP CLNUP,I   RETURN. 
* 
      SKP 
*  ERROR PROCESSING SECTION.
      SPC 1 
DOWN  LDB "00"      SYSTEM IS SHUT-DOWN: "DS00".
      JMP GETDS 
RPLER LDB "03"      ILLEGAL REPLY/REC.SIZE: "DS03". 
      JMP GETDS 
LUERR LDB "04"      ILLEGAL LU OR NO CLCT ENTRY: "DS04".
      JMP GETDS 
MTOER LDB "05"      MASTER REQUEST TIMEOUT: "DS05". 
      JMP GETDS 
ILRQ  LDB "06"      ILLEGAL REQUEST: "DS06".
      JMP GETDS 
RESER LDB "07"      'RES' LIST-ACCESS ERROR: "DS07".
      JMP GETDS 
BZYER LDB "08"      BUSY-REJECT FROM THE REMOTE: "DS08".
* 
GETDS LDA "DS"      GET FIRST HALF OF ERROR MESSAGE "DS". 
* 
PASER DST MSGBF     SAVE TOTAL ERROR MESSAGE. 
* 
      JSB CLNUP     GO TO CLEAN UP BEFORE EXITING.
* 
      LDB MSGAD     <B> POINTS TO ERROR MESSAGE ADDRESS.
      LDA FLAGS     GET ERROR-RETURN FLAG.
      ELA           POSITION TO <E> FOR TESTING.
      LDA ERRA      GET THE ERROR-REPORT ADDRESS. 
      SEZ,RSS       ABORT OR RETURN TO CALLER?
      JSB D65AB       ABORT! -- NO RETURN.
      DLD MSGBF       GET ERROR CODES AND RETURN TO 
      JMP D65MS,I       THE CALLER AT ERROR-RETURN POINT. 
      SPC 1 
*  IF REQUESTED, WRITE PARMB'S TO THE LOGGER'S CLASS NO.
      SPC 1 
PLOG  NOP           ENTRY/EXIT: PARMB LOGGING ROUTINE.
      LDA #PLOG     GET REQUEST FLAG FROM <RES>.
      SZA,RSS       IS THERE A REQUEST TO LOG PARMB'S?
      JMP PEXIT       NO. COMPLETE MASTER PROCESSING. 
* 
      STA PCLAS       YES. SAVE THE LOGGER'S CLASS LOCALLY. 
* 
      JSB EXEC      WRITE 
      DEF *+8        THE
      DEF CLS20       PARMB (PARAMETER BUFFER)
      DEF ZERO         TO THE 
      DEF RQBUF,I       PARMB LOGGER'S
      DEF RQLEN,I        CLASS NUMBER.
      DEF XEQT      SUPPLY THE I.D. SEGMENT ADDRESS 
      DEF "MS"       AND ASCII "MS" SOURCE IDENTIFIER 
      DEF PCLAS       AS OPTIONAL PARAMETERS. 
      NOP           ** IGNORE ERRORS FOR THIS OPERATION **
* 
PEXIT DLD REG       RESTORE THE REGISTERS.
      JMP PLOG,I    RETURN TO COMPLETE MASTER PROCESSING. 
* 
PCLAS NOP           LOCAL STORAGE FOR LOGGER'S CLASS NO.
* 
      SKP 
*  CONSTANTS AND STORAGE. 
      SPC 1 
B     EQU 1 
B77   OCT 77
B1000 OCT 1000
B3000 OCT 3000
BIT11 OCT 4000
BIT13 OCT 20000 
CEXIT NOP           CLASS-RELEASE SWITCH STORAGE. 
CLASN NOP           CLASS NUMBER STORAGE. 
CLMSK OCT 117777    CLASS NUMBER MASK.
CLS19 OCT 100023    CLASS CONTROL--NO ABORT.
CLS20 OCT 100024    CLASS WRITE/READ--NO ABORT. 
CLS21 OCT 100025    CLASS GET--NO ABORT.
DM9   DEC -9
EQMSK OCT 37400     EQT5 EQUIPMENT TYPE-CODE MASK.
FLAGS NOP           ER.RTN(#15=1),NWAIT(#1=1),BLIND(#0=1) 
ERRA  NOP           ERROR-REPORT ADDRESS. 
EXTAD NOP           EQT-EXTENSION ADDRESS.
LCGW  OCT 40006     GLOBAL RN LOCK/CLEAR/WAIT/NO-ABORT. 
LGW   OCT 40002     GLOBAL RN LOCK/WAIT/NO ABORT. 
M1    OCT -1
M35   DEC -35 
MBUF  OCT 0,0,0     MRCT ENTRY BUFFER.
MSGAD DEF *+1       ADDRESS OF ERROR MESSAGE BUFFER.
MSGBF ASC 2,DS00    ERROR MESSAGE BUFFER. 
P1    DEC 1 
P2    DEC 2 
P3    DEC 3 
P8    DEC 8 
P12   DEC 12
P32   DEC 32
P33   DEC 33
REG   OCT 0,0       DVR65 RETURN REGISTER INFORMATION.
RPMSK OCT 60000     BUSY REPLY MASK.
SCODE NOP           DEVICE SELECT CODE STORAGE. 
SIGN  OCT 100000
TAG   OCT 0,0       TIME TAG STORAGE FOR REPLY VALIDATION.
TEMP  NOP           TEMPORARY STORAGE.
TYP65 OCT 32400     EQUIPMENT TYPE-CODE 65, FOR DVR65.
XEQT  EQU 1717B     USER'S I.D. SEGMENT ADDRESS.
ZERO  OCT 0 
"00"  ASC 1,00
"03"  ASC 1,03
"04"  ASC 1,04
"05"  ASC 1,05
"06"  ASC 1,06
"07"  ASC 1,07
"08"  ASC 1,08
"DS"  ASC 1,DS
"IL"  ASC 1,IL
"MS"  ASC 1,MS
      SPC 1 
      END 
                                                                                                      