Close
0%
0%

ZTO-80 Computer System

A powerful Z80 computer built around a highly expandable central bus design

Public Chat
Similar projects worth following
This project documents my progress to create a Z80 computer system. It is built to be usable and expandable, while still maintaining the feel of a vintage computer from its OS and chip selection. The modular bus allows for the creation of highly customizable backplane-based computers which have the ability to be used for quick and efficient prototyping.
Alongside the bus, an SBC has been designed to give users simple access to essential features of the system, and is perfect for those wishing to get started with the Z80 CPU.

The system is inspired by many different Z80 computer designs, old and new.

Feel free to do whatever you’d like with this project, as long as you attribute it to me and follow the terms of the license. You could try building a board yourself, expanding off of it, or using it as a reference or inspiration for a project of your own.
I enjoy feedback and will always respond to questions/comments/criticisms.

Project Roadmap:

  1. Port PCB designs to KiCad
    1. CPU board: 
      1. Complete!
    2. Memory Board:
      1. Complete!
    3. SIO board: 
      1. Complete!
    4. PIO board:
      1. In progress
    5. Front Panel:
      1. Not started
    6. Backplane 5:
      1. Complete!
    7. SBC:
      1. Complete!

ZTO-80 Modular System Features:

  • Custom bus built for the Z80 family and beyond
  • Pre-designed backplane, CPU, memory, SIO, PIO, CTC, and other boards
  • Nearly infinite potential for customization and expansion
  • Built using off-the-shelf parts

ZTO-80 SBC Features: 

  • 8MHz Z80 processor 
  • 32K of ROM, from $0000 to $7FFF 
  • 32K of RAM, from $8000 to $FFFF 
  • Z80 SIO (DART) controlling two TTL serial ports
  • Z80 PIO controlling two channels, one connected through a darlington transistor array 
  • Z80 CTC with four software-programmable timer/counter circuits 
  • Modified NASCOM BASIC (Microsoft BASIC) interpreter 
  • Bus expansion header 
  • Open-source hardware!

IC selection:

The heart of the ZTO-80 System is the Z80 CPU, first designed by Zilog in 1975.

The ZTO-80 SBC is designed around hardware that would have been available during the 1980s, with only a few exceptions. Despite this, however, all of the hardware to create the SBC is still manufactured and readily available, including the entire Z80 family and the 74xx family. As of writing, every part can be found on Digikey. They can be expensive, so I have found that eBay is a good option to find chips for lower prices. However, you do need to be careful about fake and counterfeit chips. There is a BOM for the SBC in the GitHub repository, but most of the part numbers are silkscreened onto the board or can be found in the schematics.

Important hardware info:

The term "ZTO-80" refers to the project as a whole. Usually, to clarify which part I am talking about, I'll say either "ZTO-80 SBC," "ZTO-80 Bus," or "ZTO-80 Modular System."

Note that the power input for the SBC is 5V only and is not regulated on the board. Anything higher than 5.5V can damage or destroy some ICs! On the SBC or backplane, power is provided through a 5.5mm barrel jack. I choose to use a cable such as this one so that I can use a USB port or AC adapter as a power source. On the modular system SIO card, either serial port can be used to provide power to the whole system, which is useful as it means that you only need one cable to use a minimal system. It is very important to only connect one power source at a time. I recommend removing the serial power jumpers from any port not being used to receive power so that it is difficult to accidentally connect multiple power sources at once.

Although my system is designed to use a CMOS Z80 SIO/0, the older Z80 DART will still work due to its compatible pinout. It is a TTL IC, but it seems to still work fine in a CMOS system from my tests with it.

I have taken the time to create schematics and PCBs for this project. They can be found at the GitHub link on this project page. At the beginning of the year, I migrated from using EasyEDA to KiCad. I am in the process of redesigning all of my designs with KiCad. Most boards are complete, but it will take a little longer to finish the remaining designs. The boards have 0805 SMD passives, but they are large enough to easily solder even without magnification. You can also find plenty of SMD soldering tutorials online, including a quick one for passives made by me here.

I currently don't sell modular system PCBs, but you can have them ordered through JLCPCB or any other fabrication service. An order of 5 of the SBCs (excluding shipping) costs $8 from JLCPCB, and 5 boards of any ZTO-80 module type costs $4. 

