> On Jan 5, 2016, at 4:59 PM, Mark Pizzolato <[email protected]> wrote:
> 
> On Monday, January 4, 2016 at 12:06 PM, Paul Koning wrote:
>>> On Jan 4, 2016, at 2:53 PM, Mark Pizzolato <[email protected]> wrote:
>>> I vaguely remember that something else depends on how it is currently
>>> implemented.  The wait delay was added to accommodate the fact that
>>> something didn't expect immediate response.  A delay of 1 is essentially the
>>> same as no delay.
>>> 
>>> It is hard to imagine that the OS driver would expect that the device would
>>> complete some operation in one instruction time.  This would tend to fail as
>>> newer models of CPU were implemented which used the same peripheral
>>> hardware, no?
>> 
>> All I can say is that it does work on real hardware.
>> 
>> The manual says that the bit is "self-clearing".  That isn't the same words 
>> as
>> the more common "write only" but it implies roughly the same thing.  The
>> driver definitely does not expect the whole master clear process to complete
>> in a few instruction times; it patiently waits for RUN to become set.  But it
>> DOES expect that MCLR does not read back as set, not even very quickly
>> after it was set by the driver.
>> 
>> So maybe the thing to do is have the process master clear action be started
>> at the CSR write rather than delayed (while other CSR operations can remain
>> delayed) so that at least the clear_master_clear part is done right away.
> 
> Actually it seems that any number of things must consistently complete in one 
> or at most a couple of instructions.  If you look at the RSTS ROM checking 
> code:
> 
> ECOCHK:       MOV     R0,-(SP)        ;PRESERVE THE UNIT # *2
>       CLR     R0              ;SET A STARTING ADDRESS
>       MOV     #3,R4           ;TWO CHANCES TO MATCH MICRO-CODE (2 BITS)
>       MOV     #HICOD,R1       ;HIGH SPEED MICRO CODE ADDRESS
>       MOV     #LOCOD,R2       ;LOW SPEED MICRO CODE ADDRESS
> 10$:  MOVB    #ROMI,BSEL1(R3) ;SET UP FOR A ROMI
>       MOV     #100400,-(SP)   ;SET THE INSTRUCTION TO USE
>       BIS     R0,(SP)         ;  AND NOW THE ADDRESS
>       MOV     (SP)+,SEL6(R3)  ;PUT THE INSTRUCTION IN,
>       BISB    #MSTEP!ROMI,BSEL1(R3) ;  AND EXECUTE IT
>       MOVB    #ROMO,BSEL1(R3) ;NOW CLEAR THE BITS
>       MOV     SEL6(R3),R5     ;GET THE MICRO-CODE FROM THAT ADDRESS
>       CLRB    BSEL1(R3)       ;AND CLEAR THE CSR
>       CMP     R5,(R1)+        ;MATCH THE HIGH ONE?
>       BEQ     20$             ; YES, SO CONTINUE      
>       BIC     #1,R4           ;NOT HIGH SPEED, SO CLEAR THE HIGH SPEED BIT
> 20$:  CMP     R5,(R2)+        ;MATCH THE LOW ONE?
>       BEQ     30$             ; YES, SO CONTINUE
>       BIC     #2,R4           ;NOT LOW SPEED SO CLEAR THE LOW SPEED BIT
> 30$:  TST     R4              ;DID EITHER ONE MATCH?
>       BEQ     100$            ;NEITHER ONE MATCHES, SO QUIT RIGHT NOW
> 
> We've got 5 instructions in a row referencing the device registers.  A write, 
> a read-modify-write, a write, a read and a write.
> 
> I'm a software guy who knows how to simulate things.  I don't know how the 
> real hardware works, but unless there is some sort of interlocked behavior 
> with the DMC microcontroller it would seem that a sufficiently fast PDP11 
> would get ahead of the DMC.  No?

The thing to keep in mind is that BSEL1 is implemented in logic; it's not like 
the higher numbered registers that are just a dual ported memory manipulated by 
the KMC11 microcode.  The KMC11 reference manual spells some of this out; for 
example, you can't make sense of MSTEP and ROMI references in the driver from 
the DMC11 manual, you need the KMC11 manual for that.

        paul

_______________________________________________
Simh mailing list
[email protected]
http://mailman.trailing-edge.com/mailman/listinfo/simh

Reply via email to