STRVAL
Anmerkung: Dieser Artikel beschreibt die numerische STRVAL-Routine zur Umwandlung von Strings in Fließkommazahlen im BASIC-ROM.
| Name: | STRVAL | ||||||
| Beschreibung: | ASCII-String nach Fließkommazahl im Fließkommaregister FAC wandeln | ||||||
| Einsprungpunkt: | $B7B5 / 47029 | ||||||
| Übergebene Argumente: | |||||||
| Akkumulator: | Länge des einzulesenden Strings | ||||||
| Sonstige: | Adresse 34/$22 (Low-Byte) / 35/$23 (High-Byte) = Zeiger auf einzulesenden numerischen String | ||||||
| Rückgabe-Werte: | |||||||
| Sonstige: | FAC = eingelesene Zahl | ||||||
STRVAL — manchmal auch als STRFAC[1] bezeichnet — liest einen numerischen ASCII-String ein und wandelt ihn in eine Fließkommazahl, die dann im Fließkommaregister FAC abgelegt wird. Beim Aufruf der Routine wird die Anfangsadresse dieses Strings an den Adressen 34/$22 (Low-Byte) und 35/$23 (High-Byte) übergeben; im Akkumulator muss die Länge des Strings gespeichert sein. Der Einsprungpunkt von STRVAL liegt im Anfangsbereich der ROM-Routine, die als Implementierung der Funktion VAL in der Tabelle der BASIC-Funktionen an Adresse $A074 hinterlegt ist.
Der Aufruf von STRVAL überschreibt den Fließkommabereich an den Adressen 93/$5D bis 103/$67 und verändert zudem die Hilfszeiger an den Adressen 34/$22 bis 35/$23 und 133/$71 bis 114/$72.
Algorithmus[Bearbeiten | Quelltext bearbeiten]
STRVAL implementiert keine eigenständige Umwandlung, sondern sichert zunächst nur den Lesezeiger der Routine CHRGET an die Adressen 133/$71 bis 114/$72. Anschließend ersetzt STRVAL diesen Zeiger durch die Adresse des umzuwandelnden Strings, schließt den String kurzzeitig durch ein Nullbyte ab und ruft anschließend die ROM-Routine FIN auf, die die eigentliche Wandlung vornimmt. Danach setzt STRVAL den CHRGET-Zeiger auf seinen ursprünglichen Wert zurück und stellt auch das Zeichen hinter dem String, das durch die Nullterminierung überschrieben wurde, wieder her.
Laufzeitverhalten[Bearbeiten | Quelltext bearbeiten]
Die Laufzeit von STRVAL setzt sich zusammen aus der Laufzeit der ROM-Routine FIN und aus der Rechenzeit für die Vor- und Nachbereitung ihres Aufrufs. Letzteres dauert zwischen 124 und 125 Systemtakten.
Ein Systemtakt entspricht auf dem Commodore 64 rund einer Mikrosekunde (μs).
Verwandte Routinen[Bearbeiten | Quelltext bearbeiten]
| Name | Adresse dez. |
Adresse hex. |
Beschreibung |
|---|---|---|---|
| FACINX | 45482 | B1AA | Zahl in FAC zu 16-Bit-Ganzzahl mit Vorzeichen wandeln (Y=LB, A=HB). |
| FIN | 48371 | BCF3 | Nullterminierten PETSCII-String zu Fließkommazahl in FAC wandeln (Stringadresse in $7A/$7B). Erwartet erstes Zeichen im Akku und gelöschtes Carry-Flag, z.B. durch Aufruf von CHRGOT (JSR $0079). |
| STRVAL | 47029 | B7B5 | PETSCII-String zu Fließkommazahl in FAC wandeln (String-Adresse in $22/$23, String-Länge im Akku). |
| FOUT | 48605 | BDDD | Zahl in FAC zu nullterminiertem PETSCII-String wandeln (ab $0100 ff., Adresse auch in A, Y). Direkte Ausgabe des FAC-Inhalts als String ist auch über $AABC/43708 möglich. |
| GIVAYF | 45969 | B391 | 16-Bit-Ganzzahl mit Vorzeichen zu Fließkommazahl in FAC wandeln (Y=LB, A=HB). |
| QINT | 48283 | BC9B | Zahl in FAC in 32-Bit-Ganzzahl mit Vorzeichen wandeln ($62-$65, Big-Endian-Reihenfolge). |
Weblinks[Bearbeiten | Quelltext bearbeiten]
- Disassembly von STRVAL/$B7B5 auf All About Your 64

- C64 BASIC & KERNAL ROM Disassembly von Michael Steil

- C64OS: Floating Point Math from BASIC