I sell the latest version (v3.1) of the ZTO-80 SBC on my Tindie page here. You can also find the Tindie banner for the product at the top of the page. Thank you for supporting the project!

Ideas for the future:

  • CP/M capability
    • A new SBC would have to be designed and I would have to create a new memory module.
  • An external keyboard/video board to allow standalone...
Read more »

  • The ZTO-80 SBC is for Sale

    Jacob Hahn10/01/2020 at 16:45 0 comments

    Over the past couple of weeks, I've been getting everything ready for the v3.1 boards to be sold online.

    After receiving the new boards, plus parts to make one board, I soldered one and tested all of the features using the same methods I used to test v3.0. All of the issues that I had identified were successfully fixed in this revision.

    I also rearranged the headers to be mostly concentrated on one side of the board. This improved the usability of the board's features slightly, as a breadboard can be placed on one side of the board and easy access most signals.

    Now that the boards were designed and tested, I decided to work on selling them on Tindie. This required a few steps: setting up the Tindie shop, taking photos, and preparing shipping. The most time consuming of these steps was shipping. I had to figure out a good base rate to charge for anywhere in the US, and also one for certain international destinations (which is harder, as different countries cost different amounts to ship to). I also had to choose what packaging I would use to ship the board. To do all this, I took a few trips to the post office and sorted everything out. I'm now confident that I'm giving the best deal I can on shipping to anywhere in the US and some international destinations.

    At the time of writing, I have 7 boards in stock. I'm not expecting to sell many at all, so I believe that will be more than enough for now!

    You can find the Tindie listing to buy the boards here. I appreciate every sale I get and each one motivates me to continue to work on the project.

    Next up on the project agenda is to complete the modular system. This includes a backplane that can attach to the ZTO-80 SBC using the expansion header and horizontal headers. When I get to a good spot, I'll post an update.

  • Testing v3.0

    Jacob Hahn08/30/2020 at 03:57 0 comments

    Hi everyone,

    Over the past couple of weeks, I've been working hard to test all of the features of the SBC v3.0.

    When I first plugged in the board to test it after soldering, I was sad to find that it did not work immediately, which I had hoped it would. This was because of two issues. First, I hadn't updated the software to support the new SIO addresses, which were changed since v2.0 to be more standard. That was an easy problem to fix. The second reason was due to an issue with my schematic. I had incorrectly wired the I/O decoding circuitry enable pins, so it was never activating the SIO. I fixed this by cutting some traces and adding jumper wires.

    After that, the board booted, so I could test the rest of the features. The first obvious feature issue was that the footprint for the DB9 serial port was incorrect. Apparently, KiCad's library was using a footprint that was outdated and not used in any existing DB9 connectors. Up to that point I was using the TTL serial port to control the board and hadn't inserted the MAX202 chip. However, when I did, the TTL serial port stopped working. This was because of an internal pulldown resistor in the MAX202, and it was impossible to bypass. Due to all the issues plaguing the full serial port, and due to the fact that removing it would take a chip and 5 capacitors with it, I decided to remove it from the design.

    The next issue was the PIO. This was only a minor issue and didn't truly affect the design. I had forgotten that the ULN2803A was inverting, and so it would make more sense to break out VCC on the Channel B header than it would to break out GND. I changed this on the schematic, but on the setup I have I used the VCC pin on the expansion header to provide power to my LEDs I used to test.

    Finally, I tested the CTC. To do this, I wrote a little piece of code that would print "TIMER DONE" whenever the timer finished. I chained two CTC units to get an output about every second. This code worked flawlessly, and so I know the CTC works fine.

    Now, I'm all set to get an order of the final v3.1 prototypes. If all goes well, I will then be able to order the final production batch and begin to sell them. I'll update you then.

  • Behind the Scenes Work

    Jacob Hahn08/18/2020 at 03:59 0 comments

    Recently, I took a break from working on this project to keep up with school and work on a few other more pressing things. However, when summer came along, I decided to continue to work on the ZTO-80.

    So far, I've done tons of behind the scenes work to improve the project. I've ported nearly every board to KiCad, and redesigned the SBC into version 3.0, which adds more functionality and customization than the last boards in the series. I'm beginning to think that this is the most I can fit on an SBC (look at all the traces!), and so I'm planning on making a modified version of the backplane that can attach to the SBC.

    One of the biggest changes I've made is creating a GitHub repository for the project, where I'm now hosting the latest versions of all ZTO-80 PCBs, along with the latest port of BASIC. You can find everything you need to make the project there. Whenever I make changes, I upload them straight there, so you always get the latest revision. Currently, I'm still modifying and finalizing the designs, so I would hold off until I test the designs before you order your own PCBs. You can find a link to the repository in the links section of this project.

    Another thing that I've made is a full user's guide to the SBC. It includes everything needed to get started with the SBC, including a BOM, assembly instructions, and software installation instructions. You can find it in the GitHub repository under PCB/SBC/. 

    Also, I'm creating a Tindie store to sell the SBC and modules for those who don't want to deal with having them fabricated themselves. The first product, hopefully coming in just a couple of weeks, will be the SBC. I plan to sell both the bare boards and also kits with all the parts included.

    I have prototype boards for the SBC v3.0 on the way from JLCPCB right now, with an estimated delivery of Friday, so you can expect an update then.

    In the near future, I plan to give this project page a much-needed overhaul. Stay tuned for that.

  • Testing out KiCad and my Issues with EasyEDA

    Jacob Hahn01/22/2020 at 14:25 0 comments

    Up until this point in the ZTO-80's development, I have been using EasyEDA as my main EDA program for making schematics and laying out PCBs. It works well and has all of the features I need while still being very easy to use. It also has simple integration with JLCPCB, which is where I order my boards. It does, however, have its drawbacks. Being an online service, you can't use it without an internet connection. Furthermore, although it has an extensive library of user-created symbols and footprints available, the included symbols are unorganized, not always well made (unless they are linked to LCSC), and somewhat difficult to modify. This isn't helped by a poor interface to choose parts and lacking library management. While the integration with LCSC is helpful and provides good symbols, the service doesn't have most of the parts that I need and I prefer DigiKey. It also isn't widely compatible with other programs (such as KiCad).

    Due to these reasons, and also because of the potential volatility of EasyEDA's free plan in the future, I have chosen to migrate to a new EDA software. I originally thought that I would move to Eagle, as it is well known in the industry and has much documentation. However, I didn't like the limitations of the free version, so I looked elsewhere, settling on KiCad. It's open-source, completely free, capable, and supported by organizations such as CERN.

    I followed the very helpful Getting Started guide on KiCad's website, and quickly learned my way around the software and designed a test board. I'm still getting used to the new workflow, but I can already tell that it will be much easier to manage than EasyEDA.

    One issue with migrating to KiCad is that EasyEDA doesn't have a feature to directly export to KiCad. After looking around, I discovered this script, which is supposed to allow export to Kicad from EasyEDA. Text doesn't come out very well, but the rest seems fine. Even with this script, though, I probably will just end up using the dimensions of my boards to port them by hand.

    I still plan to use EasyEDA for smaller projects and all my current designs will still be hosted there, but expect me to upload KiCad files to this project in the near future!

  • First Working Modular Prototype!

    Jacob Hahn01/04/2020 at 06:36 0 comments

    It's been quite a while since I've last posted, so I thought I'd update on what's been happening in the meantime. I've been working hard on the modular ZTO-80 design, and finally ordered the boards. I changed the pinout of the bus multiple times, finally landing on a version that keeps efficient trace routing for both the Z80 CPU and other peripherals. To keep things as simple and expandable as possible, I split the CPU and memory into their own modules. Currently, then, I have created a backplane, CPU card, 64K memory card, SIO card, PIO card, and a front panel board. The CTC card has not been designed yet.

    Read more »

  • A Change of Plans and a New Design

    Jacob Hahn10/30/2019 at 04:26 0 comments

    In the last log I posted, I had said that I would be ordering PCBs for my new SBC V2.1 design. However, after refining the schematic and PCB as much as possible, I decided that along with the SBC, I would build a modular, backplane-based design to allow for much more versatility, easy prototyping, and lower costs. Along with this, I decided I should finally give my project an official name. Z80 SBC is far too generic and could refer to any SBC design. Thus, the ZTO-80 was born.

    The name ZTO-80 is the name of the general design of my Z80 system. It can be used to refer to either the SBC or the newly-made 40-pin bus I have designed for the system. The name itself comes from a combination of Z80, as this is the processor the system is built around, and my middle initials, T and O (yes, I have two middle names).

    While the design of the ZTO-80 SBC has remained about the same since the last update, I decided that instead of having to order a completely new SBC everytime I made a change, I could break the main functions of the SBC into modules and order the new individual module when I changed something. As of now, there are 5 main parts of the ZTO-80 modular system: the backplane, CPU/Memory, Serial I/O, Parallel I/O, and CTC. Except for the backplane, all of the modules are on cards. Because the modules are seperate, unneeded features can be left out, reducing the cost of the system and adding space for custom modules.

    The bus has been created to keep the most important signals from the Z80, such as the address and data bus, I/O and memory control lines, the clock, and interrupts, while leaving out non-essential signals, such as DRAM refresh and BUSREQ/BUSACK. This creates a bus that uses only 34 of the 40 available pin. Two of the remaining pins are used for TX/RX (only one module can use these signals at a time, modules should have jumpers instead of connecting directly to these lines) and the last 4 pins are left open for the user.

    I will still be updating the SBC, and with this new design created I may also redesign the SBC to have much more efficient routing.

    On my EasyEDA page, I have created a project that outlines the template for the design of a ZTO-80 module. It should be a very useful resource for creating cards of your own.

    P.S. Grant Searle's page for his 7-chip Z80 computer was closed for some reason or another, and I couldn't find a new version, so I just replaced the link on the project page with an archived copy.

  • V2.1 is on the horizon!

    Jacob Hahn09/29/2019 at 04:27 0 comments

    Recently, I have been putting my full focus of the project on designing and refining the SBC V2.1. I have some great new features on it while keeping the PCB just about the same size. The largest of the additions is likely the new expansion bus, which has been designed to be very similar to RC2014 (albeit with some slight variations to make the design easier to manage) and allows for nearly endless amounts of freedom to expand the board. It has been implemented with a 40-pin header just like on V2.0. Next is the addition of a TTL serial port that is connected to channel B of the Z80 DART. The port is using an FTDI cable pinout, so cables are easy to find. With a little work, the port could be made to communicate with a device such as an Arduino or Raspberry Pi to add something like a USB keyboard. 

    Along with these major changes, I have added some small fixes and edits. One of these changes is leaving no inputs floating, so the board should be reliable for CMOS chips. I've always used a CMOS Z80 and peripherals without problems, but now it's guaranteed to work. I've also added two pins to the PIO headers. One pin (pin 10) is a ground pin so that it's easier to ground your connections, and the other (pin 9, only on port B) is a common cathode pin for the flyback diodes on the ULN2803A. No more fried transistors from your motors! Pin 9 is left unconnected on port A as it doesn't have a transistor array.

    While working on this design, I had the idea to make a smaller version of the board that has the PIO, CTC, SIO + serial ports, and power jack removed, allowing it to be very compact and easily usable in a backplane-based environment. It would also be cost effective, as it would be under 100x100mm. Of course, the downside to this design is that it would have to be used along with a backplane and at least a serial board. Do you think I should create it? My current board is too large to be reliably used on a backplane, so I'll probably use a ribbon cable to connect it temporarily.

    I should be placing an order for the new boards within the next few weeks.

  • Progress Update: CTC Tests and PCB Revisions

    Jacob Hahn09/23/2019 at 03:26 0 comments

    For the past few days, I've been working on developing a simple test program for my CTC. The goal of the software is to print "Timer start", wait 1 second, and print "Timer done". The timer runs off of the system clock (6MHz) so that it can be divided into exactly 6Hz. This is done by setting up a timer with a 16x prescaler and 250 time constant, the zero output of which is fed into a counter which counts down 250 events. Each time the counter hits 0, it throws an interrupt, which the CPU then handles using an interrupt routine. Each time the interrupt routine is called, the CPU adds 1 to a memory cell. If the cell is equal to 6, the timer is finished and "timer done" is printed, ending the program. The math ends up looking like this:

    (((6000000/16)/250)/250)/6 = 1Hz

    Therefore, the timer lasts for exactly 1 second. Of course, you can change the duration of the timer by editing the value in the RAM cell that the program checks for. You can find the code here.

    As usual, there were some hiccups along the way. As I was testing the program, I realized that the CPU was never running its interrupt routine, which meant that either the routine was programmed incorrectly or that the CPU was never receiving a pulse on its INT pin. The problem happened to be the latter of the two, and so I looked over my CTC programming to see if I had made any kind of mistake, which I hadn't. With software out of the way, I began to debug hardware. After analyzing my PCB schematic, I noticed that I had hooked the baud clock signal up to the CLK pin of the CTC. I had done this on purpose, as the baud clock could be easily divided into exactly 1Hz using only one timer. What I failed to realize is that this caused the CTC to be out of sync with the CPU (duh) so they couldn't communicate. Oops! With an X-Acto knife and a bit of enameled copper wire, I was able to hook the main clock signal up to the CTC and disconnect the baud clock.

    A simple wire bridge
    Cutting the baud clock trace

    This wiring issue, along with a few other issues, have been fixed in version 2.1 of my PCB. The most important of these fixes include better CMOS support (no inputs left floating), moving the ROM socket for easier access, adding a TTL serial header on the SIO channel B, GND pins on the PIO headers along with a common cathode pin for the flyback diodes on channel B, and some general layout changes.

    I should have some new PCBs within a few weeks and I'll update on any changes before then, as well as updating the project details section.

  • LIF: Saving my ROM

    Jacob Hahn09/08/2019 at 05:37 0 comments

    Tonight I was looking around eBay to check for low prices on parts I need to build my SBC, and I came across a socket called a "Low Insertion Force" socket. These sockets are built for prototyping or chips that are made to be removed often and they are much cheaper than ZIF sockets. The standard IC sockets I use hold onto the chips inserted into them very tightly, which is great for any that I don't have to remove, but in my case is bad for my ROM IC. I need to remove it and replace it many times to experiment with code, so the tight grip could eventually start to cause damage from stress to the board and socket. With these LIF sockets, I can hold my IC in tightly and remove it easily when I need to, and I can fit them into a standard socket so I can remove them when I have my final code. I went ahead and bought 10 of them for less than a dollar a piece.

  • Progress Update: More than a Basic Success

    Jacob Hahn09/01/2019 at 02:49 0 comments

    After much testing and thinking, I've (finally!) found the issue in my project preventing BASIC from running properly.

    After the test program worked, I reflashed BASIC to the EEPROM and started the SBC with it. To my surprise, it booted just fine, and BASIC worked as expected. However, when I clicked the reset button on the board to test if it would work a second time, nothing happened. I kept pressing it, and after about 10 tries, it finally reset properly. Strange. The last thing that I would have expected to have caused all of the issues I faced was a faulty push button. So, as confirmation, I attempted to reset the board by shorting the reset pin to GND, and it reset immediately every time I did it. Well, that explains it.

    NASCOM BASIC running on SBC V2

    Next up, I'm going to work on a way to test the CTC and do some basic timing operations.

