SGN (ROM-Routine)

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Anmerkung: Dieser Artikel beschreibt die numerische SGN-Routine im BASIC-ROM.

Name: ABS
Beschreibung: Signum-Funktion von Fließkommaregister FAC berechnen
Einsprungpunkt: $BC39 / 48185
Übergebene Argumente:
Sonstige: FAC = Argument der Signum-Funktion
Rückgabe-Werte:
Negative-Flag: 0
Sonstige: FAC = Resultierender Wert der Signum-Funktion

Die ROM-Routine SGN[1][2] berechnet die Signum-Funktion der im Fließkommaregister FAC gespeicherten Zahl. Ihr Einsprungpunkt ist in der Tabelle der BASIC-Funktionen an Adresse $A052 hinterlegt, so dass die Routine bei jeder Auswertung der Funktion SGN vom BASIC-Interpreter aufgerufen wird.

War die Zahl in FAC vor dem Aufruf von SGN negativ, setzt SGN den Wert dieses Fließkommaregisters auf -1; im Fall einer positiven Zahl schreibt SGN den Wert 1 hinein. Ein Wert von 0 bleibt durch den Aufruf von SGN unverändert. Außer dem Fließkommaregister FAC ändert SGN keine weiteren Speicherinhalte.

Algorithmus[Bearbeiten | Quelltext bearbeiten]

  1. SGN ruft zunächst die ROM-Routine SIGN auf, die den Wert von FAC prüft. Im Fall einer negativen Zahl in FAC enthält der Akkumulator anschließend den Wert 255/$FF, im Fall einer positiven Zahl den Wert 1/$01. Ist FAC dagegen 0, so setzt SIGN den Wert von A auf 0. A enthält damit bereits das gewünschte Resultat von SGN, allerdings als 8-Bit-Ganzzahl in der Zweierkomplement-Darstellung.
  2. Um diese Ganzzahl in eine Fließkommazahl zu verwandeln, schreibt SGN nun den Akkumulator in das höchstwertige Byte der Mantisse von FAC, füllt die restliche Mantisse mit Nullbytes auf und setzt das Exponentenbyte auf 136/$88, entsprechend einem Exponenten von 8 (ohne Exzess). Der Wert von FAC ist damit gleich dem Wert des ersten Mantissenbyte, und FAC kann als nicht-normalisierte Fließkommazahl aufgefasst werden. Allerdings wird der Wert -1 noch im Zweierkomplement dargestellt. SGN springt daher zum Abschluss in die ROM-Routine FSUB an die Stelle, an der negative Resultate invertiert und dafür das Vorzeichen auf "negativ" gesetzt wird, bevor FAC normalisiert wird.

Laufzeitverhalten[Bearbeiten | Quelltext bearbeiten]

Die Laufzeit von SGN bestimmt durch die Rechenzeit für die zugrundeliegende ROM-Routine SIGN, gegebenenfalls für die Invertierung und für die anschließende Normalisierung. Beim Aufruf mit einer negativen Zahl in FAC benötigt SGN 413 Systemtakte, bei einer positiven Zahl 322 Takte und bei FAC = 0 nur 239 Takte.

Ein Systemtakt entspricht auf dem Commodore 64 rund einer Mikrosekunde (μs).

Weblinks[Bearbeiten | Quelltext bearbeiten]

Quellen[Bearbeiten | Quelltext bearbeiten]