[Simh] TOPS-20 Source with KMC11 Driver Code?

Timothe Litt litt at ieee.org
Sun May 19 05:58:27 EDT 2013


First, remember:

                            COMMENT @

                  EHPL MI RTPADE NIISED A DP1P1

                         END OF COMMENT @


Besides setting the correct bit(s), you need to tell simh to generate 
the interrupt (to the proper vector).  Assuming you're doing that,  from 
the KDP's point of view you first need to set rdyo or rdyi, indicate the 
interrupt directions with iot, the command type, line number...

Here are the KDP bit definitions from TOPS-10 , and the most interesting 
interrupt service code.  It's pretty readable; it uses fewer macros than 
the TOPS-20 driver.  The constants are all octal,  based as offsets from 
the CSR base.  If you need the other routines, see 
http://pdp-10.trailing-edge.com/tops10_704_monitoranf_bb-x140c-sb/01/10,7/mon/d8kint.mac.html

The KDPAIV and KDPBIV routines are the two generic KDP interrupt service 
routines; each KDP has small prefix routines that dispatch to them after 
saving/setting up the registers.

The instructions RDIO and WRIO read/write Unibus space.  The register 
address is the second argument, the contents are loaded to / stored from 
the first argument.  If you scan the full source for them, you can see 
how each register is used.

If you need more help, you'll need to provide more details of what is - 
and isn't - happening.

	SUBTTL	DEFINITIONS -- DUP11

	DUPADR==3760300		;ADDRESS OF 1ST DUP11
	DUPUBN==3		;UNIBUS ADAPTER NUMBER FOR DUP11

	DPRCSR==0		;RECEIVER CSR
	  DPDTR==000002		;DATA TERMINAL READY
	DPRDBF==2		;(RO)RECEIVER DATA BUFFER
	DPPCSR==2		;(WO)PARAMETER CONTROL AND STATUS REGISTER
	DPTCSR==4		;TRANSMIT CONTROL AND STATUS REGISTER
	  DPCBLP==010000	;EXTERNAL MAINTENCE MODE (CABLE LOOPBACK)
	  DPCNLP==004000	;SYSTEMS TEST MODE (CONTROLLER LOOPBACK)
	  DPMAIN==014000	;MAINTAINENCE MODE BITS
	DPTDBF==6		;TRANSMIT DATA BUFFER
	SUBTTL	DEFINITIONS -- KMC11

SEL0==0
BSEL1==1
	KMCRUN==100000		;RUN FLOP
	KMCMCL==040000		;MASTER CLEAR
	KMCCWR==020000		;CRAM WRITE
	KMCSLU==010000		;STEP LINE UNIT
	KMCLUL==004000		;LINE UNIT LOOP
	KMCRMO==002000		;ROM OUTPUT
	KMCRMI==001000		;ROM INPUT
	KMCSUP==000400		;STEP u-PROCESSOR
	KMCRQI==000200		;REQUEST INPUT
	KMCIEO==000020		;INTERRUPT ENABLE OUTPUT
	KMCIEI==000001		;INTERRUPT ENABLE INPUT
SEL2==2
BSEL3==3			;CONTAINS LINE NUMBER
	KMCOVR==100000		;KMC BUFFER OVER-RUN
	KMCRDO==000200		;READY FOR OUTPUT
	KMCRDI==000020		;READY FOR INPUT
	KMCIOT==000004		;SET FOR RECEIVE CLEARED FOR TRANSMIT
	KMCTYP==000003		;COMMAND TYPE
	  BASEIN==000003	;BASE IN
	  CNTLIN==000001	;CONTROL IN
	  BFADIN==000000	;BUFFER ADDRESS IN
	  CNTLOU==000001	;CONTROL OUT
	  BFADOU==000000	;BUFFER ADDRESS OUT
SEL4==4
BSEL5==5
				;BUFFER DESCRIPTOR LIST ADDRESS
				; (BUFFER ADR IN & OUT & CONTROL OUT)
