next up previous
Nächste Seite: FPU-Unterstützung für transzendente Funktionen Aufwärts: Programmieren mit M2Amiga Vorherige Seite: Fazit

Das Pseudo-Modul SYSTEM

Im folgenden wird das Modul SYSTEM besprochen. Nicht besonders erklärte Typen und Prozeduren haben die Eigenschaften, wie sie in jedem Lehrbuch erklärt sind. Änderungen oder Unterschiede sind beschrieben.

DEFINITION MODULE SYSTEM;
TYPE
  BYTE;
  WORD;
  FFP;
  ADDRESS  = POINTER TO BYTE;
  BPTR     = BPOINTER TO BYTE;
  SHORTSET = SET OF [0..7];
  BITSET   = SET OF [0..15];
  LONGSET  = SET OF [0..31];

(*
 * T entspricht skalarem Typ mit Groesse <=4 Byte
 *)

PROCEDURE ADR (VAR x: AnyType): ADDRESS;

PROCEDURE ASSEMBLE ({ Befehl} END);

PROCEDURE CAST ( AnyType1; x: AnyType2): AnyType1;

PROCEDURE LOADREGS (regs: BITSET);
(* regs=Konstante *)

PROCEDURE REG (reg: [0..15]): LONGINT;
(* reg=Konstante *)

PROCEDURE SAVEREGS (regs: BITSET);
(* regs=Konstante *)

PROCEDURE SETREG (reg: [0..15]; val: T);
(* reg=Konstante, SIZE(T)=4 *)

PROCEDURE SHIFT (x:T; n:LONGINT): T;

PROCEDURE TAG(VAR x: AnyType; val {,val}: ADDRESS):
  ADDRESS;

PROCEDURE TSIZE ( AnyType): LONGINT;

PROCEDURE VAL (T; x:CARDINAL): T;

PROCEDURE ACOS(x:LONGREAL):LONGREAL;
PROCEDURE ASIN(x:LONGREAL):LONGREAL;
PROCEDURE ATAN(x:LONGREAL):LONGREAL;
PROCEDURE COS(x:LONGREAL):LONGREAL;
PROCEDURE COSH(x:LONGREAL):LONGREAL;
PROCEDURE EXP(x:LONGREAL):LONGREAL;

PROCEDURE LOG10(x:LONGREAL):LONGREAL;
PROCEDURE LOGN(x:LONGREAL):LONGREAL;

PROCEDURE SIN(x:LONGREAL):LONGREAL;
PROCEDURE SINH(x:LONGREAL):LONGREAL;
PROCEDURE SQRT(x:LONGREAL):LONGREAL;
PROCEDURE TAN(x:LONGREAL):LONGREAL;
PROCEDURE ATANH(x:LONGREAL):LONGREAL;

PROCEDURE ETOXM1(x:LONGREAL):LONGREAL;
PROCEDURE LOG2(x:LONGREAL):LONGREAL;
PROCEDURE LOGNP1(x:LONGREAL):LONGREAL;
PROCEDURE TENTOX(x:LONGREAL):LONGREAL;
PROCEDURE TWOTOX(x:LONGREAL):LONGREAL;
PROCEDURE SQR(x:LONGREAL):LONGREAL;
PROCEDURE TANH(x:LONGREAL):LONGREAL;

END SYSTEM.


\begin{note}
Nicht mehr im Modul {\bf SYSTEM} sind enthalten:
\begin{itemize}
\i...
...bf Coroutines} (Seite \pageref{Coroutines}) gegeben.
\par\end{itemize}\end{note}


\begin{note}
Die Speichereinheit auf dem 68000, auf die individuell zugegriffen
...
...te nicht mehr verwendet und durch {\tt ARRAY OF BYTE} ersetzt werden.
\end{note}

Der Typ ADDRESS ist mit allen Zeigervariablen, die mit POINTER TO ... deklariert wurden, sowie mit dem Typ LONGINT kompatibel. Der Typ BPTR ist mit allen Zeigervariablen, die mit BPOINTER TO ... deklariert wurden, sowie mit dem Typ LONGINT kompatibel. Der Typ BITSET entspricht dem bisher vordefinierten Typ BITSET. Da BITSET ein Wort gross sein soll, ist dieser Typ maschinenabhängig, weshalb er nun vom Modul SYSTEM importiert werden muss.

