SCRATCH

Aus C64-Wiki
Zur Navigation springenZur Suche springen
SCRATCH
Syntax: SCRATCH <Dateiname> [,D<Laufwerk>] [,U<Geräteadresse>]
Parameter
<Dateiname> : Zeichenkettenausdruck
<Laufwerk> : numerischer Ausdruck mit Wert 0 oder 1
<Geräteadresse>: numerischer Ausdruck im Wertebereich von 3 bis 31 bei BASIC 3.5 und BASIC 4 bzw. von 4 bis 30 bei BASIC 7.0
Einordnung
Typ: Anweisung
Kontext: Diskettenbefehl
Aufgabe: Programme auf einer Diskette löschen
Abkürzung: scR
Token: $f2 (242)
Verwandte Befehle
HEADER

Anmerkung: Dieser Artikel beschreibt den BASIC-Befehl SCRATCH ab Commodore BASIC 3.5 oder höher.


Der Befehl SCRATCH löscht eine Datei auf Diskette im angegebenen Diskettenlaufwerk. Im Direktmodus erscheint vor dem eigentlichen Löschvorgang immer die Sicherheitsabfrage

ARE YOU SURE?

(unabhängig davon, ob die zu löschende Datei tatsächlich existiert oder nicht). Gelöscht wird erst, wenn der Buchstabe "Y" oder irgendeine Eingabe, die mit "Y" beginnt, z.B. "YES" erfolgt und mit RETURN  abgeschlossen wird. Bei allen anderen Angaben, bricht der Befehl kommentarlos ab.
Hinweis: Wird SCRATCH in BASIC-Programmen benutzt, entfällt die Sicherheitsabfrage!

Der Parameter Dateiname muss eine Zeichenkette sein und darf maximal 16 Zeichen lang sein, wobei im Falle einer Längenüberschreitung der Fehler ?STRING TOO LONG ERROR gemeldet wird.
Der Parameter Dateiname wird üblicherweise unter Anführungszeichen stehend als Konstante angegeben, kann aber auch als eine Zeichenkettenvariable oder generell als ein Zeichenkettenausdruck, dann aber in runden Klammern stehend, angeführt sein. Liefert der Ausdruck eine leere Zeichenkette (""), führt dies zur Fehlermeldung ?MISSING FILENAME ERROR (ab BASIC 7.0), sonst ?ILLEGAL QUANTITY ERROR.

Zulässige Werte (stets als Ganzzahl aufgefasst) für Parameter

  • Geräteadresse (Gerät 8, falls nicht vorhanden) sind von 3 bis 31 bei BASIC 3.5 und BASIC 4 bzw. von 4 bis 30 bei BASIC 7.0,
  • Laufwerk sind 0 oder 1.

Die Löschaktion endet im Direktmodus mit der Ausgabe des Fehlerkanals (stets auch in Variable DS$ vorhanden). Wenn sonst kein Fehler aufgetreten ist, wird üblicherweise "01, FILES SCRATCHED,NN,00" ausgeben, wobei hier der Track-Wert mit NN eine Zahl von 00 bis 99 angibt, die der Anzahl der tatsächlich gelöschten Dateien entspricht. 00 würde an sich bedeuten, das keine Datei gelöscht wurde, allerdings werden bei Werten größer als 99 immer nur die Einer- und Zehnerstelle dargestellt. Das heißt, bei 100 gelöschten Dateien ergibt sich ebenso 00, weshalb die Statusabfrage keine zuverlässige Angabe darstellt, ob und wie viele Dateien gelöscht wurden (nur bei weniger als 100 Einträgen im Verzeichnis).

Wurde mit dem SCRATCH-Befehl ein Diskettenlaufwerk angesprochen, zu dem die Geräteadresse falsch eingestellt ist oder nicht existiert, erscheint die Fehlermeldung ?DEVICE NOT PRESENT ERROR. Geräte, die kein Doppellaufwerk sind, kennen üblicherweise kein Laufwerk 1 und die Angabe dieser Laufwerksnummer wird im Fehlerkanal mit der Meldung "31,SYNTAX ERROR,00,00" quittiert. Falls das Laufwerk vorhanden ist, aber keinen Datenträger eingelegt hat, wird im Fehlerkanal die Meldung "74,DRIVE NOT READY,00,00" gemeldet.
Sind die Parameter außerhalb des zulässigen Wertebereichs, erscheint die Fehlermeldung ?ILLEGAL QUANTITY ERROR.

