Im Magazin „MC" wurde im Oktober 1986 der folgende Artikel abgedruckt.
Hier ein Tipp zum reibungslosen Ablauf von Turbo Pascal Programmen, wenn Batchdateien verarbeitet werden.

CP/M 3-Submit und Turbo Pascal

Wenn man unter CP/M 3 in Submit-Läufen Turbo-Pascal-Programme startet, stürzt das System ab. Außerdem funktioniert die Ein/Ausgabe-Umleitung (Redirection) von Turbo-Programmen mit GET/PUT nicht. Die Ursache dieses Problems liegt in der Arbeitsweise von Submit mit Hilfe der RSX-Dateien (RSX = Resident System eXpansion). Das sind Programmstücke, die direkt unter das Betriebssystem geladen werden und alle BDOS- und BIOS-Aufrufe bearbeiten können. Bei Submit unter CP/M 3 werden Konsol-Eingaben statt von der Tastatur aus der Submit-Datei geholt. Dafür werden 1...2 KByte Platz benötigt. Das wäre im Prinzip kein Problem, denn die Programme stellen sich normalerweise auf die aktuelle TPA-Größe selbst ein, indem sie bei Adresse 6 nachsehen, wo das BDOS beginnt (CALL 5 ruft ja das BDOS auf, auf 5 steht ein Sprungbefehl und auf 6 und 7 die Zieladresse). Das Problem entsteht aber, wenn beim Übersetzen eines Programmes kein Submit aktiv ist und dabei die Speicherobergrenze daher höher liegt. Turbo legt nun alle Variablen auf feste Adressen, wobei von der höchstmöglichen Adresse (direkt unter dem Turbo-Lader) abwärts gezählt wird, der Programmcode wächst von unten entgegen. Bei der Ausführung von compilierten Turbo-Programmen liegen also die Variablen direkt in dem Adreßbereich, in dem ein RSX angesiedelt wird! Da wundert es beim Einsatz von Submit höchstens noch, daß das System einfach nur verstummt und nicht noch die Massenspeicher löscht...
Mit dem Programm im Bild kann jeder diesen Sachverhalt leicht nachprüfen. Zum Vergleich läßt man es einmal alleine laufen (als .COM-Datei), und dann in einer Submit-Datei aufrufen (die Submit-Datei muß aber mehr als eine Zeile umfassen, denn bei Ausführung der letzten Zeile wird der RSX schon gelöscht). Das Ganze hat nicht nur akademisches Interesse. Ich habe eine Reihe von Utilities in Turbo-Pascal geschrieben (z.B. alphabetisches Inhaltsverzeichnis), die häufig in Submit-Läufen verwendet werden. Die prompt eintretenden Systemabstürze suchte ich in allem möglichen, bis ich auf diese Erklärung kam... Die Obergrenze der TPA liegt bei mir normalerweise bei $F206, wenn Submit aktiv ist, jedoch bei $EA06.
Dagegen kann man auf verschiedene Arten vorgehen. Als erste Möglichkeit kann man die „End address" heruntersetzen. Diese Möglichkeit haben die Turbo-Pascal-Entwickler weise mit eingebaut, das Kommando erscheint, wenn man unter „Optionen" auf „COM" schaltet. Dies muß man jedoch bei jeder Programmänderung erneut tun, und nach dem Gesetz des größten Ärgernisses ...
Eine zweite Möglichkeit ist im Beispiel-Programm gezeigt: Als allererste Variable legt man einen Platzhalter an (auf Neudeutsch hieße so was „Dummy"), der dafür sorgt, daß die „wirklichen" Variablen erst 2 KByte tiefer anfangen. Wenn diesem Platzhalter nie Werte zugewiesen werden, kann nichts mehr passieren.
Dr. Michael Bach

PROGRAM MemTop;                              (* MB  17.11.85 *)
(* Ausgabe der TPA-Speicherobergrenze in Hex *)

(* Die folgende Variablenvereinbarung schuetzt Turbo-Pascal-
   Programme vor Absturz bei Verwendung in SUBMIT-Dateien unter
   CP/M3, sie muss als ERSTE var-Deklaration kommen          *)
var PlatzHalterFuerSubmit: array[1..$800] of byte;  (*2 kByte*)

const HexZiff: array[0..15] of char='0123436789ABCDEF';

var i : integer;
    Bdos: Integer absolute 6;

begin (*Haupt*)
  for i:=3 downto 0 do write(HexZiff[(Bdos shr (4*i) and $F]);
end.
Bild 1. MemTop hilft gegen Abstürze

Eingescanned von Werner Cirsovius
Dezember 2002
© Franzis' Verlag