OPEN

Aus C64-Wiki
Zur Navigation springenZur Suche springen
OPEN
Syntax: 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, evtl. mit ergänzten Attributen (z.B. bei Diskettenlaufwerken, Aufbau: <Dateiname>[,<Typ>][,<Modus>])
Einordnung
Typ: Anweisung
Kontext: Ein/Ausgabe
Aufgabe: Einen Datenkanal öffnen
Abkürzung: oP
Token: $9f (159)
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- oder Ausgabevorgänge (Lese- bzw. Speichervorgänge). Dieser Kanal kann dann in weiterer Folge einfach mit einer logischen Dateinummer angesprochen werden.

Logische Dateinummer[Bearbeiten | Quelltext bearbeiten]

Damit die BASIC-Befehle CLOSE, CMD, GET#, INPUT# und PRINT# die richtige Datei im richtigen Gerät ansprechen, benötigen diese eine Identifikationsnummer, die logische Dateinummer, die im Zahlenbereich 1 bis 255 liegen darf.

Besonderheit: Werte größer 127 bewirken bei manchen Druckern, dass bei einem Zeilenwechsel zusätzlich zu einem CR (Carriage return, entspricht CHR$(13)) ein LF (Linefeed, entspricht CHR$(10)) ausgegeben wird (sogenannte Autofeed-Funktion).

Gerätenummer[Bearbeiten | Quelltext bearbeiten]

Da beim C64 jedes Gerät eine feste Gerätenummer besitzt, wird hiermit das gewünschte Gerät angesprochen. Fehlt die Angabe der Gerätenummer, geht der Interpreter davon aus, dass Gerätenummer 1 verwendet werden soll (die Datassette). Gerätenummern größer als 3 werden als Geräte am IEC-Bus angesehen (Diskettenlaufwerke, Drucker, Festplatten usw.)

Sekundäradresse[Bearbeiten | Quelltext bearbeiten]

Sekundäradressen können bei OPEN 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", siehe unten) wird dann ignoriert. Der voreingestellte Dateityp lautet PRG. Dies kann man durch eine explizite Angabe (z.B. durch ",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. Ohne weitere Angabe wird als Dateityp PRG benutzt, dies kann man durch ein explizites ",S" oder ",U" (oder ähnlich) ä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 ist SEQ vorgegeben, dies kann man durch eine explizite Angabe (wie "P" oder "U" zu PRG oder USR) ändern.

Wenn weder die Sekundäradresse den Zugriffsmodus festlegt, noch der Zugriffsmodus im Dateinamen angegeben ist, ergibt sich automatisch der Lesemodus. Bei einer fehlenden Sekundäradresse wird intern automatisch 0 eingesetzt, was wiederum dem Lesezugriff entspricht.

Für jede gleichzeitig zu öffnende Datei auf dem gleichen Laufwerk muss eine neue Sekundäradresse benutzt werden, beispielsweise wenn gleichzeitige Dateizugriffe in verschachtelten OPEN-Strukturen erfolgen, siehe Beispiele.

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

Dateiparameter[Bearbeiten | Quelltext bearbeiten]

Die Zeichenkette des Dateiparameters gibt im Falle eines Massenspeichers den Namen einer jeweiligen Datei an. Speziell bei Diskettenzugriffen kann die Zeichenkette dem dort verwendeten CBM-Dateisystem gemäß noch weitere Attribute entsprechend folgender Syntax enthalten: "<Dateiname>[,<Typ>][,<Modus>]"

Dabei gilt:

  • <Typ> gibt den Dateityp an: PRG, SEQ, USR oder REL, auch abgekürzt P, S, U oder L.
  • <Modus> gibt die Art des Zugriffs an:
    • R für Read (lesend),
    • W für Write (schreibend),
    • A für Append (ans Ende anhängend, wobei die genannte Datei bereits existieren muss),
    • M für Modify (erlaubt das Öffnen einer zuvor nicht geschlossenen Datei).

Bei Dateityp L (Relativdatei) gilt implizit immer der Write-Modus. Anstelle des <Modus> steht dort ein Bytewert für die Datensatzlänge, etwa: OPEN 1,8,2,"name,l,"+CHR$(n), siehe Beispiele.

Fehlermeldungen[Bearbeiten | Quelltext bearbeiten]

Folgende BASIC-Fehlermeldungen können bei den Arbeiten mit OPEN 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 | Quelltext bearbeiten]

Parameterübergabe[Bearbeiten | Quelltext 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 | Quelltext 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 | Quelltext 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 logischer Dateinummer auf den Bildschirm ausgeben.

Drucker[Bearbeiten | Quelltext bearbeiten]

OPEN 5, 4, "STEUERZEICHEN"
Steuerzeichen wie z.B. Zeilenvorschub zum Drucker schicken.
OPEN 4, 4, 0, "GROSS-SCHRIFT" 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 | Quelltext bearbeiten]

OPEN 1, 8, 8, "DATEINAME,SEQ"
OPEN 1, 8, 8, "DATEINAME,SEQ,READ"
Diskettenlaufwerk 8 als #1 ansprechen und sequentielle Datei zum Lesen öffnen.
Das Öffnen einer Datei zum Lesen an einer bestimmten Position ist leider beim CBM-Dateisystem bei sequentiellen Dateien nur über den Umweg des Überlesens der nicht benötigten Daten möglich.
OPEN 2, 9, 4, "DATEINAME,SEQ,W" Diskettenlaufwerk 9 als #2 ansprechen und sequentielle Datei zum Schreiben öffnen.
OPEN 2, 9, 4, "DATEINAME,SEQ,A" Diskettenlaufwerk 9 als #2 ansprechen und existierende sequentielle Datei zum Schreiben/Anhängen öffnen. CBM-DOS überliest dabei zuerst intern die existierenden Daten, was etwas dauern kann.
OPEN 1, 8, 8, "DATEINAME,R" Diskettenlaufwerk 8 als #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 8 als #1 angelegt. Für ein Lesen oder Schreiben auf eine bestehende relative Datei würde der DATEINAME alleine reichen.
OPEN 1,8,1:CLOSE1:IFSTTHENPRINT"KEIN GERAET 8 ANGESCHLOSSEN" Erkennt, ob ein Gerät unter Gerätenummer 8 angeschlossen und angeschaltet ist.

Floppy-Fehlerkanal[Bearbeiten | Quelltext 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 | Quelltext 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.