ASMB,L,R,C
      HED QUEX: HP 3000 COMMUNICATIONS MONITOR * (C) HEWLETT-PACKARD CO.
      NAM QUEX,19,4 91741-16003 REV 2013 800109 
      SPC 1 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS      *
*  * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF THE HEWLETT-PACKARD COMPANY.   *
******************************************************************
      SPC 2 
* Z OPTION INCLUDES DEBUG.
* 
      EXT EXEC,D$EQT,#LU3K,D$LID,#LDEF,SLC,#TST 
      EXT #QXCL,#RQCV,D$XS5 
      EXT #RSAX,PGMAD,$OPSY,#CL3K,$TIME 
      EXT $LIBR,$LIBX 
      SPC 1 
****************************** QUEX ******************************
*                                                                *
*      SOURCE: 91741-18003                                       *
*                                                                *
*      BINARY: 91741-16003                                       *
*                                                                *
*      JIM HARTSELL                                              *
*                                                                *
*      AUGUST 25, 1975                                           *
*                                                                *
******************************************************************
*                                                                *
*      MODIFIED BY DAVE TRIBBY BEGINNING SEPT. 18, 1978          *
*                                                                *
******************************************************************
      SPC 1 
L     EQU 304       MAXIMUM LINE BUFFER SIZE. 
* 
* QUEX PERFORMS COMMUNICATION WITH A REMOTE HP3000 COMPUTER.
* ALL MASTER REQUESTORS AND SLAVE MONITORS WISHING TO TRANSMIT
* TO AN HP3000 DO SO BY WRITING THEIR BUFFERS TO THE
* QUEX I/O CLASS. QUEX HANGS ON A CLASS GET CALL
* AND THEN  BLOCKS AS MANY REQUESTS/REPLIES AS WILL FIT INTO THE
* SEND BUFFER.  A "WRITE CONVERSATIONAL" CALL TO THE SYNCHRONOUS
* LINE CONTROL PACKAGE (SLC) TRANSMITS THE SEND BUFFER AND
* RETURNS A RECEIVE BUFFER.  QUEX THEN DE-BLOCKS THE RECEIVE
* BUFFER AND DISPATCHES THE REQUESTS/REPLIES TO THE PROPER MONITORS 
* OR MASTER REQUESTORS VIA CLASS WRITES.  THE RECEIVE BUFFER
* MAY BE EMPTY. 
      SKP 
      SUP 
A     EQU 0 
B     EQU 1 
      SPC 2 
QUEX  LDA $OPSY     CHECK FOR OPERATING 
      RAR,SLA        SYSTEM TYPE. 
RSS   RSS           IF MAPPED SYSTEM, 
      JMP INITL 
      LDA RSS         CONFIGURE CROSS-MAP 
      STA MODI2        LOAD 
      STA MODI1         AND STORE.
      SPC 1 
      SPC 1 
* 
* FIRST ENTRY INTO QUEX (SCHEDULED BY LSTEN OR UPLIN):
* INITIALIZE THE HP3000 COMMUNICATION LINK. 
* 
INITL LDA #QXCL     SAVE QUEX CLASS NUMBER. 
      ELA,CLE,ERA   CLEAR "DISCONNECT" BIT. 
      STA QXCLS 
      IOR B140K     ADD NO-WAIT & BUFFER-SAVE BITS. 
      STA QCLAS 
* 
      LDA N16       INITIALIZE DELAY
      STA DCONT      COUNT TO 16 (SPECIAL). 
* 
      JSB CLNUP     CLEAN OUT PREVIOUS ACTIVITY.
* 
      LDA D$XS5     SET FLAG WHETHER
      RAR            HARD-WIRED OR
      AND D1          MODEM LINK. 
      STA LINK      0 = HSI, 1 = MODEM. 
* 
*  SET UP START AND END OF DRIVER TRACE TABLE.
* 
      LDA @D$EQ     GET EXTENSION ADDR. 
      RSS           MAKE
INDR  LDA A,I        SURE 
      RAL,CLE,SLA,ERA IT'S
      JMP INDR         DIRECT.
      STA @D$EQ 
      ADA D$EQT     ADD LENGTH. 
      LDB D$XS5+1   SUBTRACT # WORDS
      CMB,INB        IN CHARACTER 
      ADA B           TABLE.
      STA EOTBL     LAST ADDRESS IN EVENT TABLE.
* 
      LDA @D$EQ     GET ADDRESS 
      ADA D76        OF TRACE TABLE.
      STA SOTBL     FIRST ADDRESS IN EVENT TABLE. 
