cpmtools is a set of command-line utilities for reading, writing, and managing CP/M disk images from a modern OS. No emulator needed — you can inject or extract files directly.
cpmtools has no way to auto-detect a disk's geometry — CP/M itself never standardized this — so every format you want to work with has to be defined in a diskdefs file. This file lives at:
/etc/cpmtools/diskdefs
Each entry looks like this:
diskdef mdsad350
seclen 512
tracks 70
sectrk 10
blocksize 2048
maxdir 64
boottrk 2
skew 5
os 2.2
end
If your disk image doesn't match any built-in definition, you can add your own entry here — that's how you'd support an unusual or homebrew format. You reference a definition by its name with the -f flag on any cpmtools command (e.g. -f mdsad350).
# List directory contents of an image:
cpmls -f mdsad350 your_image.img
# Inject (copy in) a file:
cpmcp -f mdsad350 your_image.img /path/to/local/file.COM 0:file.COM
# Extract (copy out) a file:
cpmcp -f mdsad350 your_image.img 0:file.COM /path/to/local/file.COM
# Delete a file from an image:
cpmrm -f mdsad350 your_image.img 0:file.COM
# Change file attributes (Read-Only, System, Archive):
cpmchattr -f mdsad350 your_image.img +r 0:file.COM
Common attribute flags:
r — Read-Onlys — System (hidden from normal DIR listing)a — Archive# Change Unix-side file mode when extracting:
cpmchmod -f mdsad350 your_image.img 644 0:file.COM
# Check a CP/M filesystem for errors:
fsck.cpm -f mdsad350 your_image.img
# Create a brand new, blank CP/M filesystem in an existing image file:
mkfs.cpm -f mdsad350 your_image.img
# Interactively browse/edit a raw image (advanced/recovery use):
fsed.cpm -f mdsad350 your_image.img
CP/M disks support multiple “user areas” (0–15) on a single disk — think of them like separate namespaces on the same volume. That's the 0: you see in front of filenames above. To list or work with a different user area, change the number:
cpmls -f mdsad350 your_image.img -u 2
The format name you pass to -f has to match an entry in diskdefs exactly. Below are common definitions, including the full Northstar family.
| Name | Description | Capacity |
|---|---|---|
| mdsad87 | Northstar MDS-A1 — SSSD, 48 tpi, 5.25“, 256-byte sectors x 10/track | ~87K |
| mdsad175 | Northstar MDS-A-D 175 — SSDD, 48 tpi, 5.25”, 512-byte sectors x 10/track | ~175K |
| mdsad350 | Northstar MDS-A-D 350 — DSDD, 48 tpi, 5.25“, 512-byte sectors x 10/track | ~350K |
All three use a 5-sector skew and CP/M 2.2. The 350K format is effectively the double-sided version of the 175K disk — same sector layout, twice the tracks.
| Name | Description | Capacity |
|---|---|---|
| ibm3740 | IBM 3740 — the original 8” SSSD “standard” CP/M format | ~250K |
| osborne1 | Osborne 1 — SSDD, 5.25“, 1024-byte sectors x 5/track | ~100K |
| osborne4 | Osborne Nuevo/Vixen/4 — DSDD, 5.25” | ~200K |
| kaypro2 | Kaypro II — SSDD, 5.25“, 10 sectors/track | ~191K |
| kaypro4 | Kaypro 4/10 — DSDD, 5.25” | ~390K |
| apple2 | Apple II CP/M (via Softcard/CP/M card) | ~140K |
| nshd8 | Northstar Hard Disk, 8MB partition style image | 8MB |
cpmls errors out with something like “cannot read boot sector” or garbage output, the -f definition doesn't match the actual disk — double-check capacity/format before assuming the image is corrupt.