Zum Hauptinhalt Zur Navigation

DM42: Programmieren lernen mit dem Taschenrechner

Selbst oder gerade mit einfachsten Maschinen lässt sich gut mit Algorithmen experimentieren.
/ Thomas Ell
12 Kommentare News folgen (öffnet im neuen Fenster)
Der DM42 ist ein modernisierter HP-42S. (Bild: Thomas Ell)
Der DM42 ist ein modernisierter HP-42S. Bild: Thomas Ell

Heutzutage wird Programmieren lernen gerne mit dem Arduino oder Python in Verbindung gebracht. Aber es sind nicht unbedingt die Abfrage von Sensoren oder der Umgang mit mathematischen Bibliotheken, die das Programmieren ausmachen. Es ist der Algorithmus, der das Programm zu dem macht, was es ist. Und selbst die einfachste Programmiermaschine ermöglicht es, damit zu experimentieren. Zum Beispiel ein Taschenrechner.

Die Freiheit, immer neue Programme zu entwickeln

Der Kauf meines ersten programmierbaren Taschenrechners im Alter von zwölf Jahren, einem Privileg PR 56 D-NC von Quelle, machte mich sehr glücklich. Das Gefühl, das ich damals hatte, kann vielleicht mit dem verglichen werden, welches ich beim Kauf meines ersten Motorrades oder mit dem Erwerb meines ersten Quadcopters zum Filmen hatte.

Aber an die gedankliche Freiheit, die mir der PR 56 D-NC bescherte, kommen beide nicht heran. Ich spürte, wie mich das kleine Gerät unaufhörlich dazu aufforderte, immer neue Programme zu entwickeln, und dass es alle meine ausgedachten Algorithmen klaglos immer und immer wieder ausführen würde.

Es war für mich wie die noch leere Leinwand für einen Maler: ein Raum, der darauf wartete, von mir mit unendlich vielen Ideen in Form von programmierten Algorithmen gefüllt zu werden. Und ich lernte mit ihm das exakte Denken: Solange meine Programme nicht korrekt waren, funktionierten sie halt nicht. Das ist anders als im richtigen Leben. Kleine Unsauberkeiten in Gesprächen werden oft toleriert und wer deine Aussagen nicht gleich nachrechnet, entdeckt ihre Fehler nicht. Der Taschenrechner aber zeigt sie sofort.

Nach ein paar Wochen erkannte ich allerdings, dass die (im Vergleich zu heutigen Programmiersprachen extrem armseligen) Programmiermöglichkeiten mich zwar grundsätzlich in die Lage versetzten, vieles zu programmieren, der winzige Programmspeicher, die auch damals schon unglaubliche Langsamkeit und, vor allem anderen, dass ich nach jedem Einschalten alles neu eingeben musste, meinem jugendlichen Eifer klare Grenzen setzten. Auch wurden dem Wunsch, einfach überall programmieren zu können, durch den extremen Stromhunger der Fluoreszenzanzeige(öffnet im neuen Fenster) enge Grenzen gesetzt.

Der beste Taschenrechner aller Zeiten

Den PR 56 D-NC habe ich vermutlich 1975 oder 1976 gekauft, ich ersetzte ihn durch einen TI-58C und später durch einen TI-59. Noch etwas später bekam ich einen HP-41C in die Finger und damit den Urahn des DM42. Der 1979 erschienene HP-41C war natürlich noch einmal in allem etwas besser als meine vorhergehenden Modelle, das Bedeutendste war aber seine stromsparende LCD-Anzeige, die sogar alphanumerische Zeichen darstellen konnte. Und das war sehr wichtig, da man so den schon eingegebenen Programmcode besser lesen als auch Programmein- und -ausgaben mit Worten bezeichnen konnte.

Als 1988 der HP-42S erschien, war ich schon längst weiter zu Homecomputern und PCs gewechselt, so dass ich das gar nicht mitbekommen habe. Der HP-42S verwendet das gleiche Programmiermodell wie der HP-41C und kann darum für den HP-41C geschriebene Programme ausführen. Fast zehn Jahre nach der Veröffentlichung des HP-41C, in denen wirklich viel passiert ist, hat er noch einmal eine Möglichkeit geschaffen, den wertvollen Programmen für den HP-41C weitere Jahre eine Lebensumgebung zu bieten.

