Der Stack des HP 49G

Die hier verwendete Notation ist in einem gesonderten Beitrag zusammengestellt.

Inhalt

Einleitung
Was ist ein Stack?
Was sagen die HP49-Handbücher?
Anschauliches Beispiel
Der Stack des HP 49G
Die Befehlszeile
Die Stackbefehle des HP 49G
Zusätzliche Stackbefehle
Der Interaktive Stack
Sichern des Stacks

Zur Beitragsübersicht


Einleitung

Schon die ersten HP-Tischrechner (z.B. der HP 9800 B im Jahr 1970) wurden mit einem Stack ausgestattet, der allerdings nur vier Register (Register = Speicherplatz für eine komplette Zahl) besaß.

Auch der erste Taschenrechner HP 35 besaß einen Stack mit 4 Registern. Erst bei späteren HP-Taschenrechnern wurde die Anzahl der Stack-Register erhöht. Beim HP 48GX und beim HP 49G ist die Anzahl der Speicherplätze des Stacks beliebig und nur von der Größe des verfügbaren Benutzerspeichers abhängig.

Hier wird nur der Stack des HP 49G besprochen. Dieser ist im RPN-Modus verfügbar. Der im ALG-Modus verfügbare "History-Speicher" hat eine andere Wirkungsweise und wird hier nicht behandelt.

 

Was ist ein Stack?

"Stack" ist das englische Wort für "Stapel". Das Wort "Stack-Speicher" sollte vermieden werden, weil dort keine "Stacks" gespeichert werden. Der Stack ist Teil des normalen Arbeitsspeichers, der in besonderer Weise vom System gehandhabt wird.

Die Mikroprozessoren (Z80, 8086 bis 80486 und deren Nachfolger vom Typ Pentium ), die als Zentraleinheiten (CPU) für Computer verwendet werden, besitzen hardwaremäßig die Stackfunktion und reagieren auf entsprechende Stackbefehle.

Der Stapelzeiger, Stackpointer (SP) genannt, wird vom Betriebssystem auf eine bestimmte Basisadresse gesetzt. Die Speicherung und der Abruf der Werte werden dann von der Hardware automatisch gehandhabt. Man braucht bei den Stackbefehlen keine Adressen anzugeben. Die Hardware zählt den SP beim Speichern entsprechend hoch (engl.: increment = um 1 erhöhen) und beim Zurückholen der Werte entsprechend zurück (engl.: decrement = um 1 vermindern). Ist die Basisadresse des SP beim "decrement" wieder erreicht, wird der Stack als "leer" gemeldet.

Das Arbeiten mit einem Stack darf nicht mit "Stapelverarbeitung" verwechselt werden, bei der von einer Computeranlage Aufträge, die in einer Job-Liste gespeichert sind, nacheinander automatisch erledigt werden. Auch beim DOS-PC gibt es Stapelbefehle, die in Batch-Dateien (Endung .BAT) gespeichert sind, die aber auch nichts mit unserem Stack hier zu tun haben.

Was sagen die HP49-Handbücher?

Der Stack ist im HP49-Benutzerhandbuch (Nr. F1633-90008) auf Seite 2-20 und 2-21 nur kurz beim RPN-Modus erwähnt. Informationen darüber könne man sich auf der angegebenen HP-Webseite holen, heißt es dort.

Im HP49-Benutzerhandbuch für Fortgeschrittene (Nr. F1633-90408) ist der Stack im Kapitel 4 auf knapp 4 Seiten beschrieben.

Sehr ausführlich beschrieben ist der Stack (und auch der Interaktive Stack) im HP48G-Benutzerhandbuch (Nr. 00048-90127) auf den Seiten 3-1 bis 3-13. Diese Beschreibung gilt auch weitgehend für den HP 49G. Notfalls sollte man darauf zurückgreifen!

 

Anschauliches Beispiel

Angenommen, auf einer Tischplatte seien 5 Bücher gestapelt. Bei der Umordnung des Bücherschranks soll diese schon belegte Tischplatte zur Zwischenlagerung verwendet werden.

Vorgang:

Der Stack des HP 49G