SEL6==6
BSEL7==7
				;140000	;ADR BITS 17 & 16
				; (BUFFER ADR IN & OUT & CONTROL OUT)
	BFREOM==010000		;END OF MESSAGE (BUFFER ADR OUT)
	BFRENB==020000		;BUFFER ENABLE (BUFFER ADR IN)
	BFRKIL==010000		;BUFFER KILL (BUFFER ADR IN)
	CSRMSK==017770		;MASK FOR DUP11 CSR ADR (BASE IN)
	CDDCMP==100000		;FLAG THIS A DDCMP LINE (CONTROL IN)
	CHALFD==020000		;FLAG THIS IS HALF DUPLEX (CONTROL IN)
				;010000	;ENABLE SECONDARY STATION (CONTROL IN)
				;001000	;CRC INHIBIT (CONTROL IN)
	CENABL==000400		;FLAG TO ENABLE LINE (CONTROL IN)
	COUERR==000377		;ERROR CODE (CONTROL OUT)

CRAMSZ==2000			;SIZE OF KMC11 CRAM
DRAMSZ==2000			;SIZE OF KMC11 DRAM
;BUFFER DESCRIPTOR LISTS ARE STRINGS OF 3 16 BIT WORDS
; 1ST WORD 16 BITS OF BUFFER ADDRESS
; 2ND WORD 16 BIT BYTE COUNT
; 3RD WORD
	BDLLDS==100000		;LAST DESCRIPTOR
	BDLRSY==010000		;RESYNC TRANSMITTER
	BDLXAD==006000		;BUFFER ADDRESS  BITS 17 & 16
	BDLEOM==001000		;END OF MESSAGE
	BDLSOM==000400		;START OF MESSAGE


;MESSAGES TO THE KMC11
; BASEIN:	BSEL2/	<LINE #>*400+3
;		BSEL6/	<DUP11 ADR>&017770
; CONTROL IN:	BSEL2/	<LINE #>*400+1
;		BSEL6/	FLAGS
; BF AD IN:	BSEL2/	<LINE NU>*400+0+<4 IF INPUT>
;		BSEL4/	BUFFER DESCRIPTOR LIST ADR
;		BSEL6/	FLAGS
; BF AD OUT:	BSEL2/	<LINE NU>*400+0+<4 IF RECEIVE>
;		BSEL4/	BUFFER DESCRIPTOR LIST ADR
;		BSEL6/	FLAGS
; CONTROL OUT:	BSEL2/	<LINE NU>*400+1+<4 IF RECEIVE>
;		BSEL4/	BUFFER DESCRIPTOR LIST ADR
;		BSEL6/	ERROR CODE


;CONTROL OUT BIT MASK DEFINITIONS.  THE ROUTINE "CTOTLY" TAKES A
;  CONTROL OUT CODE, TALLYS THE CONTROL OUT IN THE KDL BLOCK, AND
;  PRODUCES A BIT VECTOR OF ONE BIT REPRESENTING THE CODE.  THIS
;  BIT VECTOR REPRESENTATION IS USED TO FACILITATE PARALLEL TESTING
;  FOR VARIOUS CONDITIONS.  BIT DEFINITIONS ARE:

	CTLO06==040000		;ABORT.  SHOULD NEVER HAPPEN
	CTLO10==020000		;HEADER CRC ERROR.
	CTLO12==010000		;DATA CRC ERROR.
	CTLO14==004000		;NO RECEIVE BUFFER ASSIGNED
	CTLO16==002000		;DATA SET READY TRANSITION
	CTLO20==001000		;KMC-11 GOT A NXM ON A UNIBUS ADDRESS
	CTLO22==000400		;TRANSMIT UNDERRUN.
	CTLO24==000200		;RECEIVE OVERRUN
	CTLO26==000100		;BUFFER KILL COMPLETE

	SUBTTL	INTERRUPTS -- INTERRUPT LEVEL INTERFACE TO THE KMC-11

                            Comment @