Der HP-42S wird von vielen als der beste Taschenrechner aller Zeiten angesehen. Das ist vermutlich der Grund, warum er ca. 30 Jahre nach seinem Debüt von einem Enthusiasten nachgebaut wurde. Und besser denn je! Mit ihm lässt sich mein Erweckungserlebnis mit der Taschenrechner-Programmierung gut nachvollziehen.

Was man vom Taschenrechner über Computer lernen kann

Der Swiss Micros DM42, laut Hersteller eine "Hommage an den legendären HP-42S" , ist im Vergleich zu modernen Taschenrechnern ein sehr primitives Gerät. Er ist kein Grafikrechner und beinhaltet kein Computer Algebra System (CAS). Er versteht noch nicht einmal die Punkt-vor-Strich-Rechnung. Aber genau dadurch ist er gut geeignet, etwas über die Grundlagen aller Computer zu lernen.

Denn die von ihm verwendete Methode, einfache Rechnungen auszuführen und die damit einhergehenden Möglichkeiten, Programme zu erstellen, erinnern an das Programmieren eines elektronischen Rechenwerks (ALU), wie es in alten und vermutlich auch neuen Mikroprozessoren enthalten ist.

Das ist schön zu sehen, wenn der DM42 mit FIX 00 auf 0 Nachkommastellen und mit der zweiten Taste von rechts oben auf rechtsbündige Anzeige eingestellt wird. Wähle ich dann noch aus dem BASE-Menü die BINM-Darstellung, kann ich direkt im Dualsystem arbeiten. Jetzt kann ich Dualzahlen mit 0 und 1 in das X- und das Y-Register eingeben und entweder arithmetisch addieren und subtrahieren oder mit dem LOGIC-Untermenü logisch verknüpfen.

Wer sehen möchte, wie einzelne Bits verarbeitet werden, der sollte sich ein wenig Zeit nehmen und auf dieser Ebene mit dem DM42 experimentieren. Schreibe ich mit dem DM42 Programme, so erinnern die STO- und RCL-Befehle an die LDA- und STA-Mnemonics des alten Mikroprozessors 6502, nur dass ich, anstatt den Speicher direkt zu adressieren, eine Registernummer angeben muss.

Das ähnelt alles dem Umgang mit einem alten Mikroprozessor wie zum Beispiel dem 6502 mit seinem Akkumulator und den X- und Y-Registern. Ein Register ist ein Speicherbereich, auf den der Mikroprozessor besonders schnell zugreifen kann.

Zum Beispiel: Zuerst tippe ich einen Wert ein und sorge mit einem Druck auf die Enter-Taste dafür, dass dieser Wert in das X-Register des DM42 geladen wird. Anschließend tippe ich den zweiten Wert ein und drücke abermals die Enter-Taste. Damit wird der erste Wert ins Y-Register verschoben und der zweite Wert ins X-Register geschrieben.

Drücke ich jetzt eine der vier Tasten für die Grundrechenarten, werden X- und Y-Register entsprechend der gewählten Operation zusammengerechnet, das Ergebnis in das X-Register geschrieben und das Y-Register – scheinbar – wieder gelöscht. In Wirklichkeit gibt es noch zwei Register, das Z- und das T-Register, und nach der erfolgten Rechenoperation wird das Y-Register durch das Z-Register ersetzt und das Z-Register durch das T-Register. Man nennt das Ganze auch einen Stack.

Kurz: Um mit dem DM42 rechnen zu können, muss man sich genau mit seinen Registern und den damit möglichen Funktionen auskennen. Da das eben auch dem Programmieren eines Mikroprozessors ähnelt, kann man dabei auch ein wenig über die Organisation von Rechnungen beim Programmieren von Mikroprozessoren lernen.

Auch die verwendeten Abkürzungen für Befehle ähneln mit ihren meist nur drei Buchstaben sehr den damals verwendeten Assembler Mnemonics.

