> On Aug 18, 2016, at 4:39 PM, Noel Chiappa <j...@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.

        paul

Reply via email to