ASMB,Q,C
      HED QUEX: HP 3000 HSI COMM. MONITOR * (C) HEWLETT-PACKARD CO. 
      NAM QUEX,19,4 91750-16154 REV.2013 800423 MEF: 3000 HSI LINK
      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,XLUEX,RNRQ,$OPSY,$TIME,$LIBR,$LIBX,.MVW
      EXT #LU3K,#LDEF,#QXCL,#RQCV,#RSAX,#CL3K,#CLRN 
      EXT DTACH,D$XS5,D$EQT 
      EXT D$MXR,D$BSZ,D$WAD,D$RAD,D$WLN 
      SPC 1 
      UNL 
*  NAME: QUEX 
*SOURCE: 91750-18154
* RELOC: 91750-16154
*  PGMR: DMT
      LST 
************************** QUEX FOR HSI **************************
*                                                                *
*      SOURCE: 91750-18154                                       *
*                                                                *
*      BINARY: 91750-16154                                       *
*                                                                *
*      JIM HARTSELL                                              *
*                                                                *
*      AUGUST 25, 1975                                           *
*                                                                *
******************************************************************
*                                                                *
*      MODIFIED BY DAVE TRIBBY BEGINNING SEPT. 18, 1978          *
*      FOR DS ENHANCEMENTS AND SESSION COMPATIBILITY             *
*                                                                *
******************************************************************
      SPC 1 
* 
* 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.
* 
INITL JSB DTACH     DETACH FROM POSSIBLE SESSION. 
      DEF *+1 
* 
      JSB DCNCT     ESTABLISH "DISCONNECT" STATUS 
* 
      LDA D$XS5     CHECK FOR 
      AND D2         MODEM LINK.
      SZA           0 = HSI, 2 = MODEM. 
      JMP WRDVR     ERROR--MODEM. 
* 
*  SET BUFFER SIZE WORD IN SSGA TO BE THE QUEX BUFFER SIZE. 
* 
      LDA D$MXR     GET BUFFER SIZE (WORDS) 
      STA D$BSZ      AND STORE IN SSGA. 
      CLE,ELA       CONVERT TO BYTES, 
      CMA,INA        MAKE NEGATIVE, 
      STA BYTLN       AND SAVE FOR READ CALL. 
      SPC 1 
* 
* FIRST ENTRY INTO QUEX (SCHEDULED BY UPLIN): 
* INITIALIZE THE HP3000 COMMUNICATION LINK. 
* 
      LDA #QXCL     SAVE QUEX CLASS NUMBER. 
      ELA,CLE,ERA   CLEAR "DISCONNECT" BIT
      STA QXCLS      FOR LOCAL STORAGE. 
      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.
* 
*  SET UP START AND END OF DRIVER TRACE TABLE.
* 
      LDA D$EQT 
      INA           SET EOTBL TO ONE PAST THE 
      STA EOTBL      LAST ADDRESS IN EVENT TABLE. 
* 
      LDA @TRFW     GET FIRST WORD IN TRACE.
      RSS           MAKE
INDR  LDA A,I        SURE 
      RAL,CLE,SLA,ERA IT'S
      JMP INDR         DIRECT.
      STA @TRFW 
      STA SOTBL     FIRST ADDRESS IN EVENT TABLE. 
* 
      LDA #LU3K     STORE 3000 LU IN
      IOR BIT15      2-WORD XLUEX ARRAY.
      STA LU3K
      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.
      JSB .MVW      MOVE 11 WORDS.
      DEF D11 
      NOP 
      LDA D12       TRACE BUFFER
      STA TRLEN      LENGTH IS 12.
      JSB TRCOT     WRITE TRACE ENTRY.
* 
CLRQ  JSB XLUEX     ISSUE CLEAR REQUEST.
      DEF *+6 
      DEF D2
      DEF LU3K
      DEF D0
      DEF D3
      DEF CLRWD 
* 
      JSB XLUEX     INITIALIZE DVG67. 
      DEF *+6 
      DEF D2
      DEF LU3K
      DEF D$EQT 
      DEF D3
      DEF INLWD 
* 
      LDA D$XS5+13  INITIALIZE
      STA OLENT      TRACE POINTER. 
* 
      JSB SLCER     CHECK FOR ERRORS. 
      DEC 0 
* 
      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 
* 
      JSB XLUEX     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. 
D0    DEC 0 
* 
* SEND INITIALIZATION REQUEST.
* 
      LDA D$MXR     STORE MAX. SIZE,
      CLB 
      DIV D16        (DIVIDED BY 16,
      ADA N1           MINUS 1) 
      STA B 
      ALF,ALF 
      IOR B          AND CURRENT SIZE.
      STA STRTM+4 
* 
      LDA STRTM     ADDR OF INIT. REQUEST.
TOBUF LDB D$WAD     ADDR OF SEND BUFFER.
      STB BPNTR 
      JSB .MVW      MOVE INIT. REQUEST TO "SEND"
      DEF D8
      NOP 