In einer modernen Programmiersprache, aber auch schon beim seit Jahrzehnten vorhandenen C, wird eine mathematische Rechenanweisung wie z. B. y = (42 – 7)/5 automatisch gemäß den üblichen Rechenregeln berechnet. Beim HP-42S muss ich selbst überlegen, wie ich das einzutippen habe, damit das korrekte Ergebnis herauskommt. Ich muss also etwas mehr darüber verstehen, wie der Taschenrechner funktioniert, um mit seiner Hilfe rechnen zu können.

Es gibt allerdings heutzutage nicht mehr viele Geräte, außer eben den alten programmierbaren Taschenrechnern, bei denen ich dem Programmieren so nahe bin. Einfach die Taste PRGM drücken, und schon kann ich beim DM42 zwischen Programmierung und normalem Rechnen hin und her wechseln.

Kein Download und Installation einer riesigen Entwicklungsumgebung wie Eclipse, Netbeans, Lazarus oder der Arduino IDE. Auch kein Kompilieren. Einfach PRGM tippen und schon bin ich mitten im Programmcode. (Das Beispiel lässt sich auch mit dem kostenlosen Free42(öffnet im neuen Fenster) ausprobieren.)

Ein Programm schreiben mit dem DM42

Ich zeige hier einmal, wie einfach es mit dem DM42 ist, ein Programm zu schreiben. Mit PRGM, was zugegeben die Zweitbelegung der Taste R/S ist, in den Programmmodus schalten, jetzt einmal die Taste 2 und die Taste X drücken. Jetzt mit nochmaligem Drücken von PRGM wieder in den normalen Rechenmodus schalten. Das war es auch schon. Wir haben unser erstes Programm geschrieben!

Zum Ausprobieren geben wir die Zahl 1 ein und drücken zweimal auf die Taste R/S. Das erste Mal wird benötigt, um den Programmzeiger auf den Anfang des Programms zu setzen. Mit dem zweiten Drücken von R/S wird ab dieser Stelle das Programm automatisch abgearbeitet. Die 2 sorgt dafür, dass die Zahl 2 in das X-Register eingegeben wird und das nachfolgende X-Zeichen löst die Rechenoperation Multiplizieren aus. Dabei passiert Folgendes: Die schon eingetippte 1 wird in das Y-Register verschoben, die 2 in das X-Register, die Multiplikation multipliziert das X- mit dem Y-Register und das Ergebnis wird wieder in das X-Register geschrieben.

Drücken wir jetzt noch einmal auf die R/S-Taste, wird das Programm wiederholt ausgeführt und in der Folge erscheinen die Werte der einzelnen Stellen des Dualsystems in der Anzeige. Ich vermisse allerdings einen Schalter oder eine Taste, die ausschließlich für das Hin- und Herschalten zwischen Programmier- und Ausführungsmodus vorhanden ist. So wie es bei meinem zweiten programmierbaren Taschenrechner, dem TI-58C, mit der Taste LRN (Learn) war.

Wer mit dem DM42 das Programmieren lernen möchte, kann versuchen, Programme für den GGT(öffnet im neuen Fenster) , das KGV(öffnet im neuen Fenster) , die Primfaktorenzerlegung oder die Primzahlensuche zu entwickeln. Das sind kleine, überschaubare Probleme, die nicht viel Code erfordern. Wer schon etwas weiter ist, kann versuchen, auf dem schönen Display die Mandelbrotmenge darzustellen oder mit Life(öffnet im neuen Fenster) den Ansteckungsmöglichkeiten von Corona(öffnet im neuen Fenster) näherzukommen.

Einige Hinweise zum Programmiermodell

Die alten Taschenrechner kannten keine Programmiersprachen, wie wir sie heute gewohnt sind und normalerweise einsetzen. Das Grundprinzip der Taschenrechnerprogrammierung ist schlicht und einfach das Aufzeichnen einer Tastensequenz. Möchte ich beispielsweise den Satz des Pythagoras anwenden und die Länge der Hypotenuse bestimmen, so tippe ich im Programmiermodus folgende Tastendrücke ein: x^2, xᐸᐳy, x^2, +, SQRT . Im Programmspeicher steht dann das folgende kleine Programm:

    
<![CDATA[
00 { 5-Byte Prgm } 01 x^2 02 X<>Y 03 x^2 04 + 05 SQRT 06 .END.
]]>

