{"id":14470,"date":"2019-12-17T09:28:53","date_gmt":"2019-12-17T08:28:53","guid":{"rendered":"https:\/\/www.bernd-leitenberger.de\/blog\/?p=14470"},"modified":"2024-07-04T18:07:18","modified_gmt":"2024-07-04T16:07:18","slug":"ein-spaetes-loblied-auf-die-diskette","status":"publish","type":"post","link":"https:\/\/www.bernd-leitenberger.de\/blog\/2019\/12\/17\/ein-spaetes-loblied-auf-die-diskette\/","title":{"rendered":"Ein sp&auml;tes Loblied auf die Diskette"},"content":{"rendered":"<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_14470\" class=\"pvc_stats all  \" data-element-id=\"14470\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/www.bernd-leitenberger.de\/blog\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n<p>Nach dem Kassettenrekorder war sie das Speichermedium der meisten Computer in den Achtzigern und auch Ursache f&uuml;r manchen Frust \u2013 die Diskette.<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vg01.met.vgwort.de\/na\/38dbce294b0e4ba2b79ae850541c5fe0\" alt=\"\" width=\"1\" height=\"1\" \/><!--more--><\/p>\n<p>Die Diskette ist &auml;lter als die PC, sie wurde von IBM entwickelt, um leichter Softwareupdates auf Computer aufzuspielen. Sie war handlicher als Magnetb&auml;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&auml;ftigte, das war 1982 schon selten. 1975 hatte die Firma Shugart die Mikrofloppy entwickelt im handlicheren Format von 5,25 Zoll (heute m&uuml;sste man, nachdem &#8222;Verbrauchersch&uuml;tzer&#8220; das durchgesetzt haben, ja sie \u201e133,35 mm Diskette\u201c 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&uuml;lle und einem Metallshutter, die zwar keine <a href=\"https:\/\/www.bernd-leitenberger.de\/blog\/2012\/11\/21\/die-floppy-disk\/\">Floppy<\/a> (also biegsam) war, aber robuster. Fortschritte in der Technologie erlaubten inzwischen auch die gleiche Kapazit&auml;t wie bei den 5,25 Disks. Sp&auml;ter kamen noch die HD-Formate hinzu, die mit dem IBM AT und der PS\/2 Serie von IBM eingef&uuml;hrt wurden. Danach konnte kein weiterer Standard sich etablieren und die Diskette war auch f&uuml;r Softwareprogramme zu klein. Ich kann mich noch erinnern, dass ich als letztes Programm auf Disks mal Word Perfect f&uuml;r Windows installiert habe \u2013 das ganze Programm kam auf 24 Disketten. Etabliert haben sich nur wenige Standards:<\/p>\n<ul>\n<li>Single Sided, Single Density: 40 Spuren auf einer Seite, unformatierte Kapazit&auml;t 250 KByte<\/li>\n<li>Single Sided, Double Density: 80 Spuren auf einer Seite, unformatierte Kapazit&auml;t 500 KByte<\/li>\n<li>Double Sided, Single Density: 40 Spuren auf zwei Seiten, unformatierte Kapazit&auml;t 500 KByte<\/li>\n<li>Double Sided, Double Density: 80 Spuren auf zwei Seiten, unformatierte Kapazit&auml;t 1000 KByte<\/li>\n<\/ul>\n<p>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&auml;ten gab es dann noch die HD Format mit 1,6 MByte und 2 MByte unformatierter Kapazit&auml;t. Der letzte von IBM eingef&uuml;hrte Standard mit 4 MByte pro Diskette konnte sich nicht mehr durchsetzen.<\/p>\n<p>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&auml;t immer kleiner. Maximal konnte man auf einer Spur (6250 Bytes unformatiert) speichern:<\/p>\n<ul>\n<li>26 Sektoren \u00e0 128 Byte = 3.328 Byte<\/li>\n<li>16 Sektoren \u00e0 256 Byte = 4.096 Byte<\/li>\n<li>9 Sektoren \u00e0 512 Byte = 4.608 Byte<\/li>\n<li>5 Sektoren \u00e0 1024 Byte = 5.120 Byte<\/li>\n<\/ul>\n<p>Die ersten Disketten hatten nur 35 Spuren und waren hart sektoriert, das hei&szlig;t, es gab in der Mitte eine Spur mit eine Reihe von L&ouml;chern, die den Sektoranfang markierten. Mit einer Fotozelle, die auch den Spuranfang detektierte, konnte so der Anfang jedes Sektors erkannt werden. G&auml;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&uuml;r ihren Computer auf den Markt brachten.<\/p>\n<p>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&uuml;r die konnte man \u2013 zumindest wenn man einen Heimcomputer und keinen teuren Rechner hatte \u2013 genauso viel hinlegen wie f&uuml;r den Rechner mit Disketten selbst und auf eine 20 MB Festplatte, damals eine g&auml;ngige Gr&ouml;&szlig;e, passte auch nur der Inhalt von 30 Disketten.<\/p>\n<p>Als ich mich in den letzten Tagen mit den beiden letzten Artikeln besch&auml;ftigt habe, wurde ich wieder dran erinnert. Ich habe mich zuerst gewundert, warum der <a href=\"https:\/\/www.bernd-leitenberger.de\/blog\/2019\/12\/16\/der-commodore-c128-zu-viel-computer\/\">C128<\/a>, der 1985 erschien, noch eine 5,25 Zoll Diskettenstation hatte und diese Commodore-eigene L&ouml;sung mit einem eigenen Prozessor in der Floppy \u2013 wohlgemerkt zus&auml;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&auml;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.<\/p>\n<p>Dann stolperte ich dar&uuml;ber, dass Commodore Werbung machte, das die neue Floppy so schnell sei, weil sie im \u201eBurstmodus\u201c 3.000 bzw. 5.200 Zeichen pro Sekunde &uuml;bertrage und das mittels eines DMA Bausteins und ich beschloss, mich dem Thema doch etwas mehr zu n&auml;hern.<\/p>\n<p>Nat&uuml;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 \u201enormalen\u201c Formaten zum Ende hin auf 95 ms ab. Dass eine Floppy im t&auml;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 &auml;u&szlig;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.<\/p>\n<p>Schon damals besch&auml;ftigte ich mich mit den Floppies, wenn auch nur, um mehr als 40 bzw. sp&auml;ter 80 Spuren zu nutzen \u2013 zwei, manchmal drei Spuren extra gingen n&auml;mlich drauf. Dazu musste man nat&uuml;rlich die Floppies selbst formatieren. Da stie&szlig; ich zum ersten Mal auf eine Eigenheit: den \u201eSkew\u201c. Die Sektoren waren nicht linear angeordnet, sondern bei meinem System in folgender Reihenfolge: 1,5,2,6,3,7,4,8,9.<\/p>\n<p>Der Grund war relativ einleuchtend: Ein Sektor bestand nicht nur aus Nutzdaten. Es gab einige Verwaltungsinformationen, Pr&uuml;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&uuml;r einen Sektor hatte und wenn ein Sektor in diesem Puffer war, so wurde er an die Stelle kopiert, wo er ben&ouml;tigt wurde. Eine Sequenz beim Z80-Prozessor daf&uuml;r sah so aus:<\/p>\n<style type=\"text\/css\">\n<!-- body { color: #000000; background-color: #FFFFFF; } .general1-comment { color: #008000; font-style: italic; } .general1-identifier { color: #000000; } .general1-number { color: #0000FF; } .general1-operator { color: #008080; } .general1-predefined { color: #800000; } .general1-preprocessor { } .general1-reservedword { color: #FF0000; font-weight: bold; } .general1-space { } .general1-specialvariable { color: #800040; } .general1-string { color: #800080; } .general1-symbol { color: #000000; } --><br \/><\/style>\n<p><!--StartFragment--><\/p>\n<pre><code>    <span class=\"general1-reservedword\">LD<\/span> <span class=\"general1-operator\">HL<\/span><span class=\"general1-symbol\">,Sektorpuffer\r\n    <\/span><span class=\"general1-reservedword\">LD<\/span> <span class=\"general1-operator\">DE<\/span><span class=\"general1-symbol\">,Zieladresse\r\n    <\/span><span class=\"general1-reservedword\">LD<\/span> <span class=\"general1-operator\">BC<\/span><span class=\"general1-symbol\">,Sektorlaenge\r\nL1: <\/span><span class=\"general1-reservedword\">LD<\/span> <span class=\"general1-operator\">A<\/span><span class=\"general1-symbol\">,(<\/span><span class=\"general1-operator\">HL<\/span><span class=\"general1-symbol\">)\r\n    <\/span><span class=\"general1-reservedword\">LD<\/span><span class=\"general1-space\"> (<\/span><span class=\"general1-operator\">DE<\/span><span class=\"general1-symbol\">),<\/span><span class=\"general1-operator\">A\r\n<\/span>    <span class=\"general1-reservedword\">INC<\/span> <span class=\"general1-operator\">HL\r\n<\/span>    <span class=\"general1-reservedword\">INC<\/span> <span class=\"general1-operator\">DE\r\n<\/span>    <span class=\"general1-reservedword\">LD<\/span>  <span class=\"general1-operator\">A<\/span><span class=\"general1-symbol\">,<\/span><span class=\"general1-operator\">B\r\n<\/span>    <span class=\"general1-reservedword\">OR<\/span>  <span class=\"general1-operator\">C\r\n<\/span>    <span class=\"general1-reservedword\">JP<\/span> <span class=\"general1-operator\">NZ<\/span><span class=\"general1-symbol\">,L1\r\n<\/span><\/code><\/pre>\n<p><!--EndFragment--><\/p>\n<p>Die Schleife L1 kopiert die Daten. Das Register A dient als Zwischenspeicher. Die meisten Befehle gehen daf&uuml;r drauf, die Adressen zu inkrementieren und den Z&auml;hler zu dekrementieren und zu pr&uuml;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&uuml;cke zwischen zwei Sektoren um dem Computer Zeit zu geben betr&auml;gt aber nur 103 Bytes. Beim 8080 dem Vorg&auml;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&uuml;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&auml;chste Sektor schon am Schreib-(Lesekopf vorbeikam, und verpasste diesen. Die versetzte Nummerierung glich dies zum Teil aus. Der n&auml;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&uuml;r diesen Skew von 2 war, das man f&uuml;r dass Einlesen einer Spur nicht eine sondern zwei Umdrehungen brauchte, die Datenrate also halbiert war.<\/p>\n<p>Kleines Detail am Rande \u2013 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&ouml;glich.<\/p>\n<p>Nicht nur das \u2013 selbst das Einlesen eines Bytes vom FDC war f&uuml;r einen Mikroprozessor zeitkritisch: Hier die entsprechende Schleife f&uuml;r einen Z80:<\/p>\n<style type=\"text\/css\">\n<!-- body { color: #000000; background-color: #FFFFFF; } .general1-comment { color: #008000; font-style: italic; } .general1-identifier { color: #000000; } .general1-number { color: #0000FF; } .general1-operator { color: #008080; } .general1-predefined { color: #800000; } .general1-preprocessor { } .general1-reservedword { color: #FF0000; font-weight: bold; } .general1-space { } .general1-specialvariable { color: #800040; } .general1-string { color: #800080; } .general1-symbol { color: #000000; } --><br \/><\/style>\n<p><!--StartFragment--><\/p>\n<pre><code>    <span class=\"general1-reservedword\">LD<\/span>  <span class=\"general1-operator\">HL<\/span><span class=\"general1-symbol\">,Sektoradr\r\n    <\/span><span class=\"general1-reservedword\">Ld<\/span>  <span class=\"general1-operator\">BC<\/span><span class=\"general1-symbol\">,Sektorlaenge\r\nL1: <\/span><span class=\"general1-reservedword\">In<\/span>  <span class=\"general1-operator\">A<\/span><span class=\"general1-symbol\">,(ADR1)  <\/span><span class=\"general1-comment\">; FDC Statusbyte lesen\r\n<\/span>    <span class=\"general1-reservedword\">AND<\/span><span class=\"general1-space\"> Mask      <\/span><span class=\"general1-comment\">; Bit maskieren\r\n<\/span>    <span class=\"general1-reservedword\">JP<\/span>  <span class=\"general1-operator\">Z<\/span><span class=\"general1-symbol\">,L1      <\/span><span class=\"general1-comment\">; Wenn nicht gesetzt, Statusbye erneut holen\r\n<\/span>    <span class=\"general1-reservedword\">In<\/span>  <span class=\"general1-operator\">A<\/span><span class=\"general1-symbol\">,(ADR2   <\/span><span class=\"general1-comment\">; Byte vom FDC lesen\r\n<\/span>    <span class=\"general1-reservedword\">Ld<\/span><span class=\"general1-space\"> (<\/span><span class=\"general1-operator\">HL<\/span><span class=\"general1-symbol\">),<\/span><span class=\"general1-operator\">A<\/span><span class=\"general1-symbol\">)    <\/span><span class=\"general1-comment\">; im Speicher ablegen\r\n<\/span>    <span class=\"general1-reservedword\">Inc<\/span> <span class=\"general1-operator\">HL<\/span>        <span class=\"general1-comment\">; auf n\u00c3\u00a4chste Adresse erh\u00c3\u00b6hen\r\n<\/span>    <span class=\"general1-reservedword\">Dec<\/span> <span class=\"general1-operator\">BC<\/span>        <span class=\"general1-comment\">; Zahl der zu lesenden Bytes erniedrigen\r\n<\/span>    <span class=\"general1-reservedword\">Ld<\/span>  <span class=\"general1-operator\">A<\/span><span class=\"general1-symbol\">,<\/span><span class=\"general1-operator\">B<\/span>       <span class=\"general1-comment\">; Vergleich ob BC=0\r\n<\/span>    <span class=\"general1-reservedword\">or<\/span>  <span class=\"general1-operator\">C\r\n<\/span>    <span class=\"general1-reservedword\">JP<\/span> <span class=\"general1-operator\">NZ<\/span><span class=\"general1-symbol\">,L1      <\/span><span class=\"general1-comment\">; wenn nein, dann n\u00c3\u00a4chstes Byte holen\r\n<\/span>    <span class=\"general1-reservedword\">ret<\/span>           <span class=\"general1-comment\">; zur\u00c3\u00bcck\r\n<\/span><\/code><\/pre>\n<p>Sie dauert 63 Takte. Es stehen maximal 32 Mikrosekunden zur Verf&uuml;gung (in den F&auml;llen, in denen der FDC noch Pr&uuml;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&auml;ngige CPU noch. Die h&ouml;heren Datenraten die ein Minifloppy (8 Zoll Format) oder sp&auml;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&uuml;rde nicht schneller als ein Diskettenlaufwerk sein. Auch hier kann man die Schleife durch einen Spezialbefehl des Z80 noch optimieren:<\/p>\n<style type=\"text\/css\">\n<!-- body { color: #000000; background-color: #FFFFFF; } .general1-comment { color: #008000; font-style: italic; } .general1-identifier { color: #000000; } .general1-number { color: #0000FF; } .general1-operator { color: #008080; } .general1-predefined { color: #800000; } .general1-preprocessor { } .general1-reservedword { color: #FF0000; font-weight: bold; } .general1-space { } .general1-specialvariable { color: #800040; } .general1-string { color: #800080; } .general1-symbol { color: #000000; } --><br \/><\/style>\n<p><!--StartFragment--><\/p>\n<pre><code>    <span class=\"general1-reservedword\">LD<\/span>  <span class=\"general1-operator\">HL<\/span><span class=\"general1-symbol\">,Sektoradr  <\/span><span class=\"general1-comment\">; Sektoradresse\r\n<\/span>    <span class=\"general1-reservedword\">Ld<\/span>  <span class=\"general1-operator\">B<\/span><span class=\"general1-symbol\">,Sektorlaenge <\/span><span class=\"general1-predefined\">mod<\/span> <span class=\"general1-number\">256<\/span> <span class=\"general1-comment\">; Low Byte Sektorlaenge\r\n<\/span>    <span class=\"general1-reservedword\">ld<\/span>  <span class=\"general1-operator\">e<\/span><span class=\"general1-symbol\">,Sektorlaenge \/ <\/span><span class=\"general1-number\">256<\/span> <span class=\"general1-comment\">; High Byte Sektrolaenge\r\n<\/span>    <span class=\"general1-reservedword\">ld<\/span>  <span class=\"general1-operator\">c<\/span><span class=\"general1-symbol\">,ADR2    <\/span><span class=\"general1-comment\">; Adresse FDC Datenbyte\r\n<\/span><span class=\"general1-identifier\">L1: <\/span><span class=\"general1-reservedword\">In<\/span>  <span class=\"general1-operator\">A<\/span><span class=\"general1-symbol\">,(ADR1)  <\/span><span class=\"general1-comment\">; FDC Statusbyte lesen\r\n<\/span>    <span class=\"general1-reservedword\">AND<\/span><span class=\"general1-space\"> Mask      <\/span><span class=\"general1-comment\">; Bit maskieren\r\n<\/span>    <span class=\"general1-reservedword\">JP<\/span>  <span class=\"general1-operator\">Z<\/span><span class=\"general1-symbol\">,L1      <\/span><span class=\"general1-comment\">; Wenn nicht gesetzt, Statusbye erneut holen\r\n<\/span>    <span class=\"general1-reservedword\">Ini<\/span>           <span class=\"general1-comment\">; Byte vom FDC lesen, in (HL) schreiben, B decrementieren\r\n<\/span>    <span class=\"general1-reservedword\">JP<\/span> <span class=\"general1-operator\">NZ<\/span><span class=\"general1-symbol\">,L1      <\/span><span class=\"general1-comment\">; wenn b=0 dann n\u00c3\u00a4chstes Byte holen\r\n<\/span>    <span class=\"general1-reservedword\">dec<\/span> <span class=\"general1-operator\">e<\/span>         <span class=\"general1-comment\">; High Byte Sektorlaenge dekrementieren\r\n<\/span>    <span class=\"general1-reservedword\">JP<\/span> <span class=\"general1-operator\">NZ<\/span><span class=\"general1-symbol\">,L1      <\/span><span class=\"general1-comment\">; wenn b=0 dann n\u00c3\u00a4chstes Byte holen\r\n<\/span>    <span class=\"general1-reservedword\">ret<\/span>           <span class=\"general1-comment\">; zur\u00c3\u00bcck\r\n<\/span><\/code><\/pre>\n<p><!--EndFragment--><br \/>\nDiese 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&uuml;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&auml;lt, solange kein Byte anliegt. Doch selbst mit INIR wird eine Z80 nie mehr als 190 KByte bei 4 MHz Takt lesen k&ouml;nnen. Eine Festplatte, wie der damals popul&auml;re Type<a href=\"https:\/\/stason.org\/TULARC\/pc\/hard-drives-hdd\/seagate\/ST225-21MB-5-25-HH-MFM-ST412.html\"> Seagate ST-225<\/a> (20 MB formatiert) &uuml;bertrug aber schon 625 kbyte\/s.<\/p>\n<p>Es gab eine L&ouml;sung f&uuml;r noch h&ouml;here Geschwindigkeiten das war der beim C128 von Commodore erw&auml;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.<\/p>\n<p>Ein spezialisierter Baustein, die DMA ist dabei viel schneller. Beim Kopieren im Speicher erreichte Z80A mit 4 Mhz folgende Geschwindigkeiten:<\/p>\n<ul>\n<li>Mit den Befehlen des Intel 8080: 56.300 Bytes\/s<\/li>\n<li>Mit dem LDIR\/LDDR Befehl: 190.000 Bytes\/s<\/li>\n<li>Mit der Z80A DMA: 2 Millionen Bytes pro Sekunde<\/li>\n<\/ul>\n<p>Neben dem Kopieren von und zu schnellen Peripherieger&auml;ten (Plattenlaufwerke, denkbar w&auml;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&uuml;r das Verschieben im Grafikspeicher, z.B. beim Scrollen oder ziehen von waagerechten Linien \/ F&uuml;llmustern.<\/p>\n<p>Leider wurde in fast allen Heimcomputern gespart, was die Ausstattung mit Peripheriebausteinen angeht. Jeder Mikroprozessorhersteller hatte eine Reihe von Zusatzbausteinen, die den Mikroprozessor unterst&uuml;tzten wie:<\/p>\n<ul>\n<li>PIO: Parallel Input\/Putput: Baustein mit mehreren Ports, die unabh&auml;ngig vom Prozessor Eingaben und Ausgaben entgegennehmen. Wird ben&ouml;tigt f&uuml;r \u201elangsame\u201c Ausgaben. Typische Anwendungen sind die Ausgabe auf den Drucker, Eingabe von Joystick oder Tastatur oder das Lesen\/Schreiben auf den Kassettenrekorder.<\/li>\n<li>SIO: Serial Input\/Output: Baustein der Bytes als einzelne Bits in festen Datenraten &uuml;bertr&auml;gt, typisch verwendet f&uuml;r eine serielle Schnittstelle (Modems)<\/li>\n<li>CTC: Counter\/Clock\/Timer: enth&auml;lt programmierbare Zeitgeber, die nach Ablauf den Mikroprozessor durch Interrupt unterbrechen. Unentbehrlich f&uuml;r Echtzeitbetriebssysteme mit festen Zeitscheiben oder A\/D D\/A Wandlungen oder f&uuml;r die Erzeugung von Takten mit fester Frequenz, die nicht direkt durch Teilung des Haupttakts ableitbar sind.<\/li>\n<li>DMA: Baustein f&uuml;r schnelle Datentransfers innerhalb des Systems<\/li>\n<\/ul>\n<p>Von all den Bausteinen findet man, wenn man g&auml;ngige Rechner aufschraubt, meist nur die PIO verbaut. Wird auch sie eingespart, dann ist meist ein ULA verbaut, denn w&uuml;rde der Prozessor auch noch die langsamen Ger&auml;te abfragen, er w&uuml;rde kein Programm mehr ausfuhren k&ouml;nnen. In Z80 Systemen &uuml;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&uuml;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&auml;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&ouml;&szlig;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&ouml;glichkeiten f&uuml;r eine serielle Schnittstelle finden. Sie machte wohl eher einen Sinn, wenn man einen Drucker mit der seriellen Schnittstelle hat. Aber f&uuml;r einen programmierbaren Z&auml;hler, der in festgelegten Abst&auml;nden ein Unterprogramm aufruft, fallen mir etliche Anwendungen ein. Vor allem der DMA-Chip h&auml;tte was gen&uuml;tzt. Nicht nur weil man die Datentransferrate der Floppies (bei einem Skew von 2) so verdoppeln konnte, man h&auml;tte so erst die M&ouml;glichkeit f&uuml;r weitere leistungsf&auml;hige Peripherie geschaffen. Daneben kann man ihn f&uuml;r schnelle Kopieraktionen nutzen z.B. von einer Bank in die andere beim Bankswitching, beim Verschieben des Inhalts des Grafikspeichers (Scrollen), Linien Zeichnen, F&uuml;llen oder Bewegen von Spielfiguren. Das m&uuml;ssen nicht immer Bl&ouml;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.<\/p>\n<p>Selbst RAM Disks sind so noch schneller. Denn eine RAM Disk hat die gleichen Einschr&auml;nkungen, nur f&auml;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&szlig; sein kann \u2013 mehr geht ja nicht in den adressierbaren Hauptspeicher nicht. Die RAM-Floppy sehe ich bei einem Z80 System als die die ideale Erg&auml;nzung an, auch weil man dann mit einem Floppylaufwerk auskam. Das Betriebssystem und Programme waren ja noch nicht so gro&szlig;, 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&ouml;tigte \u2013 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&auml;nderten Dateien zur&uuml;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.<\/p>\n<p>Ich habe im<a href=\"https:\/\/www.bernd-leitenberger.de\/blog\/2019\/12\/13\/der-schneider-amstrad-cpc-6128-und-das-joyce-man-haette-mehr-draus-machen-koennen\/\"> CPC 6128 Artikel<\/a> ja einen Benchmark aus der ct 1987 angef&uuml;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&auml;ngt. Selbst mit Festplatte waren nur wenige Systeme etwas schneller.<\/p>\n<p>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&ouml;&szlig;e dagegen 9,50 DM (Preis aus Anzeigen der ct 85\/12). Das RAM f&uuml;r die 360 KByte die maximal auf eine Diskette formatiert draufgingen kostete also mit 104,5 DM weniger als ein Drittel des Laufwerks. Daf&uuml;r kam man beim Arbeiten aber mit einem Laufwerk aus. So w&auml;re, wenn der CPC 6128 als CP\/M Rechner verkauft worden w&auml;re, eine RAM-Aufr&uuml;stung auf 320 KByte (8 x 64 Kbit + 8 x 256 Kbit) oder gar 512 KByte ((16 x 256 KBit) sinnvoll gewesen \u2013 man h&auml;tte dann eine RAM-Floppy von 176 bzw. 448 KByte Gr&ouml;&szlig;e gehabt. Die kleinere Floppy entspricht &uuml;brigens ziemlich genau der formatierten Kapazit&auml;t des verbauten Diskettenlaufwerks von 180 KByte. Festplatten f&uuml;r den CPC erschienen dagegen erst relativ sp&auml;t und waren ziemlich teuer. Bei CP\/M f&uuml;r 8 Bit Rechner, das keine Verzeichnisse kennt, waren sie auch nicht sehr sinnvoll.<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_14470\" class=\"pvc_stats all  \" data-element-id=\"14470\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/www.bernd-leitenberger.de\/blog\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n<p>Nach dem Kassettenrekorder war sie das Speichermedium der meisten Computer in den Achtzigern und auch Ursache f&uuml;r manchen Frust \u2013 die Diskette.<\/p>\n","protected":false},"author":169,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4],"tags":[4436,4437,2981,1713],"class_list":["post-14470","post","type-post","status-publish","format-standard","hentry","category-computer","tag-dma","tag-floppy","tag-floppy-disk","tag-z80","entry"],"a3_pvc":{"activated":true,"total_views":902,"today_views":0},"jetpack-related-posts":[{"id":18380,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2025\/09\/03\/die-glorreichen-10-das-war-mal-weg-pc-hardware\/","url_meta":{"origin":14470,"position":0},"title":"Die glorreichen 10 &#8211; Das war mal weg: PC Hardware","author":"Bernd Leitenberger","date":"3. September 2025","format":false,"excerpt":"Ich will heute mal zwei ZDF Info \/ Neo Sendungen verbinden. Die glorreichen 10, die bei mir als Vorlage f\u00fcr einige Blogs dienten und die von mir noch mehr gesch\u00e4tzte Sendung \"Das war mal weg\", wo es um Dinge geht, die fr\u00fcher fast jeder hatte und die heute aus unserem\u2026","rel":"","context":"In &quot;Die Glorreichen 10&quot;","block_context":{"text":"Die Glorreichen 10","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/allgemein\/die-glorreichen-10\/"},"img":{"alt_text":"","src":"https:\/\/vg02.met.vgwort.de\/na\/876c61d389304d98aa0332fadd769381","width":350,"height":200},"classes":[]},{"id":18610,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/03\/27\/galileos-cds-teil-1\/","url_meta":{"origin":14470,"position":1},"title":"Galileos CDS &#8211; Teil 1","author":"Bernd Leitenberger","date":"27. M\u00e4rz 2026","format":false,"excerpt":"Hall\u00f6chen, es wird Zeit das ich mich mal wieder melde. Es gab zwei Gr\u00fcnde, warum ich mich so rar gemacht habe. Das eine ist das es gerade nicht so viel aktuelles gibt, au\u00dfer einem Update zu Artemis, zu dem ich vielleicht noch etwas schreibe. W\u00e4hrend Trump das ganze Programm nach\u2026","rel":"","context":"In &quot;Raumfahrt&quot;","block_context":{"text":"Raumfahrt","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/raumfahrt\/"},"img":{"alt_text":"","src":"https:\/\/vg07.met.vgwort.de\/na\/4fb81c7bafbd4d9d88b5695abdb33d29","width":350,"height":200},"classes":[]},{"id":18683,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/06\/01\/die-glorreichen-10-programmiersprachen-2\/","url_meta":{"origin":14470,"position":2},"title":"Die glorreichen 10 \u2013 Programmiersprachen (2)","author":"Bernd Leitenberger","date":"1. Juni 2026","format":false,"excerpt":"Der heutige Teil schlie\u00dft nahtlos an den ersten Teil an, der gestern erschien. Es geht um 10 Kriterien anhand derer man Programmiersprachen kategorisieren kann. Maschinennah oder universell, aber komplex Als eine maschinennahe Sprache bezeichnet man eine Sprache, die nahe den M\u00f6glichkeiten von Prozessoren ist. Das Paradebeispiel ist C. Alle Prozessoren\u2026","rel":"","context":"In &quot;Die Glorreichen 10&quot;","block_context":{"text":"Die Glorreichen 10","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/allgemein\/die-glorreichen-10\/"},"img":{"alt_text":"","src":"https:\/\/vg09.met.vgwort.de\/na\/7f5d9cf5265047179df05b778bf455b5","width":350,"height":200},"classes":[]},{"id":18612,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/03\/28\/galileos-cds-teil-2\/","url_meta":{"origin":14470,"position":3},"title":"Galileos CDS \u2013 Teil 2","author":"Bernd Leitenberger","date":"28. M\u00e4rz 2026","format":false,"excerpt":"So, heute geht es weiter mit Teil 2 \u00fcber Galileos CDS, dieser Beitrag schlie\u00dft nahtlos an den ersten Beitrag von gestern an, wie man schon an der ersten Textzeile sieht. Nach der Einleitung im ersten Teil geht es heute weiter damit warum der RCA 1802 genutzt wurde und was seine\u2026","rel":"","context":"In &quot;Raumfahrt&quot;","block_context":{"text":"Raumfahrt","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/raumfahrt\/"},"img":{"alt_text":"","src":"https:\/\/vg07.met.vgwort.de\/na\/191e4b0728de42829cf656027b84dc82","width":350,"height":200},"classes":[]},{"id":14020,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2019\/06\/15\/was-waere-wenn-es-wernher-von-braun-nicht-gegeben-haette\/","url_meta":{"origin":14470,"position":4},"title":"Was w&auml;re wenn \u2013 es Wernher von Braun nicht gegeben h&auml;tte?","author":"Bernd Leitenberger","date":"15. Juni 2019","format":false,"excerpt":"In f\u00fcnf Wochen j\u00e4hrt sich das 50-ste Jubil\u00e4um von Apollo 11. Dann laufen wieder viele Dokus \u00fcber den Wettlauf im All und auch wieder welche um Wernher von Braun. Um ihn kommt man ja nicht herum. Denn er hat nicht nur die Saturn V entwickelt, sondern auch die Raketen, die\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/vg02.met.vgwort.de\/na\/208c56f98e0247c0aeecd2575afa1d16","width":350,"height":200},"classes":[]},{"id":14114,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2019\/07\/19\/apollo-jubilaeen-im-wandel-der-zeiten\/","url_meta":{"origin":14470,"position":5},"title":"Apollo Jubil&auml;en im Wandel der Zeiten","author":"Bernd Leitenberger","date":"19. Juli 2019","format":false,"excerpt":"Als ich mir mal die Sendungen anschaute die derzeit zum 50-sten Jubil\u00e4um der Landung von Apollo 11 kamen fielen mir Unterschiede auf. Nat\u00fcrlich legt man zu jedem Zeitpunkt den Wert auf andere Dinge, man hat aber auch eine andere Sicht, weil man historische Ereignisse anders, aus der Sicht von \u201ejetzt\u201c\u2026","rel":"","context":"In &quot;Raumfahrt&quot;","block_context":{"text":"Raumfahrt","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/raumfahrt\/"},"img":{"alt_text":"","src":"https:\/\/vg07.met.vgwort.de\/na\/dcdc7b57dc4f40ada4b4433d4ee21d14","width":350,"height":200},"classes":[]}],"jetpack_sharing_enabled":true,"amp_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/posts\/14470","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/users\/169"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/comments?post=14470"}],"version-history":[{"count":0,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/posts\/14470\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/media?parent=14470"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/categories?post=14470"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/tags?post=14470"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}