Microvax II hardware not recognized

Paul Koning paulkoning at comcast.net
Fri Aug 19 09:38:11 CDT 2016

> On Aug 18, 2016, at 4:39 PM, Noel Chiappa <jnc at mercury.lcs.mit.edu> wrote:
>> From: Paul Koning
>> A lot of Unibus/Qbus devices have "floating CSRs" which means they
>> don't have fixed address assignments. Instead, the correct address is
>> based on a set of rules, which puts devices in an ordered list and
>> assigns addresses in sequence. .. If you get the address wrong, the
>> system will see the device as the wrong type
> What about if you have a series of devices (A, B, C, D, E), assigned addresses
> in the correct order, and then you remove C from the system; will the software
> stop probing for more devices when it gets to C (ie. D and E, although still
> plugged in, will not be seen)?

They will probably be seen, but they will be mistaken to be a different device.

Here's how the floating CSR machinery works:  

There's a list of "floating CSR" devices in the documentation.  For example, you can find it in Appendix D of the 1981 Peripherals Handbook.  It lists device types and their CSR base address modulus.  For example, the first few entries are (modulus in octal):

DJ11  10
DH11  20
DQ11  10
DU11  10
DUP11 10
LK11  10
DMC11 10

Floating addresses start at 760010.  The address assignment works as follows:

1. Start at the start address (760010).
2. For each device type in the floating address list:
   a. Round the current address up to a multiple of the modulus
   b. For each device you actually have:
      i. Set the CSR base address of the next unit to the current address
      ii. Advance the current address by the modulus
   c. Advance the current address by the modulus of the NEXT device type (i.e., leaving a "hole" to mark no more units of that type.)

So suppose you have one DJ11, one DH11, and one DU11, but no others, the addresses would be:

DJ11: 760010  (hole at 760020 to mark no more)
DH11: 760040  (hole at 760060)
(hole at 760070 to mark no DQ11)
DU11: 760100

Suppose you then remove the DJ11 but leave the other controllers with their existing addresses.  What will happen is that autoconfig software will misidentify the DH11 as a DU11, and the DU11 as an DMC11.  The reasoning goes like this:

(hole at 760010 to mark no DJ11)
(hole at 760020 to mark no DH11)
(hole at 760030 to mark no DQ11)
DU11: 760040  (hole at 760050 to mark no more)
(hole at 760060 to mark no DUP11)
(hole at 760070 to mark no LK11)
DMC11: 760100

The correct procedure for removing the DJ11 is to remove it and also change the other floating CSR controller addresses to:

(hole at 760010 to mark no DJ11)
DH11: 760020  (hole at 760040)
(hole at 760050 to mark no DQ11)
DU11: 760060

There are utilities that do this calculation for you; for example, in the "simtools" repository (SIMH tools) there's "config11" which does all this very nicely.


The handbook also describes floating vectors.  Those are somewhat similar with one key difference: there are no "holes to mark no more units", instead the vectors are assigned in order to those devices that actually exist.  That makes sense given that the vector address space is so much smaller.

The way RSTS treats all this: starting with V6B, the RSTS initialization code (INIT) walks through the floating CSR address space looking for addresses that respond (no NXM bus timeout).  It uses the floating CSR order rules to identify what the device at that address is.  (In other words, it relies on correct address assignment).

RSTS does *not* use floating CSR rules.  Instead, once it has identified all the I/O devices (floating as well as fixed) that it supports, it "pokes" them to make them interrupt.  It sets all the possible vectors with an interrupt catcher, so it learns what vector is actually used.  In other words, RSTS requires correct use of the floating CSR rules, but does not care about the floating vector rules, or for that matter the fixed vector assignments.  All that matters is that the vector assignments are unique.  There's one exception: since there isn't any way to make a card reader (CD11 or CR11) interrupt without attempting to read a card, those controllers are not poked, and for that one case RSTS requires the vector to be the standard one.


More information about the cctalk mailing list