Wenn ich anschließend im Rechenmodus eine Zahl eintippe, einmal ENTER drücke, eine zweite Zahl eintippe und dann die Taste R/S drücke, wird das Programm gestartet, die eingetippten Tasten werden automatisch nacheinander gedrückt, bis das Ende des Programms erreicht ist. Anschließend steht die berechnete Länge der Hypothenuse im X-Register.

Das scheint nun wirklich nicht sonderlich spektakulär und dennoch war dies in der Zeit der Rechenschieber und ohne Tabellenkalkulation eine riesige Erleichterung für alle Menschen, die häufig wiederkehrende Berechnungen durchzuführen hatten.

Manchmal besteht aber Bedarf für mehr Variablen, als auf dem Stack mit seinen vier Registern Platz ist. Dann kann man im Programmiermodus an diesen Stellen im Programm einfach die Taste R/S drücken. Das Programm wird beim Ablauf an diesen Stellen anhalten und ich kann die passenden Werte eingeben. Mit einem weiteren Druck auf die R/S-Taste kann ich dann das Programm einfach weiterlaufen lassen.

Es gab tatsächlich ein paar sehr einfache programmierbare Taschenrechner, die außer diesem Keystroke-Programmieren nichts konnten. Sie hatten vielleicht Speicher für 30 bis 100 Tastendrücke. Das war's! Aus meiner Sicht ist das kein Computer. Es ist nicht möglich, damit universelle Algorithmen zu programmieren, da es keine Vergleichsbedingung gibt, mit der man in Abhängigkeit von einem Vergleich, zum Beispiel dem zweier Werte, zu einer beliebigen anderen Stelle im Programm springen kann.

Das ist wirklich wichtig, denn so eine klitzekleine Vergleichsbedingung ist alles, was so eine Tastendruckablaufmaschine benötigt, um sich vom Dasein als dumme Einen-Schritt-nach-dem-anderen-Maschine zur KI zu entwickeln.

Aber schon mein erster programmierbarer Taschenrechner besaß diese entscheidende Funktion in Form der Taste SKP(-). Die Funktion arbeitete mit der GOTO -Funktion Hand in Hand. Sie prüfte, ob der in der Anzeige befindliche Wert negativ war und falls ja, übersprang sie den nächsten Befehl. Da dieser der GOTO -Befehl sein konnte, war es damit möglich, bedingte Verzweigungen zu programmieren.

Die schlechtesten Programmiermöglichkeiten meines Lebens – und ihre Verbesserung

Um zu verstehen, wie viel besser der HP-42S war und der DM42 ist, erkläre ich nachfolgend, wie schwierig die Programmierung mit meinem ersten programmierbaren Taschenrechner war, dem Privileg PR 56 D-NC(öffnet im neuen Fenster) .

Der PR 56 D-NC hatte einen nur 72 Schritte großen Programmspeicher, ungefähr vergleichbar mit 72 Bytes. Dazu gab es noch zehn Register für Zwischenergebnisse. Wahrlich nicht viel, um ein Programm zu schreiben. Für ein paar einfache Formeln reichte es, aber für größere Programme war es viel zu wenig.

Keinerlei Programmierungskomfort

Er hatte keinerlei Möglichkeit, mit Symbolen zu arbeiten. Weder mit sprechenden Variablennamen noch mit Programmmarken (Labels), auf die man mit GOTO hätte verzweigen können. Während die fehlenden Variablennamen bei nur zehn Registern noch tolerierbar waren, bedeutete das direkte Adressieren von Programmschritten (Sprungadresse) ein Riesenproblem: Fast jedes Mal, wenn das Programm einen Fehler beinhaltete, der das Einfügen oder Löschen von Befehlen bedeutete, also eigentlich immer, mussten alle GOTO -Anweisungen angepasst werden. Das bedeutete Arbeit und neue Fehlerquellen.

Außerdem konnten neue Befehle nicht einfach eingefügt werden. Sie überschrieben schon vorhandenen Programmcode! Praktisch mussten komplette Programmteile neu eingegeben werden. Dieser Nachteil findet sich auch bei der Programmierung eines alten Mikroprozessors nur über den Maschinencode. Ein Assembler hat das natürlich vermieden.

