Ein spätes Loblied auf die Diskette

Nach dem Kassettenrekorder war sie das Speichermedium der meisten Computer in den Achtzigern und auch Ursache für manchen Frust – die Diskette.

Die Diskette ist älter als die PC, sie wurde von IBM entwickelt, um leichter Softwareupdates auf Computer aufzuspielen. Sie war handlicher als Magnetbänder und es gab einen direkten Zugriff. Die Acht Zoll Disketten die IBM entwickelt hatte, waren aber, als ich mich mit Comutern zum ersten Mal beschäftigte, das war 1982 schon selten. 1975 hatte die Firma Shugart die Mikrofloppy entwickelt im handlicheren Format von 5,25 Zoll (heute müsste man, nachdem „Verbraucherschützer“ das durchgesetzt haben, ja sie „133,35 mm Diskette“ nennen). Die setzte sich bei Mikrocomputern breit durch. Denn die Laufwerke waren viel kleiner. Zu einem anderen Vorteil komme ich noch. Ab 1984 kam dann noch die 3,5 Zoll Diskette hinzu, die mit einer festen Plastikhülle und einem Metallshutter, die zwar keine Floppy (also biegsam) war, aber robuster. Fortschritte in der Technologie erlaubten inzwischen auch die gleiche Kapazität wie bei den 5,25 Disks. Später kamen noch die HD-Formate hinzu, die mit dem IBM AT und der PS/2 Serie von IBM eingeführt wurden. Danach konnte kein weiterer Standard sich etablieren und die Diskette war auch für Softwareprogramme zu klein. Ich kann mich noch erinnern, dass ich als letztes Programm auf Disks mal Word Perfect für Windows installiert habe – das ganze Programm kam auf 24 Disketten. Etabliert haben sich nur wenige Standards:

  • Single Sided, Single Density: 40 Spuren auf einer Seite, unformatierte Kapazität 250 KByte
  • Single Sided, Double Density: 80 Spuren auf einer Seite, unformatierte Kapazität 500 KByte
  • Double Sided, Single Density: 40 Spuren auf zwei Seiten, unformatierte Kapazität 500 KByte
  • Double Sided, Double Density: 80 Spuren auf zwei Seiten, unformatierte Kapazität 1000 KByte

Belegt waren Disketten beidseitig mit einer Magnetschicht. Die Unterteilung bezieht sich mehr auf die Laufwerke, die bei Single Sided eben nur einen Schreiblesekopf haben. Man konnte dann die Disketten umdrehen und die zweite Seite nutzen. Nur bei IBM kompatiblen Geräten gab es dann noch die HD Format mit 1,6 MByte und 2 MByte unformatierter Kapazität. Der letzte von IBM eingeführte Standard mit 4 MByte pro Diskette konnte sich nicht mehr durchsetzen.

Formatiert wurden die Disketten mit Sektoren von 128, 256, 512 oder 1024 Bytes, wobei die meisten Systeme 256 oder 512 Bytes verwendeten. Da es hinter jedem Sektor eine Zone ohne Daten gab, damit der Computer die eingelesenen Daten verarbeiten konnte und zu den Daten noch Verwaltungsinformationen kamen war die nutzbare Kapazität immer kleiner. Maximal konnte man auf einer Spur (6250 Bytes unformatiert) speichern:

  • 26 Sektoren à 128 Byte = 3.328 Byte
  • 16 Sektoren à 256 Byte = 4.096 Byte
  • 9 Sektoren à 512 Byte = 4.608 Byte
  • 5 Sektoren à 1024 Byte = 5.120 Byte

Die ersten Disketten hatten nur 35 Spuren und waren hart sektoriert, das heißt, es gab in der Mitte eine Spur mit eine Reihe von Löchern, die den Sektoranfang markierten. Mit einer Fotozelle, die auch den Spuranfang detektierte, konnte so der Anfang jedes Sektors erkannt werden. Gängiger waren aber softsektorierte Disks, die der Hersteller nach eigenem Belieben unterteilen konnte. Hier erkannte man den Sektor an ID-Bytes. Dieses Format setzte 1982 aber nur noch Apple ein, die auch als eine der ersten Firmen eine Diskettenstation für ihren Computer auf den Markt brachten.

