%format latexg

\documentstyle[11pt,german,makeidx]{article}

\parindent 0pt

%\typein[\nr]{Welches Kapitel? }
%\includeonly{\nr}

\newcommand{\anf}[1]{"`#1"'}
\newcommand{\abk}[1]{#1\@}
\newcommand{\nopagenumber}{\renewcommand{\thepage}{}}
%
%Die folgenden %-Zeichen nicht entfernen!
%
\newcommand{\deflabel}[1]{\bf #1\hfill}%
\newenvironment{deflist}[1]%
{\begin{list}{}%
{\settowidth{\labelwidth}{\bf #1}%
\setlength{\leftmargin}{\labelwidth}%
\addtolength{\leftmargin}{\labelsep}%
\renewcommand{\makelabel}{\deflabel}}}%
{\end{list}}%

\makeindex

\begin{document}

\begin{titlepage}
\begin{center}
{\Huge\bf crystal}\\
\end{center}
\end{titlepage}
%
\tableofcontents

\newpage
\section{Einfhrung}
\subsection{Was ist \anf{crystal}?}
\anf{crystal} ist der Versuch, fr Modula-2 eine Standard - GEM -
Bibliothek zu schaffen. \anf{crystal}
\begin{itemize}
\item bercksichtigt
   \begin{itemize}
   \item ATARI-GEM 1.0, 1.2, 1.4, 3.x, 4.x
   \item MultiGEM, Mag!X
   \item GDOS, AMCGDOS, FSMGDOS, SpeedoGDOS, NVDI
   \item ABC-GEM 2.x,
   \item KAOS-GEM 1.42,
   \item PC-GEM 1.2, PC-GEM 2.x, GEM/3,
   \item X/GEM,
   \item X/GemOnX,
   \end{itemize}
\item f„ngt Unterschiede zwischen den einzelnen GEM~- Versionen ab
\item ist hochportabel
\item ist vollst„ndig angepažt an TopSpeed~- M2, TDI~- M2,
      Megamax~- M2, H„nisch~- M2/ST, SPC~- M2, LPR~- M2
\item ist teilweise angepažt Logitech~- M2,
      Software Developing System~- M2, Fitted Software Tools~- M2,
      Modular Software~- M2, ana~- M2/ST, FTL~- M2
\item bietet {\Large C}~- nahe Bezeichner,
      aber trotzdem kein Verzicht auf das
      Typenkonzept von Modula, d.h.\@
\item bietet neben Konstanten auch Mengen, Aufz„hlungen, Unterbereiche,
      Prozedurtypen und Pointertypen,
      \anf{QUALIFIED REEXPORT} von Typen und Konstanten,
      Typsynonyme
\item besitzt einen effizienten AES-Aufruf fr MC 680x0-Systeme (modifiziertes
      Seimet~ - Verfahren)\index{Seimet - Verfahren}
\item ist frei kopierbar -- der Quelltext liegt offen und kann
      an jedes geeignete Modula~- System angepažt werden
\item bietet eine st„ndig wachsende Zahl zus„tzlicher Moduln
\end{itemize}

\newpage
\subsection{Vorgeschichte}
\anf{crystal} entstand aus der Situation, daž mit den meisten
ATARI~- Modula~- Systemen zwar GEM~- Programme erstellt werden konnten,
jedoch jeder Hersteller seine eigene Art und Weise, GEM~-
Aufrufe zu t„tigen, anbot. Es gab also keinen Standard, h”chstens eine
Art \anf{TDI~- Standard}, da TDI wohl einer der ersten Modula~- Compiler
war, der fr den GEM~- Rechner ATARI ST verfgbar war. Man war sich
einig, daž ein GEM~- Standard aus der Taufe gehoben werden
mužte. Ein Streit entbrannte ber die Namensgebung und die
Modulaufteilung bzw.\@ die Namensgebung der Moduln. Die originalen
C~- Aufrufe benutzen z.B.\@ einen Unterstrich (\_), den es jedoch im
damaligen Modula~- Standard nach Wirth nicht gab. Und es gab Compiler, die
erlaubten trotzdem einen Unterstrich, andere jedoch hielten sich an Wirth.
Nachdem der Grundstein fr \anf{crystal} gelegt worden war, hat es daher
noch einige Zeit gedauert, bis das Konzept von \anf{crystal} klar war.

\subsection{Das Konzept von \anf{crystal}}
Die Namensgebung \index{Namensgebung} bei \anf{crystal} ergibt sich aus dem
jeweiligen C~- Bezeichner,
aus dem die Unterstriche entfernt werden, bei dem die im Bezeichner
enthaltenen
Abkrzungen nach Modula~- Manier, sprich in Grož-/ Kleinschreibung
ausgeschrieben werden und dann unter Beibehaltung der Grož-/ Kleinschreibung
wieder zurckgekrzt werden. Zur Verdeutlichung dient ein Beispiel:

\begin{enumerate}
\item graf\_mkstate
\item grafmkstate
\item GraficsManagerMouseAndKeyboardState
\item GrafMKState
\end{enumerate}

Diese Vorgehensweise erscheint nicht unbedingt naheliegend, stellt jedoch
eine M”glichkeit dar, aus einem \anf{C~- Look} einen
\anf{Modula~- Look} zu machen, ohne auf die aus der Literatur gel„ufigen
\anf{Buchstabenfolgen} verzichten zu mssen und dabei noch die Compiler,
die (noch) keinen Unterstrich zulassen, zu bercksichtigen.\\
Soweit Namen fr Typen vergeben werden mužten, die in den C~- Bindings
dank des spartanischen Typenkonzepts von C nicht vorgesehen waren,
wurden keine neuen, knstlichen C~-Namen erfunden, sondern
\anf{Modula~- like} Namen gew„hlt. Diese Namen stellen wohl die
eigentliche Schwierigkeit beim Umstieg von anderen Bibliotheken auf
\anf{crystal} dar.

\newpage
\section{šbersetzen von \anf{crystal}}
\subsection{Arbeiten mit dem Pr„prozessor}
\index{Pr„prozessor}
Was der Programmiersprache C zur Portabilit„t verhilft, n„mlich
der C~- Pr„prozessor, verhilft auch Modula~- 2 -- insbesondere bei
systemnahen Dingen wie GEM -- zur Portabilit„t. Viele Unterschiede
zwischen den verschiedenen Modula~- Compilern (wie auch bei C~- Systemen)
k”nnen abgefangen werden.
Es wurde jedoch Wert darauf gelegt, den Pr„prozessor~- Code umso mehr
zu verringern, je h”her ein Modul ber der GEM~- Systemebene angesiedelt
ist. Hauptmoduln wie die beiliegenden Testprogramme kommen v”llig ohne
Pr„prozessor aus, desweiteren auch viele auf den GEM~- Aufrufen aufbauende,
h”here Moduln. Dort markiert der Pr„prozessor u.U.\@ nur noch das Datum
und tr„gt die Compileroptionen ein.

Legen Sie von den unter Verwendung des C~-Pr„processors~- Codes erstellten
Quelltexten aus dem Verzeichnis \verb|...\src| Kopien an. Diese Kopien
bersetzen Sie dann mit einem Shell~-Script, daž z.B.\@ wie folgt lautet
(vgl.\@ \verb|...\bin\mupfel\c.mup|):

\begin{verbatim}
echo cpp $1 fr $2...
cpp ~$1 -D$2 -P -imacros C:\USR\INCLUDE\CRYSTAL.M2H > temp
x2d1 <temp >$1
rm temp
\end{verbatim}

Ein Aufruf dieses Shell~-Scripts kann z.B.\@

\begin{verbatim}
c aes.mod HM2
\end{verbatim}

lauten. Dabei ist \verb|aes.mod| in diesem Beispiel der Name des Quelltextes,
\verb|HM2| eine Abkrzung
fr einen ganz bestimmten Compiler, s.\@ Liste der Modula~- Compiler.
cpp \index{cpp} ist der C~- Pr„prozessor. Er sollte in einem Verzeichnis
abgelegt sein, in dem er auch von der verwendeten Shell gefunden wird. Das
gleiche gilt fr das Script. Meist
ist ein solches Verzeichnis in der Environmentvariablen \verb|PATH=|
aufgelistet. Mit Hilfe der Option \verb|-D| wird die an das
Script bergebene Abkrzung als Pr„prozessor~- Konstante definiert. Die
Option \verb|-P| unterdrckt unerwnschte Kommentare im Output des
Pr„prozessors, die Option \verb|-imacros| l„dt ein Includefile \index{Includefile}
schon beim Aufruf des Pr„prozessors. Der Name des Verzeichnisses, in dem das
Includefile \verb|crystal.m2h| abgelegt ist, ist natrlich an Ihre
eigenen Verh„ltnisse anzupassen. \verb|x2d1| \index{x2d1} ist ein Beautifier,
der Zeilenenden mit \verb|CR LF| abschliežt und berflssige Leerzeilen
entfernt. Er sollte ebenfalls in einem Verzeichnis liegen, in dem er von
der verwendeten Shell gefunden wird.
Um s„mtliche Moduln mit dem Pr„prozessor zu bearbeiten, benutzen Sie am
besten das Script \verb|...\bin\c_all.mup|, das Sie z.B.\@ wie folgt aufrufen:

\begin{verbatim}
c_all HM2
\end{verbatim}

Dieses Script geht davon aus, daž zum aktuellen Verzeichnis die
Unterverzeichnisse \verb|crystal| und \verb|toolbox| existieren.
Weiterhin wird davon ausgegangen, daž sich z.B.\@ auch die Dateien
\verb|flyinglo.*| aus \verb|...\src\flying| im Verzeichnis \verb|toolbox| befinden.
Passen Sie daher dieses Script an Ihre Verh„ltnisse und Wnsche an.

\newpage
\subsection{Hinweise zu Compilern}

\subsubsection{Fitted Software Tools - Modula V 3.1}
\index{Fitted Software Tools}
Die maximale Anzahl der Bezeichner pro Modul, maxIds, und der dafr
reservierte Speicherplatz, idSpace, ist doch etwas zu knapp bemessen.
Starten Sie daher FSTM2 mit der Batchdatei \verb|...\cmp\fstm2\fstm2.bat|. Denken Sie
daran, daž eine GEM-Applikation noch etwas DOS-Speicher frei lassen
muž. Dies wird z.B. in der Batchdatei \verb|...\cmp\fstm2\fstmake.bat| gemacht.

Die Anpassung an diesen Compiler ist vorbergehend eingestellt, solange
keine Compiler~- Version zur Verfgung steht, bei der Prozeduren -- wie
bei anderen Compilern auch -- Sets zurckliefern drfen.

\subsubsection{ana - Modula}
\index{ana - Modula}
Dieser Compiler (V 1.9) verlangt noch nach Exportlisten\index{Exportlisten}.
Weiterhin untersttzt
er keinerlei 16~- Bit~- Zahlenoperationen, sondern nur
32~- Bit~- Arithmetik. Beide Features wurden
eine Zeit lang untersttzt, z.B.\@ durch die Pr„prozessor~- Variable
\anf{export} (vgl.\@ noch \verb|PORTAB.DEF|) und \anf{long}, und es waren
portable GEM~- Programme lauff„hig. Doch mit der Zeit setzte sich die
Meinung durch, daž das oft erforderlich Umwandeln von 16~- Bit~-
GEM~- Daten in 32~- Bit~- Daten und eventuell wieder zurck zwar
portabel, aber untragbar war. Wer will, kann \anf{crystal}
insoweit erg„nzen, daž Quelltexte wieder portabel zu ana~- Modula
werden. Aber vielleicht gibt es mittlerweile eine neuere Version dieses
Compilers?

\subsubsection{TopSpeed - Modula V 1.17}
\index{TopSpeed - Modula V 1.17}
Um mit TopSpeed - Modula ein GEM - Programm linken zu k”nnen, sind
die Hinweise in der Zusatzdokumentation unter dem Punkt
\anf{Controlling the Order of Classes} zu beachten, d.h.\@ es
muž die Datei \verb|order.obj| hinzugelinkt werden. Zur Erleichterung
dient die Batchdatei \verb|...\cmp\tsm2_1\gl.bat|. Denken Sie
daran, daž eine GEM-Applikation noch etwas DOS-Speicher frei lassen
muž. Dies wird ebenfalls exemplarisch in der Batchdatei \verb|gl.bat| gemacht.

Weiterhin ist zu beachten, daž die AES- und VDI-Einsprnge in den
Assemblermoduln AESSYS und VDISYS get„tigt werden. Sie befinden sich
im gleichen Verzeichnis wie \verb|gl.bat|.

\subsubsection{H„nisch - Modula}
\index{H„nisch - Modula}
Im neuesten H„nisch Compiler gibt es bereits BYTESET, LONGSET und VOID
als Standardbezeichner. Um einen Konflikt mit dem Modul INTRINSIC
\index{INTRINSIC} zu
vermeiden, muž \verb|HM.ACC| gepatcht werden, d.h.\@ ersetzen Sie obige
Bezeichner z.B.\@ durch BYTESet, LONGSet und Void.

\subsubsection{SPC - Modula}
Compilieren Sie


\begin{verbatim}
BASEMAKE.CMD
AESMAKE.CMD
VDIMAKE.CMD
TOOLMAKE.CMD
\end{verbatim}

in dieser Reihenfolge.

\subsubsection{LPR - Modula}
\index{LPR - Modula}
Bei LPR - Modula kommt es beim Compilieren und Linken sowie beim Start des
Debuggers und eventuell auch des LPR~- Editors zu einem Konflikt
zwischen dem bereits vorhandenen
\verb|AES|~- Modul und dem \verb|AES|~- Modul von \anf{crystal}. Entweder
Sie verzichten auf den Debugger und „hnliche Programme und verschieben
die Original \verb|AES|~- Moduln (\verb|AES.SBM| und \verb|AES.OBM|)
in ein Verzeichnis, in dem die Dateien vom LPR~- System nicht
gefunden werden oder Sie mssen das LPR~- System patchen, siehe dazu
die Datei \verb|...\cmp\lprm2\patches.txt|.
\index{patches.txt}

Ein Programm, das nur Moduln aus \anf{crystal}
verwendet, ben”tigt vom LPR~- System nur \verb|GEMX.OBM|, \verb|SYSTEM.OBM|,
\verb|TERMINAL.OBM| und \verb|HEAP.OBM|.

Mit Hilfe von Dateien, deren Extension auf \verb|*.CM?| lautet, kann man
dem Compiler eine Liste von zu bersetzenden Moduln bergeben. Žndern
Sie zu diesem Zweck einfach die Suchmaske der Fileselektorbox bei
\anf{\verb|Modul ausw„hlen|} von
\verb|*.MOD| nach \verb|*.CM?|, w„hlen z.B.\@ \verb|BASEMAKE.CMP|
aus und rufen dann \anf{\verb|bersetzen   Ctrl+|} auf. šbersetzen Sie


\begin{verbatim}
BASEMAKE.CMP
AESMAKE.CMP
VDIMAKE.CMP
TOOLMAKE.CMP
\end{verbatim}

in dieser Reihenfolge. Die Reihenfolge dieser Dateien und auch die
darin enthaltene Reihenfolge von Moduln sollte nicht unberlegt
ge„ndert werden, da in diesen Listen die Abh„ngigkeiten der Moduln
bercksichtigt sind.

Um den Heap eines LPRM2~- Compilates zu vergr”žern, muž der Linker
gepatcht werden. Dazu dient
\verb|...\cmp\lprm2\patchlnk\patchlnk.tos|.
\index{patchlnk.tos}

\subsubsection{Modular Software - Modula}
\index{Modular Software - Modula}
Fr dieses System existiert nur eine grobe Anpassung, da der
Compiler doch sehr viel zu wnschen brig l„žt.

\subsubsection{FTL - Modula}
\index{FTL - Modula}
Dieser Compiler scheint irgendwie Probleme mit dem Reexport \index{Reexport}
zu haben.
Tritt beim šbersetzten eines Implementationsmoduls die Fehlermeldung
\anf{Name mehrfach deklariert} auf, ist die angebliche
Mehrfachdeklaration im zugeh”rigen Definitionsmodul zu suchen. Bei der
Anpassung an diesen Compiler wurde immerhin soweit Sorge getragen, daž
sich die Testprogramme Hello und VDITest bersetzen und ausfhren
lassen.

\newpage
\subsection{Hinweise zu den verschiedenen GEM - Versionen}
\subsubsection{ATARI - GEM}
\index{ATARI - GEM}
Das ATARI~- GEM wird mittlerweile von ATARI selbst weiterentwickelt.
Mit dem Betriebssytem TOS 1.04 kamen die neuen AES~- Aufrufe
fsel\_ex\-in\-put() und wind\_new. Mit dem neuen MultiTOS \index{MultiTOS}
werden die AES multi\-tasking\-f„hig. Die Men~- Bibliothek wird um
Popup~- und Submens erweitert. Es gibt eine Reihe von neuen
shel\_write()~- Modi.\\
Nicht zu vergessen ist das ABC~-GEM 2.2 \index{ABC - GEM}
der holl„ndischen Firma
ABC~- Software, welches PC~- GEM 2.2 fr den ATARI zur Verfgung
stellt, incl.\@ einer neuen GEM~- Draw~- Version, GEM~- Paint,
GEM~- Graph, GEM~- Wordchart \index{GEM - Wordchart} und einem neuen
GEM~- Output. Von allen diesen Programmen sind Demo~- Versionen erh„ltlich.

\subsubsection{PC - GEM}
\index{PC - GEM}
Die letzten PC~- GEM~- Versionen machten vor allem durch die
im VDI eingebauten Bezierfunktionen, von denen GEM~- Artline intensiven
Gebrauch machte, von sich reden. Seit GEM 2.x durfte der GEM~-
Desktop (nicht GEM an sich!) aufgrund eines ungerechten Streites
mit Apple \index{Apple} nur noch zwei Fenster anbieten.

\subsubsection{X/GEM}
\index{X/GEM}
Dies ist ein Realtime - Multitasking~- GEM unter dem Realtime~-
Multitasking~- Operatingsystem FlexOS, beides von DRI. \index{DRI} Man
bedenke, daž es
sehr wenige Realtime~- Multitasking~- Operatingsysteme
\index{Realtime - Multitasking} gibt (UNIX \index{UNIX} ist bis
auf Spezialversionen nicht echtzeitf„hig!). Daher bilden X/GEM und FlexOS
ein wirklich sehr exklusives Gespann! Es wird haupts„chlich zu Mež~-,
Steuer~- und Regelzwecken eingesetzt, z.B.\@ bei Siemens\index{Siemens}.\\
Rein „užerlich ist X/GEM am \anf{PC~- Look} zu erkennen, jedoch ohne
Einschr„nkung der Fensterzahl. Jede Applikation erh„lt einen Desktop
in einem Fenster, das in der Gr”že ver„nderbar ist. Selbst der Desktop
des \anf{Desktop} befindet sich in einem Fenster. Darunter befindet sich
dann das Nichts, d.h.\ der blanke Bildschirm. šbrigens gibt es Adimens
auch fr X/GEM (Adimens GTX\index{Adimens GTX}).

Auf der Programmierebene bietet X/GEM einen erweiterten EvntMulti()~-
Aufruf: er heižt schlicht EvntEvent() \index{EvntEvent()} und ist
zu EvntMulti() abw„rtskompatibel.

FlexOS \index{FlexOS} ist POSIX~- orientiert, \index{POSIX} netzwerkf„hig
und bietet die
M”glichkeit zur Laufzeit Ger„tetreiber einzubinden. FlexOS l„uft erst ab
intel 80286 \index{intel 80286} aufw„rts und hat mit DOS nur noch das
Dateisystem gemeinsam.

\subsubsection{X/GemOnX}
\index{X/GemOnX}
Diese GEM - Version stammt nicht von DRI, sondern von der bayrischen Firma
X/software \index{X/software}. X/GemOnX l„uft~-- der Name l„žt es schon
vermuten~-- unter
UNIX \index{UNIX} und X~- Windows \index{X - Windows}.
X/GemOnX folgt der Server~- Client~- Architektur\index{Client - Server}.
Einer Applikation werden Libraryfunktionen hinzugelinkt, die Befehle und
Argumente in Pakete packen, ber UNIX~- Interprozež~- Kommunikation
(UNIX domain sockets \index{domain sockets} oder TCP/IP\index{TCP/IP}) an
den X/GemOnX~- Server senden, Rckgabedaten auspacken und der Applikation
zur Verfgung stellen. Daneben gibt es asynchrone Mechanismen fr die
Events und die user defined objects. Wie bei X~- Windows mssen
X/GemOnX~- Clients und X/GemOnX~- Server nicht auf ein und demselben
Rechner laufen. Daraus ergibt sich, daž die Resource \index{Resource} sich im
Adrežraum des X/GemOnX~- Servers befindet, also nicht direkt im Speicher
der Applikation ansprechbar ist. Solange man als C~- Programmierer die
Makros aus \verb|taddr.h| \index{taddr.h} benutzt hat, gibt es keine
Probleme beim Portieren. Die wenigsten werden sich daran gehalten haben
(C~- Programmierer \index{C - Programmierer} halten C fr portabel,
programmieren aber zu oft unportable
Dinge damit). Bei \anf{crystal} ist u.a.\ deswegen der Zugriff auf AES~- Objekte ber
Funktionen aus den Moduln GetObject \index{GetObject} und SetObject
\index{SetObject} obligatorisch.

\newpage
\subsection{\anf{crystal} und M2POSIX}
\index{M2POSIX}
Das M2POSIX~- Paket, erh„ltlich z.B.\@ von \verb|ftp.atari.archive.umich.edu|,
enth„lt wie \anf{crystal} die Moduln \verb|pSTORAGE| und \verb|PORATB|.
Diese sollte mit denjenigen von \anf{crystal} identisch sein, sodaž man
entweder die einen oder die anderen benutzen kann. Im Falle von ATARI~- GEM
importiert \anf{crystal} aus dem M2POSIX~- Paket die Funktion
\verb|DosSystem.GetCookie()| sowie einige POSIX~- Funktionen fr das
Modul \verb|ScrpMgr|.

\newpage
\section{Beschreibung der Moduln}
\subsection{Namensgebung}
S„mtliche AES~- Moduln besitzen Namen der Form \verb|XXXXMGR.*|. S„mtliche
VDI~- Moduln beginnen mit einem \verb|V|. Moduln namens \verb|XXXXTOOL.*|
stellen im allgemeinen Erweiterungen zu entsprechenden AES~- und VDI~-
Moduln zur Verfgung.

\subsection{Das Modul PORTAB}
\index{PORTAB}

Dieses systemabh„ngige Modul stellt Typen zur Verfgung, die jeweils
eine bestimmte Anzahl von Bytes belegen sollen um damit Datenstrukturen
von fremdem Code, z.B.\@ die AES~- und VDI~- Eingabearrays,
nachbilden zu k”nnen. Wichtig ist, daž hier systemabh„ngige Dinge
an zentraler Stelle ge„ndert werden k”nnen. Damit wird dem Vorwurf
von Prof.\@ Wirth \index{Wirth}, daž Modula~- Programmierer zu oft auf
Dinge aus SYSTEM zugreifen, Rechnung getragen.\\
Beispiel fr irgendein herausgegriffenes System:

\begin{verbatim}

DEFINITION MODULE PORTAB;

IMPORT SYSTEM;

(* fixed Types *)

TYPE UNSIGNEDBYTE = [0..255];
     SIGNEDBYTE   = [-128..127];
     ANYBYTE      = SYSTEM.BYTE;

     UNSIGNEDWORD = SHORTCARD;
     SIGNEDWORD   = SHORTINT;
     ANYWORD      = SYSTEM.WORD;

     UNSIGNEDLONG = CARDINAL;
     SIGNEDLONG   = INTEGER;
     ANYLONG      = SYSTEM.LONGWORD;

     BYTESET = PACKEDSET OF [0..7];
     WORDSET = PACKEDSET OF [0..15];
     LONGSET = PACKEDSET OF [0..31];

\end{verbatim}

\index{UNSIGNEDBYTE}
\index{SIGNEDBYTE}
\index{ANYBYTE}
\index{UNSIGNEDWORD}
\index{SIGNEDWORD}
\index{ANYWORD}
\index{UNSIGNEDLONG}
\index{SIGNEDLONG}
\index{ANYLONG}
\index{BYTESET}
\index{WORDSET}
\index{LONGSET}

\begin{verbatim}

(* for open Arrays *)

TYPE ANYTYPE = SYSTEM.LOC;

\end{verbatim}

\index{ANYTYPE}

Je nach Compiler mssen fr typfreie, offene Felder \verb|BYTE|,
\verb|WORD| oder \verb|LOC| aus \verb|SYSTEM| importiert werden.
Der Typ \verb|ANYTYPE| stellt eine portablere M”glichkeit dar, derartige
Felder zu verwenden.

\begin{verbatim}

(* avoiding SYSTEM.ADDRESS *)

TYPE ANYPOINTER = SYSTEM.ADDRESS;

\end{verbatim}

\index{ANYPOINTER}

Durch \verb|ANYPOINTER| macht man sich auch ein
kleines bižchen \anf{SYS\-TEM\-un\-ab\-h„n\-gi\-ger}.

\begin{verbatim}

(* all Purpose Procedure Type *)

TYPE ANYPROC = PROCEDURE(ANYPOINTER);

\end{verbatim}

\index{ANYPROC}

\verb|ANYPROC| stellt den allgemeinsten Fall einer Prozedur dar.
Alle Parameter werden durch einen Zeiger auf dieselben bergeben.

\begin{verbatim}

(* C-compatible NIL *)

CONST NULL = NIL;

\end{verbatim}

\index{NULL}

Bei systemnaher Programmierung ben”tigt man ”fters einen Zeiger mit
dem Wert 0. Bei vielen Compilern ist dies gleichbedeutend mit
\verb|NIL|, bei einigen jedoch nicht.
Aus Grnden der Portabilit„t benutze man \verb|NULL|.

\subsection{Das Modul pSTORAGE} \index{pSTORAGE}
Leider ist das gew”hnliche Storage~- Modul nicht portabel. pSTORAGE
schafft Abhilfe.

\subsection{Das Modul RcMgr} \index{RcMgr}
Dieses Modul stellt tats„chlich einen Ausschnitt aus dem Quelltext der
AES dar und ist auch ein Bestandteil (zumindest die GRECT~- Struktur
\index{GRECT - Struktur} und
die Funktion rc\_intersect) von C~- Bibliotheken.

\subsection{Das Modul SetObject} \index{SetObject}
\subsection{Das Modul GetObject} \index{GetObject}
Mit Hilfe dieser beiden Moduln kann auf portable Art und Weise auf
die AES~- Objektstrukturen zugegriffen werden, selbst wenn man nicht
so grožen Wert auf Portabilit„t beispielsweise zu X/GemOnX legt.
Zumindest sollte man GetObject.Type() und SetObject.Type() sowie
GetObject.Extnd() und SetObject.Extnd() benutzen, da der Zugriff auf
den erweiterten Objekttyp \index{erweiterter Objekttyp}
von Compiler zu Compiler unterschiedlich sein kann.

\subsection{Das Modul MenuTool} \index{MenuTool}
Die Funktion MenuKey() behandelt Men~- Tastenkrzel. Die einem Men\-punkt
zugeordneten Tastenkrzel, die mit der Control~- oder Alternate~- Taste
gebildet sein mssen, werden aus der Men~- Resource selber ausgelesen.
Sie sind somit mit Hilfe eines Resource Construction Sets ver„nderbar.
Die šbersetzung der in der Resource abgelegten Tastenkrzel~- Zeichenkette 
geschieht mit einer Art Tastaturtabelle, die ebenfalls in der Resourcedatei
vorhanden sein muž. Die Tastaturtabelle wird an Hand eines speziellen
Flag im Root~- Objekt erkannt. Diese Tastaturtabelle kann oder muž an
die verschiedenen landesspezifischen Tastaturen und Betriebssysteme
angepažt werden.

\subsection{Das Modul FormTool} \index{FormTool}
Dieses Modul stellt etwas erweiterte Funktionen zu FormMgr zur Verfgung,
insbesondere das Retten des Hintergrundrechtecks von Dialogboxen.

\subsection{Das Modul GrafTool} \index{GrafTool}
Dieses Modul stellt ein etwas komfortableres GrafMouse() zur Verfgung.
Es berwacht die Verschachtelungstiefe und speichert die letzte
Mausform.

\subsection{Das Modul ObjcTool} \index{ObjcTool}
Dieses Modul stellt Routinen zur Object~- Manipulation zur Verfgung,
die ber ObjcMgr und SetObject/GetObject hinausgehen.

\subsection{Das Modul RsrcTool} \index{RsrcTool}
Wird dieses Modul importiert, wird RsrcMgr.RsrcLoad() durch eine
etwas erweiterte Funktion ersetzt, welche eventuelle Fehlermeldungen
in der TOS~- Landessprache ausgibt. Die Funktion GetTreePtr()
korrigiert einen Mangel der AES, welche zu faul sind, Icons und
Images an das physikalische Bildschirmformat \index{Bildschirmformat}
anzupassen. Dies ist wichtig bei PC~- GEM und Grafikkarten.

\subsection{Das Modul AESTool} \index{AESTool}
Dieses Modul erm”glicht die portable Erzeugung sog.\@ user-defined objects.

\subsection{Das Modul ApplTool} \index{ApplTool}
Dieses Modul stellt die ab MultiTOS vorhandene Funktion ApplGetInfo()
zur Verfgung. ApplGetInfo() wurde bewužt nicht in ApplMgr aufgenommen,
da die Emulation von ApplGetInfo() sehr viel andere AES~- und VDI~-
Aufrufe ben”tigt und dies die Modulhierarchie einigermažen verkomplizieren
wrde.

\newpage
\section{Liste der Modula - Compiler}
\index{Modula - Compiler}

\begin{table}[htbp]
\centering
\begin{tabular}[Standard]{l l l}
Abkrzung & Name                   & Hersteller/Vertrieb\\
          &                        &  \\
ANAM2     & ana Modula/ST          & ana systems\\
          &                        & P.O.\@ Box 4759\\
          &                        & Foster City, CA 94404-0759\\
          &                        & USA\\
CM2       & Collier Modula         &  \\
FSTM2     & Fitted Software Modula & Fitted Software Tools\\
          &                        & P.O.\@ Box 867403\\
          &                        & Plano, TX 75086\\
          &                        & USA\\
FTLM2     & FTL Modula/ST          & CCD\\
          &                        & Postfach 1164\\
          &                        & D-6228 Eltville\\
GNUM2     & GNU-Modula/ST/TT       & Free Software Foundation, Inc.\\
          &                        & 675 Mass Ave\\
          &                        & Cambridge, MA 02139\\
          &                        & USA\\
GPM2      & Gardens Point Modula   & A+L AG\\
          &                        & D„deriz 61\\
          &                        & CH-2540 Grenchen/SO\\
HM2       & H„nisch Modula/ST/TT   & MoSys G.b.R.\@\\
          &                        & c/o Thomas Uhl\\
          &                        & Obere Heerbergstr.\@ 17\\
          &                        & D-97078 Wrzburg\\
HSM2      & HiSoft Modula          & HiSoft\\
ISOM2     & ISO-Modula             & - \\
\end{tabular}
\end{table}

\begin{table}[htbp]
\centering
\begin{tabular}[Standard]{l l l}
Abkrzung & Name                   & Hersteller/Vertrieb\\
          &                        & \\
JM2       & Jefferson Modula       & Jefferson Software\\
          &                        & 12416 North\\
          &                        & 28th Drive \#18-236\\
          &                        & Phoenix, AZ 85029-2434\\
          &                        & USA\\
LM2       & Logitech Modula        & Logitech Int.\@ S.A.\@\\
          &                        & CH-1122 Romanel/Morges\\
LPRM2     & LPR Modula             & TU Mnchen\\
MM2       & Megamax Modula         & Application Systems\\
          &                        & Heidelberg GmbH\\
          &                        & Postfach 102646\\
          &                        & D-6900 Heidelberg 1\\
MAMM2     & MAMOS Modula           & Mammut Software\\
          &                        & Pfruendhofstr. 23\\
          &                        & CH-8910 Affoltern/Albis\\
MCSM2     & Modula Cross System    & Beech Tree Systems\\
          &                        & Sorpestr.\@ 41\\
          &                        & D-5788 Winterberg\\
MSM2      & Modular Software Modula& Heim Verlag\\
          & ST Modular             & Heidelberger Landstr.\@ 194\\
          &                        & D-6100 Darmstadt-Eberstadt\\
RM2       & Rowley Modula/ST/TT    & Rowley Associates\\
          &                        & 32 Rowley\\
          &                        & Camp, Dursley\\
          &                        & Glos.\@ GL11 5NT\\
          &                        & UK\\
SBM2      & Stony Brook Modula     & Stony Brook Software\\
SDSM2     & Software Developing    & Interface Technologies\\
          & System                 & Corp.\\
SPCM2     & SPC Modula             & Compo Software\\
TDIM2     & TDI Modula             & TDI Ltd.\@\\
\end{tabular}
\end{table}

\newpage
\begin{table}[htbp]
\centering
\begin{tabular}[Standard]{l l l}
Abkrzung & Name                   & Hersteller/Vertrieb\\
          &                        &  \\
TM2       & Taylor Modula          & Heynm”ller\\
          &                        & Informationssysteme GmbH\\
          &                        & Oxfordstr. 10\\
          &                        & D-5300 Bonn 1\\
TSM2      & TopSpeed Modula        & A+L AG\\
          &                        & D„deriz 61\\
          &                        & CH-2540 Grenchen/SO\\
XAM2      & ana Modula/UNIX        & ana systems, s.o.\\
XGM2      & GNU Modula/UNIX        & FSF, s.o.\\
XGPM2     & Gardens Point/UNIX     & A+L AG, s.o.\\
XHM2      & H„nisch Modula/UNIX    & MoSys G.b.R.\@, s.o.\\
XRM2      & Rowley Modula/UNIX     & Rowley Associates, s.o.\\
CBM2      & Cambridge Modula/UNIX  & University of Cambridge\\
MWM2      & Metrowerks Modula/UNIX & Metrowerks, Inc.\\
          &                        & The Trimex Building, Rte 11\\
          &                        & Mooers, NY 12958\\
          &                        & USA\\
XTM2      & Taylor Modula/UNIX     & Heynm”ller, s.o.\\
MOCM2     & MoCKa/UNIX             & GMD\\
          &                        & c/o Jrgen Vollmer\\
          &                        & Vincenz-Priežnitz-Str.\@ 1\\
          &                        & D-76131 Karlsruhe 1
\end{tabular}
\end{table}

\newpage
\section{Literatur}
ATARI ST/TT - Profibuch, SYBEX - Verlag GmbH Dsseldorf,
ISBN 3-88745-563-0

Obwohl ein ATARI-spezifisches Buch, steht sehr viel Wissenswertes
ber GEM darin.

\bigskip
Vom Anf„nger zum GEM-Profi, Hthig Verlag Heidelberg,
ISBN 3-7785-1792-9

Ein Buch, in dem es nur um GEM geht. Es bietet eine umfangreiche,
jedoch leider in C geschriebene, auf GEM aufsetzende Fensterbibliothek.
Die Quelltexte warten auf ihre šbertragung nach Modula-2.

\bigskip
GEM Programmier-Handbuch, SYBEX - Verlag GmbH Dsseldorf,
ISBN ?

Hier wird der Quelltext zu Doodle ausfhrlich erl„utert. Die Autoren
sind ehemalige DRI-Mitarbeiter.

\bigskip
Professionell GEM (ProGEM), Antic Publishing

H”chst interessante Artikelserie des RCS-Autors Tim Oren. Erh„ltlich
in mehreren Dateien aus verschiedenen ”ffentlichen Quellen.

\bigskip
X/GemOnX, unix/mail 9/91, S.\@ 36 ff.

Ein Artikel, der ber X/GemOnX einiges berichtet.

\printindex

\end{document}