Bedingte Verzweigung

Der SKP(-) -Befehl war wie geschaffen für Schleifen, bei denen man so lange etwas machen wollte, bis ein bestimmter Wert ᐸ 0 war. Aber alles andere wurde zur Qual. Es gab kein X=0? , Xᐸᐳ0? , Xᐸ0? , Xᐳ0? , Xᐸ=0? , Xᐳ=0? und das alles noch einmal für X ? Y? . Wollte ich mit SKP(-) prüfen, ob eine in der Anzeige befindliche Zahl ein bestimmter Wert ist, musste ich diesen Wert, um 1 erhöht, erst vom Anzeigewert subtrahieren und prüfen, ob er negativ ist. Falls ja, musste ich den Wert wieder um 1 erhöhen und noch einmal mit SKP(-) prüfen, ob er positiv ist. Nur dann war der Wert identisch. Im Programm sieht das dann wie folgt aus.

Programm für den Privileg PR 56 D-NC

    
<![CDATA[
00 -
01 6        // 5 + 1 mehr, damit der Test negativ wird wenn der Wert stimmen könnte
02 =
03 SKP(-)   // Wenn jetzt negativ, dann Sprung über das GOTO und nächster Test
04 GOTO
05 1
06 4
07 +        // 1 dazu zählen
08 1
09 =
10 SKP(-)   // Wenn jetzt positiv, dann Sprung zu 'Wert ist gleich 5'
11 GOTO
12 2
13 1
14 7        // Ab hier der Code für 'Wert ist ungleich 5'
15 7
16 7        
17 R/S
18 GOTO
19 0
20 0
21 9        // Ab hier der Code für 'Wert ist gleich 5'
22 9
23 9
24 R/S      
25 GOTO
26 0
27 0
]]>

Für diesen eigentlich simplen Vergleich habe ich also ungefähr zehn Schritte zusätzlich benötigt. Die gehen dann von den insgesamt nur 72 Schritten ab, die mir der Taschenrechner überhaupt für ein Programm zur Verfügung stellt. Entsprechend glücklich war ich, als ich den ersten Taschenrechner mit einem Befehl wie X=Y? bekommen habe! Und der absolute Wahnsinn war dann natürlich Basic, wo ich die Bedingungen mit IF ... THEN ... einfach so aufschreiben konnte, wie ich sie mir dachte.

Aber es geht nicht nur um den begrenzten Speicher. Sondern auch darum, dass es mich jede Menge Gehirnschmalz gekostet hat, die Bedingungen korrekt zu definieren.

Was kann der DM42 mehr?

Nachdem ich erklärt habe, warum das Programmieren auf einem der ersten programmierbaren Taschenrechner so schwer war, ist sicher nachvollziehbar, was die nachfolgend aufgeführten Eigenschaften für enorme Vorteile brachten.

Labels

Anstatt bei Sprüngen direkt auf Schritte – beim DM42 kann man sogar schon von Zeilen sprechen – zu zeigen, ist es beim DM42 möglich. Labels zu verwenden. Das sind alphanumerische Markierungen, die ich überall im Code platzieren kann. Sie können mit dem GOTO -Befehl direkt angesprungen werden. Dabei kann sogar zwischen lokalen alphanumerischen (A – J und a – e), lokalen zweistelligen numerischen und globalen alphanumerischen (kleine und große Buchstaben, bis sieben Stellen) unterschieden werden. Es gibt sogar die indirekte Adressierung, bei der das aufzurufende Label in einer Variablen oder einem Register stehen kann.

Die Verwendung von Labels hat den enormen Vorteil, dass ich mir beim Korrigieren von Programmen keinerlei Gedanken mehr um das durch Codeänderungen notwendige Anpassen von Sprungadressen machen musste! Ein weiterer, nicht zu unterschätzender Vorteil ist die Möglichkeit, Labels mit alphanumerischen Bezeichnungen zu versehen. Da schon der HP-42S über 6.000 Bytes und der DM42 sogar über 70.000 Bytes frei zum Programmieren hat, würde man ohne 'sprechende' Labels und Variablennamen im Programmcode hoffnungslos die Übersicht verlieren.

