The following article was printed in issue 4 of the magazine „CHIP SPECIAL".
CP/M does not support „real" length of files. Binary files will be treated as files with a multiple of 128. This routine describes a methode working on bytes based files.

FILE OF BYTE unter CP/M

Als CP/M-Anwender haben Sie sich vielleicht schon grün und blau geärgert, weil Sie ein interessantes Turbo-Pascal-Programm nur deshalb nicht nutzen konnten, weil darin auf den Datentyp FILE OF BYTE zugegriffen wurde. Wurde dabei nur successive in ein solches File geschrieben, so konnte man ja noch den Umweg über TEXT nehmen. Wenn aber direkter Zugriff lesend und schreibend eingesetzt wurde, so blieb bislang nichts als Resignation.

Turbo-Dateien unter CP/M und MS-DOS

Dabei bezieht die MS-DOS-Version ihren Vorteil eigentlich aus einem Informationsverlust. Da bei der Diskettenverwaltung unter CP/M ein (logischer) 128-Byte-Sektor die kleinste adressierbare Einheit darstellt, werden hier bei Turbo-Dateien die ersten vier Bytes jeder Datei zu Verwaltungsaufgaben herangezogen. Sie beinhalten die Anzahl der Dateielemente und die Größe eines einzelnen Eintrags. Durch einen Vergleich dieser Größe kann Turbo-Pascal sogar bei Dateien eine (eingeschränkte) Typenüberprüfung vornehmen. Bei MS-DOS kann die Länge einer Datei aufs Byte genau im Diskettenverzeichnis eingetragen werden. Deshalb konnte hier auf die Verwaltungsbytes verzichtet werden: Die Datensatzgröße wird aus dem Programm bestimmt, die Anzahl der Einträge durch einfache Division der Filegröße durch die Datensatzgröße (was allerdings bei den gemischten Betriebssystemen wie DOS PLUS meist zu falschen Angaben führt). EOF wird hier auch nicht aufgrund der Anzahl der Einträge bestimmt, sondern durch das physikalische Dateiende. Aus alledem wird klar, daß unter MS-DOS der Datentyp FILE OF BYTE keine Probleme bereitet. Eine solche Datei ist zu allen anderen Dateien kompatibel und erlaubt den Zugriff auf jedes einzelne Byte.

(Die folgenden angesprochenen Programme, mit Ausnahme des File-Editors, liegen nicht vor.)
Welch interessante Möglichkeiten der Datentyp FILE OF BYTE bietet, kann man schon an den kleinen Programmen dieses Hefts erkennen, die damit arbeiten: FILEKONV zum Filetransfer CP/M - MS-DOS, DB-TURBO zur automatischen Konvertierung von DBASE-Dateien ins Turbo-Format und schließlich der von vielen Lesern sehnlichst gewünschte File-Editor.

BYTEFILE = FILE OF BYTE

Doch sicher haben Sie uns schon längst durchschaut. Wir würden kaum das Problem so ausgiebig schildern, hätten wir nicht eine endgültige Lösung parat. BYTEFILE heißt das Zauberwort und auch das Bibliotheksmodul, das auch auf CP/M-Turbo den bislang schmerzlich vermißten Datentyp implementiert. Die Arbeit mit dem Modul gestaltet sich wahrscheinlich noch einfacher, als Sie denken: an alle Standardbezeichner, die Sie bisher in Verbindung mit Dateien gebraucht haben, wird ausnahmslos das Wort 'ByteFile' angehängt. Das ist auch schon alles.

Nach dem Einbinden des Moduls BYTEFILE.BIB stehen Ihnen also der Typ ByteFile und beispielsweise folgende Routinen zur Verfügung: ReadByteFile(FileVar, ByteVar) oder ResetByteFile(FileVar). Dabei muß selbstverständlich FileVar von Typ ByteFile und ByteVar von Typ Byte sein.

Abweichnungen

Seek, FilePos und FileSize wurden nicht implementiert, da sie nur den Zugriff auf maximal 32 KByte-Dateien erlauben. Stattdessen wurden gleich LongSeek, LongFilePos und LongFileSize aufgenommen, die reelle Argumente übernehmen bzw. reelle Ergebnisse liefern. Damit können nun auch Dateien im Gigabyte-Bereich bearbeitet werden. Während bei FILE OF BYTE unter MS-DOS der Puffer normalerweise 512 Bytes groß ist, kann er bei ByteFile beliebig in 128-Byte-Schritten eingestellt werden. In der abgedruckten Version wurde ein 1024-Byte-Puffer gewählt, was sich als guter Kompromiß herausgestellt hat.

IO-Fehlerbehandlung

Die Compilerschalter I+ und I- werden während der Übersetzung von Turbo-Pascal gesetzt, nicht während der Laufzeit. Sie wirken nur auf die textlich nachfolgenden IO-Operationen. Deshalb macht es keinen Sinn, die IO-Fehlerüberwachung durch I- abzuschalten und dann eine Prozedur (oder Funktion) aufzurufen, die IO-Operationen durchführt (und bei der die Fehlerüberwachung nicht abgeschaltet war). In einem solchen Fall würde der Turbo-interne Fehlermelder auf jeden Fall zuschlagen.

Aus diesem Grund wird von BYTEFILE.BIB eine eigene Variable IOResultByteFile verwaltet, die eventuell auftretende Fehler anzeigt. Allerdings ist sie nur nach den Grundoperationen ResetByteFile, RewriteByteFile und CloseByteFile definiert. Da bei diesen Operationen die Turbo-Fehlerüberwachung abgeschaltet wird, sollte man nach ihrem Einsatz immer auf IOResultByteFile entsprechend reagiert werden.

Listing of B:BYTEFILE.BIB

Scanned by Werner Cirsovius
December 2002
© CHIP Verlag