Each KMC-11 has two interrupt vector addresses.

     "A"	This interrupt is taken when RDYI (KMCRDI) comes up.  In this
	state the KMC-11 is ready for an input transaction.  All
	input transactions for the KMC-11 are queued in the KDP block.
	This is necessary because the following situation would otherwise
	cause a deadlock.
	   1)	The KMC-11 sets RDYO and gives a BUFFER-OUT transaction.
	   2)	At interrupt level, we want to do a BUFFER-IN.
	   3)	If, in the meantime, the KMC-11 has set RDYO again,
		we will not be able to get RDYI until we process another
		output transaction.
	The solution to this is to queue all input transactions.  This does
	mean that we have to take an interrupt on each transaction, but it
	does circumvent the above problem.

     "B"	This interrupt is taken when RDYO (KMCRDO) comes up.  In this
	state the KMC-11 is wants to perform an output transaction.
	It is these output transactions that drive almost all of the
	interrupt level KMC/DUP processing.

     The vector instructions are set up to be JSR's to the locations "KDPAIV",
and "KDPBIV" in the KDP block for the KMC-11.  These locations contain the
5 or 6 instructions necessary to save the AC's, load "W" with the address
of the particular KDP block, and dispatch to either of the two interrupt
routines "KDPAIV" or "KDPBIV".

                          End comment @
	SUBTTL	KDPAIV -- KMC-11 INTERRUPT VECTOR "A" PROCESSING.

;KDPAIV -- ROUTINE TO HANDLE KMC-11 INTERRUPT VECTOR "A" (INPUT)
;CALL	MOVE	W,[EXP KDP-BLOCK-ADDRESS]
;	PUSHJ	P,KDPAIV	;CALLED FROM KDPIVA IN THE KDP BLOCK
;RETURN	POPJ	P,		;TO DISMISS THE INTERRUPT.
;
;CLOBBERS MOST AC'S (WE SHOULD HAVE OUR OWN AC BLOCK ANYWAY)
;
;ON MULTI-PROCESSOR SYSTEMS, THIS CODE WILL NEED TO AOSE THE KDP INTERLOCK
;
KDPAIV::AOS	KDPACT(W)	;COUNT THE INTERRUPT
	MOVE	T1,KDPSTS(W)	;GET THE STATUS
	TLNN	T1,(KDPSRU)	;  AND MAKE SURE WE THINK WE'RE ON LINE
	PJSP	T1,KDPERR	;  IF WE DON'T, CLEAR "RUN" SO INTS WILL STOP

	MOVE	U,KDPCSR(W)	;GET THE UNIBUS ADDRESS OF THE KMC-11
	MOVEI	T1,KMCRDI	;GET THE "RDYI" FLAG
	TION	T1,SEL2(U)	;MAKE SURE "RDYI" IS UP
	PJSP	T1,KDPERR	;  IF IT'S NOT, THEN ITS AN ILLEGAL INTERRUPT
	MOVE	T3,KDPIQT(W)	;GET NUMBER OF NEXT QUEUED TRANSACTION
	CAMN	T3,KDPIQP(W)	;MAKE SURE THAT IT'S DIFFERENT NOT THE "PUTTER"
	PJSP	T1,KDPERR	;  IF IT IS, THEN WE'RE GETTINT UNSOLICITED
				;  INTERRUPTS.  DECLARE KDP ILL.
	LSH	T3,1		;MAKE IT AN OFFSET INTO THE QUEUE
	ADDI	T3,KDPINQ(W)	;RELOCATE BY THE ADDRESS OF THE QUEUE
	MOVE	T1,0(T3)	;GET SEL2 DATA
	MOVE	T2,1(T3)	;GET SEL4, SEL6 DATA
	AOS	T3,KDPIQT(W)	;ADVANCE QUEUE TAKER
	CAIL	T3,KDPQLN	;IF ITS TIME TO WRAP AROUND, THEN
	SETZB	T3,KDPIQT(W)	;  WRAP AROUND TO THE FIRST ENTRY
	MOVEI	T4,KMCRQI	;GET THE REQUEST INPUT INTERRUPT BIT
	CAMN	T3,KDPIQP(W)	;IF QUEUE EMPTY (PUTTER = TAKER) THEN
	BCIO	T4,SEL0(U)	;  CLEAR RQI TO STOP THE INTERRUPTS

	WRIO	T2,SEL6(U)	;STORE TOP WORD
	MOVSS	T2,T2		;GET SEL4 DATA
	WRIO	T2,SEL4(U)	;  AND STORE THAT
	TRZ	T1,KMCRDI	;MAKE SURE RDYI CLEAR (SO KMC CAN RUN)
	WRIO	T1,SEL2(U)	;GIVE REST OF DATA TO KMC
	POPJ	P,		;ALL DONE