View all 13 project logs

Enjoy this project?

Share

Discussions

REL wrote 05/10/2020 at 05:14 point

this is a such a nice straightforward design! shame on me for not auditing the board *before* i had it made though.. i found out the hard way the v2.1 board you have up has the tx pin (TXA232) on the dsub disconnected, and the data out from the max202 (TXA).. tied to vcc.

  Are you sure? yes | no

Jacob Hahn wrote 05/10/2020 at 05:17 point

Thanks for taking interest! I’m glad to see people are actually making this. About the issue, I really should have caught that. I never actually had 2.1 manufactured. In fact, I’m going to add if I’ve personally tested each design or not. Also, I recently moved to KiCad for my designs, so I haven’t looked at EasyEDA for a while. I want to eventually port all my designs from there into KiCad.

  Are you sure? yes | no

REL wrote 05/10/2020 at 05:22 point

i happened to have a full NOS set - dart/pio/ctc/z80 - and this was a perfect little design. just thought i'd put the warning out there though, the max202 got VERY mad at me. cheers

  Are you sure? yes | no

Jacob Hahn wrote 05/10/2020 at 05:24 point

I just took a look at my design on EasyEDA. I don’t see the issues you’re describing! I actually copied and pasted the serial design directly from version 1.0 and 2.0, both of which have been tested thoroughly. Could you point out where you see the issue? I want to fix it ASAP.

  Are you sure? yes | no