* 
      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 D$WAD     SET BUFFER POINTER
      ADA D8         TO END OF MESSAGE. 
      STA BPNTR 
      LDA N16       SET WRITE LENGTH TO 16 BYTES. 
      STA D$WLN 
* 
      JMP REMIO     GO SEND INIT. REQUEST.
      SPC 1 
@STAT DEF D$XS5+1   ADDRESS OF LONG TERM STATS. 
@TRFW DEF D$XS5+14  ADDRESS OF EVENT TRACE TABLE. 
      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 D$WLN      OF TRANSMIT BUFFER.
      LDA D$WAD     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 D$MXR     BUFFER LENGTH.
      DEF LOG       RETURNED BLOCK LENGTH (WORDS).
      JSB CLER      REPORT CLASS ERROR. 
* 
* 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 D$WLN 
      STA D$WLN 
* 
      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 D$RAD     # 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 XLUEX     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 XLUEX     WRITE CONVERSATIONAL. 
      DEF *+6 
      DEF D2
      DEF LU3K
      DEF D$WLN     LEN/SEND BUFFER/RECEIVE BUFFER. 
      DEF BYTLN     LEN OF RECEIVE BUFFER (-BYTES). 
      DEF CONWD     CONTROL WORD. 
* 
      STB RDLEN     SAVE READ LENGTH. 
      JSB SLCER     CHECK FOR SLC ERROR.
D3    DEC 3 
* 
      LDB RDLEN 
      CPB D2        TREAT 2 BYTES AS ZERO.
      CLB 
      STB RDLEN     SAVE POSITIVE # BYTES.
* 
      LDB D$WLN     SAVE WRITE LENGTH 
      CPB N2         FOR NULL MESSAGE 
      CLB             CHECK (EITHER 0 
      STB OWLEN        OR 2 BYTES). 
      CLB           INDICATE DATA IN WRITE
      STB D$WLN      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 1 
BYTLN NOP 
      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
      SZA,RSS       IF IT'S ZERO, 
      JMP REJCT      REJECT!
      JSB #RSAX     CALL
      DEF *+3        #RSAX
      DEF D4          FOR 
      DEF TEMP         SEARCH.
      SSB           FOUND?
      JMP NEXT        NO--IGNORE. 
      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 RPCLS     REPORT ERROR AND GO TO "NEXT".
      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 D$WLN     RESET 
      CMA,INA        BUFFER 
      CLE,ERA         POINTER.
      ADA D$WAD 
      STA BPNTR 
* 
      LDA D$WLN     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 
      JSB CLER       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,RSS          IS ZERO, 
      JMP RESET          GO SEND EOT. 
* 
      LDA N2        SET LENGTH TO 2 BYTES 
      CCB            AND DATA TO ALL 1S.
      DST D$WLN 
      ISZ BPNTR     BUMP RECEIVE BUFFER POINTER.
      JMP WRCON     SEND NULL MESSAGE TO 3000.
* 
RESET JSB XLUEX     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. 
      SPC 3 
* 
* PRINT OTHER CLASS I/O ERROR INFORMATION 
* 
CLER  NOP           ENTRY.
      DST CMSG1     STORE ASCII ERROR CODE. 
      JSB EXEC      PRINT ON
      DEF *+5        SYSTEM 
      DEF SD2         CONSOLE.
      DEF D1
      DEF CMSG
      DEF D12 
      NOP 
      CLA           CLEAR # OF WORDS. 
      JMP CLER,I    RETURN. 
* 
CMSG  ASC 10,/QUEX: CLASS ERROR 
CMSG1 ASC 2,
      SPC 2 
* ENTRY POINT TO PRINT ERROR, THEN GO TO NEXT.
RPCLS JSB CLER
      JMP NEXT
      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 XLUEX     ISSUE "READ INITIAL" CALL.
      DEF *+6 
      DEF D1
      DEF LU3K
      DEF BPNTR,I 
      DEF BYTLN 
      DEF RDIWD 
* 
      STB RDLEN     SAVE READ LENGTH. 
      JSB SLCER     CHECK FOR ERRORS. 
D4    DEC 4 
* 
      LDB RDLEN 
      CPB D2        IF 2 BYTES WERE SENT, 
      CLB            IT'S AN EMPTY MESSAGE. 
      STB RDLEN     SAVE POSITIVE # BYTES.
* 
      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 
      LDB B,I        FIRST PNL ENTRY. 
      JSB CKLST     IF ANYONE IS IN LIST, 
      RSS 
      JMP REJCT      REJECT. **SHOULDN'T HAPPEN** 
      LDB #LDEF     GET ADDRESS 
      INB            OF FIRST 
      LDB B,I         MASTER
      LDB B,I          REQUEST. 
      JSB CKLST     IF ANYONE IS IN LIST, 
      RSS 
      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 BPNTR     ISOLATE RIGHT 
      ADA D3         HALF OF
      LDA A,I         WORD 4 IN 
      AND B377         BUFFER.
      INA           INCREMENT AND MULTIPLY
      MPY D16        BY 16 TO GET BUFFER SIZE.
      STA D$BSZ     STORE IN SSGA.
