Floppy-Befehle

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Um mit einem Diskettenlaufwerk (englisch Floppy Disk Drive) wie etwa der 1541 am C64 zu arbeiten, werden spezielle Floppy-Befehle (Disketten-Befehle) benutzt. Dabei kann es sich um spezielle BASIC-Befehle handeln (LOAD, SAVE und so weiter) oder um Befehle, die über den Befehlskanal gesendet werden.

Auch viele weitere Geräte wie Festplatten, CD-ROMs oder das SD2IEC können über Floppy-Befehle angesteuert werden. Oftmals unterstützen diese Geräte weitere oder angepasste Befehle.

Dieser Artikel bezieht sich in erster Linie auf den Umgang mit den klassischen CBM-DOS Floppy-Befehlen unter Zuhilfenahme von BASIC V2 und der Dateinutzung auf Disketten.

Der Befehlskanal[Bearbeiten | Quelltext bearbeiten]

Auf dem Befehlskanal oder Kommandokanal (Sekundäradresse 15) gesendete Daten werden durch die Floppy als Befehle interpretiert. Der Befehlskanal wird in BASIC V2 mit OPEN geöffnet und mit CLOSE geschlossen. Der eigentliche Floppy-Befehl steht dann entweder in der Zeichenkette des OPEN-Befehls oder in einem separaten PRINT#-Befehl.

Es ist zu beachten, dass das Schließen des Befehlskanals per CLOSE auch alle anderen ggf. gerade geöffneten Kanäle schließt.

Das Ergebnis eines Befehls kann im Anschluss durch einen Lesevorgang am (bereits geöffneten) Befehlskanal (in dieser Verwendung auch Fehlerkanal genannt) abgefragt werden. Dadurch wird dann auch ein eventuell aufgetretener Fehlerstatus (angezeigt durch die blinkende LED am Diskettenlaufwerk) zurückgesetzt.

Übliche Floppy-Befehle[Bearbeiten | Quelltext bearbeiten]

Typische BASIC-Befehle für den Umgang mit Disketten und Dateien sind CLOSE, GET#, INPUT#, CMD, LOAD, OPEN, PRINT#, SAVE und VERIFY sowie die Statusvariable ST.

Im Folgenden wird auf die Befehle eingegangen, die das CBM-DOS der Floppy versteht und die über den Befehlskanal an die Floppy geschickt werden können. Diese Befehle werden nach dem Absenden durch den Computer von der Floppy selbsttätig ausgeführt.


New[Bearbeiten | Quelltext bearbeiten]

Diskette formatieren (NEW): N:Diskettenname,ID oder N:Diskettenname
wobei der Diskettenname maximal 16 Zeichen lang sein kann und die Disk-ID 2 Zeichen lang ist.

  1. Normales, vollständiges Formatieren einer Diskette:
    • Jeglicher Inhalt einer vorigen Formatierung geht verloren.
    • Beispiel unter BASIC V2: OPEN 1,8,15,"N:MEINEDISK,MD": CLOSE 1
  2. Schnellformatieren einer Diskette:
    • Es muss zuvor die Diskette einmal normal formatiert worden sein.
    • Die Disk-ID wird beim Befehl weggelassen und jene, die sich bereits auf der Diskette befindet, bleibt bestehen.
    • Es werden nur die Verwaltungsinformationen "gelöscht" (Directory, BAM), die Datenblock-Inhalte bleiben erhalten.
    • Beispiel unter BASIC V2: OPEN 1,8,15,"N:SCHNELL": CLOSE 1

Scratch[Bearbeiten | Quelltext bearbeiten]

Dateien löschen (SCRATCH): S:Dateiname1,Dateiname2,...
wobei auch Jokerzeichen (Platzhalter) wie * (dieses steht für eine beliebige Anzahl von Zeichen, im Sinne von "beliebige Zeichen bis zum Namensende") oder ? (für genau ein Zeichen) genutzt werden dürfen. "Dateiname2" und folgende sind optional.

  • Beispiel unter BASIC V2: OPEN 1,8,15,"S:SPIELE*": CLOSE 1

