Trailing-Edge
-
PDP-10 Archives
-
tops10_704_monitoranf_bb-x140c-sb
-
10,7/anf10/dncddq.p11
There are 3 other files named dncddq.p11 in the archive. Click here to see a list.
.SBTTL DNCDDQ - DQ11 SYNCHRONOUS LINE INTERFACE 28 MAR 79
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED
; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION
; 1976,1977,1978.1979,1980,1981,1984,1988.
;ALL RIGHTS RESERVED.
VRCDDQ=005 ;FILE EDIT NUMBER
.IF NE DQN ;IF SYNCHRONOUS LINES PRESENT, AND THEY HAVE DQ11S
.IF NE FTDQ11
;HERE TO INITIALIZE A DQ11 LINE
;HERE TO RESET THE DQ11 LINE
DQDINI:
; MOV LB.SLA(J),DQ ;GET DQ11 HDW ADR
DQREGS MSC ;SELECT MISC REGISTER
MOV #DQ.MC,6(DQ) ;MASTER CLEAR THE DQ11
DQREGS MSC ;SELECT MISC REGISTER
MOV #DQ.MC,6(DQ) ;MASTER CLEAR THE DQ11
;DQREGS SRC ;SECONDARY RECEIVE COUNT
;CLR 6(DQ) ;CLEAR BYTE COUNT
DQREGS MSC ;SELECT MISC REGISTER
MOV #10*400,6(DQ) ;SET 8 BIT CHARS
DQREGS SYN ;SELECT SYNC REGISTER
MOV #SYN*401,6(DQ)
MOV #DQ.RIE,@DQ ;SET INTERRUPT ENABLES
DQ.IDL=2 ;FLAG TO MAKE XMITTER IDLE SYNCHS
DQ.BIE=DQ.EIE+DQ.DIE+DQ.XIE ;FLAGS TO ENABLE VECTOR B INTERRUPTS
MOV #DQ.BIE+DQ.DTR+DQ.IDL,2(DQ)
TRACE DQ
RTS PC
;HERE TO ENABLE DQ11 RECEIVER
DQRBEG: BIS #LS..RG,@J ;FLAG RECEIVER HAS BEEN ENABLED
MOV LB.SLA(J),DQ ;GET DQ11 HDW ADR
MOV LB.IPT(J),R0 ;GET RELATIVE INPUT BUFFER ADDRESS
ADD J,R0 ;MAKE INPUT BUFFER ADR ABS
; SLR (DQ)
; SLR R0
; SLR #52525
BIT #DQ.SEC,@DQ ;PRIMARY/2NDARY NEXT ?
BNE 20$ ;BRANCH FOR 2NDARY
DQREGS PRA ;SELECT PRIMARY RCV ADR REG
BR 22$
20$: DQREGS SRA ;SELECT 2NDARY RCV ADR REG
22$: MOV R0,6(DQ)
INCB 5(DQ) ;ADVANCE TO COUNT REG
MOV #-4,6(DQ) ;SET LENGTH
BITB #4,5(DQ) ;PRIMARY/2NDARY ?
BEQ 30$
DQREGS PRA ;SELECT PRIMARY RCV ADR REG
BR 32$
30$: DQREGS SRA ;SELECT 2NDARY RCV ADR REG
32$: ADD #4,R0 ;POINT TO 2ND HALF OF HEADER
MOV R0,6(DQ)
INCB 5(DQ) ;SELECT COUNT REG
MOV #-4,6(DQ) ;SET LENGTH
MOV #DDRJNK,LB.RDN(J) ;WHERE TO GO WHEN HAVE RECEIVED MSG
BIC #DQ.RAC!DQ.RGO,(DQ) ;BE SURE THE RECEIVER IS STOPPED
BIS #DQ.RGO,@DQ ;SET RECEIVER GOING
BIC #LS.SSY,(J) ;RESET REQUEST STRIP SYNCH FLAG
RTS PC
;HERE TO ENABLE TRANSMITTER
; MUST BE CALLED WITH INTERRUPTS DISABLED
; CALL: MOV <BLK ADR>,J
; JSR PC,DQXBEG
DQXBEG: MOV LB.SLA(J),DQ ;GET DQ11 HDW ADR
TRACE DQ ;FOR THOSE WHO FOLLOW HDW
ASSERT #4*40 SET IN PS ;CHECK PROCESSOR LEVEL
ASSERT #DQ.XGO CLEAR IN 2(DQ) ;IS DQ ALREADY RUNNING ?
;DQ11 NOT GOING SO START BY JAMING OUT SOME SYNCHS
30$: BIT #DQ.SEC,2(DQ) ;CHECK PRIMARY/2NDARY BIT
BEQ 40$ ;BRANCH TO SET UP PRIMARY
DQREGS STA ;ADDRESS 2NDARY TRANS ADR REG
BR 45$
40$: DQREGS PTA ;ADDRESS PRIMARY TRANS ADR REG
45$: MOV #SYNCHS,6(DQ) ;SET PRIMARY TRANSMIT ADDRESS
INCB 5(DQ) ;ADDRESS TRANS COUNT REG
MOV #-FTNSYN,6(DQ) ;SET TRANSMIT COUNT
JSR PC,@LB.XDN(J) ;GET WHAT TO SEND NEXT
TRACE DQ
BIT #DQ.SEC,2(DQ) ;CHECK PRIMARY/2NDARY BIT AGAIN
BEQ 50$
DQREGS PTA ;ADDRESS PRIMARY TRANS ADR REG
BR 55$
50$: DQREGS STA ;ADDRESS 2NDARY TRANS ADR REG
55$: MOV R0,6(DQ) ;SET ADDRESS OF BUFFER
INCB 5(DQ) ;ADDRESS BYTE COUNT REG
MOV R1,6(DQ) ;SET BUFFER LENGTH
BIS #DQ.DTR+DQ.RTS+DQ.IDL,2(DQ) ;ENABLE TRANSMITTER
BIT #DQ.CTS,2(DQ) ;IF MODEM SAYS CLEAR TO SEND
BEQ .+10
BIS #DQ.XGO,2(DQ) ;START THE XMISSION
BIS #LS..XG,@J ;SET FLAG XMITTER IS GOING
RTS PC
.MACRO X Q
DQVA'Q:
DQA.'Q: SAVE <J>
MOV #FLBDQ+<LB.SIZ*'Q>,J
.ENDM X
Z=DQN-1
.REPT DQN
X \Z
.IIF NE Z,BR DQAINT
Z=Z-1
.ENDR
;DQ11 VECTOR A INTERRUPT - RECEIVER
DQAINT: SAVE <DQ,R0,R1,R2>
MOV LB.SLA(J),DQ ;GET DQ11 HDW ADR
; SLR @DQ
; SLR @J
; SLR LB.RDN(J)
; BIC #DQ.SSY,@DQ ;IF SOMETHING HAPPENED,
;BETTER STOP STRIPPING SYNCHS
;SHOULDN'T HAVE BEEN SET IN THE FIRST
;PLACE - WE'RE NOT IN TRANSPARENT MODE
DQA.I0:
BIT #DQ.RDP+DQ.RDS,@DQ ;IF NO END OF BUF, TEST DSR
BEQ 20$
BIT #LS.SSY,@J ;WANT TO STRIP SYNCH AGAIN ?
BEQ 5$
BIC #DQ.RAC,@DQ ;STOP STUFFING BUFFER, AND
BIS #DQ.RGO,@DQ ;TO STRIP SYNCHS AGAIN, BE SURE TO SET GO
BIC #LS.SSY,@J ;CLEAR FLAG
5$: MOV @DQ,R0 ;GET RECEIVER STATUS REGISTER
ROLB R0
BCS 10$ ;BRANCH IF PRIMARY FINISHED
DQREGS SRA ;ADDRESS 2NDARY BUFFER
BR 12$
10$: BMI 16$ ;STOP RECEIVER IF BOTH FINISHED
DQREGS PRA ;ADDRESS PRIMARY RCV BUF ADR REG
12$: JSR PC,@LB.RDN(J) ;DISPATCH TO RIGHT ROUTINE
; SLR @DQ
; SLR R1
; SLR R0
TRACE DQ
MOV R0,6(DQ) ;SET RCV BUF ADR REG
BIS #<DQ.MBM+1>*400,4(DQ) ;ADVANCE TO COUNT REG
MOV R1,6(DQ) ;SET COUNT REG
BEQ 16$ ;IF COUNT IS ZERO HALT RECEIVER
MOV #DQ.RDP,R0 ;BIT TO CLEAR FLAG
BIT #4*400,4(DQ) ;WAS THAT PRIMARY/2NDARY
BEQ 14$
ASR R0 ;BIT TO CLEAR 2NDARY FLAG
14$: BIC R0,@DQ ;CLEAR FLAG
BIT #DQ.RGO,@DQ ;RECEIVER STILL RUNNING ?
BEQ 15$
BR DQA.I0 ;IF STILL RUNNING, SEE IF WE
;CAN STILL BE OF SERVICE
15$:
TWIDDLE ;COUNT TIMES GO DROPPED
;HERE BECAUSE NEED TO STOP RECEIVER
16$:
; SLR @DQ
; SLR R1
; SLR #0
BIC #DQ.RKL!DQ.RDP!DQ.RDS,@DQ ;STOP RECEIVER
BIC #LS..RG,@J ;CLEAR RECEIVE ACTIVE FLAG
QUEPUT QI 89$
JSR PC,DDCIGO
51$: RESTORE <R2,R1,R0,DQ,J>
RTI
;HERE WHEN HAVE CLEARED ALL INTERRUPTING CONDITIONS
20$: BIT #DQ.DSR,2(DQ) ;IF NOT DATA SET READY,
BNE 51$ ;BETTER STOP THE RECEIVER
BR 16$
;DQ11 VECTOR B INTERRUPT PROCESSING
.MACRO X Q
DQVB'Q:
DQB.'Q: SAVE <J>
MOV #FLBDQ+<LB.SIZ*'Q>,J
.ENDM X
Z=DQN-1
.REPT DQN
X \Z
.IIF NE Z,BR DQBINT
Z=Z-1
.ENDR
;VECTOR B INTERRUPT FOR DQ11 - TRANSMIT OR DATASET CONTROL
DQBINT: SAVE <DQ,R0,R1,R2>
MOV LB.SLA(J),DQ ;GET DQ11 HDW ADR
DQB.I0: TRACE DQ
MOV @DQ,R0
MOV 2(DQ),R1 ;GET TRANSMIT STATUS WORD
TST 4(DQ) ;CHECK FOR ERROR BIT
BMI 40$
BIT #DQ.XDP+DQ.XDS,R1 ;CHECK FOR TRANSMIT DONE
BEQ 20$ ;BRANCH IF NOT XMT-DONE
BIT #DQ.XDP,R1 ;JUST FIN PRIMARY TRANS BUF ?
BEQ 10$ ; BRANCH ON 2NDARY
BIT #DQ.XDS,R1
BNE 17$ ;IF BOTH WENT OFF STOP TRANSMITTER
DQREGS PTA ;ADDRESS PRIMARY TRANS BUF ADR REG
BR 12$
10$: DQREGS STA ;ADDRESS 2NDARY TRANS BUF ADR REG
12$:
.IF NE 0 ;NOT READY TO TRY THIS NOW
CMP #DDCI20,LB.XDN(J) ;IF IDLING, USE HDW IDLE FEATURE
BNE 13$
BIS #DQ.IDL,2(DQ)
BR 18$
.ENDC
13$:
JSR PC,@LB.XDN(J) ;GET WHAT TO PUT IN THE OTHER BUFFER
TRACE DQ
MOV R0,6(DQ) ;SET UP ADR REG
INCB 5(DQ) ;ADVANCE TO COUNT REG
MOV R1,6(DQ) ;SET COUNT REGISTER
BEQ 17$ ;IN CASE NEED TO STOP IT
MOV #DQ.XDP,R0 ;BIT TO CLEAR FLAG
BITB #4,5(DQ) ;WERE WE SETTING PRIMARY ?
BEQ 15$ ;AND BRANCH IF SO
MOV #DQ.XDS,R0 ;BIT TO CLEAR FLAG
15$: BIC R0,2(DQ) ;CLEAR FLAG
BIT #DQ.XGO,2(DQ) ;WERE WE TOO SLOW FOR TRANSMITER ?
BNE DQB.I0 ;CHECK FOR MORE THINGS TO DO
BR 17$ ;EXECUTE STOP ROUTINE
;HERE BECAUSE NOT TRANSMIT DONE INTERRUPT
20$: BIT #DQ.DSF,R1 ;DID WE WIN A DATASET FLAG ?
BNE 30$ ;BRANCH IF SO
25$: RESTORE <R2,R1,R0,DQ,J>
RTI
;HERE ON A DATASET INTERRUPT
30$: BIC #DQ.DSF,2(DQ) ;CLEAR DATASET FLAG
BIT #DQ.CTS,2(DQ) ;DID CLEAR TO SEND COME UP ?
BEQ 31$
BIT #LS..XG,(J) ;IF BUFFERS INITIALIZED
BEQ .+10
BIS #DQ.XGO,2(DQ) ;START TRANSMITTER
BR DQB.I0 ;CHECK FOR MORE INTERESTING THINGS
31$: BIT #LS..XG,(J) ;IF XMMITTER WAS GOING
BNE 17$ ;ITS STOPPED NOW
BR DQB.I0 ;CHECK FOR MORE INTERESTING THINGS
;HERE ON AN ERROR INTERRUPT
40$:
.IIF EQ FT.SLB, INC LB.SLE(J) ;COUNT ERROR INTERRUPTS
MOV 4(DQ),R0 ;GET ERROR STATUS
.IIF EQ FT.SLB, MOV R0,LB.SLE+2(J) ;SAVE ERROR BITS
BIT #DQ.RNX!DQ.XNX,R0 ;NON EX MEM ?
BEQ .+4
STOPCD NXM
BIT #DQ.RCL!DQ.RLE!DQ.RNX,R0 ;RECEIVER ERROR ?
BEQ 42$
BIC #DQ.RDS!DQ.RDP!DQ.RKL,@DQ ;STOP RECEIVER
BIC #DQ.RCL!DQ.RLE!DQ.RNX,4(DQ) ;CLEAR FLAG
BIC #LS..RG,@J ;CLEAR RECEIVER ACTIVE FLAG
QUEPUT QI 87$
BR DQB.I0
42$:
.IF NE FTASRT
BIT #DQ.XCL!DQ.XLE!DQ.XNX,R0 ;WAS IT A TRANSMIT ERROR ?
ASSERT NE ;ZAPPED IF NOT
.ENDC
;HERE TO STOP THE DQ11 TRANSMITTER
17$:
; BIC #DQ.RTS,2(DQ) ;CLEAR REQUEST TO SEND
18$: BIC #DQ.XDP+DQ.XDS+DQ.XGO,2(DQ) ;CLEAR & STOP XMITTER
BIC #DQ.XCL!DQ.XLE!DQ.XNX,4(DQ) ;CLEAR ERRORS IF ANY
BIC #LS.XCT!LS.XDT!LS..XG,@J ;FLAG WE STOPPED THE TRANSMITTER
QUEPUT QO 86$
JMP DQB.I0
.ENDC ;.IF NE FTDQ11
.ENDC ;.IF NE DQN