Funktionsweise[Bearbeiten | Quelltext bearbeiten]

Diese Anweisung sendet den DOS-Befehl Scratch an das angegebene Laufwerk. Diese führt dann selbstständig den Löschvorgang aus, wobei das Ende des Vorgangs abgewartet wird. Im Falle eines unerwarteten Abbruchs (Laufwerks-LED blinkt) während eines Programmlaufs, kann der konkrete Grund des Scheiterns über die Systemvariablen DS bzw. DS$ abgefragt werden. Im fehlerfreien Fall zeigt eine Meldung im Fehlerkanal die Anzahl der tatsächlich gelöschten Dateien an.

BASIC 2.0 Entsprechung[Bearbeiten | Quelltext bearbeiten]

Allgemeine Syntax:

SCRATCH "Dateiname",D<Laufwerk> ON U<Gerät>

Entsprechung in BASIC V2-Syntax:

OPEN 15,<Gerät>,15,"S<Laufwerk>:Dateiname":CLOSE 15

Die BASIC-V2-Variante ist flexibler, da hier die Kommandolänge 34 Zeichen betragen darf.
Siehe Kompatibilitätsbeispiel.

Hinweise zum Parameter Dateiname[Bearbeiten | Quelltext bearbeiten]

  • Im Parameter dürfen die Jokerzeichen * und ? verwendet werden, wobei nicht nur das erste, sondern alle zutreffenden Dateien heran gezogen werden. Mit Hilfe der Jokerzeichen können somit mehrere Dateien gleichzeitig gelöscht werden!
  • Der Parameter kann mit einem Dateitypselektor abgeschlossen sein (ohne einen solchen, wird jede passende Datei beliebigen Typs herangezogen). Eingeleitet wird die Angabe mit einem "=" gefolgt von einem Zeichen "P" (für PRG) oder "S" (für SEQ) oder "U" (für USR) oder "R" (für REL) entsprechend den korrespondierenden Dateitypen. Andere Zeichen stehen für "alle" Typen. Beispiel: "*=U" wählt alle Dateien des Typs USR.
  • Mehrere Dateinamen oder Muster, die Joker enthalten, können im Parameter durch Komma getrennt angegeben sein, sofern das Limit von 16 Zeichen nicht überschritten wird.
  • Der Fehlerkanal meldet "30,SYNTAX ERROR,00,00", wenn z.B. der Dateitypselektor nicht am Ende des Parameters oder mehrfach vorkommt.