* 
      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 XLUEX     WRITE DISCONNECT. 
      DEF *+6 
      DEF D2
      DEF LU3K
      DEF D0
      DEF D0
      DEF WRDIS 
* 
LNCLO JSB XLUEX     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 
* 
      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 
      AND NBT13     CLEAR CONTINUATION BIT. 
      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 RPCLS     ERROR--REPORT.
      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
      LDB B,I       GET ADDR OF FIRST PNL ENTRY.
      JSB CKLST     CHECK FOR ONE ENTRY.
      JMP STDIS     NONE--DO DISCONNECT.
      JSB CKLST     CHECK FOR SECOND ENTRY. 
      JMP STDIS     NO MORE--DO DISCONNECT. 
      JMP SRCHM     MORE THAN ONE HELLO OUTSTANDING.
* 
STDIS CLA,INA       SET DISCONNECT FLAG.
      STA DCNFL 
      JMP SRCHM     SEARCH FOR MASTER.
      SPC 3 
* 
*  SUBROUTINE TO TERMINATE QUEZ.
* 
OFFQZ NOP           ENTRY.
      JSB EXEC      CALL EXEC FOR 
      DEF *+4        SON'S TERMINATION. 
      DEF SD6 
      DEF QUEZ
      DEF N1        (QUEZ IS SERIAL REUSABLE) 
      NOP           IGNORE ERRORS.
      JMP OFFQZ,I   RETURN. 
* 
SD6   DEF 6,I 
      SPC 4 
* 
*  SUBROUTINE TO CHECK IF A TCB LIST HAS ANY HP3000 ENTRIES.
*  CALLING SEQUENCE: LDB <FIRST TCB ADDR> 
*                    JSB CKLST
*                    <NO-ENTRY RETURN>
*                    <ENTRY RETURN> 
* 
CKLST NOP 
CKLOP SZB,RSS       END OF LIST?
      JMP CKLST,I    YES--TAKE NO-ENTRY RETURN. 
      JSB LODWD 
      STA TEMP      SAVE LINK.
      INB           GET SECOND
      JSB LODWD      TCB WORD.
      LDB TEMP      SET UP POINTER FOR NEXT LOOP. 
      AND BIT14     ISOLATE "3000" BIT. 
      SZA,RSS       IF NOT SET, 
      JMP CKLOP      STAY IN LOOP.
* 
      ISZ CKLST     ENTRY FOUND!
      JMP CKLST,I    TAKE 2ND RETURN. 
* 
      SKP 
* 
* SUBROUTINE TO VERIFY AUTHENTICITY OF REQUESTS AND REPLIES 
* BEING SENT OR RECEIVED. ALSO SETS <CLASS>, <STMWD>, <STREM>,
* AND <BUFL> AND PERFORMS TRACE (IF REQUESTED). 
* 
*   ON ENTRY, (A) = 0 IF OUTGOING REQ/REPLY,
*                 = 1 IF INCOMING REQ/REPLY.
*           BPNTR = BUFFER ADDRESS OF REQ/REPLY.
* 
VERIF NOP 
      STA TEMP      SAVE DIRECTION CODE.
      LDB BPNTR     LOAD ADDRESS OF MESSAGE.
* 
      LDA B,I       CHECK WORD 1: 
      SZA,RSS 
      JMP BADBF       ERROR IF ZERO.
      AND B377        ISOLATE MESSAGE CLASS.
      STA CLASS       SAVE IT.
      ADA N9
      SSA,RSS 
      JMP BADBF       ERROR IF MESSAGE CLASS > 8. 
* 
      ADB D2        CHECK WORD 3: 
      LDA B,I 
      STA STMWD       SAVE IT.
      AND B377        ISOLATE STREAM TYPE.
      STA STREM       SAVE IT.
      ADA NB20
      SSA 
      JMP BADBF       ERROR IF < OCTAL 20.
      ADA NB10
      SSA,RSS 
      JMP BADBF       ERROR IF > OCTAL 27.
* 
      ADB D5        CHECK WORD 8: 
      LDA B,I 
      SSA 
      JMP BADBF       ERROR IF NEGATIVE.
* 
      LDB BPNTR     VERIFY THAT 
      ADB D7         WDCNT <= N(WORDS) + 8. 
      LDB B,I 
      INB 
      CLE,ERB 
      ADB D8
      STB BUFL      SAVE WORD COUNT.
      INB 
      CMB,INB 
      LDA BPNTR,I 
      ALF,ALF 
      AND B377
      ADA B 
      SSA,RSS 
      JMP BADBF     ERROR.
      ISZ VERIF     NO ERROR, TAKE NORMAL RETURN. 
