Fixing a poorly ZX-Spectrum (Part 2)
Finally got around to powering up the motherboard this morning and have done a preliminary check of the board. First problem was to find a good ground connection for connecting the crocodile clip of my probes too. Thankfully the Spectrum has a common ground and it turns out the heatsink is grounded, so that problem was solved fairly quickly.
I thought I’d start off with a simple test. Is the Z80 receiving a 3.5Mhz clock signal from the ULA? This would determine that the master (14Mhz) clock is working, the ULA is nominally working and the Z80 is at least being clocked.
I set the oscilloscope up to measure a +/-10V range with around 500ns per division, with a trigger of around 3V on the rising edge of the pulse. I then connected the crocodile clip of the scope probe to the heatsink, then probed pin 6 of the Z80 (the CLK line).
It turns out that the clock signal is ok. A reasonable square wave, peaking at around 5V (the height of the pulse measured against the blue vertical scale on the left hand side of the graph) at 3.499Mhz (the measure near the bottom of the window).
I thought I’d then measure the CLK and WR lines on the Z80 and got slightly confused by the clock signal; it appears to be being stretched occasionally.
I didn’t notice this during my first trace and assumed that this was a fault, either with my method of measuring or the board. However, this behaviour is normal. The ULA will hold the CLK line high when it needs to access the memory at the same time as the Z80. The ULA gets priority (as it needs to draw the screen) and the Z80 is quite happy with a variable clock so it’s presumably a neat and cost effective way to share memory without adding extra circuitry to hold the Z80 WAIT line low.
It’s also a reminder as to why programmers never put time critical code in this “contended memory” (between &4000 and &7FFF) as any memory accesses in this section of RAM will be slowed down when the ULA needs to draw the screen.
Well, it looks like the Z80 is doing something. Next step is to put a logic probe on the address lines to see if I can track what it is actually running.