So, after a big pile of soldering, I'm back to where I was a few weeks ago on a breadboard. Namely, I have a CPU and a EEPROM wired together, plus a latch on to some LEDs. I should be able to run my 'Nightrider' light blinker on it. Admittedly, the circuit also has RAM and memory banking, but I wanted to test the features incrementally..
So, I started up the test program and... it didn't work. Time to debug!
Investigation of the address and data bus showed that every read cycle, it was reading an 0xFF from 0x7038. The high 'F' of the address nybble is the memory banking hardware - it initialises to read from the high end of the banked memory space, which maps to the top of the ROM. The '0x38' part is more interesting. It turns out that '0xFF' is the machine code for 'RST 38', so the address contains an instruction to jump immediately to the same instruction. Why did the EEPROM contain this value at this address, causing this infinite loop?
Reading the EEPROM back through the programmer, it turns out that while I thought I'd instructed the programmer to program in my blinker program at a base of 0x7000, it apparently didn't. Another reprogram, and I could see the address and data buses going all over the place, apparently executing the program correctly.
Still no blinking lights.
Extensive diagnostics revealed the (embarassing) source of the problem: I'd put the LEDs in the wrong way round.
Next steps, I'll be writing a test program to exercise the RAM and banking, checking it all works, and then preparing to add a CTC and SIO, giving me timer interrupts and serial I/O. Once that's working, I hope to add a SD card reader (apparently, this can be done even with 70s tech), and I'll have myself a simple CP/M machine!