MUL10

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Anmerkung: Dieser Artikel beschreibt die numerische MUL10-Routine im BASIC-ROM.

Name: MUL10
Beschreibung: Fließkommaregister FAC mit 10 multiplizieren
Einsprungpunkt: $BAE2 / 47842
Übergebene Argumente:
Rückgabe-Werte:


MUL10 — manchmal auch als FACM10[1], MAL10[2] oder FMAL10[3] bezeichnet — verzehnfacht die im Fließkommaregister FAC gespeicherte Zahl. Es handelt sich um eine laufzeitoptimierte Variante der Multiplikation mit dem speziellen Faktor 10, die für die Ausgabe von Fließkommazahlen als Strings, für die Umwandlung von Ziffernfolgen in Fließkommawerte sowie für das Setzen der Systemzeit TI$ eingesetzt wird.

Nach dem Aufruf steht in FAC das Zehnfache des ursprünglichen Werts und in ARG eine Kopie des ursprünglichen Werts. Ist das Produkt zu groß für die Fließkommadarstellung des C64, so löst MUL10 einen ?OVERFLOW ERROR aus. In diesem Fall ist FAC anschließend undefiniert, während ARG noch den ursprünglichen Wert von FAC enthält. Außer den Fließkommaregistern FAC und ARG werden keine Speicherinhalte geändert.

Algorithmus

MUL10 verwendet nicht die Routine FMULT, sondern implementiert die Multiplikation einer Zahl x mit der Konstanten 10 anhand der folgenden Zerlegung:

10x =  (4x + x) × 2

Eine solche Art der Berechnung hat den Vorteil, dass sie neben einer Addition nur Multiplikationen mit Potenzen von 2 benötigt — und diese lassen sich dadurch umsetzen, dass einfach der Exponent entsprechend erhöht wird. Im einzelnen führt MUL10 die folgenden Schritte aus:

  1. Da für die Addition 4x + x sowohl der ursprüngliche Wert als auch das Vierfache davon benötigt wird, kopiert MUL10 zunächst den Inhalt von FAC nach ARG.
  2. Anschließend prüft MUL10, ob die Zahl in FAC gleich 0 ist — in diesem Fall ist keine Berechnung erforderlich und die Routine wird verlassen.
  3. Andernfalls wird der Exponent von FAC um 2 erhöht, dies entspricht einer Multiplikation mit 22 = 4. Tritt hierbei ein Überlauf auf, so meldet MUL10 einen ?OVERFLOW ERROR.
  4. Für die Addition der Summanden 4x und x in FAC und ARG springt MUL10 in die FADD-Routine. Zuvor wird noch das Vorzeichen-Vergleichsbyte an Adresse 111/$6F auf 0 gesetzt (beide Summanden haben gleiches Vorzeichen), damit FADD die Mantissen addiert und nicht etwa subtrahiert.
  5. Für die abschließende Multiplikation mit 2 wird noch der Exponent um 1 erhöht. Auch ein Überlauf des Exponenten in diesem Schritt löst einen ?OVERFLOW ERROR aus.

Laufzeitverhalten

In Abhängigkeit davon, ob bei der Addition innerhalb der ROM-Routine FADD ein Übertrag auftrat und das Ergebnis noch durch Rechtsverschieben normalisiert werden muss oder nicht, benötigt die Routine MUL10 entweder 385 oder 354 Systemtakte. Falls FAC = 0 ist, so wird dies als Sonderfall erkannt und keine weitere Berechnung durchgeführt; die Routine hat in diesem Fall eine Laufzeit von nur 129 Takten. Sie ist damit in jedem Fall deutlich schneller als ein Laden der Konstanten 10 in das Fließkommaregister ARG (Routine CONUPK, 85 Systemtakte) plus eine anschließende Multiplikation von FAC und ARG mittels FMULT (gemäß ausgiebigen Laufzeitmessungen 1341 bis 2559 Takte, im Sonderfall FAC = 0 nur 102 Takte).

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

Weblinks

Quellen