Repository navigation
Releases
atariATR 1.7
Copying files into a large image was slow to the point of being unusable under a
virtual machine, and a freshly created empty directory could not be entered in
Total Commander. Both are fixed.
Polski opis projektu: README.pl.md
Why copying was slow
Copying twenty files into a 16 MB image took a few seconds in Double Commander on
macOS and was estimated at two hours in Total Commander under Parallels on
Apple Silicon. The difference was not the amount of data but the number of system
calls: a 16 MB image is 65535 sectors, and the code read and wrote one sector at
a time — 65535 individual calls on every open and every save. Each call costs a
fraction of a microsecond on a local disk, which is why it never showed on macOS;
run the same calls through x64 emulation on ARM Windows, with an antivirus
scanner in the path, and the same work takes hours.
Three changes, measured on a 16 MB image:
| Before | After | |
|---|---|---|
| Listing a directory of 24 entries | 26 ms | 2 ms |
| 120 custom-column cells (24 rows × 5 fields) | 2611 ms | 72 ms |
| Copying 20 files in | 1973 ms | 123 ms |
- Bulk reads and writes. Short boot sectors still go one by one — they occupy
128 bytes in the file but a full sector in memory — and everything after them is
one read and one write. - Only changed sectors are written. A save used to write the whole image
through a temporary file. Changed sectors are now found by comparing against the
state at load time — a comparison rather than dirty flags, because the file
system code writes straight through a sector pointer and a single missed flag
would be silent data loss. The cost is atomicity: an interrupted write now
leaves the image partly changed, where the temporary-file route left the
original untouched. Only the plugins enable this;atrtoolkeeps the safe
route, since one command is one save there and there is nothing to gain. - The image is not re-read for every panel cell. Custom columns are a file
system plugin feature, and the file manager asks for each field of each row in a
separate call — every one of which used to load the whole image. Entering a
directory of 24 files meant 120 loads, close to two gigabytes of reading. The
columns only need the directory entry, so the listing and the image bytes are
now cached, keyed by the file's size and modification time so that changing the
image from outside — withatrtool, for instance — invalidates the cache by
itself. Access is guarded by a lock, because the file manager reads columns from
a separate thread.
Entering an empty directory in Total Commander
A newly created directory could not be opened in Total Commander: clicking it did
nothing, with no message. It worked in Double Commander, so the fault was in the
protocol rather than in reading the image.
FsFindFirst has no first entry to return for an empty directory, so it returns
an invalid handle — exactly what it returns on failure. Total Commander tells the
two apart by the last error code: ERROR_NO_MORE_FILES means "empty" and the
panel simply shows nothing, anything else means "cannot open" and entry is refused
silently. The plugin never set that code. Double Commander treats an invalid
handle as an empty directory, which is why the defect was invisible there.
Empty directories now report ERROR_NO_MORE_FILES, and genuine failures — a bad
path, an image that will not open, an exception — report ERROR_PATH_NOT_FOUND,
so a broken image is reported as broken instead of appearing empty.
One subtlety worth recording, because the first fix did not work: freeing memory
overwrites the last error code on Windows, and local strings and objects are
finalized after the last statement of a function — that is, after the
SetLastError call. The listing body now returns its status through a thread
variable and the exported wrapper, which has no managed locals of its own, sets
the code. A test asserting the error code on Windows caught the first attempt;
without it the defect would have shipped twice with the same symptom, since the
whole path is compiled out on macOS.
Tests
Two additions guard what plain pass/fail results cannot see:
- a counter of actual image loads, asserted against 125 column queries — a
regression here would show up only as time, never as a wrong answer; - the empty-directory path end to end: create a directory, enter it, check the
error code (on Windows), copy a file into it.
The 1705-image corpus still round-trips identically — 1689 byte-for-byte, none
differing — which is what makes the rewritten read and write paths safe to trust.
The WFX harness is at 115 checks.
atariATR 1.6
Makes the file system plugin's image list manage itself — and fixes a data-loss
path that was present in 1.5.
Polski opis projektu: README.pl.md
Adding images by copying them
The WFX plugin shows the images listed in _LISTA-OBRAZOW.TXT, and until now
those paths had to be typed by hand. Now copying an .atr onto the plugin root
with F5 appends its path to the list. The file stays where it is — only a
reference is recorded, so a 16 MB image is not duplicated. Repeating it changes
nothing, anything that is not a disk image is refused, and F6 (move) is refused
too: nothing was copied, so "moving" could only mean deleting your image.
F8 on an image in the root removes it from the list, leaving the file and
its contents alone.
The data-loss path this uncovered
A file manager has no recursive delete in the WFX API. Before removing something
that looks like a directory, it deletes the contents itself, file by file. An
image in the plugin root looks exactly like a directory — so F8 on it made
Double Commander delete every file inside the disk image, DOS.SYS included,
turning a bootable disk into an empty one. In 1.5 the closing FsRemoveDir then
failed, so you saw an error message next to an already emptied image.
The individual FsDeleteFile calls are indistinguishable from deliberately
deleting a file from a disk, so the path alone cannot tell the two apart. What
can is FsStatusInfo, which reports the directory an operation started in — the
plugin did not implement it before, which is why the information was missing:
- delete started in the image list, target inside an image → skipped without
touching anything (reported as success, so you do not get one error dialog per
file), and the closingFsRemoveDirremoves the list entry instead; - delete started inside an image → passed through, so deleting files and
non-empty directories from a disk keeps working.
If a file manager does not report that context, nothing switches on: deletion
behaves as it always did and removing a list entry is refused with a message
pointing at F4. The convenience only appears where the guard actually protects
you.
An image shown by a directory entry has no line of its own, so F8 refuses it
rather than deleting the directory entry — that entry serves other images too.
There the refusal is honest: nothing would change, and you have a right to see
that the operation failed.
Verified in Double Commander: F8 on an image removes it from the list and
atrtool list on that file afterwards still shows every file inside.
Set AtrWfx.log next to the list file and the plugin appends the call sequence it
receives, which is how the above was measured.
File names: a series no longer collapses into one name
Copying a numbered series into an image used to ask about overwriting on every
file after the first. zmienne_01.wav, zmienne_02.wav, zmienne_03.wav all
became ZMIENNE0.WAV, because shortening to 8.3 simply cut the name at eight
characters — throwing away the digit that tells the files apart.
Shortening now keeps the digits at the end and truncates letters instead, so the
numbering survives and matches the source:
| On disk | Before | Now |
|---|---|---|
zmienne_01.wav |
ZMIENNE0.WAV |
ZMIENN01.WAV |
zmienne_02.wav |
ZMIENNE0.WAV |
ZMIENN02.WAV |
file_1234567890.wav |
FILE1234.WAV |
FILE7890.WAV |
moj_plik-2.dat (SpartaDOS) |
MOJ_PLIK.DAT |
MOJ_PLI2.DAT |
Copying eighteen such files now asks nothing at all.
When a shortened name has no digits to keep, its last character becomes a
hexadecimal index derived from the source name (BARDZOD8.DOK). Two names that
are identical for their first eight characters cannot both fit into 8.3 — no
algorithm changes that — but the index makes the 8.3 name a pure function of the
name on disk. That matters more than it looks: with indices handed out in
arrival order instead, copying one corrected file from a pair would silently
overwrite the other one. Now every file has a fixed place and overwrites itself.
The index is computed from the base name without the extension, so files that
come in pairs stay paired: ZMIENN07.WAV and ZMIENN07.TAP. Directory names
follow the same rule, which stops two long directory names from silently merging.
Every conversion is reported — the file system plugin to the file manager's log
window, the packer plugin to its own log, atrtool add to the console — so you
can always tell which file became what.
Tests
The plugin harness used to call plugin functions directly, so it never reproduced
what a file manager actually does — which is why this defect could survive a green
test run. It now replays the whole sequence (FsStatusInfo → list → delete each
entry → FsRemoveDir) and requires the image contents to survive it, plus a
control case proving the guard is not too broad: a delete started inside an image
still removes files and non-empty directories. 92 checks, up from 57.
Test 5 (packer plugin) worked on the fixture images in place, so an interrupted
run corrupted the next one. It now works on copies, like the WFX test.
Name shortening has its own section (Test 3c): sixteen cases covering the digit
tail, the README table, both file systems, and the determinism the hash index is
there for — the same source name must produce the same 8.3 name in a different
image and in a different order. The WFX harness copies a series of eighteen files
through FsPutFile, one call each, and requires zero overwrite prompts.
atariATR 1.5
Adds a second plugin: a file system plugin (WFX) for Total Commander and
Double Commander. The packer plugin stays — they do different jobs.
Polski opis projektu: README.pl.md
Why a second plugin
The archive interface has no functions for renaming, moving inside the image,
setting attributes or setting file dates — so no packer plugin can offer them,
however well written. A file system plugin has all of them, plus custom panel
columns:
| Packer (WCX) | File system (WFX) | |
|---|---|---|
Enter an .atr clicked in the panel |
yes | no — images come from a list |
| Browse, copy in and out, delete | yes | yes |
| Create directory | yes | yes |
Rename (F2) |
no | yes |
| Move within the image | no | yes |
| Attributes (Atari lock ↔ read-only) | no | yes |
| File dates (SpartaDOS) | no | yes |
| Extra panel columns | no | yes |
The extra columns show what a fixed archive listing has no room for: starting
sector, sector count, the image's file system, the 16-bit link flag and Atari
attributes — sortable, like any other column.
File dates required one addition to the engine (SetTimestamp). SpartaDOS stores
a date and time per file, so copying into such an image now preserves the date
from disk. MyDOS has no date field at all, and the plugin reports that honestly
instead of pretending it worked.
Configuring it
A file system plugin is not tied to a clicked file, so it needs to know which
images to show. Enter Atari ATR among the network connections and you will
find one file, _LISTA-OBRAZOW.TXT. Press F3 to read it — its first line tells
you where it lives on disk — or F4 to edit it, then refresh the panel. One
entry per line, either an image or a directory:
C:\Atari\images
C:\Atari\games\labyrinth.atr
ATRWFX_CONFIG overrides the location of that list.
Assets
atrtool for Windows x64, macOS (arm64, Intel) and Linux. Two installable
packages for Total Commander: AtrWcx-1.5.zip (packer) and AtrWfx-1.5.zip
(file system). Native plugins for Double Commander: AtrWcx-*.wcx and
AtrWfx-*.wfx for macOS (arm64, Intel) and Linux. Checksums in SHA256SUMS.txt.
Still no 32-bit builds — see earlier releases for why.
Verification
tests/wfx-harness drives the plugin the way a file manager does and checks 57
operations across MyDOS and SpartaDOS: listing, copying both ways, the
"file exists" answer without an overwrite flag, renaming, creating directories,
moving into them, attributes, dates and the custom columns. tests/wfx-loadcheck
confirms all 27 entry points resolve through dlopen/dlsym, the check that
caught the macOS symbol-underscore trap in the packer plugin.
Both plugins were then tested by hand in Total Commander and Double Commander.
Everything from previous releases still passes: 67 packer checks, round-trip on
1705 real images, 943 read as file systems, cross-validation against lsatr.
Known limitations
- Moving a whole directory in one call reports "not supported"; file managers do
it themselves by creating the directory, moving the contents and removing the
original, so the result is the same. - Moving files between two different images is left to the file manager as a
download-and-upload. - SDFS writing still covers 128 and 256 byte sectors only.
atariATR 1.4
Fixes directory handling in the file manager. Copying a directory into an
.atr used to dump its files flat into the root, and deleting a directory that
was not empty failed with "CRC error". Both are fixed, and creating directories
(F7) works as a result.
Polski opis projektu: README.pl.md
What went wrong
When packing, the plugin took only the file name from each entry the file manager
supplied and discarded the relative path that came with it. The documented
behaviour is the opposite: an entry subdir2\filename.ext is meant to be stored
as subdir2\filename.ext. So copying a folder with subfolders produced a heap of
files in the root directory.
It slipped through because the tests covered packing single files and packing into
an existing subdirectory via SubPath, but never a list with paths inside it.
Both cases are permanent tests now — 19 checks across MyDOS and SpartaDOS,
including a sector-accounting check after recursive deletion.
Deleting a directory that is not empty
The file manager reports a directory to delete as DIRNAME\*.* and expects the
plugin to deal with whatever is inside. The plugin went straight for
RemoveDirectory, which — in both MyDOS and SDFS — requires an empty directory,
so the operation raised an error that Total Commander reported as "CRC error".
Deletion is now recursive: files first, then directories from the deepest up.
Protected files are unlocked before removal, so an explicit "delete this folder"
does not stop halfway. Freed sectors are verified to return to their exact
pre-existing count, so nothing is orphaned in the allocation map.
What works now
- The whole tree is reproduced on the image, with every path component converted
to a valid 8.3 name for the target file system:
Moje Gry/Level 1/dane.dat→MOJEGRY/LEVEL1/DANE.DAT. - Missing directories are created along the way, including empty ones — which
is also whyF7(create directory) now works in Total Commander: it arrives as
a directory entry in the pack list. - Name collisions are counted per directory instead of globally, so two files
calleddane.datin different folders no longer get a numeric suffix. - Deleting a directory removes it with everything inside; deleting an empty
directory, a single file, and copying trees in both directions all confirmed
in Total Commander and Double Commander.
Assets
Same set as 1.3: atrtool for Windows x64, macOS (arm64 and Intel) and Linux;
the Total Commander package AtrWcx-1.4.zip; Double Commander plugins for macOS
(arm64, Intel) and Linux; checksums. Still no 32-bit .wcx — build it on Windows
with a 32-bit Free Pascal if you need one.
atariATR 1.3
Fixes adding files to an image from Total Commander. In 1.1 and 1.2 copying
into an .atr failed with "function not supported" — this release restores it.
Polski opis projektu: README.pl.md
What went wrong
Version 1.1 stopped advertising PK_CAPS_NEW, the capability flag meaning "this
plugin can create new archives". The intent was cosmetic: the plugin does not
create images, so it should not appear in Total Commander's pack dialog.
The Total Commander documentation states that omitting PK_CAPS_NEW and
PK_CAPS_MODIFY is what disables packing, implying PK_CAPS_MODIFY alone is
enough to add files to an existing archive. In practice it is not: without
PK_CAPS_NEW, Total Commander refuses to add files at all.
PK_CAPS_NEW is back, and creating a new image is refused inside PackFiles
with a clear error instead. So .atr appears in the pack dialog again — a cosmetic
price for a working feature.
The test harness did not catch this because it calls the plugin's functions
directly and therefore never consults the capability flags. That gap is now
documented in the harness itself.
Also new: a diagnostic log
Create an empty file named AtrWcx.log next to an .atr and the plugin appends
a line for every operation it is asked to perform:
2026-07-29 11:57:52 OpenArchive: tryb 1
2026-07-29 11:57:52 PackFiles: 1 plik(ów), podkatalog "TESTDIR"
2026-07-29 11:57:52 PackFiles: zapisano obraz
No configuration, no environment variables — the file's existence switches it on.
It answers the question that a dialog box cannot: whether the file manager called
the plugin at all, and with what.
Assets
Same set as 1.2: atrtool for Windows x64, macOS (arm64 and Intel) and Linux;
the Total Commander package AtrWcx-1.3.zip; Double Commander plugins for macOS
(arm64, Intel) and Linux; checksums. Still no 32-bit .wcx — build it on Windows
with a 32-bit Free Pascal if you need it.
atariATR 1.2
Images without a file system — raw disk dumps with their own loader — are no
longer a dead end. Instead of refusing to open them, the plugin now shows a single
virtual file describing the image, and atrtool list prints the same description.
Polski opis projektu: README.pl.md
What's new since 1.1
Around 45% of real .atr files contain no file system at all: the boot sectors
hold a custom loader that reads data straight off sectors. Every tool has to give
up on listing files there — but it can still say something useful.
Entering such an image in Total Commander or Double Commander now shows one
read-only virtual file, INFO-DYSK.TXT, containing:
- disk parameters: sector size, sector count as declared by the header and
as actually present in the file — these often differ, and that difference
is exactly why some viewers report a different geometry than others, - a decoded Atari boot record: how many sectors the loader reads, its load and
init addresses, the first 16 bytes, and whether the code starts with aJMP, - what was checked and not found (DOS 2.x VTOC at sector 360, SDFS signature at
boot byte 7), so the verdict is not a black box, - a warning that writing to such an image would overwrite the loader.
Writing to these images is refused with E_NOT_SUPPORTED rather than attempted.
atrtool list prints the same text and exits successfully — a raw dump is a normal
kind of image, not an error.
Assets
| File | What it is |
|---|---|
atrtool-1.2-windows-x64.exe |
command line tool, 64-bit Windows |
atrtool-1.2-macos-arm64 |
command line tool, Apple Silicon |
atrtool-1.2-macos-x86_64 |
command line tool, Intel Mac |
atrtool-1.2-linux-x86_64 |
command line tool, Linux |
AtrWcx-1.2.zip |
Total Commander plugin — drag onto TC to install |
AtrWcx-1.2-macos-arm64.wcx |
Double Commander plugin, Apple Silicon |
AtrWcx-1.2-macos-x86_64.wcx |
Double Commander plugin, Intel Mac |
AtrWcx-1.2-linux-x86_64.wcx |
Double Commander plugin, Linux |
SHA256SUMS.txt |
checksums |
There is still no 32-bit .wcx; build it on Windows with a 32-bit Free Pascal
(build/build-wcx.sh win32) if you use a 32-bit Total Commander.
macOS: downloads are unsigned, so clear the quarantine flag once:
xattr -d com.apple.quarantine atrtool-1.2-macos-* AtrWcx-1.2-macos-*.wcx
chmod +x atrtool-1.2-macos-*Verification
The plugin test harness grew a scenario for images without a file system: it
checks that such an image opens, that the virtual file is visible, read-only and
extractable with sensible content, and that adding or deleting files is refused.
47 checks in total across MyDOS, SpartaDOS and raw images, plus the dynamic load
check on every platform.
Everything from 1.1 still holds: round-trip on 1705 real images (1689
byte-identical), 943 read as file systems and 760 correctly identified as having
none, byte-exact cross-validation against lsatr from
mkatr, and an 8 MB MyDOS image created by this
code booting on real MyDOS in an emulator.
atariATR 1.1
Adds a native plugin for Double Commander and, thanks to release builds now
running on GitHub Actions, binaries for platforms that could not be cross-compiled
from an ARM Mac before: Intel Mac and Linux.
Polski opis projektu: README.pl.md
What's new since 1.0
- Double Commander support (macOS, Linux). Double Commander implements the
same plugin interface as Total Commander and calls the Unicode entry points on
every platform, so the plugin is the same code built natively.
One real fix was needed: on macOS the loader resolves symbols withdlsym,
which prepends an underscore per the C convention, while Free Pascal exports
OpenArchiveWrather than_OpenArchiveW. The failure was quiet — the library
loaded and not a single function was found. Underscore-prefixed exports now
apply under{$IFDEF DARWIN}; the Windows DLL is unchanged. tests/wcx-loadcheck: a new test that loads the built plugin the way a file
manager does (LoadLibrary/GetProcedureAddress, i.e.dlopen/dlsym),
checks that all 19 entry points resolve, and walks an archive through them.
It runs in CI and gates the release: a plugin that is not dynamically
discoverable does not get published.- Release builds are automated per platform (GitHub Actions), which brings the
Intel macOS and Linux artifacts that were missing from 1.0. - File names coming from the host are converted to 8.3 using the rules of the
target file system, so adding e.g.my-file v2.txtto a MyDOS image works
instead of failing (this was the "CRC error" seen in Total Commander).
Assets
| File | What it is |
|---|---|
atrtool-1.1-windows-x64.exe |
command line tool, 64-bit Windows |
atrtool-1.1-macos-arm64 |
command line tool, Apple Silicon |
atrtool-1.1-macos-x86_64 |
command line tool, Intel Mac |
atrtool-1.1-linux-x86_64 |
command line tool, Linux |
AtrWcx-1.1.zip |
Total Commander plugin — drag onto TC to install |
AtrWcx-1.1-macos-arm64.wcx |
Double Commander plugin, Apple Silicon |
AtrWcx-1.1-macos-x86_64.wcx |
Double Commander plugin, Intel Mac |
AtrWcx-1.1-linux-x86_64.wcx |
Double Commander plugin, Linux |
SHA256SUMS.txt |
checksums |
The Intel macOS build is best-effort — GitHub is retiring that runner — so if it
is missing from this list, it did not build.
There is still no 32-bit .wcx. The Windows runner's Free Pascal only targets
x86_64, and installing a 32-bit compiler on it did not work out. If you use a
32-bit Total Commander, build the plugin yourself on Windows with a 32-bit FPC:
build/build-wcx.sh win32.
Installing
Total Commander: drag AtrWcx-1.1.zip onto a Total Commander window; the
bundled pluginst.inf makes TC offer to install it.
Double Commander: take the .wcx for your platform and add it under
Configuration → Options → Plugins → Packer plugins, associating the extension
atr.
macOS: downloads are unsigned, so clear the quarantine flag once:
xattr -d com.apple.quarantine atrtool-1.1-macos-* AtrWcx-1.1-macos-*.wcx
chmod +x atrtool-1.1-macos-*What the tools do
atrtool creates, inspects and modifies ATR/XFD images — Atari DOS 2.0S,
DOS 2.5, MyDOS and SpartaDOS, up to 16 MB with subdirectories — and can make
an image bootable by transplanting a DOS from a template image you already own.
atrtool create hd.atr 16m
atrtool format hd.atr mydos
atrtool installdos hd.atr "Mydos 4.50.atr"
atrtool add hd.atr mygame.xex
atrtool list hd.atr -rThe plugin opens an .atr file like an archive: browse the full subdirectory
tree, copy files in and out, delete them. It does not create images — that needs
decisions about geometry and file system, which belong in atrtool.
Verification
Unchanged from 1.0 and still passing: round-trip on 1705 real disk images (1689
byte-identical), 943 images read as file systems, byte-exact cross-validation
against lsatr from mkatr, agreement with MyDOS
TECH.DOC, writing into a real SpartaDOS X 4.48 image touching only 5 metadata
bytes, an 8 MB MyDOS image booting on real MyDOS in an emulator, and 38 checks
of the plugin through a Total Commander call-order harness — now joined by the
dynamic load check described above.
Known limitations
- SDFS writing covers 128 and 256 byte sectors; 512 byte sectors (32 MB images
under SpartaDOS X) are read but not written, because one superblock field for
that case is undocumented and could not be verified. - No GUI yet.
atariATR 1.0
First public release. Tools for Atari 8-bit disk images with full support for
large 16 MB images (65535 × 256 B) in MyDOS and SpartaDOS format,
subdirectories included.
Polski opis projektu: README.pl.md
Assets
| File | What it is |
|---|---|
atrtool-1.0-windows-x64.exe |
command line tool, 64-bit Windows |
atrtool-1.0-macos-arm64 |
command line tool, Apple Silicon |
AtrWcx-1.0.zip |
Total Commander packer plugin (64-bit Windows) |
AtrWcx-1.0-macos-arm64.wcx |
Double Commander packer plugin, Apple Silicon |
SHA256SUMS.txt |
checksums |
On an Intel Mac, on Linux, or for a 32-bit Total Commander, build from source —
brew install fpc (or your distro's package) and ./build/build.sh.
What it does
atrtool creates, inspects and modifies ATR/XFD images: formats them as
Atari DOS 2.0S, DOS 2.5, MyDOS or SpartaDOS, adds and removes files, creates
subdirectories, and turns an image into a bootable disk by transplanting a
DOS from a template image you already own — patching the boot record fields that
depend on the target disk, including the sector link mask that MyDOS switches to
AND #$FF for 16-bit links.
atrtool create hd.atr 16m
atrtool format hd.atr mydos
atrtool installdos hd.atr "Mydos 4.50.atr"
atrtool add hd.atr mygame.xex
atrtool list hd.atr -rThe Total Commander plugin opens an .atr file like an archive: browse the
full subdirectory tree, copy files in and out with F5/F6, delete with F8.
Images are recognised by content rather than by extension. It deliberately does
not create images — that needs decisions about geometry and file system, which
belong in atrtool.
Installing
Total Commander: drag AtrWcx-1.0.zip onto a Total Commander window; the
bundled pluginst.inf makes TC offer to install it. Requires 64-bit Total
Commander — the 32-bit version does not load .wcx64 files at all and will just
open the ZIP.
Double Commander (macOS, Linux): the same plugin, built natively. Take
AtrWcx-1.0-macos-arm64.wcx and add it under Configuration → Options → Plugins →
Packer plugins, associating the extension atr. On Linux, build it with
build/build-wcx-native.sh.
macOS: the binary is unsigned, so clear the quarantine flag once:
xattr -d com.apple.quarantine atrtool-1.0-macos-arm64
chmod +x atrtool-1.0-macos-arm64Windows: SmartScreen may warn about an unsigned executable.
How this release was verified
- Round-trip on 1705 real disk images: 1689 written back byte-for-byte
identically; the rest have inconsistent headers (reported as such) or are not
ATR files. - 943 images read as file systems with their complete subdirectory trees.
- 16 MB images created here — MyDOS and SpartaDOS alike — are read and
byte-exactly extracted by an independent implementation,lsatrfrom
mkatr, with free sector counts matching exactly. - Writing into a real SpartaDOS X 4.48 image changes exactly 5 bytes of the
boot sectors (free count, allocation hint, sequence number) — the boot code is
untouched, so the disk still boots. - MyDOS formatting parameters agree with
TECH.DOCfrom the MyDOS 4.51 sources. - An 8 MB MyDOS image created by this code boots on real MyDOS in an emulator,
with its subdirectory visible in the DOS menu. - The plugin is exercised by a harness that calls its functions in the exact order
Total Commander uses — 38 checks on MyDOS and SpartaDOS 16 MB images — and by a
second test that loads the built library dynamically, the way a file manager
does, verifying all 19 entry points resolve and that an archive can be walked
through them.
Known limitations
- SDFS writing covers 128 and 256 byte sectors; 512 byte sectors (which would
allow 32 MB images under SpartaDOS X) are read but not written, because one
superblock field for that case is undocumented and could not be verified. - No 32-bit
.wcxin this release: FPC cannot cross-compile for i386 from an ARM
host. Build it on Windows or x86 withbuild/build-wcx.sh win32. - No GUI yet.