The needed ICs for the "base system" are:

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 only the CMOS version of the Z80 CPU can be used here. This because only CMOS version, under given condition that are respected in this schematic, has logical levels compatibles with Atmega32A and 74HC00.


You should use a  Z80 CMOS speed grade of at least 8MHz for full speed, but setting the clock speed at 4MHz you can use a 4MHz Z80 CMOS version too (or you can try to overclock it at 8MHz...). The 74HC00 can be substituted with a 74HCT00 if you already have one. The RAM chip TC551001-70 can be substituted with any suitable 128kB SRAM).

Please note that the USER led  * must * be blue or white (or pink... I've some pink leds that seems to have a Vf like blue one. May be I'll do a board with them...) just to be sure that V(forward) is >= 2.7V (otherwise the USER key may not work as expected).

The J4 connector (AUX_P) is not currently supported and is not populated by default.

The three solder jumpers (SJ1-3) on the bottom side are not currently supported and must  be left opened (as stated in the schematic).


The  SERIAL port (J2, see schematic) can be connected with a TTL-RS232 adapter, or with a serial-USB adapter.
I've used a serial-USB adapter that acts also as power source for the Z80-MBC, and has the DTR signal for the "autoreset" driven from the Arduino IDE. For a terminal that has a serial TTL port no adapter is needed.

Of course to upload a "sketch" from Arduino IDE you need to use a serial-USB adapter connected to the SERIAL port.

Note that the RTS and CTS pins of the SERIAL port are not currently supported and must be left not connected (as the NC pin!).

The 3V3 pin of the serial-USB adapter must be left disconnected  (if present).

You should use those Serial-USB adapters that have the DTR pin on the connector. It is suggested to have also the CTS/RTS signals available for future upgrades.

Please note that all the pin names of J2 on the PCB are referred to the serial-USB adapter, so all the signals as TX and RX are relative to the serial-USB adapter side (in other words TX and RX are already "inverted". See the schematic).

Here a suggested serial-USB adapter based on a CP2102 (very common on ebay):


The RTC is a common module based on a DS3231  RTC  like this one:

This cheap modules have a trickle charging circuit that may cause the "explosion" of the battery if you use a standard CR2032 cell. More, it can damage also a rechargeable LIR2032 cell. For more information and how to fix it see here.

The RTC module has it's own pullup resistors on SDA and SCL. Because the value is 4k7 (the same value used inside the Z80-MBC2 board), the resulting value will be:

4k7 // 4k7 = 2k3

Because this value is fine there is no need to take away the pullup on the RTC module.

Pay attention on how and where you plug the module in  (the only right connector for it is J5 marked as RTC_MOD). If you plug it in the wrong connector or in the wrong way it is possible cause permanent damages to both the module and the Z80-MBC2 board! So plug it as shown in the photos (here a board with the GPE option installed):


uTerm (micro-Term) is a VT100-like terminal for the Z80-MBC2. It has a VGA out and PS/2 keyboard connector, a power supply for the Z80-MBC2 and a "transparent" serial-USB port.

uTerm can be mounted horizontally or vertically to the Z80-MBC2.

With the uTerm the Z80-MBC2 becomes an "autonomous" computer:

All the details on the uTerm are here.

* * uCOM, RS232 FOR THE Z80-MBC2 * *

uCom (micro-Com) is a RS232 adapter for the Z80-MBC2. It has a power supply for the Z80-MBC2 and a "transparent" serial-USB port.

uCom can be mounted horizontally or vertically to the Z80-MBC2:

With the uCom the Z80-MBC2 can be used with a "vintage" RS232 terminal:

All the details on the uCom are here.


I've "ported" the Basic interpreter to the Z80-MBC using the sources provided in the great Grant Searle site , after the needed modification due the different HW design. In the Grant's site is requested an acknowledgement to his site to use this source, so I did here (and I have also emailed to him about this thing). The resulting ROM image is stored inside the Atmega32A (only for IOS-LITE) and loaded in the TC551001 RAM by the Atmega32A during the system boot. The original manual of this Basic interpreter is here.

The Forth interpreter is a modified version (for the Z80-MBC2) of that one provided by Bill Westfield for the Z80-MBC.