smartroad wrote 08/30/2019 at 07:17 point

Hi! Just wanted to say I love this project, especially if you can get video for it. It is something I wish more 8bit SBCs would look at! :)

  Are you sure? yes | no

Jacob Hahn wrote 08/30/2019 at 11:03 point

Thanks! I’ll work towards that!

  Are you sure? yes | no

Jacob Hahn wrote 09/29/2019 at 04:25 point

Hey,

A quick update on the video addition, I have received a couple of NEC μPD7220 graphics display controllers, along with some pretty rare Zilog clones of the device. I was planning on using them for the video, but they are incredibly complicated to wire, use, and program, and also hard to find. I think I'm going to stick with a Parallax Propeller chip for VGA generation.

  Are you sure? yes | no

Dave's Dev Lab wrote 09/29/2019 at 18:26 point

just a side note, i have been experimenting with building a VGA video card. initially for the 8088 PC systems, but the design could easily be adapted to work with other platforms based on 6502 or Z80... https://hackaday.io/project/167089-isa-8-bit-video-experiments

  Are you sure? yes | no

Jacob Hahn wrote 10/11/2019 at 03:37 point

@Dave's Dev Lab Dave, that is incredibly helpful. Thank you so much!

  Are you sure? yes | no

Ken Yap wrote 08/26/2019 at 14:17 point

