%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{Einf�hrung}
\subsection{Was ist \anf{crystal}?}
\anf{crystal} ist der Versuch, f�r Modula-2 eine Standard - GEM -
Bibliothek zu schaffen. \anf{crystal}
\begin{itemize}
\item ber�cksichtigt
   \begin{itemize}
   \item ATARI-GEM 1.0, 1.2, 1.4, 3.x, 4.x
   \item MultiGEM
   \item GDOS, AMCGDOS, FSMGDOS, 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 f�r MC 680x0-Systeme (modifiziertes
      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 f�r den GEM~- Rechner ATARI ST verf�gbar 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 f�r \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
Abk�rzungen nach Modula~- Manier, sprich in Gro�~/ Kleinschreibung
ausgeschrieben werden und dann unter Beibehaltung der Gro�~/ Kleinschreibung
wieder zur�ckgek�rzt 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 m�ssen und dabei noch die Compiler,
die (noch) keinen Unterstrich zulassen, zu ber�cksichtigen.\\
Soweit Namen f�r Typen vergeben werden mu�ten, die in den C~- Bindings
dank des spartanischen Typenkonzepts von C nicht vorgesehen waren,
wurden keine neuen, k�nstlichen 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.

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.\@ c.mup):

\begin{verbatim}
echo cpp $1 f�r $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 TSM2
\end{verbatim}

lauten. Dabei ist aes.mod in diesem Beispiel der Name des Quelltextes,
TSM2 eine Abk�rzung
f�r einen ganz bestimmten Compiler, s.\@ Liste der Modula~- Compiler.
cpp \index{cpp} ist der C~- Pr�prozessor. Mit Hilfe der Option -D wird
die an das
Script �bergebene Abk�rzung als Pr�prozessor~- Variable definiert. Die
Option -P unterdr�ckt unerw�nschte Kommentare im Output des
Pr�prozessors, die Option -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 nat�rlich an Ihre
eigenen Verh�ltnisse anzupassen. x2d1 \index{x2d1} ist ein Beautifier,
der Zeilenenden mit CR LF abschlie�t und �berfl�ssige Leerzeilen entfernt.
Um s�mtliche Moduln mit dem Pr�prozessor zu bearbeiten, benutzen Sie am
besten das Script \verb|c_all.mup|, das Sie z.B.\@ wie folgt aufrufen:

\begin{verbatim}
c_all TSM2
\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.*| im Verzeichnis \verb|toolbox| befinden.
Passen Sie daher dieses Script an Ihre Verh�ltnisse und W�nsche an.

\newpage
\subsection{Liste der Modula - Compiler}
\index{Modula - Compiler}
\begin{table}[htbp]
\centering
\begin{tabular}[Standard]{l l l}
Abk�rzung & 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\\
          &                        & 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.\@\\
          &                        & Obere Heerbergstr.\@ 17\\
          &                        & 8700 W�rzburg\\
HSM2      & HiSoft Modula          & HiSoft\\
ISOM2     & ISO-Modula             & - \\
\end{tabular}
\end{table}

\begin{table}[htbp]
\centering
\begin{tabular}[Standard]{l l l}
Abk�rzung & Name                   & Hersteller/Vertrieb\\
          &                        & \\
JM2       & Jefferson Modula       & Jefferson Software\\
          &                        & 12416 North\\
          &                        & 28th Drive \#18-236\\
          &                        & Phoenix\\
          &                        & Arizona 85029-2434\\
          &                        & USA\\
LM2       & Logitech Modula        & Logitech Int.\@ S.A.\@\\
          &                        & CH-1122 Romanel\\
          &                        & /Morges\\
LPRM2     & LPR Modula             & TU M�nchen\\
MM2       & Megamax Modula         & Application Systems\\
          &                        & Heidelberg GmbH\\
          &                        & Postfach 102646\\
          &                        & 6900 Heidelberg 1\\
MAMM2     & MAMOS Modula           & Mammut Software\\
          &                        & Pfruendhofstr. 23\\
          &                        & CH-8910 Affoltern\\
          &                        & /Albis\\