To enter in the "Select boot mode or system parameters" you must press the RESET key (SW2), release it and press immediately the USER key (SW1) and keep it pressed until the IOS led starts to blink.

An other way is to press both keys, release the RESET key holding the USER key down until the IOS led starts to blink, or you see the menu on the screen.

In the following screenshots is shown the menu when both the RTC module and the GPE option are installed for IOS-LITE and IOS:


The Z80-MBC2 maps any disk like A: B: C: etc. into an image file on SD card with this file name: DSxNyy.DSK;

where x (from  0 to 9) is OS:

0 = CP/M 2.2
1 = QP/M 2.71
2 = CP/M 3

and yy (from  00 to 15) is the disk (00 = A: 01 = B: etc.).

You can download CpmtoolsGUI (English Windows version) from here.

Extract the file CpmtoolsGUI.exe in a new folder and add/overwrite the file diskdefs copying it from the folder cpmtools inside the SD.

-> STEP 1

Select in the upper left window (Image File) of the CpmtoolsGUI tool the virtual disk where you want to add files.

For CP/M 2.2 and QP/M 2.71:

select "z80mbc2-d0" only for disk 0 or "z80mbc2-d1" for the others (disk 1 - 15) in the bottom left window (Format) of CpmtoolsGUI.

In the following image is selected (Image File) the disk DS0N02.DSK that corresponds to the disk C: (yy =  disk = 02) of the CP/M 2.2 OS (x = 0):

In the center window you can see all the files inside the selected virtual disk (disk 0 - 15).

Please note that if you choose an empty disk (like P:) you won't see any file name in the center window of the CpmtoolsGUI tool.

For CP/M 3:

select in the bottom left window (Format) of CpmtoolsGUI "z80mbc2-cpm3" for any disk.

In the following image is selected (Image File) the disk DS2N00.DSK that corresponds to the disk A: (yy =  disk = 00) of the CP/M 3 OS (x = 2):

-> STEP 2

To add one or more files to the selected virtual disk you have simply point the upper right selection window to the folder where the new files are stored in your PC, select them using the bottom right selection window and press the "<- P" button. After the add you'll see the added file names in the center window (together with the others file previously present).

-> STEP 3

Exit from the the CpmtoolsGUI tool pressing the eXit button.

More info here and here.


When using iLoad to load an executable program in Intel-Hex format from the serial port, remember to set a 50/90ms delay on every transmitted line into the serial port setting of the SW terminal you are using.

In the following image there is the setting window for TeraTerm:

This is required because the standard serial port of the Arduino firmware doesn't use any handshaking control.


Currently both IOS-LITE and IOS are available. The first is a simplified version that doesn't support the SD, the second is a full featured version that requires the SD module (e. g. to run CP/M).

The current revision of IOS allows you to run CP/M 2.2, CP/M 3.0, QP/M 2.71, UCSD Pascal and Collapse OS (and the stand-alone versions of Basic and Forth, the same supported by IOS-LITE) with 16 virtual disks (8Mbytes each) for each OS.

The add-on board uTerm has been released.

The add-on board uCom has been released.

Not suited for aerospace applications!

* * HOW TO GET A PCB * *

Because some people asked about this, I've prepared an "easy" link to get a small lot (5 pcs minimum) of PCB. The link is this one.

If you live in Japan there is this seller in the Tokio area (I'm not "affiliated" with him...).


If you are looking for a kit with all the needed parts or an assembled unit ready to use now there is a professional seller that can sell both and ship worldwide.

The link to the seller is this one.

* * Z80-MBC2 USER GROUP * *

An "User Group" was created on Facebook: https://www.facebook.com/groups/388307645238660/


All the project files (SW & HW) are licensed under GPL v3.

If you use this material in any way a reference to the author (me :-) ) will be appreciated.

CP/M seems to be Open Source now (see here).

PetitFS was developed by ChaN.

Basic stand-alone interpreter was an adaptation from Grant Searle work.

Forth stand-alone interpreter was originally ported to the Z80-MBC by Bill Westfield.

UCSD Pascal was ported by Michel Bernard.

Collapse OS was designed and ported by Virgil Dupras.