* 
      LDA CNTRL     CONFIGURE THE CONTROL WORDS.
      STA TEMP
CLOOP LDA TEMP,I    GET NEXT. 
      SZA,RSS       DONE IF ZERO. 
      JMP INIT
      AND B1777     CLEAR LOW 6 BITS. 
      IOR #LU3K     INSERT LU OF 3000.
      STA TEMP,I    STORE BACK. 
      ISZ TEMP
      JMP CLOOP     LOOP TILL DONE. 
      SPC 3 
* 
*  ENTER HERE AFTER LINE CLOSE. 
* 
INIT  CLA,INA 
      STA ENQFL     SET "NEED ENQ" FLAG.
* 
      LDA #CL3K     GET LOGGING LU. 
      SZA           IF NOT SPECIFIED, 
      SSA            OR BAD,
      JMP CLRQ         GO CLEAR.
      LDA #CL3K+1   IF DRIVER 
      AND BIT13      TRACE WAS
      SZA,RSS         NOT SPECIFIED,
      JMP CLRQ          GO CLEAR. 
* 
      LDA N2        SET TRACE 
      STA TRBUF      TO -2. 
      LDA @STAT     STATISTICS' ADDRESS (SOURCE). 
      LDB @TRBF     SET TRACE POINTER 
      STB TPNTR      FOR OUTPUT.
      INB           POINT TO SECOND WORD FOR MOVE.
      MVW D11       MOVE 11 WORDS.
      LDA D12       TRACE BUFFER
      STA TRLEN      LENGTH IS 12.
      JSB TRCOT     WRITE TRACE ENTRY.
* 
CLRQ  JSB EXEC      ISSUE CLEAR REQUEST.
      DEF *+6 
      DEF D2
      DEF #LU3K 
      DEF D0
      DEF D3
      DEF CLRWD 
* 
      JSB SLC       INITIALIZE SLC. 
      DEF *+3 
      DEF #LU3K     LU OF THE 3000. 
@D$EQ DEF D$EQT     EQT EXTENSION ADDRESS.
* 
      SZA,RSS 
      JMP LNOPN 
* 
      LDA @D0       INITIALIZATION ERROR. 
      STA SLCER 
      LDB @EM18 
      JMP ABT       SPECIAL "SLCER" ENTRY.
@D0   DEF D0
* 
LNOPN LDA D$XS5+15  INITIALIZE
      STA OLENT      TRACE POINTER. 
* 
      JSB EXEC      SCHEDULE QUEZ WITH WAIT TO
      DEF *+4        PERFORM LINE OPEN REQUEST. 
      DEF D9         (THIS KEEPS QUEX FROM LOCKING UP 
      DEF QUEZ        PARTITION WHILE IN I/O SUSPEND.)
      DEF D1         SCHEDULE PARAM FOR QUEZ. 
* 
      JSB SLCER     CHECK FOR ERRORS. 
D1    DEC 1 
* 
      LDA LINK      MODEM LINK? 
      SZA,RSS 
      JMP CERP      NO. 
* 
      JSB EXEC      YES. DISPLAY
      DEF *+5        ">> HP 3000: READY FOR DIALING"
      DEF D2
      DEF D1
      DEF DIALM 
      DEF D15 
* 
      LDA D$LID     ADDR OF LOCAL ID IN "RES".
      LDB Q$LID     ADDR OF LOCAL ID AREA IN QUEX.
      MVW D19       MOVE LOCAL & REMOTE ID STORED IN "RES"
* 
      LDA LOCID     GET BYTE LENGTH OF LOCAL ID.
      SZA,RSS 
      JMP RDISQ     ZERO. NO LOCAL ID.
* 
      JSB EXEC      ESTABLISH LOCAL ID SEQUENCE.
      DEF *+6 
      DEF D2
      DEF #LU3K 
      DEF D1
      DEF LOCID 
      DEF LIDSQ 
* 
      JSB SLCER     CHECK FOR ERRORS. 
D0    DEC 0 
* 
RDISQ LDA REMID     GET BYTE LENGTH OF REMOTE ID. 
      SZA,RSS 
      JMP CERP      ZERO. NO REMOTE ID. 
* 
      JSB EXEC      ESTABLISH REMOTE ID SEQUENCE. 
      DEF *+6 
      DEF D2
      DEF #LU3K 
      DEF D1
      DEF RCVID 
      DEF RIDSQ 
* 
      JSB SLCER     CHECK FOR ERRORS. 
      DEC 0 
* 
* 
CERP  JSB EXEC      CHANGE ERROR RECOVERY PARAMETERS. 
      DEF *+6 
      DEF D2
      DEF #LU3K 
      DEF D20       # RETRIES = 20. 
      DEF D7        LONG TIMEOUT = 21 SEC.
      DEF ERCWD 
