diff options
Diffstat (limited to 'doc/system-manual')
| -rw-r--r-- | doc/system-manual/1.8.7/doc/systemhandbuch.1 | 1685 | ||||
| -rw-r--r-- | doc/system-manual/1.8.7/doc/systemhandbuch.2 | 1351 | ||||
| -rw-r--r-- | doc/system-manual/1.8.7/doc/systemhandbuch.3 | 1366 | ||||
| -rw-r--r-- | doc/system-manual/1.8.7/doc/systemhandbuch.4 | 1185 | ||||
| -rw-r--r-- | doc/system-manual/1.8.7/source-disk | 1 | 
5 files changed, 5588 insertions, 0 deletions
| diff --git a/doc/system-manual/1.8.7/doc/systemhandbuch.1 b/doc/system-manual/1.8.7/doc/systemhandbuch.1 new file mode 100644 index 0000000..a8f53bb --- /dev/null +++ b/doc/system-manual/1.8.7/doc/systemhandbuch.1 @@ -0,0 +1,1685 @@ +____________________________________________________________________________  +  +  +#on("b")##on ("u")#  +#center#Betriebssystem E U M E L  +#off ("u")#  +  +  +#center#Systemhandbuch  +  +  +  +  +#off("b")#  +#center#Lizenzfreie Software der  +#on ("b")#  +  +#center#Gesellschaft für Mathematik und Datenverarbeitung mbH,  +#center#5205 Sankt Augustin  +  +  +#off("b")#  +#center#Die Nutzung der Software ist nur im Schul- und Hochschulbereich für  +#center#nichtkommerzielle Zwecke gestattet.  +  +#center#Gewährleistung und Haftung werden ausgeschlossen  +  +  +____________________________________________________________________________  +#page#  +#start(5.1,1.5)#  +#free(4.0)#  +#center#EUMEL  +  +  +#center#Systemhandbuch  +  +  +  +  +  +  +  +  +  +#center#copyright ERGOS GmbH, 1990  +  +  +#page#  +#block#  +  +Copyright:  ERGOS GmbH   April 1990  +  +                     Alle Rechte vorbehalten. Insbesondere ist die Überführung in +                     maschinenlesbare Form sowie das Speichern in Informations +                     systemen, auch auszugsweise, nur mit schriftlicher Einwilligung +                     der ERGOS GmbH gestattet.  +  +  +           +-----------------------------------------------------+  +  +  +  +  +  +  +  +Autoren                  :  Jochen Liedtke  +                   Dietmar Heinrichs  +                   Rainer Hahn  +                   Christian Szymanski  +                   Thomas Müller  +  +Texterstellung   :  Dieser Text wurde mit der ERGOS-EUMEL Textverarbeitung erstellt  +                   und aufbereitet und auf einem Kyocera Laserdrucker ge +                   druckt.  +#page# +  +  +  +  +  +  +  +            +----------------------------------------------+  +  +  +  +  +#page#  +  +#start(2.5,1.5)#  +#pageblock#  +#block#  +#headeven#  +  +%#center#EUMEL-Systemhandbuch  +  +  +#end#  +#headodd#  +  +#center#Einführung#right#%  +  +  +#end#  +  +#ib(9)#Einführung#ie(9)#  +  +Der größte Teil dieses Systemhandbuchs ist für Anwender geschrieben, die tiefer in +das EUMEL-System einsteigen und evtl. Systemergänzungen oder Systemänderun +gen programmieren wollen. Der erste Teil ist allerdings für alle interessant, die ein +EUMEL-System verwenden, selbst für Anfänger, die ihr System zum ersten Mal in +Betrieb nehmen wollen. Entsprechend der verschiedenen Adressatenkreise unter +scheiden sich die einzelnen Kapitel stark in der Beschreibungsart. Deshalb:  +  +#on("b")##on("i")#Sind Sie EUMEL-Neuling?#off("b")##off("i")#  +  +     Dann sollten Sie #on("b")##on("i")#vor#off("b")##off("i")# dem Einschalten Ihres Systems die Einführung des Kapi +     tels "System einrichten" lesen. Dort werden keine weiteren Kenntnisse voraus +     gesetzt. Danach sollten Sie erst einmal durch praktisches Arbeiten mit Hilfe des +     Benutzerhandbuchs etwas mit dem System vertraut werden.  +  +  +#on("b")##on("i")#Haben Sie schon einige Zeit mit dem EUMEL gearbeitet?#off("b")##off("i")#  +#on("b")##on("i")#Sind Sie mit dem System einigermaßen vertraut?#off("b")##off("i")#  +  +     Dann lesen Sie den kompletten Teil 1 ("System einrichten") dieses Systemhand +     buchs.  +     Das Lesen der folgenden Kapitel ist für den einfachen Betrieb des EUMEL- +     Systems nicht erforderlich. Sie setzen auch intime Kenntnis des Systems auf +     dem Niveau des Benutzerhandbuchs voraus und würden Anfänger leicht verwir +     ren.  +  +  +#on("b")##on("i")#Haben Sie Probleme mit Ihrer Hardware?#off("b")##off("i")#  +  +     #on("i")#Wenn Sie nichts von Hardware verstehen, wenden Sie sich an einen Fachmann!#off("i")#  +  +     Wenn Sie ein gewisses Grundwissen über Hardware haben, dann lesen Sie Teil 2 +     ("Hardware und ihre Steuerung"). In diesem Kapitel sollten Sie "3. Kanä +     le und Konfigurierung" erst einmal auslassen.  +  +  +#on("b")##on("i")#Wollen Sie tiefer in das Betriebssystem einsteigen?#off("b")##off("i")#  +#on("b")##on("i")#Haben Sie EUMEL-Erfahrung?#off("b")##off("i")#  +#on("b")##on("i")#Haben Sie Programmiererfahrung?#off("b")##off("i")#  +  +     Dann lesen Sie im Systemhandbuch alles, was Ihnen interessant erscheint.  +#page#  +#headeven#  +  +%#center#EUMEL-Systemhandbuch  +  +  +#end#  +#headodd#  +  +#center#1. System einrichten#right#%  +  +  +#end#  +  +#ib(9)#1. #ib#System einrichten#ie##ie(9)#  +  +#ib(9)#1.1. Einführung#ie(9)#  +  +#ib(9)#Wie Ihr System aufgebaut ist#ie(9)#  +  +Der kleinstmögliche EUMEL-Rechner besteht aus einem #ib#Rechnerkern#ie# und einem Ter +minal:  +  +  +           Rechnerkern              Terminal 1  +  +  +     #on("i")#Anmerkung: In manchen Fällen ist das Terminal hardwaremäßig in den Rechner +                integriert. Trotzdem fassen wir diese physische Einheit dann als +                zwei logisch getrennte Komponenten auf, nämlich Rechnerkern +                und Terminal!#off("i")#  +  +Wie man sieht, hat das #ib#Terminal#ie# die Nummer 1. Das bedeutet, daß es über Kanal 1 mit +dem Rechnerkern verbunden ist. Das EUMEL-System kennt 16 solche #ib#Kanäle#ie#, wobei es +von der konkreten Hardware abhängt, welche Kanäle wirklich vorhanden sind und +welche Geräte man daran anschließen kann. (Allerdings ist der Kanal 1 als Verbindung +zum Terminal 1 immer vorhanden.)  +  +In den meisten Fällen wird auch ein #ib#Drucker#ie# angeschlossen sein. Die genaue An +schlußart ist wieder von der konkret verwendeten Hardware abhängig. Nehmen wir an, +er sei an Kanal 4 angeschlossen:  +  +  +  +           Rechnerkern              Terminal 1  +  +                                    Drucker (Kanal 4)  +  +  +  +Man sieht also, daß Lücken bei der Verwendung der Kanäle auftreten dürfen. Bei +Multi-User-Systemen können, sofern die entsprechenden Schnittstellen vorhanden +sind, weitere Terminals und andere Geräte (z.B. #ib#Plotter#ie#) angeschlossen werden:  +  +  +  +           Rechnerkern               Terminal 1  +  +                                     Terminal 2  +  +                                     Plotter (Kanal 3)  +  +                                     Drucker (Kanal 4)  +  +                                     Terminal 5  +  +                                     Terminal 6  +  +  +  +  +  +#ib(9)#1.2. Wie Sie die EUMEL-Software erhalten und  +     installieren#ie(9)#  +  +  +  +Betriebssystem  :  EUMEL (Version 1.8)  +Hardware        :  IBM-PC/AT, IBM-PC/XT und Kompatible  +SHard-Version   :  4.9 und 5.0  +  +Erforderliche Disketten  +  +   -  EUMEL-Generierungsdiskette   :  "SETUP-EUMEL AT" (bzw. "SETUP- +                                      EUMEL XT")  +   -  EUMEL-Systemdisketten        :  "HG0" und "HG1" (EUMEL0-Maschine +                                       und Hintergrund) evtl. auch nur eine 1,2 +                                       MB Hintergrunddiskette  +  +Die Diskette "SETUP-EUMEL" ist ein kleines EUMEL-System zur Installation des Be +triebssystems EUMEL auf einem AT/XT kompatiblen Rechner. Auf diesem System +laufen Programme ab, die im Dialog mit dem Benutzer das Einrichten einer oder +mehrerer EUMEL-Partitionen ermöglichen.  +#on("b")#Diese Diskette darf nicht schreibgeschützt sein!#off("b")#  +  +Beim Einrichten einer EUMEL-Partition wird nach Prüfung der Festplatte durch +"SETUP-EUMEL" der hardwarenahe Teil des EUMEL-Systems, 'SHard' (Software/ +Hardware-Interface), auf die Festplatte geschrieben.  +  +Die Hintergrunddisketten beinhalten das eigentliche Betriebssystem EUMEL (den +Systemkern (EUMEL-0-Maschine)) und die darauf aufbauenden Systemteile (Hinter +grund)).  +  +  +Leistungen des SETUP EUMEL  +  +Wenn Sie bereits ein Betriebssystem auf Ihrer Festplatte installiert haben, müssen Sie +darauf achten, daß noch ausreichend Platz für ein EUMEL-System übrig ist. Die Min +destgröße einer Partition für ein EUMEL-System beträgt ca. 1MB, die maximale Größe +ist vom benutzten Systemkern abhängig: der in der Version 1.8.6 M+ verwendete +Systemkern u186+ \#1523 erlaubt eine maximale Größe von 128 MB. Andere, ältere +EUMEL Versionen erlauben nur eine Partitionsgröße von 16 MB. Aus Kompatibilitäts +gründen stellt das Installationsprogramm eine Kontrollfrage bei Überschreiten der 16 +MB Grenze.  +  +Soll neben EUMEL auch eine MS-DOS Partition auf der Festplatte sein, muß, da +MS-DOS standardmäßig die gesamte Festplatte belegt, dieses System gesichert, mit +dem MS-DOS-Kommando 'fdisk' (o.ä.) die Partition gelöscht und entsprechend kleiner +neu eingerichtet werden. Sie können auch bei der EUMEL-Installation alle bereits +bestehenden Systeme löschen; dazu bietet Ihnen der SETUP-EUMEL die Option +'Löschen der gesamten Partitionstabelle' an. Dabei gehen jedoch alle Daten auf der +Festplatte verloren. Achten Sie also darauf, daß sie alle Daten vorher gesichert haben!  +  +Um nun die Partitionierung für Ihr EUMEL-System vorzunehmen, legen Sie die Diskette +"SETUP-EUMEL" ohne Schreibschutzmarke in das Start-Laufwerk. Sollten Sie ein Gerät +mit zwei Laufwerken besitzen, dann ist es das Laufwerk A:. (Bei Unklarheiten im Benut +zerhandbuch des Herstellers nachsehen.)  +  +Schalten Sie nun den Rechner ein bzw. betätigen Sie den Tastatur-RESET, wenn Ihr +Gerät bereits eingeschaltet ist (meistens mit dem gleichzeitigen Druck der Tasten +CTRL, ALT und DEL).  +  +Der SETUP-EUMEL gibt zunächst folgende SHard-Meldung aus:  +  ++--------------------------------------------+  +i                                            i  +i Setup-SHard für EUMEL auf IBM PC/AT, V 4.8 i  +i Copyright (C) 1989 ERGOS GmbH, Siegburg    i  +i                                            i  ++--------------------------------------------+  +  +Warten Sie beim Hochfahren des SETUP-EUMELs, bis Ihnen nach einem Zwischen +bildschirm ("SETUP-EUMEL für Modul-SHard") eine Partitionstabelle angezeigt wird. +Dieser können Sie entnehmen, ob bereits Partitionen auf der Festplatte eingerichtet +und wie diese spezifiziert sind.  +  +Angezeigt werden neben Größe, Start- und Endspur der einzelnen Partitionen auch +eine Typ-Nummer. Für EUMEL-Partitionen werden in aufsteigender Reihenfolge die +Typ-Nummern 69 bis 72, für MS-DOS je nach Größe der eingerichteten Partition die +Nummern 1 oder 4 vergeben. Außerdem wird die gerade aktive Partition durch einen +entsprechenden Eintrag in der Tabelle kenntlich gemacht. "Aktiv" ist die Partition, die +nach dem nächsten Einschalten des Rechners bzw. nach dem nächsten Tastatur- +RESET gestartet würde.  +  +  +Sie sehen zusätzlich ein Menü mit folgenden zur Auswahl stehenden Funktionen:  +  ++------------------------------------------------------------+  +i                                                            i  +i   -  EUMEL-Partition einrichten                  1         i  +i   -               erneuern (Neuer SHard)         2         i  +i   -               aktivieren                     3         i  +i   -               löschen                        4         i  +i   -  Partitionstabelle löschen                   5         i  +i   -  SHard-Konfiguration anzeigen                6         i  +i   -  SHard konfigurieren                         7         i  +i   -  SHardmodule laden oder löschen              8         i  +i   -  SETUP-EUMEL beenden                         0         i  +i                                                            i  ++------------------------------------------------------------+  +  +#on("i")##on("u")#EUMEL - Partition einrichten #off("u")##off("i")#  +  +Eine neue EUMEL-Partition wird gemäß den im weiteren erfragten Angaben eingerich +tet. In die Partition wird ein SHard geschrieben, dessen Konfiguration die gelieferte +Grundkonfiguration oder die von Ihnen eingestellte ist (s. Partitionieren der Festplatte, +Seite 3).  +  +  +#on("i")##on("u")#EUMEL - Partition erneuern (Neuer SHARD)#off("u")##off("i")#  +  +In eine bereits vorhandene Partition wird ein SHard in der eingestellten Konfiguration +geschrieben. Der bis dahin vorhandene SHard wird überschrieben. Die Möglichkeit +besteht jedoch nur, wenn die Partition mit einem SETUP-EUMEL eingerichtet worden +ist.  +  +Erneuern bedeutet, nur den SHard #on("u")#auszutauschen#off("u")# auf einer Partition, die schon einen +fertigen EUMEL enthält, ohne daß man dabei den EUMEL löscht. Das ist dann sinnvoll, +wenn man eine neue Version des SHard benutzen möchte oder den SHard aus ir +gendwelchen Gründen (z.B. Streamer gekauft) um einen oder mehrere Module erwei +tern will.  +  +Diese Aktion kann nur durchgeführt werden, wenn bereits ein SHard mit der Versions +nummer 4.x in dieser Partion vorhanden ist. Ältere (Version 2.7, 2.8 etc.) können #on("u")#nicht#off("u")# +ersetzt werden.  +  +  +#on("i")##on("u")#EUMEL - Partition aktivieren#off("u")##off("i")#  +  +Eine Partition wird ausgewählt und aktiv gesetzt, d.h. beim nächsten Start des Re +chners wird das System, das auf dieser Partition steht, hochgefahren.  +  +  +#on("i")##on("u")#EUMEL - Partition löschen #off("u")##off("i")#  +  +Hierbei wird ein Eintrag aus der Partitionstabelle entfernt. Die EUMEL-Partition wird +nicht wirklich gelöscht, d.h. wenn man nach dem Löschen den Plattenbereich noch +nicht anderweitig verwendet hat, kann das EUMEL-System auf dieser Partition durch +ein "EUMEL-Partition einrichten" auf genau demselben Plattenbereich (Start-/Endzy +linder) wieder hergestellt werden.  +  +  +#on("i")##on("u")#Partitionstabelle löschen#off("u")##off("i")#  +  +Dies ist eine sehr gefährliche Option !  +Es werden hiermit #on("u")##on("b")#alle#off("b")##off("u")# Partitionen auf der Platte gelöscht (nicht nur die von EUMEL). +Auch hier gilt zwar, daß die Partitionen selbst an sich unangetastet bleiben und wie +derhergestellt werden könnten, aber dies ist bei anderen Betriebssystemen oft nicht +möglich. Also #on("u")#VORSICHT#off("u")#.  +  +  +#on("i")##on("u")#SHard-Konfiguration anzeigen #off("u")##off("i")#  +  +Die Module des SHard, der bereitgestellt ist, um auf die Platte geschrieben zu werden, +werden angezeigt. Es werden alle definierten Kanäle angezeigt und zu jeder Kanal +nummer der assoziierte Modulname. Aufgelistet ist die zuletzt mit dem SETUP-EUMEL +zusammengestellte Konfiguration.  +  +  +#on("i")##on("u")#SHard konfigurieren #off("i")##off("u")#  +  +Zusammenstellen von einer SHardbasis und SHardmodulen zu einem neuen SHard, +um eine neue Partition einzurichten oder den SHard einer bestehenden Partition zu +ersetzen.  +ACHTUNG:   Bitte diesen Menuepunkt nicht experimentell benutzen! Eine Anleitung +           zum Thema Module etc. wird separat erscheinen.  +#page#  +#on("i")##on("u")#SHardmodule laden oder löschen #off("u")##off("i")#  +  +Hiermit können neue Module oder neue Versionen von Modulen in den SETUP-EUMEL +geladen werden oder nicht mehr benötigte Module gelöscht werden. Die neuen Modu +le werden von einer EUMEL-Archivdiskette gelesen, deren Name zuvor eingegeben +werden muß.  +ACHTUNG:   Bitte diesen Menüpunkt nicht experimentell benutzen! Eine Anleitung +           zum Thema Module etc. wird separat erscheinen.  +  +  +#on("i")##on("u")#SETUP-EUMEL beenden #off("u")##off("i")#  +  +SETUP-Programm ordnungsgemäß beenden.  +ENDE-Meldung abwarten!  +  +  +  +  +Die eigentliche Partitionierung beginnt nun, indem Sie Menü-Punkt 1 "EUMEL-Partition +einrichten" anwählen. (Punkt 1 wird Ihnen nur dann #on("b")#nicht#off("b")# angeboten, wenn die Fest +platte bereits vollständig belegt ist. Sichern Sie dann das alte System und löschen eine +oder alle Partitionen.) Die Kontrollabfrage "Neue EUMEL-Partition einrichten? (j/n)" +beantworten Sie entsprechend mit "j".  +  +Beim Generieren einer EUMEL-Partition werden Angaben zu Größe und Startzylinder +abgefragt. Dafür werden Vorgaben gemacht, die Sie bestätigen, indem Sie die +<RETURN>-Taste betätigen, oder die Sie überschreiben können. Die abschließende +Abfrage "Sind die Partitionsangaben korrekt?" fordert Sie zur Überprüfung Ihrer Einga +ben auf.  +  +Nach der Eingabe und der Überprüfung der Sektoren erscheint eine Meldung wie z.B.:  +  ++--------------------------------------------------+  +i                                                  i  +i   Ich habe keine schlechten Sektoren gefunden    i  +i   SHard wird auf die Partition geschrieben       i  +i   Bitte betätigen Sie eine Taste!                i  +i                                                  i  ++--------------------------------------------------+  +  +oder  +  ++--------------------------------------------------+  +i                                                  i  +i   Ich habe 2 schlechte Sektoren gefunden         i  +i   SHard wird auf die Partition geschrieben       i  +i   Bitte betätigen Sie eine Taste!                i  +i                                                  i  ++--------------------------------------------------+  +  +Danach gelangen Sie wieder in das Generierungsmenü. Wählen Sie "0" für "SETUP- +EUMEL beenden". Über eine Sicherheitsfrage verlassen Sie nun den ersten Teil der +Installation. Warten Sie #on("b")#unbedingt#off("b")#, bis auf dem Bildschirm die Meldung "ENDE" er +scheint, bevor Sie die Diskette "SETUP EUMEL" aus dem Laufwerk nehmen.  +  +  +  +Installieren eines EUMEL-Hintergrundes  +  +Im nächsten Schritt wird auf ihrer Festplatte das vollständige EUMEL-System instal +liert.  +  +Bitte betätigen Sie den Tastatur-Reset an Ihrem Rechner (oder die Tasten CTRL, ALT +und DEL oder den AUS-/EIN-Schalter).  +  +Auf dem Bildschirm erscheint die folgende Meldung:  +  ++--------------------------------------------------------------------------+  +i                                                                          i  +i  SHard für EUMEL auf IBM PC,AT,XT, V 4.7                                 i  +i  Copyright (c) 1985, 86, 87, 88, 89 Martin Schönbeck Beratungen GmbH,    i  +i     Spenge                                                               i  +i  Ladevorgang kann durch Tastendruck unterbrochen werden                  i  +i  Habe leider keine EUMEL-0-Maschine gefunden                             i  +i  Ladevorgang unterbrochen, drücken Sie eine Taste um fortzufahren.       i  +i                                                                          i  ++--------------------------------------------------------------------------+  +  +Legen Sie nun die erste Hintergrunddiskette (HG0) in das Laufwerk ein und betätigen +Sie eine Taste. Der Systemkern wird geladen und es erscheinen Angaben zu HG-, +RAM-, und Pufferkapazität sowie zu den angeschlossenen Kanälen, diesmal jedoch +bezogen auf die Festplatten-Partition. Warten Sie nun, bis die Meldung "HG ungültig" +kommt. Drücken Sie anschließend eine beliebige Taste.  +Falls Sie in ein bereits bestehendes EUMEL-System einen neuen Urlader einspielen +wollen, lesen Sie bitte den Abschnitt "Installation eines neuen Urladers".  +  +#page#  +#free(1.0)#  +Ein Menü bietet Ihnen dann folgende Auswahl:  +  ++-----------------------------------------+  +i                                         i  +i    (1)  Systemstart                     i  +i    (2)  Hintergrund vom Archiv laden    i  +i    (3)  Hardwaretest                    i  +i    (4)  neuen Urlader vom Archiv laden  i  +i                                         i  ++-----------------------------------------+  +  +Wählen Sie Menü-Punkt (2) "Hintergrund vom Archiv laden" und bestätigen Sie die +Abfrage "Alten HG überschreiben?" mit "j".  +  +Das Laden des Hintergrundes kann einige Minuten in Anspruch nehmen. Sie werden +mit der Meldung "Nächstes HG-Archiv eingelegt? (j/n)" zum Einlegen der Folgedisket +te(n) aufgefordert, was Sie anschließend mit der Eingabe von "j" quittieren.  +  +Es können bei beschädigten Disketten Lesefehler auftreten; dann gibt das System eine +der Meldungen 'Harter Lesefehler' bzw. 'Softerror' aus. Bei letzterem könnte der ent +sprechende Sektor nach mehrmaligem Versuch noch gelesen werden. Bei einem +harten Lesefehler können Sie die Diskette nicht verwenden. Bitte benachrichtigen Sie +die Firma, von der Sie die Disketten erhalten haben.  +  +Wenn der Hintergrund eingelesen ist, erscheint die Aufforderung 'fertig, bitte RESET'. +#on("b")#Vergessen Sie nicht#off("b")#, vor der Betätigung des Tastatur-RESET die Hintergrunddiskette +aus dem Diskettenlaufwerk zu entfernen.  +  +Wenn Sie während des Hochfahrens keine Taste drücken, dann startet der Lader durch +und das EUMEL-System meldet sich mit einer Tabelle von Geräteanpassungen:  +  ++--------------------------------------------------------------------------+  +i                                                                          i  +i  psi                 transparent       pc.1.25 pc.2.25                   i  +i  pc.3.25             pc.1.24           pc.2.24 pc.3.24                   i  +i  psi25               tandberg.2244s    DEC.VT100.ascii   DEC.VT100       i  +i  DEC.VT220.ascii     DEC.VT220.german  FT10/20.german    FT10/20.ascii   i  +i  ampex210.ascii      ampex210.german   ampex220.german   ampex232        i  +i  Wyse.WY50.ascii     Wyse.WY50.german  Wyse.WY60.german                  i  +i  Wyse.WY120.german                                                       i  +i                                                                          i  +i  Kanal 1 (j/n)                                                           i  +i                                                                          i  ++--------------------------------------------------------------------------+  +  +Da unterschiedliche Tastaturen auch unterschiedliche Tastenbelegungen haben, ist es +notwendig, mit Hilfe der Konfigurationstabelle Ihre Tastatur und Ihren Bildschirm an +das EUMEL-System anzupassen. Dafür bietet Ihnen das System "Kanäle" an. #on("u")#Kanal 1#off("u")# +entspricht dem Haupt-Terminal des Rechners, #on("u")#muß also auf jeden Fall konfiguriert +werden#off("u")#. Beantworten Sie also die Frage "Kanal 1 (j/n)" mit "j".  +Das EUMEL-System funktioniert auch, wenn Sie zunächst nur Kanal 1 mit der Anpas +sung konfigurieren, die Ihrem Gerätetyp entspricht. Wenn Ihr Rechner eine AT-Tastatur +hat, ist die korrekte Konfiguration "pc.1"; die Konfigurationen "pc.2" und "pc.3" decken +die meisten der Rechner ab, deren Tastenbelegung von der Standard-AT Tastatur +geringfügig abweicht. Die Erweiterung ".24" bzw. ".25" gibt die Anzahl der Bildschirm +zeilen wieder. Standardmäßig sind im SHard 24 Zeilen eingestellt.  +  +Weitere Kanäle zum Anschluß von Druckern oder weiteren Terminals können jederzeit +bei Bedarf vorgenommen werden (EUMEL Systemhandbuch Teil 1).  +Die Anfrage nach der Konfiguration weiterer Kanäle kann deshalb verneint werden. Die +Abfrage 'koennen unbenutzte Geraetetypen geloescht werden (j/n)' beantworten Sie +einstweilen mit 'n'. Anschließend werden noch Datum und Uhrzeit abgefragt. Damit ist +das Erstinstallationsprogramm abgeschlossen und es erscheint die Meldung 'mainten +ance :'. Geben Sie an dieser Stelle <ESC> <q> (nacheinander) ein. Sie haben damit +die Task 'configurator' ordnungsgemäß verlassen. Erst damit ist sichergestellt, daß die +eingestellte Konfiguration wirksam wird.  +  +  +Installation eines neuen Urladers +  +Wenn Sie den alten Urlader mit einem neuen (z.B. protected mode) überschreiben +wollen, starten Sie das EUMEL-System zunächst neu. Sobald die Meldung  +  +   #on("b")#Ladevorgang kann durch Tastendruck unterbrochen werden#off("b")#  +  +erscheint, drücken Sie eine beliebige Taste (z.B. ENTER). Auf dem Bildschirm er +scheint nun zusätzlich die Meldung  +  +   #on("b")#Ladevorgang unterbrochen, drücken Sie eine Taste um fortzufahren#off("b")#  +#page#  +Legen Sie nun die Diskette mit dem neuen Urlader in das Bootlaufwerk und drücken +Sie wieder eine beliebige Taste. Danach werden folgende Meldungen auf dem Bild +schirm ausgegeben:  +  ++-----------------------------------------------------+  +i                                                     i  +i   EUMEL wird von Diskette geladen                   i  +i                                                     i  +i                                                     i  +i   E U M E L - Vortest                               i  +i                                                     i  +i   Terminals: 1 ....                                 i  +i   RAM-Groesse (gesamt):        .... kB              i  +i   Pufferbereich:               .... kB              i  +i   Hintergrund-Speicher         .... kB              i  +i                                                     i  +i   Speichertest:  **********                         i  +i                                                     i  ++-----------------------------------------------------+  +  +In der Zeit, in der die Sternchen des Speichertests erscheinen, drücken Sie bitte wieder +die ENTER-Taste. Nach dem Speichertest erscheint dann folgendes Menü:  +  ++-----------------------------------------------------+  +i                                                     i  +i   (1)   Systemstart                                 i  +i   (2)   neuen Hintergrund vom Archiv laden          i  +i   (3)   Hardwaretest                                i  +i   (4)   neuen Urlader vom Archiv laden              i  +i                                                     i  ++-----------------------------------------------------+  +  +Wählen Sie Menüpunkt 4 und auf dem Bildschirm erscheinen die folgenden Zeilen:  +  +#box("-0.1","0.0","8.0","1.0")#  +   \#     xxx  +   fertig, bitte RESET  +  +wobei hinter dem \#-Zeichen die übertragenen Blöcke des neuen Urladers gezählt +werden.  +  +Anschließend entfernen Sie bitte die Urladerdiskette aus dem Laufwerk und drücken +den RESET-Schalter Ihres Rechners. Das EUMEL-Betriebssystem wird nun mit dem +neuen Urlader gestartet.  +  +  +Tastenbelegung: +  +EUMEL-Zeichen:  Taste auf dem IBM-PC/AT  +  +  MARK       :   +--------+  +                 i bild   i     (oder Pfeil nach oben)  +                 +--------+  +  +  RUBIN      :   +--------+  +                 i Einfüg i  +                 +--------+  +  +  RUBOUT     :   +--------+  +                 i Lösch  i  +                 +--------+  +  +  TAB        :   +--------+  +                 i <=  => i  +                 +--------+  +  +  HOP        :   +--------+  +                 i Pos 1  i  +                 +--------+  +  +  ESC        :   +------------+  +                 i Eing Lösch i  +                 +------------+  +  +  SV         :   +------------+          +-------+  +                 i  CTRL g    i   oder   i F1    i  +                 +------------+          +-------+  +  +Bemerkung: Die CTRL-Taste kann auch mit STRG bezeichnet sein.  +  +Sollte die Tastaturbelegung noch nicht die EUMEL-spezifischen Tasten (HOP, MARK, +SV, RUBIN, RUBOUT) an den entsprechenden Orten anbieten, können Sie durch +Ankoppeln der Task "configurator" und Absetzen des Befehls "configurate" die Tastatu +ren (auch für zusätzlich angeschlossene Terminals) kanalweise umkonfigurieren. Nähe +res entnehmen Sie bitte dem Systemhandbuch, S.6ff.  +  +  +Zusatzprogramme +  +Nachdem das System vollständig installiert ist, kann noch typspezifische Software +eingespielt werden. Diese befindet sich auf der Diskette 'EUMEL-Archiv "AT" (bzw. +"XT")'. Der folgende Ablauf skizziert schon das Prinzip jeder Arbeit in einem EUMEL- +System: Task ankoppeln mit 'continue("taskname")' bzw. 'begin("taskname")', Eingabe +von Kommandos wie 'edit', 'run' oder 'generate shutup dialog manager', abschließend +Task abkoppeln durch <ESC> <q>. Eine ausführliche Beschreibung finden Sie in +den EUMEL-Handbüchern.  +#page#  +Wenn Sie nach Einstellen des Kanals 1 die Task 'configurator' verlassen haben, befin +den Sie Sich auf Supervisor-Ebene. Um die auf der Diskette befindlichen Programme +an der richtigen Stelle zu übersetzen, sind folgende Schritte notwendig:  +  +Drücken Sie die <SV>-Taste (F1). Damit landen Sie im Supervisor-Menü, dem +Systemverteiler. Mit <ESC> <c> und Eingabe des Tasknamens 'SYSUR' (auf Groß +schreibung achten!) holen Sie die Task 'SYSUR' an das Terminal. Diese Task meldet +sich mit 'maintenance:'. Da Sie mit einem Mehrbenutzersystem arbeiten, müssen Sie +das Diskettenlaufwerk zunächst für sich reservieren: 'archive("AT")'. Erst dann können +Sie Dateien von der Diskette holen: 'fetch("AT install",archive)' und das Installations +programm ausführen: 'run'. Der weitere Ablauf erfordert keine Eingriffe.  +  +Nach Ablauf der Programme sollten Sie schließlich eine besondere Task zum Abschal +ten einrichten. Dazu müssen Sie nocheinmal die Task 'SYSUR' an den Bildschirm +holen und dort das durch die Zusatzsoftware (u.a.) neu hinzugewonnene Kommando +'generate shutup dialog manager' geben. Nach Absetzen des Kommandos können Sie +'SYSUR' durch <ESC> <q> wieder verlassen.  +  +Um menügesteuert das Betriebssystem abzuschalten oder einen Partitionswechsel +vorzunehmen, steht Ihnen die Task 'shutup dialog' zur Verfügung. Bei Ausführung des +Supervisor-Kommandos 'continue("shutup dialog")' wird Ihnen die aktuelle Partitions +tabelle angezeigt, so wie Sie diese bereits bei der Generierung kennengelernt haben, +d.h. mit Angabe von Größe, Start- und Endzylinder der eingerichteten Partitionen. Sie +können dann eine beliebige Partition menugesteuert auswählen und starten oder das +Betriebssystem kontrolliert abschalten (sog. 'shutup'). Dabei wird der aktuelle System +zustand automatisch gesichert.  +  +  +Archivformate bei ATs und Kompatiblen mit zwei Diskettenlauf +werken: +  +Standardmäßig ist der Archivkanal 31 an das Laufwerk 'A:' gebunden, das eine Kapazi +tät von 1,2 Megabyte besitzt. Ist jedoch bei Ihrem Gerät ein zweites Diskettenlaufwerk, +z.B. mit einer Kapazität von 360 Kilobyte eingebaut, dann können Sie auf dieses Lauf +werk über den Kanal 30 zugreifen.  +  +Dazu richten Sie unter 'SYSUR' eine Task ein, die Sie z.B. 'ARCHIVE 360' benennen. +Geben Sie in dieser Task das Kommando 'archive manager (30)'; dann können Sie von +jeder Benutzertask das Archiv mit dem Kommando 'archive ("Archivname",/ "ARCHIVE +360")' anmelden. Der Zugriff auf eine Diskette in diesem Laufwerk geschieht z.B. über +'list(/"ARCHIVE 360")' oder 'save ("Dateiname",/"ARCHIVE 360")'. Eine andere Möglich +keit ist ein 3,5" Laufwerk.  +  +  +  +Die einzelnen Schritte der Installation im Überblick: +  +  +  1. Die Diskette 'SETUP-EUMEL' in das Laufwerk stecken.  +  +  2. Rechner einschalten oder Tastatur-RESET  +  +  3. EUMEL-Partition einrichten.  +  +  4. Generierung beenden und auf 'ENDE'-Meldung warten.  +  +  5. Diskette 'SETUP-EUMEL AT (XT)' entnehmen.  +  +  6. Tastatur-RESET.  +  +  7. Die Meldung 'Leider keine EUMEL-0-Maschine gefunden' abwarten.  +  +  8. Hintergrunddiskette ('HG0') einlegen und Taste drücken.  +  +  9. Nach der Meldung 'HG-ungültig' eine Taste betätigen, um in den Startdialog zu +     gelangen.  +  + 10. Menupunkt 2 anwählen: Neuen Hintergrund vom Archiv laden. Hintergrunddis +     kette einlegen und 'Alten HG überschreiben?' mit "j" quittieren. Folgedisketten +     einlegen, sobald entsprechende Meldung ("weiterer Archivträger eingelegt?") +     erscheint, und "j" eingeben.  +  + 11. Hintergrunddiskette entnehmen und anschließend Tastatur-RESET ausführen.  +  + 12. Kanal 1 konfigurieren.  +  +  +  +#ib(9)#1.3. Ausführliche Beschreibung#ie(9)#  +  +  +#ib##ib(9)#System laden#ie##ie(9)#  +  +  +Wie Sie in der Installationsanleitung lesen konnten, geht man beim Systemstart durch +Eingabe eines Zeichens während des Vortests in das Startmenü und wählt dort "Hin +tergrund vom Archiv laden" an. Falls der zu ladende Hintergrund sich über mehrere +Archiv-Disketten erstreckt, werden die folgenden sukzessive angefordert.  +  +  +  +  +#ib##ib(9)#System sichern#ie##ie(9)#  +  +  +Der aktuelle eigene Hintergrund läßt sich (mit allen Tasks und allen Dateien) durch das +Kommando  +  +           #ib#save system#ie#  +  +auf Archivdisketten sichern. Dabei wird der Systemzustand zunächst über einen Fix +punkt gesichert. Anschließend werden #on("b")##on("i")#formatierte#off("i")##off("b")# Disketten angefordert. Der Hinter +grund wird komprimiert gesichert, d.h. nur die belegten Blöcke werden auf das Archiv +geschrieben.  +  +#on("i")#Anmerkung: Diese Prozedur kann nur von privilegierten Tasks (Nachfahren von +           "SYSUR"), wie dem OPERATOR, aufgerufen werden.  +           Vor dem Aufruf von 'save system' sollten Sie genügend Disketten for +           matiert haben (Überprüfen Sie mit 'storage info', wieviele Disketten Sie +           benötigen, um den gesammten Hintergrund darauf zu schreiben). #off("i")#  +  +  +  +  +#ib(9)#System gegen Unbefugte schützen#ie(9)#  +  +  +Falls der Benutzerkreis eines Multi-User-Systems nicht "gutartig" ist, sollte man verhin +dern, daß jeder Benutzer des Systems Zugang zu #ib#privilegierten Operationen#ie# hat, wie +Löschen anderer Tasks, Konfiguration ändern und System sichern.  +  +Dies erreichen Sie dadurch, daß Sie #on("b")#alle#off("b")# privilegierten Tasks, das sind 'SYSUR' und alle +Söhne, Enkel usw. von 'SYSUR', durch #ib#Paßworte#ie# schützen. Damit wird der Zugang zu +diesen Tasks nur möglich, wenn man das entsprechende Paßwort eingibt. Man de +finiert solche #on("i")##on("b")##ib#Task-Paßworte#ie##off("i")##off("b")#, indem man die zu schützende Task mit Hilfe des Super +visor-Kommandos "continue" an ein Terminal holt und dann das Kommando  +  +           #ib#task password#ie# ("simsalabim")  +  +gibt. Dabei ist "simsalabim" nur ein Beispiel. Bitte verwenden Sie ein anderes Paß +wort! Da die Eigenschaft, privilegiert zu sein, nur davon abhängt, im "SYSUR"-Zweig +(und nicht im normalen "UR"-Zweig) des Systems zu sein, könnte sich ein gewitzter +Anwender die Privilegierung einfach erschleichen, indem er eine neue Sohntask von +"SYSUR" einrichtet. Um auch diese Möglichkeit zu unterbinden, sollte man in #on("b")#jeder#off("b")# +Task des SYSUR-Zweiges ebenfalls ein #on("i")##on("b")#"begin"-Paßwort#off("i")##off("b")# definieren. Das geschieht mit +dem Kommando  +  +           #ib#begin password#ie# ("simsalabim")  +  +Bei der Wahl der Paßworte sollte man folgendes bedenken:  +  +    -  Ein zu kurzes oder offensichtliches Paßwort (beispielsweise der Name des +       Systemverwalters) wird von "Hackern" schnell herausgefunden.  +  +    -  Oft werden Paßworte bekannt, weil irgendwo ein Zettel mit den Paßworten +       herumliegt.  +  +    -  Der Paßwortschutz ist hart. Wenn man sein Paßwort vergessen hat, gibt es +       keinen Zugang mehr zu der geschützten Task.  +  +  +  +Beschreibung der Paßwortprozeduren:  +  +#ib#task password#ie#  +      PROC task password (TEXT CONST password)  +      Zweck: Einstellen eines Paßwortes für eine Task im Monitor.  +  +#ib#begin password#ie#  +      PROC begin password (TEXT CONST password)  +      Zweck: Verhindert das unberechtigte Einrichten einer Sohn-Task.  +      Anmerkung: Das 'begin password' vererbt sich auf die später erzeugten Sohn- +                 Tasks.  +  +#ib#family password#ie#  +      PROC family password (TEXT CONST password)  +      Zweck: Setzt oder ändert das Paßwort derjenigen Familienmitglieder, die kein +             Paßwort oder das gleiche Paßwort wie die aufrufende Task haben.  +             Zu einer Familie gehören die Task in der man sich befindet und die ihr +             untergeordneten Tasks.  +             Bsp.: Das Kommando 'family password ("EUMEL")' wird in SYSUR +                   gegeben. Dadurch wird das SYSUR-Paßwort und die Paßworte +                   der entsprechenden Tasks unter SYSUR auf "EUMEL" gesetzt.  +  +  +  +#ib##ib(9)#Konfiguration#ie##ie(9)#  +  +Die #ib#Konfiguration#ie# läuft über die Task "#ib#configurator#ie#" ab. Diese Task müssen Sie also für +die hier aufgeführten Operationen durch das Supervisor-Kommando "continue" an +koppeln (Dabei wird das Paßwort überprüft, falls die Task geschützt wurde).  +  +#on("i")#Anmerkung: Man kann die Task "configurator" löschen und dann neu (als Sohn, En +           kel,... von SYSUR) wieder einrichten. Danach holt man die Konfigura +           tionsdatei (z.B. von std.devices) und gibt das Kommando "#ib#configuration +           manager#ie#".#off("i")#  +  +  +Der in der Einführung unter "Wie Sie die Konfiguration einstellen" beschriebene Konfi +gurationsdialog läßt sich vermittels des Kommandos  +  +           #ib#configurate#ie#  +  +aufrufen. Dabei wird für jeden angewählten Kanal die bis jetzt gültige Einstellung als +Vorschlag mit ausgegeben. Die Einstellung aller Kanäle, die nicht angesprochen wer +den, bleibt unverändert.  +  +Im Menü werden die Namen aller Dateien mit #ib#Gerätetabellen#ie# aufgeführt, die in der +Task enthalten sind. Daraus folgt, daß nur noch die bei der letzten Konfigurierung +benutzten Typen aufgeführt werden, wenn vorher auf die Frage "Koennen unbenutzte +Geraetetypen geloescht werden (j/n)?" mit "j" geantwortet wurde. Löschen Sie also +nicht alle unbenutzten Gerätetypen, wenn Sie sie später evtl. nochmal bruachen (siehe +auch "Teil 2, 3. Kanäle und Konfigurierung").  +  +Im Konfigurationsdialog kann folgendes eingestellt werden:  +  +     #ib#Typ#ie#        Es werden alle vorhandenen Gerätetabellen durchgegangen, bis +                eine davon ausgewählt wurde. Diese manchmal etwas langwierige +                Arbeit kann man durch Eingabe des Zeichens ESC abkürzen: +                Danach kann man den Typnamen direkt eingeben. #on("i")#Das funktioniert +                aber nur vernünftig, wenn das eigene Arbeitsterminal bereits richtig +                konfiguriert worden ist!#off("i")#  +  +     #ib#Baudrate#ie#   (nur für V.24-Kanäle von Bedeutung) Es werden alle einstellbaren +                Baudraten durchgegangen, bis eine davon ausgewählt wurde. Das +                sind die Werte 50, 75, 110, 134.5, 150, 300, 600, 1200, 1800, 2400, +                3600, 4800, 7200, 9600, 19200, 38400 Baud.  +  +     #ib#Bits#ie#       (nur für V.24-Kanäle von Bedeutung) Es werden die einstellbaren +                Zeichengrößen durchgegangen, d.h. 7 oder 8 Bit pro Zeichen.  +  +     #ib#Parität#ie#    (nur für V.24-Kanäle von Bedeutung) Möglich sind die Einstellun +                gen 'no', 'even' und 'odd'.  +  +     #ib#Stopbits#ie#   (nur für V.24-Kanäle von Bedeutung) Stopbits geben die Pause +                zwischen zwei aufeinanderfolgenden Zeichen an. Möglich sind 1 +                oder 2 Stopbits.  +  +  +     #ib#Protokoll#ie#  Terminals u.ä. werden üblicherweise ohne Protokoll angeschlossen. +                Bei langsamen Geräten wie Druckern bzw. Plottern oder aber bei +                Rechnerkopplungen bzw. Netzen kann der Empfänger nicht immer +                so schnell Zeichen annehmen wie sie von der Gegenstation gesen +                det werden. In diesem Fall kann man das #ib#XON/XOFF-#ie# oder das +                #ib#RTS/CTS-Protokoll#ie# einstellen.  +                #on("b")#BEACHTE:  Sender und Empfänger müssen auf das gleiche Proto +                          koll eingestellt sein.#off("b")#  +  +                Manchmal müssen auch Terminals mit Protokoll angeschlossen +                werden. Üblicherweise wählt man dann aber ein rein ausgabe +                seitiges Protokoll, damit SV den EUMEL auf jeden Fall erreicht.  +                Es gibt folgende Protokolle:  +  +                #ib#XON/XOFF-Protokoll#ie#:  +                         Rechner und Gerät steuern die Sendungen jeweils über +                         XON/XOFF-Zeichen.  +                #ib#RTS/CTS-Protokoll#ie#:  +                         Rechner und Gerät steuern ihre Sendungen jeweils über +                         RTS/CTS- Leitungen.  +                #ib#XON/XOFF-ausgabeseitig#ie#:  +                         Das angeschlossene Gerät steuert die Ausgabe über +                         XON/XOFF.Eingaben zum Rechner unterliegen keinem +                         Protokoll.  +                #ib#RTS/CTS-ausgabeseitig#ie#:  +                         Das angeschlossene Gerät steuert die Ausgabe über +                         RTS/CTS. Eingaben zum Rechner unterliegen keinem +                         Protokoll.  +                #ib#XON/XOFF-eingabeseitig#ie#:  +                         Der EUMEL-Rechner steuert die angeschlossenen +                         Geräte durch XON/XOFF. Die Ausgaben zum Gerät +                         unterliegen keinem Protokoll.  +                #ib#RTS/CTS-eingabeseitig#ie#:  +                         Der EUMEL-Rechner steuert die angeschlossenen +                         Geräte durch RTS/CTS. Die Ausgaben zum Gerät unter +                         liegen keinem Protokoll.  +  +     #ib#Puffer#ie#     Terminals und alle Ausgabegeräte (Drucker u.ä.) haben standard +                mäßig die normalen "kleinen" Eingabepuffer im System zugeord +                net. Bei Rechner-Rechner-Kopplungen, DFÜ oder Netzen kann ein +                "großer" #ib#Eingabepuffer#ie# von 512 Byte notwendig werden. Dement +                sprechend sind #ib#Großpuffer#ie# nur beim Schnittstellentyp 'transparent' +                möglich.  +  +Im #ib#Konfigurationsdialog#ie# werden bei jedem Kanal nur die dort vorhandenen Möglich +keiten angeboten. Dabei wird die vorherige Einstellung immer als erste angeboten. So +kann man sich verhältnismäßig einfach "durchtasten".  +  +Die Fragen des #ib#Konfigurationsdialog#ie#s werden nach folgendem Schema gestellt:  +  +#linefeed(1.18)#  +          erfrage ("Kanal") ;  +          erfrage ("Typ") ;  +          IF dieses ist ein v24 kanal  +            THEN IF baudrate einstellbar  +                   THEN erfrage ("Baudrate")  +                 FI ;  +                 IF zeichengroesse einstellbar  +                   THEN erfrage ("Bits")  +                 FI ;  +                 IF parität einstellbar  +                   THEN erfrage ("Parität")  +                 FI ;  +                 IF stopbits einstellbar  +                   THEN erfrage ("Stopbits")  +                 FI ;  +          FI ;  +         erfrage ("Protokoll") ;  +         IF typ ist tranparent  +           THEN erfrage ("Puffer")  +         FI.  +  +#linefeed(1.0)#  +Will man seine eingestellte #ib#Konfiguration sichern#ie#, reicht es, alle Dateien der Task +"#ib#configurator#ie#" auf ein Archiv zu schreiben. Diese Konfiguration kann man dann bei +einem neuen Hintergrund einfach vom Archiv laden. Um die Konfigurierung dann auch +auszuführen, gibt man das Kommando "setup".  +  +  +  +  +#ib##ib(9)#Druckersoftware einrichten#ie##ie(9)#  +  +  +  +Das Standardarchive "std.printer" enthält einige Druckeranpassungen für die Ansteu +erung diverser Druckertypen. Soll einer dieser Druckertypen an das EUMEL-System +angeschlossen werden, so muß zuerst eine Task "#ib#PRINTER#ie#" (als Sohntask von +"SYSUR" mit dem Supervisorkommando) vorhanden sein bzw. durch  +  +  +        begin ("PRINTER", "SYSUR")  +  +  +eingerichtet werden. In dieser Task müssen dann die folgenden Schritte vollzogen +werden:  +  +-  Anmelden des Archivs:  +  +        archive ("std.printer")  +  +  +-  Holen der Druckeranpassung vom Archiv:  +  +        fetch ("druckertyp.inserter", archive)  +  +  +-  Insertieren der Druckeranpassung:  +  +        insert ("druckertyp.inserter")  +  +  +  +Beispiel:  +        archive ("std.printer")  +        fetch ("laser.inserter", archive);  +        check off;  +        insert ("laser.inserter")  +  +  +Nach Beendigung der Kompilierung finden Sie sich in einem Menü wieder, daß Ihnen +die Auswahl Ihres Drucker-Herstellers durch die Eingabe der vor dem Firmennamen +stehenden Zahl erlaubt. Diese Eingabe schicken Sie mit RETURN ab. Da Hersteller +mitunter verschiedene Modelle mit verschiedenen Funktionen anbieten, ist es nötig, +daß Sie Ihr Modell auswählen. Auch diese Eingabe wird durch RETURN abgeschickt. +Nachdem Sie die Nummer des gewünschten Druckers eingegeben haben, erfolgt noch +einmal eine Sicherheitsabfrage, ob dieser Drucker installiert werden soll.  +  +Neben den speziell zu dem gewählten Drucker passenden Fragen (z.B. NLQ-Modus +standardmäßig) ist es erforderlich, den Kanal einzugeben, an dem der Drucker ange +schlossen ist (z.B. Kanal 15 für eine parallele Schnittstelle).  +  +Wenn die Generierung beendet ist, muß in allen bestehenden Tasks - insbesondere in +der Task 'PUBLIC' - die Fonttabelle mit dem fonttable-Kommando eingestellt werden. +Mit dem Kommando  +  +  +        print ("dateiname")  +  +  +wird dann eine Datei ausgedruckt.  +  +Befindet sich keine passende Druckeranpassung für den anzuschließenden Drucker +typ auf dem Standardarchiv "std.printer", so sollte die Druckeranpassung "printer.std" +benutzt werden. Diese Druckeranpassung ist eine universelle Druckeranpassung für +alle Drucker, die mit ASCII-Code 13 ein 'Carriage Return' (d.h. Bewegung des Druck +kopfes an den linken Rand) und mit ASCII-Code 10 eine Zeilenschaltung von 1/6 Zoll +vornehmen. Mit ihr kann dann in einem Schrifttyp (entweder 10 oder 12 Zeichen pro +Zoll, je nachdem welche Fonttabelle eingestellt ist) gedruckt werden. So erhält man +wenigstens eine Minimalansteuerung des Druckers. Für eine bessere Ansteuerung des +Drucker muß ein Programm geschrieben werden, das das Druckertreiber-Interface +erfüllt (siehe Teil 6 "Der EUMEL-Drucker") und eine Fonttabelle erstellt (siehe Teil 7 "Der +Fontspeicher") werden.  +#page#  +#headeven#  +  +%#center#EUMEL-Systemhandbuch  +  +  +#end#  +#headodd#  +  +#center#2. Hardware und ihre Steuerung#right#%  +  +  +#end#  +  +  +#ib(9)#2. Hardware und ihre Steuerung#ie(9)#  +  +  +  +  +#ib(9)#2.1. Vorwort#ie(9)#  +  +  +Die #ib#Hardware#ie# eines jeden EUMEL-Systems läßt sich in #ib#Rechnerkern#ie# und Peripherie +einteilen.  +  +  +a) Der #ib#Rechnerkern#ie#  +  +  +In der Regel wird der Rechnerkern aus folgenden Komponenten bestehen:  +  +    -  #ib#CPU#ie#  +    -  #ib#Vordergrundspeicher#ie# (oft als RAM bezeichnet)  +    -  #ib#Hintergrundspeicher#ie# (Floppy, Harddisk, oder auch RAM/ROM)  +  +Alle Daten, Dateien und Programme werden auf dem Hintergrundspeicher abgelegt. +Der benötigte Platz wird dabei dynamisch nach Bedarf zugewiesen. Jeder Zugriff auf +Daten, die sich auf dem Hintergrundspeicher befinden, muß über den Vordergrund +speicher erfolgen. Zu diesem Zweck verlagert das EUMEL-System automatisch alle +aktuell benötigten Daten in den Vordergrundspeicher. Das erfolgt nach dem Prinzip +des #ib#Demand-Paging#ie# (s. Benutzerhandbuch Kap. 1). Die CPU führt die aktiven Pro +gramme (unter Benutzung des Speichers) aus. Dabei bearbeitet sie reihum alle re +chenwilligen Prozesse.  +Die drei Komponenten des Rechnerkerns werden vollständig vom EUMEL-Betriebs +system verwaltet und miteinander verknüpft, so daß der Anwender sich in der Regel +darum weder kümmern muß noch kann. Ausgenommen davon sind allerdings die +Diagnose von Hardwarefehlern und Überlegungen zur Systemleistung.  +  +  +b) Die #ib#Peripherie#ie#  +  +  +Alle anderen Geräte oder Gerätekomponenten gehören aus der Sicht des EUMEL- +Systems zur Peripherie. Wesentliches Kennzeichen ist, daß sie über Kanäle mit dem +Rechnerkern verbunden sind und von dort aus durch System- und Anwender +programm gesteuert werden können. Angeschlossen werden können u.a.  +  +    -  #ib#Terminal#ie#s  +    -  #ib#Drucker#ie# und #ib#Plotter#ie#  +    -  andere #ib#Rechner#ie# bzw. #ib#Rechnernetze#ie#  +    -  #ib#Archivgerät#ie#e (z.B. Floppy-Laufwerke)  +  +In der Regel hat jedes EUMEL-System mindestens ein #ib#Terminal#ie# und #ib#Archivlaufwerk#ie#. +Auch wenn dieses "Terminal 1" und das Floppy-Laufwerk baulich in den Rechner +integiert sind, gehören sie logisch zur Peripherie. Die entsprechenden Kanäle sind +dann allerdings Teil des Rechners und brauchen den Anwender nicht zu interessie +ren. Die beiden wesentlichen anderen Kanaltypen sind:  +  +    -  #ib#serielle Schnittstelle#ie#n (#ib#V.24#ie#)  +    -  #ib#Parallelschnittstellen#ie#  +  +Beide führen "echt" aus dem Rechner heraus und sind u.U. hardwaremäßig für den +Anwender von Bedeutung. Normalerweise sollte zwar der Lieferant der EUMEL- +Hardware für die Verkabelung und den Anschluß peripherer Geräte sorgen, aber +Kenntnisse können in Fehlersituationen (z.B. Kabelbruch), bei Umkonfigurierungen +und bei Kombinationen verschiedener Geräte helfen.  +  +  +  +  +#ib(9)#2.2. #ib#Hardware-Test#ie##ie(9)#  +  +  +  +Der EUMEL-Hardware-Test ist ein rechnerunabhängiger Test und kann demzufolge +nicht so viel überprüfen wie Testprogramme, die genau auf eine entsprechende Hard +ware zugeschnitten sind. Trotzdem sollten die meisten Hardware-Fehler schon mit +dem EUMEL-#ib#Hardware-Test#ie# gefunden werden.  +  +Bei jedem Systemstart wird der "#ib#Vortest#ie#" durchgeführt. Nachdem er Terminals, Spei +cher und Hintergrund angezeigt hat, testet er einmal den Hauptspeicher. Danach wird +das eigentliche EUMEL-System gestartet.  +  +  +Durch Eingabe eines beliebigen Zeichens während des Vortests (Speichertest: +*********) kommt man in den ausführlichen #ib#Start-Dialog#ie#. Dort wird u.a. auch die +Möglichkeit "Hardware-Test" angeboten. Wählt man diese an, werden die verfügbaren +Tests als Menü aufgelistet. Bei jedem EUMEL-System stehen folgende Testmöglichkei +ten zur Verfügung:  +  +  (1) #ib#Speichertest#ie#  +  (2) #ib#Kanaltest#ie#  +  (3) #ib#Hintergrundtest#ie#  +  (4) #ib#Archivtest#ie#  +  +Alle Tests sind dabei Dauertests, d.h. sie beginnen nach jedem Durchlauf von neu +em, können aber durch <ESC> abgebrochen werden.  +  +  +  +  +  +#ib##ib(9)#Speichertest#ie##ie(9)#  +  +  +Der #ib#Speichertest#ie# soll den Vordergrundspeicher (#ib#RAM#ie#) des Rechners untersuchen. +Gerade #ib#Speicherfehler#ie# tendieren aber dazu, nur sporadisch aufzutreten oder wär +meabhängig zu sein. Deshalb sollte der Test bei Verdacht auf Speicherfehler längere +Zeit (einige Stunden) laufen. Leider können auch dann nicht alle Fehler aufgedeckt +werden, z.B. nicht solche, die nur in ganz speziellen Situationen entstehen, wie Spei +cherzugriff mit gleichzeitig anlaufendem Floppymotor und Zeichenausgabe. Generell +gilt hier (wie für jeden Test), daß das Nichtvorhandensein von Fehlern nie Vollkommen +sicher nachgewiesen werden kann.  +  +Der Speichertest teilt den Speicher in drei verschiedene Bereiche auf:  +  +                0  :  adresse MOD 3 = 0  +                1  :  adresse MOD 3 = 1  +                2  :  adresse MOD 3 = 2  +  +Der freie Speicher wird nach folgendem Algorithmus geprüft:  +  +            schreibe  (1, OLOLOLOL) ;   out ("*") ;  +            schreibe  (2, OLOLOLOL) ;   out ("*") ;  +            schreibe  (0, LOLOLOLO) ;   out ("*") ;  +            pruefe    (1, OLOLOLOL) ;   out ("*") ;  +            schreibe  (1, LOLOLOLO) ;   out ("*") ;  +            pruefe    (2, OLOLOLOL) ;   out ("*") ;  +            pruefe    (0, LOLOLOLO) ;   out ("*") ;  +            pruefe    (1, LOLOLOLO) ;   out ("*") ;  +            schreibe  (0, OLOLOLOL) ;   out ("*") ;  +            pruefe    (0, OLOLOLOL) ;   out ("*") ;  +            schreibe  (2, LOLOLOLO) ;   out ("*") ;  +            pruefe    (2, LOLOLOLO) ;   out ("*") .  +  +  +Dabei werden durch 'PROC schreibe (INT CONST bereich, BYTE CONST muster)' alle +Bytes des entsprechenden Bereichs mit dem angegebenen Muster geladen. 'PROC +pruefe (INT CONST bereich, BYTE CONST soll)' überprüft entsprechend alle Bytes des +Bereichs darauf, ob sie das Sollmuster enthalten.  +  +Findet der Speichertest Fehler, können u.a. folgende Ursachen vorliegen:  +  +    -  Ein Speicherchip ist defekt.  +  +    -  Die Versorgungsspannung für den Speicher (meistens +5V) ist zu niedrig, +       d.h. das Netzteil ist nicht richtig eingestellt bzw. defekt. (Das kann insbeson +       dere dann entstehen, wenn ein Rechner so "hochgerüstet" wurde, daß das +       Netzteil nachgeregelt werden müßte.)  +  +    -  Die Kontakte der Speicherkarten sind locker oder oxidiert.  +  +    -  Die Speicheransteuerung ist defekt.  +  +  +  +  +  +#ib##ib(9)#Kanaltest#ie##ie(9)#  +  +  +Beim #ib#Kanaltest#ie# werden fortlaufend auf allen #ib#Terminalkanälen#ie# (außer auf Terminal 1) +die jeweiligen Kanalnummern in der Form "Kanal: n" ausgegeben. Jedes Eingabe +zeichen wird in dezimaler Verschlüssung unter Angabe der Kanalnummer auf dem +Terminal 1 gemeldet.  +  +Mit Hilfe dieses Tests können u.a. Kabel und Geräteeinstellungen überprüft werden. +Mögliche Fehlerursachen:  +  +    -  falsche #ib#Baudrate#ie# eingestellt  +  +       Symptome:  Bei Aus- und Eingabe werden vollkommen unsinnige Zeichen +                  angeliefert.  +       Abhilfe:   Baudrate am Endgerät oder am Rechner richtig einstellen.  +  +    -  falsche #ib#Parität#ie# eingestellt  +  +       Symptome:  Einige Zeichen werden richtig übertragen, andere verfälscht. In +                  einigen Fällen können auch alle Zeichen falsch übertragen wer +                  den.  +       Abhilfe:   Parität am Endgerät oder am Rechner richtig einstellen.  +  +    -  falsches #ib#Kabel#ie# (z.B. Sende- und Empfangsleitungen fälschlich gekreuzt bzw. +                      nicht gekreuzt, Kabel ohne Flußkontrolle an Schnittstelle mit +                      Flußkontrolle, V.24-Kabel an Parallelschnittstelle oder umge +                      kehrt):  +  +       Symptome:  Keine Ausgabe, keine Eingabe oder andauernder Strom von +                  "Schrottzeichen".  +       Abhilfe:   richtiges Kabel nehmen oder Kabel korrigieren.  +  +    -  defektes Kabel (Kabelbruch, defekter Stecker o.ä.)  +  +       Symptome:  beliebig.  +       Testmöglichkeit: Kabel wechseln.  +  +    -  defektes #ib#Endgerät#ie#  +  +       Symptome:  beliebig.  +       Testmöglichkeit: Anderes Gerät mit gleicher Einstellung (Baudrate, Parität +                        usw.) anschließen.  +  +    -  defekte #ib#Schnittstelle#ie# im Rechner  +  +       Symptome:  beliebig  +       Testmöglichkeit: Endgerät mit gleichem Kabel an eine andere Schnittstelle +                        am Rechner anschließen (dazu evtl. die Geräteparameter +                        wie Baudrate anpassen).  +  +  +  +  +  +#ib##ib(9)#Hintergrundtest#ie(9)##ie#  +  +  +Zur Überprüfung des #ib#Hintergrund#ie#es werden drei Tests angeboten:  +  +     (1) #ib#Lesetest#ie#  +     (2) #ib#Lese-/Schreibtest#ie#  +     (3) #ib#Positioniertest#ie#  +  +  +Der #ib##on("i")##on("b")#Lesetest#off("i")##off("b")##ie# prüft, ob alle für EUMEL verfügbaren Blöcke auf der Platte bzw. Floppy +lesbar sind. Dabei wird der Blockinhalt nicht inspiziert. Sowohl behebbare (soft) als +auch harte #ib#Lesefehler#ie# werden gemeldet. Der Bediener kann einen Korrekturversuch +durch Rückschreiben veranlassen. Bei einem #ib#Soft-Error#ie# (Block konnte nach mehreren +Versuchen doch gelesen werden) wird der gelesene Block neu geschrieben. Der Fehler +kann jetzt ohne negative Folgen behoben sein, bei defekter Hardware aber auch zu +Folgefehlern führen.  +Als Korrekturversuch bei harten Fehlern wird ein mit 'FFFD' gefüllter Block geschrie +ben. Wird ein solcher Block später vom EUMEL gelesen und als Code angesehen, führt +das zur Fehlermeldung "#ib#code block unreadable#ie#". Wird FFFD als INT angesehen, liefert +es den Wert -3, bei REAL oder TEXT können keine Vorhersagen gemacht werden.  +  +  +Bei dem #ib##on("i")##on("b")#Schreib-/Lesetest#off("i")##off("b")##ie# wird jeder Block mit mehreren Bitmustern beschrieben und +zur Kontrolle wieder gelesen. Der alte Inhalt wird vor dem Test gesichert und nachher +wieder in den Block geschrieben.  +  +    #on("b")#Achtung: Normalerweise zerstört der Test den EUMEL-Hintergrund nicht. Bei +             defekter Platte können allerdings Blöcke durch mißlungenes Rück +             schreiben zerstört werden. #off("b")#  +  +  +Der #ib##on("i")##on("b")#Positioniertest#off("i")##off("b")##ie# arbeitet ähnlich wie die Leseprüfung. Allerdings wird in der Reihen +folge 0, 1, 0, 2, 0, 3, ... gelesen, so daß die Platte für jeden Lesevorgang positionieren +muß.  +  +    #on("b")#Achtung: Wegen der harten Plattenbelastung sollte dieser Test nicht zu lange +             laufen.#off("b")#  +  +  +  +  +  +#ib##ib(9)#Archivtest#ie##ie(9)#  +  +  +Der Archivtest arbeitet ähnlich wie der Hintergrundtest - allerdings auf dem Archiv. Er +kann sowohl zur Überprüfung von Archiv-Datenträgern (#ib#Lesetest#ie#) als auch zum Test +des #ib#Archivlaufwerks#ie# benutzt werden.  +  +  +  +  +  +#ib(9)#2.3. #ib#Serielle Geräteschnittstelle#ie##ie(9)#  +  +  +#ib##ib(9)#Pinbelegung und Kabel#ie(9)##ie#  +  +  +#on("b")##on("i")#Anmerkung: Dieses Kapitel ist nur für solche Anwender von Bedeutung, die sich selbst +           mit der Verkabelung ihrer Geräte befassen.#off("i")##off("b")#  +  +Im folgenden werden die wichtigsten Leitungen der offiziellen #ib#V.24-Schnittstelle#ie# (#ib#seriel +le Schnittstelle#ie# zum Anschluß von Terminals, Druckern, Fremdrechnern u.ä.) beschrie +ben:  +  +     Pin   Betriebsrichtung     Bedeutung  +  +      2         out             Sendedaten  +      3         in              Empfangsdaten  +  +      4         out             Sendeaufforderung (RTS)  +      5         in              Empfangsbereitschaft (CTS)  +  +      7                         Signalerde  +  +      8         in              Gegenstation bereit (DCD)  +  +     20         out             eigene Station bereit (DTR)  +  +  +Dabei dient das Paar (2,3) zur Übertragung der Daten, mit Hilfe von (4,5) ist #ib#Flußkon +trolle#ie# möglich (z.B. kann ein Drucker damit Sendungen vom Rechner "verlangsamen"). +Das Paar (8,20) wird bei manchen Geräten und Rechnern benutzt, um festzustellen, ob +die Gegenstation eingeschaltet ist.  +  +  +Die meisten Rechner haben die gleiche #ib#Pinbelegung#ie# wie oben aufgeführt. Die Kabel +müssen dann die folgenden #ib#Pin#ie#s verbinden:  +  +  +Rechner  2 3  4 5  7  8 20   Vollständige Verbindung mit Flußkontrolle.  +  +Gerät    2 3  4 5  7  8 20  +  +  +Rechner  2 3  4 5  7          Reicht für die meisten Anschlüsse mit Flußkontrol +                              le, z.B. Rechnerkopplung.  +Gerät    2 3  4 5  7  +  +  +Rechner  2 3    5  7          Reicht für die meisten Drucker, Flußkontrolle nur +                              einseitig vom Drucker zum Rechner.  +Gerät    2 3  4    7  +  +  +Rechner  2 3       7          Reicht meistens für Terminals, Flußkontrolle ist +                              dabei überflüssig.  +Gerät    2 3       7  +  +  +Rechner  2 3  4 5  7          Manchmal für Terminals. Rechnerseitig wird Fluß +                              kontrolle durch die Brücke 4-5 simuliert.  +Gerät    2 3       7  +  +  +Bei manchen Rechnern werden die notwendigen paarweisen Vertauschungen schon +im Rechner durchgeführt. Es ergibt sich entsprechend:  +  +  +Rechner  2 3  4 5  7  8 20   Vollständige Verbindung mit Flußkontrolle.  +  +Gerät    2 3  4 5  7  8 20  +  +  +Rechner  2 3  4 5  7          Einfacher Anschluß mit Flußkontrolle.  +  +Gerät    2 3  4 5  7  +  +  +Rechner  2 3  4    7          Drucker, einseitige Flußkontrolle.  +  +Gerät    2 3  4    7  +  +  +Rechner  2 3       7          Terminal.  +  +Gerät    2 3       7  +  +  +Rechner  2 3  4 5  7          Terminal mit simulierter Flußkontrolle.  +  +Gerät    2 3       7  +  +  +  +  +  +  +  +#ib(9)#2.4. #ib#Kanäle#ie# und #ib#Konfigurierung#ie##ie(9)#  +  +  +  +Im EUMEL-System dienen #ib#Kanäle#ie# zur Kommunikation mit der Außenwelt, d.h. Kanäle +sind Verbindungen vom Rechner zu peripheren Geräten wie Terminals, Drucker, Plotter +und Archiv. Kanäle können für zeichen- und #ib#blockorientierte Ein-/Ausgabe#ie# verwendet +werden. Ein Kanal heißt #ub##ib#privilegiert#ie(1,"er Kanal")##ue#, wenn er nur von privilegierten Systemtasks (Nach +kommen des Supervisors) benutzt werden kann.  +  +#ib#Kanalaufteilung#ie#:  +  +          Kanal        Bedeutung  +  +          1            zeichenorientiert, blockorientiert  +                       Dieser Kanal muß mit einem Terminal verbunden sein, da +                       über ihn der Systemstart erfolgt.  +          2-16         zeichenorientiert, blockorientiert  +                       Diese Kanäle werden für weitere Terminals, Drucker, Plot +                       ter, Rechnerkopplung usw. verwandt.  +  +          15-23        blockorientiert  +  +          24-30        blockorientiert, privilegiert  +  +          31           blockorientiert, privilegiert  +                       Dieser Kanal ist der #ib#Standardkanal des Archivsystems#ie#, d.h. +                       üblicherweise wird darüber die Archivfloppy angesprochen.  +  +          32           blockorientiert, privilegiert  +                       Dieses ist ein #ib#interner Kanal#ie#, an den kein externes Gerät +                       angeschlossen werden kann. Er wird zur Konfigurierung +                       der anderen Kanäle benutzt.  +  +Der Supervisor des EUMEL-Systems verwaltet die Kanäle. Jeder Task ist dabei kein +oder genau ein Kanal zugeordnet. Entsprechend ist jedem Kanal keine oder genau +eine Task zugeordnet. Solche Zuordnungen können von außen durch den Benutzer +(nur bei interaktiven Kanälen) über die SV-Kommandos bzw. Prozeduraufrufe 'conti +nue' und 'break' (s. Kap. 5) verändert werden. In jedem Fall überprüft der Supervisor +die Zugriffsberechtigung.  +  +  +  +  +  +#ib##ib(9)#Zeichenorientierte Ein-/Ausgabe#ie##ie(9)#  +  +  +Zeichenorientierte Ein-/Ausgabe kann auf den Kanälen 1 bis 16 benutzt werden. Dafür +stehen die Basisoperationen  +  +     PROC #ib#out#ie# (TEXT CONST text)  +     PROC #ib#outsubtext#ie# (TEXT CONST source,  +                      INT CNST from)  +     PROC outsubtext (TEXT CONST source,  +                      INT CONST from, to)9  +     PROC #ib#cursor#ie# (INT CONST x, y)  +     PROC #ib#inchar#ie# (TEXT VAR char)  +     TEXT PROC #ib#incharety#ie#  +     TEXT PROC incharety (INT CONST time limit)  +     PROC #ib#get cursor#ie# (INT VAR x, y)  +  +und alle darauf aufbauenden Operationen (wie 'put', 'get', 'putline', 'getline' usw.) zur +Verfügung. Diese Kanäle sind 'konfigurierbar' (s.u.) und erlauben den Anruf des +Systems durch den Benutzer von außen (SV-Taste). In der Regel werden die Kanäle 1 +bis 16 für Terminals, Drucker, Plotter und andere zeichenorientierte Anschlüsse be +nutzt.  +Wenn ein Kanal zum Anschluß eines Terminals verwendet wird, müssen die #ib#Standard- +Steuerzeichen#ie# des EUMEL-Systems (s. Benutzerhandbuch Programmierung, Kap. 3 +"Der Editor", "5.2.4. Der EUMEL-Zeichensatz") auf jedem Terminal die gleiche Semantik +haben. Das heißt beispielsweise, daß der Code ""2"" auf jedem Terminal bei Ausgabe +den Cursor um eine Stelle nach rechts verschiebt. Da Datenendgeräte in dieser Hin +sicht aber faktisch keiner Norm gehorchen, müssen die EUMEL-Codes in der Regel in +#ib#terminalspezifische Codes#ie# umgesetzt werden. Diese Umsetzregeln kann man bei der +Konfigurierung (s.u.) festlegen. Für die meisten Terminaltypen werden allerdings +fertige Konfigurationssätze mit dem EUMEL-System zusammen ausgeliefert, die man +bei der Einrichtung des Systems (s. Kap. 1 Installationsanleitung) interaktiv anwählen +kann.  +  +  +  +  +#ib##ib(9)#Blockorientierte Ein-/Ausgabe#ie##ie(9)#  +  +  +Blockorientiere Ein-/Ausgabe kann auf den Kanälen 1 bis 32 benutzt werden. Dafür +stehen die Operationen  +  +     PROC #ib#control#ie# (INT CONST code1, code2, code3,  +                   INT VAR return code)  +     PROC #ib#blockout#ie# (DATASPACE CONST ds,  +                   INT CONST page nr, code1, code2, INT VAR return code)  +     PROC #ib#blockout#ie# (ROW 256 INT CONST block,  +                   INT CONST code1, code2, INT VAR return code)  +     PROC #ib#blockin#ie# (DATASPACE VAR ds,  +                   INT CONST page nr, code1, code2, INT VAR return code)  +     PROC #ib#blockin#ie# (ROW 256 INT VAR block,  +                   INT CONST code1, code2, INT VAR return code)  +  +zur Verfügung. Näheres findet man in Kap. 4.5 dieses Systemhandbuchs.  +  +  +  +  +  +#ib##ib(9)#Konfigurierung von Kanal 1 bis 15#ie(9)##ie#  +  +  +  +Alle #ib#zeichenorientierten Kanäle#ie# können (mittels Block I/O auf Kanal 32) konfiguriert +werden. Dabei werden im wesentlichen #ib#Umsetzregeln#ie# für Ein- und Ausgabe definiert, +die den Zweck haben,  +  +    -  bei der Ausgabe den EUMEL Zeichensatz auf den Zeichensatz des ange +       schlossenen Geräts abzubilden und  +  +    -  bei der Eingabe die gerätespezifischen Zeichen auf den EUMEL Zeichensatz +       abzubilden.  +  +So ist eine geräteunabhängige Programmierung möglich.  +  +Mit Hilfe der Prozedur '#ib#link#ie#' kann man einen der Kanäle 1 bis 16 auf einen bestimm +ten Typ setzen. Immer vorhanden sind die Typen:  +  +"#ib#transparent#ie#":  Keine Codeumsetzungen (für Drucker usw.) und  +"#ib#psi#ie#"        :  Keine Codeumsetzungen, jedoch folgende Sonderfunktionen:  +#free(1.0)#  +                  Code     Funktion  +                7   (CTLg)   SV  +                17  (CTLq)   Stop  +                23  (CTLw)   Weiter  +  +Weitere Typen müssen in Form eines DATASPACE, die nach den Gerätetypen benannt +sind, in der Task vorliegen, in der das Kommando 'link' gegeben wird.  +  +Neue Terminaltypen können mit den Prozeduren 'new type', 'enter outcode', 'enter +incode' usw. definiert werden. Im einzelnen stehen folgende Prozeduren zur Verfü +gung:  +  +  +#ib#link#ie#  +     PROC link (INT CONST channel, TEXT CONST type)  +     Zweck: Der angegebene Kanal (1 bis 16) wird auf den angegebenen Typ konfi +            guriert.  +            Hinweis: Die Prozedur 'link' hat die angegebene Wirkung nur, wenn +                     die Task an Kanal 32 hängt, der nur für Söhne des +                     SUPERVISOR zugänglich ist ('continue (32)').  +  +#ib#y size#ie#  +     PROC y size (INT CONST channel, new size, INT VAR old size)  +     Zweck: Einstellmöglichkeiten für verschiedene Bildschirmgrößen. Diese Proze +            dur wirkt nur auf Kanal 32. 'channel' gibt dabei den zu konfigurierenden +            Kanal an.  +  +#ib#new type#ie#  +     PROC new type (TEXT CONST typ)  +     Zweck: Eröffnet einen neuen Kanaltyp mit dem Namen 'typ'. Die folgenden +            Aufrufe von 'enter outcode', 'enter incode' usw. beziehen sich dann auf +            diesen Typ.  +  +#ib#enter outcode#ie#  +     PROC enter outcode (INT CONST eumelcode, zielcode)  +     Zweck: Legt fest, daß der Code 'eumelcode' bei Ausgabe auf dem Terminaltyp +            in 'zielcode' gewandelt werden soll.  +  +     PROC enter outcode (INT CONST eumelcode, TEXT CONST zeichen)  +     Zweck: Wirkt wie 'enter outcode (eumelcode, code (zeichen))'.  +  +     PROC enter outcode (INT CONST eumelcode, zeit, TEXT CONST seq)  +     Zweck: Hiermit wird festgelegt, daß der Code 'eumelcode' als Mehrzeichenfolge +            'seq' ausgegeben werden soll. Jedesmal, wenn diese Folge ausgegeben +            wurde, verzögert das System die Ausgabe des nächsten Zeichens um +            mindestens 'zeit' Millisekunden. Dies wird z.B. von den meisten Termi +            nals gefordert, wenn sie die Funktion 'Löschen Bildschirm' ausführen +            sollen.  +  +#ib#enter incode#ie#  +     PROC enter incode (INT CONST eumelcode, TEXT CONST seq)  +     Zweck: Es wird festgelegt, daß eine Eingabezeichenfolge 'seq' an das System +            als ein (!) Zeichen mit dem Code 'eumelcode' weitergegeben werden +            soll. Die ganze Sequenz muß dabei innerhalb von ca. 40 Millisekunden +            eintreffen, andernfalls werden die Zeichen einzeln gemeldet. Diese +            Logik ist erforderlich, um auch Terminals anzuschließen, die z.B. Cursor +            tasten als ESC-Sequenzen melden. Ohne die Zeitüberwachung würde +            das Betätigen der ESC-Taste sonst die Eingabe blockieren, bis die Folge +            'seq' vollständig ist.  +            Folgende Eumelcodes sind für die Sondertasten (SV usw.) anzugeben:  +  +                     17   :  STOP  +                     23   :  WEITER  +                     7    :  SV  +  +            Weitere Codes ('HOP',...) sind im Benutzerhandbuch Programmierung +            (5 - 29, Der EUMEL-Zeichensatz) angegeben.  +  +            #on("i")#Hinweis: Liefert die SV-Taste eines Terminals von sich aus schon Code +                     7, so ist dennoch 'enter incode (7, ""7"")' anzugeben. Entspre +                     chendes gilt für die zwei anderen "Ereignistasten" STOP und +                     WEITER. Bei allen anderen Tasten brauchen jedoch nur echte +                     Umcodierungen vermerkt zu werden.#off("i")#  +  +  +#ib#cursor logic#ie#  +     PROC cursor logic (INT CONST offset, modus, TEXT CONST pre, mid, post)  +     Zweck: Es wird festgelegt, daß der EUMEL-Code 6 (Cursorposition) mit den +            folgenden beiden Zeichen, deren Codes y und x seien,  +  +            bei modus = 255 als  +                pre + code (offset+y) + mid + code (offset+x) + post  +            und bei modus = 1 als  +                pre + text (offset+y) + mid + text (offset+x) + post  +  +            ausgegeben wird.  +            Hinweis: 'offset' ist üblicherweise 32 (manchmal 0) und  +                      mid = post = "".  +  +#ib#cursor logic#ie#  +     PROC cursor logic (INT CONST dist, TEXT CONST pre, mid, post)  +     Zweck: Diese Prozedur wird von den Konfigurationsdateien alter Versionen +            benutzt.  +  +#ib#ansi cursor#ie#  +     PROC ansi cursor (TEXT CONST pre, mid, post)  +     Zweck: Diese Prozedur ist anstelle von 'cursor logic' zu verwenden, wenn die +            Cursor-Positionierungen bei dem Terminal so erfolgt, wie im Ansi- +            Standard definiert wird.  +  +#ib#elbit cursor#ie#  +     PROC elbit cursor  +     Zweck: Diese Prozedur ist bei Elbit-Terminals anstelle von 'cursor logic' zu +            verwenden.  +  +  +  +  +  +  +#ib##ib(9)#Konfigurations-Manager#ie##ie(9)#  +  +  +Wenn das System gestartet wird, weiß der Urlader noch nicht, welche #ib#Terminaltypen#ie# +an welchen Kanälen hängen. (Der Vortest kann deshalb auch nicht bildschirmorien +tiert arbeiten).  +  +Falls eine Task 'configurator' im System ist, schickt der SUPERVISOR dieser eine Start +sendung zu. Diese Task kann daraufhin die nötigen Konfigurierkommandos ('link',...) +ausführen.  +  +Ansonsten ist 'configurator' ein normaler Fontmanager, der die Fonttabellen verwaltet +(siehe Kap. 7). Deshalb sollte im System immer eine Task 'configurator' existieren und +nach Möglichkeit immer im 'wait' stehen. Man kann ihn also auch mit 'continue' an ein +Terminal holen und dann wie üblich Kommandos geben.  +  +#ib#configurate#ie#  +     PROC configurate  +     Zweck: Führt den Konfigurationsdialog und anschließendes 'setup' durch.  +  +#ib#setup#ie#  +     PROC setup  +     Zweck: Alle Kanäle werden gemäß der im letzten Konfigurationsdialog bestimm +            ten Werte konfiguriert (wird automatisch bei jedem Systemstart durch +            geführt).  +  +#ib#configuration manager#ie#  +     PROC configuration manager  +     Zweck: Durch Aufruf dieser Prozedur wird die Task zu einem Konfigurations +            manager. Man kann also die Task "configurator" löschen, neu als +            Systemtask einrichten und mit diesem Kommando wieder etablieren.  +     BEACHTE:  - Die Task muß 'configurator' heißen.  +               - Alle Terminalanpassungen gehen beim Löschen verloren, d.h. +                 man sollte sie vorher sichern!  +  +  +#on("i")#Hinweis:  Es passieren, daß eine Task schon Ausgaben macht, bevor der Kanal +          konfiguriert ist (z.B. wenn ein 'shutup' bei aktiver Netz-Kommunikation +          durchgeführt wurde).#off("i")#  + diff --git a/doc/system-manual/1.8.7/doc/systemhandbuch.2 b/doc/system-manual/1.8.7/doc/systemhandbuch.2 new file mode 100644 index 0000000..c4772f0 --- /dev/null +++ b/doc/system-manual/1.8.7/doc/systemhandbuch.2 @@ -0,0 +1,1351 @@ +#start(2.5,1.5)#  +#pageblock#  +#block#  +#page (35)#  +#headeven#  +  +%#center#EUMEL-Systemhandbuch  +  +  +#end#  +#headodd#  +  +#center#3. ELAN-Programme#right#%  +  +  +#end#  +  +  +#ib(9)#3. #ib#ELAN-Programme#ie##ie(9)#  +  +  +  +  +#ib(9)#3.1. #ib#Wertebereich#ie#e und #ib#Speicherbedarf#ie##ie(9)#  +  +  +#ib#INT-Objekte#ie#  +  +  +Jedes #ib#Datenobjekt#ie# vom Typ INT belegt im Speicher 2 Bytes. Mögliche INT-Werte sind +die ganzen Zahlen von -32768 bis +32767 einschließlich.  +  +  +  +  +#ib#REAL-Objekte#ie#  +  +  +Jedes Datenobjekt vom Typ REAL belegt im Speicher 8 Bytes.  +  +REALs haben eine 13-stellige #ib#Mantisse#ie#, die im Rechner dezimal geführt wird. (Das +heißt, bei Konversionen zwischen interner und TEXT-Darstellung treten keine Run +dungsfehler auf.) Der Wertebereich wird durch folgende Eckwerte abgelegt:  +  +      9.999999999999e+126    größter REAL-Wert  +      0.000000000001         kleinster positiver REAL-Wert mit x + 1.0 > 1.0  +      9.999999999999e-126    kleinster positiver REAL-Wert > 0.0  +     -9.999999999999e-126    größter negativer REAL-Wert  +     -9.999999999999e+126    kleinster REAL-Wert  +  +  +  +  +  +#ib#BOOL-Objekte#ie#  +  +  +Jedes Datenobjekt vom Typ BOOL belegt im Speicher 2 Bytes.  +  +  +  +  +  +#ib#TEXT-Objekte#ie#  +  +  +Jedes Datenobjekt vom Typ TEXT besteht aus einem festen Teil von 16 Bytes und +möglicherweise aus einem flexiblen Teil auf dem #on("i")##on("b")##ib#Heap#ie##off("i")##off("b")#. Im festen Teil werden #ib#Texte bis +zur Länge von 13 Zeichen#ie# untergebracht. Wenn eine TEXT-Variable einen Wert mit +mehr als 13 Zeichen Länge annimmt, werden alle Zeichen auf dem Heap unterge +bracht. Genauer ergibt sich folgendes Bild:  +  +     kurzer Text (LENGTH <= 13):  +  +          Heap-Link    2 Bytes  +          Textlänge    1 Byte  +          Text        13 Bytes  +  +     langer Text (LENGTH > 13):  +  +          Heap-Link    2 Bytes  +          255          1 Byte  +          Länge        2 Bytes  +          ungenutzt   11 Bytes  +  +Wenn eine Variable einmal Platz auf dem Heap bekommen hat, behält sie diesen +vorbeugend auch dann, wenn sie wieder einen kurzen Text als Wert erhält. So muß +wahrscheinlich kein neuer Platz auf dem Heap zugewiesen werden, wenn sie wieder +länger wird. Das gilt allerdings nur bis zur nächsten #ib#Garbage Collection#ie# auf den +TEXT-Heap, denn dabei werden alle Heap-Container minimal gemacht bzw. gelöscht, +wenn sie nicht mehr benötigt werden. Der Platz auf dem Heap wird in Vielfachen von +16 Bytes vergeben. In Fremddatenräumen wird in jedem #ib#Container#ie# neben dem eigent +lichen Text auch die Containerlänge untergebracht.  +  +Beispiele:     TEXT-Länge    Speicherbedarf (Byte)  +  +                   0                 16  +                  13                 16  +                  14                 32  +                  15                 48  +                  30                 48  +                  31                 64  +                  46                 64  +                  47                 80  +                  62                 80  +  +  +Die Heapgröße eines Fremddatenraums berechnet sich als:  +  +      1024 * 1024 - 520 = 1048056 - stat  Bytes  +  +'stat' ist dabei die statistische Größe der Datenstruktur, die dem Datenraum aufgeprägt +wurde. Bei einem BOUND ROW 1000 TEXT ergibt sich also eine Heapgröße von  +  +      1048056 - (1000 * 16) = 1032056  Bytes.  +  +  +  +  +  +  +#ib#ROW- und STRUCT-Objekte#ie#  +  +  +Bei der Berechnung des Speicherbedarfs von #ib#STRUCT#ie#s und #ib#ROW#ie#s muß man beden +ken, daß längere Datenobjekte ausgerichtet werden. Und zwar werden alle Objekte, die +mindestens die Länge eines REAL-Objektes haben, auf durch 8 teilbare Speichera +dressen ausgerichtet. Man bedenke, daß bei ROWs alle Elemente entsprechend ihres +Elementtyps ausgerichtet sind.  +  +Beispiele:                                 Länge (Byte)  +  +   ROW 2 BOOL                                    4  +   ROW 4 INT                                     8  +   ROW 5 INT                                    16  +   ROW 2 STRUCT (INT, BOOL)                      4  +   ROW 100 STRUCT (INT,INT)                    400  +   ROW 100 STRUCT (INT,REAL)                  1600  +   ROW 100 STRUCT (INT,INT,INT,INT,REAL)      1600  +   ROW 100 STRUCT (REAL, REAL)                1600  +   ROW 100 STRUCT (INT,TEXT)                  2400  +   ROW 100 STRUCT (INT,INT,INT,INT,TEXT)      2400  +   ROW 100 STRUCT (INT,TEXT,INT,TEXT)         4800  +   ROW 100 STRUCT (INT,INT,TEXT,TEXT)         4000  +   ROW 100 ROW 3 INT                           600  +   ROW 100 ROW 4 INT                           800  +   ROW 100 ROW 5 INT                          1600  +aber:  +   ROW 500 INT                                1000  +  +#on("i")#Anmerkung: Bei der #ib#Speichervergabe#ie# der einfachen Variablen und Konstanten eines +           Programms spielen Verluste aufgrund von Ausrichtungen in der Regel +           keine Rolle. Der ELAN-Compiler optimiert dabei soweit möglich.#off("i")#  +#page#  +#headeven#  +  +%#center#EUMEL-Systemhandbuch  +  +  +#end#  +#headodd#  +  +#center#4. Standardpakete für Systemprogrammierer#right#%  +  +  +#end#  +  +  +#ib(9)#4. #ib#Standardpakete für  +   Systemprogrammierer#ie(9)##ie#  +  +  +#ib(9)#4.1. #ib#Fehlerbehandlung#ie##ie(9)#  +  +  +Übersicht  +  +  +#on("italics")#  +        Fehler treten auf, wenn ein Programm eine gewünschte Leistung +        nicht erbringen kann. Solche Situationen müssen von System- +        Programmen kontrolliert behandelt werden. Die folgenden Aus +        führungen sind somit nur für diejenigen interessant, die "Sy +        stem"-Programme schreiben wollen.#off("italics")#  +  +#ib#Fehler#ie# treten in Operationen auf, wenn diese eine geforderte Leistung nicht erbringen +können (z.B. das Drucken einer nicht vorhandenen Datei). Da folgende Anweisungen +aber davon ausgehen, daß die gewünschten Leistungen erbracht wurden, ist es nicht +sinnvoll, die Operation weiter auszuführen. Wir sprechen vom #ib#Abbruch einer Operation#ie#, +wenn nach einem Fehler keine Anweisungen mehr ausgeführt werden, sondern die +Operation verlassen wird. Im EUMEL-System kann durch folgende drei Maßnahmen +ein Abbruch verursacht werden:  +  +-  Aufruf der Prozedur '#ib#errorstop#ie#':  +   Die Operation wird mit einer Fehlermeldung abgebrochen, die man dem Aufruf von +   'errorstop' als Parameter beifügt werden kann.  +  +-  Aufruf der Prozedur '#ib#stop#ie#':  +   Die Operation wird abgebrochen. Wirkt wie 'errorstop' mit der Meldung "stop".  +  +-  Umschalten in den Supervisor:  +   Durch Betätigen der Taste SV und Eingabe des Kommandos '#ib#halt#ie#'. Die laufende +   Operation wird abgebrochen. Wirkt wie ein 'errorstop', der von "außen" in das +   Programm induziert wird.  +  +Da alle drei Maßnahmen zum Abbruch führen können und somit eine anormale (vor +zeitige) Beendigung eines Programms bewirken, werden sie im folgenden zusammen +fassend als #ib#Fehler#ie# bezeichnet.  +  +Für solche Fehler bietet das EUMEL-System die Möglichkeit, den Abbruch zu unter +drücken. Dies kann notwendig werden, wenn  +  +a) bestimmte Fehlerfälle vom aufrufenden Programm selbst behandelt werden sollen. +   Beispiel:  +  +   Der EUMEL-Editor wird aufgerufen, um eine Datei zu bearbeiten. Er versucht als +   erstes, die Datei zu assoziieren. Existiert die Datei nicht, wird die Prozedur +   (z.B. 'old'), mit der die Datei angemeldet werden soll, normalerweise mit der Feh +   lermeldung ' "datei" gibt es nicht' abgebrochen. Diesen Fehlerzustand fängt der +   Editor jedoch ab und versucht, eine neue Datei einzurichten (Anmerkung: In Wirk +   lichkeit fragt der Editor natürlich vor der Assoziierung mit 'exists' ab, ob die Datei +   existiert).  +  +b) eine Operation die Kontrolle auf jeden Fall behalten soll.  +  +   Dies ist z.B. beim Monitor notwendig. Gleich welche Fehler vom Monitor gerufene +   Programme produzieren, der Monitor muß in der Lage sein, die weitere Bearbei +   tung zu ermöglichen.  +  +c) eine Operation nicht unterbrechbar sein darf.  +  +   Beispielsweise dürfen Programm(teil)e, die Daten transportieren, nicht unterbro +   chen werden, da sonst ein Verlust dieser Daten eintreten könnte.  +  +  +  +#ib(9)##ib#Fehlerbehandlung#ie# und #ib#Fängerebenen#ie##ie(9)#  +  +  +Der Aufruf einer der Prozeduren  +  +     #ib#errorstop#ie#  +     #ib#stop#ie#  +     #ib#halt#ie#  +  +(wobei letztere vom Supervisor gegeben werden muß) werden zusammenfassend als +#ib#Fehler#ie# bezeichnet. Bei einem Fehler wird ein #ib#Fehlerzustand#ie# gesetzt. Im Fehlerzustand +merkt sich das EUMEL-System, daß ein Fehler vorliegt. Die Prozeduren  +  +    #ib#enable stop#ie#  +    #ib#disable stop#ie#  +  +bestimmen, ob Operationen im Fehlerzustand weiter bearbeitet oder abgebrochen +werden. Beispiel:  +  +  +     INT VAR x;  +     get (x);  +     ...  +     disable stop;  +     x := x * x;  +     ...  +  +  +Hier wird mit 'disable stop' verhindert, daß ein Abbruch beispielsweise durch 'INT- +Ueberlauf' auftreten kann. Die Anweisungen nach 'x * x' werden also weiter bearbei +tet.  +  +Welchen Wert hat aber nun die Variable 'x', nachdem der Fehler auftrat? Offensicht +lich war die den Fehler auslösende Operation '*' nicht in der Lage, den richtigen Wert +zu errechnen. #ib#Abgebrochene Operationen#ie# liefern in der Regel keinen Wert. Dadurch ist +der Wert von 'x' in unserem Beispiel nach einem Fehler bei '*' undefiniert. Es ist nun +ersichtlich, daß mit der Anwendung der 'disable stop'-Prozedur äußerst vorsichtig zu +verfahren ist, weil u.U. Werte verloren gehen können bzw. mit unerwarteten Werten +weitergerechnet wird.  +  +Damit Programmierer erfahren können, ob ein Fehler aufgetreten ist, gibt es die Infor +mations-Prozedur  +  +     #ib#is error#ie#  +  +über den Fehlerzustand. Die Prozedur liefert den Wert TRUE, wenn ein Fehler vorliegt, +andernfalls FALSE. Die Prozedur  +  +     #ib#clear error#ie#  +  +"löscht" den Fehlerzustand, d.h. anschließende Abfragen mit 'is error' liefern FALSE. +(Die "richtige" Reaktion auf den Fehler muß ein Programmierer natürlich selbst be +stimmen).  +  +Beispiel:  +  +  +     INT VAR x;  +     get (x);  +     ...  +     disable stop;  +     x := x * x;  +     IF is error  +       THEN put ("'x'-Wert zu groß");  +            x := 0;  +            clear error  +     FI;  +     ...  +  +  +Leider würden jetzt aber auch alle folgenden Anweisungen bei eventuellen Fehlern +nicht abgebrochen, also auch in Situationen, in denen ein Abbruch erwünscht ist, um +#ib#Programmierfehler#ie# zu erkennen. Deshalb können durch  +  +     #ib#enable stop#ie#  +  +Abbrüche wieder zugelassen werden. Wenn wir jetzt also schreiben:  +  +  +     INT VAR x;  +     get (x);  +     ...  +     disable stop;  +     x := x * x;  +     IF is error  +       THEN put ("'x'-wert zu gross");  +            x := 0;  +            clear error  +     FI;  +     enable stop;  +     ...  +  +  +dann würden - wie gewünscht - eventuelle Fehler in den Anweisungen nach 'enable +stop' zu einem Abbruch führen.  +  +Nicht mit '#ib#clear error#ie#' gelöschte Fehler führen bei '#ib#enable stop#ie#' ebenfalls zu einem +Abbruch. In dem Programmteil  +  +  +     ...  +     disable stop;  +     x := x * x;  +     enable stop;  +     ...  +  +  +würde der eventuell auftretender Fehler 'INT Ueberlauf' nicht abgefangen, sondern nur +verzögert wirksam, weil er nicht mit 'clear error' gelöscht wurde.  +  +Für die Behandlung von Fehlern durch Benutzer gibt es Prozeduren, die eine adäquate +Reaktion auf den Fehler erlauben. Mit  +  +     #ib#error message#ie#  +  +können Sie auf die erste Fehlermeldung (eines 'error stop') nach dem letzen 'clear +error' zugreifen (d.h. Folgefehler verändern nicht die Originalmeldung). Die Prozedur  +  +     #ib#error code#ie#  +  +liefert den #ib#Fehlercode#ie#, der bei der Prozedur 'errorstop' zusätzlich zum #ib#Fehlertext#ie# +angegeben werden kann.  +  +     #ib#error line#ie#  +  +liefert die Zeilennummer des zuletzt aufgetretenen Fehlers. Mit  +  +     #ib#put error#ie#  +  +kann eine noch anstehende Fehlermeldung ausgegeben werden. Beispiel:  +  +  +     INT VAR x;  +     get (x);  +     ...  +     disable stop;  +     x := x * x;  +     IF is error  +       THEN IF error message = "INT-Ueberlauf"  +              THEN put ("'x'-wert zu gross");  +              ELSE put error  +            FI;  +            clear error  +     FI;  +     enable stop;  +     ...  +  +  +Tritt ein Fehler auf, so wird die den Fehler auslösende Operation entweder abgebro +chen oder "normal" weiter bearbeitet, je nachdem, ob 'enable stop' oder 'disable stop' +gesetzt ist. Auf jeden Fall wird der #ib#Fehlerzustand#ie# an die aufrufende Operation weiter +gemeldet, die wiederum abgebrochen oder weiterbearbeitet werden kann usw. Die +#ib#Weitermeldung#ie# eines Fehlers kann auch über mehrere Stufen erfolgen, solange bis der +Fehler gelöscht wird. Andererseits gilt 'enable/ disable stop' nicht nur für die aktuelle +Operation, sondern auch für gerufene Operationen ("Vererbung"). Die gerufenen Ope +rationen können allerdings 'enable/disable stop' neu festlegen. Beispiel:  +  +  +        PROC a:             PROC b:          PROC c:  +        ...                 ...              ROW 10 INT VAR x;  +        disable stop;       enable stop;     ...  +        b;                  ...              INT VAR i :: 4711;  +        IF is error         c;               x [i] := ...;  +          THEN ...          ...              ...  +               clear error  END PROC b       END PROC c  +        FI;  +        enable stop  +        END PROC a;  +  +  +In der Prozedur 'a' wird die Prozedur 'b' aufgerufen. Diese ruft wiederum eine Prozedur +'c' auf. Für die Prozedur 'c' gilt nun der Zustand 'enable stop' der Prozedur 'b' (#ib#Verer +bung von 'enable stop'#ie#). Tritt jetzt in 'c' der Subskriptions-Fehler auf, wird 'c' abgebro +chen. Die Wirkung der fehlerauslösenden Operation ist nicht definiert.  +  +Da aber auch die Prozedur 'b' im 'enable stop' Zustand ist, wird auch die Prozedur 'b' +abgebrochen. Der Fehler bleibt jedoch erhalten, wird also weitergemeldet. Dies wirkt +sich so aus, daß die Anweisung 'c' nicht ausgeführt wird. Da die Prozedur 'a' 'disable +stop' gesetzt hat, werden die auf den Aufruf von 'b' folgenden Anweisungen durchlau +fen und somit durch 'clear error' der Fehler gelöscht. In diesem Beispiel "fängt" die +Prozedur 'a' Fehler auf, die in den Prozeduren 'b' und 'c' entstehen können.  +  +Ein solcher #ib#Fänger#ie# wird durch zwei Prozeduren konstruiert. Der eigentliche Fänger +(hier: Prozedur 'a') ruft eine ausführende Prozedur (hier: 'b') im 'disable stop'-Zustand +auf. Die gerufene Prozedur setzt sofort 'enable stop' und führt dann die eigentlichen +Aktionen aus. So wird die gerufene Prozedur abgebrochen (kann also im Fehlerfall +nicht zuviel Schaden anrichten). Der Abbruch führt bis zur Fängerprozedur ('a') hinter +den Aufruf der gerufenen Prozedur ('b'). Nach Löschung eventuell auftretender Fehler +ist somit sichergestellt, daß der Fänger immer weiterarbeiten kann.  +  +  +  +#ib(9)#Wichtiger Hinweis#ie(9)#  +  +  +  +     1. #on("italics")##on("bold")#Da im 'disable stop'-Zustand kein Fehler zum Abbruch führt, kann +        eine Operation in diesem Zustand auch nicht durch 'halt' abge +        brochen werden. Einerseits ist das für manche Systemteile wün +        schenswert, andererseits können Operationen, die auf Grund von +        Programmierfehlern nicht terminieren (Endlosschleifen), nicht +        unter Kontrolle gebracht werden. Also Vorsicht! (Letztes Mittel: +        Task löschen)#off("italics")##off("bold")#  +  +     2. #on("i")##on("b")#Es ist nicht (!) garantiert, daß im Fehlerzustand aufgerufene +        Prozeduren ihre normale Wirkung haben. Garantiert ist dies je +        doch für alle Prozeduren und Operatoren, die in diesem Kapi +        tel aufgeführt werden.#off("i")##off("b")#  +  +#on("italics")##on("bold")#Merke:  Fehler sind im EUMEL-System Aufrufe der Prozeduren 'errorstop', +        'stop' oder das Betätigen der SV Taste und dem Supervisor- +        Kommando 'halt'. Ein Fehler gilt solange, bis er mit Hilfe der +        Prozedur 'clear error' gelöscht wurde. Die Prozeduren 'enable/ +        disable stop' steuern die Abarbeitung der Operationen im Fehler +        fall. Gilt für eine Operation 'enable stop', wird die Operation +        abgebrochen, d.h. die restlichen Anweisungen der Operation +        nach der Fehler auslösenden Anweisung werden nicht durchlau +        fen. Ist 'disable stop' gesetzt, werden die restlichen Operationen +        weiterhin abgearbeitet. 'enable/disable stop' gilt für alle - auch +        indirekt - aufgerufenen Operationen ("Vererbung"), es sei denn, in +        den gerufenen Operationen wird ein erneutes 'enable/disable +        stop' gesetzt. Über die Aufrufkette werden ggf. auch die Fehler +        zurück gemeldet.#off("italics")##off("bold")#  +  +  +        #on("italics")##on("bold")#Eine Fänger-Ebene ist eine Prozedur, die 'disable stop' setzt und +        dann andere Operationen aufruft. Nach jedem dieser Aufrufe +        kann eine Fehlerbehandlung mit 'clear error' durchgeführt wer +        den. Damit ist gewährleistet, daß Fehler immer von der Fänger- +        Ebene "aufgefangen" und entsprechend behandelt werden.#off("italics")##off("bold")#  +  +  +  +#ib(9)##ib#Prozeduren zur Fehlerbehandlung#ie##ie(9)#  +  +  +#ib#clear error#ie#  +     PROC clear error  +     Zweck: Löscht den Fehlerzustand. 'is error' liefert anschließend wieder FALSE. +            'error message', 'error code' und 'error line' werden nicht gelöscht.  +  +#ib#disable stop#ie#  +     PROC disable stop  +     Zweck: Unterbindet den Abbruch in aufgerufenen Operationen. 'disable stop' +            gilt für die Prozedur, in der sie aufgerufen wird und in allen folgenden +            gerufenen Prozeduren, es sei denn, sie wird durch 'enable stop' außer +            Kraft gesetzt. Wird die Operation verlassen, in der 'disable stop' aufge +            rufen wurde, wird der "alte" Zustand wiederhergestellt, der vor dem +            Aufruf der Operation galt. 'disable stop' kann weiterhin in einer aufge +            rufenen Operation durch den Aufruf von 'enable stop' in dieser und den +            folgenden Operationen außer Kraft gesetzt werden.  +  +#ib#enable stop#ie#  +     PROC enable stop  +     Zweck: Setzt die Wirkung eines Aufrufs von 'disable stop' zurück. Fehler ('error +            stop', 'stop' oder 'halt') in der aktuellen Operation oder den folgenden +            aufgerufenen Operationen führen zum Abbruch. Bisher nicht gelöschte +            Fehler (siehe 'clear error') führen sofort zum Abbruch.  +  +#ib#error code#ie##--goalpage ("fehlercodes")#  +     INT PROC error code  +     Zweck: Liefert den durch 'errorstop' gesetzten #ib#Fehlercode#ie#. Beispiel:  +  +               PROC test:  +                 enable stop;  +                 error stop (110, "Dies ist mein Abbruch!");  +               END PROC test;  +  +               ...  +               disable stop;  +               test;  +               put (error code);   (* liefert 110 *)  +               clear error;  +               enable stop  +  +  +#ib#error line#ie#  +     INT PROC error line  +     Zweck: Liefert die Zeilennummmer des Fehlers (Voraussetzung : Die Überset +            zung erfolgt im 'checkon-Modus).  +  +#ib#error message#ie#  +     TEXT PROC error message  +     Zweck: Liefert die Fehlermeldung als Text. Anhand dieser Meldung kann ent +            schieden werden, welcher Fehler vorliegt.  +     Hinweis: Eine Fehlermeldung "" (also: 'error stop ("")') führt zum Fehlerabbruch +            mit der Bedeutung "Fehlermeldung wurde bereits ausgegeben". Dem +            entsprechend erfolgt bei der Fehlermeldung 'niltext' keine Reaktion bei +            'put error'.  +  +#ib#errorstop#ie#  +     PROC error stop (TEXT CONST message)  +     Zweck: Bricht ab und setzt die Zeilennummer (wenn man sich im 'checkon'- +            Modus befindet), in der der Fehler aufgetreten ist, sowie den Text 'mes +            sage'. Der Abbruch kann mit 'disable stop' unterbunden werden. 'error +            stop' hat keine Wirkung, wenn ein noch nicht gelöschter Fehler vorliegt. +            Zu einer Fehlermeldung "" siehe auch die Prozedur 'error message'. Als +            'error-code' wird 0 gesetzt.  +  +  +     PROC error stop (INT CONST code, TEXT CONST message)  +     Zweck: Analog obiger 'errorstop'-Prozedur, aber mit Angabe des Fehlercodes, +            der durch die Prozedur 'error code' in einer Fängerebene erfragt wer +            den kann.  +  +#ib#is error#ie#  +     BOOL PROC is error  +     Zweck: Informationsprozedur auf das Vorhandensein eines Fehlers.  +  +#ib#put error#ie#  +     PROC put error  +     Zweck: Gibt die durch 'errorstop' gesetzte Fehlermeldung aus, falls ein Fehler +            noch nicht gelöscht ist (siehe auch: 'error message').  +  +  +  +  +#ib##ib(9)#Fehlercode#ie#s#ie(9)#  +  +  +Einige Fehlercodes sind bereits belegt:  +  +               0       kein Fehlercode spezifiziert (Standardwert)  +               1       'halt' vom Terminal  +               2       Stack-Ueberlauf  +               3       Heap-Ueberlauf  +               4       INT-Ueberlauf  +               5       DIV durch 0  +               6       REAL-Ueberlauf  +               7       TEXT-Ueberlauf  +               8       zu viele DATASPACEs  +               9       Ueberlauf bei Subskription  +               10      Unterlauf bei Subskription  +               11      falscher DATASPACE-Zugriff  +               12      INT nicht initialisiert  +               13      REAL nicht initialisiert  +               14      TEXT nicht initialisiert  +               15      nicht implementiert  +               16      Block unlesbar  +               17      Codefehler  +               100     Syntax-Fehler beim Übersetzen  +  +  +  +  +  +#ib(9)#4.2. #ib#THESAURUS#ie##ie(9)#  +  +  +  +Ein #ib#Thesaurus#ie# ist ein #ib#Namensverzeichnis#ie#, das bis zu 200 Namen beinhalten kann. +Dabei muß jeder Namen mindestens ein Zeichen und darf höchstens 100 Zeichen lang +sein. Steuerzeichen (code < 32) sind in Namen nicht erlaubt.  +  +Ein Thesaurus ordnet jedem eingetragenen Namen einen Index zwischen 1 und 200 +(einschließlich) zu. Diese Indizes bieten dem Anwender die Möglichkeit, Thesauri zur +Verwaltung benannter Objekte zu verwenden. (Der Zugriff erfolgt dann über den Index +eines Namens in einem Thesaurus). So werden Thesauri u.a. von der Dateiverwaltung +benutzt. Sie bilden die Grundlage der ALL- und SOME-Operatoren.  +  +  +  +  +#ib(9)#Grundoperationen#ie(9)#  +  +  +#ib#CONTAINS#ie#  +     BOOL OP CONTAINS (THESAURUS CONST t, TEXT CONST name)  +     Zweck: Liefert genau dann TRUE, wenn 't' den Namen 'name' enthält. Falls +            'name=""' oder 'LENGTH name > 100', wird FALSE geliefert.  +  +#ib#delete#ie#  +     PROC delete (THESAURUS VAR t, TEXT CONST name, INT VAR index)  +     Zweck: Falls der Name 'name' im Thesaurus 't' enthalten ist, wird er dort ge +            löscht. In 'index' wird dann sein alter Index geliefert, unter dem er im +            Thesaurus eingetragen war. Ist der Name nicht im Thesaurus enthalten, +            wird 0 als Index geliefert.  +  +     PROC delete (THESAURUS VAR t, INT CONST index)  +     Zweck: Der Eintrag mit dem angegebenen Index wird aus dem Thesaurus 't' +            gelöscht.  +  +#ib#empty thesaurus#ie#  +     THESAURUS PROC empty thesaurus  +     Zweck: Für Initialisierungszwecke wird ein leerer Thesaurus geliefert.  +  +#ib#get#ie#  +     PROC get (THESAURUS CONST t, TEXT VAR name, INT VAR index)  +     Zweck: Liefert den "nächsten" Eintrag aus dem Thesaurus 't'. "Nächster" heißt +            hier, der kleinste vorhandene mit einem Index größer als 'index'. Dabei +            wird in 'name' der Name und in 'index' der Index des Eintrags geliefert. +            D.h. 'index' wird automatisch weitergeschaltet. Den ersten Eintrag erhält +            man entsprechend durch Aufruf mit 'index=0'. Nach dem letzten Ein +            trag wird 'name=""' und 'index=0' geliefert. Beispiel:  +  +  +                         TEXT VAR name;  +                         INT VAR index := 0 ;  +                         get (thesaurus, name, index) ;  +                         WHILE index > 0 REP  +                           putline (name) ;  +                           get (thesaurus, name, index)  +                         PER  +  +  +#ib#highest entry#ie#  +     INT PROC highest entry (THESAURUS CONST t)  +     Zweck: Liefert den höchsten belegten Index des Thesaurus 't'.  +            Achtung: Das ist nicht die Anzahl der vorhandenen Namen, da durch +                     Löschungen Lücken entstanden sein können.  +  +#ib#insert#ie#  +     PROC insert (THESAURUS VAR t, TEXT CONST name, INT VAR index)  +     Zweck: Der Name 'name' wird als zusätzlicher Eintrag in den Thesaurus 't' +            eingetragen und der dafür vergebene Index geliefert. Falls der Thesau +            rus schon voll ist und der Name nicht mehr eingetragen werden kann, +            wird 0 als Index geliefert.  +            Achtung: Mehrfacheintragungen sind möglich. Wenn man diese verhin +                     dern will, muß man entsprechend vermittels  +  +  +                         IF NOT t CONTAINS name  +                           THEN insert (t, name, index)  +                         FI  +  +  +                     eintragen.  +     Fehlerfall:  +           * Name unzulaessig  +  +     PROC insert (THESAURUS VAR t, TEXT CONST name)  +     Zweck: s.o. Allerdings wird der Index des Namens nicht geliefert. Ein Thesau +            rusüberlauf wird entsprechend als 'errorstop' gemeldet.  +     Fehlerfälle:  +          * Name unzulaessig  +          * THESAURUS-Ueberlauf  +  +#ib#link#ie#  +     INT PROC link (THESAURUS CONST t, TEXT CONST name)  +     Zweck: Liefert den Index des Namens 'name' im Thesaurus 't'. Falls der Name +            nicht enthalten ist, wird 0 geliefert. Ist der Name mehrfach im Thesau +            rus enthalten, ist nicht definiert, welcher der möglichen Indizes geliefert +            wird.  +  +#ib#name#ie#  +     TEXT PROC name (THESAURUS CONST t, INT CONST index)  +     Zweck: Liefert den Namen des Eintrags mit dem Index 'index' aus dem The +            saurus 't'. Falls kein solcher Eintrag im Thesaurus enthalten ist, wird +            Niltext geliefert.  +  +#ib#rename#ie#  +     PROC rename (THESAURUS VAR t, TEXT CONST old, new)  +     Zweck: Ändert im Thesaurus 't' einen Eintrag mit dem alten Namen 'old' in 'new' +            um. Falls 'old' nicht im Thesaurus enthalten ist, wird keine Leistung +            erbracht. Falls 'old' mehrfach in 't' enthalten ist, ist nicht definiert, wel +            cher der möglichen Einträge geändert wird.  +     Fehlerfall:  +            * Name unzulaessig  +  +     PROC rename (THESAURUS VAR t, INT CONST index, TEXT CONST new)  +     Zweck: Ändert im Thesaurus 't' den Namen des durch 'index' identifizierten +            Eintrags in 'new'.  +     Fehlerfall:  +            * Name unzulaessig  +  +#ib#THESAURUS#ie#  +     TYPE THESAURUS  +     Zweck: Bezeichnet Thesaurus-Datenobjekte  +  +:=  +     OP := (THESAURUS VAR dest, THESAURUS CONST source)  +     Zweck: Zuweisung  +  +  +  +  +  +  +#ib(9)#Verknüpfungsoperationen#ie(9)#  +  +Das Paket '#ib#nameset#ie#' bietet die Möglichkeit, Operationen nicht nur auf einzelnen Datei +en, sondern auf (geordneten) Mengen ablaufen zu lassen:  +  +#ib#ALL#ie#  +     THESAURUS OP ALL (TASK CONST task)  +     Zweck: Liefert einen Thesaurus, der alle Dateinamen der angegebenen Task +            enthält.  +  +     THESAURUS OP ALL (TEXT CONST file name)  +     Zweck: Liefert einen Thesaurus, der die in der angegebenen Datei vorhande +            nen Namen (jede Zeile ein Name) enthält.  +  +#ib#all#ie#  +     THESAURUS PROC all  +     Zweck: Liefert einen Thesaurus, der alle Dateinamen der eigenen Task enthält. +            Entspricht 'ALL myself'.  +  +#ib#LIKE#ie#  +     THESAURUS OP LIKE (THESAURUS CONST thesaurus, TEXT CONST muster)  +     Zweck: Alle im Thesaurus enthaltenen Dateien, die dem 'muster' entsprechen +            sind im Ergebnisthesaurus enthalten.  +            (Die Syntax von 'muster' findet man bei der Beschreibung des Pattern- +            Matching)  +  +#ib#SOME#ie#  +     THESAURUS OP SOME (THESAURUS CONST thesaurus)  +     Zweck: Bietet den angegebenen Thesaurus im EUMEL-Editor zum Ändern an. +            Es können nicht erwünschte Namen gestrichen werden.  +  +     THESAURUS OP SOME (TASK CONST task)  +     Zweck: Aufruf von: SOME ALL task.  +  +     THESAURUS OP SOME (TEXT CONST file name)  +     Zweck: Aufruf von: SOME ALL filename.  +  +#ib#FILLBY#ie#  +     OP FILLBY (THESAURUS VAR thesaurus, FILE VAR file)  +     Zweck: Schreibt 'file' in den Thesaurus. Dabei werden Zeilen, die schon im +            Thesaurus sind, nicht mehr in den Thesaurus geschrieben. Jede Zeile +            kommt im Thesaurus also nur einmal vor.  +  +     OP FILLBY (FILE VAR file, THESAURUS CONST thesaurus)  +     Zweck: Schreibt den Thesaurus in die Datei 'file'.  +  +     OP FILLBY (TEXT CONST filename,  +                          THESAURUS CONST thesaurus)  +     Zweck: Richtet eine Datei mit dem Namen 'filename' ein und schreibt den The +            saurus in die Datei.  +  ++  +     THESAURUS OP + (THESAURUS CONST left, right)  +     Zweck: Liefert die Vereinigungsmenge von 'left' und 'right'.  +            Achtung: Die Vereinigungsmenge enthält keine Namen mehrfach.  +  +     THESAURUS OP + (THESAURUS CONST left, TEXT CONST right)  +     Zweck: Fügt dem Thesaurus 'right' zu, wenn 'right' noch nicht im Thesaurus +            enthalten ist.  +  +-  +     THESAURUS OP - (THESAURUS CONST left, right)  +     Zweck: Liefert die Differenzmenge. Achtung: Die Differenzmenge enthält keine +            Namen mehrfach.  +  +     THESAURUS OP - (THESAURUS CONST left, TEXT CONST right)  +     Zweck: Nimmt den Namen 'right' aus dem Thesaurus.  +  +/  +     THESAURUS OP / (THESAURUS CONST left, right)  +     Zweck: Liefert die Schnittmenge  +            Achtung: Die Schnittmenge enthält keine Namen mehrfach.  +  +#ib#do#ie#  +     PROC do (PROC (TEXT CONST) operate, THESAURUS CONST thesaurus)  +     Zweck: Ruft 'operate' nacheinander mit allen im Thesaurus enthaltenen Namen +            auf.  +  +     PROC do (PROC (TEXT CONST, TASK CONST) operate,  +              THESAURUS CONST thesaurus, TASK CONST task)  +     Zweck: s.o.  +  +#ib#erase#ie#  +     PROC erase (THESAURUS CONST thesaurus)  +     Zweck: Löscht alle aufgeführten Dateien in der Vater-Task.  +  +     PROC erase (THESAURUS CONST thesaurus, TASK CONST manager)  +     Zweck: Löscht alle aufgeführten Dateien in der Task 'manager'.  +  +#ib#fetch#ie#  +     PROC fetch (THESAURUS CONST thesaurus)  +     Zweck: Holt alle aufgeführten Dateien vom Vater.  +  +     PROC fetch (THESAURUS CONST thesaurus, TASK CONST manager)  +     Zweck: Holt alle aufgeführten Dateien vom 'manager'.  +  +#ib#fetch all#ie#  +     PROC fetch all (TASK CONST manager)  +     Zweck: Holt alle Dateien vom 'manager'. Diese Prozedur entspricht dem Aufruf +            der Prozedur 'fetch (ALL manager, manager)'.  +  +     PROC fetch all  +     Zweck: Aufruf der Prozedur 'fetch all (father)'.  +  +#ib#forget#ie#  +     PROC forget (THESAURUS CONST thesaurus)  +     Zweck: Löscht alle aufgeführten Dateien in der Benutzer-Task.  +  +#ib#insert#ie#  +     PROC insert (THESAURUS CONST thesaurus)  +     Zweck: Insertiert alle aufgeführten Dateien in der Benutzer-Task.  +  +#ib#remainder#ie#  +     PROC remainder  +     Zweck: Liefert nach einem 'errorstop' die noch nicht bearbeiteten Dateien.  +            Beispiel:  +              'save all (archive)'  +                 kann dazu führen, daß nicht alle Dateien auf das Archiv geschrie +                 ben werden können. Fehlermeldung:  +              '"....." kann nicht geschrieben werden (Archiv voll)'  +                 Nachdem man eine neue Floppy ins Archivlaufwerk gelegt hat, +                 kann man mit  +              'save (remainder, archive)'  +                 den Rest der Dateien auf der Floppy sichern.  +  +#ib#save#ie#  +     PROC save (THESAURUS CONST thesaurus)  +     Zweck: Schickt alle aufgeführten Dateien zur Vater-Task.  +  +     PROC save (THESAURUS CONST thesaurus, TASK CONST manager)  +     Zweck: s.o.  +  +#ib#save all#ie#  +     PROC save all (TASK CONST manager)  +     Zweck: Schickt alle eigenen Dateien zum 'manager'. Diese Prozedur entspricht +            dem Aufruf der Prozedur 'save (ALL myself, manager)'.  +  +     PROC save all  +     Zweck: Aufruf der Prozedur 'save all (father)'.  +  +  +Beispiele:  +  +                    save (ALL myself)  +                    forget (ALL myself)  +                    forget (all)  +                    fetch (SOME father)  +                    fetch (ALL father - ALL myself)  +                    insert (ALL "gen datei")  +                    save (ALL myself - ALL archive, archive)  +  +  +  +  +#ib(9)#4.3. #ib#Kommandos und Dialog#ie(9)##ie#  +  +  +  +#ib##ib(9)#Kommandodialog#ie##ie(9)#  +  +  +Das Paket "#ib#command dialogue#ie#" dient zur zentralen Steuerung und einfachen Durch +führung von #ib#Kommando-Dialog#ie#en wie  +  +     "datei" loeschen (j/n)?  +  +Er wird von allen Systemteilen verwandt, die einen Kommandodialog mit dem Benut +zer aufnehmen. Anwenderprozeduren mit ähnlichen Problemen sollten genauso damit +arbeiten.  +  +Der Kommandodialog kann zentral aus- und eingeschaltet werden.  +  +  +  +#ib#command dialogue#ie#  +     BOOL PROC command dialogue  +     Zweck: Liefert den aktuellen Zustand des Kommandodialogs:  +            TRUE   -  Dialog soll geführt werden!  +            FALSE  -  Dialog soll nicht geführt werden!  +  +     PROC command dialogue (BOOL CONST status)  +     Zweck: Schaltet den Kommandodialog ein ('status' = TRUE) oder aus ('status' +            = FALSE). Der alte Zustand wird überschrieben. Soll später wieder in +            den alten Zustand zurückgeschaltet werden, muß er vorher erfragt und +            gesichert werden.  +  +#ib#yes#ie#  +     BOOL PROC yes (TEXT CONST question)  +     Zweck: a) Kommandodialog soll geführt werden (command dialogue = TRUE)  +               Der übergebene Fragetext wird durch " (j/n)?" ergänzt auf dem Ter +               minal ausgegeben. Als Antwort wird eine der Tasten <j>, <J>, +               <y>, <Y>, <n>, <N> akzeptiert; jede andere Eingabe führt zu +               einem akustischen Signal und der Fragewiederholung. Das Resultat +               der Prozedur ist  +                      TRUE  bei  bejahender Antwort (j,J,y,Y)  +                      FALSE bei  verneinender Antwort (n,N)  +            b) Kommandodialog soll nicht geführt werden (command dialogue = +               FALSE)  +               Keine Aktion, das Resultat ist TRUE.  +  +#ib#no#ie#  +     BOOL PROC no (TEXT CONST question)  +     Zweck: a) Kommandodialog soll geführt werden (command dialogue = TRUE)  +               Frage und Antwort wie bei 'yes'. Das Resultat ist  +                      TRUE  bei  verneinender Antwort (n,N)  +                      FALSE bei  bejahender Antwort (j,J,y,Y)  +            b) Kommandodialog soll nicht geführt werden (command dialogue = +               FALSE)  +               Keine Aktion, das Resultat ist FALSE.  +  +#ib#say#ie#  +     PROC say (TEXT CONST message)  +     Zweck: IF command dialogue THEN out (text) FI  +  +#ib#last param#ie#  +     TEXT PROC last param  +     Zweck: Liefert den zuletzt gesetzten Parameter-Text (siehe folgende Proze +            dur). Falls 'command dialogue' = TRUE und die 'param position' > 0 +            ist, wird der Parametertext als Standardparameter an der angegebenen +            x-Position eine Zeile höher in der Form ("...") ausgegeben. Diese Proze +            dur wird von den parameterlosen Kommandos bzw. Prozeduren wie +            'edit', 'run' usw. verwandt, um mit dem Standardparameter weiterzuar +            beiten.  +  +     PROC last param (TEXT CONST new)  +     Zweck: Setzt 'last param' auf 'new'. (Das Setzen muß explizit durchgeführt +            werden und geschieht nicht implizit durch den 'command handler'. 'Last +            param' wird beispielsweise von den einparametrigen Prozeduren 'edit' +            und 'run' gesetzt.  +  +#ib#param position#ie#  +     PROC param position (INT CONST x)  +     Zweck: Setzt die Echoposition für 'last param'. Bei x=0 wird ein Echo unter +            drückt.  +  +#ib#std#ie#  +     TEXT PROC std  +     Zweck: Liefert wie 'last param' den zuletzt gesetzten Parameter. Im Gegensatz +            dazu wird der Parameter aber nicht ausgegeben.  +  +  +  +  +  +#ib##ib(9)#Kommandoverarbeitung#ie##ie(9)#  +  +  +Das Paket '#ib#command handler#ie#' stellt Prozeduren zur #ib#Kommandoanalyse#ie# und zum +Führen des kompletten Kommandodialogs zur Verfügung.  +  +  +#ib#get command#ie#  +     PROC get command (TEXT CONST dialogue text, TEXT VAR command line)  +     Zweck: Falls eine Fehlermeldung aussteht, ('is error' liefert TRUE), wird sie über +            'put error' ausgegeben und der Fehlerzustand zurückgesetzt. Der 'dialo +            gue text' wird als Dialogaufforderung ausgegeben und der Benutzer +            kann eine Kommandozeile eingeben. Die letzte Kommandozeile wird +            ihm dabei automatisch (zum Ändern) angeboten, wenn vorher eine +            Fehlermeldung anstand. Der Benutzer kann dies ebenfalls erreichen, +            wenn er zu Beginn <ESC k> gibt. Die Kommandozeile wird dem Auf +            rufer in der Variablen 'command line' geliefert.  +  +     PROC get command (TEXT CONST dialogue text)  +     Zweck: s.o. Allerdings wird eine interne Kommandozeile des Pakets 'command +            handler' als 'command line' verwandt. Dadurch wird es möglich, alle +            Spuren einer Kommandoeingabe durch 'cover tracks' zu beseitigen.  +  +#ib#analyze command#ie#  +     PROC analyze command (TEXT CONST command list, command line,  +                           INT CONST permitted type,  +                           INT VAR command index, number of params,  +                           TEXT VAR param 1, param 2)  +     Zweck: Die übergebene Kommandozeile ('command line') wird anhand der +            übergebenen 'command list' analysiert. Sie ist ein TEXT, der aus einer +            Folge von Kommandospezifikationen besteht. Jede hat die Form  +                          K:I.P  +  +                  K    Kommandotext, Prozedurname nach ELAN-Syntax  +                  I    Hauptindex, Form eines INT-Denoters  +                  P    Parameterspezifikation, eine Folge der Ziffern 0, 1 und 2.  +  +             Beispiele:  +               -  'edit:15.012'  +                  Das Kommando 'edit' wird in drei verschieden parametrisierten +                  Formen spezifiziert:  +                     edit mit 0 Parameter   erhält Index 15  +                     edit mit 1 Parameter   erhält Index 16  +                     edit mit 2 Parametern  erhält Index 17  +  +               -  'fetch:18.1'  +                  Das Kommando 'fetch' wird in einer Form spezifiert:  +                     fetch mit 1 Parameter  erhält Index 18  +  +            Die Analyse erfolgt gemäß ELAN-Syntaxregeln. Dabei sind als Para +            meter Denoter vom Typ TEXT und vom übergebenen ' permitted type' +            zugelassen. Diese Typen werden wie beim Scanner (s. Benutzerhand +            buch Programmierung Kap. 5.6) angegeben:  +  +                1    tag  +                2    bold  +                3    number  +                4    text  +                5    operator  +                6    delimiter  +  +            Falls das Kommando in der Kommandoliste gefunden wird (und die +            Syntax in Ordnung ist), wird der entsprechende 'command index' zu +            rückgemeldet. Die Parameter werden (falls vorhanden) in 'param 1' und +            'param 2' abgelegt. Undefinierte oder nicht vorhandene Parameter +            werden als Niltext geliefert. Wenn ein  Kommando vorhanden ist, die +            Anzahl der Parameter aber nicht stimmt, wird der negative Hauptindex +            geliefert. Ist es vollkommen unbekannt oder ist die Eingabe zu komplex +            (mehrere Kommandos, Ausdrücke oder komplexere ELAN-Statements), +            wird 0 geliefert. Der Anwender kann in solchen Fällen die Analyse mit +            einer anderen Kommandoliste fortsetzen, das Kommando dem ELAN- +            Compiler übergeben oder eine Fehlermeldung auslösen (s. 'command +            error').  +  +     PROC analyze command (TEXT CONST command list,  +                           INT CONST permitted type,  +                           INT VAR command index, number of params,  +                           TEXT VAR param 1, param 2)  +     Zweck: s.o. Allerdings wird die interne Kommandozeile des Pakets 'command +            handler' als 'command line' verwandt.  +  +#ib#command error#ie#  +     PROC command error  +     Zweck: Falls bei der Kommandoanalyse ein Fehler gefunden wurde, führt er +            nicht zum 'errorstop', sondern wird nur hinterlegt. (Soll das Kommando +            dem Compiler übergeben werden, liegt ja evt. überhaupt kein Fehler +            vor.) Diese hinterlegte Meldung kann mit 'command error' als 'errorstop' +            gegeben werden. Mögliche Meldungen:  +                    "ungueltiger name"  +                    ") fehlt"  +                    "( fehlt"  +                    "Parameter ist kein TEXT ("fehlt)"  +                    "Kommando zu schwierig"  +  +#ib#cover tracks#ie#  +     PROC cover tracks  +     Zweck: Die Spuren der letzten Kommandoanalyse werden gelöscht. Das dient +            u.a. dazu, daß später eingerichtete Sohntasks keine Relikte des Kom +            mandos mehr auf dem Textheap vorfinden und evtl. mittels nicht initiali +            sierter TEXT VARs herausfinden können. Vollständig können die Spuren +            aber nur dann gelöscht werden, wenn für die Kommandoanalyse die +            'get command'- und 'analyze command'-Prozeduren benutzt wurden, +            die auf der internen Kommandozeile des Pakets 'command handler' +            arbeiten.  +  +#ib#do command#ie#  +     PROC do command  +     Zweck: Die interne Kommandozeile des Pakets 'command handler' wird dem +            ELAN-Compiler zur Ausführung übergeben.  +  +  +  +  +  +#ib(9)#Beispiele zur Kommandoverarbeitung#ie(9)#  +  +  +#ib##ub#Kleiner Monitor#ue##ie#  +  +  +LET command list = "otto:1.12emil:3.012hugo:6.0" ;  +  +LET   number = 3 ,  +      text   = 4 ;  +  +INT VAR command index, params ;  +TEXT VAR param 1, param 2 ;  +  +PROC monitor :  +  +     disable stop ;  +     command dialogue (TRUE) ;  +     REP  get command ("gib kleines kommando:") ;  +          analyze command (command list, text,  +                           command index, params,  +                           param 1, param 2) ;  +          execute command  +     PER  +  +ENDPROC monitor ;  +  +PROC execute command :  +  +     enable stop ;  +     SELECT command index OF  +          CASE 1 : otto (param 1)  +          CASE 2 : otto (param 1, param 2)  +          CASE 3 : emil  +          CASE 4 : emil (param 1)  +          CASE 5 : emil (param 1, param 2)  +          CASE 6 : hugo  +       OTHERWISE do command line  +     END SELECT  +  +ENDPROC execute command ;  +  +  +  +#ib(9)##ub#Steuerkommando-Analyse#ue##ie(9)#  +  +  +PROC command (TEXT CONST command text) :  +  +     disable stop ;  +     command dialoge (FALSE) ;  +     analyze command (command list, command text, number,  +                      command index, params, param 1, param 2) ;  +     execute command ;  +     IF is error  +       THEN put error ;  +            clear error  +     FI  +  +ENDPROC command ;  +  +PROC execute command :  +  +     enable stop ;  +     SELECT command index OF  +          CASE ....  +        OTHERWISE    IF command index = 0  +                        THEN errorstop ("unbekanntes Kommando") ELSE command error  +                     FI  +     END SELECT  +  +ENDPROC execute command ;  +  +  +  +  +  +#ib(9)#4.4. Verschiedenes#ie(9)#  +  +  +#ib(9)##ib#SESSION#ie(9)##ie#  +  +  +Mit Hilfe von 'session' kann man feststellen, ob das System neu gestartet wurde. Dabei +spielt es keine Rolle, ob es korrekt ('shutup') abgeschaltet wurde, oder ob es sich um +einen "RERUN" handelt.  +  +#ib#session#ie#  +     INT PROC session  +     Zweck: Liefert eine "Sitzungsnummer". Diese wird automatisch bei jedem +            Systemstart erhöht.  +  +Beispiel:  +  +  +     REP  +       INT VAR old session := session ;  +       WHILE session = old session REP pause (100) PER ;  +       putline ("Neuer Systemstart")  +     PER.  +  +  +  +  +#ib(9)##ib#INITFLAG#ie##ie(9)#  +  +  +Im Multi-User-System ist es oft notwendig, Pakete beim Einrichten einer neuen Task in +dieser neu zu initialisieren. Das muß z.B. bei der Dateiverwaltung gemacht werden, da +die neue Task ja nicht die Dateien des Vaters erbt. Mit Hilfe von INITFLAG-Objekten +kann man zu diesem Zweck feststellen, ob ein Paket #on("b")##on("i")#in dieser Task#off("b")##off("i")# schon initialisiert +wurde.  +  +  +#ib#INITFLAG#ie#  +     TYPE INITFLAG  +     Zweck: Erlaubt die Deklaration entsprechender Flaggen.  +  +:=  +     OP := (INITFLAG VAR flag, BOOL CONST flagtrue)  +     Zweck: Erlaubt die Initialisierung von INITFLAGs  +  +#ib#initialized#ie#  +     BOOL PROC initialized (INITFLAG VAR flag)  +     Zweck: Wenn die Flagge in der Task A auf TRUE oder FALSE gesetzt wurde, +            dann liefert sie beim ersten Aufruf den entsprechenden Wert, danach +            immer TRUE (in der Task A!).  +            Beim Einrichten von Söhnen wird die Flagge in den Sohntasks automa +            tisch auf FALSE gesetzt. So wird erreicht, daß diese Prozedur in den neu +            eingerichteten Söhnen und Enkeltasks genau beim ersten Aufruf FALSE +            liefert.  +  +  +Beispiel:  +  +          PACKET stack DEFINES push, pop:  +  +          INITFLAG VAR in this task := FALSE ;  +          INT VAR stack pointer ;  +          ROW 1000 INT VAR stack ;  +  +          PROC push (INT CONST value) :  +  +            initialize stack if necessary ;  +            ....  +  +          ENDPROC push ;  +  +          PROC pop (INT VAR value) :  +  +            initialize stack if necessary ;  +            ....  +  +          ENDPROC pop ;.  +  +          initialize stack if necessary :  +            IF NOT initialized (in this task)  +              THEN stack pointer := 1  +            FI .  +  +          ENDPACKET stack  +  +  +  +  +  +#ib(9)##ib#Bit-Handling#ie##ie(9)#  +  +  +Die #ib#Bit-Operationen#ie# arbeiten auf INT-Objekten. Sie können z.B. für die Systempro +grammierung benutzt werden, wenn es um Bitmasken u.ä. geht.  +  +Ein INT besteht aus 16 Bits. Dabei hat das niederwertigste die Nummer 0, das höch +stwertige die Nummer 15.  +  +  +#ib#AND#ie#  +     INT OP AND (INT CONST left, right)  +     Zweck: Bitweise UND-Verknüpfung von 'left' mit 'right'.  +  +#ib#OR#ie#  +     INT OP OR (INT CONST left, right)  +     Zweck: Bitweise ODER-Verknüpfung von 'left' mit 'right'.  +  +#ib#XOR#ie#  +     INT OP XOR (INT CONST left, right)  +     Zweck: Bitweise EXCLUSIV-ODER-Verknüpfung von 'left' mit 'right'.  +  +#ib#bit#ie#  +     BOOL PROC bit (INT CONST bits, bit no)  +     Zweck: Liefert TRUE genau dann, wenn das Bit mit der Nummer 'bit no' in dem +            INT 'bits' gesetzt ist.  +  +#ib#set bit#ie#  +     PROC set bit (INT VAR bits, INT CONST bit no)  +     Zweck: Das Bit mit der Nummer 'bit no' wird in 'bits' auf 1 gesetzt.  +  +#ib#reset bit#ie#  +     PROC reset bit (INT VAR bits, INT CONST bit no)  +     Zweck: Das Bit mit der Nummer 'bit no' wird in 'bits' auf 0 gesetzt.  +  +#ib#rotate#ie#  +     PROC rotate (INT VAR bits, INT CONST number of bits)  +     Zweck: Bits können mit dieser Prozedur zyklisch geschiftet werden.  +            Bsp.: rotate (1,1)      ---> 2  +                  rotate (1,2)      ---> 4  +                  rotate (1,-3)     ---> 16384  +                  rotate (16384,3)  ---> 1  +  +#ib#lowest set#ie#  +     INT PROC lowest set (INT CONST bits)  +     Zweck: Liefert die Nummer des niederwertigsten 1-Bits in 'bits'. Ist kein Bit auf 1 +            gesetzt, wird -1 geliefert.  +  +#ib#lowest reset#ie#  +     INT PROC lowest reset (INT CONST bits)  +     Zweck: Liefert die Nummer des niederwertigsten 0-Bits in 'bits'. Ist kein Bit auf 0 +            gesetzt, wird -1 geliefert.  +  +  +  +  +  +#ib(9)#4.5. #ib#Blockorientierte Ein-/Ausgabe#ie##ie(9)#  +  +  +  +Die blockorientierte Ein-/Ausgabe dient dazu, Datenraumseiten (#ib#Blöcke#ie#) oder Teile +davon über die #ib#Kanäle#ie# zu transferieren. Sie wird vom System u.a. beim Archivzugriff +und bei der Konfigurierung der Kanäle eingesetzt.  +  +Die Wirkung der blockorientierten Ein-/Ausgabeoperationen kann dabei kanal- und +rechnerspezifisch unterschiedlich sein.  +Auf dem Archivkanal (31) und allen anderen Block-IO-Kanälen werden bei  +'code 1 = 0' die normalen Blocklese- bzw. -schreiboperationen durchgeführt. 'code 2' +gibt dabei die Blocknummer an. Andere (positive) Werte von 'code 1' sind zur Zeit +nicht offiziell definiert. Negative Werte können vom SHard für Spezialaufgaben verge +ben werden.  +  +  +  +#ib#blockin#ie#  +     PROC blockin (DATASPACE VAR ds, INT CONST page nr, code1, code2,  +                   INT VAR return code)  +     Zweck: Die Seite 'page nr' des Datenraums 'ds' wird "eingelesen". Die Opera +            tion kann durch 'code1' und 'code2' näher gesteuert werden.  +  +     PROC blockin (ROW 256 INT VAR block, INT CONST code1, code2,  +                   INT VAR return code)  +     Zweck: Wie oben, nur wird der Block direkt als Datenstruktur übergeben.  +  +#ib#blockout#ie#  +     PROC blockout (DATASPACE CONST ds, INT CONST page nr,  +                    code1, code2, INT VAR return code)  +     Zweck: Die Seite 'page nr' des Datenraums 'ds' wird "ausgegeben". Die Opera +            tion kann durch 'code1' und 'code2' näher gesteuert werden.  +  +     PROC blockout (ROW 256 INT CONST block, INT CONST code1, code2,  +                    INT VAR return code)  +     Zweck: Wie oben, nur wird der Block als Datenstruktur übergeben.  +  +#ib#control#ie#  +     PROC control (INT CONST code1, code2, code3, INT VAR return code)  +     Zweck: Diese Prozedur dient zur Kanalsteuerung.  +  +#ib#ds pages#ie#  +     INT PROC ds pages (DATASPACE CONST ds)  +     Zweck: Liefert die Anzahl der belegten Seiten eines Datenraums. (Jede Seite ist +            512 Byte groß.)  +  +#ib#next ds page#ie#  +     INT PROC next ds page (DATASPACE CONST ds, INT CONST page nr)  +     Zweck: Liefert die Nummer der nächsten (von 'page nr' an gerechneten) Seite +            des Datenraums. Die erste belegte Seite erhält man durch  +  +                     next ds page (ds, -1)  +  +            #on ("b")#Achtung: Die Seitennummern müssen nicht lückenlos sein.#off ("b")#  + diff --git a/doc/system-manual/1.8.7/doc/systemhandbuch.3 b/doc/system-manual/1.8.7/doc/systemhandbuch.3 new file mode 100644 index 0000000..3c0a482 --- /dev/null +++ b/doc/system-manual/1.8.7/doc/systemhandbuch.3 @@ -0,0 +1,1366 @@ +#start(2.5,1.5)#  +#pageblock#  +#block#  +#page (63)#  +#headeven#  +  +%#center#EUMEL-Systemhandbuch  +  +  +#end#  +#headodd#  +  +#center#5. Supervisor, Tasks und Systemsteuerung#right#%  +  +  +#end#  +  +#ib(9)#5. #ib#Supervisor#ie#, #ib#Tasks#ie# und  +   #ib#Systemsteuerung#ie##ie(9)#  +  +  +  +#ib(9)#5.1. #ib#Tasks#ie##ie(9)#  +  +  +  +#ib(9)#Der Datentyp #ib#TASK#ie##ie(9)#  +  +  +Benannte Tasks werden innerhalb eines Rechners vollständig und eindeutig über ihren +Namen identifiziert. Eine weitere Möglichkeit der Identifikation besteht in der Verwen +dung von Datenobjekten vom Typ TASK. Beispiel:  +  +        TASK VAR plotter := task ("PLOTTER 1")  +  +Die Taskvariable 'plotter' bezeichnet jetzt die Task im System, die augenblicklich den +Namen "PLOTTER 1" hat. Nun sind #ib#Taskvariablen#ie# auch unter Berücksichtigung der Zeit +und nicht nur im aktuellen Systemzustand eindeutig. Der Programmierer braucht sich +also keine Sorgen darüber zu machen, daß seine Taskvariable irgendwann einmal eine +"falsche" Task (nach Löschen von "PLOTTER 1" neu eingerichtete gleichen oder ande +ren Namens) identifiziert. Wenn die Task "PLOTTER 1" gelöscht worden ist, bezeichnet +'plotter' keine gültige Task mehr.  +  +#ib#Unbenannte Tasks#ie# haben alle den Pseudonamen "-". Sie können nur über Taskvari +ablen angesprochen werden.  +  +Der #ib#Task-Katalog#ie# wird vom Supervisor geführt; andere Tasks können sich Kopien +dieses Katalogs besorgen. Einige Prozeduren arbeiten auf dieser taskeigenen Kopie, +ohne diese automatisch auf den neuesten Stand zu bringen (Effizienzgründe). Das +muß bei Bedarf explizit geschehen.  +  +  +#ib#TASK#ie#  +     TYPE TASK  +     Zweck: Interner Taskbezeichner  +  +:=  +     OP := (TASK VAR dest, TASK CONST source)  +     Zweck: Zuweisung von internen Taskbezeichnern  +  +=  +     BOOL OP = (TASK CONST left, right)  +     Zweck: Gleichheitsabfrage  +  +<  +     BOOL OP < (TASK CONST left, right)  +     Zweck: Überprüft, ob die Task 'left' ein Sohn, Enkel, Urenkel, ... der Task 'right' +            ist.  +  +/  +     TASK OP / (TEXT CONST task name)  +     Zweck: Liefert die Task des angegebenen Namens, falls sie existiert. Der eigene +            Katalog wird automatisch aktualisiert (identisch mit der +            PROC task (TEXT CONST task name).  +     Fehlerfall:  +          * ... gibt es nicht  +  +     TASK OP / (INT CONST station number, TEXT CONST name)  +     Zweck: Liefert die Task des angegebenen Namen von der Station mit der ange +            gebenen Nummer.  +  +#ib#access#ie#  +     PROC access (TASK CONST task)  +     Zweck: Aktualisiert den eigenen Taskkatalog, falls 'task' nicht darin enthalten ist.  +  +#ib#access catalogue#ie#  +     PROC access catalogue  +     Zweck: Aktualisiert den eigenen Taskkatalog, indem die neueste Fassung vom +            Supervisor geholt wird. Die Prozeduren 'father', 'son', 'brother' arbeiten +            dann auf dieser neuen Fassung.  +  +#ib#archive#ie#  +     TASK PROC archive  +     Zweck: Liefert den internen Taskbezeichner der aktuellen Task mit Namen +            "ARCHIVE". Diese Prozedur dient zum schnellen und bequemen An +            sprechen der Archivtask.  +  +#ib#brother#ie#  +     TASK PROC brother (TASK CONST task)  +     Zweck: Liefert den nächsten Bruder von 'task'. Falls kein Bruder existiert, wird +            'niltask' geliefert. Aktualisiert den eigenen Katalog nicht automatisch!  +  +#ib#canal#ie#  +     TASK PROC canal (INT CONST channel number)  +     Zweck: Diese Prozedur zeigt an, welche Command-Analyser-Task an einem +            bestimmten Kanal hängt.  +  +#ib#exists#ie#  +     BOOL PROC exists (TASK CONST task)  +     Zweck: Falls 'task' auf der eigenen Station liegt, informiert diese Prozedur, ob +            die angegebene 'task' noch existiert. Der eigene Taskkatalog wird dabei +            aktualisiert.  +            Wenn abgefragt werden soll, ob 'task' auf einer anderen Station liegt, +            muß die Prozedur 'name (task) <> "" ' verwendet werden.  +            Achtung: Diese Prozedur taugt nicht dazu, zu erfragen, ob eine Task +                     mit bestimmtem Namen im System exisiert.  +  +                            exists (task ("hugo"))  +  +                     Falls die Task "hugo" nicht existiert, führt schon der Aufruf +                     'task ("hugo")' zum 'errorstop (""hugo" gibt es nicht")'.  +  +#ib#exists task#ie#  +     BOOL PROC exists task (TEXT CONST name)  +     Zweck: Wenn auf der eigenen Station eine Task mit dem Namen 'name' exi +            stiert, liefert diese Prozedur 'TRUE'.  +  +#ib#father#ie#  +     TASK PROC father  +     Zweck: Liefert die eigene Vatertask.  +  +     TASK PROC father (TASK CONST task)  +     Zweck: Liefert den Vater von 'task'. Existiert kein Vater (z.B. bei UR), wird niltask +            geliefert. Aktualisiert den eigenen Katalog nicht automatisch!  +  +#ib#index#ie#  +     INT PROC index (TASK CONST task)  +     Zweck: Liefert einen INT-Wert von 1 bis 125, der 'task' unter allen gleichzeitig (!) +            existierenden Tasks eindeutig identifiziert.  +  +#ib#is niltask#ie#  +     BOOL PROC is niltask (TASK CONST task)  +     Zweck: task = niltask  +  +#ib#myself#ie#  +     TASK PROC myself  +     Zweck: Liefert eigenen Task-Bezeichner.  +  +#ib#name#ie#  +     TEXT PROC name (TASK CONST task)  +     Zweck: Liefert den Namen von 'task'. Die Task muß noch im System existieren, +            sonst ist der Name nicht mehr bekannt. Falls die 'task' noch nicht im +            eigenen Katalog enthalten ist, wird er aktualisiert.  +  +#ib#niltask#ie#  +     TASK CONST niltask  +     Zweck: Bezeichner für "keine Task". So liefern die Prozeduren 'son', 'brother' +            und 'father' als Resultat 'niltask', wenn keine Sohn-, Bruder- oder Vater +            task existiert.  +  +#ib#printer#ie#  +     TASK PROC printer  +     Zweck: Liefert den internen Taskbezeichner der aktuellen Task mit Namen +            #ib#PRINTER#ie#. Diese Prozedur dient zum schnellen und bequemen Anspre +            chen des Druckspoolers.  +  +#ib#public#ie#  +     TASK PROC public  +     Zweck: Liefert den internen Taskbezeichner der Task #ib#PUBLIC#ie#.  +  +#ib#reserve#ie#  +     PROC reserve (TASK CONST task)  +     Zweck: Reservieren einer Task für den ausschließlichen Dialog mit der Task, in +            der das Kommando gegeben wurde.  +     PROC reserve (TEXT CONST message, TASK CONST task)  +     Zweck: Wie 'reserve (TASK CONST task)' mit Übergabe einer 'message'.  +  +#ib#son#ie#  +     TASK PROC son (TASK CONST task)  +     Zweck: Liefert den ersten Sohn von 'task'. Falls keiner im Katalog vermerkt ist, +            wird 'niltask' geliefert. Aktualisiert den eigenen Katalog nicht automa +            tisch!  +  +#ib#supervisor#ie#  +     TASK PROC supervisor  +     Zweck: Liefert den internen Taskbezeichner des Supervisors.  +  +#ib#task#ie#  +     TASK PROC task (TEXT CONST task name)  +     Zweck: Liefert die Task des angegebenen Namens, falls sie existiert. Der eigene +            Katalog wird automatisch aktualisiert.  +     Fehlerfall:  +          * ... gibt es nicht  +  +     TASK PROC task (INT CONST channel number)  +     Zweck: Liefert den Namen der Task, die an dem angegebenen Kanal hängt.  +  +  +  +#ib##ib(9)#Inter-Task-Kommunikation#ie##ie(9)#  +  +  +Die #ib#Task-Kommunikation#ie# im EUMEL System ist strikt botschaftsorientiert. Eine #ib#Bot +schaft#ie# bzw. "#ib#Sendung#ie#" besteht immer aus einem #ib#Sendungscode#ie# (INT) und einem +Datenraum (DATASPACE). Damit kann eine Botschaft bis zu 1 Mbyte umfassen!  +  +Kommunikation zwischen zwei Tasks ist nur dann möglich, wenn #ib#Sender#ie# und #ib#Empfän +ger#ie# dazu bereit sind. Eine Sendung kann also nur dann korrekt transferiert werden, +wenn der Empfänger existiert und empfangsbereit ist. Diese Art der Kommunikation +wurde gewählt, um  +  +    -  eine möglichst einfache und effiziente Implementation zu ermöglichen und  +    -  mit den vorhandenen Primitiva möglichst flexibel bei der Implementation +       "höherer" Kommunikationsmethoden (z.B. Warteschlangen) zu sein.  +  +  +#ib#call#ie#  +     PROC call (TASK CONST destination, INT CONST send code,  +                DATASPACE VAR message ds, INT VAR reply code)  +     Zweck: Die eigene Task wartet, bis die Zieltask 'destination' empfangsbereit ist. +            Dann wird die Sendung ('send code' und 'message ds') transferiert. +            Anschließend wartet die Sendertask auf eine Antwort von 'destination'. +            Für Sendungen anderer Tasks ist sie dabei nicht (!) empfangsbereit, nur +            die Zieltask kann eine Antwortsendung schicken. Nachdem eine solche +            Antwort eingetroffen ist, wird sie in 'message ds' und 'reply code' gelie +            fert und die eigene Task fortgesetzt. Wenn die angesprochene Zieltask +            nicht existiert, wird -1 als 'reply code' geliefert. 'message ds' ist in +            diesem Fall unverändert.  +            'call' hat Ähnlichkeiten mit einem Prozeduraufruf, nur ist es hier der +            Aufruf einer anderen Task. Störungen können hierbei nicht auftreten, da +            der Zustand der Zieltask keine Rolle spielt (es wird auf Empfangsbereit +            schaft gewartet) und beim Warten auf Antwort auch keine "Querschlä +            gersendungen" von anderen Tasks dazwischenfunken können.  +  +#ib#pingpong#ie#  +     PROC pingpong (TASK CONST destination, INT CONST send code,  +                    DATASPACE VAR message ds, INT VAR reply code)  +     Zweck: Diese Prozedur wirkt wie die entsprechende 'call'-Prozedur, wartet aber +            nicht (!), bis die Zieltask empfangsbereit ist. Wenn die Zieltask existiert, +            aber nicht empfangsbereit ist, wird -2 als 'reply code' geliefert. Der +            'message ds' ist dann nicht verändert.  +  +#ib#send#ie#  +     PROC send (TASK VAR destination, INT CONST send code,  +                DATASPACE VAR message ds, INT VAR receipt)  +     Zweck: Wenn die Zieltask existiert und empfangsbereit ist, wird die Sendung +            ('send code' und 'message ds') transferiert und die Zieltask aktiviert. Als +            'receipt' wird 0 (=ack) gemeldet. Diese positive Quittung kommt nicht +            von der Zieltask, sondern bestätigt nur, daß die Sendung ordnungsge +            mäß übertragen wurde. Der Datenraum gehört dann nicht mehr der +            Sender-, sondern der Zieltask, d.h. die Variable 'message ds' bezeichnet +            keinen gültigen Datenraum mehr.  +            Im Gegensatz zu 'call' und 'pingpong' läuft die Sendertask ohne Halt +            weiter und wartet nicht auf eine Antwort von der Zieltask.  +            Falls die Zieltask nicht existiert, wird -1, falls sie nicht empfangsbereit ist, +            -2 als 'receipt' geliefert. Bei diesen negativen Quittungen bleibt der +            Datenraum Eigentum der Absendertask, d.h. die Variable 'message ds' +            bezeichnet immer noch einen gültigen Datenraum.  +  +     PROC send (TASK VAR destination, INT CONST send code,  +                DATASPACE VAR message ds)  +     Zweck: s.o. Negative Quittungen (-1 oder -2) werden jedoch ignoriert. Der Da +            tenraum wird entweder transferiert oder gelöscht ('forget'), steht also in +            keinem Fall mehr zur Verfügung. Die Prozedur sollte nur verwendet +            werden, wenn der Sender sicher ist, daß die Sendung transferiert wer +            den kann, bzw. daß sie im Fehlerfall nicht transferiert zu werden braucht.  +  +#ib#wait#ie#  +     PROC wait (DATASPACE VAR message ds, INT VAR message code,  +                TASK VAR source task)  +     Zweck: Die eigene Task geht in den #ub##ib#offenen Wartezustand#ie##ue# über. Sie ist jetzt +            gegenüber allen anderen Tasks empfangsbereit. Sie wird erst fortge +            setzt, wenn eine Sendung eintrifft. Diese wird in 'message ds' und 'mes +            sage code', die Absendertask in 'source task' geliefert.  +  +Der #ub##ib#Sendungscode#ue##ie# muß zwischen den Beteiligten abgesprochen sein und ist also frei +wählbar. Allerdings sind negative Werte nicht erlaubt, sondern für bestimmte "Pseudo +antworten" vom Betriebssystem reserviert:  +  +      -1      "Zieltask existiert nicht"  +  +      -2      "Zieltask ist nicht empfangsbereit"  +  +      -4      "Eingabe vom Kanal" Diese Meldung kann nur (!) beim offenen War +              ten ('wait') auftreten, und auch dann nur, wenn die Task gleichzeitig +              an einen Kanal angekoppelt ist. Auf diese Weise wird mitgeteilt, daß +              mindestens ein Zeichen vorliegt. Dieses kann im folgenden mit 'in +              char', 'incharety', 'blockin' oder darauf aufbauenden Prozeduren +              gelesen werden.  +  +Weitere Codes werden in Systemroutinen standardmäßig verwandt und sollten auch +von Anwenderroutinen genauso interpretiert werden:  +  +       0      "#ib#ack#ie#"        positive Quittung  +  +       1      "#ib#nak#ie#"        negative Quittung  +  +       2      "#ib#error nak#ie#"  negative Quittung mit Fehlermeldung.  +                           Der gelieferte Datenraum sollte die Struktur eines +                           BOUND TEXTs haben und die Fehlermeldung in +                           diesem TEXT beinhalten.  +  +  +Beispiel:      #ub#Kommunikation mit einem Manager#ue#  +  +  +     Auftraggeber                  Manager  +  +  +     call (....)                   REP  +                                     wait (ds, order, order task) ;  +                                     execute order ;  +                                     send (order task, reply, ds)  +                                   PER  +  +Da der Auftraggeber 'call' verwendet, wartet er automatisch so lange, bis der Manager +für ihn empfangsbereit wird. Dann schickt er die Sendung und geht gleichzeitig (!) in +den geschlossenen "auf Antwort warten" - Zustand über. Der Manager kann daher +unbesorgt mit dem "unsicheren" 'send' antworten, da die Empfangsbereitschaft des +Auftraggebers nur durch Katastrophen wie Löschung der Task oder "halt from terminal" +gestört werden kann. (In diesen Fällen kann die Antwort ruhig ins Leere gehen.)  +  +Hier sieht man auch den Unterschied zwischen  +  +       call (...)      und       send (....); wait (....) .  +  +Bei der zweiten Alternative können drei Störfälle eintreten:  +  +  +     a) Der Manager ist nicht empfangsbereit. 'send' versagt, 'wait' wartet ewig.  +  +     b) Da über die zeitlichen Rahmenbedingungen nichts ausgesagt werden kann, +        ist es möglich, daß der Manager die Antwort schickt, bevor die 'wait'-Opera +        tion beim Auftraggeber ausgeführt werden konnte. In unserem Beispiel +        würde das den Verlust der Rückmeldung und ewiges Warten seitens des +        Auftraggebers auslösen.  +  +     c) Beim 'wait' kann eine Störsendung einer anderen Task eintreffen.  +  +  +  +  +  +  +  +#ib(9)#5.2. #ib#Supervisor#ie##ie(9)#  +  +  +  +#ib(9)##ib#Verbindung zum Supervisor#ie##ie(9)#  +  +  +#ib#begin#ie#  +     PROC begin (PROC start, TASK VAR new task)  +     Zweck: Es wird eine #ib#unbenannte Task#ie# (Pseudoname "-") als neuer Sohn der +            aufrufenden eingerichtet und mit der Prozedur 'start' gestartet. Namens +            kollision ist nicht möglich, die erzeugte Task kann aber auch nicht na +            mensmäßig angesprochen werden. 'new task' identifiziert den neuen +            Sohn, falls kein Fehler auftrat.  +     Fehlerfälle :  +          * zu viele Tasks  +  +     PROC begin (TEXT CONST son name, PROC start, TASK VAR new task)  +     Zweck: Es wird eine Task mit Namen 'son name' als Sohn der aufgerufenen +            eingerichtet und mit der Prozedur 'start' gestartet. 'new task' identifi +            ziert den neuen Sohn, falls kein Fehler auftrat.  +     Fehlerfälle :  +          * zu viele Tasks  +          * Name unzulaessig        (* "" oder LENGTH > 100 *)  +          * ... existiert bereits  +  +#ib#begin password#ie#  +     PROC begin password (TEXT CONST password)  +     Zweck: Bei normalen 'global manager'-Tasks kann man mit dieser Operation +            das weitere Kreieren von Sohntasks unter Paßwortkontrolle stellen. +            Wenn dieses Kommando in der Manager-Task gegeben worden ist, wird +            bei folgenden SV-begin-Kommandos interaktiv das Paßwort verlangt. +            Dabei gelten die üblichen Paßwort-Konventionen:  +  +                 a) "" (Niltext) bedeutet #on("i")#kein Paßwort#off("i")#. Damit kann man durch +                    'begin password ("")' das Paßwort wieder ausschalten.  +                 b) "-" bedeutet #on("i")#jedes eingegebene Paßwort ist ungültig#off("i")#. Damit +                    kann man durch 'begin password ("-")' das Einrichten von +                    Sohntasks von außen (durch SV-Kommando) abschalten.  +  +#ib#break#ie#  +     PROC break  +     Zweck: Die Task koppelt sich von einem evtl. angekoppelten Terminal ab. Bei +            der Abkopplung wird auf dem Terminal die "Tapete" ("Terminal n... +            EUMEL Version ..../M...") ausgegeben.  +  +     PROC break (QUIET CONST quiet)  +     Zweck: Die Task koppelt sich von einem evtl. angekoppelten Terminal ab. Dabei +            wird aber keine "Tapete" ausgegeben.  +  +#ib#channel#ie#  +     INT PROC channel  +     Zweck: Liefert die #ib#Kanalnummer#ie# der eigenen Task. Falls kein Kanal (Terminal) +            zugeordnet ist, wird 0 geliefert.  +  +     INT PROC channel (TASK CONST task)  +     Zweck: Liefert die Kanalnummer der angegebenen Task. Ist kein Kanal zuge +            ordnet, wird 0 geliefert.  +  +#ib#clock#ie#  +     REAL PROC clock (INT CONST index)  +     Zweck: Liefert die über Index spezifizierte #ib#Systemuhr#ie#. Die Zeiteinheit ist 1 sec, +            die Meßgenauigkeit 0.1 sec.  +                     clock (0)   :   CPU-Zeit der eigenen Task  +                     clock (1)   :   Realzeit des Systems  +  +     REAL PROC clock (TASK CONST task)  +     Zweck: Liefert die CPU-Zeit der angegebenen Task.  +  +     Hinweis: Die CPU-Zeit beginnt mit der Taskkreation zu laufen. Sie gibt also +              jeweils die gesamte bisher verbrauchte CPU-Zeit an. Die Zeitdauer +              bestimmter Operationen kann als Differenz zweier 'clock'-Aufrufe +              gemessen werden. Beim Ende einer Task wird ihr CPU-Zeitverbrauch +              dem Vater zugeschlagen, um Abrechnungen zu ermöglichen.  +  +#ib#continue#ie#  +     PROC continue (INT CONST channel nr)  +     Zweck: Die Task versucht, sich an den vorgegebenen Kanal anzukoppeln. Falls +            sie vorher schon an ein Terminal gekoppelt war, wird implizit 'break' +            durchgeführt, falls die Aktion erfolgreich durchgeführt werden konnte. +            Ein erfolgreiches 'continue' beinhaltet implizit 'reset autonom'.  +            Anmerkung: Normale Tasks können auf die Kanäle 1-24 zugreifen, +                       Systemtasks dürfen sich auch an die privilegierten Kanäle +                       25-32 ankoppeln.  +     Fehlerfälle:  +          * ungueltiger Kanal  +          * Kanal belegt  +  +#ib#end#ie#  +     PROC end  +     Zweck: Löscht die eigene Task und alle Söhne. Wenn die Task an ein Terminal +            angekoppelt ist, wird vorher angefragt, ob wirklich gelöscht werden soll. +            Anschließend wird die Standard-"Tapete" auf dem Bildschirm ausge +            geben.  +  +     PROC end (TASK CONST task)  +     Zweck: Löscht die angegebene 'task'. 'task' muß allerdings die eigene oder eine +            Sohn- bzw. Enkel-Task der eigenen sein (siehe auch: 'Privilegierte Ope +            rationen'). Im Unterschied zur oben aufgeführten parameterlosen Proze +            dur 'end' wird nicht angefragt und auch keine "Tapete" ausgegeben. +            Wenn also die eigene Task ohne Reaktion auf dem Terminal beendet +            werden soll, kann dies mit 'end (myself)' geschehen.  +     Fehlerfall:  +          * 'end' unzulaessig  +  +#ib#family password#ie#  +     PROC family password (TEXT CONST password)  +     Zweck: Diese  Prozedur setzt oder ändert das Paßwort derjenigen Familien +            mitglieder, die kein Paßwort oder das gleiche Paßwort wie die aufrufen +            de Task haben.  +            Zu einer Familie gehören die Task, in der man sich befindet, und die ihr +            untergeordneten Tasks.  +            Natürlich gelten auch hier die allgemeinen Paßwortbedingungen (siehe +            dazu: 'task password').  +            Beispiel: Das Kommando 'family password ("EUMEL")' wird in SYSUR +                      gegeben. Dadurch wird das SYSURPaßwort und die Paß +                      worte der entsprechenden Tasks unter SYSUR auf "EUMEL" +                      gesetzt.  +  +  +#ib#next active#ie#  +     PROC next active (TASK VAR task)  +     Zweck: 'task' wird auf die nächste aktive Task gesetzt. Aktiv sind alle Tasks, die +            sich im Zustand 'busy' befinden oder auf Ein/Ausgabe warten (i/o) und +            an einen Kanal angekoppelt sind. Beispiel:  +  +  +                      TASK VAR actual task := myself;  +                      REP  +                        ... ;  +                        next active (actual task)  +                      UNTIL actual task = myself PER.  +  +  +            Hier werden alle aktiven Tasks durchgemustert (z.B. für Scheduling- +            Anwendungen). Dieses Verfahren ist sehr viel weniger aufwendig als +            eine Durchmusterung des ganzen Taskbaumes, liefert aber nur die +            gerade aktiven Tasks.  +  +#ib#rename myself#ie#  +     PROC rename myself (TEXT CONST new task name)  +     Zweck: Die eigene Task erhält als neuen Tasknamen 'new task name'. Damit +            kann auch aus einer benannten eine unbenannte Task mit dem Pseu +            donamen "-" werden. Umbenennung in die andere Richtung ist eben +            falls möglich.  +            Achtung: Durch das Umbenennen der Task werden alle Taskvariablen, +                     die sich auf diese Task beziehen, ungültig (als wäre die Task +                     gelöscht und dann neu eingerichtet).  +     Fehlerfälle:  +          * ... existiert bereits  +          * Name unzulaessig  +  +#ib#reset autonom#ie#  +     PROC reset autonom  +     Zweck: Die eigene Task deklariert sich beim Supervisor als nicht autonom +            (Normalzustand). Das bedeutet, 'continue'-Aufforderungen über ein +            'Supervisor-Kommando' vom Terminal werden vom System ohne Be +            nachrichtigung der Task durchgeführt.  +  +#ib#set autonom#ie#  +     PROC set autonom  +     Zweck: Die eigene Task deklariert sich beim Supervisor als #ib#autonom#ie# (üblich für +            Manager-Tasks). Wenn jetzt ein 'continue'-Supervisor-Kommando auf +            diese Task von einem Terminal aus gegeben wird, wird der Task über +            'send' eine Nachricht zugestellt.  +            Achtung: Im autonomen Zustand ist der Programmierer selbst für die +                     Reaktion der Task verantwortlich. Man kann sie von außen auf +                     keine Weise gewaltsam an ein Terminal koppeln (ermög +                     licht Paßalgorithmen / Datenschutz).  +                     Um die Programmierung etwas zu entschärfen, wird eine +                     Task automatisch aus dem autonomen in den Normalzustand +                     überführt, wenn sie selbst ein 'continue' gibt.  +  +#ib#status#ie#  +     INT PROC status (TASK CONST task)  +     Zweck: Liefert den Status der angegebenen Task:  +  +            0    -busy-        Task ist aktiv.  +            1    i/o           Task wartet auf Beendigung des Outputs oder +                               auf Eingabe.  +            2    wait          Task wartet auf Sendung von einer anderen Task.  +            4    busy-blocked  Task ist rechenwillig, ist aber blockiert.  +            5    i/o -blocked  Task wartet auf I/O, ist aber blockiert.  +            6    wait-blocked  Task wartet auf Sendung, ist aber blockiert.  +                               Achtung: Die Task wird beim Eintreffen einer +                                        Sendung automatisch entblockiert.  +  +#ib#storage#ie#  +     PROC storage (INT VAR size, used)  +     Zweck: Informiert über den physisch verfügbaren ('size') und belegten ('used') +            Speicher des Gesamtsystems. Die Einheit ist KByte.  +            Achtung: 'size' gibt den Speicher an, der benutzt werden kann, ohne in +                     eine Engpaßsituation zu kommen. Tatsächlich wird auf dem +                     Hintergrundmedium noch eine gewisse Reserve freigehalten. +                     Wenn diese angebrochen wird, befindet sich das System im +                     #ib#Speicherengpaß#ie#. Dieser Zustand kann mit 'used > size' +                     abgefragt werden.  +  +     INT PROC storage (TASK CONST task)  +     Zweck: Liefert die Größe des Speicherbereichs in KByte, den die angegebene +            Task augenblicklich belegt.  +            Dabei werden durch Sharing mögliche Optimierungen nicht berücksich +            tigt. D.h. eine Task kann physisch erheblich weniger Speicher als logisch +            belegen. Entsprechend kann die Speichersumme aller Tasks den phy +            sisch belegten Speicherbereich des Gesamtsystems beträchtlich über +            schreiten.  +  +#ib#task password#ie#  +     PROC task password (TEXT CONST password)  +     Zweck: Das angegebene Paßwort wird beim Supervisor hinterlegt. Bei folgen +            den SV-Kommandos 'continue...' auf diese Task wird interaktiv das +            Paßwort abgefragt. Dabei gelten die üblichen Paßwort-Konventionen:  +  +                 a) "" (Niltext) bedeutet #on("i")#kein Paßwort#off("i")#. Damit kann man durch +                    'task password ("")' das Paßwort wieder ausschalten.  +  +                 b) "-" bedeutet #on("i")#jedes eingegebene Paßwort ist ungültig#off("i")#. Damit +                    kann man durch 'task password ("-")' das Ankoppeln an ein +                    Terminal von außen (durch SV-Kommando) unterbinden.  +  +  +  +  +#ib##ib(9)#Privilegierte Operationen#ie(9)##ie#  +  +  +Die im folgenden aufgeführten privilegierten Operationen können #ub#nur#ue# von #ib#System +tasks#ie# - das sind direkte oder indirekte Söhne des Supervisors - ausgeführt werden. Um +Mißbrauch unmöglich zu machen, sollte der Supervisor nach der Einrichtung der +gewünschten Systemtasks bzgl. der Einrichtung neuer Söhne gesperrt und alle Sy +stemtasks durch Paßworte geschützt werden.  +  +  +#ib#block#ie#  +     PROC block (TASK CONST task)  +     Zweck: Die angegebene #ib#Task wird blockiert#ie#, d.h. so lange von der Verarbeitung +            suspendiert, bis die Blockade durch 'unblock' wieder aufgehoben wird. +            Diese Operation wird vom Scheduler benutzt. Falls das Packet 'schedu +            ler' insertiert ist, sollten andere Tasks die Prozedur 'block' nicht anwen +            den, um dem Scheduling nicht entgegenzuwirken.  +  +#ib#collect garbage blocks#ie#  +     PROC collect garbage blocks  +     Zweck: Es wird eine außerplanmäßige Gesamtmüllabfuhr durchgeführt. Plan +            mäßig (d.h. ohne Aufruf dieser Prozedur) wird sie alle 15 Minuten und in +            Engpaßsituationen durchgeführt. Nach Aufruf dieser Prozedur wird der +            automatische Fixpunkt/ Müllabfuhr-Rhythmus ca. 1 Stunde lang ge +            sperrt. Somit kann man z.B. in der Task "scheduler" einen eigenen +            Fixpunkt/Müllabfuhr-Rhythmus implementieren.  +            Achtung: Diese Operation erfordert starkes Paging und dauert dement +                     sprechend lange.  +  +#ib#end#ie#  +     PROC end (TASK CONST task)  +     Zweck: Die angegebene Task und alle Söhne, Enkel etc. werden gelöscht. +            Systemtasks (direkte und indirekte Nachkommen des SUPERVISORs) +            können beliebige andere Tasks (nicht nur eigene Söhne) löschen.  +  +#ib#fixpoint#ie#  +     PROC fixpoint  +     Zweck: Für das Gesamtsystem wird ein außerplanmäßiger #ib#Fixpunkt#ie# geschrie +            ben. Planmäßige Fixpunkte (d.h. ohne Aufruf dieser Prozedur) werden +            alle 15 Minuten geschrieben. Nach Aufruf dieser Prozedur wird der +            automatische Fixpunkt/Müllabfuhr-Rhythmus ca. 1 Stunde lang ge +            sperrt. Somit kann man z.B. in der Task "scheduler" einen eigenen +            Fixpunkt/Müllabfuhr-Rhythmus implementieren.  +            Achtung: Diese Operation verursacht starkes Paging (Rückschreiben +                     aller veränderten Seiten auf das Hintergrundmedium) und +                     dauert dementsprechend lange.  +  +#ib#prio#ie#  +     INT PROC prio (TASK CONST task)  +     Zweck: Liefert die augenblickliche #ib#Priorität#ie# der angegebenen Task.  +  +     PROC prio (TASK CONST task, INT CONST new prio)  +     Zweck: Setzt die Priorität der Task.  +  +     Hinweis: 0 ist die höchste, 15 die niedrigste Priorität. Die Prioritäten 0 bis 2 +              werden von EUMEL 0 (fine scheduling) verwaltet. Die restlichen Priori +              täten können für 'rough scheduling' (siehe auch im Kapitel Scheduler) +              eingesetzt werden.  +              Durch 'continue ("name")' wird die Priorität wieder auf 0 gesetzet.  +  +#ib#set date#ie#  +     PROC set date  +     Zweck: #ib#Datum#ie# und #ib#Uhrzeit#ie# können im Dialog gesetzt werden (Form wie beim +            Start des Systems). Dabei wird gegebenenfalls die HardwareUhr gele +            sen.  +            Sollte der SHard ein falsches Datum liefern, so muß das Datum mit  +                set clock (date("tt.mm.jj") + time ("hh:mm:ss"))  +            gesetzt werden.  +  +#ib#save system#ie#  +     PROC save system  +     Zweck: Der gesamte Systemhintergrund wird auf Archivdisketten gesichert. Zu +            diesem Zweck wird das System wie bei 'shutup' heruntergefahren.  +  +#ib#shutup#ie#  +     PROC shutup  +     Zweck: #ib#Kontrolliertes Herunterfahren des Systems#ie#. Beim nächsten Systemstart +            wird automatisch Datum und Uhrzeit erfragt, wenn der Kommandodial +            og eingeschaltet ('command dialogue (TRUE)') und keine Hardwareuhr +            vorhanden ist. Falls diese Prozedur nicht vor dem Abschalten aufgerufen +            wurde, findet beim Neustart ein Aufsetzen auf dem letzten Fixpunkt statt +            (RERUN).  +  +#ib#unblock#ie#  +     PROC unblock (TASK CONST task)  +     Zweck: Eine vorherige Blockierung der Task wird aufgehoben. Ist die Task nicht +            blockiert, bewirkt 'unblock' nichts. Diese Operation wird vom Scheduler +            benutzt. Andere Tasks sollten sie normalerweise nicht anwenden, um +            dem Scheduling nicht entgegenzuwirken.  +  +  +  +  +  +#ib(9)#5.3. #ib#ID  Konstanten#ie##ie(9)#  +  +  +Die Informationsprozedur  +  +     INT PROC id (INT CONST no)  +  +liefert folgende Informationen über die Soft und Hardware des Rechners:  +  +   Von EUMEL 0 werden geliefert:  +     id (0) --> EUMELVersion  +     id (1) --> Prozessortyp  (1: Z80,  +                               2: Z8001,  +                               3: 8086 und kompatible,  +                               4: 68000  +                               5: 80286)  +     id (2) --> UrladerVersion  +     id (3) --> reserviert  +  +   Vom SHard werden geliefert:  +     id (4) --> Lizenznummer des SHards  +     id (5) --> Installationsnummer des EUMELAnwenders  +     id (6) --> SHardspezifisch  +     id (7) --> SHardspezifisch  +  +  +  +  +  +#ib(9)#5.4. #ib#Systemverwaltung#ie##ie(9)#  +  +  +#on("i")#Achtung#off("i")#: Dieser Teil des Systemhandbuchs ist nur für solche Multi-User-Installationen +         von Bedeutung, die erweiterte Systemverwaltungsfunktionen generieren +         bzw. modifizieren wollen.  +  +         #on("i")#Das EUMEL-System ist in der ausgelieferten minimalen Standardform (ohne +         die Features) ohne weiteres benutzbar#off("i")#.  +  +  +  +  +  +#ib(9)#Der Systemmanager #ib#SYSUR#ie##ie(9)#  +  +  +Der Systemmanager verhält sich im wesentlichen wie ein normaler Manager, allerdings +mit folgender Erweiterung:  +  +    -  Die Operationen 'list' und 'fetch' können von allen Tasks des Systems und +       nicht nur von Söhnen durchgeführt werden. Damit kann man Systemverwal +       tungsdateien (z.B. "#ib#logbuch#ie#") von allen Tasks aus lesen. 'erase' und 'save' sind +       jedoch nur von Söhnen bzw. Enkeln - d.h. von privilegierten Systemtasks - aus +       zulässig.  +  +Das Paket stellt folgende Operationen zusätzlich zur Verfügung:  +  +#ib#generate shutup manager#ie#  +     PROC generate shutup manager  +     Zweck: Es wird eine Sohntask mit Namen "shutup" kreiert. Diese Task ist nicht +             (!) paßwortgeschützt, läßt aber keine normalen Kommandos zu, son +            dern fragt nur  +  +                     shutup (j/n) ?  +  +            So kann jeder das System kontrolliert abschalten und die privilegierten +            Operationen des OPERATORs wie 'end' sind dennoch geschützt.  +  +#ib#put log#ie#  +     PROC put log (TEXT CONST log record)  +     Zweck: Der angegebene 'log record' wird mit vorangestelltem Tasknamen des +            Absenders, Datums- und Uhrzeitangabe in die Logbuchdatei "logbuch" +            in der Task "SYSUR" geschrieben. Der neue Satz wird an die Datei ange +            fügt. ("logbuch" wird z.B. vom EUMELmeter verwandt.)  +  +     Hinweis: Bei Verwendung des Logbuchs darf die zwar große, aber doch end +              liche Dateikapazität nicht vergessen werden. Nachdem das Logbuch +              mit 4073 Sätzen voll ist, werden weitere 'put log' Operationen igno +              riert. Die Datei "logbuch" sollte deshalb - wenn sie beispielsweise vom +              EUMELmeter verwandt wird - von Zeit zu Zeit gelöscht werden ('erase' +              bzw. 'forget')!  +  +  +  +  +#ib(9)##ib#Scheduler#ie##ie(9)#  +  +  +Der Scheduler dient zur Verwaltung der rechenwilligen #ib#Hintergrundtask#ie#s. Will man den +Scheduler (eventuell abgeändert) insertieren, muß man die Task "scheduler" als Sohn +von SYSUR einrichten. Dann holt man die Datei "scheduler" vom Archiv und insertiert +sie. "scheduler" beinhaltet "#ib#eumelmeter#ie#". Es wird beim Start erfragt, ob die Meßrouti +nen aktiviert werden sollen oder nicht.  +  +  +  +  +#ib##ib(9)#Funktionsweise des Schedulers#ie(9)##ie#  +  +  +Der Scheduler sammelt in bestimmten Zeitintervallen alle aktiven (rechnenden) Tasks +ab, die an kein Terminal angekoppelt sind und auch keine Manager sind. Diese Tasks +werden blockiert und in die Warteschlange der #ib#Standardklasse#ie# eingefügt.  +  +Die Klassen des Schedulers werden durch die #ib#Taskpriorität#ie#en 5 bis 9 definiert. Die +Standardklasse entspricht der Priorität 7. Die Klassenzugehörigkeit einer Task kann von +einer Systemtask aus (z.B. von "OPERATOR") mit der Prozedur '#ib#prio#ie#' verändert werden.  +  +Der Scheduler geht nach folgender Strategie vor:  +  +     Anhand der Vordergrund/Hintergrundlast des Systems wird entschieden, ob +     überhaupt Hintergrundtasks aktiv sein dürfen, welche Klassen aktiv sein dürfen +     und wieviel #ib#Hintergrundtask#ie#s gleichzeitig rechnen dürfen.  +  +     Die wartenden #ib#Hintergrundtask#ie#s werden im #ib#Round-Robin-Verfahren#ie# aktiviert. +     Dabei kommt die Klasse n+1 erst dann zum Zug, wenn die Warteschlange der +     Klasse n leer ist oder weniger Tasks enthält, als gleichzeitig aktiviert werden +     sollen.  +  +Die implementierte Standardstrategie hat als oberste Maxime, den Vordergrund auf +keinen Fall zu stören. Dementsprechend wird der Hintergrund nur aktiviert, wenn eine +der folgenden Bedingungen erfüllt ist:  +  +    -  Die Vordergrundlast des Systems liegt unter 3% .  +  +    -  Es ist keine normale #ib#Vordergrundtask#ie# (Nachfahre von "UR") an einen Kanal +       angekoppelt. Man beachte, daß Systemtasks hierbei nicht berücksichtigt +       werden. Ein aktiver Drucker blockiert die Hintergrundtasks also nicht.  +  +  +  +  +EUMELmeter (Systemstatistik)  +  +  +Die #ib#Meßsoftware#ie# zum #ib#Protokollieren der Systembelastung#ie# befindet sich auf dem Archiv +'std.zusatz'.  +  +Falls das System keinen #ib#Scheduler#ie# benutzt, muß eine Meßtask als Sohn von "SYSUR" +eingerichtet werden. In diese Task muß dann die Datei "#ib#eumelmeter#ie#" vom Archiv geholt +und übersetzt werden.  +  +Falls das System einen Scheduler beinhalten soll, muß bei der Generierung des Sche +dulers lediglich auf die Frage "mit eumelmeter (j/n) ?" mit "j" geantwortet werden.  +  +  +  +#ib##ib(9)#EUMELmeter#ie(9)##ie#  +  +  +Das EUMELmeter protokolliert die #ib#Systemlast#ie# in ca. 10 minütigen Abständen in der +Datei "#ib#logbuch#ie#" in "SYSUR". Für jedes Meßintervall wird eine Zeile angefügt. Die Zeilen +sind folgendermaßen aufgebaut:  +  +tt.mm.jj hh:mm   hg  uf ub  pw pb  cpuf cpub cpus last nutz  +  +  +tt.mm.jj hh:mm    Datum und Uhrzeit des Eintrags  +  +hg                Größe des aktuell belegten Hintergrundspeichers  +                  (in KB)  +  +uf                Anzahl der aktiven Vordergrundtasks  +  +ub                Anzahl der aktiven Hintergrundtasks  +  +pw                #ib#Paginglast#ie# bei wartender CPU (#ib#Paging/Wait#ie#)  +  +pb                Paginglast bei aktiver CPU (#ib#Paging/Busy#ie#)  +  +cpuf              #ib#CPU-Auslastung#ie# durch Vordergrundtasks  +  +cpub              CPU-Auslastung durch Hintergrundtasks  +  +cpus              #ib#CPU-Systemlast#ie#  +  +last              #ib#Gesamtlast des Systems#ie#:  +                  pw + pb + cpuf + cpub+ cpus  +                  (Achtung: kann 100% übersteigen, da Platte und CPU über +                  lappt arbeiten können.)  +  +nutz              #ib#Nutzgüte#ie# im Meßintervall:  100% - pw - cpus  +                  Die Nutzgüte gibt an, welcher Anteil der Systemarbeit für echte +                  Nutzarbeit verfügbar war. Sie ist die Summe aus der echten +                  Nutzlast 'cpuf+cpub' und der Leerzeit, die ja theoretisch auch +                  für Nutzarbeit hätte verwandt werden können. Sie läßt sich, wie +                  oben angegeben, auch berechnen, indem man den idealerweise +                  überflüssigen Overhead 'cpus' und 'pw' von 100% abzieht.  +#page#  +  +#count per page#  +#headeven#  +%#center#EUMEL-Systemhandbuch  +  +  +#end#  +#headodd#  +#center#6. Der EUMEL-Drucker#right#%  +  +  +#end#  +  +#ib(9)#6. Der #ib#EUMEL-Drucker#ie##ie(9)#  +  +  +  +#ib(9)#6.1. Allgemeine Einführung#ie(9)#  +  +  +Die Ansteuerung eines #ib#Druckers#ie# durch das EUMEL-System geschieht durch zwei +aufeinanderbauende Komponenten. Die eine Komponete ist der hardwareunabhängi +ge #ib#EUMEL-Drucker#ie#, der die #ib#Textverarbeitungsanweisungen#ie# umsetzt und die Druck +seite entsprechend aufbereitet, so daß sie im Blocksatz, in Tabellenform oder in Spal +ten gedruckt werden kann. Die andere Komponente ist der hardwareabhängige #ib#Druk +kertreiber#ie#, der durch ein einfaches Interface zum EUMEL-Drucker, wie z.B. Textausge +ben, Positionieren oder Schrifttypen und Modifikationen an- und ausschalten, den +eigentlichen Druck vornimmt.  +Die hardwareunabhängige Komponente, der EUMEL-Drucker, befindet sich bei den +ausgelieferten Systemen im priviligierten Ast des Taskbaums, so daß beim Anschluß +eines Druckers nur noch der hardwareabhängige Druckertreiber insertiert werden muß. +Auf dem PRINTER-Archiv befinden sich schon einige Druckeranpassungen für diverse +Druckertypen.  +  +-  Implementierung des Druckertreiber-Interface  +       Das Paket mit dem Druckertreiber muß in einer Task "PRINTER" insertiert und +       ein Spool eingerichtet werden.  +  +-  Erstellen einer Fonttabelle für den anzuschießenden Drucker  +       Eine vorhandene Fonttabelle wird dabei in die Task "configurator" gebracht +       werden. Die Fonttabelle sollte in allen bestehenden Tasks - insbesondere in +       der Task "PUBLIC" und der Task "PRINTER" - mit dem #on("i")##on("b")#fonttable#off("i")##off("b")#-Kommando +       eingestellt werden.  +  +  +  +  +#ib(9)#6.2. Das #ib#Druckertreiber-Interface#ie##ie(9)#  +  +  +Da der EUMEL-Drucker vor dem Druckertreiber insertiert ist, aber auf dem Drucker +treiber aufbaut, müssen beim Aufruf der 'print'-Prozedur des EUMEL-Druckers die +Prozeduren des Druckertreibers mit übergeben werden. Aus progammtechnischen +Gründen sollte ihre Anzahl möglichst gering gehalten werden. Deshalb gibt es die +folgende drei Prozeduren, die mit einem 'op code' parametrisiert werden. Die Bedeu +tung der weiteren Parameter der Interfaceprozeduren hängen von diesem 'op code' ab. +Die folgende Beschreibung der Prozeduren gibt einen Programmrahmen vor, in dem +die Parameter durch Refinements entsprechend ihrer Bedeutung umdefiniert sind.  +  +  +  +PROC open (INT CONST op code, INT VAR param 1, param 2) :  +  +  LET document code  =  1 ,  +      page code      =  2 ;  +  +  SELECT op code OF  +    CASE document code  :  open document  +    CASE page code      :  open page  +  END SELECT.  +  +  +  x steps : param1 .  +  y steps : param2 .  +  +  #ib#open document#ie# :  +  +      Zweck: Die Prozedur wird vom EUMEL-Drucker zur Einleitung jedes Ausdrucks +             aufgerufen. Hier können notwendige Initialisierungen der Hardware +             durchgeführt werden. In 'x steps' und 'y steps' muß die Breite bzw. +             Höhe der bedruckbaren Fläche des Papieres in Mikroschritten des +             Druckers angegeben werden.#u##count#)#e#  +#foot#  +  +#value#) Zur Definition der Mikroschritte siehe Bemerkung 2.  +#end#  +  +  +  +  x start : param1 .  +  y start : param2 .  +  +  #ib#open page#ie# :  +  +      Zweck: Hiermit wird dem Hardware-Interface der Beginn einer neuen Seite +             mitgeteilt. Die Parameter 'x start' und 'y start' liefern die gewünschte +             Position der linken oberen Ecke des Schreibfeldes. Das Hardware-In +             terface muß in diesen Parametern seine augenblickliche Position auf +             dem Papier zurückmelden, wobei die Position (0,0) die linke obere +             Ecke des Papieres ist.  +             Vor der Rückmeldung kann aber auch auf die angegebene Startpo +             sition positioniert und diese zurückgemeldet werden. Es ist jedoch +             darauf zu achten, daß die zurückgemeldete Position den internen +             Nullpunkt für die Absolutkoordinaten im EUMEL-Drucker definiert. +             Deswegen muß das Hardware-Interface sicherstellen, daß bei einem +             "Zeilenrücklauf" die zurückgemeldete Position 'x start' erreicht wird. +             (Siehe 'carriage return' in der Prozedur 'execute'). Auch gibt es Fälle, +             bei denen links von der gemeldeten 'x start'-Position positioniert wird.  +             Bei #ib#Druckern mit Einzelblatteinzug#ie#, bei denen das Papier gleich auf die +             zweite oder dritte Zeile positioniert wird, sollte, um ein korrektes Druck +             bild zu erreichen, diese Postion in 'y start' zurückgemeldet werden.  +  +  +END PROC open;  +  +  +PROC close (INT CONST op code, INT CONST param 1) :  +  +  LET document code  =  1 ,  +      page code      =  2 ;  +  +  SELECT op code OF  +    CASE document code  :  close document  +    CASE page code      :  close page  +  END SELECT.  +  +  +  #ib#close document#ie# :  +  +      Zweck: Hiermit wird dem Hardware-Interface das Ende eines Druckvorgangs +             mitgeteilt.  +  +  +  +  remaining y steps : param 1 .  +  +  #ib#close page#ie# :  +  +      Zweck: Hiermit wird dem Hardware-Interface mitgeteilt, daß der Druck der +             aktuellen Seite abgeschlossen ist.  +             'remaining y steps' gibt an, wieviel Mikroschritte das vertikale Papier +             ende noch von der aktuellen Druckposition entfernt ist. Die x-Position +             des Druckers ist bei Aufruf dieser Prozedur immer der linke Rand +             'x start'.  +  +  +END PROC close;  +  +  +PROC execute (INT CONST op code, TEXT CONST string,  +                                 INT  CONST param1, param2) :  +  +  LET write text code       =  1 ,  +      write cmd code        =  2 ,  +      carriage return code  =  3 ,  +      move code             =  4 ,  +      draw code             =  5 ,  +      on code               =  6 ,  +      off code              =  7 ,  +      type code             =  8 ;  +  +  SELECT op code OF  +    CASE write text code       :  write text  +    CASE write cmd code        :  write cmd  +    CASE carriage return code  :  carriage return  +    CASE move code             :  move  +    CASE draw code             :  draw  +    CASE on code               :  on  +    CASE off code              :  off  +    CASE type code             :  type  +  END SELECT .  +  +  +  from : param1 .  +  to   : param2 .  +  +  #ib#write text#ie# :  +  +      Zweck: Der übergebene Text 'string' muß von der Zeichenposition 'from' bis +             'to' (einschließlich) auf dem Drucker ausgegeben werden. Die Über +             schreitung der Papierbreite braucht nicht überprüft zu werden.  +  +  +  +  #ib#write cmd#ie# :  +  +      Zweck: Der übergebene Text 'string' enthält zwischen den Positionen 'from' +             und 'to' ein direkt angegebenes #ib#Druckerkommando#ie# (\#"..."\#). Wenn +             direkte Druckerkommandos erlaubt sein sollen, müssen sie ausgege +             ben werden.  +  +  +  +  x steps to left margin : param 1 .  +  +  #ib#carriage return#ie# :  +  +      Zweck: Der Druckkopf muß (ohne Zeilenvorschub) an den linken Rand be +             wegt werden, d.h. an die bei 'open page' vom Druckertreiber gemel +             dete Position 'x start'. 'x steps to left margin' gibt an, wieviel Minimal +             schritte die augenblickliche Position vom linken Rand entfernt ist.  +  +  +  +  x steps : param 1 .  +  y steps : param 2 .  +  +  #ib#move#ie# :  +  +      Zweck: Die Schreibposition muß um 'x steps' Mikroschritte nach rechts und um +             'y steps' Mikroschritte nach unten verschoben werden. Negative +             Schrittwerte bedeuten dabei die jeweils andere Richtung. Das Über +             schreiten des Papiers braucht nicht überprüft zu werden. Bei einer +             horizontalen Bewegung nach rechts ('x steps' > 0) müssen die einge +             schalteten Modifikationen beachtet werden. Wenn z.B. 'underline' +             eingeschaltet ist, muß die Strecke unterstrichen werden.  +             Kann eine Leistung (z.B. Bewegung nach links) nicht erbracht wer +             den, muß ein 'errorstop' ausgelöst werden. Im Fehlerfall bei einer +             Horizontalbewegung versucht der EUMEL-Drucker nach einem Zei +             lenrücklauf nochmals die angestrebte x-Position zu erreichen. Somit +             brauchen horizontale Bewegungen nach links ('x steps' < 0) nicht +             unbedingt implementiert zu werden, sondern können mit einem 'error +             stop' beantwortet werden. Im Fehlerfall bei einer vertikalen Bewegung +             wird an der alten Position weitergeschrieben.  +  +  +  +  #ib#draw#ie# :  + Zweck: Von der aktuellen Schreibposition an (linke untere Ecke der Zeichenposition) +             soll eine gerade Linie zum Zielpunkt ('x steps' weiter rechts, 'y steps' weiter +             unten) gezogen werden. Kann eine Leistung (z.B. schräge Linie, Linie nach +             oben o.ä.) nicht erbracht werden, muß ein 'errorstop' ausgelöst werden. +             Dieser Fehlerfall wird vom EUMEL-Drucker ignoriert. Das Überschreiten +             des Schreibfeldes braucht nicht überprüft zu werden.  +  +  +  +  modification : param 1 .  +  +  #ib#on#ie# :  +  +      Zweck: Die #ib#Modifikation#ie# der Nummer 'modification' soll eingeschaltet wer +             den, sofern die Hardware es erlaubt. Augenblicklich gibt es folgende +             Modifikationen:  +  +                         1      underline  +                         2      bold  +                         4      italics  +                         8      reverse  +  +             Die in der Fonttabelle spezifizierte Befehlssequenz, um die entspre +             chende Modifikation anzuschalten, kann mit der Prozedur #on("i")#on string +             (modification)#off("i")# abgefragt werden.  +             Kann eine Leistung nicht erbracht werden, muß ein 'errorstop' aus +             gelöst werden. Im Fehlerfall der Modifikation 'underline' versucht der +             neue EUMEL-Drucker die Zeile mit Hilfe von 'draw' zu unterstreichen. +             Im Fehlerfall der Modifikation 'bold' wird die Zeile nochmals, um den in +             der Fonttabelle spezifizierten 'bold offset' verschoben, ausgegeben. +             Bei den restlichen beiden Modifkationen wird der Fehlerfall ignoriert.  +  +  +  +  #ib#off#ie# :  +  +      Zweck: Die angegebene #ib#Modifikation#ie# 'modification' soll ausgeschaltet wer +             den. Die in der Fonttabelle spezifizierte Befehlssequenz, um die ent +             sprechende Modifikation auszuschalten, kann mit der Prozedur #on("i")#off +             string (modification)#off("i")# abgefragt werden. Ein Fehlerfall wird hier igno +             riert.  +  +  +  +  font nr : param 1 .  +  +  #ibie# :  +  +      Zweck: Die Druckausgabe soll auf den #ib#Schrifttyp#ie# mit der angegebenen Font +             nummer 'font nr' umgeschaltet werden. Diese Nummer bezieht sich auf +             die eingestellte Fonttabelle. Mit den Prozeduren des Fontspeichers +             können anhand dieser Nummer die nötigen Informationen beschafft +             werden. So liefert z.B. die Prozedur #on("i")#font string (font nr)#off("i")# die in der Font +             tabelle spezifizierte Befehlssequenz oder die Prozedur #on("i")#font (font nr)#off("i")# +             den Namen des Fonts. Die Breite des Leerzeichens kann mit #on("i")#char pitch +             (font nr, " ")#off("i")# bestimmt werden.  +  +  +END PROC execute;  +  +  +  +  +  +#ib(9)#6.3. Prozedur-Schnittstelle des EUMEL-  +     Druckers#ie(9)#  +  +  +  +#ib#print#ie#  +     PROC print  (PROC (TEXT VAR) next line, BOOL PROC eof,  +                  PROC (INT CONST, INT VAR, INT VAR) open,  +                  PROC (INT CONST, INT CONST) close,  +                  PROC (INT CONST, TEXT CONST,  +                                      INT CONST, INT CONST) execute,  +                  BOOL CONST elan listing, TEXT CONST file name)  +     Zweck:  Solange die Prozedur 'eof' FALSE liefert wird mit der Prozedur 'next +             line' eine Zeile eingelesen. Dieser Eingabestrom wird für den Druck +             aufbereitet. Ist die Konstante 'elan listing' auf FALSE gesetzt, so wird +             der Eingabestrom als Textdatei mit Textkosmetik-Anweisungen aus +             gedruckt. Andernfalls wird der Eingabestrom wie ein ELAN-Listing +             behandelt. In der Textkonstanten 'file name' muß dann der Dateiname +             der Programmdatei enthalten sein.  +  +  +      PROC print (FILE VAR file,  +                  PROC (INT CONST, INT VAR, INT VAR) open  +                  PROC (INT CONST, INT CONST) close  +                  PROC (INT CONST, TEXT CONST,  +                                   INT CONST, INT CONST) execute)  +      Zweck: Der Eingabestrom kommt aus der angegebenen Datei. Anhand vorge +             gebener Kriterien wird entschieden, ob diese Datei als Textdatei oder +             als ELAN-Listing ausgedruckt wird.  +  +#ib#with elan listings#ie#  +      PROC with elan listings (BOOL CONST flag)  +      Zweck: Mit dieser Prozedur kann bei der vorangegangenen 'print'-Prozedur +             gesteuert werden, ob überhaupt irgendwelche Dateien als ELAN-Lis +             tings gedruckt werden sollen. Wird damit FALSE eingestellt, so wer +             den alle Dateien als Textdateien gedruckt.  +  +     BOOL PROC with elan listings  +     Zweck:  Liefert die aktuelle Einstellung.  +  +  +#ib#is elan source#ie#  +     PROC is elan source (FILE VAR file)  +     Zweck:  Entscheidet nach vorgebenen Kriterien, ob die angegebene Datei ein +             ELAN-Listing ist.  +  +  +#ib#bottom label for elan listings#ie#  +     PROC bottom label for elan listings (TEXT CONST label)  +     Zweck:  Bei ELAN-Listings wird in der Fußzeile ein Text eingestellt, der durch +             Schägstrich getrennt vor die Seitennummer geschrieben wird. (z.B. zur +             Durchnumerierung der Pakete im Quellcode)  +  +     TEXT PROC bottom label for elan listings  +     Zweck:  Liefert die aktuelle Einstellung.  +  +  +#ib#material#ie#  +     TEXT PROC material  +     Zweck:  Hier kann das Hardware-Interface jeder Zeit den aktuellen Material +             wert abfragen, der vom Benutzer mit der 'material'-Anweisung einge +             stellt ist.  +  +  +#ib#x pos#ie#  +     INT PROC x pos  +     Zweck:  Wird in der Prozedur 'execute' die Funktion 'move' oder 'draw' ange +             steuert, so liefert diese Prozedur die absolute Zielposition in x-Rich +             tung, wo bei der Nullpunkt durch das zurückgelieferte 'x start' bei 'open +             page' definiert ist. Diese Prozedur dient zur Unterstützung von Druk +             kern, die eine absolute Positionierung in horizontaler Richtung benöti +             gen.  +  +  +#ib#y pos#ie#  +     INT PROC y pos  +     Zweck:  Wird in der Prozedur 'execute' die Funktion 'move' oder 'draw' an +             gesteuert, so liefert diese Prozedur die absolute Zielposition in y-Rich +             tung, wo bei der Nullpunkt durch das zurückgelieferte 'y start' bei 'open +             page' definiert ist. Diese Prozedur dient zur Unterstützung von Druk +             kern, die eine absolute Positionierung in vertikaler Richtung benötigen.  +  +  +#ibie#  +     INT PROC linetype  +     Zweck:  Wird in der Prozedur 'execute' die Funktion 'draw' angesteuert, so gibt +             diese Prozedur den gewünschten Linientyp an. Bisher ist nur definiert:  +                         1      underline  +  +     Anmerkung:  Bis jetzt benutzt der EUMEL-Druckers die Funktion 'draw' lediglich +                 zum Unterstreichen in Fehlerfall der Modifikation 'underline', d.h. +                 zeichnen mit 'y steps = 0' und 'x steps >= 0' mit 'line type = 1' +                 reicht aus.  +  +  +#ib#y offset index#ie#  +     INT PROC y offset index  +     Zweck:  Wurde der Font mit 'y offsets' definiert, so kann hiermit in der bei der +             Funktion 'write text' in der Prozedur 'execute' der jeweilige Offset-In +             dex für den auszugebenden Text abgefragt werden. Der Offset-Index +             sagt aus, die wievielte Verschiebung nun ausgegeben wird. Dabei +             werden die Verschiebungen in der Reihenfolge durchnummeriert, in +             der sie in der Fonttabelle angegeben wurden. Anhand dieses Offset-In +             dex muß das Hardware-Interface entscheiden, welche Bitmuster aus +             gegeben werden müssen.  +  +  +#ib#pages printed#ie#  +     INT PROC pages printed  +     Zweck:  Gibt nach dem Ausdruck an, wieviel Seiten gedruckt wurden.  +  +  +  +  +#ib(9)#6.4. Bemerkungen und Ratschläge#ie(9)#  +  +  +  +1) Für ein Paket, das dieses Interface implementiert, sind folgende Punkte wichtig:  +  +    -  Man braucht sich keine Zustände (aktuelle Position o.ä.) zu merken.  +  +    -  Rückmeldungen über die Leistungsfähigkeit eines Druckers bzw. seiner An +       passung erfolgen über 'errorstop'. Der #ib#EUMEL-Drucker#ie# stellt fest, ob bestimm +       te Leistungen (Einschalten der Attribute und Bewegungen des Druckers) +       verfügbar sind, indem er sie versuchsweise ausführen läßt. Bei den Prozedu +       ren 'open', 'close' und den Funktionen 'write text', 'write cmd', 'carriage return' +       und 'type' der Prozedur 'execute' führt ein 'errorstop' jedoch zum Abbruch des +       Drucks.  +  +2) Die #on("i")##on("b")##ib#Mikroschritte#ie##off("i")##off("b")# sollten die kleinsten durchführbaren horizontalen bzw. vertikalen +   Bewegungen des Druckers sein. Oft gibt aber das Handbuch des Druckers keine +   eindeutige Angabe über die Mikroschritte in horizontaler Richtung, sondern sagt +   nur, daß es gewisse Schriften mit einer bestimmten Anzahl von Zeichen pro Zoll +   gibt.#u##count#)#e# Dann ergibt sich die Anzahl von Mikroschritten pro Zoll aus dem kleinsten#foot# +     +#value#) 1 Zoll = 1 Inch = 2.54 cm  +  +#end#  +   gemeinsamen Vielfachen der Anzahl Zeichen pro Zoll aller Schriften.  +  +   Beispiel:  +      Der Olivetti Drucker PR1470 hat drei Schriften mit 10, 12, und 16.6 Zeichen pro +      Zoll. Das kleinste gemeinsame Vielfache ist 300. Ein Mikroschritt bei dem Druk +      ker PR1470 entspricht also einem 300stel Zoll. Die Breite der einzelnen Schrif +      ten läßt sich nun aus der folgenden Tabelle ablesen.  +  +       Anzahl Zeichen pro Zoll           Breite in 1/300 Zoll  +                10                            30  +                12                            25  +               16.6                           18  +  +   Wenn der Drucker in diesen theoretischen Mikroschritten nicht positionieren kann, +   so muß er bei einem #on("i")#move#off("i")#-Befehl so genau wie möglich positionieren. Der Rest +   sollte abgespeichert und beim nächsten #on("i")#move#off("i")#-Befehl hinzuaddiert werden.  +  +3) Um ein optimales Druckbild zu bekommen, müssen alle Breiten und Höhenanga +   ben der Zeichen genau angegeben werden.  +  +4) Die Fonttabelle bietet eine einfache Möglichkeit, Zeichen mit Hilfe der #ib#Ersatzdar +   stellung#ie#en umzucodieren. Deshalb sollte der Druckerkanal auch mit der Konfigu +   rationstabelle 'transparent' konfiguriert werden.  +  +5) Um den Schrifttyp festzulegen, mit dem #ib#ELAN-Listing#ie#s gedruckt werden sollen, +   kann in der Fonttabelle einem Font der Name #on("i")##on("b")#"#ib#elanlist#ie#"#off("i")##off("b")# zugeordnet werden, denn +   der ELAN-Lister versucht auf einen Schrifttyp mit diesem Namen zuschalten. Wenn +   kein Schrifttyp "elanlist" existiert, dann wird für ELAN-Listings der erste Schrifttyp +   der Fonttabelle genommen.  +  +6) Nach der Installation des #ib#Druckertreiber#ie#s ist darauf zu achten, daß in der Task +   "PRINTER" eine Fonttabelle des Druckers eingestellt ist.  +  +7) Der #ib#Druckertreiber#ie# sollte eventuell noch ein Prozedur bereitstellen, mit der die +   Papierbreite bzw. -höhe eingestellt werden kann, die bei 'open document' dem +   EUMEL-Drucker gemeldet wird.  +  +  +  +  +#ib(9)#6.5. Arbeitsweise des EUMEL-Druckers#ie(9)#  +  +  +  +Der EUMEL-Drucker arbeitet mit der folgenden Strategie:  +  +Die Datei wird zeilenweise analysiert. Bei der Analyse werden einzelne #ib#Token#ie# be +stimmt. Ein Token ist ein Textteil, der zusammenhängend gedruckt werden kann, ohne +daß es zu Typumschaltungen, Modifkationsänderungen oder Positionierungen in x- +bzw. y-Richtung kommt. So ist bei einfachem Zeilendruck jede Zeile ein Token, wäh +rend im Blocksatz jedes Wort ein Token ist. Ein Token hat also immer  +  +  -  einen Text,  +  -  die Länge des Textes bei der Ausgabe,  +  -  eine absolute x- und y- Position auf dem Papier,  +  -  einen Schrifttyp,  +  -  Modifikationen für den Text,  +  -  Modifikationen für den Zwischenraum vom letzten Token zu diesem Token.  +  +Sind alle Token einer Zeile bestimmt, so werden sie in eine Liste aller bisher erzeug +ten, aber noch nicht gedruckten Token der absoluten y-Position nach einsortiert. Diese +Tokenliste wird erst dann ausgedruckt, wenn sichergestellt ist, daß im weiteren Verlauf +der Datei kein Token vor das letzte Token der sortierten Liste kommt. Beim Zeilendruck +ist dies nach jeder Zeile der Fall. Bei Spaltendruck kann jedoch erst dann ausgedruckt +werden, wenn sich die Analyse in der letzten Spalte befindet. Spätestens bei einem +Seitenwechsel muß die Tokenliste ausgegeben werden.  +  +Durch diese Strategie lassen sich Spaltendruck oder Indizes und Exponenten sehr +leicht für alle Drucker implementieren, ohne daß ein Drucker in vertikaler Richtung +rückwärts positionieren muß.  +  +Bei der Ausgabe der Tokenliste wird jeweils auf die nächst größere y-Position posi +tioniert und dort werden alle Token zu dieser y-Position ausgegeben. Die Ausgabe +eines Tokens erfolgt in der folgenden Reihenfolge:  +  +  -  der Schrifttyp wird eingeschaltet,  +  -  die Modifikationen für den Zwischenraum werden eingeschaltet,  +  -  der Positionsbefehl für horizontale Bewegungen wird gegeben,  +  -  die Modifikationen für den Text werden eingeschaltet,  +  -  der Text wird ausgegeben.  +  +Die ersten vier Punkte werden nur dann ausgeführt, wenn sie notwendig sind. Über +schreitet der Text die Papierbreite, so zeigen Punkte am Ende der Zeile dies an. + diff --git a/doc/system-manual/1.8.7/doc/systemhandbuch.4 b/doc/system-manual/1.8.7/doc/systemhandbuch.4 new file mode 100644 index 0000000..e511eb5 --- /dev/null +++ b/doc/system-manual/1.8.7/doc/systemhandbuch.4 @@ -0,0 +1,1185 @@ +#start(2.5,1.5)#  +#pageblock#  +#block#  +#page (91)#  +#headeven#  +%#center#EUMEL-Systemhandbuch  +  +  +#end#  +#headodd#  +#center#7. Der Fontspeicher#right#%  +  +  +#end#  +  +#ib(9)#7. Der #ib#Fontspeicher#ie##ie(9)#  +  +  +  +#ib(9)#7.1. #ib#Fonttabellen#ie##ie(9)#  +  +  +Damit die Textverarbeitung Dokumente formatieren kann, muß sie über Breiten und +Höhen der einzelnen Schrifttypen (auch "#ib#Fonts#ie#" genannt) des Druckers, auf dem das +Dokument gedruckt wird, Bescheid wissen. Auch bei dem Ausdruck des Dokuments +wird diese Information benötigt. Im EUMEL-System stellt der #ib#Fontspeicher#ie# diese Infor +mation den #ib#Formatierprogramm#ie#en (#on("i")#lineform#off("i")# und #on("i")#pageform#off("i")#) und dem #ib#EUMEL-Drucker#ie# +zur Verfügung.  +  +Da nun der Drucker Angaben zur Positionierung in seinen #ib#Mikroschritten#ie# (kleinste +Schrittweite in horizontaler oder vertikalter Richtung) benötigt, liefert die Fonttabelle +die Breiten- und Höhenangaben in Mikroschritten und eine Umrechnungseinheit von +Schritten in Zentimeter oder umgekehrt. So braucht der EUMEL-Drucker bei Positionie +rungen keine Umrechnung vorzunehmen. Allerdings müssen die Formatierprogramme +auch in Mikroschritten des jeweiligen Druckers rechnen. Dadurch werden jedoch +Unterschiede durch Rundungsfehler zwischen dem EUMEL-Drucker und den Forma +tierprogrammen vermieden.  +  +Bei diesem Konzept können Fonts von verschiedenen Druckern nicht in einer Fontta +belle verwaltet werden, denn unterschiedliche Drucker haben meist verschiedene +Mikroschritte. Somit muß es für jeden Drucker mindestens eine Fonttabelle geben.  +  +Es gibt aber auch Fälle, in denen Fonts auf einem Drucker nicht mit anderen Fonts des +Druckers zusammengedruckt werden können. Solche Fälle liegen z.B. bei Typenrad +druckern vor, die immer nur mit einem Typenrad drucken können und dessen Zei +chenbreite hardwaremäßig eingestellt werden muß (z.B. beim Olivetti PR320), bei +Druckern, die verschiedene Fonts für Längs- und Querformat haben (z.B. beim Agfa +P400), oder bei Druckern, deren Fonts geladen werden (z.B. beim HP 2686). Eine +#on("b")##ib#Fonttabelle#ie##off("b")# enthält also alle die Fonts eines Druckers, #on("b")#die auf dem Drucker kompati +bel sind#off("b")#. Es kann mehrere Fonttabellen zu einem Drucker geben.  +  +Die verschiedenen Fonttabellen werden von im Multi-User Betrieb von der Task "#ib#confi +gurator#ie#" verwaltet. Sie enthält alle Fonttabellen, die auf dem Rechner zur Verfügung +stehen. Mit dem Kommando  +  +  +  #ib#fonttable#ie# ("Name der Fonttabelle")  +  +  +wird in einer Task die gewünschte Fonttabelle eingestellt. Danach stehen die Fonts +dieser Tabelle in der Task zur Verfügung. Die Einstellung der Fonttabelle vererbt sich +auf die Sohntasks, d.h. wird eine Sohntask begonnen, so ist dort die Fonttabelle des +Vaters eingestellt.  +  +Dazu das folgenden Beispiel:  +  +    Für den Agfa-Drucker P400 gibt es die Fonttabellen "agfa" und "agfaquer", in +    denen die Fonts für Längsdruck bzw. Querdruck enthalten sind. In der Task +    #on("i")#PUBLIC#off("i")# wird mit dem Kommando #on("i")#fonttable ("agfa")#off("i")# die Fonttabelle "agfa" ein +    gestellt. Alle neuen Sohntasks können sofort ohne weitere Einstellung mit der +    Textformatierung im Längsformat beginnen. Will nun jemand im Querformat +    drucken, so muß er in seiner Task mit dem Kommando #on("i")#fonttable ("agfaquer")#off("i")# den +    Fontspeicher auf die Fonts zum Querdruck umstellen.  +  +Das Kommando  +  +  +  #ib#list fonts#ie#  +  +  +listet die Fonts der eingestellten Fontabelle ins #on("i")#notebook#off("i")# und das Kommando  +  +  +  #ib#list fonttables#ie#  +  +  +informiert über die verfügbaren Fonttabellen.  +  +  +  +  +#ib(9)#7.2. Erstellen einer #ib#Fonttabelle#ie##ie(9)#  +  +  +Die Fonttabelle ist ein Datenraum mit einer eigenen Struktur. Somit kann sie nicht +mehr mit dem Editor, sondern nur mit einem entsprechenden Programm bearbeitet +werden. Solch ein Programm befindet sich in der Datei "#ib#font convertor#ie#" auf dem Stan +dardarchiv 'std.zusatz'. Diese Datei sollte in einer Systemtask (Sohntask von "SYSUR") +insertiert werden. Danach stehen entsprechende Kommandos zur Bearbeitung einer +Fonttabelle zur Verfügung.  +  +Um eine Fonttabelle zu bekommen, muß zuerst eine #on("b")##ib#Fontdatei#ie##off("b")# (d.h. eine editierbare +Datei mit dem unten beschriebenen Aufbau) angelegt werden. Mit dem Kommando  +  +  +  #ib#create fonttable#ie# ("Name der Fontdatei")  +  +  +werden alle in der Fontdatei spezifizierten Fonttabellen erstellt. Sie liegen als benannte +Datenräume in der Task vor und können mit dem Kommando #on("i")#save#off("i")# von einer System +task an die Task "configurator" gesendet werden. Danach sind diese Fonttabellen in +allen Task auf dem Rechner verfügbar und können mit dem #on("i")#fonttable#off("i")# - Kommando +eingestellt werden.  +  +Soll dagegen eine bestehende Fonttabelle geändert werden, so erstellt das Komman +do  +  +  +  #ib#create fontfile#ie# ("Name der Fonttabelle", "Name der Fontdatei")  +  +  +aus der angegebenen Fonttabelle eine Fontdatei. Die Fonttabelle muß dazu in der Task +als benannter Datenraum vorliegen (d.h. sie muß eventuell mit #on("i")#fetch#off("i")# von der Task +"configurator" geholt werden). In der so erstellten Fontdatei können die Änderungen +mit dem Editor vorgenommen, mit #on("i")#create fonttable#off("i")# die geänderte Fonttabelle erstellt +und diese wiederum mit #on("i")#save#off("i")# an die Task "configurator" gesendet werden. Mit dem +#on("i")#fonttable#off("i")#-Kommando kann dann in den bestehenden Tasks die geänderte Fonttabelle +eingestellt werden. Alle neuen Tasks erhalten automatisch die geänderte Fonttabelle.  +  +  +  +#ib(9)#Prozedurbeschreibung der Umwand  +lungsKommandos#ie(9)#  +  +  +Nach der Insertierung der Datei "font convertor" stehen die folgenden Kommandos zur +Umwandlung einer Fontdatei in eine Fonttabelle oder umgekehrt zur Verfügung.  +  +#ib#create fontfile#ie#  +     PROC create fontfile (TEXT CONST fonttable name, fontfile name)  +     Zweck:  Aus Fonttabelle 'fonttable name' wird eine Fontdatei mit dem ange +             gebenen Name erstellt. Die Fonttabelle muß dabei in der eigenen Task +             als benannter Datenraum vorliegen.  +  +#ib#create fonttable#ie#  +     PROC create fonttable (TEXT CONST fontfile name)  +     Zweck:  Es werden alle Fonttabellen erzeugt, die in der Fontdatei 'fontfile name' +             angegeben sind. Die Fonttabellen liegen dann als benannte Datenräu +             me in der Task vor.  +  +     PROC create fonttable  +     Zweck:  Es werden alle Fonttabellen erzeugt, die in der zuletzt bearbeiteten +             Datei angegeben sind.  +  +  +  +  +#ib(9)#7.3. Aufbau der #ib#Fontdatei#ie##ie(9)#  +  +  +In der Fontdatei können drei Strukturen stehen und zwar Kennungen, Identifkationen +und Zeichenspezifikationen.#u##count#)#e#  +#foot#  +  +#value#) Beim formalen Aufbau bedeuten eckige Klammern, daß diese Angaben optional sind.  +  +#end#  +  +  +  +#ib(9)##ib#Kennungen#ie##ie(9)#  +  +  +    Formaler Aufbau:  <#on("i")#Kennung#off("i")#>  :  Name 1  [,  Name 2]  [ ... ] ;  +  +    Eine Kennung leitet eine Definition ein. Für die Namen der Namensliste gelten die +    folgenden Konventionen:  +  +     -  der Name muß als TEXT-Denoter angegeben werden,  +     -  der Name muß ungleich #on("i")#niltext#off("i")# sein,  +     -  Leerzeichen sind im Namen nicht signifikant (d.h. "agfa quer" wird zu "agfa +        quer").  +  +    Eine Kennung kann die folgenden Werte annehmen:  +  +    <#on("i")#Kennung#off("i")#>       { FONTTABLE, FONT }  +  +    - #on("b")##ib#FONTTABLE#ie##off("b")#  +        Hiermit wird eine Definition einer Fonttabelle eingeleitet. Es wird nur der erste +        Name der Namensliste ausgewertet, da die Fonttabelle eindeutig identifiziert +        sein muß. Alle folgenden Angaben werden dieser Fonttabelle zugeordnet, bis +        eine neue Kennung FONTTABLE folgt.  +  +    - #on("b")##ib#FONT#ie##off("b")#  +        Hiermit wird eine Definition eines Schrifttyps eingeleitet. Ein Schrifttyp kann +        mehrere Namen haben. Jedoch darf in einer Fonttabelle jeder Fontname nur +        einem Font zugeordnet werden.  +  +  +  +#ib(9)##ib#Identifikation#ie#en#ie(9)#  +  +  +    Formaler Aufbau: [ <#on("i")#Identifikation#off("i")#>  =  <Wert der Identifikation> ; ]  +  +    Mit den Identifikationen werden bestimmte Angaben zu den Kennungen gemacht. +    Sie müssen unmittelbar nach der entsprechenden Kennung folgen, brauchen aber +    nur angegeben werden, wenn sie von den Standardwerten abweichen.  +  +  +  +#ib(9)#Identifikationen nach der Kennung #ib#FONTTABLE#ie##ie(9)#  +  +  +    <#on("i")#Identifikation#off("i")#>       { x unit, y unit, on string, off string }  +  +    - #on("b")##ib#x unit#ie##off("b")#  +        Hiermit wird die Anzahl der Mikroschritte des Druckers pro Zentimeter in +        horizontaler (x-) Richtung spezifiziert. Die Einheit muß als REAL-Denoter +        angegeben werden. Alle weiteren Breitenangaben zu den Fonts dieses Druk +        kers beziehen sich auf diese Einheit.  +  +        STD-Wert:    10.0 / 2.54  =  3.937008  +  +    - #on("b")##ib#y unit#ie##off("b")#  +        Hiermit wird die Anzahl der Mikroschritte des Druckers pro Zentimeter in +        vertikaler (y-) Richtung spezifiziert. Die Einheit muß als REAL-Denoter ange +        geben werden. Alle weiteren Höhenangaben zu den Fonts dieses Druckers +        beziehen sich auf diese Einheit.  +  +        STD-Wert:     6.0 / 2.54  =  2.362205  +  +    - #on("b")##ib#on string#ie##off("b")#  +        Hier müssen vier Textdenoter, durch Komma getrennt, angegeben werden. +        Die Textdenoter enthalten die Befehlssequenzen, um beim Drucker die Mo +        difikationen anzuschalten. Dabei ist die Reihenfolge der Modifikationen  +            underline,   bold,   italics,   reverse.  +        Liegt für eine der Modifikationen keine Befehlssequenz vor, so muß #on("i")#niltext#off("i")# +        angegeben werden. Die Befehlssequenzen können vom Druckertreiber ab +        gefragt werden.  +  +        STD-Wert:    #on("i")#niltext#off("i")# für alle Modifikationen  +  +    - #on("b")##ib#off string#ie##off("b")#  +        Hier müssen vier Textdenoter, durch Komma getrennt, angegeben werden. +        Die Textdenoter enthalten die Befehlssequenzen, um beim Drucker die Mo +        difikationen auszuschalten. Dabei ist die Reihenfolge der Modifikationen  +            underline,   bold,   italics,   reverse.  +        Liegt für eine der Modifikationen keine Befehlssequenz vor, so muß #on("i")#niltext#off("i")# +        angegeben werden. Die Befehlssequenzen können vom Druckertreiber ab +        gefragt werden.  +  +        STD-Wert:    #on("i")#niltext#off("i")# für alle Modifikationen  +  +  +  +#ib(9)#Identifikationen nach der Kennung #ib#FONT#ie##ie(9)#  +  +  +    <#on("i")#Identifikation#off("i")#>       {  font lead, font height, font depth, indentation pitch,  +                               next larger font, next smaller font,  +                               font string, y offsets, bold offset   }  +  +    - #on("b")##ib#font lead#ie##off("b")##u##count#)#e#  +        Der Durchschuß eines Fonts gibt den Zwischenraum in vertikaler Richtung +        zwischen den Zeilen bei einfachem Zeilenvorschub an. Er muß in Mikroschrit +        ten der y-Richtung als INT-Denoter angegeben werden.  +  +        STD-Wert:    0  +#foot#  +  +#value#) Für spätere Erweiterungen des EUMEL-Druckers wurde die bisherige Fonthöhe in Durchschuß, Fonthöhe +   und Fonttiefe aufgespalten. Für alle bis jetzt definierten Leistungen braucht nur wie bisher die Fonthöhe +   angegeben zu werden. Der Durchschuß und die Fonttiefe werden dann auf Null gesetzt.  +#end#  +  +    - #on("b")##ib#font height#ie##off("b")##u##value#)#e#  +        Die Fonthöhe ist die Distanz von der Basislinie bis zur Oberkante des höch +        sten Zeichens. Sie muß in Mikroschritten der y-Richtung als INT-Denoter +        angegeben werden.  +  +        STD-Wert:    6 Zeilen pro Inch entsprechend der definierten #on("i")#y unit#off("i")#  +  +    - #on("b")##ib#font depth#ie##off("b")##u##value#)#e#  +        Die Fonttiefe ist die Distanz von der Basislinie bis zur Unterkante des tief +        sten Zeichens. Sie muß in Mikroschritten der y-Richtung als INT-Denoter +        angegeben werden.  +  +        STD-Wert:    0  +  +    - #on("b")##ib#indentation pitch#ie##off("b")#  +        Einrückungen oder Aufzählungen werden äquidistant berechnet, d.h. Anzahl +        der Zeichen mal einer festen Breite. Diese Einrückbreite sollte ein Mittel al +        ler Zeichenbreiten sein und braucht nicht der Breite des Leerzeichens zu +        entsprechen. Sie muß in Mikroschritten der x-Richtung als INT-Denoter an +        gegeben werden.  +  +        STD-Wert:    10 Zeichen pro Inch entsprechend der definierten #on("i")#x unit#off("i")#  +  +    - #on("b")##ib#next larger font#ie##off("b")#  +        Hier muß der Name des nächst größeren Fonts als TEXT-Denoter aufgeführt +        werden. Gibt es keinen nächst größeren Font, so ist #on("i")#niltext#off("i")# anzugeben.  +  +        STD-Wert:    #on("i")#niltext#off("i")#  +  +    - #on("b")##ib#next smaller font#ie##off("b")#  +        Hier muß der Name des nächst kleineren Fonts als TEXT-Denoter aufge +        führt werden. Gibt es keinen nächst kleineren Font, so ist #on("i")#niltext#off("i")# anzugeben. +        Bei Indizes oder Exponenten wird automatisch auf diesen nächst kleineren +        Font umgeschaltet.  +  +        STD-Wert:    #on("i")#niltext#off("i")#  +  +  +    - #on("b")##ib#font string#ie##off("b")#  +        Hier kann als TEXT-Denoter eine Befehlssequenz angegeben werden, die +        den Drucker auf diesen Font umschaltet. Diese Befehlssequenz kann vom +        Druckertreiber abgefragt werden. Dadurch ist es nicht nötig, daß er die Na +        men der Fonts kennt.  +  +        STD-Wert:    #on("i")#niltext#off("i")#  +  +    - #on("b")##ib#y offsets#ie##off("b")#  +        Um bei Matrixdruckern Schriften zu erzeugen, die höher als eine Nadelreihe +        sind, müssen entsprechende Bitmuster des Textes an verschiedenen y-Po +        sitionen ausgegeben werden. Um diese Anforderung durch den EUMEL- +        Drucker zu unterstützen, kann hier eine Liste von Verschiebungen von der +        Basislinie angegeben werden, an denen der Text ein weiteres Mal ausgege +        ben wird. Dabei bedeuten negative Werte eine Verschiebung oberhalb und +        positive Werte eine Verschiebung unterhalb der Basislinie. Ist der Wert Null, +        so wird der Text auf der Basislinie ausgegeben. Die Modifikation #on("i")#underline#off("i")# +        wird bei der Ausgabe des Textes nur an der ersten Verschiebung angestellt. +        Die Werte für die Verschiebungen müssen in Mikroschritten der y-Richtung +        als INT-Denoter angegeben und durch Komma getrennt werden.  +  +        STD-Wert:    0  +  +    - #on("b")##ib#bold offset#ie##off("b")#  +        Falls der Drucker die Modifikation #on("i")#bold#off("i")# nicht beherrscht, versucht der +        EUMEL-Drucker sie durch Doppeldruck zu simulieren. Der 'bold offset' gibt +        an, ob und wieviel der zweite Durchgang in x-Richtung verschoben werden +        soll. Dies ergibt insbesondere bei Laserdruckern, die nicht für alle Schriftty +        pen einen Bold-Typ haben, einen recht guten Fettdruck. Der Wert muß in +        Mikroschritten der x-Richtung als INT-Denoter angegeben werden.  +  +        STD-Wert:    0  +  +  +  +#ib(9)##ib#Zeichenspezifikationen#ie##ie(9)#  +  +  +  +   Formaler Aufbau:   [ <Zeichen>  [,  <Breite des Zeichens>]  +                                   [,  <Ersatzdarstellung des Zeichens>] ; ]  +  +  +   Nachdem die Identifikationen zu einer Kennung angegeben wurden, können Zei +   chenspezifikationen folgen, d.h. zu einem Zeichen kann die Breite und/oder eine +   Ersatzdarstellung spezifiziert werden. Dazu muß zuerst das Zeichen selber als +   TEXT-Denoter angegeben werden.  +  +   - #on("b")##ib#Breite des Zeichens#ie##off("b")#  +       Die Zeichenbreite muß als INT-Denoter in Mikroschritten angegeben werden. +       Alle Zeichenbreiten werden mit der Einrückbreite vorbesetzt, so daß nur sol +       che Zeichen angegeben werden müssen, deren Breite von der Einrückbreite +       abweichen. Negative Zeichenbreiten sind nicht erlaubt. Die Angabe von Zei +       chenbreiten nach der Kennung FONTTABLE wird ignoriert.  +  +   - #on("b")##ib#Ersatzdarstellung des Zeichens#ie##off("b")#  +       Die Ersatzdarstellung wird statt des Zeichens ausgedruckt. Sie muß als +       TEXT-Denoter angegeben werden. Werden Ersatzdarstellungen nach der +       Kennung FONTTABLE angegeben, so gelten sie global für alle Fonts dieser +       Fonttabelle. Sie können jedoch bei der Fontangabe lokal wieder überschrie +       ben werden. Eine Ersatzdarstellung darf höchsten 255 Zeichen lang sein. Alle +       Ersatzdarstellungen eines Fonts dürfen 32767 Zeichen nicht überschreiten.  +  +  +  +#ib(9)##ib#Kommentare in der Fontdatei#ie##ie(9)#  +  +  +   In der Fontdatei dürfen Kommentare eingefügt werden. Sie müssen den Kommen +   taren der ELAN-Syntax entsprechen, d.h. mit '(*' beginnen und mit '*)' enden.  +  +  +  +#ib(9)##ib#Deutsche Namen#ie##ie(9)#  +  +  +   Kennungen und Identifikationen dürfen in der Fontdatei auch mit folgenden deut +   schen Namen angegeben werden.  +  +       FONTABLE            :   FONTABELLE  +       FONT                :   FONT  +  +#free (0.15)#  +       x unit              :   x einheit  +       y unit              :   y einheit  +       on string           :   on sequenz  +       off string          :   off sequenz  +       indentation pitch   :   einrueckbreite  +       font lead           :   durchschuss  +       font height         :   fonthoehe  +       font depth          :   fonttiefe  +       next larger font    :   groesserer font  +       next smaller font   :   kleinerer font  +       font string         :   font sequenz  +       y offsets           :   y verschiebungen  +       bold offset         :   bold verschiebung  +  +  +  +  +#ib(9)#7.4. Beispiel für eine Fontdatei#ie(9)#  +  +  +In diesem Beispiel einer Fonttdatei sind drei Fonttabellen enthalten, nämlich "agfa" und +"agfaquer" für den Agfa-Drucker und "epson" für einen Epson-Drucker.  +  +  +FONTTABLE  :  "agfa" ;  +  x unit      =  160.0 ;                 #right#(* Anzahl der Mikroschritte pro cm *)  +  y unit      =  160.0 ;  +  on string   =  "\UL1;",  "\BO1;",  "\IT1;",  "\CFW;\CBB;" ;  +  off string  =  "\UL0;",  "\BO0;",  "\IT0;",  "\CFT;\CBT;" ;  +  +#right#(* globale Ersatzdarstellungen für alle Agfa-Fonts *)  +  +  ""214"" ,   "\!298;" ;                       #right#(* AE *)  +  ""215"" ,   "\!299;" ;                       #right#(* OE *)  +  ""216"" ,   "\!300;" ;                       #right#(* UE *)  +  ""217"" ,   "\!451;" ;                       #right#(* ae *)  +  ""218"" ,   "\!452;" ;                       #right#(* oe *)  +  ""219"" ,   "\!453;" ;                       #right#(* ue *)  +  .  +  .  +  .  +  +  FONT  :  "trium10" ;  +    indentation pitch   =  30 ;  +    font lead           =  7 ;  +    font heigth         =  54 ;  +    font depth          =  15 ;  +    next larger font    =  "trium12" ;  +    next smaller font   =  "helvetica8" ;  +    font string         =  "\FO5;" ;  +  +    " "     ,    20 ;           "!"  ,      16 ;  +    """"    ,    22 ;           "\#"  ,      31 ;  +    "$"     ,    31 ;           "%"  ,      55 ;  +    .  +    .  +    .  +    ""217"" ,    31 ;                          #right#(* ae          *)  +  +#right#(* lokale Ersatzdarstellungen für Font "trium10" *)  +  +    ""244"" ,    43 ,   "\FO23;\!725;\FO5;" ;  #right#(* ungleich    *)  +    ""245"" ,    31 ,   "\FO23;\!405;\FO5;" ;  #right#(* mal-Zeichen *)  +  +  FONT  :  "modern12",  "elanlist" ;    #right#(* Mehrere Namen für einen Font *)  +    indentation pitch  =  33 ;  +    font lead          =  14;  +    font heigth        =  53;  +    font depth         =  13;  +    next larger font   =  "" ;  +    next smaller font  =  "micro" ;  +    font string        =  "\FO11;"  +                                        #right#(* Alle Zeichen haben die gleiche Breite *)  +  +  FONT . . .  +  +  +FONTTABLE  :  "agfaquer" ;  +  x unit      =  160.0 ;  +  y unit      =  160.0 ;  +  on string   =  "\UL1;",  "\BO1;",  "\IT1;",  "\CFW;\CBB;" ;  +  off string  =  "\UL0;",  "\BO0;",  "\IT0;",  "\CFT;\CBT;" ;  +  .  +  .  +  .  +  +  +FONTTABLE  :  "epson" ;  +  x unit      =  47.24409 ;                    #right#(* 120.0 / 2.54 *)  +  y unit      =  85.03937 ;                    #right#(* 216.0 / 2.54 *)  +  on string   =  ""27"-"1"",  "",  ""27"4",  "";  +  off string  =  ""27"-"0"",  "",  ""27"5",  "";  +  +  ""214"" ,   ""27"R"2""091""27"R"0"" ;        #right#(* AE                           *)  +  ""215"" ,   ""27"R"2""092""27"R"0"" ;        #right#(* OE                           *)  +  ""216"" ,   ""27"R"2""093""27"R"0"" ;        #right#(* UE                           *)  +  ""217"" ,   ""27"R"2""123""27"R"0"" ;        #right#(* ae                           *)  +  ""218"" ,   ""27"R"2""124""27"R"0"" ;        #right#(* oe                           *)  +  ""219"" ,   ""27"R"2""125""27"R"0"" ;        #right#(* ue                           *)  +  ""220"" ,   "k" ;                            #right#(* Trenn-k                      *)  +  ""221"" ,   "-" ;                            #right#(* Trennstrich                  *)  +  ""222"" ,   "\#" ;                            #right#(* geschütztes Nummernkreuz     *)  +  ""223"" ,   " " ;                            #right#(* geschütztes Leerzeichen      *)  +  ""251"" ,   ""27"R"2""126""27"R"0"" ;        #right#(* ss                           *)  +  ""252"" ,   ""27"R"2""064""27"R"0"" ;        #right#(* Paragraph                    *)  +  +  FONT  :  "12",  "elite",  "elite12" ;        #right#(* Mehrere Namen für einen Font *)  +    font height        =  36 ;  +    indentation pitch  =  10 ;  +    next smaller font  =  "12.klein" ;  +    font string        =  ""27"!"1""27"p"0""27"T" ;  +    bold offset        =  2 ;  +  +  FONT  :  "12.klein",  "elite.klein",  "elanlist" ;  +    font height         =  20 ;  +    indentation pitch   =  10 ;  +    next smaller font   =  "12.klein" ;  +    font string         =  ""27"!"1""27"p"0""27"S"1"" ;  +    bold offset         =  1 ;  +  +  FONT  :  "12.hoch" ;  +    font height         =  96 ;  +    indentation pitch   =  10 ;  +    next smaller font   =  "12.klein" ;  +    font string         =  "" ;  +    bold offset         =  2 ;  +    y offsets           =  12, -12 ;#right#(* der Text wird jeweils 12 Mikroschritte unter-     +                                    #right#   und überhalb der Basislinie ausgegeben *)  +  +  FONT  :  "prop10",  "prop" ;  +    font height         =  12 ;  +    indentation pitch   =  24 ;  +    next smaller font   =  "" ;  +    font string         =  ""27"!"0""27"p"1""27"T" ;  +    bold offset         =  2 ;  +  +    "!"   ,   10 ;  +    """"  ,   16 ;  +    "("   ,   12 ;  +    . . .  +  +  +  +  +  +#ib(9)#7.5. Schnittstelle des #ib#Fontspeicher#ie#s#ie(9)#  +  +  +  +Das Paket #on("i")#font store#off("i")# liefert die folgenden Prozeduren:  +  +#ib#fonttable#ie#  +     PROC fonttable (TEXT CONST fonttable name)  +     Zweck:  Stellt die angegebene Fonttabelle in der Task ein. Dabei wird zuerst in +             der eigenen Task nach der angegebenen Fonttabelle gesucht. Existiert +             die Fonttabelle in der eigenen Task nicht, so wird die Fonttabelle von +             der Task "configurator" geholt.  +             Wenn die Fonttabelle eingestellt ist, sind in der Task nur noch die Fonts +             dieser Fonttabelle bekannt. Die Einstellung vererbt sich auf die Sohn +             tasks.  +  +     TEXT PROC fonttable  +     Zweck:  Liefert den Name der eingestellten Fonttabelle.  +  +#ib#list fonttables#ie#  +     PROC list fonttables  +     Zweck:  Zeigt die Liste der verfügbaren Fonttabellen im #on("i")#notebook#off("i")#.  +  +#ib#list fonts#ie#  +     PROC list fonts  +     Zweck:  Listet die Fonts der eingestellten Tabelle ins #on("i")#notebook#off("i")#.  +  +     PROC list fonts (TEXT CONST fonttable name)  +     Zweck:  Listet die Fonts der angegebenen Fonttabelle ins #on("i")#notebook#off("i")#. Die vorher +             eingestellte Fonttabelle bleibt jedoch weiter eingestellt.  +  +#ib#x step conversion#ie#  +     INT PROC x step conversion (REAL CONST cm)  +     Zweck:  Rechnet die in Zentimeter angegebene Länge in Mikroschritte der +             x-Richtung um.  +  +     REAL PROC x step conversion (INT CONST steps)  +     Zweck:  Rechnet die in Mikroschritten der x-Richtung angegebene Länge in +             Zentimeter um.  +  +#ib#y step conversion#ie#  +     INT PROC y step conversion (REAL CONST cm)  +     Zweck:  Rechnet die in Zentimeter angegebene Länge in Mikroschritte der +             y-Richtung um.  +  +     REAL PROC y step conversion (INT CONST steps)  +     Zweck:  Rechnet die in Mikroschritten der y-Richtung angegebene Länge in +             Zentimeter um.  +  +#ib#on string#ie#  +     TEXT PROC on string (INT CONST modification)  +     Zweck:  Liefert die in der Fonttabelle spezifizierte Befehlssequenz, um eine +             Modifikation anzuschalten. Es gibt die folgenden Modifikationen  +                   1     underline  +                   2     bold  +                   4     italics  +                   8     reverse  +  +#ib#off string#ie#  +     TEXT PROC off string (INT CONST modification)  +     Zweck:  Liefert die in der Fonttabelle spezifizierte Befehlssequenz, um eine +             Modifikation auszuschalten. Es gibt die folgenden Modifikationen  +                   1     underline  +                   2     bold  +                   4     italics  +                   8     reverse  +  +#ib#font#ie#  +     INT PROC font (TEXT CONST font name)  +     Zweck:  Liefert die interne Fontnummer des Fonts. Mit dieser Fontnummer +             können die weiteren Informationen über den Font angefordert werden. +             Existiert kein Font mit diesem Namen, so wird Null geliefert.  +  +     TEXT PROC font (TEXT CONST font nr)  +     Zweck:  Liefert den Fontnamen des Fonts mit der angegeben Fontnummer. Hat +             der Font mehrere Namen, so wird der erste Name der Namensliste aus +             der Fontdatei geliefert. Existiert kein Font unter dieser Nummer, so wird +             #on("i")#niltext#off("i")# geliefert.  +  +#ib#font exists#ie#  +     BOOL PROC font exists (TEXT CONST font name)  +     Zweck:  Informationsprozedur zur Abfrage der Existenz eines Fonts.  +  +#ib#next smaller font exists#ie#  +     BOOL PROC next smaller font exists  (INT CONST font nr,  +                                          INT VAR next smaller font)  +     Zweck:  Informationsprozedur zur Abfrage der Existenz des nächst kleineren +             Fonts. Wenn er existiert, wird die Fontnummer dieses Fonts zurück +             geliefert.  +  +#ib#next larger font exists#ie#  +     BOOL PROC next larger font exists  (INT CONST font nr,  +                                         INT VAR next larger font)  +     Zweck:  Informationsprozedur zur Abfrage der Existenz des nächst größeren +             Fonts. Wenn er existiert, wird die Fontnummer dieses Fonts zurück +             geliefert.  +  +#ib#indentation pitch#ie#  +     INT PROC indentation pitch (INT CONST font nr)  +     Zweck:  Liefert die Einrückbreite in Mikroschritten der x-Richtung. Sie sollte eine +             mittlere Breite der Zeichen sein, denn mit ihr werden die Einrückungen +             und Aufzählungen berechnet.  +  +#ib#font lead#ie#  +     INT PROC font lead (INT CONST font nr)  +     Zweck:  Liefert den Durchschuss des Fonts in Mikroschritten der y-Richtung. +             Der Druchschuß ist der Zwischenraum zwischen den einzelnen Zeilen +             bei einfachem Zeilenvorschub.  +  +#ib#font height#ie#  +     INT PROC font height (INT CONST font nr)  +     Zweck:  Liefert die Höhe des Fonts in Mikroschritten der y-Richtung. Die Fon +             thöhe ist die Distanz von der Basislinie bis zur Oberkante des höchsten +             Zeichens.  +  +#ib#font depth#ie#  +     INT PROC font depth (INT CONST font nr)  +     Zweck:  Liefert die Tiefe des Fonts in Mikroschritten der y-Richtung. Die Fonttie +             fe ist die Distanz von der Basislinie bis zur Unterkante des tiefsten +             Zeichens.  +  +#ib#font string#ie#  +     TEXT PROC font string (INT CONST font nr)  +     Zweck:  Liefert den Fontstring des Fonts. Der Fontstring enthält die Befehls +             sequenz, um den Drucker auf diesen Font umzuschalten.  +  +#ib#y offsets#ie#  +     TEXT PROC y offsets (INT CONST font nr)  +     Zweck:  Liefert einen Text mit den y-Verschiebungen von der Basislinie. Die +             einzelnen Verschiebungen können mit dem Operator 'ISUB' abgefragt +             werden.  +  +#ib#bold offsets#ie#  +     INT PROC bold offsets (INT CONST font nr)  +     Zweck:  Liefert die 'bold'-Verschiebung.  +  +#ib#char pitch#ie#  +     INT PROC char pitch (INT CONST font nr, TEXT CONST char)  +     Zweck:  Liefert die Breite des Zeichens in Mikroschritten der x-Richtung.  +  +#ib#replacement#ie#  +     TEXT PROC replacement (INT CONST font nr, TEXT CONST char)  +     Zweck:  Falls das Zeichen eine Ersatzdarstellung hat, so wird diese geliefert, +             anderfalls das Zeichen selbst.  +  +#ib#get font#ie#  +     PROC get font  (INT CONST font nr,  +                     INT VAR indentation pitch, font lead, font height, font depth,  +                     ROW 256 INT VAR pitch table)  +     Zweck:  Die Variablen liefern die entsprechenden Informantionen über den +             Font. Der Eintrag des Codewerts eines Zeichens plus eins in der Brei +             tentabelle liefert die Breite dieses Zeichens.  +  +#ib#get replacements#ie#  +     PROC get replacements  (INT CONST font nr,  +                             TEXT VAR replacements,  +                             ROW 256 INT VAR replacement table)  +     Zweck:  In der Fonttabelle kann für jedes Zeichen eine Ersatzdarstellung an +             gegeben werden. Diese Ersatzdarstellungen werden mit dieser Proze +             dur geliefert. Dabei stehen in der Textvariablen 'replacement' die ge +             samten Ersatzdarstellungen des Fonts. Die Ersatzdarstellungstabelle +             enthält Zeiger auf den Text der Ersatzdarstellungen. Die Ersatzdarstel +             lung eines Zeichnes bestimmt sich wie folgt:  +  +  +     ersatzdarstellung :  +       INT CONST wert := replacement table (code( zeichen ) + 1);  +       IF wert > 0  +          THEN INT CONST ende := wert + code (replacements SUB wert);  +               subtext (replacements, wert + 1, ende)  +          ELSE zeichen  +        FI.  +  +  +Bei den Prozeduren des Packets #on("i")#font store#off("i")# können die folgenden Fehlerfälle auftreten:  +  +     -  Fonttabelle noch nicht eingestellt  +          Es wurde noch keine Fonttabelle in der Task eingestellt.  +  +     -  Fonttabelle "fonttable name" gibt es nicht  +          Die angegebene Fonttabelle wurde weder in der eigenen Task, noch in der +          Task 'configurator' gefunden.  +  +     -  Font 'font nr' gibt es nicht  +          Unter der angegebenen Fontnummer gibt es in der eingestellten Font +          tabelle keinen Font. Speziell ist das für 'font nr' = 0 der Fall, falls ein Font +          name nicht gefunden wurde.  +  +     -  unzulaessige Modifikation  +          Die angegebene Modifikation ist ungleich 1, 2, 4 oder 8.  +#page#  +  +#headeven#  +  +%#center#EUMEL-Systemhandbuch  +  +  +#end#  +#headodd#  +  +#center#8. Verschiedenes#right#%  +  +  +#end#  +  +#ib(9)#8. Verschiedenes#ie(9)#  +  +  +  +  +#ib(9)#8.1. Der Spoolmanager#ie(9)#  +  +  +Der "#ib#Spoolmanager#ie#" verwaltet eine #ib#Warteschlange von Datenräumen#ie# (Dateien), die von +einem "#ib#Server#ie#" abgearbeitet werden sollen. Dabei puffert der Spoolmanager Dateien, +die von beliebigen Tasks geschickt werden können, in einer Warteschlange und gibt +sie der Reihe nach dem Server zur eigentlichen Verarbeitung. Ein typischer Einsatzfall +(aber nicht der einzige) für ein solches System ist der Druck von Dateien in Multi- +User-Systemen. Unabhängig davon, ob der Drucker gerade aktiv ist und wieviele +Dateien noch auf den Ausdruck warten, kann jeder seine Datei dem Druckerspool (in +der Regel die Task "PRINTER") senden und sofort danach weiterarbeiten.  +  +  +  +#ib(9)#Prozeduren des Spoolmanagers#ie(9)#  +  +  +Im privilegierten Ast des Taskbaumes (Söhne von "SYSUR"), stehen die folgenden +Prozeduren zur Einrichtung eines Spoolmanagers zur Verfügung.  +  +#ib#spool manager#ie#  +     PROC spool manager (PROC server, BOOL CONST with start)  +     Zweck: Die Task, in der die Prozedur aufgerufen wird, wird zum Spoolmanager. +            Wenn 'with start' auf TRUE  gesetzt ist, wird eine Server-Task als unbe +            nannter Sohn ("-") eingerichtet und mit der übergebenen 'PROC server' +            gestartet. Anderfalls muß der Spool durch den Benutzer mit Hilfe der +            Spoolkommandos (siehe dort) gestartet werden.  +  +     PROC spool manager (PROC server)  +     Zweck: Diese Prozedur ruft die Prozedur 'spool manager' mit 'with start' gleich +            TRUE auf.  +  +  +Mit Hilfe der folgenden Prozeduren kann der Spool eingestellt werden.  +  +#ib#station only#ie#  +     PROC station only (BOOL CONST flag)  +     Zweck: Wenn flag auf TRUE gesetzt ist, nimmt der Spooler nur Aufträge von +            Tasks der eigenen Station entgegen.  +            Voreinstellung: 'station only (FALSE)'.  +  +     BOOL PROC station only  +     Zweck: liefert TRUE, wenn der Spooler nur von der eigenen Station benutzt +            werden darf.  +  +#ib#spool duty#ie#  +     PROC spool duty (TEXT CONST duty)  +     Zweck: Mit dieser Prozedur kann ein Text im Spooler eingestellt werden, der die +            Aufgabe des Spoolers beschreibt. Dieser wird beim 'list' gemeldet.  +  +     TEXT PROC spool duty  +     Zweck: Liefert die eingestellte Text-Beschreibung der Aufgabe des Spools.  +  +#ib#spool control task#ie#  +     PROC spool control task (TASK CONST task)  +     Zweck: Diese Prozedur gibt der Task 'task' und ihrer Söhne die Berechtigung +            Spoolkommandos (z.B. 'stop' oder 'start') an den Spoolmanager zusen +            den. Dabei muß die Task auf derselben Station wie der Spool sein und +            in der Task muß die Datei "spool cmd", die sich auf dem Standardar +            chiv befindet, insertiert werden.  +            Wird "SUPERVISOR" als Spoolkontrolltask eingestellt, so können alle +            Tasks der Station, in denen die Datei "spool cmd" insertiert ist, die +            Spoolkommandos geben.  +  +     TASK PROC spool control task  +     Zweck: Liefert die Taskidentifikation der Spoolkontrolltask.  +  +#ib#server channel#ie#  +     PROC server channel (INT CONST channel)  +     Zweck: Mit Hilfe dieser Prozedur wird im Spoolmanager eine Kanalnummer +            eingestellt, die der Server mit der Prozedur 'server channel' abfragen +            kann.  +     Fehlerfall:  +            *  falsche Kanalangabe  +                 Der angegebene Kanal ist kleiner als 1 oder größerer als 32.  +  +     INT PROC serverchannel  +     Zweck: Liefert die Nummer des Kanals, der im Spool eingestellt ist.  +  +#on("b")#Anmerkung:#off("b")#  Soll im nicht-privilegierten Ast des Taskbaums (Söhne von "PUBLIC") ein +            Spool eingerichtet werden, so muß dort die Datei "spool manager", die +            sich auf dem Standardarchiv "std.zusatz" befindet, insertiert werden.  +  +  +  +  +#ib(9)##ib#Spoolkommandos#ie##ie(9)#  +  +  +Ein Spool kann zur Verwaltung der Warteschlange wie jede andere Task ans Termi +nal gekoppelt werden. Danach stehen die folgenden Spoolkommandos zur Verfügung. +Diese Kommandos sind keine Prozeduren, sondern werden nur interpretiert. Sie dürfen +also nur alleine eingegeben werden. Nach Beendigung der Verwaltungsaufgaben muß +der Spool mit dem Kommando 'break' verlassen werden, da sonst keine weiteren +Aufträge an den Spool gesendet werden können und auch die Warteschlange nicht +weiter abgearbeitet wird.  +  +#ib#stop#ie#  +     Zweck: Die Server-Task wird gelöscht und dadurch der Spool deaktiviert. Der +            Spool empfängt zwar noch weitere Aufträge und sortiert diese in die +            Warteschlange ein. Die Warteschlange wird aber nicht weiterabgearbei +            tet. Ein eventuell von der Server-Task belegter Kanal wird freigegeben.  +            Ist bei einem 'stop' noch ein Auftrag in Bearbeitung, so wird dieser +            Auftrag abrupt abgebrochen. Es wird jedoch angefragt, ob der Auftrag +            nochmal neu an die erste Stelle in der Warteschlange eingetragen wer +            den soll.  +            Ist ein Spool deaktiviert, so wird dies bei einem 'list' angezeigt,  +  +#ib#halt#ie#  +     Zweck: Der Spool deaktiviert sich nach Abarbeitung des Auftrags, der gerade +            bearbeitet wird. Bei einem 'list' wird dies vermerkt.  +  +#ib#start#ie#  +     Zweck: Der Spool wird aktiviert, indem eine neue Server-Task begonnen wird. Ist +            der Spool zuvor nicht gestoppt worden, so wird zuerst ein 'stop' durch +            geführt.  +            Wurde mit der Prozedur 'server channel' kein Kanal eingestellt, so wird +            die Warnung  +                  WARNUNG : Serverkanal nicht eingestellt  +            ausgeben. Der Spool wird trotzdem gestartet.  +  +start (kanal nummer)  +     Zweck: Vor dem Start des Spools wird zuerst mit der Prozedur 'server channel' +            der angegebene Kanal eingestellt.  +  +#ib#first#ie#  +     Zweck: Im Dialog kann ein Auftrag in der Warteschlange auf den ersten Platz +            vorgezogen werden.  +  +#ib#killer#ie#  +     Zweck: Im Dialog werden alle Aufträge der Warteschlange zum Löschen ange +            boten.  +  +#ib#list spool#ie#  +     Zweck: Der aktuelle Zustand des Spools und die Warteschlange werden geli +            stet.  +  +Ist nun eine Spoolkontrolltask eingestellt worden (siehe 'spool control task'), so muß in +ihr die Datei "spool cmd" insertiert werden. Danach stehen die folgenden Prozeduren +zur Verfügung.  +  +#ib#stop#ie#  +     PROC stop (TASK CONST spool)  +     Zweck: Dem Spool 'spool' wird ein 'stop' zugestellt, was den Spool deaktiviert. +            Wird noch ein Auftrag bearbeitet, so wird angefragt, ob dieser neu +            eingetragen werden soll.  +  +#ib#halt#ie#  +     PROC halt (TASK CONST spool)  +     Zweck: Dem Spool 'spool' wird ein 'halt' zugestellt, d.h der Spool deaktiviert +            sich nach Beendigung des aktuellen Auftrags.  +  +#ib#wait for halt#ie#  +     PROC wait for halt (TASK CONST spool)  +     Zweck: Dem Spool 'spool' wird ein 'halt' zugestellt. Die Task wartet jedoch auf +            eine Rückantwort, die ihr der Spool sendet, wenn er sich nach Been +            digung des aktuellen Auftrags deaktiviert hat.  +     Fehlerfall:  +            *  Task "task name" wartet schon auf halt  +               Die angegebene Task wartet schon auf eine Rückantwort des Spools +               'spool'.  +  +#ib#start#ie#  +     PROC start (TASK CONST spool)  +     Zweck: Dem Spool 'spool' wird ein 'start' zugestellt, wodurch der Spool sich +            aktiviert. War der Spool zuvor nicht deaktiviert, so wird er zuerst ge +            stoppt.  +  +#ib#first#ie#  +     PROC first (TASK CONST spool)  +     Zweck: Im Dialog kann einer der Aufträge in der Warteschlange des Spools +            'spool' auf den ersten Platz vorgezogen werden.  +  +#ib#killer#ie#  +     PROC killer (TASK CONST spool)  +     Zweck: Im Dialog werden die Aufträge der Warteschlange des Spools 'spool' +            zum Löschen angeboten.  +  +  +  +#ib(9)#Arbeitsweise des #ib#Servers#ie##ie(9)#  +  +  +Der Server wird vom Spoolmanager mit einer Prozedur gestartet, die die Abarbeitung +der Warteschlange vornimmt. Dabei muß diese Prozedur zuerst den Datenraum mit +dem 'fetch code' (= 11) holen. Danach kann der Server sich noch mit dem 'fetch +param code' (= 21) die Dateiparameter (Dateiname, Schreib- und Lesepaßwort, Sen +dername und Senderstation) abholen und mit der Bearbeitung des Auftrags beginnen.  +  +Beispiel:  +  +  +LET fetch code       = 11,  +    param fetch code = 21;  +BOUND STRUCT (TEXT name, write pass, read pass, sendername,  +              INT  senderstation ) VAR msg;  +DATASPACE VAR ds, param ds;  +INT VAR reply;  +  +spool manager (PROC server);  +  +PROC server :  +     disable stop;  +     continue (server channel);  +     REP forget (ds); ds := nilspace;  +         call (father, fetch code, ds, reply);  +         forget (param ds); param ds := nilspace;  +         call (father, param fetch code, param ds, reply);  +         msg := param ds;  +         execute spool;  +         IF is error THEN error treatment FI;  +    PER;  +END PROC server;  +  +PROC execute spool :  +     enable stop;  +     ...  +  +  +  +  +  +#ib(9)#Senden eines Auftrags an den Spool#ie(9)#  +  +  +Jede Task kann jedem Spool durch Aufruf von '#ib#save#ie#' eine Datei senden.  +  +Beispiel:  +  +  +   save ("datei name", task ("spool name"))  +  +  +Dieses 'save'-Kommando funktioniert zweiphasig. Dabei wird in der ersten Phase dem +Spool die Dateiparameter zugesendet. In der zweiten Phase folgt dann der Datenraum +selber. Bei Netzübertragung zu einem Spool ist dieses zweiphasige 'save' jedoch +nachteilig. Deshalb können Dateien vom Typ 'FILE' auch mit einem einphasigen 'save' +unter dem 'file save code' (= 22) an den Spool gesendet werden. Die #on("i")#'headline'#off("i")# dieser +Dateien muß jedoch dann auf eine bestimmte Art und Weise aufbereitet werden, so +daß sie die Dateiparameter enthält. Beim Aufbau der #on("i")#'headline'#off("i")# muß eine Information +muß mit dem Code 0 beginnen und dem Code 1 enden. Die Dateiparamter müssen +dann mit der folgenden Reihenfolge in die #on("i")#'headline'#off("i")# eingetragen werden.  +  +   -  Dateiname  +   -  Schreibepaßwort  +   -  Lesepaßwort  +   -  Name des Senders  +   -  Station des Senders  +  +Beispiel:  +  +  +...  +LET file save code = 22;  +DATASPACE VAR ds := old (file name);  +FILE VAR file := sequential file (input, ds);  +INT VAR reply;  +headline (file,    ""0"" + file name +  +                ""1""0"" + write password +  +                ""1""0"" + read password +  +                ""1""0"" + name (myself) +  +                ""1""0"" + text (station (myself)) + ""1"");  +call (spool task, file save code, ds, reply);  +...  +  +  +Der Spoolmanager setzt bei Dateien, die mit dem 'file save code' angeliefert werden +die #on("i")#'headline'#off("i")# wieder auf den Dateinamen.  +  +Den Benutzer stehen neben dem '#ib#save#ie#'-Kommando zur Übertragung einer Datei zum +Spool noch die folgenden Kommandos zur Verfügung.  +  +  +   save (ALL myself, task ("spool name"))  +   save (SOME myself, task ("spool name"))  +  +       übertragung aller bzw. einiger Dateien der eigenen Task zum Spool.  +  +  +   #ib#erase#ie# ("datei name", task ("spool name"))  +   erase (ALL task ("spool name"), task ("spool name"))  +  +       Löschen eines bzw. aller eigenen Aufträge in der Warteschlange des Spools  +  +  +   #ib#list#ie# (task ("spool name"))  +  +       Liste des Spools über den aktuellen Zustand und die Warteschlange.  +  +Existiert ein Spool "PRINTER", so gibt es noch die folgenden Befehle.  +  +  +   #ib#print#ie#  +   print ("datei name")  +   print (ALL myself)  +   print (SOME myself)  +  +       Sie entsprechen einem 'save' an die Task "PRINTER"  +  +  +   #ib#printer#ie#  +  +       Liefert den internen Taskbezeichner der Task "PRINTER", d.h. diese Proze +       dur entspricht dem Aufruf von 'task ("PRINTER")'.  +  +  +  +  +  +#ib(9)#8.2. #ib#Freie Kanäle#ie(9)##ie#  +  +  +Das Paket '#ib#free channel#ie#' ermöglicht in Multi-User-Systemen die Einrichtung freier +Kanäle. Freie Kanäle kann man zusätzlich zu dem Terminalkanal, der einem vom +Supervisor zugeordnet wurde, benutzen. Jeder freie Kanal wird durch eine (benannte) +Task - dem #ib#Kanalmanager#ie# - implementiert. Er wird danach mit dem Tasknamen ange +sprochen und kann von jeder Task belegt und wieder freigegeben werden. Während +einer Belegung können andere Tasks den Kanal nicht benutzen. Der Kanalmanager +koppelt sich für jede Belegung an den physikalischen Kanal an und gibt ihn danach +auch wieder frei. Ein physischer Kanal kann also im Wechsel von mehreren Kanalma +nagern oder einem Kanalmanager und "normalen" Tasks belegt werden.  +  +Das Paket 'free channel' muß beim Kanalmanager und allen Benutzern des Kanals +bzw. bei einem gemeinsamen Vater insertiert sein.  +  +  +#ib#FCHANNEL#ie#  +     Zweck: Der Datentyp FCHANNEL spezifiziert einen freien Kanal. Die Assoziie +            rung mit einem realen freien Kanal erfolgt mit der Prozedur 'free chan +            nel' und der Zuweisung ':=' (ähnlich wie beim Datentyp FILE).  +  +:=  +     OP := (FCHANNEL VAR dest, FCHANNEL CONST source)  +     Zweck: Zuweisung. Wird insbesondere bei der Assoziation (Assoziation: Verbin +            dung zwischen FCHANNEL VAR und Kanal) benötigt.  +  +#ib#close#ie#  +     PROC close (FCHANNEL VAR f)  +     Zweck: Der belegte FCHANNEL wird freigeben.  +  +     PROC close (TEXT CONST channel name)  +     Zweck: Der namentlich spezifizierte Kanal wird freigegeben.  +  +#ib#dialogue#ie#  +     PROC dialogue (FCHANNEL CONST f, TEXT CONST end of dialogue char)  +     Zweck: Der Terminalkanal wird direkt mit dem angegebenen freien Kanal ge +            koppelt. (Das Benutzerterminal wird "durchgeschaltet".) Eingaben am +            Terminal werden auf 'f' ausgegeben, auf 'f' ankommende Daten werden +            auf dem Benutzerterminal ausgegeben. Der Datenverkehr erfolgt im +            #ib#Vollduplexmodus#ie#, d.h. der Datenverkehr beider Richtungen läuft unab +            hängig voneinander parallel. Hiermit können Terminals dynamisch an +            andere Rechner gekoppelt werden. Der Dialogzustand wird durch Ein +            gabe des 'end of dialogue char' am Benutzerterminal beendet.  +  +#ib#fetch#ie#  +     PROC fetch (FCHANNEL VAR channel, TEXT CONST filename, controlchars)  +     Zweck: Die angegebene datei wird über den Kanal 'channel' eingelesen. Dabei +            besteht 'control chars' aus zwei bis vier Zeichen  +               (eof + eol + handshake + handshake prompt)  +            eof:  +                Dieses Zeichen wird als Dateiabschluß erwartet.  +            eol:  +                Dieses Zeichen wird als Zeilenende erwartet.  +            handshake, handshake prompt:  +                Falls 'handshake prompt <> "" ' ist, wird bei dem Empfang eines +                PromptZeichen eine Quittung (HandshakeZeichen) ausgegeben.  +  +#ib#free channel#ie#  +     FCHANNEL PROC free channel (TEXT CONST channel name)  +     Zweck: Der namentlich spezifizierte Kanal wird belegt und als FCHANNEL +            geliefert.  +     Fehlerfälle:  +          * task not existing  +          * channel not free  +  +     PROC free channel (INT CONST physical channel number)  +     Zweck: Installiert die eigene Task als Kanalmanager für den angegebenen +            physikalischen Kanal.  +  +#ib#in#ie#  +     PROC in (FCHANNEL CONST f, TEXT VAR response)  +     Zweck: Es werden die Daten geliefert, die seit dem letzten 'in'Aufruf bzw. seit +            der Assoziierung eingetroffenen Daten geliefert. Bei 'niltext' liegen keine +            Eingabedaten vor.  +  +#ib#open#ie#  +     PROC open (FCHANNEL VAR f)  +     Zweck: Der Kanal wird neu belegt. Die Assoziation erfolgt mit dem gleichen +            Kanal wie bei der letzten Assoziation.  +     Fehlerfälle:  +          * "task" gibt es nicht  +          * Kanal ist nicht frei  +  +#ib#out#ie#  +     PROC out (FCHANNEL VAR f, TEXT CONST message)  +     Zweck: Der übergebene Text wird auf dem Kanal 'f' ausgegeben.  +  +#ib#save#ie#  +     PROC save (FCHANNEL VAR f, TEXT CONST name, control chars)  +     Zweck: Die übergebene Datei muß eine Textdatei sein (Struktur eines FILEs +            haben). Sie wird komplett auf dem Kanal 'f' ausgegeben.  +            Dabei bestehen 'control chars' aus bis zu drei Zeichen:  +               (eof char + eol char + handshake option)  +            eof char:  +                Dieses Zeichen wird als Dateiabschluß geschickt.  +            eol char:  +                Dieses zeichen wird als Zeilenabschluß geschickt.  +            handshake option:  +                Falls die 'control chars' drei Zeichen umfassen, wird nach jeder +                Zeile auf das als drittes definierte HandshakeZeichen gewartet.  +  +Beispiele:  +  +  +  a) FCHANNEL VAR f := free channel ("otto") ;  +     TEXT VAR antwort ;  +     out (f, "hallo") ;  +     in (f, antwort) ;  +     put (antwort) ;  +     close (f) ;  +  +  b) open (f) ;  +     REP  +       out (f, "hallo ") ;  +       in (f, antwort)  +     UNTIL antwort <> "" PER ;  +     put (antwort) ;  +     close (f) ;  +  +  c) open (f) ;  +     dialogue (f, "§") ;  +     close (f)  + diff --git a/doc/system-manual/1.8.7/source-disk b/doc/system-manual/1.8.7/source-disk new file mode 100644 index 0000000..13e2021 --- /dev/null +++ b/doc/system-manual/1.8.7/source-disk @@ -0,0 +1 @@ +grundpaket/10_handbuecher.2.img | 
