OPEN

Aus C64-Wiki
Wechseln zu: Navigation, Suche
OPEN
Format: OPEN <logische Dateinummer> [,<Gerätenummer>] [,<Sekundäradresse>] [,<Dateiparameter>]
Parameter
<logische Dateinummer>: numerischer Ausdruck im Wertebereich von 0 bis 255
<Gerätenummer>: numerischer Ausdruck im Wertebereich von 0 bis 255
<Sekundäradresse>: numerischer Ausdruck im Wertebereich von 0 bis 255
<Dateiparameter>: Zeichenkettenausdruck für einen Dateinamen, ev. mit ergänzten Attributen, z.B. bei Diskettenlaufwerken mit Aufbau <Dateiname>[,<Typ>][,<Modus>]
Einordnung
Typ: Anweisung
Kontext: Ein/Ausgabe
Aufgabe: Einen Datenkanal öffnen
Abkürzung: oP
Verwandte Befehle
CLOSE, LOAD, SAVE

Anmerkung: Dieser Artikel beschreibt den BASIC-Befehl OPEN unter BASIC V2 des Commodore 64.


Der BASIC-Befehl OPEN öffnet in Programmen oder im Eingabemodus einen Kanal zu einem Peripheriegerät bzw. zu einem externen Gerät wie Drucker, Datassetten- oder Diskettenlaufwerk für Ein- und Ausgabevorgänge (Lese- bzw. Speichervorgänge). Dieser Kanal kann dann in weiterer Folge einfach mit der logischen Dateinummer angesprochen werden.

Die Zeichenkette des 4. Parameters gibt im Falle eines Massenspeichers das jeweilige Dateielement wieder. Speziell bei Diskettenzugriffen kann die Zeichenkette gemäß dem dort verwendeten CBM-Dateisystem noch weitere gängige Attribute entsprechend folgender Syntax enthalten:

<Dateiname>[,<Typ>][,<Modus>]
  • <Typ> gibt den Dateityp an: PRG, SEQ, USR oder auch abgekürzt P, S, U (es ist immer nur das erste Zeichen wesentlich) und ergänzend L als Sonderfall für relative Dateien (wobei implizit immer der Write-Modus gilt und das Zeichen an Position <Modus> als Datensatzlänge aufgefasst wird):
  • <Modus> gibt die Art des Zugriffs an:
    • R für Read also lesend,
    • W für Write also schreibend,
    • A für Append also ans Ende anhängend (die Datei muss bereits existieren),
    • M für Modify erlaubt das Öffnen einer zuvor nicht geschlossener Datei.

Es sind noch weitere Ausprägungen möglich, abhängig vom jeweiligen Gerät oder vom Dateityp, wie etwa die Datensatzgrößenangabe bei Relativdateien, siehe Beispiele.

Damit die BASIC-Befehle CLOSE, CMD, GET#, INPUT# und PRINT# die richtige Datei im richtigen Gerät ansprechen, benötigen diese die logische Dateinummer, die im Zahlenbereich 1 bis 255 liegen darf. Werte größer 127 bewirken bei Ausgabegeräten, dass bei einem Zeilenwechsel zusätzlich zu einem CR [Carriage return, entspricht CHR$(13)] zusätzlich ein LF [Linefeed, entspricht CHR$(10)] ausgegeben wird (sogenannte Autofeed-Funktion, bei manchen Druckern notwendig).