Die im Beispiel gezeigte Arbeitsweise des LIFO-Stacks ist hardwaremäßig in der Zentraleinheit (CPU) des Taschenrechners implementiert und ist die schnellste Möglichkeit des Speicherzugriffs. Legt ein Programm die Werte auf dem Stack ab und holt sich diese dort wieder für den nachfolgenden Berechnungsgang, dann muß der Programmierer nur auf die Reihenfolge achten (LIFO!), damit nicht der falsche Wert verarbeitet wird. Anstelle des Stackpointers gibt es beim HP 49G "Stackebenen" oder "Levels". Der Einfachheit halber wird im folgenden Text nur von "Ebenen" gesprochen.

Bei der Stackanzeige auf dem HP 49G gilt: "umgekehrter Stack"

Die unterste Zeile (= unterste Ebene = Level 1) der Stackanzeige hat immer die Nummer 1, dort wird der erste Wert gespeichert. Speichert man einen zweiten Wert im Stack, nimmt dieser die Ebene 1 in Anspruch und der vorher gespeicherte wird auf die Ebene 2 (2. Zeile von unten mit der Zeilennummer 2) gehoben.
Der neue Wert wird also nicht oben drauf gelegt, sondern immer unten drunter geschoben (bildlich!).

Beim Zurückholen der Werte wird immer der Wert der Ebene 1 genommen und die oben drüber befindlichen Werte rutschen dann um eine Zeile nach unten.

Die Befehlszeile

Eingabe

Beim HP 49G wird bei jeder Eingabe von Zahlen oder Zeichen mit dem ersten Tastendruck (ausgenommen Funktionstasten wie SIN, MODE, APPS, TOOL usw.) automatisch die Befehlszeile am unteren Rand des Stacks gestartet. Sie hebt den Stack an, hat aber keine Nummer.

Die Tastenfolge [rightshift][ENTRY] öffnet ebenfalls die Befehlszeile.

Mit [ENTER] wird die normale Eingabe beendet und der Inhalt der Befehlszeile in die Ebene 1 übernommen, die Befehlszeile verschwindet und der Stack rutscht wieder nach unten in die alte Lage.

Mit [CANCEL] (= [ON]) wird die Eingabe abgebrochen und die Befehlszeile verlassen.

Befehle

In die Befehlszeile werden auch die Befehle über die Tastatur eingegeben und mit [ENTER] gestartet.

Editieren

Portadressen

Mit [rightshift][ALPHA] (= [rightshift][ENTRY]) wird die Befehlszeile ohne Eingabe eines Inhalts gestartet, anschließend kann z. B. in einem Portspeicher durch Tastendruck auf einen Menüpunkt die Portadresse in die Befehlszeile übernommen werden.

Befehlszeilen-Operationen

Im HP49-Benutzerhandbuch ist die "Verwendung der Befehlszeile" auf den Seiten 2-7 bis 2-12 beschrieben. Die Tabelle 2.2 auf der Seite 2-13 listet alle Befehlszeilen-Operationen auf, so daß hier auf weitere Erläuterungen verzichtet werden kann.

Die Stackbefehle des HP 49G

Nicht immer gibt sich der Anwender mit der ursprünglichen Reihenfolge der Werte im Stack zufrieden. Deshalb gibt es Befehle zum Umordnen des Stacks.

Das Stackmenü startet man mit [TOOL][STACK]. Dort werden 19 Stackbefehle angeboten, die in folgender Tabelle aufgelistet sind.

Tabelle der Stackbefehle

Die in Spalte 1 der Tabelle angegebenen Stackbefehle können im Eingabemodus und auch in Programmen als Befehle verwendet werden. DUP, DROP und SWAP können auch direkt über die Tastatur aktiviert werden.

Die Beschreibung und die Beispiele gelten unter der Voraussetzung, daß die Stackbefehle der Tabellenspalte 1 (einschließlich einer evtl. Zahl n) von der Befehlszeile oder von einem Programm aus aufgerufen werden bzw. die Befehlseingabe den ursprünglichen Stack, auf den sich die Befehle beziehen, nicht verändert.
Die Beispiele der folgenden Tabelle (in den Spalten 3 und 4) werden der Einfachheit halber mit Zahlen durchgeführt. Es können aber beliebige Objekte im Stack stehen. In den Beispielen stellt die Zahl vor dem Doppelpunkt die Nummer der Ebene dar.

