FMULTT
Anmerkung: Dieser Artikel beschreibt die numerische FMULTT-Routine im BASIC-ROM.
Name: | FMULTT | ||||||
Beschreibung: | Fließkommaregister FAC mit Fließkommaregister ARG multiplizieren | ||||||
Einsprungpunkt: | $BA2B / 47659 | ||||||
Übergebene Argumente: | |||||||
Zero-Flag: | gesetzt falls FAC = 0, sonst gelöscht | ||||||
Sonstige: | FAC = Faktor B, ARG = Faktor A | ||||||
Rückgabe-Werte: | |||||||
Sonstige: | FAC = Ergebnis der Multiplikation A*B, ARG = Faktor A |
FMULTT — manchmal auch als MULT[1][2][3] oder einfach als Multiplikation[4] bezeichnet — multipliziert den Inhalt des Fließkommaregisters FAC mit dem im Fließkommaregister ARG befindlichen Wert.
Nach dem Aufruf steht in FAC das Ergebnis der Multiplikation, während ARG unverändert ist und für nachfolgend aufgerufene Numerik-Routinen weiter verwendet werden kann. Ist das Produkt zu groß für die Fließkommadarstellung des C64, so löst FMULTT 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 FMULTT auch das Hilfsregister an den Adressen 38/$26 bis 41/$29.
Verwendung[Bearbeiten | Quelltext bearbeiten]
FMULTT ist eigentlich keine eigenständige ROM-Routine. Vielmehr ergibt sich ihr Einsprungpunkt dadurch, dass auf die Startadresse der Routine FMULT ein Offset von 3 aufaddiert und dadurch der Aufruf der Routine CONUPK zu Beginn von FMULT ausgelassen wird.
Bei der Nutzung von FMULTT ist zu beachten, dass sich die Routine auf zwei Seiteneffekte von CONUPK verlässt. In jedem Fall darf das Zero-Flag nur dann gesetzt sein, wenn im Fließkommaregister FAC der Wert 0 gespeichert ist, denn bei gesetztem Zero-Flag überspringt FMULTT alle Berechnungen. Falls sowohl FAC als auch ARG ungleich 0 sind, 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). Den Inhalt dieser Adresse verwendet FMULTT als Vorzeichen des Resultats (die Multiplikation von Faktoren mit gleichem Vorzeichen führt zu einem positiven, von Faktoren mit unterschiedlichem Vorzeichen zu einem negativen Ergebnis). Die genannten Voraussetzungen lassen sich am einfachsten dadurch erfüllen, dass unmittelbar vor dem Aufruf von FMULTT 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 FMULTT entweder nur teilweise oder gar nicht.
Algorithmus[Bearbeiten | Quelltext bearbeiten]
Der von FMULTT verwendete Algorithmus sowie das Laufzeitverhalten sind ausführlich in der Beschreibung von FMULT dokumentiert. Bei den dort angegebenen Rechenzeiten ist lediglich zu beachten, dass selbstverständlich die Laufzeit der Routine CONUPK (85 Systemtakte) bei der Verwendung von FMULTT nicht anfällt.
Weblinks[Bearbeiten | Quelltext bearbeiten]
- Disassembly von FMULTT/$BA2B 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. 462
- ↑ Winfried Kassera/Frank Kassera: C64 Programmieren in Maschinensprache, S. 299
- ↑ Lothar Englisch: Das Maschinensprachebuch für Fortgeschrittene zum Commdore 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. 634