Skip to content

Latest commit

 

History

History
108 lines (102 loc) · 19.7 KB

File metadata and controls

108 lines (102 loc) · 19.7 KB

Format-Verifikations-Stufen (generiert)

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.

Zusammenfassung

Stufe Formate
T1 2
T1b 13
T2 23
T3 50
gesamt 88

Pro Format

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