MOVFM
Anmerkung: Dieser Artikel beschreibt die MOVFM-Routine zur Übertragung von Fließkommawerten im BASIC-ROM.
| Name: | MOVFM | ||||||
| Beschreibung: | Fließkommaregister FAC mit Zahl aus dem Speicher füllen | ||||||
| Einsprungpunkt: | $BBA2 / 48034 | ||||||
| Ü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 | ||||||
MOVFM — manchmal auch als MOVMF[1] oder MEMFAC[2][3] bezeichnet — überträgt eine Fließkommazahl aus dem Speicher in das Fließkommaregister FAC. 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]
MOVFM überträgt eine Fließkommazahl aus dem Speicher des C64 in das Fließkommaregister FAC 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 102/$66 kopiert, parallel dazu wird beim Übertragen der Mantisse an die Adressen 98/$62 bis 101/$65 dort das stets gesetzte führende Bit ergänzt. Als Vorbereitung für nachfolgend aufgerufene numerische Routinen löscht MOVFM schließlich noch das Rundungsbyte an Adresse 112/$70. Keine der ROM-Routinen des C64 verwendet den im Akkumulator zurückgelieferten Exponenten, allerdings verlässt sich die Routine FPWR darauf, dass nach dem Aufruf von MOVFM ein gesetztes Zero-Flag auf die Zahl 0 in FAC hinweist.
Laufzeitverhalten[Bearbeiten | Quelltext bearbeiten]
Die Laufzeit von MOVFM ist vom Wert der übertragenen Zahl unabhängig und beträgt üblicherweise 76 Systemtakte. Lediglich in dem Sonderfall, dass die Fließkommazahl auf einer Page-Grenze liegt, verlängert sich die Ausführungszeit auf bis zu 80 Systemtakte, da auf die Zahl mit Hilfe der Y-nachindizierten Zeropage-Adressierung zugegriffen wird.
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]
- Disassembly von MOVFM/$BBA2 auf All About Your 64

- CodeBase 64: Floating Point Math

- C64 BASIC & KERNAL ROM Disassembly von Michael Steil

- C64OS: Floating Point Math from BASIC
