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).

Verwandte Routinen[Bearbeiten | Quelltext bearbeiten]

Name Adresse
dez.
Adresse
hex.
Beschreibung
FACINX 45482 B1AA Zahl in FAC zu 16-Bit-Ganzzahl mit Vorzeichen wandeln (Y=LB, A=HB).
FIN 48371 BCF3 Nullterminierten PETSCII-String zu Fließkommazahl in FAC wandeln (Stringadresse in $7A/$7B). Erwartet erstes Zeichen im Akku und gelöschtes Carry-Flag, z.B. durch Aufruf von CHRGOT (JSR $0079).
STRVAL 47029 B7B5 PETSCII-String zu Fließkommazahl in FAC wandeln (String-Adresse in $22/$23, String-Länge im Akku).
FOUT 48605 BDDD Zahl in FAC zu nullterminiertem PETSCII-String wandeln (ab $0100 ff., Adresse auch in A, Y). Direkte Ausgabe des FAC-Inhalts als String ist auch über $AABC/43708 möglich.
GIVAYF 45969 B391 16-Bit-Ganzzahl mit Vorzeichen zu Fließkommazahl in FAC wandeln (Y=LB, A=HB).
QINT 48283 BC9B Zahl in FAC in 32-Bit-Ganzzahl mit Vorzeichen wandeln ($62-$65, Big-Endian-Reihenfolge).

Weblinks[Bearbeiten | Quelltext bearbeiten]

Quellen[Bearbeiten | Quelltext bearbeiten]