* 
      JSB SLCER     CHECK FOR ERRORS. 
      DEC 0 
* 
* SEND INITIALIZATION REQUEST.
* 
      LDA XLEN      STORE MAX. SIZE,
      CLB 
      DIV D16        (MODULO 16)
      ADA N1
      STA B 
      ALF,ALF 
      IOR B          AND CURRENT SIZE.
      STA STRTM+4 
* 
      LDA STRTM     ADDR OF INIT. REQUEST.
TOBUF LDB WRADR     ADDR OF SEND BUFFER.
      STB BPNTR 
      MVW D8        MOVE INIT. REQUEST TO "SEND"
* 
      LDA D8        SET BLOCK LENGTH
      STA LOG        TO EIGHT.
      CLA           GO TO VERIF IN CASE 
      JSB VERIF      TRACE WAS SPECIFIED. 
      NOP           IGNORE ERROR. **SHOULDN'T HAPPEN**
* 
      LDA WRADR     SET BUFFER POINTER
      ADA D8         TO END OF MESSAGE. 
      STA BPNTR 
      LDA N16       SET WRITE LENGTH TO 16 BYTES. 
      STA WRLEN 
* 
      JMP REMIO     GO SEND INIT. REQUEST.
      SPC 1 
@STAT DEF D$XS5+2   ADDRESS OF LONG TERM STATS. 
      SKP 
* 
* WAIT FOR THE 3000 TO SEND SOMETHING BY SCHEDULING "QUEZ". 
* WAIT FOR SOMETHING TO SEND TO THE HP 3000 BY HANGING ON 
* A CLASS I/O GET WITH WAIT TO QUEX'S I/O CLASS.
* BLOCK AS MANY REQUESTS/REPLIES FROM QUEX'S I/O CLASS
* BUFFER AS WILL FIT IN THE TRANSMIT BUFFER.
* 
WATCH JSB OFFQZ     MAKE SURE QUEZ IS DORMANT.
      JSB EXEC      SCHEDULE QUEZ TO LOOK FOR 
      DEF *+4        SLAVE REQUESTS FROM THE 3000.
      DEF D10 
      DEF QUEZ
      DEF D0        SET SCHEDULE OPTION CODE. 
* 
NEWGT CLA           INITIALIZE LENGTH (BYTES) 
      STA WRLEN      OF TRANSMIT BUFFER.
      LDA WRADR     INITIALIZE BUFFER POINTER TO
      STA BPNTR      START OF SEND AREA.
* 
GET   JSB EXEC      CLASS I/O GET TO LOOK FOR 
      DEF *+6        MASTER REQUESTS FROM RTE USERS.
      DEF CLS21     NO ABORT. 
      DEF QXCLS     QUEX I/O CLASS. 
BPNTR NOP 
      DEF MXLEN     BUFFER LENGTH.
      DEF LOG       RETURNED BLOCK LENGTH (WORDS).
      NOP           IGNORE ERROR RETURN.
* 
* THE CLASS GET HAS COMPLETED.  IF RECEIVED DATA LENGTH IS ZERO,
* THE 3000 WANTS TO SEND A SLAVE REQUEST OR A MASTER REPLY. 
* IF NON-ZERO, THE RTE IS SENDING A MASTER REQUEST OR SLAVE REPLY.
* 
      LDA LOG       IS QUEZ TELLING US THE 3000 IS SENDING? 
      SZA 
      JMP BLKIN     NO. ACCUMULATE OUTGOING REQUESTS. 
* 
      LDA IGNOR     YES. ARE WE TO IGNORE THIS ONE? 
      SZA,RSS 
      JMP RINTL     NO. NEED TO SERVICE THE 3000. 
      CLA           YES. GO BACK TO THE GET.
      STA IGNOR 
      JMP NULGT 
      SPC 1 
* A BLOCK HAS BEEN ADDED TO THE TRANSMIT BUFFER.
* ADVANCE BUFFER POINTER AND COUNTER. 
* 
BLKIN LDA SGNOF     INIT. REQ. EXCHANGED YET? 
      SZA 
      JMP NULGT     NO. IGNORE. **SHOULDN'T HAPPEN**
ADDBU CLA           MESSAGE IS FROM 1000. 
      JSB VERIF     CHECK VALIDITY. 
      JMP NULGT     INVALID: IGNORE.
