master
Branches
Tags
Go to file
Code
Open more actions menu
Folders and files
Name
Name
Last commit message
Last commit date
Latest commit
History
387 Commits
387 Commits
LICENSES
LICENSES
.gitignore
.gitignore
.gitlab-ci.yml
.gitlab-ci.yml
BSDmakefile
BSDmakefile
FUTURE.md
FUTURE.md
GNUmakefile
GNUmakefile
LICENSE
LICENSE
README.md
README.md
absaddr.h
absaddr.h
aclock.h
aclock.h
aclockdv.c
aclockdv.c
aclockvt.c
aclockvt.c
alvtst.c
alvtst.c
bdosdef.h
bdosdef.h
bdosinc.h
bdosinc.h
bdosmain.c
bdosmain.c
bdosmisc.c
bdosmisc.c
bdosrw.c
bdosrw.c
big.c
big.c
bios.c
bios.c
biosdef.h
biosdef.h
bringup.c
bringup.c
bringup.h
bringup.h
ccp.c
ccp.c
ccpdef.h
ccpdef.h
cleartpa.c
cleartpa.c
cls.c
cls.c
conbdos.c
conbdos.c
conctl.c
conctl.c
cpmrng.c
cpmrng.c
cpmrng.h
cpmrng.h
delay.c
delay.c
diverge.h
diverge.h
dskutil.c
dskutil.c
dumpdir.c
dumpdir.c
dumpfcb.c
dumpfcb.c
fileio.c
fileio.c
fparse.c
fparse.c
getsn.c
getsn.c
gfxtest.c
gfxtest.c
hd.c
hd.c
hello.c
hello.c
illegal.c
illegal.c
io.h
io.h
iosys.c
iosys.c
iotest.c
iotest.c
julia.c
julia.c
layout.inc
layout.inc
linker.ld
linker.ld
lrbc.c
lrbc.c
ls.c
ls.c
mandel.c
mandel.c
mbentry.s
mbentry.s
mem.c
mem.c
memmap.c
memmap.c
memmap.h
memmap.h
mk386.c
mk386.c
mltiboot.c
mltiboot.c
mltiboot.h
mltiboot.h
more.c
more.c
od.c
od.c
pause.c
pause.c
pit.c
pit.c
pit.h
pit.h
pktio.h
pktio.h
platform.h
platform.h
pmode.c
pmode.c
pmode.h
pmode.h
pmode.s
pmode.s
printenv.c
printenv.c
prng.c
prng.c
rc.c
rc.c
reboot.c
reboot.c
rm.c
rm.c
rtc.c
rtc.c
rtc.h
rtc.h
shole.c
shole.c
stage1.s
stage1.s
stage2.s
stage2.s
stat.c
stat.c
sync.c
sync.c
test211.c
test211.c
testbdos.c
testbdos.c
textmode.c
textmode.c
ticks.c
ticks.c
tod.c
tod.c
touch.c
touch.c
truncate.c
truncate.c
trunctst.c
trunctst.c
tsec.c
tsec.c
user.ld
user.ld
ver.c
ver.c
vgacon.c
vgacon.c
vgacon.h
vgacon.h
vgafb.h
vgafb.h
vgafont.c
vgafont.c
vgatext.c
vgatext.c
vgauser.h
vgauser.h
vidbios.c
vidbios.c
vidbios.h
vidbios.h
View all files
Repository files navigation
README
MIT license
More
items
CP/M-386
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
Overview
CP/M‑386 is currently in the
very
early 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
).
Hardware support
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 compatibility
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‑386
BDOS is at full parity with
CP/M‑68K 1.3
and
CP/M 2.2
.
A large majority of the
CP/M‑Plus
(
CP/M 3
) BDOS is also
supported.
More than 60% of the
DOS‑Plus
additions have been implemented.
Approximately half of the
MP/M
extensions 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/M
implementation.
Unique
CP/M‑386
‑specific BDOS extensions have been added to accommodate
new features like direct video access, high‑resolution timing, PRNG, etc.
Build requirements
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.
Downloads
Download the
current
CP/M‑386
build
.
View the
GitLab CI/CD
logs.
Compilation
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.
GCC
build (recommended):
make -Orecurse -j
”
$(
nproc
2>
/dev/null
||
printf
‘
%s
‘
1
)
”
make
test
Clang
build:
make -Orecurse -j
”
$(
nproc
2>
/dev/null
||
printf
‘
%s
‘
1
)
”
CC=
”
clang
”
It is recommended to use
GCC
as
Clang
‑compiled i386 code is larger.
Be sure to
make clean
if switching compilers or adjusting compiler flags.
32‑bit support libraries are required to run the test suite (
make test
).
‡
At the time of writing,
FreeBSD
is shipping non‑functional
cpmtools2
packages with broken
mkfs.cpm
functionality. To successfully
build on
FreeBSD
, you
must
rebuild
cpmtools
and ensure it is
not
linked with
libdsk
. If you receive a
Disc rejected by driver
error on
FreeBSD
from
mkfs.cpm
, your tools are
broken
and
cannot
be used to
build
CP/M‑386
.
Build output
The build produces two primary artifacts:
File
Description
cpm386.elf
Multiboot kernel image
floppy.img
Bootable 3.5″ 1.44MB floppy disk image
You can
download
pre‑compiled binaries above.
QEMU testing
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
QEMU notes
Use
-nographic -display none -vga none
to disable VGA video (and use
only
serial console).
Use
-serial none
to disable the serial UART (and use
only
VGA console).
Included utilities
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‑386
program!)
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‑Z8000
STAT 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)
Contributing
Do
not
open pull requests with large amounts of LLM‑generated code.
These will be immediately rejected.
There is currently
no
AI‑generated code in the operating system at this
time (though there
are
some 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
is
currently
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.
Future plans
See
FUTURE.md
.
Code statistics
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
Mirrors
The canonical home of this software is
https://gitlab.com/johnsonjh/cpm386
,
with a mirror on
GitHub
.
License
CP/M‑386
is 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.
About
CP/M-386: CP/M for 386 protected mode, derived from CP/M-68K
github.com/johnsonjh/cpm386
Topics
cpm
cpm22
cpm386
cpm86
cpmplus
Resources
Readme
MIT license
Activity
Stars
14
stars
Watchers
1
watching
Forks
0
forks
Report repository
Used by
Contributors
Languages