FSUBT
Anmerkung: Dieser Artikel beschreibt die numerische FSUBT-Routine im BASIC-ROM.
Name: | FSUBT | ||||||
Beschreibung: | Fließkommaregister FAC von Fließkommaregister ARG subtrahieren und das Ergebnis in FAC speichern | ||||||
Einsprungpunkt: | $B853 / 47187 | ||||||
Übergebene Argumente: | |||||||
Sonstige: | FAC = Subtrahend B, ARG = Minuend A | ||||||
Rückgabe-Werte: | |||||||
Sonstige: | FAC = Ergebnis der Subtraktion A-B, ARG = Minuend A |
FSUBT — manchmal auch als SUBFAC[1], SUB[2], oder einfach als MINUS[3] oder Minus[4] bezeichnet — subtrahiert den im Fließkommaregister FAC befindlichen Wert vom Fließkommaregister ARG und speichert das Ergebnis wieder in FAC.
Nach dem Aufruf steht in FAC das Ergebnis der Subtraktion, 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 der Fließkommaregisters FAC ändert FSUBT auch das Rundungsbyte des Hilfspuffers FAC#3 an Adresse 86/$56.
Algorithmus[Bearbeiten | Quelltext bearbeiten]
FSUBT ist eigentlich keine eigenständige ROM-Routine. Vielmehr ergibt sich ihr Einsprungpunkt dadurch, dass auf die Startadresse der Routine FSUB ein Offset von 3 aufaddiert und dadurch der Aufruf der Routine CONUPK zu Beginn von FSUB ausgelassen wird.
FSUBT implementiert auch keine eigenständige Subtraktion, sondern negiert nur den im Fließkommaregister FAC gespeicherten Wert und springt dann zur ROM-Routine FADDT, die die eigentliche Berechnung als Addition von ARG und (-FAC) durchführt. Zuvor bereitet FSUBT noch den Aufruf von FADDT in gleicher Weise vor, wie dies üblicherweise von der Routine CONUPK erledigt wird. Hierzu werden die Vorzeichen von ARG und (negiertem) FAC verglichen und das Ergebnis im höchstwertigen Bit von Adresse 111/$6F gespeichert (0: Vorzeichen sind gleich, 1: Vorzeichen sind verschieden). Zuletzt lädt FSUBT noch den Exponenten des Fließkommaregisters FAC in den Akkumulator und setzt dadurch das Zero-Flag genau dann, wenn FAC gleich 0 ist.
Laufzeitverhalten[Bearbeiten | Quelltext bearbeiten]
Der von FSUBT mitverwendete Algorithmus sowie das Laufzeitverhalten sind ausführlich in der Beschreibung der ROM-Routine FADD dokumentiert. Zu den dort angegebenen Laufzeiten ist noch die Rechenzeit für das Negieren von FAC (20 Systemtakte) hinzuzurechnen, dafür entfällt die Laufzeit der Routine CONUPK (typischerweise 85 Systemtakte).
Weblinks[Bearbeiten | Quelltext bearbeiten]
- Disassembly von FSUBT/$B853 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[Bearbeiten | Quelltext bearbeiten]
- ↑ Florian Müller: C64 für Insider, S. 460
- ↑ 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. 626