Z80-MBC2: 4ICs homemade Z80 computer

8MHz Z80, 128kB banked RAM, RTC, Disk on SD, Basic and Forth interpreters, CP/M 2.2 and 3, cross Assembler and C (SDCC) toolchains

Similar projects worth following
The Z80-MBC2 is an easy to build Z80 SBC (Single Board Computer).

It is the "evolution" of the Z80-MBC (, with a SD as "disk emulator" and with a 128KB banked RAM for CP/M 3 (but it can run CP/M 2.2 too).

It has an optional on board 16x GPIO expander, and uses common cheap add-on modules for the SD and the RTC options. It has an "Arduino heart" using an Atmega32A as EEPROM and "universal" I/O emulator (so a "legacy" EPROM programmer is not needed).

It is a complete development "ecosystem", and using the iLoad boot mode it is possible cross-compile, load and execute on the target an Assembler or C program (using the SDCC compiler) with a single command (like in the Arduino IDE).


The needed ICs for the "base system" are:

  • Z80 CPU CMOS (Z84C00) 8Mhz or greater
  • Atmega32A
  • TC551001-70 (128kB RAM)
  • 74HC00

If you want the 16x GPIO expansion (GPE option) add a MCP23017 too.

The schematic and the BOM are attached in the Files section. The MCU Atmega32A is used as universal I/O subsystem, as Eeprom, and as reset and 4/8MHz clock generator for the Z80 CPU.
Inside the Atmega32A it is flashed an Arduino bootloader taken from here, and it is possible to use the Board Manager of the Arduino IDE to "import" it.

Flash the Arduino bootloader at first (with the method you prefer), next you can upload the IOS "sketch" (the I/O Subsystem that interacts with the Z80 bus and "virtualizes" the EEPROM and all the peripherals seen by the Z80 CPU) using Arduino IDE.

You can use the on board ICSP port J3 (also called ISP port) to write the bootloader, but remember to disconnect any other connector when using it. Also both SD and RTC modules (if present) must be removed from the board when the ICSP port is in use.

As clock source for the Z80 CPU it is used the 16MHz Atmega32A oscillator, so the "external 16MHZ osc." bootloader variant must be chosen when flashing the bootloader from the Arduino IDE!.

The 74HC00 is used as RS flipflop to stop the Z80 CPU during I/O operation, giving the needed time to the Atmega32A to interact with the Z80 bus, and as part of the MMU.

Note that...

Read more »

The sketch for the IOS (with the needed libraries). Unzip into a folder and open the .ino file (with Arduino IDE). IOS is required for CP/M 2.2, CP/M 3.0 and QP/M 2.71 (the SD module is mandatory).

Zip Archive - 38.29 kB - 10/11/2018 at 16:54


The content of the microSD needed to run CP/M 2.2, CP/M 3.0 and QP/M 2.71 with IOS S220718-R190918

Zip Archive - 2.67 MB - 10/11/2018 at 16:53



The famous game Super Startrek kindly debugged by a RetroBrew Computer Forum user. Play with Caps-Lock activated! Now the animation works...

bas - 20.18 kB - 08/07/2018 at 16:32



Instructions for STARTREKV2.BAS

bas - 6.80 kB - 08/04/2018 at 21:48


Examples with Basic.txt

Some examples showing the new "Virtual I/O Engine" with the stand-alone 8K Basic interpreter.

plain - 4.07 kB - 07/31/2018 at 20:57


View all 10 files

  • 1 × See the file "A040618 BOM v2.ods" in the FILES section.

  • uTerm preview: a VT100 terminal for the Z80-MBC2...

    Just4Fun12/28/2018 at 10:16 0 comments

    Currently working on a VT100 terminal with VGA out and  PS/2 keyboard with a power supply (for the Z80-MBC2 too). It has a "transparent" USB-TTL adapter connector, so you can upload firmware or load an Intel-Hex file (with iLoad) while the card is inserted. Both the "mixed" power supply situations (USB-TTL adapter not powered from USB but Z80-MBC2 powered and vice-versa) are managed. The video terminal is based on the ChibiTerm (

    Stay tuned...

    Working on a new revision (A071218-R250119):

  • Overclocking the Z80-MBC2...

    Just4Fun11/02/2018 at 09:51 0 comments

    Because the Mighty Core gives the chance to choice a 20MHz bootloader, I've decided to try to "overclock" the Atmega32A using a 20MHz quartz:

    You don't need others HW changes, just use a 20MHz quartz instead of a 16MHz one. The Z80 clock speed will be at 10MHz.

    You have to select the "20MHz external" option in the "Toos" menu of Arduino IDE before flashing the 20MHz bootloader:

    Of course you need to load the sketch again (using the "20MHz external" option). IOS will display the new clock speed:

    Remember that using a 20MHz quartz you are out of the Atmega32a specifications (the Atmega32a is rated at 16MHz max.), so you are in a "grey area" where things "may works"...

  • CP/M 3 up and running on the Z80-MBC2!

    Just4Fun10/11/2018 at 06:58 0 comments

    With the last IOS revision and the corresponding SD files "pack" there is one more option: the CP/M 3.0!

    With CP/M 3.0 it is possible use the 128KB banked RAM to have a wider user area (TPA) for programs and a more "evoluted" OS.


    Just as example of how it is easy with CP/M 3.0 manage multiple configurations, I've done also a "non-banked" 64KB version. The switch from one version to the other can be done simply running a batch from the console itself.

    I've prepared two simple batch files to do that. From drive A: the command:

    submit sys64

    will set the 64KB "non-banked" version and then reboot the system.

    To activate again the 128KB "banked" version give the command (from drive A:):

    submit sys128


    To use cpmtools or cpmtoolsGUI with the virtual disks of the CP/M 3.0 environment, you must update the DISKDEFS definition file (from the SD in the folder <SD>/cpmtools/) and use the "z80mbc2-cpm3" entry for all the 16 disks:

    Please note that for the CP/M 3.0 environment all the 16 virtual disks have the same structure and for this there is only one entry for all the CP/M 3.0 virtual disks.


    The AUTOEXEC switch for CP/M 3.0 works in a different way from the CP/M 2.2 and QP/M 2.71 implementations.

    Now there is a custom utility (AUTOEXEC) that checks the IOS flag and sets the exit code accordingly (using the BDOS function 108). This allow to use the CP/M 3.0 batch conditional execution (see the CP/M 3 Programmer Guide par. 1.6.3) to run any wanted command or program based on the status of the IOS AUTOEXEC flag.

    I've prepared an example using an other CP/M 3.0 feature, the "PROFILE.SUB" batch that is automatically executed at cold boot (if it exists). To activate it (in the drive A:) rename the file PROFILE.SU as PROFILE.SUB with the command:


    Now you can see how it works setting the AUTOEXEC flag on or off with the IOS "Select boot mode or system parameters" menu.

  • QP/M 2.71 up and running (with IOS multi-boot management...)!

    Just4Fun09/17/2018 at 18:26 0 comments

    With the last IOS revision and the corresponding SD files "pack" there is an interesting alternative to CP/M developed by MICROCode Consulting that supports also file timestamping, and it is 100% CP/M 2.2 "compatible".
    MICROCode Consulting has released the original installation files and all the documentation in their site with the "restricted usage" condition, that means free for non-commercial use and for personal use only.

    To enable timestamping (see upper screenshot) you need to install the optional RTC module.
    I suggest to read the QP/M documentation for the various commands (see the Downloads section in their site).


    The QP/M uses for the batch file the .QSB extension. So the AUTOEXEC file is now renamed AUTOEXEC.QSB. To enable the AUTOEXEC execution after the cold boot change the corresponding state to ON from the usual IOS boot selection menu. In the drive A: there is an example of AUTOEXEC.QSB file ready to run.


    Now the IOS has a new entry (8) in the boot menu to manage the OS multi-boot configuration:

    Each OS is associated with a set of virtual disks called "Disk Set", and changing the "Change Disk Set..." entry (8) will switch all the virtual disks of his "environment".

  • CP/M 2.2 up and running on the Z80-MBC2!

    Just4Fun09/08/2018 at 18:24 0 comments

    The new IOS is out, and the CP/M 2.2 OS with it, and 16 disks are available (from A: to P:), each 8Mbyte large.

    With IOS (not for IOS Lite) the SD module is mandatory to run not only CP/M 2.2 but also for the stand-alone Basic and Forth interpreters. You need a microSD card (FAT16 and FAT32 are both supported) to store the content of the SD zip file, retaining the directory structure.

    Pay attention on how the modules are inserted because their positions are fixed and absolutely not swappable (see the upper photo).

    To add, extract or delete files inside a virtual disk (virtual disks filenames on SD are "DS0Nxx.DSK", where "xx" is the disk number) it is possible use the cpmtools or cpmtoolsGUI utilities, with the diskdefs file in the \cpmtools directory of the SD zipped file.

    I suggest to use  cpmtoolsGUI (only for Windows) because is very easy.

    Unzip it into a folder and put the diskdefs file in the same folder.
    Select "z80mbc2-d0" only for disk 0, and "z80mbc2-d1" for the others (disk 1 - 15):

    NOTE: use cpmtoolsGUI only to add, extract or delete files inside a virtual disk. Not try to create new virtual disks files with cpmtools or cpmtoolsGUI because further processing is required for a valid virtual disk file.

  • How use the ICSP port with the USBasp programmer under linux to burn the bootloader

    Just4Fun07/27/2018 at 15:57 0 comments

    A cheap and easy way to burn the Arduino bootloader is to use an USBasp programmer that is commonly available:

    The USBasp is also capable to give the power to the "target" using the VCC pin, but remember to check that the JP1 jumper is set to provide 5V to the target (as shown in the photo).

    Please note that the pinout of the USBasp is a little different from the "standard" ICSP (os ISP) pinout:

    In the previous picture it is possible see that pins 4 (TXD) and 6 (RXD) are not at GND as expected  by the standard ICSP port, and pin 3 is not NC.

    See the following picture showing the standard 10 pin ICSP pinout:

    So you must consider this when connecting the USBasp to the 6 pins ICSP port (J3) on the Z80-MBC2 (see the schematic):

    To avoid problems I suggest to use as GND pin 10 of the USBasp connector, and connect the other pins (VCC, MISO, MOSI,SCK, RST) accordingly.

    An handy way to connect the USBasp to the 6 pin ICSP port (J3) of the Z80-MBC2 could be to use a commonly available "10pin to 6pin" adapter like this:

    but you cannot use it "as is" because its internal connections are done for a "standard" ICSP port, and we have seen that the USBasp connector differs from the standard one.
    The schematic of the adapter shows that isn't compatible "as is" with the UABasp connector:

    To use it is a good idea isolate the pins 4, 5 and 6 cutting the trace on the PCB of the adapter that connects those pins together, and then check with a tester.
    In the following photo are shown the three cuts (thin red lines inside the green "circle") to do:


    To easily burn the bootloader follow these "quick and dirty" steps (tested on a linux Mint OS with Arduino IDE 1.8.5):

    STEP 1: Connect the 10 pins connector of the USBasp programmer to the 6 pins ICSP port (J3) of the Z80-MBC2 (using wires or a modified adapter as discussed before);

    STEP 2: Verify carefully that any other connector of the Z80-MBC2 is not used, and verify that both the SD and RTC modules (if present) are removed from the board;.

    STEP 3: Only at this point connect the USB side of the USBasp programmer to an USB port of your workstation;

    STEP 4: Open a "terminal" window on your workstation and go to the directory where there are the Arduino IDE executables, and get the root privileges with the command:

    sudo su

    then run the Arduino IDE with the command:


    STEP 5: Because Arduino IDE is running as the root user it is necessary re-install the "core" for the Atmega32. Open the Board Manager as you already did (anyway  the guide is here). Note that you must do this step only the first time you execute the Arduino IDE as root;

    STEP 6: Now from the Tools menu of Arduino IDE select "Atmega32" as "Board", "16 MHz external" as "Clock", and "USBasp" as "Programmer". Then you can burn the right bootloader (without playing with the FUSE setting) selecting "Burn Bootloader" from the same "Tools" menu.

    All done!

View all 6 project logs

Enjoy this project?



Peabody1929 wrote 08/27/2018 at 18:30 point

I finished building my board.  It starts up, outputs messages to the serial monitor but seems to stop after the message: 

"IOS: Z80 is running from now".  

The Z80 clock is set at 4MHz

The boot mode is 1: Basic.

What should I do next to debug the issue?  

  Are you sure? yes | no

Just4Fun wrote 08/27/2018 at 19:49 point

Which method have you followed to flash the bootloader?

  Are you sure? yes | no

Peabody1929 wrote 08/31/2018 at 02:54 point

I have tried two methods of flashing the bootloader.  Each time used a different ATmega 32 part.  Both times the USB interface was a USBTinyISP V2.0.  First time it was connected via a 10 pin cable to a ATmega32 dev board with a 40 pin ZIF, a 10 pin socket and all the pins brought out to headers.  The second time was using a 6 pin cable connected to the ISP connector on the MBC2 board.  In the Arduino IDE v1.8.5 selected the programmer as USBTinyISP (MIghty Core) and click Burn Bootloader.  There were no error messages and the flash was successful.

Unfortunately this made no difference in behavior.

One difference is that I am using a Z84C00020PEC.  This is a 20MHz Z80.  Is there a possibility of a narrow clock pulse glitch that a 8MHz part would never see?

Finally, I think the ATmega32 is operating correctly.  I plugged in a MCP23017 and a new message appeared: "IOS: Found GPE Option".

  Are you sure? yes | no

Just4Fun wrote 08/31/2018 at 07:31 point

I'm using the same Z80 (Z84C00020PEC) on Z80-MBCs and Z80-MBC2s without problems...

And the method you use to flash the bootloader seems correct to me (I use the USBasp, but the USBTinyISP should be ok because you are using the Arduino IDE "facility" to burn the bootloader, so should be not possible to have fuse bits configuration errors because they are managed by the IDE...).

Try to change a different Atmega32A, just to be sure that your part is not faulty.

After that it seems that the problem can be the CPU or the SRAM, because you arrive at the point when the program should be loaded into SRAM and the Z80 starts to execute it.

  Are you sure? yes | no

Peabody1929 wrote 09/01/2018 at 01:02 point

IT WORKS!!!!  I replaced every chip except the SRAM.  Following your suggestion, I replaced the SRAM.  The board now works perfectly; BASIC comes up and runs.   I am a happy camper.  Thank you for the help!


  Are you sure? yes | no

Just4Fun wrote 09/01/2018 at 07:47 point

Great! Can you tell me the exact part name  of the faulty SRAM?

BTW: Thinking to add a SRAM test....

  Are you sure? yes | no

Peabody1929 wrote 09/01/2018 at 18:32 point

The faulty SRAM part number is: HM628128ALP-7  The replacement part is: HM628128LP-12.  The replacement part is an older generation and slower part.

If you like, I can send you the failing part by mail.

P.S.  I have some HM628128BLP-7 parts as well.  Perhaps in the next build I will give these a try.

  Are you sure? yes | no

Just4Fun wrote 09/03/2018 at 09:40 point

Thanks, but it is enough if you could just keep it. So if I have the time to write a memory test it is possible to use the faulty SRAM for testing...

BTW: may be that this can interest you: :)

  Are you sure? yes | no

Julian wrote 08/26/2018 at 20:24 point

Thinking of using this design as a basis for experimentation -- do you know if it's likely to run OK on breadboard, or is the PCB essential?

  Are you sure? yes | no

Just4Fun wrote 08/27/2018 at 15:44 point

Yes it can be done. Just the quartz oscillator could be "critical" on the breadboard, but if you use the internal oscillator (8MHz) you shouldn't find any problem.

You can give a look to the previous Z80-MBC on breadboard too (

  Are you sure? yes | no

villaromba wrote 08/11/2018 at 07:51 point

Built up my board yesterday - no output!! until I realised I had clock fusebits inverted!! Reprogrammed AVR (TL866) and then it worked immediately, pleased all hardware/soldering was 100%!!. Put my AVR on a ZIF, just fits nicely. RTC should be here over weekend. I already have a Pololu SD so hoping that will be ok when ready to fit. Thanks again J4F for another excellent design and look forward to where it might develop.

  Are you sure? yes | no

Just4Fun wrote 08/11/2018 at 08:02 point


I think this may interest you... :) :

PS: Check carefully that the Pololu SD has the 3.3V regulator and level shifters on board, and how to connect it as it is different from that one I've used here.

  Are you sure? yes | no

villaromba wrote 08/11/2018 at 10:39 point

Great!!! - it works with the Pololu SD card, with level shifters (all I had) just needed to make small adapter to ensure pin compatibility. 

  Are you sure? yes | no

villaromba wrote 08/12/2018 at 15:42 point

What will be the longer term plan for CP/M files on the SD Card e.g will it be able to read files from Peter Schorns Z80 simulaior (  or Z80 pack (  OR ???

  Are you sure? yes | no

Just4Fun wrote 08/12/2018 at 16:34 point

The first link is interesting as i didn't know anything about it. (the second is well known).

About the SD,  I'll use "disk files" each equivalent to a disk of 512 tracks of 32 sectors. A sector is 512 bytes large, as the SD physical sector. So any SW that can "understand" this can read/write files on it.

E. G. using cpmtools with the correct parameters will work (I hope...) :)

I've to manage a "deblocking" algorithm for CP/M2.2, because it can use natively only 128 bytes sectors (CP/M 3 can use 512 bytes sectors natively, as far I know...), and this will take "some" time...

  Are you sure? yes | no

Just4Fun wrote 08/05/2018 at 11:57 point

For those interested I've set up a twitter account to follow the "day by day" developments (and others things too)...:

  Are you sure? yes | no

Norihiro Kumagai wrote 08/05/2018 at 07:23 point

I have one comment, some N-MOS CPU also work well, at least, NEC upd780-1 works well on both Z80-MBC, and Z80-MBC2.  If someone have one or more N-MOS Z80, It might work on these boards.

  Are you sure? yes | no

Norihiro Kumagai wrote 08/05/2018 at 07:19 point

I built a PCB and see the BASIC prompt and run a Blink BASIC program.  Quite good.  Thank you very much. If you are interested in it, please refer my blog  or my tweet (@tendai22plus).

  Are you sure? yes | no

Just4Fun wrote 08/05/2018 at 09:27 point

You have a very good blog. It's really a pleasure read it!

  Are you sure? yes | no

Just4Fun wrote 08/02/2018 at 17:02 point

HI all, and thanks for your comments!

Here IOS booting from SD:

Now starting to play with CP/M 2.2...

  Are you sure? yes | no

Mark Jungwirth wrote 07/31/2018 at 17:05 point

I just ordered 5 PCBs from

Is anyone planning a component order that others could tag along on?

Awesome work, J4F!!!

  Are you sure? yes | no

john wrote 07/31/2018 at 19:28 point

Hey Mark - I've got the parts from the original board that I'm planning to reuse, but  if you've got an extra board you'd be willing to part with, I'd be willing to buy one from you.

  Are you sure? yes | no

Mark Jungwirth wrote 07/31/2018 at 20:01 point

John, not a problem.  I only paid for ePacket delivery so it might be a couple of weeks.  My cost is $3 and I should be able to send USPS first class for less than $1.

  Are you sure? yes | no

Jeff Davis wrote 09/05/2018 at 06:51 point

I'm going to do a big parts order, if you haven't ordered yours yet. I also have bunch of parts in boxes I'll pull from and use, can send you whatever I have spare. I probably have a lot spare.

  Are you sure? yes | no

john wrote 07/28/2018 at 20:52 point

Great job!!! Again!

  Are you sure? yes | no

villaromba wrote 07/28/2018 at 19:51 point

Ordered pcb from EasyEDA. Looking forward to start building in a few weeks. It will be good to have the SD Card this time. Be so much easier to load up!!!

  Are you sure? yes | no

Peabody1929 wrote 07/29/2018 at 04:01 point

Could you share how you uploaded the gerbers to EasyEDA?  I get "Bad File Format".

  Are you sure? yes | no

villaromba wrote 07/29/2018 at 08:28 point

When I ordered (got transferred to JLCPCB) it asks for Gerber files - so I just uploaded the zip file from this site, kindly provided by Just4Fun. All went through ok without any problems. So maybe you should download zip file again and try a new upload to EasyEDA in case one or the other corrupted.

  Are you sure? yes | no

nemfield wrote 07/28/2018 at 12:16 point

Excellent work. There is elegance in simplicity , and you nailed it. I'll be ordering boards asap. 

  Are you sure? yes | no

Norihiro Kumagai wrote 07/28/2018 at 02:37 point

I ordered 10 PCBs with your garber data to fusionPCB.  I am quite looking forward to receiving them to start soldering.  Thank you for your kindly preparing.

  Are you sure? yes | no

Just4Fun wrote 07/28/2018 at 06:26 point

Thanks! Happy soldering... :-)

  Are you sure? yes | no

Jose Manuel Arenas wrote 07/27/2018 at 18:44 point

Very nice project. I love it.

  Are you sure? yes | no

Just4Fun wrote 07/27/2018 at 19:22 point


  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