ASMB,Q,C HED DVG67 RTE 12889 PHYSICAL LEVEL DRIVER * (C) HEWLETT-PACKARD NAM DVG67,0,0 91741-16001 REV 2013 791026 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 1 ENT IG67,CG67,EQTAD,HREC,HSND,HCONT EXT $CGRN SPC 1 ************************** DVG67 ************************** * * * SOURCE: 91741-18001 * * * * BINARY: 91741-16001 * * * * TOM KEANE * * * * JUNE 24, 1976 * * * *********************************************************** * * * MODIFIED BY DMT BEGINNING 5/29/79 TO REMOVE UNUSED CODE * * AND MAKE THE COMMENTS READABLE. * * * *********************************************************** SPC 2 A EQU 0 B EQU 1 SC EQU 0 CHAN EQU 1673B SPC 1 * * * THE FOLLOWING DRIVER WAS WRITTEN FOR A DOS III * * PHYSICAL LEVEL DRIVER. * * * * RTE EQT TABLE AND INTERNAL STORAGE NAME EQT01 EQU 1660B EQT04 EQU 1663B STAT1 EQT05 EQU 1664B STAT2 EQT06 EQU 1665B CONWD EQT07 EQU 1666B PARM1 EQT08 EQU 1667B PARM2 EQT09 EQU 1670B EQT13 EQU 1772B TRLOG EQT15 EQU 1774B SKP **************************************************** * * * CONTINUATOR SECTION * * * **************************************************** * MODIFIED TO CHECK FOR SPURIOUS INTERRUPT BY DMT (7/11/78) CG67 NOP LDB EQT01,I SPURIOUS SZB,RSS INTERRUPT? JMP SPURI YES--IGNORE. SPRTN CLB ZERO RETURN STB SAVA CODE. STA SCODE SAVE SELECT CODE. JSB INTON TEST INTERRUPT SYSTEM. CLA,INA SET RETURN STA RTX FLAG. LDA EQT04,I WAS IT ALF TIMER SSA,RSS INTERRUPT? JMP WEND NO. LDA EQT04,I YES. RESET AND PAROF TIMER STA EQT04,I BIT. JMP LTIM JUMP TO TIMER ROUTINE. * WEND LDB LSIT GET TABLE BASE. JMP LSWCH GO PROCESS. SPC 2 * SPURIOUS INTERRUPT-- SPURI LDB SWORD IF WE'RE EXPECTING SZB AN ENQ, JMP SPRTN NOT SPURIOUS. SPUR2 STB EQT15,I ZERO TIME-OUT CLOCK WORD. * * KEEP LONG-TERM COUNT FOR # OF SPURIOUS INTERRUPTS * IN UNUSED "# ERROR-FREE MSGS RECEIVED" EQT EXTENSION WORD. * LDB P65$ BUMP JSB BUMP STATISTIC. ISZ CG67 MAKE A JMP CG67,I CONTINUATION RETURN. SKP **************************************************** * * * INITIATOR SECTION * * * **************************************************** IG67 NOP CLB STB RTX CLEAR RETURN FLAG. STB SAVA ZERO RETURN CODE. STA SCODE SAVE SELECT CODE. JSB INTON TEST INTERRUPT SYSTEM. LDA EQT09,I GET REQUEST. AND MASK1 ISOLATE FUNCTION AND REQUEST. CPA INCD INITIALIZE REQUEST? JMP I.67B YES. AND MASK2 CPA B4400 CLEAR REQUEST? JMP I.67A YES. LDB EXTSN SZB LOGICAL LINKAGE PRESENT? JMP I.67A YES. CLA,INA NO. INVALID REQUEST. STA SAVA RETURN TO JMP RTRN SYSTEM. * * HANDLE INITIALIZE REQUEST I.67B LDB EQT07,I GET EXTENSION ADDRESS. STB EXTSN LINK WITH LOGICAL. CLA STA STAT2 CLEAR LINE STATE STA CONWD AND TEST BITS. * I.67A LDB EQT05,I SET UP STB STAT1 INTERNAL LDB EQT07,I EQT STB PARM1 VALUES. LDB EQT08,I STB PARM2 LDB EQT13,I STB TRLOG LDA EXTSN SET UP INA EQT STA TSBTS EXTENSION ADA P03$ TOO. LDB A,I STB DEQ22 INA LDB A,I STB DEQ23 INA LDB A,I STB DEQ24 LDA CONWD GET DMA AND DMAMF CHANNEL IOR DMAA AND LDB CHAN SET SLB ALLOCATED IOR DMAM FLAG. STA CONWD LDA STAT1 SET AND LBYT$ STATUS STA STAT1 TO ZERO. LDA SCODE GET SELECT CODE. JSB SETIO SET I/O INSTRUCTIONS. LDA EQT09,I GET CONTROL WORD. AND MASK2 ISOLATE FUNCTION CODE. CPA B4400 CLEAR REQUEST? JMP C0 YES. LDA EQT06,I GET CURRENT I/O WORD. AND B17$ ISOLATE BITS 0-3. CPA P02$ WRITE OR CONTROL REQUEST? JMP TWOPR YES. CHECK OPTIONAL PARAM. * CPA P01$ READ REQUEST? JMP READR YES. ISZ SAVA INDICATE ERROR JMP RTRN AND RETURN TO SYSTEM. * * BECAUSE RTE CONTROL REQUESTS CANNOT PASS ENOUGH PARAMETERS, * SOME WRITE REQUESTS MAY ACTUALLY BE CONTROL REQUESTS. * TWOPR LDA EQT09,I GET OPTIONAL PARAMETER. AND N64$ REMOVE LOGICAL UNIT. IOR P02$ INSERT REQUEST CODE. STA EQT06,I STORE IN CONTROL WORD. AND BIT14 IF BIT 14 IS SET, SZA IT'S A CONTROL JMP CONTL REQUEST. SPC 2 **************************************************** * * * WRITE REQUEST INITIATION * * * **************************************************** STA SWORD CLEAR "WAITING FOR ENQ" FLAG. CCB INDICATE INITIATION CALL. JSB DEQ23,I CALL LOGICAL WRITE (HSLC). JMP DONE COMPLETION RETURN. JSB SETMR CONTINUATION RETURN. JMP RTRN RETURN TO SYSTEM. SKP **************************************************** * * * READ REQUEST INITIATION * * * **************************************************** READR LDA EQT09,I GET CONTROL WORD. AND N64$ REMOVE LOGICAL UNIT. IOR P01$ INSERT REQUEST CODE. STA EQT06,I STORE CONROL WORD TO SYSTEM. AND MASK2 IS IT THE CPA B4500 SPECIAL READ? JMP SPECR YES. * CCB INDICATE INITIATION CALL. CLA,INA JSB DEQ22,I CALL LOGICAL READ (HSLC). JMP DONE COMPLETION RETURN. JSB SETMR CONTINUATION RETURN. JMP RTRN RETURN TO SYSTEM. * SPECR STA SWORD SET SPECIAL CASE. LDA PARM1,I GET RN PARAMETER. STA RNUMB STORE. JSB RDMA INHIBIT DMA INTERRUPTS. LDA IO05A START STA STDMA INSTRUCTION. LDA RECV LINE STATE STA STAT2 EQUALS RECEIVE. JSB READP ENABLE INTERFACE. JMP DONE1 IMMEDIATE COMPLETION. SKP **************************************************** * * * CONTROL REQUEST INITIATION * * * **************************************************** CONTL LDA EQT06,I CURRENT I/O WORD. XOR CONOF SET BIT 14 OFF, 1 ON. STA EQT06,I RESTORE SYSTEM CONTROL WORD. CLA CCB INDICATE INITIATION CALL. JSB DEQ24,I CALL LOGICAL CONTROL (HSLC). JMP DONE1 COMPLETION RETURN. LDA EQT06,I GET CONTROL WORD. ALF,ALF ISOLATE RAL,RAL FUNCTION AND B77$ CODE. ADA N04$ FUNCTION LESS SSA,RSS THAN FIVE? JMP CNTL1 NO. INVALID. ADA CNTLT YES. CALCULATE LDA A,I TABLE ADDRESS. JMP A,I PROCESS BY FUNCTION CODE. SPC 1 * INVALID REQUEST CNTL1 ISZ STAT1 INDICATE INVALID JMP DONE1 REQUEST AND RETURN. SPC 3 *--------------------------------------------------+ * CONTROL TRANSFER TABLE ! *--------------------------------------------------+ DEF C0 CLEAR DEF DONE1 INITIALIZE(NO ADDITIONAL PROCESS) DEF C2 LINE OPEN DEF C3 LINE CLOSE CNTLT DEF * SPC 1 *--------------------------------------------------+ * CLEAR REQUEST ! *--------------------------------------------------+ C0 JSB CLC.C CLEAR INTERFACE. JSB RDMA RELEASE DMA. CLA BREAK STA EXTSN LINKAGE. LDA IDLE LINE STATE STA STAT2 EQUALS IDLE. JMP DONE1 RETURN. SPC 1 *--------------------------------------------------+ * LINE OPEN REQUEST ! *--------------------------------------------------+ C2 LDA TSBTS,I GET TEST BITS. RAL PRIMARY SSA STATION? JSB SETBT YES. SET INDICATOR. LDA AOPEN LINE STATE STA STAT2 EQUALS OPEN. JMP DONE1 RETURN. * SETBT NOP LDA CONWD GET TEST BITS. IOR BIT10 SET PRIMARY STATION. STA CONWD STORE WORD. JMP SETBT,I SPC 1 *--------------------------------------------------+ * LINE CLOSE REQUEST ! *--------------------------------------------------+ C3 JSB CLC.C CLEAR INTERFACE. JSB RDMA RELEASE DMA. LDA CLOSE LINE STATE STA STAT2 EQUALS CLOSED. JMP DONE1 RETURN. SPC 3 ******************************************************** * * * ENTER HERE IF HSLC INDICATED COMPLETION FROM READ, * * WRITE, OR CONTROL INITIATION. (P+1 RETURN) * * * ******************************************************** * DONE LDA IDLE SET LINE STATE STA STAT2 TO IDLE. LDA RTX IF FROM INITIATOR, SZA DO IMMEDIATE COMPLETION. JMP RTRN * DONE1 LDA P04$ INDICATE IMMEDIATE STA SAVA COMPLETION. JMP RTRN RETURN TO SYSTEM. SKP ************************************************ * * * LOGICAL TIMER * * * ************************************************ LTIM LDB LSTT GET TABLE BASE. * LSWCH ADB STAT2 PROCESS LDB B,I BY LINE JMP B,I STATE. SPC 2 *--------------------------------------------------+ * LOGICAL STATE TABLE FOR TIMER ! *--------------------------------------------------+ LSTT DEF *+1 DEF RTRN 0-CLOSED DEF RTRN 1-AWAITING OPEN DEF RTRN 2-IDLE DEF LSTC 3-RECEIVE DEF LSTD 4-CONTROL DEF LSTE 5-SEND DEF LSTE 6-SEND TO RECEIVE SPC 2 *--------------------------------------------------+ * LOGICAL STATE TABLE FOR CONTINUATION ! *--------------------------------------------------+ LSIT DEF *+1 DEF RTRN 0-CLOSED DEF RTRN 1-AWAITING OPEN DEF RTRN 2-IDLE DEF LSIC 3-RECEIVE DEF LSID 4-CONTROL DEF LSIE 5-SEND DEF LSIF 6-SEND TO RECEIVE SKP **************************************************** * * * SET UP I/O INSTRUCTIONS * * * **************************************************** SETIO NOP ADA ISTCC FORM STC INSTRUCTION STA IO07 STA IO08 STA IO09 STA IO10 ADA ICLCC FORM CLC INSTRUCTION STA XIO02 ADA IOTA FORM OTA INSTRUCTION STA XIO03 ADA ILIA FORM LIA INSTRUCTION STA XIO05 ADA ISTF FORM STF INSTRUCTION STA IO06 * * CONFIGURE DMA LOW SC INSTRUCTIONS * LDB P02$ LDA CONWD AND DMAM SZA INB ADB ISTCC STB IO02 ADB ICLCC STB IO00 ADB IOTA STB IO01 STB IO03 ADB ILIA STB IO15 * * CONFIGURE DMA HI SC INSTRUCTIONS * ADB .ISTC STB IO05 ADB ICLCC STB IO05A STB IO05B ADB IOTA STB IO04 ADB ISTF0 STB IO13 STB IO14 JMP SETIO,I SKP **************************************************** * * * SET RTE TIMER * * * * B=TIME (CENTISECONDS) * * <0-INITIATE/UPDATE VALUE * * =0-NO REQUEST * * >0-CANCEL REQUEST * * * **************************************************** SETMR NOP STB EQT15,I STORE TIMER COUNT. LDA EQT04,I TELL SYSTEM IOR BIT12 WE WILL SERVICE STA EQT04,I TIMER INTERRUPTS. JMP SETMR,I RETURN. SPC 2 **************************************************** * * * START READ * * * * A-REG = ADDRESS, B-REG = BYTE COUNT * * * **************************************************** HREC NOP STA ADDR STORE OFF STB LNGTH PARAMETERS. LDB HREC,I GET TIMER PARAMETER. ISZ HREC IF TIMER REQUESTED, SZB JSB SETMR GO SET IT. LDA RECV LINE STATE STA STAT2 EQUALS RECEIVE. JSB RDMA RELEASE DMA. LDA ADDR GET BOTH LDB LNGTH PARAMETERS. BRS CHANGE BYTES TO WORDS. IOR BIT15 SET INPUT. JSB INDMA SET UP DMA. SZB,RSS DO NOT START JMP NONDM IF LENGTH = 0. LDA IO05 FOR DMA STA STDMA TRANSFER LDA CONWD SET BIT INDICATING IOR DMAA WE ARE USING STA CONWD DMA. LDA IO05A STA STDMA+1 JMP DMARD * NONDM JSB RDMA INHIBIT DMA INTERRUPTS. LDA IO05A START INSTRUCTION. STA STDMA * DMARD JSB READP LDA SWORD SPECIAL SZA,RSS CASE? JMP CRTN CONTINUATION RETURN TO SYSTEM. CLA RESET STA SWORD SPECIAL CASE FLAG. LDA EBIT EOT SZA,RSS RECEIVED? JMP ENQR NO. FAKE ENQ. CLA YES. CLEAR STA EBIT TEST WORD. JMP EOTR FAKE EOT. SPC 1 INDMA NOP IO00 CLC DMAL,C INITIALIZE DMA ROUTINE. IO01 OTA DMAL SET ADDRESS. IO02 STC DMAL,C LDA B SET COUNT. IO03 OTA DMAL LDA SCODE SET SELECT CODE. IO04 OTA DMAH JMP INDMA,I RETURN. SPC 2 **************************************************** * * * START WRITE * * * * A-REG = ADDRESS, B-REG = BYTE COUNT * * * **************************************************** HSND NOP STA ADDR STORE STB LNGTH PARAMETERS. LDB HSND,I TIMER ISZ HSND PARAMETER? SZB JSB SETMR YES. SET TIME. LDA SEND LINE STATE STA STAT2 EQUALS SEND. IO07 STC SC,C SET INTERFACE CONTROL WORD. LDA TCWD1 JSB OTA JSB RDMA RELEASE DMA. LDA ADDR INITIALIZE DMA LDB LNGTH AND SET STB TRLOG XLOG. BRS CHANGE BYTES TO WORDS. JSB INDMA INITIALIZE DMA. SZB,RSS DO NOT START JMP NODMW IF LENGTH = 0. LDA CONWD SET BIT INDICATING IOR DMAA WE ARE USING STA CONWD DMA. IO05 STC DMAH,C START DMA. IO05A CLC DMAH,C IO06 STF SC START TRANSFER. JMP CRTN CONTINUATION RETURN TO SYSTEM. * NODMW JSB RDMA INHIBIT DMA INTERRUPTS. JMP IO05A RETURN. SPC 3 **************************************************** * * * WRITE ONE WORD OUT * * CONTROL REQUEST * * * **************************************************** HCONT NOP STA ADDR STORE ISZ HCONT PARAMETER. LDA CNTRR LINE STATE STA STAT2 EQUALS CONTROL. JSB RDMA INHIBIT DMA INTERRUPTS. IO10 STC SC,C SET INTERFACE CONTROL WORD. LDA TCWD5 JSB OTA LDA ADDR,I GET CHARACTER. JSB OTA JMP CRTN CONTINUATION RETURN TO SYSTEM. SPC 2 *--------------------------------------------------+ * CONTROL INTERRUPT ! *--------------------------------------------------+ LSID CLA,RSS NORMAL COMPLETION. * LSTD LDA P15$ TIMEOUT. JMP HCONT,I RETURN TO LOGICAL. SPC 2 *--------------------------------------------------+ * SEND INTERRUPT ! * WRITE END OF TEXT ! *--------------------------------------------------+ LSIE JSB RDMA RELEASE DMA. LDA TCWD3 END OF TEXT. JSB CLC.C SEND ETX. JSB OTA LDA TRLOG MODIFY CMA,INA AND B17$ ETX ALF,ALF BY ALF BYTE IOR ETX COUNT. JSB OTA JSB WAIT LDA TCWD4 SEND CRC. JSB CLC.C JSB OTA JSB OTA DUMMY WORD. JSB WAIT LDA S2R LINE STATE EQUALS STA STAT2 SEND TO RECEIVE. LDA IO05A INHIBIT DMA. STA STDMA START INSTRUCTION. JSB READP READ GARBAGE CHARACTER. LSIF CLA RETURN TO CLB LOGICAL. JMP HSND,I COMPLETION. * LSTE LDA P15$ TIMEOUT. JMP HSND,I RETURN TO LOGICAL. SPC 1 * WAIT NOP SUBROUTINE TO WAIT LDA DELAY SEVERAL MICRO-SECONDS CHK SLA,RAR SO HP3000 WON'T JMP WAIT,I MISS ANY DATA. JMP *+1,I DEF CHK SPC 2 *--------------------------------------------------+ * ENABLE INTERFACE TO READ ! *--------------------------------------------------+ READP NOP LDA RCWD1 SET CONTROL WORD. JSB CLC.C JSB OTA JSB LIA READ 1 OR 2 JSB LIA DATA WORDS. IO08 STC SC,C SET CONTROL, CLEAR FLAG, JSB LIA AND CLEAR THE STATUS WORD. STDMA NOP [OVERLAY WITH START DMA INST.] NOP [OVERLAY WITH CLC DMAH.] CLA CLEAR THE START DMA INST. STA STDMA STA STDMA+1 JMP READP,I RETURN TO CALLER. SPC 2 *--------------------------------------------------+ * PROCESS END OF TEXT ! *--------------------------------------------------+ PETX EQU * IO14 STF DMAH INHIBIT DMA XFERS. IO15 LIA DMAL GET CHARACTER COUNT. STA MOD16 SAVE IT. JSB WAIT WAIT FOR HP 3000. JSB CLC.C READ STATUS JSB LIA WORD. JSB LIA READ CRC WORD. LDA TCWD4 TRANSMIT JSB CLC.C CRC JSB OTA TO JSB OTA CHECK IT. JSB WAIT JSB CLC.C READ STATUS & JSB LIA CHECK AND P02$ ERROR SZA BITS. JMP BTEXT CRC ERROR. LDA MOD16 CHECK MODULO COUNT. LDB LNGTH NEGATIVE BYTE COUNT. CMB,INB MAKE IT POSITIVE BRS WORDS. STB LNGTH ADA LNGTH ADD WORD COUNT. ALS MAKE POSITIVE BYTES. STA TRLOG STORE IN XMISSION LOG. ALF,ALF ALF XOR XTE AND NIB3 MASK FOR ERROR. SZA JMP BTEX1 JSB RDMA RELEASE DMA. LDA P10$ GOOD TEXT. JMP HREC,I RETURN TO LOGICAL. * BTEXT LDA P11$ CRC ERROR. JMP LRTN RETURN TO LOGICAL. * * BTEX1 LDA P12$ TEXT UNDERRUN. JMP LRTN RETURN TO LOGICAL. SPC 2 *-----------------------------------------------------+ * RECEIVE INTERRUPT ! *-----------------------------------------------------+ LSIC LDA SCODE ADA N08$ IGNORE SSA DMA JMP CRTN INTERRUPTS. JSB CLC.C READ INTERRUPT. JSB LIA TAG1 WORD? SLA NO, JUST DATA WORD. JMP RTAG1 YES. WENDC STC SC,C REENABLE INTERFACE. JSB LIA JSB LIA JMP CRTN CONTINUATION RETURN TO SYSTEM. * RTAG1 JSB LIA LOAD TAG1 WORD. STA XTE SAVE CHARACTER. AND MASK0 CLEAR HI-ORDER BIT. CPA ACK0 CHARACTER = JMP ACK0R ACK0 CPA ENQ CHARACTER = JMP ENQR ENQ CPA EOT CHARACTER = JMP EOTR EOT CPA ACK1 CHARACTER = JMP ACK1R ACK1 CPA WACK CHARACTER = JMP WACKR WACK CPA RVI CHARACTER = JMP RVIR RVI CPA NAK CHARACTER = JMP NAKR NAK CPA DEOT CHARACTERS = JMP DEOTR DLE EOT CPA TTD CHARACTERS = JMP TTDR STX ENQ/ABORTED TEXT AND MASK1 HI-ORDER BITS. CPA ETX CHARACTER = JMP PETX ETX/PROCESS CRC JMP BTEXT NO RECOGNIZABLE CHARACTERS. XTE OCT 0 IO09 EQU WENDC SPC 1 ACK0R CLA,INA JMP LRTN SPC 1 ACK1R LDA P02$ JMP LRTN SPC 1 WACKR LDB P10$ BUMP WACK/TTD JSB BUMP LONG-TERM STAT. LDA P03$ JMP LRTN SPC 1 RVIR LDA P04$ JMP LRTN SPC 1 ENQR LDA P05$ LDB SWORD WAITING FOR SZB,RSS LINE BID? JMP HREC,I NO. TAKE LOGICAL RETURN. JMP SCASE YES. SPECIAL CASE. SPC 1 NAKR LDB P05$ BUMP NAK JSB BUMP LONG-TERM STAT. LDA P06$ JMP LRTN SPC 1 EOTR LDA P07$ LDB SWORD WAITING FOR SZB,RSS LINE BID? JMP HREC,I NO. TAKE LOGICAL RETURN. STA EBIT SET EOT RECEIVED. * SCASE LDA RNUMB UNLOCK RN. JSB $CGRN CLA,INA STA TRLOG JMP CRTN CONTINUATION RETURN TO SYSTEM. SPC 1 DEOTR LDA P08$ JMP LRTN SPC 1 TTDR LDA P09$ JMP LRTN SPC 2 LSTC LDA P15$ TIMEOUT. JMP HREC,I RETURN TO LOGICAL. SPC 3 * IF DVG67 WAS IN "SPECIAL READ" STATE (WAITING FOR LINE BID) AND * SOMETHING OTHER THAN ENQ OR EOT CAME DOWN THE LINE, HANDLE AS A * SPURIOUS INTERRUPT. OTHERWISE RETURN TO LOGICAL DRIVER. * LRTN LDB SWORD WAS DRIVER WAITING SZB,RSS FOR LINE BID (ENQ)? JMP HREC,I NO. RETURN TO LOGICAL. CLB YES. TREAT AS A JMP SPUR2 SPURIOUS INTERRUPT.