Close
0%
0%

ZTO-80 SBC + Bus

A Z80 single board computer designed to have many essential features built around a highly expandable central bus design

Public Chat
Similar projects worth following
This project documents my take on a Z80 single board computer. It is built to be usable and expandable, while still maintaining the feel of a vintage computer from its OS and chip selection. Currently, it is on its second version.
Alongside the SBC, a bus has been created to allow for the creation of highly customizable backplane-based computers which have the ability to be used for quick and efficient prototyping.

The system is inspired by many different Z80 computer designs, old and new. I will be adding links to some of these projects and other helpful documents.

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 absolutely love feedback and will always respond to questions/comments/criticisms.

More details (and updated photos) to come!

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!

Ideas for the future:

  • CP/M capability
    • I'll have to research CP/M further before trying to implement it
  • An additional serial channel
    • Completed for V2.1
  • An external keyboard/video board to allow standalone functionality 
    • VGA and PS/2?
  • A memory expansion board
  • An improved expansion bus
    • Completed for V2.1
    • Backplane-based (separate design and boards)
  • Better PCB layout
    • In progress for V2.1 and future versions
  • Combining the RAM/ROM and I/O decoding chips
    • Possible, but would likely change memory map and prevent more on-board I/O
  • A version that supports 74HC chips
    • V2.1 fully supports CMOS chips
  • Maybe power supply regulation
    • Would be on backplane
    • Linear regulator has min. input voltage of about 7V, so USB power (5V) couldn't be used without some kind of bypass
      • Jumper?

IC selection:

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

My Z80 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. Every part can be found on Digi-Key, except for the Z80 PIO and the SIO/0 (DART), which can both be found on Mouser. They can be expensive, so I have found that eBay is a good option to find chips for lower prices. Once I create a good BOM I'll add it to the project files.

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" or "ZTO-80 Bus".

Note that the power input for the SBC is 5V only and is not regulated on the board. Anything higher than 5.5V will damage or destroy some ICs! 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.

The Z80 DART is a version of the Z80 SIO with all synchronous functions dropped. It is hardly manufactured (although still active) and a CMOS version was 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 the SBC, so either the DART or SIO/0 will work just fine.

I have taken the time to create and layout schematics and PCBs for this project, and they can be viewed in the project gallery and interacted with at my EasyEDA page here. The boards have SMD passives, but they are large enough to easily solder even without magnification. I currently don't sell 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. I will likely start a Tindie page to sell boards and modules soon.

  • 1 × Z84C0006PEG 6MHz DIP Z80 CPU
  • 1 × AS6C62256A 32K x 8bit SRAM
  • 1 × ECS-2200BX-060 XTAL OSC XO 6.0000MHZ HCMOS TTL
  • 1 × ECS-2100A-018 XTAL OSC XO 1.8432MHZ HCMOS TTL
  • 1 × A-DS 09 A/KG-T2S DB9

View all 18 components

  • 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 8 project logs

Enjoy this project?

Share

Discussions

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