Routinen zum Arbeiten mit Fließkomma-Zahlen

Die hier vorgestellten Routinen sind solche für die Verabeitung von Routinen mit Fließkomma-Zahlen. Einige Hinweise zum Format findet sich hier.

Zwar beinhaltet meine Bibliothek auch Routinen zur Berechnung von Fließkommazahlen (Floating Point), jedoch kommen solche Routinen in der Praxis der Assemblerprogrammierung kaum zum Einsatz. Im Public Domain gab es einige Routinen, die allerdings noch aus der Zeit der CPU 8008 (dem Vorläufer der 8080) stammten. Ich habe diese in kleinere Module zerlegt und in meiner Bibliothek untergebracht.
Einige Zeit später konnte ich mit vier Versionen von Pascal
  1. TURBO Pascal
  2. MT Pascal
  3. Pro Pascal
  4. Hisoft Pascal
einen Test mit reellen Zahlen machen. Da dieser Test eine große Dynamik zeigte - die schnellste Berechnung lag bei 1 Sekunde, die langsamste bei 6 Sekunden - programmierte ich den Test in Assembler. Die Zeit für diese Berechnung lag bei etwa 3 Sekunden, also „nur" im Mittelfeld. Daraufhin habe ich die Routinen des Siegers - Hisoft Pascal - disassembliert und in Module gewandelt. Erst sehr viel später bemerkte ich, dass diese Routinen zwar sehr schnell, dafür aber ungenau waren! Ich habe sie dennoch in meiner Bibliothek belassen, weil - wie schon bemerkt - ich diese Routinen eigentlich nie benutzte.

Modul-Entry B: Beschreibung, I: Eingabe-, O: Ausgabeparameter

Mathematische Funktionen

LBADD.MAC
FLADD B: Addition zweier Zahlen
  I: Registerpaar BC zeigt auf erste Zahl, Paar DE auf zweite und Paar HL auf Ergebnis
  O: Summe in Ergebnis abgelegt

LBSUB.MAC
FLSUB B: Subtraktion zweier Zahlen
  I: Registerpaar BC zeigt auf erste Zahl, Paar DE auf Subtrahenden und Paar HL auf Ergebnis
  O: Differenz in Ergebnis abgelegt

LBMUL.MAC
FLMUL B: Multiplikation zweier Zahlen
  I: Registerpaar BC zeigt auf erste Zahl, Paar DE auf zweite und Paar HL auf Ergebnis
  O: Produkt in Ergebnis abgelegt

LBDIV.MAC
FLDIV B: Division zweier Zahlen
  I: Registerpaar BC zeigt auf Dividenden, Paar DE auf Divisor und Paar HL auf Ergebnis
  O: Quotient in Ergebnis abgelegt

LBSQAR.MAC
FLSQAR B: Berechnen des Quadrates
  I: Registerpaar BC zeigt auf die Zahl und Paar HL auf Ergebnis
  O: Quadrat in Ergebnis abgelegt

LBSQRT.MAC
FLSQR B: Berechnen der Quadratwurzel
  I: Registerpaar BC zeigt auf die Zahl und Paar HL auf Ergebnis
  O: Wurzel in Ergebnis abgelegt

LBSIN.MAC
FLSIN B: Berechnen der Sinusfunktion
  I: Registerpaar BC zeigt auf die Zahl und Paar HL auf Ergebnis
  O: Sinus in Ergebnis abgelegt

LBCOS.MAC
FLCOS B: Berechnen der Cosinusfunktion
  I: Registerpaar BC zeigt auf die Zahl und Paar HL auf Ergebnis
  O: Cosinus in Ergebnis abgelegt

LBTAN.MAC
FLTAN B: Berechnen der Tangens Funktion
  I: Registerpaar BC zeigt auf die Zahl und Paar HL auf Ergebnis
  O: Tangens in Ergebnis abgelegt

LBATAN.MAC
FLATAN B: Berechnen der Arcus Tangens Funktion
  I: Registerpaar BC zeigt auf die Zahl und Paar HL auf Ergebnis
  O: Arcus Tangens in Ergebnis abgelegt

LBCOSH.MAC
FLCOSH B: Berechnen der Hyberbel Cosinus Funktion
  I: Registerpaar BC zeigt auf die Zahl und Paar HL auf Ergebnis
  O: Hyperbel Cosinus in Ergebnis abgelegt

