Simple Commodore PET Tape Interface

Projects No Comments

Before I put together a long term solution, I wanted a quick way to transfer software from my PC to my Commodore PET. There are other circuits, but I wanted something that used just one part.

The PET input is TTL level, so I needed something to go from audio level to TTL. Ideally a comparator circuit with plenty of gain. Well, I couldn’t find a decent comparator in my junk box, but I did find a CA3140 op-amp. This is way faster than I needed, but should work OK as a comparator. If you build this circuit, try to find a comparator or an op-amp with a rail-to-rail output.

Here is the circuit:

And here’s what it looks like:

It works quite well. The circuit is not very sensitive to the output audio level from the PC–I set mine halfway (line level) and it was fine.

New MOnSter6502 updates, with video!

Uncategorized 5 Comments

It’s been a while since we’ve had an update to the MOnSter6502 project–we’ve been very busy getting the second revision ready. At the same time, I’ve been designing a simple yet powerful 6502-based computer that can operate at the slow clock speeds required by the MOnSter6502.

But before I go into detail about that, take a look at this video update. It’s one thing to see photos of the MOnSter6502, but the video really brings out just how awesome this thing is in person! (Shameless plug for Maker Faire Bay Area 2017 where you should come visit us.)

The MOnSter6502 runs up to about 60KHz clock, which is quite a bit slower than the original. The computer I’ve designed for it uses another microcontroller to simulate hardware peripherals, inspired by capabilities of various ’80s computers and gaming consoles. The idea is to offload CPU-intensive video and sound tasks to the microcontroller, freeing up the 6502 so that it can be used in real time despite the slow clock.

Right now, I’ve implemented several software-defined peripherals

  • VGA video output with 256 color graphics, tiles, and sprites
  • Multichannel stereo sound synthesizer
  • PS/2 keyboard interface
  • KIM-1 style front-panel debugging keypad and LED display
  • USB-CDC interface with a 6502-accessible UART for communications with a host PC

The computer can also run a full validation suite on the connected 6502, which has been quite useful troubleshooting the highly complex MOnSter6502 boards.

The computer is still a prototype, but you can see some shots of it in the video above.

You can find more updates and information at the project site.

Maker Faire 2017

Uncategorized No Comments

The MOnSter6502 will be at the Bay Area Maker Faire this year! If you’re around, come by and say hi.

A Reproduction AdLib Sound Card

Projects 8 Comments

Growing up, I used to play some games on an AST 286 computer, including Commander Keen, Wing Commander, and a few others.

Sound in those days was primitive compared to modern machines, but I still have a soft spot for the bleeps and bloops of the OPL2 synthesizer cards (which includes the AdLib).

Recently I have been fixing up an IBM XT (with original CGA card!) and I needed a sound card. It turns out that early sound cards like the AdLib or the Sound Blaster are quite expensive on the used market, so I thought I’d make a clone of the AdLib sound card (1990 version). Being me, I couldn’t just make an electrical equivalent. It had to look as close as possible to the real thing.

Here it is.

Compare it with the original 1990 version of the AdLib sound card.

I started with Sergey’s OPL2 card and corrected some differences between it and the genuine AdLib card. Since I don’t own a physical card, I found photos on the net of the front and back of the card to use as a reference. To make sure everything matched up exactly, I figured out the design grid of the original and duplicated the traces and component placement as closely as possible. All the library footprints are custom designed to match!

The KiCad design files are available on GitHub. Mouser part numbers are embedded in the KiCad design but they are also included in the table below. The Yamaha OPL2 chipset, the YM3812 and YM3014B pair, can be found at various sources online. They were socketed on many older Sound Blaster cards, so I suspect quite a few were recovered by the scrappers.