;KDPBIV -- ROUTINE TO HANDLE KMC-11 INTERRUPT VECTOR "B" (OUTPUT)
;CALL	MOVE	W,[EXP KDP-BLOCK-ADDRESS]
;	PUSHJ	P,KDPBIV	;CALLED FROM KDPIVB IN THE KDP BLOCK
;RETURN	POPJ	P,		;TO DISMISS THE INTERRUPT
;
;CLOBBERS MOST AC'S (WE SHOULD HAVE OUR OWN AC BLOCK ANYWAYS)
;
;ON MULTI-PROCESSOR SYSTEMS THIS CODE WILL NEED TO AOSE THE KDP INTERLOCK.
;
KDPBIV::AOS	KDPBCT(W)	;COUNT THE INTERRUPT
	MOVE	T1,KDPSTS(W)	;GET OUR PERCEIVED STATUS
	TLNN	T1,(KDPSRU)	;  AND MAKE SURE WE THINK WE'RE RUNNING
	PJSP	T1,KDPERR	;  IF WE'RE NOT, CLEAR RUN AND RETURN

	MOVE	U,KDPCSR(W)	;GET THE UNIBUS ADDRESS OF THE KMC
	RDIO	P1,SEL2(U)	;READ STATUS BITS
	TRNN	P1,KMCRDO	;BETTER WANT AN OUTPUT TRANSACTION
	PJSP	T1,KDPERR	;ILLEGAL INTERRUPT. CRASH KMC
	RDIO	P2,SEL4(U)	;READ BDL ADDRESS
	RDIO	P3,SEL6(U)	;READ ERROR, STATUS OR WHAT EVER

	MOVEI	T1,KMCRDO	;GET THE RDYO BIT
	BCIO	T1,SEL2(U)	;CLEAR IT TO LET THE KMC CONTINUE
	TRNE	P1,2!KMCOVR	;MAKE SURE TYPE IS RIGHT, AND NO OVERRUN
	PJSP	T1,KDPERR	;  WE'RE CONFUSED. GIVE UP.

	LDB	F,[POINT 7,P1,27] ;GET 7 BIT LINE #.
	CAML	F,KDPDPN(W)	;IS THIS A LEGAL LINE FOR THIS KDP
	PJSP	T1,KDPERR	;  IF NOT, BETTER STOP NOW...
	ADDI	F,KDPKDL(W)	;MAKE IT AN OFFSET INTO THE KDP BLOCK
	HRRZ	F,(F)		;LOAD APPRIOATE KDL BLOCK ADDRESS

	SETZ	T1,		;GET A ZERO REGISTER
	TRNE	P1,KMCIOT	;IF INPUT, THEN
	TRO	T1,1		;  SET LOW ORDER BIT
	TRNE	P1,1		;IF CONTROL, THEN
	TRO	T1,2		;  SET NEXT TO LOW ORDER BIT
	JRST	@[JRST KDPBOO	;BUFFER OUT (OUTPUT)
		  JRST KDPBOI	;BUFFER OUT (INPUT)
		  JRST KDPCOO	;CONTROL OUT (OUTPUT)
		  JRST KDPCOI](T1);CONTROL OUT (INPUT)
				;ROUTINE DISPATCHED TO WILL RETURN.
	SUBTTL	KDPBOO -- KMC-11 BUFFER-OUT(OUTPUT) TRANSACTION PROCESSING.

