Allow Me to Interrupt
When I built the 8-port serial card for Wrap030, my 68030 homebrew computer project, I omitted support for interrupts. The reason why is already lost to time. Perhaps I couldn't figure out how to pull it off with the board space I had left; perhaps I didn't think it would be necessary. No matter the reason, the result is the same — to get any data in or out, the CPU must continually poll all eight logical devices or risk losing data. This is terribly inefficient and why interrupts exist to begin with.
I suspect that lack of interrupt support may have contributed to the problems I had trying to get NetBSD to boot multi-user. I would like to address the issue before I circle back to trying to get NetBSD running on this machine.
There are a few challenges:
This was an expensive board, well over $100 two years ago; I would prefer not to have to build a new one from scratch.
There is no board space left. Even as a 4-layer board, I struggled to route all of the signals on this board. Dense component placement on top and bottom leaves little room for bodging.
There are eight active-high interrupt signals I need to combine or encode for the 68k active-low interrupt inputs.
My original Wrap030 bus layout (going all the way back to the original wire wrap prototype) did not break out the CPU's three interrupt signals for expansion boards to use.
I did not break out the eight interrupt output signals on the serial board, so wires will need to be soldered directly to the fine pitch QFP pins.
I spent quite some time trying to figure out the best way to combine the UART interrupt signals. An 8-input NOR gate would work, but those appear to have only been built in CMOS, and I don't have anything like that on hand. I could throw a 22V10 programmable logic device at it, but that is an expensive solution to such a simple logic problem.
I eventually decided to use an 8-bit comparator — I have a small stock of 74F521 comparators on hand. These chips output a logic low when their two 8-bit input ports match. By grounding the second port, the chip will output a low signal when all of the interrupts are inactive, and go high when an interrupt is asserted. The result is effectively an OR gate. I ran that into the base of an NPN transistor to invert the signal and give me the open-collector output I needed for properly sharing the CPU interrupt inputs.
There was no good space on the board to deadbug bodge in this new circuit, so I built it on a small breadboard. I used an unpopulated oscillator footprint to give me a socket to hold the new board in place beneath the serial board, and attached a header for a ribbon cable to connect the two.
Since the CPU interrupt signals are not anywhere on the bus, I had to run a wire-wrap bodge from the breakout board to the main board. It's a fragile solution I don't care much for, but have used on this project before when necessary.
All that was left was to solder 8 tiny wires to 8 tiny chip leads. This was the hardest, most frustrating part of this endeavor. It is very difficult to get the wire soldered into the correct pin without bridging over to the next pin. Once the wires are soldered in there is very little surface area binding them to the pins, so it's easy to pull them loose. I used some polyimide tape to hold everything in place, with each new wire's tape also helping hold down the previous wires.
All together, I can't say it's the best solution, but it should work. All eight UARTs will show up under the same interrupt vector, and the CPU will have to identify which if the eight chips requested the interrupt. But that is still much more efficient than constantly polling the devices.
Eventually I would like to bring together everything I've learned over the years on this project and build the most powerful 68030 system I can. For this idealized future project, I would implement some kind of interrupt controller that can give the CPU a proper vector for each port, so it knows right away which UART is requesting attention. But I think this will do for now.










