Commit babad09
committed
feat(p3-204): posix schreibt bis in die Datei - und die Mutationsmatrix fand eine stille Umwandlung (MF-1119)
`posix_write_track()` ruft jetzt `uft_posix_write()` und schreibt bis in
die Datei. Neunter der elf aus MF-930. Merkmalstafel `Write` von
UNSUPPORTED auf SUPPORTED, `.capabilities` um `UFT_FORMAT_CAP_WRITE`
ergaenzt. Damit ist die Sechserliste aus MF-1111 abgearbeitet.
WARUM DAS KEINE ZEILE WAR.
`uft_posix_write()` rechnet mit `uft_logical_offset(c, h, nummer, &lg)`,
und `lg` folgt aus `g.sides` - der Schreiber KANN seit MF-1034 alle drei
Spielarten. Aber ohne uebergebene Geometrie faellt er auf
`UFT_LOGI_SIDES_ALT` zurueck, und `posix_open()` behielt nur den
Bildzeiger; `disk->geometry` hat kein Anordnungsfeld.
Eine naive Verdrahtung haette also IMMER `alt` geschrieben - woertlich
der Befund, den MF-1034 auf der LESESEITE behoben hat, wo bei
`acorn640` (80 x 2, OUTOUT) 158 von 160 Spuren an anderer Stelle lagen.
Derselbe Fehler auf der Schreibseite waere die naechste Wiederholung von
MF-519/MF-529.
`plugin_data` traegt deshalb jetzt eine eigene Struktur mit der vom
LESER benutzten `posix_geometry_t`, aus `posix_read_result_t.geometry`.
Sie neu aus der `.geom` zu lesen waere NICHT dasselbe: zwischen Oeffnen
und Schreiben koennte die Nachbardatei sich geaendert haben, und dann
schriebe der Schreiber eine andere Anordnung als der Leser gelesen hat.
MF-931 Regel 4 ist genau das. Vier Fundstellen angepasst (`open`,
`close`, `read_track`, `write_track`).
ABNAHME: 57 gruen / 0 rot (vorher 48).
Der neue Pruefling ist `posix-outback`, 80 x 2 x 9 x 512 - dieselbe
Geometrie wie libdsks `ibm720`, an dem MF-1032 die OUTBACK-Regel
abgenommen hat. `outback` und nicht `alt`, und das ist der Punkt: eine
`alt`-Probe waere auch bei einem Schreiber gruen, der die Anordnung gar
nicht kennt - dieselbe Aussagelosigkeit wie die Fuellbyte-Diskette aus
MF-1021.
`posix` ist dabei der erste Pruefling mit einer NACHBARDATEI: seine
Sonde prueft kein Magic, sondern nur, ob eine `.geom` daneben liegt. Die
Probe legt sie selbst an und raeumt sie wieder ab.
DER EIGENTLICHE BEFUND, UND ER KAM AUS DER MATRIX, NICHT AUS DEM
NACHDENKEN.
Mutation M1 ersetzte `&pd->geometry` durch `NULL` - also genau die
naive Verdrahtung. Die Probe blieb GRUEN, 56 von 56. Der Grund ist kein
Messfehler:
`uft_posix_write()` schreibt die `.geom` NEU, mit seiner eigenen
Annahme. Danach stand dort `alt`, das Neu-Oeffnen las `alt`, und der
Ruecklesevergleich stimmte mit dem ueberein, was `alt` geschrieben
hatte.
Ein geschlossener Kreis - dieselbe Gestalt wie die gruenen Rundlauftests
von `apridisk` (MF-1009) und `qrst` (MF-1028), wo Packer und Entpacker
Spiegelbilder derselben Erfindung waren. Und die Diskette war dabei
still von `outback` auf `alt` VERWANDELT: genau das, was das
Leitprinzip verbietet.
Ein Sektorvergleich kann das grundsaetzlich nicht sehen, wenn die
IDENTITAET des Abbilds in einer Nachbardatei steht und der Schreiber sie
mitschreibt. Die Probe prueft sie deshalb byteweise, und die Mutation
faellt: Matrix 4 von 5 statt 3 von 5.
Damit ist auch mein eigener Kommentar im Test berichtigt. Er sagte, an
`outback` falle ein immer-`alt`-Schreiber sofort auf. Das war FALSCH,
solange die Nachbardatei mitgeschrieben wird - die Messung hat die
Behauptung widerlegt und die fehlende Zusage geliefert.
Die fuenfte Mutation ist gemessen redundant, nicht weggeredet:
Pfadpruefung entfernt rutscht durch, weil `uft_posix_write()` selbst
`if (!disk || !path) return UFT_ERR_INVALID_PARAM;` traegt - dieselbe
Lage wie bei `hardsector` (MF-1117), Gestalt von MF-1031. Die Pruefung
bleibt, weil sie den Versuch nicht unternimmt und den genaueren Code
`UFT_ERR_INVALID_STATE` liefert.
WAS OFFEN BLEIBT: neu als P3-381 - darf ein Schreiber die Nachbardatei
ueberschreiben, in der die Identitaet des Abbilds steht? Fuer einen
Export ist das richtig, fuer eine Aenderung an Ort und Stelle ist es
eine stille Umwandlung. Der Weg ueber `write_track` ist abgesichert;
jeder andere Aufrufer mit `geometry == NULL` ist es nicht. Drei Wege
benannt, keiner gewaehlt - Eigentuemer-Entscheidung.
Berichtigt im Dateikopf: dort stand "Er bleibt ohne Aufrufer (P3-204,
MF-930)". Das gilt nicht mehr.
Stand der dreizehn Schreiber: 9 verdrahtet, 1 offen (`logical` an
P3-337), 2 Absicht (`ibm3740`, `rcpmfs`), 1 mit eigenem Blocker (`atx`,
P3-380).
Kennzahl: keine der vier direkt - aber die `Write`-Zusage der
posix-Merkmalstafel geht von UNSUPPORTED auf SUPPORTED, und Tor 57
nimmt sie an.
DAZU EIN ZWEITER OFFENER PUNKT, GEMESSEN BEIM WEITERGEHEN: P3-382.
Naechster Posten auf der Hardware-Seite war Applesauce M3.3 („serial
I/O pending"). Vor dem Bauen gemessen: von `uft_as_open`,
`uft_as_close`, `uft_as_read_track`, `uft_as_read_disk`,
`uft_as_write_track` und `uft_as_identify` hat KEINE einen
Produktions-Aufrufer. Die einzige Fundstelle ausserhalb der eigenen
Datei und der Header ist `src/hal/uft_hal_unified.c:1280` - und das ist
eine HINWEISZEICHENKETTE in einer Fehlermeldung, kein Aufruf.
Der benutzte Weg ist ein anderer und verdrahtet:
`src/hardwaretab.cpp:863-884` oeffnet einen echten
`QSerialPortApplesauceTransport` und baut daraus sieben Laeufer;
`applesauce_serial_runners.cpp` treibt das dokumentierte Textprotokoll
Schritt fuer Schritt.
Die Serien-E/A der C-HAL zu implementieren waere damit dreifach
fragwuerdig: eine ZWEITE Umsetzung desselben Protokolls (die Klasse
„GCR-Tafel sechsfach", MF-1015, MF-1026), UNERREICHBAR (kein Aufrufer,
also ein selbstgemachter P3-204-Fall), und ohne Geraet nicht abnehmbar
(MF-310). Das wird deshalb NICHT stillschweigend gemacht, sondern als
P3-382 mit drei Wegen aufgeschrieben - Eigentuemer-Entscheidung.
Nebenbei eine eigene Vermutung verworfen: ich war dabei, `CLAUDE.md`
fuer veraltet zu erklaeren (MF-1045-Klasse, wo „runner pending" stand,
waehrend der Laeufer seit MF-256 existierte). Sie hat RECHT - sie
spricht von der HAL, und die HAL ist wirklich gestummelt. Zwei
getrennte Wege, und die Doku unterscheidet sie.
Erfuellte Aufgaben: P3-204 (posix, letzter der loesbaren Teilmenge),
P3-381 und P3-382 eroeffnet.
Claude-Session: https://claude.ai/code/session_01BHdqfaZ5RFb1HPcw7NYoEY1 parent 1e284d0 commit babad09
7 files changed
Lines changed: 286 additions & 22 deletions
File tree
- docs
- src/formats/posix
- tests
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
42 | | - | |
| 42 | + | |
43 | 43 | | |
44 | 44 | | |
45 | 45 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
89 | 89 | | |
90 | 90 | | |
91 | 91 | | |
92 | | - | |
| 92 | + | |
93 | 93 | | |
94 | 94 | | |
95 | 95 | | |
| |||
151 | 151 | | |
152 | 152 | | |
153 | 153 | | |
154 | | - | |
| 154 | + | |
155 | 155 | | |
156 | 156 | | |
157 | 157 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
94 | 94 | | |
95 | 95 | | |
96 | 96 | | |
97 | | - | |
| 97 | + | |
98 | 98 | | |
99 | 99 | | |
100 | 100 | | |
| |||
0 commit comments