Rechenkünstler C 128
C 128-Fließkommaroutinen
 
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  
Home | Cat's Eye | Kimagure | Fotos | Computer | NiNuM | TSP | Kontakt