ZTO-80 Modular Computer System

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

Similar projects worth following
This project documents my progress to create a modular 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 give me credit in some way or another. 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. In progress
    4. PIO board:
      1. Not started
    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
  • CPU board:
    • On-board oscillator with enable jumper
    • Reset switch (also on backplane)
    • Breakout header for signals not included on bus
    • 74HCT data and address buffers allow for either a TTL or CMOS Z80*
      • CMOS is recommended for compatibility and because of availability
    • *Bus signals not buffered due to board size limitations. I have not tested with a TTL Z80, so use at your own risk.
  • Memory board:
    • 32K ROM, 32K RAM

ZTO-80 SBC Features: 

  • 6MHz Z80 processor 
  • 32K of ROM, from $0000 to $7FFF 
  • 32K of RAM, from $8000 to $FFFF 
  • Z80 SIO (DART) controlling a full RS-232 serial port (57600 baud) 
  • 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 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 if you use a Z80 SIO/0 in place of the DART. 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. Once I create a good BOM I'll add it to the project files, 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" can refer to either the SBC or the modular bus design. Usually, to clarify which 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 5mm barrel jack with a 2.1mm pin. 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 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.

The Z80 DART is a version of the Z80 SIO/0 with all synchronous functions dropped. It is hardly manufactured (although still active) and i cannot find any info on a CMOS version, so it was likely never created. For this reason, it may be desirable to substitute the DART for a Z80 SIO/0. This chip is still produced in its CMOS variant and is nearly pin compatible with the DART. The difference between the chips is that the SIO/0 has pins 11 and 29 as SYNCA and SYNCB for synchronous operation, while the DART uses them for RIA and RIB (ring indicators for modem control). These pins are grounded on my designs, so either the DART or SIO/0 will work just fine. Just be aware of incompatibilities between CMOS and TTL chips, but I've never had any noticeable problems when using a DART.

I have taken the time to create and layout schematics and PCBs for this project. They can be found at the GitHub link on this project page....

Read more »

  • 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.

  • Progress Update: Debugging the Hardware

    Jacob Hahn08/31/2019 at 02:27 0 comments

    Tonight, I got my multimeter and tested my prototype. Surprisingly, I couldn’t find any hardware faults, leaving only software as the culprit. Of course, this confused me, as the exact program had worked on my PCB V1.1.

    So, as a quick test, I wrote a little assembly software that would just send back whatever you typed over serial. After plugging the board in and typing a few characters, I found that it worked flawlessly! In my mind, this is a success: it shows that software, although simple, does run as I would expect it to while interfacing with the DART.

    The working test program running on SBC V2

    Finding this program working, my next step is to flash BASIC to the ROM chip and try to load it again. If it doesn’t work, I’ll have quite a bit of work to do.

    I’ll likely have an update tomorrow.

  • Progress Update #1

    Jacob Hahn08/30/2019 at 01:49 0 comments

    Hey everyone,

    I just thought I’d go ahead and give a quick update on how things are going with the project. Just tonight, I received enough parts to be able to make 2 more PCBs. I still haven’t been able to grab my multimeter to diagnose the non-working prototype, but I should be able to have it by tomorrow evening and test the board then. I’ll also take some time this weekend to solder at least one of the new boards and test it out.

    On another note, thanks for 10 likes. It might not seem like much, but as a sophomore in high school it’s more than I was expecting. I originally posted this project here to have a personal log that I could look at in the future and share with anyone interested. It’s completely outside of school and as such I need to be able to keep tabs on where I go with it, along with balancing time spent on it with schoolwork. It’s been an amazing way to learn about the workings of computers so far, along with being a fun hobby.

    Yesterday, I added a header in the details section for future plans. They’re goals that I want to try and work towards, and while I may not get to all of them, there are a few in there that I really want to try and do.

    Check back in a few days for when I finish soldering!

  • First PCBs and testing

    Jacob Hahn08/27/2019 at 04:56 2 comments

    A few days ago, I received an order of Z80 SBC PCBs for prototyping. I’ve been spending the past few days finding components and soldering, but I finished a board today.

    One of the PCBs I had made

    Unfortunately, I made the mistake of not soldering the large ground terminals of the serial port, thinking I wouldn’t stress the port enough to cause damage. Of course, once I plugged in a serial cable, the port flexed slightly, ripping the pad of pin 5 (ground) of the port off of the board. When I plugged the board in to test the output of BASIC, I got a few recognizable words but with lots of gibberish mixed in. I went ahead a used a enameled wire to connect pin 5 to a different ground pad, but the result was the same, so something else must have happened during the process of soldering or from the port damage.

    A PCB with everything soldered and a few ICs

    I checked the board thoroughly for any damage, such as broken traces, but could only find some scraped solder mask here and there on the back. Nothing major, and certainly nothing that would affect operation.

    Luckily, I already have some new components ordered and I should be able to have a new board made by this weekend.

    I’m also working on updating the PCB layout a bit for v2.1, including moving the ROM to the right a bit (so that I can use my IC prying tool with it!), a larger ground trace on the transistor array, and extended PIO pins. Thanks for the ideas, @Ken Yap!

    Stay tuned, as I’ll be adding details and info throughout the week.

    SBC V2 alongside SBC V1.1, my current working version

View all 10 project logs

Enjoy this project?



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


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...

  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