FSUBT

Aus C64-Wiki
Zur Navigation springenZur Suche springen

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

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

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

Quellen