Achtung:

  • Der Joker bedeutet in diesem Fall nicht "die erste passende Datei", sondern "alle passenden Dateien"!
  • Mit S:* werden also alle Dateien auf der Diskette gelöscht.

Rename[Bearbeiten | Quelltext bearbeiten]

Datei umbenennen (RENAME): R:NeuerName=AlterName

  • Beispiel unter BASIC V2: OPEN 1,8,15,"R:SPIEL2016=SPIEL2000": CLOSE 1

Copy/Combine/Concat[Bearbeiten | Quelltext bearbeiten]

  • Datei kopieren (COPY): C:NeuerName=AlteDatei oder CLaufwerk1=Laufwerk2 oder CLaufwerk1=Laufwerk2:Datei
    1. "AlteDatei" wird in die Datei "NeuerName" kopiert.
      • Beispiel unter BASIC V2: OPEN 1,8,15,"C:SICHERUNG=DATEN": CLOSE 1
    2. Nur bei einem Doppellaufwerk: Alle Dateien von "Laufwerk2" auf "Laufwerk1" kopieren.
      • Einzellaufwerk reagieren hingegen mit Fehlerstatus 31,SYNTAX ERROR,00,00 im Fehlerkanal.
      • Beispiel unter BASIC V2: OPEN 1,8,15,"C1=0": CLOSE 1
    3. Nur bei einem Doppellaufwerk: Datei (ev. mehrere mit Joker selektiert) von "Laufwerk2" auf "Laufwerk1" kopieren.
      • Einzellaufwerk reagieren hingegen mit Fehlerstatus 30,SYNTAX ERROR,00,00 im Fehlerkanal.
      • Beispiel unter BASIC V2: OPEN 1,8,15,"C1=0:DATEN*": CLOSE 1
Die Befehlszeichenkette darf maximal 40 Zeichen lang sein!
  • Dateien zusammenfügen (COMBINE): C:NeuerName=AlteDatei1,AlteDatei2,...
    "AlteDatei2" (und etwaige weitere Dateien gemäß den folgenden AlteDatei-Angaben) wird an "AlteDatei1" angehängt und gemeinsam in die Datei "NeuerName" geschrieben. Die Datei "NeuerName" darf noch nicht existieren. Die Dateien der AlteDatei-Angaben können unterschiedlichen Typs sein, wobei die neue Datei "NeuerName" den Typ von "AlteDatei1" erbt.
    Die Befehlszeichenkette darf allerdings nur maximal 40 Zeichen lang sein. Notfalls muss man die Dateien vorher auf kürzere Namen umbenennen (siehe Rename)!
    Achtung: BASIC-Programme lassen sich so nicht zusammenfügen und ergeben kein verwendbares Gesamtprogramm. Eignet sich nur für das Anfügen von Daten aus unstrukturierten Dateien, typischerweise des Typs SEQ oder USR (die keine Programmstartadresse am Anfang enthalten) an eine PRG/SEQ/USR-Datei. Das Zusammenfügen von Nicht-REL-Dateien mit REL-Dateien funktioniert allerdings selbst bei CBM-DOS V3.0 nicht zuverlässig. Speziell, wenn das Ergebnis ein Nicht-REL-Typ ist, neigt das Laufwerk beim Vorgang abzustürzen.
    • Beispiel unter BASIC V2: OPEN 1,8,15,"C:ALLEDATEN=DATEN2000,DATEN2016": CLOSE 1
  • Dateien anhängen (CONCAT): C:AlteDatei=0:AlteDatei,AnhangDatei1,AnhangDatei2,...
    Diese Form erlaubt einer bestehenden Datei "AlteDatei" (die Drive-Angabe "0:" auf rechten Seite vom "=" ist zwingend notwendig) weitere Dateien ("AnhangDatei1",...) anzuhängen. Wenn "AlteDatei" vom Typ PRG ist, dann meldet CBM-DOS den Fehler "64, FILE TYPE MISMATCH,00,00".
    • Beispiel unter BASIC V2: OPEN 1,8,15,"C:ALLEDATEN=0:ALLEDATEN,DATEN2017": CLOSE 1