* 
      LDA #CL3K     TRACE OPTION REQUESTED? 
      SZA            (LU NOT SET.)
      SSA            (BAD LOG LU.)
      JMP VERIF,I   NO. 
* 
      LDA #CL3K+1   BUFFERS TO BE TRACED? 
      SSA,RSS       IF BIT 15 NOT SET,
      JMP VERIF,I    RETURN.
* 
      LDA D8        INITIALIZE TRACE
      STA TRLEN      LENGTH TO 8. 
* 
      LDA #CL3K+1   APPENDAGE BIT SET?
      AND BIT14 
      SZA,RSS 
      JMP WRTRC       NO. GO WRITE. 
* 
      LDA BPNTR,I   GET LENGTH OF 
      ALF,ALF        APPENDAGE AND
      AND B377        HEADER FROM 
      STA TRLEN        WORD 1.
* 
      LDA #CL3K+1   GET MAX DATA LENGTH 
      AND LENBT      FROM BITS 0-12.
      ADA TRLEN     ADD HEADER/APPEND LENGTH. 
      STA B         HOLD IN B-REG.
      CMA,INA       IF GREATER THAN ACTUAL
      ADA BUFL       BUFFER LENGTH, 
      SSA 
      LDB BUFL        USE BUFFER LENGTH.
      STB TRLEN     STORE TRACE LENGTH. 
* 
WRTRC CCA 
      ADA BPNTR     SET TRACE 
      STA TPNTR      POINTER. 
      LDB TPNTR,I   SET FIRST WORD
      STB HOLD       TO INDICATE
      LDB TEMP        DIRECTION.
      STB TPNTR,I 
      ISZ TRLEN     ADD 1 TO LENGTH.
      JSB TRCOT     WRITE TRACE.
      LDA HOLD      RESTORE FIRST 
      STA TPNTR,I    BUFFER WORD. 
      JMP VERIF,I   RETURN. 
* 
BADBF LDA DRECV     INITIALIZE FOR "RECEIVED".
      LDB TEMP      CHECK DIRECTION FLAG. 
      SZB,RSS 
      LDA DOUTG     CHANGE TO "OUTGOING". 
      LDB DINSR     GET ADDR IN MAIN MESSAGE. 
      JSB .MVW      MOVE DIRECTION MESSAGE. 
      DEF D5
      NOP 
* 
      LDA LOG       SET BUFFER LENGTH 
      STA BUFL       TO REMAINING BLOCK 
      STA TRLEN       LENGTH & SET TRACE LEN. 
* 
      JSB EXEC      DISPLAY 
      DEF *+5        ">> HP 3000: BAD BUFFER RECEIVED". 
      DEF D2         OR 
      DEF D1         ">> HP 3000: BAD BUFFER OUTGOING". 
      DEF BDBUF 
      DEF D16 
* 
      LDA #CL3K     TRACE OPTION REQUESTED? 
      SZA            (LU NOT SET.)
      SSA            (BAD LOG LU.)
      JMP VERIF,I   NO. 
      JMP WRTRC     YES.
      SPC 1 
*  VALUES SET BY VERIF: 
CLASS NOP           DS/3000 MESSAGE CLASS.
STMWD NOP           DS/3000 STREAM WORD.
STREM NOP           DS/3000 MESSAGE STREAM. 
BUFL  NOP           WORD COUNT OF BUFFER. 
HOLD  NOP 
      SPC 5 
* 
* SUBROUTINE TO WRITE A RECORD TO TRACE LU. 
*  CALLING SEQUENCE: <SET UP TPNTR AND TRLEN> 
*                    JSB TRCOT
* 
TRCOT NOP           ENTRY POINT.
* 
      LDA #CL3K     CHECK 
      STA TRCST      BIT
      STA TRCIO       13 OF 
      AND BIT13        LOG WORD.
      SZA 
      JMP CLIO      SET--DO CLASS I/O.
* 
      JSB XLUEX     CHECK OUT 
      DEF *+3        DYNAMIC
      DEF SD3         STATUS. 
      DEF TRCST 
      JMP WRERR     ERROR RETURN. 
      AND B277      IF ANY "BAD" BITS 
      SZA            ARE SET, 
      JMP TRCDN        SET TRACE DOWN.
* 
      JSB XLUEX     WRITE ENTIRE
      DEF *+5        MESSAGE TO 
      DEF SD2         TRACING LU. 
      DEF TRCIO 
      DEF TPNTR,I 
      DEF TRLEN 
      RSS           ERROR RETURN. 
      JMP TRCOT,I   NO ERROR. RETURN. 
* 
WRERR DST ABREG     PRINT 
      JSB EXEC       ERROR
      DEF *+5         MESSAGE.
      DEF SD2 
      DEF D1
      DEF IOERR 
      DEF D13 
      NOP 
* 
TRCDN LDA #CL3K     SET "BAD" BIT 
      IOR BIT15      IN TRACE LU. 
      STA #CL3K 
      JMP TRCOT,I   RETURN. 
