Einige Notizen zum Portieren von GEM-Programmen von
ST-Pascal Plus (Atari ST) nach Turbo Pascal (MS-DOS)
----------------------------------------------------

(c) Jan Willamowius, 1993
    Nienredder 6
    22527 Hamburg


Die unterschiedliche Speicherverwaltung

Ein Grundproblem beim bertragen von Programmen vom Atari auf den 
PC sind die unterschiedlichen Formate, mit denen die Prozessoren 
arbeiten. Auf MS-DOS Rechnern sind die Daten im Gegensatz zum 
Atari ST im Intel-Format abgelegt. Hierbei sind die Hi- und Low-
Bytes in Worten (2 Bytes) vertauscht. Gleiches gilt fr Worte in 
Langworten (4 Bytes); auch hier sind Hi- und Low-Worte 
vertauscht. Vorsicht ist auch beim Zugriff auf einzelne Bits aus 
(Lang-) Worten geboten !

Der Typ 0..100 belegt in ST-Pascal Plus ein Wort (2 Bytes); in 
Turbo Pascal belegt er aber nur 1 Byte. Vorsicht ist geboten bei 
allen  Unterbereichstypen und ganz besonders in Records (z.B. bei 
GEM-Objektdefinitionen) !

Ein weiteres Problem beim Portieren ist die Speicher-
segmentierung auf MS-DOS Rechnern. Turbo Pascal 4.0 (und auch 
5.0) lt im gnstigsten Fall Variablen mit 64 KB zu. Falls das 
zuwenig ist, mu man die Daten auf 2 Variablen verteilen, die in 
unterschiedlichen Segmenten oder auf dem Heap abgelegt werden.

Auch der Stack ist bei Turbo Pascal 4.0 und 5.0 auf maximal 64 KB 
begrenzt. Falls hier Probleme auftreten mssen einige lokale 
Variablen entweder global deklariert werden, oder man mu 
dynamische Variablen benutzen, auf die mit Pointern zugegriffen 
wird. Ein zweites bzw. ein greres Stack-Segment kann nicht 
angelegt werden.

Hier noch etwas grundstzliches zur Speicherbelegung bei Turbo 
Pascal:

-    Der Programmcode befindet sich im Code-Segment. Dieses 
     Segment ist auf 64 KB begrenzt. Ab Version 4.0 knnen jedoch 
     Teile des Programms in Units ausgelagert werden, die 
     ihrerseits ein Codesegment von max. 64 KB zur Verfgung 
     haben.

-    Die globalen Variablen und Konstanten werden im Daten-
     Segment abgelegt. Das Daten-Segment ist auf 64 KB begrenzt. 
     Weitere Daten-Segmente sind nicht mglich; als 
     Ausweichmglichkeiten bleiben der Stack und der Heap.

-    Alle lokalen Variablen werden auf den Stack gelegt. Auch er 
     ist auf 64 KB begrenzt.

-    Dynamische Variablen befinden sich auf dem Heap. Die Gre 
     des Heap ist nur durch den vorhandenen Hauptspeicher 
     eingeschrnkt (und die Compileroption (*$M ... *)). Die 
     maximale Gre einer Variablen ist trotzdem auf 64 KB 
     festgelegt.

Folgerung aus der Speicherbelegung : Lokale Variablen sind gut um 
Seiteneffekte zu verhindern. Auf dem Atari war es kein Problem 
alle Daten lokal zu vereinbaren. Bei Turbo Pascal sollte man sich 
allerdings vorher genau berlegen, wie gro welche Variablen 
werden, und wo man sie am besten ablegen sollte.


Rechnerspezifisches

Erwartungsgem mssen einige Atari-spezifische Programmteile 
gendert werden.

ST-Pascal Plus hat einige Funktionen die direkt auf sogenannte 
Line-A Routinen zugreifen. In Turbo Pascal mssen diese durch 
die entsprechenden VDI-Routinen ersetzt werden. Dies betrifft 
PUT_PIXEL, GET_PIXEL, LINE, HLINE, SET_CLIPPING, FILL_RECTANGLE, 
FILL_POLYGON, PUT_CHAR, NEW_MOUSE, DRAW_SPRITE und 
UNDRAW_SPRITE. Da die Line-A Befehle auch von zuknftigen Atari-
Rechnern nicht mehr untersttzt werden, sollten sie ohnehin 
ersetzt werden.

Alle GEMDOS, BIOS und XBIOS-Aufrufe des Atari mssen individuell 
angepat und durch DOS-Aufrufe ersetzt werden.


Die verschiedenen Dialekte von Pascal

Die Unterschiede in den Pascal-Dialekten sind verhltnismig 
gering. Wenn man die beiden Dialekte kennt sollten daraus keine 
Probleme entstehen. Folgende Unterschiede sind mir aufgefallen:

In ST-Pascal Plus erfolgen alle Dateizugriffe mit

     RESET (datei, dateiname);

In Turbo Pascal wird jedoch mit

     ASSIGN (datei, dateiname); RESET (datei);

zugegriffen. Gleiches gilt natrlich auch fr REWRITE.

ST-Pascal erlaubt sowohl ELSE als auch OTHERWISE in CASE-
Konstruktionen; Turbo Pascal erlaubt nur ELSE. Mit einer 
Suchen/Ersetzten-Funktion eines Texteditors kann man diesem 
Unterschied aber leicht beikommen.

Der Datentyp LONG_INTEGER heit LONGINT in Turbo Pascal und wird 
etwas anders behandelt(!). Hier sollte man auf jeden Fall das 
jeweilige Handbuch zum Compiler zu Rate ziehen.

Die Konstruktion

     DO ... LOOP;

wird von Turbo Pascal nicht untersttzt und mu durch einen 
anderen Schleifentyp ersetzt werden.

Die Prozeduren READV und WRITEV des ST-Pascal mssen in Turbo 
Pascal durch die Funktionen VAL und STR ersetzt werden (Achtung : 
diese haben eine etwas andere Syntax !)

Damit Strings als Var-Parameter genauso wie beim ST-Pascal 
verarbeitet werden mu man in Turbo Pascal mit (*$V-*) eine nicht 
so strenge Typprfung einschalten.

In Turbo Pascal sollte man INC und DEC vermeiden und durch 
normale arithmetische Zuweisungen ersetzen.

In Turbo Pascal mu bei WRITE in eine Datei bei numerischen 
werten immer eine Variable verwendet werden. ST-Pascal erlaubt 
auch Funktionsaufrufe und Konstanten.

Beim bertragen der Sourcecodes ist zu beachten, da der Atari 
ST einen anderen ASCII-Code fr  und  verwendet, der 
konvertiert werden mu.

Unter ST-Pascal heien die Operationen Bitweise-UND und Bitweise-
ODER & und |. In Turbo Pascal heien sie AND und OR.