Q Designator Description Mouser Part
1 J1 CONN_01X05 490-SJ1-3553NG
1 U6 YM3812
11 C4,C5,C24,C2,C25,C20,C19,C26,C1,C14,C16 0.1uF 581-AR215C104K4R
1 D1 D 512-1N4148
1 Q1 2N3904 512-2N3904BU
2 R1,R13 8.2K 291-8.2K-RC
6 R2,R3,R6,R7,R11,R12 2.2K 291-2.2K-RC
1 R4 12K 291-12K-RC
4 R5,R9,R10,R16 10K 291-10K-RC
1 R8 1.5K 291-1.5K-RC
1 R14 POT 652-91A1A-B24-D15L
3 R15,R18,R19 10 291-10-RC
1 U1 74LS109 595-SN74LS109AN
2 U2,U3 74LS138 595-SN74LS138N
1 U4 74LS245 595-SN74LS245N
1 U5 74LS04 595-SN74LS04N
1 U7 YM3014B
1 U8 RC4136 595-RC4136N
1 U9 LM386N 926-LM386N-4/NOPB
1 C18 10uF 647-TVX1C221MAD
4 C7,C6,C9,C8 4700pF 581-AR211C472K4R
1 C12 1000pF 581-AR211C102K4R
1 C17 0.047uF 581-AR215C473K4R
1 C13 270pF 594-S271K43SL0N6TK5R
6 C23,C21,C22,C11,C3,C15 10uF 581-TAP106M025CRW
1 C10 4.7uF 581-TAP475K016SCS
1 MNT1 CONN_01X01 534-9202

To install the card in a computer, you’ll need to get a Keystone 9202 bracket. The KiCad layout includes a drawing showing where the holes need to be punched in the bracket. I recommend using a hand-held sheet metal punch with a 7mm or 9/32 die. You could also drill it but the punch makes a much cleaner hole.

Here’s a bonus photo showing all the parts laid out before soldering. The components were chosen to match the colors on the original card.


A MOnSter Mystery, Solved

MOnSter 6502 3 Comments

I brought up an additional MOnSter6502 board today. At first it failed my basic validation routines, tripping up on the LDA nn,Y instruction ($B9).

The bus diagnostic output showed that LDA nn,Y was trying to read nn+Y+1 instead of nn+Y (in my test, it accessed $0211 instead of $0210). The LEDs showed that the Y register contained the expected value, so I thought the ALU carry in signal may have been loading a ‘1’ instead of a ‘0’, thus causing the incremented value. I scoped it out and it was fine.

Then I noticed that LDA nn,X worked fine which is totally weird because those instructions are just about identical! So I physically inspected the Y register and saw this tomfoolery:
Those transistors are in bit zero of the Y register. The one on the left prevents anything but a ‘1’ from being in the LSB. The one on the right was supposed to drive the LED on so that I could tell the bit was stuck, but it decided to cover for its dead buddy. I don’t even know how this happened. It could have been shipping damage, or maybe I fat fingered a screwdriver.

After fixing it, the board worked fine. Two dead transistors and a lying LED. Gotta love transistor level debugging.

Bernoulli Box Fun

Restoration No Comments

I’ve got an old Bernoulli Box (Model A210H). In the early ’80s, it was a popular way to store 10 megabytes of data in a removable cartridge format. This was also a very common IBM PC hard drive capacity back in those days, so it was great for backups. The cartridge is quite large, and comes in a protective cardboard box:


It’s been 20 years since I last turned it on. After plugging it in and flipping the switch, I smelled smoke so I quickly shut it off. I opened it up (6 screws) and removed a drive (4 screws) and pulled the controller card off of it (4 more screws). Then I noticed a blown tantalum capacitor, so I replaced it. Then I put it all back together again and powered it up with a bench supply (tantalum capacitors nearly always fail in a short circuit which makes things a little too exciting, so at least a bench supply lets me limit the current). More smoke, and another blown tantalum capacitor. I fixed it and put it back together, and powered it up with the regular power supply.

Closing the drive door made the motor spin up very sluggishly, so I checked and noticed the supply voltages were low. So I took apart the power supply and noticed a voltage adjustment potentiometer, so I set it back to the correct voltages and put everything back together. Now the motors seemed to run OK.