;    This routine frees output buffers when a BUFFER-OUT(OUTPUT) transaction
;declares that the KMC/DUP has output all data in the buffer. It:
;	   1)	Makes sure that this is the last buffer in the current
;		Buffer Description List.  (Data messages consist of two
;		buffers.  The DDCMP header buffer, and the data buffer.
;		These two buffers are combined in a single BDL)  If
;		the current buffer is not the last in the list, nothing
;		more is done, and the interrupt is exited.  (We will
;		get another interrupt when the next buffer in the BDL
;		finishes.)
;	   2)	The count of buffers outstanding is decremented, and a
;		check is made to ensure that this buffer is really the
;		next one we expected to finish.
;	   3)	XMTBUF is called in an attempt to fill the just freed output
;		buffer.
;
;called with:
;	F, W 	    := KDL and KDP pointers
;	P1, P2, P3  := SEL2, SEL4 and SEL6 of the KMC-11
;
KDPBOO:	PUSHJ	P,GETBDL	;GET T4 SET UP TO POINT TO BDL
	TLNE	T4,1		;MAKE SURE THAT BUFFER-OUT STARTS ON EVEN BYTE
	PJSP	T1,KDPERR	;  IF ODD BYTE, THEN KMC-11 SCREWED US
	MOVE	T1,1(T4)	;GET WORD WITH LAST BD HALFWORD
	TLNN	T4,2		;IF WE WANT FIRST HALFWORD,
	MOVS	T1,T1		;  THEN SWAP IT TO THE LOW HALF
	TRNN	T1,BDLLDS	;IS THIS THE LAST BUFFER IN THE BDL
	POPJ	P,		;IF NOT, IGNORE THIS INTERRUPT.

;WE ARE AT END OF MESSAGE.  MAKE SURE WE GOT THE RIGHT ONE BACK

	MOVEI	S,KDSNXB	;STATUS BIT THAT SAYS WHICH BUFFER IS NEXT OUT
	MOVEI	T1,KDLXD1(F)	;ASSUME THAT BUFFER #1 IS FIRST BACK
	TDNE	S,KDLSTS(F)	;  BUT IF IT SHOULD BE BUFFER #2, THEN
	MOVEI	T1,KDLXD2(F)	;  THEN CHANGE OUR MIND.

	MOVSI	T2,(1B0)	;GET THE BDL IN-USE MARK BIT
	TDNN	T2,0(T1)	;  AND MAKE SURE THAT IT'S SET
;[DBUG]	PJSP	T1,KDLERR	;IF NOT, TRY TO CRASH THE LINE
	PUSHJ	P,NTDSTP##	;WE'VE SCREWED UP THE BUFFERS [DBUG]
	ANDCAM	T2,0(T1)	;CLEAR THE USE BIT

	HLRZ	T3,1(T1)	;GET THE HALFWORD CONTAINING THE 3RD WORD
				;  OF THE FIRST BD IN THE BDL
	TRNN	T3,BDLLDS	;IF IT'S NOT THE LAST BD, THEN
	ADD	T1,[XWD 2,1]	;  ADVANCE THE CBP IN T1 3 WORDS (6 BYTES)
	CAMN	T1,T4		;MAKE SURE IT'S THE BDL ADDRESS THE KMC GAVE US
	SOSGE	KDLXBC(F)	;DECREMENT THE NUMBER OF ACTIVE OUTPUT BUFFERS
	PJSP	T1,KDPERR	;++ EITHER BAD BUFFER, OF COUNT WENT NEGATIVE.
	XORB	S,KDLSTS(F)	;SIGNAL THAT OTHER BUFFER IS NEXT BUFFER OUT

	PJRST	XMTBUF		;NOW GO TRY TO FILL THE JUST FREED BUFFER
	SUBTTL	KDPBOI -- ROUTINE TO HANDLE BUFFER-OUT(INPUT) TRANSACTIONS.

