DIV10
Anmerkung: Dieser Artikel beschreibt die numerische DIV10-Routine im BASIC-ROM.
Name: | DIV10 | ||||||
Beschreibung: | Betrag des Fließkommaregisters FAC durch 10 dividieren | ||||||
Einsprungpunkt: | $BAFE / 47870 | ||||||
Übergebene Argumente: | |||||||
Rückgabe-Werte: |
DIV10 — manchmal auch als FACD10[1], DURCH10[2] oder FDIV10[3] bezeichnet — dividiert die im Fließkommaregister FAC gespeicherten Zahl durch 10 und gibt dem Quotienten ein positives Vorzeichen. Es handelt sich um eine Division durch die Konstante 10, die bei der Ausgabe von Fließkommazahlen als Strings und bei der Umwandlung von Ziffernfolgen in Fließkommawerte eingesetzt wird. Die Routine verwendet keine Laufzeitoptimierungen für den speziellen Divisor 10 und dient dementsprechend nur der Speicherplatzersparnis, da sie an mehreren Stellen im BASIC-ROM aufgerufen wird.
Nach dem Aufruf steht in FAC ein Zehntel des ursprünglichen Inhalts von FAC als positive Zahl, während der Inhalt von ARG undefiniert ist.
Neben dem Inhalt der Fließkommaregister FAC und ARG ändert DIV10 auch das Hilfsregister an den Adressen 38/$26 bis 42/$2A. Die innerhalb von DIV10 aufgerufene MOVFM-Routine überschreibt zudem den Hilfszeiger an den Adressen 34/$22 (Low-Byte) und 35/$23 (High-Byte).
Algorithmus[Bearbeiten | Quelltext bearbeiten]
DIV10 kopiert den Inhalt von FAC mittels MOVFA nach ARG, überträgt dann die Konstante 10 mittels MOVFM von Adresse $BAF9 in den Fließkommaakku FAC und nutzt anschließend die Routine FDIVT, um die Division ARG / FAC durchzuführen. Das Vorzeichen-Vergleichsbyte an Adresse 111/$6F, das FDIVT als Vorzeichen des Quotienten übernimmt, setzt DIV10 vor der Division explizit auf 0 (positives Vorzeichen).
Laufzeitverhalten[Bearbeiten | Quelltext bearbeiten]
Die Laufzeit von DIV10 ergibt sich als Summe der Einzellaufzeiten von MOVFA, MOVFM und FDIVT zuzüglich von 21 Systemtakten für Aufruf, Rücksprung und Initialisierungen. Im Rahmen umfangreicher Messreihen lag die Laufzeit von DIV10 zwischen 2125 und 3070 Takten.
Ein Systemtakt entspricht auf dem Commodore 64 rund einer Mikrosekunde (μs). Im ungünstigsten Fall benötigt die DIV10-Routine also etwas mehr als 3 Millisekunden (ms).
Weblinks[Bearbeiten | Quelltext bearbeiten]
- Disassembly von DIV10/$BAFE auf All About Your 64
- CodeBase 64: Floating Point Math
- C64 BASIC & KERNAL ROM Disassembly von Michael Steil
- C64OS: Floating Point Math from BASIC