Just as an update. I got bored eventually. I ended up at creating an X,Y table of "DRUMS" and made an LED beatbox. For no purpose other than it forced me into using the "register + offset + displaement" addressing modes. Turns out it's not quite as straight forward as you might expect. It does not acutally permit a "true dynamic" X, Y offset. There is only 1 register for "offset", the displacement is immediate. So I used displacement for the "column index" (X axis) and equ'd them.
Then I moved on entirely. Spawned a new emulator and started back even further than "from scratch". I started with writing my own emulator memory access (bus) accessor functions.
Then the first ASM ROM which went on it, fully established the boot vector table, all 1024 entries and started a "BIT Test" as I called it. "POST" would be the more common name. This was literally how I tested the memory bus accessor C functions. They failed in several "out by one" in byte shifting.
In the upcoming "real" hardware that BIT/POST will also be extremely handy.
This post collides in an interesting way. When you ask, during POST, "How do I report an error when the thing that reports errors is not tested working yet?" ie. You have no IO yet, you just discovered that "Odd Byte access" is broken. How do you tell the user this has occured before you lock up in the coffin_handler? (I am definitely renaming my unhandled_exception handler that now). Guru meditation, but worse.
The answer in the past has been, according to claude, "The address bus" is your first way to speak to the world. All you need is a latch. I didn't go too deep into that, but basically, you have a collection of "lock loops" to send the CPU during a fault. The "latched" address bus LEDs will read the same constant address. There is your "Fault code".
There are alternatives with the HALT instruction as it has a direct external signal, which can drive the actual "Latch" pin. However I need to read the manual a little more closely before I go that way.