Back in the days before kids could be placated with a $50 Android burner phone, many a youngster was gifted a so-called “educational computer” to keep them occupied. Invariably looking like a fever dream version of the real computer their parents didn’t want to let them use, these gadgets offered monochromatic exploits that would make Zork look like Fortnite. Due equally to their inherent hardware limitations and the premise of being an educational toy, the “games” on these computers often took the form of completing mathematical equations or answering history questions.
The VTech PreComputer 1000 is a perfect specimen of this particular style of educational toy. Released in 1988, it was advertised as a way for pre-teens to become more comfortable with operating a real computer; since at that point, it had become abundantly clear that the coming decade would see a beige box on every professional’s desk. Its full-size QWERTY keyboard was specifically mentioned in the product’s accompanying literature as a way to get young hands accustomed to the ways of touch typing.
By the mid-1990s these devices would have progressed far enough to include passable text-to-speech capabilities and primitive graphics, but the junior professional who found him or herself seated in front of the PreComputer 1000 was treated to a far more spartan experience. It’s perhaps just as well that this particular educational computer was listed as a training tool, because even in 1988, surely a session with this toy must have felt very much like work.
But that’s not to say the PreComputer 1000 is without its own unique charms. In an effort to help cement its role as a “trainer” for more conventional computers, VTech saw fit to equip the PreComputer with its own BASIC interpreter. They even included generous written documentation that walked young programmers through the various commands and functions. Even today, there’s something oddly appealing about a mobile device with a full keyboard that can run BASIC programs for better than 24 hours on batteries (even if they’re alkaline “C” cells).
Let’s take a look inside this more than 30 year old mobile device, and see how the designers managed to create a reasonable facsimile of actual computing on a kid-friendly budget.
We love classic synthesizers here at Hackaday. So does [gligli], but he didn’t like the processor limitations of the Prophet 600. That’s why he’s given it a new brain in the form of a Teensy++. The Sequential Circuits Prophet 600 was a big deal when it was released back in 1982/1983. The 600 was the first commercially available synthesizer to include a MIDI interface. The original design of the 600 could be called a hybrid. A Zilog Z80 microprocessor controlled modular analog voice chips. The Z80 was a bit stressed in this configuration though, and a few limitations were evident. An 8 bit processor just wasn’t quite enough for software driven envelopes and a Low Frequency Oscillator (LFO) control. This was further exacerbated by the fact that everything was driven through a 14 bit DAC.
[gligli] discovered most of the limitations in the 600 were due to the processor. By beefing up the processing power he could really unlock the potential within 600. Since he didn’t actually have a Prophet 600, he started with the schematic. [gligli] created a PC based emulator for the digital circuits, learning the whole system as he worked. With that phase complete, [gligli] bought a used Prophet and started hacking. The Teensy++ required a few hardware mods to fill the Z80’s shoes, including cutting off a pin and adding a few jumper wires. We really like the fact that no changes to the Prophet 600 itself are required. Pull out the Teensy++, drop in the Z80, and you’re ready to party like it’s 1982 again.
The new processor interfaces directly with the Z80’s 8 bit bus. Since the AVR on the Teensy has built-in RAM and ROM, it simply ignores the ROM and RAM address spaces of the original system. Interfacing a fast micro with older parts like an 8253 timer and a 68B50 UART does have its pitfalls though. The system bus had to run slow enough to not violate timing requirements of the various peripheral chips. To handle this, [gligli] added a number of wait statements in his firmware. Once the system was working, [gligli] was free to start adding new features. He began by smoothing out the stepped envelope and filter generators, as well as adding new exponential modes. From there he added new keyboard polyphony modes as well as pitch and mod wheel changes. The full lineup of new features are listed in the instruction manual (PDF link). Since this is an open source project, adding a feature is as simple as cracking open your favorite editor and writing it up.
The increment/decrement circuit is responsible for updating the program counter register during normal (non branch) operations. The increment/decrement circuit also handles the stack pointer register during stack operations, as well as several other functions. One might wonder why a separate adder would be used when the microprocessor has a big ALU available to it. The answer is twofold. First the ALU is already in use handling user math operations. Secondly the increment/decrement circuit has to be fast. A generic ALU just won’t be fast enough.
One classic adding circuit is a Ripple Carry Adder. Ripple Carry Adders get the job done, but they are slow. Note slow is measured in nanoseconds here – there are no clocks involved in the circuit. The whole thing becomes a classic combinational logic optimization problem. Each layer of logic adds a gate delay to the circuit. As the carry has to ripple through all 16 bits, there are 16 gate delays before the final result is available at the outputs. Delays like these are what limits the maximum clock speed for a given circuit.
The Z80 uses some tricks in its increment/decrement circuit. The first is Carry-lookahead. A carry-lookahead circuit will calculate the carry values directly from the inputs. This reduces the gate delays significantly, but it requires more real estate on the die. A second trick is the carry-skip circuit. Carry-skip calculates the result for groups of bits rather than each bit individually. Again, it will reduce gate delays, at the cost of real estate. The actual Z80 implementation uses a mix of both circuits. Several other “helper” circuits are also used. Surprisingly the Z80 has specific logic just to check for 1 (0x0001) on the internal address bus. This circuit is used during memory move loops to inform other parts of the chip that a loop is about to complete.