Running the RC2014 with a Soviet/GDR Z80 Clone
Around the same time that I got my RC2014 (you can read my recent post where I got it working), I purchased an old Z80 clone that appears to have been produced within the former Soviet Union. I thought it would be fun to see if I could get the RC2014 to boot and run with the vintage chip, so now that my RC2014 is working I wanted to make that happen.
For reference, the chip that I have is a beautiful 80A-CPU MME 9107 ceramic DIP. From the research I have done, this is a bit of an oddball. At the time, there was a Z80 CPU clone created by East German company VEB Mikroelektronik “Karl Marx” Erfurt known as the U880. The U880 CPU is not a direct copy of the Z80, but it was “close enough” and fairly popular in Eastern Europe. The “MME 9107” designation on my chip seems to signify that it was produced in the Angstrom factory from Zelenograd (in what is now Russia), but the “MME” code itself is an abbreviation for VEB Mikroelektronik “Karl Marx” Erfurt and it appears that the Soviets ordered processor dies from VEB Mikroelektronik Erfurt that were then packaged in the USSR. Later, the Soviet Union would manufacture the Z80-compatible KR1858VM1 processor, based on an updated East German U880 revision.
The 80A-CPU is spec’d to operate at 4MHz, matching the performance of the Zilog Z80A CPU. Before I replace the Zilog Z80 in my RC2014 with its unlicensed counterpart, I want to make a modification to the CPU module board that will make swapping chips much easier.
Replacing the CPU Socket
The CPU module already comes with a standard IC socket so the inserted CPU can be removed on-demand with some prying; no desoldering is required. This works well enough, but I don’t like the thought of risking damage to a vintage chip when trying to pull it out of the board. To combat this, I will install a Zero Insertion Force (ZIF) socket in place of the standard socket. A ZIF socket doesn’t require any force to insert or remove chips: the chip is placed within the socket and a lever is moved to lock/unlock the chip into place. I have actually already installed one of these on the ROM module to allow for easy use of swapping EEPROMS (which is much more common than swapping CPUs). Many ZIF sockets for DIP ICs are bulky monstrosities that are significantly taller than standard IC sockets, and this won’t fit well within the confined space between modules on the RC2014 backplane.
Luckily, I found a low-profile ZIF socket that is only slightly taller than a standard IC socket (and it looks pretty slick, too). After removing the Z80 from the CPU module, the IC socket was easy enough to desolder and then the ZIF socket could be soldered in its place. Afterwards, I put the Z80 in the ZIF socket and powered on the RC2014 to make sure things still worked and luckily everything did!
Adjusting the Clock
So the next step was to pop in the MME 9107 and power up the board. Unfortunately, this did not work at all and I didn’t get anything on the console. I figured that this could be related to the clock being too fast for the CPU, but upon checking the RC2014 documentation, I found a line that said that the default 7.3728MHz clock should work fine on 4MHz processors, which the MME 9107 should be. I did some web searches and a lot of people said that these clones should be easy drop-in replacements, but when I did an additional search regarding these CPUs and the RC2014, I found a twitter thread by @0x47DF where they were doing the same thing. I asked if anything special needed to be done to accommodate the MME 9107 and was told that the clock speed needed to be reduced because the 80A chips are a bit more selective than standard Z80s.
Awesome, I now have something else to try! Unfortunately for me, my model of RC2014 doesn’t include the additional components for the clock module to allow for adjustable clock speed. After ordering a whole new clock module and being informed that shipping would locked-down until further notice, I decided to consult the bill of materials on the RC2014 site and order compatible parts from an online vendor (Spencer, if you’re reading this, I no longer need that clock module but I will happily put in an order for other things!). I ended up ordering the following from DigiKey:
- 1x CD74HCT00E
- 1x SN74LS393N
- 1x SN74HCT74N
- 1x SN74LS02N
- 1x EEA-GA1E220H (aluminum 22uF capacitor)
- 3x K104Z15Y5VE5TL2 (ceramic 0.1uF capacitor)
- 3x CF14JT2K20 (2K2 1/4W resistor)
- 4x A 14-LC-TT (DIP14 socket)
If you also have the RC2014 Plus, the only other thing you will need is more straight headers (and a jumper if you weren’t using one before) but I already had some of these. You likely don’t need three 2K2 resistors (probably just one) but I figured I’d fill out the board while I’m there because resistors are so inexpensive.
After the parts came, I soldered them on to the clock module and powered on the RC2014 with just the clock module inserted in the backplane, and my oscilloscope hooked up to the clock pin. Sure enough, I still got clock signal with the jumper set for 7.3728MHz.
Next, I powered down and flipped the jumper for 3.6864Mhz. Powering up again, the oscilloscope showed a waveform that had half as many periods (you can count the number of peaks you see on the screen for each clock speed and compare as a “good-enough” check) so I knew that my clock was running at about half the speed it was before. Awesome!
Slowing Things Down
I turned off and repopulated the backplane with all the modules and used my standard Z80 CPU just to make sure that things were still working as a sanity check. Everything looked good when selecting 7.3728MHz, so I switched the jumper to 3.6864Mhz to try that out.
Now, the baud rate of the console session is controlled by the clock speed, so every time you reduce the speed, you must also reduce the baud rate of the serial session. The clock module documentation provides a handy reference for what baud rate to use for what clock speed (which is just a division of the 7.3728MHz speed):
- 1 = 7.3728MHz = 115200
- 2 = 3.6864MHz = 57600
- 3 = 2.4576MHz = 38400
- 6 = 1.2288MHz = 19200
- 8 = 0.9216MHz = 14400
- 12 = 0.6144MHz = 9600
- 24 = 0.3072MHz = 4800
With my jumper on 3.6864MHz and my serial baud rate set to 57600
I powered on the board and got a serial console! Everything looked good with my Z80 running at half speed so now it was time to try the MME 9107.
After swapping chips and powering up again, I didn’t get anything on the console. Could the CPU be damaged? I had no idea if it was working when I initially bought it as I had no way to test it back then.
On a whim, I decided to try powering the RC2014 with the clock speed at 2.4576MHz and the corresponding console baud rate set at 38400
. To my surprise I got a console and everything was working!
Conclusion
So what does this mean? I’m not quite sure, actually. As I mentioned before, @0x47DF had success running the CPU with a 3.6864MHz clock and our chips look identical. My clock speed is just a hair under 2.5MHz, which is the expected speed of a U880D/80 CPU (as opposed to the 4MHz UA880D/80-A CPU that the my chip is marked as). Perhaps my CPU is improperly labeled and an older die was packaged accidentally?
Either way, the RC2014 now boots and is usable with my vintage CPU (albeit more slowly than expected)! Hopefully in the future I’ll be able to swap out some more chips for vintage counterparts and maintain a stable system.