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 , JSB VERIF , , AND . 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 * JSB CKLST * * * 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 , , , * AND 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: * 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: * 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 , ASC 18,>> HP 3000 COMMUNICATION LINK *DOWN* BYT 15,12 , EMSG ASC 18,>> **************** @ ********* BYT 15,12 , 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