Der Rest ist Schweigen

Computerkrims und mehr

Z22 Deckblatt Anleitung

Zuse Z22 „Hello World“ Programm

| Keine Kommentare

Eines meiner seltsamen Hobbies sind alte Computer.  Dazu zählen „Neuheiten“ wie der C64 aber auch richtig alte Computer aus den Fünfziger und Sechzigern Jahren. Auf diesem Blog werde ich regelmäßig Beiträge zu technischen Details, dazu zählen Programmierbeispiele, Emulatoren, Nachbauten etc. veröffentlichen. Beginnen kann ich eine solche Reihe natürlich nur mit den Großrechnern von Konrad Zuse. Heute ein einfaches „Hello World“ Programm für die Zuse Z22. Es ist hilfreich sich mit der Funktionsweise von Computern auszukennen, um diese Artikelreihe zu verstehen, da ich nicht alles im Detail erkläre ;-).

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.

Z22


Z22 Im Technischen Museum Berlin (c) Jürgen Götzke https://commons.wikimedia.org/wiki/User:JuergenG – Creative Commons Attribution Share Alike 3.0 Unported

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).

Elektronenröhre der Z22, Ende der 1950er Jahre. (c) by Denis Apel https://commons.wikimedia.org/wiki/User:Denis_Apel, Creative Commons Attribution Share Alike 3.0 Unported

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
[…]“

Befehlsdarstellung der Z22. Auschnitt aus dem Benutzerhandbuch der Z22

„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 an Trommelspeicher 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:

Z22 Punchtape für Hello World Programm

Z22 Papertape für Hello World Programm. Links ist der Anfang des Tapes.

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“.

(Ein Bild des Bedienpultes wird noch nachgeliefert).

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

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.