LBSINH.MAC
FLSINH B: Berechnen der Hyperbel Sinus Funktion
  I: Registerpaar BC zeigt auf die Zahl und Paar HL auf Ergebnis
  O: Hyperbel Sinus in Ergebnis abgelegt

LBLN.MAC
FLLOG B: Berechnen des natürlichen Logarithmus
  I: Registerpaar BC zeigt auf die Zahl und Paar HL auf Ergebnis
  O: Logarithmus in Ergebnis abgelegt

LBEXP.MAC
FLEXP B: Berechnen der natürlichen Potenz
  I: Registerpaar BC zeigt auf die Zahl und Paar HL auf Ergebnis
  O: Potenz in Ergebnis abgelegt

LBFRAC.MAC
FLFRAC B: Ermitteln des Nachkommastellenteils
  I: Registerpaar BC zeigt auf die Zahl und Paar HL auf Ergebnis
  O: Anteil im Ergebnis abgelegt

LBTRUN.MAC
FLTRUN B: Ermitteln einer äquivalenten 16 Bit Zahl
  I: Registerpaar BC zeigt auf die zu wandelnde Zahl
  O: Resultat im Register HL abgelegt

LBENTI.MAC
FLENTI B: Ermitteln einer äquivalenten 16 Bit Zahl
  I: Registerpaar BC zeigt auf die zu wandelnde Zahl
  O: Resultat im Register HL abgelegt

LBROUN.MAC
FLROUN B: Ermitteln einer äquivalenten 16 Bit Zahl
  I: Registerpaar BC zeigt auf die zu wandelnde Zahl
  O: Resultat im Register HL abgelegt

LBABS.MAC
FLABS B: Ermitteln des absoluten Wertes
  I: Registerpaar BC zeigt auf die Zahl und Paar HL auf Ergebnis
  O: Absoluter Wert in Ergebnis abgelegt

LBNEG.MAC
FLNEG B: Ermitteln des negativen Wertes
  I: Registerpaar BC zeigt auf die Zahl und Paar HL auf Ergebnis
  O: Negativer Wert in Ergebnis abgelegt

LBSIGN.MAC
FLSIGN B: Ermitteln des Vorzeichens einer Zahl
  I: Registerpaar BC zeigt auf die Zahl
  O: Resultat im Akkumulator:
+1 bei positiver Zahl
-1 bei negativer Zahl
0 bei Zahl Null

Ein/Ausgabe Funktionen

FLCNT.MAC
FLCNT B: Bestimmen der Anzahl Zahlen und Zeichen in einer Zeichenkette
  I: Registerpaar DE zeigt auf die Zeichenkette, Register B hält die Anzeige des Endes
  O: Register B und Akku halten die Länge, bei Länge Null ist außerdem die Zero Flag gesetzt

LBINP.MAC
FLINP B: Umwandeln einer Zeichenkette in eine Zahl
  I: Register B hält die Länge der zu wandelnden Zeichen, Paar DE zeigt auf die Kette und Paar HL auf Ergebnis
  O: Resultat in Ergebnis abgelegt

LBOUT.MAC
FLOUT B: Umwandeln einer Zahl in eine Zeichenkette
  I: Registerpaar HL zeigt auf die Zahl, Paar DE auf das Resultat und Register B hält Zeichen, das am Ende der Kette gespeichert wird
  O: Resultat mit Zeichenkette gefüllt
Das Resultat besteht aus 12 Stellen:
1 Vorzeichen (Leerzeichen oder Minus)
1 Vorkommastelle
1 Dezimalpunkt
5 Nachkommastellen, aufgefüllt mit Nullen
1 Exponentzeichen E
1 Vorzeichen des Exponenten (Plus oder Minus)
2 Exponentenstellen

LBFORM.MAC
FLFORM B: Umwandeln einer Zahl in eine formatierte Zeichenkette
  I: Registerpaar HL zeigt auf die Zahl, Paar DE auf das Resultat und Register B hält Zeichen, das am Ende der Kette gespeichert wird. Register C hält die Anzahl totaler Dezimalstellen und der Akkumulator hält die Anzahl Nachkommastellen. Falls der Akkumulator -1 hält, wird ein spezielles Format mit Exponentialdarstellung gewählt.
  O: Resultat mit Zeichenkette gefüllt

Ganzzahl Wandlungs-Funktionen