MCSM2     & Modula Cross System    & Beech Tree Systems\\
          &                        & Sorpestr.\@ 41\\
          &                        & 5788 Winterberg\\
MSM2      & Modular Software Modula& Heim Verlag\\
          & ST Modular             & Heidelberger \\
          &                        & Landstr.\@ 194\\
          &                        & 6100 Darmstadt-Eberstadt\\
RM2       &Rowley Modula/ST/TT     & Rowley SW Associates\\
          &                        & London (EC3M1BU)\\
          &                        & 13 Eastercheap\\
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}
Abk�rzung & Name                   & Hersteller/Vertrieb\\
          &                        &  \\
TM2       &Taylor Modula           & Heynm�ller\\
          &                        & Informationssysteme GmbH\\
          &                        & Oxfordstr. 10\\
          &                        & 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.\\
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           & Heynm�ller, s.o.\\
\end{tabular}
\end{table}

\newpage
\subsection{Hinweise zu Compilern}

\subsubsection{Fitted Software Tools - Modula V 3.1}
\index{Fitted Software Tools - Modula V 3.1}
Die maximale Anzahl der Bezeichner pro Modul, maxIds, und der daf�r 
reservierte Speicherplatz, idSpace, ist doch etwas zu knapp bemessen. 
Starten Sie daher FSTM2 mit der Batchdatei fstm2.bat. Denken Sie 
daran, da� eine GEM-Applikation noch etwas DOS-Speicher frei lassen 
mu�. Dies wird z.B. in der Batchdatei make.bat gemacht.

Die Anpassung an diesen Compiler ist vor�bergehend eingestellt, solange
keine Compiler~- Version zur Verf�gung steht, bei der Prozeduren -- wie
bei anderen Compilern auch -- Sets zur�ckliefern d�rfen.

\subsubsection{ana - Modula}
\index{ana - Modula}
Dieser Compiler (V 1.9) verlangt noch nach Exportlisten.
Weiterhin unterst�tzt
er keinerlei 16~- Bit~- Zahlenoperationen, sondern nur
32~- Bit~- Arithmetik. Beide Features wurden
eine Zeit lang unterst�tzt, z.B.\@ durch die Pr�prozessor~- Variable
\anf{export} (vgl.\@ noch \verb|PORTAB.DEF|), 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 zur�ck 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.14}
\index{TopSpeed - Modula V 1.14}
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 order.obj hinzugelinkt werden. Zur Erleichterung
dient die beiliegende Batchdatei gl.bat. Denken Sie 
daran, da� eine GEM-Applikation noch etwas DOS-Speicher frei lassen 
mu�. Dies wird ebenfalls exemplarisch in der Batchdatei gl.bat gemacht.

Weiterhin ist zu beachten, da� die AES- und VDI-Einspr�nge in den 
Assemblermoduln AESSYS und VDISYS get�tigt werden. Sie befinden sich 
im gleichen Verzeichnis wie gl.bat.

\subsubsection{H�nisch - Modula}
\index{H�nisch - Modula}


\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 zu einem Konflikt mit den bereits vorhandenen
Moduln \verb|AES.OBM|/\verb|AES.SBM|. Benennen Sie daher \verb|AES.*|
unter Beibehaltung der
Namensl�nge um, z.B.\@ in \verb|AEM.*|, und �ndern Sie in jedem bereits
vorhandenen Modul, welches AES importiert, mit Hilfe eines Dateimonitors
s�mtliche Zeichenketten, in denen AES vorkommt, in AEM um.
Die zu manipulierenden Dateien lauten:

\begin{verbatim}
AES.* (hier auch GEMAESbase umbenennen!)
APPLICAT.*
GEMAESBA.*
COMPILE.*
LINKER.*
DEBUG.*
M2SHELL.*
\end{verbatim}

Mit Hilfe von Dateien, deren Extension auf *.CM? lautet, kann man 
dem Compiler eine Liste von zu �bersetzenden Moduln �beregeben. 
Compilieren Sie

\begin{verbatim}
BASEMAKE.CMP
AESMAKE.CMP
VDIMAKE.CMP
TOOLMAKE.CMP
\end{verbatim}

