2020: NameSpaces are going to be implemented this year to better separate content. OS-9 Al (talk) 11:18, 15 April 2020 (CDT)
2020-05-17: If a page gives you an error about some revision not being found, just EDIT the page and the old page should appear in the editor. If it does, just SAVE that and the page should be restored. OS-9 Al (talk) 12:22, 17 May 2020 (CDT)
26-3029 CoCo Disk Controller High Density Modifications
I've been toying with the idea of using HD disks and drives on a CoCo for quite some time now. There's been a mod out there for a long time that applies to the first generation CoCo controller (26-3022) which apparently works well. However, I'm not really a fan of it- mainly because that controller is loaded with analog adjustments and requires 12 volts to operate, which requires you use a multipak.
The modifications below are a prototype. My selections of chips may seem odd, no doubt some of you will point out better ways to do this mod. I just used what I happened to have in my personal inventory. Use this as a guide. If you have a better way to do it, please do so, and let me know. This is an open project!
Someone was kind enough to send me a copy of the Tandy service manual for various disk systems. The schematic for the second-generation disk controller interested me, since the WD1793 is technically capable of running the disk interface at high-density rates. Even better, though: at some point Tandy realized that the WD1793 sucked, and the Fujitsu MB8877A (datasheet) works a lot better. The MB8877A has a bit faster logic internally, and a good portion of the 26-3029 controllers out there already have them installed.
Let's just step back and talk about disk drive formats before we get any further into this. The original CoCo 5.25" low density disk format uses a drive that spins at 300 RPM, and the data is encoded on the disk at a 250 kilobit rate. The older 8" disk drives spin at 360 RPM, and encode their data with a 500 kilobit rate. Disk controller chips like the WD1793 and MB8877A were designed to work with either data rate for 8" and 5.25" drives. Coincentally, the high-density 3.5" floppy drive in many PCs also rotates at 300 RPM and uses either 250 kilobit rate or 500 kilobit, depending on if a low density 720k or high density 1.44M floppy is loaded in the drive. So, the chip inside the 26-3029 is actually capable of talking to a drive at 500kb/sec- exactly what a HD floppy wants.
Also as an aside, most high density 1.2MB floppy drives spin at 360 RPM, which in itself isn't really a problem. However the data rates are 300 kb/sec and 600 kb/sec for low and high density media, respectively. While you could mod the controller to read all these different formats, that in itself is much more complex. Given the rarity of 1.2MB drives, I personally don't think it's worth the effort.
The most basic mod you could do, if just as a quick experiment, would be to try replacing the 4MHz crystal with an 8MHz one. This would double the clock rate of the controller and you can read and write HD floppies. Of course, it's then incompatible with low density disks. The mod I did on the prototype therefore consists of several pieces.
- I needed a new control register, so I could switch the controller in and out of HD mode via software. You could skip this entirely and replace it with a manual switch if you wanted to. I like to make things more complicated.
- I needed a dual-speed clock, at 8MHz and 4MHz. I then needed the control circuitry to be able to select one or the other depending on the output of my control register.
- I wanted to try and read the density information from the drive, to get feedback as to the type of media that's installed.
Step 1: clean out stuff from the board you don't need.
I chose to use a TTL oscillator for my 8MHz clock. If you want to use an external oscillator like this, remove the following components from the PC board:
Clip pin 10 of U12 (74LS04) to disconnect the old clock output from the rest of the board.
Step 2: Adding decode for the new control registers
Normally the disk motor control register exists at all addresses between $FF40 and $FF47. Only $FF40 is used. Also this is ordinarily a write-only register. When you're done with this step, you'll end up with four selects you can use. The existing write-only register at $FF40 will work. An additional select is provided allowing a read of $FF40 (not implemented, but you could use it for something else if wanted) and provides a new 6-bit write only register at $FF41 and another select output for a read at $FF41 (which I used later for disk status info)
Take a 74AHC139 (or similar, LS, ALS, HCT, whatever you have- not particularly important) and bend pins 1,2, 4-7 and 9-15 horizontally. Clip off the thin ends leaving the thicker wire part to solder to. Solder the unbent pins onto the same pins on top of U14, which is also 74LS139.
Clip pin 4 of U5, a 74LS02. This disconnects the old chip select line to the 6 bit register chip, U2.
All the references below are to the pins on the piggy-backed 74x139:
- Pin 1 to pin 6 of U5
- Pin 2 to A0 (that's pin 19 of the CoCo connector). I used the land on the board that's straight down from the 1 in 1982, right above the round hole in the PCB.
- Pin 4 to the RGCK signal. You can pick this up in several places. Pin 13 on U9 is one of them.
Now prepare a 74LS174 or similar. Bend pins 2,5,7,9,10,12,15 up, clip them short again. Solder the remaining normal pins on top of U2, a MCM14174B.
Connect pin 9 of the piggy-back 74x174 to pin 5 of the piggy-back 74x139 If all went well, you should now have a second register at $FF41. Now would be a good time to test your work. Put the controller back in and make sure your CoCo still powers on properly and works. If you clipped all the clock generation stuff, you won't be able to read and write disks. However the drive light(s) should at least come on when you attempt to use the disk drive. If not, either my instructions are wrong (sorry!) or you did something wrong. Check it again. If that's working, try doing a POKE &HFF41,1 in BASIC, and using a logic probe, see if pin 2 of the 74x174 is high. Hit reset or poke 0 back into that address, and it should go low. This is going to be how the drive density mode will be selected.
Step 3: the new clock circuit
I made a clock selector out of a 74AHC00. I intended to use a 2 to 1 data selector, but I didn't have any handy. If you want to build my clock selector:
- Bend all pins up except 7 and 14. Bend 1 & 2 so they touch. Bend 3 and 4 so they touch. Trim the rest. Solder the '00 on top of U6.
- Pin 2 of the 74x174 connects to pin 1&2 of the '00. Also solder a wire from pin 1&2 to pin 9 of the '00.
- Solder pin 3&4 together.
- Connect pin 6 to 12.
- Connect pin 8 to 13.
- Pin 10 goes to the 8MHz clock.
- Pin 11 feeds back into the clock input of the board. I used the land directly above the C in "C16"
This chip will select either the 8MHz clock or 4MHz clock. But, we don't have a 4Mhz clock yet. So, let's make one.
I used a 74LS112 J-K flip flop as a clock divider, but you can pick your preferred method. If I had one, I'd use a 74LS93 and piggy back onto the existing one- but I didn't. As a side note, the power pins on the '93 are not in the usual locations, so don't put anything on top of it except another '93.
For the LS112:
- Bend all the pins up except 8 and 16. bend the wires so that pins 2,3,&4 are touching. You can trim the rest.
- Solder the LS112 on top of U15. Solder pins 2,3,&4 to +5V (pin 16)
- Bring your 8MHz clock to pin 1.
- Solder pin 5 to pin 5 of the '00 above.
- Attach pin 15 to RESET. There's a convenient pad near the L in "LEIA" next to the DOS ROM.
About the FDC9216:
According to the data sheet, the FDC9216 is designed for 5.25" drives only. The FDC9216B is designed for both. I did get hold of FDC9216B chips for this project, but after it was working I put the original back in and discovered it worked fine. I'd recommend getting the FDC9216B just to be safe.
Feedback from the disk drive:
I was trying to read some data back from the disk drive. Pin 2 of the floppy connector is "density select". Some sources say its an input, some an output. I get nothing on it. The disk change input is pin 34. If you want to attempt to read these signals, here's how I did it.
I used a 74LS367A. Bent up all the pins and soldered it on top of another free chip.
- Pin 15 goes to pin 7 of the '139. That output is active during a read of $FF41
- Pin 14 to pin 2 of the disk drive connector. I also added a pull-up via a 150 ohm resistor to that line to +5V
- Pin 13 to D0 of the CoCo connector.
- Pin 12 to pin 34 of the disk drive connector. Also added the pull-up.
- Pin 11 to D7 of the CoCo connector.
My inputs work, but I'm not sure how to interpret the results I'm getting. The density select does nothing for me. Feel free to skip this step, as it's not required to make HD floppies work.