Read and write Amiga floppy disks with a Greaseweazle — as a self-contained macOS app.
The interface follows “Cyclone Digital Image Copier” (ASI, 1992 — code R. Apling & A. Maier, graphics Erdmann Toball). Not a copy of the original artwork, but the same visual language: bevelled panels, one track grid per disk, a single status line.
The Greaseweazle is excellent hardware, but it is driven from a command line. For “insert disk, get an ADF” you want a window with a grid that shows which track is running right now — the way it looked in 1992.
Pick a source; the direction follows automatically. Press START.
| Source | Target | What runs |
|---|---|---|
| Drive | File (ADF / ADZ / SCP / IPF) | read |
| File | Drive | write + verify |
The two grids are the display. SOURCE always shows reading, TARGET always
shows writing, regardless of which side is the file. Each cell holds the
error count for that cylinder: green 0 for a clean track, amber where a
retry was needed and succeeded, red where gw gave up. AmigaDOS covers
cylinders 0–79; raw flux runs to 81, and the grid has cells for both.
When the run ends the status line sums it up — DONE — 160 TRACKS, 3 REWRITTEN OK rather than a bare DONE, so a recovered retry does not read as a failing
disk.
Raw flux tracks get a blue X instead of a green 0: gw does not decode raw
flux, so it cannot verify it. Green would claim a check that never happened.
Pressing START a second time aborts. An abort during writing reports
ABORTED — TARGET INCOMPLETE, because that is what the disk is.
The output format is asked before the save dialog, not taken from its filter — a filter only filters, it cannot decide what gets written.
| Choice | Extension | Notes |
|---|---|---|
| ADF AMIGADOS | .adf |
Standard 11-sector AmigaDOS |
| ADF PACKED | .adz |
gzip'd ADF — the established Amiga convention |
| SCP FLUX | .scp |
Raw flux, all cylinders |
| SCP PACKED | .scpz |
Same, compressed |
| IPF IMAGE | .ipf |
Needs a title, see below |
| IPF PACKED | .ipfz |
Same, compressed |
Compressed images are recognised by magic bytes, not by extension, so a
mislabelled file still opens. .gz and .xz work as well as
.adz/.scpz/.ipfz.
.adz is the one packed name that predates this app — emulators have written
and read gzip'd ADFs for years, so MaClone always writes gzip for it, never xz,
and unpacks it to .adf because gw has no adz reader of its own. .scpz and
.ipfz are this project's own naming.
IPF needs the closed-source SPS/CAPS library. It is not bundled —
redistributing someone else's proprietary binary is not our call. Install it
yourself into ~/Library/Frameworks/ (no sudo, survives rebuilds). MaClone
checks for it and says so when it is missing.
- Apple Silicon:
CAPSImg_5.1.3_macOS_ARM64.tar.xz(fs-uae.net) - Intel:
CAPSImage.framework4.2 (softpres.org)
Writing an IPF to disk goes through gw. Creating one goes through the
bundled disk-analyse, which knows 1810 formats but does not detect them —
you pick the title, and a wrong title yields a wrong image. Details:
docs/ipf.md.
- A Greaseweazle (tested: V4.1, firmware 1.6)
- macOS 11 or newer
- A drive on the Greaseweazle's second port — it answers as unit 1 and is
shown as
DRIVE 0, matching the Amiga'sDF0:
Write precompensation defaults to 40=125, which fixed a failing inner track
on real hardware.
The app is unsigned. On a machine other than the build host, Gatekeeper will object on first launch.
The rule is: everything is inside the DMG, nothing is fetched at runtime —
no Python, no venv, no Homebrew library, no network access. build_dmg.sh
verifies this after every build and aborts if a library points outside the
bundle, or if requests sneaks in.
python3 -m venv .venv
.venv/bin/pip install "git+https://github.com/keirf/greaseweazle@v1.23" py2app
./build_dmg.sh # -> dist/MaClone.dmg (~25 MB)The build runs the test suite first and stops on failure. Those tests pin how gw's output maps to grid numbers; when gw changes its wording, the grid would otherwise show wrong error counts silently.
Reading, writing and verifying work. A disk written from an IPF read back clean: all 160 tracks, median 331,935 bits, 0.09 % spread, no weak tracks.
Still unproven: whether a written disk actually boots on a real Amiga. That test is outstanding and needs genuine DD media — taped-over HD disks failed here at two different cylinders.
The ADF viewer behind OPENADF is not implemented. START/END TRACK are still decoration. German development notes live in STATUS.md.
ADF-Copy — the research question whether Amiga disks can be
written with an unmodified USB floppy drive. The answer is no, provably:
the sync word 4489 is impossible in legal MFM (that is the entire point of a
sync mark), and an FDC emits only legal MFM by design. Which is exactly why a
device like the Greaseweazle is needed — and why MaClone exists.
lib/amiga_mfm.py and lib/flux_quality.py come from there.
- Keir Fraser for the Greaseweazle
and for disk-utilities
(
disk-analyse) - ASI (1992) for Cyclone — the template
- Rob Smith for DrawBridge, proof that a €5 Arduino does the same job
GPL-3.0 — see LICENSE.
Bundled third-party parts keep their own terms: the Greaseweazle host tools and
disk-analyse are public domain (Unlicense), the latter with
COPYING.disk-utilities next to the binary. The CAPS library is proprietary
and deliberately not included.
The GPL covers the code. The interface graphics — panels, logo, disk icons, LEDs, the cracktro screen — belong to Synthetic Development and are not placed under it. They are in this repository so the app can be built and run as intended, not as free-to-reuse assets: fork the code as much as you like, but bring your own artwork if you ship a build of your own.
The layout is a homage to Cyclone Digital Image Copier (ASI, 1992 — code R. Apling & A. Maier, graphics Erdmann Toball). No original Cyclone asset is reused; everything here was drawn fresh in the same visual language.
Two faces ship with the app: DeluxeFont for the interface and CC-Fat for the sine scroller.
The scroller was originally set in Subwich Bold (LyonsType, all rights
reserved). A commercial font may be embedded in an application but not
redistributed as a file, so it is not in this repository. Drop
subwich-bold.otf into src/assets/fonts/ and point FONT_FILE_SCROLL at it
to get the original look back.