* 
CLIO  LDA #CL3K     SET NO-WAIT BIT 
      IOR BIT15      IN CLASS NUMBER. 
      STA CLASN 
      JSB EXEC      WRITE TO I/O CLASS. 
      DEF *+8 
      DEF CLS20 
      DEF D0
      DEF TPNTR,I 
      DEF TRLEN 
      DEF TRLEN 
      DEF D0
      DEF CLASN 
      JMP WRERR     (ERROR RETURN.) 
      SZA,RSS       CHECK FOR NO S.A.M. 
      JMP TRCOT,I   NO ERROR...RETURN.
      DLD "SAM"     REPORT SAM ERROR. 
      JMP WRERR 
* 
"SAM" ASC 2,SAM 
IOERR ASC 11,/QUEX: TRACING ERROR 
ABREG BSS 2 
TRLEN NOP           TRACE OUTPUT LENGTH.
TPNTR NOP           TRACE OUTPUT POINTER. 
TRCIO OCT 0,100     TRACE LU/BINARY BIT 
TRCST OCT 0,600     TRACE LU/STATUS BITS
SD3   DEF 3,I 
B277  OCT 277 
      SKP 
* 
* SUBROUTINE TO LOAD WORD FROM ALTERNATE MAP (IF RTE-III OR IV).
* 
LODWD NOP 
MODI2 LDA B,I       GET WORD FROM TCB (RSS IF DMS SYSTEM).
      JMP LODWD,I   RETURN IF RTE-II. 
      XLA B,I       LOAD WORD FROM ALTERNATE MAP. 
      JMP LODWD,I   RETURN. 
      SPC 3 
* 
* SUBROUTINE TO STORE WORD INTO ALTERNATE MAP (IF MAPPED SYSTEM)
* 
STRWD NOP 
      JSB $LIBR     LOWER FENCE 
      NOP 
MODI1 NOP           RSS HERE IF DMS SYSTEM. 
      JMP TSTC3 
      XSA B,I       STORE INTO SYSTEM MAPPED LOCATION.
      RSS 
*  FOLLOWING INSTRUCTION IS EXECUTED FOR NON-DMS SYSTEMS ONLY 
TSTC3 STA B,I       STORE WORD. 
      JSB $LIBX     RAISE FENCE.
      DEF STRWD     RETURN. 
      SKP 
* 
* SUBROUTINE TO CHECK STATUS AFTER SLC CALLS. 
* 
SLCER NOP           ENTRY.
* 
      JSB DVRTC     PERFORM DRIVER TRACE. 
* 
      JSB XLUEX       ISSUE STATUS CALL.
      DEF *+5 
      DEF D13 
      DEF #LU3K       CURRENT HP3000 LU.
      DEF STATS       COMPLETION STATUS (EQT WORD 5). 
      DEF TEMP2       EQT WORD 4. 
* 
      LDA STATS       WAS THERE AN ERROR? 
      AND B37 
      STA STATS 
      SZA,RSS 
      JMP ERREX       NO. RETURN. (A) = 0.
* 
      LDB ETABL     ADDR OF ERROR MESSAGE TABLE.
      ADB A         ADD STATUS CODE.
      LDB B,I       GET ADDR OF ERROR MESSAGE.
      SZB 
      JMP ABT       NON-ZERO. SET UP ERROR MESSAGE. 
* 
ERREX ISZ SLCER 
      JMP SLCER,I   RETURN TO CALLER. (A)=NON-ABORT CODE. 
* 
ABT   STB A         ADDR OF ERROR MESSAGE.
      LDB MSGA1     STORAGE ADDR IN MAIN MESSAGE. 
      JSB .MVW      MOVE ERROR MSG TO MAIN MESSAGE. 
      DEF D8
      NOP 
* 
      LDA DCONT     IF DELAY COUNT
      CPA N2         IS 2 (SHORT),
      JMP GDRMT       SKIP PRINT AND CLEANUP. 
* 
      LDA SLCER,I   PLACE TYPE OF CALL IN MESSAGE.
      MPY D5
      ADA DCTN
      LDB DEM11 
      JSB .MVW
      DEF D5
      NOP 
* 
      DLD DOWN      INSERT "*DOWN*".
      DST STMSG+16
      LDA DOWN+2
      STA STMSG+18
* 
      JSB EXEC      DISPLAY ERROR MSG ON LU 1.
      DEF *+5 
      DEF D2
      DEF D1
      DEF STMSG 
      DEF D39 
* 
      JSB CLNUP     PERFORM GLOBAL CLEANUP. 
* 
GDRMT JSB EXEC      GO DORMANT, SAVE RESOURCES. 
      DEF *+4        (UPLIN WILL RESTART QUEX 
      DEF D6          IN FIVE SECONDS.) 
      DEF D0
      DEF D1
* 
      ISZ DCONT     BUMP COUNTER. 
      JMP GDRMT     STAY IN LOOP UNTIL 0. 
