SGN (ROM-Routine)
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]
- 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.
- 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]
- Disassembly von ABS/$BC39 auf All About Your 64
- CodeBase 64: Floating Point Math
- C64 BASIC & KERNAL ROM Disassembly von Michael Steil
- C64OS: Floating Point Math from BASIC