summaryrefslogtreecommitdiff
path: root/doc/system-manual/1.8.7
diff options
context:
space:
mode:
authorLars-Dominik Braun <lars@6xq.net>2019-02-04 13:09:03 +0100
committerLars-Dominik Braun <lars@6xq.net>2019-02-04 13:09:03 +0100
commit04e68443040c7abad84d66477e98f93bed701760 (patch)
tree2b6202afae659e773bf6916157d23e83edfa44e3 /doc/system-manual/1.8.7
downloadeumel-src-04e68443040c7abad84d66477e98f93bed701760.tar.gz
eumel-src-04e68443040c7abad84d66477e98f93bed701760.tar.bz2
eumel-src-04e68443040c7abad84d66477e98f93bed701760.zip
Initial import
Diffstat (limited to 'doc/system-manual/1.8.7')
-rw-r--r--doc/system-manual/1.8.7/doc/systemhandbuch.11685
-rw-r--r--doc/system-manual/1.8.7/doc/systemhandbuch.21351
-rw-r--r--doc/system-manual/1.8.7/doc/systemhandbuch.31366
-rw-r--r--doc/system-manual/1.8.7/doc/systemhandbuch.41185
-rw-r--r--doc/system-manual/1.8.7/source-disk1
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 SYSUR­Paß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 Hardware­Uhr 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) --> EUMEL­Version
+ id (1) --> Prozessortyp (1: Z80,
+ 2: Z8001,
+ 3: 8086 und kompatible,
+ 4: 68000
+ 5: 80286)
+ id (2) --> Urlader­Version
+ id (3) --> reserviert
+
+ Vom SHard werden geliefert:
+ id (4) --> Lizenznummer des SHards
+ id (5) --> Installationsnummer des EUMEL­Anwenders
+ id (6) --> SHard­spezifisch
+ id (7) --> SHard­spezifisch
+
+
+
+
+
+#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­
+lungs­Kommandos#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
+ Prompt­Zeichen eine Quittung (Handshake­Zeichen) 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 Handshake­Zeichen 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