Wer einen Computer damals hatte, empfand Diskettenlaufwerke als langsam. Das Speichern dauerte, immer begleitet von den typischen schnarrenden Bewegungen des Schreib-/Lesekopfes. Wunschtraum war damals eine Festplatte, doch für die konnte man – zumindest wenn man einen Heimcomputer und keinen teuren Rechner hatte – genauso viel hinlegen wie für den Rechner mit Disketten selbst und auf eine 20 MB Festplatte, damals eine gängige Größe, passte auch nur der Inhalt von 30 Disketten.

Als ich mich in den letzten Tagen mit den beiden letzten Artikeln beschäftigt habe, wurde ich wieder dran erinnert. Ich habe mich zuerst gewundert, warum der C128, der 1985 erschien, noch eine 5,25 Zoll Diskettenstation hatte und diese Commodore-eigene Lösung mit einem eigenen Prozessor in der Floppy – wohlgemerkt zusätzlich zum Diskettenkontroller (FDC). Man konnte den auch durch den eigenen Prozessor ersetzen, wie Stephen Wozniak das beim Apple tat. Aber das war wohl der Kompatibilität zum C64 geschuldet, auch wegen dem Format, denn damals wurden in neuen Rechnern meist 3,5 Zoll Laufwerke verbaut. Die waren nicht nur kleiner, die Laufwerke waren auch etwas billiger.

Dann stolperte ich darüber, dass Commodore Werbung machte, das die neue Floppy so schnell sei, weil sie im „Burstmodus“ 3.000 bzw. 5.200 Zeichen pro Sekunde übertrage und das mittels eines DMA Bausteins und ich beschloss, mich dem Thema doch etwas mehr zu nähern.

Natürlich ist eine Floppy langsam. Die Spurwechselzeiten betrugen zwischen 3 und 40 ms. Die mittleren Zugriffszeiten lagen anfangs bei 463 ms und sanken bei den „normalen“ Formaten zum Ende hin auf 95 ms ab. Dass eine Floppy im täglichen Einsatz so langsam war, lag aber eher am Betriebssystem. Wenn man in eine Datei schrieb, dann aktualisierte jedes Mal wenn ein Block voll war (das waren meist 1 bis 4 KByte) das Betriebssystem die Verzeichnisinformationen, die auf den äußersten Spuren lagen und diese dauernde Reise hin und her kostete so viel Zeit. Wer eine Diskette nur kopierte, der merkte das ein Disklaufwerk ganz schnell sein konnte, beim meinem System wurden dann 8 Spuren, so viel passten in den Speicher, in wenigen Sekunden eingelesen.

Schon damals beschäftigte ich mich mit den Floppies, wenn auch nur, um mehr als 40 bzw. später 80 Spuren zu nutzen – zwei, manchmal drei Spuren extra gingen nämlich drauf. Dazu musste man natürlich die Floppies selbst formatieren. Da stieß ich zum ersten Mal auf eine Eigenheit: den „Skew“. Die Sektoren waren nicht linear angeordnet, sondern bei meinem System in folgender Reihenfolge: 1,5,2,6,3,7,4,8,9.

Der Grund war relativ einleuchtend: Ein Sektor bestand nicht nur aus Nutzdaten. Es gab einige Verwaltungsinformationen, Prüfsummen etc., vor allem aber musste, nachdem ein Sektor lesen, oder geschrieben wurde, er verarbeitet werden. Der Normalfall war, dass das Betriebssystem einen festen Puffer für einen Sektor hatte und wenn ein Sektor in diesem Puffer war, so wurde er an die Stelle kopiert, wo er benötigt wurde. Eine Sequenz beim Z80-Prozessor dafür sah so aus:

    LD HL,Sektorpuffer
    LD DE,Zieladresse
    LD BC,Sektorlaenge