* 
      LDA BUFL      ADD LEN OF BLOCK IN NEG BYTES 
      CLE,ELA       TO TOTAL XMIT BYTE LEN (NEG)
      CMA,INA       THAT HAVE BEEN ACCUMULATED. 
      ADA WRLEN 
      STA WRLEN 
* 
      LDA BPNTR     ADVANCE BUFFER POINTER. 
      ADA BUFL
      STA BPNTR 
* 
      LDA BUFL      SUBTRACT THE LENGTH 
      CMA,INA        OF PROCESSED BUFFERS 
      ADA LOG         FROM BLOCK LENGTH.
      STA LOG       SAVE REMAINING LENGTH.
      SZA           IF ANOTHER BUFFER,
      JMP ADDBU      GO ADD IT. 
* 
* ISSUE A NULL  GET CALL TO QUEX'S I/O CLASS TO SEE 
* IF THERE IS ANOTHER PENDING REQUEST AND TO SEE WHETHER
* THERE IS ROOM IN THE TRANSMIT BUFFER. ISSUE THE GET 
* WITHOUT WAIT, SAVE CLASS BUFFER, AND BUF LEN = 0. 
* 
NULGT JSB EXEC      CLASS GET (DUMMY).
      DEF *+6 
      DEF CLS21     NO ABORT. 
      DEF QCLAS     QUEX I/O CLASS. 
      DEF D0        DUMMY BUFFER. 
      DEF D0        ZERO LENGTH BUFFER. 
      DEF LOG       RETURNED BLOCK LENGTH (WORDS).
      NOP           IGNORE ERROR RETURN.
* 
      SSA           WAS THERE ANYTHING THERE? 
      JMP REMIO     NO. GO SEND WHAT WE HAVE. 
* 
* A REQUEST IS IN THE CLASS BUFFER. SEE IF THERE
* IS ROOM TO BLOCK IT INTO THE TRANSMIT BUFFER. 
* 
      LDA BPNTR 
      CMA,INA 
      ADA RDADR     # WORDS LEFT IN XMIT BUFR.
      INA 
      CMA,INA       NEGATE. 
      ADA LOG       ADD LENGTH OF BLOCK (WORDS).
      SSA 
      JMP GET       FITS. GO READ IT IN.
* 
* IF THERE WAS NO ROOM FOR THE LAST BLOCK, IT IS STILL IN 
* THE CLASS BUFFER AND WILL BE PICKED UP NEXT TIME AROUND.
* 
* SEND THE BLOCKS TO THE HP3000 AND WAIT FOR INCOMING BLOCKS. 
* 
REMIO LDA ENQFL     DO WE NEED TO DO A
      SZA,RSS        "WRITE INQUIRY"? 
      JMP WRCON     NO. 
* 
      JSB EXEC      ISSUE WRITE INQUIRY.
      DEF *+6 
      DEF D2
      DEF #LU3K 
      DEF D1
      DEF D0
      DEF WNQWD 
* 
      JSB SLCER     CHECK FOR ERRORS. 
D2    DEC 2 
* 
      LDB @D2 
      CPA D5        EOT RECEIVED? 
      JMP EOTER      YES. **PROTOCOL FAILURE**
* 
      CLA 
      STA ENQFL     CLEAR ENQ FLAG. 
* 
      CPA D13       BACK OFF TO READ INITIAL IF 
      JMP RINTL      ENQ RECEIVED (ONLY IF RTE SECONDARY).
      SPC 3 
* 
*   PERFORM WRITE CONVERSATIONAL TO HP 3000.
* 
WRCON JSB EXEC      WRITE CONVERSATIONAL. 
      DEF *+6 
      DEF D2
      DEF #LU3K 
      DEF WRLEN     LEN/SEND BUFFER/RECEIVE BUFFER. 
      DEF BFLEN     LEN OF RECEIVE BUFFER (-BYTES). 
      DEF CONWD     CONTROL WORD. 
* 
      CPB D2        TREAT 2 BYTES AS ZERO.
      CLB 
      STB RDLEN     SAVE POSITIVE # BYTES.
* 
      JSB SLCER     CHECK FOR SLC ERROR.
D3    DEC 3 
* 
      LDB WRLEN     SAVE WRITE LENGTH 
      STB OWLEN      FOR 0-LEN CHECK. 
      CLB           INDICATE DATA IN WRITE
      STB WRLEN      BUFFER HAS BEEN SENT.
* 
      CPA D5        CHECK FOR 
      JMP EOT        EOT RECEIVED.
      SPC 3 
