Difference between revisions of "RK11 disk controller"

From Computer History Wiki
Jump to: navigation, search
(Device registers: Fixed an error, updated some formatting)
(Add info on drive selection)
(46 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{stub}}
+
The '''RK11''' and '''RKV11''' series of controllers for the [[UNIBUS]] and [[QBUS]] are for the earlier RK moving-[[head]] [[magnetic storage|magnetic]] [[disk]] [[drive]]s ([[RK02]]-[[RK05]]), all based on the [[IBM 2315]] drive and pack.
The '''RK11''' is the [[UNIBUS]] controller for the [[RK05]] moving-head magnetic disk drive.
 
  
==Physical implementation==
+
(The later [[RK06]] and [[RK07]], and their controller, the [[RK611]], are a different drive and pack.)
Todo.
+
 
 +
There are several models of the RK11, which are basically identical in their programming interface; differences between them are discussed in the sections on the individual models (below).
 +
 
 +
The UNIBUS RK11's all connect to the RK drive(s) through a bus carried over a [[BC11A]] cable, the standard UNIBUS cable.
 +
 
 +
==Early RK11 version==
 +
 
 +
Although the [[RK11-C disk controller|RK11-C]] (below) is the earliest documented version, there are a few clues which indicate that there was an earlier version (one for which no documentation remains).
 +
 
 +