I tried putting in a disk and closing the door, but the drive made horrible noises. The LED on the drive blinked and the drive spun down, essentially rejecting the disk. I figured out how to open the protective window on the disk cartridge, and noticed that there were bits of sticky crap on the disk, mostly near the hub in the center. Taking apart the drive, I noticed a rubber ring that is supposed to push down on the disk in order to create some friction to spin it up. The rubber had decomposed into sticky stuff that was getting everywhere.

Bernoulli drives work on the Bernoulli principle. The disk itself is basically a floppy disk and is made from thin flexible plastic. There is a metal plate (the Bernoulli plate) that the disk spins up against. As it spins, the air in between the disk and the plate also spins and flies out due to centrifugal force. This creates a vacuum that pulls the disk very close to the plate, stiffening it so much that it acts like a hard disk platter. The drive head floats on an air cushion above the disk surface just like in a hard drive.

Unlike in a hard drive, if any dust particles get pulled into the gap, then the disk drops away from the head and nothing is damaged. The metal plate and the head both need to be very, very clean for the drive to work correctly. They are actually mounted upside down so that dust will fall away and not settle. A large fan on the back of the drive (with an attached air filter) provides positive air pressure in the case to help keep dust out. Before it enters the gap between the plate and the disk, the air is filtered a second time by a very small filter located behind the drive head.

In my drive, the head was filthy, the Bernoulli plate had some dust on it, and had a little oxidation on the back. I removed the oxidation with a file, with the idea that any patches of oxidation could produce problematic dust particles. I cleaned the working surface of the plate and the drive head with special no-lint wipes and 91% isopropyl alcohol. It’s very important not to disturb or distort the working surface, otherwise the disks will not spin right and could be damaged.

I also fabricated a replacement rubber ring and glued it onto the top of the drive spindle. In the photo below you can see the spindle with the new rubber ring. The drive head is the white thing running in the slot on the upper left. The cartridge enters from the right, and you can see some angular protrusions on the plate that open the cartridge and slide back the protective cover.


Fortunately I still had the controller card and the cable, but I had no driver software. I managed to find the DOS driver on some random website, and it actually matched up and worked! I tried it with a different disk and I was able to read back data. A few data errors occurred, but they were mostly soft errors that a couple of retries could fix. I was also able to clean up the original disk using more wipes and isopropyl alcohol. It worked fine although it had some bad sectors.

MOnSter 6502 Runs BASIC!

MOnSter 6502 No Comments

Where we left off, the MOnSter 6502 had successfully ran a basic validation suite that validated a subset of the instructions but checked every bus cycle for accuracy. Shortly afterwards I was able to get it to run the full validation suite.

BASIC ran just fine after that. It was quite slow with a 6KHz clock but it was enough to run some simple BASIC programs. Typing was difficult because my validation computer uses an Atari POKEY chip to scan the keyboard, and it latches keystrokes very slowly because of the slow bus clock.

I’ve been experimenting with increasing the maximum clock frequency. It helped to reduce the bus capacitance that I added, but if I went too low, it cut into the minimum operating frequency. With less bus capacitance I was able to get the clock up to about 60KHz, and BASIC is quite usable at this speed.

There is an issue I’ve been running into that has to do with the active bus pullups. The pullups are switched on by CCLK (first clock phase), and the pulldowns are normally changed on the CP1 edge (second clock phase). However this is done using a dynamic latch, so if the clock slows down too much, the latch will change state, causing both pullup and pulldown to be turned on at the same time. Here’s an example circuit:



The circled node is the storage node of the dynamic latch. If CP1 is off for too long, then this node can discharge, going from a ‘1’ to a ‘0’.  When that happens, the output goes high and drives a ‘1’ into the pulldown transistor when CCLK goes high. CCLK turns on the pullup at the same time. As you can see in the diagram, I’ve added a small resistor in between both transistors to limit the current.

This resistor, although it protects the transistors, also limits the maximum clock speed by limiting how fast the bus capacitance can charge up.

I’ll be experimenting with some alternative ways of protecting the transistors without slowing down the bus too much.


MOnSter 6502 Bringup Status

MOnSter 6502 1 Comment

Wow, Maker Faire was totally nuts! Lots of people came by to check out the MOnSter 6502 and I had some interesting conversations with people. After taking a few days to recover, I dug back into the bringup and validation process.