;    This routine handles BUFFER-OUT(INPUT) transactions.  These
;transactions consist of input messages coming in over the synchronous
;line.  This routine:
;	   1)	Frees the receive buffer. (No worry about races, this
;		code runs under the KMC interlock on multiprocessor
;		systems.  On a single processor system, it runs at
;		interrupt level.  Hence no one will try to allocate
;		the buffer between when it is freed and when it is
;		processed
;	   2)	Calls RCVMSG to process the incoming message
;
;called with:
;	F, W 	    := KDL and KDP pointers
;	P1, P2, P3  := SEL2, SEL4 and SEL6 of the KMC-11
;
KDPBOI:	PUSHJ	P,FREBOI	;FREE THE INPUT BUFFER, (SET UP T4)
	  PJSP	T1,KDPERR	;?? KMC-11 GAVE BAD BDL ADDRESS ??
	PJRST	RCVMSG		;GO PROCESS MESSAGE (T4 POINTS TO BDL)
	SUBTTL	KDPCOO -- PROCESS A CONTROL-OUT(OUTPUT) TRANSACTION

;    This routine processes CONTROL-OUT(OUTPUT) transactions.  These
;consist primarily of various errors detected by the KMC-11.  This routine:
;	   1)	Counts the control out transaction code (CTOTLY)
;	   2)	Verifys that the error is legal/recoverable.  If not,
;		it crashes the KMC-11.
;	   3)	If the control out frees an output BDL, it assumes that
;		an output message has been clobbered, queues a REP message
;		to speed a recovery NAK, and calls "KDPBOO" to free the BDL.
;
;called with:
;	F, W 	    := KDL and KDP pointers
;	P1, P2, P3  := SEL2, SEL4 and SEL6 of the KMC-11
;
KDPCOO:	PUSHJ	P,SAVE1##	;WE USE P1 FOR A "BIT MASK"
	PUSHJ	P,CTOTLY	;TALLY THE CONTROL OUT CODE AND
				;  PUT "BIT MASK" IN P1
	  PJSP	T1,KDPERR	;IF ILLEGAL CODE, KMC-11 IS SICK...

	TLNE	P1,^-<CTLO14!CTLO16!CTLO22!CTLO26> ;THESE ARE LEGAL OUTPUT
	  PJSP	T1,KDPERR	;  IF IT'S NOT ONE OF THEM, CRASH KMC-11

	TLNE	P1,CTLO14	;IS THIS A BUFFER TEMP UNAVAILABLE?
	JRST	[MOVEI T1,RSNBTU ;IF SO, GET THAT NAK CODE
		 PJRST RCVXNK]	;SEND THE NAK AND RETURN

	TLNE	P1,CTLO26	;IF THIS A "FLUSH DONE" TRANSACTION
	JRST	KDPFLO		;  IF FLUSH DONE, GO UPDATE KDLSTS
	TLNN	P1,CTLO22	;DOES THIS TRANSACTION FREE A BDL?
	POPJ	P,		;  IF NOT, RETURN (DON'T CALL XMTBUF...)

	MOVSI	T1,(KDSREP)	;ASSUME MESSAGE WAS CLOBBERED, SO
	IORM	T1,KDLSTS(F)	;  SO REQUEST A REP TO SPEED RECOVERY

	PJRST	KDPBOO		;PROCESS REST JUST LIKE ANY OTHER BUFFER-OUT
	SUBTTL	KDPCOI -- PROCESS CONTROL-OUT(INPUT) TRANSACTIONS

;    This routine processes the CONTROL-OUT(INPUT) transactions.  These
;transactions are primarily errors noticed by the KMC-11.  In particular,
;BCC (checksum) errors are processed here.  This routine:
;	   1)	Tallys the CONTROL-OUT transaction
;	   2)	Sees if it is a legal/recoverable error.  If not, it
;		crashes the KMC-11
;	   3)	If the transaction frees an input buffer, that is done.
;	   4)	If the transaction implies that a message was lost,
;		an approiate NAK is queued.
;
;called with:
;	F, W 	    := KDL and KDP pointers
;	P1, P2, P3  := SEL2, SEL4 and SEL6 of the KMC-11
;
KDPCOI:	PUSHJ	P,SAVE1##	;P1 WILL HAVE THE "BIT MASK" IN IT.
	PUSHJ	P,CTOTLY	;TALLY THE CONTROL OUT TYPE
				;  RETURNS "BIT MASK" IN P1
	  PJSP	T1,KDPERR	;UNKNOWN CODE. KMC-11 IS SICK...
	TLNE	P1,^-<CTLO10!CTLO12!CTLO24!CTLO26> ;IS THIS LEGAL FOR INPUT
	PJSP	T1,KDLERR	;UN-RECOVERABLE ERROR.  BETTER START OVER

	TLNE	P1,CTLO26	;IS THIS AN "INPUT FLUSH" DONE TRANSACTION
	JRST	KDPFLI		;  IF INPUT FLUSH, GO UPDATE KDLSTS
	TLNE	P1,<CTLO10!CTLO12!CTLO24> ;DOES THIS FREE A BDL?
	PUSHJ	P,[PUSHJ P,FREBOI ;FREE THE INPUT BDL
		     PJSP T1,KDLERR ;BAD ADDRESS RETURNED BY KMC-11. DIE
		   POPJ P,]	;RETURN TO MAIN FLOW

	TLNN	P1,<CTLO10!CTLO12!CTLO24> ;DOES THIS REQUIRE A NAK?
	PJRST	RCVBUF		;IF NO NAK REQUIRED, WE ARE DONE
				;  ATTEMPT TO REQUEUE A BUFFER AND RETURN
	MOVEI	T1,RSNHCK	;ASSUME THAT ERROR WAS HEADER CHECKSUM
	TLNE	P1,CTLO12	;  BUT IF IT WAS A DATA CHECKSUM
	MOVEI	T1,RSNDCK	;  THEN CHANGE OUR MINDS AND USE THAT
	TLNE	P1,CTLO24	;  UNLESS IT WAS AN OVER-RUN, IN WHICH
	MOVEI	T1,RSNOVR	;  CASE WE SHOULD USE THIS.
	PJRST	RCVXNK		;QUEUE NAK AND REQUEUE BUFFERS IF POSSIBLE