Validate[Bearbeiten | Quelltext bearbeiten]

Diskette validieren (VALIDATE): V

  • Diskette wird auf gültige Daten geprüft und ggf. korrigiert: BAM und Directory werden auf Konsistenz geprüft und mit den vorhandenen Dateien abgeglichen. Dabei wird zwar die Anzahl der freien Blöcke entsprechend angeglichen, aber nicht die Blockanzahl der jeweiligen Dateien.
    Vergleichbar mit CHKDSK bzw. SCANDISK unter Microsoft-Betriebssystemen (DOS bzw. Windows) oder fsck unter Unix/Linux. Die Laufzeit dieses Kommandos kann abhängig vom Füllgrad der Diskette verhältnismäßig lange dauern. Achtung: Validate kennt nur CBM-DOS-Dateien, kann z.B. mit VLIR- oder Transwarp-Dateien nicht umgehen und sollte auf entsprechenden Disketten nicht angewendet werden.
  • Beispiel unter BASIC V2: OPEN 1,8,15,"V": CLOSE 1

Initialize[Bearbeiten | Quelltext bearbeiten]

BAM neu einlesen (INITIALIZE): I

  • Setzt als Nebeneffekt einen evtl. gesetzten Fehlerzustand (rote LED blinkt) zurück, sofern eine Diskette eingelegt und lesbar ist.
  • Kann auch zur Erkennung, ob eine Diskette eingelegt ist, verwendet werden. Falls die BAM erfolgreich gelesen wurde, meldet der Fehlerkanal 00,OK,00,00, ansonsten 21,READ ERROR,18,00.
  • Beispiel unter BASIC V2: OPEN 1,8,15,"I": CLOSE 1

Reset[Bearbeiten | Quelltext bearbeiten]

Laufwerk zurücksetzen: UI

  • Das Floppy-Laufwerk wird dadurch wieder in einen Zustand gebracht, der jenem unmittelbar nach dem Einschalten gleicht. Der Fehlerkanal enthält danach die Meldung 73,CBM DOS V2.6 1541,00,00.
  • Für 1541/1570/1571: Der Befehl kann das Laufwerk auch in den 1540/VC20-Kompatibilitätsmodus schalten (UI-) bzw. von dort wieder in den 1541-Modus (UI+). Der 1541-Modus nutzt ein etwas langsameres Timing auf dem IEC-Bus, da beim C64 die CPU anders als beim VC20 durch Badlines angehalten wird und so das beim VC20 übliche Timing nicht schafft.
  • Beispiel unter BASIC V2: OPEN 1,8,15,"UI": CLOSE 1

Duplicate[Bearbeiten | Quelltext bearbeiten]

Diskette kopieren (DUPLICATE): DLaufwerk1=Laufwerk2

  • Nur bei einem Doppellaufwerk (wie z.B. CBM 8050). Einzellaufwerk reagieren hingegen mit Fehlerstatus 31,SYNTAX ERROR,00,00 im Fehlerkanal.
  • Formatiert die Diskette im Ziellaufwerk automatisch.
  • Kopiert die gesamte Diskette (blockweise) von "Laufwerk2" auf "Laufwerk1".
  • Beispiel unter BASIC V2: OPEN 1,8,15,"D1=0": CLOSE 1

Floppy-Befehle nutzen[Bearbeiten | Quelltext bearbeiten]

BASIC V2[Bearbeiten | Quelltext bearbeiten]

Anmerkung: Alle Befehle beziehen sich auf das Diskettenlaufwerk mit der Standard-Geräteadresse 8.


