GIVAYF

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Anmerkung: Dieser Artikel beschreibt die numerische GIVAYF-Routine zur Umwandlung von Ganzzahlen in Fließkommazahlen im BASIC-ROM.

Name: GIVAYF
Beschreibung: Signum-Funktion von Fließkommaregister FAC berechnen
Einsprungpunkt: $B391 / 45969
Übergebene Argumente:
Akkumulator: High-Byte der Ganzzahl
Y-Register: Low-Byte der Ganzzahl
Rückgabe-Werte:
Sonstige: FAC = In Fließkommazahl umgewandelte Ganzzahl

Die ROM-Routine GIVAYF — manchmal auch als INTFAC[1] oder INTFLP[2] bezeichnet — wandelt eine vorzeichenbehaftete 16-Bit-Ganzzahl in eine Fließkommazahl um. Die Ganzzahl muss dabei im Akkumulator (High-Byte) und im Y-Register (Low-Byte) übergeben werden, die resultierende Fließkommazahl wird im Fließkommaregister FAC abgelegt.

GIVAYF ändert nicht nur das Fließkommaregister FAC, sondern setzt auch das Datentyp-Kennzeichen an Adresse 13/$0D auf 0, entsprechend dem Datentyp "numerisch". Dieser Schritt ist bei der Implementierung eigener Numerik-Routinen unnötig und kann weggelassen werden, indem man die Routine GIVAYF erst an Adresse 45973 / $B395 anspringt.

Algorithmus[Bearbeiten | Quelltext bearbeiten]

GIVAYF schreibt zunächst die Ganzzahl in die höchstwertigen Bytes der Mantisse von FAC, füllt dann die Mantisse mit Nullbytes auf und setzt das Exponentenbyte auf 144/$90, entsprechend einem Exponenten von 16 (ohne Exzess). Der Wert von FAC ist damit gleich dem Wert der ersten beiden Mantissenbytes, und FAC kann als nicht-normalisierte Fließkommazahl aufgefasst werden. Allerdings werden negative Werte noch im Zweierkomplement dargestellt. GIVAYF 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 GIVAYF wird hauptsächlich bestimmt durch die Rechenzeit für die Invertierung (im Fall negativer Ganzzahlen) und für die anschließende Normalisierung. Sie liegt für positive Ganzzahlen zwischen 120 Takten für die Zahl 16384 ($4000) und 339 Takten für die Zahl 1 ($0001), für negative Zahlen zwischen 182 Takten für die Zahl -32768 ($8000) und 427 Takten für -1 ($FFFF). Wird GIVAYF mit den Registerinhalten A = 0 und Y = 0 aufgerufen, so liegt die Laufzeit der Routine bei 227 Takten.

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

Weblinks[Bearbeiten | Quelltext bearbeiten]

Quellen[Bearbeiten | Quelltext bearbeiten]