RunCPM - RunCPM - Z80 CP/M Emulator by MockbaTheBorg.
Description from GitHub repository:
"RunCPM is an application that can execute vintage CP/M 8-bit programs on many modern platforms, such as Windows, Mac OS X, Linux, FreeBSD, Arduino DUE, and variants like the Teensy or ESP32. It can be built both on 32 and 64 bits host environments and should be easily portable to other platforms.
RunCPM is fully written in C in a modular way, so porting to other platforms should only require writing an abstraction layer file for it. No modification to the main code modules should be necessary."
You will find a number of versions an mods. I have complied it for a Mac, Raspberry Pi Pico, Waveshare RP2040-PiZero, and a few other boards. I prefer the boards with a MicroSD card reater built in.
The board I am using now is the Adafruit Metro ESP32-S3 with 16 MB Flash 8 MB PSRAM.
Features:
ESP32-S3 Dual Core 240MHz Tensilica processor - the next generation of ESP32-Sx, with native USB so it can act like a keyboard/mouse, MIDI device, disk drive, etc!
WROOM module has FCC/CE certification and comes with 16 MByte of Flash, 8 MByte Octal PSRAM
Power options - USB type C or Lipoly battery
Built-in battery charging when powered over USB-C
LiPoly battery monitor - MAX17048 chip actively monitors your battery for voltage and state of charge / percentage reporting over I2C
Reset and DFU (BOOT0) buttons to get into the ROM bootloader (which is a USB serial port so you don't need a separate cable!)
JTAG 2x5 Header for more intense debugging
Serial debug output pins (optional, for checking the hardware serial debug console)
STEMMA QT connector for I2C devices, with switchable power, so you can go into low power mode.
On/Charge/User LEDs + status NeoPixel with pin-controlled power for low power usage
Low Power friendly! In deep sleep mode we can get down to ~100uA of current draw from the Lipoly connection. Quiescent current is from the power regulator, ESP32-S3 chip, and Lipoly monitor. Turn off the NeoPixel and external I2C power for the lowest quiescent current draw.
What changes have I made:
WiFI: I wanted to put it on my network for reasons you will see in a bit. Like setting the clock in the ESP32, and i'll be using a RTC also. Just so you know, CP/M 2.2 does not care one bit what the time and date are. It doesn't use it. From what I have read there were a few CP/M computers back in the day that did have a 'clock chip' in them.
Telnet: I didn't want to have to keep the board connected to a computer to access it. So I used a module by Mark Bramwell to add this ability. It works very well, but I belive it is just for an ESP32, so you might need to modifiy it for other boards.
Printing: The default way to print from a program on RunCPM is to send it to a file when printing to a standard LST: device. The change I made was to send the text to a network printer. Not as easy as you might think. I did get this working, quite well as a matter of fact. I do think i have a couple of issues that I will explain.
Web Interface: I wanted a way to make changes without having to recompile the code each time. I created a web interface that will allow me to select the CCP, control output devices (ie. network printer), and other settings.
Status Screen: Totally not needed but I think it looks cool. I added an OLED display to let me know what is happening and the device's IP address.
RunCPM code uses a lot of #ifdef in the code, by replacing them with a boolen flag that can be toggled, I am increasing the size of the complied code by a bit. With all of the items I have added I'm only at about 50% of available flash on the ESP32 board I am using.