BTW @Jacob Hahn the inclusion of the ULN2803 is a brilliant idea but I hope you will put a thick ground trace for it, as it is rated for up to 500mA (driving motors etc becomes possible) and it would be a pity if the PCB trace wasn't adequate. Perhaps change from 8 to 10 pin connector to include ground and the common cathodes of the clamping diodes.

  Are you sure? yes | no

Jacob Hahn wrote 08/26/2019 at 15:40 point

Thanks for letting me know. I didn’t realize just how much current it could switch and was really just thinking about LEDs at the time. In the next PCB revision I’ll change the pins and widen the ground trace by a good amount.

  Are you sure? yes | no

Hpag wrote 08/26/2019 at 10:29 point

Hello, do this Z80 computer will support VGA output?

  Are you sure? yes | no

Ken Yap wrote 08/26/2019 at 10:48 point

Obviously you're meant to use the serial interface to talk to it. Or develop an external interface.

  Are you sure? yes | no

Jacob Hahn wrote 08/26/2019 at 11:12 point

Ken is correct here. There’s no video interface built into the board, but you could create a VGA board using the bus expansion pins.

  Are you sure? yes | no

Hpag wrote 08/26/2019 at 12:50 point

Are you guys planning to make a VGA board?

  Are you sure? yes | no

Ken Yap wrote 08/26/2019 at 13:25 point

Jacob can answer but leave me out of it, I'm just an interested observer. I've got most of the components but not sure if I want to make one. I'm guessing the board is > 100x100 mm so will be more expensive.

  Are you sure? yes | no

Hpag wrote 08/26/2019 at 13:31 point

what if you use a prototyping board for it?

  Are you sure? yes | no

Jacob Hahn wrote 08/26/2019 at 14:55 point

I plan to eventually just as a test. I’ll post here when I do.

  Are you sure? yes | no

Jacob Hahn wrote 08/26/2019 at 15:32 point

I just received some PCBs from JLCPCB the other day. This afternoon I’m gonna solder one and create a log based on it. They weren’t too expensive and are good quality.

  Are you sure? yes | no

Ken Yap wrote 08/26/2019 at 13:41 point

Count the number of pins of the ICs, that's 40x3 + 28x3, plus the smaller ones. No thank you, I'm so over point to point wiring. I'd rather pay and wait for PCBs in that case.

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates