PDP-8/e RX8E Repair
I have on the workbench three RX8E PDP-8 RK05 controllers. The goal is to get all three sets 100% working. After doing some initial testing and swapping of boards, I have come to the disappointing conclusion that no combination of boards is fully functional.
Repair Strategy
Having three sets of boards is a massive advantage; the RX8E is rather complex, having its logic poorly distributed over three cards.
Firstly, I am going to identify the combination of cards that results in the longest test run time. Then I am going to test each board type from each set. I will then fix the board that fails the test the fastest.
Board: M7106, Set 1 - 1s - 2026/09/10
STATUS REGISTER ERROR
PC:0243 GD:2200 ST:2202This board failed its test in under 1s, We can see from the PC that it only got 43 instructions into the diagnostic before it failed.
Expected value: 2200
Received value: 2202
The error shows that bit 10 was 1 when it should have been 0; the other bits are correct. Looking at a block diagram, we can see where bit 10 is coming from.

Looking at the circuit with the oscilloscope, I found that E45 was bad and was putting out 2v constantly. Replacing the 7408 fixed the issue, and the card works as well as the other two.
Board: M7106, Set 1 - 3s - 2026/09/20
This board made it to test 3 before a fault was found and ran for 3s.
COMMAND REGISTER ERROR
PC:0264 GD:0000 CM:0407
Expected value: 0000
Received value: 0407Test 3 reads the command register and checks that it's 0. The expectation is that the register is initialised to zero when the computer boots and when the CLEAR key is pressed. In this case, and every time I run the test, it returns 0407 when trying to read the command register.
The command register is not a general-purpose read/write register; reading it is rather involved and is done via the maintenance interface. It took me quite a bit of time to understand the method. Here is a listing for a program to do it:
/READ COMMAND REGISTER Page 1
1 /READ COMMAND REGISTER
2 0020 *0020
3 00020 0206 XRDCM, RDCM
4 00021 0224 XMAIN2, MAIN2
5 00022 0233 XLDMN, LDMN
6 00023 7764 M12, -14
7 00024 0020 K0020, 0020
8 00025 0400 K0400, 0400
9 00026 0000 SBCNT1, 0
10 00027 0000 CMREG, 0
11
12 0200 *0200
13 /
14 / MAIN
15 /
16 00200 7200 CLA /CLEAR AC
17 00201 7001 IAC /AC=0001 (SIMULATE A POWER CLEAR)
18 00202 6742 DCLR /CLEAR ALL (DCLC)
19 00203 4420 TST3, RDCMD /READ COMMAND REGISTER (CM in CMREG & AC)
20 00204 7402 HLT /HLT
21 00205 5204 JMP .-1
22 /
23 /SUBROUTINE TO SHIFT COMMAND REGISTER TO
24 /DATA BUFFER THEN READ DATA BUFFER
25 /
26 00206 0000 RDCM, 0
27 00207 4421 ENMAN2 /ENTER MAINTENANCE MODE+DB41
28 00210 1023 TAD M12 /LOAD MINUS 12 (7764)
29 00211 3026 DCA SBCNT1 /12 BIT SHIFT (SAVE COUNTER)
30 00212 1025 TAD K0400 /ENABLE BIT FOR SHIFT COMMAND (MR=6000+0400) (CHECK COMMAND REGISTER)
31 00213 4422 LDMAN /LOAD AND GO (SHIFT COMMAND REGISTER TO DATA BUFFER4)
32 00214 2026 ISZ SBCNT1 /INCREMENT AND SKIP IF ZERO
33 00215 5213 JMP .-2 /SHIFT 12
34 00216 7300 CLA CLL /AC=0, L=0
35 00217 1024 TAD K0020 /ENABLE TRANSFER CONTENTS OF DATA BUFFER 4 TO THE AC (MR=6400+0020)
36 00220 4422 LDMAN /LOAD AND GO
37 00221 3027 DCA CMREG /SAVE AC (COMMAND REGISTER)
38 00222 1027 TAD CMREG /RESTORE IT
39 00223 5606 JMP I RDCM /RETURN FROM SUBROUTINE
40 /
41 /SUBROUTINE TO ENABLE MAINTENANCE MODE
42 /SET DB4=1 TO ENABLE SHIFT TO LOWER SILO
43 /
44 00224 0000 MAIN2, 0
45 00225 7330 CLA CLL CML RAR /ENABLE SET MAINTENANCE MODE (AC=4000, L=0)
46 00226 4422 LDMAN /LOAD MAINTENANCE, SET ENABLE (MR=4000)
47 00227 7010 RAR /ENABLE SET DB4=1 (AC=2000)
48 00230 4422 LDMAN /LOAD MAINTENANCE, SET DB4=1 (MR=6000)
49 00231 7300 CLA CLL /AC=0, L=0
50 00232 5624 JMP I MAIN2 /RETURN FROM SUBROUTINE
51 /
52 /SUBROUTINE TO ISSUE "DMAN" MAINTENANCE IOT
53 /
54 00233 0000 LDMN, 0
55 00234 6747 IOT7, DMAN
56 00235 5633 JMP I LDMN
57
58 6747 DMAN=6747
59 6742 DCLR=6742
60 4420 RDCMD=JMS I XRDCM
61 4421 ENMAN2=JMS I XMAIN2
62 4422 LDMAN=JMS I XLDMN
63 $Essentially, one of the maintenance functions allows the command register to be shifted into Data Buffer 4, one bit at a time. Once the data is fully shifted, the user can then read Data Buffer 4 into the AC.
Actually, quite a large portion of the hardware is required to be functioning correctly to run this simple test: instruction decoding, maintenance functions, maintenance register, bus interface, shifting logic and power-on reset logic. Surprisingly, this is the second test; I would have had other tests before this one.
Initially, it took me quite a long time to figure out how reading from the Command Register works, but it's actually quite simple. It's just that the explanation in the documentation isn't so good.
First, the Command Register is constructed from shift registers. This lets it function as both a register and a shifter. When we want to read the Command Register, we shift its content out via "EXT CYL ADDRESS".

The data makes its way out, goes through some controlled gates and gets a new name: "LO MAIN DATA H". At the same time, we also construct the serial clock "LO MAIN SHIFT", which is used to shift the serial data into Data Buffer 4.

Finally, the data makes its way into the Data Buffer Registers. It's clocked in and shifted through the Data Buffer 4 register. The 7495 shift register can be parallel or serial loaded; decided by the Mode Switch input. The output from Data Buffer 4 eventually makes its way back to the AC through the various muxes and gating logic.

Having spent a day and a half figuring all of this out, it was time to track the error down. Starting with the, I ensured that the serial clock was present and that data was being shifted out. In this case, the Command Register was empty so it was just a stream of zeros.
Moving on to Data Buffer 4, I started with the serial clock and serial data; both were present. Next, I checked the Mode Switch, and this is where I found the issues. "DB CONT 4(0) H" was at 2V; following it back, I found a JK flip-flop. All outputs for the flip-flop were at 2v; very clearly, it was broken. Replacing the flip-flop fixed the problem.
In summary, a bad input to the Data Buffer 4 was causing it to load data from the parallel input rather than its serial input, producing totally wrong results.