Die hier verwendete Notation ist in einem gesonderten Beitrag zusammengestellt.
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.
"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.
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!
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 SP wird auf 5 gesetzt: SP = 5. Das ist die Basisadresse des Stacks. Die vorhandenen 5 Bücher sind damit berücksichtigt, interessieren aber im weiteren Verlauf nicht, weil ein anderer sie hingelegt hat.
- Ein Buch nach dem anderen wird auf diesen vorhandenen Stapel gelegt und der SP jedes Mal um eins hochgezählt.
- Man kann immer nur das oberste Buch wegnehmen, denn der Stack ist ein LIFO-Speicher (LIFO = Last In First Out), bei dem das zuletzt hingelegte Buch zuerst weggenommen werden muß.
- Solange der SP > 5 ist, kann ein Buch nach dem anderen von oben weggenommen werden. Der SP wird danach jedes Mal um eins vermindert.
- Wenn SP = 5 erreicht ist, darf kein Buch mehr weggenommen werden, denn "unser" Stack ist leer (die ursprünglich vorhandenen Bücher gehören ja einem anderen). Wenn man trotzdem eines der darunter liegenden Bücher wegnähme, wäre dies gegen die Stackregeln und man bekäme bei einem echten Computersystem die Fehlermeldung "Stack leer!".
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.
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
- Editor starten:
Das Drücken der Cursor-Taste [\/] (= Tastenkennung 35.1) bewirkt, daß der Inhalt der Ebene 1 in die Befehlszeile (=Editormodus) übernommen wird. Dort kann er editiert werden (bearbeitet) werden.- Editor regulär beenden:
Mit [ENTER] wird der Editor beendet und der geänderte Inhalt der Befehlszeile in die Ebene 1 übernommen (der alte Inhalt wird überschrieben), die Befehlszeile verschwindet und der Stack rutscht wieder nach unten in die alte Lage.- Editierung abbrechen:
Mit [CANCEL] (= [ON]) kann der Editor vorzeitig beendet werden, die Weiterbearbeitung wird abgebrochen (die Änderungen verworfen) und die Befehlszeile verlassen. Der vorherige Inhalt der Ebene 1 bleibt erhalten.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.
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
vorherStack
nachher1 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: 183: 34
2: 18
1: 18SWAP 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: 182: 18
1: 34DROP 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: 181: 34 OVER Liefert eine Kopie des Inhalts der Ebene 2 und legt sie in Ebene 1 ab. 2: 34
1: 183: 34
2: 18
1: 34ROT
= 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: 185: 78
4: 66
3: 34
2: 18
1: 55UNROT
= 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: 185: 78
4: 66
3: 18
2: 55
1: 34n 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 ROLLBeim 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: 345: 88
4: 66
3: 55
2: 34
1: 78n 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: 345: 88
4: 34
3: 78
2: 66
1: 55n PICK Legt eine Kopie des Inhalts der Ebene n in Ebene 1 ab.
Beispiel: 3 PICKBeim Interaktiven Stack stellt man die Zeilenmarke in die n-te Zeile und aktiviert PICK.
4: 78
3: 66
2: 55
1: 345: 78
4: 66
3: 55
2: 34
1: 66n 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 UNPICKBeim Interaktiven Stack stellt man die Zeilenmarke in die n-te Zeile und aktiviert UNPICK.
5: 78
4: 66
3: 55
2: 34
1: 694: 78
3: 69
2: 55
1: 34
PICK3 Dupliziert den Inhalt der Ebene 3 in Ebene 1 4: 66
3: 55
2: 34
1: 185: 66
4: 55
3: 34
2: 18
1: 55DEPTH 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: 186: 78
5: 66
4: 55
3: 34
2: 18
1: 5DUP2 Dupliziert die Inhalte der beiden untersten Ebenen. 3: 55
2: 34
1: 185: 55
4: 34
3: 18
2: 34
1: 18n 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: 186: 55
5: 34
4: 18
3: 55
2: 34
1: 18DROP2 Löscht die untersten beiden Ebenen. 5: 78
4: 66
3: 55
2: 34
1: 183: 78
2: 66
1: 55n 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: 182: 78
1: 66DUPDUP Bewirkt dasselbe wie die zweimalige Ausführung von DUP. 2: 34
1: 184: 34
3: 18
2: 18
1: 18NIP Löscht den Inhalt der Ebene 2.
Bewirkt dasselbe wie die beiden Befehle SWAP und DROP hintereinander.4: 66
3: 55
2: 34
1: 183: 66
2: 55
1: 18n 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: 186: 55
5: 34
4: 18
3: 18
2: 18
1: 3
[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 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:
- das Verschieben des Fensters zur Anzeige der anderen Stackebenen.
- das Verschieben und Kopieren von Objekten in andere Ebenen.
- das Kopieren des Inhalts jeder beliebigen Ebene in die Befehlszeile.
- das Löschen von Objekten aus dem Stack.
- das Ändern von Stack-Objekten.
- das Anzeigen von Stack-Objekten in einer entsprechenden Umgebung.
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 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.
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:
- Das Programm erzeugt bei Ausführung eine Variable 'Stack', in der eine Liste mit den Stackinhalten enthalten ist.
- Der Stack ist nach dem Programmaufruf leer.
- War der Stack vor dem Aufruf schon leer, ist auch die Liste in der Variablen 'Stack' leer.
- 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!