Skip to content

Repository files navigation

FatFloppy

FatFloppy is a PyQt6-based graphical utility for browsing and managing vintage floppy disk images and physical disks via Greaseweazle hardware. It supports FAT12, CP/M, HDOS, Commodore CBM DOS, DEC RT-11, and Apollo DOMAIN filesystems (wbak backups and native AEGIS volumes) across multiple disk image formats (IMG, IMD, H17, MITS DSK, D64/D71/D81, Apollo floppy, and Teledisk TD0 archives). This is an alpha version, with core features working but more to come.

License: Unlicense

FatFloppy browsing a Heathkit H17 CP/M disk image, with MOVCPM17.COM selected and its blocks highlighted in green on the logical disk map.

A CP/M disk in a Heathkit H17 image: files and disk information on the left, with a color-coded logical disk map on the right.

Key Features

  • Multiple Filesystems: FAT12, CP/M, HDOS, CBM DOS, DEC RT-11, and Apollo DOMAIN wbak and AEGIS (read-only) support, including many non-standard vintage layouts (no-BPB DOS, DEC Rainbow, 86-DOS, hard-sectored Heath H17 / MITS Altair CP/M, and more)
  • Multiple Formats: IMG, IMD, H17, MITS DSK, Commodore D64/D71/D81, Apollo DOMAIN floppy, and Teledisk TD0 archives (read-only, including "advanced"-compressed files); error-byte D64/D71 variants preserved; 42-track D64 images open read-only
  • Physical Disk Access: Greaseweazle hardware integration
  • File Operations: Read, write, delete files, and create directories
  • Create & Format: Make new blank images and format them to a chosen profile
  • Drag and Drop: Extract files to your OS or add files to the disk
  • Disk Map: Visualize sector usage with head-switching for double-sided disks
  • Format Detection: Content-based auto-detection picks the right driver and format from the file's contents (not just its extension), or allows custom parameters

What's Supported

Filesystem Read Write Image formats Notes
FAT12 (DOS 1.x–3.x) ✓ ✓ IMG, IMD, TD0 incl. no-BPB DOS 1.x, DEC Rainbow RX50, 86-DOS
CP/M 2.2 ✓ ✓ IMG, IMD, H17, MITS DSK, TD0 many OEM layouts; unknown DPBs inferred from the disk
HDOS (Heath/Zenith) ✓ ✓ IMG (H8D), H17 H17/H37/H47 controller geometries
CBM DOS (Commodore 1541/1571/1581) ✓ ✓ D64, D71, D81 REL files, 1581 partitions; error-byte variants preserved; 42-track D64 read-only
RT-11 (DEC RX01/RX02/RX50) ✓ ✓ IMG, IMD, TD0 physical & logical sector-order conventions auto-resolved
Apollo DOMAIN wbak backups ✓ — Apollo IMG split backup sets reassembled across volumes ("insert next floppy")
Apollo AEGIS native (SR9) ✓ — Apollo IMG boot/utility floppies; SR10 recognized but not claimed

TD0 is a read-only container: any filesystem that fits in a Teledisk archive (FAT12, CP/M, and others) is auto-detected and browsable in the same way as an IMG or IMD of the same disk.

Physical disks: FAT12, CP/M, and HDOS media (soft-sectored FM/MFM) can be read and written directly through Greaseweazle hardware. Hard-sectored Heath H17 disks are not readable from hardware yet (use an .h17disk image). Commodore 5.25" GCR media, Apollo floppies, and RT-11 media are currently image-only. New blank images can be created and formatted for the writable filesystems' profiles.

Installation

Windows

Download the latest installer from Releases:

  1. Run FatFloppy-{version}-Windows-Setup.exe
  2. Follow the installation wizard
  3. Launch from Start Menu or desktop shortcut

Requirements: Windows 10 or later (64-bit)

macOS

Download the latest DMG from Releases:

  1. Open the DMG and drag FatFloppy.app to Applications folder
  2. Right-click the app and select "Open" (first launch only)
  3. Click "Open" in the security dialog

