REPLACE
REPLACE (zu deutsch: Ersetzen) bezeichnet eine Floppy-Funktion (siehe auch Floppy-Befehle), die beim Abspeichern einer Datei die alte Datei überschreibt. Beim C64 wird dies z.B. mit BASIC mittels
SAVE "@:Name",8
durchgeführt.
Achtung: Das eingebaute CBM-DOS V2.6 REPLACE beim Laufwerk 1541 (und Varianten) ist allerdings fehlerbehaftet (Save-@-Bug) und kann zu Datenverlusten führen! In den aktualisierten ROMs der 1541-II und 1571 wurde versucht, den Fehler zu beheben; in Ausnahmefällen (z.B. falls Dateien geöffnet sind, während das SAVE erfolgt) tritt der Fehler jedoch auch mit den neueren Versionen noch auf.[1]
Save-@-Bug[Bearbeiten | Quelltext bearbeiten]
Diesem Bug liegt ein grundsätzliches Problem in der Verwendung der von CBM-DOS verwalteten Block-Puffer. Der Fehler kann nicht nur in der Save-@-Verwendung auftreten, allerdings tritt das Problem dort am ehesten zu Tage, woraus schließlich auch die Namensgebung resultiert.
Der Fehler tritt nur bei Sekundäradressen 0 und 1 auf (wie sie also üblicherweise bei LOAD und SAVE verwendet werden). Bei Sekundäradressen 2 bis 14 hingegen nicht. Ausnahme ist das Laden des Directorys, wo trotz Sekundäradresse 0 der Fehler nicht vorkommen kann.
Vermeidung und Beseitigung des Fehlers
Für das Vermeiden oder Beseitigen des Fehlers gibt es mehrere Ansätze und Varianten:
- Vermieden wird dieses Verhalten unter Einhaltung gewisser Nebenbedingungen durch explizite Angabe der Laufwerksnummer[2] (engl. drive number) beim Dateinamen, wie sie bei Doppellaufwerken zum Einsatz kommt:
SAVE "@0:Name",8
- Dabei darf allerdings nicht bereits eine Datei geöffnet sein (z.B. auch nach einem Programmabbruch nicht mehr mit CLOSE geschlossene und damit offen gebliebene Datei). Künstlich hervorrufen kann man dies etwa mit
OPEN 2,8,2,"0:*"
- vor dem SAVE-Aufruf.
- Ein Zurücksetzen des Laufwerks mit dem Floppy-Befehl "UI" vor jedem SAVE"@:...", weil damit die internen Puffer in einen Zustand versetzt werden (genügende frei werden), die den Fehler dann nicht mehr hervorrufen können.
- Beseitigung mit Hilfe spezieller Patches[3] der jeweiligen DOS-ROMs für
- Es werden damit auch viele andere Fehler beseitigt und die Wirksamkeit anderer Patches seitens CBM beschrieben, inklusive detaillierter Dokumentation und entsprechender Testprogramme.
- Manche BASIC- und DOS-Erweiterungen (typischerweise Hardware-Schnelllader) oder neuere DOS-Versionen in moderneren Laufwerksmodellen (bei 1571 ab ROM Revision 04[5] [6]) geben zwar an, den Fehler zu beheben, tun dies aber oft auch nur teilweise, da gewisse (wenn auch seltenere) Umstände den Fehler dennoch provozieren, also nicht zuverlässig verhindern können. Etwaige Angaben zur Behebung sind stets entsprechend zu prüfen und zu hinterfragen. Im Zweifelsfall gilt die Empfehlung, sich an den oben genannten Hinweisen zu orientieren.
Quellen[Bearbeiten | Quelltext bearbeiten]
- ↑ Siehe Seite 5 im PDF im Forumsbeitrag von Jochen Adler
- ↑ "Save With Replace: Debugged At Last" - Part 1, Phillip A. Slaymaker, COMPUTE! Magazine, October Issue, 1985, p. 79
- ↑ Anhänge mit Patches und Dokumentation bei Thema: 1541/71 Save-With-Replace- und andere Patches 1 auf Forum64.de von Jochen Adler
- ↑ 1541B ROM RELEASE NOTES: 251968-02 (16K byte, 300ns, checksum=$1A69)
- ↑ comp.sys.cbm USEnet-News-Posting: 1571 ROM RELEASE NOTES: 310654-04 (Revision 04)
- ↑ Engl. Wikipedia "Commodore DOS"-Diskussion : Es gibt für 1571 praktisch nur Revision 03 und 05, wobei die Revision 04 laut comp.sys.cbm USEnet-News-Posting von Fred Bowen vor Produktionsübernahme wegen einer weiteren Fehlerbehebung durch 05 ersetzt wurde.
Referenzen[Bearbeiten | Quelltext bearbeiten]
- Thema: 1541/71 Save-With-Replace- und andere Patches 1 auf Forum64.de von Jochen Adler
- Wikipedia: Commodore DOS: The save-with-replace bug
- "Eliminating SAVE@ and Other 1541 Bugs", Phillip A. Slaymaker,
The Transactor, Volume 7, Issue 02 (September 1986), p. 33 - "Save With Replace: Debugged At Last", Phillip A. Slaymaker, COMPUTE! Magazine, October & November 1985
- Part 1: Issue 65 October 1985, p. 79
- Part 2: Issue 66 November 1985