When I took 6.004, Computation Structures, we built the
“Maybe” machine, a pedagogical microcomputer made from
discrete TTL. It had no CPU. It had no ALU. It had a shift
register. The microcode could load the shift register from memory,
test the low bit, shift the register, and store the register to memory.
That was it. It was universal (Turing complete), but it was
primitive. If I recall correctly, Steve Ward, Chris Terman, and Dan
Nussbaum designed it.
We each built our own Maybe machine on a “nerd kit” — a large
briefcase/small suitcase with a power supply, some solderless breadboards, some
switches and LEDs, and a bunch of TTL chips. We had to wire up the
chips ourselves. I was maybe a bit anal about wiring it up. I
color coded the wires, made neat right angle bends, and
ran the wires in parallel in the troughs between the breadboards.
But when it came to testing the gates, this made it easier to find the
wires that had ended up in the wrong place.
When we were building it, we had a test PROM with microcode that
would just exercise the logic gates. It had no functional program
in it. If the gates were wired correctly, certain patterns would
appear on the LEDs.
At last I had it all wired up. Each gate responded appropriately
to the test PROM. I double checked to make sure I ran each and every
test. I was ready to try the real microcode now. I put my EEPROM
under the UV light to erase it, and then programmed it with the
microcode. I verified that the PROM contained the correct bits. I
popped the PROM into the socket, and powered up the machine.
Nothing. The machine did not display the expected pattern of LEDS.
It didn’t display anything. Crap.
I erased the EEPROM and reprogrammed it as a test PROM again. I ran
all the tests to find which one was failing. All passed. I ran them
again. Everything checked out. I started to think maybe a loose
wire? I ran the tests again and wiggled the wires. The tests still
passed.
Confused, I erased the EEPROM and reprogrammed it with the
microcode. I put it back in the Maybe machine and powered it up.
Nothing. I was stumped. I had no idea what was wrong. I tried
wiggling the wires. I tried wiggling the chips. Nothing.
I reprogrammed the test PROM. Each reprogramming of the test PROM
took at least 15 minutes as I waited for the UV light to erase the
old program and then wrote in the new one. I verified one last time that
all the tests ran correctly and went to consult the TA.
The TA had heard it all before. Some freshman can’t follow
instructions, wires it up wrong, and is sloppy about running the
tests. He was going to demonstrate the right way to thoroughly
test the machine. He had a checklist of each and every test. He
was going to exhaustively go through the checklist and tally each
one as he went. He was going to show me how to do it right.
He was a little surprised that he didn’t find the problem right
away. As each test passed, be became more and more puzzled.
Finally, he got to the end of his checklist and every test had
passed. So he programmed the microcode into the EEPROM and powered
up the machine. Nothing.
Ok, it was a challege. The machine made him look foolish in front
of this lower classman. He was going to find the problem. He
reprogrammed the test PROM and ran the tests again. As he ran each
test, he’d wiggle the wiring and the chips involved in the functional
unit being tested. Everything was in order. But when he put in
the microcode ROM, everything was dead.
We went through a couple of cycles of this, but it was getting to
be dinner time so we decided to call it a night. I could only think
that I was going to have to rewire the whole thing from scratch. I was
dreading it. I headed back to my dorm room.
But...
It was odd that when you tried to run the microcode, although you
didn’t get the expected pattern of LEDs, they did briefly flicker
when you powered up the machine. The instruction after loading the
LEDs was a conditional branch to itself. The LEDs would be loaded
and then stay on until the conditional became true when the user
pressed a button. It was almost as if the conditional was taken
immediately rather than waiting for the button press. Maybe the
conditional was backwards? If the conditional were backwards, the
LEDs would flicker because they’d be loaded and the mahine
would immediately branch.
When I got to my dorm room, I opened the nerd kit and checked.
Sure enough, the conditional was wired to the inverted output of a
flip-flop. Every conditional branch would be taken the wrong way.
The non-inverted output was the next hole over. The
test PROM checked that the wire was connected, but didn’t check
that it was connected to the positive sense of the conditional
bit.
The next day, I went back to the lab with the fix. I
reprogrammed the EEPROM with the microcode and powered up the
machine. The LEDs lit up in the expected pattern and the machine
ran as expected.