;KDPFLO	ROUTINE TO CLEAN UP WHEN OUTPUT BUFFER FLUSH IS COMPLETED.
;  CLEAR "XMIT FLUSH IN PROGRESS" AND SAY NO OUTPUT BUFFERS QUEUED.

KDPFLO:	LDB	T1,KDLSTA##	;GET THE LINE'S STATE (JUST TO MAKE SURE)
	MOVEI	T2,KDSXFL	;GET THE "XMIT FLUSH" IN PROGRESS BIT
	CAIN	T1,KD%FLS	;IF WE'RE NOT IN "BUFFER FLUSH STATE", OR
	TDNN	T2,KDLSTS(F)	;  WE'RE NOT FLUSHING XMIT BUFFERS
	PJSP	T1,KDPERR	;  THEN ASSUME THE KMC-11 SCREWED UP

	SETZM	KDLXBC(F)	;SAY "NO OUTPUT BUFFERS ACTIVE"
	MOVEI	T1,KDSNXB!KDSXFL;  ALSO SAY THAT NEXT BUFFER IS #0, AND
	ANDCAB	T1,KDLSTS(F)	;  WE'RE NOT FLUSHING ANY MORE
	JRST	KDPFLX		;SEE IF WE CAN LEAVE "FLUSH" STATE


