The following article was printed in June 1986 of the magazine „MC".
Discussion of a Turbo Pascal program displaying a directory.
Stephan Laage

Directory-String unter Turbo-Pascal

In vielen Programmen will man dem Benutzer die Möglichkeit geben, sich das Inhaltsverzeichnis einer Diskette anzusehen. Das Problem ist so gut wie gelöst, wenn man einer Variablen den „Directory-String" zuweisen kann. Hier eine Pascal-Prozedur.

Die Prozedur (Bild) wurde auf einem Apple-II entwickelt, da sie aber nur auf die standardisierte BDOS-Schnittstelle des CP/M-2.2-Betriebssystems zugreift, sollte sie auch auf anderen CP/M-Systemen laufen. Aufgerufen wird sie mit zwei Parametern, und zwar einem Buchstaben, der das gewünschte Laufwerk angibt, und einer Variablen vom Typ „Directory", in der das Ergebnis abgelegt wird. „Directory" ist ein explizit zu vereinbarender zusammengesetzter Datentyp, der die Integer-Variable „Number" und ein String-Array „Entry" enthält. In „Number" wird die Anzahl der Dateien eingetragen, „Entry" wird mit den Namen besetzt. Dabei muß „Entry" ausreichend dimensioniert sein, je nachdem, wie viele verschiedene Dateien auf den Laufwerken angelegt werden können. Im Beispielprogramm beträgt dieser Wert 50. Soviel für die „Nur-Anwender". Und wie funktioniert es? CP/M macht die Sache einfach, da es für diesen Zweck entsprechende BDOS-Funktionen bereithält. Aber auch Turbo-Pascal kommt dem Anwender entgegen, da es den Aufruf von BDOS-Routinen mit der eingebauten Prozedur „Bdos(func,param)" ermöglicht. Dabei kann man mit func eine der 40 BDOS-Funktionen auswählen. Einige BDOS-Unterprogramme liefern zusätzlich Werte zurück, die von Turbo-Pascal ausgewertet werden können, wenn man die Funktion „Bdos(func,param)" benutzt. All dieses ist ausführlich in [1] beschrieben.

Jetzt aber der Reihe nach: Dateiverwaltung läuft unter CP/M immer mit Hilfe des File-Control-Blocks (FCB) ab. Er wird als Char-Array mit der absoluten Adresse $005C vereinbart. Außerdem wird ein 128-Byte-Puffer benötigt, hier ist es der String „Buffer". Zuerst wird dann das erste Byte des FCB mit einer dem gewünschten Laufwerk entsprechenden Zahl, 1 für A und 16 für P, besetzt; 0 steht für das Bezugslaufwerk, das immer dann gewählt wird, wenn der übergebene Buchstabe keinem zulässigen Laufwerk entspricht. Die restlichen Bytes des FCB werden mit Fragezeichen aufgefüllt, da alle Dateien einer Diskette erfaßt werden sollen. Mit der BDOS-Funktion 26 wird der Datenpuffer für alle folgenden Dateioperationen auf den String „Buffer" gelegt. Mit der BDOS-Funktion 17 wird der erste auf den FCB passende Eintrag gesucht, mit der Funktion 18 die folgenden Einträge. Diese beiden Funktionen liefern die Variable Offset zurück, die angibt, welcher 32-Byte-Eintrag in Buffer die Daten der gesuchten Datei enthält. Offset bewegt sich zwischen 0 und 3. Die Bytes 2 bis 9 dieses 32-Byte-Eintrags enthalten den Dateinamen, Byte 10 bis 12 die Extension. Das Programm schiebt einen Punkt dazwischen. Wenn der Dateiname in einer Assign-Anweisung weiterverwendet werden soll, müssen vorher eventuell vorhandene Leerzeichen entfernt werden. Sind alle Dateien auf diese Art und Weise abgearbeitet, so liefert die BDOS-Funktion 18 den Wert 255 zurück; die Schleife wird verlassen.
Unter Turbo-Pascal enthält das erste Byte eines Strings die aktuelle String-Länge. Deshalb beginnt der Datenpuffer erst ab „addr (Buffer) + 1". Damit die nachfolgenden String-Manipulationen funktionieren, muß die String-Länge durch die Anweisung „Mem (addr (Buffer)) := 128" von Hand gesetzt werden.

Das kleine Rahmenprogramm stellt die Inhaltsverzeichnisse von drei Laufwerken (A, B und Pseudofloppy P) gleichzeitig auf dem Bildschirm dar; allerdings funktioniert das nur dann, wenn die Disketten nicht mehr Dateien enthalten, als Bildschirmzeilen zur Verfügung stehen.
Zum Schluß eine Warnung: Das Auslesen des Directorys einer Diskette beinhaltet nicht das Zurücksetzen des entsprechenden Laufwerks. Schreibversuche auf eine neu eingelegte Diskette führen auch dann zum berüchtigten BDOS-Error, wenn vorher das Inhaltsverzeichnis der neuen Diskette durch die Prozedur „Dir" ermittelt wurde.

Literatur
[1.]Turbo-Pascal, Reference-Manual. Fa. Heimsoeth.
[2.]Pol, Bernd: Vom Umgang mit CP/M. IWT-Verlag, 1982.

Scanned by Werner Cirsovius
September 2002
© Franzis' Verlag