MOVMF

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Anmerkung: Dieser Artikel beschreibt die MOVMF-Routine zur Übertragung von Fließkommawerten im BASIC-ROM.

Name: MOVMF
Beschreibung: Fließkommaregister FAC runden und im Speicher ablegen
Einsprungpunkt: $BBD4 / 48084
Übergebene Argumente:
X-Register: Zieladresse des Fließkommawerts (Low-Byte)
Y-Register: Zieladresse des Fließkommawerts (High-Byte)
Rückgabe-Werte:
Akkumulator: Exponent von FAC
X-Register: unverändert
Y-Register: 0
Zero-Flag: gesetzt falls FAC = 0, sonst gelöscht

MOVMF — manchmal auch als MOVFM[1] oder FACMEM[2][3] bezeichnet — rundet den Inhalt des Fließkommaregisters FAC und legt ihn dann im Speicher ab. Die Speicheradresse dieser Fließkommazahl wird im X-Register (Low-Byte) und im Y-Register (High-Byte) übergeben. Die Zahl wird im kompakten 5 Byte-Format geschrieben, wie es zum Speichern von REAL-Variablen verwendet wird.

Verwendung[Bearbeiten | Quelltext bearbeiten]

MOVMF rundet zunächst den Inhalt des Fließkommaregisters FAC, erhöht die Mantisse von FAC also um 1, falls durch eine vorausgegangene Rechenoperation das höchstwertige Bit des Rundungsbytes an Adresse 112/$70 gesetzt wurde. Falls dies nicht gewünscht oder überflüssig ist — beispielsweise, weil der Inhalt von FAC zuvor mittels MOVFM aus dem Speicher gelesen wurde und das Rundungsbyte somit ohnehin den Wert 0 hat — so kann auf das Runden verzichtet werden, indem erst an Adresse $BBD7 / 48087 in die Routine MOVMF eingesprungen wird. In sehr seltenen Fällen ist nach dem Runden der Inhalt von FAC nicht mehr als Fließkommazahl auf dem C64 darstellbar, in diesem Fall löst MOVMF einen ?OVERFLOW ERROR aus.

Laufzeitverhalten[Bearbeiten | Quelltext bearbeiten]

Die Laufzeit von MOVMF setzt sich zusammen aus der Rechenzeit für das Runden von FAC und für das Ablegen von FAC im Speicher.

Falls FAC = 0 oder falls das höchstwertige Bit des Rundungsbytes an Adresse 112/$70 gelöscht ist, so verändert das Runden den Wert von FAC nicht. Der Aufruf der ROM-Routine für das Runden benötigt in diesen Fällen nur 18 bzw. 25 Systemtakte. Falls FAC dagegen vor dem Umkopieren aufgerundet wird, so dauert dies zwischen 47 und 99 Systemtakten.

Das Ablegen von FAC im Speicher dauert unabhängig vom Inhalt von FAC immer 81 Systemtakte.

Ein Systemtakt entspricht auf dem Commodore 64 rund einer Mikrosekunde (μs).

Verwandte Routinen[Bearbeiten | Quelltext bearbeiten]

Name Adresse
dez.
Adresse
hex.
Beschreibung
CONUPK 47756 BA8C ARG mit Zahl aus dem Speicher füllen (A=Adr.LB, Y=Adr.HB). Vergleicht danach noch als Vorbereitung für nachfolgende Operationen die Vorzeichen von ARG und FAC und schreibt das Ergebnis nach Adresse $6F ($00: Vorzeichen gleich, $80: Vorzeichen ungleich), und lädt den Exponenten von FAC nach A (d.h. setzt Zero Flag genau dann, wenn FAC gleich null). Die Routinen FADDT, FDIVT, FMULTT und FPWRT setzen diese Vorbereitung voraus.
MOVAF 48124 BBFC Zahl in ARG nach FAC kopieren
MOVFA 48140 BC0C Zahl in FAC nach ARG kopieren
MOVFM 48034 BBA2 FAC mit Zahl aus dem Speicher füllen (A=Adr.LB, Y=Adr.HB)
MOVMF 48084 BBD4 Zahl aus FAC im Speicher ablegen (X=Adr.LB, Y=Adr.HB)

Weblinks[Bearbeiten | Quelltext bearbeiten]

Quellen[Bearbeiten | Quelltext bearbeiten]