*  REQUESTS AND/OR REPLIES HAVE BEEN RECEIVED FROM THE HP 3000. 
*  FOR REQUESTS, DO A CLASS WRITE TO THE REQUEST CONVERTER (RQCNV). 
*  FOR REPLIES, SEARCH THE MASTER LIST (VIA SEQUENCE #) AND DO A CLASS
*  WRITE TO THE CORRESPONDING MASTER CLASS NUMBER.
* 
STLEN LDA RDLEN     SET # OF
      CLE,INA        WORDS READ.
      ERA 
      STA LOG 
      SPC 2 
* 
* GET TO THE NEXT BLOCK IN READ BUFFER. 
* 
DISP  SZA,RSS       IS THERE ANOTHER BLOCK? 
      JMP DONE      NO. SERVICING COMPLETE. 
* 
      ADA N7        IGNORE IF LESS THAN 8 WORDS.
      SSA 
      JMP DONE      IGNORE REST OF BLOCK. **SHOULDN'T HAPPEN**
* 
* DETERMINE WHETHER MESSAGE IS A REQUEST FROM THE 3000
* OR A REPLY TO AN RTE MASTER'S REQUEST.
* 
      CLA,INA       CHECK VALIDITY AND SET UP <STMWD>,
      JSB VERIF      <STREM>, <CLASS>, AND <BUFL>.
      JMP DONE      INVALID REQUEST. IGNORE REST OF BLOCK.
* 
      LDA STMWD     ISOLATE REPLY AND 
      AND B140K      REJECT BITS. 
* 
      CPA B140K     IF BOTH SET, 3000 IS REJECTING
      JMP NEXT       AN RTE REPLY. IGNORE.
* 
      SZA           IF EITHER IS SET, 
      JMP REPLY      IT'S A REPLY TO AN RTE MASTER. 
      SPC 3 
* 
* A REQUEST HAS ARRIVED FROM THE 3000.
* 
      LDA CLASS     IF MESSAGE CLASS
      SZA,RSS        IS ZERO, 
      JMP MZERO        GO TO SPECIAL HANDLER. 
      LDB SGNOF     INIT. REQ. EXCHANGED YET? 
      SZB 
      JMP REJCT     NO. REJECT. 
* 
      CPA D5        CLASS 5? ($STDIN/$STDLIST)
      JMP $SCHK     YES--MAY BE FOR MASTER. 
* 
RQCNV LDA #RQCV     SET 
      IOR BIT15      NO-WAIT
      STA CLASN       BIT.
* 
      JSB EXEC      WRITE REQUEST TO RQCNV'S CLASS. 
      DEF *+8 
      DEF CLS20 
      DEF D0
      DEF BPNTR,I 
      DEF BUFL
      DEF D0
      DEF D0
      DEF CLASN     CLASS NUMBER OF RQCNV.
      JMP REJCT     ERROR RETURN. 
      SZA           IF NO SAM,
      JMP REJCT      TRY TO REJECT. 
* 
      JMP NEXT      GO DISPATCH NEXT BLOCK. 
      SPC 3 
* 
*  THE MESSAGE IS A DS/3000 REPLY TO AN RTE MASTER REQUEST. 
*   CHECK FOR SPECIAL CLASSES: 0, 5, AND 6. 
* 
REPLY LDA CLASS     MESSAGE CLASS 0?
      SZA,RSS 
      JMP REPL0        YES--GO TO SPECIAL HANDLER.
* 
      IFN           **********************************************
      CPA D5        MESSAGE CLASS 5?
      JMP LUMAP        YES--PASS TO LU MAPPING MONITOR. 
      XIF           ********************************************* 
* 
      CPA D6        MESSAGE CLASS 6?
      JMP LBYE?        YES--CHECK FOR LAST BYE. 
* 
*  SEARCH FOR MASTER TCB. 
* 
SRCHM LDB BPNTR     GET 
      ADB D5         SEQUENCE 
      LDA B,I         NUMBER. 
      STA TEMP
      JSB #RSAX     CALL
      DEF *+3        #RSAX
      DEF D4          FOR 
      DEF TEMP         SEARCH.
      SSB           FOUND?
      JMP REJCT       NO--REJECT. 
      SPC 2 
      IOR BIT15     SET NO-WAIT BIT 
      STA CLASN     SAVE I/O CLASS #. 
* 
      JSB EXEC      CLASS 
      DEF *+8        WRITE
      DEF CLS20       TO
      DEF D0           CLASN. 
      DEF BPNTR,I 
      DEF BUFL
      DEF BUFL
      DEF D0
      DEF CLASN 
      JMP NEXT      ERROR--IGNORE.
      SZA           IF NO SAM,
      JMP NOSAM      PRINT ERROR MESSAGE. 
      SPC 2 
* 
*   END OF PROCESSING FOR THIS BLOCK. 
* 
NEXT  LDA BPNTR     BLOCK PROCESSED:
      ADA BUFL      UPDATE POINTER INTO 
      STA BPNTR      RECEIVE BUFFER.
* 
      LDA BUFL      CALCULATE NUMBER
      CMA,INA        OF WORDS REMAINING 
      ADA LOG         IN READ BUFFER. 
      STA LOG 
* 
      JMP DISP      GO CHECK FOR ANOTHER BLOCK. 
      SPC 2 
* 
* ALL RECEIVED BLOCKS HAVE BEEN DISPATCHED. 
* 
DONE  LDA WRLEN     RESET 
      CMA,INA        BUFFER 
      CLE,ERA         POINTER.
      ADA WRADR 
      STA BPNTR 
* 
      LDA WRLEN     ANY DATA IN WRITE BUFFER? 
      SZA            (ACCUMULATION INTERRUPTED BY ENQ.) 
      JMP NULGT        YES--CONTINUE ACCUMULATION.
* 
      JSB EXEC      "NULL" CLASS GET. (BUFFERS MAY HAVE BEEN
      DEF *+6       ADDED WHILE QUEX WAS I-O SUSPENDED).
      DEF CLS21 
      DEF QCLAS 
      DEF D0
      DEF D0
      DEF LOG 
      NOP            IGNORE ERROR RETURN. 
* 
      SSA           ANYTHING THERE? 
      JMP NOMOR     NO. 
* 
      LDA LOG       YES.
      SZA           ZERO LENGTH BUFFER? 
      JMP NEWGT     NO. 
*                   YES. QUEZ DID IT JUST BEFORE THE
      INA           WRITE CONVERSATIONAL. REQUEST HAS 
      STA IGNOR     ALREADY BEEN READ, SO IGNORE IT.
* 
NOMOR LDA DCNFL     ARE WE TO ATTEMPT DISCONNECT? 
      SZA,RSS 
      JMP CKDAT     NO. 
* 
      CLA           YES. SEND TERMINATION REQUEST.
      STA DCNFL 
      LDA TRMRQ     MOVE TERMINATION REQUEST TO 
      JMP TOBUF      CURRENT BUFFER LOCATION. 
* 
*  WE HAVE NOTHING TO SEND TO HP 3000. IF EMPTY MESSAGES HAVE 
*   BEEN EXCHANGED, GO TO WRITE RESET. OTHERWISE SEND EMPTY MESSAGE.
* 
CKDAT LDA OWLEN     IF OLD WRITE LENGTH 
      SZA,RSS        OR 
      LDA RDLEN       CURRENT READ LENGTH 
      SZA              IS NOT ZERO, 
      JMP WRCON          GO SEND EMPTY MESSAGE. 
* 
RESET JSB EXEC      PERFORM "WRITE RESET" (SEND EOT). 
      DEF *+6 
      DEF D2
      DEF #LU3K 
      DEF D0
      DEF D0
      DEF RESWD 
* 
      JSB SLCER     CHECK FOR ERRORS. 
D5    DEC 5 
* 
EOT   CLA,INA 
      STA ENQFL     SET "SEND ENQ" FLAG.
* 
      JMP WATCH 
      SPC 5 
* 
*  PRINT ERROR MESSAGE WHEN CLASS I/O FAILS BECAUSE OF NO SAM.
* 
NOSAM JSB EXEC
      DEF *+5 
      DEF SD2 
      DEF D1
      DEF SAMER 
      DEF D13 
      NOP 
      JMP NEXT
* 
SAMER ASC 13,/QUEX: INSUFFICIENT S.A.M. 
      SKP 
* 
* THE SEND BUFFER CONTAINS MASTER REQUESTS AND/OR SLAVE REPLIES,
* BUT BEFORE IT COULD BE SENT, THE 3000 HAS SENT A LINE BID.
* THE WRITE LENGTH INDICATES THE SEND BUFFER CONTAINS GOOD DATA.
* 
*  READ INITIAL--GET 3000'S BID FOR LINE. 
* 
RINTL JSB EXEC      ISSUE "READ INITIAL" CALL.
      DEF *+6 
      DEF D1
      DEF #LU3K 
      DEF BPNTR,I 
      DEF BFLEN 
      DEF RDIWD 
* 
      CPB D2        IF 2 BYTES WERE SENT, 
      CLB            IT'S AN EMPTY MESSAGE. 
      STB RDLEN     SAVE POSITIVE # BYTES.
* 
      JSB SLCER     CHECK FOR ERRORS. 
D4    DEC 4 
* 
      LDB @D4 
      CPA D5
      JMP EOTER     RECEIVED EOT. **PROTOCOL FAILURE**
* 
      LDB RDLEN     CHECK TRANSMISSION LOG. 
      SZB,RSS 
      JMP RESET     SEND EOT IF ZERO. 
* 
      CLA           CLEAR "NEED 
      STA ENQFL      ENQ" FLAG. 
* 
      JMP STLEN     DISPATCH BLOCKS FROM READ BUFFER. 
* 
      SPC 2 
* 
EOTER STB SLCER     EOT RECEIVED IN READ
      LDB @EM5       INITIAL OR WRITE INQUIRY.
      JMP ABT       SPECIAL "SLCER" ENTRY.
@D2   DEF D2
@D4   DEF D4
      SKP 
* 
*  CHECK WHETHER $STDLIST REQUEST SHOULD GO TO MASTER OR CNSLM. 
* 
$SCHK LDB BPNTR     GET "FROM PROCESS NUMBER."
      ADB D4
      LDA B,I 
      ALF,ALF 
      AND B377
      SZA,RSS       IF ZERO,
      JMP RQCNV      PASS TO RQCNV. 
      LDA B,I       GET "TO PROCESS NUMBER" 
      AND B377
      SZA,RSS       IF ZERO,
      JMP RQCNV      PASS TO RQCNV. 
      JMP SRCHM     BOTH NON-ZERO. PASS TO MASTER.
      SPC 3 
*  REQUEST RECEIVED ON CLASS 0. 
*     CLASS 0, STREAM 20: INITIALIZATION
*     CLASS 0, STREAM 21: TERMINATION 
* 
MZERO LDA STREM     STREAM =
      CPA B20        OCTAL 20?
      JMP REJCT     YES. REJECT INITIALIZATION. 
      CPA B21       STREAM =
      RSS            OCTAL 21?
      JMP REJCT     NO--UNKNOWN. REJECT. **SHOULDN'T HAPPEN** 
* 
*  HP 3000 REQUESTS TERMINATION ONLY WHEN IT THINKS NEITHER 
*  SIDE HAS ANYTHING GOING. MAKE SURE PNL IS EMPTY. 
* 
      CCB           GET ADDRESS OF
      ADB #LDEF      PNL HEADER ADDR. 
      LDB B,I       GET ADDR OF 
      JSB LODWD      PNL HEADER.
      SZA           IF ANYONE IS IN LIST, 
      JMP REJCT      REJECT. **SHOULDN'T HAPPEN** 
      JSB DCNCT     SET DISCONNECT STATUS 
      JMP CLOSE      AND GO CLOSE THE LINE. 
      SPC 1 
* 
*  REPLY RECEIVED ON CLASS 0. 
* 
REPL0 LDB STMWD     GET STREAM WORD 
      RBL            AND POSITION REJECT BIT. 
      LDA STREM     IF STREAM = 
      CPA B20        OCTAL 20,
      JMP INIRP        IT'S AN INITIALIZATION REPLY.
      CPA B21       IF STREAM NOT = 
      RSS            OCTAL 21,
      JMP REJCT        UNKNOWN. REJECT. **SHOULDN'T HAPPEN**
* 
*  HP 3000 IS REPLYING TO OUR TERMINATION REQUEST.
* 
      SSB           REJECT BIT SET? 
      JMP NEXT        YES--DON'T DISCONNECT.
      JMP CLOSE       NO--GO AHEAD AND CLOSE LINE.
* 
*  HP 3000 IS REPLYING TO OUR INITIALIZATION REQUEST. 
* 
INIRP SSB           REJECT BIT SET? 
      JMP INIT        YES--RETRY. 
      JSB CNNCT       NO--ESTABLISH CONNECT STATUS. 
      LDA D$XS5           SET MODE
      IOR D1               TO "PRIMARY."
      STA D$XS5 
* 
      LDA DCONT     IF DELAY COUNT
      CPA N50        IS 50, SKIP
      JMP NEXT        THE "UP" MESSAGE. 
* 
      DLD UP        3000 LINK IS "UP".
      DST STMSG+16
      LDA UP+2
      STA STMSG+18
* 
      JSB EXEC      DISPLAY STATUS
      DEF *+5        MESSAGE ON LU 1. 
      DEF D2
      DEF D1
      DEF STMSG 
      DEF D20 
* 
      LDA N50       SET DELAY COUNT 
      STA DCONT      TO 50 (LONG).
* 
      JMP NEXT            PROCESS NEXT BLOCK. 
      SPC 3 
* THE 3000 HAS FOUND NOTHING TO DO (NO HELLO OUTSTANDING AND
* NO SLAVE ACTIVITY) AND HAS DISCONNECTED THE LINE, OR AN 
* ABORTIVE COMMUNICATION ERROR HAS OCCURRED.  CLOSE THE 
* LINE AND RE-INITIALIZE THE DRIVER AND QUEX. 
* 
CLOSE JSB EXEC      WRITE DISCONNECT. 
      DEF *+6 
      DEF D2
      DEF #LU3K 
      DEF D0
      DEF D0
      DEF WRDIS 
* 
LNCLO JSB EXEC      CLOSE THE LINE. 
      DEF *+6 
      DEF D2
      DEF #LU3K 
      DEF D0
      DEF D3
      DEF LCLWD 
* 
      JSB DVRTC     PERFORM DRIVER TRACE. 
* 
      JSB OFFQZ     MAKE SURE QUEZ IS DORMANT.
* 
      LDA D$XS5     RESET TO "SECONDARY" MODE.
      AND N2
      STA D$XS5 
* 
      LDA LINK      IS THIS A MODEM LINK? 
      SZA,RSS 
      JMP INIT      NO. 
* 
      JSB EXEC      YES. DISPLAY
      DEF *+5        ">> HP 3000: DISCONNECT" 
      DEF D2
      DEF D1
      DEF SNOFF      (QUEX WILL HANG IN "LINE OPEN" 
      DEF D11         UNTIL EITHER END RE-DIALS.) 
* 
      JMP INIT      GO RE-INITIALIZE. 
      SPC 5 
* 
* SEND "REJECT" REPLY FOR ILLEGAL REQUESTS. 
* 
REJCT LDA STMWD     MAKE SURE 
      AND BIT14      WE AREN'T
      SZA             REJECTING 
      JMP NEXT         A REJECT!
      LDA BPNTR,I   APPENDAGE 
      AND B377       LENGTH 
      IOR LB8         IS 8. 
      STA BPNTR,I 
      LDA STMWD     SET REJECT BIT. 
      IOR BIT14 
      LDB BPNTR 
      ADB D2
      STA B,I 
      ADB D2        REVERSE PROCESS NUMBERS.
      LDA B,I 
      ALF,ALF 
      STA B,I 
      ADB D3        DATA LENGTH = 0.
      CLA 
      STA B,I 
* 
      LDA QXCLS 
      IOR BIT15     SET NO-WAIT BIT.
      STA CLASN     SAVE I/O CLASS #. 
* 
      JSB EXEC      CLASS 
      DEF *+8        WRITE
      DEF CLS20       TO
      DEF D0           QUEX.
      DEF BPNTR,I 
      DEF D8
      DEF D8
      DEF D0
      DEF CLASN 
      JMP NEXT      ERROR--IGNORE.
      SZA           IF NO SAM,
      JMP NOSAM      PRINT ERROR MESSAGE. 
      JMP NEXT
* 
LB8   BYT 10,0      LEFT BYTE DECIMAL 8.
      SPC 3 
* 
* ESTABLISH "DISCONNECT" STATUS (CHECKED BY UPLIN AND D3KMS). 
* 
DCNCT NOP 
      CLA,INA       SET SIGN OFF FLAG.
      STA SGNOF 
      LDA #QXCL     SET DISCONNECT FLAG IN #QXCL
      IOR BIT15      TO INDICATE DISCONNECT STATUS. 
      STA #QXCL 
      JMP DCNCT,I   RETURN. 
* 
* ESTABLISH "CONNECT" STATUS. 
* 
CNNCT NOP 
      CLA           CLEAR SIGN OFF FLAG.
      STA SGNOF 
      LDA #QXCL     CLEAR DISCONNECT FLAG IN #QXCL
      ELA,CLE,ERA    TO INDICATE CONNECT STATUS.
      STA #QXCL 
      JMP CNNCT,I   RETURN. 
      SPC 3 
* 
*  CLASS 6 REPLY RECEIVED. IS IT LAST BYE?
* 
LBYE? LDA STREM     IF NOT
      CPA B21        STREAM 21, 
      RSS             IT'S NOT
      JMP SRCHM        A BYE. 
* 
      CCB           GET ADDR OF PNL HEADER ADDR.
      ADB #LDEF 
      LDB B,I       GET ADDR OF PNL HEADER
      JSB LODWD     GET ADDR OF FIRST PNL ENTRY.
      SZA,RSS 
      JMP STDIS     IF ZERO, SET DISCONNECT FLAG. 
      LDB A         PICK UP LINK. 
                                                                                                                                                            