Die CPU des C128 kann lediglich Integerzahlen addieren und subtrahieren. Alle anderen Rechenfähigkeiten des Basic 7.0 werden über Betriebssystemroutinen realisiert, die natürlich auch von Assemblerprogrammierern genutzt werden können. Man muß nur wissen wie! Das Handling von Fließkommazahlen beim C128 entspricht weitgehend dem des C64: Es werden die gleichen Zahlenformate (FLPT und MFLPT) benutzt und es existieren ebenfalls die beiden Fließkommaakkumulatoren FAC und ARG, über die die meisten Operationen ablaufen. Sie befinden sich hier an den Speicherstellen $63-$68 bzw. $6A-$6F. Auch die Routinen selbst ähneln denen des C64, wobei allerdings bei einigen die jeweilige Speicherkonfiguration mit ins Spiel kommt. Aufgerufen werden sie über eine Sprungtabelle ab $AF00 im Basic-ROM, man muß dieses also vorher aktivieren(BANK 15 bzw. LDA #$00:STA $FF00) oder die JSRFAR-Routine($02CD) benutzen. Die Tabelle enthält die folgenden Einsprünge(Angaben wie A/Y stehen für Werte im Low/High-Format): FACINT($AF00): Wandelt eine Fließkommazahl im FAC in eine Integerzahl(-32768 bis +32767) um und speichert das Ergebnis in $66/$67. INTFAC($AF03): Schreibt die in Y/A übergebene Integerzahl im FLPT-Format in den FAC. FACSTR($AF06): Die im FAC enthaltene Zahl wird als ASCII-String ab Adresse $0100 abgelegt und mit einem Nullbyte abgeschlossen. Nach dem Aufruf enthalten A/Y den Wert $0100 als Zeiger auf den String. STRFAC($AF09): Dies ist die Umkehrung der vorherigen Routine: Ein in Bank 1 abgelegter String wird als Fließkommazahl im FAC abgespeichert. Seine Adresse muß in $24/$25 stehen, die Länge im Akku. FACWRD($AF0C): Die Fließkommazahl im FAC wird ins Word-Format(0-65535) transformiert, das Ergebnis befindet sich nach dem Aufruf sowohl in $16/$17 als auch in Y/A. WRDFAC($AF0F): Die Word-Zahl in Y/A wird als Fließkommazahl in den FAC gebracht. Achtung: Vor WRDFAC muß zuerst PREPWF($84E5) aufgerufen werden! SUBMEM($AF12): Subtrahiert von einer Fließkommazahl, die im MFLPT-Format in Bank 1 steht, den Inhalt des FACs und speichert das Ergebnis wieder im FAC. Die Adresse der Zahl wird in A/Y übergeben. SUBFAC($AF15): Legt im FAC die Differenz ARG-FAC ab. ADDMEM($AF18): Addiert eine MFLPT-Zahl in Bank 1 und den Inhalt des FACs, das Ergebnis kommt wieder in den FAC. Die Adresse wird wie bei SUBMEM in A/Y übergeben. ADDFAC($AF1B): FAC=FAC+ARG. Wichtig: Vor Aufruf der Routine müssen mittels LDA$63(lädt FAC-Exponent) einige Flags richtig gesetzt werden. MEMMULT($AF1E): MEMMULT ist das Pendant zu ADDMEM für die Multiplikation. Die Parameterübergabe erfolgt entsprechend. MULT($AF21): Hierbei handelt es sich um die analoge Routine zu ADDFAC. Wieder muß vor dem Aufruf ein LDA$63 erfolgen. DIVMEM($AF24): Noch eine Routine nach dem Muster von ADDMEM und SUBMEM, diesmal für die Division: FAC=(MFLPT-Zahl in Bank 1)/FAC. Die Adresse muß wieder in A/Y stehen. DIVAF($AF27): Dividiert den Inhalt vom ARG durch den des FACs, das Ergebnis kommt wie üblich in den FAC. LOG($AF2A): Bildet den natürlichen Logarithmus des Wertes im FAC: FAC=LOG(FAC). INT($AF2D): Entspricht der INT-Funktion in Basic. Argument und Ergebnis befinden sich im FAC. SQR($AF30): Zieht die Wurzel aus dem FAC-Inhalt. NEGFAC($AF33): Das Vorzeichen des FACs wird gewechselt. MEMPOT($AF36): Potenziert den Inhalt des ARGs mit einer im Speicher stehenden MFLPT-Konstanten(Adresse in A/Y) und legt das Ergebnis im FAC ab. Achtung: Im Gegensatz zu anderen Routinen wird hier die Konstante aus der beim Aufruf aktivierten Speicherbank gelesen! POTAFC($AF39): Speichert das Ergebnis von ARG hoch FAC im FAC ab. Wie bei ADDFAC und MULT muß vorher ein LDA$63 erfolgen. EXP($AF3C): Entspricht der EXP-Funktion in Basic: FAC=e(Eulersche Zahl=2.71828...) hoch FAC. COS($AF3F): Kosinus-Funktion: FAC=COS(FAC). SIN($AF42): Analog für Sinus. TAN($AF45): Berechnet den Tangens nach der Formel TAN(FAC)=SIN(FAC)/COS(FAC). ATN($AF48): Der Arcustangens(ATN) ist die Umkehrfunktion des Tangens. ROUND($AF4B): Mit dieser Routine wird der FAC gerundet. ABS($AF4E): ABS liefert den Absolutbetrag einer Zahl im FAC. SIGN($AF51): Hiermit wird das Vorzeichen des FACs ermittelt, das Ergebnis erhält man im Akku: $01 bedeutet Plus, $FF Minus und $00 steht für FAC=Null. CMPFAC($AF54): Vergleicht eine MFLPT-Konstante in der aktuellen Speicherbank an der Adresse A/Y mit dem FAC-Inhalt. Ist die Konstante größer, liefert die Routine $FF im Akku, sonst $01 für kleiner und $00 bei Gleichheit. RND($AF57): Ergibt wie die entsprechende Basic-Funktion eine Zufallszahl zwischen 0 und 1. Vor dem Aufruf muß wieder einmal ein LDA$63 erfolgen. MOVMA1($AF5A): Lädt ARG mit dem Wert der MFLPT-Konstanten, die sich bei A/Y in Bank 1 befindet. Außerdem erhält man den Exponenten des FACs im Akku. MOVMA($AF5D): Funktioniert genau wie die vorherige Routine, allerdings wird die Konstante aus der aktuellen Speicherbank statt Bank 1 geladen. MOVMF1($AF60): Wie MOVMA1, nur für FAC statt ARG. MOVMF($AF63): Entsprechend die zu MOVMA analoge Routine für den FAC. MOVFM($AF66): Die Umkehrung von MOVMF: Der FAC-Inhalt wird bei X/Y in die aktuelle Speicherbank geschrieben. MOVAF($AF69): Kopiert den Inhalt des ARGs in den FAC. MOVFA($AF6C): Das Gleiche wie zuvor nur in umgekehrter Richtung. Thomas Klein
Zurück zum
Index