FDIVT

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Anmerkung: Dieser Artikel beschreibt die numerische FDIVT-Routine im BASIC-ROM.

Name: FDIVT
Beschreibung: Fließkommaregister ARG durch Fließkommaregister FAC dividieren
Einsprungpunkt: $BB12 / 47890
Übergebene Argumente:
Zero-Flag: gesetzt falls FAC = 0, sonst gelöscht
Sonstige: FAC = Divisor B, ARG = Dividend A
Rückgabe-Werte:
Sonstige: FAC = Ergebnis der Division A/B


FDIVT — manchmal auch als DIVAF[1] oder DIV[2][3] bezeichnet — dividiert den Inhalt des Fließkommaregisters ARG durch den im Fließkommaregister FAC befindlichen Wert.

Nach dem Aufruf steht in FAC das Ergebnis der Division, während der Inhalt von ARG undefiniert ist. Anders als bei den ROM-Routinen FADDT, FSUBT und FMULTT steht der zweite Operand also nicht für nachfolgende Numerik-Routinen zur Verfügung. Ist der Quotient zu groß für die Fließkommadarstellung des C64, so löst FDIV einen ?OVERFLOW ERROR aus; in diesem Fall ist FAC anschließend undefiniert, während ARG unverändert ist. Ist der Divisor in FAC gleich 0, so meldet FDIV einen ?DIVISION BY ZERO ERROR; in diesem Fall bleiben beide Operanden in FAC und ARG unverändert.

Neben dem Inhalt der Fließkommaregister FAC und ARG ändert FDIVT auch das Hilfsregister an den Adressen 38/$26 bis 42/$2A.

Verwendung

FDIVT ist eigentlich keine eigenständige ROM-Routine. Vielmehr ergibt sich ihr Einsprungpunkt dadurch, dass auf die Startadresse der Routine FDIV ein Offset von 3 aufaddiert und dadurch der Aufruf der Routine CONUPK zu Beginn von FDIV ausgelassen wird.

Bei der Nutzung von FDIVT 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 löst FDIVT sofort einen ?DIVISION BY ZERO ERROR aus. 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 FDIVT als Vorzeichen des Resultats (die Division zweier Operanden 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 FDIVT 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 FDIVT entweder nur teilweise oder gar nicht.

Algorithmus

Der von FDIVT verwendete Algorithmus sowie das Laufzeitverhalten sind ausführlich in der Beschreibung von FDIV dokumentiert. Bei den dort angegebenen Rechenzeiten ist lediglich zu beachten, dass selbstverständlich die Laufzeit der Routine CONUPK (85 Systemtakte) bei der Verwendung von FDIVT nicht anfällt.

Weblinks


Quellen