* 
      LDA N2        SET DELAY COUNT 
      STA DCONT      TO 2 (SHORT).
* 
      LDA STATS     IF ERROR WAS DLE EOT, 
      CPA D6         GO RIGHT TO LINE CLOSE.
      JMP LNCLO 
      JMP CLOSE     OTHERWISE SEND DLE EOT FIRST. 
* 
* 
DCTN  DEF *+1 
      ASC 5,
      ASC 5, LINE OPEN
      ASC 5, SEND ENQ 
      ASC 5, WRITE CON
      ASC 5, READ INIT
      ASC 5, SEND EOT 
* 
DCONT BSS 1         DELAY COUNT = -50 WHEN LINE 
*                                     FIRST GOES DOWN, -2 AFTERWARD.
      SKP 
* 
* SUBROUTINE TO BUILD AND WRITE TRACE ENTRY FOR DRIVER CALLS. 
*  CALLING SEQUENCE: JSB DVRTC
* 
DVRTC NOP           ENTRY.
      DST A&B       SAVE REGISTERS. 
      LDA #CL3K     GET LOGGING LU. 
      SZA           IF NOT SPECIFIED, 
      SSA            OR BAD,
      JMP RTRN1        RETURN.
* 
      LDA #CL3K+1   IF DRIVER 
      AND BIT13      TRACE WAS
      SZA,RSS         NOT SPECIFIED,
      JMP RTRN1         RETURN. 
* 
      CCA           SET TRACE TYPE
      STA TRBUF      TO -1. 
* 
      DLD $TIME     GET SYSTEM
      DST TRTIM      TIME.
* 
      LDA D$WLN     SAVE
      STA TWLEN      WRITE
      LDA RDLEN       AND READ
      STA TRDLN        LENGTHS. 
* 
      LDA @TDAT     INITIALIZE TRACE
      STA TDPNT      DESTINATION POINTER. 
* 
      LDB OLENT     INITIALIZE TRACE
      STB ENTRY      SOURCE POINTER.
* 
NWENT STB ELINK     SAVE POINTER TO NEXT ENTRY
      JSB NXTEV     PICK UP WORD TWO. 
SVENT JSB STBUF     SAVE IN BUFFER. 
      JSB NXTEV     PICK UP EVENT/STATE WORD. 
      LDB ELINK,I   UP TO NEXT ENTRY? 
      CPB ENTRY 
      RSS 
      JMP SVENT     NO. GET NEXT EVENT/STATE. 
* 
      CCA           STORE -1 IN BUFFER
      JSB STBUF      TO INDICATE END OF ENTRY.
      LDB ELINK,I 
      CPB D$XS5+12  END OF TABLE? 
      RSS 
      JMP NWENT     NO. DO NEXT ENTRY.
* 
      LDA @TRBF     SAVE START OF TRACE 
      STA TPNTR      BUFFER FOR OUTPUT. 
      CMA,INA       CALCULATE LENGTH
      ADA TDPNT      OF BUFFER. 
      STA TRLEN 
      JSB TRCOT     WRITE ENTRY.
* 
RTRN1 LDA D$XS5+12  SET UP OLD ENTRY
      STA OLENT      POINTER FOR NEXT TIME. 
      DLD A&B       RESTORE REGISTERS.
      JMP DVRTC,I   RETURN. 
* 
* BUFFER FOR DRIVER TRACE:
TRBUF NOP           TRACE TYPE
TRTIM BSS 2         TIME
TWLEN NOP           WRITE LENGTH
TRDLN NOP           READ LENGTH 
TRDAT BSS 50        TRACE ENTRIES 
@EOTB DEF * 
* 
* STORAGE FOR DRIVER TRACE: 
@TRBF DEF TRBUF 
@TDAT DEF TRDAT 
A&B   BSS 2 
TDPNT NOP           DESTINATION POINTER.
OLENT NOP           OLD TRACE ENTRY.
ELINK NOP           ENTRY LINK. 
      SPC 3 
* 
* SUBROUTINE TO STORE A-REG IN BUFFER AND BUMP POINTER. 
*  CALLING SEQUENCE: <TDPNT POINTS INTO BUFFER> 
*                    JSB STBUF
* 
STBUF NOP           ENTRY.
      LDB @EOTB     IF POINTER IS AT END
      CPB TDPNT      OF TRACE BUFFER, 
      JMP STBUF,I      SKIP THE STORE.
      STA TDPNT,I   STORE WORD. 
      ISZ TDPNT     BUMP POINTER. 
      JMP STBUF,I   RETURN. 
* 
ENTRY NOP           POINTER INTO TRACE TABLE. 
EOTBL NOP           LAST ADDRESS IN TABLE.
SOTBL NOP           FIRST ADDRESS IN TABLE. 
      SPC 3 
