{"id":16061,"date":"2022-09-05T00:53:24","date_gmt":"2022-09-04T22:53:24","guid":{"rendered":"https:\/\/www.bernd-leitenberger.de\/blog\/?p=16061"},"modified":"2022-09-05T07:21:44","modified_gmt":"2022-09-05T05:21:44","slug":"wie-schnell-sind-voyagers-bordcomputer","status":"publish","type":"post","link":"https:\/\/www.bernd-leitenberger.de\/blog\/2022\/09\/05\/wie-schnell-sind-voyagers-bordcomputer\/","title":{"rendered":"Wie schnell sind Voyagers Bordcomputer?"},"content":{"rendered":"<p>Heute vor genau 45 Jahren startete Voyager 1. Wir der regelm&auml;&szlig;ige Blogleser wei&szlig; arbeite ich seit drei Monaten an einem Buch &uuml;ber die Sonden. Ich hatte mir vorgenommen zu dem Startdatum fertig zu werden, was ehrgeizig war. Das habe ich auch geschafft \u2013 es muss nur noch korrekturgelesen werden. Ich bin das ganze Buch mindestens einmal durchgegangen und die Korrekturleser sind bei etwa der H&auml;lfte angekommen. Ich habe aber auch das Unternehmen untersch&auml;tzt. Anfangs dachte ich das ich so bei 400 Seiten lande, dann wurden es 500 und derzeit sind es 588 Seiten. Davon sind aber rund 250 &uuml;ber die Vorgeschichte und Grundlagen (Swing-By, Vorherige Erforschung der Gasriesen, Pioneer und TOPS Sonden) und Nachfolger (Galileo bis Juno).<\/p>\n<p>Derzeit k&uuml;rze ich eher etwas. Es fallen mir zahlreiche Wiederholungen auf und ich habe zwei gr&ouml;&szlig;ere Teile entdeckt die hier in den Blog passen, aber nicht so sehr ins Buch. Den ersten davon gibt es heute. Der zweite ist Teil der Geschichte um die <a href=\"https:\/\/www.bernd-leitenberger.de\/Voyager-Golden-Record.shtml\">Golden Record<\/a>. &Uuml;ber sie gibt es nun auch den Buchtext in der Website, da ich als an den Sonden interessierter dieses Kapitel bisher stiefm&uuml;tterlich behandelt habe. Ebenso habe ich aus dem gleichen Grund das Kapitel &uuml;ber die <a href=\"https:\/\/www.bernd-leitenberger.de\/TOPS.shtml\">TOPS Sonden<\/a> ausgekoppelt. Als dritten neuen Aufsatz findet ihr (ohne Text) alle von Mastertape der Golden Record ausgelesenen <a href=\"https:\/\/www.bernd-leitenberger.de\/Voyager-golden-Record-Images.shtml\">Bilder<\/a>.<!--more--><\/p>\n<p>Das Thema des heutigen Artikels ist so etwas was wohl mich, aber kaum jemand sonst interessiert. Es geht um die Geschwindigkeit der Bordcomputer eingeordnet in die damalige Zeit. Hier zuerst mal der Text aus dem Buch:<\/p>\n<p>Als Voyager startete, waren Computer noch nicht in die Haushalte eingezogen. Der erste \u201ePC\u201c, der Altair 8800, erschient 1975. Bei ihm musste man Bytes &uuml;ber Kippschalter eingeben. Im selben Jahr, in dem Voyager startete, erschienen die ersten Computer mit Tastatur und Fernsehanschluss, die man einfach einschalten und programmieren konnte. Das waren der Commodore PET, das TRS-Modell I und der Apple II. Entsprechend gab es damals von der NASA keine Information, wie schnell Voyagers Bordrechner waren. Da sie nicht aus Mikroprozessoren bestanden, ist ein Vergleich schwer. Von allen drei Rechnern gibt es aber eine Angabe &uuml;ber die Zykluszeit:<\/p>\n<table width=\"100%\" cellspacing=\"0\" cellpadding=\"2\">\n<tbody>\n<tr valign=\"top\">\n<th bgcolor=\"#cccccc\" width=\"13%\">\n<p class=\"western\">Prozessor<\/p>\n<\/th>\n<th bgcolor=\"#cccccc\" width=\"31%\">\n<p class=\"western\">Zykluszeit<\/p>\n<\/th>\n<th bgcolor=\"#cccccc\" width=\"31%\">\n<p class=\"western\">Takt (bei Voyager gesch&auml;tzt)<\/p>\n<\/th>\n<th bgcolor=\"#cccccc\" width=\"12%\">\n<p class=\"western\">Befehle\/s<\/p>\n<\/th>\n<th bgcolor=\"#cccccc\" width=\"13%\">\n<p class=\"western\">Architektur<\/p>\n<\/th>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"13%\">\n<p class=\"western\">CCS<\/p>\n<\/td>\n<td width=\"31%\">\n<p class=\"western\">88 Mikrosekunden<\/p>\n<\/td>\n<td width=\"31%\">\n<p class=\"western\">0,2 bis 0,25 MHz<\/p>\n<\/td>\n<td width=\"12%\">\n<p class=\"western\">11.000<\/p>\n<\/td>\n<td width=\"13%\">\n<p class=\"western\">18 Bit MSI<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"13%\">\n<p class=\"western\">FDS<\/p>\n<\/td>\n<td width=\"31%\">\n<p class=\"western\">12 Mikrosekunden<\/p>\n<\/td>\n<td width=\"31%\">\n<p class=\"western\">0,4 bis 0,73 MHz<\/p>\n<\/td>\n<td width=\"12%\">\n<p class=\"western\">80.000<\/p>\n<\/td>\n<td width=\"13%\">\n<p class=\"western\">16 Bit MSI<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"13%\">\n<p class=\"western\">AACS<\/p>\n<\/td>\n<td width=\"31%\">\n<p class=\"western\">28 bzw. 32,2 Mikrosekunden<\/p>\n<\/td>\n<td width=\"31%\">\n<p class=\"western\">0,2 MHz<\/p>\n<\/td>\n<td width=\"12%\">\n<p class=\"western\">35.000<\/p>\n<\/td>\n<td width=\"13%\">\n<p class=\"western\">18 Bit MSI<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"13%\">\n<p class=\"western\">6502<\/p>\n<\/td>\n<td width=\"31%\">\n<p class=\"western\">1 Mikrosekunde<\/p>\n<\/td>\n<td width=\"31%\">\n<p class=\"western\">1 MHz<\/p>\n<\/td>\n<td width=\"12%\">\n<p class=\"western\">250.000<\/p>\n<\/td>\n<td width=\"13%\">\n<p class=\"western\">8 Bit LSI<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"13%\">\n<p class=\"western\">8080 \/ Z80<\/p>\n<\/td>\n<td width=\"31%\">\n<p class=\"western\">1,6 Mikrosekunden<\/p>\n<\/td>\n<td width=\"31%\">\n<p class=\"western\">2,5 MHz<\/p>\n<\/td>\n<td width=\"12%\">\n<p class=\"western\">367.000<\/p>\n<\/td>\n<td width=\"13%\">\n<p class=\"western\">8 Bit LSI<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"13%\">\n<p class=\"western\">RCA 1802<\/p>\n<\/td>\n<td width=\"31%\">\n<p class=\"western\">5 Mikrosekunden<\/p>\n<\/td>\n<td width=\"31%\">\n<p class=\"western\">1,6 MHz<\/p>\n<\/td>\n<td width=\"12%\">\n<p class=\"western\">160.000<\/p>\n<\/td>\n<td width=\"13%\">\n<p class=\"western\">8 Bit LSI<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"13%\">\n<p class=\"western\">AMD 2900<\/p>\n<\/td>\n<td width=\"31%\">\n<p class=\"western\">1,25 Mikrosekunden<\/p>\n<\/td>\n<td width=\"31%\">\n<p class=\"western\">4 MHz<\/p>\n<\/td>\n<td width=\"12%\">\n<p class=\"western\">143.000<\/p>\n<\/td>\n<td width=\"13%\">\n<p class=\"western\">16 Bit LSI<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Die Zykluszeit ist die Zeit, welche die CPU f&uuml;r eine einfache Operation ben&ouml;tigt. Komplexe Operationen erfordern mehrere Zyklen. Bei der Z80 betr&auml;gt die Ausf&uuml;hrungszeit bei einfachen Operationen vier Takte (einen Zyklus). Bei komplexen Operationen k&ouml;nnen es bis zu 23 Takte (sieben Zyklen) sein. Im Mittel sind es 6,8 Takte pro Instruktion.<\/p>\n<p>F&uuml;r die Zykluszeit des CCS gibt es zwei Angaben. Einmal 1,37 Mikrosekunden und einmal 88 bis 90 Mikrosekunden. Die letztere war angesichts dessen, dass das CCS aus dem Viking Bordcomputer (der ebenfalls 88 Mikrosekunden Zykluszeit hat) entwickelt wurde, wahrscheinlicher. Ich vermute, man hat hier zwei Dinge verwechselt: die Zykluszeit mit dem Takt und das FDS mit dem CCS. F&uuml;r das FDS w&auml;re ein Takt von 0,73 MHz (1 \/ 1,37 \u00b5s) plausibel, eine Instruktion w&uuml;rde dann 8 oder 9 Takte erfordern, davon alleine 4 f&uuml;r den Speicherzugriff.<\/p>\n<p>F&uuml;r das FDS gibt es eine Angabe &uuml;ber die durchgef&uuml;hrten Befehle: 80.000\/s. Im Vergleich dazu lag ein 8080\/Z80 Prozessor, mit den beim Start von Voyager &uuml;blichen 2,5 MHz Takt, bei 360.000 Befehlen\/s. Ein 6502 mit 1 MHz Takt lag bei 250.000 Befehlen\/s. Das ber&uuml;cksichtigt aber nicht, das die Voyager-Computer 16 oder 18 Bit Rechner waren und welchen Befehlsvorrat sie hatten. Die 16\/18 Bit bieten einen Vorteil gegen&uuml;ber den damals etablierten 8-Bit-Architekturen. Die Befehle aller drei Computersysteme waren einfach und auf ihre Aufgabe zugeschnitten. Heute w&uuml;rde man sie als Mikrocontroller bezeichnen, also als Prozessoren, die direkt mit der Hardware agieren. Ich denke, dass selbst das FDS einem damals aktuellen 8 Bit Mikroprozessor unterlegen war. Das verwundert nicht, schlie&szlig;lich wurden sie schon Jahre vorher entwickelt.<\/p>\n<p>Den Mikroprozessor RCA 1802 und den Bit-Slice-Prozesor AMD 2900 habe ich hinzugenommen, weil diese Prozessoren in Galileo eingesetzt wurden. Der RCA 1802 ist ein 8 Bit Mikroprozessor wie der Z80 und 6502, aber in CMOS Technologie. Der AMD 2900 ist ein Bit-Slice Prozessor. Er verarbeitet nur vier Bits, kann aber kombiniert werden. Vier AMD 2900 wurden genutzt, um einen 16-Bit-Prozessor f&uuml;r Galileos AACS zu schaffen. In Galileo war die Geschwindigkeit durch den langsamen Speicher begrenzt. Mit ad&auml;quatem Speicher w&auml;re der Rechner &uuml;ber 1 MIPS schnell gewesen. Galileo war die erste Raumsonde, die Mikroprozessoren einsetzte. Da bei Galileo auch die meisten Experimente einen eigenen Mikroprozessor und RAM\/ROM hatten, gab es insgesamt 19 Mikroprozessoren, 320 KByte RAM und 41 KByte ROM.<\/p>\n<p>Der Vergleich ist allerdings unfair, da Voyager nur die Technologie einsetzen konnte, die bei Projektbeginn existierte. Alle Mikroprozessoren erschienen sp&auml;ter. Der einzige Mikroprozessor, der damals existierte, war der Intel 4004. Das war ein 4-Bit-Prozessor, der maximal 60.000 Befehle\/s abarbeitete \u2013 doch das waren 4-Bit-Befehle. F&uuml;r die Verarbeitung von 16 oder 18 Bit, wie beim FDS und CCS\/AACS, muss ein 4 Bit Prozessor vier bis f&uuml;nf Zugriffe durchf&uuml;hren. Das reduziert die Geschwindigkeit auf ein Viertel bis ein F&uuml;nftel. Zudem haben die Computer von Voyager mehr Register, die Speicherzugriffe ersparen und die Befehle sind m&auml;chtiger. Au&szlig;erdem war der Adressbereich des 4004 von 640 Byte RAM und 4 KByte ROM zu klein, um ihn einsetzen zu k&ouml;nnen.<\/p>\n<table width=\"100%\" cellspacing=\"0\" cellpadding=\"2\">\n<tbody>\n<tr valign=\"top\">\n<th bgcolor=\"#cccccc\" width=\"12%\">\n<p class=\"western\">Computer<\/p>\n<\/th>\n<th bgcolor=\"#cccccc\" width=\"10%\">\n<p class=\"western\">Bitbreite<\/p>\n<\/th>\n<th bgcolor=\"#cccccc\" width=\"14%\">\n<p class=\"western\">Speicher<\/p>\n<\/th>\n<th bgcolor=\"#cccccc\" width=\"14%\">\n<p class=\"western\">In KByte<\/p>\n<\/th>\n<th bgcolor=\"#cccccc\" width=\"17%\">\n<p class=\"western\">Befehle\/s<\/p>\n<\/th>\n<th bgcolor=\"#cccccc\" width=\"20%\">\n<p class=\"western\">Stromverbrauch<\/p>\n<\/th>\n<th bgcolor=\"#cccccc\" width=\"14%\">\n<p class=\"western\">Gewicht<\/p>\n<\/th>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"12%\">\n<p class=\"western\">CCS<\/p>\n<\/td>\n<td width=\"10%\">\n<p class=\"western\">18 Bit<\/p>\n<\/td>\n<td width=\"14%\">\n<p class=\"western\">4 KWorte<\/p>\n<\/td>\n<td width=\"14%\">\n<p class=\"western\">9 KByte<\/p>\n<\/td>\n<td width=\"17%\">\n<p class=\"western\">Max. 11.000<\/p>\n<\/td>\n<td width=\"20%\">\n<p class=\"western\">24,7 Watt<\/p>\n<\/td>\n<td width=\"14%\">\n<p class=\"western\">15,2 kg<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"12%\">\n<p class=\"western\">AACS<\/p>\n<\/td>\n<td width=\"10%\">\n<p class=\"western\">18 Bit<\/p>\n<\/td>\n<td width=\"14%\">\n<p class=\"western\">4 KWorte<\/p>\n<\/td>\n<td width=\"14%\">\n<p class=\"western\">9 KByte<\/p>\n<\/td>\n<td width=\"17%\">\n<p class=\"western\">Max. 35.000<\/p>\n<\/td>\n<td width=\"20%\">\n<p class=\"western\">54 Watt<\/p>\n<\/td>\n<td width=\"14%\">\n<p class=\"western\">49,5 kg<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"12%\">\n<p class=\"western\">FDS<\/p>\n<\/td>\n<td width=\"10%\">\n<p class=\"western\">16 Bit<\/p>\n<\/td>\n<td width=\"14%\">\n<p class=\"western\">8 KWorte<\/p>\n<\/td>\n<td width=\"14%\">\n<p class=\"western\">16 KByte<\/p>\n<\/td>\n<td width=\"17%\">\n<p class=\"western\">Max. 80.000<\/p>\n<\/td>\n<td width=\"20%\">\n<p class=\"western\">9,9 Watt<\/p>\n<\/td>\n<td width=\"14%\">\n<p class=\"western\">19,3 kg<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Beim Stromverbrauch und dem Gewicht ist zu ber&uuml;cksichtigen, das an die Computer Hardware angeschlossen war, die zum System z&auml;hlte. Beim AACS z.\u00a0B. die Sensoren, Schrittmotoren und die Gyroskope. Alle Rechner zusammen haben einen Speicher von 68 KByte, aufteilbar in RAM und ROM.<\/p>\n<p>Soweit der Text aus dem Buch. Nun eine Erg&auml;nzung. Ich habe nachgedacht und man kann die Geschwindigkeit auch direkt angeben und zwar anhand einer aufgabe. Das FDS war ausgelegt die Kameras ausgelesen. Seine Geschwindigkeit bestimmte die Datenrate, so war die maximale Datenrate zum Bandrekorder dieselbe wie die maximale zur Erde, was daf&uuml;r spricht, dass dies die Grenze des FDS ist, denn es gab vorher schon schnellere Bandrekorder bei Viking und auch Galileo konnte schneller auf den Rekorde speichern als zur Erde &uuml;bertragen. Was musste das FDS beim Auslesen der Kameras machen? Nach meinen Recherchen ist es so, das es die Elektronik ansto&szlig;en musste eine Zeile auszulesen. Die legte dazu &uuml;ber DMA in einem bestimmten Speicherbereich die digitalisieren Pixel ab. Das FDS musste diese getaktet auslesen, also eine kleine Schleife von einer definierten Dauer durchlaufen. Dann musste es die Daten selbst sichern. Daf&uuml;r gibt es (wie &uuml;brigens auch f&uuml;r das Einlesen) zwei Optionen \u2013 als I\/O Zugriff wird ein Wert an einen Port zum Sendesystem geschrieben oder es landet erneut in einem Datenblock, der dann komplett an das Sendesystem &uuml;bergeben wird., Nach Beschreibung der Kompression f&uuml;r das Uranusencounter gehe ich davon aus, das die zweite L&ouml;sung gew&auml;hlt wird. Das FDS scheint &uuml;ber memory-mapped I\/O zu arbeiten. Dann kann man aber den Code f&uuml;r diese Schleife formulieren. Ich habe dies hier zweimal gemacht. Einmal in Pseudo-Assembler f&uuml;r alle Leser und einmal in der Maschinensprache des Z80, wobei ich spezielle Z80 (Nicht-8080) Befehle die die Aufgabe noch beschleunigen vermieden habe. Wer 8080 Code aber mal geschrieben hat, wei&szlig; warum ich die kryptischen 8080 Mneorics vermeide.<\/p>\n<table width=\"100%\" cellspacing=\"0\" cellpadding=\"4\">\n<tbody>\n<tr valign=\"top\">\n<th width=\"33%\">\n<p class=\"western\">Pseudocode<\/p>\n<\/th>\n<th width=\"33%\">\n<p class=\"western\">Z80 Assemblercode<\/p>\n<\/th>\n<th width=\"33%\">\n<p class=\"western\">Takte<\/p>\n<\/th>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Lade Reg1 mit Adresse des digitalisierten Pixels<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Ld de,Pixeladr<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">10<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Lade Reg2 mit Adresse des Speicherblocks einer Zeile<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Ld hl,Block<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">10<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Lade Reg3 mit Z&auml;hler einer Zeile (800)<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Ld bc,800<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">10<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Schleifenbeginn:<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Schleife:<\/p>\n<\/td>\n<td width=\"33%\"><\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Lade Reg4 mit aktuellen Pixelwert aus Adresse bei Reg1<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Ld a,(de)<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">7<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Speichere Inhalt von Reg1 bei aktueller Blockadresse ab<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Ld (hl),a<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">7<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Erh&ouml;he Blockadresse um 1<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Inc hl<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">6<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Erniedrige Z&auml;hler um 1<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Dec bc<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">6<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Springe wenn nicht Null zum Schleifenbeginn<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Jp nz,Schleife<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">10<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Speicherblockadresse<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Block: defs 800<\/p>\n<\/td>\n<td width=\"33%\"><\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Pixeladresse<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Pixeladresse equ 1000h<\/p>\n<\/td>\n<td width=\"33%\"><\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Schleifendauer<\/p>\n<\/td>\n<td width=\"33%\"><\/td>\n<td width=\"33%\">\n<p class=\"western\">36 Takte<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Diese Routine war f&uuml;r alle FDS Modi die gleiche, da das Verlangsamen des Auslesens dadurch bewerkstelligt wurde, dass die Pause nach dem Strahlr&uuml;cklauf von 4,3 ms (ohne Verz&ouml;gerung) auf 604,3 ms (Modus 10:1) ausgedehnt wurde. Das FDS beherrschte es aber auch, nur Teile einer Zeile auszulesen, das macht die Schleife etwas komplexer:<\/p>\n<table width=\"100%\" cellspacing=\"0\" cellpadding=\"4\">\n<tbody>\n<tr valign=\"top\">\n<th width=\"33%\">\n<p class=\"western\">Pseudocode<\/p>\n<\/th>\n<th width=\"33%\">\n<p class=\"western\">Z80 Assemblercode<\/p>\n<\/th>\n<th width=\"33%\">\n<p class=\"western\">Takte<\/p>\n<\/th>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Lade Reg1 mit Adresse des digitalisierten Pixels<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Ld de,Pixeladr+Offset<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">10<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Lade Reg2 mit Adresse des Speicherblocks einer Zeile<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Ld hl,Block<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">10<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Lade Reg3 mit Z&auml;hler einer Zeile (800)<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Ld bc,800<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">10<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Schleifenbeginn:<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Schleife:<\/p>\n<\/td>\n<td width=\"33%\"><\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Lade Reg4 mit aktuellen Pixelwert aus Adresse bei Reg1<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Ld a,(de)<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">7<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Speichere Inhalt von Reg1 bei aktueller Blockadresse ab<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Ld (hl),a<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">7<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Erh&ouml;he Blockadresse um 1<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Inc hl<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">6<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Erniedrige Z&auml;hler um 1<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Dec bc<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">6<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Vergleiche Highbyte Z&auml;hler<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Ld a,highbyte<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">4<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\"><\/td>\n<td width=\"33%\">\n<p class=\"western\">Cp b<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">4<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Springe wenn nicht identisch zum Schleifenanfang<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Jp nz,Schleife<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">10<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Vergleiche Highbyte Z&auml;hler<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Ld a,lowbyte<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">4<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\"><\/td>\n<td width=\"33%\">\n<p class=\"western\">Cp c<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">4<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Springe wenn nicht Null zum Schleifenbeginn<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Jp nz,Schleife<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">10<\/p>\n<\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Speicherblockadresse<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Block: defs 800<\/p>\n<\/td>\n<td width=\"33%\"><\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Pixeladresse<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Pixeladresse equ 1000h<\/p>\n<\/td>\n<td width=\"33%\"><\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Offset<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Equ 96<\/p>\n<\/td>\n<td width=\"33%\"><\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Highbyte<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Equ 2<\/p>\n<\/td>\n<td width=\"33%\"><\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Lowbyte<\/p>\n<\/td>\n<td width=\"33%\">\n<p class=\"western\">Equ 191<\/p>\n<\/td>\n<td width=\"33%\"><\/td>\n<\/tr>\n<tr valign=\"top\">\n<td width=\"33%\">\n<p class=\"western\">Schleifendauer<\/p>\n<\/td>\n<td width=\"33%\"><\/td>\n<td width=\"33%\">\n<p class=\"western\">62 Takte<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Man sieht hier schon das der Z80 als 8 Bit Computer etwas benachteiligt ist, er muss den Vergleich der ja wegen des Maximalwest von 799 &uuml;ber 256 liegt, in zwei Schritten einmal mit dem h&ouml;herwertigen Byte und einmal mit dem niederwertigen Byte durchf&uuml;hren. Das FDS als 16 Bit Rechner kann das in einem Schritt. Es durchl&auml;uft aus demselben Grund die Schleife auch nur 400-mal da jedes Lesen und Schrieben gleich 16 Bit also zwei Pixel liest und schreibt.<\/p>\n<p>Das Einschr&auml;nken der Pixelzahl pro Zeile war ein schon beim Start vordefinierter Mode, w&auml;hrend das Weglassen von Zeilen erst bei Uranus und Neptun hinzukam. Das verwundert mich, weil wenn man ganze Zeilen wegl&auml;sst das nur eine Pr&uuml;fung au&szlig;erhalb der Schleife (also in der Zeit die man dann f&uuml;r den Stahlr&uuml;cklauf hat und damit in einem unkritischen Bereich) n&ouml;tig macht bei dem Weglassen von Spalten es dagegen die Schleife verl&auml;ngert. Das man die Bilder spaltenweise ausgelesen hat (dann w&uuml;rde es auch passen) kann ich aber wegen unvollst&auml;ndiger Bilder in denen immer der untere Teil fehlt, ausschlie&szlig;en.<\/p>\n<p>Nun zur Geschwindigkeitsabsch&auml;tzung. Eine Z80 gab es damals mit einem maximalen Takt von 2,5 MHz, die h&auml;tte pro Sekunde 69.000 bzw. 40.000 Durchg&auml;nge (mit Pr&uuml;fung) erm&ouml;glicht was 322 bzw. 555 kbit\/s entspricht oder die drei bis f&uuml;nffache Geschwindigkeit des FDS.<\/p>\n<p>Es spricht f&uuml;r mich viel daf&uuml;r, dass das FDS &auml;hnlich arbeitet, denn es hatte etwa 70 \u00b5s f&uuml;r ein Pixel, 140 \u00b5s f&uuml;r ein 16-Bit-Wort. Die Zykluszeit wird mit 12 Mikrosekunden angegeben, wobei Befehle mehrere Zyklen ben&ouml;tigen k&ouml;nnen (bei der Z80 betr&auml;gt sie 4, im obigen Beispiel brauchen Befehle bis zu drei Zyklen). Bei einem 16 Bit Rechner sind es maximal 8 Befehle in einer Zeile, davon drei mit Speicherzugriff die mindestens einen zweiten Zyklus brauchen. Das FDS kann maximal 11 bis 12 Instruktionen in dieser Zeit durchf&uuml;hren, was dann bei 8 Befehlen + 3 Extrazyklen f&uuml;r Speicherzugriffe recht gut passt.<\/p>\n<p>Ein 8080 w&auml;re also drei bis f&uuml;nfmal schneller als das FDS. W&uuml;rde man die LDI\/LDIR Instruktion der Z80 einsetzen so w&uuml;rde die Ausf&uuml;hrungszeit von 36 auf 21 Takte bzw. 62 auf 52 Takte sinken, entsprechend w&auml;re eine Z80 dann vier bis zehnmal schneller als das FDS.<\/p>\n<p>Aber man muss eben daran denken: das FDS wurde entworfen, da gab es die 8080 noch gar nicht. Wie lange das her ist erkennt man an den Speicherchips. Nach meinen Recherchen fassten die 256 Bits pro IC, der gesamte Speicher ben&ouml;tigte so 512 IC. Ein typischer Heimcomputer mit einer der obigen CPUs hatte dagegen 8 oder 16 Chips. Bei gleicher Chipanzahl h&auml;tte ein C64 z.B. 4 MByte Speicher. Das lag am Alter, aber auch daran, dass CMOS IC nur ein Viertel von NMOS Chips der gleichen &Auml;ra speicherten.<\/p>\n<p>Zuletzt noch etwas aktuelles, zum meinem neuen Buzz-Thema \u201e<a href=\"https:\/\/www.bernd-leitenberger.de\/blog\/2022\/07\/19\/lesen-oder-berieseln-lassen-und-das-verseichten\/\">Verseichten<\/a>\u201c. Das hat nun auch die NASA erfasst. Voyager 1 &uuml;bertrug sein Mai \u201eNonsense Daten\u201c des AACS, eines der Computersysteme an Bord. Das wurde nun behoben. Die Aussage der NASA ist nicht <a href=\"https:\/\/www.nasa.gov\/feature\/jpl\/engineers-solve-data-glitch-on-nasa-s-voyager-1\">besonders ausf&uuml;hrlich<\/a>: \u201eThe AACS had started sending the telemetry data through an onboard computer known to have stopped working years ago, and the computer corrupted the information.\u201c<\/p>\n<p>Nun arbeiten meiner Recherche nach alle Rechner von Voyager 1, ich fand bei einer neuen Recherche auch nichts anderes. Es macht auch kein Sinn, wie soll ein nicht mehr arbeitender (also abgeschalteter) Computer die Information ver&auml;ndern? Sie w&uuml;rde dann wohl eher nicht ankommen. Aber einer der beiden oberen Speicher des FDS von Voyager 1 ist seit den achtziger Jahren defekt. Es spricht also daf&uuml;r, dass man die Daten wohl &uuml;ber diesen Speicher geleitet hat. Warum schreibt man das nicht? Das sind zwei S&auml;tze mehr. &Uuml;berfordert das schon den heutigen Leser? Oder ist die Person schon &uuml;berfordert, die den Text geschrieben hat? Ich glaube ja eher an letzteres.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Heute vor genau 45 Jahren startete Voyager 1. Wir der regelm&auml;&szlig;ige Blogleser wei&szlig; arbeite ich seit drei Monaten an einem Buch &uuml;ber die Sonden. Ich hatte mir vorgenommen zu dem Startdatum fertig zu werden, was ehrgeizig war. Das habe ich auch geschafft \u2013 es muss nur noch korrekturgelesen werden. Ich bin das ganze Buch mindestens [&hellip;]<\/p>\n","protected":false},"author":169,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[1107,4880,1083,1713],"class_list":["post-16061","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-fds","tag-verseichten","tag-voyager","tag-z80","entry"],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":18610,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/03\/27\/galileos-cds-teil-1\/","url_meta":{"origin":16061,"position":0},"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":18612,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/03\/28\/galileos-cds-teil-2\/","url_meta":{"origin":16061,"position":1},"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":18614,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/03\/29\/galileos-cds-teil-3\/","url_meta":{"origin":16061,"position":2},"title":"Galileos CDS &#8211; Teil 3","author":"Bernd Leitenberger","date":"29. M\u00e4rz 2026","format":false,"excerpt":"So nun zum dritten Teil \u00fcber das prim\u00e4re Computersystem von Galileo, das CDS. Nachdem sich die ersten beiden Teile nur mit dem RCA 1802, warum er gew\u00e4hlt wurde und seiner Architektur befassten geht es heute um das Computersystem selbst. Der Artikel schlie\u00dft so an seine beiden Vorg\u00e4nger gestern und vorgestern\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\/6e7f572a246b4ac395de9c260733b707","width":350,"height":200},"classes":[]},{"id":18634,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/04\/11\/wie-kommt-galileo-zu-jupiter\/","url_meta":{"origin":16061,"position":3},"title":"Wie kommt Galileo zu Jupiter?","author":"Bernd Leitenberger","date":"11. April 2026","format":false,"excerpt":"Inzwischen habe ich beim Schreiben des Buchs \u00fcber die Raumsonde Galileo die Computer hinter mir gelassen und bin gerade beim Durcharbeiten der wechselvollen Geschichte der Mission. Damit wir alle auf dem gleichen Stand sind, mal hier eine kleine Zusammenfassung, wie Galileo zum Jupiter kommen sollte: Bei Projektbeginn war ein Start\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:\/\/vg06.met.vgwort.de\/na\/67742b596a42421d95a9f5f4ec0d8b69","width":350,"height":200},"classes":[]},{"id":18524,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/02\/06\/elon-musks-ki-rechenzentren-im-orbit-nochmals-nachgerechnet\/","url_meta":{"origin":16061,"position":4},"title":"Elon Musks KI-Rechenzentren im Orbit &#8211; nochmals nachgerechnet","author":"Bernd Leitenberger","date":"6. Februar 2026","format":false,"excerpt":"Ich habe mich ja schon mal mit diesem Thema besch\u00e4ftigt, in dem es vor allem um die Kosten und den wirtschaftlichen Unsinn ging - warum sollte ich ein Rechenzentrum in den Orbit bringen, wenn ich es billiger auf der Erde bauen kann und es auch gen\u00fcgend Gegenden gibt in denen\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:\/\/vg06.met.vgwort.de\/na\/78014052fde04012a2be60bd108cd4bb","width":350,"height":200},"classes":[]},{"id":18396,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2025\/09\/19\/die-falcon-9-eine-nachlese-2\/","url_meta":{"origin":16061,"position":5},"title":"Die Falcon 9 \u2013 eine Nachlese (2)","author":"Bernd Leitenberger","date":"19. September 2025","format":false,"excerpt":"So und hier folgt der zweite Teil der Nachbetrachtung der Falcon 9, er schlie\u00dft an den ersten Teil von gestern an. Den ganzen Artikel gibt es auch auf der Website. Nutzlastverkleidung Ein einziges System wurde beim \u00dcbergang von der ersten zur heutigen Version kleiner: Die Nutzlastverkleidung wurde von 15,24 auf\u2026","rel":"","context":"In &quot;SpaceX&quot;","block_context":{"text":"SpaceX","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/raumfahrt\/spacex\/"},"img":{"alt_text":"","src":"https:\/\/vg02.met.vgwort.de\/na\/56024d59119b4e4685580cdc237045c2","width":350,"height":200},"classes":[]}],"jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/posts\/16061","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=16061"}],"version-history":[{"count":0,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/posts\/16061\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/media?parent=16061"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/categories?post=16061"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/tags?post=16061"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}