The MOnSter 6502 now passes my basic validation test suite. I discovered two problems.

It was not booting consistently, and kept getting stuck in a bad state where the ‘1’ bit would run off the end of the instruction sequencer, or it would get stuck in a loop running the same (wrong) instruction over and over again. The RESG latch also was stuck on.

When RESET goes low, it turns on RESG. This forces the BRK instruction (which is meant to trigger a software interrupt) into the predecode IR (instruction register) by deasserting D1x1, sets the vector address to the reset vector (instead of the IRQ vector, as BRK normally does), and prevents BRK from writing to the stack so it can’t push the program counter and status bits. When BRK is done, it clears the RESG latch. This is a very clever hack that the original designers used so they could avoid having to run a reset line all over the chip.

Oddly, even when RESG was set (I could tell by a convenient LED), the contents of the IR were not all ‘0’ (again, according to convenient LEDs). Turns out the quad FET array devices used in the IR had some leads that were not soldered down correctly. Fixing that solved the problem.

After trying to run the validation suite again, it started failing the cycle-by-cycle validation on the first time an actual BRK instruction was supposed to be executed. BRK saves the least significant byte of the program counter the most significant byte, and finally the contents of the status register to the stack (with the B bit set so your interrupt service routine can tell the difference between BRK and a hardware IRQ). In this case, it was writing the most significant byte and the status register to the wrong locations in memory.

So I hard-wired the PHA (PusH Accumulator) instruction onto the data bus so I could observe a very simple instruction write to the stack. The value was written correctly, but instead of decrementing the stack pointer by 1, it subtracted 18! PHA decrements the SP by loading it onto the ADL bus and setting the ALU to add with the B input hold register connected to ADL and the A input hold register connected to the special bus. The idea is that by adding $FF you decrease the value by one. This only works if nothing else is driving the special bus except for the precharge pullup MOSFETs. It’s another clever hack from the original 6502 designers. In my case, instead of seeing $FF, the ALU was latching $EE! I tried adding a small amount of capacitance from special bus lines 0 and 4 to ground to keep the voltage up from the precharge cycle, and PHA then worked correctly. I ended up adding capacitors to all the bus lines just in case.

After those fixes my basic validation test suite passed without any further issues.

The next step is to run a more complete set of validation tests, and then BASIC!

The MOnSter 6502

MOnSter 6502 11 Comments

So, I made a thing. A really big thing. Really big and really crazy.

You might have seen my discrete 555 and 741 IC electronics kits. Well, a while back I had this idea about creating a discrete version of a microprocessor, but it just sounded too difficult, time consuming, or impractical. And part of me didn’t want to do it, because it just sounds so tedious to design–at every stage, I was secretly hoping to find a show-stopping problem. But part of me was really interested to see if it could be done.

At dinner, Windell and I went through a thought experiment to see if it would even be possible. We weren’t sure how many transistors were in a 6502 (more than 1,000 but less than 10,000). If four surface mount transistors can fit in a square centimeter, then the board would need to be about 1,000 square centimeters, or about 32cm (13in) on a side, which is not as huge as we originally thought. Darn it, time to investigate further!

The hard work of reverse engineering the actual 6502 has already been done by the folks at I was able to extract the netlist from their Javascript simulation, which contains a list of all the transistors and every single wire connecting them together.

The 6502 uses dynamic NMOS logic, so it has a large number of “transmission gate” transistors that are used to switch currents. For various technical reasons, only a 4-terminal MOSFET can make an effective NMOS transmission gate. Those are really hard to find (nearly all MOSFETs are 3-terminal devices), but I found one–it’s an array of 4 MOSFETs on a single chip with a separate substrate pin.

I ran simulations using the transistors I found, and noticed that basic combinational logic and latches worked. I ordered parts and prototyped a few circuits. They worked perfectly.

I designed and ordered an OSH Park circuit board with just 8 bits of the program counter register. I thought to myself that there was no way such a complex circuit could work, especially with the ripple carry propagation. Well, it worked.

