(none)
  

The University of Iowa's DEC PDP-8

Restoration Log — early 2026

Contents


Introduction

This is a chronological log of the progress restoring the University of Iowa's PDP-8 computer. Entries are added at the end as work progresses. Click on any thumbnail image to see full-sized image.


Jan 14, 2026, Memory tuning, set up for open house

Bug 64: In preparation for an open-house, we decided to start a serious attempt at tuning the memory. We began by investigating the behavior of the memory as we varied the slice voltage. For each slice voltage we tested, we stored 32 consecutive 00008 in memory starting at address 60008 and then examined memory to see how many values were still zero, and then we stored we stored 32 consecutive 77778 to see how many values were still all ones.

Slice V vs memory val.
Voltage  not 0000   not 7777 
7.7 32 0
7.68 19 0
7.62 17 0
7.6 13 0
7.56 0 0
7.5 0 13
7.54 0 13
7.4 0 15
7.1 0 32

The slice voltage was adjusted by turning the topmost trimmer on the G008 Master Slice Control board. In adjusting this and other Bourns TrimPot trimmers on DEC flip-chip modules, we have observed that the voltage is quantized, changeing in discrete steps as the trimmer screw is turned. We wonder if the trimmers are wire-wound with a contact brush touches one turn at a time.

The voltage readings here were eyeballed off of an analog meter, so the accuracy is probably 0.02V at best.

What is clear here is that the memory only just barely works. We were hoping to find a range of slice voltages that worked and then set the potentiometer to the middle of the working range.

The working range is probably a 3-dimensional volume, with the dimensions being

The next memory tuning exercise will involve playing with the other two dimensions.

With memory working as best we could adjust it, we loaded demo code in memory for the open house on Jan 20-22:

Some of the above were hand-relocated to run in new memory locations. All were tested and seemed to work.


Jan 22, 2026, Power supply wiring, Teletype failure

Before and after transformer rewiring
          thumbnail photo of transformer   thumbnail photo of transformer          
Bug 79: In gaps betwee visitors during our open house, there was time to begin rewiring the homebrew reader-punch power supply, following the plans developed on Nov. 17, 2025. We began with the power line input, replacing the uninsulated jumper connecting two primary windings with an insulated jumper, and replacing the line cord with wires to a terminal strip comparable to the strips used for input to DEC's power supplies. As we determined on Dec. 11, 2025, it should be safe to jumper this new terminal strip to the Type 779 Supply directly below it.

Eliminating the bare wire jumper on the transformer reduces the hazards posed by this power supply, but it would be nice to make a sheet metal cover over the transformer comparable to the transformer covers on the Type 779 transformers. This will require some sheet metal bending.

Bug 80: During a demo, after turning off the Teletype, when we turned it on again, the motor did not spin. It buzzed, and when you turned the fan, you could feel it vibrating. This implies that there is power to the motor. It is a capacitor start motor with a starting relay. Teletype's schematic FS-10 MOTORS documents this and several other motor options. Any of the following could cause the motor not to spin despite there being power to the motor:

We pulled the quick-connect connectors to the starting relay, allowing us to use an ohm-meter to verify that the primary motor windings is 9Ω and the starting winding is 16.5Ω ruling out a burnt-out motor winding. Measuring between the primary and starting widings, have 25.5Ω, so there are no shorts between the windings.

The Teletype motor start relay
    thumbnail photo of relay with case closed   thumbnail photo of relay with case open    
We opened the starting relay; the screw between the rightmost two quick-connect tabs in the left picture here both releases the relay from its bracket and allows removal of the case to expose the mechanism.

The relay is a normally open relay with an approximately 0.1Ω coil. During the motor's starting surge, the relay closes to power the starting winding. Once the motor is up to speed, the current through the primary motor winding is too low to hold the relay closed. Aside from evidence of contact arcing, the relay is in good condition. We burnished the contacts and put the relay back. We did not make any changes to the adjusting screw (the screw on the left of the right photo with a red dot of paint on it).

After reassembly, we used an ohm meter to verify that the start relay closes when power is briefly applied to the motor.

The above observations point to the motor start capacitor itself. Teletype's schematic identifies this as C3 88-108, which agrees with the markings on the capacitor, 88-108MFD. This is an 88-108μF capacitor, a very common value of motor start capacitor.


Jan 27, 2026, Teletype failure, power supply wiring

Bug 80: Continuing the diagnostic work from Jan 22, we used an analog ohm meter on the Rx1K scale to test the 88-108μF motor-start capacitor. It conducts very briefly when the meter leads are first connected and then drifts up to infinite resistance. That is how a capacitor ought to behave when measured this way. We compared it with a known good 5μF capacitor, and saw that the response on the ohm meter was far stronger with the latter than with the capacitor from the Teletype. Therefore, while the capacitor still has some capacity, it has much less than 5μF.

