----------------------------------------------------------------- | SOFTWARE- | FCS 1630 | MOS | | DOKUMENTATION | |--------------| |-----------------| Anleitung fuer den | | | 11/87 | Programmierer | OMOS 2.0 | ----------------------------------------------------------------- Programmtechnische Anleitung fuer den Programmierer Beschreibung Teil 5 Dateizugriffssystem 1630 (FCS 1630) MGS K 1600 VEB Robotron-Vertrieb Dok.-Nr.: C 8064-0497-1M2031 1 Die vorliegende Software-Dokumentation, Anleitung fuer den Pro- grammierer, Teil 5: "Dateizugriffssystem 1630", entspricht dem Stand von 11/87. Nachdruck, jegliche Vervielfaeltigung oder Auszuege daraus sind unzulaessig. Die Ausarbeitung erfolgte durch ein Kollektiv des VEB Robotron- Vertrieb Berlin. Im Interesse einer staendigen Weiterentwicklung werden alle Leser gebeten, Hinweise zur Verbesserung dem Herausgeber mitzuteilen. Herausgeber: VEB Robotron-Vertrieb Berlin Mohrenstrasse 62 Berlin 1086 (C) Kombinat Robotron 1987 Kurzreferat Die vorliegende Schrift beschreibt die Arbeit mit dem Dateizu- griffssystem 1630. Sie setzt Kenntnisse in der Makroassemblierung und in der Uebersicht ueber die Arbeitsweise und die Komponenten des Betriebssystems OMOS 1630 voraus. Das Dateizugriffssystem 1630 realisiert das Erstellen, Erweitern und Loeschen von Dateien und das Lesen und Schreiben von logi- schen Saetzen und von virtuellen Bloecken im sequentiellen Zu- griff, fuer Plattendateien mit Saetzen fester Laenge auch im di- rekten Zugriff. 2 Inhaltsverzeichnis ------------------ Seite 1. Aufgabenstellung 6 2. Verfahrensbeschreibung und Benutzung 6 2.1. Einleitung 6 2.2. Vorbereitung der Dateibeschreibungsbloecke 9 2.2.1. Vorbereitung eines FDB zur Assembler- bzw. Laufzeit 9 2.2.2. Initialisierung des Dateinamenblockes (FNB) 12 2.2.3. Initialisierung des Dateispeicherbereiches (FSR) 13 2.3. Oeffnen / Schliessen der Dateien 15 2.3.1. Allgemeines zum Oeffnen und Schliessen von Dateien 15 2.3.2. Erstellen einer neuen Datei 16 2.3.3. Oeffnen einer existierenden Datei 16 2.3.4. Oeffnen einer Datei fuer gemeinsamen Zugriff 18 2.3.5. Arbeit mit temporaeren Dateien 18 2.3.6. Allgemeiner Oeffnenruf OPEN$ 19 2.3.7. Schliessen und Loeschen von Dateien 20 2.3.8. Oeffnen von Dateien mit Informationen im Dateinamenblock 21 2.3.9. FDB-bezogene Notation von QIOW-Rufen 22 2.4. Satz-Ein/Ausgabe 22 2.4.1. Beschreibung der Satz-E/A-Operation 22 2.4.2. Satztypen 24 2.4.3. Direkter und sequentieller Zugriff 25 2.4.4. Uebertragungs- und Zeigermodus 25 2.4.5. Mehrfachpufferung und Grosspufferung 26 2.4.6. Lesen von Saetzen fester Laenge im direkten Zugriff 28 2.4.7. Lesen von Saetzen im sequentiellen Zugriff 30 2.4.8. Schreiben von Saetzen fester Laenge im direkten Zugriff 32 2.4.9. Schreiben von Saetzen im sequentiellen Zugriff 34 2.4.10. Retten und Einstellen von Satzpositionen einer Datei 37 2.5. Block-Ein-/Ausgabe 41 2.5.1. Beschreibung der Block-Ein-/Ausgabe 41 2.5.2. Lesen eines virtuellen Blockes (READ$) 42 2.5.3. Schreiben eines virtuellen Blockes (WRITE$) 44 2.5.4. Warten auf das Ende einer Block-E/A (WAIT$) 45 2.5.5. Beispiel zur Block-E/A 47 2.6. Arbeit mit Dateispezifikation und Dateischutz 48 2.6.1. Vorbemerkungen 48 2.6.2. Eintragen von Dateispezifikationen in einen Dateinamenblock 48 2.6.3. Finden, Einfuegen, Streichen und Umbenennen einer Datei in einem Dateiverzeichnis 52 2.6.4. Konvertieren von Dateiverzeichnisinformationen 54 2.6.5. Lesen und Schreiben von Informationen in der Programmsektion $$FSR2 des Dateispeicherbereiches 55 2.7. Fehlerbehandlung durch FCS 1630 58 2.8. Besonderheiten bei der Arbeit mit Magnetband 59 2.8.1. Allgemeines 59 2.8.2. Positionierung des Magnetbandes 59 2.8.3. Magnetbandsteuertask MAG 60 3 Seite 2.8.4. Verarbeitung kennsatzloser Magnetbaender 64 2.9. Kommandozeilenverarbeitung 68 2.9.1. Allgemeines 68 2.9.2. Kommandozeilenlesen (GCML - get command line) 68 2.9.3. Kommandozeileninterpretation (CSI - command string interpreting) 71 2.10. Kommandozeilenzerlegung mit TPARS 73 2.10.1. Einleitung und Begriffsbestimmungen 73 2.10.2. Definieren der Zustandstabelle 74 2.10.3. Typen der Syntaxelemente fuer TPARS 76 2.10.4. Schreiben von Funktionsroutinen 79 2.10.5. Zerlegung einer Kommandozeile 80 2.10.6. Wahlfreie Testroutine 81 2.10.7. Hinweise zur Programmstruktur 82 2.10.8. Beispiele 84 2.11. Spooling 87 Anlage 1 Begriffserlaeuterung 89 Anlage 2 Uebersicht ueber die Speicherbelegung des FDB 92 Anlage 3 Beschreibung der Offsets 93 Anlage 4 Dateinamenblock 97 Anlage 5 Dateideskriptor 99 Anlage 6 Statistikblock 99 Anlage 7 Uebersicht ueber die FCS-Makrorufe 100 Anlage 8 Uebersicht ueber die von den Parametern initialisierten Offsets im FDB und FNB 101 Anlage 9 Parameter der Makrorufe 102 Anlage 10 Makrorufe zum Oeffnen der Dateien 107 Anlage 11 Festlegen von Zugriffsmoeglichkeiten zur Datei beim Oeffnen 107 Anlage 12 Parameter der Oeffnenrufe in Reihenfolge ihrer Notation 108 Anlage 13 Werte des Dateizugriffparameters facc 109 Anlage 14 Beziehungen der Oeffnenrufe zum OPEN$-Ruf 109 Anlage 15 Uebersicht ueber einige wesentliche Beziehungen zum FDB 110 Anlage 16 Bitwerte fuer Dateierweiterung mit .EXTND 111 Anlage 17 Satz-E/A-Operationen mit FCS 1630 112 Anlage 18 Makrorufe fuer Satz-E/A-Operationen 113 4 Seite Anlage 19 Makrorufe zur Festlegung von Attributen der Satz-E/A 114 Anlage 20 Uebersicht ueber die Arbeitsweise von FCS bei Block-E/A 115 Anlage 21 Uebersicht ueber die blockspezifischen Makrorufe 116 Anlage 22 Fehlermitteilungen in F.ERR des FDB 117 Anlage 23 Makrorufe der Kommandozeilenverarbeitung und ihre Parameter 123 Anlage 24 Parameter der GCML-Makrorufe 124 Anlage 25 Parameter der CSI-Makrorufe 126 Anlage 26 Aufbau des GCML-Steuerblockes 129 Anlage 27 Aufbau des CSI-Steuerblockes 131 Anlage 28 Fehlermitteilungen Magnetbandsteuertask MAG 134 Anlage 29 Beispiel fuer eine Code-Umsetzungstabelle 136 Abkuerzungsverzeichnis 137 Sachwortverzeichnis 138 5 1. Aufgabenstellung ------------------- Das Dateizugriffssystem realisiert das Erstellen von Dateien und ihre Verarbeitung im sequentiellen und direkten Zugriff. Geraetetechnische Voraussetzung ist ein Rechner mit plattenspei- cherorientiertem Betriebssystem. Das Dateizugriffssystem wird einerseits durch Unterprogramme realisiert, die als positionsun- abhaengige Moduln in der Systembibliothek enthalten sind und in das jeweilige Nutzerprogramm eingebunden werden, andererseits durch Makros, die die Notation der nutzerspezifischen Probleme unterstuetzen. Es werden folgende Operationen realisiert - Erstellen neuer Dateien - Erweitern existierender Dateien - Loeschen von Dateien - Lesen und Schreiben von logischen Saetzen (nutzerseitig defi- nierte Datenstrukturen) sequentiell und direkt, wobei die Syn- chronisation vom System uebernommen wird (Fortsetzung der Nutzertask erst nach Ablauf der Operationen) - Lesen und Schreiben von virtuellen Bloecken (Geraete- bzw. be- triebssystemseitig definierte Datenstrukturen), wobei die Syn- chronisation durch die Nutzertask zu realisieren ist. Damit werden folgende Moeglichkeiten erschlossen: . Abarbeitung von Programmteilen parallel zur Ein-/Ausgabe in der Nutzertask . Realisierung des Zugriffes zu den logischen Datenstrukturen entsprechend spezifischen Nutzerbeduerfnissen - Realisieren der Arbeit mit Dateispezifikation (Name, Typ, Ver- sionsnummer) und Schutz (UIC, Schutzmaske) entsprechend den im OMEX 1630 enthaltenen Moeglichkeiten. 2. Verfahrensbeschreibung und Benutzung --------------------------------------- 2.1. Einleitung --------------- Die vorliegende Schrift stellt die Arbeit mit FCS 1630 dar. Das betrifft insbesondere die Arbeit mit Platten- und Magnetband- dateien und die satzweise Ein- bzw. Ausgabe von Dateien auf den anderen von OMOS im entsprechenden Format bedienten Geraeten. Mit dem Dateizugriffssystem 1630 (file control services, FCS 1630) erhaelt der Nutzer die Moeglichkeit, die im folgenden be- schriebenen Grundoperationen des Zugriffs zu Dateien mit ihren wesentlichen Varianten zu notieren. Die Notationsform verbindet dabei die problemnahe Darstellung mit verhaeltnismaessig ein- facher Realisierbarkeit durch die vorgefertigten Programme. Deshalb lassen sich praktisch alle entsprechenden Probleme mit FCS 1630 loesen. Insbesondere ist es auch anwendbar fuer kleinere Konfigurationen und fuer verhaeltnismaessig speicherplatzkri- tische und zeitkritische Probleme. Im FCS 1630 werden die Dateien durch Datenstrukturen beschrieben, die der Organisation des Dateizugriffes dienen. Der Kern ist dabei der Dateibeschreibungsblock (file descriptor block FDB), 6 ein 96 Bytes (140 oktal) langer Abschnitt im Nutzerprogramm, ueber den die Kommunikation des Nutzers mit dem FCS 1630 vermit- telt und die interne Arbeit des FCS 1630 mit der Datei koordi- niert wird. Die Form der Darstellung ist dabei nutzerseitig prak- tisch geraeteunabhaengig. Das FCS 1630 besteht aus einer Reihe von Makros und (positionsun- abhaengigen) Objektmoduln, die in der im OMOS 1630 ueblichen Weise aufgerufen werden. Die im jeweiligen Nutzerprogramm benoe- tigten Objektmoduln werden dabei vom Taskbilder in die Nutzertask eingebunden, bzw. sind vom Nutzer als residente Bibliothek in eine geteilte Region einzubringen (siehe Anleitung fuer den Bediener, Teil 4: "Dienstprogramme", Kap. 9, Taskbilder, und Anleitung fuer den Systemprogrammierer, Teil 2: "Inbetriebnahme und Wartung des BS OMOS 1630"). FCS nutzt als Arbeitsspeicher den Stack der jeweiligen Task, den Dateispeicherbereich (FSR) und den Dateibeschreibungsblock (FDB) der jeweiligen Datei. Fuer das Dateizugriffssystem gibt es 3 Grundeinheiten von Daten- strukturen (siehe Anleitung fuer den Programmierer, Teil 4: "Dateiformate im Betriebssystem OMOS 1630"). Datei (file), Block (block), Satz (record) (siehe Anlage 1) Die Grundverarbeitungsformen, aus denen die uebrigen vom Nutzer aufgebaut werden koennen, sind Lesen (read, get) und Schreiben (write, put). Hinzu kommen die Einleitung der Verarbeitung (Oeffnen der Datei, open) und ihr Abschluss (Schliessen der Datei, close bzw. Loeschen, delete). Wenn im folgenden Text Notationen in Programmen angegeben sind, so sind bei den Symbolen folgende Arten zu unterscheiden: "feste Symbole" erscheinen im allgemeinen oder als Beispiel im Programm "variable Symbole" sind im Programm durch die jeweils entsprechenden zu ersetzen "Feste Symbole" enthalten nur Grossbuchstaben, "variable Symbole" sind im Text in der Regel durch Kleinbuchstaben dargestellt. Der allgemeine Aufruf eines Makros wird also in der Form angege- ben makroname parameter-1,...,parameter-n der eines Unterprogramms CALL up-name In diesem Falle steht nur das Symbol "CALL" direkt im Programm, alle anderen Symbole sind durch die jeweils entsprechenden zu er- setzen. 7 Wenn in einem FCS-Makroruf ein Parameter nicht angegeben wird, so wird die entsprechende Operation (z. B. Setzen eines Offsets im FDB) nicht ausgefuehrt, es wird mit dem vorliegenden Zustand ge- arbeitet oder ein Standardwert benutzt. Wegen der unterschied- lichen Moeglichkeiten, die FCS fuer viele Operationen bietet, kann davon haeufig Gebrauch gemacht werden, um die Notation und die Programme selbst zu vereinfachen. Dabei sind die noch folgen- den Parameter anzugeben und es ist die entsprechende Anzahl von Trennzeichen zu setzen. Fuer nichterforderliche abschliessende Parameter koennen die Trennzeichen weggelassen werden. Hat z. B. ein Makro 7 Parameter, von denen der 2. und 5. angegeben werden soll, so ist die Notation makroname ,p2,,,p5 Bei der Notation der Parameter ist zu beachten, dass der Wert eines Makrosymbols zur Assemblerzeit seine Adresse ist, zur Lauf- zeit (ausser bei Einsprungadressen fuer Sprungbefehle) der Inhalt der entsprechenden Speicherzelle. Will man als Parameter die Adresse angeben, so muss man dazu bei Laufzeitmakros #symbol schreiben (s. Notationsbeispiele im Text). Die zur Organisation des Dateizugriffs verwendeten Daten (Adres- sen und Werte) lassen sich unter Verwendung symbolischer Bezeich- nungen (symbolischer Werte) problemorientiert ansprechen. Diese Definition mit Hilfe symbolischer Werte gibt eine groessere Feh- lersicherheit bei der Notation und bei eventuellen spaeteren Aen- derungen des Betriebssystems eine groessere Kompatibilitaet. Die in den Tabellen ebenfalls angegebenen numerischen Werte sollten deshalb nur zur Information verwendet werden. Die Symbole sind gekennzeichnet durch einen Punkt nach dem 1. oder 2. Buchstaben, dem weitere 3 oder 4 Buchstaben folgen (siehe z. B. die FDB-Offsets F.xxx in Anlage 2). In Abschnitt 2.2. sind zusammenfassend die vorbereitenden Aufga- ben dargestellt, die mit dem Einrichten der Dateibeschreibungs- bloecke verbunden sind. In Abschnitt 2.3. wird das Oeffnen, Schliessen und ggf. Loeschen der Dateien beschrieben. In den Abschnitten 2.4 und 2.5 werden die beiden Varianten (satz-weise oder blockweise) der Dateiverarbeitung beschrieben, die FCS ge- stattet. In Abschnitt 2.6 sind einige ueber 2.2. hinausgehende Moeglichkeiten der Arbeit mit Dateispezifikationen und Datei- schutz dargestellt. Abschnitt 2.7. beschreibt die Fehlerbehand- lung. Abschnitt 2.8 beschreibt zusammengefasst die Besonderheiten, die bei der Arbeit mit Magnetbanddateien zu beachten sind. Die Abschnitte 2.9 und 2.10 behandeln die Bestandteile von FCS, die die Verarbeitung von Kommandozeilen unterstuetzen. Abschnitt 2.11 behandelt das Einreihen von Dateien fuer den nachfolgenden (zur Programmbearbeitung zeitlich parallelen) Druck. In Anlage 1 sind einige Grundbegriffe erlaeutert. Die Einordnung von Tabellen und Uebersichten erfolgte in der Regel dann in der Anlage, wenn angenommen wurde, dass sie bei der weiteren Arbeit mit FCS relativ unabhaengig vom Text zum Nachschlagen verwendet werden koennen. Fuer das Verstaendnis von FCS 1630 sind Grundkenntnisse ueber OMOS 1630, insbesondere ueber das Dateiformat OMOS Voraussetzung. 8 2.2. Vorbereitung der Dateibeschreibungsbloecke ----------------------------------------------- 2.2.1. Vorbereitung eines FDB zur Assembler- bzw. Laufzeit ---------------------------------------------------------- Fuer jede im Nutzerprogramm zu erstellende bzw. zu oeffnende Datei ist je ein FDB erforderlich. Die notwendigen Informationen fuer die Dateiverarbeitung werden durch Makrorufe in den FDB ge- bracht. Dafuer stehen Assemblerzeit-, Laufzeit- sowie Dateiverar- beitungsmakrorufe (siehe Abschnitt 2.3. bis 2.5.) zur Verfuegung. Die Makrorufe und ihre Parameter sind in der Anlage 9 erlaeutert. Die symbolischen Namen der Assemblerzeitmakros schliessen mit A und die der Laufzeitmakros mit einem R als letztes Zeichen ab. Die spezifizierten Werte werden bei Assemblerzeitmakros durch .BYTE- oder .WORD-Anweisungen und bei den Laufzeitmakros durch MOV- bzw. MOVB-Maschinenbefehle in den FDB gebracht. Als Parameterwerte sind dementsprechende Ausdruecke moeglich (siehe "Sprachbeschreibung MACRO 1600"). Die Laufzeitmakros weisen folgende Besonderheiten auf: 1) Der erste Parameter ist die Adresse des FDB. 2) Ist ein Parameter eines Laufzeitmakros ein Adresswert oder Literalwert, der in den FDB gebracht werden soll, muss er durch ein "#" gekennzeichnet sein. Beispiel: FDOP$R #FDBOUT,#1,#DD,#IFNAM 3) Soll der Inhalt einer Speicherzelle in den FDB gebracht wer- den, so wird der Parameter, der die Adresse dieser Speicher- zelle enthaelt, nicht mit "#" gekennzeichnet. Das gilt insbe- sondere auch, wenn der Parameter ein Registername ist (z.B. R0). Beispiel: LUN: .WORD 1 : FDOP$R #FDBOUT,LUN,#DD,#IFNAM LUN ist die symbolische Adresse der Zelle, die die gewuenschte logische Geraetenummer enthaelt. 4) Wird das Register R0 als Parameter verwendet, darf es nur die Adresse des FDB enthalten. Die Parameter der Laufzeitmakros sind ausser den oben genannten Besonderheiten mit denen der Assemblerzeitmakros identisch. 9 Folgende Makros koennen zur Assemblerzeit aufgerufen werden: - Spezifikation der Anfangsadresse des FDB und Zuweisung von Speicherplatz fuer den FDB Format: label: FDBDF$ Label ist die Anfangsadresse des FDB, die vom Nutzer fest- gelegt wird. FCS greift auf die Felder innerhalb des FDB relativ zu der Adresse zu, welche durch dieses Symbol dar- gestellt wird. Alle Assemblerzeitmakrorufe die Werte in diesem FDB setzen, sind fortlaufend an den FDBDF$-Ruf an- zuschliessen. - Initialisierung des Dateiattributabschnittes des FDB Format: FDAT$A rtyp,ratt,rsiz,cntg,aloc Wird eine neue Datei erzeugt, wird der Makroruf zum Ini- tialisieren des Dateiattributabschnitts des FDB verwendet. Wenn die zu verarbeitende Datei bereits existiert, sind die ersten vier Parameter nicht erforderlich, da FCS die notwendigen Informationen aus dem Kennsatz der Datei be- zieht. Beispiel: FDAT$A R.VAR,FD.BLK Erstellen einer Datei aus Saetzen variabler Laenge, die die Blockgrenzen nicht ueberschreiten duerfen. - Initialisierung des Satzzugriffsabschnittes des FDB Format: FDRC$A racc,urba,urbs Dieser Makroruf legt fest, ob Satz- oder Block-E/A-Opera- tionen verwendet werden. Ausserdem wird bei Satz E/A die Zugriffsart bestimmt. Bei Block-E/A-Operationen sind zu- saetzliche Informationen erforderlich, die durch den FDBK$A-Makro in den FDB eingetragen werden. Beispiel: RECBUF: .BLKB 10. FDB1: FDBDF$ FDAT$A R.FIX,FD.CR FDRC$A ,RECBUF,10. : : Es sollen Satz-E/A-Operationen genutzt werden. RECBUF ist die Adresse des Nutzersatzpuffers, der 10. Bytes lang ist. Der Parameter racc ist nicht spezifiziert. Somit wird der sequentielle Zugriff im Uebertragungsmodus genutzt. 10 - Initialisierung des Blockzugriffsabschnittes des FDB Format: FDBK$A bkda,bkds,bkvb,bkef,bkst,bkdn Dieser Makroruf wird bei Block-E/A-Operationen verwendet. Er setzt den FDRC$A-Makro voraus. Der bkvb-Parameter ist, wenn erforderlich, erst zur Laufzeit nach dem Oeffnen der Datei zu setzen, da beim Oeffnen die virtuelle Blocknum- mer auf 1 gesetzt wird. Beispiel: FDBDF$ FDRC$A FD.RWM FDBK$A BKBUF,480.,,20.,EASB : Es sollen Block-E/A-Operationen genutzt werden. Der E/A- Blockpuffer mit der Adresse BKBUF hat eine Laenge von 480. Bytes. Die virtuelle Blocknummer ist nicht angege- ben. Bei Beenden der Block-E/A wird das Ereignisflag 20. gesetzt und es wird ein E/A-Statusblock mit der Adresse EASB verwendet. - Initialisierung des Dateioeffnungsabschnittes des FDB Format: FDOP$A lun,dspt,dfnb,facc,actl Mindestens einer der Parameter dspt oder dfnb muss angege- ben werden, ausser wenn die Datei mittels der Informa- tionen im Dateinamenblock eroeffnet werden soll (siehe 2.3.8.) oder diese Parameter im Oeffnenruf definiert wer- den. Sind beide Parameter angegeben, werden die Informa- tionen dem Dateideskriptor entnommen und nur beim Fehlen von Informationen wird auf den Standarddateinamenblock zu- gegriffen. Beispiel: FDOP$A 1,,IFNAM Die logische Geraetenummer ist 1 und IFNAM ist die Adresse des Standarddateinamenblockes. - Initialisierung des Blockpufferabschnittes des FDB Format: FDBF$A efn,ovbs,mbct,mbfg Dieser Makro kann bei Nutzung von Satz-E/A-Operationen an- gegeben werden. Es kann die Nutzung von Grosspufferung und/oder Mehrfachpufferung gefordert werden. Es ist zu be- achten, dass die hier angegebenen Werte im FSRSZ$-Makro beruecksichtigt werden muessen (siehe 2.4.5.). Beispiel: FDBF$A 25.,,2,FD.RAH Zur Synchronisation der Satz-E/A wird das Ereignisflag 25. benutzt (z.B. wenn zur Synchronisation einer Block-E/A innerhalb des Programms das Standardereignisflag 32. ver- wendet wird). Der ovbs-Parameter ist nicht angegeben, so- mit wird die Standardblockpuffergroesse des fuer die Datei bestimmten Geraetes verwendet. Es wird Mehrfachpufferung mit 2 Puffern vereinbart. Die spezifizierten Puffer sind fuer Vorausleseoperationen zu verwenden. 11 Neben diesen Makrorufen steht noch der Makroruf FCSMC$ zur Ver- fuegung, der eine Reihe FCS-Makrorufe als .MCALL-Anweisung auf- listet. Er stellt eine Programmierhilfe dar, da die im Programm verwendeten Makrorufe nicht einzeln in der .MCALL-Anweisung auf- zulisten sind. Es ist zu beachten, dass stets alle Makros aufge- rufen werden, auch die, die nicht benoetigt werden. Dadurch tritt eine Belastung des Assemblers auf (Uebersetzungszeit, Symbolta- bellen). Format: .MCALL FCSMC$ FCSMC$ Folgende Makros sind enthalten: .MCALL CLOSE$,DELET$,FDAT$A,FDAT$R,FDBDF$,FDBF$A .MCALL FDBF$R,FDBK$A,FDBK$R,FDOP$A,FDOP$R,FDRC$A .MCALL FDRC$R,FINIT$,FSRSZ$,GET$ .MCALL NMBLK$,OPEN$A,OPEN$M,OPEN$R,OPEN$U .MCALL OPEN$W,OPNS$A,OPNS$M,OPNS$R,OPNS$U,OPNS$W .MCALL PUT$,READ$,WAIT$,WRITE$ Wenn andere Makros benuzt werden, muss die .MCALL-Anweisung direkt programmiert werden. 2.2.2. Initialisierung des Dateinamenblockes (FNB) -------------------------------------------------- Der Dateinamenblock wird beim Oeffnen einer Datei initialisiert. Die erforderliche Dateispezifikation wird von FCS im Dateides- kriptor bzw. Standarddateinamenblock gesucht und in die ent- sprechenden Offsets des Dateinamenblockes eingetragen. Die Adres- sen dieser Datenstrukturen sind als dspt- bzw. dfnb-Parameter im FDOP$A(R)- oder in einem Oeffnenruf anzugeben. Dateideskriptor --------------- Der Dateideskriptor, ein 6-Worte-Speicherblock, kann im Nutzer- programm z.B. durch .WORD-Anweisungen vereinbart werden. Die Struktur des Dateideskriptors ist in der Anlage 5 dargestellt. Beispiel: FDBOUT: FDBDF$ FDAT$A R.FIX,FD.CR FDRC$A ,RECBUF,42. FDOP$A OUTLUN,DDPL,,FO.WRT RECBUF: .BLKB 42. DDPL: .WORD 4.,DEV ;Laenge und Adresse ;des Geraetenamens .WORD 9.,DIR ;Laenge und Adresse des ;Dateiverzeichnisses .WORD 10.,FNAM ;Laenge und Adresse ;des Dateinamens DEV: .ASCII /DK1:/ DIR: .ASCII /[200,302]/ FNAM: .ASCII /OUTPUT.DAT/ OUTLUN=1 12 Es wird ein FDB fuer eine Datei gebildet, dessen Anfangsadresse FDBOUT ist. Im FDOP$A-Ruf ist die Adresse des Dateideskriptors spezifiziert. Da dieser alle erforderlichen Informationen zur Dateispezifikation enthaelt, ist in diesem Fall nicht auf einen Standarddateinamenblock zuzugreifen, um den Dateinamenblock zu fuellen. Standarddateinamenblock (DFNB) ------------------------------ Fehlen noch Informationen zur Dateispezifikation, benutzt FCS die entsprechenden Angaben aus dem Standarddateinamenblock. Die Defi- nition des Standarddateinamenblockes erfolgt mit dem NMBLK$-Ruf. Dieser Makroruf stellt Speicherplatz fuer den DFNB bereit und traegt die angegebenen Informationen in den DFNB ein. Format: label: NMBLK$ fnam,ftyp,fver,dvnm,unit label ist die Adresse des DFNB. Diese Marke wird im FDOP$A- bzw. FDOP$R-Ruf oder in einem Oeffnenruf als dfnb-Parameter angegeben. Die Parameter des NMBLK$-Rufes sind in der Anlage 9 erlaeutert. Beispiel: FDBIN: FDBDF$ FDAT$A R.VAR,FD.CR FDRC$A ,RECBUF,42. FDOP$A INLUN,,IFNAM : : RECBUF: .BLKB 42. IFNAM: NMBLK$ INPUT,DAT,,DK,1 INLUN=2 Es wird ein FDB zum Bilden einer Datei mit dem Namen INPUT und dem Typ DAT auf DK1: erstellt. 2.2.3. Initialisierung des Dateispeicherbereiches (FSR) ------------------------------------------------------- Neben der Definition eines Dateibeschreibungsblockes fuer alle E/A-Operationen ist ein Dateispeicherbereich im Nutzerprogramm einzurichten. Dieser Bereich besteht aus den Programmsektionen $$FSR1 und $$FSR2. $$FSR1 enthaelt die Blockpuffer fuer Satz-E/A und $$FSR2 dient der internen Nutzung durch FCS. Die Initialisierung des FSR muss sowohl zur Assembler- als auch zur Laufzeit erfolgen. Fuer die Initialisierung zur Assemblerzeit ist der FSRSZ$-Makro unabhaengig vom Typ der E/A in jedem Pro- gramm einmal aufzurufen. Format: FSRSZ$ files,bufsiz,psect Die Parameter sind in der Anlage 9 erlaeutert. $$FSR2 hat eine feste Laenge, waehrend die Laenge von $$FSR1 vom FSRSZ$-Makro abhaengt. 13 Gibt der Nutzer einen Wert im Parameter bufsiz an, so ergibt sich die Gesamtgroesse von $$FSR1 wie folgt: $$FSR1-Groesse = (S.BFHD * files) + bufsiz Wird kein Wert im Parameter bufsiz angegeben, so gilt: $$FSR1-Groesse = files * (S.BFHD + 512.) S.BFHD ist dabei die Groesse der von FCS erzeugten Blockpufferkoepfe in Bytes (20 oktal). Die Grosspufferung und die Mehrfachpufferung sind bei der Festle- gung der Parameter fuer den Makroruf zu beruecksichtigen. Der Wert fuer den Parameter bufsiz laesst sich folgendermassen be- rechnen: bufsiz = (bs1 * mb1) + (bs2 * mb2) + ... (bsn * mbn) bs1,bs2,...,bsn sind die Groessen derjeweiligen Puffer mb1,mb2,...,mbn sind die Anzahlen der dazugehoerigen Puffer Beispiel: FSRSZ$ 2 Es sollen gleichzeitig 2 Dateien fuer Satz-E/A geoeffnet werden. Als Puffer fuer diese Dateien sind je 512. Byte (Standardlaenge) im FSR verfuegbar. Die FSR-Initialisierung zur Laufzeit erfolgt implizit durch einen Oeffnenruf oder explizit durch den FINIT$-Makro. Der FINIT$-Makro ist bei allen Programmen mit Restart unbedingt anzuwenden. Vor wiederholtem Anwenden des Rufes sind alle Dateien zu schliessen. Format: FINIT$ Beispiel: START: FINIT$ ;explizite FSR-Initialisier. OPEN$R #FDBIN ;Oeffnen der Datei Auch der Aufruf bestimmter Dateisteuerroutinen (z.B. .PARSE, siehe Abschnitt 2.6.1.) fordert vorher die Initialisierung des FSR. Erweiterung des FSR ------------------- Ist eine Erweiterung des Dateispeicherbereiches notwendig, hat der Nutzer folgende Moeglichkeiten: 1) Modifizierung der Parameter im FSRSZ$-Ruf, um die Anzahl der Dateien neu zu definieren, die fuer Satz-E/A simultan geoeff- net werden. Erneutes Assemblieren des Programms. 2) Verwendung der Option EXTSCT beim Bilden der Task, um die neue Groesse des FSR zu definieren. EXTSCT = $$FSR1 : length length definiert die Groesse des gesamten Blockpuffers in Bytes, die gefordert wird. 14 2.3. Oeffnen / Schliessen der Dateien ------------------------------------- 2.3.1. Allgemeines zum Oeffnen und Schliessen von Dateien --------------------------------------------------------- Die Verarbeitung der Dateien beginnt obligatorisch mit ihrem Oeffnen und endet mit ihrem Schliessen oder Loeschen. Alle Verar- beitungsroutinen, die durch die Makros aufgerufen werden, haben folgende Eigenschaften: - gemeinsame Form der Fehlerbehandlung (s. Abschnitt 2.7.) - Retten der Register R1 bis R5. R0 wird benutzt, es enthaelt die Adresse des jeweiligen FDB - Jeder Verarbeitungsruf, der neue Werte fuer Parameter vorgibt, fuehrt zum Ueberschreiben im FDB bereits eingetragener Werte. Fuer jede geoeffnete Datei muss ein ihr allein zugeordneter FDB vorhanden sein. Nach dem Schliessen der Datei kann der Speicher- platz des FDB fuer eine andere Datei genutzt werden. Dabei ist zu beachten, dass die spaeter eventuell noch einmal benoetigten Informationen vorher gerettet werden und vor dem Oeffnen der anderen Datei mit dem gleichen FDB alle Werte neu gesetzt werden. Fuer gleichzeitig geoeffnete Dateien sind verschiedene LUN vorzu- sehen. Das ist z.B. gewaehrleistet, wenn jedem FDB eine eigene LUN zugeordnet wird. Ist in einem Dateideskriptor oder einem Standarddateinamenblock ein Geraet angegeben, so wird beim Oeff- nen der Datei dieses Geraet der LUN zugewiesen. Anderenfalls wird das Geraet verwendet, das der LUN aktuell zugewiesen ist. Ist kein Geraet angegeben der LUN noch kein anderes Geraet zugewie- sen, so wird SY0: gearbeitet. Unter dem Begriff Oeffnen sind das Erstellen einer neuen Datei und das Vorbereiten einer existierenden Datei fuer das Lesen und Schreiben von Informationen zusammengefasst. Beim Oeffnen ist weitgehend zu beruecksichtigen, wie die weitere Verarbeitung er- folgen soll. Die jeweils zweckmaessige Art und Weise des Oeffnens ist deshalb erst endgueltig festzulegen, nachdem die Art und Weise der Verarbeitung festgelegt ist. Eine Uebersicht ueber die verschiedenen Varianten geben die Tabellen in Anlage 10 und 11. In der Reihenfolge der Tabelle in Anlage 10 sind diese Formen in den folgenden Abschnitten 2.3.2. bis 2.3.6. dargestellt. Der Vielfalt von Anforderungen an die Verarbeitung entsprechen die unterschiedlichen Moeglichkeiten, eine Datei zu oeffnen. Demgegenueber erfolgt das Schliessen bzw. Loeschen einheitlich. Das korrekte Schliessen bzw. Loeschen ist aber von grosser Bedeu- tung fuer eine weitere Arbeit mit der Datei und dem Datentraeger und deshalb sehr sorgfaeltig auszufuehren. Es wird im Abschnitt 2.3.7. beschrieben. 15 2.3.2. Erstellen einer neuen Datei ---------------------------------- Beim Vorbereiten des FDB sind mindestens die Attribute der Datei mit FDAT$x (x= A oder R) zu setzen. Sie werden im Dateikennsatz (file header block) des entsprechenden Datentraegers gesetzt, und die Datei wird in den UFD des Datentraegers eingetragen. Damit sind insbesondere Satztyp (rtyp) und Satzattribute (ratt) der Datei festgelegt. Die anderen notwendigen Angaben koennen im FDB durch die Parameter des OPEN$W-Makrorufes gesetzt werden. Eventuell vorher gesetzte Werte werden dabei ueberschrieben. Der Ruf hat das Format (siehe Anlage 12): OPEN$W fdb,lun,dspt,racc,urba,urbs,err Beim Erstellen einer Datei mit OPEN$W werden die Informationen im Dateinamenblock (FNB) gesetzt. (Soll dabei eine eventuell bereits existierende Datei mit gleichem Namen, Typ und Versionsnummer nicht geloescht werden, so muss der allgemeine Oeffnenruf verwen- det werden, siehe Abschnitt 2.3.6.). Ist die Versionsnummer nicht explizit angegeben, ordnet FCS bei Verwendung des OPEN$W-Makros die naechsthoehere Versionsnummer zu. Weiter wird der Datei das der logischen Geraetenummer entsprechende Geraet zugeordnet und fuer Satz-E/A-Operationen ein Puffer des FSR-Blockpufferberei- ches. Nach dem Erstellen ist die Datei geoeffnet und kann be- schrieben werden. Es ist auch moeglich, sie als leere Datei zu schliessen und spaeter als existierende Datei wieder zu oeffnen. 2.3.3. Oeffnen einer existierenden Datei ---------------------------------------- Je nach vorgesehenem Zugriff zur Datei ist einer der Rufe OPEN$x auszuwaehlen (siehe Anlagen 10 und 11). Die Rufe haben das Format (siehe Anlage 12): OPEN$x fdb,lun,dspt,racc,urba,urbs,err Dabei ist x zu waehlen entsprechend x = R wenn nur gelesen werden soll = M wenn gelesen und geschrieben werden soll, ohne neue Daten- einheiten hinzuzufuegen (Bloecke bzw. Saetze) = U wenn gelesen, geschrieben oder angefuegt werden soll = A wenn ebenfalls alle Operationen vorkommen, aber mit An- fuegen begonnen wird. Die Datei ist dann nach dem Oeffnen auf das Ende positioniert. OPEN$A ist nicht anzuwenden, wenn PUT$ oder PUT$R mit gesetztem FD.RAN angewandt werden soll, da in diesem Fall auch mit dem 1. Satz begonnen wird wenn keine Satznummer angegeben ist (siehe Abschnitt 2.4.7.). Vorausgesetzt ist, dass die task entsprechend ihrem UIC die be- treffenden Zugriffsrechte hat. 16 Die Informationen zur Dateispezifikation werden beim OPEN$x-Ruf dem Dateinamenblock entnommen. Sind sie dort nicht vorhanden, so wird der Dateideskriptor und fuer die noch fehlenden Angaben der Standarddateinamenblock genutzt. Die uebrigen Informationen, insbesondere die Dateiattribute, wer- den dem Dateikennsatz entnommen. Es ist deshalb nicht sinnvoll, diese vorher zu setzen, da sie ueberschrieben werden. Ausserdem wird der Datei bei Satz-E/A ein Puffer aus dem FSR-Blockpufferbe- reich zugewiesen. Wenn zum Schreiben neuer Informationen die Erweiterung von Da- teien notwendig wird, so wird sie standardmaessig oder entspre- chend angegebenem aloc-Parameter im FDAT$X-Makro vorgenommen, siehe Anlage 9. Im Interesse einer guenstigen Organisation des Datentraegers kann aber eine gezielte Erweiterung der Datei sinn- voll sein, die nicht durch eine zufaellige Schreiboperation aus- geloest wird. Das kann durch CALL .EXTND erreicht werden, wobei die Register R0, R1, R2 folgendermassen gesetzt sein muessen. R0 Adresse des FDB R1 16 niederwertige Bits der Anzahl der Bloecke, um die die Datei zu erweitern ist R2-hoeherwertiges Byte 8 hoeherwertige Bits der Anzahl Bloecke in Ergaenzung zu R1 R2-niederwertiges Byte 8 Bits, die entsprechend Anlage 16 zu setzen sind. Die Datei kann dabei geoeffnet oder auch geschlossen sein. Die Routine kann zum Ausschalten der automatischen Dateiverkuerzung bei CLOSE$ benutzt werden. In diesem Fall muessen die Register R1 und R2 Null enthalten. Darueber hinaus schaltet jede Benutzung der Routine die automatische Dateiverkuerzung aus. Durch die Routine .TRNCL kann diese wieder eingeschaltet werden. Z. B. wird durch die Befehlsfolge MOV #OFDB,R0 MOV #100,R1 MOV #203,R2 CALL .EXTND erreicht, dass eine Datei um 100 (oktal) physisch zusammenhaen- gende Bloecke erweitert wird, aber nicht notwendig physisch zu- sammenhaengend ist. Steht dieser Platz auf dem Datentraeger nicht mehr zur Verfuegung, so wird die Datei um den groessten physisch zusammenhaengenden Bereich des Datentraegers erweitert. 17 2.3.4. Oeffnen einer Datei fuer gemeinsamen Zugriff --------------------------------------------------- Soll von verschiedenen Tasks aus die gleiche Datei gleichzeitig geoeffnet sein, so ist mit den gleichen Parametern statt des OPEN$x-Rufes der Ruf OPNS$x fdb,lun,dspt,racc,urba,urbs,err anzuwenden mit x = R, M, U, A. OPNS$W ist nur in einer Task ein- mal anzuwenden (siehe Anlage 11 und 12). Damit kann von den verschiedenen Tasks entsprechend der gewaehl- ten Moeglichkeiten uneingeschraenkt zu der gleichen Datei zuge- griffen werden. Die Synchronisation zum Vermeiden des Lesens oder Schreibens falscher Daten liegt in der Verantwortung der Nutzer- tasks. Der OPEN$R-Ruf gestattet auch Zugriff zu Dateien, die von anderen Tasks ebenfalls fuer Lesen geoeffnet sind. Er gewaehrleistet, dass waehrend des Lesens nicht gleichzeitig von anderen Tasks ge- schrieben wird. 2.3.5. Arbeit mit temporaeren Dateien ------------------------------------- Eine temporaere Datei wird zweckmaessigerweise benutzt, wenn die Datei am Ende des Programms wieder geloescht werden soll (Ar- beitsdatei). Die Datei wird dann nur in die Indexdatei des Daten- traegers eingetragen. Das relativ aufwendige Eintragen in das UFD entfaellt und damit auch das spaetere Austragen. Der Ruf hat die Form (siehe Anlage 12, wie OPEN$x). OPNT$D fdb,lun,dspt,racc,urba,urbs,err Die Datei wird erstellt. Mit dem spaeteren Schliessen wird sie gleichzeitig geloescht. In der Zwischenzeit koennen beliebige Operationen mit ihr vorgenommen werden. Es ist moeglich, eine temporaere Datei auch so zu erstellen, dass ein Schliessen und Wiederoeffnen moeglich wird. Doch muss der Nutzer dabei sehr sorgfaeltig vorgehen, damit die Datei nicht zu einer "verlorenen" Datei wird. Gelingt das Wiederoeffnen infolge eines Versehens im Programm nicht, so ist ein Wiederfinden zum Nutzen oder zum Loeschen (und damit Freimachen des belegten Plat- zes) nur sehr aufwendig moeglich, indem mit dem entsprechenden Dienstprogramm VFY (file strukture verification utility) die Indexdatei mit allen UFD des Datentraegers verglichen wird (siehe Anleitung fuer den Bediener, Teil 4: "Dienstprogramme", Kap. 16). 18 Es sind folgende Schritte sorgfaeltig auszufuehren: Die Datei wird mit dem Ruf OPNT$W fdb,lun,dspt,racc,urba,urbs,err erstellt. Vor Schliessen der Datei ist der Dateinamenblock des entsprechenden FDB zu retten, dann Schliessen mit CLOSE$ entspre- chend Abschnitt 2.3.7. Die Datei kann dann mit einem beliebigen Ruf fuer das Oeffnen einer existierenden Datei geoeffnet werden, nachdem der Dateinamenblock mit dem geretteten Inhalt gesetzt wurde (beim Schliessen wird der Inhalt des Dateinamenblockes zer- stoert). Die temporaere Datei hat keinen Namen und ist nur ueber den Inhalt ihres Dateinamenblockes zu spezifizieren. Der Datei- namenblock (FNB) umfasst S.FNB Bytes (S.FNBW Worte) und beginnt beim Offset F.FNB des FDB. Die Datei ist zu loeschen, indem man die Adresse des FDB in das Register R0 bringt, dann CALL .MRKDL aufruft und damit die Datei fuer das Loeschen kennzeichnet und danach mit CLOSE$ schliesst. Die temporaere Datei wird nach dem Ruf von .MRKDL auch geloescht, wenn die Task faelschlicherweise kein Schliessen enthaelt oder die Datei anormal abgeschlossen wurde. 2.3.6. Allgemeiner Oeffnenruf OPEN$ ----------------------------------- Die bisher dargestellten Operationen koennen alle auch mit dem allgemeinen Oeffnenruf ausgefuehrt werden. Er gestattet darueber hinaus die Angabe eines Standarddateinamenblockes im Parameter dfnb und einige weitere Kombinationen im Parameter facc (Datei- zugriff). Der Ruf hat die Form (siehe Anlage 12): OPEN$ fdb,facc,lun,dspt,dfnb,racc,urba,urbs,err Durch Verwendung des Makrorufes fuer das Erstellen einer neuen Datei kann durch das Spezifizieren von zwei zusaetzlichen Parame- tern das automatische Ersetzen einer Datei beim Antreffen einer doppelten Dateispezifikation im UFD verhindert werden. Anstelle des Streichens der alten Version der Datei wird die Fehleranzeige IE.DUP in den FDB auf die Speicherstelle F.ERR gebracht. Die Be- ziehungen zu den anderen Rufen sind in Anlage 14 dargestellt. In Anlage 15 ist noch einmal eine Uebersicht ueber einige wesent- liche Beziehungen des Oeffnens zum FDB gegeben. Die Spalte "Offsets" enthaelt die entsprechenden (herausgegriffenen, s. auch Anlage 3 fuer eine vollstaendige Uebersicht) FDB-Offsets. In Spalte "Parameter" sind die in Abschnitt 2.2. erklaerten ent- sprechenden Parameter angegeben. In Spalte "Makros" ist angege- ben, wie die Offsets gesetzt werden koennen. In der Spalte "Bemerkungen" sind allgemeine Hinweise gegeben. Die spezielle Be- deutung und moeglichen Werte der Offsets bzw. Parameter sind Anlage 3 bzw. 9 zu entnehmen. 19 2.3.7. Schliessen und Loeschen von Dateien ------------------------------------------ Wenn die Verarbeitung einer Datei beendet ist, muss diese ge- schlossen werden. Beim Schreiben eines Programms ist zu empfeh- len, sorgfaeltig darauf zu achten, dass die geoeffneten Dateien auf allen Wegen, auf denen das Programm verlassen wird, auch ge- schlossen bzw. geloescht werden, da sonst insbesondere die fuer Schreibzugriff geoeffneten Dateien unbrauchbar sein koennen. Der Ruf zum Schliessen einer Datei hat die Form CLOSE$ fdb,err Die Parameter haben dabei dieselbe Bedeutung wie in den Oeffnen- rufen (siehe Anlage 12). Bei mehrfachgepufferter Satz-E/A wird auf den Abschluss aller fuer die Datei vor sich gehenden E/A- Operationen gewartet, wenn dieser Makroruf gegeben wurde. Auf den Ruf hin werden bei Ausgabedateien die Blockpuffer vollstaendig geschrieben, dann freigegeben. Der Zugriff der Task zur Datei wird aufgehoben und der FDB durch Nullsetzen der entsprechenden Offsets fuer eine Wiederverwendung vorbereitet (Damit wird sein Inhalt zerstoert!). Der CLOSE$-Makroruf verkuerzt standardmaessig eine Datei auf ihr logisches Ende. Der Ruf zum Loeschen einer Datei hat die Form DELET$ fdb,err Die Datei wird aus dem UFD und der Indexdatei ausgetragen. Damit ist der von ihr belegte Speicherplatz freigegeben. Wird der Ruf fuer eine geoeffnete Datei gegeben, so wird diese Datei geschlos- sen und dann geloescht. Speicherplatz und Rechenzeit werden beim Loeschen gespart, wenn man anstatt DELET$ CALL .DLFNB mit (R0) = Adresse FDB verwendet. .DLFNB setzt einen vollstaendig gefuellten Dateinamen- block voraus, was z. B. bei einer geoeffneten Datei der Fall ist. Will man beim Schliessen eine Datei auf ihr logisches Ende ver- kuerzen, so ist die Routine .TRNCL mit CALL .TRNCL aufzurufen. Dabei muss R0 die Adresse des FDB der (noch geoeffne- ten) Datei enthalten. Die Datei wird verkuerzt, die nach dem logischen Ende liegenden virtuellen Bloecke werden freigegeben und die Datei wird geschlossen. Das Verkuerzen erfordert Schreib- und Erweiterungsrechte fuer die Datei, sonst schlaegt die Verkuerzungsoperation fehl. Das Schliessen wird auch ausgefuehrt, wenn das Verkuerzen nicht ausgefuehrt werden kann. Treten auch beim Schliessen Fehler auf, so ist in F.ERR nur der Fehler vom Schliessen der Datei ange- zeigt. Diese Routine schaltet die automatische Dateiverkuerzung ein. 20 2.3.8. Oeffnen von Dateien mit Informationen im Dateinamenblock --------------------------------------------------------------- Zur Laufzeitverringerung oder zum Verringern vom Hauptspeicher- platz durch Ueberlagerungsstrukturen koennen einige weitere Varianten des Oeffnens von Dateien angewendet werden, die im fol- genden beschrieben sind. Statt der Rufe OPEN$x koennen die Rufe OFNB$x (x=W,R,U,M,A) fuer das Erstellen von Dateien und das Oeffnen existierender Dateien bzw. OFID$x (x=R,U,M,A) fuer das Oeffnen existierender Dateien verwendet werden. Die Rufe haben das gleiche Format und die glei- chen Parameter wie OPEN$x (s.Abschnitte 2.3.2. und 2.3.3. und Anlagen 11 und 12). OFID$x und OFNB$x sind nicht im FCSMC$-Makro enthalten und des- halb vor Verwendung in eine .MCALL-Anweisung aufzunehmen. Die Rufe setzen bestimmte Informationen im Dateinamenblock voraus, die mittels der Routinen .PARSE, .FIND, .GTDIR, .GTDID in diesen gebracht werden koennen (siehe Beschreibung dieser Routinen in Abschnitt 2.6.). Zur Verringerung des Speicherplatzes ist es guenstig, wenn man je nach Aufgabe nur einen der 3 moeglichen Typen von Rufen OPEN$x, OFNB$x oder OFID$x verwendet und die oben angefuehrten Routinen .PARSE,..,.GTDID auf einen anderen Zweig der Ueberlagerungs- struktur gebracht werden. Variante 1 ---------- Das Wiederoeffnen von Dateien erfolgt am schnellsten mit einem beliebigen Ruf, wenn der gesamte Dateinamenblock (S.FNB Bytes bzw. S.FNBW Worte des FDB ab Offset F.FNB, siehe Anlagen 2 und 4) vor dem vorherigen Schliessen gerettet wird und vor dem Oeffnen in den FDB eingespeichert wird. Variante 2 ---------- Die Informationen ueber eine existierende Datei werden mit CALL .PARSE und CALL .FIND in den Dateinamenblock gebracht (siehe Abschnitt 2.6.2., 2.6.3.) und dann die Datei mit OFID$x (bzw. OFNB$x) geoeffnet. Variante 3 ---------- Die Informationen ueber eine existierende oder neue Datei werden mit CALL .PARSE (s. Abschnitt 2.6.2.) in den Dateinamenblock ge- bracht und dann die Datei mit OFNB$x geoeffnet. Variante 4 ---------- Die Informationen ueber Dateinamen, Typ, Versionsnummer, Geraet werden mit NMBLK$ in einen Standarddateinamenblock gebracht. Dann wird die Dateiverzeichnis-Identifikation N.DID mit CALL .GTDIR von einem Dateideskriptor oder mit CALL .GTDID vom Standarddatei- verzeichnis in den Standarddateinamenblock gebracht, und an- schliessend wird der Standarddateinamenblock auf den Dateinamen- block uebertragen und die Datei mit OFNB$x geoeffnet. 21 2.3.9. FDB-bezogene Notation von QIOW-Rufen ------------------------------------------- Zur Ausfuehrung von QIO-Funktionen mit Warten auf ihre Beendigung kann die .XQIO-Routine aufgerufen werden. Vor Aufruf der Routine durch CALL .XQIO muessen folgende Register gesetzt werden: R0: Adresse des FDB, der die zugewiesene LUN enthaelt R1: QIO - Funktionscode R2: Anzahl der geraete- und funktionsabhaengigen Parameter in der Parameterliste (0,...,6) R3: Adresse der Parameterliste, falls R2 ungleich Null. Die Inhalte der Register R0 bis R5 bleiben erhalten. Bei Auftreten von Fehlern wird das C-Bit gesetzt, und der Fehler- code wird in F.ERR eingetragen (siehe Anleitung fuer den Bediener, Teil 3: "Ein-/Ausgabesystem", Abschnitt 1.4.5.). 2.4. Satz-Ein/Ausgabe --------------------- 2.4.1. Beschreibung der Satz-E/A-Operation ------------------------------------------ Eine Datei besteht bei Verwendung der Satz-E/A aus der Sicht des Nutzers aus Saetzen bzw. wird aus Saetzen des Nutzers gebildet. Die Laenge der Saetze wird vom Nutzer festgelegt, an die innere Struktur werden keine Forderungen gestellt. Es koennen drei Satztypen verarbeitet werden, und zwar - Saetze fester Laenge (Typ R.FIX) - Saetze variabler Laenge (Typ R.VAR) - Saetze variabler Laenge (Typ R.SEQ), denen eine "Folgenummer" vorangestellt wird. Zur Verarbeitung seiner Saetze kann der Nutzer den sequentiellen oder den direkten Zugriff verwenden. Der direkte Zugriff verlangt jedoch, dass alle Saetze der Datei die gleiche Laenge haben; er ist ausserdem nur fuer Plattendateien moeglich. Die Daten werden auch bei Satz-E/A-Operationen mit FCS 1630 zwi- schen den peripheren Geraeten und dem Hauptspeicher in Bloecken uebertragen. Deshalb wird eine Datei, die Saetze des Nutzers ent- haelt, in virtuelle Bloecke unterteilt. Jeder virtuelle Block be- steht auf Platte aus 512 Bytes. Sofern der Nutzer nichts anderes vorschreibt, koennen seine Saet- ze die virtuellen Blockgrenzen ueberschreiten, d.h. der Satzan- fang liegt am Ende eines virtuellen Blockes und der Rest des Satzes am Anfang des naechsten Blockes. Zum Schreiben der Saetze auf einen Datentraeger stehen der PUT$R-, der PUT$- und der PUT$S-Makro und zum Lesen der Saetze von einem Datentraeger der GET$R-, der GET$- und der GET$S-Makro zur Verfuegung. 22 Diese Makros fuehren im FSR-Blockpuffer ein Blocken bzw. Ent- blocken der Saetze innerhalb der virtuellen Bloecke durch, so dass der Nutzer unmittelbar zu seinen Saetzen zugreifen kann. Dabei stehen ihm zwei Zugriffsmodi zur Verfuegung, der Zeiger- modus und der Ubertragungsmodus. Im Zeigermodus wird dem Nutzer die Position des gewuenschten Satzes innerhalb des FSR-Blockpuffers angezeigt, im Uebertra- gungsmodus wird der betreffende Satz zwischen dem FSR-Blockpuffer und einem Satzpuffer des Nutzers uebertragen. Infolge der Puffe- rung der Saetze im FSR-Blockpuffer fuehrt nicht notwendig jeder E/A-Makroruf zu einem E/A-Transfer. Fuer die Arbeit mit direktem Zugriff koennen der GET$R-, GET$-, PUT$R- oder der PUT$-Makro verwendet werden. Beim sequentiellen Zugriff findet der GET$S-, GET$-, PUT$S- oder der PUT$-Makro Verwendung. Die Anlage 18 gibt eine Uebersicht ueber die Makros zur Durch- fuehrung der Satz-E/A. Die im Makroruf angegebenen Parameter (ausser fdb und err) setzen die entsprechenden FDB-Offsets, eventuell vorher im FDB eingetra- gene Werte werden dabei ueberschrieben. Sind Parameter nicht an- gegeben, bleiben die alten Werte im FDB erhalten. Ist fdb angege- ben, wird der Wert nach R0 transportiert, andernfalls wird der Inhalt von R0 als FDB-Adresse verwendet. Bei Angabe von err wird mit JSR PC,err verzweigt, falls eine Fehlerbedingung vorliegt. Vor Durchfuehrung einer Satz-E/A (d.h. vor Aufruf des entspre- chenden Satz-E/A-Makros) muessen die notwendigen Attribute zur Festlegung der Satz-E/A in den FDB eingetragen werden. Die Anlage 19 gibt eine Uebersicht der dafuer vorhandenen Makros und ihrer Parameter. Im Gegensatz zu den Block-E/A-Operationen sind alle Satz-E/A- Operationen synchronisiert, d.h. die Steuerung wird erst dann an das Nutzerprogramm zurueckgegeben, wenn die E/A-Operation abge- schlossen ist. Zur Synchronisation der Satz-E/A verwendet FCS 1630 standardmaessig das Ereignisflag 32 (dezimal). Soll ein anderes Ereignisflag verwendet werden, muss der Nutzer die Nummer des gewuenschten Ereignisflags im FDBF$A- oder FDBF$R-Ruf ange- ben. Die Ereignisflagnummer wird in den FDB-Offset F.EFN einge- tragen. Vor dem Schreiben eines Satzes prueft FCS, ob dieser Satz inner- halb des der Datei auf der Platte zugewiesenen Speicherbereichs liegt. Ist das der Fall, wird der Satz geschrieben; andernfalls versucht FCS, die Datei entsprechend dem Wert im FDB-offset F.ALOC zu erweitern. Ist die Dateierweiterung nicht moeglich, werden das C-Bit gesetzt und der Fehlercode in F.ERR eingetragen. 23 2.4.2. Satztypen ---------------- FCS 1630 verarbeitet drei Satztypen, und zwar Saetze vom Typ R.FIX, R.VAR oder R.SEQ. In Abhaengigkeit vom verwendeten Geraet (satz- oder blockorientiert) haben die Saetze eine unterschied- liche Struktur auf dem Datentraeger. Auf Platte sind die Saetze folgendermassen strukturiert: Saetze fester Laenge (Typ: R.FIX) beinhalten nur die Daten des Nutzers. Saetzen variabler Laenge vom Typ R.VAR wird durch FCS 1630 ein 1 Wort langer Kopf vorangestellt, der die Satzlaenge in Bytes enthaelt. Saetzen variabler Laenge vom Typ R.SEQ wird durch FCS 1630 ein 2 Worte langer Kopf vorangestellt. Das erste Wort beinhaltet die Laenge des Satzes, das zweite die Folgenummer des Satzes. Die Folgenummer ist nur fuer die Anwendung durch den Nutzer vorgese- hen, von FCS 1630 werden keine Standard-Folgenummern eingetragen. Der Nutzer kann fuer die Folgenummer beliebige Werte zur Kenn- zeichnung seiner Saetze verwenden. Der Zugriff auf die Folgenummer ist nur ueber den FDB-Offset F.SEQN moeglich. Beim Schreiben von Saetzen vom Typ R.SEQ muss der Nutzer die gewuenschte Folgenummer in den FDB-Offset F.SEQN eintragen. Beim Lesen von Saetzen vom Typ R.SEQ wird die Folge- nummer des gelesenen Satzes durch FCS in den FDB-Offset F.SEQN eingetragen, und der Nutzer kann sie dort entnehmen. Die Saetze haben folgende Struktur: (n ist die vom Nutzer beim Schreiben des Satzes angegebene Satz- laenge, sie wird beim Lesen in den FDB-Offset F.NRBD eingetra- gen.) Satz vom Typ R.FIX: ----------------- | Daten | ----------------- |<---n Bytes--->| Satz vom Typ R.VAR: ------------------------------- | Bytezaehler | Daten | ------------------------------- |<--2 Bytes-->|<---n Bytes--->| Inhalt Bytezaehler: n Satz vom Typ R.SEQ: --------------------------------------------- | Bytezaehler | Folgenummer | Daten | --------------------------------------------- |<--2 Bytes-->|<--2 Bytes-->|<---n Bytes--->| Inhalt Bytezaehler: n+2 Saetze variabler und fester Laenge sind an die Wortgrenzen gebun- den. Beim Schreiben von Saetzen mit ungerader Laenge wird auf Platte zusaetzlich ein Byte zur Auffuellung bis zur Wortgrenze benoetigt. 24 Beim Lesen von Saetzen mit variabler Laenge im Uebertragungsmodus werden die Satzlaenge und die Folgenummer nicht in den Nutzer- satzpuffer uebertragen. Der in einer neu zu erstellenden Datei verwendete Satztyp wird im FDAT$A- bzw. FDAT$R-Makroruf festgelegt. Bei einer bereits exi- stierenden Datei wird der Satztyp durch einen Dateioeffnungs- makroruf vom Dateikennsatz gelesen und in den FDB eingetragen. 2.4.3. Direkter und sequentieller Zugriff ----------------------------------------- FCS 1630 gestattet dem Nutzer, seine Saetze im direkten oder sequentiellen Zugriff zu verarbeiten. Der direkte Zugriff ist nur fuer Plattendateien moeglich. Im sequentiellen Zugriff lassen sich Saetze fester und variabler Laenge verarbeiten. Die Anwendung des direkten Zugriffs setzt voraus, dass die Datei den Satztyp R.FIX besitzt. Der direkte Zugriff kann zu jedem beliebigen Satz der Datei er- folgen. Der gewuenschte Satz wird durch seine Satznummer charak- terisiert, wobei die Satznummer die Position des Satzes innerhalb der Datei angibt. Dabei wird die Datei als ein Feld von Saetzen fester Laenge angesehen, in dem die Saetze - mit 1 beginnend - in aufsteigender Reihenfolge numeriert sind. FCS 1630 verwendet standardmaessig den sequentiellen Zugriff. Will der Nutzer den direkten Zugriff verwenden, muss er im racc- Parameter des FDRC$A-, FDRC$R- oder eines Dateioeffnungsmakro- rufes FD.RAN angeben. 2.4.4. Uebertragungs- und Zeigermodus ------------------------------------- Bei einer Satz-E/A-Operation erfolgt eine Uebertragung des vir- tuellen Blockes, der den gewuenschten Satz enthaelt, zwischen einem Datentraeger und dem FSR-Blockpuffer. Dem Nutzer stehen zwei Arten des Zugriffs auf die Saetze seiner Datei zur Verfue- gung. Er kann nach der Uebertragung eines virtuellen Blockes in den FSR-Blockpuffer im Uebertragungsmodus oder im Zeigermodus auf einen Satz zugreifen. Uebertragungsmodus ------------------ Im Uebertragungsmodus werden Saetze zwischen dem FSR-Blockpuffer und einem vom Nutzer definierten Satzpuffer transportiert. Der Nutzersatzpuffer ist ein beliebiger Speicherbereich im Nutzer- programm. Er kann in jedem E/A-Makroruf unterschiedlich sein, d.h. eine andere Adresse oder Laenge haben. Beim Lesen wird ein virtueller Block der Datei zuerst vom Daten- traeger in den FSR-Blockpuffer uebertragen und dann der ge- wuenschte Satz in den Nutzersatzpuffer transportiert. Beim Schreiben wird ein Satz von einem Bereich des Nutzers durch FCS 1630 in den FSR-Blockpuffer uebertragen und, wenn dieser ge- fuellt ist, der Inhalt des FSR-Blockpuffers auf den festgelegten Datentraeger ausgegeben. 25 Zeigermodus ----------- Der Zeigermodus gestattet dem Nutzer, direkt im FSR-Blockpuffer auf den Satz zuzugreifen. Die Position des jeweiligen Satzes wird in zwei Worten des FDB angegeben, die die Laenge (in Bytes) und die Adresse des gewuenschten Satzes enthalten. Diese Groessen werden im FDB-Offset F.NRBD im Ergebnis eines Satz-E/A-Makrorufes bzw. durch Aufruf der .POSRC-Routine bereitgestellt. Da die Saetze beim Zeigermodus direkt im FSR-Blockpuffer verar- beitet werden koennen, entfaellt i.a. der Transport in einen bzw. von einem Nutzersatzpuffer, wodurch Rechenzeit eingespart wird. Die Datenuebertragung in einen bzw. von einem Nutzersatzpuffer ist im Zeigermodus nur dann notwendig, wenn beim Lesen Saetze die Blockgrenzen ueberschreiten oder beim Schreiben der freie Spei- cherplatz im FSR-Blockpuffer nicht ausreicht. Wenn Grosspuffer benutzt werden, ist es teilweise auch dann nicht erforderlich, den Satz zu uebertragen, sondern nur, wenn der Satz die Puffer- grenze ueberschreitet. FCS 1630 verwendet standardmaessig den Uebertragungsmodus. Will der Nutzer den Zeigermodus verwenden, muss er im racc-Parameter des FDRC$A-, FDRC$R- oder eines Dateioeffnungsmakrorufes FD.PLC angeben. Zur Laufzeit kann durch BIC #FD.PLC,F.RACC(R0) der Uebertragungsmodus eingestellt werden, wenn zuvor im Zeiger- modus gearbeitet wurde (R0 muss die FDB-Adresse enthalten). Ausserdem kann vom Zeigermodus zum Uebertragungsmodus ohne Ver- wendung von FD.INS oder FD.BLK gewechselt werden, indem man #0 im racc-Parameter angibt. 2.4.5. Mehrfachpufferung und Grosspufferung ------------------------------------------- Durch die Unterstuetzung von mehreren Puffern fuer die Satz-E/A bietet das FCS fuer Nutzer, welche die Mehrpuffer-FCS auswaehlen, die Moeglichkeit, Daten in Erwartung von Nutzerprogrammforderun- gen in Puffer einzulesen und den Inhalt der Puffer auszuschrei- ben, waehrend das Nutzerprogramm Saetze fuer die Ausgabe aufbaut. Somit kann man die interne Verarbeitung der Daten mit Datei-E/A- Operationen ueberlappen. Bei der Anwendung der Vorauslesen-Mehrfachpufferung muss sequen- tiell auf die Datei zugegriffen werden, um aus der Mehrfachpuffe- rung den vollen Nutzen ziehen zu koennen. Fuer die Hinterher- schreiben-Mehrfachpufferung kann man jede Dateizugriffsmethode mit dem vollen Nutzen anwenden. Bei der Anwendung der Mehrfachpufferung muss man fuer die Gesamt- zahl an Blockpuffern, welche zu irgendeinem gegebenen Zeitpunkt in Nutzung sind, ausreichenden Speicherplatz in der FSR zuweisen. Der FSRSZ$-Makroruf (siehe Abschnitt 2.2.3.) wird zur Realisie- rung der Zuweisung von Speicherplatz fuer FSR-Blockpuffer verwen- det. Die Mehrfachpufferung kann unter bestimmten Umstaenden die Leistungsfaehigkeit fuer E/A-gebundene Aufgaben verbessern. 26 Betrachten wir beispielsweise eine Task, welche mit hoechster Prioritaet in einem System laeuft. Fuer eine Task dieser Art kann die Mehrfachpufferung die Ausfuehrungszeit verringern, indem eine Ueberlappung der E/A und der Taskabarbeitung gestattet wird. Wenn die Task grosse Saetze verwendet, dann ist auch die Grosspuffe- rung von Vorteil. Dies geht von der Annahme aus, dass es annehm- bar ist, mehr Taskadressraum und physischen Speicher fuer den er- hoehten Pufferraum und mehr Poolkapazitaet fuer die erhoehte Anzahl an ausstehenden E/A-Anforderungen zu nutzen. Wenn jedoch andere Tasks mit der gleichen Prioritaet laufen, wie diejenige des beschriebenen Anwendungsfalles, dann wird eine Ueberlappung der E/A und der Taskabarbeitung zwischen diesen Tasks bereits ohne die Mehrfachpufferung erreicht. In diesem Falle wuerde die Mehrfachpufferung einen groesseren Speicherbe- reich und Pool nutzen, ohne die Ausfuehrungsgeschwindigkeit zu verbessern. Wenn virtueller und physischer Adressraum verfuegbar ist, dann wuerde die Grosspufferung die Leistungsfaehigkeit ver- bessern. Die Grosspufferung verringert die Anzahl an Plattenzugriffen, indem die Mehrfachblockeingabe und -ausgabe zugelassen wird. Normalerweise werden die Plattenzugriffe fuer GET$- bw. PUT$- Operationen jeweils mit einem Sektor zu einem bestimmten Zeit- punkt ausgefuehrt. Die Anwendung von FCS-Grosspuffern gestattet es, dass man eine spezifizierte Anzahl von Sektoren in einer einzigen Operation lesen bzw. schreiben kann. Zur Nutzung von Grosspuffern muss man die Puffergroesse auswaeh- len und muss diese Puffergroesse fuer jedes Auftreten des FSRSZ$- Makros und ebenso des FDBDF$-Makros im betreffenden Programm in den Parameterlisten angeben. Man soll eine Puffergroesse waehlen, welche dem Vielfachen von 512 (dezimal) Bytes (Groesse eines Plattenblocks) entspricht. Da der durch eine Dateierweiterung zugewiesene Standard-Umfang fuenf Bloecke lautet und Platten oftmals viele 5-Block-Dateien bzw. Dateiteile enthalten, waere eine Puffergroesse von fuenf Bloecken im allgemeinen guenstig. Groessere Puffer koennen zwar die Leistungsfaehigkeit erhoehen, man muss aber beachten, dass man umfangreichen Speicherbedarf gegen Geschwindigkeit eintauscht. Man muss den Pufferplatz im betreffenden Programm reservieren. Der FSRSZ$-Makro gestattet es, dass man den gesamten benoetigten Speicherplatz reservieren kann. Es sind 512 (dezimal) Bytes fuer jede normale Plattendatei, plus der Puffergroesse anzugeben, welche man fuer jede Grosspufferdatei benutzen moechte. Beispiele: ---------- 1) Ein Programm benoetigt drei Dateien: eine Normaldatei (512-Byte-Puffer), eine Datei mit einer Grosspuffer- groesse von drei Bloecken und eine Datei mit einer Grosspuffergroesse von fuenf Bloecken. Der folgende Ruf zum FSRSZ$-Makro reserviert den Speicherplatz in ordnungsgemaesser Art und Weise: FSRSZ$ 3,<<1+3+5>*512.> 27 Fuer die Initialisierung des Blockpufferabschnitts zur Assemblerzeit, muss fuer die Datei mit dem Grosspuffer ueber 3 Plattenbloecke folgender Makro gegeben werden: FDBF$A ,<3*512.> oder FDBF$A ,1536. Fuer die Datei mit fuenf Bloecken als Grosspuffer lautet der Makroruf beim Assemblieren wie folgt: FDBF$A ,<5*512.> 2) Eine Task benoetigt 2 Plattendateien. Eine Datei mit einem 512-Bytes-Puffer und eine mit Mehrfachpufferung von 2 Puffern; folgende Makros sind dann zu notieren: FSRSZ$ 3,<<1+2>*512.> FDBF$A ,,2,FD.WBH (mit Nachschreib- operation) Fuer die 2. Datei kann der FDBF$A-Makro weggelassen werden. 2.4.6. Lesen von Saetzen fester Laenge im direkten Zugriff ---------------------------------------------------------- Zum Lesen von Saetzen von einem Datentraeger im direkten Zugriff kann der GET$R- bzw. der GET$-Makro aufgerufen werden. Die Ver- wendung des direkten Zugriffs setzt voraus, dass alle Saetze der Datei die gleiche Laenge haben. Ausserdem muss im FDB-Offset F.RACC durch den FDRC$A-, FDRC$R- oder einen Dateioeffnungsmakro- ruf FD.RAN gesetzt worden sein. Der zu lesende Satz wird durch die Angabe seiner Satznummer fest- gelegt. Im Uebertragungsmodus transportiert eine GET$R-Operation den ge- wuenschten Satz in den Nutzersatzpuffer, der durch den aktuellen Inhalt des FDB-Offsets F.URBD definiert ist. Anschliessend ent- haelt der FDB-Offset F.NRBD die Laenge (in Bytes) des gerade ge- lesenen Satzes. Befindet sich im Zeigermodus der ganze Satz im FSR-Blockpuffer, so werden die Adresse des Satzes im FDB-Offset F.NRBD+2 und seine Laenge im FDB-Offset F.NRBD eingetragen. Ist andererseits nicht der ganze Satz im FSR-Blockpuffer (d.h. der Satz geht ueber Blockgrenzen), wird der Satz stueckweise in den Nutzerpuffer transportiert. Anschliessend werden die Adresse des Nutzersatz- puffers (gleich Adresse des Satzes) im FDB-Offset F.NRBD+2 und die Laenge des Satzes im FDB-Offset F.NRBD gespeichert. Um einen bestimmten Satz im direkten Zugriff zu lesen, ist der GET$R-Makro in der folgenden Form aufzurufen: GET$R fdb,urba,urbs,lrcnm,hrcnm,err Die Bedeutung der Parameter ist der Anlage 18 zu entnehmen. Falls der urba- oder der urbs-Parameter nicht angegeben ist, ver- wendet FCS 1630 den bisherigen Inhalt der FDB-Offsets F.URBD+2 oder F.URBD. Diese Offsets koennen durch einen vorangehenden GET$R, durch einen FDRC$A-, FDRC$R- oder durch einen Dateioeff- nungsmakroruf gesetzt werden. 28 Im Zeigermodus muss nur dann ein Nutzersatzpuffer angegeben wer- den, wenn in der Datei Saetze enthalten sind, die die virtuellen Blockgrenzen ueberschreiten. Ist fuer die zu verarbeitende Datei der FDB-Offset F.RATT mit FD.BLK initialisiert (d.h. Saetze duer- fen Blockgrenzen nicht ueberschreiten), ist im Zeigermodus kein Nutzersatzpuffer erfoderlich. Sollte die Laenge des zu lesenden Satzes groesser sein als der im FDB-Offset F.URBD enthaltene Wert, wird nur die durch F.URBD be- stimmte Anzahl von Bytes in den Nutzersatzpuffer uebertragen. FCS 1630 setzt dann das C-Bit und traegt IE.RBG in den FDB-Offset F.ERR ein. Die Satznummer ist ein vorzeichenloser 31-Bit-Wert. Bis zu einer Satznummer von 65 535 (dezimal) kann diese im lrcnm-Parameter angegeben werden, der hrcnm-Parameter ist dann nicht erforder- lich. Falls hrcnm verwendet wurde (Satznummer groesser als 65 535), muss in einem nachfolgenden GET$R-Ruf fuer diesen Parameter eine 0 angegeben werden, wenn die gewuenschte Satznummer kleiner oder gleich 65 535 ist. Werden der lrcnm- oder der hrcnm-Parameter nicht angegeben, wird der aktuelle Inhalt der FDB-Offsets F.RCNM+2 oder F.RCNM als Satznummer interpretiert. Befindet sich die benoetigte Satznummer bereits im FDB, ist zweckmaessigerweise statt des GET$R-Makros der GET$-Makro zu verwenden. Der GET$-Makro hat das folgende Format: GET$ fdb,urba,urbs,err Die Parameter haben die gleiche Bedeutung wie die des GET$R- Makros. Beide Makros sind (mit Ausnahme der Angabe der Satznum- mer) identisch. FCS 1630 erhoeht nach jeder GET-Operation die Satznummer um eins. Dadurch wird bei einem nachfolgenden GET$- bzw. GET$R-Ruf ohne Angabe der Satznummer der naechstfolgende Satz der Datei gelesen, speziell nach dem Oeffnen der Datei immer der erste Satz. Beispiele: ---------- 1) GET$R #FDBADR,#SAPU,#132.,SNR Lesen eines Satzes, dessen Satznummer (kleiner als 65 536) in der Speicherzelle SNR angegeben ist, zum 132 Bytes langen Satzpuffer mit der Adresse SAPU. Der die betreffende Datei beschreibende FDB hat die Adresse FDBADR. 2) Lesen Satz 65 540 (2 hoch 16 + 4) nach SAPU1 und Satz 1000. nach SAPU2 GET$R #FDBE,#SAPU1,,#4,#1,ERR GET$R ,#SAPU2,,#1000.,#0,FEHL In den beiden GET$R-Rufen wird vorausgesetzt, dass die Groesse der Satzpuffer 1 und 2 gleich ist und im FDB steht. Die FDB- Adresse braucht im zweiten GET$R-Ruf nicht angegeben zu werden, 29 da sie durch den ersten GET$R-Ruf bereits in R0 gebracht worden ist. Der hrcnm-Parameter im zweiten GET$R-Ruf muss mit 0 angege- ben werden, da sonst - bedingt durch den vorangegangenen GET$R- Ruf - der Satz mit der Satznummer 66 536 gelesen wird. 3) Lesen Satz 5 nach SAPU 1 und Satz 6 nach SAPU 2 GET$R #FDBEIN,#SAPU1,,#5,,ERR GET$ ,#SAPU2,,ERR+2 Fuer das Lesen des Satzes 6 kann der GET$-Makro verwendet werden, da durch den vorangehenden GET$R-Ruf die Satznummer im FDB um eins erhoeht wurde. 2.4.7. Lesen von Saetzen im sequentiellen Zugriff ------------------------------------------------- Um Saetze im sequentiellen Zugriff zu lesen, koennen der GET$S- und der GET$-Makro verwendet werden. Beide Makros verfuegen ueber dieselben Parameter und sind in der folgenden Form aufzurufen: GET$S fdb,urba,urbs,err bzw. GET$ fdb,urba,urbs,err Die Bedeutung der Parameter ist der Anlage 18 zu entnehmen. Die Anwendung des sequentiellen Zugriffs setzt voraus, dass im FDB-Offset F.RACC nicht FD.RAN gesetzt ist. Fuer den Ablauf der GET$S- bzw. der sequentiellen GET$-Operation im Uebertragungs- oder Zeigermodus gilt das im Abschnitt 2.4.6. Gesagte. Vom ersten GET$S- bzw. GET$-Ruf nach dem Oeffnen der Datei wird der erste Satz der Datei gelesen. Jede GET$S- bzw. GET$-Operation setzt die entsprechenden Offsets im FDB so, dass ein nachfolgender GET$- bzw. GET$S-Makroruf den naechsten Satz der Datei liest. Nach dem Lesen des Satzes steht seine Laenge im FDB-Offset F.NRBD. War der gelesene Satz vom Typ R.SEQ, wird die Folgenummer sowohl beim Uebertragungsmodus als auch beim Zeigermodus im FDB-Offset F.SEQN eingetragen. Wurde der letzte Satz der Datei gelesen, wird durch einen nach- folgenden GET$S- bzw. sequentiellen GET$-Ruf das C-Bit gesetzt und IE.EOF in den FDB-Offset F.ERR eingetragen. Wenn die Laenge des zu lesenden Satzes groesser als die Laenge des Nutzersatzpuffers ist (Offset F.URBD), wird nur die in F.URBD stehende Anzahl von Bytes in den Nutzersatzpuffer uebertragen. FCS 1630 setzt dann das C-Bit und traegt IE.RBG in den FDB-Offset F.ERR ein. Eine nachfolgende GET$S- bzw. sequentielle GET$- Operation beginnt am Anfang des naechsten Satzes zu lesen. Der GET$S-Makro benoetigt weniger Speicherplatz als der GET$- Makro. 30 Der GET$S-Makro wird fuer die Arbeit mit Ueberlagerungsstruktur empfohlen, bei der die Speicherkapazitaet fuer das Programm be- grenzt ist und Dateien nur im sequentiellen Zugriff gelesen werden. Wird im Programm bereits der GET$R- bzw. GET$-Makro im direkten Zugriff verwendet, sollte fuer den sequentiellen Zugriff GET$ verwendet werden. In diesem Fall wuerde die Verwendung von GET$S zusaetzlichen Speicherplatz erfordern. Wenn sowohl GET$S als auch PUT$S in einem Programm mit Ueberla- gerungsstruktur verwendet werden, kann Speicherplatz gespart werden, wenn PUT$S und GET$S in verschiedenen Segmenten der Ueberlagerungsstruktur enthalten sind. Beispiele: ---------- 1) GET$S #FDBEIN Fuer das Lesen im sequentiellen Zugriff wird der FDB mit der Adresse FDBEIN verwendet, der die aktuelle Satzposition enthaelt. Falls ein Nutzersatzpuffer erforderlich ist, muessen die Adresse und die Laenge im FDB enthalten sein. Ein Sprung zu einer Fehler- routine des Nutzers erfolgt nicht, da der entsprechende Parameter nicht angegeben ist. 2) GET$ R3,,,FEHROU Es wird vorausgesetzt, dass das Register R3 die aktuelle FDB- Adresse enthaelt. FEHROU ist die Adresse einer Fehlerroutine des Anwenders. Ein Nutzersatzpuffer wird nicht benoetigt, bzw. seine Adresse und seine Laenge sind bereits im FDB. 3) Lesen des ersten Satzes einer Datei zum 132. Byte langen Satz- puffer mit der symbolischen Adresse SAPU: OPEN$R #FDBEIN,,,,#SAPU,#132.,ERR GET$S ,,,ERR+6 Es ist nicht noetig, in GET$S die Adresse des FDB zu definieren, da sie durch OPEN$R bereits in R0 gebracht wurde. Die Adresse und die Laenge des Nutzersatzpuffers brauchen ebenfalls nicht angege- ben zu werden, da sie bereits durch den OPEN$R-Ruf in den FDB ge- bracht wurden. 31 2.4.8. Schreiben von Saetzen fester Laenge im direkten Zugriff -------------------------------------------------------------- Zum Schreiben von Saetzen auf einen Datentraeger im direkten Zugriff kann der PUT$R- bzw. PUT$-Makro aufgerufen werden. Die Verwendung des direkten Zugriffs setzt voraus, dass alle Saetze in der Datei die gleiche Laenge haben. Ausserdem ist es fuer den direkten Zugriff notwendig, dass im FDB-Offset F.RACC durch den FDRC$A-, FDRC$R- oder einen Dateioeffnungsmakroruf FD.RAN gesetzt worden ist. Durch die Angabe der Satznummer wird festgelegt, wohin (an welche Stelle der Datei) der Satz geschrieben wird. Bei Anwendung des Uebertragungsmodus wird der Satz in einem Satz- puffer (in einem beliebigen Bereich des Nutzerprogramms) gebildet bzw. er befindet sich dort. PUT$R im Uebertragungsmodus transportiert den Satz, dessen Adres- se bzw. Laenge in den Offsets F.NRBD+2 bzw. F.NRBD steht, in den FSR-Blockpuffer. Im Zeigermodus muss der Satz auf dem Bereich gebildet werden, der durch die im FDB-Offset F.NRBD+2 angegebene Adresse bestimmt ist. Wenn dann der gebildete Satz nicht bereits im FSR-Blockpuffer ist (er wurde im Satzpuffer gebildet), wird er waehrend der PUT$- Operation dorthin transportiert. Der direkte Zugriff im Zeigermodus erfordert folgende Schritte: 1) Eintragen der FDB-Adresse ins Register R0 2) Eintragen der gewuenschten Satznummer in die FDB-Offsets F.RCNM+2 und F.RCNM des entsprechenden FDB 3) Aufrufen der .POSRC-Routine (durch CALL .POSRC wird der FDB- Offset F.NRBD+2 neu gesetzt) Die .POSRC-Routine verwendet den Inhalt des FDB-Offsets F.RSIZ als Satzlaenge. 4) Bilden des zu schreibenden Satzes auf dem Bereich, dessen Adresse im FDB-Offset F.NRBD+2 angegeben ist 5) Aufruf des PUT$-Makros Koennen die Saetze die Blockgrenzen ueberschreiten, so muss im Zeigermodus ein Nutzersatzpuffer bereitgestellt werden. Die FDB- Offsets F.URBD+2 bzw. F.URBD muessen dann die Adresse bzw. die Laenge des Nutzersatzpuffers enthalten. Das Setzen dieser FDB- Offsets kann durch den urba- bzw. urbs-Parameter des FDRC$A-, FDRC$R- oder eines Dateioeffnungsmakros erfolgen. Die Makros zum Schreiben von Saetzen im direkten Zugriff haben folgendes Format: PUT$R fdb,nrba,nrbs,lrcnm,hrcnm,err bzw. PUT$ fdb,nrba,nrbs,err Die Bedeutung der Parameter ist der Anlage 18 zu entnehmen. Sind der nrba- oder nrbs-Parameter nicht angegeben, verwendet FCS 1630 den aktuellen Inhalt der FDB-Offsets F.NRBD+2 oder F.NRBD. Diese Offsets werden durch den nrba- bzw. nrbs-Parameter des PUT$R- bzw. PUT$-Rufes gesetzt. 32 Wenn die Datei aus Saetzen fester Laenge besteht, wird durch einen Makroruf zum Oeffnen der Datei die Satzlaenge in den FDB- Offset F.NRBD eingetragen. Deshalb braucht in keinem fuer diese Datei verwendeten PUT$R- bzw. PUT$-Ruf die Satzlaenge als nrbs- Parameter angegeben werden. Der nrba-Parameter muss i.a. in jedem PUT$R- bzw. PUT$-Ruf ange- geben werden. Nur wenn die zu schreibenden Saetze alle auf dem gleichen Bereich gebildet werden, reicht es aus, den nrba-Parame- ter nur im ersten PUT$R- bzw. PUT$-Ruf anzugeben. Fuer die Angabe der Satznummer in den Parametern lrcnm und hrcnm gilt das im Abschnitt 2.4.6. Gesagte. Sind der lrcnm- oder der hrcnm-Parameter nicht angegeben, verwen- det FCS 1630 den aktuellen Inhalt der FDB-Offsets F.RCNM+2 und F.RCNM als Satznummer. Nach jeder PUT$R- bzw. PUT$-Operation wird der Inhalt dieser Zellen um eins erhoeht. Sollen beide Parameter nicht angegeben werden, verwendet man zweckmaessigerweise den PUT$-Makro. Beide Makros sind (mit Ausnahme der Angabe der Satz- nummer) identisch. Ein PUT$- bzw. ein PUT$R-Makroruf ohne Angabe der Satznummer im direkten Zugriff schreibt nach dem Oeffnen der Datei zum Anfuegen (z.B. OPEN$A) den ersten Satz der Datei. Beispiele: ---------- 1) PUT$R #FDBAUS,#NSA,,R4 NSA ist die Adresse des zu schreibenden Satzes. Die Laenge des zu schreibenden Satzes braucht nicht angegeben werden, da es sich um Saetze fester Laenge handelt. Register R4 enthaelt die Satznum- mer. 2) Schreiben des Satzes 220. im Zeigermodus in eine Datei, deren FDB die Adresse FDBAD hat. OPEN$M #FDBAD,,,#FD.RAN!FD.PLC,,,ERR MOV #220.,F.RCNM+2(R0) CLR F.RCNM(R0) CALL .POSRC MOVB ZEI1,@F.NRBD+2(R0) ; BILDEN DES SATZES PUT$ ,,,ERR+2 3) Der 14. Satz einer Datei mit Saetzen der Laenge 150 Bytes soll aktualisiert werden, und zwar sollen die ersten 10 Bytes des Satzes 14 durch die ersten 10 Bytes des Satzes 23 ueberschrieben werden. OPEN$M #FDK1,,,,,,ERROR GET$R ,#SAPU,#150.,#23.,,ERROR PUT$R ,#SAPU,#10.,#14.,,ERROR CLOSE$ ,ERROR FDK1 ist die FDB-Adresse, SAPU die Adresse eines Nutzersatzpuf- fers und ERROR die Adresse einer Fehlerroutine. 33 2.4.9. Schreiben von Saetzen im sequentiellen Zugriff ----------------------------------------------------- Um Saetze im sequentiellen Zugriff zu schreiben, koennen der PUT$S- und der PUT$-Makro verwendet werden. Beide Makros verfuegen ueber dieselben Parameter und sind in der folgenden Form aufzurufen: PUT$S fdb,nrba,nrbs,err bzw. PUT$ fdb,nrba,nrbs,err Die Bedeutung der Parameter ist der Anlage 18 zu entnehmen. Ein PUT$S- bzw. PUT$-Makroruf nach einem Dateioeffnungsmakroruf schreibt den ersten Satz der Datei. Jede PUT$S- bzw. PUT$-Operation setzt den FDB so, dass ein nach- folgender PUT$S- bzw. PUT$-Makroruf den naechsten Satz der Datei schreibt. Beim Schreiben von Saetzen unterscheiden sich Zeigermodus und Uebertragungsmodus in der Bildung des zu schreibenden Satzes. Im Uebertragungsmodus wird der Satz in einem beliebigen Bereich des Nutzers (Nutzersatzpuffer) gebildet (bzw. er befindet sich dort) und die Adresse im nrba- und i.a. die Satzlaenge im nrbs- Parameter angegeben. Der nrba-Parameter muss i.a. in jedem PUT$S- bzw. PUT$-Ruf angegeben werden. Nur wenn die zu schreibenden Saetze alle auf dem gleichen Bereich gebildet werden, reicht es aus, den nrba-Parameter nur im ersten PUT$S- bzw. PUT$-Ruf an- zugeben. Im Zeigermodus muss der Satz auf dem Bereich gebildet werden, der durch die im FDB-Offset F.NRBD+2 angegebene Adresse bestimmt ist, und nur die Satzlaenge wird i.a. im nrbs-Parameter angegeben. Die Angabe der Satzlaenge entfaellt beim Schreiben von Saetzen fester Laenge. Sollen variabel lange Saetze in die Datei geschrieben werden, muss in jedem fuer die Datei verwendeten PUT$S- bzw. PUT$-Makro- ruf die Satzlaenge als nrbs-Parameter angegeben werden. Ist der zu schreibende Satz vom Typ R.SEQ, muss der Nutzer die gewuensch- te Folgenummer in den FDB-Offset F.SEQN eintragen. Koennen die Saetze Blockgrenzen ueberschreiten, so muss im Zei- germodus ein Nutzersatzpuffer bereitgestellt werden. Die FDB- Offsets F.URBD+2 und F.URBD muessen dann die Adresse bzw. die Laenge des Nutzersatzpuffers enthalten. Das Setzen dieser FDB- Offsets kann durch den urba- bzw. urbs-Parameter des FDRC$A-, FDRC$R- oder eines Dateioeffnungsmakros erfolgen. Wenn Saetze variabler Laenge im Zeigermodus verarbeitet werden, muss die Groesse des eventuell erforderlichen Nutzersatzpuffers entsprechend dem groesstmoeglichen Satz definiert werden. Wenn ein Satz dieser definierten Laenge nicht in den im FSR-Blockpuf- fer verbleibenden Speicherplatz passt, wird der Satz im Nutzer- satzpuffer gebildet. Wenn die zu verarbeitenden Saetze variabler Laenge kuerzer als die groesste definierte Satzlaenge sind, kann es passieren, dass FCS 1630 unnoetigerweise im Zeigermodus Saetze vom Nutzersatzpuf- fer in den FSR-Blockpuffer transportieren muss. Wenn beispiels- weise der Satzpuffer 80 Bytes lang ist und im FSR-Blockpuffer 34 noch 70 Bytes freier Platz vorhanden sind, wird bei einer PUT$- Operation im Zeigermodus der Satz im Nutzersatzpuffer gebildet, auch wenn er nur 30 Bytes lang ist. Der FDB-Offset F.URBD bestimmt im Zeigermodus immer die Groesse des laengsten Satzes, der im Falle der Ueberschreitung der vir- tuellen Blockgrenzen in eine Datei geschrieben werden kann. Eine PUT$S- bzw. eine sequentielle PUT$-Operation im Uebertragungsmo- dus oder Zeigermodus verwendet die Information in den FDB-Offsets F.NRBD+2 und F.NRBD, um zu bestimmen, ob der Satz in den FSR- Blockpuffer transportiert werden muss. Im Uebertragungsmodus muss der Satz natuerlich immer transportiert werden, im Zeigermodus nur in den oben beschriebenen Faellen (der Satz wurde im Nutzer- satzpuffer gebildet). Reicht der zur Verfuegung stehende freie Speicherplatz im FSR- Blockpuffer zur Uebertragung des Satzes nicht aus, wird eine der beiden folgenden Operationen ausgefuehrt: 1) Wenn die Saetze Blockgrenzen ueberschreiten duerfen, wird der erste Teil des Satzes in den FSR-Blockpuffer gebracht, wobei ein virtueller Block vervollstaendigt wird. Dieser virtuelle Block wird dann auf das periphere Geraet geschrieben, und der restliche Teil des Satzes wird an den Anfang des FSR-Block- puffers gebracht. Ist Mehrfachpufferung vereinbart, tritt dieser Fall nur am Ende der Puffer auf, nicht am Ende jedes Blockpuffers. 2) Wenn die Saetze Blockgrenzen nicht ueberschreiten duerfen (da das Satzattribut FD.BLK spezifiziert ist), wird der FSR-Block- puffer - so wie er gerade ist - auf das periphere Geraet ge- schrieben und der ganze Satz wird auf den Anfang des FSR- Blockpuffers transportiert. Soll eine PUT$S- bzw. eine sequentielle PUT$-Operation innerhalb einer Datei durchgefuehrt werden (z.B. Aktualisierung eines Sat- zes, siehe Abschnitt 2.4.10.), so ist im racc-Parameter des FDRC$A-, FDRC$R- bzw. eines Dateioeffnungsmakros FD.INS anzuge- ben. Wird FD.INS nicht angegeben, verkuerzt die PUT$S- bzw. die sequentielle PUT$-Operation die Datei, d.h. sie setzt das logi- sche Ende der Datei (EOF) nach dem eingefuegten Satz. Unabhaengig von der Angabe von FD.INS wird das logische Ende der Datei nach dem eingefuegten Satz gesetzt, wenn der Satz ueber das aktuelle logische Ende der Datei hinausgeht. Der PUT$S-Makro benoetigt weniger Speicherplatz als der PUT$- Makro. Der PUT$S-Makro wird speziell fuer die Arbeit mit Ueberlagerungs- struktur empfohlen, wenn der Speicherplatz fuer das Programm be- grenzt ist und Daten nur im sequentiellen Zugriff geschrieben werden sollen. Wird im Programm bereits der PUT$R- oder PUT$-Makro fuer den direkten Zugriff verwendet, sollte fuer den sequentiellen Zugriff PUT$ verwendet werden. In diesem Fall wuerde die Verwendung von PUT$S zusaetzlichen Speicherplatz erfordern. Wenn sowohl PUT$S als auch GET$S in einem Programm mit Ueberlagerungsstruktur ver- wendet werden, kann Speicherplatz gespart werden, wenn GET$S und PUT$S in verschiedenen Segmenten enthalten sind. 35 Beispiele: ---------- 1) PUT$S #FDBAUS,,,FEHROU Da der nrba- und der nrbs-Parameter nicht angegeben sind, werden die aktuellen Werte der FDB-Offsets F.NRBD+2 und F.NRBD des FDB mit der Adresse FDBAUS benutzt. Falls ein E/A-Fehler auftritt, erfolgt ein Sprung zur Nutzer-Fehlerroutine mit der Adresse FEHROU. 2) Die Datei TEST.DAT;2 auf Platte DK1 im Nutzerdateiverzeichnis 200305.DIR soll auf LP0 ausgegeben werden. Die Saetze der Datei sind nicht laenger als 132 Bytes. FSRSZ$ 2,644. ;512.(PLATTE)+132.(LP) ; FDBLP: FDBDF$ ;FDB FUER LINEPRINTER FDAT$A R.VAR,FD.CR FDOP$A 6,DDLP DDLP: .WORD 3,DEVLP,0,0,0,0 DEVLP: .ASCII /LP0/ ; FDBDK: FDBDF$ ;FDB FUER DATEI AUF PLATTE FDOP$A 2,DDDK DDDK: .WORD 3,DEV,9.,UIC,10.,FILE DEV: .ASCII /DK1/ UIC: .ASCII /[200,305]/ FILE: .ASCII /TEST.DAT;2/ : URB: .BLKB 132. ;NUTZERSATZPUFFER : ... START: : MOV #FDBDK,R4 OPEN$R R4,,,#FD.PLC,#URB,#132.,FR ;ZEIGERMODUS MOV #FDBLP,R5 OPEN$W R5,,,,,,FR ;UEBERTRAGUNGSMODUS GET: GET$ R4 ;LESEN SATZ BCS CHEOF PUT$ R5,F.NRBD+2(R4),F.NRBD(R4),FR ;SCHREIBEN SATZ AUF LP: BR GET CHEOF: CMPB #IE.EOF,F.ERR(R0) ;TEST DATEIENDE BEQ ENDE JSR PC,FR : ENDE: ... ;PROGRAMM ENDE : FR: ... ;FEHLERROUTINE 36 2.4.10. Retten und Einstellen von Satzpositionen einer Datei ------------------------------------------------------------ Um bei der Aktualisierung von Dateien im sequentiellen Zugriff ein mehrmaliges Lesen der Saetze zu vermeiden, ist der Aufruf von Routinen moeglich, die die aktuelle Satzposition einer Datei (virtuelle Blocknummer, Bytenummer innerhalb des virtuellen Blok- kes) retten und wieder einstellen. Beim Einstellen der Satzposition (Positionieren) werden Offsets im FDB so gesetzt, dass ein sequentieller E/A-Makroruf auf den durch die Satzposition gegebenen Satz zugreift. Die Positionie- rung einer Datei auf einen bestimmten Satz ist auch erforderlich beim Schreiben von Saetzen fester Laenge im direkten Zugriff bei Verwendung des Zeigermodus (siehe Abschnitt 2.4.8.). Zum Retten der Satzposition einer Datei wird die .MARK-Routine verwendet. Fuer das Positionieren einer Datei stehen die .POINT- und die .POSRC-Routine bereit. Mit der .POSIT-Routine kann die Satzposition eines Satzes fester Laenge berechnet werden. Bei fehlerhaftem Ausgang setzen die .POINT-, die .POSRC und die .POSIT-Routine das C-Bit und tragen den Fehlercode in F.ERR ein. Durch die .MARK-Routine erfolgt keine Fehlermeldung. Erfordert die Aktualisierung eines Satzes das Lesen eines anderen Satzes der Datei, rettet man die Position des zu aktualisierenden Satzes mit der .MARK-Routine. Nachdem die notwendigen Informatio- nen gelesen wurden, kann die Datei mit der .POINT-Routine auf den zu aktualisierenden Satz eingestellt werden. Mit Hilfe der .MARK-Routine und der .POINT-Routine laesst sich ein direkter Zugriff zu ausgewaehlten Saetzen durchfuehren. Dazu muessen beim Erstellen der Datei bzw. beim Lesen einer existie- renden Datei die Satzpositionen mit der .MARK-Routine gerettet werden. Nach einem erneuten Oeffnen der Datei kann die gewuensch- te Satzposition in die Register R1, R2, R3 gebracht werden, und durch CALL .POINT wird die Datei auf den gewuenschten Satz posi- tioniert. (Beispielsweise koennten die Satzpositionen zusammen- haengend als 1. Satz der Datei abgespeichert werden). Retten der Satzposition einer Datei ----------------------------------- Die .MARK-Routine wird aufgerufen, um die gegenwaertige Position einer Datei fuer eine spaetere Verwendung (z.B. Anwendung der .POINT-Routine) abzuspeichern. Um die Position eines Satzes zu retten, muss die .MARK-Routine vor dem Lesen bzw. Schreiben dieses Satzes durch CALL .MARK auf- gerufen werden. Vor dem Aufruf der Routine muss im Register R0 die Adresse des FDB der gewuenschten Datei stehen. Nach dem Aufruf ist die Satzposition in folgenden Registern ent- halten: R1: die 15 hoeherwertigen Bits der virtuellen Blocknummer R2: die 16 niederwertigen Bits der virtuellen Blocknummer R3: Nummer des naechsten Bytes im virtuellen Block (bzw. des ersten Bytes des naechsten Satzes) Das Register R0 bleibt erhalten, die Register R4 und R5 werden nicht benutzt. Hinweis: Die virtuelle Blocknummer ist ein vorzeichenloser 31-Bit-Wert. Das erste Byte eines virtuellen Blocks hat die Nummer 0. 37 Positionieren einer Datei auf ein angegebenes Byte -------------------------------------------------- Die .POINT-Routine wird aufgerufen, um eine Datei auf ein angege- benes Byte in einem angegebenen virtuellen Block zu positionie- ren. Im Zeigermodus aktualisiert die .POINT-Routine auch den FDB- Offset F.NRBD+2. Sie kann deshalb zur Vorbereitung einer PUT$- Operation im Zeigermodus verwendet werden. Vor dem Aufruf der Routine durch CALL .POINT muessen die Register R0 bis R3 wie folgt gesetzt werden: R0: Adresse des FDB der gewuenschten Datei R1: hoeherwertige Bits der virtuellen Blocknummer R2: niederwertige Bits der virtuellen Blocknummer R3: gewuenschte Bytenummer im angegebenen virtuellen Block Nach Aufruf der Routine sind die entsprechenden Offsets im FDB gesetzt. Das Register R0 bleibt erhalten, die Register R1 bis R5 werden gerettet. Positionieren einer Datei auf einen angegebenen Satz ---------------------------------------------------- Die .POSRC-Routine wird aufgerufen, um eine Datei auf einen durch seine Satznummer angegebenen Satz fester Laenge zu positionieren. Die .POSRC-Routine wird zur Aktualisierung des FDB-Offsets F.NRBD+2 (Adresse zum Bilden des Satzes) fuer den direkten Zu- griff mit PUT$ im Zeigermodus verwendet. Vor dem Aufruf der Routine muss im Register R0 die Adresse des FDB der gewuenschten Datei stehen. Der Nutzer muss die Satznummer in die FDB-Offsets F.RCNM+2 (niederwertiger Teil) und F.RCNM (hoeherwertiger Teil) eintragen. Nach Aufruf der Routine sind die entsprechenden Offsets im FDB gesetzt. Das Register R0 bleibt erhalten, die Register R1 bis R5 werden gerettet. Fuer die Arbeit der Routine ist es nicht notwendig, FD.RAN zu setzen. Berechnen der Satzposition eines angegebenen Satzes --------------------------------------------------- Die .POSIT-Routine wird aufgerufen, um die virtuelle Blocknummer und die Bytenummer zu berechnen, die den Anfang eines Satzes vom Typ R.FIX bestimmen. Der Satz ist dabei durch seine Satznummer gegeben. Waehrend die .POSRC-Routine die Datei auf den angegebenen Satz positioniert, berechnet die .POSIT-Routine nur die Position des Satzes, so dass spaeter durch die .POINT-Routine die Datei auf den gewuenschten Satz positioniert werden kann. Vor dem Aufruf der Routine muss im Register R0 die Adresse des FDB der gewuenschten Datei stehen. Der Nutzer muss die Satznummer in die FDB-Offsets F.RCNM+2 (nie- derwertiger Teil) und F.RCNM (hoeherwertiger Teil) eintragen. Nach dem Aufruf der Routine ist die Satzposition in folgenden Registern enthalten: R1: hoeherwertige Bits der virtuellen Blocknummer R2: niederwertige Bits der virtuellen Blocknummer R3: Nummer des ersten Byte des angegebenen Satzes Das Register R0 bleibt erhalten, die Register R4 und R5 werden gerettet. 38 Beispiele --------- 1) Der 11. Satz einer Datei mit Saetzen variabler Laenge (max. 100 Bytes) soll aktualisiert werden, und zwar sollen das erste Byte des Satzes durch das KOI-7-Zeichen "A" und das letzte Byte durch das KOI-7-Zeichen "Z" ersetzt werden. : URB: .BLKB 100. : FDK: FDBDF$ : OPEN$M #FDK,,,#FD.PLC!FD.INS,#URB,#100.,E; ZEIGERM.,INSERT MOV #10.,R5 ;SATZZAEHLER LAB: GET$ ,,,E ;LESEN SATZ 1-10 DEC R5 BGT LAB CALL .MARK ;RETTEN POSITION VON SATZ 11 GET$ ,,,E ;LESEN SATZ 11 MOV F.NRBD+2(R0),R5 ;R5:= ADRESSE SATZ 11 MOV F.NRBD(R0),R4 ;R4:= LAENGE SATZ 11 MOVB #101,@R5 ;A---> ANFANG DES SATZES ADD R4,R5 MOVB #132,-1(R5) ;Z---> ENDE DES SATZES CALL .POINT ;POSITIONIEREN DATEI AUF SATZ 11 BCC OK JSR PC,E OK: PUT$ ,,R4,E ;SCHREIBEN NEUEN SATZ 11 CLOSE$ ,E : E: ... ;FEHLER-ROUTINE : 2) Der 14. Satz einer Datei mit Saetzen variabler Laenge soll aktua- lisiert werden, und zwar sollen die ersten 10 Bytes des Satzes 14 mit den ersten 10 Bytes des Satzes 23 ueberschrieben werden. Die Saetze ueberschreiten die Blockgrenzen nicht. Der laengste Satz ist 100 Bytes lang. : FDK: FDBDF$ : URB: .BLKB 100. : OPEN$M #FDK,,,#FD.PLC,,,E ;ZEIGERMODUS MOV #13.,R5 ;SATZZAEHLER LAB1: GET$ ,,,E ;LESEN SATZ 1-13 DEC R5 BGT LAB1 CALL .MARK ;RETTEN POSITION VON SATZ 14 MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) FDRC$R ,#0,#URB,#100. ;UEBERTRAGUNGSMODUS GET$ ,,,E ;LESEN SATZ 14 MOV F.NRBD(R0),R4 ;R4:= SATZLAENGE 39 FDRC$R ,#FD.PLC ;ZEIGERMODUS MOV #9.,R5 ;SATZZAEHLER LAB2: GET$ ,,,E ;LESEN SATZ 15-23 DEC R5 BGT LAB2 MOV #10.,R3 ;BYTEZAEHLER MOV #URB,R2 ;R2:= ADRESSE SATZPUFFER MOV F.NRBD+2(R0),R1 ;R1:= ADRESSE SATZ 23 LAB3: MOVB (R1)+,(R2)+ ;UEBERTRAGEN 10 BYTES DEC R3 BGT LAB3 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 CALL .POINT ;POSITIONIEREN DATEI AUF SATZ 14 BCC OK JSR PC,E OK: FDRC$R ,#FD.INS ;UEBERTRAGUNGSMODUS ,INSERT PUT$ ,#URB,R4,E ;SCHREIBEN NEUEN SATZ 14 CLOSE$ ,E : E: ... ;FEHLER-ROUTINE : 3) Eine Datei mit Saetzen fester Laenge (150 Bytes) soll im Zeiger- modus aktualisiert werden, und zwar sollen die Bytes 3 bis 22 der Saetze 5 bis 15 und des Satzes 25 durch das KOI-7-Zeichen "SPACE" ersetzt werden. : URB: .BLKB 150. : FDK: FDBDF$ : OPEN$M #FDK,,,#FD.PLC!FD.RAN,#URB,#150.,ERR; ZEIGERM. MOV #10.,R3 ; SATZZAEHLER MOV #5,F.RCNM+2(R0) ; SATZ 5 MOV #0,F.RCNM(R0) M1: CALL .POSRC ; POSITIONIEREN DATEI BCC M2 JSR PC,ERR M2: MOV #20.,R5 ; BYTEZAEHLER MOV F.NRBD+2(R0),R4 ; R4:=ADRESSE SATZ CMPB (R4)+,(R4)+ ; R4:=R4+2 M3: MOVB #40,(R4)+ ; SPACE ---> SATZ IM FSR1 DEC R5 BNE M3 PUT$ ,,,ERR ; SCHREIBEN NEUEN SATZ DEC R3 BGT M2 BLT M4 MOV #25.,F.RCNM+2(R0) ; SATZ 25 BR M1 M4: CLOSE$ ,ERR : ERR: ... ; FEHLERROUTINE : 40 2.5. Block-Ein-/Ausgabe ----------------------- 2.5.1. Beschreibung der Block-Ein-/Ausgabe ------------------------------------------ FCS ermoeglicht die Verarbeitung von Dateien im Blockmodus auf blockorientierten Geraeten. Mittels READ$ und WRITE$-Makro kann der Nutzer virtuelle Bloecke ohne Bezug auf die Saetze innerhalb der Datei von und zu Dateien uebertragen. Dabei kann gezielt auf den zu verarbeitenden Block zugegriffen werden. Realisiert wird dies durch die Angabe der virtuellen Blocknummer. Die Block E/A- Operationen bieten ein effekives Mittel zur Verarbeitung von Dateien, da Operationen dieser Art kein Blocken und Entblocken von Saetzen innerhalb der Datei einschliessen. Jede Datei wird unabhaengig von ihrer logischen Struktur in virtuelle Datenbloek- ke (bei Platte 512. Bytes) eingeteilt. FCS greift bei der Block- Ein-/Ausgabe immer auf virtuelle Bloecke zu. Jeder zu bearbeiten- de Block muss an einer virtuellen Blockgrenze beginnen. Ein Zu- griff innerhalb des virtuellen Blockes ist nicht moeglich. Die virtuelle Blocknummer wird im READ$-(WRITE$)-Makro oder im FDBK$R-Makro nach dem Oeffnen der Datei spezifiziert. Falls die virtuelle Blocknummer nicht angegeben ist, greift FCS sequentiell zu, beginnend bei dem virtuellen Block 1 nach dem Oeffnen der Datei. FCS uebertraegt den virtuellen Block zwischen Datentraeger und einem im Nutzerprogramm definierten Blockpuffer des Nutzers. Der FSR-Blockpuffer wird bei der Block-E/A nicht benutzt. Der Verlauf der Block-E/A zum Programmablauf ist asynchron. Die Steu- erung wird an die Task zurueckgegeben, sobald die E/A-Anforderung in die Warteschlange eingereiht ist, d.h. die E/A-Operation ist bei der Rueckkehr zur Task noch nicht abgeschlossen. Der Nutzer ist fuer die Synchronisation verantwortlich. FCS bietet ihm da- fuer verschiedene Moeglichkeiten. Im FDBK$A bzw. FDBK$R oder READ$-(WRITE$)-Makro kann ein Ereignisflag angegeben werden. Dieses Ereignisflag gibt Auskunft ueber den Zustand der E/A- Operation. FCS loescht das Ereignisflag, sobald die E/A-Anforde- rung in die Warteschlange eingereiht ist und setzt es, wenn die E/A-Operation abgeschlossen ist. Zur Arbeit mit diesen Ereignis- flags stehen dem Anwender die ereignisbezogenen Exekutive-Anwei- sungen zur Verfuegung (siehe Anleitung fuer den Programmierer, Teil 2:" Steuerprogrammsystem (Exekutive) OMEX 1630"). Zum FCS gehoert der WAIT$-Makro, der die Task solange blockiert, bis die angeforderte Block-E/A beendet ist. Durch die Angabe des bkdn-Parameters im READ$-(WRITE$)-Makro oder im FDBK$A bzw. FDBK$R-Makro wird der Offset F.BKDN mit der Adres- se der AST-Routine belegt. Die AST-Routine muss von dem Nutzer selbst programmiert werden. Durch das Auftreten des AST wird die Task informiert, dass die E/A-Operation beendet ist, und die Steuerung wird an die AST-Routine uebergeben. Nach Beenden der AST-Routine wird die Task an der unterbrochenen Stelle fortge- setzt. Um zusaetzliche Informationen ueber den Ablauf der E/A-Operation zu erhalten, wird die Benutzung des E/A-Statusblockes empfohlen. Der Statusblock ist ein 2 Worte-Block, der im Anwenderprogramm definiert werden muss. Die Adresse des E/A-Statusblockes wird dem FDB durch Belegung des bkst-Parameters uebergeben. Er gibt neben geraeteabhaengigen Informationen Auskunft ueber den Status der E/A-Operation. Das zweite Wort des E/A-Statusblockes enthaelt die 41 Anzahl der waehrend einer READ$-/WRITE$-Operation uebertragenen Bytes. Im niederwertigen Byte des ersten Wortes wird der Endsta- tus der READ$-/WRITE$-Operation verschluesselt. Ein negativer Wert weist auf einen E/A-Fehler. Ist der E/A-Statusblock nicht angegeben, gehen diese Informationen verloren. Der Statusblock ist nur fuer die Block-E/A verwendbar. 2.5.2. Lesen eines virtuellen Blockes (READ$) --------------------------------------------- Der READ$-Makro wird aufgerufen, um einen Datenblock von einem blockorientierten Geraet zu lesen. Die Groesse des zu lesenden Blockes wird durch den bkds-Parameter spezifiziert. Guenstig ist, wenn diese der virtuellen Blockgroesse entspricht. Ist der zu lesende Block kuerzer als der virtuelle Block, so uebertraegt FCS die angegebene Bytezahl, beginnend vom Anfang des virtuellen Blockes. Ein Zugriff innerhalb des virtuellen Blockes ist nicht moeglich. Ist der zu lesende Block > 512. Bytes, so berechnet FCS, wieviel virtuelle Bloecke notwendig sind, um den Block zu uebertragen. Die virtuelle Blocknummer im FDB-Offset F.BKVB wird dann nach der READ-Operation entsprechend erhoeht. Ansonsten wird die virtuelle Blocknummer nach jedem READ$ um 1 von FCS erhoeht. FCS prueft vor jedem READ$ die angegebene virtuelle Blocknummer in F.BKVB, um zu sichern, dass diese nicht auf einen Block nach dem Dateiende verweist. Wird auf einen Block nach Dateiende zuge- griffen, wird eine Fehlermitteilung im E/A-Statusblock und den Offset F.ERR des entsprechenden FDB eingetragen und kein Block gelesen. Wird eine READ$-Operation ausgefuehrt, so steht der gelesene Block nach Beenden der Block-E/A in dem vom Nutzer definierten Blockpuffer. Die Blockpuffergroesse muss entsprechend der Groesse des zu lesenden Blockes definiert werden. Um zusaetzliche Informationen ueber den Verlauf der READ$-Opera- tion zu erhalten, gibt es den Statusblock. Er sollte nach jedem READ$ ausgewertet werden, um Fehler, die nicht in F.ERR einge- tragen sind, zu erkennen. Es ist z.B. moeglich, dass der Task das Ende der READ$-Operation durch das Setzen des Ereignisflags mit- geteilt wird, aber die geforderte Byteanzahl nicht gelesen wurde. Dieser Fehler ist nur durch Vergleich des bkds-Parameters mit dem zweiten Wort des E/A-Statusblockes, der die Anzahl der gelesenen Bytes enthaelt, zu erkennen. Der Statusblock ist im Programm als 2 Worte-Block zu definieren. Durch Belegen des bkst-Parameters im READ$-Makro oder im FDBK$A(R)-Makro wird seine Adresse dem FDB uebergeben. Der Verlauf der READ$-Operation ist asynchron, d.h. die Steuerung geht an die Task zurueck, bevor die READ$-Operation abgeschlossen ist. Die Synchronisation muss der Nutzer selbst durchfuehren. FCS unterstuetzt diese Arbeit. Im READ$-Makro kann die Adresse einer AST-Service-Routine angegeben werden, zu der das Programm nach Beenden der READ$-Operation verzweigt. Aufgabe dieser Routine ist es, das Ende der E/A-Operation zu signalisieren und die Abarbei- tung spezieller Befehlsfolgen, die abhaengig sind vom Ende der vorangegangenen READ$-Operation, zu bewirken. Wird der AST nicht verwendet, aber die Taskabarbeitung soll von einer bestimmten Stelle ab erst nach dem Beenden der READ$-Opera- tion fortgesetzt werden, so muss der WAIT$-Makro an dieser Stelle 42 aufgerufen werden. Durch Angabe des gleichen Ereignisflags im bkef-Parameter in beiden Makros wird die Task solange blockiert, bis das angegebene Ereignisflag gesetzt ist, d.h. die E/A beendet ist. Standard ist das Ereignisflag 32. Format des READ$-Rufes: READ$ fdb,bkda,bkds,bkvb,bkef,bkst,bkdn,err Die Parameter sind in der Anlage 9 beschrieben. Die im Makroruf angegebenen Parameter setzen die entsprechenden FDB-Offsets. Bereits belegte Offsets werden dabei ueberschrieben. Sind die Parameter nicht angegeben, bleiben die alten Werte im FDB erhalten. Der READ$-Ruf hat mit Ausnahme des fdb- und err-Parameters die gleichen Parameter wie der FDBK$A- oder FDBK$R-Ruf. Bestimmte Parameter koennen zur Assemblerzeit (FDBK$A) gesetzt werden, andere erst zur Laufzeit (FDBK$R) oder durch den READ$-Ruf dyna- misch belegt werden. Soll z.B. nicht zum virtuellen Block 1 zuge- griffen werden, sondern zu einem virtuellen Block N, so muss dies durch den bkvb-Parameter im FDBK$R- oder READ$-Ruf angegeben werden. Der Laufzeitmakro muss dabei nach dem Oeffnen der Datei stehen, da der Oeffnenruf die virtuelle Blocknummer im FDB auf 1 setzt. Fuer bestimmte FDB-Offsets gibt es Standardzuweisungen. Es gilt: F.BKVB wird 1 gesetzt, nach dem Oeffnen der Datei F.BKEF 32. Vor Ausfuehrung einer READ$- (WRITE$) Operation muessen bestimmte Informationen im FDB enthalten sein. Das sind: - die Blockpufferadresse (Offset F.BKDS+2) - der Blockbytezaehler (Offset F.BKDS ) - die virtuelle Blocknummer (Offset F.BKVB+2 und F.BKVB ) Ausserdem muessen durch die Makrorufe zur Vorbereitung der E/A die entsprechenden Attribute fuer eine READ$-Operation im FDB ge- setzt sein. Beispiele fuer den READ$-Ruf: ----------------------------- 1. READ$ 2. READ$ #EFDB,,,,,,,fEH 3. READ$ #EFDB,#EBUF,BLGR,#VBNR,#22.,#EASTAT,#ASTADR,FEH Im Beispiel 1 wird vorausgesetzt, dass alle erforderlichen FDB- Offsets bereits durch den FDBK$A- oder FDBK$R-Makro initialisiert sind und die FDB-Adresse in R0 enthalten ist. Im Beispiel 2 wird die FDB-Adresse explizit angegeben. Es wird eine Fehlerbehandlungsroutine FEH angegeben. Die uebrigen Parame- ter sind nicht spezifiziert. Es wird vorausgesetzt, dass die dazugehoerigen FDB-Offsets bereits durch den FDBK$A- oder FDBK$R- Makro initialisiert sind oder mit den Standardwerten belegt wer- den sollen. Im Beispiel 3 sind alle Parameter belegt. Die symbolische Adresse des FDB ist EFDB, die Blockpufferadresse ist mit EBUF angegeben und die Groesse des Blockpuffers ist unter der symbolischen Adresse BLGR vereinbart. Die virtuelle Blocknummer des zu lesen- 43 den Blockes ist in einem 2 Worte langem Block mit der Adresse VBNR abgespeichert. Als Ereignisflag wird das Ereignisflag 22 benutzt. Es wird ein E/A-Statusblock verwendet mit der symboli- schen Adresse EASTAT, desweiteren ist eine AST-Service-Routine angegeben mit der Adresse ASTADR. Zum Schluss steht die Adresse einer Fehlerroutine. 2.5.3. Schreiben eines virtuellen Blockes (WRITE$) -------------------------------------------------- Der WRITE$-Makro wird aufgerufen, um einen Datenblock auf ein blockorientiertes Geraet zu schreiben. Der Datenblock wird vom Blockpuffer des Nutzerprogramms auf den Datentraeger, z.B. Plat- te, geschrieben. Die Laenge des zu schreibenden Blockes wird durch den bkds-Parameter spezifiziert. Als effektiv erweist sich die virtuelle Blockgroesse (bei Platte 512. Bytes). Ist der zu schreibende Block kuerzer als der virtuelle Block, so wird der Block beginnend am Anfang des virtuellen Blockes geschrieben. Der nichtbenoetigte Speicherplatz des virtuellen Blockes bleibt frei. Der naechste zu schreibende Block wird in einem neuen virtuellen Block abgespeichert. Ist der zu schreibende Block laenger als 512. Bytes, so berechnet FCS, wieviel virtuelle Bloecke notwendig sind, um den Block zu schreiben. Die virtuelle Blocknummer im FDB-Offset F.BKVB wird nach der WRITE$-Operation, entsprechend der Anzahl der fuer die Uebertragung benoetigten virtuellen Bloecke erhoeht. Bei der Abarbeitung des WRITE$-Makros wird ge- prueft, ob die virtuelle Blocknummer im Offset F.BKVB auf einen Block weist, der innerhalb des zur Datei zugewiesenen Speicher- bereiches liegt. Trifft dies zu, so wird der Block geschrieben, anderenfalls versucht FCS, die Datei zu erweitern. Ist eine Dateierweiterung nicht moeglich, erfolgt eine Fehleranzeige im E/A-Statusblock und im Offset F.ERR des entsprechenden FDB. Der Block kann nicht geschrieben werden. Wurde die Datei erweitert, traegt FCS den neuen Wert fuer End-of- file-Blocknummer in F.EFBK ein. FCS fuehrt eine Dateierweiterung bei WRITE$ auch ohne Angabe der aloc- bzw. cntg-Parameter im FDAT$-Makro aus. Die aktuelle Erweiterungsoperation wird synchron durchgefuehrt. Nach erfolgreichem Abschluss dieser kommt die WRITE$-Operation in die Warteschlange, und erst dann wird die Steuerung an die Task zurueckgegeben. Analog dem READ$-Makro besteht die Moeglichkeit, den Eintritts- punkt einer vom Nutzer programmierten AST-Service-Routine im bkdn-Parameter des WRITE$-Rufes anzugeben. Diese AST-Routine wird nach Beenden der WRITE$-Operation abgearbeitet. Die Verwendung des Statusblockes ist entsprechend der Ausfuehrung im Abschnitt 2.5.2. zu empfehlen. Nach Abschluss der WRITE$-Operation steht die Anzahl der geschriebenen Bytes im 2. Wort des Statusblockes. Der Nutzer ist bei der Verwendung des WRITE$-Makros fuer die Synchronisation verantwortlich. Moeglichkeiten zur Realisierung werden in den Abschnitten 2.5.1. und 2.5.2. beschrieben. 44 Format des WRITE$-Rufes: WRITE$ fdb,bkda,bkds,bkvb,bkef,bkst,bkdn,err Die Parameter sind in der Anlage 9 beschrieben. Der WRITE$-Ruf weist die gleichen Parameter wie der READ$-Ruf auf. Die Ausfuehrungen ueber die Parameter im Abschnitt 2.5.2. gelten auch fuer WRITE$. Beispiele fuer den WRITE$-Ruf: ------------------------------ 1. WRITE$ 2. WRITE$ #AFDB, , , ,#2,#EASTAT, ,FEH 3. WRITE$ #AFDB,#400.,#PUF Im Beispiel 1 wird vorausgesetzt, dass alle erforderlichen FDB- Offsets bereits initialisiert sind und die FDB-Adresse in R0 ent- halten ist. Im Beispiel 2 ist die FDB-Adresse explizit angegeben. Die Para- meter bkda und bkds sind nicht angegeben, d.h. die Offsets F.BKDS und F.BKDS+2 sind bereits gesetzt. Zur Synchronisation wird das Ereignisflag 2 benutzt. Der E/A-Statusblock ist unter der symbo- lischen Adresse EASTAT vereinbart. Tritt im WRITE$-Makro ein Fehler auf, so wird zur Fehlerroutine mit dem Eintrittspunkt FEH verzweigt. Im Beispiel 3 werden 400.Bytes aus dem Blockpuffer des Nutzerpro- gramms mit der Anfangsadresse PUF in die im FDB spezifizierte Datei geschrieben. Die FDB-Adresse ist #AFDB. 2.5.4. Warten auf das Ende einer Block-E/A (WAIT$) -------------------------------------------------- Der WAIT$-Makro kann aufgerufen werden, um die durch READ$ oder WRITE$ eingeleitete E/A-Operation mit dem Programmablauf zu syn- chronisieren. Der WAIT$-Makro wird in Verbindung mit einer READ$- oder WRITE$-Operation aufgerufen und bewirkt eine Programmunter- brechung, bis die angeforderte Block-E/A beendet ist. Format des WAIT$-Rufes: WAIT$ fdb,bkef,bkst,err Die Parameter sind in der Anlage 9 beschrieben. Auf Grund der logischen Verbindung zwischen READ$-(WRITE$-)Makro und dem WAIT$-Makro muss die Parameterbelegung im WAIT$-Makro der im zugehoerigen READ$-(WRITE$-)Makroruf entsprechen. Ist in kei- nem der Makrorufe der Parameter bkef belegt, so wird das Ereig- nisflag 32. benutzt. Durch die Belegung des bkst-Parameters mit der E/A-Statusblockadresse wird erreicht, dass zusaetzliche In- formationen ueber den Ablauf der E/A-Operation vom System ueber- geben werden. Diese Informationen werden auch uebergeben, wenn der bkst-Parameter im WAIT$-Makro nicht belegt ist, aber der FDB- Offset F.BKST des entsprechenden FDB bereits initialisiert ist. 45 Bei Verwendung des WAIT$-Makros wird die READ$-(WRITE$)Operation in ueblicher Weise ausgefuehrt, aber die Programmabarbeitung wird erst nach dem Ende der E/A-Operation fortgesetzt. Das System traegt den Status der E/A-Operation nach deren Beendigung in den E/A-Statusblock ein. Bei einer effektiven Programmierung ist darauf zu achten, dass der zur READ$- oder WRITE$-Operation gehoerende WAIT$-Ruf nicht unmittelbar auf den READ$- oder WRITE$-Makroruf folgen muss. Folgende Reihenfolge bietet sich an: - Aufruf des gewuenschten READ$-oder WRITE$-Makros - Durchfuehren anderer, vom Ende der geforderten Block-E/A unab- haengiger Verarbeitungsschritte - Aufruf des WAIT$-Makros - Durchfuehrung der Schritte, die vom Ende der geforderten Block-E/A abhaengig sind Werden bei dieser Verarbeitungsfolge (fuer verschiedene Dateien) asynchrone E/A parallel durchgefuehrt, so muss fuer jede Opera- tion ein separater E/A-Statusblock und ein separates Ereignisflag verwendet werden. Beispiele fuer den WAIT$-Ruf ---------------------------- 1. WAIT$ 2. WAIT$ #EFDB, ,#EASTAT,FEH Im Beispiel 1 wird vorausgesetzt, dass R0 die Adresse des ent- sprechenden FDB enthaelt. Im Beispiel 2 wird die FDB-Adresse explizit angegeben. Als Ereignisflag wird das in F.BKST des FDB EFDB angegebene be- nutzt. Falls dieser Offset nicht durch den bkst-Parameter belegt wurde, wird das Ereignisflag 32. benutzt. Die symbolische Adresse des E/A-Statusblockes ist EASTAT. Bei einem Fehler im WAIT$-Makro wird zur Fehlerroutine mit der Einsprungadresse FEH verzweigt. 46 2.5.5. Beispiel zur Block-E/A ----------------------------- Dieses Beispiel veranschaulicht die vorangegangenen Ausfuehrungen ueber die Durchfuehrung einer Block-E/A. Es beinhaltet nur die Programmschritte, die unmittelbar mit der E/A-Operation in Verbindung stehen. Ziel dieses Programmes ist es, die Datei ZAHL vom Typ DAT zu erstellen. Die Datei soll aus 10. Bloecken bestehen mit einer Blockgroesse von 500. Bytes. Zur Synchronisation soll der WAIT$- Makro verwendet werden. Die Auswertung des Statusblockes wird im UP "TEST" vorgenommen. .TITLE WRBL ;Beispiel fuer das Schreiben einer Datei im Blockmodus .MCALL FCSMC$,EXIT$S .GLOBL TEST FCSMC$ FSRSZ$ 0 ;Vorbereitung der Dateibeschreibungsbloecke WFDB: FDBDF$ ;freier Platz fuer FDB FDRC$A FD.RWM FDBK$A BLOCK,500.,,10.,IOSB ;Blockzugriffsabschnitt FDOP$A 1,,DFNB,FO.WRT DFNB: NMBLK$ ZAHL,DAT ;Standarddateinamenblock IOSB: .BLKW 2 BLOCK: .BLKB 500. . . . Weitere Vereinbarungen . . . ;Erstellen der Datei START: . . . OPEN$W #WFDB,,,,,,E1 ;Oeffnen der Datei MOV #10.,R1 ;Blockzaehler NEXT: WRITE$ #WFDB,,,,,,,E2 ;Schreiben eines Blockes CALL TEST ;Auswertung des Status- . . . ;blockes Weitere Programmschritte . . . WAIT$ #WFDB,,,E3 ;Warten auf Ende von WRITE$ CALL TEST DEC R1 ;Alle Bloecke geschrieben? BGT NEXT . . . . . . . . . CLOSE$ #WFDB,E4 ;Schliessen der Datei EXIT$S . . . . . . . . . ;Fehlerbehandlung E1: . . . E2: . . . E3: . . . E4: . . . .END START 47 2.6. Arbeit mit Dateispezifikation und Dateischutz -------------------------------------------------- 2.6.1. Vorbemerkungen --------------------- Fuer die Arbeit mit der Dateispezifikation und dem Dateischutz gibt es eine Reihe von Routinen, die Funktionen durchfuehren, wie Eintragen von Informationen in einen Dateinamenblock, Konvertie- ren von Dateispezifikationen, Lesen bzw. Schreiben von Informa- tionen im Dateispeicherbereich u. a. Die Routinen, die diese Funktionen ausfuehren, sind in der Sy- stembibliothek enthalten und werden im Nutzerprogramm mit CALL "routine" aufgerufen. Vor ihrer Ausfuehrung ist eine FSR-Initia- lisierung (Assembler-, und Laufzeit) durchzufuehren und, die er- forderlichen Informationen sind in bestimmte Register zu bringen. Nach dem Ruecksprung sind alle Register gerettet, mit Ausnahme derer, die explizit als veraendert angegeben sind. Wird bei Abar- beitung einer Routine ein Fehler festgestellt, wird das C-Bit gesetzt, und es erfolgt eine Fehleranzeige im FDB-Offset F.ERR. Bei einigen Routinen erfolgt auf Grund ihrer spezifischen Funk- tion keine Fehleranzeige, das ist in jedem Fall speziell ver- merkt. 2.6.2. Eintragen von Dateispezifikationen in einen Dateinamen- block -------------------------------------------------------------- Die .ASLUN-, .PARSE-, .PRSDV-, .PRSDI, .PRSFN, .GTDIR- und .GTDID-Routinen fuellen einen angegebenen FDB mit Informationen zur Dateispezifikation. .ASLUN - Zuweisen einer logischen Geraetenummer zu einem physi- schen Geraet und Geraeteeinheit, Eintragen der Geraete- informationen in den Dateinamenblock ---------------------------------------------------------------- Die .ASLUN-Routine ist vor dem Oeffnen einer Datei aufzurufen, da die logische Geraetenummer bei geoeffneter Datei bereits einem Geraet zugewiesen ist und diese LUN-Zuweisung dann nicht mehr geaendert werden kann. Vor dem Aufruf der Routine sind R0 und R1 wie folgt zu setzen: R0 - Adresse des FDB der gewuenschten Datei R1 - Adresse des Dateinamenblocks, der die gewuenschte Geraete- information beinhaltet. Die Routine fuehrt folgende Operationen durch: 1. Wenn der Offset N.DVNM des FNB keinen Geraetenamen enthaelt und die logische Geraetenummer keinem Geraet zugewiesen ist: Zuweisung des Systemgeraetes (SY0:) und Eintragen des Geraetes und der Geraeteeinheit in die Offsets N.DVNM und N.UNIT des FNB. Der FDB-Offset F.RCTL wird mit der Geraetecharakteristik und die Offsets F.VBSZ und F.BBFS mit der Geraetepuffer- und Blockpuffergroesse fuer das Systemgeraet belegt. 48 2. Wenn N.DVNM keinen Geraetenamen enthaelt, aber die logische Geraetenummer einem Geraet zugewiesen ist: Eintragen der entsprechenden Informationen fuer dieses Geraet in N.DVNM, N.UNIT, F.RCTL, F.VBSZ, F.BBFS. 3. Wenn N.DVNM einen Geraetenamen enthaelt: Zuweisung der logi- schen Geraetenummer zum angegebenen Geraet und Eintragen der entsprechenden Informationen in F.RCTL, F.VBSZ und F.BBFS. .PARSE - Eintragen aller Dateinameninformationen in einen FNB ------------------------------------------------------------- Die .PARSE-Routine loescht zuerst den durch R1 angegebenen Datei- namenblock und speichert dann darin Informationen in der folgen- den Reihenfolge ab: - N.DVNM - den KOI-7-Geraetenamen - N.UNIT - die binaere Geraeteeinheit - N.DID - die Dateiverzeichnisidentifikation - N.FNAM - den Radix-50-Dateinamen - N.FTYP - den Radix-50-Dateityp - N.FVER - die binaere Versionsnummer Fuer Magnetband werden folgende Informationen im Dateinamenblock abgespeichert: - N.DVNM - den KOI-7-Geraetenamen - N.UNIT - die binaere Geraeteeinheit - N.ANM1 N.ANM2 - den 17 KOI-7-Byte Dateinamen - N.FVER - die binaere Versionsnummer Vor Aufruf der Routine sind die Register R0-R3 wie folgt zu setzen: R0 - Adresse des zu nutzenden FDB R1 - Adresse des zu fuellenden FNB R2 - Adresse des zu nutzenden Dateideskriptors oder Null R3 - Adresse des zu nutzenden Standarddateinamenblocks oder Null - Zuweisung der logischen Geraetenummer und Eintragen der Geraeteinformaionen in den FNB und FDB Zuerst weist .PARSE die logische Geraetenummer einem physischen Geraet und Geraeteeinheit zu und speichert die entsprechenden Geraeteinformationen im FNB ab. Dazu werden folgende Schritte durchgefuehrt: 1. .PARSE prueft, ob in R2 die Adresse eines Dateideskriptors angegeben ist und dieser Geraeteinformationen enthaelt. Von dort werden die Informationen in den FNB gebracht. 2. Ist in R3 die Adresse eines Standarddateinamenblockes angege- ben, der im Dateideskriptor nicht vorhandene Geraeteinforma- tionen enthaelt, werden diese in den FNB eingetragen. 3. Wenn keine Geraeteinformationen spezifiziert sind, verwendet .PARSE das Geraet und die Geraeteeinheit, die gegenwaertig der logischen Geraetenummer in F.LUN zugewiesen sind (z. B. durch die Geraetezuweisungsoption ASG des Taskbuilders). 49 4. Wenn die logische Geraetenummer keinem Geraet zugewiesen ist, weist .PARSE diese dem Systemgeraet (SY0:) zu. 5. Sind das Geraet und die Geraeteeinheit der logischen Geraete- nummer zugewiesen, werden die entsprechenden Informationen in folgende Offsets des FNB und FDB eingetragen: N.DVNM - Geraetename (KOI 7) N.UNIT - Geraeteeinheit (binaer) F.RCTL - geraeteabhaengige Informationen (s. Anl. 3) F.VBSZ - Geraetepuffergroesse (in Byte) F.BBFS - Blockpuffergroesse (in Byte) - Eintragen der Dateiverzeichnis-Identifikationsinformationen 1. Wenn in R2 die Adresse eines Dateideskriptors angegeben ist und dieser enthaelt eine KOI-7-Kette mit dem Dateiverzeichnis, dann wird dieses Nutzerdateiverzeichnis (user file directory, UFD) verwendet, um im entsprechenden Hauptdateiverzeichnis (master file directory, MFD) die resultierende Dateiverzeich- nis-Identifikation zu finden und im Offset N.DID des FNB ein- zutragen. 2. Wenn die Adresse eines Dateideskriptors nicht in R2 angegeben ist bzw. der angegebene Dateideskriptor keine Dateiverzeich- nisinformation enthaelt, prueft .PARSE, ob R3 mit der Adresse eines Standarddateinamenblockes belegt ist. Von dort werden die vorhandenen Informationen in den FNB gebracht. 3. Sind weder 1. noch 2. erfolgreich, nutzt .PARSE das im Datei- speicherbereich ($$FSR2) enthaltene Standard-dateiverzeichnis, wenn diese Information vorher im FSR durch .WDFDR (siehe Ab- schnitt 2.6.5.) initialisiert wurde. 4. Liefert 1. - 3. nicht die geforderten Informationen, verwendet FCS den Standard-UIC im Dateispeicherbereich ($$FSR2). Ist dieser Wert nicht durch .WDFUI veraendert, enthaelt es den UIC, unter dem die Task laeuft. - Eintragen der Informationen ueber Dateinamen, Dateityp und Dateiversion Die Informationen werden in die Offsets N.FNAM, N.FTYP und N.FVER durch folgende Operationen eingetragen: 1. Wenn in R2 die Adresse eines Dateideskriptors vorhanden ist, der Dateinameninformationen enthaelt, werden diese in den FNB gebracht. 2. Ist in R3 die Adresse eines Standarddateinamenblockes angege- ben, der im Dateideskriptor nicht vorhandene Dateinameninfor- mationen enthaelt, werden diese in den FNB gebracht. 3. Sind die Dateinameinformationen weder im Dateideskriptor noch im Standarddateinamenblock verfuegbar, bleiben die entspre- chenden Felder im FNB Null. Die .PARSE-Routine belegt ausserdem das Statuswort N.STAT im FNB mit den entsprechenden Informationen und loescht den Offset N.NEXT im FNB. 50 .PRSDV - Zuweisen der logischen Geraetenummer und Eintragen der Geraeteinformationen in den FNB und FDB ---------------------------------------------------------------- Die .PRSDV-Routine ist mit dem entsprechenden Teil der .PARSE- Routine identisch. Es werden nur die Operationen ausgefuehrt, die die logische Geraetenummer zuweisen und die Geraeteinformationen in den FDB und FNB eintragen. .PRSDI - Eintragen der Dateiverzeichnis-Identifikationsinforma- tionen ---------------------------------------------------------------- Die .PRSDI-Routine ist identisch mit dem entsprechenden Teil der .PARSE-Routine. Es werden nur die Operationen ausgefuehrt, die die notwendigen Dateiverzeichnis-Identifikationsinformationen eintragen. .PRSFN - Eintragen der Informationen ueber Dateinamen, Dateityp und Dateiversion ---------------------------------------------------------------- Die .PRSFN-Routine ist identisch mit dem entsprechenden Teil der .PARSE-Routine. Es werden nur die Operationen ausgefuehrt, die die Informationen ueber Dateinamen, Dateityp und Dateiversion eintragen. .GTDIR - Einfuegen von Dateiverzeichnisinformationen in einen FNB ------------------------------------------------------------- Vor dem Aufruf der Routine sind die Register R0 - R2 mit folgen- den Informationen zu belegen: R0 - Adresse des FDB R1 - Adresse des Dateinamenblockes, in den Dateiverzeichnisinfor- mationen eingefuegt werden sollen. R2 - Adresse eines 2-Worte Speicherbereiches, der die Laenge und Adresse der Dateiverzeichnisinformationen enthaelt. Diese Routine fuehrt fuer die angegebene UFD in der MFD eine .FIND-Operation durch und traegt die resultierende Dateiver- zeichnis-Identifikation in die 3 Worte des Offsets N.DID im FNB ein. Die Informationen der Offsets N.FNAM, N.FTYP, N.FVER, N.DVNM und N.UNIT des FNB bleiben unveraendert, der Rest des Dateinamenblok- kes wird geloescht. .GTDID - Einfuegen von Standard-Dateiverzeichnisinformationen in einen FNB ---------------------------------------------------------------- Vor dem Aufruf sind die Register R0 und R1 wie bei .GTDIR zu set- zen. R2 ist nicht zu setzen, da die Routine den UIC verwendet un- ter dem die Task laeuft, wenn nicht mit .WDFUI ein Standard-UIC angegeben ist. .GTDID fuehrt dann genau wie bei .GTDIR eine .FIND-Operation durch und traegt die resultierende Dateiver- zeichnis-Identifikation in N.DID des FNB ein. Die Offsets N.FNAM, N.FTYP, N.FVER, N.DVNM und N.UNIT bleiben gleichfalls erhalten und der Rest des FNB wird geloescht. Die .GTDID-Routine ist wesentlich kuerzer als die .GTDIR-Routine, da ihre Eingabe die binaere Darstellung eines UIC ist und die .PARSE-Routine deshalb nicht aufgerufen werden muss. Die .GTDID- Routine ist speziell fuer die Nutzung in solchen Programmen vor- 51 gesehen, welche Dateien durch den OFNB$-Makroruf eroeffnen. Ein solches Programm ruft die .PARSE-Routine nicht auf, weil alle erforderlichen Informationen ueber den Dateinamen im FNB-Format dem Programm zur Verfuegung stehen. 2.6.3. Finden, Einfuegen, Streichen und Umbenennen einer Datei in einem Dateiverzeichnis -------------------------------------------------------------- Die Routinen .FIND, .ENTER und .REMOV koennen verwendet werden, um Dateien im Dateiverzeichnis zu finden, einzufuegen bzw. zu streichen. Das betrifft sowohl Hauptdateiverzeichnisse (MFD) als auch Nutzerdateiverzeichnisse (UFD). .FIND - Finden einer Datei in einem Dateiverzeichnis ---------------------------------------------------- Folgende relative Dateiversionen koennen verwendet werden: Version 0 - letzte (hoechste) Versionsnummer im Dateiverzeichnis Version -1 - aelteste (kleinste) Versionsnummer im Dateiverzeich- nis Ist eine dieser relativen Versionen im Dateinamenblock angegeben, wird die entsprechende Versionsnummer in den Dateinamenblock eingetragen. Vor dem Aufruf der Routine sind die Register R0 und R1 wie folgt zu setzen: R0 - Adresse eines FDB mit der zugewiesenen LUN R1 - Adresse des Dateinamenblockes mit der Dateispezifikation .FIND durchsucht das im Offset N.DID des Dateinamenblockes ange- gebene Dateiverzeichnis nach einer Datei mit dem angegebenen Dateinamen, Dateityp und der Versionsnummer. Wurde eine Datei gefunden, wird das Dateiidentifikationsfeld (Offset N.FID) des FNB ausgefuellt. Bestimmte "*"-Operationen erfordern die Verwendung der .FIND-Rou- tine. 3 Bits im FNB-Statuswort (siehe N.STAT in Anlage 4) zeigen an, ob ein "*" fuer den Dateinamen, -typ oder die Versionsnummer angegeben wurde. Wenn z. B. das Dateinamen- und das Dateiversionsnummernfeld "*"- Spezifikationen enthalten und der Dateityp mit .OBJ angegeben ist (d. h. *.OBJ;*), entspricht die erste Datei im Dateiverzeichnis mit dem Typ .OBJ dieser Spezifikation unabhaengig von Dateiname und Versionsnummer. Wenn eine Datei entsprechend einer "*"-Spezifikation gefunden wurde, werden der Dateiname, Dateityp und die Versionsnummer dieser Datei zum Dateinamenblock zusammen mit dem Dateikennzeich- nungsfeld (N.DID) zurueckgefuehrt. So kann das Programm den aktuellen Namen der gerade gefundenen Datei bestimmen und die gewuenschte Operation durchfuehren. Im Dateinamenblock wird auch N.NEXT gesetzt. Diese Information wird in der folgenden .FIND-Operation verwendet, um die naechste, der 52 "*"-Spezifikation entsprechende Datei im Dateiverzeichnis zu finden. Die .FIND-Routine wird oftmals zum Eroeffnen einer Reihe von Dateien verwendet, wenn "*"-Dateispezifikationen angewendet wer- den. Folgender Ablauf waere moeglich: 1. Aufruf der .PARSE-Routine, um den Offset N.NEXT des FNB zu loeschen. 2. Pruefen der gesetzten "*"-Dateispezifikationen im FNB-Status- wort BIT #NB.SVR!NB.STP!NB.SNM,N.STAT(R1) BEQ NOWLD ;KEINE *-SPEZIFIKATION 3. Wenn "*"-Dateispezifikationen vorhanden sind, ist folgende Be- fehlsfolge solange zu wiederholen, bis alle Dateien verarbei- tet sind CALL .FIND ;AKTUALISIEREN N.NEXT BCS NOFIL ;BEI FEHLER IE.NSF - NORMALE BEENDIGUNG OPEN$ R0 Die .FIND-Routine kann fuer folgende Typen von "*"-Dateispezifi- kationen genutzt werden: TEST.DAT;* *.DAT;2 TEST.*;* TEST.*;2 *.DAT;* Bei Angabe von "*" fuer den Dateinamen oder den Dateityp muss die Versionsnummer entweder durch "*" oder absolut (>0,z.B. 2) ange- geben werden. Die Typen *.DAT bzw. TEST.* ohne Angabe der Versionsnummer sind nicht erlaubt, da sie *.DAT;0 bzw. TEST.*;0 entsprechen. Ist NB.ANS im FNB-Statuswort gesetzt, vergleicht die .FIND- Routine den Dateinamen mit den 17 Zeichen langen Dateinamen, der im FNB gespeichert ist. Die ersten 12 Zeichen des Dateinamens sind od N.ANM1 und der restliche Teil ab N.ANM2 im FNB abgespeichert. .ENTER - Einfuegen einer Datei in ein Dateiverzeichnis ------------------------------------------------------ Die Register R0 und R1 sind vor dem Aufruf wie folgt zu setzen: R0: Adresse eines FDB mit der zugewiesenen LUN R1: Adresse des Dateinamenblockes mit der Datei-ID und der neuen Dateispezifikation Enthaelt die Versionsnummer im Dateinamenblock (N.FVER) 0 (Stan- dardversionsnummer), durchsucht .ENTER das Dateiverzeichnis. Gibt es in dem angegebenen Dateiverzeichnis keine Datei mit gleichem Namen und Typ, so wird die Datei mit Versionsnummer 1 eingetra- gen. Gibt es eine Datei und n ist die hoechste vorkommende Ver- sionsnummer, so wird der neue Eintrag mit Versionsnummer n+1 vor- genommen. In beiden Faellen wird die Versionsnummer auch in den FNB eingetragen. "*"-Dateispezifikationen duerfen nicht verwendet werden. 53 .REMOV - Streichen einer Datei in einem Dateiverzeichnis -------------------------------------------------------- Vor dem Aufruf der Routine sind die Register R0 und R1 wie bei .FIND zu setzen. Jede .REMOV-Operation streicht die naechste Datei im Dateiver- zeichnis, die den angegebenen Dateinamen, Dateityp und die Ver- sionsnummer hat. Durch .REMOV wird diese Datei jedoch nicht ge- loescht. "*"-Spezifikationen sind erlaubt. Die Versionsnummer muss entwe- der absolut oder als "*" angegeben sein, 0 und -1 sind zulaessige Versionsnummern. .RENAM - Umbenennen einer Datei in ihrem Dateiverzeichnis --------------------------------------------------------- Vor dem Aufruf der Routine sind die Register R0 und R1 wie folgt zu setzen: R0 - Adresse des FDB der umzubenennenden Datei R1 - Adresse des FDB, der die neue Dateinameninformation, die LUN und das Ereignisflag beinhaltet. (LUN und Ereignisflag mues- sen in beiden FDB identisch sein.) Bei der Umbenennung wird der alte Dateiname nur im Dateiverzeich- nis durch einen neuen Dateinamen ersetzt. Der im Dateikennsatz abgespeicherte Dateiname bleibt unveraendert. Bei Aufruf von .RENAM wird die Datei unter ihrem alten Namen ge- oeffnet, unter ihrem neuen Namen geschlossen und der ursprueng- liche Eintrag gestrichen. Wird keine Datei durch den Dateinamen gefunden, wird der neue Dateiname schon genutzt bzw. sind zwei verschiedene Geraete ange- geben, wird F.ERR im FDB mit dem entsprechenden E/A-Fehlercode belegt. In diesem Fall wird die Datei unter ihrem urspruenglichen Namen geschlossen und das Dateiverzeichnis bleibt unveraendert. 2.6.4. Konvertieren von Dateiverzeichnisinformationen ----------------------------------------------------- .ASCPP - Konvertieren einer KOI-7-Dateiverzeichnisinformation in den aequivalenten binaeren UIC ---------------------------------------------------------------- Vor dem Aufruf der Routine sind folgende Register zu setzen: R2 - Adresse des 2-Worte Speicherbereiches, der die Laenge und Adresse der KOI-7-Dateiverzeichnisinformation enthaelt. R3 - Adresse eines Wortes im Nutzerprogramm, in das der binaere UIC eingetragen wird. Die Mitgliedsnummer wird im niederwer- tigen Byte und die Gruppennummer im hoeherwertigen Byte ge- speichert. Die zu konvertierende KOI-7-Dateiverzeichnisinformation muss in eckigen Klammern eingeschlossen sein. Die Gruppen- und Mitglieds- nummer sind durch Komma zu trennen. Bei Fehlen der Trennzeichen erfolgt keine Konvertierung und es wird das C-Bit gesetzt. 54 .PPASC - Konvertieren eines binaeren UIC in eine KOI-7-Dateiver- zeichnisinformation ---------------------------------------------------------------- Vor dem Aufruf der Routine sind folgende Register zu setzen: R2 - Adresse eines Speicherbereiches im Nutzerprogramm, in den die KOI-7-Dateiverzeichnisinformation gebracht werden soll (bis zu 9 Byte). R3 - zu konvertierender binaerer UIC-Wert Das niederwertige Byte enhaelt die Mitgliedsnummer und das hoeherwertige Byte die Gruppennummer. R4 - Steuercode Bit 0 = 0 fuehrende Nullen werden unterdrueckt = 1 fuehrende Nullen werden nicht unter- drueckt. Bit 1 = 0 in der KOI-7-Dateiverzeichnisinforma- tion werden Trennzeichen eingetragen (z. B. [20,20]) = 1 die Trennzeichen werden unterdrueckt (z. B. 2020) Bei der .PPASC-Routine erfolgt keine Fehleranzeige. 2.6.5. Lesen und Schreiben von Informationen in der Programm- sektion $$FSR2 des Dateispeicherbereiches ------------------------------------------------------------- Aufbau $$FSR2 okt. -------------------------------- 0 | . | | . | -------------------------------- 10 | UIC des Dateieigentuemers | | (binaer) | -------------------------------- 12 | Standarddateischutzmaske | -------------------------------- 14 | . | | . | -------------------------------- 50 | Laenge der Standard-Dateiver-| | zeichnisinformation in Bytes | -------------------------------- 52 | Adresse der Standard-Datei- | | verzeichnisinformation | -------------------------------- 54 | Standard-Dateiverzeichnis- | | information | | (KOI-7-Kette, Format | | [200,200]) | -------------------------------- 66 | . | | . | -------------------------------- 102 | Standard-UIC (binaer) | -------------------------------- 104 55 Die restlichen Informationen sind hier nicht aufgefuehrt. Die Programmsektion $$FSR2 des Dateispeicherbereiches hat eine Laenge von 104 (oktal) Bytes. Die darin zu lesenden bzw. zu schreibenden Informationen sind aus der Tabelle ersichtlich. Bei den Routinen erfolgt keine Fehleranzeige. .RDFDR - Lesen der Laenge und Adresse der Standard-Dateiver- zeichnisinformation in $$FSR2 ---------------------------------------------------------------- Diese Standard-Dateiverzeichnisinformation wird von FCS genutzt, wenn in einem Dateideskriptor keine explizit angegeben ist. Hat der Nutzer diese Worte in $$FSR2 nicht vorher durch die .WDFDR- Routine belegt, sind sie Null und FCS verwendet als Dateiver- zeichnis den UIC, unter dem die Task laeuft. Nach dem Aufruf der Routine sind folgende Register gesetzt: R1 - Laenge der Dateiverzeichnisinformation in Byte R2 - Adresse der Dateiverzeichnisinformation in $$FSR2 .WDFDR - Schreiben der Laenge und Adresse neuer Standard-Datei- verzeichnisinformationen in $$FSR2 --------------------------------------------------------------- Vor dem Aufruf der Routine sind die Register R1 und R2 wie folgt zu setzen: R1 - Laenge der neuen Dateiverzeichnisinformation in Byte R2 - Adresse der neuen Dateiverzeichnisinformation Durch diese Aenderung der Informationen wird der Standard-UIC in $$FSR2 nicht beruehrt. Beispiel: NDIR: .ASCII /[200,302]/ : MOV #9.,R1 MOV #NDIR,R2 CALL .WDFDR .RDFUI - Lesen des Standard-UIC in $$FSR2 ----------------------------------------- Neben den Standard-Dateiverzeichnisinformationen (KOI-7-Kette), kann der Standard-UIC (binaerer Wert) gelesen werden bzw. ein neuer Standard-UIC in $$FSR2 geschrieben werden. Er hat das Format: 15 8 7 0 --------------------- | Gruppe | Mitglied | --------------------- Der Standard-UIC entspricht immer dem UIC unter dem die Task laeuft, falls ihn der Nutzer nicht durch die .WDFUI-Routine ge- aendert hat. Nachdem der Standard-UIC in $$FSR2 durch .RDFUI gelesen wurde, ist dieser binaere Wert im Register R1 enthalten. 56 .WDFUI - Schreiben eines neuen Standard-UIC in $$FSR2 ----------------------------------------------------- Vor dem Aufruf der Routine ist in Register R1 der binaere UIC zu bringen, der in $$FSR2 geschrieben werden soll. .RDFFP - Lesen der Standarddateischutzmaske in $$FSR2 ----------------------------------------------------- Die Standarddateischutzmaske wird beim Erstellen einer Datei verwendet, um die Schutzmaske der Datei festzulegen. Ist der Wert = -1, so wird die Schutzmaske des Datentraegers fuer die neue Datei genutzt. Das Maskenwort hat folgendes Format: 15 12 11 8 7 4 3 0 ---------------------------------------- | Rest | Gruppe | Eigentuemer | System | ---------------------------------------- Jede der vier oberen Kategorien hat vier Bits, die im Hinblick auf den Dateizugriff folgende Bedeutung haben: Bit 3 2 1 0 -------------------------------------------- | Loeschen | Erweitern | Schreiben | Lesen | -------------------------------------------- Ein Bitwert von 0 zeigt an, dass der entsprechende Zugriff zur Datei erlaubt ist, ein Bitwert von 1 zeigt an, dass der entspre- chende Zugriff zur Datei unzulaessig ist. Die Standarddateischutzmaske kann durch die .RDFFP-Routine gele- sen werden. Nach dem Aufruf der Routine enthaelt R1 dieses Wort. .WDFFP - Schreiben einer neuen Standarddateischutzmaske in $$FSR2 ---------------------------------------------------------------- Diese Routine kann genutzt werden, um die Standardzugriffsrechte zu den Dateien zu aendern. Vor Aufruf der Routine muss das Register R1 die neue Standardda- teischutzmaske enthalten. .RFOWN - Lesen des UIC des Dateieigentuemers in $$FSR2 ------------------------------------------------------ Der UIC des Dateieigentuemers wird beim Erstellen einer Datei verwendet, um den Eigentuemer dieser Datei festzulegen. Das ent- sprechende Wort in $$FSR2 hat den Standardwert 0, wenn dieser Wert nicht durch .WFOWN veraendert wurde. Fuer nichtprivilegierte Nutzer wird der UIC des Eigentuemers wie folgt gebildet: - Wenn es sich um einen privaten Datentraeger handelt, dann ist der UIC des Eigentuemers identisch mit dem UIC der Task, welche die Datei erzeugt. - Wenn es sich um Systemdatentraeger handelt, dann ist der UIC des Eigentuemers identisch mit dem Anmeldungs-UIC der Task. Fuer privilegierte Nutzer ist der UIC des Eigentuemers identisch mit dem UIC der Task, welche die Datei erzeugt. Fuer Dateien, die durch Task erzeugt werden, welche durch eine zeitgesteuerte An- forderung gestartet wurden, wird der UIC des Eigentuemers auf den beim Bilden der Task spezifizierten UIC gesetzt. 57 Das Wort hat hier das Format: 15 8 7 0 --------------------- | Gruppe | Mitglied | --------------------- Nach dem Aufruf der .RFOWN-Routine enthaelt das Register R1 den UIC des Dateieigentuemers. .WFOWN - Schreiben eines neuen UIC des Dateieigentuemers in $$FSR2 ---------------------------------------------------------------- Vor dem Aufruf der Routine ist das Register R1 mit dem neuen Dateieigentuemer-Wort zu setzen. 2.7. Fehlerbehandlung durch FCS 1630 ------------------------------------ In allen Verarbeitungsmakrorufen (siehe Abschnitte 2.3., 2.4., 2.5.) ist folgende Fehlerbehandlung enthalten: Sobald der Makroruf abgearbeitet ist und das Programm mit dem folgenden Befehl fortgesetzt wird, sind das Carrybit und die Offsets F.ERR und F.ERR+1 des FDB mit folgenden Werten belegt: ----------------------------------------------------- | | C | F.ERR | F.ERR+1 | |---------------------------------------------------| | fehlerfrei | 0 | nichtnegativ | - | |---------------------------------------------------| | E/A-Fehler | | | 0 | | | | negativ, Wert | | |-------------------| 1 | zeigt Fehler- |----------| | Direktive- | | Bedingung | negativ | | Statuswort-Fehler | | | | ----------------------------------------------------- Die Fehlerrueckkehrcodes von FCS 1630 in F.ERR sind in der Anlage 22 enthalten. Treten Fehler auf, nachdem FCS die Steuerung an die Exekutive abgegeben hat, so werden diese ins Direktivstatuswort eingetragen und von dort bei Rueckkehr in die FCS-Routine nach F.ERR uebernommen. Diese Fehlerrueckkehrcodes sind ebenfalls der Anlage 22 zu entnehmen. Der Nutzer von FCS hat 2 Moeglichkeiten, auf auftretende Fehler zu reagieren. Wird der Parameter err des Verarbeitungsrufes gesetzt, so wird mit CALL err in die entsprechende Fehlerroutine der Nutzertask verzweigt, sobald FCS bei der Abarbeitung des Makrorufes einen Fehler er- kennt. Wird err nicht gesetzt, so wird das Programm unmittelbar nach dem Makroruf fortgesetzt und es kann mit BCS oder BCC entsprechend einer moeglichen Fehlerbedingung verzweigt werden. In beiden Faellen ist das C-Bit in der Nutzertask zurueckzusetzen, wenn dies fuer den Programmablauf notwendig ist. 58 2.8. Besonderheiten bei der Arbeit mit Magnetband ------------------------------------------------- 2.8.1. Allgemeines ------------------ Das Magnetband ist ein Datentraeger fuer sequentiellen Zugriff. Zur gleichen Zeit kann immer nur ein Nutzer auf einen Datentrae- ger zugreifen. Es ist nicht moeglich, mehrere Dateien gleichzei- tig zu oeffnen. Die Zugriffsrechte sind im Datentraegerkennsatz festgelegt. Die Dateistruktur auf Magnetband ist in der Anleitung fuer den Programmierer, Teil 4, Dateiformate im Betriebssystem OMOS 1630 beschrieben. Das Magnetband wird in logische Bloecke unterteilt, die Dateien in virtuelle. Ein logischer Block entspricht einem virtuellen. Die Standardlaenge eines Blockes betraegt 512. Bytes. Sie kann auf jeden geradzahligen Wert, der innerhalb der im Magnetband- driver angegebenen Grenzen liegt, durch entsprechende Angabe im ovbs-Parameter des FDBF$A(R)-Makros geaendert werden . Saetze koennen auf Magnetband sowohl feste als auch variable Laenge besitzen (R.FIX und R.VAR, aber nicht R.SEQ). Saetze fester Laenge sind in einen Block ohne Steuerinformation gepackt. Der Block wird so begrenzt, dass Blockende und Satzende des letzten Satzes, der in den Blockpuffer passt, zusammenfallen. Die Saetze duerfen auf Magnetband die Blockgrenzen nicht ueber- schreiten. Saetzen variabler Laenge ist ein 4 Byte langes Feld vorange- stellt, das im KOI-7-Code die Satzlaenge (dez.) einschliesslich dem Satzlaengenfeld enthaelt. Nach dem letzten Satz in einem Block steht das Blockendekennzeichen (oktal 136). 2.8.2. Positionierung des Magnetbandes -------------------------------------- Werden keine Steuerparameter angegeben, so wird jede neue Datei nach dem Ende der letzten Datei fortlaufend auf dem Datentraeger aufgezeichnet. Die zuletzt geschriebene Information ist das lo- gische Ende des Bandes. Alle nachfolgenden Daten sind verloren. Eine Dateierweiterung ist daher nur fuer die letzte Datei moeg- lich. Durch Benutzung des FDOP$R-Makros bzw. der Routinen .CRTL und .POINT ist es moeglich, eine Datei an einer anderen Magnet- bandposition zu erstellen. Durch Belegung des actl-Parameters im FDOP$R-Makro kann folgende Positionierung des Magnetbandes erfolgen: Standard - es wird auf das logische Ende der Datentraegerfol- ge positioniert. Beim Oeffnen und Schliessen der Datei wird das MB nicht zurueckgespult. Beim Schreiben einer neuen Datei wird nicht kontrol- liert, ob sich schon eine Datei mit dem selben Namen auf dem Datentraeger befindet. Um die Standards von F.ACTL zu uebergehen, muss FA.ENB mit der gewuenschten Funktion angegeben werden. 59 FA.ENB!FA.POS - ist fuer die Ausgabedateien von Bedeutung. Es bewirkt, dass das Magnetband vor Erstellen einer neuen Datei hinter die zuletzt geschlossene Datei positioniert wird. Jede Datei, die sich dahinter befindet, geht verloren. Wenn die Funktion Zu- rueckspulen angegeben ist, hat diese den Vorrang vor FA.POS. Das Magnetband wird dann hinter die Marke VOL1 positioniert und alle bisher auf dem Band befindlichen Dateien gehen verloren. FA.ENB!FA.RWD - wird angegeben, um das Magnetband vor dem Oeffnen oder nach dem Schliessen einer Datei zurueckzu- spulen. - Routine .CTRL --------------- Die .CTRL-Routine dient dazu, geraetespezifische Steuerfunktionen fuer das Magnetband zu realisieren. Vor dem Aufruf der Routine muessen die Register wie folgt belegt sein: R0 - enthaelt die Adresse des entsprechenden FDB R1 - enthaelt den gewuenschten Funktionscode R2 - wird in Abhaengigkeit vom verwendeten Funktionscode belegt. Es ist ausser bei FF.SPC mit Null zu belegen. R3 - muss mit Null belegt sein. Funktionscodes und Belegung von Register R2: FF.RWD - Rueckspulen eines Magnetbandes unabhaengig vom Oeffnen und Schliessen der Datei FF.POE - Positionieren auf das logische Ende eines Magnetbandes FF.NV - Abschliessen des aktuellen Magnetbandes und Fortsetzen der Dateioperation auf dem naechsten Magnetband FF.SPC - Vor- bzw. Ruecksetzen des Magnetbandes um n Bloecke R2 = Anzahl der Bloecke; positive Zahl bedeutet Vorset- zen, negative Zahl bedeutet Ruecksetzen. FF.RWF - Rueckspulen einer Datei - Routine .POINT ---------------- Die .POINT-Routine kann benutzt werden, um eine Magnetbanddatei auf ihren Anfang zu positionieren. Vor Aufruf der Routine sind die Register wie folgt zu setzen: R0: Adresse des FDB R1: 0 R2: 1 R3: 0 2.8.3. Magnetbandsteuertask MAG ------------------------------- Die Magnetbandsteuertask gestattet die Angabe von Dateiattributen fuer Baender ohne Kennsaetze, bietet die Positionierungsfunk- tionen sowohl fuer Baender ohne als auch mit Kennsaetzen und ge- stattet das Antworten auf Anforderungen in bezug auf neue Baender ohne das Eingliedern eines neuen Bandes. 60 Dieses Kommando kann nur bei eingegliederten Baendern verwendet werden. Die Schluesselworte sind sowohl fuer Baender ohne als auch mit Kennsaetzen gueltig, solange dies nicht anders angezeigt wird. Das Format des MAG-Kommandos: >MAG SET mmnn:/keyword[/keyword[s]] Schluesselworte: /BS=n /CC=NONE LIST FORTRAN /EOF /EOT /EOV /INITIALIZE="vol id" /POS=n /RS=n /REWIND mmnn: Magnetbandeinheit, mit der die Operation auszufuehren ist. Schluesselwortdefinition: BS /BS=n Anzahl von Bytes pro Block bei einem eingeglie- derten Band. Man kann die Anzahl von Zeichen entweder dezimal oder oktal angeben. Zur Angabe einer Dezimalzahl ist diese mit einem Punkt zu beenden. Der Standard lautet oktal. Diese Blockgroesse wird zum Standard fuer das Band. Dieser Wert wird verwendet bei der Einga- be, wenn kein HDR2-Kennsatz auf einem Band mit Kennsaetzen vorhanden ist, und bei der Ausgabe, wenn kein anderer Wert bei der Erstellung der Datei angegeben wurde. Der fuer die Blockgroesse spezifizierte Wert muss groesser als 14. Bytes sein. Es gibt keine maximale Blockgroesse. CC /CC=Typ der Formatsteuerung Die gueltigen Typen der Formatsteuerung lauten wie folgt: NONE LIST FORTRAN Beim Lesen von einem Band mit Kennsaetzen wird diese Formatsteuerung verwendet, wenn kein HDR2- Kennsatz vorhanden ist. Wenn ein HDR2-Kennsatz vorhanden ist, dann wer- den die Informationen im HDR2-Kennsatz genutzt und das /CC-Schluesselwort wird ignoriert. Dieses Schluesselwort stellt die einzige Varian- te zum Spezifizieren der Formatsteuerung fuer Baender ohne Kennsaetze dar. 61 EOF /EOF Bewirkt, dass der ACP den E/A-Zustandscode IE.EOF zur anfordernden Task zurueckfuehrt. Dieses Schluesselwort kann zum Beenden einer An- forderung fuer ein anderes Band in einer Daten- traegergruppe verwendet werden. Dieses Schluesselwort ist nur fuer Baender mit Kennsaetzen gueltig. EOT /EOT Bewirkt, dass der ACP den E/A-Zustandscode IE.EOT zur anfordernden Aufgabe zurueckfuehrt. Dieses Schluesselwort kann zum Beenden einer An- forderung fuer ein anderes Band in einer Daten- traegergruppe verwendet werden. Dieses Schluesselwort ist nur fuer Baender mit Kennsaetzen gueltig. EOV /EOV Bewirkt, dass der ACP den E/A-Zustandscode IE.EOV zur anfordernden Aufgabe zurueckfuehrt. Dieses Schluesselwort kann zum Beenden einer An- forderung fuer ein anderes Band in einer Daten- traegergruppe verwendet werden. Dieses Schluesselwort ist nur fuer Baender mit Kennsaetzen gueltig. INITIALIZE /INITIALIZE="vol id" Entspricht dem Datentraegerkennsatz, mit welchem das Band initialisiert wird. Dieses Schluessel- wort gestattet es, dass man ein neues Band er- zeugen kann, um eine Anforderung vom ACP in be- zug auf einen neuen Ausgabedatentraeger fuer ein Band mit Kennsaetzen zu befriedigen. Das Format des Datentraegerkennzeichens ist identisch mit dem Format des fuer das MOUNT-Kommando spezifi- zierten Datentraegerkennzeichens. Dieses Schluesselwort ist nur fuer Baender mit Kennsaetzen gueltig. POS /POS=n Die Anzahl an Dateien (Bandmarken), welche von der aktuellen Bandposition aus zu ueberspringen sind. Beispielsweise bedeutet /POS=0 den Zugriff auf die aktuelle, und /POS=1 bedeutet das Vor- setzen um eine Datei ausgehend von der augen- blicklichen Position. Die Anzahl an Dateien kann entweder dezimal oder oktal spezifiziert werden. Fuer die Angabe einer Dezimalzahl ist die Zahl mit einem Punkt zu beenden. Der Standard lautet oktal. Die angegebene Anzahl an Dateien muss sich zwischen 0 und 23417 (oktal) bewegen. Dieses Schluesselwort ist nur fuer eingeglieder- te Baender ohne Kennsaetze gueltig. Es ist nicht erforderlich fuer Baender mit Kennsaetzen, da auf die Dateien durch den Dateinamen zugegriffen werden kann. 62 Wenn ein Band, welches Kennsaetze enthaelt, mit /NOLABEL eingegliedert ist, dann lautet die For- mel zur Berechnung der Position einer Datei wie folgt: N=(N-1)*3+1 Dabei verkoerpert N die Nummer der gewuenschten Datei. RS /RS=n Entspricht der Anzahl von Bytes pro Satz fuer Saetze fester Laenge auf Band. Die maximale Satzgroesse entspricht der Blockgroesse. Beim Lesen von Dateien von einem Band mit Kennsaetzen wird dieser Wert fuer die Satzgroesse verwendet, wenn kein HDR2-Kennsatz vorhanden ist. Dieses Schluesselwort ist die einzige Variante fuer die Angabe der Satzgroesse fuer Baender ohne Kennsaetze. REWIND /REWIND Spezifiziert, dass das Band auf den Bandanfang zurueckzuspulen ist. Bei Baendern mit Kennsaet- zen bewirkt dieses Schluesselwort, dass auf den Anfang der Datentraegergruppe zurueckgespult wird. Fehlermitteilungen fuer MAG sind in Anlage 28 beschrieben. Beispiel 1: Anzeigen des Inhaltes eines Bandes, das im DKOI-Code erstellt wurde, auf dem Bediengeraet. >MOU MT0:/NOLABEL/TR=EBCDIC >MAG SET MT0:/BS=80./RS=80./CC=LIST/REWIND Lesen der ersten "Datei" auf dem Band zur Ermittlung des tatsaechlichen Bandformats >PIP TI:=MT:X VOL1KOK0560 RVB.ORZ.DT HDR1M310.DAT KOK05600010001 86349 000000000000 HDR2F032400016220KOK340NJ/R39S39 B Diese Information zeigt auf, dass das Band Kennsaetze besitzt. Die tatsaechliche Blockgroesse und die tatsaechliche Satzgroesse koennen aus den Kennsaetzen ermittelt werden. Anwenden des MAG SET - Kommandos zum Setzen der tatsaechlichen Blockgroesse und der tatsaechlichen Satzgroesse. >MAG SET MT0:/BS=3240./RS=162. Anwenden des MAG SET/POS - Kommandos zum Positionieren auf die naechste Datei auf dem Band. Man koennte ebenso auf die Datei positionieren, indem eine Position zu PIP wie folgt spezifiziert wird: PIP TI:=MT0:"POS=R1", wobei R das Rueckspulen anzeigt und 1 die Anzahl an Bandmarken ist, welche zu ueberspringen sind. >MAG SET MT0:/REWIND/POS=1 63 Lesen der Datei. Es ist zu beachten, dass PIP einen Blinddatei- namen erfordert, selbst wenn das Band bereits auf die richtige Datei positioniert ist. >PIP TI:=MM0:X 2.8.4. Verarbeitung kennsatzloser Magnetbaender ----------------------------------------------- Ein Band, welches keine Kennsaetze enthaelt, wird als kennsatz- loses Band bezeichnet. Ein kennsatzloses Band enthaelt entweder geblockte oder ungeblockte Saetze fester Laenge. Wenn ein Band mit MOUNT/NOLABEL eingegliedert ist, kann FCS unter Verwendung von Standardlese- und -schreiboperationen auf Saetze auf dem Band zugreifen. Wenn ein Band mit MOUNT/FOREIGN eingegliedert ist, muss auf die Saetze auf dem Band direkt unter Verwendung der QIO- Operationen zugegriffen werden. - Bandpositionierung Jede Bandbewegung vor der ersten Leseoperation muss folgender- massen angefordert werden: . Es kann das FA.ENB!FA.RWD-Bit in F.ACTL gesetzt werden, um ein Rueckspulen des Datentraegers anzufordern (siehe auch Abschnitt 2.8.2.). . Es kann das MAG SET/POS - Kommando angegeben werden, um das Magnetband vorzusetzen. . Es kann das MAG SET/REWIND - Kommando angegeben werden, um das Band auf den Anfang rueckzusetzen (siehe Abschnitt 2.8.3.). . Die Datei kann durch den speziellen Namen "POS=Rnnnn" bear- beitet werden, wobei R anzeigt, dass das Band rueckzuspulen ist, und nnnn der Anzahl an Dateien (Bandmarken) entspricht, um welche vorzusetzen ist. Beispielsweise gilt fuer das Lesen der zweiten Datei auf einem Band folgendes: >PIP TI:=MT:"POS=0001" Jede Bandmarke begrenzt eine Datei. Alle Positionierungsopera- tionen gehen in Form von Bandmarken vor sich. Wenn irgendein Kennsatz auf dem Band vorhanden ist, dann wird er als eine Datei behandelt. -Angabe von Dateiattributen Man kann die Attribute fuer Dateien, welche von einem kennsatz- losen Band zu lesen sind, auf drei verschiedenen Wegen angeben: . MOUNT-Kommando (siehe Schrift Anleitung fuer den Bediener, Teil 2, Steuerprogrammsystem). . Irgendeine Erstellungsanforderung fuer eine Datei. Man kann die Erstellungsanforderung aus dem betreffenden Programm heraus durch das Erstellen einer Datei und deren Abschlie- ssen ohne das Schreiben irgendwelcher Daten geben. . MAG SET - Kommando (siehe Abschnitt 2.8.3.). - Codeumsetzung Man kann die Codeumsetzung fuer ein Magnetband durch das MOUNT- Kommando anfordern (siehe Schrift Anleitung fuer den Bediener, Teil 2, Steuerprogrammsystem. Wenn man die Codeumsetzung angefor- dert hat, dann wird der betreffende Datenpuffer (FCS-Blockpuffer) innerhalb der betreffenden Task umgesetzt. Deshalb werden die 64 Daten in der betreffenden Task bei einer Schreiboperation zer- stoert. Man kann bis zu drei installattionsabhaengige Codeumset- zungsroutinen dem Magnetband-ACP hinzufuegen, indem die Routinen mit folgendem Format eingefuegt werden: USERn:: MOV #TBLPTR,R0 ;n betraegt 1, 2 oder 3. RETURN TBLPTR: .WORD INTRAN .WORD OUTRAN INTRAN: Eine 256-Byte-Tabelle fuer die Eingabeumsetzung OUTRAN: Eine 256-Byte-Tabelle fuer die Ausgabeumsetzung Die DKOI-Umsetzungstabellen, welche mit dem OMOS 1630 System be- reitgestellt werden, werden in Anlage 29 beschrieben. Man muss diese Codeumsetzungsroutinen beim Aufbau der MTAACP-Task in die Ueberlagerungsbeschreibung (ODL) fuer den Magnetband-ACP einschliessen. Die Kommentare innerhalb der Dateien MTABLD.ODL und MTABLD.CMD zeigen an, wo diese Routinen hinzugefuegt werden koennen. Beispiel 2: Einlesen einer angegebenen Datei von einem Band, das im DKOI-Code erstellt wurde, mittels einer IKD. .; MTIN.CMD MB-EINGABE .; .; DIESE KOMMANDODATEI WIRD DURCH FOLGENDE EINGABE AUFGERUFEN: .; .; @MTIN OUTSPC=DEV:INFILE .; .; FUNKTION: .; VON EINEM MAGNETBAND MIT KENNSAETZEN WIRD DIE ANGEGEBENE .; DATEI (INFILE) GELESEN UND NACH OUTSPC UEBERTRAGEN. DER .; AUFZEICHNUNGSCODE KANN DABEI DKOI (ESER) ODER KO17 .; (OMOS) SEIN. DAS MAGNETBAND WIRD DAHER MIT /NOLABEL EIN- .; GEGLIEDERT. .; .ENABLE SUBSTITUTION .; .; UEBERPRUEFEN DER KOMMANDOZEILE .; .; OUTSPC - AUSGABESPEZIFIKATION .; INSPC - EINGABESPEZIFIKATION .; DEV - MAGNETBANDGERAET .; INFILE - EINGABEDATEI .; .PARSE COMMAN " " OUTSPC COMMAN .PARSE COMMAN "=" OUTSPC INSPC .PARSE INSPC ":" DEV INFILE .IF INFILE EQ "" .GOTO NOTMT .SETS INFILE INFILE+" " .SETS INFILE INFILE[1:17.] .IF DEV NE "MT" .IF DEV NE "MM" .GOTO NOMT .; .; BILDEN EINES NAMENS FUER DIE TEMPORAERE DATEI .; .ASK MTCODE AUFGELEGTES MB EIN ESER-MB .IFT MTCODE .GOTO MOUMT MOU 'DE':/NOLABEL/CC=LIST .GOTO BLDNAM 65 .MOUMT: MOU 'DEV':/NOLABEL/CC=LIST/TR=EBCDIC .BLDNAM: .TESTFILE TI: .PARSE ":" TMP RST .SETS TMP TMP+".TMP" .; .; MB ZURUECKSPULEN ZUM LADEPUNKT .; .IFNINS MAG INS $MAG .IFINS MAG .GOTO MAGR .SETS TSK "MAG" .GOTO NOTSK .MAGR: MAG SET 'DEV':/REWIND .; .; KENNSAETZE BESITZEN EINE SATZ- UND BLOCKLAENGE VON 80. BYTES .; MAG SET 'DEV':/BS=80./RS=80. .LOOK: .; .; EINLESEN DER KENNSAETZE IN DIE TEMPORAERE DATEI .; PIP 'TMP'='DEV':DUMMY.NAM .OPENR 'TMP' .IF NE 1 .GOTO ERROR .; .; VERARBEITEN DER KENNSAETZE, D.H. SUCHEN VON HDR1 UND HDR2, UM .; DATEINAME, SATZ- UND BLOCKLAENGE ZU ERMITTELN .; .READL: .READ LABEL .IFT .GOTO NOSUCH .IF NE 1 .GOTO ERROR .SETS LABELT LABEL[1:3] .IF LABELT = "VOL" .GOTO READL .IF LABELT NE "HDR" .GOTO ILLFMT .SETS LABELT LABEL[5:21.] .; .; UEBERPRUEFEN, OB DATEINAME UEBEREINSTIMMT, WENN NICHT NEUE .; KENNSAETZE DER NAECHSTEN DATEI EINLESEN .; .IF LABELT NE INFILE .GOTO NSFILE .; .; ES WURDE DIE ANGEGEBENE DATEI GEFUNDEN, SUCHEN DES .; ENTSPRECHENDEN HDR2-KENNSATZES, UM DIE BLOCK- UND .; SATZGROESSE ERMITTELN ZU KOENNEN .; .READ LABEL .IFT .GOTO READF .IF NE 1 .GOTO ERROR .SETS LABELT LABEL[1:4] .IF LABELT NE "HDR2" .GOTO READF .SETS LABELT LABEL[37.:37.] .SETS CC "LIST" .IF LABELT = "A" .SETS CC "FORTRAN" .IF LABELT = "M" .SETS CC "NONE" .SETS BS LABEL[6:10.] .SETS RS LABEL[11.:15.] .; 66 .; SETZEN SATZ- UND BLOCKLAENGE UND FORMATSTEUERZEICHEN WIE IN .; HDR2 ANGEGEBEN .; MAG SET 'DEV':/BS='BS'./RS='RS'./CC='CC' .SETS LABELT LABEL[5:5] .IF LABELT EQ "F" .GOTO READF .; .DISABLE MCR MTIN - SATZFORMAT IST 'LABELT', ABER NUR SATZFORMAT F WIRD UNTERSTUETZT .GOTO END .READF: .CLOSE .; .; UEBERTRAGEN DER ANGEGEBENEN DATEI MIT GESETZTER SATZ- UND .; BLOCKLAENGE .; .IFNINS PIP INS $PIP .IFINS PIP .GOTO PIPI .SETS TSK "PIP" .GOTO NOTSK .PIPI: PIP 'OUTSPC'='DEV':"POS=1" .GOTO END .; .; FEHLERMITTEILUNGEN .; .NOTMT: .DISABLE MCR MTIN - EINGABEFEHLER: FALSCHES GERAET ODER FEHLERHAFTER DATEINAME .GOTO END .NOTSK: .DISABLE MCR MTIN - 'TSK' NICHT VORHANDEN - ABBRUCH DER IKD NACH FEHLERBESEITIGUNG NEUSTART DER IKD .GOTO END .ERROR: .DISABLE MCR MTIN - FEHLER DATEI 'TMP' RC: ' IKD WIEDERHOLEN .GOTO END .ILLMT: .DISABLE MCR MTIN - MB ENTHAELT KEINE GUELTIGEN KENNSAETZE .GOTO END .NSFILE: .CLOSE MAG SET 'DEV':/POS=3 .GOTO LOOK .NOSUCH .DISABLE MCR MTIN - KEINE ANGEGEBENE DATEI 'INSPC' VORHANDEN IKD MIT RICHTIGEN NAMEN NOCHMALS STARTEN .END: .ENABLE MCR *.TMP;* PIP /DE/NM DMO 'DEV': .EXIT 67 2.9. Kommandozeilenverarbeitung ------------------------------- 2.9.1. Allgemeines ------------------ Die Kommandozeilenverarbeitung umfasst das Lesen von Kommandozei- len von einem Terminal bzw. einer indirekten Kommandodatei sowie deren Interpretation. Obwohl beide Funkionen meist gemeinsam an- gewendet werden, ist es auch moeglich eine ohne die andere zu be- nutzen. Dabei beinhaltet die Interpretation das Ueberpruefen der Kommandozeile auf syntaktische Richtigkeit, das Verkuerzen der Kommandozeile um alle nichtsignifikanten Zeichen und das Zerlegen in vorhandene Dateispezifikationen. Es koennen Kommandozeilen mit folgendem Format verarbeitet wer- den: 1) dev:[g,m]outfilename.type;version/switch[:value1:value2...],... 2) dev:[g,m]outfilename.type;version/switch[:value1:value2...],... =dev:[g,m]infilename.type;version/switch[:value1:value2 ...],... Wird mehr als eine Dateispezifikation angegeben, sind diese durch Komma zu trennen. Nicht alle Elemente der Dateispezifikation muessen immer vorhanden sein. Die genannten Funktionen der Kommandozeilenverarbeitung werden durch Routinen realisiert, die durch entsprechende Assembler- und Laufzeitmakrorufe im Nutzerprogramm aufgerufen werden. Gleichzei- tig wird der notwendige Speicherbereich fuer die Kommandozeilen- verarbeitung bereitgestellt. Es werden alle Register ausser R0 gerettet. Bei einem auftretenden Fehler wird beim Ruecksprung in die Nut- zertasks das C-Bit gesetzt. 2.9.2. Kommandozeilenlesen (GCML - get command line) ----------------------------------------------------- Beim Lesen einer Kommandozeile wird diese in den Kommandozeilen- eingabepuffer uebertragen. Die erste Eingabe erfolgt ueber Termi- nal, wobei die Kommandoeingabe-Stufe 0 ist. Dabei wird eine Ein- gabeanforderung ausgeschrieben. Ist das erste Zeichen "@" auf das die Spezifikation einer indi- rekten Kommandodatei folgt, wird die Kommandoeingabe-Stufe um 1 erhoeht und von dieser die Eingabe gelesen. Wird von einer indi- rekten Kommandodatei das Dateiende erkannt, wird die Kommandoein- gabe-Stufe um 1 verringert, die Kommandodatei geschlossen, die vorhergehende wieder geoeffnet und die naechste Kommandozeile gelesen. GCML akzeptiert Kommandozeilen beliebiger Laenge. Die Fortsetzung eines Kommandos ueber das Ende einer Terminalzeile wird angenom- men, wenn als letztes Zeichen der Kommandozeile ein Bindestrich angegeben ist. Fuer die gesamte Kommandozeile ist ausreichend Puffer zur Verfuegung zu stellen. Fuer die Realisierung des Kommandozeilenlesens ist ein GCML- Steuerblock (siehe Anlage 26) zu erstellen, dessen Adresse in R0 geladen wird. Da das Kommandozeilenlesen unter Nutzung der Satz-E/A erfolgt, sind im Programm soviel FSR-Blockpuffer vorzusehen, wie Komman- dodateien parallel geoeffnet sind. 68 Die Parameter der folgenden GCML-Makrorufe sind in der Anlage 24 erlaeutert. Die Adresse des GCML-Steuerblockes kann in den Makros weggelassen werden, wenn sie bereits in R0 steht. Zuweisung von Speicherplatz und Initalisieren des GCML- Steuerblockes -------------------------------------------------------- Format: label: GCMLB$ maxd,prmpt,ubuf,lun,pdl,size Der GCMLB$-Makro dient der Zuweisung von Speicherplatz und Initialisierung eines GCML-Steuerblocks im Nutzerprogramm. Dabei werden folgende Funktionen ausgefuehrt: - Erstellen und Initialisieren eines FDB im ersten Teil des GCML-Steuerblocks. Dieser FDB wird zum Oeffnen einer Kom- mandodatei fuer die Kommandozeileneingabe verwendet. Die Initialiesierung und Nutzung des FDB erfolgt unter Steue- rung von GCML und FCS. - Erstellen und Initialisieren des Standarddateinamenblocks im GCML-Steuerblock. Dieser Standarddateinamenblock ge- hoert zu einer Indirektkommandodatei. - Definieren der symbolischen Offsets des GCML-Steuerblocks und deren Bitbelegung. Der benoetigte FSR-Pufferspeicherplatz fuer die Kommandoda- tei muss im FSRSZ$-Makro (siehe 2.2.3.) angefordert werden. Beim Aufgabenaufbau soll die entsprechende physische Gerae- teeinheit der hier definierten logischen Einheitennummer durch die ASG-Anweisung zugeordnet werden (siehe Anleitung fuer den Bediener, Teil 4, Dienstprogramme). Beispiel: GCL: GCMLB$ ,EMU,,2 Der GCML-Steuerblock wird unter der symbolischen Adresse GCL vereinbart. Auf dem Terminal wird die Eingabeanforderung EMU> ausge- schrieben. Da der maxd-Parameter nicht angegeben ist (Ein- gabestufe 0), erfolgt die Kommandoeingabe nur ueber Termi- nal, dem die logische Geraetenummer 2 zugewiesen ist. Die logische Geraetenummer ist durch den Nutzer dem Komman- doeingabegeraet zuzuweisen (z.B. mit der ASG- Direktive beim Taskbilden). Die Puffergroesse der Kommandozeileneingabe betraegt 82 Bytes. Globale Definition der Offsets des GCML-Steuerblocks und deren Bitbelegung -------------------------------------------------------------- Format: GCMLD$ Der GCMLD$-Makro definiert die Offsets des Steuerblocks und deren Bitbelegung im aufrufenden Programm. Er wird automa- tisch von dem GCMLB$-Makro aufgerufen. Die Offsets und Bit- belegungen sind in der Anlage 26 erlaeutert. Standardmaessig werden die Offsets und deren Bitbelegung durch den GCMLD$-Makro lokal definiert. 69 Durch folgende Makroanweisungen koennen die Offsets und Bit- belegungen im Programm lokal bzw. global definiert werden: GCMLD$ DEF$L (lokale) GCMLD$ DEF$G (globale) Lesen der naechsten Kommandozeile in den Kommandozeilen- eingabepuffer -------------------------------------------------------- Format: GCML$ gclblk,adpr,lnpr Beim Geben des GCML$-Makrorufs wird ein Versuch unternommen, eine Kommandozeile wiederaufzufinden. Wenn dieser Versuch fehlschlaegt bzw. wenn die MCR-Kommandozeile gleich 0 ist, dann wird eine Datei fuer Kommandozeileneingabe eroeffnet. Ist das Kommandoeingabegeraet ein Terminal, wird eine Auf- forderungskette ausgeschrieben. Es kann dann jede gewuensch- te Kommandozeile eingegeben werden. Wenn beim Lesen der Kom- mandozeile von einem Terminal oder einer Indirektkommando- datei ein Fehler auftritt, wird das C-Bit gesetzt und in G.ERR des GCML-Steuerblocks ein negativer Fehlercode einge- tragen. Beispiel: GCML$ #GBLK,#PR,#6. Als Eingabeanforderung werden auf dem Terminal 6 Zeichen ab der Adresse #PR ausgeschrieben und die naechste Kommandozei- le gelesen. Schliessen der aktuellen indirekten Kommandodatei ------------------------------------------------- Format: RCML$ gclblk Alle aktuellen Indirektkommandodateien werden geschlossen und die Kommandodatei der Stufe 0 (Terminal) zur Eingabe verwendet. Ein nachfolgender GCML$-Ruf liest dann die naech- ste Kommandozeile vom Terminal. Schliessen der aktuellen indirekten Kommandodatei zwischen Rufen zur Eingabe ------------------------------------------------- Format: CCML$ gclblk Eine Kommandodatei wird nach dem Auffinden einer Kommando- zeile automatisch geschlossen. Loescht der Nutzer das GE.CLO-Bit im Offset G.MODE des GCML- Steuerblocks, bleibt die Kommandodatei zwischen Eingaberufen geoeffnet. Das ist fuer Programme die haeufig Kommandoda- teien lesen von Vorteil, um die Dateizugriffszeit zu ver- kuerzen. Will der Nutzer den Speicherplatz im FSR-Blockpuf- fer zwischen den Kommandoeingaben nutzen, muss er mit diesem Makroruf die aktuelle Kommandodatei schliessen. Dabei werden 512. Bytes des FSR-Blockpuffers freigegeben, die zwischen den Rufen zur Eingabe fuer andere Zwecke genutzt werden koennen. Ein nachfolgender GCML$-Ruf bewirkt das erneute Oeffnen der Kommandodatei und das Lesen der naechsten Kommandozeile. 70 2.9.3. Kommandozeileninterpretation (CSI - command string interpreting) --------------------------------------------------------- Die Kommandozeileninterpretation hat die Aufgabe, Kommandozeilen zu analysieren und in ihre Komponenten Geraetename, Dateiver- zeichnis und Dateiname zu zerlegen, sowie vorhandene Schalter zu verarbeiten. Alle Funktionen der Kommandozeileninterpretation erfordern einen CSI-Steuerblockes (siehe Anlage 27), dessen Adresse in R0 geladen wird. Die Parameter der folgenden CSI-Makrorufe sind in der Anlage 25 erlaeutert. Definieren der symbolischen Offsets und Bitwerte des CSI- Steuerblockes --------------------------------------------------------- Formate: CSI$ ;lokale Definition oder CSI$ DEF$G ;globale Definition Der Speicherplatz fuer den Steuerblock kann z.b. durch folgende Anweisung vereinbart werden: CSIBLK: .BLKB C.SIZE Die offsets und deren Bitbelegung sind in der Anlage 27 erlaeutert. Pruefen einer Kommandozeile auf syntaktische Richtigkeit und Verkuerzen ------------------------------------------------------------ Format: CSI$1 csiblk,buff,len Die Kommandozeile wird ueberprueft auf Syntax. Alle nicht- signifikanten Zeichen werden weggelassen. Nach Analyse der Kommandozeile enthalten die Offsets C.CMLD und C.CMLD+2 die Laenge und Adresse der verkuerzten Kommandozeile. Bei einem Fehler enthalten die Offsets C.FILD und C.FILD+2 die Laenge und Adresse des fehlerhaften Kommandozeilensegments. Zerlegen der Kommandozeile in Geraetename, Dateiverzeichnis und Dateiname sowie Verarbeitung von Schaltern und Schalterwerten --------------------------------------------------------------- Format: CSI$2 csiblk,io,swtab Die Werte in den Offsets C.CMLD und C.CMLD+2 definieren die zu verarbeitende Kommandozeile. Beispiel: CSI$2 #CBLK,OUTPUT,#SWTBL Es soll eine Ausgabedateispezifikation zerlegt werden. Die Adresse der Schalterbeschreibungstabelle ist angegeben, somit koennen Schalter verarbeitet werden. 71 Folgende Fehler sind bei CSI$2 moeglich: - Falscher Wert des Parameters io - Schalter in einer Dateispezifikation enthalten, aber die Adres- se der Schalterbeschreibungstabelle ist nicht angegeben - Schalter in der Schalterbeschreibungstabelle nicht enthalten Erstellen einer Schalterbeschreibungstabelle -------------------------------------------- Format: Swtab: CSI$SW sw,mk,mkw,csflg,nflg,vtab,compflg Nur der erste CSI$SW-Ruf im Programm muss eine Marke haben, um die Adresse der Schalterbeschreibungs-Tabelle zu definie- ren. CSI durchsucht fuer jeden in einer Dateispezifikation enthaltenen Schalter die Schalterbeschreibungstabelle (SW- Tabelle). Wurde der Schalter in dieser Tabelle gefunden, werden die entsprechenden Bits im Maskenwort 1 und Masken- wort 2 gesetzt (siehe Anlage 27). Beispiel: SWT: CSI$SW BR,BRMSK,MASKX,,,BRVTBL CSI$SW LI,LIMSK,MASKX,,,LIVTBL CSI$ND ;ENDE DER TABELLE Es werden die Schalter /BR und /LI in der Schalterbeschrei- bungstabelle mit der Adresse SWT definiert. Gleichzeitig sind die entsprechenden Schaltermasken, ein wahlfreies Nut- zermaskenwort sowie die Adressen der zugehoerigen Schalter- wertebeschreibungstabellen spezifiziert. Erstellen einer Schalterwertebeschreibungstabelle ------------------------------------------------- Format: CSI$SV type,adr,vlen Will der Nutzer in Verbindung mit einem Schalter in einer Dateispezifikation einen Schalterwert verwenden, muss eine entsprechende Schalterwertebeschreibungstabelle (SV-Tabelle) definiert sein. Bei numerischer Konvertierung kann der fuer einen Schalter- wert angegebene Konvertierungstyp durch "#" (z. B. #10) oder "." (z. B. 10.) ueberschrieben werden. Das erfordert entwe- der die oktale oder die dezimale Konvertierung. Ein numerischer Wert kann auch durch "+" oder "-" (z. B. -#10) gekennzeichnet sein. Das Pluszeichen ist Standard. Der CSI$SV-Makro erstellt folgende 2 Worte fuer den Schalterwert: ------------------------------ Vtab: | Laenge des | Konvertie-| | Schalterwertes | rungstyp | |----------------------------| | Adresse der Speicherzelle | | die das Schalterergebnis | | enhaelt. | ------------------------------ 72 Der fuer den Schalterwert benoetigte Speicherplatz kann wie folgt vereinbart werden: .EVEN ADR: .BLKB VLEN Beispiel: BRVTBL: CSI$SV ASCII,BRVAL,3 CSI$SV ASCII,BRVAL+4,3 CSI$ND BRVAL: .BLKW 4 Die in einer Dateispezifikation enthaltenen Schalterwerte sind als KOI-7-Kette zu behandeln. Definieren des Endes einer Schalterbeschreibungs- bzw. Schalterwertebeschreibungstabelle ------------------------------------------------------ Format: CSI$ND Erzeugt eine Wort-Tabelleneintragung mit dem Wert 0. 2.10. Kommandozeilenzerlegung mit TPARS --------------------------------------- 2.10.1. Einleitung und Begriffsbestimmungen ------------------------------------------- TPARS dient der Zerlegung von Kommandozeilen, die im Internspei- cher stehen. Zur Zerlegung werden Zustandstabellen benutzt, in denen die Syn- tax der Kommandozeilen festgelegt ist. Eine Kommandozeile besteht aus einer Folge von Syntaxelementen. Ein oder mehrere Syntaxele- mente bilden einen "Zustand", der durch "Uebergaenge" definiert und in der Zustandstabelle abgespeichert wird. Ein Uebergang legt den Typ des jeweiligen Syntaxelements fest, verweist auf den naechsten zu verarbeitenden Zustand und enthaelt die Adresse einer Funktionsroutine. Funktionsroutinen werden von TPARS zur Bestimmung der Semantik der Syntaxelemente aufgerufen, sie muessen durch den Nutzer ge- schrieben werden. Zur Definition der Zustandstabelle stellt TPARS 3 Makros bereit. Der ISTAT$-Makro initialisiert eine Zustandstabelle, der STATE$- Makro begrenzt einen Zustand und der TRAN$-Makro definiert einen Uebergang. Diese Makros muessen vor dem Aufruf in einer .MCALL-Anweisung aufgelistet werden. Um die Zerlegung einer im Internspeicher stehenden Kommandozeile durchzufuehren, muss der Nutzer die Rou- tine .TPARS aufrufen. Die Routine .TPARS zerlegt die Kommandozei- le entsprechend der definierten Syntax und ruft die angegebenen Funktionsroutinen auf. In den Abschnitten 2.10.2 und 2.10.3 wird die Definition der Syntax der Kommandozeile erklaert, im Abschnitt 2.10.4 das Schreiben von Funktionsroutinen zur Bestimmung der Semantik der Syntaxelemente. Das Zerlegen von Kommandozeilen wird im Abschnitt 2.10.5. beschrieben. 73 2.10.2. Definieren der Zustandstabelle -------------------------------------- Die Zustandstabelle besteht aus Zustaenden, in denen durch Ueber- gaenge die Syntax der Kommandozeile definiert wird. Initialisieren der Zustandstabelle ---------------------------------- Zur Initialisierung der Zustandstabelle dient der ISTAT$-Makro. Das Initialisieren ist die Voraussetzung fuer die Verwendung der Makros STATE$ bzw. TRAN$ zur Definition der Zustaende bzw. Ueber- gaenge. Der ISTAT$ - Makro generiert die Programmsektionen $STATE, $KSTR und $KTAB. Die Zustandstabelle wird in der Programmsektion $STATE gebildet. In der Programmsektion $KSTR werden die vom Nutzer zum Zerlegen der Kommandozeilen definierten Schluesselwoerter gespeichert, waehrend in der Programmsektion $KTAB die Schluesselwort-Zeiger- Tabelle gebildet wird. Die oben genannten 3 Programmsektionen koennen so generiert wer- den, dass sie nur gelesen werden duerfen. Dazu muss der Nutzer vor Aufruf des ISTAT$ - Makros das Symbol $RONLY definieren. Der ISTAT$ - Makro hat das folgende Format: ISTAT$ statetbl, keytbl, $DEBUG Die Parameter haben folgende Bedeutung: statetbl Vom Nutzer gewuenschte Marke (symbolische Adresse) der Zustandstabelle. Sie wird von TPARS auf den Anfang der Zustandstabelle gesetzt. keytbl Vom Nutzer gewuenschte Marke der Schluesselworttabel- le. Sie wird von TPARS auf den Anfang der Schluessel- worttabelle gesetzt. $DEBUG Anweisung an den Assembler, die Adressen der Zustands- tabelle in der Assemblerliste aufzufuehren. Diese Ad- ressen werden fuer die wahlfreie Testroutine benoetigt (siehe 2.10.6). Statetbl und keytbl muessen angegeben werden. Sie werden von TPARS als global vereinbart. Diese Marken gibt der Nutzer bei Aufruf der Routine .TPARS an. Beispiel: $RONLY = 1 ISTAT$ ZUSTT, SCHLT Definieren eines Zustandes -------------------------- Zur Definition eines Zustandes dient der STATE$ - Makro. Der STATE$ - Makro legt den Anfang eines Zustandes fest und grenzt einen Zustand vom anderen ab. Jeder Zustand enthaelt eine beliebige Anzahl von Uebergaengen, die durch den TRAN$ - Makro definiert werden. Der STATE$ - Makro hat das folgende Format: 74 STATE$ label Der wahlweise anzugebene Parameter label definiert die Adresse des Zustandes. Definieren eines Uebergang --------------------------- Uebergaenge dienen der Beschreibung von Zustaenden. Durch Angabe des Typs des Uebergangs wird die Syntax des jeweiligen Kommando- zeilenelementes definiert. Zur Bestimmung der Semantik des be- treffenden Elementes dient die Angabe der Adresse einer Funk- tionsroutine. Im Uebergang wird auch der naechste zu bearbeitende Zustand festgelegt. TPARS bietet zur Kennzeichnung eines erfolgreichen Ueberganges eine Maskenwortoperation an. Zur Definition eines Uebergangs stellt TPARS den TRAN$ - Makro bereit. Der TRAN$ - Makro hat das folgende Format: TRAN$ type,label,frout,mask,maskaddr Fuer die Parameter gilt: type Typ des zu behandelnden Kommandozeilenelements Die zulaessigen Syntaxtypen sind im Abschnitt 2.10.3. be- schrieben. Der Parameter muss stets angegeben werden. label Marke des naechsten Zustandes, der nach Ausfuehrung dieses Ueberganges folgen soll. Wird die Marke nicht angegeben, wird zu dem im Programm naechstfolgenden STATE$- Makro gegangen. bzw. $EXIT: Beenden von TPARS und Uebergabe der Steuerung an das rufende Programm. Werden in einem Zustand mehrere Uebergaenge verwendet, so muss dieser Parameter angegeben werden (mit Ausnahme des letzten Uebergangs). frout Adresse einer vom Nutzer zu schreibenden Funktionsroutine zur Bestimmung der Bedeutung des zu behandelnden Kommando- zeilenelementes. Der Abschnitt 2.10.4. gibt Hinweise zum Schreiben von Funktionsroutinen. Der Parameter braucht nicht angegeben zu werden. mask, maskaddr Maskenwort, Maskenwortadresse Das Maskenwort wird nach dem Aufruf der Funktionsroutine (sofern angegeben) mit einer "ODER" - Operation auf die Maskenwortadresse gebracht, wenn die Uebertragung erfolg- reich war. Wird der Parameter mask angegeben, so muss auch maskaddr angegeben werden. Nach einem TRAN$-Makroruf muss entweder ein STATE$- oder ein wei- terer TRAN$-Makroruf folgen. Alle nach TPARS- Makros folgenden Befehle des Nutzers werden in die unbenannte Programmsektion gebracht. 75 Fehlermitteilungen ------------------ Die TPARS-Makros enthalten folgende Fehlermitteilungen: mask ADDRESS NOT PRESENT Im TRAN$-Makro wurde der Parameter mask angegeben, aber der Parameter maskaddr fehlt. TOO MANY KEYWORDS Es wurde mehr als 64. Schluesselworte definiert (Parameter type des TRAN$-Makros) BAD DEFAULT TRANSITION Im vorhergehenden Uebergang desselben Zustandes war im TRAN$- Makro der Parameter label nicht belegt. Die Fehlermitteilungen werden durch die .ERROR-Anweisung erzeugt (siehe Sprachbeschreibung MACRO 1600). 2.10.3. Typen der Syntaxelemente fuer TPARS ------------------------------------------- Zur Festlegung der Syntax der Kommandozeile dient die Angabe des Typs des Ueberganges. In Abhaengigkeit vom angegebenen Typ mues- sen in der Kommandozeile die entsprechenden Syntaxelemente be- reitgestellt werden. Nachfolgend werden die fuer TPARS zulaes- sigen Typen und ihre Bedeutung aufgefuehrt. $ANY ---- ein einzelnes Zeichen $ALPHA ------ ein einzelnes alphabetisches Zeichen Zugelassen sind die Buchstaben A bis Z. $DIGIT ------ eine einzelne Ziffer Zugelassen sind die Ziffern 0 bis 9. $LAMDA ------ kein Zeichen Eine Uebertragung vom Typ $LAMDA ist immer erfolgreich. Sie wird zum Beispiel angewandt, um Funktionsroutinen ohne Angabe eines Zeichens in der Kommandozeile aufzurufen. $NUMBR ------ eine Zahl Eine Zahl besteht aus einer Kette von Ziffern, der ein Punkt folgen kann. Die Zahl wird durch ein beliebiges nichtnumerisches Zeichen beendet. Ist ein Punkt angegeben, wird die Zahl als Dezimalzahl interpre- tiert, andernfalls als Oktalzahl. Zahlen bis 4 294 967 295 werden in eine vorzeichenlose Integer- 76 zahl von 32 Bits konvertiert und in die Worte .PNUMH und .PNUMB eingetragen. $DNUMB ------ eine Dezimalzahl Die Dezimalzahl wird von TPARS mit Ausnahme des Dezimalpunktes analog zu $NUMBR behandelt. $STRNG ------ eine alphanumerische Zeichenkette Zugelassen sind die Buchstaben A bis Z und die Ziffern 0 bis 9. $RAD50 ------ eine Radix-50 Zeichenkette Zugelassen sind die Buchstaben A bis Z, die Ziffern 0 bis 9, der Punkt . und das Waehrungszeichen $. TPARS fuehrt keine Konvertierung durch. Diese muss durch die Funktionsroutine des Nutzers erfolgen. $BLANK ------ eine Kette von Leerzeichen und/oder Tabulatoren TPARS behandelt Leerzeichen bzw. Tabulatoren in Abhaengigkeit vom niederwertigen Byte im Register R1 bei Aufruf der Routine .TPARS. Beispiel: Es soll die Kette "ROBOTRON TPARS" verarbeitet werden. 1) niederwertiges Byte = 0 : Leerzeichen und Tabulatoren werden uebergangen. Die obige Kette muesste dann so definiert sein: STATE$ TRAN$ $STRNG STATE$ TRAN$ $STRNG TPARS behandelt das Leerzeichen als Trennzeichen. 2) niederwertiges Byte = 1 : Leerzeichen und Tabulatoren werden als Syntaxelemente behandelt. Die obige Kette muesste dann so definiert sein: STATE$ TRAN$ $STRNG STATE$ TRAN$ $BLANK STATE$ TRAN$ $STRNG $EOS ---- Ende der Kommandozeile Erreicht TPARS das Ende der Kommandozeile, wird $EOS sooft be- handelt, wie es in der Zustandstabelle enthalten ist. 77 char ---- das einzelne Zeichen char Der KOI-7-Code von char muss einen Wert zwischen 0 und 177 (ok- tal) haben. Soll ein Komma oder ein Semikolon verwendet werden, so muessen diese in spitze Klammern eingeschlossen werden. Spitze Klammern koennen nur symbolisch dargestellt werden. Beispiele: TRAN$ 'A ;A TRAN$ 135 ;] TRAN$ <',> ;Komma TRAN$ <';> ;Semikolon SPKA = '< TRAN$ SPKA ;spitze Klammer auf keyword ------- das Schluesselwort keyword Schluesselworte duerfen nur alphanumerische Zeichen enthalten. Sie werden in der Kommandozeile durch das erste auftretende Zei- chen, das keine Ziffer bzw. kein Buchstabe ist, begrenzt. Schluesselworte koennen eine beliebige Laenge haben. Fuer eine Zustandstabelle sind maximal 64 Schluesselworte erlaubt. Die Schluesselworte werden in der Programmsektion $KSTR gespei- chert. TPARS greift mittels der Schluesselwortzeigertabelle in der Programmsektion $KTAB auf die Schluesselworte zu. Beispiel: Schluesselwort OPT : TRAN$ "OPT" !label ------ eine Kette, die unter dem Zustand mit der Marke label definiert ist. TPARS verarbeitet den Teil der Kommandozeile entsprechend den Anweisungen, die in der Zustandstabelle unter dem Zustand mit der Marke label stehen. Dieser Typ wird fuer Teilausdruecke verwen- det. Die Verwendung von Teilausdruecken erfolgt zweckmaessigerweise dann, wenn eine zu zerlegende Kette mehrmals auftritt. Ein Teil- ausdruck beginnt mit einem STATE$-Makroruf, in dem die Marke des Teilausdrucks angegeben ist. Anschliessend folgt der Koerper des Teilausdrucks, der aus Zustaenden und Uebergaengen besteht. Der Teilausdruck wird durch einen TRAN$ - Makroruf beendet, in dem im Markenfeld $EXIT angegeben ist. Anschliessend muss ein STATE$- Makroruf folgen. Reihenfolge der Syntaxtypen --------------------------- In einem Zustand koennen mehrere Uebergaenge verwendet werden. Werden in diesen Uebergaengen unterschiedliche Syntaxtypen ver- wendet, so ist die Reihenfolge von Bedeutung. Fuer Zustaende mit mehreren Syntaxtypen wird folgende Reihenfolge vorgeschlagen: char keyword 78 $EOS $ALPHA $DIGIT $BLANK $NUMBR $DNUMB $STRNG $RAD50 $ANY $LAMDA Die Plazierung von Uebergaengen vom Typ !label innerhalb eines Zustands ist abhaengig von den anderen Syntaxtypen des Zustandes sowie von den Syntaxtypen im ersten Zustand des Teilausdrucks. 2.10.4. Schreiben von Funktionsroutinen --------------------------------------- Vom Nutzer geschriebene Funktionsroutinen werden von TPARS auf- gerufen, um die Bedeutung der Syntaxelemente der Kommandozeile zu bestimmen. Fuer jeden Zustand koennen mehrere Funktionsroutinen aufgerufen werden. Jeder Uebergang laesst den Aufruf einer Funktionsroutine zu. Durch Verwendung des Syntaxelementetyps $LAMDA ist es moeg- lich, Funktionsroutinen ohne irgendein Eingabezeichen aufzurufen. Funktionsroutinen werden durch .TPARS mit "JSR PC" aufgerufen. Deshalb muessen sie mit "RTS PC" beendet werden. Durch Rueck- sprung mittels "RTS PC+2" hat der Nutzer die Moeglichkeit, einen Uebergang abzulehnen. Dadurch hat der Uebergang keine Wirkung. TPARS verarbeitet dann die restlichen Uebergaenge im Zustand. Das Ablehnen eines Uebergangs kann beispielsweise bei einer fehler- haften Kommandozeile angewendet werden. In den Funktionsroutinen koennen die Register R0, R1 und R2 verwendet werden, alle anderen Register muessen gerettet werden. Mittels globaler Symbole koennen Funktionsroutinen auf Werte von TPARS zugreifen. Nachfolgend werden die symbolischen Adressen der Worte und ihr Inhalt beschrieben. Die Worte sind in der Programm- sektion IMPURE gespeichert. .PSTCN bzw. .PSTPT ------------------ enthalten die Laenge in Bytes bzw. die Adresse der durch den be- treffenden Uebergang definierten Eingabekette der Kommandozeile. .PSTPT und .PSTCN werden fuer alle im Abschnitt 2.10.3. be- schriebenen Syntaxtypen verwendet. .PNUMH bzw. .PNUMB ------------------ enthalten den hoeherwertigen bzw. den niederwertigen binaeren Wert der Zahl, die durch einen Uebergang vom Typ $NUMBR oder $DNUMB gewonnen wurde. Der Inhalt von .PNUMH und .PNUMB bleibt bei allen Uebergaengen mit Ausnahme der Typen $NUMBR und $DNUMB unveraendert. .PCHAR ------ enthaelt das Zeichen, das durch einen Uebergang vom Typ $ANY, $ALPHA, $DIGIT oder char in der Kommandozeile gefunden wurde. 79 .PFLAG ------ enthaelt die Steuerbytes, die der Nutzer an die Routine .TPARS ueber das Register R1 uebergeben hat. Funktionsroutinen des Nutzers koennen dieses Wort aendern, um eine dynamische Steuerung von .TPARS zu erzielen. R3 bzw. R4 ---------- enthaelt die Laenge in Bytes bzw. die Adresse des Restes der Ein- gabekette. Nach Aufruf einer Funktionsroutine enthaelt die Kette nicht mehr die durch den aktuellen Uebergang bereitgestellten Zeichen. Werden Funktionsroutinen durch Teilausdruecke aufgerufen, muessen diese ihre Ergebnisse zwischenspeichern. Dadurch koennen Funk- tionsroutinen auf dem Grundniveau der Zustandstabelle auf diese Ergebnisse zugreifen. 2.10.5. Zerlegung einer Kommandozeile ------------------------------------- Um die Zerlegung einer im Internspeicher stehenden Kommandozeile durchzufuehren, muss der Nutzer die Routine .TPARS durch CALL .TPARS aufrufen. Vor dem Aufruf von .TPARS sind die Register wie folgt zu setzen: R1: Steuer-Bytes niederwertiges Byte: =0: Tabulatoren und Leerzeichen werden nur als Trennzeichen behandelt. =1: Tabulatoren und Leerzeichen werden als Syntaxelemente interpretiert. hoeherwertiges Byte: =0: Die Schluesselworte in der zu zerlegenden Kommandozeile muessen genau die Laenge haben, die im zugehoerigen Eintrittspunkt in der Zustandstabelle festgelegt ist. =n: Die Schluesselworte in der zu zerlegenden Kommandozeile brauchen nur aus n Zeichen bestehen. R2: Zeiger auf die Schluesselworttabelle R3: Laenge der zu zerlegenden Kommandozeile R4: Adresse der zu zerlegenden Kommandozeile R5: Adresse des Anfangszustands in der Zustandstabelle Nach dem Aufruf von .TPARS sind die Register wie folgt gesetzt: R3: Laenge des nicht zerlegten Teils der Kommandozeile R4: Adresse des nicht zerlegten Teils der Kommandozeile Alle anderen Register sind gerettet. War das Zerlegen erfolgreich (ein Uebergang, der nicht in einem Teilausdruck enthalten war, enthielt $EXIT), loescht die Routine .TPARS das C-Bit. Bei Auftreten eines Syntaxfehlers setzt .TPARS das C-Bit und bricht ab. 80 Syntaxfehler sind: - unerlaubter Typ des Uebergangs - Fehler in der Zustandstabelle - Der Teil der Kommandozeile, der verarbeitet wird, entspricht keinem Syntaxelement im aktuellen Zustand (ein Zustand enthaelt keinen erfolgreichen Uebergang). Fehlerhafte Adressen in der Zustands- bzw. Schluesselworttabelle fuehren zum Abbruch von .TPARS. Besonderheiten bei der Zerlegung von Teilausdruecken ---------------------------------------------------- Wenn in einem Uebergang ein Teilausdruck auftritt, rettet .TPARS seine aktuellen Werte und ruft sich selbst auf. Dabei wird die Marke des Teilausdrucks als Anfangszustand verwendet. War die Zerlegung des Teilausdrucks erfolgreich ($EXIT wurde erreicht), wird der Uebergang akzeptiert und zum naechsten Zustand gegangen. Enthaelt der Teilausdruck einen Syntaxfehler, speichert TPARS seine geretteten Werte zurueck und versucht, den naechsten Ueber- gang im Zustand zu verarbeiten. 2.10.6. Wahlfreie Testroutine ----------------------------- Der Nutzer hat die Moeglichkeit, durch eine von ihm bereitge- stellte Testroutine die TPARS-Abarbeitung zu ueberwachen. Dazu muss der Nutzer die Eintrittspunktadresse fuer die Testroutine in die TPARS-Speicherzelle .TPDEB wie folgt eintragen: MOV #ADR,.TPDEB Dann ist TPARS nicht wie ueblich, sondern durch CALL .TPARD aufzurufen. Bei Eintritt in die Testroutine enthalten die Register 3 bis 5 folgende Informationen: R3 - Laenge des restlichen Teils der Eingabekette R4 - Adresse des restlichen Teils der Eingabekette R5 - Aktuelle Adresse der Uebergangstabelle Die Registerinhalte duerfen durch die Testroutine nicht veraen- dert werden. Um die Registerinhalte richtig auswerten zu koennen, werden die Adressen aus der Zustandstabelle benoetigt. Um diese zu erhalten, ist der wahlfreie Parameter $DEBUG im Makroruf ISTAT$ anzugeben (siehe 2.10.2.). 81 2.10.7. Hinweise zur Programmstruktur ------------------------------------- Die Routine .TPARS steht in der unbenannten Programmsektion, die Uebergabewerte werden in der Programmsektion IMPURE gespeichert. Die TPARS-Makros bilden die Programmsektionen $KSTR, $KTAB und $STATE. Beschreibung der Programmsektionen ---------------------------------- (x= R0, falls $RONLY definiert, sonst x=leer) IMPURE (.PSECT IMPURE,D) ------ Die Programmsektion ist stets 6 Worte lang. 1.Wort: .PFLAG 2.Wort: .PSTCN 3.Wort: .PSTPT 4.Wort: .PCHAR 5.Wort: .PNUMH 6.Wort: .PNUMB $KSTR (.PSECT $KSTR,D,x) ----- Diese Programmsektion enthaelt die in TRAN$-Makrorufen definier- ten Schluesselwoerter. Diese sind durch ein Byte mit dem Oktal- code 377 voneinander getrennt. $KTAB (.PSECT $KTAB,D,x) ----- Diese Programmsektion enthaelt die Adressen der Eintrittspunkte der Schluesselworte, die in der Programmsektion $KSTR gespeichert sind. $STATE (.PSECT $STATE,D,x) ------ Diese Programmsektion enthaelt die Zustaende. Jeder Zustand be- steht aus seinen Uebergaengen, die entsprechend der Reihenfolge ihrer Angabe verkettet sind. Ist die Marke des Zustands angege- ben, wird sie der Adresse des ersten Uebergangs im Zustand gleichgesetzt. Jeder Uebergang besteht aus einem Bereich, der 1 bis 6 Worte lang sein kann. Dieser Bereich hat folgenden Aufbau: 82 ------------------------------------------------------------ | Byte | Inhalt | |----------------------------------------------------------| | 0 | Typbyte | | | 0-177: KOI-7-Code fuer das angegebene Zeichen | | | char | | | 200+n: Type keyword; n ist ein Index in der | | | Schluesselworttabelle zum Zeiger auf | | | das Schluesselwort | | | 300: $LAMDA | | | 302: $NUMBR | | | 304: $STRNG | | | 306: $BLANK | | | 310: $SUBXP | | | 312: $EOS | | | 314: $DNUMB | | | 316: $RAD50 | | | 320: $ANY | | | 322: $ALPHA | | | 324: $DIGIT | |----------------------------------------------------------| | 1 | Bit 0 = 1: Typ-Erweiterung ist vorhanden | | | Bit 1 = 1: Adresse einer Funktionsroutine | | | ist angegeben | | | Bit 2 = 1: Marke des naechsten Zustandes ist | | | angegeben | | | Bit 3 = 1: Maskenwort ist angegeben | | | Bit 4 = 1: Adresse des Maskenwortes ist ange- | | | geben | | | Bit 7 = 1: letzter Uebergang im Zustand | |----------------------------------------------------------| | 2-3 | Typ-Erweiterung | |----------------------------------------------------------| | 4-5 | Adresse der Funktionsroutine | |----------------------------------------------------------| | 6-7 | Maskenwort | |----------------------------------------------------------| |10-11 | Adresse des Maskenwortes | |----------------------------------------------------------| |12-13 | Marke des naechsten Zustandes | ------------------------------------------------------------ 83 2.10.8. Beispiele ----------------- 1) Ablehnen eines Uebergangs durch Ruecksprung mit "RTS PC+2" ADD #2,(SP) RTS PC 2) Bilden eines Teilausdrucks Im Teilausdruck mit der Marke R50 ist eine Radix-50-Kette zu lesen, der ein Plus-Zeichen folgt. STATE$ R50 TRAN$ $RAD50 STATE$ TRAN$ '+,$EXIT Verwendung des Teilausdrucks: STATE$ TRAN$ !R50 3) Definition einer Kommandozeile Die Kommandozeile soll folgenden syntaktischen Aufbau haben: RF dvnm:<[g,m]>fnam.ftyp;fver< OVBS=...>< LUN=...> <...>::= wahlweise dvnm: Geraetenamen unit: Nummer der Geraeteeinheit (0...7) g: UIC, Gruppennummer m: UIC, Mitgliedsnummer fnam: Dateiname ftyp: Dateityp fver: Versionsnummer OVBS: Groesse des Geraetepuffers, dezimal LUN: logische Geraetenummer Das angegebene Geraet soll ab Adresse DEV, die Laenge im Wort LDEV abgespeichert werden. Analog gilt fuer den UIC die Adresse UIC bzw. das Wort LUIC. Die vollstaendige Dateibezeichnung soll ab Adresse NAM und deren Laenge im Wort LNAM abgespeichert wer- den. Ist der angegebene Dateinamen laenger als 9. Zeichen bzw. der Dateityp laenger als 3 Zeichen, so ist der betreffende Ueber- gang abzulehnen. Wird OVBS angegeben, so ist Bit 0 im Wort RFCW zu setzen und der Wert im Wort ROVBS abzuspeichern. Bei Angabe von LUN ist Bit 2 im Wort RFCW zu setzen und der Wert in RLUN abzuspeichern. ; DEFINITION DER ZUSTANDSTABELLE ISTAT$ RFSTT,RFKT ; ; UEBERLESEN KOMMANDONAME STATE$ TRAN$ "RF" STATE$ TRAN$ $BLANK ; LESEN GERAETENAMEN 84 STATE$ TRAN$ $ALPHA,,MDVNM1 STATE$ TRAN$ $ALPHA,,MDVNM2 STATE$ ; LESEN NR. DER GERAETEEINHEIT STATE$ TRAN$ $DIGIT,DP,MUNIT TRAN$ $LAMDA STATE$ DP TRAN$ ': ; LESEN UIC STATE$ TRAN$ '[,UIC2,MUIC1 TRAN$ $LAMDA,FNAM STATE$ UIC2 TRAN$ $NUMBR,,MUIC2 STATE$ TRAN$ <',>,,MUIC1 STATE$ TRAN$ $NUMBR,,MUIC2 STATE$ TRAN$ '],,MUIC1 ; LESEN DATEINAMEN STATE$ FNAM TRAN$ $STRNG,,TMFN STATE$ TRAN$ '.,,TMPS ; LESEN DATEITYP STATE$ TRAN$ $STRNG,,TMFT STATE$ TRAN$ <';>,,TMPS ; LESEN VERSIONSNUMMER STATE$ TRAN$ $NUMBR,,TMFV ; TEST ENDE DER ZEILE ODER OPTIONWORT STATE$ EOSCH TRAN$ $EOS,$EXIT TRAN$ $BLANK STATE$ TRAN$ "OVBS",RO,,1,RFCW ;SETZEN BIT 0 TRAN$ "LUN",RL,,4,RFCW ;SETZEN BIT 2 ; LESEN PUFFERGROESSE STATE$ RO TRAN$ '= STATE$ TRAN$ $DNUMB,EOSCH,MOVBS ; LESEN LOGISCHE NUMMER STATE$ RL TRAN$ '= STATE$ TRAN$ $NUMBR,EOSCH,MLUN STATE$ ; ; DEFINITION DER FUNKTIONSROUTINEN ; GERAETENAMEN - 1.ZEICHEN MDVNM1: MOVB .PCHAR,DEV INC LDEV RTS PC 85 ; GERAETENAMEN - 2.ZEICHEN MDVNM2: MOVB .PCHAR,DEV+1 INC LDEV RTS PC ; NUMMER DER GERAETEEINHEIT MUNIT: MOVB .PCHAR,DEV+2 INC LDEV RTS PC ; UIC MUIC1: MOV LUIC,R1 MOVB .PCHAR,UIC(R1) INC LUIC RTS PC ; MUIC2: MOV .PSTPT,R1 MOV #UIC,R2 ADD LUIC,R2 MOV .PSTCN,R0 ADD R3,LUIC 10$: MOVB (R1)+,(R2)+ DEC R0 BNE 10$ ; ; DATEINAMEN TMFN: MOV #9.,R2 BR TMC TMFT: MOV #3,R2 TMC: CMP R2,.PSTCN BLT NER TMN: MOV .PSTPT,R1 MOV #NAM,R2 ADD LNAM,R2 20$: MOVB (R1)+,(R2)+ INC LNAM DEC .PSTCN BNE 20$ RTS PC NER: ADD #2,(SP) RTS PC ; TMPS: MOV LNAM,R2 MOVB .PCHAR,NAM(R2) INC LNAM RTS PC ; TMFV: TST .PNUMH BNE NER BR TMN ; ; GROESSE GERAETEPUFFER MOVBS: MOV .PNUMB,ROVBS RTS PC ; ; LOGISCHE NUMMER MLUN: MOV .PNUMB,RLUN RTS PC 86 4) Aufruf von TPARS (Die Kommandozeile beginnt bei Adresse AKZ, die Laenge steht im Wort LKZ) CLR RFCW CLR LDEV CLR LUIC CLR LNAM MOV #401,r1 ; SPACE UND TABS SIND SYNTAKTISCHE ELEMENTE ; SCHLUESSELWORTANGABE: 1 BUCHSTABE MOV #RFKT,R2 ; ADR. SCHLUESSELWORTTABELLE MOV LKZ,R3 MOV #AKZ,R4 MOV #RFSTT,R5 ; 1. ZUSTAND DER ZUSTANDSTABELLE CALL .TPARS BCS RFERR ; FEHLERROUTINE : 5) Zulaessige Kommandozeilen R MT5:ABC.MAC;1 LUN=10. RF DK:[100,10]FILE.DAT;20 RF DK7:A.OBJ;2 OV=1024 L=3 2.11. Spooling -------------- Unter Spooling versteht man das Einreihen von Dateien in die Warteschlange eines Geraetes fuer den nachfolgenden Druck. Fuer Spooling steht der PRINT$-Makro oder auf der Unterprogrammebene die Routine .PRINT zur Verfuegung. Aequivalent zum Aufruf des PRINT$-Makros ist: MOV #FDB,R0 ;FDB-Adresse CALL .PRINT BCC OK CALL ERR OK: ... Der PRINT$-Makro wird aufgerufen, um die zum Druck bestimmte Datei in die Warteschlange des Spoolgeraetes einzugliedern. Das Spoolgeraet wird bei der Generierung der Printspooler-Task fest- gelegt. Als Spoolgeraet sind Drucker oder Terminal moeglich. Durch das MCR-Kommando RED kann die im PRT-Task getroffene Zuwei- sung geandert werden. Die auszugebende Datei wird durch den zugehorigen FDB beschrieben. Die Datei muss im Druckformat vor- liegen, d.h. in der Datei muessen die Formatsteuerzeichen vorhan- den sein oder im FDB muessen in F.RATT die entsprechenden Satz- attribute gesetzt sein. Die auszugebende Datei muss aus druckba- ren Zeichen bestehen. Sie muss vor Aufruf des PRINT$- Makros ge- oeffnet worden sein. Ist die Spooldatei nicht geoeffnet, so wird die Bearbeitung ohne eine Fehlermeldung durch den PRINT$-Makro abgelehnt. Der PRINT$-Makro schliesst die Spooldatei und stellt alle notwen- digen Informationen ueber sie aus dem zugehoerigen FDB fuer die Printspooler-Task (PRT) bereit. 87 Diese Task wird durch den RQST$-Makro im PRINT$-Makro gestartet. Die Printspooler-Task bewirkt das Ausdrucken der Datei. Treten innerhalb der Printspooler-Task Fehler auf, so werden diese dem Nutzer in der Form ******PRT--text mitgeteilt, wobei der Text die Fehlerursache naeher beschreibt. In Abhaengigkeit von der Generierung der PRT-Task wird die Spool- datei geloescht oder bleibt erhalten. Die Fehlerkennzeichnung im PRINT$-Makro unterscheidet sich von der in Abschnitt 2.7. beschriebenen Fehlerbehandlung durch FCS 1630. Beim PRINT$-Makro koennen Fehler, die durch FCS festge- stellt werden und Fehler, die durch Exekutiverufe festgestellt werden, auftreten. Bei Fehlern, die innerhalb von FCS liegen, z.B. wenn die Datei durch den PRINT$-Makro nicht geschlossen wer- den kann, wird wie in Abschnitt 2.7. beschrieben, das C-Bit ge- setzt und in F.ERR der Fehlercode eingetragen. Wenn der Fehler ausserhalb von FCS liegt, wird das C-Bit gesetzt und in $DSW ist der Fehlercode enthalten. Der Nutzer sollte daher in seiner Feh- lerroutine bei gesetztem C-Bit F.ERR und $DSW austesten. Format des Print$-Makros: PRINT$ fdb,err,,dev,unit,pri,forms,copies,presrv Durch den Parameterwert fdb wird dem PRINT$-Makro die Adresse des FDB uebergeben, der die Spooldatei beschreibt. Der Parameter err ist ein Wahlparameter. Ist der Parameter err gesetzt, wird in die enprechende Fehlerroutine der Nutzertask verzweigt, falls die Abarbeitung des PRINT$-Makros fehlerhaft ist. Zwischen err und dev ist ein leerer Parameter vorhanden, so dass an dieser Stelle zwei Kommata erforderlich sind. Die weiteren Parameter sind in dieser Ausbaustufe des FCS 1630 ohne Bedeutung und nur aus Kompatibilitaetsgruenden angefuehrt. 88 Anlage 1 Begriffserlaeuterung ------------------------------- Asynchroner Systemtrap (AST) ------------------------------ Im FCS wird der AST verwendet, um das Ende einer Block-E/A-Opera- tion anzuzeigen und die Abarbeitung der vom Nutzer programmierten AST-Bedienungsroutine einzuleiten (siehe Anleitung fuer den Pro- grammierer, Teil 2, Steuerprogrammsystem (Exekutive) OMEX 1630). Block, virtueller ----------------- Jede Datei besteht unabhaengig von ihrer logischen Struktur aus virtuellen Bloecken. Auf Platte sind die virtuellen Bloecke 512. Bytes lang. Die virtuellen Bloecke jeder Datei werden von jeweils 1 beginnend fortlaufend numeriert. Datei (file) ------------- Die Datei ist eine selbstaendig verwaltete Datenstruktur auf einem Datentraeger. Jede Datei besteht aus einem Dateikennsatz und Nutzerdaten. FCS spricht Dateien durch ihre Dateispezifikation an. (Siehe Anlei- tung fuer den Programmierer, Teil 4, Dateiformate im Betriebs- system OMOS 1630.) Dateibeschreibungsblock (file descriptor block, FDB) ----------------------------------------------------- Waehrend des Oeffnens und der Verarbeitung von Dateien werden von FCS bestimmte Informationen benoetigt. Diese Informationen lie- fert der Dateibeschreibungsblock, der eine Datenstruktur im Nut- zerprogramm ist. Fuer jede vom Nutzerprogramm gleichzeitig zu oeffnende Datei muss ein FDB vorhanden sein. Teile des FDB werden vom Nutzer definiert, die anderen werden von FCS belegt. Fuer das Erstellen eines FDB werden Makrorufe benutzt. Der Aufbau des FDB ist in Anlage 2 dargestellt. Dateideskriptor (dataset descriptor) ------------------------------------- Der Dateideskriptor besteht aus 6 Worten im Nutzerprogramm, die eine Dateispezifikation angeben. Sein Inhalt ist z.B. durch .WORD-Direktiven zu setzen, seine Adresse wird durch den dspt-Parameter in den Offset F.DSPT des entsprechenden FDB eingetragen (siehe Dateispezifikation und Anlage 5). Dateinamenblock (file name block, FNB) --------------------------------------- Der Dateinamenblock ist Teil des FDB und enthaelt die aufbereite- te Dateispezifikation (siehe Anlage 4). Dateispeicherbereich (file storage region, FSR) ------------------------------------------------- Der Dateispeicherbereich befindet sich im Nutzerprogramm und dient als Arbeitsbereich fuer FCS 1630. Er besteht aus folgenden zwei Teilen (Programmsektionen), die stets physisch zusammenhaen- gen. 89 $$FSR1 - Dieser Bereich enthaelt Blockpuffer und Blockpufferkoep- fe fuer Satz-E/A. Ihre Anzahl ist abhaengig von der An- zahl der Dateien, die der Nutzer gleichzeitig fuer Satz- E/A-Operationen oeffnen will. Die Groesse dieses Bereiches wird vom Nutzer unter Be- nutzung des FSRSZ$-Makros festgelegt. Im Blockpuffer findet das Blocken und Entblocken der Saetze statt. $$FSR2 - Dieser Bereich enthaelt Informationen fuer die Arbeit von FCS 1630. Dateispezifikation (file specifikation) ---------------------------------------- Eine Dateispezifikation besteht aus folgenden Informationen ueber eine Datei: - Geraetename und Geraetenummer - Gruppen- und Mitgliedsnummer, die das Nutzerdateiverzeichnis spezifizieren, in dem die Datei gefuehrt wird bzw. gefuehrt werden soll - Dateiname - Dateityp - Versionsnummer der Datei Diese Informationen werden in den Dateinamenblock eingetragen. Dazu werden beim Oeffnen einer Datei von FCS folgende Schritte durchgefuehrt: - erst pruefen, ob Dateinamenblock gefuellt ist - wenn nicht, so verwenden der Informationen des Dateideskriptors - dann ergaenzen aus Standarddateinamenblock Um Nutzerfehler zu vermeiden und die Verwendung eines Dateibe- schreibungsblockes fuer mehrere Dateien zu erleichtern, wird der Dateinamenblock beim Schliessen der Datei zerstoert. Die unterschiedlichen Funktionen von Dateinamenblock, Dateide- skriptor und Standarddateinamenblock gestatten dem Nutzer bei der Arbeit mit mehreren Dateien die jeweiligen Dateispezifikationen seinem Problem angepasst vorzugeben. E/A-Statusblock --------------- Der E/A-Statusblock wird nur fuer die Block-E/A benoetigt. Er ist ein 2-Worte langer Block, in den Statusinformationen ueber die Block-E/A-Operation eingetragen werden. Aufbau: -------------------------------------- | Geraeteabhaengige | Auskunft ueber | | Information | Status der E/A | Wort 1 -------------------------------------- | Anzahl der gelesenen | Wort 2 | bzw. geschriebenen Bytes | -------------------------------------- 90 Das niederwertige Byte des 1. Wortes des E/A-Statusblockes ent- haelt verschluesselt den Status der READ$- bzw. WRITE$-Operation. Es gilt: ----------------------------------------------------- | Wert | Bedeutung | ----------------------------------------------------- | = 0 | E/A-Uebertragung noch laufend | | > 0 | fehlerfrei, E/A-Uebertragung abgeschlossen | | < 0 | mit Fehler | ----------------------------------------------------- Im hoeherwertigen Byte sind geraeteabhaengige Informationen ver- schluesselt. Das 2. Wort enthaelt die Anzahl der gelesenen bzw. geschriebenen Bytes. Dabei ist zu beachten, dass bei einer WRITE$-Operation die geforderte Anzahl der geschriebenen Bytes enthalten sein muss, andernfalls erfolgt eine Fehlermeldung. Bei einer READ$-Operation dagegen enthaelt das 2. Wort die Anzahl der aktuell gelesenen Bytes. Ereignisflag (event flag) -------------------------- Ereignisflags dienen FCS zur Synchronisation der E/A-Operationen. Standardmaessig wird Ereignisflag 32 (40 oktal) benutzt. Offset ------ Der Offset ist eine Relativadresse. Bei der Arbeit mit FCS 1630 werden vorwiegend symbolische Offsets verwendet. Beispielsweise bezeichnen die symbolischen Offsets der Form F.xxx bzw. F.xxxx Bereiche des FDB relativ zu seiner Anfangsadresse. Satz (record) ------------- Der Satz ist eine Datenstruktur, deren Laenge vom Nutzer festge- legt wird. Die innere Strukturierung des Satzes ist ausschliess- lich Sache des Nutzerprogramms. In der Regel ist der Satz Teil eines virtuellen Blockes, und damit die kleinste Datenstruktur, auf die der Nutzer mit Hilfe von FCS zugreifen kann. Standarddateinamenblock (default file name block, DFNB) -------------------------------------------------------- Der Standarddateinamenblock besteht aus 36 (oktal) Bytes. Er kann durch den Makroruf NMBLK$ im Nutzerprogramm zur Bereitstellung von Informationen zur Dateispezifikation definiert werden. Seine Adresse wird durch den dfnb-Parameter in den Offset F.DFNB des entsprechenden FDB eingetragen (siehe Dateispezifikation). 91 Anlage 2 Uebersicht ueber die Speicherbelegung des FDB -------------------------------------------------------- --------------------------------------------------------------- | Offset | Laenge | Parameter | |okt.| symb. | in | | | | Satz-E/A | Block-E/A | Byte | Satz-E/A | Block-E/A | |-------------------------------------------------------------| | 0 | F.RTYP | 1 | rtyp | | 1 | F.RATT | 1 | ratt | | 2 | F.RSIZ | 2 | rsiz | | 4 | F.HIBK | 4 | - | | 10 | F.EFBK | 4 | - | | 14 | F.FFBY | 2 | - | | 16 | F.RACC | 1 | racc | | 17 | F.RCTL | 1 | - | |-------------------------------------------------------------| | 20 | F.URBD | F.BKDS | 2 | urbs | bkds | | 22 | F.URBD+2 | F.BKDS+2 | 2 | urba | bkda | | 24 | F.NRBD | F.BKST | 2 | nrbs | bkst | | 26 | F.NRBD+2 | F.BKDN | 2 | nrba | bkdn | | 30 | F.OVBS | - | 2 | ovbs | - | | | F.NREC | - | 2 | - | - | |-------------------------------------------------------------| | 32 | F.EOBB | 2 | - | - | |-------------------------------------------------------------| | 34 | F.RCNM | F.CNTG | 2 | hrcnm | cntg | | 36 | F.RCNM+2 | F.STBK | 2 | lrcnm | - | |-------------------------------------------------------------| | 40 | F.ALOC | 2 | aloc | | 42 | F.LUN | 1 | lun | | 43 | F.FACC | 1 | facc | | 44 | F.DSPT | 2 | dspt | | 46 | F.DFNB | 2 | dfnb | |-------------------------------------------------------------| | 50 | F.EFN | F.BKEF | 1 | efn | bkef | |-------------------------------------------------------------| | 51 | F.BKP1 | 1 | - | | 52 | F.ERR | 1 | - | | 53 | F.ERR+1 | 1 | - | |-------------------------------------------------------------| | 54 | (F.MBCT) | - | 1 | mbct | | 55 | (F.MBC1) | - | 1 | - | | 56 | (F.MBFG) | - | 1 | mbfg | | 57 | (F.BGBC) | - | 1 | - | |-------------------------------------------------------------| | 60 | F.VBSZ | 2 | - | | 62 | F.BBFS | 2 | - | |-------------------------------------------------------------| | 64 | F.VBN | F.BKVB | 4 | - | bkvb | | 66 | | F.BKVB+2 | | | | |-------------------------------------------------------------| | 70 | F.BDB | 2 | - | | 72 | (F.SPDV) | 2 | - | | 74 | (F.SPUN) | 1 | - | | 75 | (F.CHR) | 1 | - | | 76 | F.ACTL | 2 | actl | |100 | F.SEQN | 2 | - | |102 | F.FNB | | - | --------------------------------------------------------------- 92 Anlage 3 Beschreibung der Offsets ----------------------------------- --------------------------------------------------------------- | Offset |Laenge| | | symb.|okt.|(Byte)| Werte und Erlaeuterung | |-------------------------------------------------------------| |F.RTYP| 0 | 1 | Satztypbyte fuer Saetze | | | | | =1=R.FIX fester Laenge | | | | | =2=R.VAR variabler Laenge | | | | | =3=R.SEQ var. Laenge mit Folgenummer| |-------------------------------------------------------------| |F.RATT| 1 | 1 | Satzattributbyte | | | | | Bit 0=1=FD.FTN | | | | | Bit 1=1=FD.CR | | | | | Bit 2 nicht verwendet | | | | | Bit 3=1=FD.BLK | |-------------------------------------------------------------| |F.RSIZ| 2 | 2 | Groesse der Saetze fester Laenge bzw. | | | | | Groesse des laengsten Satzes einer Datei | | | | | mit Saetzen variabler Laenge | |-------------------------------------------------------------| |F.HIBK| 4 | 4 | hoechste vereinbarte virtuelle Blocknr. | |-------------------------------------------------------------| |F.EFBK| 10 | 4 | End-of-file-Blocknummer | |-------------------------------------------------------------| |F.FFBY| 14 | 2 | erstes freies Byte im letzten Block bzw. | | | maximale Blockgroesse bei Magnetband | |-------------------------------------------------------------| |F.RACC| 16 | 1 | Satzzugriffsbyte | | | | | Bit 0=1=FD.RWM Block-E/A (READ$-WRITE$- | | | | | Modus) | | | | | =0 Satz-E/A (GET$-PUT$-Mod. | | | | | Bit 1=1=FD.RAN direkter Zugriff bei | | | | | Satz-E/A | | | | | =0 sequentieller Zugriff | | | | | Bit 2=1=FD.PLC Zeigermodus f. Satz-E/A | | | | | =0 Uebertragungsmodus | | | | | Bit 3=1=FD.INS keine Verkuerzung der | | | | | Datei bei PUT$ im sequ. | | | | | Zugriff | | | | | =0 PUT$ im sequent. Zugriff | | | | | verkuerzt die Datei | |-------------------------------------------------------------| |F.RCTL| 17 | 1 | Geraetecharakterisierungsbyte | | | | | Bit 0=1=FD.REC satzorientiertes Geraet | | | | | =0 blockorientiertes Geraet| | | | | Bit 1=1=FD.CCL vorschubgesteu. Geraet | | | | | =0 sonst | | | | | Bit 2=1=FD.TTY Terminalgeraet | | | | | =0 sonst | | | | | Bit 3=1=FD.DIR Dateiverzeichnisgeraet | | | | | =0 sonst | | | | | Bit 4=1=FD.SDI Geraet mit einem Datei- | | | | | verzeichnis; (Es gibt | | | | | keine UFD) | | | | | Bit 5=1=FD.SQD blockorientiertes sequ. | | | | | Geraet (Ein satzorient. | | | | | Geraet ist immer sequ.) | --------------------------------------------------------------- 93 Anlage 3 (Fortsetzung) --------------------------------------------------------------- | Offset |Laenge| | | symb.|okt.|(Byte)| Werte und Erlaeuterungen | |-------------------------------------------------------------| |F.BKDS| 20 | 4 | Laenge des zu lesenden bzw. schreibenden | | | | | Blockes in Byte (F.BKDS) | | | | | Adresse des Block-E/A-Puffers (F.BKDS+2) | | oder | | | | |F.URBD| | | Groesse des Nutzersatzpuffers in Byte | | | | | (F.URBD) | | | | | Adresse des Nutzersatzpuffers | | | | | (F.URBD+2) | |-------------------------------------------------------------| |F.NRBD| 24 | 4 | Laenge des zu schreibenden bzw. des | | | | | gelesenen Satzes in Byte (F.NRBD) | | | | | Adresse des zu schreibenden bzw. des | | | | | gelesenen Satzes (F.NRBD+2) | | | | | | |F.BKST| | 2 | E/A-Statusblockadresse | | und | | | | |F.BKDN| | 2 | Adresse der AST-Bedienungsroutine | |-------------------------------------------------------------| |F.OVBS| 30 | 2 | Blockpuffergroesse bei Ueberschreibung | | | | | der Standardpuffergroesse (nur vor Oeff- | | | | | nen der Datei von Bedeutung) | | oder | | | | |F.NREC| | | Adresse des naechsten Satzes im Block | |-------------------------------------------------------------| |F.EOBB| 32 | 2 | Blockpufferende | |-------------------------------------------------------------| |F.RCNM| 34 | 4 | 15 hoeherwertige Bits der Satznummer fuer| | | | | direkten Zugriff bei Satz-E/A (F.RCNM) | | | | | 16 niederwertige Bits der Satznummer | | | | | (F.RCNM+2) | | oder | | | | |F.CNTG| | 2 | Blockanzahl fuer eine neu zu erstellende | | | | | Datei (nur vor Offnen von Bedeutung) | | und | | | | |F.STBK| | 2 | Adresse des Statistikblockes im Nutzer- | | | | | programm | |-------------------------------------------------------------| |F.ALOC| 40 | 2 | Blockanzahl fuer Erweiterung der Datei | |-------------------------------------------------------------| |F.LUN | 42 | 1 | Logische Geraetenummer | --------------------------------------------------------------- 94 Anlage 3 (Fortsetzung) --------------------------------------------------------------- | Offset |Laenge| | | symb.|okt.|(Byte)| Werte und Erlaeterung | |-------------------------------------------------------------| |F.FACC| 43 | 1 | Dateizugriffsbyte | | | | | Bit 0=1=FA.RD fuer Lesen | | | | | Bit 1=1=FA.WRT fuer Schreiben | | | | | Bit 2=1=FA.EXT fuer Erweitern | | | | | Bit 3=1=FA.CRE Erstellen einer neuen | | | | | Datei | | | | | =0 existierende Datei | | | | | Bit 4=1=FA.TMP temporaere Datei | | | | | Bit 5=1=FA.SHR Datei fuer gemeinsamen | | | | | Zugriff eroeffnet | | | | | Bit 6=1=FA.APD Anhaengen von Daten an | | | | | und eine existierende Datei | | | | | Bit 3=0 | | | | | Bit 6=1=FA.NSP kein Ersetzen einer exi-| | | | | und stierenden Datei zur Da-| | | | | Bit 3=1 teibildungszeit | |-------------------------------------------------------------| |F.DSPT| 44 | 2 | Adresse des Dateideskriptors | |-------------------------------------------------------------| |F.DFNB| 46 | 2 | Adresse des Standarddateinamenblockes | |-------------------------------------------------------------| |F.BKEF| 50 | 1 | Ereignisflag fuer Block-E/A | | oder | | | | |F.EFN | | | Ereignisflag fuer Satz-E/A | |-------------------------------------------------------------| |F.BKP1| 51 | 1 | Byte fuer FCS-interne Steuerung | |-------------------------------------------------------------| |F.ERR | 52 | 1 | Fehlerruecksprungcode; negativer Wert | | | | | zeigt Fehlerbedingung an | |-------------------------------------------------------------| |F.ERR | 53 | 1 | Verwendung wenn F.ERR negativ | | +1 | | | F.ERR+1=0 Fehlerruecksprungcode ist | | | | | ein E/A-Fehlercode | | | | | F.ERR+1<0 Fehlerruecksprungcode ist | | | | | ein Direktive-Statuswort- | | | | | Fehlercode | |-------------------------------------------------------------| |F.MBCT| 54 | 1 | Anzahl der zu verwendenden Puffer bei | | | | | Mehrfachpufferung | |-------------------------------------------------------------| |F.MBC1| 55 | 1 | aktuell benutzte Puffer bei Mehrfach- | | | | | pufferung | |-------------------------------------------------------------| |F.MBFG| 56 | 1 | Bit 0=1=FD.RAH Vorauslesen bei Mehrfach-| | | | | pufferung | | | | | Bit 1=1=FD.WBH Hinterherschreiben bei | | | | | Mehrfachpufferung | |-------------------------------------------------------------| |F.BGBC| 57 | 1 | Anzahl der Bloecke fuer einen Gross- | | | | | puffer bei Grosspufferung | |-------------------------------------------------------------| |F.VBSZ| 60 | 2 | Geraetepuffergroesse (virtuelle Block- | | | | | groesse in Bytes) | |-------------------------------------------------------------| 95 Anlage 3 (Fortsetzung) --------------------------------------------------------------- | Offset |Laenge| | | symb.|okt.|(Byte)| Werte und Erlaeuterung | |-------------------------------------------------------------| |F.BBFS| 62 | 2 | Blockpuffergroesse fuer das der Datei zu-| | | | | gewiesene Geraet (in Bytes) | --------------------------------------------------------------- |F.BKVB| 64 | 4 | 15 hoeherwertige Bits der virtuellen | | | | | Blocknummer bei Block-E/A (F.BKVB) | | | | | 16 niederwertige Bits der virt. Blockn. | | oder | | | (F.BKVB+2) | |F.VBN | | | virtuelle Blocknummer bei Satz-E/A | |-------------------------------------------------------------| |F.BDB | 70 | 2 | Adresse des Blockpufferkopfes bzw. des | | | | | e/A-Statusblockes | | | | | Wert = 0: Datei geschlossen | |-------------------------------------------------------------| |F.SPDV| 72 | 2 | Diese Offsets werden nicht benutzt. | |------------------| Kompatibilitaet zu SKR oder reserviert | |F.SPUN| 74 | 1 | fuer interne Nutzung durch das System | |-------------------------------------------------------------| |F.CHR | 75 | 1 | Bit 0=1 ANSI-Magnetbandformat D bzw. F | |-------------------------------------------------------------| |F.ACTL| 76 | 2 | Bit 15=FA.ENB bewirkt zusammen mit: | | | | | | | | | | Bit 12=FA.POS | | | | | Beim Erstellen neuer Dateien | | | | | werden Magnetbaender hinter die Datei | | | | | positioniert, die zuletzt geschlossen | | | | | wurde. Alle Dateien dahinter sind ver- | | | | | loren. FA.RWD ueberschreibt FA.POS. Bei| | | | | Nichtangabe wird auf das logische Ende | | | | | der Datentraegerfolge positioniert. | | | | | Bit 11=FA.RWD | | | | | Beim Oeffnen bzw.Schliessen wird | | | | | das Magnetband zurueckgespult. | | | | | Bit 9=FA.DLK | | | | | Plattendateien, die fuer Schrei- | | | | | ben geoeffnet wurden, werden nicht ge- | | | | | sperrt, auch wenn sie nicht korrekt | | | | | geschlossen wurden. | | | | | num.Wert im niederwertigen Byte | | | | | Anzahl der Blockadresszeiger | | | | | in einem Dateifenster. Bei Nichtangabe | | | | | wird der Datentraegerstandardwert ge- | | | | | nommen (meist als 7 generiert; | | | | | Erhoehen beschleunigt den Zugriff zu | | | | | Dateien, die aus so vielen Stuecken | | | | | bestehen; Erniedrigen spart dynamischen| | | | | Speischer im System) | |-------------------------------------------------------------| |F.SEQN|100 | 2 | Folgenummer bei Saetzen vom Typ R.SEQ | |-------------------------------------------------------------| |F.FNB |102 | 36 | Dateinamenblock (siehe Anlage 4) | --------------------------------------------------------------- 96 Anlage 4 Dateinamenblock -------------------------- Die Offsets des Standarddateinamenblockes und des Dateinamen- blockes sind identisch und werden mit N.xxxx bezeichnet. Der Dateinamenblock beginnt im FDB beim Offset F.FNB . Aufbau des FNB --------------------------------------------------------------- | Adressen relativ zu |Laenge| | | FDB | FNB | in | Erlaeuterung | | symb.|okt.| symb.|okt.| Byte | | |-------------------------------------------------------------| |F.FNB | 102|N.FID | 0 | 6 | Dateiidentifikation | |-------------------------------------------------------------| |F.FNAM| 110|N.FNAM| 6 | 6 | Dateiname; 9 in Radix-50 ge- | | | | | | | speicherte Zeichen | |-------------------------------------------------------------| |F.FTYP| 116|N.FTYP 14 | 2 | Dateityp; 3 in Radix-50 ge- | | | | | | | speicherte Zeichen | |-------------------------------------------------------------| |F.FVER| 120|N.FVER| 16 | 2 | Dateiversionsnummer (binaer) | |-------------------------------------------------------------| | - | 122|N.STAT| 20 | 2 | FNB-Statuswort (s.u.) | |-------------------------------------------------------------| | - | 124|N.NEXT| 22 | 2 | Anschlussinformation fuer | | | | | | | .FIND-Routine | |-------------------------------------------------------------| | - | 126|N.DID | 24 | 6 | Datei-ID des UFD | |-------------------------------------------------------------| |F.DVNM| 134|N.DVNM| 32 | 2 | Geraetename (2 KOI-7-Zeichen)| |-------------------------------------------------------------| |F.UNIT| 136|N.UN|T| 34 | 2 | Geraetenummer (binaer) | --------------------------------------------------------------- Ist der FNB fuer Magnetband, enthalten die Felder N.FID, N.FNAM und N.FTYP die ersten zwoelf Bytes der Dateinamenkette unter dem symbolischen Offset N.ANM1. Die restlichen Bytes des Dateinamens stehen in dem Feld N.DID unter dem symbolischen Offset N.ANM2. Das Feld N.FID ist nur 4 Bytes lang. 97 FNB-Statuswort --------------------------------------------------------------- | Symbol |Bit| Erlaeuterung | | | | Das entsprechende Bit wird gesetzt, wenn: | |-------------------------------------------------------------| |NB.VER | 0 | Dateiversionsnummer explizit angegeben 1) | |-------------------------------------------------------------| |NB.TYP | 1 | Dateityp explizit angegeben 1) | |-------------------------------------------------------------| |NB.NAM | 2 | Dateiname explizit angegeben 1) | |-------------------------------------------------------------| |NB.SVR | 3 | Dateiversionsnummer als "*" angegeben | |-------------------------------------------------------------| |NB.STP | 4 | Dateityp als "*" angegeben | |-------------------------------------------------------------| |NB.SUM | 5 | Dateiname als "*" angegeben | |-------------------------------------------------------------| |NB.DIR | 6 | UIC explizit angegeben 1) | |-------------------------------------------------------------| |NB.DEV | 7 | Geraetename explizit angegeben 1) | |-------------------------------------------------------------| |NB.SD1 | 8 | Gruppennummer des UIC enthaelt "*" | |-------------------------------------------------------------| |NB.SD2 | 9 | Mitgliedsnummer des UIC enthaelt "*" | |-------------------------------------------------------------| |NB.ANS |10 | Der Dateiname ist im Magnetbandformat ange- | | | | geben. | --------------------------------------------------------------- 1) Ein Dateideskriptor wird zum Fuellen des FNB genutzt. 98 Anlage 5 Dateideskriptor -------------------------- --------------------------------------------------------------- | Wort| Inhalt | |-------------------------------------------------------------| | | 1 | Laenge der KOI-7-Kette mit dem Geraetenamen | | | | in Bytes. (2 Alphazeichen, die das Geraet an- | | | | geben, gefolgt von 1 oder 2 Oktalziffern und | | | | einem Doppelpunkt, die die Geraeteeinheit be- | |Geraete-| | stimmen.) | | name |----------------------------------------------------| | | 2 | Adresse dieser Kette | |-------------------------------------------------------------| | | 3 | Laenge der KOI-7-Kette mit dem Dateiverzeich- | | | | nis in Bytes (Gruppen- und Mitgliedsnummer, | | Datei- | | die durch Komma getrennt und in eckigen | | ver- | | Klammern eingeschlossen sind). | |zeichnis|----------------------------------------------------| | | 4 | Adresse dieser Kette | |-------------------------------------------------------------| | | 5 | Laenge der KOI-7-Kette mit dem Dateinamen | | | | in Bytes. Ausserdem koennen der Dateityp (mit | | Datei- | | . und 3 Zeichen) und eine Versionsnummer (mit | | name | | ; und Oktalzahl) dazugehoeren. | | |----------------------------------------------------| | | 6 | Adresse dieser Kette | --------------------------------------------------------------- Eine Laengenangabe von 0 im Wort 1, 3 oder 5 des Dateideskrip- tors zeigt an, dass der Geraetename, das Dateiverzeichnis oder der Dateiname nicht spezifiziert ist. Der Dateiname besteht aus bis zu 9, der Dateityp aus bis zu 3 alphanumerischen Zeichen. Anlage 6 Statistikblock ------------------------- --------------------------------------------------------------- |Wort| Inhalt | |-------------------------------------------------------------| | 1 | hoeherwertiger Teil | logische Blocknummer | | | | des ersten Blockes der Datei | |----------------------------| | | 2 | niederwertiger Teil | (0, wenn die Datei nicht | | | | physisch zusammenhaengend) | |-------------------------------------------------------------| | 3 | hoeherwertiger Teil | | |----------------------------| Anzahl der Bloecke der Datei | | 4 | niederwertiger Teil | | |-------------------------------------------------------------| | 5 | (Lock-Zaehler, Zugriffszaehler) | --------------------------------------------------------------- Die Adresse des Statistikblocks kann vor dem Oeffnen der Datei in den FDB-Offset F.STBK eingetragen werden. In diesem Fall traegt FCS die Informationen waehrend des Oeffnens der Datei in den Statistikblock ein. Der Speicherplatz fuer den Statistikblock ist im Nutzerprogramm zu vereinbaren. 99 Anlage 7 Uebersicht ueber die FCS-Makrorufe --------------------------------------------- --------------------------------------------------------------- | Makro | Parameter | initialis. | |-------------------------------------------------------------| | FDBDF$ | | | | FDAT$A | rtyp,ratt,rsiz,cntg,aloc | FDB | | FDRC$A | racc,urba,urbs | zur | | FDBK$A | bkda,bkds,bkvb,bkef,bkst,bkdn | Assembler- | | FDOP$A | lun,dspt,dfnb,facc,actl | zeit | | FDBF$A | efn,ovbs,mbct,mbfg | | |-------------------------------------------------------------| | | | FSR zur | | FSRSZ$ | files,bufsiz,psect | Assembler- | | | | zeit | |-------------------------------------------------------------| | | | | | NMBLK$ | fnam,ftyp,fver,dvnm,unit | DFNB zur | | | | Assembler- | | | | zeit | |-------------------------------------------------------------| | FDAT$R | fdb,rtyp,ratt,rsiz,cntg,aloc | | | FDRC$R | fdb,racc,urba,urbs | FDB | | FDBK$R | fdb,bkda,bkds,bkvb,bkef,bkst,bkdn | zur | | FDOP$R | fdb,lun,dspt,dfnb,facc,actl | Laufzeit | | FDBF$R | fdb,efn,ovbs,mbct,mbfg | | |-------------------------------------------------------------| | FINIT$ | | FSR zur | | | | Laufzeit | |-------------------------------------------------------------| | OPEN$X | fdb,lun,dspt,racc,urba,urbs,err | | | OPNS$X | | | | OPNT$W | | | | OPNT$D | | | | OFID$X | | | | OFNB$X | | | |------------------------------------------------| | | OPEN$ | fdb,facc,lun,dspt,dfnb,racc,urba,urbs,| | | | err | | |------------------------------------------------| | | GET$ | fdb,urba,urbs,err | | | GET$S | | | |------------------------------------------------| | | GET$R | fdb,urba,urbs,lrcnm,hrcnm,err | Datei- | |------------------------------------------------| verar- | | PUT$ | fdb,nrba,nrbs,err | beitung | | PUT$S | | | |------------------------------------------------| | | PUT$R | fdb,nrba,nrbs,lrcnm,hrcnm,err | | |------------------------------------------------| | | READ$ | fdb,bkda,bkds,bkvb,bkef,bkst,bkdn,err | | | WRITE$ | | | |------------------------------------------------| | | WAIT$ | fdb,bkef,bkst,err | | |------------------------------------------------| | | CLOSE$ | fdb,err | | | DELET$ | | | --------------------------------------------------------------- 100 Anlage 8 Uebersicht ueber die von den Parametern initialisierten Offsets im FDB und FNB -------------------------------------------------- --------------------------------------------------------------- | Para- | gesetzter | | | meter | Offset | Makroruf | |-------------------------------------------------------------| | fdb | - | alle Laufzeitmakrorufe | |-------------------------------------------------------------| | rtyp | F.RTYP | FDAT$A,FDAT$R | | ratt | F.RATT | | | rsiz | F.RSIZ | | | cntg | F.CNTG | | | aloc | F.ALOC | | |-------------------------------------------------------------| | racc | F.RACC | FDRC$A,FDRC$R,OPEN$,OPEN$X,OPNS$X | | | | OPNT$W,OPNT$D | |-------------------------------------------------------------| | urba | F.URBD+2 | FDRC$A,FDRC$R,OPEN$,OPEN$X,OPNS$X | | urbs | F.URBD | OPNT$W,OPNT$D,GET$,GET$S,GET$R | |-------------------------------------------------------------| | bkda | F.BKDS+2 | FDBK$A,FDBK$R,READ$,WRITE$ | | bkds | F.BKDS | | | bkvb | F.BKVB | | |-------------------------------------------------------------| | bkef | F.BKEF | FDBK$A,FDBK$R,READ$,WRITE$,WAIT$ | | bkst | F.BKST | | |-------------------------------------------------------------| | bkdn | F.BKDN | FDBK$A,FDBK$R,READ$,WRITE$ | |-------------------------------------------------------------| | lun | F.LUN | FDOP$A,FDOP$R,OPEN$,OPEN$X,OPNS$X | | dspt | F.DSPT | OPNT$W,OPNT$D | |-------------------------------------------------------------| | dfnb | F.DFNB | FDOP$A,FDOP$R,OPEN$ | | facc | F.FACC | | |-------------------------------------------------------------| | actl | F.ACTL | FDOP$A,FDOP$R | |-------------------------------------------------------------| | efn | F.EFN | FDBF$A,FDBF$R | | ovbs | F.OVBS | | | mbct | F.MBCT | | | mbfg | F.MBFG | | |-------------------------------------------------------------| | hrcnm | F.RCNM | GET$R,PUT$R | | lrcnm | F.RCNM+2 | | |-------------------------------------------------------------| | nrba | F.NRBD+2 | PUT$,PUT$S,PUT$R | | nrbs | F.NRBD | | |-------------------------------------------------------------| | err | - | alle Dateiverarbeitungsmakrorufe | |-------------------------------------------------------------| | fnam | N.FNAM | | | ftyp | N.FTYP | | | fver | N.FVER | NMBLK$ | | dvnm | N.DVNM | | | unit | N.UNIT | | --------------------------------------------------------------- 101 Anlage 9 Parameter der Makrorufe ---------------------------------- --------------------------------------------------------------- | Parameter | Erlaeuterung | |-------------------------------------------------------------| | fdb | Adresse des entsprechenden FDB | |-------------------------------------------------------------| | rtyp | Satztyp der neu zu erstellenden Datei | | | Einer der folgenden Werte muss angegeben werden:| | | | | | R.FIX - Schreiben von Saetzen fester Laenge in | | | die neu zu schaffende Datei | | | R.VAR - Schreiben von Saetzen variabler Laenge | | | ohne Folgenummer | | | R.SEQ - Schreiben von Saetzen variabler Laenge | | | mit Folgenummer | |-------------------------------------------------------------| | ratt | Satzattribute fuer neu zu erstellende Datei | | | Folgende Werte koennen angegeben werden: | | | | | | FD.FTN - Bei Ausgabe auf einem vorschubgesteuer-| | | ten Geraet wird das 1.Byte des Satzes | | | als Formatsteuerzeichen behandelt. | | | FD.CR - Bei Ausgabe auf einem vorschubgesteuer-| | | ten Geraet wird vor dem Satz ein LF | | | und nach dem Satz ein CR ausgegeben. | | | FD.BLK - Die Saetze duerfen die Blockgrenzen | | | nicht ueberschreiten. | | | | | | Eine Kombination mehrerer Werte ist mit "!" | | | moeglich. FD.FTN und FD.CR schliessen sich | | | gegenseitig aus. | |-------------------------------------------------------------| | rsiz | Groesse der Saetze fester Laenge (in Bytes), die| | | in die Datei geschrieben werden. | |-------------------------------------------------------------| | cntg | Blockanzahl fuer neu zu erstellende Datei | | | | | | positiver Wert - Die angegebene Blockanzahl wird| | | der Datei physisch zusammen- | | | haengend auf dem Datentraeger | | | zugewiesen, und die Datei ist | | | selbst zusammenhaengend. | | | negativer Wert - Die angegebene Blockanzahl | | | wird der Datei zugewiesen. Die | | | Datei ist nicht notwendig zu- | | | sammenhaengend auf dem Daten- | | | traeger. | | | Ist der Parameter nicht angegeben, wird der | | | Datei kein Speicherplatz zugewiesen. | --------------------------------------------------------------- 102 Anlage 9 (Fortsetzung) --------------------------------------------------------------- | Parameter | Erlaeuterung | |-------------------------------------------------------------| | aloc | Blockanzahl fuer Erweiterung der Datei | | | | | | positiver Wert - Die angegebene Blockanzahl | | | wird angrenzend als hinzukom- | | | mender Speicherplatz der Datei | | | zugewiesen. Die Datei ist phy- | | | sisch zusammenhaengend. | | | negativer Wert - Die angegebene Blockanzahl | | | wird der Datei als hinzukom- | | | mender Speicherplatz zugewiesen| | | Die Datei ist nicht notwendig | | | physisch zusammenhaengend. | | | | | | Standarderweiterung bei Schreiben eines Blockes:| | | a)Die Datei soll um mehr als einen virtuellen | | | Block erweitert werden: | | | Die Datei wird um die noch echt benoetigte | | | Blockanzahl zum Vervollstaendigen des Schrei- | | | bens der Datei erweitert. | | | b)Wird nur ein virtueller Block zum Vervoll- | | | staendigen der Datei benoetigt, wird die Datei| | | um den Standardwert des Datentraegers erwei- | | | tert. | |-------------------------------------------------------------| | racc | Spezifikation der Form (Block- oder Form der | | | Satz-E/A) der Dateiverarbeitung | | | Folgende Werte koennen angegeben werden: | | | | | | FD.RWM - Bei der Dateiverarbeitung werden Block-| | | E/A-Operationen verwendet. | | | Bei Nichtangabe des Wertes werden Satz-| | | E/A-Operationen angenommen. | | | FD.RAN - Verwendung des direkten Zugriffs bei | | | der Dateiverarbeitung. | | | Bei Nichtangabe d. Wertes sequ. Zugriff| | | FD.PLC - Verwendung des Zeigermodus bei der | | | Dateiverarbeitung. | | | |st der Wert nicht spezifiziert, wird | | | der Uebertragungsmodus angenommen. | | | FD.INS - Eine PUT$-Operation im sequentiellen | | | Zugriff, die innerhalb der Datei durch-| | | gefuehrt wird, soll diese nicht ver- | | | kuerzen. | | | Ist dieser Wert bei einer PUT$-Opera- | | | tion im sequentiellen Zugriff nicht | | | spezifiziert, setzt FCS das logische | | | Ende der Datei unmittelbar hinter den | | | eingefuegten Satz. Die uebrigen Bloecke| | | der Datei werden aber nicht freigegeben| --------------------------------------------------------------- 103 Anlage 9 (Fortsetzung) --------------------------------------------------------------- | Parameter | Erlaeuterung | |-------------------------------------------------------------| | urba | Adresse des Nutzersatzpuffers | |-------------------------------------------------------------| | urbs | Groesse des Nutzersatzpuffers in Byte | |-------------------------------------------------------------| | bkda | Adresse des E/A-Blockpuffers, der fuer Block-E/A| | | Verwendet wird. | |-------------------------------------------------------------| | bkds | Groesse des zu lesenden bzw. zu schreibenden | | | Blockes in Byte | |-------------------------------------------------------------| | bkvb | Adresse eines 2-Worte Blockes im Nutzerprogramm,| | | der die virtuelle Blocknummer fuer Block-E/A | | | enthaelt. | |-------------------------------------------------------------| | bkef | Ereignisflag zur Synchronisation der Block-E/A; | | | Standard ist das Ereignisflag 32. | |-------------------------------------------------------------| | bkst | Adresse des E/A-Statusblockes im Nutzerprogramm | | | Der E/A-Statusblock ist 2 Worte lang und nimmt | | | von FCS |nformationen ueber den Verlauf der | | | Block-E/A auf. | |-------------------------------------------------------------| | bkdn | Adresse der AST-Bedienungsroutine | | | |st dieser Parameter angegeben, erfolgt nach Be-| | | enden der Block-E/A ein asynchroner Systemtrap | | | zur angegebenen Adresse. | |-------------------------------------------------------------| | lun | Logische Geraetenummer | |-------------------------------------------------------------| | dspt | Adresse des Dateideskriptors (6 Worte langer | | | Block im Nutzerprogramm) | |-------------------------------------------------------------| | dfnb | Adresse des Standarddateinamenblockes | |-------------------------------------------------------------| | facc | symbolische Werte, die angeben, wie auf eine | | | Datei zugegriffen werden soll. | | | Es kann einer bzw. eine Kombination folgender | | | Werte spezifiziert werden: | | | FO.RD - Oeffnen einer existierenden Datei nur | | | fuer das Lesen | | | FO.APD- Oeffnen einer existierenden Datei zur | | | Erweiterung | | | FO.MFY- Oeffnen einer existierenden Datei fuer | | | Aenderungen | | | FO.UPD- Oeffnen einer existierenden Datei zum | | | Aktualisieren bzw. wenn erforderlich | | | zum Erweitern | | | FO.WRT- Erstellen einer neuen Datei | | | FA.NSP!FO.WRT - Die alte Datei, die die gleiche | | | Dateispezif. wie die neue hat, | | | wird durch diese nicht ersetzt. | | | FA.TMP!FO.WRT - Die zu bildende Datei ist eine | | | temporaere Datei. | | | FA.SHR- Oeffn. einer Dat. fuer gemeins. Zugriff | --------------------------------------------------------------- 104 Anlage 9 (Fortsetzung) --------------------------------------------------------------- | Parameter | Erlaeuterung | |-------------------------------------------------------------| | actl | FA.ENB!FA.POS Beim Erstellen neuer Dateien | | | werden Magnetbaender hinter die Datei | | | positioniert, die zuletzt geschlossen | | | wurde. Alle Dateien dahinter sind verlo-| | | ren. FA.RWD ueberschreibt FA.POS. Bei | | | Nichtangabe wird auf das logische Ende | | | der Datentraegerfolge positioniert. | | | FA.ENB!FA.RWD Beim Oeffnen bzw.Schliessen wird | | | das Magnetband zurueckgespult. | | | FA.ENB!FA.DLK Plattendateien, die fuer Schrei- | | | ben geoeffnet wurden, werden nicht ge- | | | sperrt, auch wenn sie nicht korrekt | | | geschlossen wurden. | | | num.Wert im niederwertigen Byte Anzahl der | | | Blockadresszeiger in einem Dateifenster.| | | Bei Nichtangabe wird der Datentraeger- | | | standardwert genommen (meist als 7 gene-| | | riert; Erhoehen beschleunigt den Zugriff| | | zu Dateien, die aus so vielen Stuecken | | | bestehen; Erniedrigen spart dyn.Speicher| | | im System) | |-------------------------------------------------------------| | efn | Ereignisflag zur Synchronisation der Satz-E/A | | | Standardwert ist 32. | |-------------------------------------------------------------| | ovbs | Blockpuffergroesse in Bytes, mit der die Stan- | | | dardpuffergroesse des fuer die Datei bestimmten | | | Geraetes ueberschrieben wird. | | | Dieser Blockpuffer wird von FCS im FSR gebildet.| | | Beim Geben des CLOSE$-Makrorufes wird diese | | | Speicherstelle im FDB auf Null gesetzt. Bei be- | | | stimmten Geraeten (z.B. Zeilendrucker und Termi-| | | nals) soll die Blockgroesse die Zeilenbreite des| | | Geraetes nicht ueberschreiten. | | | Bei Magnetplatten muss die hier angegebene | | | Blockpuffergroesse ein ganzzahliges Vielfaches | | | von 512 sein. Es koennen Blockpuffergroessen bis| | | zu 63 Sektoren von jeweils 512 Bytes also 32256 | | | Bytes (dezimal) angegeben werden. | |-------------------------------------------------------------| | mbct | Ein numerischer Wert, der die Anzahl der Puffer | | | festlegt, die FCS bei der Verarbeitung der Datei| | | benutzen soll. Ist der Wert groesser als 1 ist | | | Mehrfachpufferung vereinbart. Ist der Parameter | | | mit Null angegeben, nutzt FCS den Wert, der in | | | der symbolischen Speicherstelle .MBFCT in $$FSR2| | | steht. Dieser Wert ist normalerweise 1, wenn er | | | nicht beim Aufgabenaufbau veraendert wurde. | --------------------------------------------------------------- 105 Anlage 9 (Fortsetzung) --------------------------------------------------------------- | Parameter | Erlaeuterung | |-------------------------------------------------------------| | mbfg | Symbolischer Wert, der den Typ der Mehrfachpuf- | | | ferung vereinbart. | | | FD.RAH - Die Vorausleseoperation ist anzuwenden | | | (Standard fuer alle mit OPEN$R eroeff- | | | neten Dateien). | | | FD.WBH - Die Hinterherschreiboperation ist an- | | | zuwenden (Standard fuer alle nicht mit | | | OPEN$R eroeffneten Dateien). | | | Diese Parameter schliessen sich gegenseitig aus.| | | Die entsprechende Speicherstelle wird bei Geben | | | des CLOSE$-Makrorufes auf Null gesetzt. | |-------------------------------------------------------------| | fnam | Dateiname (bis zu 9 alphanumerische Zeichen) | |-------------------------------------------------------------| | ftyp | Dateityp (bis zu 3 alphanumerische Zeichen) | |-------------------------------------------------------------| | fver | Versionsnummer der Datei numerischer Wert | |-------------------------------------------------------------| | dvnm | Name des Datentraegers der Datei; 2 KOI-7-Zei- | | | chen | |-------------------------------------------------------------| | unit | Nummer der Geraeteeinheit, die zur Verarbeitung | | | der Datei verwendet wird. | |-------------------------------------------------------------| | files | a) Wert>0 maximale Anzahl von Dateien, die fuer | | | Satz-E/A eroeffnet werden sollen. | | | b) Wert=0 es wird nur Block-E/A durchgefuehrt. | |-------------------------------------------------------------| | bufsiz | Maximale Summe der Groesse der Blockpuffer fuer | | | die gleichzeitig zu oeffnenden Dateien. | | | Standard ist files*512. Bytes. | |-------------------------------------------------------------| | psect | Name der Programmsektion, auf die sich die nach | | | dem FSRSZ$-Ruf folgenden Makroanweisungen be- | | | ziehen. Standard ist "leer". | | | Wird dieser Parameter weggelassen, wird aus den | | | folgenden Makroanweisungen eine neue unbekannte | | | Programmsektion gebildet. Wenn das nicht ge- | | | wuenscht ist, sollte man den Namen der Programm-| | | sektion angeben, in welcher der Makroruf FSRSZ$ | | | gegeben wurde. | |-------------------------------------------------------------| | lrcnm | numerischer Wert, der die 16 niederwertigen Bits| | | der Satznummer spezifiziert. | |-------------------------------------------------------------| | hrcnm | numerischer Wert, der die 15 hoeherwertigen Bits| | | der Satznummer spezifiziert. | |-------------------------------------------------------------| | nrba | Adresse des zu schreibenden Satzes | |-------------------------------------------------------------| | nrbs | Laenge des zu schreibenden Satzes in Byte | |-------------------------------------------------------------| | err | Adresse einer Fehlerbehandlungsroutine im Nut- | | | zerprogramm | --------------------------------------------------------------- 106 Anlage 10 Makrorufe zum Oeffnen der Dateien -------------------------------------------- ----------------------------------------------------------------- |Makrorufe | Kurzcharakteristik | |---------------------------------------------------------------| |OPEN$W | Erstellen einer neuen Datei (fuer beliebige | | | Verarbeitung) | |---------------------------------------------------------------| |OPEN$x | Oeffnen einer existierenden Datei fuer die | |(x=R,M,U,A) | Zugriffs- und Verarbeitungsformen | | | Lesen (Read), Modifizieren (Modify, Lesen | | | und Einschreiben neuer Inhalte), Aktualisieren | | | (Update, Modifizieren einschliesslich | | | Anfuegen), Anfuegen (Append, Aktualisieren, | | | aber mit Anfuegen beginnen) | |---------------------------------------------------------------| | OPNS$x | Erstellen einer neuen oder Oeffnen einer | |(x=W,R,M,U,A)| existierenden Datei fuer gemeinsamen Zugriff | | | (shared access) von verschiedenen Tasks aus | |---------------------------------------------------------------| |OPNT$D | Erstellen einer temporaeren Datei (ohne Eintrag | |OPNT$W | in ein UFD, bei Verwendung von OPNT$W ist beson-| | | dere Sorgfalt im Nutzerprogramm erforderlich) | |---------------------------------------------------------------| |OPEN$ | allgemeiner Ruf zum Oeffnen einer Datei | ----------------------------------------------------------------- Anlage 11 Festlegen von Zugriffsmoeglichkeiten zur Datei beim Oeffnen --------------------------------------------------------- ----------------------------------------------------------------- | | Zugriffs- |Makroruf | Position der | | | moeglichkeit | | Datei nach dem | | | R | W | E *) | | Oeffnenruf | |---------------------------------------------------------------| |Erstellen einer | x | x | x | OPEN$W | erster Satz | |neuen Datei | | | | | | |---------------------------------------------| | |Oeff- | Lesen | x | | | OPEN$R | | |nen | (read) | | | | | | |einer |--------------------------------------| | |exi- | Modifizieren| x | x | | OPEN$M | | |stie- | (modify) | | | | | | |renden|--------------------------------------| | |Datei |Aktualisieren| x | x | x | OPEN$U | | | | (update) | | | | | | | |--------------------------------------------------------| | | Anfuegen | x | x | x | OPEN$A | Dateiende **) | | | (append) | | | | | | ----------------------------------------------------------------- *) R - lesen (read) W - schreiben (write) E - erweitern (extend) **) ausser bei PUT$ und PUT$R mit gesetztem FD.RAN 107 Anlage 12 Parameter der Oeffnenrufe in Reihenfolge ihrer Notation --------------------------------------------------------- ----------------------------------------------------------------- |OPEN$x |zusaetz-| Erklaerung | Notations- | |und |lich in | | beispiele | |OPEN$ | OPEN$ | | | |---------------------------------------------------------------| |fdb | | Adresse des FDB | #OUTFDB | |---------------------------------------------------------------| | | facc | Zugriff zur Datei, | #FO.MFY | | | | (siehe Anlage 13) | | |---------------------------------------------------------------| | un | | logische Geraetenummer | #1 | |---------------------------------------------------------------| |dspt | | Adresse des Dateideskriptors | #DD | |---------------------------------------------------------------| | | dfnb | Adresse des Standarddatei- | #DFNB | | | | namenblockes | | |---------------------------------------------------------------| |racc | | Moegliche Werte: |#FD.RAN!FD.PLC| | | | FD.RWM Block-E/A | | | | | FD.RAN Satz-E/A dir. Zugriff | | | | | FD.PLC Zeigermodus | | | | | FD.INS put-sequenti- | | | | | ell veraen- | | | | | dert logisches Ende | | | | | der Datei nicht | | | | | Sinnvolle Kopplungen dieser | | | | | Werte mit "oder" (!) sind | | | | | moeglich. Bei Nichtangabe | | | | | eines Wertes gilt als Stan- | | | | | dard das jeweilige Gegenteil | | |---------------------------------------------------------------| |urba | | Nutzersatzpuffer Adresse | #BUFFER | |---------------------------------------------------------------| |urbs | | Nutzersatzpuffer Laenge/Bytes| #18. | |---------------------------------------------------------------| |err | | Einsprungadresse einer | DATERR | | | | Fehlerroutine des Nutzers | | ----------------------------------------------------------------- 108 Anlage 13 Werte des Dateizugriffparameters facc ------------------------------------------------ ----------------------------------------------------------------- |symbolische Werte| | |---------------------------------------------------------------| |FO.RD | Datei | R | Zugriffsmoeglichkeiten | |FO.MFY | existiert | M | zu den Dateien | |FO.UPD | | U | (siehe Anlage 11) | |FO.APD | | A | | |-----------------------------| | | |FO.WRT | Datei | W | | |-----------------| ist zu |---------------------------------| |FO.WRT!FA.NSP | erstellen |alte Datei gleicher Spezifikation| | | |nicht ersetzen | |-----------------| |---------------------------------| |FO.WRT!FA.TMP | |temporaere Datei | |---------------------------------------------------------------| |FA.SHR | |gemeinsamer Zugriff | ----------------------------------------------------------------- Oder-Verbindungen dieser Werte sind moeglich, soweit logisch sinnvoll. Insbesondere ist die Verbindung von FA.SHR mit irgend- einem der anderen Werte moeglich. Anlage 14 Beziehungen der Oeffnenrufe zum OPEN$-Ruf ----------------------------------------------------- Der Makroruf OPEN$ fdb,facc,lun,dspt,,racc,urba,urbs,err fuehrt dieselbe Operation aus wie der Makroruf name fdb,lun,dspt,racc,urba,urbs,err wobei die Werte fuer name in der untenstehenden Tabelle aufge- listet sind. ------------------------------------------ |name | facc | |----------------------------------------| |OPEN$W | FO.WRT | | $R | FO.RD | | $M | FO.MFY | | $U | FO.UPD | | $A | FO.APD | |----------------------------------------| |OPNS$W | FO.WRT!FA.SHR | | $R | FO.RD!FA.SHR | | $M | FO.MFY!FA.SHR | | $U | FO.UPD!FA.SHR | | $A | FO.APD!FA.SHR | |----------------------------------------| |(OPNT$D) | (hat keine Entsprechung) | |OPNT$W | FO.WRT!FA.TMP | ------------------------------------------ 109 Anlage 15 Uebersicht ueber einige wesentliche Beziehungen zum FDB ---------------------------------------------------------- ----------------------------------------------------------------- |Offsets |Parameter| Makros | Bemerkungen | |---------------------------------------------------------------| |F.RTYP | rtyp | FDAT$x | nur fuer Satz-E/A erforderlich | |F.RATT | ratt | *2) | | |------------------| |-----------------------------------| |F.RSIZ | rsiz | | nur erforderlich, wenn Satz-E/A | | | | | mit Saetzen fester Laenge | | | | |-----------------------------------| |F.CNTG | cntg | | | |---------------------------------------------------------------| |F.LUN | lun | FDOP$x | obligatorisch | | | | |-----------------------------------| |F.DSPT | dspt | *4) | einer dieser Parameter ist obli- | |F.DFNB | dfnb | | gatorisch anzugeben, wenn nicht | | | | | der ganze FNB vom Nutzer gesetzt | | | | | wird (Rueckspeichern z.B.) | | | | |-----------------------------------| |F.FACC | facc | | | |---------------------------------------------------------------| |F.RACC | racc | FDRC$x | | | | | |-----------------------------------| |F.URBD+2| urba | *4) | kann auch bei get/put erst | |F.URBD | urbs | | angegeben werden | |---------------------------------------------------------------| |F.EFN | (efn) | FDBF$x | (nur wenn nicht efn=32-dezimal | | | | | verwendet werden soll) | |F.OVBS | (ovbs) | | ( *3) ) | |---------------------------------------------------------------| |F.MBCT | mbct | | nur fuer Mehrfachpufferung | |F.MBFG | mbfg | | erforderlich | |---------------------------------------------------------------| |F.STBK | ( - ) | *1) | | ----------------------------------------------------------------- x=A,R (Assemblerzeit bzw. Laufzeit (Run-)) *1) z.B. mit .WORD-Direktiven (Assemblerzeit) oder MOV-Befehlen (Laufzeit) zu setzen, wenn damit gearbeitet werden soll *2) ist nur fuer neu zu erstellende Dateien anzugeben *3) nur wenn vom Standardwert abgewichen werden soll *4) Parameter koennen auch im Oeffnenruf angegeben werden 110 Anlage 16 Bitwerte fuer Dateierweiterung mit .EXTND ---------------------------------------------------- ----------------------------------------------------------------- | Bitbelegung | Bedeutung | |---------------------------------------------------------------| | x x x x x x x 0 | Erweiterung nicht notwendig phy- | | | sisch zusammenhaengend | | 1 x x x x x x 1 | Erweiterung phys. zusammenhaengend | | | | | 1 x x x x x 1 1 | wenn der gewuenschte Speicherplatz | | | nicht verfuegbar ist, wird um den | | | groessten verfuegbaren zusammen- | | | haengenden Speicherplatz erweitert | | 0 x x x x x x 1 | Erweiterung phys. zusammenhaengend | | | und Datei phys. zusammenhaengend | |---------------------------------------------------------------| | 1 x x x x 1 x x | Datei ist phys. zusammenhaengend | | | | | 1 x x x x 0 x x | Datei ist nicht notwendig physisch | | | zusammenhaengend | | | | | 1 x x x 1 x x x | Erweiterung ist um den Standardwert | | | des Datentraegers vorzunehmen | | 1 x x x 0 x x x | Erweiterung ist um die in R1 und | | | dem hoeherwertigen Byte von R2 an- | | | gegebene Anzahl von Bloecken vorzu- | | | nehmen | ----------------------------------------------------------------- Sinnvolle Kombinationen, die mit diesen angegebenen vertraeglich sind, sind moeglich. 111 Anlage 17 Satz-E/A-Operationen mit FCS 1630 -------------------------------------------- 1. Uebertragungsmodus --------------------- HS | | |///////////////////| |-------------------| | Nutzersatzpuffer |<-| |-------------------| | Ueber- |///////////////////| | tragung --------- |-------------------| | Satz | | Uebertragung | | | durch | Daten-| virtuellen | FSR- | | FCS 1630 |traeger|<-------------->| Blockpuffer |<-| | | Block durch | | --------- FCS 1630 |-------------------| |///////////////////| 2. Zeigermodus --------------- | HS | |///////////////////| fdb ->|-------------------| | | | FDB | |...................| fdb+F.NRBD ->| Laenge des Satzes | |...................|<-| fdb+F.NRBD+2 ->|Adresse des Satzes | | Eintragen |...................| | der Adresse | | | und der |-------------------| | Laenge des |///////////////////| | Satzes --------- |-------------------| | in den FDB | | Uebertragung | | | durch | Daten-| virtuellen | FSR- | | FCS 1630 *) |traeger|<-------------->| Blockpuffer |<-| | | Block durch | | --------- FCS 1630 |-------------------| |///////////////////| *) Uebertragung des Satzes durch FCS in einen bzw. von einem Nutzersatzpuffer, falls beim Lesen der letzte Satz eines vir- tuellen Blockes die Blockgrenzen ueberschreitet oder beim Schreiben der freie Speicherplatz im FSR-Blockpuffer nicht ausreicht. 112 Anlage 18 Makrorufe fuer Satz-E/A-Operationen ---------------------------------------------- ----------------------------------------------------------------- | | | Parameter | | Makro | moegliche Zu- |---------------------------------------| | | griffsmethode |fdb|urba|urbs|nrba|nrbs|lrcnm|hrcnm|err| |=======+===============+===+====+====+====+====+=====+=====+===| | GET$R | direkter | X | X | X | | | X | X | X | | | Zugriff | | | | | | | | | |-------+---------------+---+----+----+----+----+-----+-----+---| | GET$ | sequentieller | | | | | | | | | | | oder direkter | X | X | X | | | | | X | | | Zugriff | | | | | | | | | |-------+---------------+---+----+----+----+----+-----+-----+---| | GET$S | sequentieller | X | X | X | | | | | X | | | Zugriff | | | | | | | | | |=======+===============+===+====+====+====+====+=====+=====+===| | PUT$R | direkter | X | | | X | X | X | X | X | | | Zugriff | | | | | | | | | |-------+---------------+---+----+----+----+----+-----+-----+---| | PUT$ | sequentieller | | | | | | | | | | | oder direkter | X | | | X | X | | | X | | | Zugriff | | | | | | | | | |-------+---------------+---+----+----+----+----+-----+-----+---| | PUT$S | sequentieller | X | | | X | X | | | X | | | Zugriff | | | | | | | | | ----------------------------------------------------------------- Bedeutung der Parameter: fdb - Adresse des FDB urba - Adresse des Nutzersatzpuffers urbs - Laenge des Nutzersatzpuffers in Byte nrba - Adresse des zu schreibenden Satzes nrbs - Laenge des zu schreibenden Satzes in Byte lrcnm - Satznummer, niederwertiger Teil hrcnm - Satznummer, hoeherwertiger Teil err - Einsprungadresse einer Fehlerroutine des Nutzers 113 Anlage 19 Makrorufe zur Festlegung von Attributen der Satz-E/A --------------------------------------------------------------- ----------------------------------------------------------------- | Makro | Parameter | Bedeutung, Moeglichkeiten | |---------------------------------------------------------------| | FSRSZ$ | files | Anzahl der gleichzeitig geoeffneten | | | | Dateien | | |------------------------------------------------------| | | bufsiz | Groesse des FSR-Blockpufferbereiches | | | | Standard: 'files'*512.Bytes | |---------------------------------------------------------------| | FDAT$A | rtyp | R.FIX Satztyp | | FDAT$R | | R.VAR | | | | R.SEQ | | |------------------------------------------------------| | | ratt | FD.FTN 1.Byte in jedem Satz wird als | | | | Format-Steuerzeichen verwendet | | | | FD.CR bei Ausgabe wird LF voran- und | | | | CR nachgestellt | | | | FD.BLK Saetze duerfen Blockgrenzen | | | | nicht ueberschreiten | | |------------------------------------------------------| | | rsiz | bei R.FIX: Satzlaenge | |---------------------------------------------------------------| | FDRC$A | racc | FD.RWM Block-E/A Standard: Satz-E/A | | FDRC$R | | FD.RAN direkter Zugriff | | | | Standard: sequentieller Zugriff | | | | FD.PLC Zeigermodus | | | | Standard: Uebertragungsmodus | | | | FD.INS PUT$S, PUT$ sequentiell inner- | | | | halb einer Datei verkuerzt diese | | | | nicht | | |------------------------------------------------------| | | urba | Adresse Nutzersatzpuffer fuer Lesen im | | | | Uebertragungs- oder Zeigermodus sowie | | | | Schreiben im Zeigermodus | | |------------------------------------------------------| | | urbs | Groesse Nutzersatzpuffer | |---------------------------------------------------------------| | FDOP$A | lun | logische Geraetenummer | | FDOP$R |------------------------------------------------------| | | dspt | Adresse Dateideskriptor | | |------------------------------------------------------| | | dfnb | Adresse Standarddateinamenblock | |---------------------------------------------------------------| | FDBF$A | efn | Ereignisflagnummer zur FCS-internen Syn- | | FDBF$R | | chronisation der Satz-E/A Standard: 32. | | |------------------------------------------------------| | | ovbs | Groesse des Blockpuffers im FSR | | | | Standard: Groesse Datenpuffer d. Geraetes| | |------------------------------------------------------| | | mbct | Anzahl der zu verwendenden FSR-Puffer | | |------------------------------------------------------| | | mbfg | Typ der Mehrfachpufferung | |---------------------------------------------------------------| | NMBLK$ | fnam,ftyp,| | | | fver,dvnm,| Angabe der Dateispezifikation | | | unit | | |---------------------------------------------------------------| 114 Anlage 19 (Fortsetzung) ----------------------------------------------------------------- | Makro | Parameter | Bedeutung, Moeglichkeiten | |---------------------------------------------------------------| | Makros | lun,dspt, | | | zum |(dfnb),racc| siehe oben | | Oeffnen|,urba,urbs | | ----------------------------------------------------------------- Anlage 20 Uebersicht ueber die Arbeitsweise von FCS bei Block-E/A ------------------------------------------------------------------ ||virtueller Block |virtueller Block |virtueller Block|| || 1 | 2 | 3 || |------------------------------------------------------| || | | | | || Daten- ||zu ueber- |leer| zu ueber- |leer| zu uebertragen-|| traeger ||tragender | | tragender | | der Block || ||Block | | Block | | || || | | | | || |------------------------------------------------------| |------------| | | | | | | | | HS | | |///////////////| | FDB |---------------| | -->| | | die Groesse des Puffers | FDB | | entspricht der Groesse | | | des groessten zu lesenden |---------------| | Blockes BUF | | | -->| Blockpuffer |<------------| | des Nutzers | | | |---------------| |///////////////| | | | | | HS | ------------------- |///////////////| | | | | | Daten- | | Blockpuffer | | traeger | | des Nutzers | | |<----------------->| | | | FCS 1630 | | | | Uebertragung des |///////////////| ------------------- Blockes | | | | 115 Anlage 21 Uebersicht ueber die blockspezifischen Makrorufe ----------------------------------------------------------- ------------------------------------------------------------ || || | | | | | | | || || Makro || Parameter der Makros || || || | | | | | | | || || ||-----------------------------------------------|| || || fdb |bkda |bkds |bkvb |bkef |bkst |bkdn | err || ||--------------------------------------------------------|| || || | | | | | | | || || READ$ || XXX | XX | XX | X | X | X | X | X || || || | | | | | | | || ||-------||-----------------------------------------------|| || || | | | | | | | || || WRITE$|| XXX | XX | XX | X | X | X | X | X || || || | | | | | | | || ||-------||-----------------------------------------------|| || || | | | | | | | || || FDBK$A|| | XX | XX | X | X | X | X | X || || || | | | | | | | || ||-------||-----------------------------------------------|| || || | | | | | | | || || FDBK$R|| XXX | XX | XX | X | X | X | X | X || || || | | | | | | | || ||-------||-----------------------------------------------|| || || | | | | | | | || || WAIT$ || XXX | | | | X | X | | X || || || | | | | | | | || ||-------||-----------------------------------------------|| || || | | | | | | | || || Stan- || | | | | 32. | | | || || dard || | | | | | | | || ------------------------------------------------------------ Fuer die Parameterbelegung gilt: XXX Parameterbelegung ist Pflicht,falls FDB-Adresse nicht in R0 XX Parameter muss einmal belegt werden in einem der Makrorufe X Parameter ist ein Wahlparameter 116 Anlage 22 Fehlermitteilungen in F.ERR des FDB ---------------------------------------------- In den folgenden beiden Listen sind die Rueckkehrcodes aufge- fuehrt, die durch das E/A-System, FCS oder die Exekutive erzeugt werden, und von FCS in das Byte F.ERR des FDB eingetragen werden koennen. - E/A- und FCS-Rueckkehrcodes in F.ERR -------------------------------------- Mnem. Fehler Bedeutung IE.xxx Dez. Okt. ----------------------------------------------------------------- SUC 1 1 erfolgreicher Abschluss E/A-Operation PND 0 0 laufende E/A Operation BAD - 1 377 Parameterfehler IFC - 2 376 fehlerhafter Funktionscode DNR - 3 375 Geraet nicht bereit VER - 4 374 nicht identifizierbarer Fehler . Paritaetsfehler . phys. Leitungsfehler SPC - 6 372 unzulaessiger Adressraum DNA - 7 371 Geraet nicht gebunden DAA - 8 370 Geraet bereits gebunden DUN - 9 367 Geraet kann nicht gebunden werden EOF - 10 366 Dateiendezeichen erkannt (EOF) EOV - 11 365 Geraeteende erkannt (EOV) WLK - 12 364 Geraet ist schreibgeschuetzt DAO - 13 363 Datenueberlauf ABO - 15 361 E/A Operation abgebrochen PRI - 16 360 Schutzrechtsverletzung RSU - 17 357 Ressource in Gebrauch (Driver ueberlastet) OVR - 18 356 fehlerhafte Ueberlagerungsanforderung BYT - 19 355 Byteorientierter Puffer angegeben BLK - 20 354 zu grosse logische Blocknummer NOD - 23 351 unzureichender dynamischer Speicher- platz 117 Anlage 22 (Fortsetzung) Mnem. Fehler Bedeutung IE.xxx Dez. Okt. ----------------------------------------------------------------- DFU - 24 350 Geraeteueberlauf IFU - 25 347 Indexdatei voll belegt NSF - 26 346 keine gueltige Datei LCK - 27 345 gesperrt fuer Lese-/Schreib-Zugriff HFU - 28 344 Dateikennsatz-Ueberlauf WAC - 29 343 Datei im Schreibzugriff CKS - 30 342 Fehler in der Pruefsumme des Datei- kennsatzes WAT - 31 341 Fehler in der Attribut-Steuerliste RER - 32 340 Lesefehler E/A-Geraet WER - 33 337 Schreibfehler E/A-Geraet ALN - 34 336 LUN bereits einer Datei zugewiesen SNC - 35 335 Datei ID-Fehler (Dateinummer) SQC - 36 334 Datei ID-Fehler (Dateifolgenummer) NLN - 37 333 LUN kann nicht zugewiesen werden CLO - 38 332 Datei nicht ordnungsgemaess abge- schlossen NBF - 39 331 kein Puffer fuer die Datei vorhanden RBG - 40 330 unzulaessige Satzlaenge NBK - 41 327 kein Platz fuer Dateierweiterung ver- fuegbar ILL - 42 326 unzulaessige FDB-Operation BTP - 43 325 unzulaessiger Satztyp RAC - 44 324 unzulaessige Satzzugriffsbits RAT - 45 323 unzulaessige Satzattributsbits RCN - 46 322 unzulaessige Satznummer 2DV - 48 320 RENAME (2 verschiedene Geraete) FEX - 49 317 RENAME (neuer Dateiname schon vorhanden) 118 Anlage 22 (Fortsetzung) Mnem. Fehler Bedeutung IE.xxx Dez. Okt. ----------------------------------------------------------------- BDR - 50 316 Dateiverzeichnis nicht in Ordnung RNM - 51 315 RENAME (nicht ausfuehrbar) BDI - 52 314 Dateiverzeichnis (unzulaessige Syntax) FOP - 53 313 Datei bereits eroeffnet BNM - 54 312 unzulaessiger Dateiname BDV - 55 311 unzulaessiger Geraetename BBE - 56 310 fehlerhafter Block gefunden DUP - 57 307 ENTER (doppelter Eintrittspunkt im Verzeichnis) STK - 58 306 nicht genug Platz auf dem Stack FHE - 59 305 nicht korrigierbarer Hardware-Fehler NFI - 60 304 Dateiidentifikation nicht angegeben ISQ - 61 303 unzulaessige sequentielle Operation EOT - 62 302 Bandende erkannt (EOT) BVR - 63 301 fehlerhafte Versionsnummer BHD - 64 300 fehlerhafter Dateikennsatz OFL - 65 277 Geraet offline ONL - 67 275 Geraet online TMM - 71 271 zu viele ausstehende Mitteilungen NDR - 72 270 kein dynamischer Speicherplatz vor- handen EXP - 75 265 Verfallsdatum der Datei nicht erreicht BTI - 76 264 fehlerhaftes MB Format NNC - 77 263 unzulaessiges Bytezaehlerfeld eines Satzes variabler Laenge auf MB IES - 82 256 unzulaessige ESC-Folge PES - 83 255 unvollstaendige ESC-Folge ALC - 84 254 Zuordnungsfehler 119 Anlage 22 (Fortsetzung) Mnem. Fehler Bedeutung IE.xxx Dez. Okt. ----------------------------------------------------------------- ULK - 85 253 Fehler beim Aufheben der Zugriffs- sperre WCK - 86 252 Datenvergleich beim Schreiben fehlerhaft FLG - 89 247 Ereignis-Flag bereits angegeben DSQ - 90 246 Plattenkontingent ueberschritten IQU - 91 245 Schalter nicht vollstaendig verwendet TML - 93 243 zu viele Verbindungen zur Task TMO - 95 241 Anforderung nicht rechtzeitig beantwortet (Time out) CNR - 96 240 Verbindung zurueckgewiesen UKN - 97 237 unbekannter Name DAG -110 222 Geraet bereits an Graphik-Modus gebunden DNG -111 221 Geraet nicht an Graphik-Modus gebunden DEB -112 220 unterschiedliche Fehlerbytes wurden empfangen DEO -113 217 Ausgabefehler waehrend Eingabean- forderung EQN -114 216 Ereignis-Warteschlange nicht leer GRL -115 215 Graphik Satz zu lang GTN -116 214 Task fuer Graphik Ereignisse nicht installiert MOR -117 213 Datenueberlauf RCF -118 212 Uebertragungsfehler 120 - DSW-Rueckkehrcodes in F.ERR ----------------------------- Mnem. Fehler Bedeutung IE.xxx Dez. Okt. ----------------------------------------------------------------- SET 2 2 Ereignisflag war gesetzt SUC 1 1 erfolgreiche Ausfuehrung der Anweisung CLR 0 0 Ereignisflag war geloescht UPN - 1 377 unzureichender dynamischer Speicher- platz INS - 2 276 Task ist nicht installiert PTS - 3 375 Partition ist fuer die Task zu klein UNS - 4 374 unzureichender dynamischer Speicher- platz (SEND) ULN - 5 373 LUN nicht zugewiesen HWR - 6 372 Geraete Driver nicht geladen ACT - 7 371 Task nicht aktiv ITS - 8 370 Anweisung widerspricht dem derzeitigen Taskstatus FIX - 9 367 Task schon fixed/unfixed CKP - 10 366 Task ist nicht auslagerbar TCH - 11 365 Task ist auslagerbar RBS - 15 361 Puffer zu klein (RECEIVE) PRI - 16 360 Schutzrechtsverletzung RSU - 17 357 Ressource in Benutzung NSW - 18 356 kein Platz zum Auslagern verfuegbar ILV - 19 355 fehlerhafter Vektor angegeben AST - 80 260 Anweisung wurde (nicht) von einem AST- Bedienungsprogramm gesendet MAP - 81 257 Adresszuordnungsfehler (ISR oder IESER liegen nicht innerhalb eines 4K-Bereiches) IOP - 83 255 Fenster hat E/A in Arbeit ALG - 84 254 Zuordnungsfehler (Laengen nicht realisierbar) 121 Anlage 22 (Fortsetzung) Mnem. Fehler Bedeutung IE.xxx Dez. Okt. ----------------------------------------------------------------- WOV - 85 253 Task Kopf enthaelt keine Fenster- bloecke mehr NVR - 86 252 ungueltige Region ID NVW - 87 251 ungueltige Fenster ID ITP - 88 250 ungueltige TI-Parameter IDS - 89 247 fehlerhafte Groesse des Sendepuffers (>255.) LNL - 90 246 LUN wird schon benutzt IUI - 91 245 fehlerhafter UIC IDU - 92 244 unzulaessiges Geraet oder unzulaessiger Geraetetyp ITI - 93 243 ungueltiger Zeitparameter PNS - 94 242 Partition/Region existiert nicht im System IPR - 95 241 ungueltige Prioritaet (>250.) ILU - 96 240 ungueltige LUN IEF - 97 237 ungueltige Ereignisflagnr. (>64.) ADP - 98 236 DPB liegt ausserhalb des Adressraumes der Task SDP - 99 235 Laenge DPB bzw. DIC ungueltig 122 Anlage 23 Makrorufe der Kommandozeilenverarbeitung und ihre Parameter --------------------------------------------------- GCML-Makrorufe -------------- --------------------------------------------------------------- | Makroruf | Parameter | | |-------------------------------------------------------------| | GCMLD$ | leer oder DEF$G oder DEF$L | | |-------------------------------------------------------------| | GCMLB$ | maxd,prmpt,ubuf,lun,pdl,size | Assembler- | | | | zeit | |-------------------------------------------------------------| | GCML$ | gclblk,adpr,lnpr | | |-----------------------------------------------| | | RCML$ | gclblk | Laufzeit | |-----------------------------------------------| | | CCML$ | gclblk | | --------------------------------------------------------------- CSI-Makrorufe ------------- --------------------------------------------------------------- | Makroruf | Parameter | | |-------------------------------------------------------------| | CSI$ | leer oder DEF$G | | |-----------------------------------------------| | | CSI$SW | sw,mk,mkw,csflg,nflg,vtab,compflg | Assembler- | |-----------------------------------------------| zeit | | CSI$SV | type,adr,vlen | | |-----------------------------------------------| | | CSI$ND | | | |-------------------------------------------------------------| | CSI$1 | csiblk,buff,len | | |-----------------------------------------------| Laufzeit | | CSI$2 | csiblk,io,swtab | | --------------------------------------------------------------- 123 Anlage 24 Parameter der GCML-Makrorufe --------------------------------------- --------------------------------------------------------------- | Parameter | Erlaeuterung | |-------------------------------------------------------------| | maxd | maximale Schachtelungstiefe fuer indirekte | | | Kommandodateien (Anzahl der verschachtelten | | | Kommandodateien fuer Kommandozeileneingabe) | | | Standard ist 0, womit eine indirekte Kommando- | | | datei fuer die Eingabe ausscheidet. | |-------------------------------------------------------------| | prmpt | Eingabeanforderung (3 KOI-7-Zeichen), die auf | | | dem Terminal erscheint. | | | Folgende Kette wird definiert: | | | ein und ein | | | die vom Nutzer angegebenen 3 KOI-7-Zeichen | | | ein ">" | | | | | | Standard ist " >" (mit 3 vorangestellten Leer-| | | zeichen. | | | Diese Eingabeanforderung kann durch die Belegung| | | der Parameter adpr+lnpr ueberschrieben werden. | |-------------------------------------------------------------| | ubuf | Adresse eines Satzpuffers fuer temporaere | | | Speicherung der Kommandozeile | | | Bei Nichtangabe wird die im size-Parameter | | | angegebene Pufferlaenge im GCML-Steuerblock | | | reserviert. | | | |st der size-Parameter nicht spezifiziert, wird | | | standardmaessig ein 82-Bytes Puffer reserviert. | |-------------------------------------------------------------| | lun | logische Geraetenummer fuer das Kommandoein- | | | gabegeraet; Standard ist 1. | |-------------------------------------------------------------| | pdl | Adresse eines Bereiches im Nutzerprogramm, der | | | in Verbindung mit einer indirekten Kommando- | | | datei als Arbeitsspeicher reserviert wird. | | | Ist der Parameter nicht angegeben, wird stan- | | | dardmaessig ausreichend Speicherplatz zum | | | Steuerblock hinzugefuegt. | | | Dieser Bereich kann durch folgende Anweisung | | | erstellt werden: | | | .EVEN | | | label: .BLKB G.LPDL | | | | | | G.LPDL ist die Laenge des Bereiches in Bytes | | | G.LPDL=(MAXD+1)*20 | |-------------------------------------------------------------| | size | Groesse des Kommandozeileneingabepuffers in | | | Bytes | | | Als Puffergroesse werden SIZE+2 Bytes vereinbart| | | Wenn SIZE>80. ist, wird die Fortsetzung der kom-| | | mandozeile mit Bindestrich erlaubt. | --------------------------------------------------------------- 124 Anlage 24 (Fortsetzung) --------------------------------------------------------------- | Parameter | Erlaeuterung | |-------------------------------------------------------------| | gclblk | Adresse des GCML-Steuerblockes. | |-------------------------------------------------------------| | adpr | Adresse einer Eingabeanforderungskette im | | | Nutzerprogramm | | | Diese Kette wird auf dem Terminal ausgeschrie- | | | ben um eine Kommandozeile anzufordern, wenn die | | | Parameter adpr und lnpr angegeben sind. | |-------------------------------------------------------------| | lnpr | Laenge der Eingabeanforderung in Bytes | | | Der Parameter ist nur anzugeben, wenn der Para- | | | meter adpr angegeben ist. Sonst erfolgt die | | | Fehlermitteilung "PROMPT STRING MISSING". | --------------------------------------------------------------- 125 Anlage 25 Parameter der CSI-Makrorufe -------------------------------------- --------------------------------------------------------------- | Parameter | Erlaeuterung | |-------------------------------------------------------------| | sw | alphabetischer Schaltername,der in der Schal- | | | terbeschreibungstabelle abgespeichert wird. | | | Der Parameter ist im Makro CSI$SW zwingend. | |-----------|-------------------------------------------------| | mk | Maske fuer den durch den sw-Parameter angegebe- | | | nen Schalter. | | | Ist der definierte Schalter in der Kommandozeile| | | enthalten, wird die Maske mit einer "ODER" Oper-| | | ation in das Maskenwort1 (Offset C.MKW1 des CSI-| | | Steuerblocks) gebracht. | |-----------|-------------------------------------------------| | mkw | Adresse eines wahlfreien Maskenwortes, das von | | | CSI gleichzeitig mit dem Maskenwort 1 initiali- | | | siert wird. | | | Es wird in Abhaengigkeit von csflg geaendert. | | | Es kann auch vom Nutzer direkt geaendert werden.| |-----------|-------------------------------------------------| | csflg | Kennzeichen fuer einen gegebenen Schalter | | | Folgende Werte koennen angegeben werden: | | | | | | CLEAR - Die der Schaltermaske entsprechenden | | | Bits werden im Maskenwort des Nutzers | | | geloescht, wenn der Schalter nicht ne- | | | giert ist. | | | Ist der Schalter negiert, werden die | | | Bits gesetzt. | | | SET - Die der Schaltermaske entsprechenden | | | Bits im Maskenwort des Nutzers werden | | | gesetzt, wenn der Schalter nicht negiert| | | ist. | | | Ist der Schalter negiert, werden die | | | Bits geloescht. | | | Standard ist "SET". | |-----------|-------------------------------------------------| | nflg | wahlfreies Negationskennzeichen fuer den | | | Schalter (NEG oder leer ) | | | Bei Angabe des Wertes NEG darf der Schalter | | | negiert werden (z.B. /-LI oder /NOLI). | | | Bei Nichtangabe des Wertes ist die Schalter- | | | negation unzulaessig. | |-----------|-------------------------------------------------| | vtab | Adresse der zum Schalter gehoerenden Schalter- | | | wertebeschreibungstabelle | --------------------------------------------------------------- 126 Anlage 25 (Fortsetzung) --------------------------------------------------------------- | Parameter | Erlaeuterung | |-------------------------------------------------------------| | compflg | Methode zum Vergleich des Schalternamens in der | | | Kommandozeile mit dem durch den sw-Parameter | | | in der Schalterbeschreibungstabelle enthaltenen | | | Schalternamen. | | | Folgende Symbole koennen angegeben werden: | | | | | | LONG - Alle im sw-Paramter angegebenen Zeichen | | | werden in die Schalterbeschreibungs- | | | tabelle gebracht. | | | Beim Vergleich muessen die ersten Zei- | | | chen des Schalternamens der Kommando- | | | zeile mit denen in der Schalterbeschrei-| | | bungstabelle uebereinstimmen. | | | Zusatzliche Zeichen werden ignoriert. | | | EXACT - Alle im sw-Paramter angegebenen Zeichen | | | werden in die Schalterbeschreibungsta- | | | belle gebracht. | | | Beim Vergleich muessen alle Zeichen des | | | Schalternamens der Kommandozeile exakt | | | mit dem Wert in der Tabelle ueberein- | | | stimmen. | | | Als Standard gilt: | | | Die beiden ersten Zeichen des sw-Parameters | | | werden in die Schalterbeschreibungstabelle ge- | | | bracht und verglichen.Alle anderen Zeichen des | | | Schalternamens werden ignoriert. | |-----------|-------------------------------------------------| | type | Konvertierungstyp fuer den Schalterwert | | | Einer der folgenden Werte kann angegeben werden:| | | | | | ASCII - Der Schalterwert ist als KOI-7-Kette | | | zu behandeln. | | | NUMERIC - Ein numerischer Schalterwert ist | | | binaer zu konvertieren (Konvertie- | | | rungsbasis oktal). | | | OCTAL - siehe NUMERIC | | | DECIMAL - Ein numerischer Schalterwert ist | | | binaer zu konvertieren (Konvertie- | | | rungsbasis dezimal). | | | Standard ist ASCII. | |-----------|-------------------------------------------------| | adr | Adresse eines Bereiches im Nutzerprogramm in | | | den der aus der Schalterverarbeitung resultie- | | | rende Schalterwert abgespeichert wird. | | | Dieser Parameter ist Pflicht. | --------------------------------------------------------------- 127 Anlage 25 (Fortsetzung) --------------------------------------------------------------- | Parameter | Erlaeuterung | |-------------------------------------------------------------| | vlen | Laenge des Bereiches in dem der Schalterwert | | | abgespeichert wird. | | | Dieser Parameter ist Pflicht. | | | - Maximale Anzahl von KOI-7-Zeichen,wenn der | | | Konvertierungstyp "ASCII" ist. | | | Ueberschreitet die Anzahl der Zeichen im | | | Schalterwert die angegebene Laenge, werden | | | die ueberzaehligen Zeichen ignoriert. | | | Sind weniger Zeichen im Schalterwert vor- | | | handen als angegeben, wird der verbleibende | | | Teil des Bereiches mit 0 aufgefuellt. | | | - 2 Byte, wenn der Konvertierungstyp "NUMERIC" | | | oder "DECIMAL" | |-----------|-------------------------------------------------| | csiblk | Adresse des CSI-Steuerblockes | | | Ist die Adresse nicht angegeben, so wird voraus-| | | gesetzt, dass sie in R0 steht. | |-----------|-------------------------------------------------| | buff | Adresse der zu analysierenden Kommandozeile | | | Dieser Parameter initialisiert den Offset | | | C.CMLD+2. | | | Der Offset kann auch wie folgt belegt werden: | | | MOV GCLBLK+G.CMLD+2,CSIBLK+C.CMLD+2 | |-----------|-------------------------------------------------| | len | Laenge der zu analysierenden Kommandozeile | | | Der Offset kann auch wie folgt belegt werden: | | | MOV GCLBLK+G.CMLD,CSIBLK+C.CMLD | |-----------|-------------------------------------------------| | io | Typ der zu zerlegenden Dateispezifikation | | | INPUT - Die naechste Eingabedateispezifikation | | | soll zerlegt werden. | | | OUTPUT - Die naechste Ausgabedateispezifikation | | | soll zerlegt werden. | |-----------|-------------------------------------------------| | swtab | Adresse der Schalterbeschreibungstabelle (CSI$2)| --------------------------------------------------------------- 128 Anlage 26 Aufbau des GCML-Steuerblockes ---------------------------------------- --------------------------------------------------------------- | Offset |Laenge| | | symb.|okt.|(Byte)| Werte und Erlaeuterung | |-------------------------------------------------------------| | | 0 | 140 | FDB, der zum Oeffnen einer Kommandodatei | | | | | verwendet wird. | | | | | Bei einem E/A-Fehler waehrend des Lesens | | | | | einer Kommandozeile (s. G.ERR) kann zu- | | | | | saetzlich der Offset F.ERR ausgetestet | | | | | werden. | |-------------------------------------------------------------| |G.ERR |140 | 1 | Fehlercode-Byte | | | | | | | | | | GE.IOR - E/A-Fehler waehrend der Kom- | | | | | mandozeileneingabe | | | | | GE.OPR - Die angegebene Kommandodatei | | | | | konnte nicht eroeffnet oder | | | | | nicht wieder eroeffnet werden.| | | | | GE.BIF - Syntaxfehler im Namen der in- | | | | | direkten Kommandodatei | | | | | GE.MDE - Die maximal zulaessige Schach-| | | | | telungstiefe fuer eine indi- | | | | | rekte Kommandodatei wurde | | | | | ueberschritten. | | | | | GE.EOF - Das Dateiende der ersten | | | | | nichtverschachtelten Kommando-| | | | | datei wurde erkannt. | | | | | GE.RBG - Der Kommandozeileneingabe- | | | | | puffer war zu klein fuer die | | | | | Kommandozeile (bei Kommandos | | | | | > als eine Terminalzeile). | | | | | Weitere Fehleranalyse bei GE.IOR und | | | | | GE.OPR durch Test von F.ERR moeglich. | |-------------------------------------------------------------| |G.MODE|141 | 1 | Status- und Modus-Steuerbyte | | | | | Folgende Bits werden zur Assemblerzeit | | | | | gesetzt, um fuer GCML bestimmte Standards| | | | | anzugeben: | | | | | Bit 0=1=GE.COM Eine Kommandozeile mit | | | | | fuehrenden Semikolon wird| | | | | als Kommentar behandelt. | | | | | Setzt der Nutzer dieses | | | | | Bit auf 0, wird eine Kom-| | | | | mandozeile mit fuehrendem| | | | | Semikolon zum Programm | | | | | zurueckgefuehrt. | | | | | Bit 1=1=GE.IND Eine Kommandozeile mit | | | | | fuehrendem "@" wird als | | | | | Spezifikation einer in- | | | | | direkten Kommandodatei | | | | | behandelt. | | | | | Setzt der Nutzer dieses | | | | | Bit auf 0, wird eine Kom-| | | | | mandozeile mit fuehrendem| | | | | "@" zum Programm zurueck-| | | | | gefuehrt. | --------------------------------------------------------------- 129 Anlage 26 (Fortsetzung) --------------------------------------------------------------- | Offset |Laenge| | | symb.|okt.|(Byte)| Werte und Erlaeuterung | |-------------------------------------------------------------| |G.MODE|141 | 1 | Fortsetzung: | | | | | Bit 2=1=GE.CLO Die gerade zu lesende | | | | | Kommandodatei wird nach | | | | | jedem GCML$ geschlossen. | | | | | Setzt der Nutzer dieses | | | | | Bit auf 0, bleibt die | | | | | Kommandodatei zwischen | | | | | den Kommandoeingaben ge- | | | | | geoeffnet. In diesem Fall| | | | | muss von der FSR ein zu- | | | | | saetzlicher 512-Bytes- | | | | | Puffer fuer die Kommando-| | | | | zeileneingabe vorgesehen | | | | | werden. | | | | | Bit 3=1=GE.LC Kleinbuchstaben in der | | | | | Kommandozeile werden | | | | | nicht durch die ent- | | | | | sprechenden Grossbuchsta-| | | | | ben ersetzt. | | | | | Bit 4=1=GE.CON Dieses Bit wird gesetzt, | | | | | wenn der size-Parameter | | | | | in GCMLB$ > 82. Bytes. | |-------------------------------------------------------------| |G.PSDS|142 | 4 | Laenge und Adresse der Eingabeanforderung| | | | | die auf dem Terminal ausgeschrieben wird.| | | | | Sind in einem nachfolgenden GCML$-RUF | | | | | diese Werte nicht angegeben, wird dieser | | | | | Offset geloescht und die im Offset G.DPRM| | | | | enthaltene Standardeingabeanforderung | | | | | ausgeschrieben. | |-------------------------------------------------------------| |G.CMLD|146 | 4 | Laenge und Adresse der gerade gelesenen | | | | | Kommandozeile | |-------------------------------------------------------------| | |152 | 6 | intern genutzt von GCML | |-------------------------------------------------------------| |G.DPRM|160 | 6 | Standardeingabeanforderungskette | |-------------------------------------------------------------| | |166 | 36 | Standarddateinamenblock im GCML-Steuer- | | | | | block | | | | | Dieser Standarddateinamenblock gehoert zu| | | | | einer indirekten Kommandodatei. | | | | | Standardmaessig werden CMI als Dateiname | | | | | und . CMD als Dateityp angenommen. | --------------------------------------------------------------- 130 Anlage 27 Aufbau des CSI-Steuerblockes --------------------------------------- --------------------------------------------------------------- | Offset |Laenge| | | symb.|okt.|(Byte)| Werte und Erlaeuterung | |-------------------------------------------------------------| |C.TYPR| 0 | 1 | Typ der geforderten Dateispezifikation | | | | | | | | | | Bit 0=1=CS.INP Eine Eingabedateispezi- | | | | | fikation ist gefordert. | | | | | Bit 1=1=CS.OUT Eine Ausgabedateispezi- | | | | | fikation ist gefordert. | |-------------------------------------------------------------| |C.STAT| 1 | 1 | Status der aktuellen Kommandozeile | | | | | | | | | | Bit 0=1=CS.NMF Die aktuelle Dateispezi- | | | | | fikation enthaelt eine | | | | | Dateinamenkette. | | | | | Die Offsets C.FILD und | | | | | C.FILD+2 werden darauf- | | | | | hin mit der Laenge und | | | | | Adresse der Dateinamen- | | | | | kette belegt. | | | | | =0 Keine Dateinamenkette ist| | | | | vorhanden. Die Offsts | | | | | C.FILD und C.FILD+2 wer- | | | | | den daraufhin geloescht. | | | | | Bit 1=1=CS.DIF Die aktuelle Dateispezi- | | | | | fikation enthaelt eine | | | | | Dateiverzeichniskette. | | | | | Die Offsets C.DIRD und | | | | | C.DIRD+2 werden mit der | | | | | Laenge und Adresse der | | | | | Dateiverzeichniskette be-| | | | | legt. | | | | | =0 Keine Dateiverzeichnis- | | | | | kette ist vorhanden. Es | | | | | wird die letzte in einer | | | | | Dateispezifikation ent- | | | | | haltene Dateiverzeichnis-| | | | | kette verwendet. | | | | | Bit 2=1=CS.DVF Die aktuelle Dateispezi- | | | | | fikation enthaelt eine | | | | | Geraetenamenkette. | | | | | Die Offsets C.DEVD und | | | | | C.DEVD+2 werden mit der | | | | | Laenge und Adresse der | | | | | Geraetenamenkette belegt.| | | | | =0 Es ist keine Geraetena- | | | | | menkette vorhanden. Die | | | | | letzte in einer Dateispe-| | | | | zifikation enthaltene | | | | | Geraetenamenkette wird | | | | | verwendet. | --------------------------------------------------------------- 131 Anlage 27 (Fortsetzung) --------------------------------------------------------------- | Offset |Laenge| | | symb.|okt.|(Byte)| Werte und Erlaeuterung | |-------------------------------------------------------------| |C.STAT| 1 | 1 | Fortsetzung: | | | | | Bit 3=1=CS.WLD Die aktuelle Dateispezi- | | | | | fikation enthaelt eine | | | | | *-Spezifikation. | | | | | Bit 4=1=CS.MOR Die aktuelle Dateispezi- | | | | | fikation enthaelt ein | | | | | Komma, d.h. es folgen | | | | | mehrere Dateispezifika- | | | | | tionen. | | | | | =0 Das Ende der Eingabe- | | | | | oder Ausgabedateispezi- | | | | | fikation ist erreicht. | | | | | Bit 5=1=CS.EQU In der aktuellen Komman- | | | | | dozeile wurde ein Gleich-| | | | | heitszeichen gefunden, | | | | | d.h. die Kommandozeile | | | | | enthaelt sowohl eine Aus-| | | | | als auch eine Eingabeda- | | | | | teispezifikation. | |-------------------------------------------------------------| |C.CMLD| 2 | 4 | Laenge der verdichteten Kommandozeile in | | | | | Bytes (C.CMLD). | | | | | Adresse der verdichteten Kommandozeile | | | | | (C.CMLD+2) | | | | | Die Belegund erfolgt durch CSI$1 | | | | | nach dem Verkuerzen der Kommandozeile um | | | | | alle nichtsignifikanten Zeichen (Nullen, | | | | | Leerzeichen,Tabulator,Rubouts) und dem | | | | | Kennzeichnen von Dateispezifikationen. | |-------------------------------------------------------------| |C.DSDS| 6 | 14 | Dateideskriptor im CSI-Steuerblock | | | | | Dieses Symbol kann verwendet werden, um | | | | | den Offset F.DSPT des mit der Datei zu- | | | | | sammenhaengenden FDB zu initialisieren. | |-oder-| | | | |C.DEVD| 6 | 4 | Laenge der letzten Geraetenamenkette vom | | | | | geforderten Typ in Bytes, die in einer | | | | | Dateispezifikation enthalten ist.(C.DEVD)| | | | | Adresse der Geraetenamenkette (C.DEVD+2) | ------------|------|------------------------------------------| 132 Anlage 27 (Fortsetzung) --------------------------------------------------------------- | Offset |Laenge| | | symb.|okt.|(Byte)| Werte und Erlaeuterung | |-------------------------------------------------------------| |C.DIRD| 12 | 4 | Laenge der letzten Dateiverzeichniskette | | | | | des geforderten Typs in Byte, die in | | | | | einer Dateispezifikation enthalten ist. | | | | | (C.DIRD) | | | | | Adresse der Dateiverzeichniskette | | | | | C.DIRD+2) | |-----------|------|------------------------------------------| |C.FILD| 16 | 4 | Laenge der Dateinamenkette in der aktuel-| | | | | len Dateispezifikation in Bytes (C.FILD) | | | | | Adresse dieser Kette (C.FILD+2) | | | | | (bei Fehler: Laenge und Adresse des | | | | | fehlerhaften Kommandozeilensegmentes) | |-------------------------------------------------------------| |C.SWAD| 22 | 2 | Adresse der Schalterbeschreibungstabelle | | | | | (im laufenden CSI$2-Ruf spezifiziert) | |-------------------------------------------------------------I |C.MKW1| 24 | 2 | Maskenwort 1 | | | | | Fuer jeden definierten Schalter der sich | | | | | in einer Dateispezifikation befindet, | | | | | wird die Schaltermaske in diese Speicher-| | | | | zelle gebracht. | |-------------------------------------------------------------| |C.MKW2| 26 | 2 | Maskenwort 2 | | | | | Ist in einer Dateispezifikation ein nicht| | | | | negierter Schalter vorhanden, wird die | | | | | Schaltermaske in diese Zelle gebracht. | | | | | Ist ein Schalter in einer Dateispezifika-| | | | | tion negiert, werden die entsprechenden | | | | | Bits in dieser Speicherzelle geloescht. | --------------------------------------------------------------- Der CSI-Steuerblock ist C.SIZE= 54 Bytes lang . Der nicht aufge- fuehrte Speicherplatz wird intern von CSI genutzt. 133 Anlage 28 Fehlermitteilungen Magnetbandsteuertask MAG ------------------------------------------------------ MAG -- Device not mounted or mounted foreign Erlaeuterung: Das angegebene Geraet muss entweder ein eingegliedertes Band mit oder ohne Kennsaetze sein. Ein Band, welches mit /FOREIGN einge- gliedert ist, ist dem Magnetband-ACP nicht bekannt und ist des- halb gleich einem nichteingegliederten Band. Das MAG-Kommando unterstuetzt nur eingegliederte Baender. Massnahme: Eingliedern des Geraetes mit /NOLABEL, wenn es sich um ein Band ohne Kennsaetze handelt. Das MAG-Kommando ist nicht bei Baendern zu nutzen, welche mit /FOREIGN eingegliedert sind. MAG -- Get command line failure Erlaeuterung: Es wurde ein illegaler Indirektkommandodateiname angegeben bzw. MAG konnte die angegebene Indirektkommandodatei nicht finden. Massnahme: Pruefen der Angabe in bezug auf die Indirektkommandodatei und erneute Eingabe der Kommandozeile. MAG -- Illegal combination of keywords Erlaeuterung: Es wurden Schluesselworte angegeben, welche sowohl ein Band ohne als auch mit Kennsaetzen erforderten. Massnahme: Ansehen der Schluesselwortbeschreibungen zur Ermittlung, welche Schalter Baender mit oder ohne Kennsaetze erfordern. MAG -- Illegal file attributes combination Erlaeuterung: Es wurde eine Satzgroesse angegeben, die groesser als die Block- groesse war. Massnahme: Angeben einer Satzgroesse, welche kleiner oder gleich der Block- groesse ist. MAG -- Illegal switch value Erlaeuterung: . Der /POS-Wert war groesser als 9999. . Der /BS-Wert war kleiner als 14. . Der /RS-Wert war kleiner als 14. Massnahme: Ermitteln, welcher Wert falsch war, und erneutes Eingeben der Kommandozeile. 134 Anlage 28 (Fortsetzung) MAG -- Invalid device or unit Erlaeuterung: Das angegebene Geraet existiert nicht bzw. ist kein Magnetband. Massnahme: Ermitteln des richtigen Geraetes bzw. der richtigen Einheit und erneutes Eingeben der Kommandozeile. MAG -- Operation is only valid for mounted ANSI-Tapes Erlaeuterung: Bei einem Band ohne Kennsaetze wurde eine Operation versucht, welche nur fuer ein Magnetband mit Kennsaetzen gueltig ist. Massnahme: Es sind nur gueltige Kommandos zu verwenden. MAG -- Operation is only for unlabeled tapes Erlaeuterung: Bei einem Band mit Kennsaetzen wurde eine Operation versucht, welche nur fuer Baender ohne Kennsaetze gueltig ist. Massnahme: Es sind nur gueltige Kommandos zu verwenden. MAG -- Privilege violation Erlaeuterung: Bei Systemen mit Mehrnutzerschutz kann nur das Terminal die Band- kenndaten veraendern, welchem das Magnetband zugewiesen ist. Massnahme: Erneute Eingabe des Kommandos von dem Terminal aus, welches das Magnetband besitzt. MAG -- Requested operation inconsistent with tape state Erlaeuterung: Der Nutzer gab /EOF, /EOV, /EOT bzw. /INITIALIZE an und der Magnetband-ACP wies dies ab. Massnahme: Ermitteln des Zustandes des Magnetbandes und Eingeben nur von solchen Kommandos, welche im augenblicklichen Zustand ausgefuehrt werden koennen. MAG -- Syntax error Erlaeuterung: Das Kommando wurde fehlerhaft angegeben. Massnahme: Pruefen auf korrekte Syntax u. erneute Eingabe der Kommandozeile. 135 Anlage 29 Beispiel fuer eine Code-Umsetzungstabelle ---------------------------------------------------- Die Tabelle dient der Codeumsetzung von DKOI in KOI7 und umge- kehrt. Sie ist in OMOS 1630 enthalten und wird durch Angabe von /TR=EBCDIC beim MOUNT-Kommando benutzt. EBCDIC:: MOV #TBLPTR,R0 RETURN ; TBLPTR: .WORD EBCASC .WORD ASCEBC ; .NLIST BEX ; EBCASC: .BYTE 000,001,002,003,040,011,040,177,040,040 .BYTE 040,013,014,015,016,017,020,021,022,023 .BYTE 040,040,010,040,030,031,040,040,040,035 .BYTE 040,037,040,040,034,040,040,012,027,033 .BYTE 040,040,040,040,040,005,006,007,040,040 .BYTE 026,040,040,036,040,004,040,040,040,040 ; 50. .BYTE 024,025,040,032,040,040,040,040,040,040 .BYTE 040,040,040,040,133,056,074,050,053,135 .BYTE 046,040,040,040,040,040,040,040,040,040 .BYTE 041,044,052,051,073,136,055,057,040,040 .BYTE 040,040,040,040,040,040,174,054,045,137 ; 100. .BYTE 076,077,137,040,040,040,040,040,040,040 .BYTE 040,140,072,043,100,047,075,042,040,141 .BYTE 142,143,144,145,146,147,150,151,040,040 .BYTE 040,040,040,040,040,152,153,154,155,156 .BYTE 157,160,161,162,040,040,040,040,040,040 ; 150. .BYTE 040,176,163,164,165,166,167,170,171,172 .BYTE 040,040,040,040,040,040,040,040,040,040 .BYTE 040,040,040,040,040,040,040,040,040,040 .BYTE 040,040,173,101,102,103,104,105,106,107 .BYTE 110,111,040,040,040,040,040,040,175,112 ; 200. .BYTE 113,114,115,116,117,120,121,122,040,040 .BYTE 040,040,040,040,134,040,123,124,125,126 .BYTE 127,130,131,132,040,040,040,040,040,040 .BYTE 060,061,062,063,064,065,066,067,070,071 .BYTE 040,040,040,040,040,040 ; 250. ; ASCEBC: .BYTE 000,001,002,003,067,055,056,057 .BYTE 026,005,045,013,014,015,016,017 .BYTE 020,021,022,023,074,075,062,046 .BYTE 030,031,077,047,042,035,065,037 .BYTE 100,132,177,173,133,154,120,175 ; 40 .BYTE 115,135,134,116,153,140,113,141 .BYTE 360,361,362,363,364,365,366,367 .BYTE 370,371,172,136,114,176,156,157 .BYTE 174,301,302,303,304,305,306,307 ; 100 .BYTE 310,311,321,322,323,324,325,326 .BYTE 327,330,331,342,343,344,345,346 .BYTE 347,350,351,112,340,117,137,155 .BYTE 171,201,202,203,204,205,206,207 ; 140 .BYTE 210,211,221,222,223,224,225,226 .BYTE 227,230,231,242,243,244,245,246 .BYTE 247,250,251,300,152,320,241,377 136 Abkuerzungsverzeichnis ---------------------- AST - asynchroner Systemtrap (asynchronous systemtrap) C-Bit - Carry-Bit im Prozessorstatuswort CSI - Kommandozeileninterpretation (command string interpreting) DFNB - Standarddateinamenblock (default file name block) E/A - Ein-/Ausgabe EOF - logisches Ende der Datei (end of file) FCS 1630 - Dateizugriffsroutinen 1630 (file control services) FDB - Dateibeschreibungsblock (file descriptor block) FNB - Dateinamenblock (file name block) FSR - Dateispeicherbereich (file storage region) GCML - Kommandozeilenlesen (get command line) Datei-ID - Dateiidentifikation (file identification) LUN - logische Geraetenummer (logical unit number) MFD - Hauptdateiverzeichnis (master file directory) UFD - Nutzerdateiverzeichnis (user file directory) UIC - Nutzeridentifikationscode (user identification code) 137 Sachwortverzeichnis ------------------- Seite AST-Routine 41,44 Attribut 16,114 Block, virtuell 22,37,41,42,44 Block-Ein-/Ausgabe 41ff,47 Blockgroesse 42,44,61f Blocknummer, virtuell 37,41 Codeumsetzung 64,136 CSI-Steuerblock 71 Datei, temporaer 18 Dateiattribute 17,60,64 Dateibeschreibungsblock 6,9,89 Dateideskriptor 12,15,17,89,99 Dateieigentuemer 57 Dateierweiterung 44,111 Dateikennsatz 16 Dateinamenblock 12,16,4,89,97 Dateischutz 4 Dateispeicherbereich 13,56,9 Dateispezifikation 12,13,17,4,90 Dateiverzeichnis 50ff DSW-Rueckkehrcodes 121 E/A-Rueckkehrcodes 117 E/A-Statusblock 42,44,90,104 Einfuegen einer Datei 53 Ereignisflag 23,41,46,91 Erstellen einer Datei 15f Erweiterung Dateispeicherbereich 14 Erweiterung von Dateien 17 FCS-Makrorufe 12,100 FCS-Rueckkehrcodes 117 FDB, Speicherbelegung 92 FNB, Aufbau 12,97,101 FNB-Statuswort 52,53,98 FSR-Blockpuffer 23,26 Finden einer Datei 52 Folgenummer 22f Funktionsroutine 73,79 GCML-Steuerblock 69,129 Geraetenummer, logische 16,48 Grosspufferung 11,14,26f Initialisierung Dateispeicherbereich 13 Kommandozeileninterpretation 71 Lesen eines virtuellen Blockes 42 Lesen von Saetzen 28,30 Loeschen einer Datei 20 138 Magnetband 59ff Magnetband, kennsatzlos 64 Magnetbandsteuertask 60 Mehrfachpufferung 11,14,26,35 Nutzersatzpuffer 25 Oeffnen einer Datei 15,21 Oeffnen einer existierenden Datei 16 Oeffnenruf, allgemein 19 Offsets, FDB 91 Positionieren einer Datei 37f Positionierung des Magnetbandes 59 Satzattribute 16,102 Satz-Ein-/Ausgabe 22 Satznummer 25,28 Satzposition 37f Satztypen 22f Schalterbescheibungstabelle 72 Schalterwertebeschreibungstabelle 72 Schliessen einer Datei 15,20 Schluesselwort 78 Schluesselworttabelle 74,78,80,83 Schreiben eines virtuellen Blockes 44 Schreiben von Saetzen 32,34 Spooling 87 Standard-Dateiverzeichnis 56 Standard-UIC 56f Standarddateinamenblock 12,17,19,91 Standarddateischutzmaske 57 Statistikblock 99 Streichen einer Datei 54 Synchronisation 18,41,45,47 Synchronisation der Satz-E/A 12,23 Uebergang 73,75,78 Uebertragungsmodus 23,30,34 Umbenennen einer Datei 54 Virtueller Block 25,35,42,44 Warten auf E/A Beendigung 45 Zeigermodus 26,32,35 Zugriff, direkt 25,28,32 Zugriff, gemeinsam 18 Zugriff, sequentiell 25,30,34 Zustandstabelle 74 139