Wiki
Disk geometries and filesystem notes as used by the ABC Tools decoders, plus ready-to-copy configs for Gotek (FlashFloppy), cpmtools, and Greaseweazle.
Disk formats
Values below match what the browser decoders use when converting HFE/IMD → linear IMG
and when parsing catalogs.
Capacities are raw image sizes (cyls × heads × spt × bps), not
free space after boot/directory.
il); 1 = sequential.
Cluster: allocation unit in the host filesystem (ABC-DOS cluster shift, CP/M BLS, DNIX blocks).
Luxor ABC ABC-DOS CP/M+
Decoder: Luxor tab. Sector size almost always 256. Side-flip (sf) variants store sides swapped in the image.
| Name / profile | Size | C×H×S×BPS | Dens. | Sides | IL | Cluster | Notes |
|---|---|---|---|---|---|---|---|
| luxor.80 / dd80 | 80 KB | 40×1×8×256 | FM SD | SS | 1 or 5 | 256 B (cs0) | ABC80 SD; GW abc.80.0 / luxor.80 |
| ibm.fm.sd.128 | 80 KB | 40×1×16×128 | FM SD | SS | — | — | Alternate SD capture; GW abc.80.1 |
| luxor.160 / abc830 | 160 KB | 40×1×16×256 | MFM DD | SS | 1 or 7 | 256 B | Common ABC80/800; GW abc.160 / luxor.160 |
| luxor.320 / dd84 | 320 KB | 40×2×16×256 | MFM DD | DS | 1 or 7 | 256 B | GW abc.320 |
| luxor.640 / abc832 | 640 KB | 80×2×16×256 | MFM DD | DS | 1 or 7 | 1 KB (cs2) | MFD often 16 sectors; GW abc.640 |
| luxor.1000 / abc838 | ~994–1001 KB | 77×2×26×256 | FM + MFM 8″ | DS | 1 | 1 KB (cs2) | 360 RPM; cyl0/h0 = FM 26×128, remaining tracks MFM 26×256 @ 500 kbit/s; GW abc.1000d |
| luxor.1000.abcnet | ~994 KB | 77×1×26×256 | FM + MFM 8″ | SS | 1 | 1 KB | Same mixed encoding (FM track 0); GW abc.1000s |
| cpm-abc800-640 | 640 KB | 80×2×16×256 | MFM DD | DS | — | BLS 4096 | CP/M Plus; boottrk 2; maxdir 128 |
| cpm-abc800-1000 | 1001 KB | 77×2×26×256 | FM + MFM 8″ | DS | — | BLS 2048 | Same physical layout as luxor.1000 (FM cyl0/h0); CP/M Plus; boottrk 2 (side-major); cpmtools abc800.1000.26 |
| cpm-abc16-514ds | 320 KB (logical) | 40×2×8×512 | MFM DD | DS | — | BLS 2048 | ABC16 Concurrent DOS / CP/M-86; cpmtools ibmpc-514ds; dumps may be 640 KB physical |
| cpm-abc16-514ss | 160 KB (logical) | 40×1×8×512 | MFM DD | SS | — | BLS 1024 | ABC16 Concurrent DOS; cpmtools ibmpc-514ss |
ABC-DOS also has hard-disk profiles in the Luxor decoder (hd*: 32×256 LBAs, cluster shift 5 → 8 KB clusters).
CatNet CatNet FS
Same physical floppy geometries as Luxor 160/320/640 (and HDD variants). Catalog is partition / library / symbol chains rather than ABC MFD.
| Typical media | Size | C×H×S×BPS | Dens. | Sides | Notes |
|---|---|---|---|---|---|
| CatNet 640k floppy | 640 KB | 80×2×16×256 | MFM DD | DS | Same shell as luxor.640 |
| CatNet 160k / 320k | 160/320 KB | 40×1|2×16×256 | MFM DD | SS/DS | Decoder auto-matches size |
OS8 / Monroe OC88XX OS8 CP/M
| Name | Size | C×H×S×BPS | Dens. | Sides | Cluster / BLS | Notes |
|---|---|---|---|---|---|---|
| os8.1280 / monroe.320 | 320 KB | 80×1×16×256 | MFM DD | SS | OS8 extents | GW monroe.320; cpmtools monroe.80.16 for CP/M |
| monroe-cpm | 320 KB | 80×1×16×256 | MFM DD | SS | BLS 2048 | Same geometry, CP/M 2.2 dir |
| os8.4004 | ~1001 KB | 77×2×26×256 | FM + MFM 8″ | DS | OS8 | cyl0/h0 = FM 26×128, rest MFM 26×256; GW os8.1000 |
Compucorp / Metric Metric85 Metric8 CP/M
| Name | Size | Geometry | Dens. | Sides | Cluster / BLS | Notes |
|---|---|---|---|---|---|---|
| Metric85 SS40 | 160 KB | 40×1 × 16×256 LBA | hard-sector | SS | 256 B LBA | Compucorp 665; HFE needs HFEv3 Index marks |
| Metric85 DS40 | 320 KB | 40×2 × 16×256 | hard-sector | DS | 256 B | |
| Metric85 SS77 | 308 KB | 77×1 × 16×256 | hard-sector | SS | 256 B | 1232 LBAs |
| Metric85 DS80 | 640 KB | 80×2 × 16×256 | hard-sector | DS | 256 B | |
| metric8.cpm | 1001 KB | 77×2×26×256 | MFM DD 8″ | DS | BLS 2048 or 4096 | All-MFM (GW abc.1000) — not FM track 0; CP/M+; boottrk 4 (dir @ 0x6800); auto BLS from max block |
Jet80 BRIDOS / JETNET CP/M
| Name | Size | C×H×S×BPS | Dens. | Sides | BLS / notes |
|---|---|---|---|---|---|
| BRIDOS / Jet-Net HD | 1 261 568 | 77×2×8×1024 | MFM DD | DS | Native FS; GW jet.8 |
| jet80 5×1024 | 819 200 | 80×2×5×1024 | MFM DD | DS | GW jet.5; cpmtools jet80.160.5 |
| jet80.8 CP/M | ~1.26 MB | 154 tracks × 8 × 1024 | MFM | DS | BLS 4096; boottrk 2; maxdir 256 |
| jet80 360k CP/M | 368 640 | 40×2×9×512 | MFM DD | DS | PC-like; boottrk 4 in decoder |
DNIX / DIAB & PC DNIX / FAT
| Name | Size | C×H×S×BPS | Dens. | Sides | Notes |
|---|---|---|---|---|---|
| ibm.360 / pc.360 | 360 KB | 40×2×9×512 | MFM DD | DS | PC / some DNIX |
| pc.640 | 640 KB | 80×2×8×512 | MFM DD | DS | |
| ibm.720 / pc.720 | 720 KB | 80×2×9×512 | MFM DD | DS | Common DNIX 3.5″ |
| ibm.1200 | 1.2 MB | 80×2×15×512 | MFM HD | DS | 5.25″ HD; DNIX/DIAB |
DNIX images may contain a native DNIX filesystem or a tar stream; the DNIX decoder probes both. PC/MS-DOS archive imports use standard FAT geometries.
Tool configs
Copy-paste ready definitions for Gotek (FlashFloppy), cpmtools, and Greaseweazle.
Save Greaseweazle blocks into your diskdefs.cfg (or a file you pass with
--diskdefs). Browser HFE decode uses parallel names
luxor.* / ibm.* / os8.* / metric8.cpm
(see name map below).
Gotek / FlashFloppy
FF.CFG — place in the USB root or FF/ folder (Luxor-style Shugart is typical):
interface = shugart host = unspecified
IMG.CFG — tagged raw IMG geometries (same folder rules as FF.CFG). Name files *.640k.img, *.160k.img, etc.:
[640k] cyls = 80 heads = 2 secs = 16 bps = 256 mode = mfm iam = no file-layout = sequential [1001k] cyls = 77 heads = 2 secs = 26 bps = 256 mode = mfm iam = no rpm = 360 file-layout = sequential [160k] cyls = 40 heads = 1 secs = 16 bps = 256 mode = mfm iam = no [320k] cyls = 40 heads = 2 secs = 16 bps = 256 mode = mfm iam = no [80k] cyls = 40 heads = 1 secs = 8 bps = 256 mode = fm iam = no [default] cyls = 80 heads = 2 secs = 9 bps = 512
cpmtools diskdefs
Append these diskdef blocks to your cpmtools diskdefs file:
diskdef abc800.1000.26 seclen 256 tracks 154 sectrk 26 blocksize 2048 maxdir 128 skew 0 boottrk 2 os 3 end diskdef metric8 seclen 256 tracks 154 sectrk 26 blocksize 2048 maxdir 256 boottrk 4 sides 2 dirblks 4 end diskdef jet80.8 seclen 1024 tracks 154 sectrk 8 blocksize 4096 maxdir 256 skew 0 boottrk 2 os 3 end diskdef jet80.160.5 seclen 1024 tracks 160 sectrk 5 blocksize 2048 maxdir 128 skew 0 boottrk 1 os 3 end diskdef jet80.160.8 seclen 1024 tracks 160 sectrk 8 blocksize 2048 maxdir 128 skew 0 boottrk 2 os 3 end diskdef monroe.80.16 seclen 256 tracks 80 sectrk 16 blocksize 2048 maxdir 64 skew 4 boottrk 3 os 2.2 end diskdef monroe.80.8 seclen 512 tracks 160 sectrk 8 blocksize 2048 maxdir 129 skew 1 boottrk 2 os 2.2 end
Example: cpmls -f metric8 disk.img · cpmcp -f abc800.1000.26 disk.img 0:*.com /tmp/
Greaseweazle diskdefs
Paste into Greaseweazle’s diskdefs (or a custom defs file). Short aliases
(160, 640, 1000d, …) are equivalent to the
abc.* names. Browser auto-detect uses the parallel names in the map table.
# --- Luxor / ABC ---
disk abc.80.0
cyls = 40
heads = 1
tracks * ibm.fm
secs = 8
bps = 256
gap3 = 84
rate = 250
end
end
disk abc.80.1
cyls = 40
heads = 1
tracks * ibm.fm
secs = 16
bps = 128
rate = 125
end
end
disk abc.160
cyls = 40
heads = 1
tracks * ibm.mfm
secs = 16
bps = 256
gap3 = 42
rate = 250
end
end
disk abc.320
cyls = 40
heads = 2
tracks * ibm.mfm
secs = 16
bps = 256
gap3 = 42
rate = 250
end
end
disk abc.640
cyls = 80
heads = 2
tracks * ibm.mfm
secs = 16
bps = 256
gap3 = 42
rate = 250
end
end
# abc.1000 — all MFM 26×256 (Metric8 CP/M, some ABC dumps)
disk abc.1000
cyls = 77
heads = 2
tracks * ibm.mfm
secs = 26
bps = 256
gap3 = 84
rate = 500
rpm = 360
end
end
# abc.1000d — luxor.1000 / abc838: cyl 0 head 0 is FM 26×128; rest MFM 26×256
disk abc.1000d
cyls = 77
heads = 2
tracks 0.0 ibm.fm
secs = 26
bps = 128
gap3 = 42
rate = 250
rpm = 360
end
tracks * ibm.mfm
secs = 26
bps = 256
gap3 = 84
rate = 500
rpm = 360
end
end
disk abc.1000s
cyls = 77
heads = 1
tracks 0.0 ibm.fm
secs = 26
bps = 128
gap3 = 42
rate = 250
rpm = 360
end
tracks * ibm.mfm
secs = 26
bps = 256
gap3 = 84
rate = 500
rpm = 360
end
end
disk abc.1000data
cyls = 77
heads = 2
tracks 0.0 ibm.mfm
secs = 15
bps = 512
gap3 = 84
rate = 500
rpm = 360
end
tracks * ibm.mfm
secs = 26
bps = 256
gap3 = 84
rate = 500
rpm = 360
end
end
# Short aliases (same geometries)
disk 80.0
cyls = 40
heads = 1
tracks * ibm.fm
secs = 8
bps = 256
gap3 = 84
rate = 250
end
end
disk 160
cyls = 40
heads = 1
tracks * ibm.mfm
secs = 16
bps = 256
gap3 = 42
rate = 250
end
end
disk 320
cyls = 40
heads = 2
tracks * ibm.mfm
secs = 16
bps = 256
gap3 = 42
rate = 250
end
end
disk 640
cyls = 80
heads = 2
tracks * ibm.mfm
secs = 16
bps = 256
gap3 = 42
rate = 250
end
end
disk 1000d
cyls = 77
heads = 2
tracks 0.0 ibm.fm
secs = 26
bps = 128
gap3 = 42
rate = 250
rpm = 360
end
tracks * ibm.mfm
secs = 26
bps = 256
gap3 = 84
rate = 500
rpm = 360
end
end
# --- OS8 / Monroe ---
disk os8.1000
cyls = 77
heads = 2
tracks 0.0 ibm.fm
secs = 26
bps = 128
gap3 = 42
rate = 250
rpm = 360
end
tracks * ibm.mfm
secs = 26
bps = 256
gap3 = 84
rate = 500
rpm = 360
end
end
disk monroe.320
cyls = 80
heads = 1
tracks * ibm.mfm
secs = 16
bps = 256
gap3 = 84
rate = 250
end
end
# --- Jet80 ---
disk jet.8
cyls = 77
heads = 2
tracks * ibm.mfm
secs = 8
bps = 1024
gap3 = 84
rate = 250
end
end
disk jet.5
cyls = 80
heads = 2
tracks * ibm.mfm
secs = 5
bps = 1024
gap3 = 84
rate = 250
end
end
# --- PC / DNIX ---
disk ibm.360
cyls = 40
heads = 2
tracks * ibm.mfm
secs = 9
bps = 512
gap3 = 84
rate = 250
end
end
disk ibm.720
cyls = 80
heads = 2
tracks * ibm.mfm
secs = 9
bps = 512
gap3 = 84
rate = 250
end
end
disk ibm.1200
cyls = 80
heads = 2
tracks * ibm.mfm
secs = 15
bps = 512
gap3 = 84
rate = 500
end
end
Example commands:
gw convert --format=abc.640 disk.hfe disk.img gw convert --format=abc.160 disk.imd disk.img gw convert --format=ibm.720 disk.scp disk.img gw convert --format=jet.8 disk.hfe disk.img gw convert --format=os8.1000 disk.hfe disk.img gw convert --format=abc.1000d disk.img disk.hfe
| Greaseweazle name | Browser / tools name | Geometry |
|---|---|---|
| abc.80.0 / 80.0 | luxor.80 | 40×1×8×256 FM |
| abc.80.1 / 80.1 | ibm.fm.sd.128 | 40×1×16×128 FM |
| abc.160 / 160 | luxor.160 | 40×1×16×256 MFM |
| abc.320 / 320 | luxor.320 | 40×2×16×256 |
| abc.640 / 640 | luxor.640 | 80×2×16×256 |
| abc.1000 | metric8.cpm | 77×2×26×256 all MFM |
| abc.1000d | luxor.1000.* | 77×2×26×256; cyl0/h0 FM 26×128 |
| abc.1000s | luxor.1000.abcnet | 77×1×26×256; cyl0/h0 FM 26×128 |
| os8.1000 | os8.4004 | 77×2×26×256; cyl0/h0 FM 26×128 |
| jet.8 / jet.5 | Jet80 HD profiles | 8×1024 / 5×1024 |
| monroe.320 | os8.1280 | 80×1×16×256 |
| ibm.360 / 720 / 1200 | pc.* / ibm.* | 9/9/15 × 512 |
Sectors & filesystems
Geometry terms
- Cylinder / track — concentric ring; with two heads, cylinder n has tracks on side 0 and 1.
- Sector — smallest addressable unit on the medium (128–1024 bytes here).
- LBA / logical sector — linear index after laying out
cyl → head → sector(or side-major / interleaved variants). - Interleave — physical sector ID order around the track (e.g. 1,8,15… for il=7 on 16-sector tracks). Images may already be de-interleaved.
- Side-flip / sequential layout — whether the IMG stores
c0h0,c0h1,c1h0…or all of side 0 then side 1. - RPM / rate — 300 RPM 5.25″ DD vs 360 RPM 8″; MFM bit rate 250 vs 500 kbit/s.
- Mixed FM + MFM — some 8″ formats (
luxor.1000/ abc838 via GWabc.1000d, OS8MT, ABCNet) put cyl 0 / head 0 in FM 26×128 and all other tracks in MFM 26×256. Metric8 CP/M uses GWabc.1000— all tracks MFM 26×256 (no FM lead-in). Linear IMG may omit an FM lead-in; HFE/IMD/SCP preserve per-track encoding.
ABC-DOS: bitmap, MFD, UFD / libraries
Luxor ABC80/800 (and HD volumes with the same model). Format table fields: sys, dir/dir2, dc, cs, il.
- System / boot — low LBAs;
sysis the first interesting system sector (often 6 or 14 on floppies). - Directory bitmap — bytes 239–254 of the
syssector: one byte per MFD directory sector; value 0–16 = how many valid 16-byte slots are used (abcread-compatible). - MFD — fixed at
dir(backupdir2), spanningdcsectors (8 or 16 typical). - MFD entry (16 B) — packed
hsectin bytes 0–1 →((b0≪3)+(b1≫5))≪cs; length LE @2–3; name @4. ExtensionUfd= library. - File header — from offset 4: words of start cluster + length. Data sectors store 253 payload bytes (
subarray(3)). - UFD / library — header chain: first sector = UFD bitmap, next ≤16 = directory sectors (same 16-byte entry model as MFD).
- Clusters — size =
256 ≪ cs(cs0=256 B, cs2=1 KB, cs5=8 KB on HD). Skip 1 header sector for files, often 2 for UFD payloads.
Metric85: volume header & flat directory
Compucorp hard-sector (and soft-sector Metric85) disks — no free-space bitmap, no nested libraries. 256 B sectors, 16 SPT; common sizes 640 / 1280 / 1232 / 2560 LBAs.
- Volume / boot (LBA 0) — often a volume id starting with
'J'; boot/system payload, not an allocation map. - Directory mark — scanned in the first ~8 KB: bytes
A5 FF FF FFimmediately before the first file entry. - Directory entry (26 B) — empty = all
FF. Layout:- 0–10 name (11 ASCII)
- 11–12 type / type_hi
- 13–14 start LBA (LE)
- 15–16 size in sectors (LE)
- 17–21 attributes
- 22–25 links
- Allocation — contiguous run
start … start+size−1(no FAT). Overlaps are reported; some system attrs are excluded from free-space accounting.
Monroe / OS8: VDS, allocation map, libraries
Same logical FS for Monroe 5.25″ volumes and DIAB/OS8 OS8MT on 8″ DD (os8.4004).
DIAB Databoard native OS is DNIX (below), not OS8.
- VDS @ LBA 0 —
- 0x00 VOLN (4 ASCII)
- 0x05 MFOP (24-bit BE) — master directory index
- 0x0C / 0x0D ALOL / ALOP — allocation map length / start
- 0x10 CLUZ — cluster shift → cluster =
1 ≪ cluzsectors - 0x20+ max sizes (MXSA / MXSC / MXTC)
- Layout from MFOP — volume @ MFOP; HPT @ MFOP+1; master directory sectors from MFOP+2…
- Directory sector — 16-byte sector header + 12 × 20-byte GDE. Active entry: flags
00 00+ printable name @+4. FXAD @+16: type byte + 24-bit BE start LBA. - Library — type
0xFD: nested volume @ start, HPT @ start+1, child directory @ start+2… (same GDE layout recursively). - File extents — descriptor at start; extent table often @ +0x80 (6-byte or 4-byte records). Skip 1–2 header sectors before payload.
- Bitmap (ALOP) — LSB-first bit map, 1 = used. Listing walks extents; the map is for free-space / integrity, not the primary file chain.
CatNet: partitions, symbols, libraries
Not ABC-DOS MFD. Root is a symbol chain at format sys (usually LBA 1). No free-space bitmap is used for browsing.
- Partitions — from head count: h=4→2 parts, h=6→3, h=8→4 (equal LBA slices). FAN1.2 signature @ sector 0 +0x20; volume label @ bytes 2–12. Single FAN on multi-head → one volume.
- Symbol sector — self-id @+4/+5, parent @+2/+3; u16 pointers from +6 (root skips +0x44…+0x48). Pointers recurse into more symbols or into a library directory.
- Library / dir entry (32 B) — LE hsect @0–1, name @2, directory bit
entry[15] & 1. Nested libs point at further symbol sectors. - Files — extent headers (self-id @+4) vs data; payload often 253 bytes/sector (full 256 for some boot/spool names).
Jet80: BRIDOS & JETNET directories
Shared media often 77×2×8×1024. Neither BRIDOS nor JETNET exposes a free bitmap or nested libraries in the decoder — flat catalogs with slot tables.
BRIDOS
- Label — LBA 0 @ offset 0x102 (40 chars).
- Slot table — LBA 2: u16 start LBA per slot.
- Directory — LBA 4: marker
dir[0]==0x01, count @dir[6], then 15-byte records (name11 + flags + byte + slot index). - Data — COM descriptor (inline/mapped) or sector chain (
next@+1, payload length @+3, data @+5).
JETNET
- Label — LBA 48.
- Slots — LBA 58: u16 start LBAs.
- Directory — scanned sectors; 28-byte entries with marker
03 80@12–13 and slot @14. - Data — contiguous LBAs up to the next file’s start; 10-byte header then payload.
DNIX (DIAB Databoard): superblock, inodes, bitmap
Unix-like FS on Databoard / DNIX floppies and HD images (also auto-detects tar / FAT on the same media).
- Anchor @ byte 512 —
vdsp,vdspn,cleanfl(magic0x76543210when clean). - Superblock (~80 B @ vdsp) —
s_bmadr/s_bmsiz(bitmap),s_inadr(inode table),s_rtadr,s_bksiz, etc. - Inodes (64 B) — from
s_inadr; root inode = 2. Direct + indirect blocks via 3-byte disk addresses. - Directories — 16-byte slots: inode number + 14-char name; mode bit
S_IFDIR (0x4000). - Bitmap — present at
s_bmadr; listing walks the inode tree rather than decoding the map for the UI.
CP/M directories and blocks
- Directory is fixed after
boottrklogical tracks; 32-byte entries;0xE5= empty. - Extent maps up to 16 KB of file data; multiple entries share the same name.
- Allocation list (AL) — 8×16-bit or 16×8-bit block numbers; block size = BLS (1024–4096).
- File byte length ≈
(ex×128 + rc) × 128using the highest extent. - Data base is usually at the directory offset:
dir_off + block × BLS.
Container formats (IMG / HFE / IMD)
- IMG / DSK — raw sector dump in a chosen layout. No encoding metadata.
- IMD — ImageDisk: per-track mode + sector map + compressed/missing sector payloads. Shared importer unpacks to IMG.
- HFE — HxC flux bitstream. v1 (
HXCPICFE) raw bits; v3 (HXCHFEV3) opcode stream (Index / Bitrate / SkipBits) — required for Compucorp hard-sector Metric85. - SCP — SuperCard Pro flux timings; supported via Greaseweazle-aligned PLL in
disk_image.js(soft-sector IBM FM/MFM; hard-sector Metric85 still prefers HFE v3).