Einige von Euch kennen die alten Großrechner von Konrad Zuse aus Museen, z.B. dem Deutschen Museum in München oder dem Computermuseum der FH Kiel. Dort erfährt man einiges über die Hardware diese alten Rechner. Leider gibt es dort aber kaum Infos wie man Programme für sie geschrieben hat. Darum gibt es hier in unregelmäßigen Abständen Programmbeispiele für diese alten Großrechner. Mein Erstes Programmbeispiel ist ein “Hallo Welt” Programm für die Z22 von Konrad Zuse.
Vorweg ein wenig zur Technik der Z22. Die Z22 ist Zuses erster Röhrenrechner und kam 1956 für etwa 160.000 DM auf den Markt.
In ihm sind 415 Röhren und 2400 Dioden verbaut. Der Rechner arbeitet mit einer Taktfrequenz von etwa 140.000 Hertz. Eine simple Addition benötigt etwa 0,6 ms. Die Programme werden auf einem 5-Kanal-Lochstreifen eingelesen und als Ausgabegerät steht entweder ein Fernschreiber oder wieder ein Lochstreifen zur Verfügugung.
Der Arbeitsspeicher fasst 8192 Worte auf einem Trommelspeicher (256 Spuren mit 8192 Speicherzellen, 256 Zellen sind 1 Block. 1 Block hat 8 Spuren je 32 Sektoren. Jeder Sektor eine Speicherzelle), sowie einen Ferritkernspeicher mit 8 Worten. Ein Wort der Z22 ist 38 bit lang (~ 8 Dezimalstellen).
Unser Hello World Programm soll wie jedes andere Programm seiner Art den Text “Hello World” auf dem primären Ausgabegerät ausgeben – im Falle der Z22 also auf dem Fernschreiber. Das Grundprogramm der Z22 kann nur ein einzelnes Maschinenwort ausgeben (max 7 Zeichen). Das heißt wir müssen das etwas erweitern und ein Programm schreiben, dass vom Lochstreifen den Text in den “Akkumulator” der Z22 einliest und dann auf den Fernschreiber ausgibt. Unser Programm soll den sogenannten Freiburger Code benutzen, einer “erweiterten” Maschinensprache für die Z22.
Daten im Lochenstreifen und Trommelspeicher
Sowohl der Lochstreifen als auch die “Schreibmaschine” sind Fernschreibetechnik. Die Daten werden auf dem Lochstreifen im CCIT2 Code codiert – auch dies ist Fernschreibetechnik. Eine Zeile des Lochstreifens ist 5 Bit lang, das heißt, dass im CCIT2 nur 32 Zeichen möglich sind. Die Z22 kann nur Großbuchstaben ohne Umlaute, Zahlen und wenige Sonderzeichen. Um den Zeichenvorrat etwas zu ertweitern sind alle Zeichencodes doppelt belegt. Ein Maschinenwort der Z22 ist wie gesagt 38 Bit lang, es können also 7 Schriftzeichen in ihm abgelegt werden – drei Bits bleiben “übrig”. Ein Wort auf dem Trommelspeicher sieht dann etwa so aus:
Bit | 1 | 2 | 3 | 4-8 | 9-13 | 14-18 | 19-23 | 24-28 | 29-33 | 34-38 |
Inhalt | 0 | 1 | 0/1 | Zeichen 1 | Zeichen 2 | Zeichen 3 | Zeichen 4 | Zeichen 5 | Zeichen 6 | Zeichen 7 |
Bit 1 ist immer 0, Bit 2 ist immer 1. Bit 3 ist 0, wenn das Zeichen in Bit 4-8 eine Ziffer oder Sonderzeichen ist und 1, wenn das Zeichen in Bit 4-8 ein Buchstabe ist. Die restlichen Stellen enthalten Zeichen im 5-bittigen CCIT2 Code (sollten weitere Zahlen folgen wird mittels eines Spezialcodes umgeschaltet. Dieser lautet 11111 wenn Buchstaben folgen [Bu]) und 11011 wenn Ziffern folgen [Zi]). Sind es weniger als 7 Zeichen, wird der Rest bis Bit 38 mit 0 aufgefüllt.
Freiburger Code
Jetzt wissen wir, wie Daten auf dem Lochstreifen gespeichert sind, und wie diese nach dem Einlesen im Trommelspeicher “ausssehen”. Bevor wir nun zum eigentlichen Programm kommen eine kurze Einführung in den Freiburger Code (Quasi die Maschinensprache der Z22). Der Maschinencode der Z22 zeichnet sich durch eine besonders direkte Abbildung der Opcodes auf Bitkombination aus. Nachfolgend ein Auszug aus dem Handbuch der Z22:
“Auch die Befehle werden durch 38-stellige Dualzahlen dargestellt, wobei die Aufteilung der einzelnen Bits folgende Form hat
[…]
2 Stellen zur Befehlskennzeichnung
5 Stellen für Bedingungszeichen
13 Stellen für Operationszeichen
5 Stellen für Schnellspeicheradressen
13 Stellen für Trommelspeicheradressen
[…]”
“Jeder Befehl enthält ein Operationsteil (mindesten 1 Buchstabe) und eine Adresse (mindestens eine Ziffer). Die einzelnen Operationszeichen können fast beliebig untereinander zu sinnvollen Befehlen zusammengefast werden. Jedem Befehl kann eine oder mehrere Bedingungen zugesetzt werden, und damit die Ausführung von der Erfüllung der Bedingungen abhängig gemacht werden. ” (Auszug aus “Elektronisches Rechengerät Z22 – II. Intern Code” – Ausgabe Januar 1956, Zuse KG Bad Hersfeld)
Für unser Programm benötigen wir folgende Maschinenbefehle der Z22:
Befehl | Bedeutung |
---|---|
TmT | Lädt das nächste Lochstreifenwort an Adresse m des Trommelspeichers |
EZm | Programm stoppen. Es kann mit “Weiter” oder “Start” wieder von vorne, bei m, gestartet werden |
…E | Befehl … wird nicht gespeichert sondern direkt beim Lesen vom Lochstreifen ausgeführt |
Em | Befehl aus Speicherzelle m in das Befehlsregister laden |
CBn | Zahl in Akku laden. Bei diesem Befehl werden die untersten 19 Bits, das sind Trommelspeicheradresse, Schnellspeicheradresse und das Befehlsbit V zusammen als natürliche Zahl (n) interpretiert. |
CGK…s+t | der Inhalt von Schnellspeicherzelle s wird als Index mit Inkrement t auf den Adressteil des Befehls … verwendet |
Tm | Inhalt des Akkus in Speicherzelle m sichern und Akku löschen |
PPQQ… | Befehl … nur ausführen, wenn der Akku Null ist |
D | Druckt den Inhalt des Akkumulators auf dem Fernschreiber aus und schreibt ihn an Speicherzelle 6 |
F1000 | Fernschreiber an den Anfang der Folgezeile setzen |
Das eigentliche Programm
Jetzt zum eigentlichen Programm. Es wird aus drei Teilen bestehen. Die Z22 kennt noch nicht das heutige Konzept von Variablen und Datentypen. Werte und Zahlen werden direkt im (Trommel-)Speicher abgelegt und über die Adresse ausgelesen (äquivalent zum Zeiger in C). Unser erster Block des Programms wird also nur den Text, den wir ausgeben wollen beinhalten. Damit das Programm weiß, wo der Text aufhört, folgt am Ende des Textes ein Nullwort. Da das Grundprogramm des Rechners nur ein einzelnes Maschinenwort auf dem Fernschreiber ausgeben kann, brauchen wir eine Art Programmschleife, die den Text aus dem Trommelspeicher in den Akkumulator holt und von dort auf dem Fernschreiber ausgibt. Der Dritte Programmblock startet, wenn der Text fertig ausgeben wurde, und setzt den Fernschreiber auf eine neue Zeile und stoppt die Ausführung mit der Option, das Programm wieder von vorne zu beginnen.
Jedes Programm der Z22 beginnt mit einem Bandbefehl. Ein Bandbefehl wird nicht gespeichert sondern ist sofort beim Einlesen des Bandes (Lochstreifen) wirksam. Jedes Programm beginnt zwingend mit dem Bandbefehl TmT, wobei m eine Trommelspeicheradresse 1 < m < 8191 ist. Der Befehl bewirkt, dass alle nachfolgenden Befehle im Trommelspeicher beginnend mit Adresse m gespeichert werden (Die Adressen 1-1023 werden vom Grundprogramm belegt und sind gesperrt, die Adressen bis 1215 sollten auch nicht für eigene Programme benutzt werden). Es können später weitere TmT Befehle folgen, sollten andere Programmteile woanders gespeichert werden müssen.
Unseren ersten Programmblock – der Text – wollen wir an Adresse 3000 des Trommelspeichers ablegen. Unser Programm beginnt also mit dem Befehl T3000T. Nachfolgende Tabelle beinhaltet unser Programmlisting. In der ersten Spalte die Speicheradresse im Arbeitsspeicher nach dem Einlesen des Lochstreifens. Die Zweite Spalte beinhaltet den Wert oder den Maschinenbefehl an der Adresse. In der Dritten Spalte die Erläuterung zum Befehl.
Trommeladresse | Wert | Bemerkung |
T3000T | Nachfolgende Zeichen ab Trommelspeicheradresse 3000 speichern | |
3000 | ΩHELLO_ | 7 Zeichen passen in ein Speicherwort, Ω ist das Zeichen für die Glocke des Fernschreibers |
3001 | WORLDΩ | 7 Zeichen passen in ein Speicherwort |
3002 | 0 | Schlusswort (siehe oben) |
T4000T | Das eigentliche Programm ab Trommelspeicheradresse 4000 speichern | |
4000 | CB2999 | Die Anfangsadresse des Textes Minus Eins |
4001 | T14 | wird in Schnellspeicher 14 geschrieben |
4002 | CGKB14+1 | Im ersten Schritt des G-Befehls wird der Inhalt von Schnellspeicher 14 (anfangs 2999) um 1 erhöht; das Ergebnis (zuerst 3000) wird in Schnellspeicher 14 gespeichert; diese Zahl ist die Trommeladresse des übrigen Befehls, der im zweiten Schritt ausgeführt wird: also anfangs B3000, was den entsprechenden Teil des Textes in den Akku lädt. Später ist das B3001 usw. |
4003 | 0 | Konvention: Nach einem G Befehl muss ein Wort frei sein, Inhalt ist beliebig. |
4004 | PPQQE4020 | Ist der Akku 0, dann weiter bei Adresse 4020 |
4005 | D | Der Akku war nicht 0 als drucken wir den Inhalt des Akku |
4006 | E4002 | Sprung an Adresse 4002 (Der G Befehl, der das nächste Texthäppchen holt) |
T4020T | Nach Ausgabe des Textes geht es an dieser Adresse weiter | |
4020 | F1000 | Neue Zeile und Wagenrücklauf am Fernschreiber |
4021 | EZ4000 | Programmstop. Es kann mit “Weiter” oder “Start” neugestartet werden (an Adresse 4000). Dieser Befehl wird gespeichert. |
EZ4000E | Bandbefehl nach einlesen wird nicht gespeichert. Stop. “Weiter” oder “Start” beginnt das Programm bei Adresse 4000. |
Das Prorgramm ausführen
Unser Programm ist fertig.
T3000T ΩHELLO_WORLDΩ 0 T4000T CB2999 T14 CGKB14+1 0 PPQQE4020 D E4002 T4020T F1000 EZ4000 EZ4000E
Jetzt wollen wir es laufen lassen. Dazu erstellen wir zuerst unseren Lochstreifen. Dies geschieht am Fernschreiber, der parallel zur Textausgabe auch einen Lochstreifen serstellt. Dieser sieht danach wie folgt aus:
Normalerweise lässt man am Anfang des Tapes noch ein bisschen Freiraum, zum Einfädeln des Tapes in den Leser.
Der Lochstreifen enthält das Programm im Freiburger Code. Das heißt es muss mit dem Leseprogramm, das Bestandteil des Grundprogramms der Z22 ist, eingelesen werden. Dieses wird über den Befehl “E1” gestartet (Siehe Em – Lade Adresse 1 in das Befehlsregister). Dazu wird am Bedienpult die Taste “Befehl” gedrückt und im Trommelspeicheradressfeld die Taste “1” gedrückt. Dann drückt man die Taste “Befehlsübernahme”. Der Lochstreifen wird eingelesen. Ist das Einlesen abgeschlossen wird das Programm über die Taste “Start” gestartet oder, wenn man das Programm befehlsweise ausführen will mit “Weiter”.
Das Programm gibt zuerst die Zeichen “HELLO_W” aus, nach einer kurzen Pause – es muss ja erst das nächste Texthäppchen vom langsamen Trommelspeicher geladen werden – dann die Zeichen “ORLD”. Danach erfolgt noch der Wagenrücklauf und Zeilenvorschub und das Programm wird gestoppt. Es könnte jetzt mit “Start” nochmal gestartet werden. Oder wir schalten die Z22 aus.
Quellen
Das Programmbeispiel basiert auf dem Beispielprogramm “Ausgabe eines Textes” von Wolfgang Pavel – Das “Original” gibt es auf der Z22 Seite: https://www.wpavel.de/zuse/simu/beispiele/beispiel.php?bspnr=03
Diese Artikelreihe wäre nicht möglich ohne
- das Computermuseum der Fachhochschule Kiel http://www.fh-kiel.de/index.php?id=186
- das Onlinearchiv von Herrn Kirchner http://museum.informatik.uni-kl.de
- Die Z22 Seite von Wolfgang Pavel https://www.wpavel.de/zuse/vorlesung/vorlesung.php
- Die Webseite von Horst Zuse http://www.horst-zuse.homepage.t-online.de/index.html