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.
`

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

- FPU-Unterstützung für transzendente Funktionen

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