Makrotyp: S-Typ (E-Form/L-Form, siehe "Typen von Makroaufrufen")
Alle Benutzeranforderungen für BTAM werden über diesen Makroaufruf abgewickelt. In den Operandenbeschreibungen wird für „Magnetbandkassette“ die Abkürzung MBK verwendet.
Format
Operation | Operanden |
|
|
|
Operandenbeschreibung
fcbadr
gibt die Adresse des FCB an, mit dem die zu verarbeitenden Datei in Verbindung steht.
RDWT
liest Magnetband vorwärts und wartet das Ende der Operation ab, bevor die Steuerung dem Anwenderprogramm übergeben wird (Standardfunktion)
CHK
prüft, ob die vorausgegangene Ein-/Ausgabeoperation abgeschlossen ist. Ist die Ein-/Ausgabeoperation noch nicht abgeschlossen, wird die Steuerung an die LOC-Adresse übertragen. Andernfalls ist die Operation äquivalent zu WT.
MINF
holt eine Medium-Information bei der Bearbeitung von optischen Platten. Die Bedienung von optischen Platten im BS2000 erfolgt über eine MBK-Emulation.
Der Bereich, in den die Information geschrieben werden soll, und seine Länge (derzeit 128 Byte) müssen über die Operanden LOC und LEN spezifiziert werden. Das Layout der Ausgabeinformation wird mit dem Makro NDWMINF beschrieben.
POS
nur mit PARMOD=31: Band positionieren (siehe „Operationscodes")
RBID
nur mit PARMOD=31: Bandposition bestimmen (siehe „Operationscodes")
RD
liest Magnetband vorwärts
RDBF
Für Magnetbandkassetten, nur mit PARMOD=31: Daten blockweise aus dem Sicherstellungsbereich des MBK-Puffers in den Anwendungsbereich übertragen (siehe „Operationscodes" )
REV
liest Magnetband rückwärts
REVWT
liest Magnetband rückwärts und wartet das Ende der Operation ab, bevor die Steuerung dem Anwenderprogramm übertragen wird.
RNT
Lesen ohne Datentransfer, mit Meldung bei kürzerer Länge als erwartet
RNTL
Lesen ohne Datentransfer, ohne Meldung bei kürzerer Länge als erwartet
RT
Lesen mit Datentransfer, mit Meldung bei kürzerer Länge als erwartet
RTL
Lesen mit Datentransfer, ohne Meldung bei kürzerer Länge als erwartet
SYNC
nur mit PARMOD=31: synchronisieren und Bandposition bestimmen (siehe „Operationscodes")
WRT
schreibt auf Magnetband
WRTWT
schreibt auf Magnetband und wartet das Ende der Operation ab, bevor die Steuerung dem Anwenderprogramm übertragen wird.
WT
wartet die Beendigung der vorausgegangenen Ein-/Ausgabeoperation ab. Die Steuerung wird erst nach Abschluss der Operation bzw. der notwendigen Fehlerbehandlungen an das Benutzerprogramm zurückgegeben.
ERG
erzeugt Blocklücke; bei Wiederholung wird das Band gelöscht!
Die mit ERG ausgelöste Operation ist eine Schreiboperation, die an Stelle eines Bit-Musters ein „Blocklücken-Muster“ in der vom Anwender angegebenen Länge erzeugt (bei einigen Magnetbandtypen ist diese Länge festgelegt).
BSF
Band um eine Abschnittsmarke zurücksetzen
BSR
Band um einen Block zurücksetzen
FSF
Band um eine Abschnittsmarke vorsetzen
FSR
Band um einen Block vorsetzen
REW
Rückspulen bis Bandanfang
RUN
Rückspulen und Band entladen, anschließend ist nur noch CLOSE möglich
WTM
Abschnittsmarke schreiben
LEN = länge
gibt die Länge der einzelnen Blöcke bzw. bei geketteter Ein-/Ausgabe (Operand CHAINIO in FILE/FCB) die Länge der Transporteinheit an.
Wird LEN nicht angegeben, errechnet sich die Länge einer Transporteinheit aus dem Produkt von „Blockgröße“ und Kettungsfaktor, wobei die Blockgröße bei RECFORM=U durch den Inhalt des unter RECSIZE angegebenen Registers bestimmt ist und bei RECFORM=F durch BLKSIZE.
Ohne Kettung holt sich das System die Angaben nur aus dem RECSIZE-Operanden beim Schreiben mit RECFORM=U, sonst aus dem BLKSIZE-Operanden.
Eine Längenangabe mit LEN darf bei RECFORM=U so ausgelegt sein, dass der letzte Block innerhalb einer Transporteinheit kürzer als die vorhergehende ist. Bei RECFORM=F sollte die angegebene Länge ein Vielfaches der gegebenen BLKSIZE betragen (falls dem nicht so ist, wird der Auftrag aber nicht abgewiesen).
Die zu lesende Länge wird immer und nur der aktuellen Längenangabe entnommen. Die tatsächliche Blocklänge steht nach erfolgreichem Lesen im RECSIZE-Register.
Im Zusammenhang mit dem Operationscode RDBF gibt LEN an, wie lang die aus dem Puffer zu sichernden Blöcke sind. Gilt RECFORM=U/V, wird die aktuelle Blocklänge im RECSIZE-Register zurückgemeldet.
LOC
gibt den Bereich an, in den gelesen oder aus dem geschrieben werden soll.
Voreinstellung:
IOAREA1
bei der ersten Ein-/Ausgabe
bei Wechsel von LOC=relaus auf eine IOAREA
wenn zuletzt IOAREA2 verwendet wurde
wenn IOAREA2 nicht definiert ist
IOAREA2, falls zuletzt IOAREA1 verwendet wurde
= relaus
Bereichsadresse im Makroaufruf.
Wird eine CHK-Operation verlangt, so muss der LOC-Operand die Form LOC=relaus aufweisen. Die Steuerung wird an die mit LOC definierte Adresse übertragen, wenn die überprüfte Operation noch nicht abgeschlossen war. Der adressierte Bereich muss nicht mit IOAREA1/2 zusammenfallen.
= 1
verweist auf die IOAREA1-Adresse im FCB
= 2
verweist auf die IOAREA2-Adresse im FCB
Im TU-FCB wird angezeigt, welcher Ein-/Ausgabebereich genutzt wurde:Im 31-Bit-TU-FCB im Feld ID1BLWB
Im 24-Bit-TU-FCB im Feld ID1LWB
POS: Adresse der Positionsangabe (9 Byte), auf die positioniert wird
RBID: Adresse, an der die 9 Byte lange Positionsangabe ausgegeben wird
RDBF: Adresse des Bereichs, in den der sichergestellte Block gebracht wird
SYNC: Adresse, an der die 9 Byte lange Positionsangabe ausgegeben wird
MF
Die Formen des MF-Operanden sind detailliert im Anhang, "Typen von Makroaufrufen" beschrieben.
PARMOD
Gibt den Generierungsmodus für den Makroaufruf an.
Voreinstellung: | der durch den Makro GPARMOD oder durch den Assembler voreingestellte Wert für den Generierungsmodus |
= 24
Der Makroaufruf wird mit der Expansion für die 24-Bit-Schnittstelle aufgelöst. Das Objekt ist nur im 24-Bit-Adressierungsmodus ablauffähig.
= 31
Der Makroaufruf wird adressierungsmodus-unabhängig generiert.
REQNO = zahl
zahl <= 8, „zahl“ bestimmt die Nummer der Ein-/Ausgabeanforderung bzw. des zugehörigen Aufrufs. Durch verschiedene Nummern gekennzeichnet, können mehrere asynchrone Lese- oder Schreiboperationen veranlasst werden. Jede dieser Lese-/Schreiboperationen muss mit der Operation WT (versehen mit der entsprechenden Nummer) abgeschlossen werden. Die maximale Anzahl gleichzeitiger Ein-/Ausgabeoperationen wird im FCB, Operand BTAMRQS, festgelegt.
Operationscodes
POS – Band auf eine bestimmte Stelle positionieren
Zum Wiederaufsetzen, z.B. nach Schreibfehlern mit Datenverlust: der Anwender kann die Bandposition, die er durch eine frühere RBID-Operation erhalten hat, an der mit LOC bestimmten Adresse angeben, das Band wird dann entsprechend positioniert.
RBID – aktuelle Bandposition (Blocknummer) bestimmen
Jeder Block auf einem Magnetband, auch eine Abschnittsmarke, ist durch seine Bandposition identifizierbar.
Bei herkömmlichen Magnetbändern erhält der Anwender die Bandposition als Wertepaar (TM- und Record-Counter) zurück. Sie wird dem Anwender nach einem RBID-Befehl (oder SYNC-Befehl, siehe „SYNC - Synchronisieren und Markierungspunkte setzen") an der Adresse angezeigt, die durch den Operanden LOC definiert ist (siehe Operandenbeschreibung) oder – wenn LOC nicht angegeben wurde – in einem der im FCB definierten Ein-/Ausgabebereiche. Die Positionsangabe (die ersten acht Byte) ist abhängig vom Verarbeitungszustand und liefert im Fehlerfall die in der Tabelle aufgeführten Informationen im FCB-Feld ID1ECB. Das 9. Byte gibt an, wie die Postitionsangabe zu interpretieren ist:
2**7 = 1: | TM-/Record-Counter |
2**6 = 1: | Block-ID |
2**0 = 1: | keine gültige Positionsangabe |
Vor Absetzen eines RBID-Befehls müssen alle noch ausstehenden asynchronen Lese-/Schreiboperationen (im MAV-Modus) mit einem WAIT abgeschlossen werden; bei synchroner Dateiverarbeitung führt BTAM den WAIT automatisch durch.
Bei Magnetbandkassetten wird die Bandposition als „Blocknummer“ (oder Block-ID) bestimmt.
Rückinformationen
Ereignis | Rückinformation | Bedeutung | Maßnahme |
erfolgreiche Ausführung | Blocknummer | zeigt die Position des Datenblocks an, der als nächster in den MBK-Puffer geschrieben oder aus dem Puffer gelesen wird | ---- |
nicht erfolgreiche Ausführung | Blocknummer | Bandposition wurde gesichert; die Blocknummer zeigt den letzten fehlerfrei geschriebenen Block | neu positionieren mit POS |
Blocknummer undefiniert | Bandposition konnte nicht gesichert werden | Rücksetzen auf einen Wiederaufsetzpunkt oder Programmabbruch | |
Blocknummer undefiniert | Bandposition konnte nicht gesichert werden | Programmabbruch | |
Blocknummer | Ein-/Ausgabefehler; die Bandposition wird so zurückgegeben, wie sie nach der Fehlerbehandlung vorliegt | ---- | |
Blocknummer undefiniert | Ein-/Ausgabefehler mit „Positionsverlust“ | Rücksetzen auf einen Wiederaufsetzpunkt oder Programmabbruch |
RDBF – nur für MBK – bei nicht behebbarem Schreibfehler die sichergestellten Daten des MBK-Puffers in den Anwenderbereich übernehmen
Bei gepuffertem Schreiben kann ein Fehler für Datenblöcke auftreten, für die der Anwender bereits eine positive Quittung erhalten hat. Die Geräteverwaltung versucht, die dem Kassettenpuffer bereits übergebenen Daten und die Bandposition zu sichern, sodass der Anwender eine ordnungsgemäße Fehlerbehandlung durchführen kann. Er kann den fehlerhaften Block und die darauf folgenden ebenfalls bereits positiv quittierten, aber noch nicht auf das Band geschriebenen Blöcke dem Sicherstellungsbereich des Puffers entnehmen und erneut bearbeiten, z.B. auf einen anderen Datenträger ausgeben.
Bevor die Datei geschlossen wird (CLOSE) oder Bandwechsel mit FEOV eingeleitet wird, muss der Anwender den Datenträger mit POS hinter den letzten erfolgreich auf das Band geschriebenen Block positionieren. Das „Herauslesen“ der Blöcke erfolgt nach dem Prinzip „last-in – first-out“, die Anzahl der gespeicherten Blöcke ist im Feld ID1BLANZ des TU-FCB enthalten. Für jeden Block muss ein RDBF-Befehl gegeben werden, der Eingabebereich wird wie bei einem normalen Leseaufruf versorgt: die Adresse ist über LOC im BTAM-Makroaufruf oder durch IOAREA im FCB gegeben, die Länge durch LEN im BTAM-Makroaufruf oder durch FCB-Angaben, analog dem Lesen von Band. Die Blöcke werden nur in der angegebenen Länge übertragen. Ist für die Datei RECFORM=V/U definiert, wird die echte Länge des gesicherten Blocks in dem Register angezeigt, das durch RECSIZE in FILE oder FCB definiert ist.
SYNC – Synchronisieren und Markierungspunkte setzen
Die im MBK-Puffer enthaltenen Daten werden auf Band geschrieben. Bei synchroner Verarbeitung (nicht MAV-Modus) veranlasst BTAM einen evtl. noch ausstehenden WAIT; bei asynchroner Verarbeitung (MAV-Modus) muss der Anwender dafür sorgen, dass vor Absetzen des SYNC-Befehls alle ausstehenden WAITS ausgeführt werden. Implizit wird mit dem SYNC-Aufruf auch ein RBID-Aufruf veranlasst, d.h. dem Anwender wird im Ein-/Ausgabebereich die aktuelle Bandposition mitgeteilt. Der Anwender kann dieses Verhalten nutzen, um Fixpunkte zu setzen, z.B. im Hinblick auf evtl. später auftretende Fehler: er kann auf diesen Punkten wieder aufsetzen, einen Bandwechsel veranlassen und auf dem Folgeband die Verarbeitung fortsetzen.
Hinweise zur Programmierung
Der BTAM-Makroaufruf zerstört die Register 0, 1, 14 und 15.
Missbrauch von FSF und FSR kann dazu führen, dass das Band bis zum Ende durchläuft und vom Operator wieder zurückgespult werden muss (off-line).
Bei jedem nicht erfolgreichen Verzweigen nach BTAM wird die Steuerung an die Adresse abgegeben, die im EXIT-Operanden des FCB definiert ist. Im FCB wird ein entsprechender sedezimaler Fehlerschlüssel abgesetzt.
Gibt ein Anwender Blöcke fester Länge an (Format F), liest jedoch Blöcke anderer Länge als angegeben, wird die Steuerung an den Ausgang ERRADDR im EXLST-Makroaufruf übertragen.
Überschreitet die Länge des Satzes die definierte Länge, so wird im „Ablaufteil-Markierungsbyte“ das „abnormale Beendigungs-Bit“ und im Fehler-Byte das „Satzlängen-Fehler-Bit“ gesetzt, sofern es sich nicht um eine RTL- bzw. RNTL-Operation unter gleichzeitiger Verwendung von Kettung und/oder MAV-Modus handelt (in diesem Fall erfolgt keine Benachrichtung des Benutzers).
Ist der Block jedoch kleiner als die definierte Länge, so wird das „abnormale Beendigungs-Bit“ gesetzt. Es wird jedoch kein Fehlerbyte übermittelt (die Restlänge ist in den Sense-Byte 2 und 3 gespeichert; siehe Makro NDWERINF, "NDWERINF - Status-Bytes abfragen"). Eine Benachrichtigung des Benutzers erfolgt nicht, wenn es sich um eine RTL- bzw. RNTL-Operation handelt.Gibt ein Anwender Blöcke variabler Länge an (Format U bzw. V) oder verwendet er die Operationcodes RTL bzw. RNTL, liest jedoch Blöcke mit größerer Länge als angegeben, so wird die Steuerung an den Ausgang ERRADDR im EXLST-Makroaufruf dann übertragen, wenn ohne Kettung und ohne MAV-Modus gearbeitet wird. Bei den Operationen RT oder RNT wird generell der Ausgang ERRADDR aktiviert. In allen anderen Fällen erfolgt bei Format U/V keine Information des Benutzers.
Zusammengefasst ergibt sich also folgendes Bild bzgl. der Benachrichtigung des Benutzers.
Operation RECFORM=F
Block < gg. LängeRECFORM=F
Block > gg. LängeRECFORM=U/V
Block < gg. LängeRECFORM=U/V
Block > gg. LängeRD(WT) ja ja nein bedingt *) R(N)T ja ja ja ja R(W)TL nein bedingt *) nein bedingt *) *) Benachrichtigung falls nicht Kettung und nicht MAV-Modus
Der Anwender braucht, falls nicht im MAV-Modus gearbeitet wird, explizit keine „WAITs“ anzugeben. BTAM gibt automatisch vor jeder neuen Operation einen WAIT aus. Tritt jedoch in diesem WAIT ein Fehler auf, so wird der Fehlerschlüssel X'0C77' ausgegeben. Die neue Operation wird nicht ausgeführt.
Es ist aber zu beachten, dass dieser implizite WAIT-Aufruf nur bei Arbeiten mit mehreren Ein-/Ausgabebereichen sinnvoll ist. Da die Daten im Ausgabebereich beim Schreiben grundsätzlich bis zum erfolgten WAIT erhalten bleiben müssen bzw. beim Lesen der Eingabebereich erst nach erfolgtem WAIT ordnungsgemäß gefüllt ist, muss im Falle der Verwendung nur eines Ein-/Ausgabebereiches der Anwender selbst für das Absetzen eines WAITs sorgen, sobald er seinen einzigen Bereich erneut verwenden will.BTAM verwendet nicht den EXLST-Ausgang EOFADDR (Dateiende). Wird von einem RD, RDWT, RNT, RNTL, RT, RTL, REV oder REVWT eine Abschnittsmarke gelesen, wird die Steuerung an die ERRADDR-Adresse übertragen.
Das Programm kann nach dem WAIT die 5 Status-Byte im FCB (SDB, FB1, FB2, FB3, AMB) auswerten. Die Steuerung wird ebenfalls der ERRADR-Adresse übertragen, falls versucht wird, ein auf Bandanfang positioniertes Band rückwärts zu lesen.Bei den Operationen REV und REVWT ist die Adresse für das erste Byte, in das Daten gelesen werden, definiert durch:
LOC + LEN - 1.Bei einer Datei, die mit BTAM eröffnet wurde, kann der SAM-Makroaufruf FEOV verwendet werden. Bei Erkennen des Dateiendes auf dem aktuellen Band, verzweigt BTAM zum sonst nicht verwendeten Ausgang EOFADDR.
CHAINIO mit Magnetbandkassetten: die Transporteinheit sollte nicht größer sein als die Puffergröße, und die Puffergröße sollte als n*BLKSIZE darstellbar sein. Wird im Fehlerfall die Anzahl noch im Puffer befindlicher Blöcke angezeigt (TU-FCB: ID1BLANZ), bezieht sich diese immer auf einzelne Blöcke, nicht auf Transporteinheiten; auch die RDBF-Operationen betreffen immer nur einzelne Blöcke.
MAV-Modus mit Magnetbandkassetten: für BTAMRQS im FCB können kleinere Werte gewählt werden als bei Magnetbändern, da die Benutzer-Ein-/Ausgabebereiche schneller wieder frei werden.
Im Fehlerfall kann es vorkommen, dass nicht der gesamte Inhalt des MBK-Puffers auf die Magnetbandkassette geschrieben werden konnte. Auf die vom Betriebssystem aus dem MBK-Puffer in einen Sicherstellungsbereich übernommenen Blöcke kann der Anwender wieder Bezug nehmen, was einem Lesen von Band in umgekehrter Richtung entspricht. Anschließend sollte der Anwender versuchen, die Magnetbandkassette hinter den letzten ordnungsgemäß geschriebenen Block zu positionieren.
Der Anwender muss dafür sorgen, dass vor weiteren Schreibaufrufen (speziell vor dem Schreiben der EOV-/EOF-Kennsätze) das Magnetband eine definierte Position hat (POS-Befehl); andernfalls können Daten überschrieben werden. RBID nach Fehler DC7C liefert die Position nach dem letzten korrekt auf Band geschriebenen Block.
Der Anwender erreicht einen ordnungsgemäßen Abschluss des Bandes mit Schreiben von Endekennsätzen, wenn er anschließend einige Blöcke rückwärts liest oder zurückpositioniert (falls er auf die bereits geschriebenen Daten verzichten kann).
Wurden bei einem Schreibfehler nicht alle Blöcke des Kassettenpuffers auf das Band geschrieben, im Sicherstellungsbereich des Puffers aber noch gesichert, muss als Nächstes die Operation RDBF oder RBID veranlasst werden, als Zeichen dafür, dass der Anwender auf die Daten des MBK-Puffers nicht verzichtet. Diese Daten stehen ihm sonst später nicht zur Verfügung. Die Operationen RDBF und RBID können in beliebiger Reihenfolge abgesetzt werden; der Pufferinhalt bleibt solange erhalten, wie keine andere Operation veranlasst wird. Ausgenommen sind dabei noch ausstehende WAITs im MAV-Mode, die vom Benutzer vor Abgabe des RDBF- und RBID-Befehls aufgerufen werden dürfen (und vor dem RBID auch müssen); naturgemäß werden dann alle den Fehler DC7C melden.
Verzichtet der Benutzer nach der Meldung DC7C auf eine anschließende Positionierung, so geht die Bandposition auf „UNDEFINED“ über. Dieser Zustand „UNDEFINED“ kann nur durch Positionierung (auch REW und UNL) aufgehoben werden.
Beim Kennzeichnen von markanten Punkten (Fixpunkte) durch Absetzen von SYNC-Befehlen wird verlangt, dass vorher alle angestoßenen Ein-/Ausgaben mit einem WAIT abgeschlossen wurden.
Im MAV-Modus müssen bei einer Aufruffolge, wo „Schreiben“ nach einem „Lesen rückwärts“ erfolgt, vor dem „Schreiben“ alle ausstehenden WAITS abgesetzt sein.
Es ist eine Eigenart der Magnetbandkassetten, dass ein bei Ausgabeoperationen auftretender Fehler erst zum Zeitpunkt des Transfers vom Puffer auf das Band gemeldet wird; der Benutzer erfährt von einem aufgetretenen Fehler somit u.U. erst zum Zeitpunkt eines späteren Auftrags. Es kann also vorkommen, dass der Anwender die Meldung „Bandende“ noch vor der Meldung eines davor aufgetretenen Fehlers bekommt. Die Meldung „Bandende“ bedeutet, dass ab dem Zeitpunkt der Meldung keine weiteren Schreibaufträge vom Benutzer abgesetzt werden sollen, damit gewährleistet ist, dass noch alle im Puffer befindlichen Daten und die Endekennsätze auf das Band passen. Die Meldung „Bandende“ ist bei Magnetbandkassette nicht vom Erkennen einer Endemarke auf dem Band abhängig, sondern wird bereits beim Transfer der Daten in den Puffer, abhängig von dessen Füllgrad und anderen Kriterien, ausgegeben.
Bei den Makroaufrufen FEOV oder CLOSE für eine BTAM-Datei, die INOUT eröffnet wurde, wird die Datei als Ausgabedatei behandelt, wenn für die Datei im Laufe der Verarbeitung eine WRITE-mit-WAIT-Operation angefordert wurde (WRT, WRTWT, WTM). Wurde keine WRITE-mit-WAIT-Operation angefordert, wird die Datei als Eingabedatei behandelt.
BTAM gibt den Fehlerschlüssel X'0C95' aus
wenn ein ungültiger Gerätetyp angegeben wurde
wenn der Operationscode ungültig ist
wenn im FCB-Operanden RECSIZE eines der Register 0, 1, 13, 14 oder 15 angegeben wurde
wenn der Wert des Operanden LEN im BTAM-Makroaufruf <= 0 ist oder wenn er, falls LOC=relaus nicht angegeben ist, größer als BLKSIZE ist (dann nämlich wird IOAREA1/2 verwendet, die die Größe von BLKSIZE hat)
wenn bei einer OUTPUT-eröffneten Datei eine Leseoperation angefordert wurde
wenn im MAV-Modus die REQNO-Angabe größer ist als maximal erlaubt
wenn im MAV-Modus vor einem Lese-/Schreibaufruf für die gleiche REQNO der WAIT-Aufruf fehlt
wenn nach RUN ein BTAM-Aufruf gegeben wurde (es ist nur CLOSE erlaubt) oder wenn nach einem nicht erfolgreichen FEOV ein BTAM-Aufruf gegeben wird.
wenn für eine nicht für BTAM eröffnete Datei BTAM-Aufrufe gegeben werden (außer in EXLST-Routinen zur Kennsatzbehandlung)
Beim Erweitern einer Banddatei sollte ein unmittelbarer Wechsel von Lese- und Schreibbefehl vermieden werden. Wegen fehlender Löschüberlappung kann das bei einzelnen Magnetbandgeräten zu Schwierigkeiten führen.
Eine Folge, die immer korrektes Verhalten garantiert:
BTAM- Makroaufruf
Erklärung
BSR, FSR, ...
Band vor Block n positionieren
RD
Lesen (Retten) von Block n
BSR
Band wieder vor Block n positionieren
WRT
Block n erneut auf das Band schreiben
WRT/WTM
Block n+1 (oder Bandmarke) schreiben
In bestimmten Fällen wird beim Lesen von Daten mit Kettung eine falsche Blocklänge nicht angezeigt (siehe "BTAM - Banddateien verarbeiten (Typ S)").
Die Kette für die Eingabe CCWs läuft weiter. Die Bereiche, wohin die Eingaben der einzelnen Blöcke erfolgen, werden aber in dem der normalen Blockgröße entsprechenden Rhythmus weitergeschaltet, d.h. es werden in den Fällen, wo Blöcke kürzerer Länge auftreten, in den Ein-/Ausgabe-Bereichen Lücken vorhanden sein.
Eine Angabe über verwendete Puffer erfolgt bei PARMOD=24 im Feld ID1LWB des P1FCB bzw. bei PARMOD=31 im Feld ID1BLWB bei der Durchführung eines WAITs in folgender Weise (asynchrone Verarbeitung): Bei Eingabe-Operationen wird der Puffer vermerkt, für den die letzte WAIT-Operation ohne Fehler-Rückmeldung erfolgt ist. Bei Ausgabe-Operationen ist der Puffer angegeben, der für die letzte Ausgabe (die noch nicht unbedingt beendet ist) verwendet wurde.
Bei synchroner Verarbeitung gilt: bei PARMOD=24 wird im FCB-Feld ID1LWB der Puffer angegeben, der als Letzter verwendet und für den ein erfolgreicher WAIT abgesetzt wurde, bei PARMOD=31 wird das FCB-Feld ID1BLWB verwendet.
Bei der Festlegung der Block- und Transporteinheits-Größen durch den Benutzer ist auf einen besonderen Aspekt hinzuweisen: Hinter jeder Ein-/Ausgabe-Operation durch den Gerätetreiber steht ein Fixieren der betroffenen Seiten.
Bei gekettetem Ein-/Ausgabe-Betrieb wird das Fixieren bei jedem CCW der Kette veranlasst. Dies aber ist vom Memory Management aus nur bis zu einer Anzahl von 63 Fixierungen pro Seite möglich; d.h., wenn ein Auftrag so abgegeben wird, dass u.U. mehr als 63 CCWs, die sich auf dieselbe Seite beziehen, aufgebaut werden (z.B. bei Verwendung kleiner Blockgrößen und großer Transporteinheit-Längen), kann es zu einem CSTAT-Fehler kommen.Bei Bändern mit Standard-Kennsätzen überprüft BTAM vor Schreibbefehlen, ob die aktuelle Bandposition ein Schreiben dorthin erlaubt. Ist dies nicht der Fall, so wird der Auftrag mit USERERR und Fehlercode 0C9D abgewiesen.
Returncodes
Im TU-FCB werden die fünf Status-Byte (SDB, FB1, FB2, FB3, AMB) abgelegt. Zusätzlich werden im Feld ID1LRCRB noch folgende Informationen abgesetzt:
Byte 1 | X'04' Bandende/Bandanfang erreicht |
Byte 2 Byte 3/4 | Request-Nummer (nötig, da EXIT ERRADR nur einmal pro FCB) Blocknummer innerhalb einer geketteten Ein-/Ausgabe-Anforderung, bei der ein Fehler aufgetreten ist, bzw. Nummer des Blockes, mit dem das Bandende erreicht wurde (dieser Block wird noch geschrieben). |
Zum Abfragen der im ersten Byte des Feldes ID1LRCRB abgesetzten Werte steht eine DSECT (Makroaufruf: DLRC) zur Verfügung.
Bei Arbeiten im asynchronen Modus (Operand REQNO) werden bei Auftreten von Fehlern bei einer Ein-/Ausgabe die bereits angenommenen weiteren Ein-/Ausgabe-Anforderungen nicht mehr gestartet, sondern nach dem vom Benutzer abgesetzten WAIT logisch beendet. In einem solchen Fall ist neben der für die fehlerhafte Ein-/Ausgabe gültigen Fehlerinformation die Blocknummer in den Byte 3 und 4 des Feldes ID1LRCLB mit dem Wert 1 besetzt, und der Wert im RECSIZE-Register (bei RECFORM=U) ist 0.
Es ist gewährleistet, dass der Benutzer jederzeit, auch vor Abgabe aller noch ausstehenden WAITs, einen CLOSE-Aufruf geben kann. Alle zu diesem Zeitpunkt evtl. noch anstehenden Ein-/Ausgabe-Anforderungen werden dabei logisch beendet. Es sind aber noch nicht unbedingt alle Anforderungen durchgeführt.