Stack-Befehl Beschreibung Stack
vorher
Stack
nachher
1 2 3 4
DUP Dupliziert den Inhalt der Ebene1, so daß dieser dann in den Ebenen 1 und 2 steht.
Den gleichen Effekt hat das Drücken der [ENTER]-Taste, wenn der Stack nicht leer ist.
2: 34
1: 18
3: 34
2: 18
1: 18
SWAP Vertauscht die Inhalte der Ebenen 1 und 2.
Der gleiche Effekt wird erreicht, wenn die Cursor-Taste [>] (=Tastenkennung 36.1) gedrückt wird und mindestens zwei Ebenen belegt sind.
2: 34
1: 18
2: 18
1: 34
DROP Löscht den Inhalt der Ebene 1. Der gleiche Effekt wird erreicht, wenn die Rücktaste [<=] (= "Backspace", Tastenkennung 45.1) gedrückt wird und mindestens eine Ebene belegt ist. 2: 34
1: 18
1: 34
OVER Liefert eine Kopie des Inhalts der Ebene 2 und legt sie in Ebene 1 ab. 2: 34
1: 18
3: 34
2: 18
1: 34
ROT

= 3 ROLL (siehe unten)
Rollt die ersten drei Inhalte des Stacks (nach oben):
Der Inhalt der Ebene 3 wird nach Ebene 1 geholt und die Inhalte von Ebene 1 und 2 werden um eine Zeile nach oben geschoben. Die Inhalte ab Ebene 4 (und höher) bleiben unverändert.
5: 78
4: 66
3: 55
2: 34
1: 18
5: 78
4: 66
3: 34
2: 18
1: 55
UNROT

= 3 ROLLD (siehe unten)
Bewirkt das Gegenteil von ROT (macht ROT rückgängig).
Rollt die ersten drei Inhalte des Stacks (nach unten):
Der Inhalt der Ebene 1 wird nach Ebene 3 geholt und die Inhalte von Ebene 2 und 3 werden um eine Zeile nach unten geschoben. Die Inhalte ab Ebene 4 (und höher) bleiben unverändert.
5: 78
4: 66
3: 55
2: 34
1: 18
5: 78
4: 66
3: 18
2: 55
1: 34
n ROLL Rollt die n Inhalte der Ebenen 1 bis n um 1 Zeile nach oben. Die Inhalte der höheren Ebenen bleiben unverändert.
Beispiel: 4 ROLL

Beim Interaktiven Stack stellt man die Zeilenmarke in die n-te Zeile. Der Befehl rollt dann den Inhalt der Ebenen 1 bis n um 1 Zeile nach oben.

5: 88
4: 78
3: 66
2: 55
1: 34
5: 88
4: 66
3: 55
2: 34
1: 78
n ROLLD Rollt die n Inhalte der Ebenen 1 bis n um 1 Zeile nach unten (roll down). Die Inhalte der höheren Ebenen bleiben unverändert.

Beispiel: 4 ROLLD

Beim Interaktiven Stack stellt man die Zeilenmarke in die n-te Zeile. Der Befehl rotiert dann den Inhalt der Ebenen 1 bis n um 1 Zeile nach unten.

5: 88
4: 78
3: 66
2: 55
1: 34
5: 88
4: 34
3: 78
2: 66
1: 55
n PICK Legt eine Kopie des Inhalts der Ebene n in Ebene 1 ab.

Beispiel: 3 PICK

Beim Interaktiven Stack stellt man die Zeilenmarke in die n-te Zeile und aktiviert PICK.

4: 78
3: 66
2: 55
1: 34
5: 78
4: 66
3: 55
2: 34
1: 66
n UNPICK Ersetzt den Inhalt der Ebene n+1 durch den Inhalt der Ebene 1 und löscht den Inhalt der Ebene 1. Macht ein vorheriges n PICK rückgängig.

