Arbeiten mit Flags

Die hier verwendete Notation ist in einem gesonderten Beitrag zusammengestellt.

Was sind Flags?

Ein Flag ist ein Merker vom Typ LOGICAL (1 Bit), der gesetzt sein kann (Zustand "gesetzt" = "wahr" = "TRUE" = "T" = 1) oder nicht gesetzt sein kann (Zustand "gelöscht" = "falsch" = "FALSE" = "F" = 0).

Wer sich mit Bits und anderen Begriffen der binären Zahlendarstellung noch nicht auskennt, findet im Beitrag "Zahlensysteme" die nötigen Grundlagen.

Der HP 49G bietet 128 Systemflags und 128 Benutzerflags (user flags).

Systemflags: Nummern -1 bis -128,
Benutzerflags: Nummern +1 bis +128.

Das Arbeiten mit Flags

Zum Setzen, Löschen und Abfragen von Flags gibt es ein Menü, das man über die Tastenfolge [leftshift|][PRG][TEST][NXT][NXT] aufrufen kann. Es enthält 6 Funktionen (Menüfelder). Vor dem Aufruf einer dieser Funktionen muß die Flagnummer im Stack stehen. Das Ergebnis wird wieder in den Stack zurückgegeben.

SF setzt das Flag
CF löscht das Flag
FS? prüft ob das Flag gesetzt ist und gibt 1 (wenn gesetzt) oder 0 (wenn gelöscht) zurück
FC? prüft ob das Flag gelöscht ist und gibt 1 (wenn gelöscht) oder 0 (wenn gesetzt) zurück
FS?C prüft ob das Flag gesetzt ist und gibt 1 (wenn gesetzt) oder 0 (wenn gelöscht) zurück und löscht dann das Flag.
FC?C prüft ob das Flag gelöscht ist und gibt 1 (wenn gelöscht) oder 0 (wenn gesetzt) zurück und löscht dann das Flag.

Der HP 49G arbeitet mit Systemflags, die für die Voreinstellung der Arbeitsbereiche, Formate und anderer Parameter verwendet werden. Von den im System möglichen 128 Systemflags (diese haben ein negatives Vorzeichen) hat HP in der Kurzanleitung zum HP 49G lediglich 103 dokumentiert. Die Systemflags und die zugeordneten Einstellungen sind der Tabelle der Systemflags zu entnehmen.

Außer den Systemflags gibt es beim HP 49G 128 Benutzerflags (diese haben ein positives Vorzeichen), die beliebig verwendet werden können.

Nicht mehr frei sind die Benutzerflags +60 und +61, die für die Konstantenbibliothek als Systemflags mißbraucht werden.

Zustandsanzeige der Flags

Nachdem der HP 49G mit 64 Bit breiten Binärzahlen arbeitet, genügen 4 Binärzahlen, um alle Flags darin zu speichern.

Die Flags werden mit dem Befehl RCLF (= recall flags) in den Stack geholt. Sie werden in einem Listenobjekt gezeigt, das vier Binärzahlen zu je 64 Bit enthält. Wir wählen die Hexa-Darstellung, um die Inhalte auf dem Bildschirm des HP 49G darzustellen (siehe Bild rechts).

 

Bild 1: System- und Benutzerflags als BinärzahlenDie Darstellung der Flags in dieser Liste erfolgt in der Reihenfolge
{#untere 64 Systemflags
#untere 64 Benutzerflags
#obere 64 Systemflags
#obere 64 Benutzerflags
}
,
wobei das jeweils niedrigste Bit ganz rechts steht.

 

Bild 2: Systemflags in Zehnergruppen (Flag -1 = links oben)Im zweiten Bild (siehe rechts) ist derselbe Zustand der Systemflags in Zehnergruppen aufgeteilt worden, wobei das niedrigste Flag mit der Flagnummer -1 links oben steht.
Diese Darstellung entspricht den beiden Hexa-Zahlen #8010000400040038h #0020030A03184FF6h des ersten Bildes, wobei die zweite Binärzahl links noch mit Nullen auf 16 Hexa-Ziffern ergänzt wurde. Bei dieser Hexa-Zahl steht das niedrigste Bit ganz rechts und repräsentiert das Flag Nr. -1.