Besonderheiten bei Diskbefehlen[Quelltext bearbeiten]

  • Bei einem Dateinamen ist optional ein führendes @ möglich (nur bei einer Dateinamenangabe von mehreren erlaubt), um eine bestehende Datei zu überschreiben (REPLACE-Funktion). Das Zeichen wirkt sich dann nicht auf das Längenlimit von 16 Zeichen aus. Intern wird damit immer der für den Save-Bug sichere Dateiname "@0:<Dateiname>" verwendet (in diesem Fall für Laufwerksnummer 0).
  • Die Parameter mit einem führenden Buchstaben, die logische Dateinummer beginnend mit # und Dateinamensangaben sind positionsunabhängige Parameter und dürfen beliebig gereiht sein. Abweichend davon sind jene Befehle, die einen Quell- und Zielteil aufweisen, wie etwa COPY, wo dies nur für den jeweiligen Bereich vor bzw. nach dem trennenden TO gilt.
  • Der Buchstabe eines positionsunabhängigen Parameters steht für:
    • B: bank (Banknummer)
    • D: drive (Laufwerksnummer)
    • I: identification (ID-Kennung eines Mediums)
    • L: record length
    • P: position in memory (Start-/Endadresse)
    • R: read (lesende Operation)
    • W: write (schreibende Operation)
    • U: unit (Gerätenummer)
  • Variablen oder allgemeine Ausdrücke bei positionsunabhängigen Parametern sind möglich, müssen aber in Klammern gesetzt werden (außer bei "I<Id>", wo immer nur eine 2-Zeichen-Konstante erwartet wird).
  • Die Angabe der Geräteadresse oder Bank (bei BASIC 7.0) kann entweder mit "," oder mit "ON" oder kombiniert mit ",ON" eingeleitet werden, wobei im Falle eines Kommas bereits ein anderer Parameter voran gegangen sein muss.
  • Der optionale Parameter "I<Kennung>" für die Angabe der Identifikation wird immer akzeptiert. Dem "I" müssen 2 Zeichen folgen, wobei beliebige Leerzeichen dazwischen vorkommen dürfen. Der Wert kann nicht durch einen geklammerten Ausdruck ersetzt werden. Gewisse Werte, die BASIC-Befehle wie IF, ON, FN, TO oder BASIC-Abkürzungen wie jO, hE enthalten, werden fälschlicherweise als das entsprechende Schlüsselwort und nicht als der beabsichtigte Text interpretiert. Alle nichtkonformen Fälle führen dann zur Fehlermeldung ?SYNTAX ERROR.
  • Ein Parameter "R" (ohne weitere Wertangabe, bei DOPEN zur expliziten Angabe des vorgegebenen Read-only-Modus gedacht) wird bei allen Diskbefehlen immer akzeptiert, hat aber keinerlei zusätzliche Bedeutung. Im Falle von BASIC 3.5 wird hingegen ?SYNTAX ERROR gemeldet.


Beispiele[Bearbeiten | Quelltext bearbeiten]

SCRATCH "SPIEL 1"

Löscht die Datei "SPIEL 1" auf der Diskette, die sich im Diskettenlaufwerk 0 mit der Geräteadresse 8 befindet.

SCRATCH "SPIEL,SCORE"

Löscht die beiden Dateien "SPIEL" und "SCORE" sofern vorhanden.

SCRATCH "DIVERSE,?=S"

Löscht nur sequenzielle Dateien (Type SEQ) mit dem Namen "DIVERSE" und solche mit nur genau einem Zeichen.

SCRATCH "ALTES-SPIEL",D1,U9

Löscht die Datei "ALTES-SPIEL" auf der Diskette, die sich im Diskettenlaufwerk 1 mit der Geräteadresse 9 befindet.

SCRATCH "ALTES-SPIEL" ON U9,D1

Identisch mit Beispiel davor in alternativer Syntax für den Parameter U<Geräteadresse> mit "ON" statt einem Komma.

SCRATCH "DATEN198*",U11

Löscht alle Dateien, die mit dem Dateinamen "DATEN198" beginnen, auf der Diskette, die sich im Diskettenlaufwerk 0 mit der Geräteadresse 11 befindet.

110 PRINT CHR$(147)+"Willkommen beim Dateiloeschen!"
120 LW = 0 : INPUT "Bitte Diskettenlaufwerk waehlen (0 oder 1, Vorgabe 0)";LW
130 IF LW < 0 OR LW >1 GOTO 120
140 GA = 0 : INPUT "Bitte Laufwerksadresse angeben (4 bis 30, Vorgabe 8)";GA
150 IF GA < 0 OR GA >30 GOTO 140
160 IF GA < 4 THEN GA = 8
170 DIRECTORY D(LW),U(GA)
180 INPUT "Bitte Dateiname eingeben (Jokerzeichen * und ? erlaubt)";NAME$
190 DIRECTORY (NAME$),D(LW),U(GA)
200 PRINT "Diese Dateien löschen? (J/[N])"
210 GET A$: IF A$="" GOTO 210
220 IF A$<>"J" GOTO 170
230 SCRATCH (NAME$),D(LW),U(GA): PRINT "Status: ";DS$
240 PRINT "Weitere Dateien löschen? (J/[N])"
250 GET A$: IF A$="" GOTO 250
260 IF A$="J" THEN RUN 110

Löscht Dateien auf der Diskette mit Hilfe eines Programms.


Kompatibilität

100 SCRATCH "?-DEMO*" D0 ON U8

oder das Gleiche mit BASIC V2:

100 OPEN 15,8,15,"S0:?-DEMO*":CLOSE 15