Bandoperationen

Aufbau des Dateikopfes

Dateien werden auf Band in Form von Blöcken à 512 Bytes aufgezeichnet. Der erste Block ist dabei der Dateikopf ("header record"), der gesondert gekennzeichnet ist, gefolgt von den Datenblöcken. Der Dateikopf entspricht dem Verzeichniseintrag auf Diskette; es gibt jedoch kein Inhaltverzeichnis auf Band, so daß zum Auffinden einer Datei unter Umständen das gesamte Band durchgespult werden muß.
Da die Bandkassetten zur IBM 5100 kompatibel sind, muß auf einige Besonderheiten geachtet werden. So entspricht der Zeichencode der 5100 nicht dem EBCDI-Code der 5110, sondern ist ein eigener. Daraus folgt, daß alle Texte vor dem Schreiben bzw. nach dem Lesen konvertiert werden müssen. Dies gilt für den Dateinamen sowie für gesamte Textdateien (z.B. vom Dateityp 2).

 
Offset  Beschreibung/Inhalt 
------------------------------------------------------------------------------ 
00      Dateityp (8-Bit); 0 für eine freie Datei
01-02   Dateinummer (16-Bit)
03-04   Größe der markierten Datei in kBytes (16-Bit)
05	Ein Wert ungleich 0 steht für geblockte Sätze
06-07   Anzahl benutzter Dateiblöcke (16-Bit)
...
80-90   Dateiname (in Bandcode)

92-9B	BASTMT \ bei BASIC-
9C-AF	BASKEY /  Dateien
...
B8-BB	APLMSG \
BC-BF	APLWS1  \
C0-C3	APLSVI   \
C4-C7	APLWS2    > bei APL-Dateien
C8-C9	APLMSZ   /
CA-CB	APLMXL  /
CC-CF	APLMX# /

CA-CB   logische Satzlänge (Dateityp 9) (16-Bit)
CC-CF   Anzahl logischer Blöcke (Dateityp 9) (32-Bit)
...

Alle Werte sind Dualzahlen der angegebenen Breite.

Öffnen bzw. Auffinden einer Datei

Es gilt hier im wesentlichen das gleiche wie auch für Disketten. Im Gegensatz dazu muß das Band dabei solange durchsucht werden, bis entweder die Datei gefunden wurde oder das Ende des markierten Bands erreicht wurde. Außerdem kann nur über die Dateinummer gesucht werden, nicht über den Dateinamen.

Auf jeden Fall muß als erste Operation ein Sense stattfinden. Dabei wird der I/O Supervisor wie im Kapitel über den IOCB aufgerufen. Der IOCB für ein Sense muß folgende Werte enthalten (zusätzlich zu denen für die Geräteadressierung):

Direkt danach kann die gewünschte Datei mittels Find gesucht werden:

Wichtig: Während allen Operationen, die dieselbe Datei betreffen, muß IOCB_WA immer auf denselben Puffer zeigen. Die I/O-Routinen speichern darin Informationen über die aktuelle Datei.

Wenn die Datei gefunden werden konnte, enthält IOCB_Ret den Wert 0. Wenn sie nicht gefunden werden konnte (und kein anderer Fehler auftrat), wird $F1F1 = '11' als Fehlercode zurückgeliefert.
Bei Erfolg steht im Puffer der Dateikopf. Der Aufbau des Eintrags wurde schon weiter oben erklärt.

Lesen oder Schreiben eines Blocks

Das Lesen bzw. Schreiben einer Datei kann nur Block pro Block geschehen; pro I/O-Aufruf kann nur ein Block übertragen werden. Der IOCB dazu:

Es sollte am besten nach dem Find überprüft werden, ob für das Schreiben die Datei groß genug ist. Wenn das nicht möglich ist, sollte der Fehler 09 oder 10 entsprechend abgefangen werden.

Konvertierung von Texten

Für den reibungslosen Austausch von Daten zwischen IBM 5100 und IBM 5110 wurde bei der 5110 der gleiche Code zur Aufzeichnung verwendet wie bei der 5100. Daraus folgt, daß wie erwähnt Textdateien u.ä. nach dem Lesen von Band nach EBCDIC bzw. vor dem Schreiben von EBCDIC in den Bandcode umgewandelt werden müssen. Zu diesem Zweck gibt es einen eigenen I/O-Befehl namens "translate only", also die ausschließliche Übersetzung des Pufferinhalts.

Freigeben einer Datei

Dateien können auf Band nicht gelöscht werden wie bei der Diskette. Es kann lediglich der für eine Datei markierte Bereich für neue Dateien freigegeben werden. Dies geschieht, indem man den Dateityp in Dateikopf (Offset $00) auf 0 setzt. Siehe dazu auch Schreiben einer Datei.<

Schreiben einer Datei

Die Reihenfolge, in der die einzelnen I/O-Operationen ausgeführt werden, spielt bei der Bandbenutzung eine wichtige Rolle. Wird sie nicht eingehalten, wird die Operation mit dem Fehler 02 abgebrochen. Zum Schreiben gilt daher folgendes:

Start ---> Sense
             |
             | ok
             v
           Find
             |
             | gefunden
             v
           Ändere Dateityp und Dateinamen
           (sonstiges darf nicht geändert werden!)
             |
             |
             v
           Write Header
             |
             | ok
             v
           Write (so oft wie nötig)
             |
             | ok
             v
           Write Last (für letzten Dateiblock)
             |
             | ok
             v
           Find (gleiche Datei!)
             |
             | ok
             v
           Ändere Anzahl benutzter Blöcke
             |
             |
             v
           Write Header  --> Fertig!

Wurde beim ersten Write Header z.B. ein anderer Wert geändert, schlägt die Operation fehl.