L1: LD A,(HL)
    LD (DE),A
    INC HL
    INC DE
    LD  A,B
    OR  C
    JP NZ,L1

Die Schleife L1 kopiert die Daten. Das Register A dient als Zwischenspeicher. Die meisten Befehle gehen dafür drauf, die Adressen zu inkrementieren und den Zähler zu dekrementieren und zu prüfen, ob der ganze Sektor kopiert ist. Diese Sequenz umfasst in der Schleife 71 Takte, mithin bei 512 Bytes und 4 MHz Takt 9 ms. Im 9 ms sind bei 300 U/Min und 6.250 Bytes pro Spur aber 284 Bytes am Schreib-/Lesekopf vorbeigeflogen. Die Lücke zwischen zwei Sektoren um dem Computer Zeit zu geben beträgt aber nur 103 Bytes. Beim 8080 dem Vorgänger des Z80 musste man damit leben. Der Z80 hat eine Spezialinstruktion, welche die obige Schleife ersetzt LDIR, die macht das in 21 Takten. Mithin schafft eine mit 3,8 MHz getaktete CPU, es gerade in der verfügbaren Zeit den Block zu kopieren. Dummerweise war es aber so das in meinem System alle Befehle auf ein vielfaches von 4 Takten gestreckt wurden, damit es keinen Zugriffskonflikt auf das Videoram gab. Das senkte den nominalen Takt von 4 auf 3,2 MHz ab. Das Programm war also mit dem Kopieren nicht fertig, als durch die Rotation mit 300 U/Min der nächste Sektor schon am Schreib-(Lesekopf vorbeikam, und verpasste diesen. Die versetzte Nummerierung glich dies zum Teil aus. Der nächste Sektor nach der 1 war die 5 und dann erst folgte die 2. So muste man nicht acht Sektoren warten, sondern nur zwei. Der Preis für diesen Skew von 2 war, das man für dass Einlesen einer Spur nicht eine sondern zwei Umdrehungen brauchte, die Datenrate also halbiert war.

Kleines Detail am Rande – die 16 Bitter hatten das gleiche Problem, nur bei Festplatten, die viel schneller rotierten. Die Platte in meinem Rechner war mit einem Skew von 3 formatiert worden. Ich experimentierte und merkte das man auch 2 nehmen konnte, wodurch die Lesegeschwindigkeit anstieg. Ein Skew von 1 war selbst mit meinem 10 MHz 80286 Rechner nicht möglich.

Nicht nur das – selbst das Einlesen eines Bytes vom FDC war für einen Mikroprozessor zeitkritisch: Hier die entsprechende Schleife für einen Z80:

    LD  HL,Sektoradr
    Ld  BC,Sektorlaenge
L1: In  A,(ADR1)  ; FDC Statusbyte lesen
    AND Mask      ; Bit maskieren
    JP  Z,L1      ; Wenn nicht gesetzt, Statusbye erneut holen
    In  A,(ADR2   ; Byte vom FDC lesen
    Ld (HL),A)    ; im Speicher ablegen
    Inc HL        ; auf nächste Adresse erhöhen
    Dec BC        ; Zahl der zu lesenden Bytes erniedrigen
    Ld  A,B       ; Vergleich ob BC=0
    or  C
    JP NZ,L1      ; wenn nein, dann nächstes Byte holen
    ret           ; zurück

Sie dauert 63 Takte. Es stehen maximal 32 Mikrosekunden zur Verfügung (in den Fällen, in denen der FDC noch Prüfsummen bilden, mus sogar nur 23 Mikrosekunden. Das macht bei 63 Takten einen minimalen Takt von 2 bzw. 2,7 MHz. Das schaffte eine gängige CPU noch. Die höheren Datenraten die ein Minifloppy (8 Zoll Format) oder später das HD-Format lieferten (die Zahl der Spuren und die Rotationsrate blieben konstant, aber die Bytes pro Spur stiegen von 6250 unformatiert auf 10.000 bzw. 12.500) aber nicht mehr. Erst recht macht so der Einsatz einer Festplatte keinen Sinn, denn sie würde nicht schneller als ein Diskettenlaufwerk sein. Auch hier kann man die Schleife durch einen Spezialbefehl des Z80 noch optimieren:

    LD  HL,Sektoradr  ; Sektoradresse
    Ld  B,Sektorlaenge mod 256 ; Low Byte Sektorlaenge
    ld  e,Sektorlaenge / 256 ; High Byte Sektrolaenge
    ld  c,ADR2    ; Adresse FDC Datenbyte
L1: In  A,(ADR1)  ; FDC Statusbyte lesen
    AND Mask      ; Bit maskieren
    JP  Z,L1      ; Wenn nicht gesetzt, Statusbye erneut holen
    Ini           ; Byte vom FDC lesen, in (HL) schreiben, B decrementieren
    JP NZ,L1      ; wenn b=0 dann nächstes Byte holen
    dec e         ; High Byte Sektorlaenge dekrementieren
    JP NZ,L1      ; wenn b=0 dann nächstes Byte holen
    ret           ; zurück


Diese Version braucht 40 Takte, wenn nur die innere Schleife durchlaufen wird (bei 255 von 256 Bytes), sonst 54 Takte. Noch schneller ginge es, wenn der Abruf des Datenbytes ohne Abruf des FDC Statusregisters gehen würde. Dann kann man den Befehl INIR einsetzen, der die innere Schleife auf 31 Takte reduziert. Das setzt aber eine Hardwareverschaltung voraus, die den Prozessor anhält, solange kein Byte anliegt. Doch selbst mit INIR wird eine Z80 nie mehr als 190 KByte bei 4 MHz Takt lesen können. Eine Festplatte, wie der damals populäre Type Seagate ST-225 (20 MB formatiert) übertrug aber schon 625 kbyte/s.

Es gab eine Lösung für noch höhere Geschwindigkeiten das war der beim C128 von Commodore erwähnte DMA-Baustein. In all den oberen Schleifen entfiel auf das Einlesen vom Port oder das Kopieren von einer Adresse zur anderen nur der kleinste Anteil der Zeit auf die Kopieraktion.

Ein spezialisierter Baustein, die DMA ist dabei viel schneller. Beim Kopieren im Speicher erreichte Z80A mit 4 Mhz folgende Geschwindigkeiten:

  • Mit den Befehlen des Intel 8080: 56.300 Bytes/s
  • Mit dem LDIR/LDDR Befehl: 190.000 Bytes/s
  • Mit der Z80A DMA: 2 Millionen Bytes pro Sekunde

Neben dem Kopieren von und zu schnellen Peripheriegeräten (Plattenlaufwerke, denkbar wären aber auch angeschlossene Silicondisks oder RAMDisks) kann man eine DMA auch zum Kopieren innerhalb des Speichers einsetzen, z.B. beim Bankswitching um Datenmengen zwischen den Banks schnell zu verschieben oder für das Verschieben im Grafikspeicher, z.B. beim Scrollen oder ziehen von waagerechten Linien / Füllmustern.

Leider wurde in fast allen Heimcomputern gespart, was die Ausstattung mit Peripheriebausteinen angeht. Jeder Mikroprozessorhersteller hatte eine Reihe von Zusatzbausteinen, die den Mikroprozessor unterstützten wie:

  • PIO: Parallel Input/Putput: Baustein mit mehreren Ports, die unabhängig vom Prozessor Eingaben und Ausgaben entgegennehmen. Wird benötigt für „langsame“ Ausgaben. Typische Anwendungen sind die Ausgabe auf den Drucker, Eingabe von Joystick oder Tastatur oder das Lesen/Schreiben auf den Kassettenrekorder.
  • SIO: Serial Input/Output: Baustein der Bytes als einzelne Bits in festen Datenraten überträgt, typisch verwendet für eine serielle Schnittstelle (Modems)
  • CTC: Counter/Clock/Timer: enthält programmierbare Zeitgeber, die nach Ablauf den Mikroprozessor durch Interrupt unterbrechen. Unentbehrlich für Echtzeitbetriebssysteme mit festen Zeitscheiben oder A/D D/A Wandlungen oder für die Erzeugung von Takten mit fester Frequenz, die nicht direkt durch Teilung des Haupttakts ableitbar sind.
  • DMA: Baustein für schnelle Datentransfers innerhalb des Systems

Von all den Bausteinen findet man, wenn man gängige Rechner aufschraubt, meist nur die PIO verbaut. Wird auch sie eingespart, dann ist meist ein ULA verbaut, denn würde der Prozessor auch noch die langsamen Geräte abfragen, er würde kein Programm mehr ausfuhren können. In Z80 Systemen übrigens (zumindest in denen die ich kenne) nicht die Z80 PIO, sondern das Intel Pendant 8255. Einfacher Grund: Die Z80 PIO hat zwei Paralellports, die 8255 drei wobei einer auch noch in zwei 4 Bit Ports (z.B. für zwei Joysticks) aufgeteilt werden kann. Manche Hersteller sparten dann auch noch den Videocontroller und Soundchip ein und integrierten die Funktion auch noch in ein ULA, so bei allen Sinclair 8 Bit Rechnern oder beim ORIC. Entsprechend zeigt sich, wenn man Preislisten dieser Zeit ansieht, eine Folge: Während die Mikroprozessoren laufend billiger wurden, blieb der Preis der Zusatzbausteine, obwohl die meistens technisch weniger komplex waren auf gleichem Niveau, weil die Nachfrage nur nach den CPUs viel größer war. In der Retroperspektive finde ich das etwas schade. Nicht alles ist sinnvoll. Zumindest in Deutschland mit den damaligen Regulationen der Post wird man nur wenige Einsatzmöglichkeiten für eine serielle Schnittstelle finden. Sie machte wohl eher einen Sinn, wenn man einen Drucker mit der seriellen Schnittstelle hat. Aber für einen programmierbaren Zähler, der in festgelegten Abständen ein Unterprogramm aufruft, fallen mir etliche Anwendungen ein. Vor allem der DMA-Chip hätte was genützt. Nicht nur weil man die Datentransferrate der Floppies (bei einem Skew von 2) so verdoppeln konnte, man hätte so erst die Möglichkeit für weitere leistungsfähige Peripherie geschaffen. Daneben kann man ihn für schnelle Kopieraktionen nutzen z.B. von einer Bank in die andere beim Bankswitching, beim Verschieben des Inhalts des Grafikspeichers (Scrollen), Linien Zeichnen, Füllen oder Bewegen von Spielfiguren. Das müssen nicht immer Blöcke sein. Die DMA hat auch einen Einzelbyte Modus. Selbst der ist aber mit 2 anstatt 14 Takten pro Byte noch deutlich schneller als die Z80 selbst.

Selbst RAM Disks sind so noch schneller. Denn eine RAM Disk hat die gleichen Einschränkungen, nur fällt die Wartezeit bei Skews oder bei Kopfbewegungen weg. Allerdings ist der Effekt kleiner. Den Unterschied von 190 kbyte/s zu 2 MByte/s merkt man bei einem Z80 System wo ein Programm maximal 64 KByte groß sein kann – mehr geht ja nicht in den adressierbaren Hauptspeicher nicht. Die RAM-Floppy sehe ich bei einem Z80 System als die die ideale Ergänzung an, auch weil man dann mit einem Floppylaufwerk auskam. Das Betriebssystem und Programme waren ja noch nicht so groß, als das man eine Festplatte brauchte. Ich hatte eine Speichererweiterung von Vortex in meinem System und das lief dann so ab: Nach dem Start von CP/M kopierte eine Batchdatei alles was ich zum Arbeiten benötigte – einige Dienstprogramme, Wordstar und Turbo Pascal in die RAM Disk. Danach kopierte ich von Hand die Sachen, die ich aktuell brauchte. Und bevor ich den Rechner ausschaltete dann wieder die geänderten Dateien zurück. Das habe ich nie vergessen. Schon ohne DMA war ohne Mechanik die Geschwindigkeit beeindruckend. Sie war ein Hauptgrund, warum ich mit dem Rechner bis 1993 gearbeitet habe.

Ich habe im CPC 6128 Artikel ja einen Benchmark aus der ct 1987 angeführt. In der Zeitschrift gab es auch Daten anderer Systeme. Das Speichern von 20 KByte in 1000 Zeilen dauerte ohne RAM Disk 16,5 sec, mit RAM Disk 2,38 s. Damit war der CPC schneller als jedes andere getestete System mit Diskettenlaufwerken, selbst teurere Rechner wie ein IBM AT, Amiga, Macintosh II und Atari ST wurden abgehängt. Selbst mit Festplatte waren nur wenige Systeme etwas schneller.

Dabei war Speicher billig. Als der CPC 6128 rauskam, kostete ein Floppy Disklaufwerk DS/SS etwa 360 DM, ein RAM Baustein von 256 KBit Größe dagegen 9,50 DM (Preis aus Anzeigen der ct 85/12). Das RAM für die 360 KByte die maximal auf eine Diskette formatiert draufgingen kostete also mit 104,5 DM weniger als ein Drittel des Laufwerks. Dafür kam man beim Arbeiten aber mit einem Laufwerk aus. So wäre, wenn der CPC 6128 als CP/M Rechner verkauft worden wäre, eine RAM-Aufrüstung auf 320 KByte (8 x 64 Kbit + 8 x 256 Kbit) oder gar 512 KByte ((16 x 256 KBit) sinnvoll gewesen – man hätte dann eine RAM-Floppy von 176 bzw. 448 KByte Größe gehabt. Die kleinere Floppy entspricht übrigens ziemlich genau der formatierten Kapazität des verbauten Diskettenlaufwerks von 180 KByte. Festplatten für den CPC erschienen dagegen erst relativ spät und waren ziemlich teuer. Bei CP/M für 8 Bit Rechner, das keine Verzeichnisse kennt, waren sie auch nicht sehr sinnvoll.

2 thoughts on “Ein spätes Loblied auf die Diskette

  1. Auch da eine Erweiterung für die 3,5 Diskette:
    Es gab auch noch die Floptical-Diskette: 3,5 Zoll, mechanisch kompatibel aber mit 20 Mb wesentlich mehr Speicherkapazität.
    War wie der Name sagt allerdings ein Flop!

  2. Es gab auch einen Trick, um 5,25 Zoll-Disketten mit 1,44 MB zu beschreiben. Man mußte das Laufwerk im BIOS nur als 3,5 Zoll anmelden. Dann wurden statt 15 Sektoren pro Spur 18 geschrieben. Allerdings konnte man dann 1,2 MB-Disketten nicht mehr ohne Weiteres lesen. Dazu mußte jedesmal das Laufwerk im BIOS wieder umgestellt werden, ein recht umständliches Verfahren.

    Dann gab es auch noch die LS 120 Disketten. Das Laufwerk konnte (mit etwas Glück) auch noch die normalen 3,5 Zoll-Disketten verarbeiten. Dabei war es durch höhere Drehzahl auch etwas schneller als ein normales Laufwerk. Allerdings nur bei großen Dateien. Bei vielen kleinen wurde es extrem langsam.

    Das konnte sich aber gegen die kurz danach aufkommenden CD-Brenner nicht durchsetzen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.