Note: The app is unsigned. macOS will show a security warning on first launch.

Linux

Download the latest AppImage from Releases:

  1. Make the AppImage executable:
    chmod +x FatFloppy-{version}-x86_64.AppImage
  2. Run it:
    ./FatFloppy-{version}-x86_64.AppImage

Double-click to run: On Ubuntu 24.04+, you may need to enable executable text files to run on double-click:

  • Open Files (Nautilus) → Preferences → Behavior
  • Under "Executable Text Files", select "Run them" or "Ask what to do"

FUSE requirement: If you get a FUSE error, either install FUSE2 or run:

./FatFloppy-{version}-x86_64.AppImage --appimage-extract-and-run

Greaseweazle USB access: To use physical floppy drives with Greaseweazle, install the udev rule:

# Download the rule (or extract from AppImage at usr/share/doc/fatfloppy/)
wget https://raw.githubusercontent.com/keirf/greaseweazle/master/scripts/49-greaseweazle.rules

# Install it
sudo cp 49-greaseweazle.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
sudo udevadm trigger

# Physically unplug and reconnect your Greaseweazle

From Source

Requirements:

  • Python 3.9+
  • PyQt6
  • Greaseweazle (for physical disk access)

Install:

git clone https://github.com/briskspirit/FatFloppy.git
cd FatFloppy
pip install -e ".[dev]"

Usage