It was time to bite the bullet. I wrote a Python program that turned the Visual6502 netlist into a 3,510 line spreadsheet, and I began entering (on July 3, 2015) the transistors one by one into the schematic, highlighting each transistor as I finished it. Along the way, I noticed that the Visual6502 netlist had three extra transistors, T1088, T1023, and T3037.

(An example of an extra transistor)

When I was done with all 61 pages, I wrote another Python program to compare my schematic against the original netlist and corrected a few mistakes. Then I added 167 colorful LEDs to various control lines and data bits, and a few protection components.

The layout came next. In the layout software, I placed 4,304 parts by hand and wired them up manually (no autorouter) over the course of several months, finishing the last transistor on Dec 1, 2015.

And last Thursday, the first boards came in. They are beautiful!

We’ll be bringing it to Maker Faire, so I have a week to work on bringup testing. Wish me luck!

You can find more details on the main project site,

The Battle of Fives: How the NE555 and LM555 are Different

Uncategorized No Comments

A customer recently asked us some questions about the Three Fives discrete 555 timer kit. One in particular really got my attention.

What is the difference between the National Semiconductor LM555 and the Signetics NE555 timer ICs? Well, the Signetics part certainly came first and the National part was a second source, but the customer noted that The 555 Timer Applications Sourcebook, on page 5-31, states

…Table S-2 points out that the threshold overrides the trigger for the type LM555H (National), but the threshold is overridden by the trigger for the type NE555V (Signetics).

Let’s compare the two. First, here’s the NE555 schematic (click for larger versions).
And here’s the LM555 schematic. I’ve kept the component numbering consistent with the NE555 datasheet rather than National’s datasheet to make comparisons easy.
The LM555 makes three minor changes to the timer design:

  • The trigger comparator now has a current mirror active load (Q26 and Q27) instead of resistor load R6.
  • The threshold comparator gets a current mirror active load (Q28 and Q29) and an emitter follower buffer Q30.
  • R10 is now 7.5K instead of 15K, but I suspect there is a typo. Imagine several generations of photocopies. The 1 starts to look like a 7, and a decimal point appears.

The most interesting changes are the first two. How do these changes reverse the priority of the two comparator inputs?

The original NE555 gives priority to the trigger signal because transistor Q15 can always overpower the current coming from Q19A and Q6.

For the LM555 in the normal case where the trigger signal is active, Q15 is on, Q16 is off, and Q17 is on hard since its base is pulled to VCC through Q18, R10, and the current mirror Q19.
However, if both the trigger and threshold inputs are active, then both Q15 and Q30 are on. This leads to an interesting situation where the collector of Q18 is pulled to ground through Q15 and Q30. At that point, there’s nothing to provide current to the base of Q17, and any residual charge will probably drain away through the reverse leakage current of Q18. Q17 then turns off, and the output does the opposite of the NE555! Leaving the gate of Q17 hanging like that seems really odd, so I bet this was unintended behavior. I ran some LTSpice simulations so you can see what is going on. First up is the NE555:
NE555 Flop
And here is the LM555:
LM555 Flop
If you look carefully at the V(comp) trace right before 12ms, it actually goes negative due to Q18 behaving like a diode clamp.
This behavior doesn’t seem to get in the way of normal operation, but it is something a circuit designer would need to take into account. This is why designers and purchasing people should always be wary of “drop in” replacements, especially when the manufacturer claims “improved performance!”
National Semiconductor made the changes to improve the performance of the comparators, specifically their performance over temperature. I ran some more simulations so you can see the difference. Here is the NE555 set up in a simple astable circuit, with superimposed waveforms at 0C, 35C, and 70C:
And the LM555 at the same temperature ranges.
Note that I put the temperature coefficients only on resistors inside the 555 timers, not on any of the external oscillator components.
If you want to play with the LTSpice circuits, click the links below to download them.
A quick side note about the names: The LM in the part number stands for Linear Monolithic, which National Semiconductor used to describe many of their analog ICs. The NE probably stands for Network Electronics (the sources are anecdotal). Apparently the Signetics name came from Signal Network Electronics.

« Previous Entries