FADDT
Anmerkung: Dieser Artikel beschreibt die numerische FADDT-Routine im BASIC-ROM.
Name: | FADDT | ||||||
Beschreibung: | Fließkommaregister ARG zu Fließkommaregister FAC addieren | ||||||
Einsprungpunkt: | $B86A / 47210 | ||||||
Übergebene Argumente: | |||||||
Zero-Flag: | gesetzt falls FAC = 0, sonst gelöscht | ||||||
Sonstige: | FAC = Summand B, ARG = Summand A | ||||||
Rückgabe-Werte: | |||||||
Sonstige: | FAC = Ergebnis der Addition A+B, ARG = Summand A |
FADDT — manchmal auch als ADDFAC[1], ADD[2], oder einfach als PLUS[3] oder Plus[4] bezeichnet — addiert den Inhalt des Fließkommaregisters ARG zu der im Fließkommaregister FAC befindlichen Wert.
Nach dem Aufruf steht in FAC das Ergebnis der Addition, während ARG unverändert ist und für nachfolgend aufgerufene Numerik-Routinen weiter verwendet werden kann. Ist das Ergebnis der Addition zu groß für die Fließkommadarstellung des C64, so löst FADDT einen ?OVERFLOW ERROR aus. In diesem Fall ist FAC anschließend undefiniert, während ARG unverändert bleibt.
Neben dem Inhalt des Fließkommaregisters FAC ändert FADDT auch das Rundungsbyte des Hilfspuffers FAC#3 an Adresse 86/$56.
Verwendung[Bearbeiten | Quelltext bearbeiten]
FADDT ist eigentlich keine eigenständige ROM-Routine. Vielmehr ergibt sich ihr Einsprungpunkt dadurch, dass auf die Startadresse der Routine FADD ein Offset von 3 aufaddiert und dadurch der Aufruf der Routine CONUPK zu Beginn von FADD ausgelassen wird.
Bei der Nutzung von FADDT ist zu beachten, dass sich die Routine auf zwei Seiteneffekte von CONUPK verlässt. In jedem Fall darf beim Aufruf von FADDT das Zero-Flag nur dann gesetzt sein, wenn im Fließkommaregister FAC der Wert 0 gespeichert ist, denn bei gesetztem Zero-Flag überspringt FADDT alle Berechnungen und kopiert direkt den Inhalt von ARG nach FAC. Falls FAC ungleich 0 ist, so muss zudem das höchstwertige Bit von Adresse 111/$6F angeben, ob die Vorzeichen von FAC und ARG gleich sind (Bit ist gelöscht) oder verschieden sind (Bit ist gesetzt). Aufgrund dieses Bits unterscheidet FADDT zwischen einer Addition (wenn FAC und ARG die gleichen Vorzeichen haben) und einer Subtraktion (bei verschiedenen Vorzeichen von FAC und ARG). Die genannten Voraussetzungen lassen sich am einfachsten dadurch erfüllen, dass unmittelbar vor dem Aufruf von FADDT die folgende kurze Codesequenz ausgeführt wird:
LDA *$66 EOR *$6E STA *$6F LDA *$61
Alle im Abschnitt "Quellen" genannten Bücher erwähnen die Voraussetzungen für den Aufruf von FADDT entweder nur teilweise oder gar nicht.
Algorithmus[Bearbeiten | Quelltext bearbeiten]
Der von FADDT verwendete Algorithmus sowie das Laufzeitverhalten sind ausführlich in der Beschreibung der ROM-Routine FADD dokumentiert. Bei den dort angegebenen Rechenzeiten ist lediglich zu beachten, dass selbstverständlich die Laufzeit der Routine CONUPK (85 Systemtakte) bei der Verwendung von FADDT nicht anfällt.
Weblinks[Bearbeiten | Quelltext bearbeiten]
- Disassembly von FADDT/$B86A auf All About Your 64
- CodeBase 64: Floating Point Math
- C64 BASIC & KERNAL ROM Disassembly von Michael Steil
- C64OS: Floating Point Math from BASIC
Quellen
- ↑ Florian Müller: C64 für Insider, S. 461
- ↑ Winfried Kassera/Frank Kassera: C64 Programmieren in Maschinensprache, S. 299
- ↑ Lothar Englisch: Das Maschinensprachebuch für Fortgeschrittene zum Commodore 64, S. 67
- ↑ Said Baloui/Rolf Brückmann/Lothar Englisch/Jacques Felt/Ralf Gelfand/Klaus Gerits/Darko Krsnik: Das neue Commodore 64 Intern Buch, S. 627