DOPEN

Aus C64-Wiki
Wechseln zu: Navigation, Suche
DOPEN
Format: DOPEN #<logische Dateinummer>, <Dateiname> [,D<Laufwerk>] [,U<Geräteadresse>][,R|W|L<Länge>]
Parameter
<logische Dateinummer>: numerischer Ausdruck im Wertebereich von 1 bis 255
<Dateiname>: Zeichenkettenausdruck mit max. 16 Zeichen
<Laufwerk>: numerischer Ausdruck mit Wert 0 oder 1
<Geräteadresse>: numerischer Ausdruck im Wertebereich von 4 bis 30
<Länge>: numerischer Ausdruck im Wertebereich von 1 bis 254
Einordnung
Typ: Anweisung
Kontext: Diskettenbefehl
Aufgabe: Einen Datenkanal zum Lesen/Schreiben einer Diskettendatei öffnen
Abkürzung: dO
Verwandte Befehle
APPEND, DCLOSE, OPEN, RECORD

Anmerkung: Dieser Artikel beschreibt den BASIC-Befehl DOPEN ab Commodore BASIC V7.0 oder höher.


Der Befehl DOPEN dient zum Öffnen einer sequenziellen Datei (auch vom Dateityp PRG oder USR) für Lesen oder Schreiben oder zum Öffnen einer Relativdatei mit wahlfreiem Zugriff. Der Befehl wendet sich an den Umgang mit Diskettenlaufwerken, prinzipiell können aber alle Geräte am IEC-Bus angesprochen werden.

Die Parameter haben folgende Bedeutung:

  • <logische Dateinummer>: Die Dateinummer, die den Datenkanal identifiziert und für nachfolgende Ein-/Ausgabebefehle benötigt wird. Die Dateinummer muss im Wertebereich von 1 bis 255 liegen, sonst wird die Fehlermeldung ?ILLEGAL QUANTITY ERROR ausgegeben.
  • <Dateiname>: Ein Zeichenkettenausdruck mit dem Dateinamen, der auch Jokerzeichen enthalten darf, bei dem der erste passende Name im Inhaltsverzeichnis verwendet wird. Ist der Ausdruck länger als 16 Zeichen wird ein ?STRING TO LONG ERROR ausgegeben, ein leere Zeichenkette führt dagegen zu einem ?MISSING FILENAME ERROR.
    Weitere Fehlerzustände sind mit Hilfe des Fehlerkanals abfragbar (Systemvariablen DS und DS$), der z.B. eine nicht vorhandene Datei mit "62,FILE NOT FOUND,00,00" anzeigt.
  • <Laufwerk>: Laufwerksnummer, wird bei einem Doppellaufwerk benötigt und kann die Werte 0 oder 1 annehmen, ansonsten wird ein ?ILLEGAL QUANTITY ERROR ausgegeben. Standardwert ist 0.
  • <Geräteadresse>: Gerätenummer des Diskettenlaufwerks, standardmäßig 8. Sie darf im Wertebereich von 4 bis 30 liegen, Werte außerhalb dieses Bereichs führen zu einem ?ILLEGAL DEVICE NUMBER ERROR, außer bei Werten kleiner 0 oder größer 255, die ein ?ILLEGAL QUANTITY ERROR auslösen. Ist das Gerät mit der angegebenen Nummer nicht verfügbar, wird ?DEVICE NOT PRESENT ERROR ausgegeben.
  • Ein/Ausgabemodus bzw. Dateityp:
    • R (Read): Sequentielle Datei (auch vom Typ PRG oder USR) zum Lesen öffnen.
    • W (Write): Sequentielle Datei zum Schreiben öffnen, sofern der Dateiname keinen anderen Dateityp vorgibt (wie ",U" für USR-Dateien und ",P" für PRG-Dateien).
    • L<Länge>: Relativdatei öffnen, wobei Länge die logische Datensatzlänge angibt. Erlaubt sind für Länge die Werte von 1 bis 254, ansonsten wird ?ILLEGAL QUANTITY ERROR ausgegeben.
Ohne Angabe dieses Parameters wird die Datei zum Lesen geöffnet. Bei Mehrfachangaben dominiert der Parameter W, sollte auch R angegeben sein. Die L-Angabe zusammen mit W führt zur Fehlermeldung ?SYNTAX ERROR, R hat allerdings keinen Einfluss.
Um an eine sequentielle Datei weitere Daten anzuhängen, bietet sich der Befehl APPEND an, wobei grundsätzlich auch OPEN mit Append-Dateiattribut verwendbar ist.

Ob das Öffnen der Datei erfolgreich war, kann über die Systemvariablen DS und DS$ überprüft werden.

Besonderheiten bei Diskbefehlen[Bearbeiten]

  • 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 (Position bzw. Adresse)
    • 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]

DOPEN #1,"DATEI"

Öffnet die sequentielle Datei DATEI auf der Floppy mit Geräteadresse 8 mit Kanalnummer 1 zum Lesen.

DOPEN #2,(F$),U9,W

Öffnet die in der Variablen F$ angegebene sequentielle Datei auf der Floppy mit Geräteadresse 9 mit Kanalnummer 2 zum Schreiben.

DOPEN #3,"ADRESSEN",L100

Öffnet die relative Datei ADRESSEN mit einer Datensatzlänge von 100 Zeichen. Stimmt die angegebene Datensatzlänge nicht mit jener der Datei überein, gibt das Laufwerk die Fehlermeldung 50, RECORD NOT PRESENT zurück.

DOPEN #4,"RTS,P",W
PRINT#4 CHR$(DEC("02"))CHR$(DEC("C0"))CHR$(DEC("60"));
DCLOSE #4

Erstellt eine Programmdatei vom Typ PRG, dessen Ladeadresse auf hex. $C002 festgelegt ist. Das Maschinenspracheprogramm besteht nur einem Rücksprungbefehl RTS. Ein Laden und Starten wäre dann mit

BOOT "RTS",B0

wobei in die Bank 0 geladen und dann der Miniprogrammcode ausgeführt wird.