NICHT von Hand editieren — erzeugt von scripts/gen_verification_tiers.py (MF-364). Definitionen: VERIFICATION_PLAN.md.
Ein T3 mit Test-Eintrag bedeutet: es existiert ein synthetischer Test, aber die Byte-Struktur wurde nie gegen eine autoritative externe Quelle verifiziert — genau die Konstellation, in der die fabrizierten Parser (FMT-2/3/10/11/12) gruen waren.
| Stufe | Formate |
|---|---|
| T1 | 2 |
| T1b | 13 |
| T2 | 23 |
| T3 | 50 |
| gesamt | 88 |
| Plugin | Stufe | Tests | Spec-Quelle | Evidenz | Korpus-Images |
|---|---|---|---|---|---|
fdi |
T1 | test_corpus_fdi, test_fdi_spectrum, test_format_probe_fuzz, test_plugin_probe_real |
SAMdisk ReadFDI (src/samdisk/fdi.cpp, in-tree) + WoS format FAQ | MF-359 | 1 |
g64 |
T1 | test_c64_metrics_corpus, test_c64_protection_real_corpus, test_convert_via_plugin, test_d64_writer, test_format_probe_fuzz, test_plugin_probe_real, test_sector_id_on_disk |
— | — | 3 |
adf |
T1b | test_adf_write_roundtrip, test_corpus_adf, test_format_probe_fuzz, test_plugin_probe_real, test_sector_id_on_disk |
— | — | 1 |
atr |
T1b | test_atr_512, test_atr_write_roundtrip, test_corpus_atr, test_corpus_xfd, test_format_probe_fuzz, test_plugin_probe_real |
— | — | 1 |
d64 |
T1b | test_convert_via_plugin, test_corpus_d64, test_d64_42track, test_d64_errormap, test_d64_geometry_zones, test_d64_write_roundtrip, test_disk_open_fuzz, test_format_probe_fuzz, test_plugin_identity, test_plugin_probe_real, test_sector_id_on_disk, test_smart_open_quality |
VICE D64 sizes incl. error-block trailer + 40/42-track variants | MF-333, MF-350 | 1 |
d67 |
T1b | test_convert_via_plugin, test_corpus_cbm_vice, test_plugin_identity, test_smart_open_quality |
VICE/Schepers D67 690-block geometry (176640 bytes) | MF-314 | 1 |
d71 |
T1b | test_corpus_d71, test_d71_write_roundtrip, test_format_probe_fuzz, test_plugin_probe_real |
— | — | 1 |
d80 |
T1b | test_corpus_cbm_vice, test_d80_write_roundtrip |
— | — | 1 |
d81 |
T1b | test_corpus_d81, test_d81_write_roundtrip, test_format_probe_fuzz, test_plugin_identity, test_plugin_probe_real, test_smart_open_quality |
— | — | 1 |
d82 |
T1b | test_corpus_cbm_vice, test_d82_write_roundtrip |
— | — | 1 |
dim_atari |
T1b | test_dim_atari_magic |
— | — | 1 |
g71 |
T1b | test_corpus_cbm_vice, test_g71_read |
— | — | 1 |
hfe |
T1b | test_convert_hfe_adf, test_corpus_hfe, test_format_probe_fuzz, test_hfe_interface_modes, test_hfe_v3_weak, test_plugin_probe_real |
HxC hfev3_loader.c opcode semantics (v3 decode + RAND weak bits); HxC HFE docs (v1) | MF-354, MF-362 | 1 |
scp |
T1b | test_convert_scp_adf, test_corpus_scp, test_flux_jitter_vectors, test_format_probe_fuzz, test_plugin_probe_real, test_protection_probe, test_scp_footer_roundtrip, test_scp_layout, test_scp_readers_agree, test_scp_weakbit_multirev, test_scp_writer_roundtrip |
cbmstuff SCP image spec (48-byte FPCS footer, bitcell track length) | MF-318, MF-351 | 1 |
xfd |
T1b | test_corpus_xfd, test_format_probe_fuzz, test_plugin_identity, test_plugin_probe_real, test_smart_open_quality |
— | — | 1 |
adf_arc |
T2 | test_acorn_adfs_identity |
DiscImageManager (geraldholdsworth), als Spec gelesen: die drei verbliebenen Groessen sind gegen DiscImage_ADFS.pas:73-79 und die mitgelieferten Leer-Abbilder geprueft — ADFS_D.adf/ADFS_E.adf = 819200 (80x2x5x1024), ADFS_F.adf = 1638400 (80x2x10x1024), 327680 = ADFS M einseitig (80x1x16x256). 655360 wurde mit MF-654 ENTFERNT: es ist ADFS L, gehoert uft_adl.c und liegt spurverschraenkt, was dieser lineare Leser falsch getroffen haette. Geprueft wurden Groessen und Geometrien — NICHT die Verzeichnisstruktur. | MF-654 | — |
adf_ext |
T2 | test_adf_ext_plugin |
WinUAE disk.cpp read_header_ext2 (UAE-1ADF) | MF-352 | — |
adl |
T2 | test_acorn_adfs_identity |
DiscImageManager (geraldholdsworth), als Spec gelesen: DiscImage_Private.pas:188 bindet .adl an ADFS L; DiscImage_ADFS.pas:73-75 gibt 163840/327680/655360 = S/M/L; DiscImage_Private.pas:547-570 gibt die Seitenverschraenkung fuer ADFS L (FInterleave=2): offset = (cyl*2+head)*4096. Gegenprobe am mitgelieferten ADFS_L.adl = 655360 Byte, selbst gemessen. Geprueft wurden Groesse, Seitenzahl und Spurablage — NICHT die Verzeichnisstruktur. | MF-654 | — |
akai_s900 |
T2 | test_akai_s900_plugin |
akaiutil (kmi9000) geometry: DD 5x1024/819200, HD 10x1024/1638400 | MF-348 | — |
atx |
T2 | test_atx_interleave_positions, test_atx_layout, test_atx_roundtrip, test_format_probe_fuzz, test_plugin_probe_real |
a8rawconv 0.95 (GPL-2-or-later, Referenz-Orakel in src/a8rawconv/, wird nicht gebaut): src/a8rawconv/diskatx.cpp:3-62 (ATXFileHeader/ATXTrackHeader/ATXSectorHeader/ATXTrackChunkHeader mit static_assert auf 48 bzw. 32 Byte), :64-190 read_atx, :216-416 write_atx. Der Schreiber ist hier die staerkere Quelle: er legt Feld fuer Feld fest, was der Leser konsumiert. | MF-467 — Datei-, Spur-, Chunk- und Sektorkopf Feld fuer Feld verglichen. Vier Fehler gefunden und behoben, zwei davon toedlich: (1) Spurkopf-Flags standen bei uns auf 0x14, richtig ist 0x10; (2) der Chunk-Offset stand auf 0x18, richtig ist 0x14 — dadurch kam der Offset aus Fuellbytes, also 0, der Chunk-Scan begann auf dem Spurkopf selbst, fand keine Sektorliste und lieferte eine leere Spur. JEDE ATX-Datei las sich als leere Diskette, ohne Fehlermeldung. (3) Die Dichte wurde von 0x13 gelesen (Fuellbyte) statt von 0x12. (4) Der Leser erwartete eine Tabelle von LE32-Spur-Offsets und eine Spurzahl im Dateikopf bei 0x14 — beides gibt es im Format nicht: 0x14 ist mImageId, und die Spuraufzeichnungen stehen hintereinander und werden der Reihe nach abgelaufen (read_atx:75-101, write_atx:300-317). Neu belegt uebernommen: FDC-Status-Semantik (0x18 zusammen = Adressfeld-CRC, 0x08 allein = Datenfeld-CRC, 0x10 = kein Datenfeld, 0x20 = Deleted-Mark 0xF8, 0x04 | 0x02 = langer Sektor, 0x40 = weak), doppelte Sektornummern als Phantomsektoren (UFT_SECTOR_DUPLICATE), und die Zuordnung der Weak-Chunks ueber den Index in der SEKTORLISTE statt ueber die Reihenfolge der erzeugten Sektoren. Abgesichert mit tests/test_atx_layout.c gegen ein bytegenau nach diskatx.cpp gebautes Abbild; Rot-Probe: alle drei Faelle fallen auf der alten Fassung um, der erste schon an der Spurzahl. NICHT verifiziert: Verhalten an einem realen ATX-Abbild — keines im Korpus, daher T2 und nicht T1. |
cqm |
T2 | test_cqm_layout, test_format_probe_fuzz, test_plugin_probe_real |
Primaer: "CopyQM Format (*.cqm) — Disk image layout", RPN, 2023-03-31, https://rio.early8bitz.de/cqm/cqm-format.pdf (abgeleitet aus LibDsk drvqm.c/crctable.c). Gegengelesen: SAMdisk 4.0 (MIT), src/samdisk/cqm.cpp:10-41 CQM_HEADER + :60-79 CRC + :129-146 RLE. | MF-461 — 133-Byte-Kopf Feld fuer Feld verglichen; beide Quellen stimmen ueberall ueberein, und die Primaerquelle sagt ausdruecklich, dass der Block 0x03..0x1B der BPB einer DOS-Diskette ist (was die Feldfolge dort unabhaengig bestaetigt). Der bisherige Leser las ein Layout, das in KEINER der beiden Quellen vorkommt und auch kein BPB ist: Sektorgroesse als 128<<n-Code aus dem Einzelbyte 0x03 statt als LE16-Byteanzahl aus 0x03,0x04; Sektoren/Spur aus 0x08 (das ist die FAT-Kopienzahl) statt aus 0x10,0x11; Koepfe aus 0x09 (Verzeichniseintraege) statt aus 0x12,0x13; Zylinder aus 0x0F (High-Byte von Sektoren/FAT) statt aus 0x5A; Kommentarlaenge aus 0x10,0x11 statt aus 0x6F,0x70; Datenbeginn bei Offset 18 statt bei 133+Kommentarlaenge. Dazu war die RLE-Polaritaet invertiert (positive Zahl = Wiederholung statt Literalfolge). Kopfpruefsumme (Summe ueber alle 133 Byte == 0 mod 256), Daten-CRC (CRC-32 reflektiert mit CopyQMs 6-Bit-Tabellenquirk &0x3f), Sektorbasis 0x71 und Fuellbyte nach Blind-Modus 0x58 fehlten ganz. Alles ersetzt und mit tests/test_cqm_layout.c gegen ein bytegenau nach Spec gebautes Abbild abgesichert; Rot-Probe: alle fuenf Faelle fallen auf der alten Fassung um. | — |
d13 |
T2 | test_d13_layout_verified |
Differenzlauf gegen die Referenz-Implementierung to_woz2 (Apple-II-Disk-Tools, Commit 639dc1c; registriertes Oracle, docs/ORACLES.md). Die Zuordnung logisch<->physisch ist die IDENTITAET, zweifach belegt: mamedev/mame ap2_dsk.cpp:410 a2_13sect_format::logical_sector_index(int p) { return p; } (BSD-3-Clause) und ciderpress2.com/formatdoc/Unadorned-notes.html '13-sector floppies use physical sector order'. Der Kontrast traegt den Beleg: die 16-Sektor-Fassung steht bei :666 und benutzt dos_skewing[]/prodos_skewing[]. |
MF-722: linke Seite uft_format_plugin_d13 (Versatz (cyl*13+s)*256, Sektor-ID = s), rechte Seite dieselbe Diskette ueber to_woz2 -> WOZ 2.0 -> uft_apple_gcr_scan_track() auf dem 5-and-3-Weg (MF-721). Gemessen: 454 dekodiert, 454 verglichen, 454 BYTEIDENTISCH. Der 455. ist Spur 0 Sektor 0 — DOS 3.2 schreibt den Bootsektor mit einer ANDEREN 5-and-3-Variante (to_woz2.c deduce_encoding(): ENC_53A statt ENC_53); er wird als alt_encoding BENANNT, nicht geraten, und liefert keine Bytes. Regressionsschutz: tests/test_d13_layout_verified.c — dort auch die Messung, dass d13_open() jede Datei mit falscher Groesse abweist (der 0xE5-Fuellzweig in read_track ist dadurch unerreichbar). | — |
d77 |
T2 | test_d88_header_variants |
pc98.org D88 (D77 teilt das Layout) + MAME d88_dsk — Kopf 688 ODER 672 Byte, Spurtabelle 164 bzw. 160 Eintraege, erster Versatz 0x2B0 oder 0x2A0 | MF-625 | — |
d88 |
T2 | test_d88_error_marks, test_d88_header_variants, test_format_probe_fuzz, test_plugin_probe_real |
pc98.org D88 + MAME d88_dsk (DDAM @+07, FDC status @+08) | MF-336 | — |
dc42 |
T2 | test_dc42_checksum_roundtrip, test_format_probe_fuzz, test_plugin_probe_real |
DiscFerret/Mini-vMac DC42 checksum (BE16 word add, ROR32 1) | MF-324 | — |
dmk |
T2 | test_dmk_crc |
David Keil DMK spec (openMSX DMK-Format-Details) + WD177x CRC-CCITT pinned to check value 0x29B1 | MF-353 | — |
do |
T2 | test_apple_do_po_bounds, test_do_layout_verified, test_do_po_probe_ignores_content, test_do_write_roundtrip, test_format_probe_fuzz, test_plugin_probe_real, test_sector_id_on_disk |
Differenzlauf gegen die Referenz-Implementierung to_woz2 (Apple-II-Disk-Tools, Commit 639dc1c; registriertes Oracle, docs/ORACLES.md) plus die DOS-3.3-Interleave-Tabelle aus a8rawconv diska2.cpp:3-5 als unabhaengige zweite Quelle |
MF-716: linke Seite uft_format_plugin_do (Versatz (cyl*16+s)*256, Sektor-ID = logisch s), rechte Seite dieselbe Diskette ueber to_woz2 -> WOZ 2.0 -> uft_apple_gcr_scan_track() in physische Sektoren, verbunden ueber die Interleave-Tabelle. Gemessen: 560 dekodiert, 560 verglichen, 560 BYTEIDENTISCH, 0 fehlend. Der Regressionsschutz steht in tests/test_do_layout_verified.c. Gilt NUR fuer die DOS-Ordnung — po war nicht beteiligt und bleibt T3. |
— |
dsk_cpc |
T2 | test_edsk_error_marks, test_format_probe_fuzz, test_plugin_probe_real |
EDSK uPD765 ST1/ST2 status-bit semantics (bit5 CRC, ST2 bit6 deleted); MF-332 verified the dsk_cpc implementation (the separate 'edsk' plugin in amstrad/ remains untested) | MF-332 | — |
imd |
T2 | test_format_probe_fuzz, test_imd_error_marks, test_imd_track_record, test_imd_write_roundtrip, test_plugin_probe_real |
MAME src/lib/formats/imd_dsk.cpp (sector numbering map unconditional: "offs += 5 + sector_num"; cylinder map if header[2] & 0x80; head map if & 0x40) cross-checked against hharte/libimd src/libimd.h (IMD_HFLAG_CMAP_PRES 0x80, IMD_HFLAG_HMAP_PRES 0x40, LIBIMD_MAX_SECTORS_PER_TRACK 256) | MF-430 | — |
korg_dss1 |
T2 | test_korg_dss1_plugin |
chickensys Korg DSS-1 geometry (80x2x5x1024) | MF-347 | — |
lisa_twiggy |
T2 | test_lisa_twiggy_plugin |
bitsavers Lisa Twiggy ZCAV zone table (46 tracks/side, 22..15 spt) | MF-349 | — |
mfi |
T2 | test_mfi_layout |
MAME, src/lib/formats/mfi_dsk.h (struct header / struct entry, RESOLUTION_SHIFT = 30, CYLINDER_MASK = 0x3fffffff) und src/lib/formats/mfi_dsk.cpp:81-82 (sign[16] = "MAMEFLOPPYIMAGE", sign_old[16] = "MESSFLOPPYIMAGE", je einschliesslich der abschliessenden Null), identify() vergleicht alle 16 Byte, load() liest die Eintragstabelle ab sizeof(header) = 0x20. Beide Dateien BSD-3-Clause per SPDX-Header; kein Code uebernommen, nur das Layout verglichen. | MF-614 — gefunden im vierten Scout-Zyklus. Der Leser prueste ACHT Byte ("MAMEFLOP"), ein Praefix der echten Kennung: er wies echte MAME-Dateien deshalb nicht ab, sondern nahm sie AN und las sie falsch. Die Spurtabelle las er ab 0x10 (sein eigener Kopfkommentar beschrieb das so) — dort liegen cyl_count und head_count; die Eintraege beginnen bei 0x20. form_factor holte er von 0x08, also aus der Kennung. Die Eintragszahl leitete er aus der Dateigroesse ab statt aus (cyl_count << resolution) * head_count. Alle vier berichtigt; zusaetzlich uebernommen: die Schranken aus identify() (Zylinder <= 84, Aufloesung < 3, Koepfe <= 2). Abgesichert mit tests/test_mfi_layout.c gegen ein bytegenau nach mfi_dsk.h gebautes Abbild; Rotprobe: beide Zusicherungen fallen auf der alten Fassung, die erste schon daran, dass ein verfaelschtes Byte 8 noch als gueltig durchging. NICHT verifiziert: die Spurnutzlast. Das Fixture traegt Kopf und Eintragstabelle, keine echten MFI-Zellendaten — dafuer braucht es eine reale Datei, und im Korpus liegt keine. Deshalb T2 und nicht T1. | — |
msa |
T2 | test_format_probe_fuzz, test_msa, test_plugin_probe_real |
SAMdisk 4.0 (MIT), src/samdisk/msa.cpp:9-16 MSA_HEADER + :38-44 Plausibilitaet | MF-460 — 10-Byte-Kopf Feld fuer Feld verglichen, alle big-endian: Magic 0x0E0F, Sektoren/Spur, Seiten MINUS EINS, Startspur, Endspur. Der +1-Aufschlag bei den Seiten stand nicht in unserer Beschreibung, wird vom Code aber richtig gerechnet (wie samdisk/msa.cpp:44). Die Probe pruefte nur das Magic und meldete 95; sie prueft jetzt zusaetzlich, was msa_plugin_open() ohnehin verlangt, plus SAMdisks Nullbyte-Pruefung der oberen Feldbytes. | — |
nfd |
T2 | test_nfd_r0 |
pc98.org nfdr0/nfdr1 + tomari/d88split nfd2mhlt.pl (r1 skip accounting spec-only, no real r1 corpus yet) | MF-358, MF-360 | — |
st |
T2 | test_st_geometry, test_st_write_roundtrip |
SAMdisk 4.0 (MIT), src/samdisk/st.cpp:6-67 (Boot-Pruefsumme, BPB-Pfad, Geometrie-Scan) + src/samdisk/bpb.h (BIOS Parameter Block). BPB-Offsets unabhaengig gegengelesen an der DOS-Bootsektor-Spalte der CopyQM-Layoutbeschreibung (rio.early8bitz.de, siehe Eintrag cqm), die dieselben Offsets 0x0b/0x18/0x1a nennt. | MF-462 — ST ist kopflos, die Geometrie muss also aus BPB oder Dateigroesse kommen; verifiziert wurde die Reihenfolge und der Umfang beider Wege. (a) BPB zuerst: Bytes/Sektor 0x0B, Gesamtsektoren 0x13, Sektoren/Spur 0x18, Koepfe 0x1A, akzeptiert nur wenn in sich stimmig UND die Dateigroesse exakt erklaert — wie samdisk/st.cpp:24-45. Das entscheidet den Fall 368.640 Byte, der 80x1x9 UND 40x2x9 ist; der Dateikopf nannte beide Lesarten, der Code nahm still die erste. (b) Groessen-Scan als Rueckfall ueber 80..84 Zylinder und 8..11 Sektoren wie samdisk/st.cpp:47-67 — die erweiterten ST-Formate mit 82/83 Spuren und 10/11 Sektoren wurden vorher AUSNAHMSLOS abgewiesen. Die Reihenfolge des Scans ist so gewaehlt, dass alle sechs bisher bekannten Groessen unveraendert aufgeloest werden (Test the_six_legacy_sizes_resolve_unchanged). Zusaetzlich uebernommen: die TOS-Boot-Pruefsumme (256 Big-Endian-Woerter des Bootsektors summieren zu 0x1234, samdisk/st.cpp:6) als einziges positives Erkennungsmerkmal des Formats — nur bei SAMdisk belegt, nicht doppelt gegengelesen. NICHT verifiziert: Verhalten an einem realen ST-Abbild (keines im Korpus) — daher T2. | — |
stx |
T2 | test_format_probe_fuzz, test_plugin_probe_real, test_stx_error_marks |
Pasti STX descriptor spec (atari.8bitchip.info/STXdesc) | MF-335 | — |
td0 |
T2 | test_format_probe_fuzz, test_plugin_probe_real, test_td0_error_marks |
SAMdisk 4.0 (MIT), src/samdisk/td0.cpp:14-25 TD0_HEADER + :28/:208 Kommentar-Flag | MF-460 — 12-Byte-Kopf Feld fuer Feld verglichen: Signatur, Volume-Sequenz, Check-Signatur, Version, Quelldichte, Laufwerkstyp, Spurdichte, DOS-Modus, Seiten, CRC. Position und Breite stimmen ueberall ueberein. Eine Abweichung gefunden und behoben: Byte 7 war als "Stepping type (0=SS, 1=DS, 2=EDS)" beschrieben, ist aber die Spurdichte mit Bit 7 als Kommentar-Flag — was unser eigener Code in uft_td0_lzss.c:469 bereits so auswertet. Falsch war die Beschreibung, nicht das Verhalten. | — |
woz |
T2 | test_apple_gcr_6and2, test_diskcopy, test_format_probe_fuzz, test_moof_roundtrip, test_plugin_probe_real, test_woz_roundtrip, test_woz_writer |
Applesauce WOZ reference v1/v2/2.1 (chunk layout, CRC32, WRIT logical refs) | MF-317, MF-357, MF-361 | — |
2img |
T3 | test_2img_nib_stride, test_format_probe_fuzz, test_plugin_probe_real |
— | — | — |
86f |
T3 | test_86f_spec_conformance |
— | — | — |
apridisk |
T3 | — | — | — | — |
cas |
T3 | — | — | — | — |
cfi |
T3 | — | — | — | — |
cpm |
T3 | test_cpm_fs |
— | — | — |
dcm |
T3 | — | — | — | — |
dim |
T3 | — | — | — | — |
dms |
T3 | test_uft_dms |
— | — | — |
edk |
T3 | — | — | — | — |
edsk |
T3 | test_format_probe_fuzz, test_plugin_probe_real |
— | — | — |
fdi_pc98 |
T3 | — | — | — | — |
fds |
T3 | — | — | — | — |
hardsector |
T3 | test_hardsector_geometry |
— | — | — |
img |
T3 | test_format_probe_fuzz, test_img_write_roundtrip, test_plugin_probe_real, test_sector_id_on_disk |
— | — | — |
ipf |
T3 | test_format_probe_fuzz, test_ipf_air_accessors, test_plugin_probe_real |
— | — | — |
jv1 |
T3 | test_format_probe_fuzz, test_plugin_probe_real |
— | — | — |
jv3 |
T3 | — | — | — | — |
jvc |
T3 | — | — | — | — |
kfx |
T3 | — | — | — | — |
logical |
T3 | — | — | — | — |
mgt |
T3 | — | — | — | — |
micropolis |
T3 | — | — | — | — |
msx_disk |
T3 | — | — | — | — |
myz80 |
T3 | — | — | — | — |
nanowasp |
T3 | — | — | — | — |
nib |
T3 | test_format_probe_fuzz, test_plugin_probe_real |
— | — | — |
northstar |
T3 | — | — | — | — |
opus |
T3 | — | — | — | — |
pdp |
T3 | — | — | — | — |
po |
T3 | test_apple_do_po_bounds, test_do_po_probe_ignores_content, test_format_probe_fuzz, test_plugin_probe_real, test_po_write_roundtrip |
— | — | — |
posix |
T3 | — | — | — | — |
pri |
T3 | — | — | — | — |
pro |
T3 | test_atari, test_floppy_formats, test_st_plugin |
— | — | — |
qrst |
T3 | — | — | — | — |
rcpmfs |
T3 | — | — | — | — |
sad |
T3 | — | — | — | — |
sam |
T3 | — | — | — | — |
sap_thomson |
T3 | — | — | — | — |
scl |
T3 | — | — | — | — |
ssd |
T3 | — | — | — | — |
syn |
T3 | — | — | — | — |
t1k |
T3 | — | — | — | — |
tan |
T3 | — | — | — | — |
trd |
T3 | — | — | — | — |
udi |
T3 | — | — | — | — |
v9t9 |
T3 | — | — | — | — |
vdk |
T3 | — | — | — | — |
victor9k |
T3 | — | — | — | — |
xdm86 |
T3 | — | — | — | — |