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
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
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).
Weblinks
- Disassembly von STRVAL/$B7B5 auf All About Your 64
- C64 BASIC & KERNAL ROM Disassembly von Michael Steil
- C64OS: Floating Point Math from BASIC