Indirekte Adressierung

Anstatt beim Ansprechen eines Labels oder Speicherregisters das Label oder Register direkt angeben zu müssen, kann der Name des Labels in einer Variablen oder die Nummer des Registers in einem anderen Register gespeichert werden. Nun wird beim Ansprechen dieses Register angegeben und der dort gespeicherte Wert als eigentliche Adresse verwendet. Das ist zum Beispiel gut, wenn ich automatisch eine Reihe von Registern bearbeiten will.

Schleifen

Neben den üblichen Methoden, ein Stück des Codes mehrfach zu durchlaufen, unterstützt der HP42 so eine Art for -Schleifen. Die Funktionen dazu heißen DSE (decrement; skip if less than or equal to) und ISG (increment; skip if greater than). Beide interpretieren eine Dezimalzahl in einer Variablen in der Form ccccccc,fffii als Zähler (ccccccc), Endwert (fff) und Schrittweite (ii). Taucht eine der beiden Funktionen im Programmcode auf, wird die passende Prüfung vorgenommen und, falls wahr, der nächste Befehl übersprungen. Das heißt, der nächste Befehl sollte ein 'GTO' an den Anfang der Schleife sein.

Bedingungen

Wie schon beim Absatz über den PR 56 D-NC angedeutet, unterstützen modernere programmierbare Taschenrechner deutlich mehr als eine Vergleichsmöglichkeit. Beim DM42 ist alles enthalten, was das Herz begehrt. Das Register X kann mit 0 oder dem Register Y verglichen werden und es stehen gleich und ungleich , kleiner , kleiner gleich , größer , größer gleich zur Verfügung. Das sollte reichen, jede gerade gedachte Bedingung, ohne sie umformen zu müssen, direkt zu prüfen.

Unterprogrammebenen

Der DM42 unterstützt bis zu acht Unterprogrammebenen. Das macht es einfach, ein Programm in viele Teilprogramme zu unterteilen oder sowieso oft verwendete Funktionen einmalig zu programmieren und anschließend in vielen anderen Programmen einfach wiederzuverwenden. Ich muss aber beim Programmieren von Unterprogrammen aufpassen, dass ich nicht Register verwende, die in anderen Unterprogrammen oder im Hauptprogramm verwendet werden.

Flags

Wenn ein Programm ein wenig komplizierter ist, als einfach nur eine Formel abzuarbeiten, kommt es oft vor, dass ich einen Status von irgendetwas festhalten will, um später im Programm auf diesen zu prüfen. In solchen Fällen nutze ich in modernen Programmiersprachen den Boolean-Datentyp.

Beim PR 56 D-NC musste ich dazu ein ganzes Register verbrauchen. Ich speicherte 1 für True und 0 für False. Wenn ich den Status von zwei verschiedenen Irgendetwas speichern will, benötige ich zwei Register oder ich denke mir einen mehr oder weniger tollen Code aus, um in einem Register zwei verschiedene Irgendetwas speichern zu können.

Beim DM42 könnte ich dazu die Bitfunktionen verwenden. Aber das ist gar nicht notwendig, weil der DM42 sogenannte Flags unterstützt, die genau für dieses Problem geschaffen worden sind. Ich kann Flags setzen ( SF ), löschen ( CF ) und abfragen ( FS? ) und ( FC? ).

Vom DM42 lässt sich also einiges über Computer und Programmierung lernen. Bei mir kommt noch die Nostalgie dazu, die mich beim Ansehen der alten Mnemonics im PRGM-Modus ergreift. Sie ruft Erinnerungen an vergangene Nächte hervor, in denen ich meinem Taschenrechner die letzten Geheimnisse entlockte und ich in mühevoller Auseinandersetzung mit meinem Code irgendwann mein Programm erfolgreich zum Laufen brachte, was immer ein großes Glücksgefühl in mir auslöste.

Dieser Artikel erschien zuerst im Blog Steinlaus.de(öffnet im neuen Fenster) . Für Golem.de wurde er umfassend überarbeitet.


Relevante Themen