CONCAT

Aus C64-Wiki
Wechseln zu: Navigation, Suche
CONCAT
Format: CONCAT [D<Laufwerk1>,]<Quelldateien> TO [D<Laufwerk2>,]<Zieldatei> [,U<Geräteadresse>]
Parameter
<Laufwerk1> : Quelllaufwerk (0 oder 1)
<Quelldateien>: Zeichenkettenausdruck
<Laufwerk2> : Ziellaufwerk (0 oder 1)
<Zieldatei>: Zeichenkettenausdruck
<Geräteadresse>: Gerätenummer des Diskettenlaufwerks, Ausdruck im Wertebereich von 4 bis 30
Einordnung
Typ: Anweisung
Kontext: Diskettenbefehl
Aufgabe: Dateien an eine bestehende Datei anhängen
Abkürzung: coN
Verwandte Befehle
COPY

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


Der Befehl CONCAT hängt eine oder mehrere Dateien via Parameter Quelldateien vom angegebenen Laufwerk1 auf Gerät mit Geräteadresse an die Zieldatei des gleichen oder ein anderen Laufwerks Laufwerk2 (im Falle eines Doppellaufwerks).
Die Zieldatei darf nur vom Dateityp SEQ oder USR sein, aber als Quelldateien werden zusätzlich zum Dateityp SEQ und USR auch PRG-Dateien akzeptiert. Sind relative Dateien (Typ REL) involviert, liefert das Laufwerk den Fehler "62, FILE TYPE MISMATCH,00,00" oder kann als Zieldatei sogar zu undefiniertem Verhalten des Laufwerks führen (z.B. hängen bleiben).

CONCAT ist im Grunde eine Spezialform des folgenden COPY-Befehls:

COPY D<Laufwerk>,"<Zieldatei>,<Quelldateien>" TO "<Zieldatei>" ON U<Geräteadresse>

wobei die Zieldatei sowohl bei der Quelle als auch beim Ziel aufscheint.

Existiert die Zieldatei nicht, liefert der Fehlerkanal "62, FILE NOT FOUND,00,00".
Enthalten die Dateinamen Jokerzeichen meldet das Laufwerk "30, SYNTAX ERROR,00,00".
Bei mehreren Quelldateinamen ist das Limit von 16 Zeichen im Vergleich zum Kommandokanal der Floppy, wo 34 Zeichen möglich sind, recht unpraktikabel. Vorübergehend kann hier unter Zuhilfenahme von RENAME mit kürzeren Namen operiert werden, damit das 16-Zeichenlimit eingehalten werden kann. Zu lange Dateinamensangaben führen sonst zur Fehlermeldung ?STRING TOO LONG ERROR.

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

  • Geräteadresse (Gerät 8, falls nicht vorhanden) sind von 4 bis 30,
  • Laufwerk sind 0 oder 1.

Wurde mit dem CONCAT-Befehl ein Diskettenlaufwerk angesprochen, zu dem die Geräteadresse falsch eingestellt ist oder nicht existiert, erscheint die Fehlermeldung ?DEVICE NOT PRESENT ERROR.
Sind die Parameter außerhalb des zulässigen Wertebereichs, so erscheint die Fehlermeldung ?ILLEGAL QUANTITY ERROR. Ist eine der Dateinamensangaben eine leere Zeichenkette, wird dies mit dem BASIC-Fehler ?MISSING FILE NAME ERROR geahndet.

Funktionsweise[Bearbeiten]

Diese Anweisung sendet den DOS-Befehl Copy/Combine/Concat in der speziellen Concat-Variante an das angegebene Laufwerk. Diese führt dann selbstständig den entsprechenden Vorgang aus. Im Falle eines unerwarteten Abbruchs (Laufwerks-LED blinkt), kann der konkrete Grund des Scheiterns über die Systemvariablen DS bzw. DS$ abgefragt werden.
Geräte, die keine Doppellaufwerke sind, können mit den Mehrlaufwerksvarianten des Befehls nicht umgehen und im Fehlerkanal wird dies mit der Meldung "31,SYNTAX ERROR,00,00" signalisiert.


BASIC 2.0 Entsprechung

Allgemeine Syntax:

CONCAT D<Laufwerk1>,"Quelldatei1,Quelldatei2,...]" TO D<Laufwerk2>, "Zieldatei" ON U<Gerät>

Entsprechung in BASIC V2-Syntax:

OPEN 15,<Gerät>,15,"C<Laufwerk2>:Zieldatei=<Laufwerk2>:Zieldatei,<Laufwerk1>:Quelldatei1,<Laufwerk1>:Quelldatei2,...]":CLOSE 15

Siehe Kompatibilitätsbeispiel.

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]

CONCAT (F1$) TO (F2$), D(DR) ON U(DE)

hängt auf Laufwerk DR und Gerät DE den Inhalt der Datei laut Stringvariable F1$ der Datei namens F2$ an.

CONCAT "DAT" TO "DAT"
CONCAT "DAT,DAT,DAT" TO "DAT"

Diese Varianten vervielfachen den Inhalt einer Datei, allerdings sind diese Varianten nicht allgemein verwendbar, denn sobald das Ergebnis die Dateigröße von genau einem Block überschreitet, schaukelt sich die Anhängevorgang immer weiter auf, bis die Diskette voll ist und das Laufwerk meldet dann "72, DISK FULL,00,00". Die Datei "DAT" kann aber problemlos mit SCRATCH gelöscht werden, wo alle belegten Blöcke freigegeben werden (auch wenn das Directory dies nicht bei der Datei anzeigt).


Kompatibilität


CONCAT D0, "ANHANG" TO "DATEI" ON U8

oder das Gleiche mit BASIC V2:

OPEN 15,8,15,"C0:DATEI=0:DATEI,0:ANHANG":CLOSE 15

oder mit BASIC 3.5:

COPY D0, "DATEI,ANHANG" TO "DATEI" ON U8