ABC Tools

browser utilities
Swedish computers preservation workspace — disk convert, decode, and archive browse

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.

Density: FM ≈ single density (SD); MFM ≈ double density (DD) or high density (HD) depending on data rate / RPM. Sides: SS = 1 head, DS = 2 heads. Interleave: physical sector order on track (Luxor ABC-DOS 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 mediaSizeC×H×S×BPSDens.SidesNotes
CatNet 640k floppy640 KB80×2×16×256MFM DDDSSame shell as luxor.640
CatNet 160k / 320k160/320 KB40×1|2×16×256MFM DDSS/DSDecoder auto-matches size

OS8 / Monroe OC88XX OS8 CP/M

NameSizeC×H×S×BPSDens.SidesCluster / BLSNotes
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

NameSizeGeometryDens.SidesCluster / BLSNotes
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

NameSizeC×H×S×BPSDens.SidesBLS / 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

NameSizeC×H×S×BPSDens.SidesNotes
ibm.360 / pc.360360 KB40×2×9×512MFM DDDSPC / some DNIX
pc.640640 KB80×2×8×512MFM DDDS
ibm.720 / pc.720720 KB80×2×9×512MFM DDDSCommon DNIX 3.5″
ibm.12001.2 MB80×2×15×512MFM HDDS5.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
Prefer HFE on Gotek when interleave or mixed FM+MFM matters — linear IMG loses track encoding.

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/

Metric8 browser decoder uses boottrk 4 on cyl-major IMG (dir @ byte 26624). ABC800 CP/M 1000k in Luxor tools often assumes a side-major remap with boottrk 2 — same media, different logical track order.

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 nameBrowser / tools nameGeometry
abc.80.0 / 80.0luxor.8040×1×8×256 FM
abc.80.1 / 80.1ibm.fm.sd.12840×1×16×128 FM
abc.160 / 160luxor.16040×1×16×256 MFM
abc.320 / 320luxor.32040×2×16×256
abc.640 / 640luxor.64080×2×16×256
abc.1000metric8.cpm77×2×26×256 all MFM
abc.1000dluxor.1000.*77×2×26×256; cyl0/h0 FM 26×128
abc.1000sluxor.1000.abcnet77×1×26×256; cyl0/h0 FM 26×128
os8.1000os8.400477×2×26×256; cyl0/h0 FM 26×128
jet.8 / jet.5Jet80 HD profiles8×1024 / 5×1024
monroe.320os8.128080×1×16×256
ibm.360 / 720 / 1200pc.* / 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 GW abc.1000d, OS8MT, ABCNet) put cyl 0 / head 0 in FM 26×128 and all other tracks in MFM 26×256. Metric8 CP/M uses GW abc.1000all 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.

  1. System / boot — low LBAs; sys is the first interesting system sector (often 6 or 14 on floppies).
  2. Directory bitmap — bytes 239–254 of the sys sector: one byte per MFD directory sector; value 0–16 = how many valid 16-byte slots are used (abcread-compatible).
  3. MFD — fixed at dir (backup dir2), spanning dc sectors (8 or 16 typical).
  4. MFD entry (16 B) — packed hsect in bytes 0–1 → ((b0≪3)+(b1≫5))≪cs; length LE @2–3; name @4. Extension Ufd = library.
  5. File header — from offset 4: words of start cluster + length. Data sectors store 253 payload bytes (subarray(3)).
  6. UFD / library — header chain: first sector = UFD bitmap, next ≤16 = directory sectors (same 16-byte entry model as MFD).
  7. 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.

  1. Volume / boot (LBA 0) — often a volume id starting with 'J'; boot/system payload, not an allocation map.
  2. Directory mark — scanned in the first ~8 KB: bytes A5 FF FF FF immediately before the first file entry.
  3. 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
  4. Allocation — contiguous run start … start+size−1 (no FAT). Overlaps are reported; some system attrs are excluded from free-space accounting.
Metric8 CP/M disks use the same physical geometry family but a normal CP/M directory after boottrk — not this Metric85 catalog.

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.

  1. 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 ≪ cluz sectors
    • 0x20+ max sizes (MXSA / MXSC / MXTC)
  2. Layout from MFOP — volume @ MFOP; HPT @ MFOP+1; master directory sectors from MFOP+2…
  3. 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.
  4. Library — type 0xFD: nested volume @ start, HPT @ start+1, child directory @ start+2… (same GDE layout recursively).
  5. File extents — descriptor at start; extent table often @ +0x80 (6-byte or 4-byte records). Skip 1–2 header sectors before payload.
  6. 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.

  1. 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.
  2. 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.
  3. Library / dir entry (32 B) — LE hsect @0–1, name @2, directory bit entry[15] & 1. Nested libs point at further symbol sectors.
  4. 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

  1. Label — LBA 0 @ offset 0x102 (40 chars).
  2. Slot table — LBA 2: u16 start LBA per slot.
  3. Directory — LBA 4: marker dir[0]==0x01, count @ dir[6], then 15-byte records (name11 + flags + byte + slot index).
  4. Data — COM descriptor (inline/mapped) or sector chain (next @+1, payload length @+3, data @+5).

JETNET

  1. Label — LBA 48.
  2. Slots — LBA 58: u16 start LBAs.
  3. Directory — scanned sectors; 28-byte entries with marker 03 80 @12–13 and slot @14.
  4. 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).

  1. Anchor @ byte 512vdsp, vdspn, cleanfl (magic 0x76543210 when clean).
  2. Superblock (~80 B @ vdsp)s_bmadr / s_bmsiz (bitmap), s_inadr (inode table), s_rtadr, s_bksiz, etc.
  3. Inodes (64 B) — from s_inadr; root inode = 2. Direct + indirect blocks via 3-byte disk addresses.
  4. Directories — 16-byte slots: inode number + 14-char name; mode bit S_IFDIR (0x4000).
  5. Bitmap — present at s_bmadr; listing walks the inode tree rather than decoding the map for the UI.
OS8MT = Monroe OS8 on 8″ DD. DNIX = DIAB native. Do not confuse the two “DIAB” product lines.

CP/M directories and blocks

  • Directory is fixed after boottrk logical 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) × 128 using 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).