Well, I did it. I ordered my first custom circuit boards. I laid out a prototyping board with an ISA bus card edge, sent it to dirtypcbs, and after a month of impatiently checking the mailbox, they arrived.
I ended up with eleven boards. After I've built a few and done some testing, my plan is to order a second set of boards to use as a backplane. I'm thinking around five card slots per backplane board, with right-angle headers on the ends to link them together. Until then, I've soldered a couple slots onto cheap China special protoboards, and one slot built as a breadboard adapter.
As for the computer design itself, I decided to keep the buffers on the address and data bus since I'm going with the card-based approach and have a full set of Z80 peripherals to experiment with. And after quite a bit of going back-and-forth on the matter, I've decided to go with convention for the Z80 and use the low byte of the address bus as the IO address, leaving the high byte as an optional parameter byte. This will give the full 255 possible IO devices (instead of just sixteen as in my previous design), and give up to 8 bits for device parameters (such as A/B and C/D select on the SCC, PIO, etc). I'm using a design I first saw [Jan Verhoeven] use for selecting I/O devices: 8 DIP switches set the address of the IO card, and the card address is compared to the address bus with a 74'688 equality comparator.
I've started building with the CPU board. It will have the Z80 itself; the oscillator and clock divider; logic for /MEMR, /IOR, etc; a flags register used for selecting memory banks, along with logic for selecting the register as IO device $FF; and the data/address bus buffers. It has been quite a task, taking over two weeks of soldering so far. I'm working from a logic/chip diagram I drew inspired by the infamous diagram of the original Macintosh.
At this point I'm nearly finished with wiring the CPU card (with only the low byte of the address bus to the buffer unsoldered, because it will cover some other connections). I began testing with the clock generator, since everything else hinges on it working properly, and it gave me problems on the last design. I started with a basic Pierce Oscillator design, tested it by itself, and it seemed to be working. Next step was to add in the divider, for which I'm using a 74'93 counter. At this point, the oscillator was no longer working.
This is the problem I had with the clock last time. I have much to learn about designing and building a suitable oscillator. Since the Pierce design gave me so much trouble before, I switched to another design, with a list of several to try. An hour of desoldering (and delaminating) and resoldering, and I had my next oscillator ready to test.
This one seemed to be working great. A crude Arduino frequency counter showed the primary oscillator running around 4MHz and the divided rate right around 2MHz, and both fairly stable. A little faster than I expected from my 3.6864MHz crystal, but I figured that was just a measurement inaccuracy. Content with operation thus far, I began packing up for the night. This is when I realized that for my last tests, the crystal wasn't even in place. I used female machine headers for the crystal so I could swap it out if need be, and when I went to test, simply forgot to put it back in.
Like I said, I have much to learn about oscillator design. I have no idea why I was able to get a fairly stable oscillator without the crystal, or why it was even remotely close to the frequency I was looking for. And even more confusing to me, I tested it with several crystals rated between 1MHz and 16MHz, and while I they would have an effect on the oscillation frequency, it was random and had nothing to do with the crystal frequency—the 16MHz crystal actually dropped it down to 1MHz!
All the same, so long as it's moderately stable, I'm ok with it. The divider should square it off to an acceptable 50% duty cycle, so it should work just fine for the Z80. For the accuracy the SCC demands, I'll just use the crystal directly connected to its own internal clock generator instead of running it off system clock. Still though, I wish I understood what was going on.