Off the shelf: RESET pickup again, and a UART that reads ones as zeros

/ DINO / updated 2026-09-27 / from dino-homebrew serial 16550 reset noise scope interrupts debugging

I took DINO back off the shelf. PROG_isa still reads 0xB4 and PROG_isasoak still reads 0x00, the monitor loads hello and runs it, and bigxfer (2233 bytes in through the monitor’s L command) fails within the first few rows. That’s about where I left it. The plan for coming back was interrupts. They’re designed and the chips are sitting on the bench, but nothing got built tonight, because I spent the night on the serial problem instead. By the end of it there were two separate faults on the table. One is fixed and one isn’t, and it feels close enough that I’m going to keep chasing it before I start on interrupts.

The bench at the end of the night. Ten breadboards of DINO with the scope probes still clipped on. The supply reads 5.15 V at 1.29 A, and the Siglent is still holding the last capture.
The bench at the end of the night. Ten breadboards of DINO with the scope probes still clipped on. The supply reads 5.15 V at 1.29 A, and the Siglent is still holding the last capture.

The interrupt plan got simpler, but nothing’s built

Before touching the bench I went back over the interrupt plan. It was split into three build stages that never made sense to me, and none of them depended on the others, so it’s one build now. I didn’t have a ‘32 for the four OR gates. I found a 74F32, so that’s what goes in, with a note on what to swap if an F-series edge ever causes trouble.

The bigger change is the test source. The plan had a pushbutton on ~IRQ, and a 555 at about 1 kHz for the flags test. Both are gone. The 16550’s transmit-empty interrupt does the job, and each test image arms it itself: write a byte or four into the XMIT FIFO, set IER bit 1, and INTR rises when the FIFO drains. Every run is repeatable, nothing bounces, and the ‘05 open-collector gate on the serial card is now required instead of optional. None of it is built or burned yet. The ICs are on the bench waiting.

I half expected interrupts to fix the serial problem below. They won’t. An interrupt changes when RBR gets read, and the bad bytes turned out to be wrong in RBR itself.

The UART was being hardware-reset mid-load

Every so often the load died with the monitor echoing 0xFF and then only garbage (ba 1d) when the loader tried to get a prompt back. I sent one A (0x41) at it afterwards and got a1 ff back. That’s what 8N1 at the host sees when the 16550 is sending 5-bit characters. The low 5 bits of A, then the UART’s stop bit, then the start bit and first data bit of the ? that follows. So LCR had gone to 0x00.

LCR gets to 0x00 two ways, a master reset or a stray write, so I set a witness. W 4804,0C sets OUT1 and OUT2 in MCR, which pulls pin 34 low. A reset clears MCR and a stray write to LCR doesn’t touch it.

U103.34 (~OUT1)reading
after W 4804,0C30-40 mV
after the load failed4.98 V

That was a master reset. The scope, triggered on a rising edge at 1.6 V (the idle hash on that net reaches about 1.2 V), caught it:

probepeakwhen
U75.8, RESET_B leaving the memory board3.04 V0 ns
U103.35, MR on the 165502.24 V+4 ns
The runt that reset the 16550. Magenta is RESET_B leaving U75.8 on the memory board, yellow is MR at U103.35 on the serial card, 20 ns/div. It shows up at U75.8 first and reaches the UART a few ns later.
The runt that reset the 16550. Magenta is RESET_B leaving U75.8 on the memory board, yellow is MR at U103.35 on the serial card, 20 ns/div. It shows up at U75.8 first and reaches the UART a few ns later.

The pulse is only a few ns wide and it’s on U75.8 before it’s at the card. U75 is a ‘32 whose third gate just passes RESET through to RESET_B, so either the gate was making it or it was coming in on RESET. A probe on U75.9, the input, made the fault go away. I took that probe off and it came straight back.

runprobe on U75.9result
Aonno reset, load got to 0x81F7
Boffreset at 0x82B9, 2.88 V runt on U75.8

This is the same fault as 09-06. That time pulling the RESET wire out of the bundle fixed it. This time the wire was already flying over everything, nowhere near a bundle, and still picking something up. I twisted a ground wire around the whole run, grounded at both ends. Two loads after that went past 0x8300 with no runt on the scope and no 5-bit failure. Two runs isn’t a soak.

If your 16550 suddenly talks 5-bit garbage at random and you never wrote LCR, set MCR bits and see if they survive. If they don’t, something is pulsing MR.

One thing about it I can’t explain yet. Every reset landed at byte 25 of one of the loader’s 32-byte rows: 0x8119, 0x8139 four times, 0x81B9 and 0x82B9. The monitor has no idea the host sends in rows, so whatever couples into RESET is probably timed from the host side.

The other fault: ones read back as zeros

The second fault was there the whole time underneath the first. The monitor echoes each character it reads, and some come back wrong.

sentread
8 0x380x08
3 0x330x03
3 0x330 0x30
5 0x350 0x30
0 0x300x20
lots of things0x00

Bits only ever go from 1 to 0, in no fixed position. Here’s what it isn’t, as far as I’ve got:

So the byte is already wrong in RBR, or the bits arrive on SIN as whole wrong bits, which a short-glitch trigger can’t see.

Along the way I found the card’s ~RD wired to U75.12 instead of U75.11, one hole off, the same slip as the ~WR wire on 09-04. Pin 12 is the gate’s input, the ~IO_RD strobe before it’s qualified with CLK. On the scope the read strobe at the UART was 933 ns wide, a whole T-state, with extra 30-40 ns lows around it that could count as reads. I moved it to U75.11 where the drawing has it. It didn’t change the ones-to-zeros fault at all.

The end of a read with ~RD still on the wrong pin. Magenta is U75.11, the clock-qualified strobe the card should have had, rising once. Yellow is ~RD at the UART, which was really wired to U75.12: it rises about 75 ns later, drops back low for another 38 ns, then rises for good. 50 ns/div.
The end of a read with ~RD still on the wrong pin. Magenta is U75.11, the clock-qualified strobe the card should have had, rising once. Yellow is ~RD at the UART, which was really wired to U75.12: it rises about 75 ns later, drops back low for another 38 ns, then rises for good. 50 ns/div.

Still open