Beispiel: 3 UNPICK

Beim Interaktiven Stack stellt man die Zeilenmarke in die n-te Zeile und aktiviert UNPICK.

5: 78
4: 66
3: 55
2: 34
1: 69
4: 78
3: 69
2: 55
1: 34
PICK3 Dupliziert den Inhalt der Ebene 3 in Ebene 1 4: 66
3: 55
2: 34
1: 18
5: 66
4: 55
3: 34
2: 18
1: 55
DEPTH Ermittelt die "Tiefe" des Stacks (eigentlich: "Höhe" des Stapels in der Stackanzeige). Die ermittelte Zahl gibt an, wieviele Ebenen vor dem Aufruf von DEPTH belegt waren. Diese Zahl wird auf Ebene 1 gelegt, so daß die Tiefe durch den Befehl um 1 erhöht wird. 5: 78
4: 66
3: 55
2: 34
1: 18
6: 78
5: 66
4: 55
3: 34
2: 18
1: 5
DUP2 Dupliziert die Inhalte der beiden untersten Ebenen. 3: 55
2: 34
1: 18
5: 55
4: 34
3: 18
2: 34
1: 18
n DUPN Dupliziert die Inhalte der n untersten Ebenen.

Beim Interaktiven Stack stellt man die Zeilenmarke in die n-te Zeile und aktiviert DUPN.

3: 55
2: 34
1: 18
6: 55
5: 34
4: 18
3: 55
2: 34
1: 18
DROP2 Löscht die untersten beiden Ebenen. 5: 78
4: 66
3: 55
2: 34
1: 18
3: 78
2: 66
1: 55
n DROPN Löscht die Inhalte der n untersten Ebenen.

Beispiel: 3 DROPN

Beim Interaktiven Stack stellt man die Zeilenmarke in die n-te Zeile und aktiviert DROPN.

5: 78
4: 66
3: 55
2: 34
1: 18
2: 78
1: 66
DUPDUP Bewirkt dasselbe wie die zweimalige Ausführung von DUP. 2: 34
1: 18
4: 34
3: 18
2: 18
1: 18
NIP Löscht den Inhalt der Ebene 2.
Bewirkt dasselbe wie die beiden Befehle SWAP und DROP hintereinander.
4: 66
3: 55
2: 34
1: 18
3: 66
2: 55
1: 18
n NDUPN Dupliziert den Inhalt der Ebene 1 (n-1)-mal, so daß er dann n-mal im Stack steht. n wird in Ebene 1 zurückgegeben.

Beispiel: 3 NDUPN

3: 55
2: 34
1: 18
6: 55
5: 34
4: 18
3: 18
2: 18
1: 3

 

Zusätzliche Stackbefehle

[ENTER] bewirkt dasselbe wie der Befehl DUP: Der Inhalt der Ebene 1 wird dupliziert.
[rightshift][CLEAR] löscht den gesamten Stack.
[leftshift][DEL] löscht den gesamten Stack.
[<=] = [Rücktaste]
(Tastenkennung 45.1)
löscht den Inhalt der Ebene 1.
LASTARG stellt das/die Argument(e) des letzten Funktionsaufrufs in den Stack.
[leftshift][CMD] zeigt (maximal) die letzten 4 Eingaben der Befehlszeile.
[rightshift][UNDO] stellt den Stackinhalt her, wie er vor der letzten Befehlsausführung war (funktioniert nicht immer!).

Der Interaktive Stack

Der Interaktive Stack ist in keiner HP49G-Dokumentation beschrieben. Deshalb wurde für die nachfolgenden Erläuterungen das HP48G-Benutzerhandbuch (Nr. 00048-90127), Seiten 3-1 bis 3-13, zu Hilfe genommen. Die Befehle und Angaben wurden mit dem HP 49G ausprobiert.

Der Interaktive Stack ist ein sehr starkes, eingebautes Tool
zum Anzeigen, Bearbeiten, Umordnen und Editieren der Inhalte des Stacks. Er steht für Programme nicht zur Verfügung, sondern funktioniert nur im Tastaturbetrieb, also interaktiv. Die Funktionen des Interaktiven Stacks ermöglichen die Bearbeitung der Inhalte jeder Stackebene ohne Umordnung des Stacks.

