GIVAYF
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]
- Disassembly von GIVAYF/$B391 auf All About Your 64

- CodeBase 64: Floating Point Math

- C64 BASIC & KERNAL ROM Disassembly von Michael Steil

- C64OS: Floating Point Math from BASIC
