Aufbau des MFCB
Die Feldeinteilung des MFCB und die Auswertung der MFCB-Felder in Abhängigkeit von der gewählten Operation sind aus der folgenden Tabelle zu ersehen.
IDMFOPC | IDM | IDM | IDM | IDMFO | IDMFLB | IDMFF | IDMFE | IDMFS | IDMFIO | IDMFNHP | IDMFIO |
Eröffnen neue | A | A | S | A | (+) | S | S | - | - | (A) | - |
Wiederer | A | A | S | A | S | A(+) | S | - | - | (A) | - |
Lesen | A | A | S | A | A | A | S | S | (A) | - | (A) |
Schreiben | A | A | S | A | A | A | S | S | (A) | - | (A) |
Prüfen | A | A | S | - | - | A | S | S | - | - | - |
Prüfen und | A | A | S | - | - | A | S | S | - | - | - |
Datei | A | A | S | - | S | A | S | S | - | - | - |
Datei löschen | A | A | S | - | - | A | S | - | - | - | - |
*: gilt nur für PARMOD=31
A: Feldinhalt wird ausgewertet
S: Feldinhalt wird vom System gesetzt
+: Ausnahmen für Bindemoduldateien (siehe „Behandlung von Bindemoduldateien durch EAM“)
Beschreibung des MFCB
Die Feldeinteilung des MFCB und die Auswertung der MFCB-Felder in Abhängigkeit von der gewählten Operation sind aus der Tabelle zu ersehen.
Der MFCB ist der Verständigungsbereich zwischen EAM und Anwender; der MFCB muss auf Wortgrenze ausgerichtet sein. Vor Aufruf des EAM-Makros müssen die für die gewählte Operation benötigten Felder versorgt werden.
Der MFCB kann mit dem Makro IDMCB mit symbolischen Namen versehen werden.
Funktionseinheit (IDMFUNIT)
Gilt explizit oder implizit PARMOD=31, muss IDMFUNIT mit dem Wert „DMFEAM“ versorgt sein.
Operationsschlüssel (IDMFOPC)
Schlüssel | Bedeutung |
IDMFO | Einrichten und Eröffnen einer neuen Datei (OPEN) - EAM wertet das Bit im Zusatzbyte IDMFOO aus und eröffnet danach entweder die Bindemoduldatei oder eine neue auftragsspezifische Datei. Einer neuen EAM-Datei wird ein binärer Dateiname zwischen 1 und 14000 zugewiesen und in das Feld „Dateiname“ geschrieben. Außerdem wird das Bit IDMFCI des Zusatzbytes ausgewertet. Die Adressen der Ein-/Ausgabebereiche werden nicht überprüft. |
IDMFRO | Wiedereröffnen einer bestehenden Datei (REOPEN) - im Zusatzbyte werden die Bits IDMFOO, IDMFSBR und IDMFCI ausgewertet. Für IDMFCI und damit für das Feld IDMFNHP gilt das Gleiche wie bei der OPEN-Operation. Entsprechend der Auswertung von IDMFOO wird entweder die auftragsspezifische Bindemoduldatei oder eine im Feld „Dateiname“ (IDMFFN) genannte Datei eröffnet (siehe auch „Behandlung von Bindemoduldateien durch EAM"). |
IDMFRD | Lesen (READ) - EAM wertet im Zusatzbyte das Bit IDMFI1 aus und überprüft die über dieses Bit ausgewählte Adresse eines Eingabebereichs (Feld IDMFIO1 oder IDMFIO2). Die Eingabe erfolgt an die entsprechende Adresse, auch wenn der Inhalt von IDMFIO1/2 unmittelbar nach Aufruf der Operation verändert wurde. Wird bei einem Lesevorgang das Dateiende erkannt, wird das Bit IDMFEF des Fehlerbytes gesetzt. War zum OPEN/REOPEN-Zeitpunkt das Bit IDMFCI des Zusatzbytes gesetzt, erfolgt die Eingabe gekettet. Die Anzahl der zu übertragenden Blöcke wird dem Feld IDMFNHP ebenfalls zum OPEN/REOPEN-Zeitpunkt entnommen (siehe „Anzahl zu übertragender Blöcke (IDMFNHP)"). Die Lese-/Schreiboperation ist bei EAM asynchron, d.h. der Benutzer erhält sofort nach Aufruf des EAM-Makros die Steuerung zurück, es sei denn, eine vorhergehende |
IDMFWR | Schreiben (WRITE) - wie beim Lesen wird in Abhängigkeit vom Bit IDMFI1 entweder das Feld IDMFIO1 oder das Feld IDMFIO2 auf Gültigkeit der dort enthaltenen Adresse eines Ausgabebereichs überprüft. Ist der Inhalt des Feldes „Logische Blocknummer“ (IFMFLBN) null, wird sequenziell im Anschluss an das Dateiende geschrieben. Ist der Inhalt not equal 0 wird der zu übertragende Block an die so bezeichnete Stelle der Datei gebracht. |
IDMFCK | Prüfen der Beendigung einer Ein-/Ausgabeoperation (CHECK) - es wird überprüft, ob eine ausstehende Ein-/Ausgabeoperation abgeschlossen ist; der Benutzer erhält in jedem Fall die Steuerung sofort zurück. Ist die überprüfte Operation noch nicht abgeschlossen, erhält Register 15 den Wert 8. Ist die Operation beendet, werden die Statusbytes in den MFCB (IDMFSB) übertragen und Register 15 erhält den Wert 0. |
IDMFCW | Prüfen einer Ein-/Ausgabe und Warten (CHECK WAIT) - die Beendigung der letzten Ein-/Ausgabeoperation wird abgewartet, anschließend werden die Statusbytes übertragen. |
IDMFCL | Datei schließen (CLOSE) - nach Beendigung der letzten noch ausstehenden |
IDMFER | Datei löschen (ERASE) - die Datei wird gelöscht, gleichgültig, ob sie eröffnet ist oder nicht. |
Versionsnummer (IDMVERS)
Gilt explizit oder implizit PARMOD=31, muss IDMVERS mit dem Wert DMEAMV versorgt sein. Dies ist wichtig im Hinblick auf zukünftige BS2000-Versionen, da so verschiedene Versionen dieser Schnittstelle ohne Neuübersetzung unterstützt werden können.
Return-Information (IDMRETCO)
In der 31-Bit-Version wird der Return-Code im Feld IDMRETCO des MFCB hinterlegt.
Dieser Return-Code entspricht dem des Registers 15.
Return-Code | Bedeutung |
0 | Operation erfolgreich abgeschlossen |
4 | Operation nicht erfolgreich abgeschlossen Fehlerbytes (IDMFEB) überprüfen |
8 | nach Prüfoperationen: geprüfte Ein-/Ausgabe-Operation noch nicht abgeschlossen |
Zusatzbyte (IDMFOC)
IDMFOO | Bindemoduldatei eröffnen - dieses Bit wird bei allen Operationen ausgewertet. |
IDMFCI | gekettete Ein-/Ausgabe - das Bit wird zum OPEN-/REOPEN-Zeitpunkt ausgewertet und sein Inhalt sichergestellt. Das heißt, ist beim (Wieder-)Eröffnen einer Datei dieses Bit gesetzt, erfolgen spätere Ein-/Ausgabeoperationen gekettet. Die Länge der Übertragungskette ist durch den Inhalt des Feldes IDMFNHP (=Anzahl der zu übertragenden Blöcke) festgelegt, das ebenfalls beim Öffnen der Datei ausgewertet wird. Ist das Bit nicht gesetzt, wird keine gekettete Ein-/Ausgabe verwendet. |
IDMFSBR | Startpunkt der Ein-/Ausgabe in der Datei - über dieses Bit wird gesteuert, wo die Ein-/Ausgaben in der Datei „aufsetzen“ sollen. |
IDMFI1 | Steuerung des Ein-/Ausgabebereichs - dieses Bit wird bei aktuellen Ein-/Ausgabeoperationen ausgewertet. Ist das Bit gesetzt, wird die im Feld IDMFIO2 angegebene Adresse des Ein-/Ausgabebereichs-2 überprüft und dieser Bereich für die anstehende Ein-/Ausgabeoperation verwendet. Ist das Bit nicht gesetzt, wird die im Feld IDMFIO1 enthaltene Adresse des Ein-/Ausgabebereichs-1 überprüft, Ein-/Ausgaben erfolgen dann in diesen bzw. von diesem Bereich aus (siehe Abschnitt „Überlappte Ein-/Ausgabe"). |
Logische Blocknummer (IDMFLBN)
Die logische Blocknummer ist eine 2 Byte lange Binärzahl (0 <= n <= 65535). Hat sie den Wert 0, erfolgt die Verarbeitung sequenziell: Beim Lesen wird der Block übertragen, der unmittelbar auf den letzten in einer Lese-/Schreiboperation angesprochenen Block folgt. Beim Schreiben wird ein Block an das Dateiende angefügt.
Ist die logische Blocknummer not equal 0, so verweist sie direkt auf den Block der Datei, der gelesen oder geschrieben werden soll.
Bei geketteter Ein-/Ausgabe gelten die Angaben für den ersten Block der Übertragungskette.
Dateiname (IDMFFN)
Der Dateiname ist eine 2 Byte lange Binärzahl (dezimal: 1 <= n <= 14000), die beim Eröffnen einer neuen Datei von EAM in das Feld „Dateiname“ übertragen wird. Diese Zahl ist dort bei jeder späteren Bezugnahme auf die Datei anzugeben.
Fehlerbyte (IDMFEB)
Ist bei einer vom EAM-Makro angestoßenen Operation ein Fehler aufgetreten, werden je nach Ursache entsprechende Bits, die über symbolische Namen ansprechbar sind, gesetzt; gleichzeitig erhält Register 15 den Wert X'00000004'.
IDMFIC | Unzulässige Operation - zum Beispiel unzulässiger Operationsschlüssel, Zugriff auf eine nicht geöffnete Datei, bei geketteter Ein-/Ausgabe liegt der Wert im Feld IDMFNHP nicht zwischen 1 und 16, MFCB ist nicht auf Wortgrenze ausgerichtet usw. |
IDMFIF | Unzulässiger Dateiname - Die im Feld „Dateiname“ (IDMFFN) angegebene Zahl bezeichnet keine in diesem Auftrag existente EAM-Datei. |
IDMFIB | Ungültige Blocknummer - Die im Feld IDMFLBN (Logische Blocknummer) angegebene Blocknummer liegt außerhalb der Datei (beim Lesen) oder ist größer als die Nummer des zuletzt geschriebenen Blocks + 1 (beim Schreiben). |
IDMFIA | unzulässige Adresse eines Ein- oder Ausgabebereichs - Die in den Feldern IDMFIO1 oder IDMFIO2 enthaltene Adresse für Ein-/Ausgabebereich-1/2 ist ungültig. |
IDMFNS | Kein EAM-Speicherplatz mehr verfügbar - Z.B.: Der Benutzer hat 14000 EAM-Dateien erzeugt oder der gesamte für EAM-Dateien im System zur Verfügung stehende Speicherplatz ist ausgeschöpft. |
IDMFNP | Unzulässiger Zugriff auf eine privilegierte Datei - Ein nichtprivilegierter Benutzer versuchte auf eine privilegierte Datei zuzugreifen. |
IDMFEF | Dateiende - Bei einem Lesevorgang wurde das Dateiende erreicht: Überstreicht bei geketteter Eingabe eine Übertragungskette das Dateiende, wird soweit wie möglich ausgelesen und das Bit für Dateiende gesetzt. |
IDMFERR | Statusbytes überprüfen - Die vorhergehende Lese- oder Schreiboperation ist nicht erfolgreich abgeschlossen worden. Es sollten die Statusbytes überprüft werden, um die Fehlerursache festzustellen. |
Statusfeld (IDMFSB)
Dieses Feld wird vom System versorgt, wenn gleichzeitig folgende Bedingungen erfüllt sind:
die vorausgehende Operation war eine Lese- oder Schreiboperation;
die aktuelle Operation ist eine der Operationen Lesen, Schreiben, Prüfen, Prüfen und Warten oder Schließen.
Es werden folgende Bytes aus dem CCB (Channel Control Block) übertragen: das Standard-Gerätebyte, 3 Fehlerbytes, das Ablaufteil-Markierungsbyte.
Adresse von Ein-/Ausgabebereich-1 (IDMFIO1/IDMFIOA1)
Dieses Feld enthält die virtuelle Adresse des ersten Bytes von Ein-/Ausgabebereich-1. Beim Schreiben wird von dieser Adresse ein Block bzw. eine Übertragungskette übertragen, beim Lesen wird der gelesene Block/die Blockfolge an diese Adresse übertragen.
Hat der Ein-/Ausgabebereich Blockgröße (2048 Byte), sollte er innerhalb einer Seite (4096 Byte) liegen und auf Wortgrenze ausgerichtet sein. Bei geketteter Ein-/Ausgabe sollte der Bereich auf Seitengrenze ausgerichtet sein; er muss mindestens so viele Blöcke aufnehmen können, wie mit einer Ein-/Ausgabeanforderung übertragen werden.
Wenn diese Ausrichtungsbedingungen nicht erfüllt werden, kann es bei bestimmter Hardware zu Zwischenpufferung und dadurch zu Performance-Einbuße kommen.
Anzahl zu übertragender Blöcke (IDMFNHP)
Dieses Feld wird zum Zeitpunkt des Eröffnens oder Wiedereröffnens einer Datei ausgewertet, wenn im Zusatzbyte gekettete Ein-/Ausgabe (IDMFCI) verlangt wird. Es enthält eine 1-Byte-Binärzahl <= 16.
Bei geketteter Ein-/Ausgabe und Erreichen des Dateiendes im Lesemodus übergibt das System hier die Anzahl der übertragenen Blöcke.
Adresse von Ein-/Ausgabebereich-2 (IDMFIO2/IDMFIOA2)
Dieses Feld enthält die virtuelle Adresse des ersten Bytes von Ein-/Ausgabebereich-2. Die Adresse kann mit der von Ein-/Ausgabebereich-1 übereinstimmen. Soll jedoch zeitlich überlappte Verarbeitung durchgeführt werden, ist hier die Adresse eines Bereichs anzugeben, der sich mit Ein-/Ausgabebereich-1 nicht überschneidet.
Es gelten die Bedingungen für Ein-/Ausgabebereich-1.
Gekettete Ein-/Ausgabe
Ist im MFCB das Bit IDMFCI für gekettetete Verarbeitung gesetzt, ist die Ein-/Ausgabe schneller. Dabei müssen die gekettet zu schreibenden Blöcke nicht nebeneinander liegen. Beim Schreiben werden immer Gruppen von 3 PAM-Seiten gekettet geschrieben, beim Lesen werden nebeneinander liegende Seiten gekettet gelesen. Daher sollte das Feld IDMFNHP (= Anzahl der zu übertragenden Blöcke) ein Vielfaches von 3 enthalten.
Außerdem sollten Ein-/Ausgabeoperationen immer bei Blocknummern beginnen, die in der Form (3 * n) + 1 darstellbar sind, d.h. 1, 4, 7, ...
Hinweis
Zur Unterstützung der NK4-Pubsets wird vom EAM-Anwender gefordert, die gekettete Verarbeitung auf den Blockungsfaktor 2 oder ein Vielfaches von 2 umzustellen. In diesem Fall sollten bei direkten Ein-/Ausgabeoperationen ungerade Blocknummern (BLOCK#) angegeben werden, also 1, 3, 5, ...
Durch eine Erhöhung des Blockungsfaktors auf Kosten des Hauptspeicherplatzes (Ein/Ausgabepuffer) werden die CPU-Zeit (Anstoß und Beendigung der Ein- und Ausgabeanforderung) die Kanal- und Gerätezeit (Seek- und Searchzeiten) durch das Lesen bzw. Schreiben von mehreren Blöcken mit einer physikalischen Ein-/Ausgabe) eingespart. Diese Optimierung kann vom System nicht beeinflusst werden, da sie primär in der Verantwortung des EAM-Anwenders liegt.