Commodore DOS
Commodore DOS (Disk Operating System) ist ein Disketten-Betriebssystem des Unternehmens Commodore, das in den Diskettenlaufwerken der Commodore-8-Bit-Reihe eingesetzt wurde, z. B. CBM 3040, CBM 4040, CBM 8050, CBM 8250, VC1540, VC1541, VC1570/71, VC1581, SFD1001, SFD1002.
CBM DOS Versionen
Es existieren mindestens sieben Versionen von Commodore DOS. Die folgende Liste enthält die Versionsnummern und die zugehörigen Laufwerke. Sofern nicht anders angegeben, haben Laufwerke ein 5¼-Zoll-Format. Der "lp" -Code bezeichnet "Low-Profile"-Laufwerke. Laufwerke, deren Modellnummern mit 15 beginnen, werden über die serielle IEEE-488-Bus-Protokolle (IEC-Bus) (TALK/LISTEN) verbunden. Alle anderen verwenden den parallelen IEEE-488.
- 1.0 – Commodore 2040 und Commodore 3040
- 2.0 – Commodore 4040 und Commodore 3040
- 2.5 – Commodore 8050
- 2.6 – Commodore 1540, Commodore 1541, SX-64, Commodore 1551, Commodore 2031 (+"lp") und Commodore 4031
- 2.7 – Commodore 8050, Commodore 8250 (+"lp") und Commodore SFD1001
- 3.0 – Commodore 1570, Commodore 1571 und Commodore 8280 (8280: 8-Zoll), wie auch in Commodore D9060 und Commodore 9090 Festplatten
- 3.1 – Integrierte Commodore 1571 im C128D-CR
- 10.0 – Commodore 1581 (3½-Zoll)
Hardware der Diskettenlaufwerke
Ausführliche Erläuterungen zur Hardware siehe im eigenen Artikel CBM-Diskettenlaufwerke.
Bei typischen Computersystemen jener Zeit, und im Prinzip bis heute, waren Diskettenlaufwerke fast direkt über den Prozessorbus angebunden. Um das Kodieren der Daten kümmerte sich entweder ein einfacher Controllerchip oder die Software des Betriebssystems. Auch das Dateisystem wurde vom Betriebssystem des Computers verwaltet.
Bei den Computern der Commodore-8-Bit-Reihe wählte man einen anderen Weg. Um die Kosten für den Computer, der anfangs häufig ohne Diskettenlaufwerk eingesetzt wurde, zu minimieren und die Anbindung von Laufwerken so flexibel wie möglich zu halten, verfügte der Computer nur über sehr einfache und allgemein gehaltene, zeichenorientierte (nicht blockorientierte) Soft- und Hardware-Schnittstellen zu externen Geräten. Die vollständige Logik zum Kodieren/Dekodieren von Sektoren sowie die Dateisystem- und DOS-Befehlslogik war im Diskettenlaufwerk realisiert.
Commodore-8-Bit-Diskettenlaufwerkseinheiten (Units) waren deshalb eigenständige Computer mit einem oder zwei vom eigentlichen Computer unabhängigen Prozessoren. Eine Unit verfügte über ein oder mehr Laufwerke (Drives). Mehrere Units konnten an einen Computer angeschlossen werden. Das Betriebssystem, das in diesen Laufwerken zum Einsatz kam, war Commodore DOS. Im Gegensatz zu den DOS-Varianten der meisten anderen damaligen Firmen war es nicht auf einer Diskette gespeichert, sondern in ROM-Chips (Firmware) innerhalb des Laufwerks. Dadurch ergibt sich ein schnellerer Systemstart (das DOS ist beim Einschalten innerhalb von 1 bis 2 Sekunden einsatzbereit), geringere Kosten (ROM-Speicher war damals deutlich billiger als die gleiche Menge RAM-Speicher) aber auch eine geringere Flexibilität (neuere DOS-Versionen mit Fehlerkorrekturen oder zusätzlichen Funktionen können nur durch einen Umbau des Laufwerks verwendet werden, während bei anderen Systemen nur der Austausch eines Datenträgers erforderlich war).
Die ursprünglichen Modelle für die Commodore-PET-Reihe besaßen zwei symmetrische CPUs, 2 KB RAM und 16 KB ROM. CPU 1 realisierte die Logik, um Sektoren zu lesen und zu schreiben, während CPU 2 sich um die Dateisystemlogik sowie um die Kommunikation mit dem Computer kümmerte. Die Kommunikation zwischen den beiden Prozessoren fand über den Hauptspeicher statt: CPU 2 schrieb Befehls-Tupel (Aktion, Drive, Spur, Sektor, Speicheradresse) in einen definierten Speicherbereich, die CPU 1 auslas, ausführte und das Befehls-Tupel mit dem Ergebniscode überschrieb. Die beiden CPUs konnten dabei gleichzeitig denselben Speicher verwenden, indem man sich eine spezielle Eigenschaft der 6502-Prozessoren zunutze machte – diese greifen nur in einer der beiden Hälften jedes Taktzyklus auf den Systembus zu. Die CPUs wurden nun so verschaltet, dass CPU 1 jeweils in der ersten Takthälfte und CPU 2 in der zweiten Takthälfte den Bus benutzte, ganz genau so, wie sich in den Commodore-Computern der Prozessor und der Videochip den Bus teilten.
Grundsätzlich gelten alle diese Angaben auch für die Festplatten CBM 9060 und CBM 9090.
Spätere Geräte verfügten über nur ein Laufwerk und die zweite CPU wurde aus Kostengründen eingespart. Die einzelne CPU übernahm beide Aufgaben, die ursprüngliche Konzeption des Systems blieb dabei allerdings bestehen: Die Aufgaben der CPU 2 (Dateisystem) liefen als Hauptprogramm ab, während die Aufgaben der CPU 1 (Hardwaresteuerung) in einer Interruptroutine erledigt wurden.
Eigenschaften von Commodore DOS
Aktionen wie das Formatieren von Disketten, das Umbenennen, Löschen oder Kopieren von Dateien werden also von Commodore DOS ausgeführt und laufen vollständig in der Laufwerkseinheit ab. Das DOS bietet ein flaches Dateisystem (Details siehe unter SFD100x) ohne Unterverzeichnisse und mit einer limitierten Anzahl von Einträgen, also Dateien, je Datenträger (Diskette bzw. Festplatte). Die Maximalanzahl an Einträgen variiert dabei mit der Kapazität des jeweiligen Datenträgers, von der 170-KB-Diskette bis zum 4,5-MB-Festplattenlaufwerk.
Unterstützte Dateitypen
Jede Datei trägt im Inhaltsverzeichnis eine Kennung, die sie einem der folgenden Dateitypen zuordnet:
- Sequentielle Datei (SEQ) – für unstrukturierte, in einem durchgehenden Strom zu lesende Daten, die Länge steht im Inhaltsverzeichnis, jeder Datenblock trägt in den ersten beiden Bytes die Blocknummer des Folgeblocks für diese Datei auf der Diskette, so dass je Block nur 254 Nutzbytes gespeichert sind.
- Programmdatei (PRG) – strukturiert wie eine sequentielle Datei; enthält in den ersten beiden Nutzbytes die Ladeadresse im Arbeitsspeicher des Computers und danach den binären Speicherinhalt, wie er aus diesem Speicherbereich kopiert wurde bzw. wieder in ihn zurückgeschrieben werden soll.
- Relative Datei (REL) – Direktzugriffsdatei, die es über separat gespeicherte Zeiger („Pointer“, in einem oder mehreren dann wieder sequentiell verlinkten Datenblöcken) auf die von ihr belegten Diskettenblöcke erlaubt, direkt auf bestimmte Orte innerhalb der Datei zuzugreifen, ohne den ganzen Inhalt davor durchlesen zu müssen. Bei den meisten anderen Betriebssystemen ist das für alle Dateien möglich, Commodore DOS spart ein wenig Speicherplatz, indem die dafür notwendigen Strukturen bei den nicht-relativen Dateitypen nicht angelegt werden.
- User-Datei (USR) – strukturiert wie eine sequentielle Datei; muss keinerlei sonstige Regeln erfüllen.
Das Inhaltsverzeichnis selbst ist zwar ähnlich einer sequentiellen Datei abgespeichert, aber taucht nicht im Inhaltsverzeichnis auf (auch nicht als „.“ wie bei Unix oder MS-DOS). Beim Auslesen wird es wie ein nicht ausführbares BASIC-Programm formatiert und wie ein solches in den Arbeitsspeicher geladen und kann dort mit dem LIST-Befehl des Basic-Interpreters angesehen werden (der Versuch, dieses Pseudo-Programm mit dem Befehl RUN zu starten, führt dagegen zu einer Fehlermeldung). Da es wie ein BASIC-Programm geladen wird, überschreibt es aber auch ein evtl. dort vorher stehendes BASIC-Programm, das anschließend wieder geladen werden muss. Erst in Version 4 von Commodore BASIC gibt es eigene Befehle zum Ansehen des Inhaltsverzeichnisses, ohne ein im Arbeitsspeicher vorhandenes BASIC-Programm zu überschreiben.
Befehlsübertragung
Jedes Laufwerk kann über die Schnittstelle zum Computer 15 virtuelle Kanäle oder Dateien (0–14) unterhalten, d. h. der Computer kann auf einem Laufwerk bis zu 15 Dateien zum Lesen bzw. Schreiben offen halten. (Die tatsächliche Anzahl offener Dateien wird dabei in der Praxis vom RAM des Laufwerks begrenzt, üblicherweise können 3–4 Dateien und der Befehlskanal offen gehalten werden, wobei relative Dateien doppelt zählen.)
Andererseits arbeitet der Computer seinerseits mit eigenen virtuellen Kanälen, die durch ihre Nummer identifiziert und den Geräten bei der Eröffnung zugeteilt werden; bei der Eröffnung des Kanals wird dem Gerät (z. B. Diskettenlaufwerk) auch mitgeteilt, welchen virtuellen Kanal es für diese Verbindung verwenden soll. Die Nummern sind dabei beliebige „Namen“, über die reale Puffer im Computer und den Geräten adressiert werden.
Kanal 15 („Befehlskanal“) hat für ein Diskettenlaufwerk eine Sonderbedeutung: Über ihn laufen Befehle vom Computer an Commodore DOS sowie Statusmeldungen in die andere Richtung. Auf Computerseite wird der Befehlskanal allerdings genau wie eine normale Datei behandelt.
Kanal 0 ist für Leseoperationen vorgesehen und Kanal 1 für Schreiboperationen (insb. dem Laden und Speichern von Programmen), so dass bei Benutzen dieser Kanäle die Art des Zugriffs nicht mehr spezifiziert werden muss.
Empfangen und Senden von Daten und Befehlen
Der Datenaustausch zwischen Computer und Laufwerk wird ermöglicht über die erwähnten virtuellen Kanäle ("Sekundäradressen") im Laufwerk. Bei Commodore-Computern (z. B. C64) existieren analoge virtuelle Kanäle ("Dateinummern") auch auf Computerseite, verwaltet durch Routinen im ROM-basierten Betriebssystem (Kernal). Diese werden vom BASIC-Interpreter bei Eingabe von bestimmten BASIC-Befehlen aufgerufen oder direkt von Programmen, vor allem Assembler-Programmen. Die computerseitigen virtuellen Kanalnummern ("Dateinummern") werden dabei dem Laufwerk nie mitgeteilt, sondern nur innerhalb des Rechners selbst verwendet. Die Laufwerke identifizieren Dateien ausschließlich über die "Sekundäradressen".
Die folgenden Beispiele illustrieren somit eher die Ansprache des DOS von der BASIC-Ebene aus und die Abhängigkeit der Benutzerfreundlichkeit von der Implementation von Letzterer. „Gerät“ meint dabei in diesem Zusammenhang ausdrücklich eine Commodore-Diskettenstation und wird verwendet, um begrifflich eine solche von einem „Laufwerk“ zu unterscheiden, da manche Stationen ja aus zwei Laufwerken bestehen.
Beispiel 1: Umbenennen einer Datei
OPEN 1,10,15: PRINT#1,"R:NEUNAME=ALTNAME": CLOSE 1
oder abgekürzt OPEN 1,10,15,"R:NEUNAME=ALTNAME": CLOSE 1
Der OPEN-Befehl öffnet den virtuellen Kanal ("Dateinummer") 1 auf Computerseite, weist ihn Gerät 10 am seriellen Bus zu und schickt diesem Gerät die Information, seinerseits den virtuellen Kanal ("Sekundäradresse") mit Nummer 15 zu verwenden (d. h. einen Pufferbereich zu reservieren und ihn „15“ zu nennen); Anhand dieser Nummer 15 weiß das Gerät, dass über diesen Kanal keine Daten für eine Datei, sondern DOS-Befehle gesendet werden, die es ausführen soll. Der zweite Befehl schickt den Befehl „R“ (kann auch RENAME ausgeschrieben werden) an Kanal 1 mit dem neuen und alten Dateinamen. Der dritte Befehl schließt den virtuellen Kanal.
Beispiel 2: Öffnen einer Datei und Hineinschreiben eines Textes
OPEN 1,8,13,"0:TESTDATEI,S,W"
oder OPEN 1,8,1,"0:TESTDATEI,S"
oder DOPEN#1,"TESTDATEI,W"
PRINT#1,"WIKIPEDIA, DIE FREIE ENZYKLOPAEDIE"
CLOSE 1
Der erste OPEN-Befehl öffnet virtuellen Kanal ("Dateinummer") 1 auf Computerseite und weist ihn Gerät 8 zu. Diesem Gerät wird zunächst mitgeteilt, dass eine Datei zu öffnen sei, die fortan über die Nummer ("Sekundäradresse") 13 anzusprechen ist. Da es sich um eine echte Datei handelt, liegt diese auf einem bestimmten Datenträger und hat einen Namen. "0" bezeichnet die Nummer des Laufwerks, in dem sich der Datenträger befindet, das erste Laufwerk eines Gerätes mit zwei Laufwerken (das zweite Laufwerk hieße "1"). Die Zeichen zwischen dem Doppelpunkt und dem Komma werden als Name der Datei interpretiert. Danach folgt „S“ als Angabe, dass es eine Datei vom Typ SEQ (sequentielles lesen/schreiben) werden soll, und „W“ für WRITE (Schreibzugriff). Andere Zugriffsmodi sind „R“ (Read) und „M“ (Modify). Die Zeichenkette zwischen den Anführungszeichen wird vom Rechner unverändert an die Diskettenstation gesendet und erst dort werden die einzelnen Bestandteile (Laufwerksnummer, Name, Dateityp, Zugriffsmodus) interpretiert.
Der darunterstehende Befehl erfüllt genau dieselbe Funktion, aber da der laufwerksseitige virtuelle Kanal Nummer 1 benutzt wird und diese standardmäßig für Schreiboperationen reserviert ist, entfällt die Angabe für den Schreibzugriff. Der nächste Befehl setzt BASIC 4.0 oder höher voraus und erfüllt den gleichen Zweck, ohne dass der Benutzer sich um weitere Parameter kümmern muss – die Gerätenummer, die laufwerksseitige Kanalnummer ("Sekundäradresse"), der Dateityp und die Laufwerksnummer werden vom BASIC-Interpreter automatisch hinzugefügt, bevor der Befehl zum Laufwerk gesendet wird.
Alle diese Befehle tragen zudem die computerseitige virtuelle Kanalnummer ("Dateinummer"), die Gerätenummer, und die laufwerksseitige Kanalnummer ("Sekundäradresse") in einer internen Tabelle im Speicher des Rechners ein, so dass bei weiteren Befehlen, die sich auf die gleiche Datei beziehen, nur noch die Dateinummer angegeben werden muss.
Der nächste Befehl schickt den Text an den virtuellen Kanal (Puffer im RAM des Laufwerks). Anhand der angegebenen Dateinummer findet der Rechner in der internen Tabelle die zuvor festgelegte Gerätenummer und Sekundäradresse; diese und der angegebene Text werden an die Diskettenstation übermittelt. Der letzte Befehl schließt den Kanal, wobei wieder Gerätenummer und Sekundäradresse in der internen Tabelle nachgesehen und an die Diskettenstation übermittelt werden, gefolgt von einer Dateiende-Marke. Erst ein Überlaufen des Puffers oder der CLOSE-Befehl veranlasst das Schreiben des Textes auf die Diskette. CLOSE gibt zugleich den Puffer im Laufwerk für andere Zwecke frei und entfernt den Eintrag für Gerätenummer und Sekundäradresse aus der erwähnten computerseitigen Tabelle. Ein eventueller weiterer Zugriff auf diese Datei ist damit erst wieder nach einem erneuten OPEN oder DOPEN-Befehl möglich.
Während dieses Vorgehen mit je einer Ebene von virtuellen Kanälen auf Computer- und Laufwerksseite für Programme Möglichkeiten des geräteunabhängigen Zugriffs bietet (Ansprechen von Laufwerken in derselben Form wie von Druckern, Modems, Datasette, Tastatur, Bildschirm etc.), ist es für simple Laufwerksoperationen unhandlich. Commodore integrierte daher in spätere Versionen von BASIC Befehle zum einfacheren Zugriff auf Disketteninhalte:
Beispiel 3: Umbenennen einer Datei in BASIC 4.0 oder 7.0 (z. B. C128)
RENAME"alt"TO"neu"
Technisch betrachtet arbeitet dieser Befehl wie Beispiel 1 (außer dass er Gerät 8 anstelle von 10 anspricht).
Auch integrieren BASIC-Erweiterungen für CBM-Rechner häufig einen Befehl (meist „@“), der das direkte Senden von Befehlen auf dem Befehlskanal eines Laufwerks ermöglicht, ohne dass der Benutzer sich um die Ebene von Dateien und Kanälen zu kümmern braucht:
Beispiel 4: Umbenennen einer Datei mit DOS-Wedge oder z. B. JiffyDOS
@R:neu=alt
Insbesondere die Abfrage des Befehlskanals von Seiten des Computers wird dadurch stark erleichtert, denn auf diesem Weg meldet sich ja das DOS beim Computer:
Beispiel 5: Abfragen des Status des Geräts mit DOS-Wedge oder z. B. JiffyDOS
@
Ausgabe z. B.: 00, OK, 00, 00
Commodore-Disketteneinheiten melden ihren Status in der o. g. Form als CBM-ASCII-String an den Computer. Die erste Zahl gibt die Nummer des aufgetretenen Ereignisses (i. A. Fehler, aber auch z. B. bei der 1581 das vorgenommene Auswählen einer Partition) an, 0 bedeutet hier keiner. Nach einem Komma folgt der Fehler als Klartext (jedoch weniger differenziert als die Nummer, so werden Lesefehler aus verschiedenen Gründen als „READ ERROR“ gemeldet und sind anhand ihrer Nummer genauer einzugrenzen), dann zwei Zahlen, die für gewöhnlich (aber nicht bei allen Meldungen) Spur und Sektor des Ereignisses angeben. Der Status ist auch ab BASIC 4.0 als Textstring mittels der Systemvariablen DS$ (für "Disk Status") und die Ereignisnummer mittels DS abrufbar.
Befehle
Folgende unvollständige Liste stellt einige wichtige Commodore-DOS-Befehle dar, auch um den mitunter durchaus elaborierten Charakter der Befehle zu illustrieren. Die Befehle können auch mit den ebenfalls aufgeführten vollständigen Namen gesandt werden, da das erste Zeichen zur Unterscheidung dient, auf das sie i. A. verkürzt werden.
Die meisten Befehle können die Wildcards ? und * verarbeiten. Je nach Befehl wird dann entweder mit der ersten oder mit allen passenden Dateien gearbeitet. Der Dateiname $ (Dollarzeichen) ist reserviert für das Verzeichnis[1] einer Diskette, welches in Form eines nicht ausführbaren, aber LIST
-baren Commodore-BASIC-Programms zurückgegeben wird.
Die in vielen Befehlen mögliche Angabe einer Laufwerksnummer ist nicht obligatorisch, Laufwerk 0 ist der Standardwert. Bei einigen Befehlen können aber obskure Probleme auftauchen, wenn keine Laufwerksnummer angegeben wird; daher hat es sich eingebürgert, diese stets, selbst bei Geräten mit nur einem Laufwerk, in den Befehl aufzunehmen. Die BASIC-Befehle der höheren BASIC-Versionen ab 4.0 tun das automatisch.
Die meisten Befehle mit numerischen Parametern erwarten diese als Dezimalzahlen aus ASCII-Ziffern (Folgen von Hexcodes $30 bis $39 für die Ziffern 0 bis 9). Der POSITION-Befehl und die MEMORY-Befehle erwarten jedoch ihre Parameter im Binärformat (Hexcodes $00 bis $FF für die Werte 0 bis 255).
- N[d]:name,id – NEW: Formatieren einer Diskette in Laufwerk d (0 oder 1) des Gerätes. name ist der später in der Kopfzeile des Inhaltsverzeichnis erscheinende Diskettenname, id ist ein aus zwei Zeichen bestehender Code, der in die Kopfdaten jedes Datenblocks auf der Diskette geschrieben wird; anhand dessen kann das Laufwerk erkennen, wenn die Diskette gewechselt wurde, natürlich nur, wenn für verschiedene Disketten nicht die gleiche ID verwendet wird. Angabe eines anderen Laufwerks als 0 natürlich nur bei Geräten mit zwei Laufwerken möglich, z. B. "N1:name,id" – Formatiert die Diskette in Laufwerk 1 (zweites Laufwerk).
- N[d]:name – NEW: Löschen des Inhaltsverzeichnisses einer bereits formatierten Diskette ohne Neuformatierung; die ID ändert sich dabei nicht. Alle Dateinamen und alle Verweise auf den Speicherort der Dateien werden gelöscht und alle Datenblöcke werden freigegeben, aber die eigentlichen Dateidaten werden nicht gelöscht.
- V[d] – VALIDATE: Überprüfung des Dateisystems und Korrektur fehlerhafter Einträge, Berichtigung des freien Speicherplatzes; vergleichbar dem CHKDSK bzw. ScanDisk von MS Windows
- I[d] – INIT, INITIALIZE: Initialisieren der Diskette (Aktualisieren der Block Availability Map kurz BAM)[2] im Laufwerks-Cache, kann nach Diskettenwechsel nötig sein, wenn sich die IDs der Disketten nicht unterscheiden
- R[d]:neu=alt – RENAME: Umbenennen einer Datei; beachte, dass der neue Name zuerst kommt, anders als bei den Umbenennungsbefehlen der meisten anderen Betriebssysteme
- C[d]:neu=alt – COPY: Kopieren einer Datei auf derselben Diskette. Auch hier steht der neue Name zuerst.
- C[x]:neu=[y]:alt – COPY: Kopieren einer Datei von Laufwerk y (0 oder 1) auf Laufwerk x (1 oder 0), ggf. unter dem neuen Namen neu; nur möglich innerhalb von Geräten mit zwei Laufwerken
- S[d]:name – SCRATCH: Löschen einer oder mehrerer Dateien
- D:[x]=[y] – DUPLICATE: Kopieren einer ganzen Diskette von Laufwerk y (0 oder 1) auf Laufwerk x (1 oder 0); nur möglich innerhalb von Geräten mit zwei Laufwerken; beachte, dass das Ziellaufwerk zuerst steht, anders als bei den Duplizierbefehlen der meisten anderen Betriebssysteme
- P,kanalnummer position – POSITION: Aufsuchen einer bestimmten Position in einer Datei (nur bei relativen Dateien möglich). Mit Kanalnummer ist die oben beschriebene Sekundäradresse gemeint.
- B-R Kanal Spur Sektor – BLOCK-READ (Abkürzung obligatorisch): Lesen eines Sektors und Übermittlung des Inhalts an den angegebenen logischen Kanal (=Sekundäradresse). Aufgrund von Beschwerden über die für echten blockweisen Zugriff, etwa für das Kopieren einer Diskette in Geräten mit nur einem Laufwerk oder die direkte Manipulation des Dateisystems, nicht ausreichende Funktionsweise des Kommandos (das erste Byte des Blocks bestimmt die Anzahl der gelesenen Bytes) um die folgende "intuitiv" funktionierende Variante ergänzt:
- U1 Kanal Spur Sektor – Ersatz für Block-Read, liest immer den ganzen Block, auch als "UA" schreibbar
- B-W Kanal Spur Sektor – BLOCK-WRITE (Abkürzung obligatorisch): Schreiben eines Sektors, das erste Byte bestimmt die Anzahl der zu schreibenden Bytes
- U2 Kanal Spur Sektor – Ersatz für Block-Write, schreibt immer den ganzen Block, auch als "UB" schreibbar
Wird bei "B-R" und "B-W" der zweite Buchstabe groß geschrieben bzw. durch ein entsprechendes Grafikzeichen ersetzt (Bit 7 im Code des eingestellten CBM-ASCII-Zeichensatzes gesetzt) unterbleibt eine Prüfung auf zulässige Werte für Spuren und Sektoren, etwa um Bereiche außerhalb des normalen Diskettenformats zu manipulieren.
- U3-U8 – User-Befehle: Anspringen eigener Software im Laufwerks-RAM durch Sprungtabelle, auch als "UC"-"UH" schreibbar
- U9 – Zurücksetzen des Geräts in den Wartezustand und Initialisieren der Diskette (Reset), auch "UI"
- U: – Zurücksetzen des Geräts in den Einschaltzustand und Initialisieren der Diskette („Harter“ Reset), auch "UJ"
- U0>PETSCII-Zeichen Nr. x – Zuordnen einer neuen Gerätenummer x an das Laufwerk (nur 157x und neuer)
- M-W AdrL AdrH Anzahl Datenbytes – MEMORY-WRITE (Abkürzung obligatorisch): Schreiben in das RAM des Diskettenlaufwerks
- M-R AdrL AdrH Anzahl – MEMORY-READ (Abkürzung obligatorisch): Lesen aus dem RAM des Diskettenlaufwerks
- M-E AdrL AdrH – MEMORY-EXECUTE (Abkürzung obligatorisch): Starten eines Maschinenprogramms im RAM des Diskettenlaufwerks
Mit den Memory- und den U-Befehlen kann man also eigene Software in das Diskettenlaufwerk übertragen, sie dort laufen lassen und schließlich im RAM abgelegte Ergebnisse wieder auslesen. Anwendungen dazu:
- Man kann den Datenzugriff optimieren, als praktisches Beispiel wurden zeitkritische Suchen in einer Datenbank komplett innerhalb des Diskettenlaufwerks vorgenommen.
- Man kann die Übertragung zwischen Diskettenlaufwerk und Rechner beschleunigen, indem man die sehr suboptimalen Übertragungsroutinen durch stärker optimierte Varianten ersetzt. Dies wurde vor allem beim seriellen CBM-Bus zwischen dem C64 und seinen Laufwerken angewendet.
- Man kann die Diskettenstation als Slave-Rechner verwenden, der im Multiprocessing Teilaufgaben übernimmt, so dass insgesamt mehr Datendurchsatz erreicht wird. Beispiel: Fraktalberechnung (Mandelbrot-Menge) oder die erste Stufe einer Datenbanksuche für einen Universitäts-Bibliothekskatalog. Der sehr beschränkte RAM-Speicher der meisten Laufwerke (meist 2 Kilobyte) machte das aber nur eingeschränkt möglich, nur die 1581 hatte mit 8 Kilobyte genügend RAM für etwas komplexere Berechnungen.
- Man kann einen komplexeren Kopierschutz in Programme einbauen, indem man dem Laufwerk ein Programm einschreibt, das nicht standardgemäße Datenstrukturen, welche mit normalen Kopierprogrammen unlesbar sind, von einer Diskette lesen kann.
- Ebenso kann man Kopierschutzverfahren aushebeln, indem Software im Laufwerk direkt auf den Datenstrom der Diskettenoberfläche zugreifen und diesen zur Analyse unverändert an den Computer weitergeben kann.
Diese Möglichkeiten zum direkten Zugriff auf Interna des Laufwerks waren zwar oft praktisch nützlich, verhinderten aber einen sinnvollen Upgrade-Pfad ohne aufwändige und teure Maßnahmen zur Wahrung der Kompatibilität; bereits das Laufwerk 1571 enthielt mehrere Komponenten, die nur dazu dienten, die Kompatibilität zum Vorgängermodell 1541 auf dieser tiefen Ebene zu wahren. Entsprechende Möglichkeiten bieten heutige (Festplatten-)Laufwerke nicht mehr, obwohl auch sie über hochgradige Eigenintelligenz in ihrer Firmware und viel internes RAM verfügen.
Verwendung der Laufwerke an Fremdcomputern
Aufgrund des Klartextcharakters der Befehle war es auch relativ leicht möglich, Commodore-Laufwerke (zumindest die mit dem genormten parallelen IEEE-488-Bus) an IEEE-488-Bus-fähigen Rechnern anderer Hersteller (z. B. Tektronix) zu betreiben. Die Befehle ließen sich mühelos in deren eigenem BASIC-Dialekt als Ausgabeanweisungen formulieren und an die Geräte senden. Nur bei der Interpretation der zurückgesendeten Ergebnisse (z. B. Verzeichnisauflistung in Form eines Pseudo-Commodore-BASIC-Programms) waren Kenntnisse über die Struktur dieser Daten nötig.
Einzelnachweise
- Inhaltsverzeichnis einer Diskette, Beschreibung auf c64-wiki.de
- Block Availability Map, Beschreibung auf c64-wiki.de