Floppy-Befehle

Aus C64-Wiki
Wechseln zu: Navigation, Suche

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 (Sekundäradresse 15) durch die Floppy empfangen werden und die in BASIC 2.0 mit OPEN eingeleitet und mit CLOSE abgeschlossen werden. Der eigentliche Floppy-Befehl steht dann entweder in der Zeichenkette des OPEN-Befehls oder in einem separaten PRINT#-Befehl.
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.

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 2.0 und der Dateinutzung auf Disketten.

Inhaltsverzeichnis

[Bearbeiten] Übliche Floppy-Befehle

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.


[Bearbeiten] New

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 2.0: 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 2.0: OPEN 1,8,15,"N:SCHNELL": CLOSE 1

[Bearbeiten] Scratch

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 2.0: 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.

[Bearbeiten] Rename

Datei umbenennen (RENAME): R:NeuerName=AlterName

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

[Bearbeiten] Copy/Combine/Concat

  • Datei kopieren (COPY): C:NeuerName=AlteDatei oder CLaufwerk1=Laufwerk2 oder CLaufwerk1=Laufwerk2:Datei
    1. "AlteDatei" wird in die Datei "NeuerName" kopiert.
      • Beispiel unter BASIC 2.0: 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 2.0: 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 2.0: 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 2.0: 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 2.0: OPEN 1,8,15,"C:ALLEDATEN=0:ALLEDATEN,DATEN2017": CLOSE 1

[Bearbeiten] Validate

Diskette validieren (VALIDATE): V

  • Diskette wird auf gültige Daten geprüft und ggf. korrigiert: BAM und Directory werden auf Konsistenz geprüft und abgeglichen. 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.
  • Beispiel unter BASIC 2.0: OPEN 1,8,15,"V": CLOSE 1

[Bearbeiten] Initialize

Diskette neu einlesen (INITIALIZE): I

  • Das Floppy-Laufwerks 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. Etwaige fehlerhafte Zustände des Laufwerk selbst können damit beseitigt sein.
  • Kann auch zur Erkennung, ob eine Diskette eingelegt ist, verwendet werden. Wenn keine Diskette eingelegt ist, meldet der Fehlerkanal 21,READ ERROR,18,00.
  • Beispiel unter BASIC 2.0: OPEN 1,8,15,"I": CLOSE 1

[Bearbeiten] Duplicate

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 2.0: OPEN 1,8,15,"D1=0": CLOSE 1

[Bearbeiten] BASIC-Befehle unter BASIC 2.0

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

[Bearbeiten] Floppy-Befehl senden

Das BASIC 2.0 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

[Bearbeiten] Floppy-Befehl bei BASIC-Erweiterungen senden

In den BASIC-Erweiterungen Simons' Basic und TSB kann mit Hilfe des Befehls DISK ein Floppy-Befehl abgesetzt werden, ohne OPEN/CLOSE verwenden zu müssen, jedoch mit gewissen Einschränkungen zumindest im Falle des originalen Simons' Basic.

[Bearbeiten] 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.

[Bearbeiten] 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.

[Bearbeiten] BASIC-Befehle ab BASIC 3.5

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).

[Bearbeiten] DOS Wedge

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.

[Bearbeiten] TSB

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

[Bearbeiten] Final Cartridge 3

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

[Bearbeiten] JiffyDOS

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

[Bearbeiten] Action Replay

Ä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

[Bearbeiten] Spezielle Disketten-Befehle

Befehl Abkürzung Format Funktion
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 als belegt markieren
Block-Free B-F "B-F:",0,t,s Einen Diskettenblock als frei markieren
Memory-Write* M-W "M-W"+CHR$(adrlow)+CHR$(adrhigh)+CHR$(number)+Binärdaten Daten in den Floppy-Speicher schreiben
Memory-Read* M-R "M-R"+CHR$(adrlow)+CHR$(adrhigh)+CHR$(number) 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.)
*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)

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.

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.

[Bearbeiten] Weblinks

In anderen Sprachen