Bild 3: Benutzerflags in Zehnergruppen (Flag 1 = links oben)Für die Darstellung der Benutzerflags wurde hier das Flag Nr 1 und Nr. 128 gesetzt, weil sie sonst als zwei Binärzahlen mit dem Wert Null ausgegeben werden, an denen man das Wesentliche nicht sieht. Im dritten Bild (siehe rechts) ist derselbe Zustand der Benutzerflags in Zehnergruppen aufgeteilt worden, wobei das niedrigste Flag mit der Nummer 1 links oben steht. Diese Darstellung entspricht den beiden Hexa-Zahlen #8000000000000000h #0000000000000001h des ersten Bildes, wobei die zweite Binärzahl links noch mit Nullen auf 16 Hexa-Ziffern ergänzt wurde. Bei dieser Hexa-Zahl steht das niedrigste Bit ganz rechts und repräsentiert das Flag Nr. 1.

Die obigen Darstellungen der System- und Benutzerflags als Zehnergruppen wurden über die beiden Programme SYSFL und USRFL erzeugt, die dem Leser zur Verfügung stehen. Zur Unterscheidung der Flags-Darstellung wurde jeweils in der Anzeige "Systemflags" oder "Userflags" eingefügt. Diese Programme sind sehr einfach aufgebaut: Sie fragen in einer (langsamen!) Schleife jeweils ab, ob das Flag gesetzt ist oder nicht und schreiben das Ergebnis in eine Zeichenkette. Die Programme brauchen zur Erzeugung des Ergebnisses jeweils ca. 35 Sekunden. (Man könnte auch die oben erwähnten vier 64-Bit-Binärzahlen "auseinanderzupfen" und als Einzelbits ausgeben. Vielleicht versucht sich einmal jemand daran, der Beitrag "Zahlensysteme" gibt Hinweise, wie man so etwas macht.)

Sichern und Setzen aller Flags

Wie oben bei der Zustandsanzeige schon gezeigt, lassen sich die Zustände aller Flags gemeinsam durch den Befehl RCLF (= recall flags) in den Stack holen und können in einer Variablen abgespeichert werden. Über den umgekehrten Weg kann der Inhalt der Variablen in den Stack und von dort über STOF (= store flags) wieder in die Flags zurückgespeichert werden.

Dies ist von Vorteil, wenn Programme Flags verändern und nach Beendigung dieser Programme der vorherige Zustand der Flags wieder hergestellt werden muß. Am Beginn des Programm wird dann der Befehl RCLF aufgerufen, wobei der Zustand aller Flags gesichert wird. Diesen Zustand kann man mit STOF am Schluß des Programm wieder herstellen.

Leserbeitrag vom 11.03.2000

Die obige Anregung des "Auseinanderzupfens" hat Herr Richard Gretmann in die Tat umgesetzt und zwei Programme SYFLG und USFLG (das G im Programmnamen soll auf den Autor deuten) geschickt, die zwar etwas aufwendiger sind, dafür aber das Ergebnis in 3 Sekunden liefern.

Die beiden Bilder zeigen die Darstellung. Allerdings unterscheiden sich die Anzeigen vom obigen Beispiel. Hier steht das jeweils niedrigste Flag unten rechts.

Bild 4: Systemflags in Zehnergruppen, niedrigstes Flag -1 rechts untenBild 5: Benutzerflags in Zehnergruppen, niedrigstes Flag Nr. 1 rechts unten

Dabei werden die durch RCLF in den Stack geholten Binärzahlen in einen binären String umgewandelt und dann in Zehnergruppen eingeteilt. Dargestellt sind die durch RCLF abgerufenen Flags, wie sie im nachfolgenden Bild gezeigt werden.

Bild 6: System- und Benutzerflags als Binärzahlen

 

Warnung:
Diese 4 Programme laufen im Originalzustand nicht auf dem HP 48G, da dieser jeweils nur 64 Systemflags und 64 Benutzerflags hat. Man kann die Programme SYSFL und USRFL aber durch Umstellung der Schleifendurchläufe von 128 auf 64 entsprechend anpassen.
Die anderen beiden Programme SYFLG und USFLG lassen sich nicht so einfach umstellen.

Zur Beitragsübersicht
Copyright © 2002 Otto Praxl
Copyright © für SYFLG und USFLG:
Richard.Gretmann@t-online.de
Alle Rechte vorbehalten!