Das BASIC V2 besitzt keinen speziellen Befehl, um ein Kommando an die Floppy über den Kommandokanal zu senden. Stattdessen kann eine Kombination aus OPEN, PRINT# und CLOSE zum Absetzen dieser Befehle benutzt werden.

  • OPEN 1,8,15,"BEFEHL": CLOSE 1
  • Längere Form: OPEN 1,8,15: PRINT#1,"BEFEHL": CLOSE 1

Ein konkretes Beispiel: Das Formatieren einer Diskette: OPEN 1,8,15,"N:MEINEDISK,MD": CLOSE 1

Fehlerkanal auslesen
Zum Auslesen des Fehlerkanals auf Basis von INPUT# ist ein Miniprogramm nötig, da der Befehl INPUT# nur innerhalb eines Programms funktioniert. Eine Meldung aus dem Fehlerkanal bestehend aus den Komponenten

  • Fehlernummer (FF$),
  • Fehlerbezeichnung (FB$),
  • Spurnummer (SP$) und
  • Sektornummer (SE$)

wird im folgenden Beispiel aus dem Diskettenlaufwerk in Variablen eingelesen und ausgegeben. Für FF$, SP$ und SE$ können statt String-Variablen auch numerische Variablen verwendet werden.

10 OPEN 1,8,15
20 INPUT#1,FF$,FB$,SP$,SE$
30 PRINT FF$,FB$,SP$,SE$
40 CLOSE 1

Ein Fehler liegt vor, wenn die Fehlernummer (FF$) nicht "00" ist bzw. die Fehlerbezeichnung von "OK" abweicht.

Ausnahmen:

  • Direkt nach dem Einschalten des Laufwerks ist die Fehlernummer "73" und die Fehlerbezeichnung "CBM DOS V2.6 1541" (im Falle einer 1541).
  • Der Befehl SCRATCH ("S:") zum Dateilöschen erzeugt die Fehlernummer "01" und die Fehlerbezeichnung "FILES SCRATCHED", wobei die Spurnummer die Anzahl der erfolgreich gelöschten Dateien wiedergibt.
  • Die Positionierung bei relativen Dateien liefert bei einem noch nicht angelegten Datensatz die Fehlernummer "50" mit der Bezeichnung "RECORD NOT PRESENT", was aber rein informellen Charakter hat und kein Fehler im eigentlichen Sinne darstellt.

Vor dem Schließen des Fehlerkanals sollten alle zuvor geöffneten Floppy-Kanäle geschlossen sein, da das Schließen des Fehlerkanals auch alle anderen Kanäle schließt.

Fehlerkanal im Direktmodus auslesen
Folgende Zeile liest den Fehlerkanal auch im Direktmodus, muss also nicht als Programm abgelegt sein:

Variante 1:

OPEN 1,8,15:FOR I=0 TO 2:POKE 58,1:GET#1,A$:PRINT A$;:I=255 AND ST:NEXT:CLOSE 1

Variante 2:

OPEN 1,8,15:FOR I=1 TO 40:POKE 781,1:SYS 65478:SYS 65487:SYS 65490:SYS 65484:IF ST=0 THEN NEXT

Anmerkungen:

  • Die Leerzeichen können weggelassen werden.
  • Bei Variante 2 sollte der Fehlerkanal mit CLOSE 1 anschließend wieder geschlossen werden, sofern der Fehlerkanal nicht für weitere Aktionen benötigt wird oder es folgt ein Hardware-Reset, wo dieser Schritt überflüssig ist.

ab BASIC 3.5[Bearbeiten | Quelltext bearbeiten]

Die Handhabung der Commodore DOS-Befehle wurden ab BASIC 4.0 und BASIC 3.5, also bei den meisten PET/CBM-Modellen außer den ganz alten, beim C16/116 und Plus/4, sowie beim C128, vereinfacht. Hierzu stehen die folgenden BASIC-Befehle zur Verfügung:

