DCLOSE

Aus C64-Wiki
Zur Navigation springenZur Suche springen
DCLOSE
Syntax: DCLOSE [#<logische Dateinummer>] [,U<Geräteadresse>]
Parameter
<logische Dateinummer> : numerischer Ausdruck (1 bis 255)
<Geräteadresse>: numerischer Ausdruck im Wertebereich von 3 bis 31 bei BASIC 4 bzw. von 4 bis 30 bei BASIC 7.0
Einordnung
Typ: Anweisung
Kontext: Ein/Ausgabe
Aufgabe: angegebene oder alle offenen Dateien eines Laufwerks schließen
Abkürzung: dcL
Token: $fe $0f (254 15)
Verwandte Befehle
CLOSE, DCLEAR

Anmerkung: Dieser Artikel beschreibt den BASIC-Befehl DCLOSE ab Commodore BASIC 4 bzw. BASIC 7.0 oder höher.


Der Befehl DCLOSE schließt entweder mit Parameter logische Dateinummer angegebene (zuvor mit OPEN, DOPEN oder APPEND geöffnete) Datei oder, wenn diese Angabe fehlt, alle offenen Dateien des angegebenen Geräts mit Geräteadresse (standardmäßig 8). Etwaige danach auf diese logischen Dateinummern ausgeführte Lese- oder Schreiboperationen führen dann zu einer Fehlermeldung ?FILE NOT OPEN ERROR.
Ist eine logische Dateinummer angegeben, wird eine eventuell angegebene Geräteadresse ignoriert, da die Dateinummer ohnehin bereits an eine Geräteadresse gebunden ist.
Auch wenn der Name des Befehls die Diskettenorientiertheit signalisiert, wirkt der Befehl auf sämtliche Geräteadressen, die sich den jeweiligen logischen Dateinummern verbergen.

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

  • logische Dateinummer sind 1 bis 255,
  • Geräteadresse (Gerät 8, falls nicht vorhanden) sind von 3 bis 31 bei BASIC 4 bzw. von 4 bis 30 bei BASIC 7.0.

Im Gegensatz zu anderen diskettenorientierten Befehlen bleibt der DCLOSE-Befehl passiv, also bricht nicht mit einer Fehlermeldung ab, auch wenn ein nicht existierendes Diskettenlaufwerk angesprochen wird oder ein logische Datei gar nicht geöffnet ist.
Sind die Parameter außerhalb des zulässigen Wertebereichs, erscheint die Fehlermeldung ?ILLEGAL QUANTITY ERROR, mit Ausnahme bei der Geräteadresse, wo ab BASIC 7.0 die Fehlermeldung ?ILLEGAL DEVICE NUMBER ERROR ausgegeben wird. Eine sonst abweichende Parametersyntax löst die Fehlermeldung ?SYNTAX ERROR aus.

Funktionsweise[Bearbeiten | Quelltext bearbeiten]

In der Form ohne Angabe des Parameters logische Dateinummer sucht diese Anweisung alle zum entsprechenden Gerät aktiven logischen Dateien des KERNALs und schließt diese dann. Im Falle der angegebenen Dateinummer wird eben genau diese geschlossen. Dabei wird auch bei DCLOSE ein eventuelle Umdirektion der Ausgabe mittels CMD nicht aufgehoben (siehe CLOSE)!


BASIC 2.0 Entsprechung

Allgemeine Syntax:

DCLOSE #<logische Dateinummer>

Entsprechung in BASIC V2-Syntax:

CLOSE <logische Dateinummer>

Die Form ohne logische Dateinummer ist nicht ohne weiteres machbar, es sei denn, das Programm führt über die Zuordnung von Dateinummer zu dort benutztes Gerät eigens Buch.

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]

DCLOSE

Schließt alle offenen Dateien Gerät 8 (Standardvorgabe).

DCLOSE#2

Schließt Datei mit logischer Dateinummer 2 (auf dem jeweils dazugehörigen, zum Zeitpunkt des Öffnens angegebenen Gerät).

DCLOSE ON U9
PRINT DS$

Schließt alle offenen Dateien Gerät 9 und gibt den Fehlerkanalstatus des zuvor bei DCLOSE angegebenen Geräts aus.

DCLOSE ON U(GA)

Schließt alle offenen Dateien auf Gerät aus Variable GA.

DCLOSE#(DN)

Schließt die Datei mit logischer Dateinummer in Variable DN.

DCLOSE U9
DCLEAR U9

Das Schließen aller Dateien auf Gerät 9 verhindert nicht korrekt und sauber (infolge der Laufwerksinitialisierung durch DCLEAR) geschlossene Dateien.

Komplettes Beispiel eines Dateizugriffs: Startadresse einer PRG-Datei ermitteln (bzw. die ersten beiden Bytes einer Datei - oder des 1. Datensatzes einer relativen Datei - als 16-Bit-Zahl anzeigen)

100 DO
110 INPUT "DATEI";D$
120 IF D$="$" THEN DIRECTORY: LOOP
130 IF D$="" THEN END
140 DOPEN#1,(D$)
150 GET#1,L$,H$
160 DCLOSE#1
170 PRINT DS$
180 IF DS <> 0 THEN LOOP
190 SA=ASC(L$+CHR$(0))+256*ASC(H$+CHR$(0))
200 PRINT "STARTADRESSE:";SA;HEX$(SA)
210 LOOP
RUN
DATEI? FILE
00, OK,00,00
STARTADRESSE: 7169 1C01
DATEI? XXX
62, FILE NOT FOUND,00,00
DATEI? ""

READY.

Der Testlauf geht davon aus, dass es ein Programm namens "FILE" existiert (der Typ ist dabei egal). Bei der Angabe von "$" bei der Dateinamensabfrage, wird das Inhaltsverzeichnis angezeigt. Mit der Eingabe von "" (wird von INPUT als leere Zeichenkette aufgefasst) endet das Programm.