* 
* GET NEXT ENTRY IN EVENT TABLE 
* 
NXTEV NOP 
      LDA ENTRY     GET CURRENT ENTRY ADDRESS.
      INA           ADD ONE.
      CPA EOTBL     IF OUT OF TABLE,
      LDA SOTBL       RESET TO BEGINNING. 
      STA ENTRY     STORE.
      LDA A,I       A:=CONTENTS OF ENTRY. 
      JMP NXTEV,I   RETURN. 
* 
      SKP 
* 
*  SUBROUTINE TO CLEAN UP FOR FRESH START:
*  TELL UPLIN TO TIMEOUT ALL MASTER REQUESTS TO 3000 AND ZERO PNL LIST. 
*  NEW REQUESTS ARE BLOCKED SINCE HP 3000 IS IN "DISCONNECT" STATUS.
* 
CLNUP NOP 
      JSB DCNCT     ESTABLISH "DISCONNECT" STATUS.
* 
*  LOCK "QUEX ABORT" RN (GLOBALLY) SO UPLIN WILL CLEAN UP.
* 
      JSB RNRQ
      DEF *+4 
      DEF GLOCK 
      DEF #CLRN 
      DEF TEMP
      NOP           ERROR RETURN. 
* 
      JSB OFFQZ     MAKE QUEZ DORMANT.