Zusätzlich ab BASIC 7.0 bzw. Extended BASIC 4.0+:

  • APPEND (Datei des Typs PRG, SEQ oder USR zum Schreiben ans Dateiende öffnen)
  • BACKUP (gesamte Diskette von einem Laufwerk auf das andere eines Doppellaufwerks kopieren)
  • BOOT (nur bei Basic 7.0, das Laden und Starten von Binärdateien)
  • BLOAD (Laden einer Binärdatei)
  • BSAVE (Speichern einer Binärdatei)
  • CATALOG (Disketteninhaltsverzeichnis anzeigen)
  • CONCAT (Anfügen bzw. Mergen von Dateien kompatiblen Typs zu einer bestehenden Datei, auf Basis des Combine-Befehls)
  • DCLEAR (initialisiert das Laufwerk und schließt alle dem Gerät zugehörigen Datenkanäle, siehe Initialize-Befehl)
  • DCLOSE (Datei des Typs PRG, SEQ, USR oder des datensatzbasierten Typs REL auf Diskette schließen)
  • DOPEN (Datei des Typs PRG, SEQ, USR oder des datensatzbasierten Typs REL auf Diskette öffnen)
  • DVERIFY (nur bei Basic 7.0, Vergleich einer abgespeicherten Datei mit dem Programm im Hauptspeicher, sinnvoll nach DSAVE)
  • RECORD (Positionierung an den angegeben Datensatz einer relativen Datei des Typs REL, siehe Position-Befehl)
  • RUN (nur bei Basic 7.0, Befehl wurde erweitert für das Laden und Starten von Programmen direkt von Diskette).

DOS Wedge[Bearbeiten | Quelltext bearbeiten]

Viele Steckmodule und DOS Wedge-Programme wie z.B. das der Test-/Demodiskette erlauben es, Floppy-Befehle per vorangestelltem @ (Klammeraffe) gefolgt von der Taste RETURN  abzusenden; der Fehlerkanal wird nur per "@" ausgelesen und angezeigt.

TSB[Bearbeiten | Quelltext bearbeiten]

In der BASIC-Erweiterung TSB kann mit Hilfe des Befehls DISK ein Befehl an die Floppy gesendet und per ERROR der Fehlerkanal ausgelesen werden.

Final Cartridge 3[Bearbeiten | Quelltext bearbeiten]

Mit dem Final Cartridge 3 können Kommandos über den speziellen BASIC-Befehl DOS abgeschickt werden. Ohne weitere Parameter wird über DOS der Fehlerkanal ausgelesen. Das FC3 erkennt auch einige neue Floppy-Befehle z.B. zum schnellen Formatieren einer Diskette. Diese Befehle werden vom DOS-Befehl abgefangen und über eigene spezielle Routinen behandelt.

DOS"N:NEUEDISK,01                     :REM Diskette in Laufwerk 8 mit Namen NEUEDISK und Disk-ID 01 formatieren
DOS"F:NEUEDISK,01                     :REM FC3-spezifisch - Schnellformatierung einer Diskette
DOS"D:NEUERNAME,01                    :REM FC3-spezifisch - Diskette umbenennen

JiffyDOS[Bearbeiten | Quelltext bearbeiten]

