[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