Da beim C64 jedes Gerät eine feste Gerätenummer besitzt, wird hiermit im BASIC-Befehl OPEN das gewünschte Gerät angesprochen. Fehlt die Angabe der Gerätenummer, so geht der Interpreter davon aus, dass Gerätenummer 1 genutzt werden soll, also die Datassette. Gerätenummern größer 4 werden hingegen als Geräte am IEC-Bus angesehen und es obliegt dem jeweiligen Gerät, wie es mit der Sekundäradresse umgeht.
Sekundäradressen können von 0 bis 15 vergeben werden, ihre Bedeutung ist abhängig vom angesprochenen Gerät. Bei Diskettenlaufwerken haben die Sekundäradressen 0, 1 und 15 folgende spezielle Bedeutungen:

  • Sekundäradresse 0 öffnet eine Datei zum Lesen, der Zugriffsmodus im Dateinamen (",R" oder ",W") wird dann ignoriert. Als Dateityp wird PRG erwartet, dies kann man durch eine explizite Angabe (",S" oder ",U") zu SEQ oder USR ändern.
  • Sekundäradresse 1 öffnet eine Datei zum Schreiben, der Zugriffsmodus im Dateinamen (",R" oder ",W") wird dann ignoriert. Als Dateityp wird PRG benutzt, dies kann man durch eine explizite Angabe (",S" oder ",U") ändern.
  • Sekundäradresse 15 öffnet einen Kommando- bzw. Statuskanal zum Gerät.

Mit den übrigen Sekundäradressen 2 bis 14 kann jeder Dateityp gelesen werden. Beim Anlegen einer neuen Datei wird SEQ benutzt, dies kann man durch eine explizite Angabe ("P" oder "U") zu PRG oder USR ändern.

Wenn weder die Sekundäradresse den Zugriffsmodus festlegt, noch der Zugriffsmodus im Dateinamen gegeben ist, ergibt sich daraus automatisch der Lesemodus. Eine fehlende Sekundäradresse entspricht einer 0, was wiederum dem Lesezugriff entspricht.

Für jede zu öffnende Datei auf dem gleichen Laufwerk (siehe Beispiele) müssen verschiedene Sekundäradressen benutzt werden, wenn beispielsweise gleichzeitige Dateizugriffe in verschachtelten OPEN-Strukturen erfolgen.
Bedeutung der Sekundäradresse bei üblichen Gerätenummern:

Gerätenummer Gerät Sekundäradresse
0 Tastatur
(nicht das 1. Gerät!)
 
1 Datassette 0 = Lesevorgang; 1 = Schreibvorgang; 2 = Schreibvorgang mit Tape-Ende (EOT - End-Of-Tape) schreiben
2 Modem / RS-232 0
3 Bildschirm 0 oder 1
4 oder 5 Drucker 0 = Großschrift/Grafikzeichen; 7 = Groß-/Kleinschrift
8 bis 11 Diskettenlaufwerk 0…14 = Datenkanäle (0 = Read/Lesevorgang; 1 = Write/Schreibvorgang); 15 = Befehls-/Fehlerkanal


Folgende BASIC-Fehlermeldungen können bei den Arbeiten mit Dateien auftreten, wobei beim Umgang mit der Datassette nur die ersten vier Fehlermeldungen erscheinen:

  • ?TOO MANY FILES ERROR, es sind bereits 10 Dateien geöffnet.
  • ?FILE NOT OPEN ERROR, es wird versucht, mit den BASIC-Befehlen CLOSE, CMD, GET#, INPUT# und PRINT# auf eine ungeöffnete Datei zuzugreifen.
  • ?FILE OPEN ERROR, es wird versucht, eine logische Dateinummer nochmals mit OPEN zu öffnen (ohne vorheriges CLOSE).
  • ?DEVICE NOT PRESENT ERROR, wenn entweder das entsprechende Gerät nicht existiert oder es ausgeschaltet ist oder das Kassettenende auf der Datassette wurde nicht erkannt.

Eine Reihe von Diskettenlaufwerks-Fehlermeldungen werden über den Fehlerkanal der Floppy gemeldet, der dazu entsprechend abgefragt werden muss (wird nicht direkt als BASIC-Fehlermeldung angezeigt). Häufig vorkommend sind dabei:

  • 62,FILE NOT FOUND,00,00, es wird versucht, auf eine Datei (lesend) zuzugreifen, die nicht existiert.
  • 63,FILE EXISTS,00,00, es wird versucht, eine Datei mit einem Dateinamen anzulegen, der schon existiert (auch wenn dieser einen anderen als den angeforderten Dateityp hat).


Beispiele[Bearbeiten]

Parameterübergabe[Bearbeiten]

OPEN FN,GN,SA,DN$

Parameterübergabe mittels Variablen

OPEN 1,8,2,N$+",L,"+CHR$(50)