In JiffyDOS können Kommandos über den Befehl @befehl (oder @"befehl für S-JiffyDOS) abgeschickt werden. Der Fehlerkanal wird über @ ohne Parameter ausgelesen.

@N:NEUEDISK,01                        :REM JiffyDOS
@"N:NEUEDISK,01                       :REM S-JiffyDOS

Action Replay[Bearbeiten | Quelltext bearbeiten]

Ähnlich wie Jiffy bietet das Action Replay den @befehl BASIC-Befehl zum Senden von Befehlen an das Laufwerk an. Das Action Replay interpretiert u.U. einige neue Floppy-Befehle und setzt sie auf andere Weise um. So wird N: zum Formatieren einer Diskette nicht direkt an die Floppy geschickt, sondern stattdessen wird die schnellere Format-Routine des Action Replay benutzt. Soll das verhindert werden, so muss die Syntax @"befehl benutzt werden.

@N:NEWDISK,01                         :REM schnelles Formatieren
@"N:NEWDISK,01                        :REM normales Formatieren

Spezielle Disketten-Befehle[Bearbeiten | Quelltext bearbeiten]

Bis auf "#" (Puffer öffnen) werden alle Befehle über den Befehlskanal (Sekundäradresse 15) geschickt.

Befehl Abkürzung Format Funktion
Puffer öffnen* # "#" Kanal (Channel/ch) zu einem Blockpuffer öffnen, Sekundäradresse=Kanalnummer
Block-Read B-R "B-R:",ch,0,t,s Diskettenblock in einen Blockpuffer lesen ***
Block-Write B-W "B-W:",ch,0,t,s Blockpuffer auf die Diskette schreiben ***
Block-Execute B-E "B-E:",ch,0,t,s Diskettenblock in einen Blockpuffer lesen und ausführen
Buffer-Pointer B-P "B-P:",ch,p Datenzeiger innerhalb des Blockpuffers positionieren
Block-Allocate B-A "B-A:",0,t,s Einen Diskettenblock in der BAM als belegt markieren
Block-Free B-F "B-F:",0,t,s Einen Diskettenblock in der BAM als frei markieren
Memory-Write* M-W "M-W"+CHR$(adrlow)+CHR$(adrhigh)+CHR$(anzahl)+Binärdaten Daten in den Floppy-Speicher schreiben
Memory-Read* M-R "M-R"+CHR$(adrlow)+CHR$(adrhigh)+CHR$(anzahl) Daten aus dem Floppy-Speicher lesen
Memory-Execute* M-E "M-E"+CHR$(adrlow)+CHR$(adrhigh) Programm im Floppy-Speicher ausführen
Record-Position* P "P"+CHR$(ch)+CHR$(recordlow)+CHR$(recordhigh)+CHR$(position) ** auf Datensatz einer relativen Datei positionieren und die Lese-/Schreibposition im Datensatz setzen
User-Vektoren-Rücksetzung U0 "U0" Setzt die Einsprungstellen der Befehle U1 bis U9 auf den Ursprungswert zurück.
User U "Ui:param" allgemeine Form der nachfolgenden U-Befehle:
i=Befehlsnummer 1-9 oder der korrespondierende Befehlsbuchstabe A-I
Sektor lesen U1 "U1:",ch,0,t,s Diskettenblock in einen Blockpuffer lesen ***
Sektor schreiben U2 "U2:",ch,0,t,s Blockpuffer auf die Diskette schreiben ***
Geräteinitialisierung U9
UI
"U9"
"UI"
Rückstetzung des Laufwerksstatus (belegte Blockpuffer und Kanäle werden freigegeben, etc.)
Utility Loader & "&DATEINAME" Lädt Utility-Programm in Floppy-Speicher und führt es aus[1]

* können nur abgekürzt genutzt werden
** optionaler Parameterteil (mit PRINT# muss dann ein abschließendes CHR$(13)-Zeichen durch Angabe eines Semikolons unterdrückt werden, da dieses sonst als Position innerhalb des Datensatzes verstanden wird, also Positionierung auf das 13. Byte)
*** Die Befehle B-R und B-W interpretieren das erste Byte jedes Sektors als die Größe der Nutzdaten im Sektor und sind deswegen in der Praxis selten zu gebrauchen. Stattdessen sollten U1 und U2 benutzt werden, die immer einen vollständigen Sektor lesen oder schreiben, ohne den Inhalt irgendwie zu interpretieren. Ein Beispiel findet sich unter Floppy/BASIC Diskcopy.

Manche Befehle erwarten ihre Parameter als binäre Bytes (M-R, M-W etc.), manche als PETSCII-kodierten Text (B-R, B-W etc.). Bytes sind oben als CHR$(Wert) notiert, entsprechend der Verwendung in BASIC.

Weblinks[Bearbeiten | Quelltext bearbeiten]

Quellen[Bearbeiten | Quelltext bearbeiten]