fatfloppy
  • Open Disk: Use File > Open Disk Image File for any supported image (.img/.ima, .imd, .td0, .h17disk, .dsk, .d64/.d71/.d81, ...; the container and format are detected from the file's contents) or File > Open Physical Floppy for Greaseweazle-connected drives.
  • Navigate: Use the directory tree and file list to browse.
  • Manage Files: Extract, add, delete, or create folders via toolbar buttons or drag-and-drop.
  • View Disk Map: See sector usage, toggle heads if double-sided.

CBM DOS (D64/D71/D81) Notes

  • File types: file names take c1541-style type suffixes — ,p (PRG, the default when no suffix is given), ,s (SEQ), ,u (USR), and ,r:<len> (REL with a record length of 1-254). A comma that does not parse as a type code stays part of the file name.
  • Writes: rewriting an existing name uses scratch-and-replace semantics (like CBM DOS @0:), and REL files get proper side sectors (plus super side sectors on the 1581).
  • Partitions (D81 only): creating a folder named NAME,<sectors> makes a 1581 partition formatted as a browsable sub-directory (NAME alone defaults to 120 sectors; the size must be at least 120 sectors and a multiple of 40, i.e. whole tracks).

RT-11 Notes

  • Media: DEC RX01, RX02, and RX50 floppy volumes, as raw images, IMD, or TD0 archives.
  • Sector order: archives store the same RT-11 floppy in two conventions — raw physical sectors (the DEC handler's 2:1 interleave with track skew and an unused track 0) or a plain logical block stream. FatFloppy resolves the actual convention by scoring the directory structure under each candidate view, so both open correctly even when the file sizes are identical, and writes go back through the same mapping.
  • Names: 6.3 file names in the RAD50 character set; typed names are validated, imported host names are mapped into it with digit-suffix de-duplication (see Filenames on Import/Export below).
  • Timestamps: real RT-11 date words — genuine dates on listing, today's date stamped on import (RT-11 stores no time of day).
  • Contiguous files: RT-11 files are contiguous block runs. Writes use first-fit allocation and split directory segments exactly as RT-11 does, and deleting a file leaves its empty slot in place (real RT-11 only merges free space when you run SQUEEZE) — so a churned disk can reject a file that would fit in total free space; the disk info panel reports this fragmentation.
  • Check: a VALIDATE-style filesystem check walks the directory segment chain and flags overlapping file runs, runs past the end of the device, broken or cyclic segment links, and missing end-of-segment markers.

Apollo DOMAIN wbak Notes

  • Read-only: Apollo floppies are archival backup media; FatFloppy opens them read-only.
  • Container: .img files of exactly 1,261,568 bytes (77×2×8×1024) carrying the APOLLO physical-volume signature.
  • Browsing: each wbak backup tree on the disk mounts as a directory hierarchy with the genuine Apollo timestamps.
  • Damage handling: files damaged on the medium are flagged DMG and read back with their holes zero-filled; a file cut by the end of the volume is flagged PARTIAL and reads back as the available prefix.
  • Split backup sets: extracting a file cut at end-of-volume prompts to open the next volume image of the backup set and stitches the pieces together; picking an image from the wrong set (or the wrong volume of the right set) is detected and re-prompted, and chains of any length are followed volume by volume (N-volume sets prompt once per missing volume). Declining extracts the available prefix as before; drag-out to the host and extraction from physical media (Greaseweazle) always extract the available prefix without prompting (a modal dialog cannot interrupt a drag or a worker-thread read).
  • AEGIS disks: AEGIS-filesystem (native) Apollo floppies are detected separately and browse as native volumes — see the next section.

Apollo AEGIS Notes

  • Read-only: native AEGIS volumes open read-only, like the wbak media.
  • Browsing: SR9-era AEGIS boot/utility floppies mount as the volume's real directory tree with the genuine Apollo timestamps and object types (TEXT, OBJ, SYSBOOT, ...); managed objects (text/record/hdru) read back with their 32-byte storage headers stripped, the same view AEGIS itself presents.
  • Verified structures: detection and the filesystem check walk the real on-disk structures — PV/LV labels, the VTOC and its index blocks, and every file map — and reconcile the resulting block ownership against the volume's BAT bitmap (clean volumes reconcile perfectly).
  • Damage handling: entries whose VTOCE is missing or whose file map points off-volume are flagged DMG and read back with holes zero-filled instead of failing the volume.
  • SR10 disks: SR10-or-later volumes (a different VTOCE layout) are recognized as AEGIS but deliberately not claimed, so they are never misread; they open as raw Apollo containers only.

Filenames on Import/Export

Importing a host file auto-generates a name valid for the target filesystem: FAT and CP/M get 8.3 names with ~NN de-duplication; HDOS gets letter-first 8.3 names of letters and digits (other characters become X, leading digits get an F prefix) with digit-suffix de-duplication; CBM keeps up to 16 PETSCII characters with -NN de-duplication, and commas are neutralized so type suffixes like ,s stay deliberate rather than accidental; RT-11 gets 6.3 RAD50 names (characters outside the set become $) with digit-suffix de-duplication. Names you type yourself are validated by the filesystem and rejected with a clear error instead of being silently truncated. On export, characters illegal on the host are sanitized (e.g. CBM COPY/ALL becomes COPY_ALL) and collisions within the same batch are uniquified.

Building from Source

See packaging/macos/ for macOS, packaging/windows/ for Windows, and packaging/linux/ for Linux build instructions.

# macOS
pip install -e ".[dev]"
make dmg  # Creates DMG installer

# Windows PowerShell
pip install -e ".[dev]"
pip install pyinstaller pillow
.\packaging\windows\build_windows.ps1  # Creates installer

# Linux
pip install -e ".[dev]"
pip install pyinstaller
make appimage  # Creates AppImage (requires linuxdeploy and linuxdeploy-plugin-qt)

Known Limitations

  • No progress indicators for long operations
  • Some rare/proprietary disk-image containers are not yet recognized
  • In the disk map, clicking a file highlights its sectors using straight logical-block math; on volumes with sector interleave or skew (RT-11 physical images, skewed CP/M layouts) the highlight is approximate — the per-sector usage coloring itself is always exact
  • TD0 is always a read-only container, even for filesystems marked writable in the table above (convert to IMG to edit such a disk)

Contributing

This is a hobby project, and contributions are welcome! Please:

  • Report bugs or suggest features via issues.
  • Submit pull requests for fixes or enhancements.
  • Test on macOS, Windows, or Linux to help ensure compatibility.

License

Unlicense License.

Acknowledgements

About

File browser for floppy drives connected to modern OSes with Greaseweazle board

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Contributors

Languages