CONUPK
Anmerkung: Dieser Artikel beschreibt die CONUPK-Routine zur Übertragung von Fließkommawerten im BASIC-ROM.
Name: | CONUPK | ||||||
Beschreibung: | Fließkommaregister ARG mit Zahl aus dem Speicher füllen | ||||||
Einsprungpunkt: | $BA8C / 47756 | ||||||
Übergebene Argumente: | |||||||
Akkumulator: | Adresse des Fließkommawerts (Low-Byte) | ||||||
Y-Register: | Adresse des Fließkommawerts (High-Byte) | ||||||
Rückgabe-Werte: | |||||||
Akkumulator: | Exponent von FAC | ||||||
X-Register: | bleibt unverändert | ||||||
Y-Register: | 0 | ||||||
Zero-Flag: | gesetzt falls FAC = 0, sonst gelöscht |
CONUPK — manchmal auch als MOVMA[1], MEMFC2[2] oder MEMARG[3] bezeichnet — überträgt eine Fließkommazahl aus dem Speicher in das Fließkommaregister ARG. Die Speicheradresse dieser Fließkommazahl wird im Akkumulator (Low-Byte) und im Y-Register (High-Byte) übergeben. Die Zahl muss im kompakten 5 Byte-Format vorliegen, wie es zum Speichern von REAL-Variablen verwendet wird. Es können sowohl Werte im RAM als auch Konstanten im BASIC-ROM transferiert werden.
Verwendung[Bearbeiten | Quelltext bearbeiten]
CONUPK überträgt eine Fließkommazahl aus dem Speicher des C64 in das Fließkommaregister ARG und bereitet sie für die nachfolgende Verwendung in Numerik-Routinen vor. Hierfür wird das höchstwertige Byte der Mantisse, das im höchstwertigen Bit das Vorzeichen der Zahl enthält, separat an Adresse 110/$6E kopiert, parallel dazu wird beim Übertragen der Mantisse an die Adressen 106/$6A bis 109/$6D dort das stets gesetzte führende Bit ergänzt. Als Vorbereitung für nachfolgend aufgerufene numerische Routinen vergleicht CONUPK schließlich noch die Vorzeichen der Fließkommaregister FAC und ARG legt das Ergebnis an Adresse 111/$6F ab (0: Vorzeichen sind gleich, 1: Vorzeichen sind verschieden), und lädt den Exponenten der Zahl in den Akkumulator. Durch diesen letzten Schritt wird das Zero-Flag genau dann gesetzt, wenn FAC gleich 0 ist. Keine der ROM-Routinen des C64 verwendet den im Akkumulator enthaltene Exponenten, allerdings verlassen sich die Routinen FADDT, FDIVT und FMULTT darauf, dass ein gesetztes Zero-Flag auf die Zahl 0 in FAC hinweist.
Laufzeitverhalten[Bearbeiten | Quelltext bearbeiten]
Die Laufzeit von CONUPK ist vom Wert der übertragenen Zahl unabhängig und beträgt üblicherweise 85 Systemtakte. Lediglich in dem Sonderfall, dass die Fließkommazahl auf einer Page-Grenze liegt, verlängert sich die Ausführungszeit auf bis zu 89 Systemtakte, da auf die Zahl mit Hilfe der Y-nachindizierten Zeropage-Adressierung zugegriffen wird. Im ROM des C64 trifft dies auf eine an Adresse $E2FF gespeicherte Konstante zu, die von den ROM-Routinen COS und SIN verwendet wird.
Weblinks[Bearbeiten | Quelltext bearbeiten]
- Disassembly von CONUPK/$BA8C auf All About Your 64
- CodeBase 64: Floating Point Math
- C64 BASIC & KERNAL ROM Disassembly von Michael Steil
- C64OS: Floating Point Math from BASIC