New IOS for XMODEM support

A project log for Z80-MBC2: a 4 ICs homebrew Z80 computer

Homemade 8MHz Z80 SBC, 128kB banked RAM, RTC, SD (HD emulation), Basic and Forth interpreters, CP/M 2.2 and 3, cross Assembler and C (SDCC)

Just4FunJust4Fun 03/10/2019 at 10:546 Comments
Because some people requested to use the XMODEM protocol to exchange files through the serial port, I've added the support for this protocol into CP/M 2.2 and CP/M 3 (banked only).

XMODEM needs a full 8 bit binary data transfer, and this is not possible with the CON port (the CP/M port used for the console) with a "legacy" CP/M system installation because the CP/M Alteration Guide says to strip the eight parity bit when reading a byte from the console input.

More, because the Z80-MBC2 uses a virtual serial port without handshaking there is also a timing problem when dealing with the 128 bytes packets used by the XMODEM protocol.

So the support to the XMODEM protocol has requested changes in the IOS and  in the CP/M BIOS, and also in the Arduino core to extend the serial input buffer.

Please note that with the new IOS the default speed of the serial port is now 115200 bps.

To have the XMODEM support active, before the update of the new IOS firmware and the new SD image (see in the Files section),  you have to manually create a new "board variant" in the Arduino IDE and then change the default Rx input buffer size to 128 bytes in the "core" of this new variant.

If you aren't interested into the XMODEM support, you can simply update the IOS and the new SD image as usual  without the need to create the new board variant. In this case the XMODEM will not work in the receive direction, but only in the send direction (from the Z80-MBC2 to a PC with a terminal emulator).


In the following I'll assume an Arduino IDE 1.8.5 installation on a linux host and the MightyCore ver. 1.0.8. Anyway I've tried to make the procedure enough general to be used for other versions too.

The first thing is find the directory where the MightyCore is located.

If you have installed Arduino IDE 1.8.5 and then installed the MighyCore with the Board Manager with the usual .json "pointer", the MightyCore is located in the "~/.arduino15/packages/MightyCore" directory:

Now you must locate the "~/.arduino15/packages/MightyCore/hardware/avr/1.0.8/cores" directory (note that the "1.0.8" part of the directory name depends on the MightyCore version, and so can be a different number if you have a different version of the MighyCore):

Note 1: note the ".arduino15" name with the dot, you must enable the hidden files view to see it with a the linux GUI.

Note 2: the name of the folder here depends on the MightyCore version, and so can be a different name (as MCUdude_corefiles or whatever it is) if you have a different version of the MighyCore. In any case you must duplicate it and rename it as explained in the following.

In this directory there is an other "MightyCore" (or whatever it is) folder. You must duplicate it and rename it exactly as "MightyCore_Z80MBC2":

Now go into the new copied folder MightyCore_Z80MBC2:

Locate the file "HardwareSerial.h" and open it with an editor:

Go to line 43 (may be a little different number on other versions) and change the value 64 with 128 as shown in the following image:

then save the file.

In the following image there is the same file related to the version 2.0.1 of MightyCore and already edited  (see line 53):

Now go back to the "~/.arduino15/packages/MightyCore/hardware/avr/1.0.8" directory:

Locate the file "boards.txt" and open it with an editor. This file is divided in various "sections". Each section is the description of a board variant. In the MightyCore each board variant is a different supported Atmega MCU. In the following image there is the starting of the Atmega32a section. Find it in the file (it starts at about line 440) :

Select all and only the Atmega32a section as shown (about in the range from line 440 to 535):

 and copy it in a new file "temp.txt" on your desktop folder for further editing:

Now you have to change every occurrence of the string "32." at the beginning of the lines with the string "32Z80MBC2." (mind the dot!). Do not use a "change all" approach, but check every change carefully.

At the end the temp.txt file should be like this one:

Now change the comment at line 2 as in the following image:

Now change the string "Atmega32" at the right of the variable "" at about line 5 with the string "ATmega32 (Z80-MBC2)" as in the following image:

and change the string "MightyCore" (or whatever it is) at the right of the variable "" at about line 17 with the string "MightyCore_Z80MBC2" as in the following image:

Save the file temp.txt, select all the content and copy it into boards.txt after the Atmega32a section (and before the Atmega16a section):

now save the file boards.txt. All done!

To check if you have done it right, open Arduino IDE. In the "Tools -> Board" menu now you should select the "Atmega32 (Z80-MBC2)" board variant:

Choosing this one the Rx buffer will be 128 bytes large, allowing the XMODEM support. Now you can compile the new IOS and upload it.

Note that the new IOS checks if this extended buffer is active, and in this case will print a status line during the boot phase:
In the drive A: of the CP/M 2.2 and 3 disk set of the new SD image, I've already copied the right XMODEM utility to use:


The corresponding directory where MightyCore is installed is: C:\Users\<user_name>\AppData\Local\Arduino15\packages\MightyCore, where <user_name> is your user name under windows.

Given that, follow the guide for linux (is the same procedure).


Hans wrote 04/27/2019 at 22:12 point

There is a MUCH easier way to increase the RX buffer size. You actually don't need to modify the core files at all! Assuming you're building the ATmega32 source code without LTO, all you need to do is add -DSERIAL_RX_BUFFER_SIZE=128 to this line in boards.txt:

  Are you sure? yes | no

Just4Fun wrote 05/21/2020 at 19:09 point

Many thanks! I've used this way and it worked perfectly!

  Are you sure? yes | no

Ben wrote 01/07/2022 at 09:19 point

Hi Hans.  I added this to my boards and teh MBC2 reports that it found the extended Rx Serial, but when i try to receive a file, the MBC2 resets.  I'm sending from linux:

sx test.txt < /dev/ttyUSB0 > /dev/ttyUSB0

and on the MBC2:
XMODEM test.txt /R /X0

Any suggestions?

  Are you sure? yes | no

Russell Leu wrote 03/13/2019 at 20:03 point

Windows 10, Arduino IDE 1.8.7 with Mightycore 1.0.8 - went through the procedure successfully but get "

Arduino: 1.8.7 (Windows 10), Board: "ATmega32 (Z80-MBC2), Standard, 2.7v, Disabled (default), 16 MHz external"

Board 32Z80MBC2 (platform avr, package MightyCore) is unknown

Error compiling for board ATmega32 (Z80-MBC2).

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences." 

when trying to compile.  Any tips?

  Are you sure? yes | no

Just4Fun wrote 03/14/2019 at 07:50 point

Please address this in the users group on FB. I'm currently working to solve the MBASIC issue....

  Are you sure? yes | no

yeti wrote 04/28/2019 at 03:33 point

"Please address this in the users group on FB."


Please don't force us to sell our privacy to FB.

Why split information over lots of places? If HAD.IO is not enough, please let's use GitHub issues to discuss problems.

  Are you sure? yes | no