CP/M‑386 is CP/M for 386 protected mode, derived from CP/M‑68K.
- Overview
- Hardware support
- CP/M compatibility
- Build requirements
- Downloads
- Compilation
- Build output
- QEMU testing
- QEMU notes
- Included utilities
- Contributing
- Future plans
- Code statistics
- Mirrors
- License
CP/M‑386 is currently in the veryearly development stages.
- Full 32‑bit protected mode implementation with Ring‑3 TPA.
- Bootable via 3.5" 1.44MB floppy disk MBR or GRUB Multiboot kernel.
- Supports VGA text (
0xB8000) and/or COM1 serial (9600/N/8/1,0x3F8) consoles. -
No floppy/hard disk/CD/USB/network/sound/other drivers(- yet).
-
Compatible with 386 (and later systems) with 2MB (or more) memory.
- Systems using either PC BIOS or UEFI (with CSM) are supported.
- VGA, 8042 PS/2, 8250/16450/16550 UART, CMOS RTC, and 8253/8254 PIT are supported.
CP/M‑386 should be highly source‑compatible with other implementations:
| System | BDOS coverage |
|---|---|
| CP/M‑68K 1.3 | 100% |
| CP/M 2.2 | 100% |
| CP/M‑Plus | 71% |
| DOS‑Plus | 62% |
| MP/M 2.1 | 50% |
The system currently reports BDOS 2.2 to applications.
- The CP/M‑386BDOS is at full parity withCP/M‑68K 1.3andCP/M 2.2.
- A large majority of the CP/M‑Plus(CP/M 3) BDOS is also supported.
- More than 60% of the DOS‑Plusadditions have been implemented.
-
Approximately half of the MP/Mextensions have been completed.- The missing functionality is largely the multi‑user, multi‑tasking,
message queuing, and process control calls that don't apply to a
single‑user CP/Mimplementation. -
The missing functionality is largely the multi‑user, multi‑tasking,
message queuing, and process control calls that don't apply to a
single‑user - Unique CP/M‑386‑specific BDOS extensions have been added to accommodate new features like direct video access, high‑resolution timing, PRNG, etc.
The following dependencies are required to compile CP/M‑386:
- AWK
- Cpmtools†
- GNU Binutils
- GNU Coreutils
- GNU GCC or LLVM Clang
- GNU Make
- NASM
- QEMU (required only for testing)
†Be sure to use cpmtools version 2.23 or later. Older
versions may appear to work but have several known bugs.
- Download the
current CP/M‑386build. - View the GitLab CI/CD logs.
Building CP/M‑386 is supported on current releases of NetBSD and
FreeBSD‡, and most recent Linux distributions.
The following are the minimum versions of Linux distributions that have been
verified to build CP/M‑386 successfully: CentOS Stream 9, Fedora 36,
Debian 12, Ubuntu 18.04 (with gcc-16 from ppa:ubuntu-toolchain-r/test),
Ubuntu 22.04, Alpine 3.24, and OpenSUSE Leap 15.4.
-
GCCbuild (recommended):- make -Orecurse -j "$(nproc 2> /dev/null || printf '%s' 1)" make test
-
Clangbuild:- make -Orecurse -j "$(nproc 2> /dev/null || printf '%s' 1)" CC="clang"
-
It is recommended to use GCCasClang‑compiled i386 code is larger.
- Be sure to
make cleanif switching compilers or adjusting compiler flags. - 32‑bit support libraries are required to run the test suite (
make test). -
‡At the time of writing,- FreeBSDis shipping non‑functional-
cpmtools2packages with broken-mkfs.cpmfunctionality. To successfully build on- FreeBSD, you- mustrebuild-cpmtoolsand ensure it is- notlinked with-libdsk. If you receive a-Disc rejected by drivererror on- FreeBSDfrom-mkfs.cpm, your tools are- brokenand- cannotbe used to build- CP/M‑386. -
The build produces two primary artifacts: File Description
cpm386.elfMultiboot kernel imagefloppy.imgBootable 3.5" 1.44MB floppy disk image
You can download pre‑compiled binaries above.
-
Multiboot
kernel (recommended):
qemu-system-i386 -m 2M -serial stdio -monitor none -kernel "cpm386.elf" -
Floppy MBR loader:
qemu-system-i386 -m 2M -serial stdio -monitor none -drive if=floppy,format=raw,file="floppy.img" -boot a -
Use
-nographic -display none -vga noneto disable VGA video (and useonlyserial console). - Use
-serial noneto disable the serial UART (and useonlyVGA console).
| Program | Description |
|---|---|
| ACLOCKDV.386 | aclock (VGA text console version) |
| ACLOCKVT.386 | aclock (ANSI terminal version) |
| BIG.386 | Multi‑extent loading test executable |
| CLEARTPA.386 | Clears (zeros) and optionally verifies the TPA |
| CLS.386 | Clear screen (BDOS 221) |
| DELAY.386 | Delay test (BDOS 141) |
| DEMO.SUB | SUBMIT demonstration |
| DUMPDIR.386 | Directory entry dump utility (BDOS 17/18) |
| DUMPFCB.386 | File control block dump utility (BDOS 15) |
| ENV.DAT | Environment data file |
| FPARSE.386 | F_PARSE test (BDOS 152) |
| GETSN.386 | Display serial number (BDOS 107) |
| GFXTEST.386 | Graphics and framebuffer demo (BDOS 229/230/231/233) |
| HD.386 | Hex dump utility |
| HELLO.386 | Hello world (the very first CP/M‑386program!) |
| ILLEGAL.386 | Ring‑3 protection and exception handler test |
| IOTEST.386 | File I/O BDOS tests |
| JULIA.386 | Draw a Julia set fractal (terminal version) |
| LRBC.386 | Query and/or set Last Record Byte Count |
| LS.386 | List files (with sizes) |
| MANDEL.386 | Draw a Mandelbrot set fractal (terminal version) |
| ALVTST.386 | Get Allocation Vector test (BDOS 27) |
| MEM.386 | Memory map utility (BDOS 227/228) |
| MORE.386 | UNIX more‑style pager |
| OD.386 | Octal dump utility |
| PAUSE.386 | Wait for keypress |
| PRINTENV.386 | Print environment and system data |
| PRNG.386 | PRNG test and demo utility (BDOS 253/254) |
| PROFILE.SUB | SUBMIT script (automatically executed at boot) |
| RC.386 | Return code test and query (BDOS 108) |
| README.TXT | Sample text file |
| REBOOT.386 | Reboot utility (BDOS 220) |
| RM.386 | UNIX rm‑like interactive file deletion utility |
| SEROFF.386 | Disable serial console (BDOS 223) |
| SERON.386 | Enable serial console (BDOS 223) |
| STAT.386 | STAT (A port of Zilog CP/M‑Z8000STAT v1.0C 01/03/84) |
| SYNC.386 | Synchronize disks (BDOS 48) |
| TEST211.386 | Numeric format test (BDOS 211) |
| TEXTMODE.386 | Query and set the console text mode (BDOS 229/230/231) |
| TICKS.386 | High‑resolution timer tests (BDOS 225/226) |
| TOD.386 | Get (and set) Time of Day clock (BDOS 104/105) |
| TOUCH.386 | Create an empty file |
| TRUNCATE.386 | File truncation utility (LRBC aware) |
| TRUNCTST.386 | Truncation tests (BDOS 99) |
| TSEC.386 | Get date and time (BDOS 155) |
| VER.386 | Display OS version (BDOS 163) |
| VGAFONT.386 | Load a text console font or restore the ROM font (BDOS 232) |
| VGAOFF.386 | Disable VGA text console (BDOS 222) |
| VGAON.386 | Enable VGA text console (BDOS 222) |
| VGATEXT.386 | VGA text direct access demo (BDOS 224) |
- Do notopen pull requests with large amounts of LLM‑generated code. These will be immediately rejected.
- There is currently noAI‑generated code in the operating system at this time (though therearesome AI tests, comments, and analysis), as the project is intended to be as much of a learning experience for me as it is a useful OS port.
- Usage of AI (artificial intelligence) tools by contributors iscurrently permitted, subject to the same terms and conditions as the LLVM AI Tool Use Policy, but this permission may be withdrawn at any time and without notice.
See FUTURE.md.
| Language | Files | Lines | Blank | Comment | Code | Complexity | Bytes | Uloc |
|---|---|---|---|---|---|---|---|---|
| C | 65 | 31160 | 6146 | 4379 | 20635 | 4356 | 730364 | 10665 |
| C Header | 22 | 3054 | 551 | 1233 | 1270 | 13 | 111663 | 1558 |
| Makefile | 2 | 1570 | 300 | 201 | 1069 | 331 | 52823 | 773 |
| Assembly | 6 | 1351 | 235 | 266 | 850 | 1 | 31040 | 700 |
| Markdown | 2 | 478 | 58 | 0 | 420 | 0 | 21907 | 378 |
| Linker Script | 2 | 169 | 34 | 0 | 135 | 0 | 3923 | 82 |
| YAML | 1 | 80 | 6 | 15 | 59 | 0 | 3196 | 63 |
| Total | 100 | 37862 | 7330 | 6094 | 24438 | 4701 | 954916 | 14146 |
-
The canonical home of this software is
https://gitlab.com/johnsonjh/cpm386, with a mirror on GitHub. -
CP/M‑386is distributed under the terms of the permissive MIT License.
- Bryan W. Sparks of DRDOS, Inc. dba DeviceLogics LLC, successor in interest to Digital Research, Inc.’s CP/M assets, explicitly grants an unlimited authorization to use, distribute, modify, enhance, and otherwise make available CP/M technology, including the CP/M operating systems and their derivatives.