;KDPFLI	ROUTINE TO CLEAN UP WHEN INPUT BUFFER FLUSH IS COMPLETE

KDPFLI:	LDB	T1,KDLSTA##	;GET LINE'S STATE
	MOVEI	T2,KDSRFL	;"RECEIVE FLUSH IN PROGRESS" BIT
	CAIN	T1,KD%FLS	;MAKE SURE WE'RE FLUSHING
	TDNN	T2,KDLSTS(F)	;MAKE SURE IT'S INPUT
	PJSP	T1,KDPERR	;IF NOT INPUT FLUSH, THEN KMC GAVE BAD CODE

	SETZM	KDLRBC(F)	;ZERO COUNT OF RECEIVE BUFFERS POSTED
	MOVEI	T1,KDSNRB!KDSRFL;SAY BUFFER #0 NEXT, AND
	ANDCAB	T1,KDLSTS(F)	;  INPUT FLUSH COMPLETE

KDPFLX:	MOVEI	T2,KD%INI	;ASSUME THAT WE HAVE CLEARED BOTH FLUSH BITS
	TRNN	T1,KDSRFL!KDSXFL;  AND IF WE HAVE,
	DPB	T2,KDLSTA##	;  THEN WE'RE IN "INITED" STATE
	POPJ	P,		;DONE WITH THE INTERRUPT

  

This communication may not represent my employer's views,
if any, on the matters discussed.

On 19-May-13 04:53, Robert Jarratt wrote:
>> -----Original Message-----
>> From: simh-bounces at trailing-edge.com [mailto:simh-bounces at trailing-
>> edge.com] On Behalf Of Rich Alderson
>> Sent: 08 May 2013 01:02
>> To: hecnet at update.uu.se; simh at trailing-edge.com
>> Subject: Re: [Simh] TOPS-20 Source with KMC11 Driver Code?
>>
>>> From: "Robert Jarratt" <robert.jarratt at ntlworld.com>
>>> Date: Tue, 7 May 2013 23:33:36 +0100
>>> Can anyone point me at the right place to look at TOPS-20 driver code
>>> for the KMC11? I can see that it is trying to get the Microprocessor
>>> to do something and read back some values, but I don't know what
>>> values it wants to get and so it reports:
>> Hi, Rob,
>>
>> http://pdp-10.trailing-edge.com/tops20v41_monitor_sources/index.html
>>
>> You want the file KDPSRV.MAC in that directory.
>>
>>                                                                  Rich
>> _______________________________________________
>> Simh mailing list
>> Simh at trailing-edge.com
>> http://mailman.trailing-edge.com/mailman/listinfo/simh
>
> I am making some progress with getting the KMC/DUP emulation working in SIMH
> for TOPS-20. At the moment I am stuck on one thing, which is the interrupts
> to tell the OS that the KMC has processed a buffer. The OS sets the
> interrupt enable bit and when I have something to report to the OS I set the
> relevant interrupt bit. However, nothing happens when I do that. I am
> wondering if I have the right interrupt bit? I am using bits 8 and 9
> (decimal).
>
> I am not sure how to find out which bit I should be setting.
>
> Can anyone help?
>
> Regards
>
> Rob
>
> _______________________________________________
> Simh mailing list
> Simh at trailing-edge.com
> http://mailman.trailing-edge.com/mailman/listinfo/simh


-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5159 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://mailman.trailing-edge.com/pipermail/simh/attachments/20130519/817fb8bd/attachment-0002.bin>


More information about the Simh mailing list