LBINFL.MAC
CBINFL B: Wandeln einer ganzen 32 Bit Zahl in das Fließkommaformat
  I: Registerpaar DE zeigt auf die zu wandelnde Zahl
  O: Die ganze Zahl ist durch die Fließkommazahl ausgetauscht

LBFLBI.MAC
CFLBIN B: Wandeln einer Fließkommazahl in das 32 Bit Ganzzahlformat
  I: Registerpaar DE zeigt auf die zu wandelnde Zahl
  O: Die Fließkommazahl ist durch die ganze Zahl ausgetauscht

LB16FL.MAC
C16FL B: Wandeln einer ganzen 16 Bit Zahl in das Fließkommaformat
  I: Register HL hält die 16 Bit Ganzzahl und Registerpaar DE zeigt auf das Resultat.
  O: Resultat gefüllt mit äquivalenter Zahl

LBFL16.MAC
CFL16 B: Wandeln einer Fließkommazahl in das 16 Bit Ganzzahlformat
  I: Registerpaar DE zeigt auf die Zahl
  O: Registerpaar HL hält die äquivalente Ganzzahl

Sonstige Funktionen

LBRAND.MAC
RANDOM B: Bestimmen einer 16 Bit Zufallszahl
  I: @XSEED, @YSEED, @ZSEED halten beliebige Zufallszahl
  O: Das Registerpaar BC hält 16 Bit Zufallszahl

FLRAND.MAC
?RANDO @XSEED B: Bestimmen einer Zufallszahl
  @YSEED I: Die internen Aufruffelder halten beliebige Zahlen
  @ZSEED O: Register DE,HL halten Zufallszahl

FLPDAT.MAC
<...>   Verschiedene Fließkomma-Konstanten und Daten
  @FONE B: 1.0
  @FPI2 B: 1.570796 (pi/2 = 90° im Bogenmaß)
  @FLN2 B: 0.693147 (LN 2)
  @FTEN B: 10.0
  @F005 B: 0.00000005
  FLPERR B: Fehlerflag mit Fehlercode

Interne Funktionen

FLADD.MAC
?FLADD B: Addition zweier Zahlen
  I: Zahl 1 liegt auf dem Stack, Zahl 2 in den Registern DE,HL
  O: Summe liegt in den Registern DE,HL
?FLSUB B: Subtraktion zweier Zahlen
  I: Zahl 1 liegt auf dem Stack, Zahl 2 in den Registern DE,HL
  O: Differenz liegt in den Registern DE,HL

FLMUL.MAC
?FLMUL B: Multiplikation zweier Zahlen
  I: Zahl 1 liegt auf dem Stack, Zahl 2 in den Registern DE,HL
  O: Produkt liegt in den Registern DE,HL
?FLSQA B: Berechnen des Quadrates
  I: Zahl liegt in den Registern DE,HL
  O: Quadrat liegt in den Registern DE,HL

FLDIV.MAC
?FLDIV B: Division zweier Zahlen
  I: Dividend liegt auf dem Stack, Divisor in den Registern DE,HL
  O: Quotient liegt in den Registern DE,HL

FLFRAC.MAC
?FLFRA B: Ermitteln des Nachkommastellenteils
  I: Zahl liegt in den Registern DE,HL
  O: Nachkommastellenteil liegt in den Registern DE,HL

FLTRUN.MAC
?FLTRN B: Ermitteln einer äquivalenten 16 Bit Zahl
  I: Zahl liegt in den Registern DE,HL
  O: Resultat im Register HL abgelegt

FLATN.MAC
?FLATN B: Berechnen der Arcus Tangens Funktion
  I: Zahl liegt in den Registern DE,HL
  O: Arcus Tangens liegt in den Registern DE,HL

FLLN.MAC
?FLLOG B: Berechnen des natürlichen Logarithmus
  I: Zahl liegt in den Registern DE,HL
  O: Logarithmus liegt in den Registern DE,HL

FLSQRT.MAC
?FLSQR B: Berechnen der Quadratwurzel
  I: Zahl liegt in den Registern DE,HL
  O: Wurzel liegt in den Registern DE,HL

FLTAN.MAC
?FLTAN B: Berechnen der Tangens Funktion
  I: Zahl liegt in den Registern DE,HL
  O: Tangens liegt in den Registern DE,HL

FLSIN.MAC
?FLSIN B: Berechnen der Sinusfunktion
  I: Zahl liegt in den Registern DE,HL
  O: Sinus liegt in den Registern DE,HL
