SQR (ROM-Routine)
Anmerkung: Dieser Artikel beschreibt die numerische SQR-Routine zur Berechnung der Quadratwurzel im BASIC-ROM.
Name: | SQR | ||||||
Beschreibung: | Quadratwurzel von Fließkommaregister FAC berechnen | ||||||
Einsprungpunkt: | $BF71 / 49009 | ||||||
Übergebene Argumente: | |||||||
Sonstige: | FAC | ||||||
Rückgabe-Werte: | |||||||
Sonstige: | FAC |
Die ROM-Routine SQR[1][2] — manchmal auch als SQRFAC[3] bezeichnet — berechnet die Quadratwurzel der im Fließkommaregister FAC gespeicherten Zahl. Ihr Einsprungpunkt ist in der Tabelle der BASIC-Funktionen an Adresse $A05E hinterlegt, so dass die Routine bei jeder Auswertung der Funktion SQR vom BASIC-Interpreter aufgerufen wird.
Nach dem Aufruf steht in FAC die errechnete Wurzel, während der Inhalt von ARG undefiniert ist. Falls versucht wird, die Quadratwurzel einer negative Zahl zu berechnen, so meldet SQR einen ?ILLEGAL QUANTITY ERROR.
Neben dem Inhalt der Fließkommaregister FAC und ARG ändert SQR auch den Hilfszeiger an Adresse 34/$22 (Low-Byte) und 35/$23 (High-Byte) und die Hilfsregister an den Adressen 38/$26 bis 41/$29 und 78/$4E bis 82/$52 sowie die Fließkommaregister FAC#3 und FAC#4 an den Adressen 87/$57 bis 96/$60.
Algorithmus[Bearbeiten | Quelltext bearbeiten]
SQR implementiert keine eigenständige Berechnung der Quadratwurzel, sondern überträgt nur die in FAC übergebene Zahl nach ARG, lädt dann die Konstante 0.5 nach FAC und geht schließlich in die ROM-Routine FPWRT über. Die Berechnung der Quadratwurzel basiert also auf der Definition sqr(x) = x½.
Laufzeitverhalten[Bearbeiten | Quelltext bearbeiten]
Die Laufzeit von SQR ist hauptsächlich durch die zugrundeliegende ROM-Routine FPWR bestimmt; hinzu kommt die Rechenzeit für das Umkopieren von FAC nach ARG (ROM-Routine MOVFA) und der Konstanten 0.5 nach FAC (ROM-Routine MOVFM). Im Rahmen umfangreicher Messungen ergaben sich für SQR Laufzeiten zwischen 44635 und 50441 Systemtakten, vergleichbar mit dem Rechenzeitbedarf von FPWR im Fall beliebiger Exponenten.
Ein Systemtakt entspricht auf dem Commodore 64 rund einer Mikrosekunde (μs). Im ungünstigsten Fall benötigt die SQR-Routine also etwas mehr als 50 Millisekunden (ms).
Weblinks[Bearbeiten | Quelltext bearbeiten]
- Disassembly von SQR/$BF71 auf All About Your 64
- CodeBase 64: Floating Point Math
- C64 BASIC & KERNAL ROM Disassembly von Michael Steil
- C64OS: Floating Point Math from BASIC