Hi Myke,
You could set the address into some GALs by using an OUT to set the upper address and also using some addresses and some data lines to set the lower addresses with another out, and it should be possible to either set an interrupt or NMI or to add wait states, though if you're using dynamic rams, that's not a good idea. Otherwise it's an interesting idea. Don't forget to consider latching other bits, like whether or not you're trapping I/O or MEM and whether you want M1 asserted or not ( instruction read cycle ). You could even add in a display for the data lines, which will tell you what byte is being read or written.
I can think of a lot of instances where trapping an address and generating a NMI is a good idea, but I'm not sure you gain much from just pausing the CPU, unless you're planning on using a multimeter or logic probe to see what is happening.
I did make something like this a long time ago on breadboard that plugged into a 8048 IC ( from memory ) that was running the ECU of a Mitsubishi Starion when I thought the ECU was pushing out bad values to the CTC that controlled the injector, and reading the bytes straight from the bus as it programmed the CTC. Actually I wasn't sure what data was going where, so I mapped a RAM over the entire I/O space so it recorded everything that changed on the I/O bus ( well, 8048s don't have an I/O bus, it's all memory mapped, but easier to explain as I/O ) and then I would read the RAM from a parallel port on a PC that set up some address lines and data lines to work out what was going on as the CTC wasn't a standard one IIRC... In time I figured out which bytes were for the injector timing, and it wrote both to the same port, making it difficult to read both by polling, but I managed to figure it out by mapping a wide range of readings over time and working out which were upper and lower bytes. Later I just made an injector timing circuit that displayed it on a bar graph, and looked really cool, and was easier to make by just watching the injector driver line.
Anyway, watching your debugging process convinced me I needed a bigger logic analyser, so I just spend USD$200 or thereabouts on a Hantek 32 channel analyzer with 2Gb of memory - so I don't have to stop the CPU - 32 bits will let me see most of what the z80 is doing or any decoding logic combination I am likely to get on a z80 system. It also goes down to 2ns division, which is useful for checking propagation delay and locating any race conditions.
If you are going to do it like that, put in 4 rotary hex encoders ( or make them with binary 4 bit up/down counters and twiddle knobs ) so you can set whatever address you like.
You can get z80 socket IDC connectors which would let you remove the z80, mount it in an external board and connect all the breakouts and even the counters in a small daughterboard so it would work in any z80 system. They cost about USD4 each, but postage is a bit. They just crimp up to 40 way IDC cable, and would make it easy to do what you're talking about. You could also put breakout pins or sockets down each side of the z80 to attach scope probes, logic probes, analyzers etc. Would be fun to make.
I like your thinking. I hadn't quite worked out how I wanted to make my z80 breakout and you got me thinking now of a good solution
Thanks
David