?FLCOS B: Berechnen der Cosinusfunktion
  I: Zahl liegt in den Registern DE,HL
  O: Cosinus liegt in den Registern DE,HL

FLEXP.MAC
?FLEXP B: Berechnen der natürlichen Potenz
  I: Zahl liegt in den Registern DE,HL
  O: Potenz liegt in den Registern DE,HL

FLCOSH.MAC
?FLCSH B: Berechnen der Hyberbel Cosinus Funktion
  I: Zahl liegt in den Registern DE,HL
  O: Hyberbel Cosinus liegt in den Registern DE,HL
?FLSNH B: Berechnen der Hyperbel Sinus Funktion
  I: Zahl liegt in den Registern DE,HL
  O: Hyperbel Sinus liegt in den Registern DE,HL

FLABS.MAC
?FLABS B: Ermitteln des absoluten Wertes
  I: Zahl liegt in den Registern DE,HL
  O: Absoluten Wert liegt in den Registern DE,HL

FLSIGN.MAC
?FLSIGN B: Ermitteln des Vorzeichens einer Zahl
  I: Zahl liegt in den Registern DE,HL
  O: Resultat im Akkumulator:
+1 bei positiver Zahl
-1 bei negativer Zahl
0 bei Zahl Null

CBINFL.MAC
?CBINF B: Wandeln einer ganzen 16 Bit Zahl in das Fließkommaformat
  I: Register HL hält die 16 Bit Ganzzahl
  O: Ergebnis liegt in den Registern DE,HL

CFLBIN.MAC
?CFLBI ?FLENT B: Wandeln einer Fließkommazahl in das 16 Bit Ganzzahlformat
?FLROU B: Runden und wandeln einer Fließkommazahl in das 16 Bit Ganzzahlformat
  I: Zahl liegt in den Registern DE,HL
  O: Register HL hält die 16 Bit Ganzzahl

FLINP.MAC
?FLINP B: Umwandeln einer Zeichenkette in eine Zahl
  I: Akku hält die Länge der zu wandelnden Zeichen, Paar BC zeigt auf die Kette
  O: Ergebnis liegt in den Registern DE,HL

FLOUT.MAC
?FLOUT ?FLO1 B: Umwandeln einer Zahl in eine Zeichenkette
  ?FLO2 I: Zahl liegt in den Registern DE,HL, Registerpaar BC zeigt auf das Resultat und Akku hält Zeichen, das am Ende der Kette gespeichert wird
  O: Resultat mit Zeichenkette gefüllt

FLFORM.MAC
?FLFOR B: Umwandeln einer Zahl in eine formatierte Zeichenkette
  I: Die Zahl liegt auf dem Stack, Registerpaar DE auf das Resultat und Akku hält Zeichen, das am Ende der Kette gespeichert wird. Register H hält die Anzahl totaler Dezimalstellen und das Register L hält die Anzahl Nachkommastellen. Falls das Register L -1 hält, wird ein spezielles Format mit Exponentialdarstellung gewählt.
  O: Resultat mit Zeichenkette gefüllt

LBCHOT.MAC
?FLOIN B: Initialisierung einer Zeichenkette
  I: Registerpaar BC zeigt auf Kette, Akku hält Endzeichen.
  O: Buffer mit Endzeichen initialisiert
?CHROU B: Zeichen in Kette abspeichern
  I: Akku hält zu speicherndes Zeichen
  O: Zeichen gespeichert, Buffer fixiert

LBCHIN.MAC
?FLIIN B: Eingabebuffer initialisieren.
  I: Registerpaar BC zeigen auf Kette, Akku hält Länge der Zeichen
  O: ---
?CHRGE B: Zeichen aus Eingabebuffer laden
  I: ---
  O: Akku hält Zeichen
?PTRBM B: Eingabebuffer fixieren
  I: ---
  O: Zero Flag gesetzt, wenn kein Zeichen mehr im Buffer

FLBSUT.MAC
?ZERO ?OVFL B: Fehlerroutinen

LBOP1.MAC
@OPER1 B: Schnittstelle zu Stack-orientierten Routinen

LBOP2.MAC
@OPER2 B: Schnittstelle zu Stack-orientierten Routinen

LBOP16.MAC
@OPR16 B: Schnittstelle zu Stack-orientierten Routinen

FLMANT.MAC
MANT10 MANTST B: Mantissenoprationen