Letting out the magic smoke

So I finally got around to using my last set of parts to build on my pre-castellated PCB, and I killed it. Seconds after applying power to the REX, a faint trail of smoke was visible rising up from the board. Dang!

A little background

The Tandy 100, like most machines of its day, ran all its logic circuits at 5 volts. Some parts in these older machines may have required additional supply voltages (12 volts was common, though some early RAMs needed -12 as well, and things like SID needed 9 sometimes… it was messy) but all the bus signals were 5 volts. Since then, 5 volts has become rather uncommon in logic parts, with 3.3 volts now being the most common voltage seen in both logic and power supply levels. The creates a bit of a problem when you want to integrate these older machines with modern upgrades built from newer components.

The REX deals with the 5-volt problem in several ways. The flash chip is actually a 5-volt part. Like the CPLD, it is old, obsolete, and no longer made, though you can still find supplies of them if you look a bit. The CPLD, while obsolete, is actually a 3.3-volt part but it’s I/O lines are 5-volt tolerant. This means you can connect it to the 5-volt data/address bus, but you must supply it with 3.3 volts in order for it to function properly. To get this voltage, there is a small linear regulator on the REX which creates 3.3 from the 5-volts supplied by the OPTROM socket on the Tandy.

Letting out the Magic Smoke

In testing my power socket, I was sure that had measured the proper 3.3 volts at the reference voltage point (one of the JTAG connections), but after my programming attempt, I got nothing. Switching to my ohmmeter, I measured a measly 2 ohms between the 3.3v pin and ground. This meant that the CPLD was attempting to pull 1.6 amps on the 3.3-volt line! (Ohm’s law) There was no way that puny 50mA regulator was going to handle that current, and thus, it gave up its ghost, slightly early for Halloween.

To try to figure out what went wrong, I broke out the hot air station and started de-populating the board, checking the resistance each time. None of the passives caused any change, nor did the regulator. Removing the CPLD, however, caused the resistance to go back to open-circuit. Just to be sure, I soldered the CPLD onto my remaining PCB from the original batch, and, sure enough, I measured 3 ohms this time. So, the new PCB wasn’t the problem. Somehow, I must have managed to kill the CPLD — either that or I got a dud. No way to tell.

So, from now on, I’m going to remember to check the resistance across the 3.3v line. I asked on the M100 mailing list, and another person measured ~11000 ohms across his, which seems reasonable given the datasheet’s power draw specs on the CPLD (~100 uA to ~1 mA, depending on activity).

So, I ordered a new set of parts. Hopefully the flash chip is okay since it’s not involved in the 3.3-volt rail. They should arrive today. In fact, I think I hear the mail truck!

The programming process

After the physical construction of the REX, the final step is to program it. Programming the REX is done in two stages: The CPLD and the flash.


Programming the CPLD is done with a special programmer from Xilinx. The programmer uses the JTAG interface to program the CPLD. JTAG specifies a common standard for on-chip hardware that is used for programming and debugging IC-level stuff. More info can be found on Wikipedia, of course. The connection to the CPLD is six pins that are usually connected via a male pin header. The REX connection, though, is simply unpopulated vias, so a pin set is needed to connect the female header on the Xilinx cable. I used square wire-wrap pins cut from a connector that I had lying around.


The flash memory on the REX must be programmed by a program running on the Tandy itself, since the REX doesn’t make any connections available for directly programming the flash. I could use a TSOP-48 adapter to program the flash in an external chip programmer (I have access to an older Xeltek) but I’m not sure I would trust the code in the chip after the soldering process.

The flash programming is done my a machine-language executable (.CO) on the Tandy. Of course, getting the .CO file onto a cold-booted Tandy 100 requires us to first have a DOS loaded. Since the REX flasher application needs DOS anyway in order to load the ROM files that we’ll be flashing, this isn’t wasted effort. But it was something I’d never actually managed to do before.

I’m starting to see a pattern with this project: almost as soon as I realize I need something, someone on the M100 list posts and offers exactly what I need. In this case, it was Kurt McCullum who added an awesome feature into the Android version of mComm: the ability to send DOS.

mComm is one of several programs available that emulate some version of the Tandy Portable Disk Drive. This was a device sold by Tandy that connected to the serial port on the M100 and gave you access to 100K of disk storage on a 3.5-inch diskette. It, too, had it’s own bootstrapping procedure where it copied a small disk driver onto the M100. Later, Traveling Software would vastly improve on Tandy’s driver and release their product called “TS-DOS” in both ROM and RAM versions. It is this RAM version that I need to load onto my M102 so that I can get the REX flash utility.

By using a USB on-the-go cable, I can connect a USB-to-serial cable to my Android phone. This connects to my M102 using a null-modem adapter and a 9-to-25 pin adapter. Then, in BASIC on the M102, you type


and tap “send” on the phone. The BASIC interpreter will execute the bootstrap loader, which basically POKEs TS-DOS into RAM in the right place. It provides handy instructions on the screen and little progress dots as it’s loading DOS. Then, after CLEARing space in high memory (CLEAR 0,55000) you can run TS-DOS from the menu, and you’ve got DOS! Amazing!

I had issues at first that I imagine came down to flow control. The serial UART on the M100/102 have a tiny, tiny little buffer, so it’s easy to drop bits if the CPU can’t keep up. Flow control is used to allow the M100 to tell the sending device to stop for a moment to allow the CPU to catch up. Some (many, actually) cheap USB-serial devices don’t implement flow control properly, and some (again, many) null-modem adapters don’t cross the flow control lines properly. I finally found a combo that worked: an FTDI-based cable and my roughly 30-year-old Radio Shack brand 25-pin null modem adapter. How fitting.

With TS-DOS installed in RAM, I can then load the REX flash program, ‘RF149.CO’. This program, when executed, will make the magic address calls to the REX which will:

  • Erase the flash chip
  • Program the REXMGR software into blocks 0 and 1
  • Program TS-DOS into block 8
  • Create an initial RAM backup image on the flash

RF149.CO pulls these files from the TPDD device (or emulator in my case) which is the other reason we need DOS in RAM in order to flash the REX, since the Tandy doesn’t have anywhere near the RAM capacity to hold all the data that needs to be programmed into the flash chip.

After this, you can cold-start the M100, run CALL 63012 from BASIC and the REXMGR will be loaded. After this, it functions transparently as an option ROM to the Tandy OS.

The REX is a really great little gadget and I see what all the fuss is about. For more information on it’s design check out the Bitchin 100 wiki at