First, there is an image of a [[DEC indicator panel]] (image [http://ana-3.lcs.mit.edu/~jnc/tech/pdp11/jpg/panels/RK11B.jpg here]) which seems to be from a pre-RK11-C; it clearly seems to be an RK11 panel of some sort, but the pinout of the RK11-C indicator panel connector (engineering drawing "RK11-C Indicator Connectors: RK11-C-23") has differences with this one.
 +
 
 +
In particular, on the panel in the image, the lower right line of lights on the panel shows 3 bits of Major State; on the RK11-C prints (on connector B32) there are 5 individual bits (Postamble, Checksum, Data, Header, Preamble). To explore this further, on the "Major States" RK11-C drawing (RK11-C-04), in the upper left corner, there is a row of 6 flops, each labeled with one of those states (plus one for 'Idle'), arranged in a chain - the output of each driving an individual light. However, the 3 bits for 'Major State' on the display panel imply it is binary coded - likely implemented with a counter.
 +
 
 +
Also, the signal "COUNT MSR" (likely 'Major State Register') is exactly what one would expect to see if the major state had previously been held in a counter, not a string of flops. It makes no sense to expend the effort synthesize that signal (on the next page, RK11-C-05, "MSR Control") when the individual signals which go into it could have been used, as is, to clock each flop in the chain.
 +
 
 +
A reasonable ''guess'', in light of these facts, is that in some previous version, a counter had been used, but had had a problem of some sort, and had therefore been replaced by the string of flops. (The reason is unknown, but perhaps it was a binary counter, not [[Gray code]], and the decoding into states was producing glitches.)
 +
 
 +
A plausible scenario is that such an earlier version was produced in very small numbers - perhaps as prototypes, only internal to DEC. (If there had been problems discovered with glitches in the major state counter, they would not have wanted to release it as a product.) Or if it was released as a product, perhaps they were all recalled and replaced with RK11-C's.
 +
 
 +
In this regard, it is interesting to note the DEC ''Spare Module Handbook'', lists only the RK11-C and -D, but '''does''' list the [[KT11-B]], a ''rara avis'' indeed. This argues that the predecessor did not exist 'in the wild'.
 +
 
 +
==RK11-C==
 +
 
 +
{{Main article | RK11-C disk controller}}
 +
 
 +
Like many of the earlier large peripheral controllers for the [[PDP-11]], the RK11-C was a large custom [[wire-wrap]]ped [[backplane]] which bolts into the front of a 19 inch rack, such as an [[H960 rack|H960]]; into it were plugged about 40 small M-Series [[FLIP CHIP]]s.
 +
 
 +
The RK11-C supports up to 4 drives per device bus (it uses 4 different 'select' lines on the bus, one of which is asserted at a time), and has two device busses.
 +
 
 +
==RK11-D==
 +
 
 +
The RK11-D was a re-implementation of the RK11-C on four [[DEC card form factor|quad]] cards (M7254-7), which plugged into a custom-wired quad-wide hex-high [[system unit]] [[backplane]], for a [[BA11 mounting boxes|BA11]] slide-out mounting box.
 +
 
 +
It was program-compatible with the RK11-C, except that the RK11-D did not contain the Maintenance Register of the earlier controller. In the RK11-D, the bus location of the MR responds, but according to the engineering drawings, it reads as zero, and written data is ignored.
 +
 
 +
The RK11-D supports up to 8 drives per device bus (it uses 3 'select' lines on the bus, with the drive number encoded in binary), and has only one device bus.
 +
 
 +
The RK11-D also has a 6-word [[First-In First-Out buffer|FIFO buffer]] between the disk and the bus (see sheet 7 of the M7256 engineering drawings). The original RK11-C had only one word of buffering, which was probably not enough, and likely the reason for the [[RK11-C disk controller#Double Buffered RK11-C|double-buffered RK11-C version]].
 +
 
 +
==RK11-E==
 +
 
 +
The RK11-E (sometimes called the RK15) was a variant of the RK11-D which supported 18-bit data; it was used with the [[PDP-15]]. It used the same cards as the RK11-D, with a jumper selection for 18-bit operation, and a different clock crystal.
 +
 
 +
It was used with the [[UNICHANNEL 15 System|UC15 Unichannel]], which used a PDP-11 (usually a [[PDP-11/05]]) acting as a slave to the PDP-15; the RK11-E was plugged into the UNIBUS on the PDP-11.
 +
 
 +
It used the two UNIBUS parity lines for the two extra data bits on the 18-bit PDP-15. The two extra bits were not used by the PDP-11 or its memory, but went straight through the [[MX15-B Memory Multiplexer]], directly to the PDP-15's [[main memory]].
 +
 
 +
==RKV11-D==
 +
 
 +
The RKV11-D is a variant of the RK11-D for the QBUS (the others are all UNIBUS).
 +
 
 +
It uses three of the four cards of the RK11-D (M7254-6), along with a replacement fourth card (M7268), in a different custom quad-wide quad-high system unit backplane. The M7268 is connected via ribbon cables to two dual cards, one of which (M7269) plugs into a QBUS backplane slot, and the other (M993-YA) into the first RK05 drive.
 +
 
 +
It is programming compatible with the RK11-D, except that it only supports [[Q16]] QBUS mode, so the two extended memory bits in the CSR have no effect; they may be read and written, but are not connected to anything.
  
 
==Device registers==
 
==Device registers==
Line 26: Line 78:
 
|Data Buffer Register          || RKDB || 777416
 
|Data Buffer Register          || RKDB || 777416
 
|}
 
|}
 +
  
 
===777400: Drive Status Register (RKDS)===
 
===777400: Drive Status Register (RKDS)===
  
{| border=1 style="text-align: center;"
+
{{16bit-header}}
| colspan=3 | Drive Ident. || DPL || HDEN || DRU || SIN || SOK || DRY || ARDY || WPS || SC=CA || colspan=4 | Sector Counter
+
| colspan=3 | Drive ID || DPL || RK05 || DRU || SIN || SCOK || DRY || R/W/S Ready || WPS || SC=CA || colspan=4 | Sector Counter
|-
+
{{16bitoctal-bitout}}
| 15 || 14 || 13 || 12 || 11 || 10 || 09 || 08 || 07 || 06 || 05 || 04 || 03 || 02 || 01 || 00
+
 
|}
+
Note that in the '''''diagram''''' of this register in the 'peripherals handbook' (both 1975 and 1976 editions), bits 7 and 6 are labelled incorrectly; the ''table'' which lists the bits has them correctly.
 +
 
 +
(To confirm this, consult the RK11-D print set, M7254 page 3; the dual 4->1 muxes which fill this page are the source of the RKDS, RKER, etc registers.)
 +
 
 +
The name of bit 6 has changed slightly from the RK11-C to the -D ("Access Ready" to "R/W/S Ready"), but it seems to be basically the same functionality.
  
 
===777402: Error Register (RKER)===
 
===777402: Error Register (RKER)===
  
{| border=1 style="text-align: center;"
+
{{16bit-header}}
 
| DRE || OVR || WLO || SKE || PGE || NXM || DLT || RTE || NXD || NXC || NXS || colspan=3 | || CSE || WCE
 
| DRE || OVR || WLO || SKE || PGE || NXM || DLT || RTE || NXD || NXC || NXS || colspan=3 | || CSE || WCE
|-
+
{{16bitoctal-bitout}}
| 15 || 14 || 13 || 12 || 11 || 10 || 09 || 08 || 07 || 06 || 05 || 04 || 03 || 02 || 01 || 00
 
|}
 
  
 
===777404: Control Status Register (RKCS)===
 
===777404: Control Status Register (RKCS)===
{| border=1 style="text-align: center;"
+
{{16bit-header}}
 
| ERR || H.E. || SCP || M || IBA || FMT || R/WA || SSE || RDY || IDE || colspan=2 | EX. MEM || colspan=3 | FUNCTION || GO
 
| ERR || H.E. || SCP || M || IBA || FMT || R/WA || SSE || RDY || IDE || colspan=2 | EX. MEM || colspan=3 | FUNCTION || GO
 +
{{16bitoctal-bitout}}
 +
 +
Bit 9 is"Read/Write All" in the RK11-C, and unused in the -D; bit 12 is "Maint" in the -C, and unused in the -D.
 +
 +
{| class="wikitable"
 +
! Command !! Code || In CSR
 +
|-
 +
| Reset Controller || 0 || 0
 +
|-
 +
| Write || 1 || 02
 +
|-
 +
| Read || 2 || 04
 +
|-
 +
| Write Check || 3 || 06
 +
|-
 +
| Seek || 4 || 010
 +
|-
 +
| Read Check || 5 || 012
 +
|-
 +
| Reset Drive || 6 || 014
 
|-
 
|-
| 15 || 14 || 13 || 12 || 11 || 10 || 09 || 08 || 07 || 06 || 05 || 04 || 03 || 02 || 01 || 00
+
| Write Lock || 7 || 016
 
|}
 
|}
  
 
===777406: Word Count Register (RKWC)===
 
===777406: Word Count Register (RKWC)===
{| border=1 style="text-align: center;"
+
{{16bit-header}}
 
| colspan=16 | WC15 <---> WC00
 
| colspan=16 | WC15 <---> WC00
|-
+
{{16bitoctal-bitout}}
| 15 || 14 || 13 || 12 || 11 || 10 || 09 || 08 || 07 || 06 || 05 || 04 || 03 || 02 || 01 || 00
 
|}
 
  
 
===777410: Current Bus Address Register (RKBA)===
 
===777410: Current Bus Address Register (RKBA)===
{| border=1 style="text-align: center;"
+
{{16bit-header}}
| colspan=16 | BA15 <---> BA00
+
| colspan=15 | BA15 <---> BA01 || Unused
|-
+
{{16bitoctal-bitout}}
| 15 || 14 || 13 || 12 || 11 || 10 || 09 || 08 || 07 || 06 || 05 || 04 || 03 || 02 || 01 || 00
 
|}
 
  
 
===777412: Disk Address Register (RKDA)===
 
===777412: Disk Address Register (RKDA)===
{| border=1 style="text-align: center;"
+
{{16bit-header}}
 
| colspan=3 | DRIVE SELECT || colspan=8 | CYLINDER ADDRESS || SUR || colspan=4 | SECTOR ADDRESS
 
| colspan=3 | DRIVE SELECT || colspan=8 | CYLINDER ADDRESS || SUR || colspan=4 | SECTOR ADDRESS
|-
+
{{16bitoctal-bitout}}
| 15 || 14 || 13 || 12 || 11 || 10 || 09 || 08 || 07 || 06 || 05 || 04 || 03 || 02 || 01 || 00
 
|}
 
  
 
===777414: Maintenance Register (RKMR)===
 
===777414: Maintenance Register (RKMR)===
{| border=1 style="text-align: center;"
+
{{16bit-header}}
| M<br/>RCP || M<br/>RDP || M<br/>SPS || M<br/>ADA || M<br/>LAI || colspan=3 | || M<br/>DRY || M<br/>R/W/S || colspan=2 | || colspan=4 | MAINTENANCE<br/>SECTOR COUNTER
+
| M. RCP || M. RDP || M. SPS || M. ADA || M. LAI || colspan=3 | || M. DRY || M. R/W/S || colspan=2 | || colspan=4 | MAINT. SECTOR COUNTER
|-
+
{{16bitoctal-bitout}}
| 15 || 14 || 13 || 12 || 11 || 10 || 09 || 08 || 07 || 06 || 05 || 04 || 03 || 02 || 01 || 00
+
 
|}
+
This register is not present in the RK11-D; it reads as 0, and writes to it are discarded.
  
 
===777416: Data Buffer Register (RKDB)===
 
===777416: Data Buffer Register (RKDB)===
{| border=1 style="text-align: center;"
+
{{16bit-header}}
 
| colspan=16 | DB15 <---> DB00
 
| colspan=16 | DB15 <---> DB00
|-
+
{{16bitoctal-bitout}}
| 15 || 14 || 13 || 12 || 11 || 10 || 09 || 08 || 07 || 06 || 05 || 04 || 03 || 02 || 01 || 00
 
|}
 
  
 
==PDP-11 bootstraps==
 
==PDP-11 bootstraps==
Line 89: Line 156:
 
===Disk 0===
 
===Disk 0===
  
I know the octal data is correct, but I'm not sure about the mnemonics and the description.
 
 
{| border=1  
 
{| border=1  
 
! Address !! Data !! Mnemonic !! Description
 
! Address !! Data !! Mnemonic !! Description
|-
+
|- style="background-color: #ccccdd;"
|1000||012700||MOV #177406,R0          ||Move the top of the address of the controller into r0
+
|1000||012700||MOV #177406,R0          ||Move the address of the Word Count register into R0
|-
+
|- style="background-color: #ccccff;"
 
|1002||177406||                        || (constant)
 
|1002||177406||                        || (constant)
|-
+
|- style="background-color: #ccccdd;"
|1004||012710||MOV #177400,(R0)        ||Move 177400 into 177406
+
|1004||012710||MOV #177400,(R0)        ||Move block size (negative) into Word Count register
|-
+
|- style="background-color: #ccccff;"
 
|1006||177400||                        || (constant)
 
|1006||177400||                        || (constant)
|-
+
|- style="background-color: #ccccdd;"
|1010||012740||MOV #5,-(r0)        ||Move 5 into 177404
+
|1010||012740||MOV #5,-(R0)        ||Move 'Read Go' command into CSR
|-
+
|- style="background-color: #ccccff;"
 
|1012||000005||                        || (constant)
 
|1012||000005||                        || (constant)
|-
+
|- style="background-color: #ccccdd;"
|1014||105710||TSTB (R0)                ||Test byte at 177404
+
|1014||105710||TSTB (R0)                ||Test for 'Done' bit in CSR
|-
+
|- style="background-color: #ccccff;"
|1016||100376||BPL 1014                  ||Jump backward if positive
+
|1016||100376||BPL 1014                  ||Jump backward if not set
|-
+
|- style="background-color: #ccccdd;"
|1020||005007||CLR PC                  ||Jump to zero
+
|1020||005007||CLR PC                  ||Start loaded bootstrap with jump to 0
 
|}
 
|}
 +
 +
Note that the INIT pulse caused by hitting the 'Start' button will clear the Bus Adddress register, so the loaded block will be placed at location 0.
  
 
===Disk ''n''===
 
===Disk ''n''===
Line 120: Line 188:
 
{| border=1
 
{| border=1
 
! Address      !! Data        !! Mnemonic                    !! Description
 
! Address      !! Data        !! Mnemonic                    !! Description
|-
+
|- style="background-color: #ccccdd;"
 
| 1000          || 012700      || MOV #177406, R0              || Store the address of the Word Count register in r0
 
| 1000          || 012700      || MOV #177406, R0              || Store the address of the Word Count register in r0
|-
+
|- style="background-color: #ccccff;"
 
| 1002          || 177406      || (constant)                  || (Which is 177406)
 
| 1002          || 177406      || (constant)                  || (Which is 177406)
|-
+
|- style="background-color: #ccccdd;"
 
| 1004          || 012760      || MOV xxxxxx, 000004(R0)      || Store the disk ID number in the Disk Address register
 
| 1004          || 012760      || MOV xxxxxx, 000004(R0)      || Store the disk ID number in the Disk Address register
|-
+
|- style="background-color: #ccccff;"
 
| 1006          || xxxxxx      || (disk ID number)            || The disk number goes here.
 
| 1006          || xxxxxx      || (disk ID number)            || The disk number goes here.
|-
+
|- style="background-color: #ccccdd;"
 
| 1010          || 000004      || (index)                      ||
 
| 1010          || 000004      || (index)                      ||
|-
+
|- style="background-color: #ccccff;"
 
| 1012          || 012700      || MOV #177406, R0              || Store the addresss of the Word Count register in r0
 
| 1012          || 012700      || MOV #177406, R0              || Store the addresss of the Word Count register in r0
|-
+
|- style="background-color: #ccccdd;"
 
| 1014          || 177406      || (constant)                  || (Which is 177406)
 
| 1014          || 177406      || (constant)                  || (Which is 177406)
|-
+
|- style="background-color: #ccccff;"
 
| 1016          || 012710      || MOV #177400, (R0)            || Store 177400 into the Word Count register,
 
| 1016          || 012710      || MOV #177400, (R0)            || Store 177400 into the Word Count register,
|-
+
|- style="background-color: #ccccdd;"
 
| 1020          || 177400      || (constant)                  || meaning that octal 400 words are to be read.
 
| 1020          || 177400      || (constant)                  || meaning that octal 400 words are to be read.
|-
+
|- style="background-color: #ccccff;"
 
| 1022          || 012740      || MOV #000005, -(R0)          || Store 5 into the Control Status register
 
| 1022          || 012740      || MOV #000005, -(R0)          || Store 5 into the Control Status register
|-
+
|- style="background-color: #ccccdd;"
 
| 1024          || 000005      || (constant)                  || selecting the function "read" with 4, and "go" with 1
 
| 1024          || 000005      || (constant)                  || selecting the function "read" with 4, and "go" with 1
|-
+
|- style="background-color: #ccccff;"
 
| 1026          || 105710      || TSTB (R0)                    || Test the Control Status Register (upper) byte
 
| 1026          || 105710      || TSTB (R0)                    || Test the Control Status Register (upper) byte
|-
+
|- style="background-color: #ccccdd;"
 
| 1030          || 100376      || BPL *-1                      || Repeat if it's positive, that is Control Ready is cleared
 
| 1030          || 100376      || BPL *-1                      || Repeat if it's positive, that is Control Ready is cleared
|-
+
|- style="background-color: #ccccff;"
 
| 1032          || 005007      || CLR PC                      || If not, clear the Program Counter (essentially, jump to 0)
 
| 1032          || 005007      || CLR PC                      || If not, clear the Program Counter (essentially, jump to 0)
 
|}
 
|}
Line 153: Line 221:
 
{| border=1
 
{| border=1
 
! Value !! Unit  
 
! Value !! Unit  
|-
+
|- style="background-color: #ccccdd;"
 
| 020000 || Unit 1
 
| 020000 || Unit 1
|-
+
|- style="background-color: #ccccff;"
 
| 040000 || Unit 2
 
| 040000 || Unit 2
|-
+
|- style="background-color: #ccccdd;"
 
| 060000 || Unit 3
 
| 060000 || Unit 3
|-
+
|- style="background-color: #ccccff;"
 
| 100000 || Unit 4
 
| 100000 || Unit 4
|-
+
|- style="background-color: #ccccdd;"
 
| 120000 || Unit 5
 
| 120000 || Unit 5
|-
+
|- style="background-color: #ccccff;"
 
| 140000 || Unit 6
 
| 140000 || Unit 6
|-
+
|- style="background-color: #ccccdd;"
 
| 160000 || Unit 7
 
| 160000 || Unit 7
 
|}
 
|}
Line 172: Line 240:
 
</table>
 
</table>
  
==Documentation==
+
==External links==
[http://toresbe.dreamhosters.com/redirect.php?res=bitsavers&doc=dec/unibus/RK11-C_manual1971.pdf RK11-C manual, 1971]
 
  
[http://toresbe.dreamhosters.com/redirect.php?res=bitsavers&doc=dec/unibus/RK11-C_schemFeb1971.pdf RK11-C schematics, February 1971]
+
* [http://toresbe.dreamhosters.com/redirect.php?res=bitsavers&doc=dec/unibus/EK-RK11D-MM-002.pdf EK-RK11D-MM-002, RK11-D Maintenance Manual]
  
[http://toresbe.dreamhosters.com/redirect.php?res=bitsavers&doc=dec/unibus/EK-RK11D-MM-002.pdf EK-RK11D-MM-002, RK11-D Maintenance Manual]
 
 
[[Category:UNIBUS Storage Controllers]]
 
[[Category:UNIBUS Storage Controllers]]
[[Category:DEC Storage Controllers]]
+
[[Category:QBUS Storage Controllers]]

Revision as of 00:04, 7 January 2019

The RK11 and RKV11 series of controllers for the UNIBUS and QBUS are for the earlier RK moving-head magnetic disk drives (RK02-RK05), all based on the IBM 2315 drive and pack.

(The later RK06 and RK07, and their controller, the RK611, are a different drive and pack.)

There are several models of the RK11, which are basically identical in their programming interface; differences between them are discussed in the sections on the individual models (below).

The UNIBUS RK11's all connect to the RK drive(s) through a bus carried over a BC11A cable, the standard UNIBUS cable.

Early RK11 version

Although the RK11-C (below) is the earliest documented version, there are a few clues which indicate that there was an earlier version (one for which no documentation remains).

First, there is an image of a DEC indicator panel (image here) which seems to be from a pre-RK11-C; it clearly seems to be an RK11 panel of some sort, but the pinout of the RK11-C indicator panel connector (engineering drawing "RK11-C Indicator Connectors: RK11-C-23") has differences with this one.

In particular, on the panel in the image, the lower right line of lights on the panel shows 3 bits of Major State; on the RK11-C prints (on connector B32) there are 5 individual bits (Postamble, Checksum, Data, Header, Preamble). To explore this further, on the "Major States" RK11-C drawing (RK11-C-04), in the upper left corner, there is a row of 6 flops, each labeled with one of those states (plus one for 'Idle'), arranged in a chain - the output of each driving an individual light. However, the 3 bits for 'Major State' on the display panel imply it is binary coded - likely implemented with a counter.

Also, the signal "COUNT MSR" (likely 'Major State Register') is exactly what one would expect to see if the major state had previously been held in a counter, not a string of flops. It makes no sense to expend the effort synthesize that signal (on the next page, RK11-C-05, "MSR Control") when the individual signals which go into it could have been used, as is, to clock each flop in the chain.

A reasonable guess, in light of these facts, is that in some previous version, a counter had been used, but had had a problem of some sort, and had therefore been replaced by the string of flops. (The reason is unknown, but perhaps it was a binary counter, not Gray code, and the decoding into states was producing glitches.)

A plausible scenario is that such an earlier version was produced in very small numbers - perhaps as prototypes, only internal to DEC. (If there had been problems discovered with glitches in the major state counter, they would not have wanted to release it as a product.) Or if it was released as a product, perhaps they were all recalled and replaced with RK11-C's.

In this regard, it is interesting to note the DEC Spare Module Handbook, lists only the RK11-C and -D, but does list the KT11-B, a rara avis indeed. This argues that the predecessor did not exist 'in the wild'.

RK11-C

Main article: RK11-C disk controller

Like many of the earlier large peripheral controllers for the PDP-11, the RK11-C was a large custom wire-wrapped backplane which bolts into the front of a 19 inch rack, such as an H960; into it were plugged about 40 small M-Series FLIP CHIPs.

The RK11-C supports up to 4 drives per device bus (it uses 4 different 'select' lines on the bus, one of which is asserted at a time), and has two device busses.

RK11-D

The RK11-D was a re-implementation of the RK11-C on four quad cards (M7254-7), which plugged into a custom-wired quad-wide hex-high system unit backplane, for a BA11 slide-out mounting box.

It was program-compatible with the RK11-C, except that the RK11-D did not contain the Maintenance Register of the earlier controller. In the RK11-D, the bus location of the MR responds, but according to the engineering drawings, it reads as zero, and written data is ignored.

The RK11-D supports up to 8 drives per device bus (it uses 3 'select' lines on the bus, with the drive number encoded in binary), and has only one device bus.

The RK11-D also has a 6-word FIFO buffer between the disk and the bus (see sheet 7 of the M7256 engineering drawings). The original RK11-C had only one word of buffering, which was probably not enough, and likely the reason for the double-buffered RK11-C version.

RK11-E

The RK11-E (sometimes called the RK15) was a variant of the RK11-D which supported 18-bit data; it was used with the PDP-15. It used the same cards as the RK11-D, with a jumper selection for 18-bit operation, and a different clock crystal.

It was used with the UC15 Unichannel, which used a PDP-11 (usually a PDP-11/05) acting as a slave to the PDP-15; the RK11-E was plugged into the UNIBUS on the PDP-11.

It used the two UNIBUS parity lines for the two extra data bits on the 18-bit PDP-15. The two extra bits were not used by the PDP-11 or its memory, but went straight through the MX15-B Memory Multiplexer, directly to the PDP-15's main memory.

RKV11-D

The RKV11-D is a variant of the RK11-D for the QBUS (the others are all UNIBUS).

It uses three of the four cards of the RK11-D (M7254-6), along with a replacement fourth card (M7268), in a different custom quad-wide quad-high system unit backplane. The M7268 is connected via ribbon cables to two dual cards, one of which (M7269) plugs into a QBUS backplane slot, and the other (M993-YA) into the first RK05 drive.

It is programming compatible with the RK11-D, except that it only supports Q16 QBUS mode, so the two extended memory bits in the CSR have no effect; they may be read and written, but are not connected to anything.

Device registers

Register Abbreviation Address
Drive Status Register RKDS 777400
Error Register RKER 777402
Control Status Register RKCS 777404
Word Count Register RKWC 777406
Current Bus Address Register RKBA 777410
Disk Address Register RKDA 777412
Maintenance Register RKMR 777414
Data Buffer Register RKDB 777416


777400: Drive Status Register (RKDS)

Drive ID DPL RK05 DRU SIN SCOK DRY R/W/S Ready WPS SC=CA Sector Counter
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00

Note that in the diagram of this register in the 'peripherals handbook' (both 1975 and 1976 editions), bits 7 and 6 are labelled incorrectly; the table which lists the bits has them correctly.

(To confirm this, consult the RK11-D print set, M7254 page 3; the dual 4->1 muxes which fill this page are the source of the RKDS, RKER, etc registers.)

The name of bit 6 has changed slightly from the RK11-C to the -D ("Access Ready" to "R/W/S Ready"), but it seems to be basically the same functionality.

777402: Error Register (RKER)

DRE OVR WLO SKE PGE NXM DLT RTE NXD NXC NXS CSE WCE
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00

777404: Control Status Register (RKCS)

ERR H.E. SCP M IBA FMT R/WA SSE RDY IDE EX. MEM FUNCTION GO
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00

Bit 9 is"Read/Write All" in the RK11-C, and unused in the -D; bit 12 is "Maint" in the -C, and unused in the -D.

Command Code In CSR
Reset Controller 0 0
Write 1 02
Read 2 04
Write Check 3 06
Seek 4 010
Read Check 5 012
Reset Drive 6 014
Write Lock 7 016

777406: Word Count Register (RKWC)

WC15 <---> WC00
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00

777410: Current Bus Address Register (RKBA)

BA15 <---> BA01 Unused
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00

777412: Disk Address Register (RKDA)

DRIVE SELECT CYLINDER ADDRESS SUR SECTOR ADDRESS
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00

777414: Maintenance Register (RKMR)

M. RCP M. RDP M. SPS M. ADA M. LAI M. DRY M. R/W/S MAINT. SECTOR COUNTER
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00

This register is not present in the RK11-D; it reads as 0, and writes to it are discarded.

777416: Data Buffer Register (RKDB)

DB15 <---> DB00
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00

PDP-11 bootstraps

Disk 0

Address Data Mnemonic Description
1000 012700 MOV #177406,R0 Move the address of the Word Count register into R0
1002 177406 (constant)
1004 012710 MOV #177400,(R0) Move block size (negative) into Word Count register
1006 177400 (constant)
1010 012740 MOV #5,-(R0) Move 'Read Go' command into CSR
1012 000005 (constant)
1014 105710 TSTB (R0) Test for 'Done' bit in CSR
1016 100376 BPL 1014 Jump backward if not set
1020 005007 CLR PC Start loaded bootstrap with jump to 0

Note that the INIT pulse caused by hitting the 'Start' button will clear the Bus Adddress register, so the loaded block will be placed at location 0.

Disk n

This bootstrap will boot from any disk in a daisy-chained multi-drive configuration. Memory location octal 1006 contains the unit number, as follows:

Address Data Mnemonic Description
1000 012700 MOV #177406, R0 Store the address of the Word Count register in r0
1002 177406 (constant) (Which is 177406)
1004 012760 MOV xxxxxx, 000004(R0) Store the disk ID number in the Disk Address register
1006 xxxxxx (disk ID number) The disk number goes here.
1010 000004 (index)
1012 012700 MOV #177406, R0 Store the addresss of the Word Count register in r0
1014 177406 (constant) (Which is 177406)
1016 012710 MOV #177400, (R0) Store 177400 into the Word Count register,
1020 177400 (constant) meaning that octal 400 words are to be read.
1022 012740 MOV #000005, -(R0) Store 5 into the Control Status register
1024 000005 (constant) selecting the function "read" with 4, and "go" with 1
1026 105710 TSTB (R0) Test the Control Status Register (upper) byte
1030 100376 BPL *-1 Repeat if it's positive, that is Control Ready is cleared
1032 005007 CLR PC If not, clear the Program Counter (essentially, jump to 0)
Value Unit
020000 Unit 1
040000 Unit 2
060000 Unit 3
100000 Unit 4
120000 Unit 5
140000 Unit 6
160000 Unit 7

External links