Die "versteckten" Anweisungen des HP 12C

  • Hallo Sammlerkollegen,


    zur Zeit spiele ich ein wenig mit einem 40 Jahre alten programmierbaren Finanztaschenrechner, dem HP12C. Er wird immer noch in unveränderter Form hergestellt, was ihn im Lauf der Jahrzehnte zum wohl gängigsten RPN-Modell überhaupt werden liess. Für die Arbeit leistet mir ein Linux-Rechner mit entsprechenden Programmen gute Dienste, doch zum reinen Zahlenjonglieren sind mir wissenschaftliche Taschenrechner von HP lieber (32sII, 35s). Für ganz einfache Alltagsrechnungen tut es sogar der 12C. Dem fehlen zwar ein paar Funktionen (z.B. Trigonometrie), oft kann man sie aber per RPN-Programm nachbilden. Dazu bietet der HP12C einen Programmspeicher mit 99 Programmschritten, die der Anwender frei wählen kann. Neben diesen sichtbaren, vom Anwender einzugebenden Anweisungen des Programmspeichers gibt es aber auch noch fest vorgegebene, "versteckte" Anweisungen. Zwei davon werden im Handbuch erwähnt, allerdings nur ganz oberflächlich.



    1. Die versteckte Anweisung vor dem Programmcode


    In der Regel beendet man im HP12C ein Programm mit der Sprunganweisung "GTO 00". Das setzt den Programmzähler auf den Schritt 00, vor dem ersten Schritt 02 im Programmspeicher. Das Programm wird dadurch abgebrochen und ist bereit für einen Neustart mit der Taste R/S. In dem Fall startet es bei Schritt 01. Die versteckte Anweisung kann sich also vorstellen als:


    00 R/S (in einem Programm bewirkt die Anweisung R/S ein "Stop")


    Die erste der versteckten Anweisungen befindet sich quasi auf der Adresse 00. Sie gestattet den manuellen Neustart mit der Taste R/S (dann in der Bedeutung "Run").



    2. Die versteckte Anweisung zum Programmabbruch


    Anfangs stellt der HP12C nur 8 Programmschritte zur Verfügung. Wächst das Programm, wird automatisch je ein Datenregister in 7 Programmschritte gewandelt. Ganz kurz streift das Handbuch nun eine Möglichkeit, den letzten Programmschritt "GTO 00" für den Programmstop einzusparen, indem stattdessen eine andere feste, versteckte Anweisung genutzt wird. Sie befindet sich quasi unmittelbar nach dem letzten Programmplatz des für das Programm reservierten Speichers, also nach dem letzten Block aus reservierten 7 Schritten, die alle mit "GTO 00" vorbelegt sind. Dieser Umstand wird recht verschwommen wiedergegeben:


    Quote

    "If your program should consist of exactly eight instructions, there would be no GTO 00 instructions remaining at the end of program memory. Nevertheless, after such a program is executed the calculator automatically returns to program line 00 and halts, just as if there were a GTO 00 instruction following the program"

    (S. 104 engl. Original, S. 93 ed. 5, 2008).


    Das heißt nichts anderes, als dass man unmittelbar nach Schritt 08, am Ende des ersten Blocks von Programmschritten, kein Datenregister in 7 weitere Schritte (von 09 bis 15) reservieren muss, um in Schritt 09 ein "GTO 00" einzuschreiben. Stattdessen greift der Rechner auf eine zweite versteckte Anweisung, GTO 00, ohne dass er dafür einen Block neuer Schritte anlegt. Angewandt wird dieser Trick in der Regel, um in Schritt 99 auf das GTO 00 zu verzichten.


    Soweit nichts Neues. Im Handbuch unerwähnt bleibt, dass dies auch am Ende aller folgenden Siebenerblöcke von Programmschritten möglich ist, d.h. konkret bei den Schritten 08, 15, 22, 29, ..., 64, 71, 85, 92 und 99. Befindet sich der letzte eingegebene Programmschritt auf einer dieser Adressen, braucht man das Programm nicht explizit mit GTO 00 beenden, denn es läuft von selbst auf solch eine versteckte Anweisung auf. Nennen wir sie:


    100 GTO 00 (Schritt 100, weil dies der erste oberhalb des für den Anwender sichtbaren Bereichs 01 bis 99 wäre)


    Nutzen kann man diesen Mechanismus nur alle 7 Schritte, eben immer am Ende des höchsten zugewiesenen Blocks.



    3. Die versteckte Anweisung zum Neustart


    Beim Experimentieren mit einem Achtzeiler fiel mir auf, dass eine weitere versteckte Anweisung dem versteckten "100 GTO 00" folgt:


    101 GTO 01


    Die ist etwas sonderbar, denn man erreicht sie nur über den Umweg einer nicht erfüllten Sprungbedingung.



    Ein Beispielprogramm


    Hier ein kurzer Achtzeiler, der alle drei versteckten Anweisungen des HP12C verwendet:


    (Vor der Eingabe muss man den Programmspeicher löschen: f P/R, f CLEAR PRGM)


    «00 R/S» (unsichtbar)

    01 RCL n

    02 g LN

    03 +

    04 f 0

    05 g PSE

    06 ENTER

    07 CLx

    08 g x<=y

    «100 GTO 00» (unsichtbar)

    «101 GTO 01» (unsichtbar)


    (f P/R um zum "Run"-Modus zurückzukehren)


    Im 12C aus den 80ern (Nut-Prozessor) gibt man vor Programmstart den Wert 6,66 in Register n ein. Für die schnellere Version mit ARM-Prozessor (ab 2008, mit 2 Zellen CR2032) passt der Wert 3,125:


    6.66 STO n (bzw. 3.125 STO n)


    Dann gibt man einen negativen Zählwert (z.B. 30 secondes), startet schließlich das Programm:


    30 CHS R/S


    Es läuft nun eine Art "Countdown" und eine halbe Minute später hält das Programm bei Null, nach kurzem Abstecher in negatives Territorium. Und das wohlgemerkt ohne Verzweigung, jedenfalls ohne sichtbare ...


    Dieser automatische Rücksprung zu Adresse 01 funktioniert ähnlich im HP 11C (das Modell erschien zeitgleich mit dem 12C). Und im Schwestermodell 12C Platinum ist es genau das gleiche, ausser dass man die Schrittnummern anzupassen hat:


    «00 R/S» --> «000 R/S»

    «100 GTO 00» --> «400 GTO 000»

    «101 GTO 01» --> «401 GTO 001»


    In den Dokumentationen der drei Maschinen konnte ich zur letzten der versteckten Anweisungen, der zum Neustart, leider nichts finden. Auch im HP Museum Fehlanzeige. Kann jemand aus dem Forum dazu etwas beisteuern?



    Beste Grüsse

    Thorsten

    : RPN ."Register-Postfix-Notation" ;

  • Das Beispiel mit gleich zwei versteckten Sprüngen ist etwas verwirrend, deshalb noch ein einfacheres: eine Routine zur Berechnung des Größten gemeinsamen Teilers (GgT) zweier natürlicher Zahlen a und b nach dem modernen Euklidischen Algorithmus.


    Vor Eingabe ist der Programmspeicher zu löschen, mit f P/R, f Clear PRGM.

    Die Routine besteht aus einer großen Schleife von Schritt 01 bis 15. Die Symbole vor den Zeilen verdeutlichen den Ablauf. Wird der Divisor b_{i} Null, ist der GgT gefunden, dann erfolgt ein Sprung nach Zeile 15 zur Ausgabe des Ergebnisses. Der sonst erforderliche Stopbefehl in Zeile 16 mit GTO 00 entfällt, da Schritt 15 der letzte Schritt des zugewiesenen Speichers ist.


    Test

    44 ENTER 12 R/S

    Ergebnis: 4

    : RPN ."Register-Postfix-Notation" ;