* 
      LDA QXCLS     QUEX CLASS # /NO DE-ALLOC (BIT13).
      IOR BIT15     SET NO-WAIT BIT (#15).
      STA CLASN     RELEASE BUFFER. 
* 
FLUSH JSB EXEC      FLUSH QUEX'S I/O CLASS. 
      DEF *+5 
      DEF CLS21 
      DEF CLASN 
      DEF D0
      DEF D0
      RSS           IGNORE ERRORS.
* 
      SSA,RSS       ANYTHING THERE? 
      JMP FLUSH     YES. KEEP FLUSHING. 
* 
*  HANG ON "QUEX ABORT" RN UNTIL UPLIN FINISHES CLEANUP.
      JSB RNRQ
      DEF *+4 
      DEF LKCLR 
      DEF #CLRN 
      DEF TEMP
      NOP           ERROR RETURN. 
* 
      JMP CLNUP,I   RETURN TO CALLER. 
      SPC 2 
GLOCK OCT 40002 
LKCLR OCT 40006 
SD2   DEF 2,I 
      SKP 
* 
*  WRONG DRIVER FOR THIS QUEX. REPORT THE ERROR.
* 
WRDVR JSB EXEC      REPORT ERROR
      DEF *+5        ON SYS CONSOLE.
      DEF D2
      DEF D1
      DEF WRMSG 
      DEF D12 
* 
      JSB EXEC      SUSPEND.
      DEF *+2 
      DEF D7
* 
      JMP WRDVR     STAY IN LOOP IN CASE OF "GO". 
* 
WRMSG ASC 12,>> QUEX EXPECTS HSI LINK 
      SKP 
ETABL DEF *         TABLE OF ERROR MESSAGES FOR STATUS. 
      DEF EM1        =1 
      DEF EM2        =2 
      DEF EM3        =3 
      DEF EM4        =4 
      NOP            =5    NON-ABORTIVE (EOT RECEIVED). 
      DEF EM6        =6 
      DEF EM7        =7 
      DEF EM8        =8 
      DEF EM9        =9 
      DEF EM10       =10
      DEF EM11       =11
      DEF EM12       =12
      NOP            =13   NON-ABORTIVE (SENT ENQ, GOT ENQ).
      DEF EM14       =14
      DEF EM15       =15
      DEF EM16       =16
      DEF EM17       =17
@EM5  DEF EM5 
* 
EM1   ASC 8,INVALID REQUEST 
EM2   ASC 8,WRONG LINE STATE
EM3   ASC 8,BAD ID SEQUENCE 
EM4   ASC 8,HARDWARE FAILURE
EM5   ASC 8,EOT RECEIVED
EM6   ASC 8,DLE EOT RECEIVED
EM7   ASC 8,TIMEOUT 
EM8   ASC 8,SENT EOT,GOT ENQ
EM9   ASC 8,DATA OVERRUN
EM10  ASC 8,MAX. NAKS RECV'D
EM11  ASC 8,MAX # ENQ SENT
EM12  ASC 8,RVI RECEIVED
EM14  ASC 8,NAK RECEIVED
EM15  ASC 8,MAX ENQ RECEIVED
EM16  ASC 8,NO NAK TO TTD 
EM17  ASC 8,IMPOSSIBLE ERROR
* 
STMSG BYT 15,12     <CR>,<LF> 
      ASC 18,>> HP 3000 COMMUNICATION LINK *DOWN* 
      BYT 15,12     <CR>,<LF> 
EMSG  ASC 18,>>  **************** @ ********* 
      BYT 15,12     <CR>,<LF> 
DEM11 DEF EMSG+11 
UP    ASC 3,* UP *
DOWN  ASC 3,*DOWN*
BDBUF ASC 16,>> HP 3000: BAD BUFFER RECEIVED
DINSR DEF BDBUF+11
DRECV DEF *+1 
      ASC 5, RECEIVED 
DOUTG DEF *+1 
      ASC 5, OUTGOING 
B37   OCT 37
MSGA1 DEF EMSG+2
      SKP 
* 
* CONSTANTS AND WORKING STORAGE.
* 
* 
D6    DEC 6 
D7    DEC 7 
NB10  OCT -10 
NB20  OCT -20 
B377  OCT 377 
B140K OCT 140000
BIT15 OCT 100000
BIT14 OCT 40000 
BIT13 OCT 20000 
NBT13 OCT 157777
LENBT OCT 17777     BITS 0-12 
CLS20 DEF 20,I
CLS21 DEF 21,I
D8    DEC 8 
D9    DEC 9 
D10   DEC 10
D11   DEC 11
D12   DEC 12
D13   DEC 13
D20   DEC 20
D39   DEC 39
N1    DEC -1
N2    DEC -2
N7    DEC -7
N9    DEC -9
N16   EQU NB20
N50   DEC -50 
LU3K  OCT 0,0       3000 LU FOR XLUEX 
QXCLS NOP           QUEX CLASS NUMBER.
QCLAS NOP           (WITH NO-WAIT & SAVE-BUFFER BITS SET.)
LOG   NOP           WORDS TO PROCESS IN CURRENT BUFFER
DCNFL OCT 0 
SGNOF OCT 0 
ENQFL OCT 0 
IGNOR OCT 0 
QUEZ  ASC 3,QUEZ
* 
*  TABLE OF CONTROL WORDS.
CLRWD OCT 064400     CLEAR
INLWD OCT 040103     INITIALIZE 
WNQWD OCT 020100     WRITE INQUIRY
ERCWD OCT 064200     ERROR PARAMETERS 
CONWD OCT 022300     WRITE CONVERSATIONAL 
RESWD OCT 020400     WRITE RESET (EOT)
RDIWD OCT 020200     READ INITIAL 
LCLWD OCT 060300     LINE CLOSE 
WRDIS OCT 020500     WRITE DISCONNECT (DLE EOT) 
* 
OWLEN NOP 
STATS NOP 
CLASN NOP 
TEMP  NOP 
TEMP2 NOP 
RDLEN NOP 
* 
STRTM DEF *+1 
      BYT 10,0      INITIALIZATION REQUEST. 
      DEC 0 
B20   OCT 20
      OCT 0,0,0,0,0 
D16   EQU B20 
* 
TRMRQ DEF *+1 
      BYT 10,0      TERMINATION REQUEST.
      DEC 0 
B21   OCT 21
      OCT 0,0,0,0,0 
* 
      BSS 0        ***   SIZE OF QUEX ****
* 
      SKP 
      IFZ           *** BEGIN DEBUG *** 
*** SPECIAL DEBUG SECTION *** 
*  INSERT A "JSB TRACE" IN PROGRAM. QUEX WILL PRINT CALL LOCATION 
*  AND CONTENTS OF A- & B-REGISTERS ON LU SPECIFIED IN #CL3K+6. 
* 
      EXT CNUMO 
TRACE NOP           ENTRY 
      DST ABREG     STORE REGISTERS 
      LDA #CL3K+6 
      SZA,RSS       IF TRACE LU ISN'T SPECIFIED,
      JMP TRTRN      RETURN FROM TRACE. 
* 
      STA TRLU      SAVE TRACE LU NUMBER. 
* 
      LDB 1727B     GET POINTER TO STARTING ADDR FROM BASE PG.
      JSB LODWD     GET STARTING ADDR FROM ID SEG.
      CMA,INA       NEGATE. 
      ADA TRACE     ADD CALLING ADDRESS 
      STA TOFST      TO GET OFFSET. 
* 
      JSB CNUMO     CONVERT 
      DEF *+3        ADDRESS OFFSET 
      DEF TOFST       TO
      DEF TADDR        OCTAL. 
* 
      JSB CNUMO     CONVERT 
      DEF *+3        A-REG
      DEF ABREG       TO
      DEF TAREG        OCTAL. 
* 
      JSB CNUMO     CONVERT 
      DEF *+3        B-REG
      DEF ABREG+1     TO
      DEF TBREG        OCTAL. 
* 
      JSB XLUEX     PRINT 
      DEF *+5        INFORMATION. 
      DEF SD2 
      DEF TRLU
      DEF TINFO 
      DEF D20 
      NOP 
TRTRN DLD ABREG     RESTORE REGISTERS.
      JMP TRACE,I   RETURN. 
* 
TOFST NOP 
TINFO ASC 7,/QUEX TRACE @ 
TADDR ASC 3,
      ASC 2,: A=
TAREG ASC 3,
      ASC 2,, B=
TBREG ASC 3 
TRLU  OCT 0,0 
      XIF           ***** END OF DEBUG *****
      END  QUEX 
                                                                                                                                            