in dieser Reihenfolge.

Um den Heap eines LPRM2~- Compilates zu vergr��ern, mu� der Linker 
gepatcht werden. Zu diesem Zweck dient PATCHLNK.TOS, welches sich auf 
der zweiten \anf{crystal}~- Diskette befindet (auf derjenigen, auf der 
sich auch die aktuelle Version des GNU~- C~- Pr�prozessors befindet).
\index{PATCHLNK.TOS} \index{GNU~- C~- Pr�prozessor}

\subsubsection{Modular Software - Modula}
\index{Modular Software - Modula}
F�r dieses System existiert nur eine grobe Anpassung, da der
Compiler doch sehr viel zu w�nschen �brig l��t.

\subsubsection{FTL - Modula}
\index{FTL - Modula}
Dieser Compiler scheint irgendwie Probleme mit dem 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 ausf�hren 
lassen.

\newpage
\section{Bescheibung der Moduln}
\subsection{Namensgebung}
S�mtliche AES-Moduln besitzen Namen der Form XXXXMGR.*. S�mtliche 
VDI-Moduln beginnen mit einem V.

\subsection{Das Modul PORTAB}
\index{PORTAB}

Dieses systemabh�ngige Modul stellt Typen zur Verf�gung, 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.

Beispiel f�r 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}

Anwendung:

\begin{verbatim}
TYPE GRect = RECORD
               GX: SIGNEDWORD;
               GY: SIGNEDWORD;
               GW: SIGNEDWORD;
               GH: SIGNEDWORD;
             END;
\end{verbatim}

\index{GRect}

\begin{verbatim}

(* for open Arrays *)

TYPE ANYTYPE = SYSTEM.LOC;

\end{verbatim}

\index{ANYTYPE}

Je nach Compiler m�ssen f�r 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 Gr�nden der Portabilit�t benutze man \verb|NULL|.

\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 und
die Funktion rc\_intersect) von C~- Bibliotheken.

\begin{verbatim}

DEFINITION MODULE RcMgr;

FROM PORTAB IMPORT SIGNEDWORD,UNSIGNEDWORD;

TYPE GPnt = RECORD
              GX: SIGNEDWORD;
              GY: SIGNEDWORD;
            END;

     GRect = RECORD
               GX: SIGNEDWORD;
               GY: SIGNEDWORD;
               GW: SIGNEDWORD;
               GH: SIGNEDWORD;
             END;

     ORectPtr = POINTER TO ORect;
     ORect = RECORD
               OLink: ORectPtr;
               OX   : SIGNEDWORD;
               OY   : SIGNEDWORD;
               OW   : SIGNEDWORD;
               OH   : SIGNEDWORD;
             END;

PROCEDURE Min(a,b: SIGNEDWORD): SIGNEDWORD;

PROCEDURE Max(a,b: SIGNEDWORD): SIGNEDWORD;

PROCEDURE RcIntersect(VAR R1,R2: GRect): BOOLEAN;

PROCEDURE RcUnion(VAR R1,R2: GRect);

PROCEDURE RcConstrain(VAR R1,R2: GRect);

PROCEDURE RcEqual(VAR R1,R2: GRect): BOOLEAN;

PROCEDURE RcCopy(VAR From,To: GRect);

PROCEDURE RcInside(P: GPnt; VAR R: GRect): BOOLEAN;

PROCEDURE RcSnap(X: SIGNEDWORD; N: UNSIGNEDWORD): SIGNEDWORD;

PROCEDURE XYWHToGRect(    X,Y : SIGNEDWORD;
                          W,H : UNSIGNEDWORD;
                      VAR Rect: GRect);

END RcMgr.
\end{verbatim}

\subsection{Das Modul INTRINSIC}

\newpage
\section{Literatur}
ATARI ST/TT - Profibuch, SYBEX - Verlag GmbH D�sseldorf,
ISBN 3-88745-563-0

Obwohl ein ATARI-spezifisches Buch, steht sehr viel Wissenswertes
�ber GEM darin.

\printindex

\end{document}