Der Interaktive Stack ermöglicht:

Start und Beendigung

Wenn eine oder mehrere Stackebenen belegt sind, kann der Start des Interaktiven Stacks mit der Taste [HIST] oder der Cursor-Taste [/\] erfolgen. Bei leerem Stack erhält man eine Fehlermeldung "Empty Stack".

Nach dem Start erscheint in Ebene 1 anstelle des Doppelpunkts der Stackzeiger (siehe Bild 1). Dieser kann zur Auswahl der zu bearbeitenden Ebene mit den Cursortasten [/\] und [\/] auf und ab bewegt werden. Hier gelten die im Editor-Modus üblichen Befehle mit den umgeschalteten Cursortasten (siehe Handbuch) zum Springen an den Anfang oder an das Ende des Stacks oder bildschirmweise bzw. an den oberen oder unteren Bildschirmrand. Der Stackzeiger zeigt immer die aktuelle Stackebene an, die zur Bearbeitung ansteht.

Beendet wird der Interaktive Stack durch Drücken der Taste [CANCEL] (=[ON]).

Menü

Der Interaktive Stack bietet nach dem Start das Menü des Interaktiven Stacks an, das die zur Verfügung stehenden Stackbefehle enthält. Nachstehende Bilder zeigen zwei Seiten des Menüs. Auf der dritten Seite befindet nur noch der Menüpunkt [LEVEL].

Bild 1: Menü des Interaktiven Stacks (Seite 1) Bild 2: Menü des Interaktiven Stacks (Seite 2)

Bild 1 zeigt den Stackzeiger in Ebene 1 und Bild 2 zeigt ihn in Ebene 7.

Beschreibung der Menü-Funktionen

In der folgenden Tabelle wird der Begriff "aktuelle Ebene" benutzt:
Die aktuelle Ebene ist diejenige Stackebene, in der sich der Stackzeiger befindet.

Funktion Beschreibung
ECHO Kopiert den Inhalt der aktuellen Ebene an die Cursorposition der Befehlszeile.
VIEW Anzeigen oder Ändern des Objekts der aktuellen Ebene in der am besten geeigneten Umgebung (hängt vom Objekttyp ab). Mit [ENTER] wird die Änderung abgeschlossen, mit [CANCEL] wird die Änderung abgebrochen.
EDIT Kopiert das Objekt der aktuellen Ebene zum Ändern in die Befehlszeile. Mit [ENTER] wird die Änderung abgeschlossen, mit [CANCEL] wird die Änderung abgebrochen.
PICK Kopiert den Inhalt der aktuellen Ebene in die Ebene 1. Der ganze Stapel wird dadurch um eine Zeile angehoben. Der Stackzeiger behält seine vorherige Nummer.
ROLL Verschiebt den Inhalt der aktuellen Ebene in die Ebene 1 und rollt den Rest des Stacks unterhalb der aktuellen Ebene nach oben.
Entspricht n ROLL (siehe obige Tabelle), wobei n durch die Position des Stackzeigers gegeben ist.
ROLLD Verschiebt den Inhalt der Ebene 1 in die aktuelle Ebene und rollt den Rest des Stacks unterhalb der aktuellen Ebene nach unten.
Entspricht n ROLLD (siehe obige Tabelle), wobei n durch die Position des Stackzeigers gegeben ist.
->LIST Erstellt eine Liste mit den Inhalten der Ebene 1 bis zur aktuellen Ebene. Entspricht dem Befehl n ->LIST (aus dem PRG-Menü, Menü-Nr. 34.01), wobei n durch die Position des Stackzeigers gegeben ist.
DUPN Dupliziert die Inhalte der Ebenen von Ebene 1 bis zur aktuellen Ebene. Entspricht n DUPN (siehe obige Tabelle), wobei n durch die Position des Stackzeigers gegeben ist. Der Stapel wird entsprechend angehoben.
DROPN Löscht die Ebenen von Ebene 1 bis zur aktuellen Ebene. Entspricht n DROPN (siehe obige Tabelle), wobei n durch die Position des Stackzeigers gegeben ist. Der Stapel wird entsprechend kleiner.
KEEP Löscht die Ebenen über dem Stackzeiger, so daß nur die Inhalte von Ebene 1 bis zur aktuellen Ebene erhalten bleiben.
GOTO Bietet eine Eingabemaske, in der man die Nummer der gewünschten Ebene eingeben kann, zu der man springen möchte. Ist die Zahl höher als die Zahl der belegten Ebenen, so wird zur obersten Ebene gesprungen.
INFO Zeigt für die aktuelle Ebene in einer Messagbox die Größe in Bytes (Size) und die Checksumme (CRC) des Objekts sowie den Inhalt des Objekts selbst (nur soviel, wie davon in die Messagebox paßt) an.
LEVEL gibt die Position des Stackzeigers, also die Nummer der aktuellen Ebene an und stellt sie in die Ebene 1. Der ganze Stapel wird dadurch um eine Zeile angehoben. Der Stackzeiger behält seine vorherige Nummer.