So, we ordered a replacement capacitor. The original capacitor was a 1" (26mm) diameter cylinder 2.5" (65mm) long. The smallest replacement we could find was 34mm by 69mm, 8mm larger in diameter. This will be a tight fit in the space in the Teletype. Also, we will need some 4.8mm (0.187") faston connectors to attach the capacitor to the wiring. Teletype corp. seems to have used that size exclusively, while the similar connectors in the PDP-8 are all the more common 1/4" wide.

Before and after transformer rewiring
        thumbnail photo of power supply   thumbnail photo of supply with new wires        
Bug 79: We continued the work started on Jan 22 adding insulated wire to the homebrew reader-punch power supply, following the redesign given on Nov. 17, 2025.

We had finished rewiring the transformer primary. Now, we rewired the secondary, moving the fuse to the bridge between the two secondary windings and finishing adding spiral-wrapped insulation to the remaining uninsulated wires.

We still need to install metal shields to protect fingers and make accidental shorts less likely. This is most important on the 120V primary side of the transformer, but would also be helpful on the 30V secondary side.


Feb 3, 2026, Gasket, memory tuning, Tally reader

Decayed foam
        thumbnail photo of debris on the floor under the rack        
Bug 11: We noticed (again) the decayed gasket on the rear plenum door of the I/O rack. We'd noted this before on Oct. 28, 2013. We took the time to scrape the foam out of the channel, making a mess with all the crumbs of decayed foam. A screwdriver with a tip 1/4" wide worked as a scraper, easily removing not only the bad foam, but also the adhesive backing, leaving only a little adhesive residue in the metal channel that held the foam.

Bug 64: We returned to the memory tuning problem last addressed on Jan. 14. We connected the current probe and began trying to adjust the inhibit and read-write (or select) currents. We found that the inhibit current was 0.28A, not the recommended 0.31A. We were able to bring it up to 0.295, but no higher.

We also found that the select current was also low. We were able to turn it up to 0.32A.

With these changes, we repeated the exercise we had done on Jan. 14, varying the slice voltage, and at each step, writing 16 consecutive words of 00008 and 16 consecutive words of 77778 to memory and reading them back. On Jan. 14, only one slice voltage worked, 7.56V. Our changes to the select and inhibit currents made a big difference:

We left the slice voltage set to 7.72V, roughly the middle of the good range.

Timing diagram
    thumbnail timing diagram of one read cycle    
Bug 34: Continuing from the work on July 1, 2025, we worked out a timing diagram for the top-level events in a read cycle to the Tally reader. The top two lines (voltage to the reader solenoid and the timing of the switching transient) are takn from Fig. 27 on page 33 of the Tape Reader Manual - Model 424, Tally Register Corporation, Seattle, no date (Revised 4-1-62).

The 16.7mS delay between initiation of a read cycle and the setting of the device flag allowing initiation of the next cycle is also from the Tally manual. The role of the RSF, RRB and RFC instructions and their relationship to the reader flag and the rest of the read cycle is from the description of the Type 750 High Speed Reader interface on pages 62-63 of the PDP-8 Users Handbook, Digital Equipment Corporation, F-85, 5/66, 1966.

From this timing diagram, we conclude that our speculation on July 1, 2025 that only 2 delays are required seems correct so long as the reader flag is only set after the full 16.7mS read cycle, at the earliest time that it is acceptable to start the next read cycle. Given that software should only take a few tens of microseconds to initiate the next read, this should not appreciably slow the reader. It would be possible, at the cost of considerable complexity, to read the input into the reader-data register and set the reader-ready flag at the end of the switching transient, 14mS into the read cycle. This would require an additional delay and an additional flipflop to allow the RFC to queue up starting a read cycle before 16.7mS have elapsed.


Feb 5, 2026, Replace Teletype starting capacitor

Old and new starting capacitors
    thumbnail photo of old capacitor close to motor fan   thumbnail photo of new capacitor closeer to spinning fan    
Bug 80: New-old-stock Teletype starting capacitors are available, but when we contacted people who had bought them, we found that a significant fraction have failed, suggesting that these parts are nearing the end of their useful lifetime. The old one is apparently made from a pair of back-to-back electrolytic capacitors, and the most likely problem they have with age is drying out.

So, we hunted for new parts. While 88-108μF capacitors are available, they tend to come in large packages. The smallest motor start capacitors we could find were CD60 100μF &plusminus; 15% rated at 250VAC. Among these, we found some with bodies 34mm diameter by 69mm or 70mm long with wire terminals comparable to the originals. Most modern motor starting capacitors are polyester film and not electrolytic capacitors, and we think this applies to the capacitor we bought.

Polyester film capacitors are generally larger than electrolytics, and in this case, the difference in size is enough that we were not certain that the new capacitor would fit. As can be seen in the photos here, the new capacitor just fits. We had to bend the hold-down finger that extends from the starting relay mounting bracket to make it fit, and there was just over 1mm clearance between the new capacitor and the fan on the back of the Teletype motor. Fortunately, the capacitor is tightly held and does not threaten to bounce into the fan, and as the photo shows, the fan spins freely and the Teletype works well.


Feb 12, 2026, Rack wiring, power supply check

Bug 16: Now that the homebrew reader-punch power supply works and our estimate of power demand made on Dec. 11, 2025 suggests that it will not overtax the PDP-8's rack wiring, we jumpered it to the line-line current terminal strip on the Type 779 power supply directly below it.

Bug 10: We have not powered up the Type 779 supply since Oct. 9, 2014 so we disconnected the fan in the base of the I/O rack and disconnected the wiring from the supply to the logic in the rack and then connected it to a variac so we could slowly raise the voltage.

The ferroresonant transformers in the Type 779 supply created a very nonlinear relationship between the output voltage and the setting on the variac. Under no load, the DC output voltages on the Type 779 supply approached their rated values at AC input voltages under 50 volts. Fortunately, the capacitors we had reformed a decade ago were in pretty good shape, and we saw no ill effects from raising the output voltage in 5V steps about an hour apart.

We paused periodically to check for leakage by looking at the rate of decay of the charged capacitors with no power input and no load. We were briefly alarmed to discover that the +10 output of the Type 779 supply was decaying rapidly, until we noticed that there is a 15Ω resistor shunting a 35,000μF capacitor to ground for that output. output to ground. This matches the Type 779 Power Supply schematic. The RC time constant for this capacitor is 35,000μF×15Ω  =  0.525s. By eyeball, watching the needle of an analog volt meter drop as we turned off the power, it fell most but not all of the way to zero in about a second, which is in the right order of magnitude for this RC time constant. We conclude, therefore, that the supply is good.

Note: Ferroresonant transformers are well known to hum louder than other transformers, and in our Type 779 supply, we noticed this hum, starting when the AC input was around 30V and getting louder as the AC input was ramped up to 120V.


Feb 19, 2026, Better Teletype demo, try BIN loader

Bug 43: With memory working better, we tried keying in a more ambitious program from the front panel. Of course, we made mistakes in the code and mistakes in the keying in. We debugged the code using a Linux-based assembler and PDP-8/E emulator before trying again. The following code worked:


           / Teletype demo (poorly optimized code)
           / Typing char echos and appends char to buffer except
           STX=    202             / Control B -- clear buffer
           ENQ=    205             / Control E -- replays buffer
           *4000
04000 7200         CLA
04001 1253         TAD     PBUF
04002 3260         DCA     INPTR   / bufptr = start
           LOOP,                   / loop -- outer loop of program
04003 6031 INPOLL, KSF             /    loop -- polling input
04004 5203         JMP     INPOLL  /    until -- key pressed
04005 6036         KRB
04006 3256         DCA     CHAR    /    char = character from tty
04007 1256         TAD     CHAR
04010 1254         TAD     NEGSTX
04011 7440         SZA             /    if char = STX
04012 5216         JMP     NOTSTX
04013 1253         TAD     PBUF
04014 3260         DCA     INPTR   /       bufptr = start
04015 5203         JMP     LOOP    /       continue
04016 7200 NOTSTX, CLA             /    endif
04017 1256         TAD     CHAR
04020 1255         TAD     NEGENQ
04021 7440         SZA             /    if char = ENQ
04022 5242         JMP     NOTENQ
04023 1253         TAD     PBUF
04024 3257         DCA     OUTPTR  /       outptr = start
04025 7200 OUTLP,  CLA             /       loop -- exit by break
04026 1260         TAD     INPTR
04027 7041         CMA IAC
04030 1257         TAD     OUTPTR  /          a = outptr-inptr
04031 7500         SMA             /          if a >= 0
04032 5203         JMP     LOOP    /             break
04033 7200         CLA
04034 1657         TAD I   OUTPTR
04035 6046         TLS             /          output *outptr
04036 6041 OUTPOL, TSF             /          loop
04037 5236         JMP     OUTPOL  /          until output done
04040 2257         ISZ     OUTPTR  /          outptr++
04041 5225         JMP     OUTLP   /       endloop
                                   /       continue outer loop
04042 7200 NOTENQ, CLA             /    endif
04043 1256         TAD     CHAR
04044 3660         DCA I   INPTR   /    *inptr = char
04045 2260         ISZ     INPTR   /    inptr++
04046 1256         TAD     CHAR
04047 6046         TLS             /    output char (echo it)
04050 6041 OUTPOM, TSF             /    loop
04051 5250         JMP     OUTPOM  /    until output done
04052 5203         JMP     LOOP    / forever
           
           / constants
04053 4061 PBUF,   BUF             / start of buffer
04054 7576 NEGSTX, -STX            / used to compare with stx
04055 7573 NEGENQ, -ENQ            / used to compare with enq
           
           / variables
04056 0000 CHAR,   .-.             / most recent input character
04057 0000 OUTPTR, .-.             / buf pointer to output buffer
04060 0000 INPTR,  .-.             / buf pointer fill buffer
04061 0000 BUF,    .-.             / start of data buffer

This is a far more satisfactory Teletype demo program than the smaller one we keyed in on Sept. 29, 2025 (that code was still in memory).

With this demo code working, we tried using the RIM loader to load the BIN loader. This seemed to work, but when we tried using the BIN loader to load ODT, the octal debugging tool, it did nothing. Obviously, we need to explore what went wrong. The paper tapes we used were marked as follows, on adhesive labels that fell off until we re-glued them:


Feb 19, 2026, Fix Teletype linefeed

The home-made wrench
          thumbnail photo of a wrench and a complex mechanism          
Bug 62: We made a thin 1/4" hex box wrench so that we could loosen (and retighten) the screws in the linefeed drive link. See the June 29, 2017 log entry for a discussion of this adjustment and the need for a thin box wrench. Our home-made wrench is made from a piece of 1/8" thick hot-rolled steel bar. We drilled 1/4" round holes the two ends, then drove center punch that had a nominal 1/4" hexagonal body completely through the holes. The resulting hexagonal holes were undersized, so we further enlarged the holes be driving a 1/4 inch screwdriver bit through the hole; the screwdriver end itself is irrelevant here, what matters is the 1/4" hexagonal back end of the bit. What remained was to file off the burrs from the holes and grind and then file the outside profile of the wrench.

With our wrench made, we were able to tighten the marginally loose screws in the drive-link. These had been slightly loosened at some point in the past while trying to adjust the drive link. We solved the actual linefeed problem by careful adjustment of the drive-link up stop.


Feb 26, 2026, Teletype printer drops bit 2

Bug 81: Trying the Teletype demo program, it stopped working. Specifically, when we typed ABCDEFG it echoed CBCFGFG. First, since we were using our demo program, we looked at the accumulator where each input character goes (until you type the next one). That was correct. So we made a table of what was typed and what was printed:

Teletype test
   Typed       Printed
A1000001C1000011
B1000010B1000010
C1000011C1000011
D1000100F1000110
E1000101G1000111
F1000110F1000110
G1000111G1000111

Teletype numbers bits from the least significant bit, bit number 1. In those terms, the problem is clear from the above table. Bit 2 is stuck at 1 in the receive mechanism in the Teletype.

Looking there, we found that the bit-2 blocking lever seems to hang in the up position. Why? We were unable to figure this out.


Mar 3, 2026, Fix Teletype

Bug 81: We had to remove the carriage-return dashpot from the Teletype (part number 181193) in order to get a better view of the 8 blocking levers (part numbers 180643 and 180644). With the dash pot out of the way, we could rock the blocking levers, pushing down on the tail of the lever with one probe and pushing down on the head with the other. Lever 1 rocked freely, but lever 2 was interfering with something.

When down, each blocking lever blocks a tooth on the corresponding code bar that represents one bit of data in the mechanical data bus that runs under the carriage and out to the paper-tape punch. (The code bar for bit 2 is part number 180933. The relationship between code bars and blocking levers is shown in the Maintenance Manual, Vol 2, page 39.) If the code bar motion was just shy of enough to allow the blocking lever to fall freely, this could explain the problem. The adjustment for that is documented in the Maintenance Manual, Vol. 2, page 36, and is really ugly, requiring removal of the motor. Fortunately, the manual also inicated a simple test for this problem, pressing back on the code bars. This test showed that this was not the problem.

The keyboard end of the blocking levers sits under the blocking-lever upstop (part number 180682), this blocked our view of that end of the levers, so we removed it. At this point, we were finally able to see that the tip of the blocking lever was rubbing in the slot in the comb that holds the levers in alignment. This comb is on the top of the left end of the front tie bracket (part number 180950),

The space in this comb for blocking lever 3 was a bit wider than the space for lever 2, so we hypothesized that the space for lever 2 was binding on the lever. The test was simple. We rested the tip of a probe on the left side of the comb tooth and gently bumped it with a finger. The goal was to bend the tooth just slightly. Amazingly, this worked!


Mar 5, 2026, Design Tally cable

Annotated Type 750 schematic
      thumbnail schematic with annotations      
Bug 34: In attempting to understand the schematic for the Type 750 controller we presented on July 1, 2025, we made numerous annotations. These included:

In cleaning up the wiring on the backplane, we found that the 30V power to the reader was delivered by 18AWG wires that snaked from the power supply around to wirewrap pins on the backplane, where they were soldered. This was ugly, at best. We decided that the best way to bring power to this interface would be through the Flip-Chip board serving as a cable connector to the reader. From there, backplane wiring can deliver power to the W043 (or W040) solenoid driver.

Modified W021 for cable
  thumbnail schematic of parts on a circuit board  
Tally reader cable
 
  thumbnail schematic of cable from board to connector  
Bug 12 and Bug 82: On June 13, 2014 we documented the cable that might have been intended for the Tally reader, and some of the problems with this cable and the way it might have been connected.

One obvious change we need to make is to move the pull-down resistors that are currently soldered to backplane pins somewhere else. The obvious place to move them is onto the cable connector. This move requires that -15V power be provided to the connector. Unfortunately, the W021 boards we have (DEC's go-to board for connecting cables to the backplane) does not provide connections to pins A or B, the +10 and -15 supply lines. We decided to use pin V for this purpose, as it is not currently connected.

A second problem is where to bring in the 30V power. Pins S and T are currently wired to run the tape-advance solenoid, pins R and U are grounded in the stock W021 board, leaving pin P as a candidate to carry the +30 supply. As wired by the psychology department, this was grounded at the W021 board, but this ground connection should really be as close to the solenoid drivers as possible. Therefore, we opted to put this connection on the unused pin P, between the grounded pins N and R. The -30 connecton will directly power one side of the solenoid, just as it did in the psych. department version.

Bug 12: After working out these details, we removed, salvaged and tested the 8 pull-down resistors from the backplane, cut 3 of the factory ground connections on a W021 board and soldered the ribbon cable in place. Our plan is to put 1/4" Faston tab connectors on the back corners of the board for power connections and to mount the resistors above and below the cable. Dec recommends putting a capacitor across the 30V power if the wire from the power supply is longer than 3 feet, so we will put this on the board as well.


Mar 12, 2026, Start building Tally cable

Modified W021 board
        thumbnail photo of the component side        
        thumbnail photo of the solder side        
Bug 12: We continued what we started on Mar. 5, working on the new cable to connect the Type 750 controller to the Tally paper tape reader.

We drilled out the rivets holding the cable strain relief and used them to attach 1/4" faston connectors to the two back corners of the board. DEC did the same thing on G850 motor driver boards. As on the G850, we used two rivets to hold each connector, with one also holding the cable strain relief and one to prevent the faston connector from pivoting.

The faston connectors on the G850 are both male, but this is an AC controller, where mis-connecting the power would cause no damage. Our application is for DC, so we used polarized connectors, one male and one female.

The dental dam tool
with a solder post
      thumbnail photo of an obscure tool and tiny solder post      
We installed solder-post pins on the otherwise unused sides of the W021B board in order to support point-to-point wiring to connect the pull-down resistors that we are moving from the backplane onto this board. The pins we got are tiny, about the size of a grain of rice and designed to be riveted into a 0.05" hole in the circuit board. By luck, we found a dental-school surplus dental-dam punch that worked perfectly to hold a solder post for insertion in the circuit board and flare the underside of the post to lock it in place. The photo here shows a post gently gripped in the jaws of the tool. The two limitations of this tool are that it can oly reach an inch or so from the edge of the circuit board, and it cannot place a post closer than about 0.14" from a neighboring post.

We used a brass strip to link the row of posts at the -15V end of the resistors. We had hoped to put in a row of 8 posts into this strip, but we drilled the holes too to use our dental tool to rivet the posts so we only used 4 posts. The posts rivet the brass strip in place, and we used through-hole mounting for the other 4 resistors.

We used the resistors we had unsoldered from backplane slot B32 on Mar. 5. For a photo of these resistors prior to salvage, see the log entry for July 1, 2025.

Bug 34 and Bug 82: We removed a number of wires from the Type 750C High Speed Paper Tape Reader interface part of the I/O backplane. Most of these wires were added by the Psychology department as part of their modificaiton of the intrface, insulation colors other than yellow. We also removed cut wires and wires with no obvious function, according to our annotated reverse engineering diagram given in the log entry for Feb. 25.

In the process, we found some errors in this diagram, and we learned some things:

With regard to the data inversion, The tape reader can produce either polarity of data, depending on how the cable connector is wired (See page 8 of the Tally 424 manual, which is page 39 in the Archive PDF). we hypothesize that the psychology department wired the cable incorrectly, discovered that all the data was inverted, and solved the problem by re-inverting the data at the flipflops instead of fixing the cable.

This leads us to a question: Do we keep Psychology's changes to the interface and build our new cable to match, or do we restore this part of the interface so it conforms to DEC's documentaiton and build the cable that Psychology ought to have made?


Mar 20, 2026, Continue building Tally cable

Modified W021 for cable
  thumbnail schematic of parts on a circuit board  
Tally reader cable
  thumbnail schematic of cable from board to connector  
Final modified W021 board
            thumbnail photo of the component side            
Bug 12: We decided to move the resistor-diode network out of the Tally reader onto the modified W021 board that terminates the cable to the reader. We documented this network on June. 2, 2014, and we had modified it on June. 24, 2025 to bring the Tally reader closer to Tally's documentation. When we disassembled this network to salvage the diode and resistor, we were finally able to read the markings on the diode and test it. The markings indicated that it was an early GE Z4XL22B silicon 22V Zener diode, and with an ohm meter, it tested bad — 2MΩ backward, 1MΩ forward, where we expect a silicon diode, Zener or not, to measure under 30Ω forward).

There is no clear reason to use a Zener diode where this diode was wired into the circuit, and a 22V Zener diode across an inductor driven at the rated 24V almost guarantees diode failure. We opted to replace this diode with a 1N4003 we had on hand. This makes sense in this context.

Moving the resistor and diode onto the cable connector makes the Tally reader more closely conform to the schematics given on page 8 of the Tally 424 manual, which is page 39 in the Archive PDF. Exact conformity is not possible because our reader does not have a coil on its reverse solenoid. Placing the pull-down resistors and snubber circuitry on the modified W021 board is in the spirit of what DEC did with their W070 Teletype Connector board.

There was just space along the lower margin of our W021 board to mount these parts, using 3 new solder posts to support them. The photo here shows the result.


Mar 24, 2026, CPU testing, memory problems?

Bug 43: On Feb 19 we had tried to run the BIN loader and it failed to load a program. One thing we know about BIN is that is uses subroutine calls, and the PDP-8 JMS instruction is one of the more complex instructions on the machine. We wondered if there might be a problem with JMS, so we wrote a small diagnostic and keyed it in:


           *0100                   / worked in page 0
           *0300                   / could not load in page 1!!!
           *0500                   / worked in page 2
00500 7200 START,  CLA
00501 7421         MQL             / start at zero iterations
00502 7200 LOOP,   CLA
00503 1322         TAD     WHLT
00504 3307         DCA     T       / setup for stop 2
00505 4307         JMS     T
00506 7402 RET,    HLT             / stop 1 if JMS doesn't jump
00507 0000 T,      .-.             / stop 2 if JMS goes to T, not T+1
00510 7440         SZA
00511 7402         HLT             / stop 3 if JMS changed AC
00512 1307         TAD     T
00513 1323         TAD     NRET    / check return addr
00514 7440         SZA
00515 7402         HLT             / stop 4 if wrong return addr
00516 7501         MQA             / count iterations to
00517 7001         IAC             /   differentiate intermittent
00520 7421         MQL             /   and solid failures
00521 5302         JMP     LOOP
00522 7402 WHLT,   HLT             / halt instr used for stop 2
00523 7272 NRET,   -RET            / compare this with return address
           $

As indicated in the comments, this code worked when keyed in starting at 01008, which is the middle of page 0. The program does not use JMS to call a subroutine, instead, it checks to see that JMS does everything advertised, halting if JMS does not jump, tries to execute the destination location, alters the accumulator, or fails to store the correct return address. It uses the MQ register to count iterations in order to help identify intermittent failures. This program ran for several minutes, making us fairly sure that JMS worked with page 0 addressing mode.

When we reassembled it and keyed it in starting at 03008, the middle of page 1, it did not work, and on investigation, we found that it was not even in memory in page 1. We had hoped to use this test to see if JMS worked when using current-page addressing.

When we reassembled it and keyed it in starting at 05008, the middle of page 2, it worked as well as it had in page 0, verifying that JMS works correctly with current-page addressing.

Bug 64: This leads us to hypothesize that the problem is in memory. Do we have a problem using odd-numbered pages? That would certainly make it difficult to load large programs. We need to investigat this.


Mar 26, 2026, Finish Tally cable

Bug 12: We began work on the paper tape reader end of the cable. According to the Tape Reader Manual - Model 424, Tally Register Corporation, Seattle, no date (Revised 4-1-62), page 6, the tape reader has a Continental #250-34-16PDSP 34-pin plug. We verified this, and we found that compatable connectors are available from numerous manufacturers, primarily because they are used for ITU V.35 modems. These connectors are expensive, but we found an old cable in a junk bin and salvaged the contacts, shell and connector body. The one we found was a Positronic GMCT34F that we empirically verified could mate with the connector on the Tally reader.

Connector parts
      thumbnail photo of the connector shell, wires, pins and body      
This connector has removable contacts that snap into the connector body and can be removed with a special tool (a thin-wall tube that slips into the space between the contact and the plug body). The contacts we salvaged were crimped to the wires, but using a small file to notch the side of each contact, we converted it to a solder-cup contact while removing the old wire.

Before starting work, we slipped a piece of heat-shrink tubing over the ribbon cable and power cable, and slipped the connector shell over that. We then soldered the contacts to the wires in the ribbon cable, one contact per wire, one contact for each pair of wires carrying power to the tape-advance solenoid in the reader, 8 contacts jumpered together for the 4 ground wires in the cable, and 1 contact on each of the 2 120VAC wires for the motor. All of this was done before any contacts were inserted in the connector block. The result resembled an explosion of gold-plated contacts at the end of the cable, as shown in the first photo.

Connector assembly
      thumbnail photo of the pins partly inserted in the body      
Only after all contacts were soldered did we double-check the schematics on page 8 of the tally manual and our cable drawings presented in the log entry for Mar. 20 to be sure we pushed each contact into the right hole in the connector body. The second photo shows all but the 2 AC power contacts inserted in the body. The data contacts are all fully inserted, while the column of ground contacts and the two solenoid contacts have not been pressed in all the way. Fully inserted female contacts are fully enclosed by the connector body, which extends far enough to also enclose a bit of the insulation on the wire soldered to the contact. There is a special tool for contact insertion, but we used a jeweler's screwdriver for this. Once fully inserted, the contacts lock in place and can only be removed with a special tool.

Connector in place
      thumbnail photo of the connector plugged into the reader      
With the cable fully assembled, we connected it between the Tally reader and backplane slot B32 in the Type 750 tape-reader controller. Once plugged in, we verified the data connections by hand-feeding tape through the reader and observing that the correct signals showed up on the backplane as we advanced the tape.

Bug 13: The remaining job is to rewire the controller and wire a 120VAC power connection for our cable.


Mar 31, 2026, Power wiring, memory problems

Bug 13 and Bug 16: We added wiring to bring line power to the cable for the Tally 424 paper-tape reader that we finished on Mar 26. DEC used red-white twisted pair for 120V power distribution, so used the same. The addition was about a foot long, from a Jones plug that mates with the cable from the reader to the terminal strip at the back of the I/O rack.

Bug 64: On Mar 24 we observed that we had found half a page (64 words) of memory that did not work, starting at address 03008, the middle of page 1.

We wrote the following memory diagnostic program:


           / Little memory tester, tests all but low page 0
           / tests each location with 4096 possible values
           / does not disturb existing memory contents
           / show bad addresses in MQ.
           / if SR==0, tests just one word then halts
           / continue from halt picks up at next word
           *0020
00020 7200 START,  CLA             / forever do
00021 1056         TAD     MSTART
00022 3053         DCA     MLOC    /   mloc = mstart
00023 7421         MQL             /   MQ = 0
           NEXT,                   /   for most of memory -- AC == 0
00024 1453         TAD I   MLOC    /     -- save value for later
00025 3054         DCA     MSAVE   /     msave = *mloc
00026 3055         DCA     MVAL    /     mval = 0
           RETEST,                 /     for all values -- AC == 0
00027 1055         TAD     MVAL
00030 3453         DCA I   MLOC    /       *mloc = mval
00031 1453         TAD I   MLOC
00032 7041         CMA IAC
00033 1055         TAD     MVAL
00034 7450         SNA
00035 5041         JMP     OK      /       if *mloc != mval
00036 7200         CLA
00037 1053         TAD     MLOC
00040 7421         MQL             /         MQ = mloc -- show addr
           OK,                     /       endif -- AC == 0
00041 2055         ISZ     MVAL    /       mval++
00042 5027         JMP     RETEST  /     endloop
00043 1054         TAD     MSAVE   /     -- restore original value
00044 3453         DCA I   MLOC    /     *mloc = msave
00045 7404         OSR
00046 7650         SNA CLA
00047 7402         HLT             /     if SR==0 halt -- AC == 0
00050 2053         ISZ     MLOC
00051 5024         JMP     NEXT    /   until end of memory -- AC == 0
00052 5020         JMP     START   / forever
00053 0000 MLOC,   .-.             / addr being tested
00054 0000 MSAVE,  .-.             / save value that was in *mloc
00055 0000 MVAL,   .-.             / value used for testing
00056 0057 MSTART, .+1
           $

When we ran this diagnostic, it showed 16 half-page (64 word) blocks of memory that were defective. Defective addresses had the form These addresses all involve bits 3-5 of the memory address (remember that the 12 bits in a PDP-8 word are numbered starting at the left).

We reviewed the documentation for the PDP-8 memory address decoding, and found Drawing BS-D-8M-0-12 in the PDP-8 Maintenance Manual, F87, Digital Equipment Corp., 1966. This drawing shows that bits 3 to 5 of the memory address are decoded by four G209 memory select drivers in backplane slots MD6 through MD9.

Before looking at any details of how the memory select drivers work, we tried an experiment, swapping the driver in slot MD6 with that in MD8, and swapping MD7 and MD9. Before this swap, the problem addresses were of the form x3xx8 or x6xx8. After the swap, the problems moved to x2xx8 or x7xx8.

This experiment convinces us that the problem is in one of these 4 boards and not in the core memory itself. This is good news. Repairing a problem in the core array would be very hard, while repairing boards is fairly simple, once the problem is isolated.

To further isolate the problem, we tried switching the boards in MD6 and MD7. This broke our diagnostic! Hand testing using the front-panel switches showed that the problem had moved to the memory addresses where we had our code. We immediately swapped the boards back, but it seems that we will have to re-load our code before continuing. We quit for the day at this point, being fairly sure that the problem board is one of the two in slots MD6 and MD7. The obvious next experiment will be to switch MD7 with MD8. If that moves the problem, we can be fairly sure that the problem is in the board currently in MD7.


Apr 7, 2026, Tape Winder, memory problems

The tape winder
      thumbnail image of a Fairchild/Bunell tape winder      
Bug 83: When we acquired our BRPE high-speed paper-tape punch from Jackson Typesetting, they threw in a Fairchild paper-tape winder The winder was in working condition, but on closer examination, we noticed that a wire protruding from the housing had been cut off. Fairchild's "Teletypesetter Bulletin 57B, Parts for Tape Winders describes the cut-off wire as the stop arm (labeled 10 in their drawing). This arm controls the winder. If the tape is slack, it unblocks the governor, allwing the wind-up-spring motor to run until enough tape has been wound to take up the slack. We guess that the stop arm stuck out far enough that it interfered with packing the winder for shipping.

The cut-off stub of the arm is made of 3/32" steel music wire, evidently welded to its pivot. There is space in the winder housing for a splice 3/4" long and 3/8" in diameter to mate a new arm to the cut off stub.

Bug 84: The other problem we noted with the tape winder was that the take-up reel only holds 7/8" 6-bit tape. While our winder has a plaque indicating that it was sold by Fairchild, a quick examination of the bottom of the third page of the J. H. Bunnell & Co. catalog shows that this winder is identical to the Bunnell Type 3-1 winder, and that our reel is what the 4th page of the Bunnell catalog calls a ball-lock reel. Bunnell made this reel for many different tape widths, including the 1" width used for the 8-bit tape used by our PDP-8.

Bug 85: We have only a limited supply of Teletype paper. New-old-stock paper is becoming increasingly difficult to obtain, but the web site qrpbuilder.com suggests using 8.5" glossy headrest paper (antimacassar paper). This paper is used to line the headrests of medical exam tables, and as the University of Iowa has a huge hospital, it should be stocked on campus.

Headrest paper comes on 225' rolls and the primary incompatability with Teletype paper is that the paper roll support on a Teletype is designed for a core tube with a 1" inside diameter, while headrest paper is wrapped on cores with a 1.5" inside diameter. The qrpbuilder web site suggests using an adapter made from PVC plumbing pipe to make the headrest paper unroll cleanly. We will need to make one.

Bug 64 and Bug 67: Continuing the work from Mar. 31 We note that the G209 boards in slot MD6 to MD9 have handwritten numbers on them, 6, 7, 8 and 9. we mounted the suspect G209 memory board on an extender card so that we could look at it. We note that we replaced a number of bad diodes on these boards on Feb. 13, 2025, and the board numbered 9 has an unusually large number of replaced diodes. Looking at this board with a scope while our memory diagonstic was running showed irregularities that suggest that we still have unacceptable noise that shows up primarily when the diagnostic is failing. We did not complete a useful series of measurements, so we will have to pick up this later.


Apr 14, 2026, Tape Winder

Repair underway and completed
      thumbnail image of winder open with splice and new wire       thumbnail image of repaired winder with wire bent to shape      
Bug 83: As noted in our survey of the condition of the pwper-tape winder on Apr 7, the cut-off stub of the control arm is made of 3/32" steel music wire. We got a length of new wire and fabricated a 3/4" long splice from steel rod. In order to make the splice fit inside the tape-winder case over the entire range of control arm motion, we had to cut off a bit more of the stub of the conntrol arm.

Music wire is both hard to bend and hard to cut, as it is tempered spring steel. We made the necessary cuts with an abrasive cut-off disk in a motor tool. In the case of the first cut, to the stub of the cut off control arm, the cut was inside the housing of the mechanism. Cutting steel with an abrasive disk, sparks fly, and among them are pieces of abrasive. We did not want to get abrasive in the mechanism, so we packed the area around our cut with paper towel before cutting.

After we made the cut, we assembled the case and then made two wide-radius bends in the wire, basing our bends on the drawing in "Teletypesetter Bulletin 57B, Parts for Tape Winders and on images from the web such as the Bunnel Winder in the Smithsonian, item 332416.

Only after making the bends did we cut off the excess length of our new control arm.


Apr 16, 2026, Memory problems solved?

Bug 64 and Bug 67: Continuing the work from Apr 7, we modified the diagnostic we'd written on Mar. 31 so that MSTART (location 00568) is 77008. This change makes our diagnostic run continuously over the final 64 words of memory. As of the end of our work on Mar 31, addresses of the form x2xx8 and x7xx8 were not working and we strongly suspected that the problem was in the board hand-numbered 9 in slot MD7. With this change to our diagnostic, it was constantly probing failed locations and not testing good ones.

With our diagnostic running, we began using our oscilloscope to measure the signals on the board in slot MD9. We had begun these measurements with poor results until we realized that we had serous scope grounding problems. During these poor measurements, our suspicion grew that Q5 was producing a corrupted signal. So, we hooked channel A of our scope (properly grounded) to the base of Q5 and used challel B to measure the signals leading there. Q5 is the inverting amplifier in a diode-transistor logic gate, so the natural places to test were the inputs to the diodes leading to Q5.

Whenever we tested D19, one of those diodes, the problem went away. Testing D18 and D20, two other inputs to Q5, had no effect. Our scope probes have spring-hook tips, and we were made each measurement by stopping the diagnostic, powering down the machine, hooking the probe in place, powering up the machine and restarting the diagnostic.

Cold solder joints
      thumbnail image of close up of two cold solder joints on a circuit board      
The obvious hypothesis was that the tension the probe was applying to the the diode lead was fixing the probem, so we pulled the G209 board and inspected that solder joint. It was a classic cold solder joint, a doughnut of shiny solder surrounding the wire lead but not wetting the lead. We had replaced D19 on Feb. 13, 2025, along with several others, and that effort was largely done by students who were learning to solder. The mediocre close-up photo here shows two cold solder joints. The one in the top center is the first we found.

Re-soldering D19 fixed the problem. When we restored our memory diagnostic to make it test all of memory, addresses of the form x2xx8 still failed, but those of the form x7xx8 worked perfectly.

There was no guarantee that the remaining problem was on the same board, so we did a board swapping experiment:

slot number bad addresses
MD6 MD7 MD8 MD9
board
number
8 9 6 7 x2xx
8 6 9 7 x4xx
8 7 9 6 x4xx

This test conclusively shows that our remaining problem is with the board numbered 9. We pulled this board again and began carefully measuiring the continuity of the solder joints to our replaced diodes. What we found was that the top solder joint to D49 was not connected. This solder joint looked good, but when we looked carefully at the photo shown above, we could see that the joint in the center left looked looked suspicious. Re-melting this joint fixed the problem.

With this job done, we ran our diagnostic and it ran continuously with no error reports.


Apr 21, 2026, Teletype paper, running ODT

Teletype and headrest paper
      thumbnail image comparing paper rolls and their supports      
Bug 85: On Apr 7, we ordered a roll of "chiropractic headrest paper" and while we awaited delivery, we built an adapter to fit the 1.5" core of the headrest paper roll to the Teletype's smaller diameter paper roll support tube. The roll arrived, and the photo here shows our roll of original Teletype paper behind the roll of headrest paper, with the adapter and red support tube partially inserted in the core of the headrest paper roll.

We used the same kind of 1" PVC drain pipe that qrpbuilder.com used, but instead of wrapping tape around the ends of pipe to make it fit the paper roll, we used 1" long segments of the same pipe, slit and expanded to fit as collars around the ends of our adapter and glued in place with PVC solvent adhesive.

Headrest paper in use
      thumbnail image showing headrest paper in the Teletype      
The paper we got was a bit narrower than the Teletype paper, but easily wide enough to hold a full line of print. The biggest differencde is that it is quite thin. Teletype paper is essentially newsprint, while the headrest paper is a glossy hard-surfaced tissue paper. Feeding it into the Teletype was difficult. It crumpled very easily. However, once the new paper was properly in place, it works very well. Over the course of the day, we used up several feet of the new paper. The Teletype print is quite legible, line-feeds pull the paper in cleanly. Our one complaint about the new paper is that it does not tear off well against the sharpened edge of the plexiglass window over the typing mechanism. The ragged tear shown in the photo is typical.

Bug 43: With the apparent resolution of our memory problems (Bug 64) on Apr 16, we noted that our memory diagnostic from Mar 31 had a problem: It only gives feedback about what it is doing when it finds an error. There is no way to monitor its successful execution. The code was still in memory, so we patched it.

Our original code would test the switch register after testing each memory location and halt at location 00478 if the switch register was zero. Continuing from this halt would continue the test. We replaced this halt with a jump to a block of code that put the address just tested into the accumulator before halting. Here is the patch, in assembly format:


           / Patch to memory tester
           *0047
00047 5057         JMP     PATCH   / replaces the halt
           RESUME,                 / return from patch here
           *0053
           MLOC,                   / address being tested
           *0056
00056 0063 MSTART, THEEND
00057 1053 PATCH,  TAD     MLOC    / AC = mloc -- AC was 0
00060 7402         HLT             / halt with mloc in AC
00061 7200         CLA             / -- AC back to 0
00062 5050         JMP     RESUME  / return from patch
           THEEND,
           $

We worked from paper in front of the console as we built the above patch, but here it is, integrated into the original code with better comments:


           / Little memory tester, tests all but low page 0
           / tests each location with 4096 possible values
           / does not disturb existing memory contents
           / show bad addresses in MQ.
           / if SR==0, tests just one word then halts
           / displaying the address most recently tested
           / continue from halt picks up at next word
           *0020
00020 7200 START,  CLA             / forever do
00021 1056         TAD     MSTART
00022 3053         DCA     MLOC    /   mloc = mstart
00023 7421         MQL             /   MQ = 0
           NEXT,                   /   for most of memory -- AC == 0
00024 1453         TAD I   MLOC    /     -- save value for later
00025 3054         DCA     MSAVE   /     msave = *mloc
00026 3055         DCA     MVAL    /     mval = 0
           RETEST,                 /     for all values -- AC == 0
00027 1055         TAD     MVAL
00030 3453         DCA I   MLOC    /       *mloc = mval
00031 1453         TAD I   MLOC
00032 7041         CMA IAC
00033 1055         TAD     MVAL
00034 7450         SNA
00035 5041         JMP     OK      /       if *mloc != mval
00036 7200         CLA
00037 1053         TAD     MLOC
00040 7421         MQL             /         MQ = mloc -- show addr
           OK,                     /       endif -- AC == 0
00041 2055         ISZ     MVAL    /       mval++
00042 5027         JMP     RETEST  /     endloop
00043 1054         TAD     MSAVE   /     -- restore original value
00044 3453         DCA I   MLOC    /     *mloc = msave
00045 7404         OSR
00046 7650         SNA CLA
00047 7402         JMP     PATCH   /     if SR==0 go show mloc -- AC == 0
           RESUME,
00050 2053         ISZ     MLOC
00051 5024         JMP     NEXT    /   until end of memory -- AC == 0
00052 5020         JMP     START   / forever
00053 0000 MLOC,   .-.             / addr being tested
00054 0000 MSAVE,  .-.             / save value that was in *mloc
00055 0000 MVAL,   .-.             / value used for testing
00056 0063 MSTART, THEEND
	   PATCH,                  / -- AC == 0
00057 1053         TAD     MLOC
00060 7402         HLT             / halt with mloc in AC
00061 7200         CLA             / -- AC back to 0
00062 5050         JMP     RESUME  / return from patch
           THEEND,
           $

With this code in place, we ran a total of 3 test cycles through all of memory with no error reports.

Having done this, we loaded the RIM loader (the Read-In Mode loader) throught the front panel switches. We used the version of RIM shown in Table 8-3 on page 8-7 of the PDP-8 Maintenance Manual, F87, Digital Equipment Corp., 1966. RIM load tapes are inefficient but easy to load, with each 12-bit load value preceeded by a 12-bit address, and each 12-bit value represented as 2 consecutive characters punched on tape.

We then used RIM to load the BIN loader from the Teletype, using a DEC paper tape from early 1967. BIN accepts a more compact binary data representation, with addresses included for each assembly origin followed by arbitrarily long data blocks. 12-bit values are still recorded as 2 consecutive characters, but load times (and tape lengths) are almost halved compared to BIN tapes. We then used BIN to load a 1967 BIN tape of ODT (the Octal Debugging Tool). The tapes we used were marked as follows:

The high-memory version of BIN in address 70008. When we started ODT, it output a CR-LF to the Teletype, but we had difficulty getting it to do anything but output question marks in response to our input. It turns out that we were using the wrong manual.

An ODT session
      thumbnail image of Teletypt output for long ODT session      
Searching the Internet Archive, we eventually found the right manual: DEC-08-COPCO-D ODT-8, dated Oct. 10, 1968. With this version, we were able to examine the code of our memory diagnostic in memory and punch it out onto paper tape in BIN format, but we had problems. The attached photo shows the Teletype transcript of our extended session with ODT.

In the transcript shown, we only used three ODT commands, the forward slash, carriage return (CR), and linefeed (LF).

forward slash, /
Entering an octal number followed by a slash causes ODT to print that the contents of that memory location and then await a replacement value, CR or LF.
farriage return, CR
Teminate command
linefeed, LF
Terminate command, output the next consecutive address, a space, a slash, and the value and then behave as if the user had typed the slash command.

The first part of the listing shown here was produced by a sequence of linefeed commands stepping through and examining the memory diagnostic after using BIN to punch it to tape. Two words seemed to be misread (or mispunched), so we used ODT to correct them.

The middle part of the listing shows use of ODT to zero out part of our diagnostic. We then reloaded the diagnostic from paper tape and tried to examine it. At this point things went funny. The problematic part of our ODT session is transcribed below:

0044/3013 3453
0001 /3000
0002 /3210
0003 /1213
0010 /2013
0011 /1020
0013 /0023
0010 /0000

To produce the above, we typed 0044/ to examine location 00448. The value 30138 was wrong, so we typed 3453 followed by 7 linefeeds to examine the next 7 consecutive locations. The addresses shown should have been consecutive, but instead, the sequence is 00448, 00018, 00028, 00038, 00108, 00118, 00138 and 00108. We do not understand what is wrong. Is there a CPU problem? Has the Teletype paper-tape reader misread some of our BIN tapes?


Apr 23, 2026, Test autoincrement addressing

Bug 43: We ended work on Apr 21 concluding that something was wrong but unsure what. One possibility is a problem in the CPU. The one large area of CPU behavior we have not explored carefully is autoincrement addressing. So, we wrote a little diagnostic:


           / diagnostic to test tad autoincrement addressing
           / display failures in MQ

           /TEST=  0010    / autoinc location from 0010 to 0017
           TEST=   0017    / (comment out one or the other)
           *0100
00100 7300         CLA CLL
00101 7421         MQL             / display = 0
00102 3017         DCA     TEST    / test = 0
00103 3123         DCA     TARGET  / target = 0
           LOOP,                   / for (;;) { -- assert AC == 0
00104 2123         ISZ     TARGET
00105 7000         NOP             /   target++
00106 1417         TAD I   TEST    /   test++
00107 7200         CLA             /   -- ignore the value loaded
00110 1017         TAD     TEST    /   -- see if test==target
00111 7041         CMA IAC
00112 1123         TAD     TARGET
00113 7450         SNA             /   if (test == target)
00114 5104         JMP     LOOP    /     continue -- assert AC == 0
00115 7200         CLA
00116 1123         TAD     TARGET
00117 7421         MQL             /   display = target
00120 1123         TAD     TARGET
00121 3017         DCA     TEST    /   test = target -- fix the error
00122 5104         JMP     LOOP    / } -- assert AC == 0
00123 0000 TARGET, .-.     / value we expect in TEST

We ran this diagnostic testing both the first and last autoincrement locations, addresses 00108 and 00178 and it ran continuously, auto-incrementing through all 4096 memory addresses as it read them using the TAD instruction. We let the program run for over a minute before we stopped it.

We then set out to write a similar diagnostic that used DCA. The code for that proved to be more difficult to write since we need to avoid damaging the program itself and we need deal with autoincrment stores to the autoincrement location itself. This is a fun programming problem that we did not complete.


Apr 28, 2026, Test rotate instructions

Bug 43: We ended work on Apr 23 knowing that some rare instruction was not working. Having ruled out autoincrement addressing, we noticed that all of our testing of shift instructions used one-place shifts. We looked at drawing RS-D-R210 PDP-8 Accumulator, which describes R210 board. This is a 1-bit wide slice of the accumulator and arithmetic-logic unit. On this board, the data path for the 1-bit and 2-bit shifts are different.

This led us to write a little diagnostic that compares the RTR (rotate 2 places right) instruction with 2 iterations of the RAR instruction (rotate 1 place right).


           / RTR diagnostic (doesn't check link bit)
           / bad bits of AC are indicated by the MQ display

           *200
           START,
00200 7200         CLA
00201 7421         MQL             / MQ = 0
           LOOP,                   / forever {
00202 2220         ISZ     VALUE   /   value++ -- all possible values
00203 7300         CLA CLL	   /   -- clear link before shifting
00204 1220         TAD     VALUE
00205 7012         RTR
00206 3221         DCA     TESTIT  /   testit = value >> 2
00207 7300         CLA CLL	   /   -- clear link before shifting
00210 1220         TAD     VALUE
00211 7010         RAR
00212 7010         RAR             /   AC = (value >> 1) >> 1
00213 7041         CMA IAC
00214 1221         TAD     TESTIT
00215 7440         SZA
00216 7421         MQL             /   if (testit != AC) MQ = testit - ac
00217 5202         JMP     LOOP
00220 0000 VALUE,  .-.
00221 0000 TESTIT, .-.

As indicated in the comments, this code only checks the 12 bits of the accumulator, it does not check that the RTR instruction leaves the correct value in the carry bit. In our original code, we forgot to set the link bit to a predetermined value before shifting. After we found that error, we ran the code and saw the following displayed on the MQ lights:

001000000000

This indicates that we were unable to shift the correct value into bit 2 of the accumulator. DEC's drawing BS-D-8P Accumulator and Link shows that the R210 board in backplane slots PA9 and PB9 holds bit 2 of the accumulator, so we exchanged this board with its neighbor in slots PA10 and PB10 to see if this moved the problem. It did, our output was now

000100000000

In more detail, note that the value shown is

(value >> 2) - ((value >> 1) >> 1)

Assuming that one-place shifts work, a value shuch as 001002 therefore means that a bit was loaded with a one when it should have been zero, which is to say, the reset input to one of the fliplfops in the accumulator did not work when it should, or the set input worked when it should not. A value such as 111002 would indicate the opposite.

The R210 board, front and back
      thumbnail image of the component side of a complex circuit board   thumbnail image of the solder side of a complex circuit board      
Bug 86: The above experiment makes it clear that our problem is in that particular board. Relating the board to the schematic was difficult, so we took photos to use as starting points for a reverse engineering effort. We are not the only ones to undertake reverse engineering work on this board. The so-much-stuff.com web site contains the results of reverse engineering efforts for most of DEC's R-series boards. Unfortunately for our purposes, these are presented in the form of Eagle CAD files, and PDFs of Eagle graphics. If we were setting out to make clones of DEC's boards, this would be a good starting point, but unfortunately, the R210 board is so complex that the CAD drawings boards, but for the very complex boards, the CAD drawing of the board layout is all but unreadable.

We spent some time searching the board with an ohm meter and jeweler's loup and failed to find any problems. This double-high board has more that 120 diodes, 50 resistors, 20 capacitors and 10 transistors, and some of the components are so tightly packed that it is difficult to probe the component leads with an ohm meter.


Apr 30, 2026, Reverse engineer and study R210 board

The R210 reverse engineered
      map relating hundreds of parts on the R210 to their schematic labels      
Bug 86: Having identified the R210 board as the cause of our problem with the RTR instruiction, we spent a day reverse engineering the board from photographs of the board and the schematic given in DEC's drawing RS-D-R210 PDP-8 Accumulator, and the CAD drawing of the board layout from so-much-stuff.com.

The parts of the CAD drawings that we could read made our work much simpler, but we did find one error in that work. The parts shown in the CAD drawings as R67 and R68 are diodes on our board, not resistors, and they are labeled as D52 and D75 in DEC's schematic.

We began testing the problem R210 board with our RTR diagnostic from Apr. 28 running. We generally stopped the program and powered down the machine whenever we moved a scope probe from one point to another. Also, to verify that we were still looking at the correct circuit board, we swapped the R210 board in backplane slots PA10 and PB10 with the board in slots PA11 and PB11. Before the swap, the output was

000100000000

After the swap, the output was

000010000000

We used a Douglas Electronics clone of a W984 module extender to mount the problem R210 board in its backplane slot and connected channel A of our oscilloscope to the RTR input to this board. This input is pulsed each time the RTR instruction is executed. The most convenient place to clip a scope probe to measure this signal is the anode of D14, the diode that clamps this input to prevent it from going positive.

When the computer is running but not using RTR instructions, the RTR signal sits between -3.5V and 3.7V with scattered noise spikes that occasionally reach -3.3V or 3.9V. When we ran our dagnostic from Apr 28, each RTR instruction triggered a positive pulse with a peak between -0.3V and 0.1V, with a pulse width of just over 100ns at -1V. We left channel A showing this pulse for all of our oscilloscope measurements, and all of our measurements show the same 7μs time interval.

The RTR pulse is an input to 2 diode-capacitor-diode gates (DCD gates) that are used to multiplex the inputs to the accmulator. DCD gates are a unique feature of DEC's discrete-component flip-chip logic, covered by US Patent 3334249 applied for in 1965 and granted in 1967.

Cathode of D13
  thumbnail oscilloscope trace showing a strong center peak and a weak peak on the right  
Cathode of D106
  thumbnail oscilloscope trace showing a strong center peak and a weak peak on the left  
One DCD gate takes its input through D13, the other through D106, so we used channel B of the scope to examine the cathodes of these two diodes. We expected to see the RTR pulse strongly coupled through this diode, and it was, with three notable changes:

IT took us a moment to understand the additional peaks. These DCD gates are used to set and reset the flipflop holding one bit of the accumulator. There are similar gates for each input to the accumulator, and if one of the other DCD gates clears the accumulator, that clear pulse will be coupled In our diagnostic, each RTR instruction is immediately preceeded by a TAD instruction that will set each bit of the accumulator half of the time. The set pulse, if needed, occurs about 2.25μs before the RTR pulse. Similarly, the following instruction is a DCA that will clear the bit half of the time. The clear pulse, if needed, occurs about 2.25μs after the RTR pulse.

Cathode of D17
  thumbnail oscilloscope trace showing a strong center peak interrupting a long negative pulse  
Cathode of D109
  thumbnail oscilloscope trace showing a strong center peak interrupting a long positive pulse  
Each DCD gate has a second input, the value to load into this bit of the accumulator when the RTR pulse arrives. We measured these signals at the cathodes of D17 and D109. The forward voltage drop of these diodes brings the nominal 0V and -3V logic levels down approximately 0.7V. Assuming that the flipflop providing these signals is working, they should always be complementary, so when one is high (we measured -0.7V), the other is low (we measured -4.1V).

Prior to the preceeding TAD instruction, the data is 0. Then a 0 or a 1 is loaded. 2.25μs later, the RTR pulse is coupled through the capacitor in the DCD gate. If the signal was low, this produces a positive pulse up to about -2.5V. If the signal was high, a positive pulse up to about +0.7V occurs. This same activity occurs at all the flipflops in the accumulator, loading a new bit into all of them, so after this pulse, 50% of the time, signal will switch from high to low or low to high.

A close look at the central pulses measured on D17 and D109 shows nothing suspicious. The diode-capacitor part of these two gates seems to be working correctly. When we were taking all of our other measurements, our diagnostic held the MQ register constant at

000010000000

Whenever we connected a scope probe to D109, however, the diagnostic output changed to

111110000000

Something is wrong. D109 is on the set side of the flipflop, so the output with no probe indicates that the RTR pulse always sets, but with the slight load of the scope probe, the RTR pulse never sets.

We also checked final diodes in the DCD gates, D25 and D108. These multiplex the outputs of the DCD gates onto the set and clear inputs of the flipflop through two more diodes, D52 (clear) and D75 (set). The latter diodes were in sufficiently uncluttered locations that we could attach our scope probes to them, while D25 and D108 were in more crowded parts of the board.

Anode of D52
  thumbnail oscilloscope trace showing a strong center peak followeed by a smaller pulse  
Anode of D75
  thumbnail oscilloscope trace showing a strong center peak preceeded by a smaller pulse  

The scope trace for D75 shows the set pulse from the TAD instruction, and the trace for D52 shows the clear pulse from the DCA instruction. These are as expected, but there is an obvious difference between the measurements for D52 and D75: The measurement for D52 shwos two different voltages – a double line, sometimes resting at 1V, but at other times, dropping down to 0.75V. Nothing similar happens at D75.

We are puzzled by these results. If there is a problem on the general set and reset lines for the flipflop, why does anything work. Specifically, why does RAR work but not RTR, since both use DCD gates to multiplex onto the same set and reset lines. We need to do more work.


May 7, 2026, Fix spare R210, ODT works!

Bug 86: We found a spare R210 board with a bit of masking tape residue on it that preserved, in ballpoint pen, the words "FOX SPARE." (Recall that this machine was originally purchased to support research directed by Stephen Fox.) We tried this board with our RTR diagnostic from Apr 28 and it did not work.

Testing the diodes on the board with an ohm meter, all appeared to be good, but continuing the tests with the transistors, we immediately found that Q7 and Q8, the two transistors that make up the flipflop holding one bit of the accumulator, were not the same. Our analog ohm meter showed 400Ω when measuring both junctions of Q8 in the forward direction, but the needle barely moved when doing the same measurements on Q7.

A bad transistor
      thumbnail photo of a tiny transistor with its epoxy cap popped off  
After we unsoldered Q7 from the board, we noticed that the blob of epoxy that caps the tiny ceramic body of the transistor was slightly loose, and as we inspected it, the cap popped off. We imagine that it would take serious overcurrent through the transistor to pop this cap loose.

With the transistor removed from its crowded context, we also noted that it was a 2N3637 transistor, while DEC's drawing RS-D-R210 PDP-8 Accumulator indicates a DEC3639 transistor, where the spare parts list in the maintenance manual mentions the 2N3639. We doubt that these transistors are sufficiently different to make any difference, and we replaced it with a 3639.

Bug 43: Amazingly, this fix seems to work! We used the RIM loader to load the BIN loader, and used that to load the ODT debugger. Running ODT from the Teletype, we successfully examined several of the programs we had in memory, and we used ODT to patchy our RTR diagnostic to test the RTL instruction and then launched that diagnostic from ODT.

Our success ended there. When we tried to punch out a paper-tape of our memory diagnostic, and then read it back in, it did not work. It appears that we corrupted the contents of memory during some of our switch fumbling. Also note that we did not complete repair of the original R210 board.


Jun 5, 2026, Compare good and bad R210 boards

Bug 86: Give that we have both a good R210 board and a defective board, we decided to compare the two, repeating measurements we made on Apr. 30 with a bit more care. As then, we used the RTR diagnostic we originally used on Apr. 28, and triggering the scope on the leading edge of the RTR pulse.

Aside from presenting side-by-side measurements of the two boards, the biggest change we made was to use the DC offset feature of our scope to move the RTR pulse uniformly up in every measurement so it does not overlap the signal we are looking at. The part numbers used in the following are all documented in the schematic for the R210 board, drawing RS-D-R210 PDP-8 Accumulator.

We began by looking at the internal nodes of the diode-capacitor-diode gates used to and the RTR pulse with the appropriate data on the set and reset sides of one bit of the accumulator.

Cathode of D17
thumbnail oscilloscope trace showing a strong center peak interrupting a long negative pulse   thumbnail oscilloscope trace showing a strong center peak interrupting a long negative pulse
Bad board Good board
The key node on the reset-side of the flipflop is where the cathode of D17 connects to the anode of D16 and the output side of C3. D17 is the level input to the DCD gate, while C3 couples the RTR pulse input to the gate. D16 transmits the pulse to the reset input of the flipflop, but only if the level input is high; in this context, a high input encodes the value zero.

Note that there is no discernable difference between the good and bad board at this node.

Cathode of D109
thumbnail oscilloscope trace showing a strong center peak interrupting a long positive pulse   thumbnail oscilloscope trace showing a strong center peak interrupting a long positive pulse
Bad board Good board
The key node on the set-side of the flipflop is where the cathode of D109 connects to the anode of D108 and the output side of C19. D109 is the level input to the DCD gate, while C19 couples the RTR pulse input to the gate. D108 transmits the pulse to the set input of the flipflop, but only if the level input is high; in this context, a high input encodes the value one.

Again, there is no discernable difference between the good and bad board at this node.

Our next focus was on the coupling of the diode-capacitor-diode gate outputs to the set and reset inputs to the flipflop. Numerous DCD gates are connected in a wired-or configuration to each flipflop input. Recall that a DCD gate is a type of and gate, and the and-or cascade used here forms a multiplexor to bring data from many potential sources into the flipflop.

Anode of D52
thumbnail oscilloscope trace showing a strong center peak and a peak to the right, with a weak long negative pulse   thumbnail oscilloscope trace showing a strong center peak and a peak to the right
Bad board Good board
The wired or on the reset side of the flipflop connects the cathode of D16, the output of the RTR DCD gate, along with the outputs of other DCD gates to the anode of D52 which serves as a reset input to the flipflop. Here, we see the reset pulse delivered by the RTR instruction followed by a reset caused by the immediately following DCA instruction.

The circuit traces for this point show a distinct difference between the good board and the bad one. On the good board, the idle voltage on the anode of D52 is about -1.2V, while on the bad board, the idle voltage depends on the value stored in the flipflop, sitting near -0.9V when the flipflop holds zero and about -1.2V when it holds one. Something is definitely wrong here.

Anode of D75
thumbnail oscilloscope trace showing a strong center peak and a peak to the right, with a weak long negative pulse   thumbnail oscilloscope trace showing a strong center peak and a peak to the right
Bad board Good board
The anode of D75 is the set input to the flipflop that corresponds to the anode of D52 as a reset input. We looked at this to complete our measurements. Here, we see the set pulse delivered by the TAD instruction preceeding the set pulse delivered by the RTR instruction.

On the set side of the flipflop, the good and bad board behave identically, with this node idling at about -0.12V except when some DCD gate delivers a set pulse.

These measurements lead us to ask, what holds the idle voltage on the set and reset wired-or lines? The schematic diagram RS-D-R210 PDP-8 Accumulator is very cluttered. Eventually, we found that the anode of D52 is pulled up to ground through a pair of forward biased diodes, D51 and D50, with the bias current flowing through R25 to -15V. Similarly, the anode of D75 is pulled up to ground by D82 and D83 biased through R41. Nothing in the circuit should ever be able to pull either wired-or node abouve the -1.2V value set by two forward-biased diodes in series.


Jun 19, 2026, Diagnose and repair R210 board

Bug 86: Continuing the work from June 5, we hunted for differences between the R210 board labeled "FOX SPARE" and the defective board. Part names in the following discussion are given in the schematic drawing RS-D-R210 PDP-8 Accumulator, and the work we did on Apr 30 gives the physical part locations on the circuit board.

The first difference we found involved R25 and R41. These adjacent 33KΩ resistors both measured as 33KΩ on the good board in one direction, and 10KΩ in the opposite direction. The lower measurement is due to alternate current paths through diodes and other resistors.

The schematic shows that these two resistors pull the wired-or nodes on the set and reset sides of the flipflop down toward the -15V supply rail. On the circuit board, they are adjacent, about 1/3 of the way down the lower handle at the left side of the physical location map, and 4 or 5 components in from the handle.

On the bad board, R41 was the same, but R25 was 22KΩ. Our initial hypothesis was that R25 might be bad. To test this, we unsoldered one end each of both R25 and R41 so that we could measure their resistance without worrying about their circuit context. With this done, they both measured 36KΩ, which is close enough to their nominal value that we can rule out that hypothesis.

With R25 and R41 unsoldered, we measured the resistance from the wired-or nodes to the -15V rail. Because of the diodes in the current paths, we get two different values for each measurement. On the node that had been connected to R25, we got 40KΩ and 10KΩ. On the node that had been connected to R41, we got 140KΩ and 10KΩ. Because of the symmetry of the set and reset nodes to the flipflop, we expected these to be substantially the same.

The reset node is connectee to the -15V rail through D6, D11, D16, D25, D30, D38 and D50. These diodes are somewhat scattered on the board, but most of them are mixed in with resistors and capacitors in a row of components between the center of the lower handle on the board and the center of the lower card-edge connector. Many of these diodes are hard to probe because adjacent capacitors block easy access from the top of the board.

We checked all of these diodes using the times-10 scale on our ohm meter and found that most of them measured 200Ω in the forward direction and infinite in the reverse direction. The exception was D30, which measured 100Ω in the forward direction and 20KΩ in the reverse direction. This diode about 9 components in from the center of the lower card-edge connector. When we replaced it and soldered the resistors back in place, the board worked!

Going back to the RS-D-R210 PDP-8 Accumulator schematic, we note that D30 is part of the diode-capacitor-diode gate triggered by the RAR pulse, not the RTR pulse we had been focusing on. Our dignostic was comparing the RTR instruction with two repetitions of the RAR instruction, and we had assumed that it was RTR that was bad. We may have been wrong.

Why did we miss D30 in our sweep through the CPU boards looking for bad diodes? The answer may be simple: It was easy to examine all of the diodes in the long row of diodes along the bottom edge of the board. Those diodes stand out. Diodes elsewhere on the board are easy to miss because they are mixed in among resistors and capacitors.

Of course, it is also possible that this diode failed after our sweep through all of the diodes and after we ran our early tests of the RAR and RAL shift instructions. We will never know.