Dateiparameter als Zeichenkettenausdruck: Öffnet auf einem Diskettenlaufwerk eine Relativdatei mit Datensatzgröße von 50 Bytes.

OPEN 1,2,0,CHR$(6)+CHR$(1)

Zusammengesetzter Dateiparameter ohne Dateinamen: Beispiel einer RS232-Verbindung mit 300 Baud, 8 Daten-Bits, 1 Stop-Bit, X-Draht, Fullduplex, z.B. zu einem Akustikkoppler.

Datassette[Bearbeiten]

OPEN 1, 1, 0, "DATEINAME"

Datei von Datassette lesen.

OPEN 1, 1, 1, "DATEINAME"

Datei auf Datassette schreiben.

OPEN 1, 1, 2, "KASSETTENENDE"

Datei mit Kassettenendekennzeichen (EOT - End-Of-Tape-Markierung) auf Datassette schreiben.

Bildschirm, Tastatur, RS-232[Bearbeiten]

OPEN 50, 0

Tastatureingabe über logische Dateinummer einleiten.

OPEN 1, 2, 0, CHR$(10)

RS-232 bzw. ein an diese Schnittstelle angeschlossenes Modem ansprechen.

OPEN 11, 3

Via logische Dateinummer auf den Bildschirm ausgeben.

Drucker[Bearbeiten]

OPEN 5, 4, "STEUERZEICHEN"

Steuerzeichen wie z.B. Zeilenvorschub zum Drucker schicken.

OPEN 4, 4, 0, "GROSSSCHRIFT"

Schrift in Großbuchstaben und Grafikzeichen auf den Drucker geben.

OPEN 3, 4, 7, "Klein-/Großschrift"

Schrift in Groß- und Kleinschrift auf den Drucker geben.

OPEN 130, 4
PRINT#130, "ERSTE ZEILE"
PRINT#130, "ZWEITE ZEILE"
CLOSE 130

Gibt zwei Zeilen auf Druckern aus, die neben einem Wagenrücklauf (CR, Carriage return) auch noch einen Zeilenvorschub (LF, Linefeed) benötigen (die sonst übereinander gedruckt in einer Zeile erscheinen würden).

Floppy[Bearbeiten]

OPEN 1, 8, 8, "DATEINAME,SEQ"
OPEN 1, 8, 8, "DATEINAME,SEQ,READ"

Diskettenlaufwerk #1 ansprechen und sequentielle Datei zum Lesen öffnen.

OPEN 2, 9, 4, "DATEINAME,SEQ,W"

Diskettenlaufwerk #2 ansprechen und sequentielle Datei zum Schreiben öffnen.

OPEN 1, 8, 8, "DATEINAME,R"

Diskettenlaufwerk #1 ansprechen und Datei zum Lesen öffnen.

OPEN 1, 8, 2, "DATEINAME,L,"+CHR$(45)

Eine Relativdatei mit Datensatzgröße 45 wird - sofern nicht vorhanden - auf Diskettenlaufwerk #1 angelegen. Für ein Lesen oder Schreiben auf eine bestehende relative Datei würde sonst der DATEINAME alleine reichen.

Floppy-Fehlerkanal[Bearbeiten]

OPEN 1, 8, 15, "N:DISKNAME,ID"

Befehl zum Formatieren einer Diskette mit Namen DISKNAME und Kennung ID an das Diskettenlaufwerk schicken.
Weitere Möglichkeiten zur Steuerung von Diskettenlaufwerken: siehe Floppy-Befehle.

OPEN 1, 8, 15, "&DATEI"

nur 1541/70/71/81: DATEI ins Floppy-RAM laden und dort ausführen.

Parallel geöffnete Dateien auf demselben Gerät[Bearbeiten]

OPEN 1, 8, 9, "TEST,R"
OPEN 2, 8, 10, "TEST2,PRG,W" 
GET#1,A$
PRINT#2,A$;
CLOSE 2: CLOSE 1

Kopiert das erste Zeichen aus Datei TEST (sofern es ungleich CHR$(0) ist) und schreibt es in die neu angelegte PRG-Datei TEST2.