Die [Rücktaste], also [<=] (Tastenkennung 45.1) löscht den Inhalt der aktuellen Ebene.

Beispiel:

Um z.B. die Inhalte der Ebene 5 und 6 zu vertauschen,
setzt man den Stackzeiger auf Ebene 5, ruft ROLL auf,
dann setzt man ihn auf Ebene 6 und ruft ROLLD auf.

Wenn man andere als die in der Tabelle aufgeführten Funktionen (z. B. Rechenoperationen) ausführen will, muß man den Interaktiven Stack durch [CANCEL] verlassen und mit dem normalen Stack arbeiten.

Sichern des Stacks

Eine Funktion zum Sichern der Inhalte des gesamten Stacks ist im HP 49G nicht vorhanden, weil sie mit wenig Aufwand selbst erstellt werden kann.

Sichern aller Stackinhalte

Der gesamte Stack kann durch folgendes Programm gesichert werden:

« DEPTH ->LIST 'Stack' STO »

Dieses Programm wird in die Variable STOST (= store stack) gespeichert.

Hinweise:

  1. Das Programm erzeugt bei Ausführung eine Variable 'Stack', in der eine Liste mit den Stackinhalten enthalten ist.
  2. Der Stack ist nach dem Programmaufruf leer.
  3. War der Stack vor dem Aufruf schon leer, ist auch die Liste in der Variablen 'Stack' leer.
  4. Ist die Variable vor dem Aufruf bereits vorhanden, wird der vorherige Inhalt von 'Stack' überschrieben.
Hinweis:
Eine Variable namens 'Stack' kann in verschiedenen Verzeichnissen gleichzeitig vorhanden sein. Sie ist für das aktuelle Verzeichnis "lokal" und für dessen Unterverzeichnisse "global".

Zurückholen der gesicherten Inhalte in den Stack

Die Stackinhalte können, falls sie vorher in 'Stack' gesichert wurden, mit folgendem Programm wieder zurückgeholt werden:

« Stack OBJ-> DROP »

Dieses Programm wird in die Variable 'RCLST' (= recall stack) gespeichert.
Beim Aufruf werden die gespeicherten Stackinhalte unten an den vorhandenen Stack angefügt, der entsprechend angehoben wird.

Hinweis:
Nach dem ersten Aufruf von STOST sollte RCLST ausgeführt werden, wenn man mit den bisherigen Inhalten weiterarbeiten will.

Löschen der Sicherung

Wenn die vom Programm STOST erzeugte Variable 'Stack' gelöscht wird, dann ist die Sicherung der Inhalte gelöscht.

Empfehlung:
Zweckmäßigerweise werden die beiden Programme STOST und RCLST auf jeweils eine Benutzertaste gelegt, damit aus jedem Verzeichnis darauf Zugriff besteht.

Zum Beginn des Beitrags
Zur Beitragsübersicht
Copyright © 2002 Otto Praxl
Alle Rechte vorbehalten!