LONGSET entspricht einem Set in Langwort-Grösse (32 Bit). SHORTSET entspricht einem Set in Byte-Grösse (8 Bit).

FFP ist der 68000-spezifische Typ der Gleitpunktzahlen. Diesem Typ können beliebige konstante Gleitpunktzahlen zugewiesen werden. Für diesen Typ sind die gleichen mathematischen Grundfunktionen wie für den Typ REAL definiert.

Die Funktion ADR liefert die Adresse des angegebenen Objektes zurück. Erlaubte Objekte sind Variablen, konstante Zeichenketten, Prozeduren und Library-Moduln (Abschnitt 5.1.13, Seite [*]). Bei Library-Moduln liefert ADR den Zeiger auf die geöffnete Library zurück (Library-Basis).

Die Prozedur ASSEMBLE aktiviert den im Compiler integrierten Assembler. Er ist in Abschnitt 2.5 beschrieben.

Die Funktion REG gibt den Wert des angesprochenen Registers zurück. Der Parameter reg muss ein konstanter Ausdruck sein, dessen Wert zwischen 0 und 15 liegt. Die Datenregister D0 bis D7 werden durch die Werte 0 bis 7 angesprochen, die Adressregister A0 bis A7 durch die Werte 8 bis 15.

Die Prozedur SETREG legt den angegebenen Wert im angegebenen Register ab. Für den Parameter reg gilt das gleiche wie bei REG. Das angesprochene Register wird dadurch nicht geschützt, der nächste Ausdruck kann den Registerinhalt bereits wieder zerstören!

Die Prozeduren SAVEREGS und LOADREGS retten die angegebenen Register auf den Stack bzw. laden die Werte vom Stack in die Register. Als Parameter erwarten beide Prozeduren ein BITSET, dessen Elemente die beteiligten Register angeben. Die Numerierung ist die gleiche wie bei REG. Die Operationen werden durch den 68000-Befehl MOVEM.L ausgeführt. Diese beiden Prozeduren sind vornehmlich aus Kompatibilitätsgründen vorhanden. Ihr Einsatz dürfte kaum nötig sein, da alle Prozeduren die benutzten Register selbst retten.

Die Prozedur TAG erlaubt die Verwendung von sogenannten TagItems. Der genaue Aufbau ist im Abschnitt 5.1.9 beschrieben.

Die Prozedur TSIZE erlaubt keine Angabe von Kennfeldern (tag fields) um die Grösse einer Variante zu ermitteln. Diese Prozedur sollte ohnehin nicht mehr verwendet werden, da die Definition der vordefinierten Prozedur SIZE neu auch Typen als Parameter zulässt.

Die Prozedur SHIFT verschiebt die Bitkombination des angegebenen Wertes um soviele Stellen wie in n vermerkt. Ein positiver Wert von n verschiebt nach links, ein negativer Wert nach rechts. Ist der zu verschiebende Wert vorzeichenbehaftet (z.B. INTEGER), so wird bei einer Rechtsverschiebung mit dem Vorzeichenbit aufgefüllt5.7, in allen anderen Fällen mit Null-Bits5.8.

Die Prozedur CAST führt einen Typentransfer durch. Dabei wird der Typ der übergebenen Variablen an dieser Stelle umgeschaltet. Der Ursprungstyp und der Zieltyp müssen beide den gleichen Speicherbedarf haben. Mit der CAST-Anweisung kann die Typenkontrolle umgangen werden, ihr Einsatz sollte daher möglichst beschränkt bleiben.

Die Prozedur VAL ist identisch mit der vordefinierten Prozedur VAL. Sie kann jedoch aus Kompatibilitätsgründen auch vom Modul SYSTEM importiert werden.



Unterabschnitte
next up previous
Nächste Seite: FPU-Unterstützung für transzendente Funktionen Aufwärts: Programmieren mit M2Amiga Vorherige Seite: Fazit
Claudio Nieder 2000-11-12