summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc')
-rw-r--r--doc/basic/basic handbuch.11075
-rw-r--r--doc/basic/basic handbuch.22441
-rw-r--r--doc/basic/basic handbuch.3698
-rw-r--r--doc/basic/basic handbuch.index232
-rw-r--r--doc/dialog/gs-dialog handbuch.impressum89
-rw-r--r--doc/dialog/gs-dialog-1107
-rw-r--r--doc/dialog/gs-dialog-2215
-rw-r--r--doc/dialog/gs-dialog-3683
-rw-r--r--doc/dialog/gs-dialog-4672
-rw-r--r--doc/dialog/gs-dialog-5176
-rw-r--r--doc/dialog/gs-dialog-Inhaltsverzeichnis45
-rw-r--r--doc/dos/dos-dat-handbuch650
-rw-r--r--doc/dynamo/dynamo handbuch1826
-rw-r--r--doc/dynamo/dynamo handbuch.index69
-rw-r--r--doc/dynamo/dynamo handbuch.inhalt131
-rw-r--r--doc/eudas/abb.1-194
-rw-r--r--doc/eudas/abb.4-143
-rw-r--r--doc/eudas/abb.4-246
-rw-r--r--doc/eudas/abb.6-175
-rw-r--r--doc/eudas/abb.6-277
-rw-r--r--doc/eudas/abb.7-146
-rw-r--r--doc/eudas/abb.9-141
-rw-r--r--doc/eudas/abb.9-296
-rw-r--r--doc/eudas/abb.9-3113
-rw-r--r--doc/eudas/abb.9-498
-rw-r--r--doc/eudas/abb.9-551
-rw-r--r--doc/eudas/bildergenerator25
-rw-r--r--doc/eudas/eudas.hdb.1267
-rw-r--r--doc/eudas/eudas.hdb.10510
-rw-r--r--doc/eudas/eudas.hdb.11674
-rw-r--r--doc/eudas/eudas.hdb.12446
-rw-r--r--doc/eudas/eudas.hdb.13757
-rw-r--r--doc/eudas/eudas.hdb.14724
-rw-r--r--doc/eudas/eudas.hdb.15286
-rw-r--r--doc/eudas/eudas.hdb.16350
-rw-r--r--doc/eudas/eudas.hdb.2178
-rw-r--r--doc/eudas/eudas.hdb.3515
-rw-r--r--doc/eudas/eudas.hdb.5386
-rw-r--r--doc/eudas/eudas.hdb.6394
-rw-r--r--doc/eudas/eudas.hdb.7687
-rw-r--r--doc/eudas/eudas.hdb.8211
-rw-r--r--doc/eudas/eudas.hdb.9556
-rw-r--r--doc/eudas/eudas.hdb.inhalt133
-rw-r--r--doc/eudas/eudas.hdb.macros80
-rw-r--r--doc/eudas/eudas.hdb.titel99
-rw-r--r--doc/eudas/eudas.hdb.vorwort89
-rw-r--r--doc/eudas/eudas.ref.1326
-rw-r--r--doc/eudas/eudas.ref.10406
-rw-r--r--doc/eudas/eudas.ref.11347
-rw-r--r--doc/eudas/eudas.ref.2830
-rw-r--r--doc/eudas/eudas.ref.3270
-rw-r--r--doc/eudas/eudas.ref.4441
-rw-r--r--doc/eudas/eudas.ref.5432
-rw-r--r--doc/eudas/eudas.ref.6399
-rw-r--r--doc/eudas/eudas.ref.7447
-rw-r--r--doc/eudas/eudas.ref.8454
-rw-r--r--doc/eudas/eudas.ref.9194
-rw-r--r--doc/eudas/eudas.ref.fehler139
-rw-r--r--doc/eudas/eudas.ref.inhalt120
-rw-r--r--doc/eudas/eudas.ref.macros73
-rw-r--r--doc/eudas/eudas.ref.proz205
-rw-r--r--doc/eudas/eudas.ref.reg436
-rw-r--r--doc/eudas/eudas.ref.titel91
-rw-r--r--doc/eudas/eudas.ref.vorwort81
-rw-r--r--doc/eudas/ref.abb.1-142
-rw-r--r--doc/eudas/register490
-rw-r--r--doc/eudas/uedas.hdb.4686
-rw-r--r--doc/graphic/GRAPHIK.book897
-rw-r--r--doc/graphic/graphik beschreibung661
-rw-r--r--doc/hamster/A5 - Doku: gs-Herbert und Robbi - Inhaltsverzeichnis45
-rw-r--r--doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 193
-rw-r--r--doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 2389
-rw-r--r--doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 3199
-rw-r--r--doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 41312
-rw-r--r--doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 5167
-rw-r--r--doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 673
-rw-r--r--doc/hamster/gs-Herbert und Robbi handbuch.impressum87
-rw-r--r--doc/lisp/lisp handbuch2260
-rw-r--r--doc/menugenerator/menu-generator handbuch.1100
-rw-r--r--doc/menugenerator/menu-generator handbuch.287
-rw-r--r--doc/menugenerator/menu-generator handbuch.3155
-rw-r--r--doc/menugenerator/menu-generator handbuch.4424
-rw-r--r--doc/menugenerator/menu-generator handbuch.5975
-rw-r--r--doc/menugenerator/menu-generator handbuch.6235
-rw-r--r--doc/menugenerator/menu-generator handbuch.7367
-rw-r--r--doc/menugenerator/menu-generator handbuch.81676
-rw-r--r--doc/menugenerator/menu-generator handbuch.impressum88
-rw-r--r--doc/menugenerator/menu-generator handbuch.index258
-rw-r--r--doc/menugenerator/menu-generator handbuch.inhalt72
-rw-r--r--doc/mp-bap/A5 - Doku: gs-MP BAP - Inhaltsverzeichnis50
-rw-r--r--doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 1119
-rw-r--r--doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 2302
-rw-r--r--doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 3237
-rw-r--r--doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 4638
-rw-r--r--doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 5699
-rw-r--r--doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 653
-rw-r--r--doc/mp-bap/gs-MP BAP handbuch.impressum104
-rw-r--r--doc/net/netzhandbuch2045
-rw-r--r--doc/net/netzhandbuch.anhang58
-rw-r--r--doc/net/netzhandbuch.index259
-rw-r--r--doc/porting-8086/8/doc/Port.8086 (renamed from doc/PORT-X86)1469
-rw-r--r--doc/porting-8086/8/source-disk1
-rw-r--r--doc/porting-mc68k/1985.11.26/doc/Port.680002173
-rw-r--r--doc/porting-mc68k/1985.11.26/source-disk1
-rw-r--r--doc/porting-z80/8/doc/Port.Z802484
-rw-r--r--doc/porting-z80/8/source-disk1
-rw-r--r--doc/programmer-manual/1.8.7/doc/programmierhandbuch.1 (renamed from doc/programming/programmierhandbuch.1)0
-rw-r--r--doc/programmer-manual/1.8.7/doc/programmierhandbuch.2a (renamed from doc/programming/programmierhandbuch.2a)0
-rw-r--r--doc/programmer-manual/1.8.7/doc/programmierhandbuch.2b (renamed from doc/programming/programmierhandbuch.2b)0
-rw-r--r--doc/programmer-manual/1.8.7/doc/programmierhandbuch.3 (renamed from doc/programming/programmierhandbuch.3)0
-rw-r--r--doc/programmer-manual/1.8.7/doc/programmierhandbuch.4 (renamed from doc/programming/programmierhandbuch.4)0
-rw-r--r--doc/programmer-manual/1.8.7/doc/programmierhandbuch.5 (renamed from doc/programming/programmierhandbuch.5)0
-rw-r--r--doc/programmer-manual/1.8.7/doc/programmierhandbuch.5b (renamed from doc/programming/programmierhandbuch.5b)0
-rw-r--r--doc/programmer-manual/1.8.7/doc/programmierhandbuch.6 (renamed from doc/programming/programmierhandbuch.6)0
-rw-r--r--doc/programmer-manual/1.8.7/doc/programmierhandbuch.index (renamed from doc/programming/programmierhandbuch.index)0
-rw-r--r--doc/programmer-manual/1.8.7/doc/programmierhandbuch.inhalt (renamed from doc/programming/programmierhandbuch.inhalt)0
-rw-r--r--doc/programmer-manual/1.8.7/doc/programmierhandbuch.titel (renamed from doc/programming/programmierhandbuch.titel)0
-rw-r--r--doc/programmer-manual/1.8.7/source-disk1
-rw-r--r--doc/prolog/prolog handbuch581
-rw-r--r--doc/prozess/Anhang Prozess92
-rw-r--r--doc/prozess/Inhalt Prozess84
-rw-r--r--doc/prozess/gs-Prozess handbuch.impressum104
-rw-r--r--doc/prozess/gs-Prozess-2255
-rw-r--r--doc/prozess/gs-Prozess-3346
-rw-r--r--doc/prozess/gs-Prozess-4173
-rw-r--r--doc/prozess/gs-prozess-199
-rw-r--r--doc/prozess/gs-prozess-5819
-rw-r--r--doc/prozess/gs-prozess-6641
-rw-r--r--doc/prozess/gs-prozess-71121
-rw-r--r--doc/prozess/gs-prozess-8377
-rw-r--r--doc/prozess/gs-prozess-9477
-rw-r--r--doc/system-manual/1.8.7/doc/systemhandbuch.1 (renamed from doc/system/systemhandbuch.1)0
-rw-r--r--doc/system-manual/1.8.7/doc/systemhandbuch.2 (renamed from doc/system/systemhandbuch.2)0
-rw-r--r--doc/system-manual/1.8.7/doc/systemhandbuch.3 (renamed from doc/system/systemhandbuch.3)0
-rw-r--r--doc/system-manual/1.8.7/doc/systemhandbuch.4 (renamed from doc/system/systemhandbuch.4)0
-rw-r--r--doc/system-manual/1.8.7/source-disk1
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil1924
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil10 (renamed from doc/graphic/Altes Handbuch - Teil 10 - Graphik)710
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil111072
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil12234
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil2628
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil32097
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil42306
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil5667
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil6a1590
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil6b1425
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil72469
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil81345
-rw-r--r--doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil9936
-rw-r--r--doc/user-manual/1.7.3-pd/doc/source-disk1
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.1 (renamed from doc/user/benutzerhandbuch.1)0
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.2 (renamed from doc/user/benutzerhandbuch.2)0
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.3 (renamed from doc/user/benutzerhandbuch.3)0
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.4 (renamed from doc/user/benutzerhandbuch.4)0
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.5a (renamed from doc/user/benutzerhandbuch.5a)0
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.5b (renamed from doc/user/benutzerhandbuch.5b)0
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.5c (renamed from doc/user/benutzerhandbuch.5c)0
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.5d (renamed from doc/user/benutzerhandbuch.5d)0
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.5e (renamed from doc/user/benutzerhandbuch.5e)0
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.6 (renamed from doc/user/benutzerhandbuch.6)0
-rw-r--r--doc/user-manual/1.8.7/doc/benutzerhandbuch.anhang (renamed from doc/user/benutzerhandbuch.anhang)0
-rw-r--r--doc/user-manual/1.8.7/doc/source-disk1
-rw-r--r--doc/warenhaus/Anhang Warenhaus65
-rw-r--r--doc/warenhaus/Inhalt Warenhaus50
-rw-r--r--doc/warenhaus/gs-Warenhaus handbuch.impressum89
-rw-r--r--doc/warenhaus/gs-Warenhaus-1124
-rw-r--r--doc/warenhaus/gs-Warenhaus-272
-rw-r--r--doc/warenhaus/gs-Warenhaus-3309
-rw-r--r--doc/warenhaus/gs-Warenhaus-4378
-rw-r--r--doc/warenhaus/gs-Warenhaus-51468
-rw-r--r--doc/warenhaus/gs-Warenhaus-6589
-rw-r--r--doc/warenhaus/gs-Warenhaus-7235
172 files changed, 21417 insertions, 49016 deletions
diff --git a/doc/basic/basic handbuch.1 b/doc/basic/basic handbuch.1
deleted file mode 100644
index 2e604cb..0000000
--- a/doc/basic/basic handbuch.1
+++ /dev/null
@@ -1,1075 +0,0 @@
-____________________________________________________________________________
-
-
-#on("b")##on ("u")#
-#center#Betriebssystem E U M E L
-#off ("u")#
-
-
-#center#Basic
-
-
-
-
-#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#
-#page nr ("%", 1)#
-#head#
-EUMEL-BASIC-Compiler Inhalt %
-#end#
-
-Inhalt
-
-1 Einleitung 3
-
-2 Installation des BASIC-Compilers 4
-
-3 Aufruf und Steuerung des BASIC-Compilers 5
-
-4 Umgang mit dem BASIC-Compiler 7
-4.1 Erläuterungen zur Syntax 7
-4.2 Datentypen und Konstanten 10
-4.3 Variablen und Felder 12
-4.4 Operatoren 14
-4.5 Funktionen 19
-4.6 Typanpassung 22
-4.7 Aufruf von EUMEL-Prozeduren in BASIC-Programmen 23
-
-5 Steuerung der Bildschirmausgaben 25
-
-6 Grenzen des Compilers 26
-
-7 Fehlerbehandlung 28
-7.1 Fehler zur Ãœbersetzungszeit 28
-7.2 Fehler zur Laufzeit 30
-
-8 Übersicht über die Anweisungen und Funktionen 31
-
-9 Anpassung von Programmen an den EUMEL-BASIC-Compiler 96
-9.1 Unterschiede zwischen BASIC-Interpretern
- und dem EUMEL-BASIC-Compiler 96
-9.2 Abweichungen von ISO 6373-1984 (Minimal-BASIC) 97
-9.3 Anpassung von Microsoft-BASIC Programmen
- an den EUMEL-BASIC-Compiler 98
-
-Anhang A: Reservierte Wörter 100
-Anhang B: Vom Scanner erkannte Symboltypen 103
-Anhang C: Übersicht über die Fehlermeldungen 106
-Anhang D: ELAN-Prozeduren des Compilers 113
-#page#
-
-
-#page nr ("%", 3)#
-#head#
-EUMEL-BASIC-Compiler 1. Einleitung %
-
-#end#
-
-1. Einleitung
-
-
-BASIC entspricht heute nicht mehr den Vorstellungen von einer modernen Program­
-miersprache. Dennoch wurde für das EUMEL-Betriebssystem ein Compiler für BASIC
-entwickelt. Er soll vor allem dazu dienen, schon bestehende BASIC-Programme -
-gegebenenfalls nach entsprechender Anpassung - auch unter EUMEL verfügbar zu
-machen.
-Der Compiler ist weitgehend an die ISO-Norm 6373 für Minimal-BASIC angelehnt.
-Die Syntax und Bedeutung der Anweisungen orientiert sich in den meisten Fällen an
-Microsoft-BASIC. Anweichungen treten insbesondere an den Stellen auf, an denen
-Prinzipien des Betriebssystems EUMEL verletzt würden.
-Verglichen mit dem ELAN-Compiler des EUMEL-Systems ist der BASIC-Compiler
-beim Ãœbersetzen recht langsam. Auch aus diesem Grund scheint es nicht sinnvoll,
-den BASIC-Compiler zur Neuentwicklung größerer Programme einzusetzen.
-
-Sinn dieses Handbuchs ist es vor allem, Kenntnisse über den Umgang mit dem
-EUMEL-BASIC-Compiler zu vermitteln. Das Handbuch ist auf keinen Fall als Ein­
-führung in die Programmiersprache BASIC gedacht, sondern es soll dem Benutzer mit
-BASIC-Erfahrung die Arbeit mit dem EUMEL-BASIC-Compiler ermöglichen und
-erleichtern. Neben Erfahrung in BASIC setzt dieses Buch an einigen Stellen auch
-Grundkenntnisse über das EUMEL-System voraus.
-
-
-
-Zur #ib(4)#Notation#ie(4)# in dieser Beschreibung
-
-Bei der Beschreibung der Anweisungen und Funktionen und auch an anderen Stellen
-werden in dieser Beschreibung Syntaxregeln für BASIC-Programme oder Teile davon
-angegeben. Dabei werden folgende Zeichen mit besonderer Bedeutung verwendet:
-
-[ ] optionale Angabe
-[...] beliebig häufige Wiederholung der letzten optionalen Angabe
-| alternative Angabe, d.h. entweder die letzte links stehende Angabe oder
- die nächste rechts stehende Angabe, aber nicht beide
-< > in spitzen Klammern stehende Begriffe sind entweder definiert (z.B. <Va­
- riable>) oder werden hinter der Syntaxregel erläutert
-
-Die Notation der exportierten ELAN-Prozeduren des Compilers (besonders in An­
-hangD) entspricht der in den EUMEL-Handbüchern üblichen Prozedurkopf-
-Schreibweise.
-#page#
-#head#
-EUMEL-BASIC-Compiler 2. Installation des BASIC-Compilers %
-
-#end#
-
-2. #ib(3)#Installation des BASIC-Compilers#ie(3)#
-
-
-Der EUMEL-BASIC-Compiler wird auf zwei Disketten mit jeweils 360 KByte
-Speicherkapazität ausgeliefert.
-Auf der Diskette "BASIC.1" befindet sich das #ib(3)#Generatorprogramm#ie(3)#("gen.BASIC") zur
-Installation des EUMEL-BASIC-Systems.
-Legen Sie diese Diskette in das Laufwerk ihres Rechners ein und geben Sie in der
-Task, in der das BASIC-System installiert werden soll, folgende Zeile nach 'gib
-kommando :' (oder 'maintenance :') ein:
-
-archive ("BASIC.1"); fetch ("gen.BASIC", archive); run
-
-Lassen Sie die Diskette 'BASIC.1' im Laufwerk und antworten Sie auf die Frage
-"Archiv "BASIC.1" eingelegt(j/n)?" mit "j". Das Generatorprogramm holt nun einige
-Dateien von der Diskette. Nach Zugriff auf das Archiv erscheint die Meldung "Archiv
-abgemeldet!" und die Frage "Archiv 'BASIC.2' eingelegt(j/n)?". Legen Sie nun statt
-des Archivs 'BASIC.1' das Archiv 'BASIC.2' in das Laufwerk ein und drücken Sie bitte
-wiederum "j". Nach weiteren Archivoperationen erscheint dann wieder die Meldung
-"Archiv abgemeldet". Sie können nun die Diskette "BASIC.2" aus dem Laufwerk
-entnehmen.
-Das Generatorprogramm insertiert nun alle Programme des BASIC-Systems in der
-Task. Dieser Vorgang nimmt einige Zeit in Anspruch. Zum Abschluß erscheint die
-Meldung "BASIC-System installiert".
-Der EUMEL-BASIC-Compiler steht Ihnen nun in der Task (und in nachfolgend
-eingerichteten Söhnen) zur Verfügung.
-#page#
-#head#
-EUMEL-BASIC-Compiler 3. Aufruf und Steuerung des BASIC-Compilers %
-
-#end#
-
-3. #ib(4)#Aufruf und #ib(3)#Steuerung des BASIC-Compilers#ie(3)##ie(4)#
-
-
-
-
-Ãœbersetzen von BASIC-Programmen
-
-Ein BASIC-Programm, das vom Compiler übersetzt werden soll, muß sich dazu in
-einer EUMEL-Textdatei befinden (Syntax vgl. Kap. 4.). Steht das BASIC-Programm
-zum Beispiel in der Datei "Programm.17+4", so wird der Compiler mit
-
- #ib(3)#basic#ie(3)# ("Programm.17+4")
-
-zum Ãœbersetzen dieses Programms aufgerufen.
-In einem Vordurchlauf werden die Zeilennummern des Programms auf Richtigkeit
-überprüft. Beim eigentlichen Compilerdurchlauf wird das BASIC-Programm dann mit
-Hilfe des EUMEL-Coders in einen von der EUMEL-0-Maschine ausführbaren Code
-übersetzt.
-
-Das Programm wird mit 'check on' (Zeilennummergenerierung) übersetzt.
-Ein 'runagain' wie bei ELAN-Programmen ist bei BASIC-Programmen zur Zeit
-leider nicht möglich.
-
-
-
-Insertieren von BASIC-Programmen
-
-Der BASIC-Compiler kann BASIC-Programme auch insertieren. Das ganze Pro­
-gramm bildet dabei eine Prozedur, die nach dem Insertieren wie eine 'normale'
-ELAN-Prozedur aufgerufen werden kann.
-Zum Insertieren wird der Compiler mit einem zusätzlichen Text-Parameter aufge­
-rufen:
-
- #ib(3)#basic#ie(3)# ("Programm.17+4", "blackjack")
-
-Das Programm wird übersetzt und, falls keine Fehler gefunden wurden, fest einge­
-tragen ('insertiert'). Gestartet wird das Programm aber nicht.
-"blackjack" ist nun der Prozedurname, unter dem das BASIC-Programm nach erfolg­
-reichem Insertieren aufgerufen werden kann.
-Bei 'packets' erscheint jetzt der Eintrag 'BASIC.blackjack' in der Liste der insertierten
-Pakete, und ein 'help ("blackjack")' zeigt, daß eine Prozedur 'blackjack' nun tatsäch­
-lich in der Task bekannt ist. Die Prozedur 'bulletin' funktioniert für insertierte
-BASIC-Programme nicht. Sie ist aber auch nicht nötig, da das 'Paket' mit dem
-BASIC-Programm ohnehin nur eine Prozedur enthält und ihr Name ja schon aus
-dem Namen des Paketes hervorgeht.
-
-#on ("b")#
-Beachten Sie:
- - Der Prozedurname muß der Syntax für ELAN-Prozedurnamen entsprechen, darf
- aber #on ("b")#keine Leerzeichen enthalten.
- - Die BASIC-Programme können über den Prozedurnamen nur aufgerufen wer­
- den; die Übergabe von Parametern ist ebenso wie Wertlieferung nicht möglich.
- - Jedes Insertieren belegt Speicherplatz im Codebereich der Task. Weil der Coder
- und der Compiler ebenfalls recht viel Code belegen, kann es (vor allem, wenn
- die BASIC-Programme lang sind) schnell zu einem Code-Ãœberlauf kommen
- (Compiler Error 305). Es sollten daher nur die Programme insertiert werden, für
- die dies wirklich nötig ist.
- - Achten Sie bei der Wahl des Namens für die gelieferte Prozedur darauf, daß sie
- nicht ungewollt Prozeduren des Betriebssystems überdecken. (Der Aufruf 'ba­
- sic("tadellos","help")' wäre z.B. gar nicht tadellos, denn 'help' wäre nach dem
- Insertieren überdeckt).
- - Auch beim Insertieren werden die BASIC-Programme mit 'check on' übersetzt.
-#off ("b")#
-
-
-Ausgabe der übersetzten Zeilen während des
-Compilierens
-Mit '#ib(3)#basic list#ie(3)# (TRUE)' wird der Compiler so eingestellt, daß beim Übersetzen die
-aktuelle Programmzeile ausgegeben wird. Diese Ausgabe kann auch mit '#ib(3)#sysout#ie(3)#'
-umgeleitet werden. Zum Beispiel:
-
- sysout ("Fehlerprotokoll"); basic ("Programm.17+4")
-
-Dies kann beim #ib(3)#Debugging#ie(3)# von BASIC-Programmen eine wertvolle Hilfe sein, da in
-der Ausgabedatei die Fehler sofort hinter der betreffenden Programmzeile vermerkt
-werden. Das 'sysout' muß in Monitortasks ('gib kommando:') direkt vor dem Aufruf
-des Compilers gegeben werden, weil der Monitor 'sysout' sonst wieder zurücksetzt.
-
-Mit 'basic list (FALSE)' kann die Ausgabe der Programmzeilen beim Ãœbersetzen
-wieder ausgeschaltet werden.
-
-#page#
-#head#
-EUMEL-BASIC-Compiler 4. Umgang mit dem BASIC-Compiler %
-
-#end#
-
-4. Umgang mit dem BASIC-Compiler
-
-
-
-4.1. Erläuterungen zur #ib(3)#Syntax#ie(3)#
-
-
-Ein zu übersetzendes Programm muß dem BASIC-Compiler in Form einer
-#ib(3)#EUMEL-Textdatei#ie(3)# übergeben werden. (Es gelten somit auch die für EUMEL-Text­
-dateien üblichen Begrenzungen, z.B. höchstens 32000 Zeichen pro Zeile und höch­
-stens 4075 Dateizeilen pro Datei.)
-BASIC-Programme setzen sich aus Programmzeilen zusammen; jede Dateizeile der
-#ib(3)#Programmdatei#ie(3)# bildet eine BASIC-Programmzeile. Die Syntax für ein Programm sieht
-damit so aus:
-
-
-<Programmzeile>[<Programmzeile>][...]EOF
-
-Dabei bedeutet #ib(3)#EOF (end of file)#ie(3)# das Ende der Programmdatei.
-
-Eine #ib(3)#Programmzeile#ie(3)# hat folgende Syntax:
-
-
-[<Zeilennummer>][<Anweisung>][:<Anweisung>][...][:]EOL
-
-Die #ib(3)#Zeilennummer#ie(3)# dient unter anderem als Sprungadresse an den Anfang der Pro­
-grammzeile während der Laufzeit des Programms (vgl. 'GOTO' und 'GOSUB'). Sie ist
-fakultativ (d.h. sie muß nicht geschrieben werden). Durch sparsame Verwendung von
-Zeilennummern (nämlich nur da, wo sie benötigt werden) kann eine gewisse Steige­
-rung der #ib(3)#Übersichtlichkeit von BASIC-Programmen#ie(3)# erreicht werden. Hat eine Pro­
-grammzeile keine Zeilennummer, so wird bei Fehlermeldungen (sowohl während der
-Ãœbersetzung als auch zur Laufzeit des Programms) die letzte Zeilennummer mit
-angegeben, die davor auftrat.
-Zeilennummern dürfen im Bereich von 1 bis 32767 liegen und müssen unbedingt in
-aufsteigender Reihenfolge vergeben werden. Zeilennummern dürfen keine Leerzeichen
-enthalten und müssen mit einem Leerzeichen abgeschlossen werden. Um spätere
-Ergänzungen zu ermöglichen, ist eine Numerierung im Abstand zehn empfehlenswert.
-
-Hier ein Beispiel, wie ein BASIC-Programm in einer EUMEL-Datei aussehen
-könnte:
-
-
-...........................Einmaleins............................
-10 CLS: PRINT "Kleines Einmaleins"
- FOR zahl% = 1 TO 10
- PRINT
- 'Erzeugung einer Zeile
- FOR faktor% = 1 TO 10
- PRINT TAB (faktor% * 5);
- PRINT USING "\#\#\#"; faktor% * zahl%;
- NEXT faktor%
- NEXT zahl%
-
-
-
-
-Die Syntax der Anweisungen, die vom EUMEL-BASIC-Compiler übersetzt werden
-können, ist ausführlich im Kapitel 8 beschrieben.
-
-Der #ib(3)#Doppelpunkt#ie(3)# dient als Trennzeichen zwischen Anweisungen. Ihm muß nicht
-unbedingt eine Anweisung folgen. Er kann somit als explizites "Ende der
-Anweisung"-Symbol aufgefaßt werden (#ib(3)#EOS, "end of statement"#ie(3)#).
-
-#ib(3)#EOL (end of line)#ie(3)# ist das Ende einer Dateizeile. (Dieses "Zeichen" ist ebenso wie
-EOF beim Editieren der Datei nicht sichtbar.)
-Das #ib(3)#Hochkomma#ie(3)# ("'", Code 39) wird vom Compiler ebenfalls als EOL interpretiert.
-Alle dem Hochkomma in der Dateizeile folgenden Zeichen werden überlesen. Dies
-ermöglicht das Schreiben von Kommentaren ohne Verwendung der
-'REM'-Anweisung.
-
-Es sei hier bereits bemerkt, daß sich durch die Realisierung des Übersetzers als
-#on ("b")#Compiler gewisse Unterschiede gegenüber Interpretern #off ("b")#ergeben (siehe hierzu Kap. 9).
-Der wesentliche Unterschied ist, daß der Interpreter dem Programmtext analog zum
-Programmablauf folgt, der Compiler das Programm aber von vorne bis hinten Zeile für
-Zeile übersetzt. Dies hat zur Folge, daß z.B. die Dimensionierungen von Feldvariablen
-#on ("b")#textuell vor der Verwendung der Variablen stattfinden müssen#off ("b")# und nicht, wie bei
-Interpretern, nur im Ablauf des Programms vorher ausgeführt werden müssen.
-
-
-
-Weitere Schreibregeln
-
-#on ("b")#
-1. #ib(3)#Groß-/Kleinschreibung#ie(3)##off ("b")#
-Für den BASIC-Compiler bestehen zwischen kleinen und großen Buchstaben keiner­
-lei Unterschiede, es sei denn es handelt sich um Textdenoter (Textkonstanten).
-Daher können alle #ib(3)#Schlüsselwörter#ie(3)# und #ib(3)#Variablennamen#ie(3)# mit kleinen oder großen
-Buchstaben geschrieben werden. Aus der Tatsache, daß zwischen großen und kleinen
-Buchstaben nicht unterschieden wird, folgt aber bespielsweise auch, daß die Variab­
-lennamen (vgl. 4.3.) 'hallo' und 'HALLO' ein und dieselbe Variable bezeichnen.
-
-#on ("b")#
-2. #ib(3)#Reservierte Wörter#ie(3)##off ("b")#
-Der BASIC-Compiler erkennt eine ganze Reihe #on("i")#reservierter Wörter#off("i")#. Es handelt sich
-hierbei im wesentlichen um die Namen der Anweisungen und Funktionen. Sie sollten
-im eigenen Interesse darauf achten, daß sich sowohl vor als auch hinter reservier­
-ten Wörtern stets mindestens ein #on ("b")##ib(3)#Leerzeichen#ie(3)##off ("b")# (Blank) befindet. Der #ib(3)#Scanner#ie(3)# (ver­
-gleiche AnhangB) erkennt zwar manchmal die reservierten Wörter auch ohne Leer­
-zeichen, aber unter bestimmten Umständen kann es auch zu erkannten oder - noch
-schlimmer - vom Compiler unerkannten Fehlern kommen.
-Hierzu zwei Beispiele:
-Die Anweisung 'IF a > b THENPRINT "größer"' führt beim Compilieren zur Fehler­
-meldung "Syntaxfehler: THEN oder GOTO erwartet".
-Wesentlich gefährlicher ist da schon die Programmzeile
- "LEThallo = 3 : PRINT hallo",
-denn die unerwartete Wirkung ist die Ausgabe von "0" auf dem Bildschirm. Der Wert
-"3" wurde nämlich nicht der Variablen mit dem Namen "hallo" zugewiesen, sondern
-einer Variablen namens "LEThallo".
-
-#on ("b")#
-3. Bedeutung der #ib(3)#Leerstelle#ie(3)# ("Blank") für den Compiler#off("b")#
-Wie schon aus dem vorhergehenden Punkt ersichtlich kann das Fehlen von trennen­
-den Leerstellen unschöne Effekte haben, denn der #ib(3)#Scanner#ie(3)# (vgl. AnhangB) des
-BASIC-Compilers erkennt anhand der Leerstelle (Code 32) beim Durchlauf durch das
-Programm, daß ein #ib(3)#Symbol#ie(3)# zu Ende ist.
-Es kommt somit immer dann zu Fehlern, wenn zwei Symbole (z.B. reservierte Wörter,
-Konstanten, Variablen etc.) nicht durch Leerzeichen getrennt sind, und der Scanner
-sie als ein Symbol "versteht".
-Beispiel:
- "a = 3 : b = 4 : PRINT a b" erzeugt die Ausgabe "34".
- "a = 3 : b = 4 : PRINT ab" erzeugt hingegen die Ausgabe "0", denn der
-Compiler sieht "ab" als #on ("b")#einen Variablennamen an. #off ("b")#
-
-
-
-4.2. #ib(3)#Datentypen#ie(3)# und #ib(3)#Konstanten#ie(3)#
-
-
-Der EUMEL-BASIC-Compiler unterscheidet grundsätzlich zwischen zwei Daten­
-typen, nämlich zwischen #ib(3)#Texte#ie(3)#n und #ib(3)#Zahlen#ie(3)#.
-
-#on ("b")#
-#ib(3)#Datentyp TEXT#ie(3)# #off ("b")#
-Texte dürfen alle Zeichen enthalten (Codes 0 bis 255) und bis zu 32000 Zeichen lang
-sein.
-Die zugehörigen Konstanten werden von #ib(3)#Anführungszeichen#ie(3)# begrenzt, z.B.:
- "Anzahl Einträge: "
- "2.32 DM"
- "General-Musik-Direktor"
-Anführungszeichen (Code 34) dürfen #on("i")#innerhalb#off("i")# von Text-Konstanten nicht vor­
-kommen.
-
-Bei Zahlen unterscheidet der Compiler noch zwischen #ib(3)#INTs#ie(3)# (#ib(3)#Ganzzahlen#ie(3)#) und REALs
-(#ib(3)#Gleitkommazahlen#ie(3)#). Diese entsprechen im Hinblick auf den Wertebereich genau den
-in ELAN bekannten INTs und REALs.
-
-#on ("b")#
-#ib(3)#Datentyp INT#ie(3)# #off ("b")#
-INT-Werte dürfen zwischen -32768 und 32767 liegen. INT-Konstanten dürfen aber
-#on("i")#nur#off("i")# aus Ziffern und einem optionalen '%'-Zeichen am Ende bestehen. Das bedeutet,
-daß die INT-Konstanten im Bereich von 0 bis 32767 liegen können.
-Ein nachgestelltes '%'-Zeichen kennzeichnet eine Konstante nochmals explizit als
-INT. (Diese Option wurde aus Kompatibilitätsgründen implementiert.)
-
-#on ("b")#
-#ib(3)#Datentyp REAL#ie(3)# #off ("b")#
-REALs können Werte zwischen -9.999999999999*10#u#126#e# und
-9.999999999999*10#u#126#e# annehmen.
-Die kleinste positive von Null verschiedene Zahl ist 9.999999999999*10#u#-126#e#.
-Der kleinste REAL-Wert mit x + 1.0 > 1.0 ist gleich 10#u#-12#e#.
-REAL-Konstanten werden gebildet aus Vorkommastellen, Dezimalpunkt, Nachkom­
-mastellen, Zeichen "E" oder "D" (jeweils auch klein) für den #ib(3)#Exponent#ie(3)#en gefolgt vom
-Vorzeichen und den Ziffern des Exponenten.
-Dabei müssen nicht für jede REAL-Konstante alle diese Elemente benutzt werden.
-Unverzichtbar sind #on("i")#entweder#off("i")# der Dezimalpunkt #on("i")#oder#off("i")# der Exponent. Ebenso müssen
-zumindest entweder Vor- oder Nachkommastellen vorhanden sein.
-
-Beispiele für gültige REAL-Konstanten sind:
- 0.
- .01
- 1E-17
- 2.9979D8
- .3e-102
- 100.e+7
-
-Nicht erlaubt sind dagegen folgende Schreibweisen für REAL-Konstanten:
- e12 (#ib(3)#Mantisse#ie(3)# fehlt)
- 100 (ist INT-Konstante)
- . (weder Vor- noch Nachkommastellen)
- .E-12 (dito)
- 1exp-3 ('exp' nicht erlaubt)
- -1.99e30 (Mantisse hat Vorzeichen)
-
-Das letzte Beispiel zeigt, daß auch vor REAL-Konstanten keine #ib(3)#Vorzeichen#ie(3)# erlaubt
-sind. Da normalerweise keine REAL-Konstanten, sondern vielmehr numerische
-Ausdrücke verlangt werden, können durch Voranstellen des Operators '-' (vgl. 4.4.)
-auch #ib(3)#negative Zahlenwerte#ie(3)# leicht erzeugt werden.
-
-An REAL-Konstanten darf eines der Zeichen "!" und "\#" angehängt werden. Diese
-Option wurde aus Kompatibilitätsgründen eingebaut. Wird ein "!" oder "\#" an eine
-INT-Konstante angehängt, so verwandelt es diese in eine REAL-Konstante.
-Beispiel: 10000! oder 10000\# entspricht 10000. oder 1E4
-
-
-#page#
-
-4.3. Variablen und Felder
-
-
-Variablen
-
-Der BASIC-Compiler stellt für die in 4.2. vorgestellten Datentypen TEXT, INT und
-REAL auch Variablen zur Verfügung.
-Die #ib(3)#Variablennamen#ie(3)# müssen folgenden Bedingungen genügen:
-- Ein Variablenname muß mit einem Buchstaben beginnen.
-- Variablennamen dürfen ab der zweiten Stelle außer Buchstaben auch Ziffern, Dezi­
- malpunkte sowie die Zeichen "!", "\#", "$" und "%" enthalten. Leerzeichen dürfen
- in Variablennamen dagegen nicht vorkommen.
-- Variablennamen dürfen nicht mit FN beginnen (vgl. 4.5. benutzer-definierte Funk­
- tionen).
-- #ib(3)#Reservierte Wörter#ie(3)# (siehe Anhang A) dürfen kein Variablenname sein. Als Teiltexte
- dürfen reservierte Wörter aber in Variablennamen enthalten sein (auch am Anfang).
-
-Variablennamen dürfen beliebig lang sein, und alle Zeichen eines Variablennamens
-sind signifikant.
-
-Welchen Typ eine Variable hat, entscheidet der Compiler nach folgenden #ib(3)#Kriterien#ie(3, " für den Typ einer Variablen")# (in
-der Reihenfolge ihrer Beachtung):
-- Ist das letzte Zeichen des Namens ein "!" oder "\#", so bezeichnet er eine
- REAL-Variable.
-- Ist das letzte Zeichen ein "%", so handelt es sich um eine INT-Variable.
-- Ist das letzte Zeichen des Namens ein "$", so ist die Variable vom Typ TEXT.
-- Liegt das erste Zeichen des Namens im Bereich der mit einer #ib(3)#DEFINT#ie(3)#-Anweisung
- (vgl. Kap. 8) festgelegten Buchstaben, so ist die Variable eine INT-Variable.
-- Liegt das erste Zeichen im Bereich der mit einer #ib(3)#DEFSTR#ie(3)#-Anweisung (vgl. Kap. 8)
- festgelegten Buchstaben, so handelt es sich um eine TEXT-Variable.
-- Wenn keine der obigen Bedingungen erfüllt ist, dann bezeichnet der Name eine
- Variable des Datentyps REAL.
-
-Variablen, denen noch kein Wert zugewiesen wurde, haben den Inhalt null (bei INT
-und REAL) beziehungsweise Leertext (bei TEXT).
-
-
-
-Felder (#ib(4)#Arrays#ie(4)#)
-
-Ein Feld (Array) ist eine Ansammlung von mehreren Variablen gleichen Typs. Jedes
-Feld hat einen Namen. Für die #ib(3)#Feldnamen#ie(3)# gelten die gleichen Regeln wie für die
-Namen von normalen Variablen. Auch die Datentypen werden nach den gleichen
-Kriterien bestimmt wie bei einfachen Variablen.
-In einem Feld können die Elemente in bis zu 100 #ib(3)#Dimensionen#ie(3)# abgelegt werden. Auf
-ein Element eines Feldes wird über den Feldnamen und den Index / die #ib(3)#Indizes#ie(3)# des
-Elements zugegriffen. Beim Zugriff auf das Element müssen so viele Indizes ange­
-geben werden, wie das Feld Dimensionen hat.
-Beispiel:
-Das Feld 'tabelle' habe zwei Dimensionen. Mit 'tabelle (3, 5)' wird auf das Element
-mit dem Index 3 in der ersten Dimension und dem Index 5 in der zweiten Dimension
-zugegriffen.
-
-Beim ersten Zugriff auf ein Element eines Feldes wird anhand der Zahl der Indizes
-die Anzahl der Dimensionen festgestellt und das Feld so eingerichtet, daß in jeder
-Dimension der größte Index zehn ist.
-Soll ein Feld mit anderen größten Indizes eingerichtet werden, so muß hierzu die
-#ib(3)#DIM#ie(3)#-Anweisung verwendet werden (siehe Kapitel 8).
-
-Der kleinste Index ist voreingestellt auf null, kann aber mit der #ib(3)#OPTION BASE#ie(3)#-
-Anweisung (vgl. Kap. 8) auch auf eins eingestellt werden.
-
-Die Elemente eines Feldes sind, wie auch die einfachen Variablen, mit den Werten
-null (INT und REAL) beziehungsweise Leertext (TEXT) vorbesetzt, sofern ihnen noch
-nichts zugewiesen wurde.
-
-#page#
-
-4.4. Operatoren
-
-Nachfolgend sind alle Operatoren aufgelistet, die vom EUMEL-BASIC-Compiler
-übersetzt werden.
-
-
-Arithmetische #ib(4)#Operatoren#ie(4, ", arithmetische")#
-
-#ib(3)##ie(3, "+")##ib(3)##ie(3, "-")##ib(3)##ie(3, "*")##ib(3)##ie(3, "/")#
-#ib(3)##ie(3, "\")##ib(3)##ie(3, "MOD")##ib(3)##ie(3, "^")#
-
- Operand(en) Zweck Ergebnistyp
-
- + INT positives Vorzeichen INT
- REAL positives Vorzeichen REAL
-
- INT, INT INT-Addition INT
- REAL, REAL REAL-Addition REAL
-
- - INT negatives Vorzeichen INT
- REAL negatives Vorzeichen REAL
-
- INT, INT INT-Subtraktion INT
- REAL, REAL REAL-Subtraktion REAL
-
- * INT, INT INT-Multiplikation INT
- REAL, REAL REAL-Multiplikation REAL
-
- / (INT, INT) #linefeed (0.5)#
- REAL-Division REAL
- REAL, REAL #linefeed (1.0)#
-
- \ INT, INT #linefeed (0.5)#
- INT-Division INT
- (REAL, REAL) #linefeed (1.0)#
-
-MOD INT, INT INT-Divisionsrest INT
- REAL, REAL Divisionsrest nach REAL
- Runden auf Ganzzahl (nicht INT)
-
- ^ (INT, INT) #linefeed (0.5)#
- Potenzierung REAL
- REAL, REAL #linefeed (1.0)#
-
-
-#on ("b")#
-Hinweis: #off ("b")#
-Wird ein Operator mit numerischen Operanden unterschiedlichen Typs (also INT und
-REAL) aufgerufen, so wird der INT-Operand nach REAL konvertiert und der Operator
-mit den beiden REAL-Operanden aufgerufen.
-Sind die Operandtypen in Klammern angegeben, so werden vor Ausführung der Ope­
-ration die Operanden zu den nicht eingeklammerten Typen konvertiert.
-Da jede #ib(3)#Konvertierung#ie(3)# Zeit benötigt, sollte der Benutzer darauf achten, daß möglichst
-wenig konvertiert werden muß.
-Hierzu ein (etwas extremes, aber nicht seltenes) Beispiel:
-Der Aufruf a%\b bewirkt zunächst eine Konvertierung von a% nach REAL:
-CDBL(a%)\b. Intern wird die Berechnung dann aber wieder mit INTs ausgeführt:
-CINT(CDBL(a%))\CINT(b). Das Ergebnis wird also erst nach drei Konvertierungen
-geliefert. Schreibt man dagegen sofort a%\CINT(b), dann reicht eine Konvertierung
-aus.
-
-Es muß außerdem bei den Operatoren +, - und * für INTs darauf geachtet werden,
-daß das Ergebnis innerhalb des INT-Wertebereichs liegen muß, da es sonst zu
-einem #ib(3)#INT-Ãœberlauf#ie(3)# kommt.
-
-
-
-Text-Operator #ib(4)#+#ie(4)#
-
-#ib(3)##ie(3, "Operatoren, Text-")#
-Für Text-Manipulationen wird der Operator '+' mit zwei TEXT-Operanden zur
-Verfügung gestellt. Mit '+' werden zwei Texte aneinandergehängt (konkateniert).
-
-
-
-Vergleichsoperatoren#ib(4)##ie(4, "Operatoren, Vergleichs-")#
-
-Im EUMEL-BASIC gibt es folgende Vergleichsoperatoren:
-
-#ib(3)#=#ie(3)# gleich
-#ib(3)#<>#ie(3)# ungleich
-#ib(3)#<#ie(3)# kleiner
-#ib(3)#>#ie(3)# größer
-#ib(3)#<=#ie(3)# kleiner oder gleich
-#ib(3)#>=#ie(3)# größer oder gleich
-
-Bei den numerischen Datentypen werden mit den Vergleichsoperatoren die Zahlen­
-werte verglichen.
-Sollen ein INT und ein REAL verglichen werden, dann wird der INT vorher nach
-REAL konvertiert und ein REAL-Vergleich vorgenommen.
-
-Bei Texten dienen die Vergleichsoperatoren zum Vergleich der Zeichencodes. Dies
-ermöglicht zum Beispiel ein alphabetisches Sortieren von Wörtern, mit der Einschrän­
-kung, daß Groß- und Kleinbuchstaben unterschiedliche Zeichencodes haben (ver­
-gleiche EUMEL-Zeichensatz-Tabelle im Benutzerhandbuch) und somit verschieden
-eingeordnet werden.
-Es gilt a$ < b$, wenn die Zeichenkette in a$ codemäßig vor der Zeichenkette in b$
- steht: "a" < "b" (TRUE) "aa"< "a" (FALSE)
-
-
-Die Vergleichsoperatoren liefern, je nachdem ob die Aussage wahr oder falsch ist, die
-INT-Werte 0 (falsch) oder -1 (wahr).
-Anhand des Ergebnisses einer Vergleichsoperation kann zum Beispiel der Programm­
-ablauf gesteuert werden (siehe Kapitel 8, IF-Anweisung).
-
-
-
-Logische Operatoren
-
-#ib(3)##ie(3, "Operatoren, logische")#
-Die logischen Operatoren haben zwei Aufgaben:
-1. logische (Boolsche) Verknüpfung von #ib(3)#Wahrheitswerte#ie(3)#n, die zum Beispiel von
- Vergleichsoperationen geliefert werden und
-2. bitweise Ausführung von logischen Verknüpfungen auf den internen (Zweierkom­
- plement-) Darstellungen von INT-Werten.
-
-Da für beide Aufgaben die gleichen Operatoren benutzt werden, wurden für die Wahr­
-heitswerte die INT-Werte 0 für falsch (Bitmuster: 0000000000000000) und -1 für
-wahr (Bitmuster: 1111111111111111) gewählt.
-
- Operand(en) Zweck insbesondere gilt
-
-#ib(3)#NOT#ie(3)# INT #linefeed (0.5)# NOT0->-1
- #ib(3)#Negation#ie(3)#
- (REAL) #linefeed (1.0)# NOT-1->0
-
-#ib(3)#AND#ie(3)# INT, INT #ib(3)#UND-Verknüpfung#ie(3)# 0AND0->0
- 0AND-1->0
- -1AND0->0
- -1AND-1->-1
-
- #ib(3)#OR#ie(3)# INT, INT #ib(3)#ODER-Verknüpfung#ie(3)# 0OR0->0
- 0OR-1->-1
- -1OR0->-1
- -1OR-1->-1
-
-#ib(3)#XOR#ie(3)# INT, INT #ib(3)#Exklusiv-ODER-Verknüpfung#ie(3)# 0XOR0->0
- 0XOR-1->-1
- -1XOR0->-1
- -1XOR-1->0
-
-#ib(3)#EQV#ie(3)# INT, INT #ib(3)#Äquivalenz-Verknüpfung#ie(3)# 0EQV0->-1
- 0EQV-1->0
- -1EQV0->0
- -1EQV-1->-1
-
-#ib(3)#IMP#ie(3)# INT, INT #ib(3)#Implikations-Verknüpfung#ie(3)# 0IMP0->-1
- 0IMP-1->-1
- -1IMP0->0
- -1IMP-1->-1
-
-
-
-Prioritäten der Operanden
-
-
-Hier die Übersicht über alle Operatoren in der Reihenfolge ihrer Ausführung
-
-
- Operator Priorität
-
- ^ Potenzierung 13
- +, - positives/negatives Vorzeichen 12
- *, / Multiplikation, REAL-Division 11
- \ INT-Division 10
- MOD Divisionsrest- (MOD-) Operation 9
- +, - Addition, Subtraktion 8
- =, <>, <, >, <=, >= Vergleichsoperatoren 7
- NOT Negation 6
- AND UND-Verknüpfung 5
- OR ODER-Verknüpfung 4
- XOR Exklusiv-ODER-Verknüpfung 3
- EQV Äquivalenz-Verknüpfung 2
- IMP Implikations-Verknüpfung 1
-
-
-Die Reihenfolge der Auswertung von Ausdrücken kann durch Klammern geändert
-werden.
-
-Beachten Sie, daß der Operator '=' in BASIC die Funktion eines Vergleichsoperators
-und des #ib(3)#Zuweisungsoperators#ie(3)##ib(3)##ie(3, "Operator, Zuweisungs-")# (siehe Kapitel 8, LET-Anweisung) hat.
-
-#page#
-
-4.5. #ib(3)#Funktionen#ie(3)#
-
-
-
-Standard-Funktionen
-
-Der EUMEL-BASIC-Compiler unterstützt eine ganze Reihe von Funktionen. Diese
-Funktionen liefern Werte und können in Ausdrücken zusammen mit Konstanten,
-Variablen und Operatoren verwendet werden.
-Viele der eingebauten Funktionen arbeiten mit Argumenten, das heißt es werden den
-Funktionen Werte übergeben.
-In Kapitel 8 dieses Handbuches sind alle Funktionen ausführlich beschrieben.
-Beispiele für #ib(3)#Funktionsaufrufe#ie(3)#:
- SQR (17) Dieser Ausdruck liefert die Wurzel von 17 als REAL.
- RIGHT$ (text$, 5) Dieser Ausdruck liefert die letzten fünf Textzeichen
-#right#aus 'text$' als TEXT.
-
-
-
-Benutzer-definierte Funktionen
-
-Neben der Verwendung der standardmäßig verfügbaren Funktionen besteht für den
-Benutzer die Möglichkeit, selbst Funktionen innerhalb eines Programms zu definieren.
-
-#on ("b")#
-#ib(3)#Definition benutzer-definierter Funktionen#ie(3)# #off ("b")#
-Hierzu dient die #ib(3)#DEF FN#ie(3)#-Anweisung (vergleiche Kapitel 8).
-Die Syntax der DEF FN-Anweisung lautet:
-
-DEFFN<Name>[(<Parameter>[,<Parameter>][...])]=
-#right#<Funktionsdefinition>
-
-<Name>: Zeichenfolge, die der Syntax für Variablennamen ent­
- sprechen muß.
- FN<Name> bilden zusammen den Namen der neuen
- Funktion.
-<#ib(3)#Parameter#ie(3)#>: Zeichenfolge, die der Syntax für Variablennamen ent­
- sprechen muß.
-<Funktionsdefinition>: Ausdruck, der Konstanten, Variablen, die Parameter der
- Funktion und Aufrufe anderer Funktionen enthalten
- darf.
-
-- Die benutzer-definierten Funktionen ("user functions") liefern, genau wie die
- Standard-Funktionen, Werte.
-- Das letzte Zeichen des Funktionsnamens gibt den Typ des Wertes an, den die
- Funktion liefert. Soll die Funktion einen TEXT liefern, so muß der Name mit "$"
- enden. Soll ein INT geliefert werden, muß der Name mit "%" enden. Für alle
- anderen Endungen wird eine REAL-liefernde Funktion eingetragen.
-- Die Syntax der Parameternamen entspricht der Syntax für die Namen von einfachen
- Variablen.
-- Die Parameter haben nur bei der Definition Gültigkeit. Hierbei 'überdecken' sie (für
- diese Zeile) eventuell im BASIC-Programm vorhandene gleichnamige Variablen.
-- Jeder Parameter darf in der Parameterliste nur einmal vorkommen.
-- Bezeichnet der Funktionsname eine TEXT-liefernde Funktion, so muß auch die
- Funktionsdefinition ein Ergebnis vom Typ TEXT liefern. Zwischen INTs und REALs
- findet eine Typanpassung statt.
-- Eine Funktion darf nicht in ihrer eigenen Definition erscheinen.
-- Eine Funktion ist allein durch ihren Namen gekennzeichnet. Generische Funktionen
- (gleicher Name, aber unterschiedliche Parameter) können somit nicht definiert wer­
- den.
-
-Beispiele für gültige Funktionsdefinitionen:
- DEF FNPI = 3.1415927
- DEF FNumfang (radius) = 2.0 * FNPI * radius (Enthält Aufruf von FNPI)
- DEF FNhallo$ (dummy$) = "Hallo " + name$ (name$ kommt im
- #right#BASIC-Programm vor)
- DEF FNheavyside% (x) = ABS (SGN (x) = 1)
-
-Beispiele für ungültige Funktionsdefinitionen:
- DEF FNfunct (a, b, a) = a ^ 2 + b (a kommt zweimal als Parameter vor)
- DEF FNfr (x) = x * FNfr (x - 1) (rekursive Definition)
-
-
-#on ("b")#
-#ib(3)#Aufruf benutzer-definierter Funktionen#ie(3)# #off ("b")#
-
-FN<Name> [ ( <Argument> [, <Argument>] [...] ) ]
-
-<#ib(3)#Argument#ie(3)#> : Ausdruck, der für den entsprechenden Parameter bei der Evaluation
- (Auswertung) der Funktion eingesetzt werden soll
-
-- Beim Funktionsaufruf werden die Argumente in der Reihenfolge ihres Auftretens für
- die Parameter eingesetzt. Für TEXT-Parameter müssen die Argumente ebenfalls
- TEXTe liefern. Zwischen INTs und REALs findet eine Typanpassung statt.
-- Die Anzahl der Argumente muß genau mit der Anzahl der Parameter übereinstim­
- men.
-- Für in der Funktionsdefinition vorkommende Variablen wird der zum Zeitpunkt des
- Funktionsaufruf gültige Wert eingesetzt.
-- Die Definition der Funktion muß dem ersten Aufruf der Funktion textuell voraus­
- gehen.
-- Eine Definition gilt für alle textuell folgenden Aufrufe, bis die Funktion wieder neu
- definiert wird.
-
-Beispiele für korrekte Funktionsaufrufe (bezogen auf obige Beispiel-Definitionen):
- PRINT FNPI / 2.0 (Ausgabe: 1.570796)
- PRINT FNumfang (20) (Ausgabe: 125.6637)
- LET name$ = "Purzelbär":PRINT FNhallo$ ("") (Ausgabe: Hallo Purzelbär)
- PRINT heavyside% (-17.3) (Ausgabe: 0)
-
-Beispiele für falsche Funktionsaufrufe (bezogen auf obige Beispiel-Definitionen):
- PRINT FNPI (10) (kein Argument erwartet)
- PRINT FNumfang (Argument erwartet)
- PRINT FNhallo$ (zahl%) (Falscher Typ des Arguments)
- PRINT FNheavyside (17.4, -12.3) (Zu viele Argumente)
-
-
-#page#
-
-4.6. #ib(3)#Typanpassung#ie(3)#
-
-
-In BASIC wird, im Gegensatz zu ELAN, nicht sehr streng zwischen den numerischen
-Datentypen unterschieden, sondern es finden häufig automatische Typanpassungen
-statt. Zu solchen Typanpassungen kommt es vor allem bei der Zuweisung, bei Opera­
-toren und bei Funktionen, aber auch bei einigen Anweisungen.
-Die automatische Typanpassung hat zwei Nachteile:
-1. Die Typkonvertierung von INT nach REAL und umgekehrt kostet Zeit während der
- Programmausführung.
-2. Es kann zu sehr unangenehmen Laufzeitfehlern kommen, wenn eine REAL-
- INT-#ib(3)#Konvertierung#ie(3)# mit Fehler abbricht, weil der REAL-Wert außerhalb des
- INT-Wertebereichs liegt.
-
-Allgemein gilt also, daß sich der Programmierer auch in BASIC über die Typen der
-verwendeten Objekte im klaren sein sollte. Außerdem ist zu beachten, daß bei Konver­
-tierungen von REAL nach INT immer gerundet wird.
-
-Genaueres zur Typanpassung bei der Zuweisung finden Sie in Kapitel 8 bei der
-LET-Anweisung.
-Ãœber Typkonvertierung bei Operatoren informiert Kapitel 4.4.
-Informationen über die Funktionen betreffenden Typkonvertierungen befinden sich am
-Anfang von Kapitel 8 und direkt bei der Beschreibung der jeweiligen Funktionen
-(ebenfalls in Kapitel 8).
-
-#page#
-
-4.7. Aufruf von EUMEL-Prozeduren in
- BASIC-Programmen
-
-
-
-Der EUMEL-BASIC-Compiler bietet die Möglichkeit, insertierte ELAN-Prozeduren
-(und auch insertierte BASIC-Programme) in BASIC-Programmen aufzurufen. Hierzu
-werden die beiden Anweisungen #ib(3)#CALL#ie(3)# und #ib(3)#CHAIN#ie(3)# (identisch) sowie die Funktion
-#ib(3)#USR#ie(3)# zur Verfügung gestellt.
-Mit der CALL-Anweisung (siehe auch Kapitel 8) können Prozeduren aufgerufen
-werden, die keinen Wert liefern und nur die BASIC-Datentypen INT, REAL und/oder
-TEXT als Parameter benötigen.
-Beispiele:
- CALL list
- CALL taskstatus ("PUBLIC")
- CALL cursor (10, 21)
- CALL getcursor (x%, y%)
-
-Das letzte Beispiel zeigt, daß auch #ib(3)#VAR-Parameter#ie(3)# im ELAN-Sinne übergeben
-werden können.
-
-Die Funktion USR dient im Gegensatz zu CALL zum Aufruf von #ib(3)#wertliefernden Pro­
-zeduren#ie(3)#. Die Prozeduren dürfen allerdings nur einen der BASIC-Datentypen INT,
-REAL oder TEXT liefern. Es gilt auch bei USR, wie bei CALL, daß die aufgerufenen
-Prozeduren nur Parameter der Typen INT, REAL oder TEXT haben dürfen.
-Beispiele:
- PRINT USR e (Ausgabe: 2.718282)
- PRINT USR compress (" EUMEL ") (Ausgabe: EUMEL)
-
-#on ("b")#
-Wichtige Hinweise zu CALL, CHAIN und USR: #off ("b")#
-1. Bei den Parametern finden keinerlei Typkonvertierungen statt (ELAN-
- Prozeduren werden ja gerade anhand der Typen ihrer Parameter eindeutig identifi­
- ziert).
-2. Die Prozedurnamen nach CALL, CHAIN und USR dürfen keine Leerzeichen ent­
- halten, weil die Prozedur sonst nicht identifiziert werden kann.
- Beispiel: CALLlernsequenzauftastelegen(...) statt
- CALLlernsequenzauftastelegen(...)
-3. Die Prozedurnamen können (nach BASIC-Konvention) auch Großbuchstaben
- enthalten.
- Beispiel: CALLcursor(17,4) ist äquivalent zu
- CALLCURSOR(17,4)
-
-
-Wie in Kapitel 3 erläutert kann ein BASIC-Programm auch insertiert werden. Somit
-können mit der CALL-Anweisung auch andere (vorher insertierte) BASIC-
-Programme aufgerufen werden.
-Beispiel:
-CALL blackjack ('blackjack' sei der Prozedurname, unter dem ein BASIC-
- Programm zuvor insertiert wurde.)
-
-Die sonst in einigen BASIC-Dialekten vorhandene Möglichkeit, Programme oder
-#ib(3)#Programmsegmente#ie(3)# nachzuladen, kann so durch Aufrufe von insertierten Programmen
-nachgebildet werden.
-#page#
-#head#
-EUMEL-BASIC-Compiler 5. Steuerung der Bildschirmausgaben %
-
-#end#
-
-5. #ib(4)#Steuerung der #ib(3)#Bildschirmausgaben#ie(3)##ie(4)#
-
-
-
-Die Ausgaben von BASIC-Programmen ('PRINT' und 'WRITE') werden im Paket
-'basic output' behandelt. Dieses Paket ermöglicht unter anderem, daß die Ausgabe
-auf das Terminal mit der Prozedur
-
- PROC #ib(3)#basic page#ie(3)# (BOOL CONST status)
-
-gesteuert werden können. Wird dabei 'TRUE' eingestellt, so wartet die Ausgabe bei
-Erreichen der letzten Terminalzeile auf die Eingabe eines Zeichens, bevor sie fortfährt.
-Das Eingabezeichen wird nach Ausgabe von ">>" in der rechten unteren Ecke des
-Bildschirms erwartet und wie folgt interpretiert:
-
-#linefeed (1.5)#
- Löschen des Bildschirms und Ausgabe der nächsten Bildschirmseite
- Ausgabe der nächsten Zeile
- Abbruch des Programms mit der Fehlermeldung "'halt' vom Terminal"
- 'basic page' wird auf 'FALSE' gesetzt #linefeed (1.0)#und mit der normalen Ausgabe
- weitergemacht
-
-Alle anderen Tasten bewirken eine Ausgabe der nächste Bildschirmseite (#ib(3)#Scrolling#ie(3)#).
-
-Ist 'basic page' auf 'FALSE' gesetzt, so kann durch Eingabe von vor einem Zei­
-lenwechsel 'basic page' auf 'TRUE' gesetzt werden.
-#page#
-#head#
-EUMEL-BASIC-Compiler 6. Grenzen des Compilers %
-
-#end#
-
-6. #ib(3)#Grenzen des Compilers#ie(3)#
-
-
-Es gibt verschiedene Grenzen, die bei der Benutzung des BASIC-Compilers erreicht
-werden können.
-
-#on ("b")#
-Grenzen des #ib(3)#EUMEL-Coder#ie(3)#s #off ("b")#
-Da ein BASIC-Programm vom Compiler als eine Prozedur im Coder eingetragen
-wird, darf der Code für ein BASIC-Programm die #ib(3)#Modulgrenze#ie(3)# von 7500 Byte Code
-nicht überschreiten.
-Sollte dies doch einmal der Fall sein (#ib(3)#Compiler Error 308#ie(3)#), so gibt es folgende
-Abhilfe-Möglichkeiten:
-- Zerlegen des BASIC-Programms in mehrere BASIC-Programme, wobei ein
- Programm das andere während der Ausführung aufrufen kann (vgl.4.7.).
- Bei dieser Methode können die Teilprogramme aber nicht mit gemeinsamen Variab­
- len arbeiten.
-- Auslagerung von Programmteilen (z.B. Unterprogrammen) in ELAN-Prozeduren,
- die insertiert und vom BASIC-Programm aufgerufen werden können (vgl.4.7.).
- Dieses Verfahren bietet die Möglichkeit, Variablen zwischen BASIC-Programm und
- ELAN-Prozedur über die Prozedurschnittstelle auszutauschen.
-
-Neben der Begrenzung des Codes ist auch die Größe des Datenspeicherbereichs pro
-BASIC-Programm begrenzt. Insgesamt dürfen die Datenobjekte eines BASIC-
-Programms nicht mehr als 32 KByte Speicherplatz belegen. Andernfalls kommt es
-zum #ib(3)#Compiler Error 307#ie(3)#.
-
-Eine weitere Grenze des EUMEL-Coders stellt die maximal zulässige Anzahl der
-#ib(3)#Labels#ie(3)# (interne Sprungadressen) dar. Es können nur höchstens 2000 Labels vom
-Coder verwaltet werden. Der BASIC-Compiler vergibt für jede gefundene Zeile mit
-Zeilennummer ein Label und benötigt auch bei Schleifen (FOR-NEXT, WHILE-
-WEND), Fallunterscheidungen (IF-Anweisung), Unterprogramm-Aufrufen (GOSUB)
-und bei der Definition von benutzer-definierten Funktionen (DEF) Labels.
-Beim Auftreten des #ib(3)#Compiler Errors 304#ie(3)# (zu viele Label) ist Abhilfe relativ leicht
-dadurch möglich, daß Zeilennummern nur den Zeilen vergeben werden, die tatsächlich
-angesprungen werden (d.h. zu denen es GOTOs oder GOSUBs gibt).
-
-#on ("b")#
-Grenzen des BASIC-Compilers #off ("b")#
-Die interne #ib(3)#Namenstabelle#ie(3)# des BASIC-Compilers kann etwa 4240 Einträge aufneh­
-men. Ein Eintrag in dieser Tabelle wird für jede Variable, für jedes Feld, für jede
-benutzer-definierte Funktion und für jeden Parameter einer benutzer-definierten
-Funktion sowie für jede Konstante erzeugt. Numerische Konstanten erhalten, sofern
-sie konvertiert werden müssen, sogar zwei Einträge in der Namenstabelle.
-Bei Auftreten des seltenen Fehlers "volle Namenstabelle" kann durch eine Aufteilung
-des BASIC-Programms in Teilprogramme oder eine Auslagerung von Unterprogram­
-men in ELAN-Prozeduren Abhilfe geschaffen werden.
-
-#on ("b")#
-Sonstige EUMEL-Grenzen #off ("b")#
-Außer den bisher genannten Begrenzungen sei nochmals auf die Begrenzung des
-#ib(3)#Codebereichs pro Task#ie(3)# hingewiesen (maximal 256 KByte Code).
-Da der EUMEL-Coder und der BASIC-Compiler recht viel Code belegen, sollte
-"vorsichtig" insertiert werden, also nur das, was wirklich benötigt wird.
-Auch die übrigen Grenzen des EUMEL-Systems sind zu beachten (vergleiche hierzu
-die Aufstellung der möglichen Compiler Errors im EUMEL-Benutzerhandbuch)!
-
-#page#
-#head#
-EUMEL-BASIC-Compiler 7. Fehlerbehandlung %
-
-#end#
-
-7. #ib(3)#Fehlerbehandlung#ie(3)#
-
-
-7.1. #ib(3)#Fehler zur Ãœbersetzungszeit#ie(3)#
-
-Endeckt der BASIC-Compiler bei der Ãœbersetzung eines BASIC-Programms Fehler,
-so werden diese auf dem Bildschirm angezeigt und ins #ib(3)#Notebook#ie(3)# eingetragen.
-Nur (syntaktisch) fehlerfreie Programme werden zur Ausführung gebracht beziehungs­
-weise insertiert.
-Im #ib(3)#Vordurchlauf#ie(3)# werden die Zeilennummern auf Richtigkeit überprüft. Falls bereits
-hiebei Fehler festgestellt werden, bricht der Compiler die Ãœbersetzung nach dem
-Vordurchlauf ab.
-Im #ib(3)#Hauptdurchlauf#ie(3)# wird das Programm Zeile für Zeile auf syntaktische Richtigkeit
-überprüft und gleichzeitig übersetzt. Wird dabei in einer Programmzeile ein Fehler
-entdeckt, so wird er angezeigt und die Übersetzung des Programms #on("i")#in der nächsten
-Programmzeile#off("i")# fortgesetzt. Eine Ausnahme von dieser Regel bildet nur die #ib(3)#DEF FN#ie(3)#-
-Anweisung, bei der bei gewissen Fehlern die Ãœbersetzung fortgesetzt wird. (Der
-Grund hierfür liegt darin, daß die Folgefehlerzahl besonders bei der DEF FN-
-Anweisung sehr groß wäre, wenn beim Auftreten eines Fehlers die Übersetzung der
-Zeile sofort abgebrochen würde. Die Parameter würden dann nämlich nicht oder
-falsch abgelegt, und bei jedem Aufruf der Funktion würde ein Fehler gemeldet.)
-
-Eine Übersicht über alle verwendeten Fehlermeldungen zur Übersetzungszeit befindet
-sich im AnhangC.
-
-
-
-Interne Compilerfehler
-
-Neben den "normalen" Fehlern (siehe oben) kann es in seltenen Fällen möglicher­
-weise auch zu internen Fehlern kommen.
-Es gibt zwei verschiedene Sorten von internen Fehlern:
-1. interne Fehler, die das Compilerprogramm selbst feststellt.
- Solche Fehler bewirken die Meldung "Interner Fehler !" (meist mit näherer Erläu­
- terung) und die Fortsetzung der Übersetzung in der nächsten Programmzeile.
-2. Fehler, die in anderen Paketen des BASIC-Systems oder des EUMELs (z.B. im
- EUMEL-Coder) während der Übersetzungszeit ausgelöst werden (siehe auch
- Kapitel 6: "Grenzen des Compilers").
- Solche Fehler werden mit "#ib(3)#BASIC-Compiler ERROR#ie(3)#" und eventuell näheren
- Angaben gemeldet. Beim Auftreten eines solchen Fehlers wird die Ãœbersetzung
- des gesamten Programms abgebrochen.
-
-Sollten bei Ihrer Arbeit mit dem EUMEL-BASIC-Compiler interne Fehler auftreten,
-die nicht auf das Überschreiten von Compilergrenzen zurückzuführen sind, dann
-wären wir Ihnen für eine Meldung der Fehler dankbar. Bitte senden Sie eine Fehler­
-beschreibung an:
-
- Gesellschaft für Mathematik und Datenverarbeitung
- Schloß Birlinghoven
- Postfach 1240
- 5205 Sankt Augustin 1
-
-Die Fehlerbeschreibung sollte nach Möglichkeit folgende Informationen enthalten:
-- verwendete Hardware
-- Urlader-Version
-- EUMEL-Version
-- Programmtext des Programms, das den Fehler auftreten ließ
-- genaue Angabe der ausgegebenen Fehlermeldung
-
-
-#page#
-
-7.2. #ib(3)#Fehler zur Laufzeit#ie(3)#
-
-Treten während der Laufzeit eines BASIC-Programms Fehler auf, so wird die Ausfüh­
-rung des Programms mit einer entsprechenden Fehlermeldung abgebrochen.
-Da die meisten Laufzeit-Fehlermeldungen durch Prozeduren des EUMEL-Systems
-(und nicht des BASIC-Systems) erzeugt werden, entsprechen sie oft nicht der
-BASIC-Terminologie. (Beispielsweise führt ein zu großer Feldindex zu der Fehlermel­
-dung "Ueberlauf bei Subskription".)
-
-Die bei Laufzeitfehlern gemeldete #ib(3)#Fehlerzeile#ie(3)# bezieht sich nicht (wie bei ELAN-Pro­
-grammen) auf die Nummer der Dateizeile, sondern auf die letzte der Programmzeile
-vorangegangene BASIC-Zeilennummer.
-
-Fast alle ausgelösten Laufzeitfehler erzeugen auch #ib(3)#Fehlercodes#ie(3)#. Dabei liefern Fehler
-aus EUMEL-Betriebssystem-Prozeduren die EUMEL-Standard-Fehlercodes (vgl.
-Systemhandbuch), zum Beispiel wird beim Fehler "INT-Ueberlauf" der Fehlercode 4
-geliefert.
-Laufzeitfehler, die in Prozeduren des BASIC-Systems ausgelöst werden, liefern dage­
-gen den in Microsoft-BASIC üblichen Fehlercode plus 1000. So liefert die Meldung
-"Keine Daten mehr für READ" den Fehlercode 1004 (MS-BASIC: "Out of data",
-Fehlercode 4).
-Es läßt sich so anhand des gelieferten Fehlercodes ermitteln, ob der Fehler im
-BASIC-System oder an einer anderen Stelle des EUMEL-Systems ausgelöst wurde.
-
-Eine Übersicht über die innerhalb des BASIC-Systems erzeugten Fehlermeldungen
-enthält Anhang C.
-
diff --git a/doc/basic/basic handbuch.2 b/doc/basic/basic handbuch.2
deleted file mode 100644
index 1379e9e..0000000
--- a/doc/basic/basic handbuch.2
+++ /dev/null
@@ -1,2441 +0,0 @@
-#page nr ("%", 31)#
-#head#
-EUMEL-BASIC-Compiler 8. Übersicht über die Befehle und Funktionen %
-
-#end#
-
-8. Übersicht über die Anweisungen und Funktionen
-
-
-
-In diesem Kapitel sind alle Anweisungen und Funktionen des vom Compiler übersetz­
-baren BASIC-Sprachumfangs in alphabetischer Reihenfolge aufgeführt.
-Auch die Anweisungsbestandteile (z.B. ELSE und TO) sind mit einem Hinweis auf die
-zugehörige Anweisung eingeordnet.
-Sind bei Funktionen INT- oder REAL-Ausdrücke als Argumente angegeben, so ist
-dies als Hinweis auf den Sinn der Funktion zu verstehen. Es können auch Ausdrücke
-des jeweils anderen Datentyps eingesetzt werden. Wird statt eines INT-Ausdrucks
-ein REAL-Ausdruck angegeben, so darf dessen Wert aber nur innerhalb des
-Wertebereichs für INTs liegen, da der REAL-Wert bei der Ausführung der Funktion
-in einen INT-Wert konvertiert wird.
-
-
-
-Funktion : ABS
-
-Zweck : Berechnung des Betrages (Absolutwertes) einer Zahl
-
-Syntax : ABS (<num. Ausdruck>)
-
-Erklärung : Liefert den Betrag des numerischen Ausdrucks.
- Das Ergebnis ist vom gleichen Typ wie das Argument.
-
-
-Beispiel : 10 a = -12.74
- 20 PRINT ABS (a)
- Ausgabe: 12.74
-
-Vergleiche : SGN-Funktion
-
-
-
-Operator : AND
-
-Siehe Kapitel 4.4. (Operatoren)
-
-
-
-Anweisungsbestandteil : AS
-
-Siehe NAME-Anweisung
-
-
-
-Funktion : ASC
-
-Zweck : Ermittlung des ASCII-Codes eines Textzeichens
-
-Syntax : ASC (<TEXT-Ausdruck>)
-
-Erklärung : Die Funktion liefert den ASCII-Code des ersten Zeichens des
- TEXT-Ausdrucks.
- Der Code wird als INT geliefert.
-
-
-Beispiel : 10 a$ = "Guten Tag !"
- 20 PRINT ASC (a$)
- Ausgabe: 71
-
-Vergleiche : CHR$-Funktion (Komplementärfunktion)
-
-
-
-Funktion : ATN
-
-Zweck : Berechnung des Arcustangens
-
-Syntax : ATN (<num. Ausdruck>)
-
-Erklärung : Die Funktion liefert den Arcustangens des
- numerischen Ausdrucks in Radiant.
-
-
-Beispiel : 10 LET x = 4
- 20 PRINT ATN (x)
- Ausgabe: 1.325818
-
-Vergleiche : TAN-Funktion (Komplementärfunktion), SIN, COS
-
-
-
-Anweisungsbestandteil : BASE
-
-Siehe OPTION BASE-Anweisung
-
-
-
-Anweisung : CALL
-
-Zweck : Aufruf einer insertierten Prozedur
-
-Syntax : CALL <Prozedurname> #right#[ (<Parameter> [, <Parameter>] [...] ) ]
-
-Erklärung : <Prozedurname>: Folge aus Zeichen, die für Prozeduren im
- EUMEL-System zugelassen sind (also Buchstaben und - ab der
- zweiten Stelle - Zahlen), aber keine Leerzeichen.
-
- <Parameter>: <CONST-Parameter> | <VAR-Parameter>
-
- <CONST-Parameter>: Ausdruck (genau des von der Prozedur
- benötigten Typs)
- <VAR-Parameter>: Variable (genau des von der Prozedur benö­
- tigten Typs)
-
- Die Prozedur mit dem angegebenen <Prozedurnamen> wird mit den
- angegebenen Parametern aufgerufen.
- Die aufgerufene Prozedur darf keinen Wert liefern (vgl. USR-Funk­
- tion).
-
- Mögliche Fehlerfälle:
- - Eine Prozedur mit dem Namen <Prozedurnamen> und den an­
- gegebenen Parametern gibt es nicht.
- - Die Prozedur liefert einen Wert.
- - Die Prozedur benötigt Parametertypen, die in BASIC nicht bekannt
- sind (z.B. BOOL, FILE, TASK, QUIET).
- - Ein Parameter ist CONST, es wird aber ein VAR-Parameter ver­
- langt.
-
- Weitere Informationen finden Sie in Kapitel 4.7.
-
-Hinweis : 1. Bei den Parametern wird keine Typkonvertierung vorgenommen.
- 2. Der Prozedurname muß (entgegen der ELAN-Gewohnheit) ohne
- Leerzeichen angegeben werden.
- 3. Statt des Anweisungswortes CALL kann auch CHAIN geschrieben
- werden. CALL und CHAIN werden im EUMEL-BASIC nicht wie
- in Microsoft-BASIC benutzt.
-
-
-Beispiel : 10 CALL sysout ("Meine Datei")
- 20 PRINT "Dieser Text geht nun in die Datei"
- 30 CALL sysout ("")
- 40 PRINT "Wieder auf den Bildschirm"
-
-
-Vergleiche : USR-Funktion
-
-
-
-Funktion : CDBL
-
-Zweck : Konvertierung in den Datentyp REAL
-
-Syntax : CDBL (<num. Ausdruck>)
-
-Erklärung : Das Ergebnis des numerischen Ausdrucks wird als REAL geliefert.
-
-
-Beispiel : 10 LET a! = 17
- 20 PRINT USR max (CDBL (a!), 152.3)
- 30 REM max benötigt zwei REALs als Parameter
-
-
-Vergleiche : CINT-Funktion
-
-
-
-Anweisung : CHAIN
-
-Vollkommen identisch mit der CALL-Anweisung (Erklärung siehe dort !)
-
-
-
-Funktion : CHR$
-
-Zweck : Erzeugung eines Textzeichens mit einem bestimmten ASCII-Code
-
-Syntax : CHR$ (<INT-Ausdruck>)
-
-Erklärung : Die Funktion liefert das Zeichen mit dem ASCII-Code, den der
- INT-Ausdruck angibt.
- Das Zeichen wird als TEXT geliefert.
- Die Leistung der Funktion ist nur für Werte im Bereich 0 bis 255
- definiert.
-
-
-Beispiel : 10 PRINT CHR$ (61)
- Ausgabe: =
-
-Vergleiche : ASC-Funktion (Komplementärfunktion)
-
-
-
-Funktion : CINT
-
-Zweck : Konvertierung in den Datentyp INT
-
-Syntax : CINT (<num. Ausdruck>)
-
-Erklärung : Das Ergebnis des numerischen Ausdrucks wird als INT geliefert.
- REALs werden gerundet. Werte außerhalb des INT-Bereichs führen
- zu einem INT-Ãœberlauf.
-
-
-Beispiel : 10 LET a = 17.625
- 20 PRINT CINT (a); CINT (-a)
- Ausgabe: 18 -18
-
-Vergleiche : CDBL-, FIX-, INT-Funktionen
-
-
-
-Anweisung : CLS
-
-Zweck : Löschen des Bildschirms
-
-Syntax : CLS
-
-Erklärung : Löscht den Bildschirm und positioniert den Cursor in die linke obere
- Bildschirmecke (Position 1, 1).
-
-
-Beispiel : 10 CLS
- 20 PRINT "PROGRAMMBEGINN"
-
-
-
-
-Funktion : COS
-
-Zweck : Berechnung des Cosinus eines Radiantwertes
-
-Syntax : COS (<Winkel>)
-
-Erklärung : <Winkel>: REAL-Ausdruck, der den Winkel in Radiant angibt.
- Die Funktion liefert den Cosinus des Winkels als REAL.
-
-
-Beispiel : 10 PI = 3.141593
- 20 PRINT COS (PI/4)
- Ausgabe: .7071067
-
-Vergleiche : SIN-, TAN-Funktionen
-
-
-
-Funktion : CSRLIN
-
-Zweck : Ermittlung der aktuellen Cursorzeile
-
-Syntax : CSRLIN
-
-Erklärung : Geliefert wird die Nummer der Zeile (als INT), in der sich der Cursor
- auf dem Bildschirm befindet. Die oberste Zeile hat die Nummer 1.
-
-
-Beispiel : 10 CLS
- 20 PRINT
- 30 PRINT CSRLIN
- Ausgabe: 2
-
-Vergleiche : POS-Funktion
-
-
-
-Funktion : CVD, CVI
-
-Zweck : Decodierung von in Texten verschlüsselten Zahlenwerten
-
-Syntax : CVD (<TEXT-Ausdruck>)
- CVI (<TEXT-Ausdruck>)
-
-Erklärung : INTs und REALs können (mit MKI$ und MKD$) zu Texten codiert
- werden.
- CVD decodiert einen in 8 TEXT-Zeichen codierten REAL-Wert.
- CVI decodiert einen in 2 TEXT-Zeichen codierten INT-Wert.
- Es wird beim ersten Zeichen des TEXT-Ausdrucks mit der Dekodie­
- rung begonnen.
- Ist der TEXT zu kurz, so wird mit der Meldung "Ueberlauf bei Subs­
- kription" abgebrochen.
-
-
-Beispiel : 10 zahl$ = MKD$ (3.1415)
- 20 PRINT CVD (zahl$)
- Ausgabe: 3.1415
-
-Vergleiche : MKD$-, MKI$- Funktionen (Komplementärfunktionen)
-
-
-
-Anweisung : DATA
-
-Zweck : Ablegen von Konstanten
-
-Syntax : DATA [<string>] [, [<string>]] [...]
-
-Erklärung : <string> : <quoted string> | <unquoted string>
- <quoted string> : von Anführungszeichen umschlossene Zeichen­
- folge, die alle Zeichen außer Anführungs­
- zeichen enthalten darf
- <unquoted string>: Zeichenfolge, die alle Zeichen außer Komma
- und Doppelpunkt enthalten darf
-
- Eine DATA-Anweisung stellt einen Datenspeicher dar, der mit READ
- (s.d.) ausgelesen werden kann.
- In der DATA-Anweisung können "quoted strings" oder "unquo­
- ted strings" angegeben werden. "quoted strings" können später nur
- noch als Texte ausgelesen werden.
- Bei "unquoted strings" wird der Datentyp in der DATA-Anweisung
- dagegen nicht festgelegt. Sie können also als INTs, REALs oder
- TEXTe ausgelesen werden. Sollen "unquoted strings" Zahlenwerte
- darstellen, so müssen sie den in BASIC üblichen Schreibregeln für
- die numerischen Konstanten des jeweiligen Typs genügen. Es sind
- allerdings zusätzlich noch Vorzeichen erlaubt.
- Wenn die <strings> nicht angegeben sind, so wird ein "nil-Datum"
- abgelegt. Dieses bewirkt bei einem READ mit numerischer Variable
- die Lieferung des Wertes null und bei einem READ mit TEXT-Vari­
- able die Lieferung eines Leertextes.
-
- Die DATA-Anweisungen können an beliebiger Stelle im Programm
- (vor oder hinter den zugehörigen READ-Anweisungen) stehen.
-
- Alle DATA-Anweisungen eines Programms bilden zusammen einen
- großen sequentiellen Speicher, auf den mit READ der Reihe nach
- zugegriffen wird. Intern wird ein sogenannter READ-DATA-Zeiger
- geführt, der immer auf das nächste auszulesende Element zeigt.
- Die RESTORE-Anweisung (s.d.) ermöglicht es, den READ-
- DATA-Zeiger auf das erste Element einer bestimmten DATA-Zeile
- zu setzen.
-
-
-Beispiel : 2020 PRINT "Stadt", "Land", "Fluß"
- 2030 READ stadt$, land$, fluß$
- 2040 PRINT stadt$, land$, fluß$
- .
- 5000 DATA Paris, Frankreich, Seine
-
-
-Vergleiche : READ-, RESTORE-Anweisungen
-
-
-
-Funktion : DATE$
-
-Zweck : Abrufen des aktuellen Tagesdatums
-
-Syntax : DATE$
-
-Erklärung : Das Tagesdatum wird als Text in der Form TT.MM.JJ geliefert.
-
-
-Beispiel : 10 PRINT "Heute ist der " + DATE$
- Ausgabe (z.B.): Heute ist der 28.08.87
-
-Vergleiche : TIME$-Funktion
-
-
-
-Anweisung : DEFDBL, DEFINT, DEFSNG, DEFSTR
-
-Zweck : Definition von Anfangsbuchstaben zur Kennzeichnung bestimmter
- Variablentypen
-
-Syntax : DEFDBL <Buchstabe1> [ - <Buchstabe2>]
- #right#[, <Buchstabe3> [ - <Buchstabe4>] ] [...]
- DEFINT <Buchstabe1> [ - <Buchstabe2>]
- #right#[, <Buchstabe3> [ - <Buchstabe4>] ] [...]
- DEFSNG <Buchstabe1> [ - <Buchstabe2>]
- #right#[, <Buchstabe3> [ - <Buchstabe4>] ] [...]
- DEFSTR <Buchstabe1> [ - <Buchstabe2>]
- #right#[, <Buchstabe3> [ - <Buchstabe4>] ] [...]
-
-
-Erklärung : Mit den aufgeführten Anweisungen ist es möglich, bestimmte Buch­
- staben festzulegen, die, wenn sie als Anfangsbuchstaben eines
- Variablennamens verwendet werden, der Variablen einen bestimmten
- Typ zuordnen.
-
- Die Typfestlegung durch Kennzeichnung mit den Zeichen '!', '\#', '%'
- oder '$' hat jedoch Vorrang vor den festgelegten Anfangsbuchstaben.
- Eine genaue Erläuterung, nach welchen Kriterien der BASIC-Compi­
- ler den Typ einer Variablen feststellt, befindet sich in Kapitel 4.3.
-
- Die DEFINT-Anweisung legt Anfangsbuchstaben für INT-Variablen
- fest.
- Mit der DEFSTR-Anweisung werden Anfangsbuchstaben von
- TEXT-Variablen festgelegt.
- Die Anweisungen DEFDBL- und DEFSNG- wurden nur aus Kom­
- patibilitätsgründen implementiert. Sie werden zwar auf syntaktische
- Richtigkeit überprüft, aber ansonsten vom Compiler nicht beachtet.
-
- Werden bei den Anweisungen ganze Buchstabenbereiche angegeben,
- so muß der Buchstabe vor dem Bindestrich auch im Alphabet vor
- dem Buchstaben hinter dem Bindestrich stehen.
-
-Hinweis : 1. Die oben beschriebenen Anweisungen gelten stets erst für die im
- weiteren Text neu benutzten (also neu eingerichteten) Variablen.
- 2. Die beschriebenen Anweisungen dürfen auch mehr als einmal in
- einem Programm vorkommen. Die Buchstaben, die in der zweiten
- und in den folgenden Anweisungen festgelegt werden, werden
- #on("izusätzlich#off("i zu den in der ersten Anweisung festgelegten Buchsta­
- ben als Kennzeichen für den betreffenden Datentyp vom Compiler
- vermerkt.
- 3. Der Compiler überprüft nicht, ob gleiche Buchstaben als Kennzei­
- chen für mehr als einen Variablentyp angegeben werden (siehe
- Kapitel 4.3.). Der Benutzer ist also selbst dafür verantwortlich, daß
- solche Ãœberschneidungen nicht vorkommen.
-
-
-Beispiel : 10 DEFSTR s - z
- 20 DEFINT a - h, n
- 30 DIM tabelle (17) 'TEXT-Feld
- 40 LET c = 4 'INT-Variable
- 50 LET nummer = 17 'INT-Variable
- 60 LET ueberschrift = "Willkommen" 'TEXT-Variable
- 70 LET reellezahl = 19.563 'REAL-Variable
- 80 LET aha\# = -1.36E17 'REAL-Variable
-
-
-
-
-Anweisung : DEF FN
-
-Zweck : Definition einer benutzer-definierten Funktion
-
-Syntax : DEF FN<Name> [ ( <Parameter> [, <Parameter>] #right# [...] ) ] = <Funktionsdefinition>
-
-Erklärung : <Name> : Zeichenfolge, die der Syntax für Variablennamen
- entsprechen muß
- FN<Name> bilden zusammen den Namen der
- neuen Funktion
- <Parameter>: Zeichenfolge, die der Syntax für Variablennamen
- entsprechen muß
- <Funktionsdefinition>: Ausdruck, der Konstanten, Variablen, die
- Parameter der Funktion und Aufrufe
- anderer Funktionen enthalten darf
-
- Mit der DEF FN-Anweisung wird eine benutzer-definierte Funktion
- ("user function") mit dem Funktionsnamen FN<Name> definiert
- (vergleiche hierzu auch Kapitel 4.5.).
- Die benutzer-definierte Funktion liefert, genau wie die standard­
- mäßig eingebauten Funktionen, einen Wert, der sich aus der Auswer­
- tung des unter <Funktionsdefinition> angegebenen Ausdrucks
- ergibt.
- Das letzte Zeichen des Funktionsnamens gibt den Typ des Wertes
- an, den die Funktion liefert. Soll die Funktion einen TEXT liefern, so
- muß der Name mit "$" enden. Soll ein INT geliefert werden, muß der
- Name mit "%" enden. Für alle anderen Endungen wird eine REAL-
- liefernde Funktion eingetragen.
- Bezeichnet der Funktionsname eine TEXT-liefernde Funktion, so
- muß auch die Funktionsdefinition ein Ergebnis vom Typ TEXT liefern.
- Zwischen INTs und REALs findet eine Typanpassung statt.
-
- Die Parameter stehen für die beim Aufruf der Funktion übergebenen
- Argumente.
- Sie haben nur bei der Definition Gültigkeit. Hierbei 'überdecken' sie
- (für diese Zeile) eventuell im BASIC-Programm vorhandene gleich­
- namige Variablen.
- Die Syntax der Parameternamen entspricht der Syntax der Namen
- von einfachen Variablen.
- Jeder Parameter darf in der Parameterliste nur einmal vorkommen.
-
- In der Definition dürfen auch Aufrufe von zuvor definierten anderen
- "user functions" erscheinen, nicht aber die zu definierende Funktion
- selbst (rekursive Definition).
-
- Die Funktionen sind allein durch ihre Namen gekennzeichnet. Gene­
- rische Funktionen (gleicher Name, aber unterschiedliche Parameter)
- können somit nicht definiert werden.
-
-Hinweis : 1. Die Definition einer "user function" muß ihrem ersten Aufruf
- immer textuell vorausgehen.
- 2. "user functions" können auch mehrfach definiert werden. Der
- Compiler gibt in einem solchen Fall aber eine Warnung aus, da
- die neue Definition nur für die textuell folgenden Aufrufe gültig ist.
-
-
-Beispiel : 10 LET pi = 3.1415927
- 20 DEF FNkreisflaeche (radius)
- #right#= 4.0 * pi * radius * radius
- 1010 PRINT FNkreisflaeche (1.75)
- Ausgabe: 38.48451
-
-
-
-Anweisung : DIM
-
-Zweck : Dimensionierung eines Feldes
-
-Syntax : DIM <Felddeklaration> [, <Felddeklaration>] [...]
-
-Erklärung : <Felddeklaration>: <Feldvariable> (<INT-Konstante>
- #right#[, <INT-Konstante>] [...] )
- <Feldvariable>: Name des Feldes (Syntax wie Name von einfachen
- Variablen, vgl. 4.3.)
-
- Mit der DIM-Anweisung wird ein Feld dimensioniert, das heißt die
- Anzahl seiner Dimensionen sowie der kleinste und größte Index in
- jeder Dimension werden festgelegt und der Speicherplatz für seine
- Elemente (siehe 4.3.) wird reserviert.
-
- Der kleinste Index in allen Dimensionen richtet sich nach der letzten
- vorausgegangenen OPTION BASE-Anweisung.
- Geht der Dimensionierung die Anweisung OPTION BASE 0 textuell
- voraus oder ist keine OPTION BASE-Anweisung vor der Dimensio­
- nierung vorhanden, so ist der kleinste Index in allen Dimensionen
- null.
- Wenn der Dimensionierung aber eine OPTION BASE 1-Anweisung
- vorausgeht, dann ist der kleinste Index in allen Dimensionen eins.
-
- Der größte Feldindex wird für jede Dimension durch die in Klammern
- stehenden INT-Konstanten angegeben. Die Anzahl dieser INT-Kon­
- stanten bestimmt auch, wie viele Dimensionen das dimensionierte
- Feld hat.
-
- Wird auf ein Element einer Feldvariablen zugegriffen, ohne daß die
- Feldvariable vorher dimensioniert wurde, dann wird das Feld automa­
- tisch dimensioniert, wobei die Anzahl der Dimensionen anhand der
- Anzahl der Indizes beim Aufruf ermittelt wird. Der größte Feldindex
- wird bei dieser automatischen Dimensionierung in jeder Dimension
- auf zehn gesetzt. Der kleinste Index richtet sich nach den vorausge­
- gangenen OPTION BASE-Anweisungen (siehe oben).
-
- Fehlerfälle bei der Dimensionierung:
- - "Das Feld ist bereits dimensioniert":
- Das Feld wurde bereits explizit, oder automatisch durch den Zugriff
- auf ein Feldelement dimensioniert .
- - "Die Obergrenze muß >= 1 sein":
- Es wurde versucht, 0 als größten Index in einer Dimension festzu­
- legen, obwohl mit OPTION BASE der kleinste Index auf eins fest­
- gelegt wurde.
-
- Fehlerfälle beim Zugriff auf ein Feldelement:
- - "Dimensioniert in ... Dimensionen, gefundene Anzahl Indizes ...":
- Beim Zugriff wurde eine Anzahl von Indizes gefunden, die nicht mit
- der Anzahl der Dimensionen übereinstimmt (Fehler zur Über­
- setzungszeit).
- - "Ueberlauf bei Subskription" oder "Unterlauf bei Subskription":
- Der Index ist zu groß beziehungsweise zu klein (Fehler zur Lauf­
- zeit).
-
-
-Beispiel : 10 DIM a% (20, 10), text$ (30, 40)
- 20 DIM tabelle (5, 7, 25)
- 30 LET element = matrix (1, 7)
-
- Zeile 30 führt eine automatische Dimensionierung durch, die einem
- DIM matrix (10, 10) entspricht.
-
-
-
-Anweisungsbestandteil : ELSE
-
-Siehe IF-Anweisung
-
-
-
-Anweisung : END
-
-Zweck : Beenden der Programmausführung eines BASIC-Programms
-
-Syntax : END
-
-Erklärung : END beendet die Programmausführung des BASIC-Programms ohne
- eine Meldung (im Gegensatz zu STOP, s.d.).
- END-Anweisungen dürfen im Programm an beliebiger Stelle stehen,
- und es darf auch mehr als eine END-Anweisung in einem
- Programm vorkommen.
- Der Compiler übersetzt ein Programm auch nach Erreichen einer
- END-Anweisung weiter.
- Nach der letzten Anweisung eines Programms muß kein END stehen.
-
-
-Beispiel : 2020 PRINT "Das war's !"
- 2030 REM Hiernach hört's auf
- 2040 END
-
-
-Vergleiche : STOP-Anweisung
-
-
-
-Anweisungsbestandteil : EOF
-
-Siehe INPUT-Anweisung
-
-
-
-
-Operator : EQV
-
-Siehe Kapitel 4.4. (Operatoren)
-
-
-
-Funktion : ERL
-
-Zweck : Ermittlung der letzten Fehlerzeile
-
-Syntax : ERL
-
-Erklärung : Die Nummer der Zeile, in der der letzte Fehler auftrat, wird als INT
- geliefert.
-
-Hinweis : ERL ist realisiert durch Aufruf der Prozedur 'errorline' des Betriebs­
- systems.
- Da die Fehlerbehandlungs-Anweisung ON ERROR nicht zur Verfü­
- gung steht, ist diese Funktion nicht im üblichen BASIC-Sinne
- brauchbar.
-
-Vergleiche : ERM$, ERR-Funktionen, ERROR-Anweisung
-
-
-
-Funktion : ERM$
-
-Zweck : Ermittlung der letzten Fehlermeldung
-
-Syntax : ERM$
-
-Erklärung : Die letzte Fehlermeldung wird als TEXT geliefert.
-
-Hinweis : ERM$ ist realisiert durch Aufruf der Prozedur 'errormessage' des
- Betriebssystems.
- Da die Fehlerbehandlungs-Anweisung ON ERROR nicht zur Verfü­
- gung steht, ist diese Funktion nicht im üblichen BASIC-Sinne
- brauchbar.
-
-Vergleiche : ERL-, ERR-Funktionen, ERROR-Anweisung
-
-
-
-Funktion : ERR
-
-Zweck : Ermittlung des letzten Fehlercodes
-
-Syntax : ERR
-
-Erklärung : Der Code des letzten aufgetretenen Fehlers wird als INT geliefert.
-
-Hinweis : ERR ist realisiert durch Aufruf der Prozedur 'errorcode' des Betriebs­
- systems.
- Da die Fehlerbehandlungs-Anweisung ON ERROR nicht zur Verfü­
- gung steht, ist diese Funktion nicht im üblichen BASIC-Sinne
- brauchbar.
-
-Vergleiche : ERL-, ERM$-Funktionen, ERROR-Anweisung
-
-
-
-Anweisung : ERROR
-
-Zweck : Auslösen eines Fehlers mit bestimmtem Fehlercode
-
-Syntax : ERROR <INT-Ausdruck>
-
-Erklärung : Es wird ein Fehler mit dem durch den INT-Ausdruck bestimmten
- Fehlercode ausgelöst.
-
-Hinweis : ERROR ist realisiert durch Aufruf der Prozedur 'errorstop' des Be­
- triebssystems.
- Da die Fehlerbehandlungs-Anweisung ON ERROR nicht zur Verfü­
- gung steht, ist diese Anweisung nicht im üblichen BASIC-Sinne
- brauchbar.
-
-Vergleiche : ERL-, ERM$-, ERR-Funktionen
-
-
-
-Funktion : EXP
-
-Zweck : Berechnung einer Potenz der Eulerschen Zahl
-
-Syntax : EXP (<REAL-Ausdruck>)
-
-Erklärung : Die Funktion liefert e (die Basis des natürlichen Logarithmus) poten­
- ziert mit dem Wert des REAL-Ausdrucks.
- Bei zu großen Werten kommt es zum Fehler 'REAL-Ueberlauf'.
- Das Ergebnis der Funktion wird als REAL geliefert.
-
-
-Beispiel : 10 PRINT EXP (10.0)
- Ausgabe: 22026.47
-
-Vergleiche : LOG-Funktion (Komplementärfunktion)
-
-
-
-Funktion : FIX
-
-Zweck : Ermittlung der Vorkommastellen einer REAL-Zahl
-
-Syntax : FIX (<REAL-Ausdruck>)
-
-Erklärung : Die Funktion schneidet die Nachkommastellen ab und liefert nur die
- Vorkommastellen des REAL-Ausdrucks.
- Die Vorkommastellen werden ebenfalls als REALs geliefert.
-
-
-Beispiel : 10 zahl = 1.2345E2
- 20 PRINT FIX (zahl)
- Ausgabe: 123
-
-Vergleiche : CINT-, INT-Funktionen
-
-
-
-Anweisung : FOR
-
-Zweck : Beginn einer Zählschleife
-
-Syntax : FOR <num. Variable> = <Anfangswert> #ib(3)#TO#ie(3)# <Endwert>
- #right#[ #ib(3)#STEP#ie(3)# <Schrittweite> ]
- <Schleifenrumpf>
-
-
-Erklärung : <num. Variable> : INT- oder REAL-Variable
- <Anfangswert> : numerischer Ausdruck
- <Endwert> : numerischer Ausdruck
- <Schrittweite> : numerischer Ausdruck
- <Schleifenrumpf>: Folge von Programmzeilen
-
- Die FOR-Anweisung erlaubt die komfortable Programmierung von
- automatischen Zählschleifen (sogenannten FOR-NEXT-Schleifen).
- Gelangt das Programm während der Ausführung an eine FOR-An­
- weisung, so werden zunächst die Ausdrücke <Anfangswert>,
- <Endwert> sowie gegebenenfalls <Schrittweite> ausgewertet. Der
- Anfangswert wird dann der Variablen zugewiesen.
- Wenn der Wert der Variablen größer ist als der Endwert (bzw. kleiner
- als der Endwert bei negativer Schrittweite), dann wird das Programm
- mit der nach dem korrespondierenden NEXT (s.d.) folgenden
- Anweisung fortgesetzt.
- Ist dies jedoch nicht der Fall, werden die Anweisungen des <Schlei­
- fenrumpfs> ausgeführt. Erreicht das Programm nun die zum FOR
- gehörige NEXT-Anweisung (gleiche Variable), so wird der Wert der
- Variablen um die Schrittweite erhöht beziehungsweise erniedrigt (je
- nach Vorzeichen), und wieder an den Anfang der Schleife verzweigt.
- Hier findet dann wieder der Vergleich des Variableninhalts mit dem
- Endwert statt (siehe oben).
-
- Die Laufvariable darf innerhalb der Schleife in Ausdrücken vorkom­
- men. Sie darf sogar verändert werden (, was aber zu unübersichtli­
- chen Effekten führen kann). Auch eine Schachtelung mehrerer
- Schleifen mit der gleichen Laufvariable ist syntaktisch möglich, sollte
- aber #on("iunter allen Umständen#off("i vermieden werden.
-
- FOR-NEXT-Schleifen dürfen (auch mit WHILE-WEND-Schleifen,
- s.d.) geschachtelt werden. Ãœberschneidungen von FOR-NEXT-
- Schleifen und WHILE-WEND-Schleifen sind aber nicht zulässig.
-
-
-Beispiel : 10 DIM name$ (5)
- 20 FOR i = 1 TO 5
- 30 PRINT "Bitte geben Sie den " + STR$ (i)
- #right#+ ". Namen ein:";
- 40 INPUT name$ (i)
- 50 NEXT i
-
-
- Es werden die fünf Elemente des Feldes 'name$' eingelesen.
-
-Vergleiche : NEXT-, WHILE-, IF-Anweisungen
-
-
-
-Funktion : FRE
-
-Zweck : Ermittlung des verfügbaren Speicherplatzes
-
-Syntax : FRE (<num. Ausdruck>)
- FRE (<TEXT-Ausdruck>)
-
-Erklärung : Die Funktion liefert die Anzahl der freien Bytes.
- FRE veranlaßt außerdem ein 'collect heap garbage' (EUMEL-
- Systemprozedur).
-
- Das Ergebnis der Funktion wird als REAL geliefert.
- Der Argument-Ausdruck ist ein Dummy-Argument (hat keinen
- Einfluß auf den gelieferten Wert).
-
-Hinweis : Bei der EUMEL M+ Version wird ein korrektes Ergebnis geliefert
- (vgl.'storage info').
-
-
-Beispiel : 10 PRINT FRE (0)
- Ausgabe (z.B.): 5324800
-
-
-
-Anweisungsbestandteil : GO
-
-Siehe GOSUB und GOTO
-
-
-
-Anweisung : GOSUB
-
-Zweck : Unterprogramm-Aufruf
-
-Syntax : GOSUB <Zeilennummer>
-
-Erklärung : <Zeilennummer>: INT-Konstante
- Statt GOSUB darf auch GO #ib(3)#SUB#ie(3)# geschrieben werden.
-
- Die Programmausführung wird in der Zeile mit der angegebenen
- Zeilennummer fortgesetzt. Die Zeile mit der Zeilennummer muß im
- Programm existieren.
- Wird im weiteren Programmablauf die Anweisung RETURN gefunden,
- so wird hinter dem letzten abgearbeiteten GOSUB die Programm­
- ausführung fortgesetzt.
- GOSUB dient zum Aufruf von #on("iUnterprogrammen#off("i, die von mehr als
- einer Stelle im Programm (und auch in anderen Unterprogrammen)
- aufgerufen werden können.
-
-Hinweis : Es wird empfohlen, Unterprogramme im Programm deutlich als solche
- zu kennzeichnen und (durch END, STOP oder GOTO) sicherzustel­
- len, daß nur mit GOSUB zu ihnen verzweigt wird, da es sonst leicht
- zu der (Laufzeit-) Fehlermeldung "RETURN ohne GOSUB" kommen
- kann.
-
-
-Beispiel : 140 GOSUB 10000 'Zeige Uhrzeit
- .
- .
- 370 GOSUB 10000 'Zeige Uhrzeit
- 9990 END
- 10000 REM Unterprogramm Zeige Uhrzeit
- 10010 PRINT "Es ist " + TIME$ + " Uhr"
- 10020 RETURN
-
-
-Vergleiche : RETURN-, ON-, GOTO- Anweisungen
-
-
-
-Anweisung : GOTO
-
-Zweck : Sprung zu einer angegebenen Zeile
-
-Syntax : GOTO <Zeilennummer>
-
-Erklärung : <Zeilennummer>: INT-Konstante
- Statt GOTO darf auch GO #ib(3)#TO#ie(3)# geschrieben werden.
-
- Die Programmausführung wird in der Zeile mit der angegebenen
- Zeilennummer fortgesetzt. Die Zeile mit der Zeilennummer muß im
- Programm existieren.
-
-
-Beispiel : 10 INPUT "Monat (1-12)", monat%
- 20 IF monat% < 1 OR monat% > 12 THEN GOTO 10
-
-
-Vergleiche : ON-, IF-, GOSUB- Anweisungen
-
-
-
-Funktion : HEX$
-
-Zweck : Erzeugung der hexadezimalen Darstellung einer Zahl als Text
-
-Syntax : HEX$ (<INT-Ausdruck>)
-
-Erklärung : Die Funktion liefert die hexadezimale (Zweierkomplement-) Darstel­
- lung der Zahl, die sich aus dem INT-Ausdruck ergibt.
-
-
-Beispiel : 10 PRINT HEX$ (10000)
- Ausgabe: 2710
-
-Vergleiche : OCT$-Funktion
-
-
-
-Anweisung : IF
-
-Zweck : Sprung zu einer angegebenen Zeile
-
-Syntax : IF <Bedingung>
- #right#[,] #ib(3)#THEN#ie(3)# <Anweisung(en)>|<Zeilennummer>
- #right#[ [,] #ib(3)#ELSE#ie(3)# <Anweisung(en)>|<Zeilennummer>]
- IF <Bedingung> [,] GOTO <Zeilennummer>
- #right#[ [,] ELSE <Anweisung(en)>|<Zeilennummer>]
-
-Erklärung : <Bedingung> : numerischer Ausdruck
- <Anweisung(en)>: Eine oder mehrere BASIC-Anweisungen, wobei
- mehrere wie gewohnt durch ':' zu trennen sind
- <Zeilennummer> : INT-Konstante
- Statt GOTO darf auch GO TO geschrieben werden.
-
- Anhand der Bedingung wird entschieden, ob die Abarbeitung des
- Programms mit dem THEN- oder ELSE-Zweig fortgesetzt werden
- soll. Mit dem THEN-Zweig wird das Programm fortgesetzt, wenn die
- Bedingung erfüllt ist (, d.h. der numerische Ausdruck ungleich null
- ist). Im anderen Fall (Bedingung nicht erfüllt, numerischer Ausdruck
- gleich null) wird das Programm mit dem ELSE-Teil fortgesetzt. Ist
- kein ELSE-Teil angegeben, so wird die Abarbeitung des
- Programmes in der folgenden #on("iZeile#off("i (nicht nach ':') fortgesetzt.
-
- Sind statt Anweisungen Zeilennummern nach THEN oder ELSE
- angegeben, so entspricht dies einem GOTO (s.d.) zu diesen Zeilen­
- nummern.
-
-
-Hinweis : Auch eine IF-Anweisung muß in #on("ieiner#off("i Programmzeile stehen.
-
-
-Beispiel : 10 IF a >= b THEN IF a > b THEN
- #right#PRINT "a größer b" ELSE PRINT "a gleich b"
- #right#ELSE PRINT "a kleiner b"
-
-
- Das Beispiel zeigt, daß bei geschachtelten IF-Anweisungen die
- ELSE-Teile immer auf das letzte vorhergehende IF bezogen werden,
- für das noch kein ELSE-Teil gefunden wurde.
-
-
-
-Vergleiche : GOTO-, GOSUB-, ON-Anweisungen
-
-
-
-Operator : IMP
-
-Siehe Kapitel 4.4. (Operatoren)
-
-
-
-Funktion : INKEY$
-
-Zweck : Holen eines Zeichens von der Tastatur
-
-Syntax : INKEY$
-
-Erklärung : Die Funktion liefert ein Textzeichen aus dem Tastaturzeichenpuffer.
- Wurde kein Zeichen eingegeben, so wird ein Leertext (niltext) gelie­
- fert.
- Die gelieferten Zeichen erscheinen nicht auf dem Bildschirm.
-
-
-Beispiel : 10 REM Schreibmaschine
- 20 LET a$ = INKEY$
- 30 IF ASC (a$) = 27 THEN STOP
- 40 PRINT a$;
- 50 GOTO 20
-
-
- Die eingegebenen Zeichen werden ausgegeben. Abbruch mit ESC.
-
-Vergleiche : INPUT$-Funktion, INPUT-Anweisung
-
-
-
-Anweisung : INPUT
-
-Zweck : Einlesen von Daten von der Tastatur
-
-Syntax : INPUT [;] [<Eingabeaufforderung> ,|; ][ #ib(3)#EOF#ie(3)#
- <Zeilennummer>]
- #right#<Variable> [, <Variable> ] [...]
-
-Erklärung : <Eingabeaufforderung>: TEXT-Konstante
- <Zeilennummer>: INT-Konstante
- <Variable>: Variable, der der eingelesene Werte
- zugewiesen werden soll
-
- Mit der INPUT-Anweisung werden Daten zur Laufzeit des
- Programms von der Tastatur in Variablen eingelesen.
-
- Folgt dem INPUT-Statement ein Semikolon, so wird nach
- Beendigung der Eingabe kein Zeilenwechsel vorgenommen.
-
- Fehlt die <Eingabeaufforderung>, so wird "? " als Eingabe­
- aufforderung ausgegeben.
- Folgt der ein Semikolon, so wird "? " noch zusätzlich ausge­
- geben. Bei einem Komma wird dieser Standard-Prompt unter­
- drückt.
-
- Folgt der <Eingabeaufforderung> die Zeichenfolge 'EOF', so wird
- bei Eingabe eines Leertextes zu der nach 'EOF' angegebenen
- Zeilennumer verzweigt.
-
- Sollen mehrere Variablen eingelesen werden, so muß der Benutzer
- auch entsprechend viele Daten (durch Kommata getrennt) zur Verfü­
- gung stellen.
-
- Wird nichts eingegeben beziehungsweise nur die richtige Anzahl von
- Kommata, so wird den entsprechenden Variablen 0, 0.0 bzw. 'niltext'
- zugewiesen.
-
- Bei der Eingabe für eine Textvariable können alle Zeichen (außer
- Steuerzeichen) eingegeben werden. Beginnt eine Eingabe mit dem
- Anführungszeichen oder endet sie damit, dann muß sie auch damit
- enden beziehungsweise beginnen. Diese beiden Anführungszeichen
- werden nicht mit zugewiesen. Innerhalb dieser Texteingabe dürfen
- Anführungszeichen stehen, aber keine Kommata.
-
- Eingaben für numerische Variablen müssen in der für Konstanten
- üblichen Schreibweise erfolgen. Vorzeichen sind allerdings zusätzlich
- erlaubt.
-
- Vor Zuweisung der eingegebenen Werte an die Variablen werden
- Anzahl und Typ(en) und die Anzahl überprüft.
- Dabei können folgende Fehlerfälle auftreten:
- - "falscher Typ":
- Es wurde ein Text statt einer Zahl eingegeben, es wurde ein REAL
- statt eines INTs eingegeben oder eine Texteingabe ist fehlerhaft.
- - "zu wenig Daten"
- - "zu viele Daten"
- - "Ãœberlauf":
- Es wurde eine zu große (oder zu kleine) Zahl eingegeben.
-
- Kommt es zu einem Fehler, dann wird nach der Meldung "?Eingabe
- wiederholen ! (<Fehlerbeschreibung>)" die Eingabe zum Editieren
- angeboten.
-
-Hinweis : Bei Eingabe von 'ESC k' kann die letzte Eingabezeile zum Editieren
- zurückgeholt werden.
-
- Die Eingabe kann mit der Systemprozedur 'sysin' aus einer Datei
- erfolgen. Aus der Eingabedatei wird für jedes INPUT-Statement eine
- Zeile eingelesen. Die Ausgabe der Eingabeaufforderung und der
- Zeilenwechsel nach der Eingabe werden unterdrückt. Sind die
- Eingabedaten fehlerhaft, so wird das Programm mit 'errorstop'
- abgebrochen.
-
- Wird die Ausgabe mit 'sysout' umgeleitet, so werden die Eingabe­
- aufforderung, die Eingabezeichenfolge und der Zeilenwechsel nach
- der Eingabe auf den Bildschirm und in die Ausgabedatei ausgegeben,
- auch dann, wenn der Text der Eingabe aus einer Datei eingelesen
- wurde.
-
-
-Beispiel : 1990 INPUT "Name, Vorname, Alter";
- #right#name$, vorname$, alter%
-
-
-Vergleiche : INKEY$-, INPUT$-Funktionen
-
-
-
-Funktion : INPUT$
-
-Zweck : Holen einer Zeichenfolge von der Tastatur
-
-Syntax : INPUT$ (<Anzahl Zeichen>)
-
-Erklärung : <Anzahl Zeichen>: INT-Ausdruck
-
- Die Funktion liefert eine Folge von <Anzahl Zeichen> Textzeichen
- aus dem Tastaturzeichenpuffer. Enthält der Puffer nicht alle ge­
- wünschten Zeichen, so wird auf weitere Zeichen von der Tastatur
- gewartet.
- Die gelieferten Zeichen erscheinen nicht auf dem Bildschirm.
-
-
-Beispiel : 10 PRINT "Bitte drei Zeichen eingeben !"
- 20 LET a$ = INPUT$ (3)
- 30 PRINT "Danke schön !"
-
-
-Vergleiche : INKEY$-Funktion, INPUT-Anweisung
-
-
-
-Funktion : INSTR
-
-Zweck : Suchen einer Zeichenfolge in einer anderen
-
-Syntax : INSTR ( [<Startposition>,] <TEXT-Ausdruck1>,
- #right#<TEXT-Ausdruck 2>)
-
-Erklärung : <Startposition>: INT-Ausdruck
-
- Die Funktion liefert die Position, ab der der TEXT-Ausdruck 2 das
- erste Mal im TEXT-Ausdruck 1 vorkommt.
- Die Position wird als INT geliefert.
-
-
-Beispiel : 10 LET a$ = "hallihallo"
- 20 LET b$ = "all"
- 30 PRINT INSTR (a$, b$); INSTR (5, a$, b$)
- Ausgabe: 2 7
-
-
-
-Funktion : INT
-
-Zweck : Ermittlung der nächstkleineren ganzen Zahl
-
-Syntax : INT (<REAL-Ausdruck>)
-
-Erklärung : Die Funktion liefert die größte ganze Zahl, für die gilt:
- n kleiner gleich <REAL-Ausdruck>.
- Bei positiven Werten bedeutet das, daß die Nachkommastellen abge­
- schnitten werden.
- Das Ergebnis wird als REAL geliefert.
-
-
-Beispiel : 10 PRINT INT (11.74); INT (-11.74)
- Ausgabe: 11 -12
-
-Vergleiche : CINT-, FIX-Funktionen
-
-
-
-Anweisung : KILL
-
-Zweck : Löschen einer Datei in der Task
-
-Syntax : KILL <Dateiname>
-
-Erklärung : <Dateiname>: TEXT-Ausdruck
- Die Datei <Dateiname> wird (ohne Nachfrage) gelöscht.
-
-
-Beispiel : 2110 KILL "Scratchdatei"
-
-
-
-
-Funktion : LEFT$
-
-Zweck : Erzeugung eines Teiltextes aus einem anderen Text
-
-Syntax : LEFT$ (<TEXT-Ausdruck>, <Anzahl Zeichen>)
-
-Erklärung : <Anzahl Zeichen>: INT-Ausdruck
-
- Die Funktion liefert die ersten <Anzahl Zeichen> Textzeichen des
- TEXT-Ausdrucks.
-
-
-Beispiel : 10 LET a$ = "hallihallo"
- 20 PRINT LEFT$ (a$, 4)
- Ausgabe: hall
-
-Vergleiche : MID$-, RIGHT$-Funktionen, LSET-, MID$-, RSET-
- Anweisungen
-
-
-
-Funktion : LEN
-
-Zweck : Ermittlung der Länge eines Textes
-
-Syntax : LEN (<TEXT-Ausdruck>)
-
-Erklärung : Die Funktion liefert die Anzahl der im TEXT-Ausdruck enthaltenen
- Zeichen (also die Länge des Textes). Die Länge wird als INT
- geliefert.
- Ein Leertext (niltext, "") hat die Länge null.
-
-
-Beispiel : 10 LET a$ = "hallihallo"
- 20 PRINT LEN (a$)
- Ausgabe: 10
-
-
-
-Anweisung : LET
-
-Zweck : Zuweisung eines Wertes an eine Variable
-
-Syntax : [LET] <Variable> = <Ausdruck>
-
-Erklärung : Die LET-Anweisung ermöglicht das Zuweisen von Werten an Variab­
- len (dazu gehören auch die Elemente von Feldern).
-
- Das Schlüsselwort LET ist optional, d.h. eine Zuweisung wird auch
- ohne dieses Schlüsselwort erkannt.
-
- #on("iZuweisung an TEXT-Variablen:#off("i
- LET <TEXT-Variable> = <TEXT-Ausdruck> oder <num.
- Konstante>
- Die numerische Konstante wird automatisch in einen TEXT umge­
- wandelt (vgl. STR$-Funktion)
-
- #on("iZuweisung an INT-Variablen:#off("i
- LET <INT-Variable> = <num. Ausdruck>
- Ist der numerische Ausdruck ein REAL-Ausdruck, so wird automa­
- tisch nach INT konvertiert (vgl. CINT-Funktion).
-
- #on("iZuweisung an REAL-Variablen:#off("i
- LET <REAL-Variable> = <num. Ausdruck>
- Ist der numerische Ausdruck ein INT-Ausdruck, so wird automatisch
- nach REAL konvertiert (vgl. CDBL-Funktion).
-
-
-Beispiel : 10 LET t$ = "murmel marmel"
- 20 LET t$ = 1245.3 'wie "1245.3"
- 30 LET i% = 852
- 40 LET i% = 12.73 'aufgerundet: 13
- 50 LET r = 564 'wie 564.
- 60 LET r = 157.36
-
-
-
-
-Anweisung : LINE INPUT
-
-Zweck : Einlesen einer Eingabe von der Tastatur in eine TEXT-Variable
-
-Syntax : LINE INPUT [;] [<Eingabeaufforderung>;]
- #right#<TEXT-Variable>
-
-Erklärung : Die LINE INPUT-Anweisung ermöglicht das Einlesen von Eingaben
- in TEXT-Variablen, aber im Gegensatz zu INPUT ohne Beachtung
- von Trennzeichen (z.B. ",").
-
- Steht direkt nach LINE INPUT ein Semikolon, so wird nach Beendi­
- gung der Eingabe der Zeilenwechsel unterdrückt.
-
- Der eingegebene Text wird (bis auf das CR-Zeichen) der TEXT-
- Variablen zugewiesen.
-
-
-Beispiel : 2110 LINE INPUT "Name: ";name$
-
-
- Der Benutzer könnte nun auch folgendes eingeben:
- Neumann, Alfred E.
-
-Vergleiche : INPUT-Anweisung
-
-
-
-Funktion : LOG
-
-Zweck : Berechnung des natürlichen Logarithmus einer Zahl
-
-Syntax : LOG (<REAL-Ausdruck>)
-
-Erklärung : Die Funktion liefert den natürlichen Logarithmus des Wertes des
- REAL-Ausdrucks.
- Bei nicht-positiven Werten kommt es zu einem Fehler in der
- EUMEL-Prozedur 'log2'.
- Das Ergebnis der Funktion wird als REAL geliefert.
-
-
-Beispiel : 10 PRINT LOG (10.0)
- Ausgabe: 2.302585
-
-Vergleiche : EXP-Funktion (Komplementärfunktion)
-
-
-
-Funktion : LPOS
-
-Zweck : Ermittlung der aktuellen Druckspalte
-
-Syntax : LPOS (<num. Ausdruck>)
-
-Erklärung : Geliefert wird die Nummer der Spalte (als INT), in die das nächste
- nächste Zeichen mit LPRINT ausgegeben wird. Die Spalte ganz links
- hat die Nummer 1.
- Der Argument-Ausdruck ist ein Dummy-Argument (hat keinen
- Einfluß auf den gelieferten Wert).
-
-
-Beispiel : 3010 IF LPOS (0) > 65 THEN LPRINT
- 3020 LPRINT name$
-
-
- Falls die Druckposition hinter Spalte 65 liegt, wird eine neue Druck­
- zeile begonnen.
-
-Vergleiche : LPRINT-Anweisung, TAB-, POS-Funktion
-
-
-
-Anweisung : LPRINT
-
-Zweck : Ausgabe in eine Druckdatei
-
-Syntax : LPRINT [#ib(3)#USING#ie(3)# <Format> ;]
- #right#[ #ib(3)#TAB#ie(3)# (<Spalte>) | , | ; | <Ausdruck> ] [...]
-
-Erklärung : <Format> : TEXT-Ausdruck für USING (vgl. PRINT)
- <Spalte> : INT-Ausdruck (vgl. PRINT)
- <Ausdruck>: TEXT-Ausdruck oder numerischer Ausdruck
-
- Die LPRINT-Anweisung arbeitet wie PRINT (siehe dort), mit dem
- Unterschied, daß LPRINT die Zeichen nicht auf den Bildschirm, son­
- dern in eine Datei mit dem Namen "BASIC LPRINT OUTPUT"
- ausgibt. Diese Datei wird automatisch eingerichtet, falls sie noch
- nicht existiert. Ist sie schon vorhanden, so werden die auszugeben­
- den Zeichen am Ende der Datei angefügt.
- Nach oder bei Ablauf des Programms kann die Datei (evtl. nach
- vorheriger Aufbereitung durch Textverarbeitungsprogramme) mit
- 'print', wie im EUMEL-System üblich, an den Drucker geschickt
- werden. Der Benutzer ist selbst dafür verantwortlich, daß er die
- Druckdatei, sofern die Daten nicht mehr benötigt werden, vor einem
- neuen Programmlauf leert oder löscht. Versäumt er dies, so bleiben
- die alten Daten in der Druckdatei, und die neuen Ausgaben werden
- hinten angefügt. Das Löschen der Druckdatei kann zum Beispiel
- durch das BASIC-Programm mit der KILL-Anweisung erreicht
- werden.
-
- Die Art der Ausgabe und die Syntax ist sonst analog zur PRINT-
- Anweisung (siehe Erläuterungen dort).
-
-
-Beispiel : 2110 LPRINT "Dieser Text geht in die Druckdatei"
- 2120 LPRINT TAB (12); "Datum: " DATE$
- 2130 LPRINT 1, 2, 3
-
-
-Vergleiche : PRINT-Anweisung, LPOS-Funktion
-
-
-
-Anweisung : LSET
-
-Zweck : Ersetzen von Zeichen eines Textes von links her
-
-Syntax : LSET <TEXT-Variable> = <TEXT-Ausdruck>
-
-Erklärung : Das Ergebnis des TEXT-Ausdrucks wird, links beginnend, in der
- TEXT-Variablen eingesetzt. Es werden höchstens so viele Zeichen
- ersetzt, wie bisher schon in der Variablen vorhanden waren, das heißt
- die Länge des Textes in der Variablen ändert sich nicht.
-
-
-Beispiel : 210 LET a$ = "12345"
- 220 LSET a$ = "ABCDEFG"
- 230 PRINT a$,
- 240 LSET a$ = "abc"
- 250 PRINT a$
- Ausgabe: ABCDE abcDE
-
-Vergleiche : MID$-, RSET-Anweisungen, LEFT$-, MID$-, RIGHT$-Funk­
- tionen
-
-
-
-Anweisung : MID$
-
-Zweck : Ersetzen von Zeichen innnerhalb eines Textes
-
-Syntax : MID$ (<TEXT-Variable>, <Startposition>
- #right#[, <Anzahl Zeichen>] ) = <TEXT-Ausdruck>
-
-Erklärung : <Startposition> : INT-Ausdruck
- <Anzahl Zeichen>: INT-Ausdruck
-
- Das Ergebnis des TEXT-Ausdrucks wird, bei <Startposition>
- beginnend, in der TEXT-Variablen eingesetzt. Es werden höch­
- stens LEN <TEXT-Variable> Textzeichen ersetzt. Ist keine
- <Anzahl Zeichen> angegeben, so werden so viele Zeichen des
- TEXT-Ausdrucks wie möglich in der TEXT-Variablen eingetragen.
- Außerdem gilt: Es wird nicht über das bisherige Ende des Variablen­
- inhalts ersetzt, das heißt die Länge des Textes in der Variablen
- ändert sich nicht.
-
-
-Beispiel : 210 LET a$ = "12345"
- 220 MID$ (a$, 3) = "ABCDEFG"
- 230 PRINT a$,
- 240 MID$ (a$, 2, 1) = "abc"
- 250 PRINT a$
- Ausgabe: 12ABC 1aABC
-
-Vergleiche : LEFT$-, MID$-, RIGHT$-Funktionen, LSET-, RSET-
- Anweisungen
-
-
-
-Funktion : MID$
-
-Zweck : Erzeugung eines Teiltextes aus einem anderen Text
-
-Syntax : MID$ (<TEXT-Ausdruck>,
- #right#<Startposition> [, <Anzahl Zeichen>])
-
-Erklärung : <Startposition> : INT-Ausdruck
- <Anzahl Zeichen>: INT-Ausdruck
-
- Die Funktion liefert höchstens <Anzahl Zeichen> Textzeichen des
- TEXT-Ausdrucks von Position <Startposition> an.
- Wird <Anzahl Zeichen> nicht angegeben, so werden alle Zeichen
- ab Startposition geliefert.
- Werden rechts von <Startposition> keine Zeichen mehr gefunden
- oder ist <Anzahl Zeichen> gleich null, so wird ein Leertext geliefert.
-
-
-Beispiel : 10 LET a$ = "hallihallo"
- 20 PRINT MID$ (a$, 4, 4),
- 30 PRINT MID$ (a$, 6)
- Ausgabe: liha hallo
-
-Vergleiche : LEFT$-, RIGHT$-Funktionen, LSET-, MID$-, RSET-
- Anweisungen
-
-
-
-Funktion : MKD$, MKI$
-
-Zweck : Codierung von Zahlenwerten in Texte
-
-Syntax : MKD$ (<REAL-Ausdruck>)
- MKI$ (<INT-Ausdruck>)
-
-Erklärung : Mit MKD$ und MKI$ können INTs und REALs zu Texten codiert
- werden.
-
- Die Funktion MKD$ liefert einen 8 Zeichen langen TEXT, der den
- Wert des REAL-Ausdrucks codiert enthält.
- Vergleichbar arbeitet MKI$, das einen 2 Zeichen langen TEXT liefert,
- der den Wert des INT-Ausdrucks darstellt.
-
- Mit MKD$ und MKI$ codierte Werte können mit CVD und CVI (s.d.)
- wieder decodiert werden.
-
-
-Beispiel : 10 zahl$ = MKD$ (3.1415)
- 20 PRINT CVD (zahl$)
- Ausgabe: 3.1415
-
-Vergleiche : CVD-, CVI-Funktionen
-
-
-
-Operator : MOD
-
-Siehe Kapitel 4.4. (Operatoren)
-
-
-
-Anweisung : NAME
-
-Zweck : Umbenennen einer Datei
-
-Syntax : NAME <alter Name> AS <neuer Name>
-
-Erklärung : <alter Name>: TEXT-Ausdruck
- <alter Name>: TEXT-Ausdruck
-
- NAME benennt die Datei <alter Name> in <neuer Name> um.
-
-
-Beispiel : 10 NAME "Käufer" AS "Kunden"
-
-
-
-
-Anweisung : NEXT
-
-Zweck : Markierung des Endes einer FOR-Schleife
-
-Syntax : NEXT [<num. Variable>] [, <num. Variable>] [...]
-
-Erklärung : NEXT markiert das Ende einer FOR-Schleife (vergleiche FOR-
- Anweisung).
-
- Wird keine Variable angegeben, so bezieht sich das NEXT auf das
- letzte textuell vorhergehende FOR.
- Wird eine Laufvariable angegeben, so muß sie mit der im letzten
- FOR verwendeten Laufvariable übereinstimmen.
- Werden mehrere Variablen angegeben, so werden durch die
- NEXT-Anweisung mehrere FOR-Schleifen abgeschlossen.
- Beachten Sie, daß FOR-Schleifen sich nicht überschneiden dürfen,
- sondern nur Schachtelungen zulässig sind. Es kommt daher auf die
- Reihenfolge der Variablen bei den NEXT-Anweisungen an. Die
- letzte (innerste) FOR-Schleife muß als erste wieder mit dem zuge­
- hörigen NEXT abgeschlossen werden.
-
-Vergleiche : FOR-, WHILE-Anweisungen
-
-
-
-Operator : NOT
-
-Siehe Kapitel 4.4. (Operatoren)
-
-
-
-Funktion : OCT$
-
-Zweck : Erzeugung der oktalen Darstellung einer Zahl als Text
-
-Syntax : OCT$ (<INT-Ausdruck>)
-
-Erklärung : Die Funktion liefert die oktale (Zweierkomplement-) Darstellung der
- Zahl, die sich aus dem INT-Ausdruck ergibt.
-
-
-Beispiel : 10 PRINT OCT$ (10000)
- Ausgabe: 23420
-
-Vergleiche : OCT$-Funktion
-
-
-
-Anweisung : ON
-
-Zweck : Ausführung eines "berechneten" Sprungs oder Unterprogramm-
- Aufrufs
-
-Syntax : ON <Sprungziel Nr.> GOTO | GOSUB
- #right#<Zeilennummer> [, <Zeilennummer>] [...]
-
-Erklärung : <Sprungziel Nr.>: INT-Ausdruck
- <Zeilennummer> : INT-Konstante
-
- ON ermöglicht die Verzweigung des Programms an eine von mehre­
- ren Stellen abhängig vom Ergebnis eines INT-Ausdrucks.
- Gelangt das Programm an eine ON-Anweisung, dann wird zunächst
- der Wert des INT-Ausdrucks berechnet. Dieses Ergebnis bildet dann
- die Nummer n des Sprungziels. Danach wird zur n-ten Zeilen­
- nummer, die nach GOTO beziehungsweise GOSUB steht, verzweigt.
- Die maximale Anzahl von Zeilennummern, die nach GOTO oder
- GOSUB angegeben werden dürfen, ist 512.
- Nimmt <Sprungziel Nr.> einen Wert an, zu dem keine Zeile in der
- Liste gefunden wird (z.B. Werte kleiner gleich null oder Werte größer
- als die Anzahl der angegebenen Zeilennummern), so wird das Pro­
- gramm mit der der ON-Anweisung folgenden Programmzeile fortge­
- setzt.
-
- Statt GOTO und GOSUB darf auch GO TO beziehungsweise
- GO SUB geschrieben werden.
-
-Hinweis : Die ON-Anweisung muß in #on("ieiner#off("i Programmzeile stehen.
-
-
-Beispiel : 260 INPUT "Menüpunkt 1, 2 oder 3", a
- 270 ON VAL (a) GOTO 300, 400, 500
- 280 GOTO 260
- 300 PRINT "Menüpunkt 1"
- .
- .
- 400 PRINT "Menüpunkt 2"
- .
- .
- 500 PRINT "Menüpunkt 3"
-
-
- Entsprechend der Eingabe wird nach 300, 400 oder 500 verzweigt.
- Bei Fehleingaben wird Zeile 280 ausgeführt.
-
-Vergleiche : GOSUB-, GOTO-, IF-Anweisungen
-
-
-
-Anweisung : OPTION BASE
-
-Zweck : Festlegung des kleinsten Wertes für Feldindizes
-
-Syntax : OPTION BASE 0|1
-
-Erklärung : OPTION BASE legt fest, ob die nachfolgend dimensionierten Felder
- Elemente mit dem Index 0 erhalten, oder ob der niedrigste Index 1
- ist. Voreingestellt ist OPTION BASE 0.
-
-Hinweis : Der niedrigste Feldindex kann für jedes Feld individuell eingestellt
- werden. Die OPTION BASE-Anweisung gilt für alle Felder, deren
- Dimensionierung ihr textuell nachfolgen. Eine erneute OPTION
- BASE-Anweisung kann dann die Untergrenze für die #on("iihr#off("i folgenden
- Dimensionierungen festlegen.
-
-
-Beispiel : 10 DIM a (100) 'Indizes 0-100
- 20 OPTION BASE 1
- 30 b$ (3) = "hallo" 'Indizes 1-10
- 40 DIM a% (5) 'Indizes 1-5
- 50 OPTION BASE 0
- 60 DIM c% (9) 'Indizes 0-9
- 70 LET d (4) = 12.3 'Indizes 0-10
-
-
-Vergleiche : DIM-Anweisung
-
-
-
-Operator : OR
-
-Siehe Kapitel 4.4. (Operatoren)
-
-
-
-Funktion : POS
-
-Zweck : Ermittlung der aktuellen Cursorspalte
-
-Syntax : POS (<num. Ausdruck>)
-
-Erklärung : Geliefert wird die Nummer der Spalte (als INT), in der sich der Cursor
- auf dem Bildschirm befindet. Die Spalte ganz links hat die Num­
- mer 1.
- Der Argument-Ausdruck ist ein Dummy-Argument (hat keinen
- Einfluß auf den gelieferten Wert).
-
-
-Beispiel : 10 CLS
- 20 PRINT "testtext";
- 30 PRINT POS (0)
- Ausgabe: testtext 9
-
-
-Vergleiche : CSRLIN-, LPOS-Funktionen
-
-
-
-Anweisung : PRINT
-
-Zweck : Ausgabe auf den Bildschirm
-
-Syntax : PRINT [#ib(3)#USING#ie(3)# <Format> ;]
- #right#[ #ib(3)#TAB#ie(3)# (<Spalte>) | , | ; | <Ausdruck> ] [...]
-
-Erklärung : <Format> : TEXT-Ausdruck für USING (s. u.)
- <Spalte> : INT-Ausdruck (s. u.)
- <Ausdruck>: TEXT-Ausdruck oder numerischer Ausdruck, der
- ausgegeben werden soll.
-
- PRINT dient der Ausgabe von Zeichen auf dem Bildschirm.
- Numerische Werte werden mit sieben signifikanten Ziffer ausgege­
- ben. Bei Exponentendarstellung werden für den Exponent maximal 3
- Ziffern ausgegeben. Hinter allen numerischen Werten und vor posi­
- tiven numerischen Werten wird jeweils ein Leerzeichen ausgegeben.
-
- TAB bewirkt eine Positionierung des Cursors auf die angegebene
- Spalte (die Spalte ganz links hat die Nummer 1). Ist die Spaltenzahl
- größer als die mit WIDTH eingestellte Ausgabebreite, so wird auf die
- Spalte mit der Nummer Spalte MODULO Ausgabebreite positioniert.
- Eine Spaltennummer kleiner gleich null bewirkt eine entsprechende
- Warnung.
- Ist die Spalte mit der angegebenen Nummer in der aktuellen Zeile
- bereits überschritten, dann wird auf die nächste Zeile positioniert.
-
- Ein Semikolon bewirkt, daß der Cursor an der gerade erreichten
- Position bleibt.
-
- Ein Komma bewirkt die Positionierung auf die nächste gültige Spal­
- te, für deren Nummer gilt: Nummer MODULO 16 ist 1.
- Das Komma dient also der Ausgabe in 16 Zeichen breiten Zonen.
-
- Endet die PRINT-Anweisung mit TAB (<Spalte>), einem Komma
- oder einem Semikolon, dann wird kein Zeilenvorschub ausgelöst.
-
- #onbold#USING
- Der EUMEL-BASIC-Compiler unterstützt auch die PRINT
- USING-Anweisung für formatierte Ausgaben.
- Der nach dem Wort USING angegebene TEXT-Ausdruck spezifi­
- ziert das Ausgabeformat für eine PRINT USING-Anweisung.
-
- Formatierung von Texten:
- "!": Nur das erste Zeichen einer Zeichenfolge wird ausgegeben
- "\n Leerzeichen\": Es werden die 2 + n ersten Zeichen einer
- Zeichenfolge ausgegeben
- "&": Alle Zeichen einer Zeichenfolge werden ausgegeben
-
- Formatierung von Zahlen:
- "\#": bezeichnet eine Ziffernposition
- ".": Position des Dezimalpunkts
- "+": (vor oder nach Zahlen) Ausgabe des Vorzeichens
- "-": (nach Zahlen) gegebenenfalls Ausgabe von "-" hinter der
- Zahl
- "**": Führende Leerstellen werden mit Sternchen aufgefüllt; wirkt
- außerdem wie "\#\#".
- "$$": Es wird ein Dollarzeichen links vor der formatierten Zahl ausgegeben;
- wirkt außerdem wie "\#\#".
- "**$": Führende Leerstellen werden mit Sternchen ausgefüllt und direkt vor
- der formatierten Zahl wird ein Dollarzeichen ausgegeben; wirkt
- außerdem wie "\#\#\#".
- ",": (vor Dezimalpunkt) Unterteilung der Vorkommastellen in Dreier­
- gruppen mittels Komma
- "^^^^": Position des Exponenten
- "_": Ein Zeichen, das einem Unterstreichungsstrich folgt, wird unverändert
- ausgegeben
-
- Ist der Format-Ausdruck fehlerhaft, so kommt es zum Fehler "USING-
- Format fehlerhaft".
- Ãœberschreitet eine auszugebende Zahl in irgendeiner Hinsicht die im
- Format-Ausdruck für sie vorgesehene Stellenzahl, so wird das Zeichen "%"
- ausgegeben, um den Fehler anzuzeigen.
-
-
-Hinweis : 1. PRINT (und PRINT USING) richtet sich bei allen Ausgaben nach
- der mit WIDTH eingestellten Ausgabebreite.
- 2. Alle Ausgaben von PRINT können mit der Systemprozedur
- 'sysout' in eine Datei umgeleitet werden. Dann wird nichts auf
- das Terminal ausgegeben.
- 3. Das Verhalten beim Erreichen der letzten Bildschirmzeile kann
- mit der Prozedur 'basic page' gesteuert werden. Vergleiche
- hierzu Kapitel 5, "Steuerung der Bildschirmausgabe".
-
-
-Beispiel : 10 PRINT "hallo", 2 ^ 32 TAB (33) "Ende";
-
- Ausgabe: hallo 4.294967E+09 Ende
- Position: 1234567890123456789012345678901234567890
-
-
-Vergleiche : WRITE-, LPRINT-Anweisungen, POS-, CSRLIN-, SPC-
- Funktionen
-
-
-
-Anweisung : RANDOMIZE
-
-Zweck : Festlegung eines Anfangswertes für den Zufallszahlengenerator
-
-Syntax : RANDOMIZE [<num. Ausdruck>]
-
-Erklärung : Mit RANDOMIZE erhält der Zufallszahlengenerator einen bestimmten
- Startwert.
- Ist kein numerischer Ausdruck angegeben, so wird während des
- Programmlaufs die Meldung "Startwert des Zufallszahlen­
- generators ?" ausgegeben und ein Startwert eingelesen.
-
- Wird der Zufallszahlengenerator immer mit dem gleichen Wert gestar­
- tet, so liefert er auch immer die gleichen Zufallszahlen. Soll er immer
- verschiedene Werte liefern, so kann er zum Beispiel mit der System­
- uhr auf zufällige Startwerte gesetzt werden (RANDOMIZE TIMER).
-
-
-Beispiel : 10 RANDOMIZE 4711
- 20 FOR i = 1 TO 5
- 30 PRINT INT (RND * 10);
- 40 NEXT i
- Ausgabe: 5 6 2 9 6
-
-Vergleiche : RND-Funktion
-
-
-
-Anweisung : READ
-
-Zweck : Auslesen von Daten aus DATA-Anweisungen
-
-Syntax : READ <Variable> [, <Variable>] [...]
-
-Erklärung : <Variable>: numerische Variable oder TEXT-Variable
-
- Die READ-Anweisung liest die nächsten Elemente aus der aktuellen
- DATA-Anweisung (s.d.) in die angegebenen Variablen ein.
-
- In TEXT-Variablen können sowohl "quoted strings" als auch "un­
- quoted strings" (vgl. DATA-Anweisung) eingelesen werden.
- In numerische Variablen können dagegen nur "unquoted strings"
- eingelesen werden. Außerdem müssen die Zeichen des "unquoted
- string" eine gültige Darstellung einer numerischen Konstanten (even­
- tuell mit Vorzeichen) sein. Sind diese Bedingungen nicht erfüllt, so
- kommt es bei der Ausführung des Programms zu entsprechenden
- Fehlern.
-
- Eine READ-Anweisung kann Daten aus vorangehenden und nach­
- folgenden DATA-Anweisungen lesen.
- Alle DATA-Anweisungen eines Programms bilden zusammen einen
- großen sequentiellen Speicher, auf den mit READ der Reihe nach
- zugegriffen wird. Intern wird ein sogenannter READ-DATA-Zeiger
- geführt, der immer auf das nächste auszulesende Element zeigt.
-
- Die RESTORE-Anweisung (s.d.) ermöglicht es, den READ-DATA-
- Zeiger auf das erste Element einer bestimmten DATA-Zeile zu
- setzen.
-
- Sind keine Daten mehr für READ vorhanden, so wird die Ausführung
- des Programms mit der Fehlermeldung "Keine Daten mehr für
- READ" abgebrochen.
-
-
-Beispiel : 2020 PRINT "Stadt", "Land", "Fluß"
- 2030 READ stadt$, land$, fluß$
- 2040 PRINT stadt$, land$, fluß$
- .
- 5000 DATA Köln, Bundesrepublik Deutschland, Rhein
-
-
-Vergleiche : DATA-, RESTORE-Anweisungen
-
-
-
-Anweisung : REM
-
-Zweck : Ermöglicht das Einfügen von Kommentaren in ein Programm
-
-Syntax : REM <Zeichenfolge>
-
-Erklärung : <Zeichenfolge>: Beliebige Folge von Zeichen
-
- Wird eine REM-Anweisung gefunden, so wird der Rest der Pro­
- grammzeile nicht weiter beachtet. Die Compilierung wird in der fol­
- genden Zeile fortgesetzt.
- Es empfielt sich, von Kommentarzeilen möglichst oft Gebrauch zu
- machen, weil sie den Programmtext dokumentieren und strukturieren.
-
-Hinweis : Nach REM können keine weiteren Anweisungen mehr in einer Pro­
- grammzeile stehen, da sie nicht übersetzt werden. Auch der Doppel­
- punkt wird nach REM nicht beachtet.
-
-
-Beispiel : 1000 REM Ausgabe des Feldes
- 1010 FOR i = 1 TO feldgroesse%
- 1020 PRINT "Eintrag"; i; feld (i)
- 1030 NEXT i
-
-
-
-Anweisung : RESTORE
-
-Zweck : Setzen des READ-DATA-Zeigers auf den Anfang einer angegebe­
- nen Zeile
-
-Syntax : RESTORE [<Zeilennummer>]
-
-Erklärung : <Zeilennummer>: INT-Konstante
-
- Der READ-DATA-Zeiger (vgl. DATA-Anweisung) wird auf die Zeile
- <Zeilennummer> gesetzt.
- Wird keine Zeilennummer angegeben, so wird für <Zeilennummer>
- 1 eingesetzt.
-
- Existiert die Programmzeile <Zeilennummer> nicht oder ist in ihr
- keine DATA-Anweisung vorhanden, so wird der Zeiger auf die
- nächste textuell folgende DATA-Anweisung gesetzt.
- Folgt der angegebenen Zeilennummer im Programm keine DATA-
- Anweisung mehr, kommt es zu der Fehlermeldung "RESTORE: Keine
- DATA-Anweisung in oder nach Zeile <Zeilennummer> gefunden !"
-
-
-Beispiel : 10 READ a, b, c
- 20 RESTORE
- 30 READ d, e, f
- 40 DATA 2, 3, 5
- 50 PRINT a; b; c; d; e; f
- Ausgabe: 2 3 5 2 3 5
-
-Vergleiche : DATA-, READ-Anweisungen
-
-
-
-Anweisung : RETURN
-
-Zweck : Rücksprung aus einem Unterprogramm
-
-Syntax : RETURN
-
-Erklärung : RETURN bewirkt einen Rücksprung aus dem Unterprogramm hinter
- die aufrufende GOSUB-Anweisung.
-
- Es dürfen auch mehrere RETURN-Anweisungen in einem Unterpro­
- gramm vorkommen, um es an verschiedenen Stellen zu verlassen.
-
- Wird ein RETURN gefunden, ohne daß ein GOSUB durchlaufen
- wurde, so wird mit der Fehlermeldung "RETURN ohne GOSUB"
- abgebrochen.
-
-
-Beispiel : 140 GOSUB 10000 'Zeige Uhrzeit
- .
- .
- 370 GOSUB 10000 'Zeige Uhrzeit
- 9990 END
- 10000 REM Unterprogramm Zeige Uhrzeit
- 10010 PRINT "Es ist " + TIME$ + " Uhr"
- 10020 RETURN
-
-
-Vergleiche : GOSUB-, ON-Anweisungen
-
-
-
-Funktion : RIGHT$
-
-Zweck : Erzeugung eines Teiltextes aus einem anderen Text
-
-Syntax : RIGHT$ (<TEXT-Ausdruck>, <Anzahl Zeichen>)
-Erklärung : <Anzahl Zeichen>: INT-Ausdruck
-
- Die Funktion liefert die letzten <Anzahl Zeichen> Textzeichen des
- TEXT-Ausdrucks.
- Ist <Anzahl Zeichen> größer gleich der Länge des TEXT-
- Ausdrucks, so wird der gesamte Ausdruck geliefert.
-
-
-Beispiel : 10 LET a$ = "hallihallo"
- 20 PRINT RIGHT$ (a$, 5)
- Ausgabe: hallo
-
-Vergleiche : LEFT$-, MID$-Funktionen, LSET-, MID$-, RSET-Anweisungen
-
-
-
-Funktion : RND
-
-Zweck : Erzeugung von Zufallszahlen
-
-Syntax : RND [<num. Ausdruck>]
-
-Erklärung : Wird kein Argument angegeben, so wird ein Wert größer null für den
- Ausdruck angenommen.
-
- RND (x) liefert
-
- für x > 0:
- eine neue Zufallszahl. Es gilt immer: 0 <= RND < 1. Der Betrag
- des Arguments hat keinen Einfluß auf das Ergebnis.
-
- für x = 0:
- die letzte gelieferte Zufallszahl noch einmal.
-
- für x < 0:
- eine neue Zufallszahl. Vorher wird aber RANDOMIZE x (s.d.) ausge­
- führt.
-
- Die Zufallszahlen werden als REALs geliefert.
- Der Zufallszahlengenerator kann mit der RANDOMIZE-Anweisung
- auf bestimmte Startwerte eingestellt werden.
-
-
-Beispiel : 10 FOR i = 1 TO 5
- 20 PRINT INT (RND * 10)
- 30 NEXT i
- Ausgabe (z.B.): 7 9 9 5 0
-
-Vergleiche : RANDOMIZE-Anweisung
-
-
-
-Anweisung : RSET
-
-Zweck : Ersetzen von Zeichen eines Textes von rechts her
-
-Syntax : RSET <TEXT-Variable> = <TEXT-Ausdruck>
-
-Erklärung : Das Ergebnis des TEXT-Ausdrucks wird, rechts beginnend, in der
- TEXT-Variablen eingesetzt. Es werden höchstens so viele Zeichen
- ersetzt, wie bisher schon in der Variablen vorhanden waren, das heißt
- die Länge des Textes in der Variablen ändert sich nicht.
- Soll ein Text eingesetzt werden, der länger ist als der Text in der
- Variablen, so wird die Variable nicht verändert.
-
-
-Beispiel : 210 LET a$ = "ABCDEFG"
- 220 RSET a$ = "12345"
- 230 PRINT a$,
- 240 RSET a$ = "abc"
- 250 PRINT a$
- Ausgabe: AB12345 AB12abc
-
-Vergleiche : LSET-, MID$-Anweisungen, LEFT$-, MID$-, RIGHT$-Funk­
- tionen
-
-
-
-Funktion : SGN
-
-Zweck : Ermittlung des Vorzeichens einer Zahl
-
-Syntax : SGN (<num. Ausdruck>)
-
-Erklärung : SGN (x) liefert
- für x > 0: 1
- für x = 0: 0
- für x < 0: -1 .
-
-
-Beispiel : 10 a = -12.74
- 20 PRINT SGN (a); SGN (-a); SGN (0 * a)
- Ausgabe: -1 1 0
-
-Vergleiche : ABS-Funktion
-
-
-
-Funktion : SIN
-
-Zweck : Berechnung des Sinus eines Radiantwertes
-
-Syntax : SIN (<Winkel>)
-
-Erklärung : <Winkel>: REAL-Ausdruck, der den Winkel in Radiant angibt.
- Die Funktion liefert den Sinus des Winkels als REAL.
-
-
-Beispiel : 10 PI = 3.141593
- 20 PRINT SIN (PI/4)
- Ausgabe: .7071068
-
-Vergleiche : COS-, TAN-Funktionen
-
-
-
-Funktion : SPACE$
-
-Zweck : Erzeugung einer bestimmten Anzahl von Leerzeichen
-
-Syntax : SPACE$ (<INT-Ausdruck>)
-
-Erklärung : Die SPACE$-Funktion liefert einen TEXT, der aus so vielen Leerzei­
- chen (Code 32) besteht, wie der Wert des INT-Ausdrucks angibt.
-
-
-Beispiel : 10 PRINT "123456789"
- 20 PRINT "^" + SPACE$ (7) + "^"
-
- Ausgabe: 123456789
- ^ ^
-
-
-Vergleiche : STRING$-Funktion
-
-
-
-Funktion : SPC
-
-Diese Funktion entspricht exakt der SPACE$-Funktion und wurde nur aus Kompatibi­
-litätsgründen implementiert.
-
-
-
-Funktion : SQR
-
-Zweck : Berechnung der Quadratwurzel einer Zahl
-
-Syntax : SQR (<num. Ausdruck>)
-
-Erklärung : SQR (x) liefert die Quadratwurzel des durch den numerischen Aus­
- druck angegebenen Wertes.
- Das Ergebnis wird als REAL geliefert.
-
-
-Beispiel : 10 PRINT SQR (100);
- 20 PRINT SQR (2);
- 30 PRINT SQR (17.453)
- Ausgabe: 10 1.414214 4.177679
-
-
-
-Anweisungsbestandteil : STEP
-
-Siehe FOR-Anweisung
-
-
-
-Anweisung : STOP
-
-Zweck : Beenden der Programmausführung eines BASIC-Programms mit
- Meldung
-
-Syntax : STOP
-
-Erklärung : STOP beendet die Programmausführung des BASIC-Programms.
- Im Gegensatz zu END (s.d.) erzeugt STOP dabei die Meldung "STOP
- beendet das Programm in Zeile ...".
-
- STOP-Anweisungen dürfen im Programm an beliebiger Stelle
- stehen, und es darf auch mehr als eine STOP-Anweisung in einem
- Programm vorkommen.
- Der Compiler übersetzt ein Programm auch nach Erreichen einer
- STOP-Anweisung weiter.
-
-
-Beispiel : 3220 IF eingabe$ = "Ende" THEN STOP
-
-
-Vergleiche : END-Anweisung
-
-
-
-Funktion : STR$
-
-Zweck : Konvertierung einer Zahl in einen Text
-
-Syntax : STR$ (<num. Ausdruck>)
-
-Erklärung : Die Funktion liefert die Darstellung des Wertes des numerischen
- Ausdrucks als TEXT.
- Die Zahlen werden so als Text geliefert, wie sie bei einer PRINT-
- Anweisung auf dem Bildschirm erscheinen würden.
-
-
-Beispiel : 10 LET zahl$ = STR$ (1e6)
- 20 PRINT zahl$; LEN (zahl$)
- Ausgabe: 1000000 7
-
-Vergleiche : VAL-Funktion (Komplementärfunktion)
-
-
-
-Funktion : STRING$
-
-Zweck : Erzeugung eines Textes mit mehreren gleichen Zeichen
-
-Syntax : STRING$ (<Anzahl>, <Code>|<TEXT-Ausdruck>)
-
-Erklärung : <Anzahl>: INT-Ausdruck
- <Code> : INT-Ausdruck (Wert im Bereich 0 bis 255)
-
- Die Funktion liefert <Anzahl> mal das Zeichen,
- - das den ASCII-Code <Code> hat oder
- - das am Anfang vom Ergebnis des TEXT-Ausdrucks steht.
-
-
-Beispiel : 10 LET pfeil$ = STRING$ (10, "=") + ">"
- 20 PRINT pfeil$;" ";STRING$ (5, 35) '35 entspr. \#
- Ausgabe: ==========> \#\#\#\#\#
-
-Vergleiche : SPACE$-Funktion
-
-
-
-Anweisungsbestandteil : SUB
-
-Siehe GOSUB-Anweisung
-
-
-
-Anweisung : SWAP
-
-Zweck : Tauschen der Inhalte zweier Variablen
-
-Syntax : SWAP <Variable1>, <Variable2>
-
-Erklärung : SWAP tauscht die Inhalte der beiden Variablen.
-
- Die beiden Variablen müssen vom gleichen Typ sein.
-
-
-Beispiel : 3220 LET a = 10
- 3230 LET b = 20
- 3240 SWAP a, b
- 3250 PRINT a; b
- Ausgabe: 20 10
-
-
-
-Anweisungsbestandteil : TAB
-
-Siehe PRINT- und LPRINT-Anweisung
-
-
-
-Funktion : TAN
-
-Zweck : Berechnung des Tangens eines Radiantwertes
-
-Syntax : TAN (<Winkel>)
-
-Erklärung : <Winkel>: REAL-Ausdruck, der den Winkel in Radiant angibt.
- Die Funktion liefert den Tangens des Winkels als REAL.
-
-
-Beispiel : 10 PI = 3.141593
- 20 PRINT TAN (PI/4)
- Ausgabe: 1
-
-Vergleiche : COS-, SIN-Funktionen
-
-
-
-Anweisungsbestandteil : THEN
-
-Siehe IF-Anweisung
-
-
-
-Funktion : TIMER
-
-Zweck : Lesen der Systemuhr (CPU-Zeit der Task)
-
-Syntax : TIMER
-
-Erklärung : Die bisher von der Task verbrauchte CPU-Zeit (in Sekunden) wird
- als REAL geliefert.
-
- TIMER eignet sich auch zum Starten des Zufallszahlengenerators
- (vgl. RANDOMIZE-Anweisung).
-
-
-Beispiel : 2010 LET starttime = TIMER
- .
- .
- 2620 PRINT "Verbrauchte CPU-Zeit:";
- 2630 PRINT TIMER - starttime; "Sekunden"
-
-
-Vergleiche : TIME$-Funktion
-
-
-
-Funktion : TIME$
-
-Zweck : Abrufen der aktuellen Tageszeit
-
-Syntax : TIME$
-
-Erklärung : Die Tageszeit wird als Text in der Form HH.MM.SS geliefert.
-
-
-Beispiel : 10 PRINT "Es ist jetzt "; TIME$; " Uhr"
- Ausgabe (z.B.): Es ist jetzt 10:51:17 Uhr
-
-Vergleiche : DATE$-, TIMER-Funktionen
-
-
-
-Anweisungsbestandteil : TO
-
-Siehe FOR- und GOTO-Anweisungen
-
-
-
-Anweisung : TRON / TROFF
-
-Zweck : Ein- und Ausschalten der TRACE-Funktion
-
-Syntax : TRON
- TROFF
-
-Erklärung : Der TRACE-Modus dient der Suche nach logischen Fehlern bei der
- Entwicklung von BASIC-Programmen.
-
- TRON schaltet den TRACE-Modus für die nachfolgend übersetzten
- Programmzeilen ein.
-
- Ist der TRACE-Modus eingeschaltet, so wird für jede gefundene
- Zeilennummer die Ausgabe dieser Zeilennummer in eckigen
- Klammern mit in den erzeugten Code aufgenommen. Dies hat dann
- während des Laufens den Effekt, daß immer bei Abarbeitung der im
- TRACE-Modus übersetzten Zeilen die aktuelle Zeilennummer aus­
- gegeben wird. Es ist so leicht zu verfolgen, in welcher Reihenfolge
- die Zeilen des Programms ausgeführt werden.
-
- TROFF schaltet den TRACE-Modus für die textuell folgenden Pro­
- grammzeilen wieder aus.
-
-
-Beispiel : 5220 TRON
- 5230 REM hier beginnt die kritische
- 5240 REM Programmstelle
- .
- .
- .
- 5970 TROFF
-
-
- Die Zeilen 5230 bis 5970 werden im TRACE-Modus übersetzt.
-
-
-
-Anweisungsbestandteil : USING
-
-Siehe PRINT-Anweisung
-
-
-
-Funktion : USR
-
-Zweck : Aufruf einer wertliefernden insertierten Prozedur
-
-Syntax : USR <Prozedurname>
- #right#[ (<Parameter> [, <Parameter>] [...] ) ]
-
-Erklärung : <Prozedurname>: Folge aus Zeichen, die für Prozeduren im
- EUMEL-System zugelassen sind (also Buchstaben und - ab der
- zweiten Stelle - Zahlen), jedoch keine Leerzeichen.
-
- <Parameter>: <CONST-Parameter> | <VAR-Parameter>
-
- <CONST-Parameter>: Ausdruck (genau des von der Prozedur
- benötigten Typs)
- <VAR-Parameter>: Variable (genau des von der Prozedur benö­
- tigten Typs)
-
- Die Prozedur mit dem angegebenen <Prozedurnamen> und den
- angegebenen Parametern wird aufgerufen.
- Die USR-Funktion liefert nach Ausführung der Prozedur das von der
- Prozedur übergebene Ergebnis (Typ INT, REAL oder TEXT).
-
- Mögliche Fehlerfälle:
- - Eine Prozedur mit dem Namen <Prozedurnamen> und den ange­
- gebenen Parametern gibt es nicht.
- - Die Prozedur liefert keinen Wert.
- - Die Prozedur liefert einen Typ, der in BASIC unbekannt ist (zum
- Beispiel BOOL).
- - Die Prozedur benötigt Parametertypen, die in BASIC nicht bekannt
- sind (z.B. BOOL, FILE, TASK, QUIET).
- - Ein Parameter ist CONST, es wird aber ein VAR-Parameter ver­
- langt.
-
- Weitere Informationen finden Sie in Kapitel 4.7.
-
-Hinweis : 1. Bei den Parametern wird keine Typkonvertierung vorgenommen.
- 2. Der Prozedurname muß (entgegen der ELAN-Gewohnheit) ohne
- Leerzeichen angegeben werden.
- 3. USR ist die einzige Funktion, bei der das Argument (nämlich der
- Prozeduraufruf) nicht in Klammern stehen darf.
-
-
-Beispiel : 10 LET euler = USR e
- 20 PRINT euler
- Ausgabe: 2.718282
-
-Vergleiche : CALL-, CHAIN-Anweisungen
-
-
-
-Funktion : VAL
-
-Zweck : Konvertierung eines Texts in eine Zahl
-
-Syntax : VAL (<TEXT-Ausdruck>)
-
-Erklärung : Die Funktion liefert den Wert der Zahl, deren Darstellung in dem
- übergebenen TEXT-Ausdruck enthalten ist. Führende Leerstellen
- werden dabei überlesen.
- Sobald ein nicht wandelbares Zeichen festgestellt wird, wird der bis
- dahin ermittelte Wert (am Anfang null) geliefert.
-
-
-Beispiel : 10 LET zahl$ = "-1.256E-63"
- 20 PRINT VAL (zahl$)
- Ausgabe: -1.256E-63
-
-Vergleiche : STR$-Funktion (Komplementärfunktion)
-
-
-
-Anweisung : WEND
-
-Zweck : Markierung des Endes einer WHILE-Schleife
-
-Syntax : WEND
-
-Erklärung : WEND markiert das Ende einer WHILE-Schleife (vergleiche
- WHILE-Anweisung).
-
-Vergleiche : WHILE-, FOR-Anweisungen
-
-
-
-Anweisung : WHILE
-
-Zweck : Beginn einer abweisenden Schleife
-
-Syntax : WHILE <Bedingung>
- <Schleifenrumpf>
-
-Erklärung : <Bedingung> : numerischer Ausdruck
- <Schleifenrumpf>: Folge von Programmzeilen
-
- Die WHILE-Anweisung erlaubt die komfortable Programmierung von
- abweisenden Schleifen (sogenannten WHILE-WEND-Schleifen) in
- BASIC.
- Gelangt das Programm während der Ausführung an eine WHILE-
- Anweisung, so wird zunächst der Bedingungs-Ausdruck ausge­
- wertet. Ist die Bedingung nicht erfüllt (falsch, Wert gleich null), so
- wird das Programm mit der nächsten Anweisung hinter der korres­
- pondierenden WEND-Anweisung fortgesetzt.
- Ist die Bedingung dagegen erfüllt (wahr, Wert ungleich null), so
- werden die Anweisungen des Schleifenrumpfs abgearbeitet. Beim
- Erreichen der WEND-Anweisung springt das Programm wieder zur
- WHILE-Anweisung zurück, die Bedingung wird erneut überprüft und,
- je nach Ergebnis, wird der Schleifenrumpf oder die Anweisung nach
- WEND ausgeführt.
-
- WHILE-WEND-Schleifen dürfen (auch mit FOR-NEXT-Schleifen,
- s.d.) geschachtelt werden. Ãœberschneidungen von WHILE-WEND-
- Schleifen und FOR-NEXT-Schleifen sind jedoch nicht zulässig.
-
-
-Beispiel : 10 LET weiter$ = "j"
- 20 WHILE LEFT$ (weiter$, 1) = "j"
- 30 REM Hier beginnt das eigentliche Programm
- .
- .
- 1650 INPUT "Weiter ? (j/n)", weiter$
- 1660 WEND
-
-
- Das eigentliche Programm wird so lange ausgeführt, bis der Benutzer
- etwas anderes als "j" an der ersten Stelle von 'weiter$' eingibt.
-
-Vergleiche : FOR-, IF-Anweisungen
-
-
-
-Anweisung : WIDTH
-
-Zweck : Einstellung der Bildschirmbreite
-
-Syntax : WIDTH <Zeichen pro Zeile>
-
-Erklärung : <Zeichen pro Zeile> : INT-Ausdruck
-
- Mit der WIDTH-Anweisung wird festgelegt, wie viele Zeichen pro
- Zeile bei Ausgaben auf den Bildschirm oder in Dateien pro Zeile
- ausgegeben werden sollen.
- Soll für die Druckdatei eine andere Anzahl von Zeichen pro Zeile
- gelten als für den Bildschirm, dann muß vor jeder Sequenz von
- LPRINT-Anweisungen die gewünschte Anzahl mit WIDTH einge­
- stellt werden.
- WIDTH gilt auch für Ausgaben in 'sysout'-Dateien.
- Insbesondere bei der Ausgabe in Dateien kann ein Wert von mehr als
- 80 Zeichen pro Zeile sinnvoll sein.
-
-
-Beispiel : 10 REM es sollen nur 45 Zeichen pro Zeile
- 20 REM ausgegeben werden
- 30 WIDTH 45
-
-
-Vergleiche : PRINT-, LPRINT-, WRITE-Anweisungen
-
-
-
-Anweisung : WRITE
-
-Zweck : Ausgabe von Zahlen und Texten auf dem Bildschirm
-
-Syntax : WRITE [<Ausdruck>] [, <Ausdruck>] [...]
-
-Erklärung : <Ausdruck>: numerischer Ausdruck oder TEXT-Ausdruck
-
- Die WRITE-Anweisung erlaubt die Ausgabe von Daten auf dem
- Bildschirm. Die angegebenen Ausdrücke werden ausgewertet und
- ausgegeben. Dabei werden numerische Werte im gleichen Format
- wie bei der PRINT-Anweisung (s.d.) ausgegeben, mit der Einschrän­
- kung, daß den Zahlen keine Leerstelle folgt.
- Die Ergebnisse von Text-Ausdrücken werden von Anführungszei­
- chen umschlossen ausgegeben.
- Alle Einzelausgaben werden durch Kommata voneinander getrennt.
-
- Nach Ausgabe aller angegebenen Ausdrücke wird der Cursor an den
- Anfang der nächsten Zeile positioniert.
-
-
-Beispiel : 10 LET a = 10.7: b = 20
- 20 LET c$ = "Testtext"
- 30 WRITE a, b, c$
- Ausgabe: 10.7, 20,"Testtext"
-
-Vergleiche : PRINT-, LPRINT-, WIDTH-Anweisungen
-
-
-
-Operator : XOR
-
-Siehe Kapitel 4.4. (Operatoren)
-
diff --git a/doc/basic/basic handbuch.3 b/doc/basic/basic handbuch.3
deleted file mode 100644
index 14cb499..0000000
--- a/doc/basic/basic handbuch.3
+++ /dev/null
@@ -1,698 +0,0 @@
-#page nr ("%",97)#
-#head#
-EUMEL-BASIC-Compiler 9. Anpassung von Programmen an den EUMEL-BASIC-Compiler %
-
-#end#
-
-9. Anpassung von Programmen an den EUMEL-BASIC-Compiler
-
-
-9.1. Unterschiede zwischen BASIC-Inter­
- pretern und dem EUMEL-BASIC-
- Compiler
-
-Bei der Anpassung von Programmen für BASIC-Interpreter an den EUMEL-
-BASIC-Compiler gibt es einige Besonderheiten zu beachten, die auf den unterschied­
-lichen Arbeitsweisen von Compilern gegenüber Interpretern beruhen.
-Bei Interpretern fällt die Übersetzung und Ausführung des Quellprogramms zeitlich
-zusammen (genau genommen gibt es ja gar keine Übersetzung, sondern das Quell­
-programm wird #on("i")#interpretiert#off("i")#). Dies hat zur Folge, daß auch nicht zur Ausführung
-bestimmte Anweisungen (z.B. Dimensionierungen, Typfestlegungen etc.) erst während
-der Ausführung des Programms erkannt und ausgewertet werden.
-Bei Compilern hingegen muß deutlich zwischen der Übersetzungszeit (Compiletime)
-und der Laufzeit (Runtime) eines Programms unterschieden werden.
-Der wesentliche Unterschied zwischen Compilern und Interpretern liegt nun in der
-Reihenfolge der Kenntnisnahme von den Anweisungen. Während der Interpreter von
-den Anweisungen in der Reihenfolge ihres Auftretens entlang des Programmablaufs
-Kenntnis nimmt, werden die Anweisungen vom Compiler in der Reihenfolge ihres
-textuellen Auftretens zur Kenntnis genommen.
-Da es sich bei dem EUMEL-BASIC-Compiler um einen One-Pass-Compiler
-handelt, ist es zwingend notwendig, daß
-- DIM-Anweisungen vor dem ersten Zugriff auf das zu dimensionierende Feld
- stehen.
-- OPTION BASE-Anweisungen vor den betreffenden Dimensionierungen stehen.
-- DEF FN-Anweisungen vor dem ersten Aufruf der zu definierenden Funktion ste­
- hen.
-- DEFINT- beziehungsweise DEFSTR-Anweisungen vor der ersten Verwendung der
- betreffenden Variablen erscheinen.
-
-Einige Interpreter lassen sogar den Abschluß von FOR-NEXT- und WHILE-
-WEND-Schleifen an mehreren Stellen im Programm zu (z.B. mehrere NEXT-
-Anweisungen zu einer FOR-Anweisung). Auch solche "Kunstgriffe" gestattet der
-EUMEL-BASIC-Compiler (aus den oben geschilderten Gründen) nicht.
-
-
-
-
-9.2. Abweichungen von ISO 6373-1984
- (Minimal-BASIC)
-
-
-
-Der EUMEL-BASIC-Compiler weicht in folgenden Punkten von der ISO-Norm
-6373-1984 für Minimal-BASIC ab:
-- Treten bei der Auswertung von numerischen Ausdrücken Überläufe auf, so wird
- nicht, wie im Standard vorgesehen, eine Warnung ausgegeben und mit bestimmten
- Höchstwerten weitergerechnet, sondern die Ausführung des BASIC-Programms
- wird mit einer entsprechenden Fehlermeldung abgebrochen.
-- Nimmt die Sprungziel-Nummer bei der ON-Anweisung einen fehlerhaften Wert an
- (Nummer < 1 oder Nummer > Anzahl Sprungziele), dann wird nicht, wie im
- Standard empfohlen, mit einer Fehlermeldung abgebrochen, sondern es wird (wie
- auch in Microsoft-BASIC üblich) das Programm mit der der ON-Anweisung fol­
- genden Anweisung fortgesetzt.
-- Bei der DATA-Anweisung müssen nicht unbedingt Zeichenfolgen angegeben
- werden. Werden sie weggelassen, dann wird bei Ausführung der READ-
- Anweisung null beziehungsweise Leertext geliefert (vergleiche Kapitel 8, DATA-
- Anweisung).
-- Bei den Eingaben für eine INPUT-Anweisung können ebenfalls die Daten wegge­
- lassen werden. Auch hier wird null beziehungsweise Leertext geliefert (vergleiche
- Kapitel 8, INPUT-Anweisung)
-
-
-Die Erweiterungen gegenüber ISO 6373 sollen hier nicht im einzelnen aufgeführt
-werden. Bitte vergleichen Sie in Zweifelsfällen die Normungsschrift mit dieser Doku­
-mentation!
-
-
-
-
-9.3. Anpassung von Microsoft-BASIC Pro­
- grammen an den EUMEL-BASIC-
- Compiler
-
-
-
-Bei der Entwicklung des EUMEL-BASIC-Compilers wurde zwar auf Übereinstim­
-mung mit Microsoft-BASIC Wert gelegt, von einer echten Kompatibilität kann aber
-aufgrund einer ganzen Reihe fehlender Anweisungen und Funktionen nicht gespro­
-chen werden.
-Gegenüber Microsoft-BASIC fehlen vor allem:
-- alle "Direkt-Kommandos" (RUN, LIST, LOAD, SAVE, MERGE usw.). Die Aufgaben
- dieser Anweisungen werden von den Prozeduren des EUMEL-Systems über­
- nommen.
-- im weiteren Sinne "hardware-nahe" oder an Maschinensprache orientierte Anwei­
- sungen und Funktionen (CALL, PEEK, POKE, USR, WAIT usw.)
-- die ERROR-Handling Anweisungen (ON ERROR, RESUME)
-- die Dateiverarbeitungs-Anweisungen und -Funktion (INPUT\#, PRINT\# u.a.; die
- INPUT- und PRINT-Anweisungen wurden aber auf Zusammenarbeit mit 'sysin'
- und 'sysout' abgestimmt.)
-- die Single-Precision-Variablen (Single- und Double-Precision-Variablen wer­
- den beide auf den Datentyp REAL abgebildet.)
-- die hexadezimalen und oktalen Konstanten
-
-Anweisungen und Funktionen, die sich abweichend vom Microsoft-Standard verhal­
-ten, sind vor allem:
-- CALL, CHAIN, USR
-- ERROR, ERR, ERL
-- LSET, RSET
-
-Wichtige Erweiterungen gegenüber Microsoft-BASIC sind:
-- Möglichkeit des Aufrufs von ELAN-Prozeduren
-- Maximale Anzahl von Zeichen pro Zeile: 32000
-- Maximale Anzahl von Zeichen pro TEXT-Objekt: 32000
-- OPTION BASE wirkt auf einzelne Felder (und nicht unbedingt auf ein ganzes
- Programm)
-
-#on ("b")#
-Hinweis zur Verwendung von MS-BASIC-Programmen im EUMEL-System#off ("b")#
-Sollen Microsoft-BASIC-Programme in das EUMEL-Systemm übernommen wer­
-den, so ist dabei so vorzugehen:
-1. Speichern Sie das Programm von MS-BASIC aus mit der ASCII-SAVE-Option
- ab.
- Beispiel: SAVE "PROGRAMM.BAS",A
-2. Lesen Sie das Programm mittels "DOSDAT" (Programm zum Lesen von MS-
- DOS-Dateien) im "file ascii"-Modus ein:
-
- reserve ("file ascii", /"DOS"); fetch ("PROGRAMM.BAS", /"DOS")
-
-Danach steht ihnen das BASIC-Program in der EUMEL-Textdatei
-"PROGRAMM.BAS" zur Verfügung.
-
-#page#
-#head#
-EUMEL-BASIC-Compiler Anhang A: Reservierte Wörter %
-
-#end#
-
-Anhang A: #ib(4)#Reservierte Wörter#ie(4)#
-Dieser Anhang enthält eine Übersicht über alle vom EUMEL-BASIC-Compiler
-erkannten reservierten Wörter.
-
-ABS Funktion
-AND Operator
-AS Anweisungsbestandteil
-ASC Funktion
-ATN Funktion
-BASE Anweisungsbestandteil
-CALL Anweisung
-CDBL Funktion
-CHAIN Anweisung
-CHR$ Funktion
-CINT Funktion
-CLEAR nicht implementiert
-CLOSE nicht implementiert
-CLS Anweisung
-COMMON nicht implementiert
-FIELD nicht implementiert
-COS Funktion
-CSRLIN Funktion
-CVD Funktion
-CVI Funktion
-DATA Anweisung
-DATE$ Funktion
-DEF Anweisung
-DEFDBL Anweisung
-DEFINT Anweisung
-DEFSNG Anweisung
-DEFSTR Anweisung
-DIM Anweisung
-ELSE Anweisungsbestandteil
-END Anweisung
-EOF Anweisungsbestandteil
-EQV Operator
-ERL Funktion
-ERM$ Funktion
-ERR Funktion
-ERROR Anweisung
-EXP Funktion
-FIX Funktion
-FOR Anweisung
-FRE Funktion
-GET nicht implementiert
-GO Anweisungsbestandteil
-GOSUB Anweisung
-GOTO Anweisung
-HEX$ Funktion
-IF Anweisung
-IMP Operator
-INKEY$ Funktion
-INPUT Anweisung
-INPUT$ Funktion
-INSTR Funktion
-INT Funktion
-KILL Anweisung
-LEFT$ Funktion
-LEN Funktion
-LET Anweisung
-LINE Anweisungsbestandteil
-LOC nicht implementiert
-LOG Funktion
-LPOS Funktion
-LPRINT Anweisung
-LSET Anweisung
-MID$ Anweisung/Funktion
-MKD$ Funktion
-MKI$ Funktion
-MOD Operator
-NAME Anweisung
-NEXT Anweisung
-NOT Operator
-OCT$ Funktion
-ON Anweisung
-OPEN nicht implementiert
-OPTION Anweisung
-OR Operator
-OUT nicht implementiert
-POS Funktion
-PRINT Anweisung
-PUT nicht implementiert
-RANDOMIZE Anweisung
-READ Anweisung
-REM Anweisung
-RESTORE Anweisung
-RESUME nicht implementiert
-RETURN Anweisung
-RIGHT$ Funktion
-RND Funktion
-RSET Anweisung
-SGN Funktion
-SIN Funktion
-SPACE$ Funktion
-SPC Funktion
-SQR Funktion
-STEP Anweisungsbestandteil
-STOP Anweisung
-STR$ Funktion
-STRING$ Funktion
-SUB Anweisungsbestandteil
-SWAP Anweisung
-TAB Anweisungsbestandteil
-TAN Funktion
-THEN Anweisungsbestandteil
-TIME$ Funktion
-TIMER Funktion
-TO Anweisungsbestandteil
-TROFF Anweisung
-TRON Anweisung
-USING Anweisungsbestandteil
-USR Funktion
-VAL Funktion
-WAIT nicht implementiert
-WEND Anweisung
-WHILE Anweisung
-WIDTH Anweisung
-WRITE Anweisung
-XOR Operator
-#page#
-#head#
-EUMEL-BASIC-Compiler Anhang B: Vom Scanner erkannte Symboltypen %
-
-#end#
-
-Anhang B: Vom #ib(3)#Scanner#ie(3)# erkannte #ib(3)#Symbol­
-typen#ie(3)#
-
- Der Scanner (ein Paket des EUMEL-BASIC-Systems) hat die Aufgabe, den Pro­
-grammtext Zeichen für Zeichen durchzugehen und auszulesen ('scannen'). Dabei
-werden die Zeichen immer zu logischen Gruppen, sogenannten #on("i")#Symbolen#off("i")# zusammen­
-gefaßt. Diese Symbole werden dann dem eigentlichen Compilerprogramm geliefert.
-Der Scanner entscheidet nach recht komplizierten Regeln, welche Zeichen aus der
-Quelldatei zu einem Symbol zusammengefaßt werden. Dennoch soll in diesem An­
-hang der Begriff des Symbols etwas näher erklärt werden, da der Anwender (vor allem
-bei den Fehlermeldungen) mit Symboltypen konfrontiert wird.
-
-
-
-Reservierte Wörter
-#on ("b")#
-Anfangszeichen:#off ("b")# Buchstaben
-#on ("b")#
-Folgezeichen:#off ("b")# Buchstaben
-#on ("b")#
-Beispiele:#off ("b")# PRINT, VAL, TAB, SUB, TO
-#on ("b")#
-Vergleiche:#off ("b")# Anhang A
-
-
-
-Operatoren
-+ - * / \ ^ MOD
-NOT AND OR XOR EQV IMP
-< > = <= >= <>
-
-#on ("b")#
-Vergleiche:#off ("b")# Kapitel 4.4.
-
-
-
-numerische Konstanten
-#on ("b")#
-Anfangszeichen:#off ("b")# Ziffern 0 bis 9, Dezimalpunkt '.'
-#on ("b")#
-Folgezeichen:#off ("b")# zusätzlich: 'd', 'D', 'e' oder 'E', am Schluß auch '%', '!' oder '\#'
-#on ("b")#
-Beispiele:#off ("b")# 1.0, 1.256d123, 12!
-#on ("b")#
-Vergleiche:#off ("b")# Kapitel 4.2.
-
-
-
-TEXT-Konstanten
-#on ("b")#
-Anfangszeichen:#off ("b")# Anführungszeichen
-#on ("b")#
-Folgezeichen:#off ("b")# Alle Zeichen, sogar Doppelpunkte, Apostrophe und Steuerzei­
- chen. Anführungszeichen dürfen #on("i")#innerhalb#off("i")# von
- TEXT-Konstanten nicht vorkommen. Eine
- TEXT-Konstante #on("i")#muß#off("i")# aber mit einem Anfüh­
- rungszeichen enden.
-#on ("b")#
-Beispiele:#off ("b")# "tadellos", "!?': alles mögliche"
-#on ("b")#
-Vergleiche:#off ("b")# Kapitel 4.2.
-
-
-
-Variablen
-#on ("b")#
-Anfangszeichen:#off ("b")# Buchstaben
-#on ("b")#
-Folgezeichen:#off ("b")# zusätzlich: Punkt '.', Ziffern 0 bis 9, Zeichen '$', '%', '!' und '\#'
-#on ("b")#
-Beispiele:#off ("b")# zeiger, A$, Zahl!, n%, var\#4.3%
-#on ("b")#
-Vergleiche:#off ("b")# Kapitel 4.3.
-
-
-
-Felder/Feldelemente
-wie Variablen, jedoch gefolgt von '(', den Indexangaben und ')'
-#on ("b")#
-Beispiele:#off ("b")# zeiger (3), A$ (pointer), Zahl! (7), n% (a, b, c + d)
-#on ("b")#
-Vergleiche:#off ("b")# Kapitel 4.3.
-
-
-
-Benutzer-definierte Funktionen
-#on ("b")#
-Anfangszeichen:#off ("b")# FN
-#on ("b")#
-Folgezeichen:#off ("b")# Buchstaben, Punkt '.', Ziffern 0 bis 9,
- Zeichen '$', '%', '!' und '\#'
-#on ("b")#
-Beispiele:#off ("b")# FNfunct, FNgauss%, FNf!4.5.6d\#
-#on ("b")#
-Vergleiche:#off ("b")# Kapitel 4.5.
-
-
-
-EOS (End of Statement, Anweisungsende)
-Doppelpunkt ':'
-
-#on ("b")#
-Vergleiche:#off ("b")# Kapitel 4.1.
-
-
-
-EOL (End of Line, Zeilenende)
-Apostrophzeichen ' oder Ende der Dateizeile
-EOL bedeutet gleichzeitig auch EOS
-
-#on ("b")#
-Vergleiche:#off ("b")# Kapitel 4.1.
-
-
-
-EOF (End of File, Dateiende)
-Ende der Quelldatei
-EOF bedeutet gleichzeitig auch EOL (und somit auch EOS)
-
-#on ("b")#
-Vergleiche:#off ("b")# Kapitel 4.1.
-
-
-
-Trennzeichen
-Alle bisher nicht genannten Zeichen werden vom Scanner als Trennzeichen behan­
-delt. In BASIC benötigte Trennzeichen sind das Komma (','), das Semikolon (';') sowie
-die beiden runden Klammern '(' und ')'.
-Zeichen mit Codes kleiner als 32 (Steuerzeichen) werden vom Scanner überlesen.
-#page#
-#head#
-EUMEL-BASIC-Compiler Anhang C: Übersicht über die Fehlermeldungen %
-
-#end#
-
-Anhang C: Übersicht über die Fehlermeldungen
-
-
-Übersicht über die verwendeten Fehlermeldungen zur
-Ãœbersetzungszeit
-Diese Übersicht enthält alle zur Übersetzungszeit möglichen Fehler, mit Ausnahme
-der internen Fehler.
-Die Erläuterungen geben die üblichen Ursachen für die Fehlermeldung an. Es wird
-empfohlen, sich im Falle eines Fehlers außerdem in Kapitel 8 über die genaue Syntax
-der betreffenden Anweisung beziehungsweise Funktion zu informieren.
-
-
-#on ("b")#AS ohne NAME#off ("b")#
-AS darf nur in NAME-Anweisungen vorkommen.
-
-#on ("b")#Accessrecht VAR erwartet, CONST gefunden#off ("b")#
-Beim Aufruf einer ELAN-Prozedur (CALL, CHAIN oder USR) wurde ein VAR-Para­
-meter verlangt. Angegeben wurde aber ein CONST-Parameter (zum Beispiel ein
-Ausdruck).
-
-#on ("b")#Ausdruck erwartet#off ("b")#
-Es wurde ein numerischer oder TEXT-Ausdruck erwartet. Diese Fehlermeldung
-erscheint zum Beispiel, wenn nach einem Operator kein Ausdruck mehr gefunden
-wird.
-
-#on ("b")#BASE ohne OPTION#off ("b")#
-BASE darf nur in OPTION BASE-Anweisungen vorkommen.
-
-#on ("b")#Bei SWAP nur gleiche Variablentypen erlaubt#off ("b")#
-Mit SWAP können nur Variablen von genau dem gleichen Typ bearbeitet werden.
-
-#on ("b")#Das Feld ist bereits dimensioniert#off ("b")#
-Diese Fehlermeldung erscheint bei DIM-Anweisungen, wenn das Feld vorher schon
-explizit oder automatisch dimensioniert wurde.
-
-#on ("b")#ELSE ohne IF#off ("b")#
-ELSE darf nur in IF-Anweisungen vorkommen. ELSE muß in der gleichen Zeile
-stehen wie die zugehörige IF-Anweisung.
-
-#on ("b")#Falsche Felddimension:
-Dimensioniert in ... Dimensionen, gefundene Anzahl Indizes: ...#off ("b")#
-Beim Zugriff auf ein Feldelement wurden zu viele oder zu wenig Indizes angegeben.
-
-#on ("b")#FOR ohne NEXT#off ("b")#
-Diese Fehlermeldung erscheint, wenn am Programmende für eine FOR-Anweisung
-kein korrespondierendes NEXT gefunden wurde.
-
-#on ("b")#Falsche Reihenfolge der Zeilennummern#off ("b")#
-Die Zeilennummern wurden nicht in aufsteigender Reihenfolge angegeben.
-
-#on ("b")#Falscher Typ#off ("b")#
-Es wurde ein anderer Datentyp erwartet als angegeben, und es konnte keine automa­
-tische Konvertierung vorgenommen werden.
-
-#on ("b")#Falscher Typ der Operanden#off ("b")#
-Bei einem dyadischen Operator wurden Operanden angegeben, für deren Typen
-dieser Operator nicht definiert ist (vergleiche Kapitel 4.4.).
-
-#on ("b")#Falscher Typ des Operanden#off ("b")#
-Bei einem monadischen Operator wurde ein Operand angegeben, für dessen Typ
-dieser Operator nicht definiert ist (vergleiche Kapitel 4.4.).
-
-#on ("b")#Fehlerhafte Bereichsangabe#off ("b")#
-Diese Fehlermeldung kann bei den Anweisungen DEFDBL, DEFINT, DEFSNG und
-DEFSTR auftreten, wenn bei einer Bereichsangabe der Buchstabe vor dem Binde­
-strich im Alphabet nach dem Buchstaben hinter dem Bindestrich steht.
-
-#on ("b")#Fehlerhafte Dimensionierung: Die Obergrenze muß >= 1 sein#off ("b")#
-Es wurde versucht, ein Feld mit dem größten Index null in einer Dimension zu
-dimensionieren, obwohl die Index-Untergrenze mit OPTION BASE auf eins einge­
-stellt war.
-
-#on ("b")#Fehlerhafte Laufvariable#off ("b")#
-Nach einer NEXT-Anweisung wurde eine Laufvariable gefunden, die nicht zur letzten
-anhängigen FOR-Anweisung gehört. Der Fehler tritt auf, wenn Schleifen geschachtelt
-wurden.
-
-#on ("b")#Fehlerhafte Zeilennummer#off ("b")#
-Die Zeilennumer entspricht nicht der Syntax für Zeilennumern.
-
-#on ("b")#Fehlerhafter Funktionsaufruf#off ("b")#
-- Die Prozedur liefert keinen Wert
- Es wurde versucht, eine Prozedur mit USR aufzurufen, die keinen Wert liefert.
-- Der Typ des Resultats ist nicht erlaubt, gefunden: ...
- Es wurde versucht, eine Prozedur mit USR aufzurufen, die ein Objekt liefert,
- dessen Datentyp in BASIC nicht bekannt ist.
-- Kein Argument erwartet
- Es wurde versucht, eine benutzer-definierte Funktion, die ohne Parameter definiert
- wurde, mit Argument(en) aufzurufen.
-- ... Argument(e) erwartet
- Die Anzahl der angegebenen Argumente ist kleiner als die Anzahl der bei der
- Funktionsdefinition angegebenen Parameter.
-- Nur ... Argument(e) erwartet
- Die Anzahl der angegebenen Argumente ist größer als die Anzahl der bei der Funk­
- tionsdefinition angegebenen Parameter.
-- Kein Resultat erlaubt (gefunden: ...)
- Bei CALL oder CHAIN wurde versucht, eine wertliefernde Prozedur aufzurufen.
-
-#on ("b")#Funktionsaufruf ohne Zusammenhang#off ("b")#
-Es wurde ein Funktionsaufruf angegeben, wo eine Anweisung erwartet wurde.
-
-#on ("b")#GO ohne TO oder SUB#off ("b")#
-Das reservierte Wort GO kann nur in GO SUB oder GO TO auftreten.
-
-#on ("b")#Interner Fehler#off ("b")#
-Bei der Ãœbersetzung wurde innerhalb des Compilerprogramms ein interner Fehler
-ausgelöst. (vergleiche Kapitel 7.1.)
-
-#on ("b")#Nach OPTION BASE ist nur 0 oder 1 erlaubt#off ("b")#
-Es wurde versucht, eine Zahl > 1 nach OPTION BASE anzugeben.
-
-#on ("b")#NEXT ohne FOR#off ("b")#
-Es wurde eine NEXT-Anweisung gefunden, die keiner FOR-Anweisung zuzuordnen
-ist, da keine "offenen" FOR-Schleifen mehr anhängig sind.
-
-#on ("b")#Nicht implementiert#off ("b")#
-Einige reservierte Wörter werden vom BASIC-Compiler erkannt, obwohl die zugehö­
-rigen Anweisungen oder Funktionen nicht implementiert sind (vgl. Anhang A).
-
-#on ("b")#Parametervariable kommt mehrmals vor#off ("b")#
-Bei der Definition einer "user function" kommt ein Parameter in der Parameterliste
-mehr als einmal vor.
-
-#on ("b")#Rekursive Funktionsdefinition#off ("b")#
-Es wurde versucht, in der Definition einer "user function" die zu definierende Funk­
-tion aufzurufen.
-
-#on ("b")#STEP ohne FOR#off ("b")#
-STEP darf nur in FOR-Anweisungen vorkommen.
-
-#on ("b")#SUB ohne GO#off ("b")#
-SUB darf nur in GOSUB vorkommen.
-
-#on ("b")#Syntaxfehler: <nähere Fehlerangabe>#off ("b")#
-Wenn dieser Fehler erscheint, wurde vom Compiler eine Angabe gefunden, die nach
-den Syntaxregeln dort nicht erwartet wurde oder fehlerhaft ist.
-
-#on ("b")#TAB ohne (L)PRINT#off ("b")#
-TAB darf nur in PRINT- und LPRINT-Anweisungen vorkommen.
-
-#on ("b")#THEN ohne IF#off ("b")#
-THEN darf nur in IF-Anweisungen vorkommen. THEN muß in der gleichen Zeile
-stehen wie die zugehörige IF-Anweisung.
-
-#on ("b")#TO ohne Zusammenhang#off ("b")#
-TO darf nur in FOR-Anweisungen oder in GO TO vorkommen.
-
-#on ("b")#Text zu lang#off ("b")#
-Dieser Fehler erscheint, wenn ein Anführungszeichen fehlt beziehungsweise ein
-Anführungszeichen zu viel gefunden wird.
-
-#on ("b")#Unbekannte Funktion, Argument(e) angegeben: ...#off ("b")#
-Es wurde versucht, eine Funktion mit einem Argument aufzurufen, für dessen Typ die
-Funktion nicht definiert ist.
-
-#on ("b")#Unbekannte Prozedur, Parameter angegeben: ...#off ("b")#
-Die angegebene Prozedur konnte mit den angegebenen Parametertypen nicht gefun­
-den werden.
-
-#on ("b")#Undefinierte 'user function'#off ("b")#
-Es wurde versucht, eine benutzer-definierte Funktion aufzurufen, die (noch) nicht
-definiert wurde.
-
-#on ("b")#USING ohne (L)PRINT#off ("b")#
-USING darf nur in PRINT- und LPRINT-Anweisungen vorkommen.
-
-#on ("b")#WEND ohne WHILE#off ("b")#
-Es wurde eine WEND-Anweisung gefunden, die keiner WHILE-Anweisung zuzuord­
-nen ist, da keine "offenen" WHILE-Schleifen mehr anhängig sind.
-
-#on ("b")#WHILE ohne WEND#off ("b")#
-Diese Fehlermeldung erscheint, wenn am Programmende für eine WHILE-Anweisung
-kein korrespondierendes WEND gefunden wurde.
-
-#on ("b")#Zeile mit dieser Nummer existiert nicht#off ("b")#
-Es wurde versucht, mit GOTO oder GOSUB zu einer Zeilennumer zu verzweigen, die
-im Programm nicht angegeben wurde.
-
-
-
-
-Übersicht über die innerhalb des BASIC-Systems
-ausgelösten Laufzeitfehler
-Die meisten Laufzeitfehler werden auch bei BASIC-Programmen im EUMEL-System
-erzeugt (vergleiche Kapitel 7.2.). Einige werden aber innerhalb des BASIC-Systems
-erzeugt. Die nachfolgende Übersicht enthält die innerhalb des BASIC-Systems aus­
-gelösten Fehler mit Angabe des gelieferten Fehlercodes und der Fehlermeldung.
-
-#on ("b")#Fehlercode:#off ("b")# 1003
-#on ("b")#Fehlermeldung:#off ("b")# RETURN ohne GOSUB
-Eine RETURN-Anweisung wurde gefunden, obwohl keine GOSUB-Anweisung mehr
-anhängig war.
-
-
-#on ("b")#Fehlercode:#off ("b")# 1004
-#on ("b")#Fehlermeldung:#off ("b")# RESTORE: Keine DATA-Anweisung in oder nach
-#right#Zeile ... gefunden
-Eine RESTORE-Anweisung konnte nicht ausgeführt werden, weil in oder nach der in
-der Anweisung angegebenen Zeilennummer keine DATA-Anweisung mehr steht.
-
-
-#on ("b")#Fehlercode:#off ("b")# 1005
-#on ("b")#Fehlermeldung:#off ("b")# bei ^: negative Basis, gebrochener Exponent: ...
-Es wurde versucht, eine negative Zahl mit einer gebrochenen Zahl zu potenzieren.
-
-
-#on ("b")#Fehlercode:#off ("b")# 1005
-#on ("b")#Fehlermeldung:#off ("b")# USING: kein Format gefunden
-Bei einer PRINT USING-Anweisung wurde kein Format für die Ausgabe angegeben
-oder die Formatzeichenkette enthält keine Formatzeichen.
-
-
-#on ("b")#Fehlercode:#off ("b")# 1005
-#on ("b")#Fehlermeldung:#off ("b")# USING-Format fehlerhaft: ...
-Bei einer PRINT USING-Anweisung wurde ein fehlerhaftes Format angegeben.
-
-
-#on ("b")#Fehlercode:#off ("b")# 1004
-#on ("b")#Fehlermeldung:#off ("b")# Keine Daten mehr für READ
-Es stehen keine Daten mehr für die READ-Anweisung zur Verfügung; der READ-
-DATA-Zeiger zeigt hinter das Ende der letzten DATA-Anweisung.
-
-
-#on ("b")#Fehlercode:#off ("b")# 1005
-#on ("b")#Fehlermeldung:#off ("b")# WIDTH: negative Angabe: ...
-Nach WIDTH wurde eine negative Zahl gefunden.
-
-
-#on ("b")#Fehlercode:#off ("b")# 1013
-#on ("b")#Fehlermeldung:#off ("b")# READ: Falscher Datentyp, ... ist kein INT
-Einer INT-Variablen konnte kein Wert zugewiesen werden, da das aktuelle Objekt
-aus der DATA-Liste keine gültige Darstellung eines INT-Wertes war oder ein
-"quoted string" gefunden wurde.
-
-
-#on ("b")#Fehlercode:#off ("b")# 1013
-#on ("b")#Fehlermeldung:#off ("b")# READ: Falscher Datentyp, ... ist kein REAL
-Einer REAL-Variablen konnte kein Wert zugewiesen werden, da das aktuelle Objekt
-aus der DATA-Liste keine gültige Darstellung eines REAL-Wertes war oder ein
-"quoted string" gefunden wurde.
-
-
-#on ("b")#Fehlercode:#off ("b")# 1051 (interner Fehler)
-#on ("b")#Fehlermeldung:#off ("b")# variierend
-Bei der Ausführung des Programms trat in einer Prozedur des BASIC-Systems ein
-interner Fehler auf. (Vergleiche Kapitel 7.)
-
-
-#on ("b")#Fehlercode:#off ("b")# 1080
-#on ("b")#Fehlermeldung:#off ("b")# INPUT-Fehler ( Fehlerart ) : > Eingabezeile <
-Bei einer INPUT-Anweisung, die auf eine mit 'sysin' eingestellte Datei wirken sollte,
-kam es zu einem Fehler der angegebenen Fehlerart. Nach dem Doppelpunkt wird die
-Eingabezeile aus der Eingabedatei ausgegeben.
-#page#
-#head#
-EUMEL-BASIC-Compiler Anhang D: ELAN-Prozeduren des Compilers %
-
-#end#
-
-Anhang D: ELAN-Prozeduren des Compilers
-
- #on ("b")#PROC #ib(3)#basic#ie(3)# (TEXT CONST dateiname)#off ("b")#
- Das in der Datei 'dateiname' enthaltene BASIC-Programm wird dem BASIC-
- Compiler zur Übersetzung übergeben. Werden keine Fehler gefunden, so wird das
- Programm direkt nach der Übersetzung ausgeführt.
- Beispiel:
-
- basic ("Mein liebstes BASIC-Programm")#off ("b")#
-
-
- #on ("b")#PROC basic (TEXT CONST dateiname, prozedurname)#off ("b")#
- Das in der Datei 'dateiname' enthaltene BASIC-Programm wird dem BASIC-
- Compiler zur Übersetzung übergeben. Werden keine Fehler gefunden, dann wird
- das Programm unter dem Namen 'prozedurname' dauerhaft eingetragen (inser­
- tiert).
- Das Programm wird nicht ausgeführt. Beachten Sie, daß der Prozedurname den
- Vorschriften für ELAN-Prozedurnamen entsprechen muß und außerdem #on ("b")#keine
- Leerzeichen#off ("b")# enthalten darf. (Zur Namenswahl siehe auch Kapitel 3.)
- Beispiel:
-
- basic ("Mein liebstes BASIC-Programm", "liebstesprogramm")#off ("b")#
-
-
-
- #on ("b")#PROC #ib(3)#basic list#ie(3)# (BOOL CONST status)#off ("b")#
- Mit der Prozedur 'basic list' kann eingestellt werden, ob die gerade vom Compiler
- übersetzten Programmzeilen angezeigt werden sollen oder nicht (vergleiche Kapitel
- 3.).
-
- basic list (TRUE)#off ("b")#: Die übersetzten Zeile werden angezeigt
- basic list (FALSE)#off ("b")#: Die übersetzten Zeile werden nicht angezeigt
-
-
- #on ("b")#PROC #ib(3)#basic page#ie(3)# (BOOL CONST status)#off ("b")#
- Mit der Prozedur 'basic page' kann eingestellt werden, wie die Ausgaben von
- BASIC-Programmen behandelt werden, wenn der Bildschirm voll ist (vergleiche
- Kapitel 5, Steuerung der Bildschirmausgaben).
-
- basic page (TRUE): Beim Erreichen des Bildschirmendes wird auf einen
- Tastendruck gewartet (vgl. Kap. 5.)
- basic page (FALSE): Beim Erreichen des Bildschirmendes wird 'gescrollt'.
-
diff --git a/doc/basic/basic handbuch.index b/doc/basic/basic handbuch.index
deleted file mode 100644
index 4ac7e16..0000000
--- a/doc/basic/basic handbuch.index
+++ /dev/null
@@ -1,232 +0,0 @@
-#page nr ("%",115)#
-#head#
-EUMEL-BASIC-Compiler Stichwortverzeichnis %
-
-#end#
-
-Stichwortverzeichnis
-
->= 15
-\ 14
-- 14
-+ 14
-+ 15
-<= 15
-* 14
-/ 14
-= 15
-> 15
-< 15
-<> 15
-^ 14
-ABS 31
-AND 16
-Anführungszeichen 10
-Argument 21
-Arithmetische Operatoren 14
-Arrays 13
-ASC 32
-ATN 32
-Äquivalenz-Verknüpfung 17
-Aufruf benutzer-definierter Funktionen 21
-Aufruf und Steuerung des BASIC-Compilers 5
-basic 5, 113
-BASIC-Compiler ERROR 28
-basic list 6, 113
-basic page 25, 114
-benutzer-definierte Funktionen 19, 104
-Bildschirmausgaben 25
-CALL 23, 33
-CDBL 35
-CHAIN 23, 35
-CHR$ 35
-CINT 36
-CLS 36
-Codebereichs pro Task 27
-Compiler Error 304 26
-Compiler Error 307 26
-Compiler Error 308 26
-COS 37
-CSRLIN 37
-CVD, CVI 38
-DATA 38
-DATE$ 40
-Datentypen 10
-Datentyp INT 10
-Datentyp REAL 10
-Datentyp TEXT 10
-Debugging 6
-DEFDBL, DEFINT, DEFSNG, DEFSTR 40
-DEF FN 19, 28, 42
-Definition benutzer-definierter Funktionen 19
-DEFINT 12
-DEFSTR 12
-DIM 13, 43
-Dimensionen 13
-Doppelpunkt 8
-ELSE 54
-END 45
-EOF 56
-EOF (End of File, Dateiende) 7, 105
-EOL (End of Line, Zeilenende) 8, 105
-EOS (End of Statement, Anweisungsende) 8, 105
-EQV 17
-ERL 46
-ERM$ 47
-ERR 47
-ERROR 48
-EUMEL-Coder 26
-EUMEL-Textdatei 7
-Exklusiv-ODER-Verknüpfung 17
-EXP 49
-Exponent 10
-Fehlerbehandlung 28
-Fehlercodes 30
-Fehlerzeile 30
-Fehler zur Laufzeit 30, 111
-Fehler zur Ãœbersetzungszeit 28, 106
-Felder (Arrays) 13
-Felder/Feldelemente 104
-Feldnamen 13
-FIX 49
-FOR 50
-FRE 51
-Funktionen 19
-Funktionsaufrufe 19
-Ganzzahlen 10
-Generatorprogramm 4
-Gleitkommazahlen 10
-GOSUB 52
-GOTO 53
-Grenzen des Compilers 26
-Groß-/Kleinschreibung 9
-Hauptdurchlauf 28
-HEX$ 54
-Hochkomma 8
-IF 54
-IMP 17
-Implikations-Verknüpfung 17
-Indizes 13
-INKEY$ 56
-INPUT$ 58
-INPUT 56
-Insertieren von BASIC-Programmen 5
-Installation des BASIC-Compilers 4
-INSTR 59
-INT 59
-Interne Compilerfehler 28
-INTs 10
-INT-Ãœberlauf 15
-KILL 60
-Konstanten 10
-Konvertierung 15, 22
-Kriterien für den Typ einer Variablen 12
-Labels 26
-Leerzeichen 9
-LEFT$ 60
-LEN 61
-LET 61
-LINE INPUT 62
-LOG 63
-Logische Operatoren 16
-LPOS 63
-LPRINT 64
-LSET 65
-Mantisse 11
-MID$ 65, 66
-MKD$, MKI$ 67
-MOD 14
-Modulgrenze 26
-NAME 68
-Namenstabelle 27
-Negation 16
-negative Zahlenwerte 11
-NEXT 50, 68
-NOT 16
-Notation 3
-Notebook 28
-numerische Konstanten 103
-OCT$ 69
-ODER-Verknüpfung 17
-ON 69
-Operatoren 103
-Operatoren, arithmetische 14
-Operatoren, logische 16
-Operatoren, Text- 15
-Operatoren, Vergleichs- 15
-Operator, Zuweisungs- 18
-OPTION BASE 13, 71
-OR 17
-Parameter 19
-POS 72
-PRINT 72
-Prioritäten der Operanden 18
-Programmdatei 7
-Programmsegmente 24
-Programmzeile 7
-RANDOMIZE 75
-READ 75
-REM 77
-Reservierte Wörter 9, 12, 100, 103
-RESTORE 77
-RETURN 78
-RIGHT$ 79
-RND 80
-RSET 81
-Scanner 9, 103
-Schlüsselwörter 9
-Scrolling 25
-SGN 81
-SIN 82
-SPACE$ 82
-SPC 83
-SQR 83
-Standard-Funktionen 19
-STEP 50
-Steuerung der Bildschirmausgaben 25
-Steuerung des BASIC-Compilers 5
-STOP 84
-STR$ 84
-STRING$ 85
-SUB 52
-SWAP 86
-Symbol 9
-Symboltypen 103
-Syntax 7
-sysout 6
-TAB 64, 72
-TAN 86
-Texte 10
-TEXT-Konstanten 104
-Text-Operator + 15
-THEN 54
-TIME$ 88
-TIMER 87
-TO 50, 53
-Trennzeichen 105
-TRON / TROFF 88
-Typanpassung 22
-UND-Verknüpfung 16
-USING 64, 72
-USR 23, 90
-Ãœbersetzen von BASIC-Programmen 5
-Ãœbersichtlichkeit von BASIC-Programmen 7
-VAL 91
-Variablen 12, 104
-Variablennamen 9, 12
-VAR-Parameter 23
-Vergleichsoperatoren 15
-Vordurchlauf 28
-Vorzeichen 11
-Wahrheitswerte 16
-Weitere Schreibregeln 9
-WEND 92
-wertliefernden Prozeduren 23
-WHILE 92
-WIDTH 93
-WRITE 94
-XOR 17
-Zahlen 10
-Zeilennummer 7
-Zuweisungsoperator 18
-
diff --git a/doc/dialog/gs-dialog handbuch.impressum b/doc/dialog/gs-dialog handbuch.impressum
deleted file mode 100644
index b470fe4..0000000
--- a/doc/dialog/gs-dialog handbuch.impressum
+++ /dev/null
@@ -1,89 +0,0 @@
-____________________________________________________________________________
-
-
-#on("b")##on ("u")#
-#center#Betriebssystem E U M E L
-#off ("u")#
-
-
-#center#gs-Dialog
-
-
-
-
-#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#
-
-#free (4.0)##on("b")#
-#center#gs-Dialog
-
-
-#center#Benutzerhandbuch
-
-
-#center#Version 1.0
-
-
-#off("b")##center#copyright
-#center#Eva Latta-Weber
-#center#Software- und Hardware-Systeme, 1988
-#center#ERGOS GmbH, 1990
-#page#
-#block#
-#center#____________________________________________________________________________
-
-
-Copyright:  ERGOS GmbH   März 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.
-
-
-#center#____________________________________________________________________________
-
-Es kann keine Gewähr übernommen werden, daß das Programm für eine
-bestimmte Anwendung geeignet ist. Die Verantwortung dafür liegt beim
-Anwender.
-
-Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrektheit und
-Vollständigkeit der Angaben kann keine Gewähr übernommen werden. Das
-Handbuch kann jederzeit ohne Ankündigung geändert werden.
-
-Texterstellung :  Dieser Text wurde mit der ERGOS-L3 Textverarbeitung
- erstellt und aufbereitet und auf einem Kyocera Laser­
- drucker gedruckt.
-
-
-
-
-#center#___________________________________________________________________________
-
-
-
-Ergonomic Office Software GmbH
-
-Bergstr. 7 Telefon: (02241) 63075
-5200 Siegburg Teletex: 2627-2241413=ERGOS
- Telefax: (02241) 63078
-
-
-#center#____________________________________________________________________________
-
-
diff --git a/doc/dialog/gs-dialog-1 b/doc/dialog/gs-dialog-1
deleted file mode 100644
index 59b98c3..0000000
--- a/doc/dialog/gs-dialog-1
+++ /dev/null
@@ -1,107 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (3)#
-#headodd#
-#center#gs-DIALOG#right#%
-
-#end#
-#headeven#
-%#center#gs-DIALOG
-
-#end#
-
-#center#1
-
-#center#Was kann gs-DIALOG?
-
-
-
- In diesem Kapitel wollen wir Ihnen erläutern, was
-#on("b")#gs-DIALOG#off("b")# Ihnen für Vorteile bringen soll. Sie haben
-sicher schon mit einem Computer gearbeitet und sich
-mehrfach darüber geärgert, daß Sie mit jedem neuen Pro­
-gramm auch eine neue Bedienung erlernen müssen. Zwar
-sind Sie als EUMEL-Anwender schon sehr verwöhnt, da das
-System sehr homogen ist und bestimmte Systemelemente,
-wie z.B. der Editor, mit immer gleicher Bedienung immer
-wieder auftauchen. Für die jeweiligen Anwendungspro­
-gramme aber gibt es eine Reihe von Kommandos und Tasten­
-folgen, die Sie sich für die Bedienung merken müssen.
-Brauchen Sie Informationen zu den einzelnen Programm­
-teilen, so müssen Sie zumeist in (den gerade nicht griff­
-bereiten) Handbüchern nachschlagen.
- Und der Anfänger? Er ist am härtesten betroffen! Er
-muß sich nicht nur mit der neuen Maschine auseinander­
-setzen, die technische Handhabung erlernen - von ihm
-erwartet man, daß er sich innerhalb kurzer Zeit eine Rei­
-he von Kommandos einprägt, die für die Bedienung des
-Grundsystems notwendig sind - und darüber hinaus noch
-die Kommandos für die verschiedenen Anwendungsprogram­
-me. Viele resignieren nach den ersten Gehversuchen.
- Und der Programmierer? Viele Anwender haben keine
-Vorstellung davon, welche Arbeit in einem Programm
-steckt. Einen großen Teil seiner Arbeit verwendet der
-Programmierer darauf, die Benutzerschnittstelle zu ge­
-stalten - den Teil des Programms, mit dem der Anwender in
-Kontakt kommt, über den er mit dem Programm kommuni­
-ziert, einen Dialog führt. Die Gestaltung und Pflege der
-Benutzerschnittstelle kann dabei bis zu 50% der Gesamt­
-arbeit an einem Programm ausmachen.
-
- #on("b")#gs-DIALOG#off("b")# ist entwickelt worden, um diese Nachteile zu
-beheben bzw. zumindest zu verringern. Grundelemente von
-#on("b")#gs-DIALOG#off("b")# sind die Pull-Down-Menus (Klappmenus), in de­
-nen die zur Verfügung stehenden Funktionen übersicht­
-lich zur Auswahl angeboten werden. So ist es möglich, daß
-eine Vielzahl von Funktionen verwaltet werden - ohne
-daß der Anwender den Überblick verliert. Dabei können zu
-jeder angebotenen Funktion noch Informationen abge­
-rufen werden, so daß ein Blättern in Handbüchern sich
-zumeist erübrigt.
- Zunächst einmal ist #on("b")#gs-DIALOG#off("b")# gar kein eigenständiges
-Programm. Es ist vielmehr ein Baukastensystem, auf das
-andere Programme zugreifen können. Davon können sowohl
-der Programmierer und erst recht der Anwender profi­
-tieren:
- Der Programmierer wird bei seiner Arbeit - insbeson­
-dere bei der Gestaltung der Benutzerschnittstelle we­
-sentlich entlastet, da er auf vorgefertigte Komponenten
-zurückgreifen kann. Er kann sich mehr auf die inhalt­
-liche Ausgestaltung seiner Programme konzentrieren.
- Sie als Anwender profitieren von der #on("u")#einfachen#off("u")# und
-#on("u")#immer einheitlichen Bedienung#off("u")# solcher Programme. Aus
-den Menupunkten können Sie auf einfache Weise auswählen
-und den gewünschten Teil des Programms zur Ausführung
-bringen. Durch diese Bedienung wird der Aufwand, sich in
-ein neues Programmsystem einzuarbeiten, erheblich redu­
-ziert. Die zur Verfügung stehenden Programmfunktionen
-können effektiver ausgenutzt werden, da sie jederzeit
-offensichtlich sind. Informationen zu den einzelnen Pro­
-grammpunkten können Sie jederzeit abrufen, d.h. zumeist
-können Sie auf ein Nachschlagen in den Handbüchern ver­
-zichten.
- #on("b")#gs-DIALOG#off("b")# ist aber nicht nur ein Baukastensystem, auf
-das andere Programme zugreifen können. Bei nahezu jeder
-Anwendung ist es notwendig, Dateien auf das Archiv zu
-schreiben oder von dort zu holen. Aus diesem Grunde ist
-eine leistungsfähige, komfortable Archivbehandlung in
-das Programmsystem integriert.
- Ein Austausch von Dateien ist aber nicht nur mit dem
-Archiv möglich. Sie können auch mit anderen Tasks inner­
-halb Ihres Systems (z.B. mit der Vatertask) oder sogar -
-sofern installiert - mit einer Task irgendwo innerhalb
-des EUMEL-Netzes Dateien austauschen. Daneben werden
-noch Funktionen angeboten, die den Umgang mit den Da­
-teien vereinfachen (Verzeichnis, Umbenennen, Kopieren,
-Löschen, Aufräumen etc.).
- Diese Funktionen stehen Ihnen unabhängig von ande­
-ren Programmen zu Verfügung, sobald Sie #on("b")#gs-DIALOG#off("b")# in­
-stalliert haben. Andererseits finden Sie diese Funktionen
-in immer gleicher Form auch in den meisten Programmen,
-die auf der Basis von #on("b")#gs-DIALOG#off("b")# entwickelt worden sind
-und entwickelt werden.
-
-
-
-
-
diff --git a/doc/dialog/gs-dialog-2 b/doc/dialog/gs-dialog-2
deleted file mode 100644
index a25d35d..0000000
--- a/doc/dialog/gs-dialog-2
+++ /dev/null
@@ -1,215 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (6)#
-#headodd#
-#center#gs-DIALOG#right#%
-
-#end#
-#headeven#
-%#center#gs-DIALOG
-
-#end#
-
-#center#2
-
-#center#Installation von gs-DIALOG
-
-
-
- Bevor Sie #on("b")#gs-DIALOG#off("b")# auf Ihrem System benutzen kön­
-nen, müssen Sie das Programm zunächst installieren. Wenn
-#on("b")#gs-DIALOG#off("b")# auf Ihrem System schon zur Verfügung steht,
-können Sie dieses Kapitel ruhig überspringen.
-
-
-2.1 Voraussetzungen:
-
- Um #on("b")#gs-DIALOG#off("b")# auf Ihrem Computer betreiben zu können,
-muß das EUMEL-Betriebssystem installiert sein. #on("b")#gs-DIALOG#off("b")#
-setzt die Multi-User-Version voraus und ist lauffähig ab
-Version 1.7.5.
-
-
-2.2 Lieferumfang
-
- #on("b")#gs-DIALOG#off("b")# wird auf einer Diskette geliefert, die alle
-notwendigen Programme enthält. Um den Inhalt der Dis­
-kette feststellen zu können, starten Sie Ihr System und
-bringen es dazu, daß 'gib kommando:' erscheint. Dann legen
-Sie die Diskette ein und geben das Kommando:
-
- archive ("gs-DIALOG"); list (archive);
- release (archive) <RETURN>
-
- Anschließend erscheint eine Übersicht der auf dem
-Archiv vorhandenen Programme. Folgende Programme soll­
-ten sich in der Ãœbersicht befinden:
-
- "gs-DIALOG MENUKARTEN MANAGER"
- "gs-DIALOG MM/gen"
- "gs-DIALOG 1"
- "gs-DIALOG 2"
- "gs-DIALOG 3"
- "gs-DIALOG 4"
- "gs-DIALOG 5"
- "gs-DIALOG 6"
- "gs-DIALOG 7"
- "gs-MENUKARTE:Archiv"
- "gs-DIALOG/gen"
-
- Eventuell können noch weitere Namen auf der Diskette
-vorhanden sein. Wenn Sie den Inhalt der Diskette kon­
-trolliert haben und diese Programme auf der Diskette
-vorhanden sind, können Sie #on("b")#gs-DIALOG#off("b")# installieren.
- Sollten Sie statt der Ãœbersicht eine Fehlermeldung
-erhalten, überprüfen Sie bitte, ob die Diskette das rich­
-tige Format besitzt oder ob ihr Diskettenlaufwerk Pro­
-bleme macht. Sollten dagegen Programme fehlen, so rekla­
-mieren Sie die Diskette.
-
-
-2.3 Installation
-
-Die Installation erfolgt in #on("u")#zwei Schritten#off("u")#:
- #on("u")#Zunächst#off("u")# muß eine Task eingerichtet werden, in der
-später alle Menukarten aufbewahrt werden. Diese Menu­
-karten enthalten alle Informationen, die #on("b")#gs-DIALOG#off("b")# für
-den Aufbau und den Umgang mit den Menus benötigt. #on("u")#Der
-Name dieser Task ist vorgegeben#off("u")# ('gs-MENUKARTEN'), da
-#on("b")#gs-DIALOG#off("b")# später auf diese Task zugreift. Sollten Sie
-hier einen anderen Namen wählen, so wird die Task vom
-Generierungsprogramm automatisch umbenannt, um die
-Funktionsfähigkeit von #on("b")#gs-DIALOG#off("b")# zu garantieren!
- #on("u")#Anschließend#off("u")# kann das Programmsystem selbst in einer
-anderen Task installiert werden. Wie nehmen hier an, daß
-die Task den Namen 'MENU' erhalten soll. (Sie können für
-diese Task auch einen beliebigen anderen Namen wählen.)
-
-
-1) #on("u")#Einrichten der 'Menukarten - Task'#off("u")#
-
-#on("b")#
- <SV> (Supervisor - Taste)
-#off("b")#
-
- --> gib supervisor kommando:
-
-#on("b")#
- begin ("gs-MENUKARTEN") <RETURN>
-#off("b")#
-
- --> gib kommando:
-
-
- (Arbeiten mehrere Personen mit dem Computer, dann ist
-es sinnvoll, diese Task vor unbefugtem Zugriff durch ein
-Passwort zu schützen. Wie das gemacht wird, können Sie in
-Ihrem EUMEL-Benutzerhandbuch erfahren.)
- Legen Sie dann die Archivdiskette ein, auf der sich
-#on("b")#gs-DIALOG#off("b")# befindet, und geben Sie die folgenden Komman­
-dos:
-
-#on("b")#
- archive("gs-DIALOG") <RETURN>
-
- fetch("gs-DIALOG MM/gen",archive) <RETURN>
-
- run <RETURN>
-#off("b")#
-
- Sie haben damit das Generatorprogramm gestartet; die
-Installation wird automatisch durchgeführt. Lassen Sie
-während des gesamten Vorgangs die Archivdiskette einge­
-legt. Die Generierung ist beendet, wenn der EUMEL-
-Eingangsbildschirm erscheint.
-
-2) #on("u")#Installation des Programmsystems#off("u")#
-
-
-#on("b")#
- <SV> (Supervisor - Taste)
-#off("b")#
-
- --> gib supervisor kommando:
-
-#on("b")#
- begin ("MENU") <RETURN>
-#off("b")#
-
- --> gib kommando:
-
-
- (Sichern Sie, wenn gewünscht, auch diese Task durch
-ein Passwort vor unbefugtem Zugriff.)
- Legen Sie die #on("b")#gs-DIALOG#off("b")#-Archivdiskette ein und geben
-Sie die folgenden Kommandos:
-
-#on("b")#
- archive("gs-DIALOG") <RETURN>
-
- fetch("gs-DIALOG/gen",archive) <RETURN>
-
- run <RETURN>
-#off("b")#
-
- Sie haben damit das Generatorprogramm gestartet. Die
-Generierung benötigt jetzt aber wesentlich mehr Zeit als
-die zuvor! Lassen Sie während des gesamten Vorgangs die
-Archivdiskette eingelegt. Die Generierung ist beendet,
-wenn der EUMEL-Eingangsbildschirm erscheint. Die Task,
-in der die Generierung stattfindet, wird automatisch zur
-Managertask, das heißt, daß Söhne von ihr eingerichtet
-werden können. Damit ist die Installation von #on("b")#gs-DIALOG#off("b")#
-abgeschlossen - in allen Sohn- und Enkeltasks können
-Sie nun mit dem Kommando:
-
-#on("b")#
- archiv <RETURN>
-#off("b")#
-
-die Archivverwaltung aufrufen.
-
-
-2.4 Nutzung der 'Semi-Graphik-Zeichen'
-
- #on("b")#gs-DIALOG#off("b")# verwendet beim Aufbau der Rahmen inner­
-halb der Menus nur solche Zeichen, die auf jedem Computer
-zur Verfügung stehen. Die meisten Computer/Terminals
-verfügen aber über einen Zeichensatz, der es erlaubt,
-solche Rahmen "schöner" darzustellen. #on("b")#gs-DIALOG#off("b")# ist dar­
-auf vorbereitet, diese Eigenschaften auszunutzen.
- Allerdings ist der Aufruf dieser Graphikzeichen nicht
-einheitlich festgelegt. Verfügen Sie über einen Computer,
-der 'IBM - kompatibel' ist, oder über ein Terminal 'Beehive
-FT20', dann können Sie die Graphikzeichen ganz einfach
-nutzen, denn dafür sind im Programm bereits Befehle vor­
-bereitet.
-
-ibm  graphic char <RETURN> - Mit diesem Befehl stel­
- len Sie für #on("b")#gs-DIALOG#off("b")#
- den 'IBM - Graphikzei­
- chensatz' ein.
-
-ft20 graphic char <RETURN> - Mit diesem Befehl stel­
- len Sie für #on("b")#gs-DIALOG#off("b")#
- den 'Beehive FT20 -
- Graphikzeichensatz'
- ein.
-
-std  graphic char <RETURN> - Mit diesem Befehl stel­
- len Sie wieder den
- 'Standard - Graphik­
- zeichensatz' ein.
-
- Nehmen Sie eine solche Einstellung in einer Task vor,
-so erben alle Sohn- und Enkeltasks diese Einstellung. Sie
-können auch in verschiedenen Task unterschiedliche Ein­
-stellungen wählen.
-
- Verfügen Sie über andere Computer- oder Terminalty­
-pen, die Grapikzeichen darstellen können, so können Sie
-diese ebenfalls nutzen. Sie müßten sich allerdings ein
-kleines ELAN-Programm schreiben. Aber auch das ist ganz
-einfach, da #on("b")#gs-DIALOG#off("b")# auch darauf vorbereitet ist. Wie
-das gemacht wird, wird aber erst in Kapitel 5 erläutert.
-
diff --git a/doc/dialog/gs-dialog-3 b/doc/dialog/gs-dialog-3
deleted file mode 100644
index 044720b..0000000
--- a/doc/dialog/gs-dialog-3
+++ /dev/null
@@ -1,683 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (12)#
-#headodd#
-#center#gs-DIALOG#right#%
-
-#end#
-#headeven#
-%#center#gs-DIALOG
-
-#end#
-
-#center#3
-
-#center#Umgang mit den Menus
-
-
-#center#Eine Beispielsitzung
-
-
- Wie schon oben erwähnt, ist in #on("b")#gs-DIALOG#off("b")# eine Archiv­
-verwaltung integriert. Anhand dieses Programms möchten
-wir den Umgang mit und die Arbeitsweise von #on("b")#gs-DIALOG#off("b")#
-vorstellen. Als Beispiel wollen wir eine Datei von einer
-Ihrer Archivdisketten ins System holen.
- Zunächst zu den Begriffen: Die Disketten, die Sie in den
-Rechner einlegen können, um z.B. Dateien (und Programme)
-von anderen Computern übernehmen zu können, bezeichnet
-man als #on("u")#Archiv#off("u")#. Das Archiv (die Diskette) wird benutzt, um
-Daten und Programme vor Beschädigung und Verlust zu
-sichern. Es ist sehr wichtig, daß Sie Ihre Programme und
-Daten auf Archivdisketten sichern, denn ein einziger
-Hardwarefehler könnte die Arbeit von vielen Stunden
-zunichte machen.
- Da man diese Operationen, d.h. Programme und Daten
-auf Disketten zu sichern und wieder von dort zu holen,
-sehr häufig benötigt, ist die Archivbehandlung fest in
-das #on("b")#gs-DIALOG#off("b")#-Programmsystem integriert und Bestandteil
-nahezu jeden Programms, das unter #on("b")#gs-DIALOG#off("b")# entwickelt
-wird. Unabhängig von anderen Programmen kann die
-Archivbehandlung aber auch benutzt werden, sobald
-#on("b")#gs-DIALOG#off("b")# installiert ist. Das wollen wir jetzt auspro­
-bieren.
-
-
-3.1 Aufruf der Archivverwaltung:
-
- Richten Sie eine Task als Sohn der Task ein, in der Sie
-#on("b")#gs-DIALOG#off("b")# installiert haben. Nehmen wir hier an, die neue
-Task soll den Namen 'TEST' erhalten - die Task, in der
-#on("b")#gs-DIALOG#off("b")# installiert ist, habe den Namen 'MENU'.
-
-#on("b")#
- <SV> (Supervisor - Taste)
-#off("b")#
- --> gib supervisor kommando:
-#on("b")#
- begin ("TEST","MENU") <RETURN>
-#off("b")#
-
- --> gib kommando:
-#on("b")#
- archiv <RETURN>
-#off("b")#
-
- Mit dem Befehl 'archiv' können Sie jederzeit die Archiv­
-behandlung aufrufen - es erscheint dann folgendes Menu:
-
-
-#on("b")#
-ARCHIV: Dateien Archiv
--+-------------------+----------------------------------------------------
- | v Verzeichnis |
- | --------------- |
- | l Löschen |
- | d Drucken |
- | --------------- |
- | k Kopieren |
- | u Umbenennen |
- | --------------- |
- | s Speicherplatz |
- | a Aufräumen |
- +-------------------+
-
-
-
-
-
-
-
---------------------------------------------------------------------------
-Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
-#off("b")#
-
-
-3.2 Bedienung des Menusystems
-
-- Aufbau der Menus (Bildschirmaufbau)
-
- Ein Menu ist ein Angebot von Funktionen, die ein Pro­
-gramm ausführen kann. Aus diesem Angebot kann der Pro­
-grammbenutzer auswählen. In diesem Sinne ist ein solches
-Menu durchaus vergleichbar mit einer Speisenkarte in
-einem Restaurant.
- Jedes Menu unter #on("b")#gs-DIALOG#off("b")# besitzt eine 'Kopfzeile'
-und eine 'Fußzeile'. In der Kopfzeile ist ganz links der
-Name des Programms angegeben, mit dem Sie gerade arbei­
-ten. Daneben enthält die Kopfzeile die 'Oberbegriffe', mit
-denen die einzelnen Untermenus angesprochen werden
-können. Maximal können hier zehn Oberbegriffe auftau­
-chen - in unserem Beispiel sind es nur zwei.
- Besondere Bedeutung für die Bedienung der Menus
-kommt der Fußzeile zu. Einerseits wird hier jeweils ange­
-zeigt, welche Tasten Sie zum jeweiligen Zeitpunkt benut­
-zen können, andererseits erhalten Sie über diese Fußzeile
-auch Informationen, wenn #on("b")#gs-DIALOG#off("b")# "mit sich selbst be­
-schäftigt ist", d.h. Operationen ausführt. Wissen Sie also
-nicht mehr weiter, so schauen Sie zuerst auf die Fußzeile
-und beachten Sie die hier stehenden Informationen.
- Im Bereich zwischen der Kopf- und Fußzeile werden die
-Untermenus ausgegeben. Dieser Bereich wird auch dazu
-benutzt, um Informationen an den Benutzer einzublenden,
-Fragen an ihn zu richten, ihn aus einem Angebot (z.B. von
-Dateien) auswählen zu lassen und vieles mehr.
- Treiben wir den Vergleich mit der Speisenkarte in ei­
-nem Restaurant noch ein wenig weiter. Bei einem großen
-Angebot kann eine Speisenkarte recht umfangreich wer­
-den. Denken Sie beispielsweise an eine Speisenkarte in
-einem chinesischen Restaurant. Dazu sind neben den an­
-gebotenen Gerichten oft noch Zusatzinformationen (Zube­
-reitungsart, Zutaten etc.) angegeben. Um dem Gast die Aus­
-wahl zu erleichtern, ist die Speisenkarte aber zumeist
-untergliedert; man findet Suppen, warme Vorspeisen, kalte
-Vorspeisen, Gerichte mit Schweinefleisch, mit Rindfleisch,
-mit Geflügel, mit Fisch etc.
- Ein Computerprogramm kann, ebenso wie ein Restau­
-rant, dem Benutzer ein großes Angebot (an Programmfunk­
-tionen) machen. Von großem Nachteil ist allerdings, daß
-ein Computerbildschirm - im Gegensatz zu einer umfang­
-reichen Speisenkarte - viel zu klein ist, um alle Angebote
-und Informationen gleichzeitig darstellen zu können.
-Außerdem würde ein nahezu vollständig beschriebener
-Bildschirm sehr unübersichtlich sein.
- Aus diesem Grunde haben wir uns entschlossen, immer
-nur einen Teil des vorhandenen Angebotes an Funktionen
-und der vorhandenen Informationen anzuzeigen - immer
-nur soviel, daß Sie sich auf dem Bildschirm orientieren
-können und den Überblick nicht verlieren. Dazu haben Sie
-die Möglichkeit, jeweils zu bestimmen, auf welche Infor­
-mationen Sie Ihre Aufmerksamkeit richten wollen, was Sie
-angezeigt bekommen möchten.
-
-
-- Auswahl der Menupunkte
-
- Zu jedem Oberbegriff in der Kopfzeile gehört eine
-Liste von Funktionen, die das Programm dazu zur Auswahl
-anbietet. Allerdings ist immer nur eine Liste (ein Unter­
-menu) sichtbar. Das sichtbare Untermenu gehört immer zu
-dem Oberbegriff in der Kopfzeile, der invers dargestellt
-ist. Wir wollen uns zunächst das Untermenu zum zweiten
-Oberbegriff ('Archiv') anzeigen lassen. Zum Wechsel zwi­
-schen den Oberbegriffen in der Kopfzeile benutzt man die
-Pfeiltasten <links> oder <rechts>. Probieren Sie es einmal
-aus. Es erscheint das folgende Bild auf dem Bildschirm:
-
-
-#on("b")#
-ARCHIV: Dateien Archiv
--------+-------------------------+----------------------------------------
- | r Reservieren |
- | - Neue Diskette |
- | --------------------- |
- | - Schreiben |
- | - Checken |
- | - Kombination |
- | - Holen/Lesen |
- | - Löschen |
- | --------------------- |
- | - Verzeichnis |
- | - Drucken |
- | --------------------- |
- | i Initialisieren |
- | z Zieltask einstellen |
- +-------------------------+ +---------------------+
- | Dateiaustausch mit: |
- | Archiv |
- | Archivname: |
- | --- |
- +---------------------+
---------------------------------------------------------------------------
-Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
-#off("b")#
-
-
- Sie können jetzt sehen, daß ein anderer Oberbegriff in
-der Kopfzeile aktiviert, d.h. invers dargestellt ist. Dane­
-ben wurde noch das sichtbare Untermenu "eingeklappt"
-und ein anderes "ausgeklappt". Man könnte die Unterme­
-nus deshalb auch als 'Klappmenus' bezeichnen - gebräuch­
-lich ist allerdings die Bezeichnung 'Pull-Down-Menus', an
-die wir uns auch halten wollen.
-
- Sicher haben Sie bemerkt, daß es einen Augenblick
-gedauert hat, bis das Pull-Down-Menu unter dem Menu­
-punkt 'Archiv' erschien. Das hat auch seine Ursache, denn
-#on("b")#gs-DIALOG#off("b")# muß einige Einstellungen vornehmen, die etwas
-Zeit in Anspruch nehmen. Neben dem Pull-Down-Menu ist
-unten rechts auf dem Bildschirm noch ein 'Kasten' sicht­
-bar geworden. Er dient Ihnen zur Information. Da
-#on("b")#gs-DIALOG#off("b")# nicht nur den Austausch von Dateien mit dem
-Archiv, sondern auch mit anderen Tasks ermöglicht, wird
-hier immer angezeigt, mit welcher Task der Dateiaus­
-tausch zur Zeit erfolgt. Ist das Archiv eingestellt, so
-wird auch noch der Name der Diskette angezeigt - aber
-erst wenn das Archiv angemeldet worden ist, was ja mo­
-mentan noch nicht der Fall ist. Deshalb werden nur drei
-Striche ausgegeben.
- Sicher ist Ihnen das Grundprinzip der Menubehand­
-lung schon klar geworden: Sie müssen sich zuerst inner­
-halb der Kopfzeile für einen Oberbegriff entscheiden.
-Zum gewählten Oberbegriff wird dann jeweils das Angebot
-an zugehörigen Programmfunktionen im darunterstehen­
-den Pull-Down-Menu angezeigt. Dieses Vorgehen hat den
-Vorteil, daß man den kleinen Bildschirm im Prinzip "mehr­
-fach nutzen kann". Die Pull-Down-Menus können sich ja
-ruhig überlappen. Sie merken es gar nicht, da ja nicht
-alle gleichzeitig angezeigt werden.
- Noch ein Vorteil ist da, Sie können sich auf den Teil
-konzentrieren, für den Sie sich gerade interessieren und
-werden nicht durch andere Informationen abgelenkt. An­
-dererseits können Sie jederzeit auch an die Funktionen
-und Informationen gelangen, die gerade nicht sichtbar
-sind.
- Sie haben sicher bemerkt, daß nicht nur innerhalb der
-Kopfzeile ein Begriff invers dargestellt ist, sondern
-auch einer innerhalb jedes Pull-Down-Menus. Nachdem man
-sich für einen Oberbegriff entschieden hat, kann man
-nämlich noch zwischen den Funktionen innerhalb des
-Pull-Down-Menus wählen.
- Da das Pull-Down-Menu zum Oberbegriff 'Archiv' noch
-einige Besonderheiten aufweist, wollen wir uns die Funk­
-tionsweise zuerst am Pull-Down-Menu unter dem Oberbe­
-griff 'Dateien' verdeutlichen. Bitte wechseln Sie deshalb
-durch Betätigung der Pfeiltaste <links> oder <rechts> zum
-ersten Pull-Down-Menu zurück.
- Ähnlich wie in der Kopfzeile, können Sie auch inner­
-halb des Pull-Down-Menus zu einem anderen Punkt wech­
-seln. Das geschieht durch die Pfeiltasten <hoch> und
-<runter>. Dabei werden 'Trennlinien' innerhalb des Pull-
-Down-Menus, die nur der Untergliederung dienen, über­
-sprungen. Vom obersten Menupunkt gelangt man direkt
-zum untersten und umgekehrt. Probieren Sie es einmal
-aus.
-
-
-- Informationen zu einem Menupunkt.
-
- Zu jedem Punkt eines Pull-Down-Menus können Sie In­
-formationen abrufen. Das ist ganz einfach, denn Sie
-brauchen sich nur auf den gewünschten Menupunkt zu
-begeben (die Pfeiltasten so betätigen, bis der betreffende
-Menupunkt im Pull-Down-Menu invers dargestellt wird).
-Anschließend betätigen Sie die Fragezeichentaste (<?>).
- Auf dem Bildschirm erscheint ein Kasten in den die
-Informationen zum Menupunkt eingetragen sind. Zwar wird
-dadurch ein Teil des Bildschirms überschrieben, doch kei­
-ne Angst - sobald Sie auf irgendeine Taste tippen, wird
-der alte Bildschirmzustand wieder hergestellt! Ebenso wie
-die Pull-Down-Menus sind diese Informationen normaler­
-weise verborgen. Auf Anforderung werden sie aber sicht­
-bar - ja es wäre gar nicht möglich alle vorhandenen In­
-formationen gleichzeitig auf dem Bildschirm darzustel­
-len. Es wäre auch unsinnig, denn man benötigt diese In­
-formationen zumeist nur, wenn man sich in das Programm
-einarbeitet. Später, wenn Ihnen der Umgang mit dem Pro­
-gramm vertraut ist, sind diese Informationen überflüssig
-und würden, wenn sie immer sichtbar wären, nur stören.
-
-
-- Informationen zur Bedienung des Menus
-
- Alles das, was hier ausführlich beschrieben ist, kön­
-nen Sie auch in Kurzform auf dem Bildschirm erfahren,
-denn auch die Informationen, wie das Menu bedient wird,
-sind jeweils im Menu vorhanden. Möchten Sie diese Infor­
-mationen auf dem Bildschirm sehen, so tippen Sie die
-Tastenfolge <ESC><?>, d.h. erst die Taste 'ESC' und dann die
-Fragezeichentaste. Danach erscheint folgender Kasten
-auf dem Bildschirm:
-
-#on("b")#
- +---------------------------------------+
- | gs-DIALOG |
- | |
- | e ... Erläuterungen (allgemein) |
- | w ... Wahl eines Menupunktes |
- | a ... Aktivieren des Menupunktes |
- | b ... Besondere Tasten / Menuende |
- | |
- | z ... Zurück in das Menu |
- | |
- | e w a b z |
- +---------------------------------------+
-#off("b")#
-
- Wenngleich die Informationen kurz gefaßt sind, so
-haben sie doch nicht alle gleichzeitig auf dem Bildschirm
-Platz. Aus diesem Grunde werden Sie aufgefordert, sich
-weiter zu entscheiden, welche Informationen Sie haben
-möchten. Sie können zwischen mehreren Alternativen wäh­
-len. Die Reihenfolge spielt keine Rolle; Sie können auch
-Informationen mehrmals aufrufen.
- Der Aufruf kann auf zweierlei Weise erfolgen: Entwe­
-der Sie bewegen mit den Pfeiltasten <links> oder <rechts>
-die Markierung in der letzten Zeile des Kastens auf den
-Buchstaben, der vor dem von Ihnen gewünschten Punkt
-steht und tippen anschließend auf die <RETURN>-Taste
-oder Sie tippen direkt die entsprechende Buchstabentaste
-(z.B. <e>). Beide Vorgehensweisen sind zulässig und haben
-die gleiche Wirkung.
- Daraufhin werden die gewünschten Informationen
-sichtbar. Durch Tippen irgendeiner Taste verschwinden
-die Informationen wieder vom Bildschirm und sichtbar
-wird wieder der oben abgebildete 'Verteiler'. Erst wenn
-man den Punkt 'z ... Zurück in das Menu' wählt, verschwin­
-det auch dieser Kasten und man gelangt zurück in das
-Menu.
-
-
-- Aktivierbare und nicht aktivierbare Menupunkte
-
- Wir wollen jetzt endlich unserer Absicht nachgehen,
-eine Datei vom Archiv zu holen. Dazu wechseln wir zuerst
-wieder zum Oberbegriff 'Archiv' in der Kopfzeile. Nach
-kurzer Zeit erscheint das Ihnen schon bekannte Pull-
-Down-Menu. Wenn Sie hier versuchen, die einzelnen Menu­
-punkte innerhalb des Pull-Down-Menus anzusteuern, so
-werden Sie feststellen, daß das nicht möglich ist. Alle
-Menupunkte, die ein Minuszeichen ('-') vor der Bezeichnung
-haben, können nicht angewählt werden. Diese Menupunkte
-sind zur Zeit nicht aktivierbar. Solche Menupunkte kön­
-nen in Menus häufiger auftreten.
- Das kann mehrere Ursachen haben: Einerseits könnte
-auf diese Weise ein Programmierer ein komplettes Menu
-entwerfen, das schon alle Funktionen zeigt, wenn auch die
-zugehörigen Programme dazu noch nicht fertig sind. Das
-ist aber in unserem Falle nicht so. Hier ist die Ursache
-eine andere: Bevor man im EUMEL-System auf das Archiv­
-laufwerk zugreifen kann, muß man es erst für sich re­
-servieren. Dadurch wird sichergestellt, daß nicht gleich­
-zeitig mehrere Benutzer auf eine Archivdiskette zugrei­
-fen und ggf. Dateien unbeabsichtigt zerstören. Erst wenn
-das Laufwerk reserviert worden ist, kann man auf die
-Diskette zugreifen. Das wird im Menu durch die nicht ak­
-tivierbaren Punkte zum Ausdruck gebracht.
-
-
-- Aktivieren von Menupunkten
-
- Wir müssen also zuerst das Archiv reservieren. Auch
-hier gibt es (zumeist) zwei Möglichkeiten, den gewünsch­
-ten Menupunkt zu aktivieren. Entweder Sie sorgen durch
-Bedienung der Pfeiltasten dafür, daß der gewünschte
-Menupunkt invers dargestellt wird und betätigen an­
-schließend die <RETURN>-Taste oder - sofern vor dem Me­
-nupunkt ein einzelner Buchstabe oder eine Ziffer aufge­
-listet ist - tippen Sie einfach auf die zugehörige Buch­
-staben- oder Zifferntaste. Tippen Sie hier die Taste <r>.
- Warten Sie einen Moment, denn es wird überprüft, ob
-das Laufwerk von einer anderen Task benutzt wird. Ist
-dies der Fall, erhalten Sie darüber auf dem Bildschirm
-eine Meldung. Ansonsten wird an Sie die Frage gerichtet,
-ob die Diskette eingelegt ist. Wenn diese Frage erscheint,
-befindet sich das Laufwerk schon "in Ihrem Besitz". Erst
-jetzt ist es sinnvoll, wenn auch andere auf das Laufwerk
-zugreifen können, die Diskette in das Laufwerk zu legen.
-Erst wenn die Frage auf dem Bildschirm erscheint, können
-Sie sicher sein, daß keine andere Task mehr auf das Lauf­
-werk zugreifen kann. Legen Sie also beim Erscheinen der
-Frage eine Ihrer EUMEL-Archivdisketten in das Laufwerk
-und bejahen Sie anschließend die gestellte Frage, indem
-Sie die Taste <j> tippen. (Sie können aber auch - wie schon
-in vorausgehenden Situationen - die Inversdarstellung
-innerhalb des Kastens, in dem die Frage auf dem Bild­
-schirm dargestellt wird, auf das 'Ja' positionieren und
-anschließend die <RETURN>-Taste tippen.)
- #on("b")#gs-DIALOG#off("b")# ermittelt jetzt den Namen der eingelegten
-Diskette und zeigt diesen im Kasten rechts unten auf dem
-Bildschirm an. Außerdem werden die zuvor nicht aktiver­
-baren Punkte aktivierbar gemacht. Das kann man daran
-erkennen, daß auf dem Bildschirm die Minuszeichen vor
-den betreffenden Menupunkten verschwinden (und Buch­
-staben sichtbar werden).
- Lassen Sie sich zunächst ein Inhaltsverzeichnis der
-Diskette anzeigen. Dazu brauchen Sie nur den Menupunkt
-'v Verzeichnis' wählen. Wie das gemacht wird wissen Sie ja
-schon. Sie können dabei beobachten, daß vor dem Menu­
-punkt das bisherige Zeichen verschwindet und ein Stern
-(*) sichtbar wird. Daran kann man erkennen, daß #on("b")#gs-DIALOG#off("b")#
-den Auftrag bereits ausführt.
- Es dauert einen Moment, bis das Verzeichnis erstellt
-ist - anschließend wird es auf dem Bildschirm ausgegeben.
-Paßt das Verzeichnis nicht vollständig auf den Bild­
-schirm, so können Sie sich darin bewegen, blättern etc.,
-wie Sie es aus dem Editor gewohnt sind. Ebenso wird das
-Verzeichnis auch wie der Editor verlassen - durch die
-Tastenfolge <ESC><q> (das wird übrigens auch auf dem
-Bildschirm angezeigt!).
-
-
-- Dateiauswahl
-
- Sie sollen jetzt eine Datei von der Archivdiskette in
-das System holen, d.h. genauer gesagt von der Diskette
-kopieren. Aktivieren Sie also auf gewohnte Weise den
-Menupunkt 'h Holen/Lesen'. Warten Sie anschließend einen
-Moment, denn #on("b")#gs-DIALOG#off("b")# erstellt eine Liste aller vorhan­
-denen Dateien auf der Diskette und bietet Sie Ihnen an­
-schließend so an, daß Sie komfortabel eine Auswahl tref­
-fen können.
- Haben Sie die #on("b")#gs-DIALOG#off("b")#-Archivdiskette eingelegt, so
-zeigt sich etwa der folgende Bildschirm:
-
-
-#on("b")#
-ARCHIV: Dateien Archiv
--------+-------------------------+--------------------------------------
- +--------------------------------------------------------------------+
- | Dateien holen/lesen (Archiv) |
- | |
- | Bitte alle Dateien ankreuzen, die 'geholt' werden sollen! |
- |====================================================================|
- | Auswahl m e h r e r e r Dateien durch Ankreuzen |
- |....................................................................|
- |==> o gs-DIALOG MENUKARTEN MANAGER" |
- | o gs-DIALOG MM/gen |
- | o gs-DIALOG 1 |
- | o gs-DIALOG 2 |
- | o gs-DIALOG 3 |
- | o gs-DIALOG 4 |
- | o gs-DIALOG 5 |
- | o gs-DIALOG 6 |
- | o gs-DIALOG 7 |
- | o gs-MENUKARTE:Archiv |
- |..................................................Weitere Dateien!..|
- +--------------------------------------------------------------------+
---|Info: <?> Fertig: <ESC><q> Abbrechen: <ESC><h> |
-In+--------------------------------------------------------------------+
-#off("b")#
-
-
- Auf dem Archiv sind mehrere Dateien vorhanden. Alle
-werden Ihnen zur Auswahl angeboten. In der obersten
-Zeile wird zur Kontrolle die Funktion angezeigt, die Sie
-gerade gewählt haben. Sie können jetzt die Dateien, auf
-die sich die Operation beziehen sollen, in beliebiger Rei­
-henfolge ankreuzen. Wenn Sie abschließend die Auswahl
-verlassen, werden die Dateien in der Ankreuzreihenfolge
-bearbeitet (hier in die Task geholt).
- Die Handhabung der Dateiauswahl ist ganz einfach. Der
-Pfeil gibt jeweils an, welche Datei aktuell behandelt
-wird. Zunächst wird vor den Namen jeweils nur ein 'o' aus­
-gegeben. Mit den Pfeiltasten <hoch> und <runter> können
-Sie nun mit dem Pfeil vor den Namen fahren, den Sie an­
-kreuzen möchten. Tippen Sie dann die Taste <x> oder
-<RETURN>, so erscheint in der Anzeige ein 'x' vor dem Na­
-men und eine Zahl, die angibt, die wievielte Datei Sie an­
-gekreuzt haben. Haben Sie sich versehen, so können Sie
-das Kreuz auch wieder löschen. Dazu fahren Sie einfach
-erneut vor den betreffenden Namen, wo ja jetzt ein 'x'
-steht, und tippen die Taste <o> (kleines 'o') oder <RUBOUT>.
-Dadurch wird das Kreuz entfernt und gegebenenfalls eine
-Umnumerierung der schon angekreuzten Dateinamen vor­
-genommen. Verlassen Sie jetzt die Auswahl mit der Tasten­
-folge <ESC><q>, so werden die Dateien nacheinander in der
-von Ihnen angekreuzten Reihenfolge in die Task kopiert.
- Neben dieser Auswahl, in der #on("u")#m e h r e r e#off("u")# Dateien an­
-gekreuzt (ausgewählt) werden können, gibt es auch eine
-Auswahl, in der nur jeweils #on("u")#e i n e#off("u")# Datei angekreuzt wer­
-den darf. Das ist durch die entsprechende Beschriftung
-auf dem Bildschirm kenntlich gemacht. In einem solchen
-Fall wird die Auswahl nach Ankreuzen eines Namens #on("u")#auto­
-matisch#off("u")# verlassen, d.h. man braucht nicht <ESC><q> zu tip­
-pen!.
- In einer Dateiauswahl können bis zu 200 Dateien ver­
-waltet werden. Da aber nicht alle Namen gleichzeitig auf
-dem Bildschirm angezeigt werden können, wird jeweils in
-der gepunkteten Zeile angezeigt, ob noch #on("u")#weitere Dateien#off("u")#
-in der Liste vorausgehen oder folgen. In unserem Beispiel
-geht als keine Datei voraus, es folgen aber noch weitere
-Dateien hinter der zuletzt angezeigten Datei.
- Damit Sie noch komfortabler mit dieser Dateiauswahl
-arbeiten können, gibt es weitere Tastenfolgen die nütz­
-lich sein können. Wenn Sie die Fragezeichentaste (<?>) tip­
-pen, werden Sie auf dem Bildschirm angezeigt. Durch Tip­
-pen irgendeiner weiteren Taste können Sie weiterblättern
-bzw. in die Auswahl zurückgelangen. Folgende Tastenkom­
-mandos stehen Ihnen zur Verfügung:
-
-
- Positionierungen:
-
- hoch : zum vorausgehenden Namen
- runter : zum folgenden Namen
- HOP hoch : auf den ersten Namen der Seite
- HOP runter : auf den letzten Namen der Seite
- ESC 1 : auf den ersten Namen der Liste
- ESC 9 : auf den letzten Namen der Liste
-
-
- Auswahl treffen:
-
- RETURN / x : diesen Namen ankreuzen
-(RUBOUT / o : Kreuz vor dem Namen löschen )
-(HOP RETURN/HOP x: alle folgenden Namen ankreuzen)
-(HOP RUBOUT/HOP o: alle folgenden Namen löschen )
-
-
- Auswahl verlassen:
-
- ESC q : Auswahl verlassen
- ESC h : Auswahl abbrechen
-
-
-
- Die in Klammern gesetzten Tastenfunktionen kann man
-nur verwenden, wenn die Auswahl #on("u")#mehrerer#off("u")# Dateien zuge­
-lassen ist.
- Wie Sie sehen, orientiert sich die Bedienung an den
-Tastenfunktionen, die Ihnen schon aus dem Editor be­
-kannt sind. Haben Sie aus Versehen einen Menupunkt ge­
-wählt, so daß Ihnen eine solche Auswahl angeboten wird,
-so können Sie die Auswahl durch <ESC><h> (für 'halt') ab­
-brechen.
-
-
-- Ja/Nein - Fragen
-
- An verschiedenen Stellen werden Fragen an Sie ge­
-richtet, die Sie mit 'ja' oder 'nein' beantworten müssen.
-Tippen Sie dazu entsprechend je nach Entscheidung die
-Taste <j> (für 'ja') bzw. <n> (für 'nein').
-
-
-- Eingaben
-
- An einigen Stellen werden Sie aufgefordert, eine Ein­
-gabe zu machen (z.B. einen Dateinamen einzugeben). Sofern
-möglich wird Ihnen auch ein Vorschlag für die Eingabe
-gemacht (z.B. wenn Sie Dateien kopieren oder umbenennen
-wollen). Wenn Sie den gemachten Vorschlag akzeptieren,
-dann brauchen Sie zur Bestätigung nur die <RETURN>-
-Taste zu tippen.
- Gefällt Ihnen der Vorschlag nicht oder wird Ihnen
-kein Vorschlag gemacht, so machen Sie bitte die ge­
-wünschte Angabe. Zum Schreiben stehen Ihnen alle aus dem
-Editor bekannten Funktionen zur Verfügung. Mit der
-Taste <RUBOUT> können Sie Buchstaben löschen, mit
-<RUBIN> einfügen. Die Eingabe wird durch Tippen der
-<RETURN>-Taste abgeschlossen.
- Ist der von Ihnen gewünschte Name schon in Ihrer Task
-vorhanden und steht in der Fußzeile der Hinweis 'Zeigen:
-<ESC><z>', dann können Sie sich auch alle vorhandenen
-Namen zur Auswahl anbieten lassen und durch Ankreuzen
-den beabsichtigten Namen auswählen.
-
-
-- Alternativen
-
- Ihnen können auch mehrere Alternativen angeboten
-werden, zwischen denen Sie wählen müssen. In der unter­
-sten Zeile eines solchen Kastens, in denen Ihnen die Al­
-ternativen auf dem Bildschirm eingeblendet werden, sind
-die Möglichkeiten aufgeführt, die darüber beschreiben
-sind. Mit den Pfeiltasten können sie die Markierung auf
-die gewünschte Alternative positionieren und dann durch
-die <RETURN>-Taste zur Ausführung bringen. (Manchmal
-ist das auch durch Tippen der den Alternativen vorange­
-stellten Buchstaben oder Ziffern möglich).
-
-
-- Verlassen des Menus
-
- Das Menu kann insgesamt mit der Tastenfolge <ESC><q>
-verlassen werden. Damit das nicht versehentlich ge­
-schieht, wird zur Sicherheit die Frage gestellt, ob Sie das
-Menu tatsächlich verlassen wollen. Verneinen Sie die
-Frage, verbleiben Sie im Menu, ansonsten gelangen Sie
-zurück in die 'gib kommando:' - Ebene.
-
- Mit dieser Beispielsitzung haben Sie jetzt schon fast
-alle Arten des Umgangs mit #on("b")#gs-DIALOG#off("b")# kennengelernt.
-Sicher ist dies beim ersten Mal sehr verwirrend. Mit den
-folgenden vier grundsätzlichen Regeln können Sie
-#on("b")#gs-DIALOG#off("b")# aber immer bedienen:
-
- 1. Achten Sie darauf, welche Tastenkombinationen in
- der Fußzeile angegeben sind. Halten Sie sich daran!
-
- 2. Rufen Sie - sofern vorhanden - die Hilfsfunktio­
- nen mit <?> oder <ESC><?> auf. Damit erhalten Sie
- weitere Informationen.
-
- 3. Funktioniert eine Tastenkombination nicht (geben
- Sie dem Rechner eine kurze Zeit zum Reagieren),
- versuchen Sie die Tastenkombination <ESC><q> (Ver­
- lassen) oder <ESC><h> (Abbruch). Falls sich darauf­
- hin etwas ändert, verfahren Sie wie unter 1).
-
- 4. Erfolgt noch immer keine Reaktion, tippen Sie die
- <SV>-Taste und versuchen Sie das Programm mit
- 'halt' zu stoppen. Führt auch das nicht zum Erfolg,
- hat sich der Rechner "aufgehängt". Wenn Sie keine
- Erfahrungen mit einer solchen Situation haben,
- wenden Sie sich an Ihren Systembetreuer.
-
-
-3.3 Zusammenfassung/Kurzbeschreibung
-
-Menu: Sie können jede (aktive) Funktion inner­
- halb eines Pull-Down-Menus mit den
- Pfeiltasten anwählen und durch Tippen
- der <RETURN>-Taste zur Ausführung
- bringen. (Ersatzweise kann - sofern vor
- dem Menupunkt ein Buchstabe oder eine
- Ziffer angegeben ist - die Funktion
- durch Tippen der entsprechenden Taste
- direkt zur Ausführung gebracht werden.)
- Zu jeder Funktion kann durch Tippen der
- Fragezeichentaste eine Hilfestellung
- angefordert werden. Gibt man die Tasten­
- folge <ESC><?>, so wird die Bedienung des
- Menus auf dem Bildschirm kurz erläutert.
- Mit der Tastenfolge <ESC><q> wird das
- Menu (nach einer Sicherheitsabfrage)
- verlassen.
-
-Dateiauswahl: Hier können Sie die gewünschten Namen
- mit <x> ankreuzen und das Kreuz mit <o>
- wieder entfernen. Die Auswahl - sofern
- mehrere Dateien ausgewählt werden kön­
- nen - wird durch die Tastenfolge
- <ESC><q> verlassen. Alle Möglichkeiten
- der Bedienung werden angezeigt, wenn die
- Fragezeichentaste getippt wird. Die Aus­
- wahl wird abgebrochen (ohne Kreuze!),
- wenn die Tastenfolge <ESC><h> eingege­
- ben wird.
-
-Eingabe: Hier können Sie eine Zeile eingeben oder
- eine Vorgabe ändern (wie im Editor). Ein­
- fügen und Löschen mit RUBIN und RUBOUT.
- Ist in der Fußzeile die Tastenfolge
- '<ESC><z>: Zeigen' angegeben, so können
- Sie darüber auch eine Auswahl anfor­
- dern, in der Sie bereits vorhandene Na­
- men nur anzukreuzen brauchen. Zumeist
- ist auch ein Abbruch der Eingabe durch
- die Tastenfolge <ESC><h> möglich.
-
-Frage: Beantworten Sie die an Sie gerichtete
- Frage mit <j> oder <n>. Sie können auch
- auf dem Bildschirm die Markierung auf
- die gewünschte Antwort setzten und an­
- schließend die <RETURN>-Taste tippen.
-
-Alternativen: Aus den angegebenen Möglichkeiten kön­
- nen Sie eine auswählen, indem Sie entwe­
- der die der Alternative vorangestellte
- Taste tippen oder in der letzten Zeile des
- Kastens die Markierung auf die ge­
- wünschte Kennzeichnung positionieren
- und anschließend die <RETURN>-Taste
- tippen.
-
-Fehler: Die Meldung muß durch Tippen einer be­
- liebigen Taste quittiert werden.
-
-Bitte warten: Der Rechner ist beschäftigt - keine
- Taste tippen!
-
-
diff --git a/doc/dialog/gs-dialog-4 b/doc/dialog/gs-dialog-4
deleted file mode 100644
index 03d8dc4..0000000
--- a/doc/dialog/gs-dialog-4
+++ /dev/null
@@ -1,672 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (30)#
-#headodd#
-#center#gs-DIALOG#right#%
-
-#end#
-#headeven#
-%#center#gs-DIALOG
-
-#end#
-#center#4
-
-#center#Beschreibung der Menufunktionen
-
-
-4.1 Menufunktionen zum Oberbegriff 'Dateien'
-
- In diesem Kapitel werden alle die Menufunktionen be­
-schrieben, die Ihnen unter dem Obergeriff 'Dateien' im
-Menu angeboten werden.
-
-#on("u")##on("b")#v Verzeichnis#off("b")##off("u")#
- Mit dieser Funktion können Sie sich einen Über­
- blick über die in Ihrer Task vorhandenen Dateien ver­
- schaffen.
- Nach Aufruf dieser Funktion wird eine Liste der
- Dateien auf dem Bildschirm ausgegeben, die sich in
- Ihrer Task befinden. Da die Liste selbst eine Datei ist,
- kann sie mit der Tastenkombination <ESC><q> verlassen
- werden - hierauf wird auch in der Kopfzeile der Datei
- hingewiesen. Falls nicht alle Dateien auf den Bild­
- schirm passen, können Sie das Fenster mit <HOP><hoch>
- bzw. <HOP><runter> rollen.
-
-#on("u")##on("b")#l Löschen#off("b")##off("u")#
- Mit dieser Funktion können Sie Dateien, die Sie
- nicht mehr benötigen, die unnötig Platz belegen, lö­
- schen. Aber Vorsicht! Die Dateien verschwinden durch
- diese Funktion unwiederbringlich!
- Zunächst wird der Dateiname der Datei erfragt, die
- gelöscht werden soll. Hier können Sie direkt den be­
- treffenden Namen eingeben und die Eingabe mit
- <RETURN> abschließen. Sie können sich aber auch durch
- die Tastenfolge <ESC><z> (für 'zeigen') alle in der Task
- vorhandenen Dateien zur Auswahl anbieten lassen und
- dort einfach einen Namen ankreuzen.
- Für jede einzelne Datei wird noch einmal zur
- Sicherheit angefragt, ob diese auch tatsächlich ge­
- löscht werden soll. Zur Bestätigung tippen Sie bitte
- die Taste <j> ('ja') - zur Verhinderung die Taste <n>
- ('nein').
-
- Fehlerfälle:
- - Eine Datei mit dem angegebenen Namen existiert
- nicht.
-
-#on("u")##on("b")#d Drucken#off("b")##off("u")#
- Mit dieser Funktion können Sie Dateien über einen
- angeschlossenen Drucker ausdrucken lassen.
- Zunächst wird der Dateiname der Datei erfragt, die
- gedruckt werden soll. Hier können Sie direkt den be­
- treffenden Namen eingeben und die Eingabe mit
- <RETURN> abschließen. Sie können sich aber auch durch
- die Tastenfolge <ESC><z> (für 'zeigen') alle in der Task
- vorhandenen Dateien zur Auswahl anbieten lassen und
- dort einfach einen Namen ankreuzen.
- Die Datei(en) wird/werden anschließend zum Drucker
- geschickt. Der Vorgang wird auf dem Bildschirm proto­
- kolliert.
-
- Fehlerfälle:
- - Eine Datei mit dem angegebenen Namen existiert
- nicht.
- - Die Druckdatei hat einen falschen Typ zum Drucken
- (ist nicht editierbar).
- - Der Drucker ist nicht funktionsbereit.
- - Der Drucker wird nicht über die Task 'PRINTER' be­
- trieben.
- - Auf Ihrem System werden die Druckkosten abge­
- rechnet. Sie müssen sich mit einer Codenummer
- identifizieren.
-
-#on("u")##on("b")#k Kopieren#off("b")##off("u")#
- Mit dieser Funktion können Sie sich eine (logische)
- Kopie einer bereits im System vorhandenen Datei anle­
- gen. Das ist z.B. dann sinnvoll, wenn Sie sich einen
- bestimmten Stand einer Datei aufbewahren wollen.
- Zunächst wird der Dateiname der Datei erfragt, die
- kopiert werden soll. Hier können Sie direkt den be­
- treffenden Namen eingeben und die Eingabe mit
- <RETURN> abschließen. Sie können sich aber auch durch
- die Tastenfolge <ESC><z> (für 'zeigen') alle in der Task
- vorhandenen Dateien zur Auswahl anbieten lassen und
- dort einfach einen Namen ankreuzen.
- Anschließend wird dieser Name angezeigt und der
- Name für die Kopie erfragt. Es muß ein Name eingetra­
- gen werden, der in dieser Task noch nicht für eine
- Datei vergeben wurde; ansonsten erfolgt ein Hinweis
- darauf und es wird nicht kopiert!
- Da man aber oft für die Kopie einen ähnlichen Na­
- men wie für das Original wählt, wird der 'alte' Name
- vorgeschlagen. Aus genannten Gründen muß er aber
- verändert werden. Sie können diesen Namen mit den
- üblichen Editierfunktionen verändern oder mit
- <HOP><RUBOUT> löschen und ganz neu eingeben. Auf
- diese Weise sparen Sie aber eine Menge Tipparbeit,
- wenn Sie einen langen Namen nur an einer Stelle än­
- dern wollen.
-
- Fehlerfälle:
- - Eine Datei mit dem angegebenen Namen existiert
- nicht.
- - Eine Datei mit dem gewünschten Namen existiert
- bereits in der Task.
-
-#on("u")##on("b")#u Umbenennen#off("b")##off("u")#
- Mit dieser Funktion können Sie einer bereits vor­
- handenen Datei einen neuen Namen geben.
- Zunächst wird der Dateiname der Datei erfragt, die
- umbenannt werden soll. Hier können Sie direkt den
- betreffenden Namen eingeben und die Eingabe mit
- <RETURN> abschließen. Sie können sich aber auch durch
- die Tastenfolge <ESC><z> (für 'zeigen') alle in der Task
- vorhandenen Dateien zur Auswahl anbieten lassen und
- dort einfach einen Namen ankreuzen.
- Anschließend wird dieser Name angezeigt und der
- zukünftige Name für die Datei erfragt. Es muß ein
- Name eingetragen werden, der in dieser Task noch
- nicht für eine Datei vergeben wurde; ansonsten er­
- folgt ein Hinweis darauf und die Datei wird nicht
- umbenannt!
- Da man aber oft den 'neuen' Namen in Anlehnung an
- den 'alten' Namen wählt, wird der 'alte' Name vorge­
- schlagen. Aus genannten Gründen muß er aber verän­
- dert werden. Sie können diesen Namen mit den üblichen
- Editierfunktionen verändern oder mit <HOP><RUBOUT>
- löschen und ganz neu eingeben. Auf diese Weise sparen
- Sie aber eine Menge Tipparbeit, wenn Sie einen langen
- Namen nur an einer Stelle ändern wollen.
-
- Fehlerfälle:
- - Eine Datei mit dem angegebenen Namen existiert
- nicht.
- - Eine Datei mit dem gewünschten Namen existiert
- bereits in der Task.
-
-#on("u")##on("b")#s Speicherplatz#off("b")##off("u")#
- Mit dieser Funktionen können Sie sich zu Ihrer
- Information den Speicherbedarf anzeigen lassen, den
- eine Datei auf dem Speichermedium einnimmt.
- Zunächst wird der Dateiname der Datei erfragt,
- deren Speicherplatz ermittelt werden soll. Hier kön­
- nen Sie direkt den betreffenden Namen eingeben und
- die Eingabe mit <RETURN> abschließen. Sie können sich
- aber auch durch die Tastenfolge <ESC><z> (für 'zeigen')
- alle in der Task vorhandenen Dateien zur Auswahl
- anbieten lassen und dort einfach einen Namen ankreu­
- zen.
- Anschließend wird der belegte Speicherplatz der
- ausgewählten Datei(en) auf dem Bildschirm angezeigt.
- Die Größe wird in KB (Kilobyte) angegeben. Ein KB ent­
- spricht etwa 1000 Zeichen, also einer halb vollge­
- schriebenen Bildschirmseite.
-
- Fehlerfälle:
- - Eine Datei mit dem angegebenen Namen existiert
- nicht.
-
-#on("u")##on("b")#a Aufräumen#off("b")##off("u")#
- Wenn in einer Datei viel geändert wurde, wird der
- Platzbedarf dieser Datei erheblich vergrößert ("Text­
- leichen"). Dies tritt vor allem dann auf, wenn sehr
- häufig eingefügt wurde. Da der Platzbedarf der Datei
- zunimmt, sind mehr Speicherzugriffe notwendig, als es
- dem Inhalt entspricht. Zudem führt die interne Orga­
- nisation einer solchen Datei zu Einbußen bei der Bear­
- beitungsgeschwindigkeit.
- Mit dieser Funktion wird die Datei in eine "fri­
- sche" Datei gewandelt. Diesen Vorgang nennt man 'Re­
- organisieren' (Aufräumen). Anschließend belegt die
- Datei zumeist (erheblich) weniger Speicherplatz als
- zuvor.
- Diese Funktion ist allerdings nur mit einer Ein­
- schränkung nutzbar. Sie läßt sich nur auf Textdateien
- anwenden, nicht auf andere Dateitypen. Das System
- nimmt aber die Unterscheidung in Dateitypen automa­
- tisch vor - allerdings kann es vorkommen, daß Sie den
- Hinweis erhalten: "... kann nicht aufgeräumt werden!".
- Zunächst wird der Dateiname der Datei erfragt, die
- aufgeräumt (reorganisiert werden soll. Hier können
- Sie direkt den betreffenden Namen eingeben und die
- Eingabe mit <RETURN> abschließen. Sie können sich
- aber auch durch die Tastenfolge <ESC><z> (für 'zeigen')
- alle in der Task vorhandenen Dateien zur Auswahl
- anbieten lassen und dort einfach einen Namen ankreu­
- zen.
- Anschließend wird/werden die ausgewählte(n) Da­
- tei(en) aufgeräumt (reorganisert). #on("u")#Achtung! Die Funk­
- tion ist zeitaufwendig!#off("u")#
-
- Fehlerfälle:
- - Eine Datei mit dem angegebenen Namen existiert
- nicht.
-#page#
-4.2 Menufunktionen zum Oberbegriff 'Archiv'
-
- In diesem Kapitel werden alle die Menufunktionen be­
-schrieben, die Ihnen unter dem Oberbegriff 'Archiv' im
-Menu angeboten werden. Mit den Funktionen in diesem
-Menu können Sie aber nicht nur Dateien auf dem Archiv
-behandeln, sondern auch in anderen Tasks im Multi-
-User-System oder über das EUMEL-Netz sogar auf anderen
-Rechnern!
- Wenn Sie das Pull-Down-Menu (siehe Seite 12) gerade
-aufgeschlagen haben, sind nicht alle Funktionen akti­
-vierbar! Um weitere Funktionen zu aktivieren, muß erst
-einer der aktivierbaren Menupunkte ausgeführt werden.
-
-#on("u")##on("b")#r Reservieren#off("b")##off("u")# (des Archivlaufwerks)
- Im EUMEL-Multi-User-System haben normalerweise
- mehrere Personen das Zugriffsrecht auf das Archiv­
- laufwerk. Allerdings muß der Zugriff so geregelt wer­
- den, daß sich die Beteiligten dabei nicht gegenseitig
- "in die Quere kommen". Ein Zugriff auf das Archiv­
- laufwerk erfordert zunächst eine Anmeldung. Ist diese
- Anmeldung erfolgt, kann von den anderen Beteiligten
- nicht mehr auf das Laufwerk zugegriffen werden - bis
- es wieder freigegeben worden ist.
- Diese Anmeldung des Archivlaufwerkes erfolgt
- über die Menufunktion 'r Reservieren'. Greift bereits
- eine andere Task auf das Laufwerk zu, so erhalten Sie
- darüber einen Hinweis auf dem Bildschirm. Ansonsten
- wird an Sie die Frage gestellt, ob die Diskette einge­
- legt und das Laufwerk geschlossen ist.
- Erst zu diesem Zeitpunkt ist sichergestellt, daß Sie
- den alleinigen Zugriff auf das Laufwerk haben. Des­
- halb sollten Sie, wenn Sie mit mehreren Personen am
- Computer arbeiten, erst zum Zeitpunkt der Fragestel­
- lung die Diskette ins Laufwerk einlegen.
- Nachdem Sie die Diskette eingelegt und die Frage
- bejaht haben, ermittelt das System selbständig den
- Namen der eingelegten Diskette, zeigt den Namen auf
- dem Bildschirm (im kleinen Kasten rechts unten) an und
- aktiviert die anderen Menupunkte des Pull-Down-
- Menus.
- #on("u")#Beim Verlassen des Pull-Down-Menus, wenn eine
- andere Zieltask eingestellt wird oder wenn das Menu
- gänzlich verlassen wird, wird die Reservierung auto­
- matisch aufgehoben!#off("u")#
-
- Fehlerfälle:
- - Das Laufwerk ist von einer anderen Task belegt.
- - Die Diskette ist falsch eingelegt oder das Lauf­
- werk ist nicht richtig geschlossen.
- - Die Diskette ist nicht formatiert bzw. initiali­
- siert.
- - Die Diskette kann nicht gelesen werden (keine
- EUMEL-Diskette, Diskette hat ein falsches Format,
- Diskette ist verschmutzt...).
-
-#on("u")##on("b")#n Neue Diskette#off("b")##off("u")# (anmelden)
- Der Dateiaustausch mit einer Diskette ist nur dann
- möglich, wenn der im System eingestellte Diskettenna­
- me (auf dem Bildschirm im kleinen Kasten unten rechts
- sichtbar) mit dem tatsächlichen Namen der Diskette
- übereinstimmt. Nach einem Diskettenwechsel ist das
- aber in der Regel nicht mehr der Fall. Greift man dann
- auf die neu eingelegte Diskette zu, so erscheint die
- Fehlermeldung: 'Falscher Archivname! Bitte neue Dis­
- kette anmelden!'.
- Das Anmelden einer neuen Diskette - ohne einen
- neuen Reserviervorgang - wird durch diese Menufunk­
- tion ermöglicht. Nach Aktivieren dieses Menupunktes
- wird der Name der eingelegten Diskette ermittelt, im
- System eingestellt und auf dem Bildschirm angezeigt.
- Im Gegensatz zur Menufunktion 'r Reservieren'
- greift #on("b")#gs-DIALOG#off("b")# ohne Anfrage an den Benutzer auf
- das Archivlaufwerk zu (die Reservierung bleibt ja
- bestehen). Ist das Archivlaufwerk reserviert, so ist
- die Neuanmeldung einer Diskette über diese Menufunk­
- tion weniger zeitaufwendig.
-
- Fehlerfälle:
- - wie unter 'r Reservieren'
-
-#on("u")##on("b")#s Schreiben#off("b")##off("u")# (Kopieren)
- Alle Dateien der eigenen Task werden zur Auswahl
- angeboten. Wenn Sie die Auswahl durch die Tastenfolge
- <ESC><q> verlassen, überprüft #on("b")#gs-DIALOG#off("b")# zunächst, ob
- die Dateien in der eingestellten Zietask schon vor­
- handen sind. Ist das der Fall, erfragt #on("b")#gs-DIALOG#off("b")#, ob
- die dort vorhandenen Dateien überschrieben, d.h. ge­
- löscht werden dürfen (s.u.). Anschließend werden alle
- angekreuzten Dateien in der Reihenfolge, in der Sie
- sie angekreuzt haben, in die eingestellte Zieltask
- kopiert. Der Vorgang wird auf dem Bildschirm proto­
- kolliert. Die Originaldateien in der eigenen Task
- bleiben dabei erhalten.
- Wenn in der Zieltask schon eine Datei existiert, die
- den gleichen Namen hat wie eine Datei, die Sie dorthin
- kopieren möchten, so wird angefragt, ob die vorher
- schon existierende Datei überschrieben (gelöscht!)
- werden soll. Bejahen Sie diese Frage, so wird die be­
- reits in der Zieltask existierende Datei (unwieder­
- bringlich) gelöscht und die gewünschte Datei dorthin
- transportiert. Ein Ãœberschreiben aus Versehen ist
- nicht möglich, wenn Sie die an Sie gestellte Frage
- sorgfältig beantworten.
- Verneinen Sie die Frage, so wird die Datei auch
- nicht hinübertransportiert! Sie können die Datei aber
- umbenennen (Menufunktion 'u Umbenennen' unter dem
- Oberbegriff 'Dateien') und anschließend mit anderem
- Namen hinüberschreiben.
- Beachten Sie, daß beim Überschreiben einer Datei
- auf einer Archivdiskette der Speicherplatz der alten
- (überschriebenen) Version im allgemeinen nicht wie­
- derverwendet werden kann. In einem solchen Fall
- könnte die Diskette voll geschrieben werden, obwohl
- eigentlich genügend Platz vorhanden wäre. Zur Opti­
- mierung überprüft #on("b")#gs-DIALOG#off("b")# deshalb zuerst, ob die
- angekreuzten Dateien schon in der Zieltask vorhanden
- sind und löscht diese, wenn Sie Ihr Einverständnis
- geben. Erst anschließend werden die Dateien insgesamt
- kopiert.
- Normalerweise ist als Zieltask das Archivlaufwerk
- der eigenen Station eingestellt. Mit der Menufunktion
- 'z Zieltask einstellen' kann diese Einstellung aber
- verändert werden.
-
- Fehlerfälle:
- - Die Diskette ist falsch eingelegt oder beschädigt.
- - Die Diskette kann nicht beschrieben werden
- (Schreibfehler)
- - Die Diskette ist voll.
- - Sehen Sie auch unter 'r Reservieren'
- 'z Zieltask einstellen'
-
-#on("u")##on("b")#c Checken#off("b")##off("u")#
- Diese Menufunktion kann nur ausgeführt werden,
- wenn der Dateiaustausch mit einem Archiv(manager)
- erfolgt - ansonsten ist diese Menufunktion auch
- nicht aktivierbar. Die Menufunktion dient dazu, auf
- Diskette geschriebene Dateien auf Lesefehler hin zu
- prüfen. Es empfiehlt sich, diese Prüfroutine auf neu
- auf die Diskette geschriebene Dateien anzuwenden.
- Sehen Sie dazu auch 'k Kombination'
- Alle Dateien der eingestellten Zieltask (Archiv)
- werden zur Auswahl angeboten. Wenn Sie die Auswahl
- durch die Tastenfolge <ESC><q> verlassen, werden alle
- angekreuzten Dateien in der Reihenfolge, in der Sie
- sie angekreuzt haben, "gecheckt", d.h. auf Lesefehler
- hin überprüft. Der Vorgang wird auf dem Bildschirm
- protokolliert.
-
- Fehlerfälle:
- - Lesefehler auf dem Archiv
- - Sehen Sie auch unter 'r Reservieren'
-
-#on("u")##on("b")#k Kombination#off("b")##off("u")#
- Diese Menufunktion ist eine Kombination aus den
- beiden Menufunktionen 's Schreiben' und 'c Checken'
- (Sehen Sie weitere Informationen auch dort!).
- Alle Dateien der eigenen Task werden zur Auswahl
- angeboten. Wenn Sie die Auswahl durch die Tastenfolge
- <ESC><q> verlassen, werden alle angekreuzten Dateien
- in der Reihenfolge, in der Sie sie angekreuzt haben,
- in die eingestellte Zieltask kopiert (gegebenenfalls
- müssen bereits vorhandene Dateien gleichen Namens in
- der Zieltask gelöscht werden). Anschließend werden
- alle Dateien, die gerade geschrieben wurden, gecheckt,
- d.h. auf Lesefehler hin untersucht. Beide Vorgänge
- werden auf dem Bildschirm protokolliert.
- Da die 'Check' - Operation nur bei Archivmanagern
- zulässig ist, ist diese Menufunktion ebenfalls nur bei
- Archivmanagern aktivierbar. Zur Erläuterung sehen
- Sie bitte auch unter 'z Zieltask einstellen'.
-
-#on("u")##on("b")#h Holen/Lesen#off("b")##off("u")#
- Die Menufunktion dient dazu, Dateien, die bereits
- auf einer Archivdiskette oder in einer anderen Task
- existieren, in die eigene Task zu kopieren.
- Alle Dateien der eingestellten Zieltask werden zur
- Auswahl angeboten. Anschließend werden Kopien der
- angekreuzten Dateien in der Reihenfolge des Ankreu­
- zens in die eigene Task geholt. Das Original in der
- Zieltask bleibt dabei unverändert! Der Vorgang wird
- auf dem Bildschirm protokolliert.
- Sind in der eigenen Task schon Dateien mit glei­
- chem Namen vorhanden, so wird gefragt, ob die 'alten'
- Dateien überschrieben (gelöscht) werden dürfen. Nur
- wenn Sie zustimmen, werden die in Ihrer Task existie­
- renden Dateien (unwiederbringlich!) gelöscht und Ko­
- pien der gleichnamigen Dateien aus der Zieltask ange­
- fertigt.
- Stimmen Sie dem Löschvorgang nicht zu, dann blei­
- ben die bisherigen Dateien in Ihrer Task erhalten -
- die Dateien aus der Zieltask werden dann aber auch
- nicht in Ihre Task kopiert! Um dennoch die Kopien zu
- erhalten, können Sie die namensgleichen Dateien in
- Ihrer Task umbenennen und dann erst die Dateien aus
- der anderen Task anfordern.
- Normalerweise werden die Dateien vom Archiv der
- eigenen Station geholt. Mit dem Menupunkt 'z Zieltask
- einstellen' kann diese Einstellung verändert werden.
-
- Fehlerfälle:
- - Lesefehler auf dem Archiv
- - Sehen Sie auch unter 'r Reservieren'
- 's Schreiben'
- 'z Zieltask einstellen'
-
-#on("u")##on("b")#l Löschen#off("b")##off("u")#
- Die Menufunktion dient dazu, Dateien in der Ziel­
- task (unwiederbringlich!) zu löschen. Dazu werden alle
- Dateien der eingestellten Zieltask zur Auswahl ange­
- boten. Anschließend werden die angekreuzten Dateien
- in der Reihenfolge ihres Ankreuzens gelöscht. Zur
- Sicherheit muß noch einmal für jede einzelne Datei
- bestätigt werden, daß sie auch tatsächlich gelöscht
- werden soll.
- Beachten Sie, daß beim Löschen einer Datei auf ei­
- ner Archivdiskette der Speicherplatz im allgemeinen
- nicht wieder verwendet werden kann. In einem solchen
- Fall könnte die Diskette voll geschrieben werden,
- obwohl eigentlich genügend Platz vorhanden wäre.
- Diese Probleme treten bei anderen Tasks, die keine
- Archivmanager sind, nicht auf, da deren Speicherplatz
- intelligenter verwaltet wird.
- Normalerweise ist als Zieltask das Archiv der eige­
- nen Station eingestellt. Mit dem Menupunkt 'z Zieltask
- einstellen' kann diese Einstellung verändert werden.
-
- Fehlerfälle:
- - Sehen Sie auch unter 'r Reservieren'
- 's Schreiben'
- 'z Zieltask einstellen'
-
-#on("u")##on("b")#v Verzeichnis#off("b")##off("u")#
- Mit dieser Menufunktion können Sie sich einen
- Überblick über die in der Zieltask (z.B. auf dem Archiv)
- vorhandenen Dateien verschaffen.
- Nach Aufruf der Funktion wird eine Liste der Da­
- teien auf dem Bildschirm ausgegeben, die sich in der
- Zieltask (z.B. auf dem Archiv) befinden. Ist die Zieltask
- ein Archiv(manager), so wird auch angezeigt, wieviel
- Platz auf der Diskette belegt ist. Da die Liste selbst
- eine Datei ist, kann sie mit der Tastenkombination
- <ESC><q> verlassen werden. Falls nicht alle Dateinamen
- auf den Bildschirm passen, können Sie das Fenster mit
- <HOP><hoch> und <HOP><runter> rollen.
-
- Fehlerfälle:
- - Sehen Sie unter 'z Zieltask einstellen'
-
-#on("u")##on("b")#d Drucken#off("b")##off("u")#
- Das Verzeichnis der Dateien in der Zieltask, das
- man mit der Menufunktion 'v Verzeichnis' auf dem Bild­
- schirm angezeigt bekommt, kann mit dieser Menufunk­
- tion ausgedruckt werden.
- Zur Sicherheit fragt #on("b")#gs-DIALOG#off("b")# an, ob wirklich ein
- solches Dateiverzeichnis der Zieltask gedruckt werden
- soll. Bejaht man die Frage, so wird ein Dateiverzeich­
- nis erstellt und zum Drucker geschickt.
-
- Fehlerfälle:
- - Der Drucker ist nicht funktionsbereit.
- - Der Drucker wird nicht über die Task 'PRINTER' be­
- trieben.
- - Auf Ihrem System werden die Druckkosten abge­
- rechnet. Sie müssen sich mit einer Codenummer
- identifizieren.
-
-#on("u")##on("b")#i Initialisieren#off("b")##off("u")#
- Diese Menufunktion gestattet es, frische Disketten
- zu formatieren, zu initialisieren bzw. beschriebene
- Disketten vollständig zu löschen und ggf. dabei umzu­
- benennen. Bei Aufruf dieser Menufunktion wird - so­
- fern noch nicht geschehen - das Archivlaufwerk auto­
- matisch reserviert.
- Wenn Sie eine fabrikneue Diskette aus der Verpak­
- kung nehmen, müssen Sie diese zunächst #on("u")#formatieren#off("u")#.
- Dabei wird die Diskette auf ein festgelegtes physika­
- lisches Format eingestellt. Ohne daß diese Operation
- vorausgegangen ist, kann eine Diskette weder be­
- schrieben noch gelesen werden.
- Prinzipiell braucht eine Diskette nur ein einziges
- Mal formatiert zu werden. Sie können Sie jedoch jeder­
- zeit wieder formatieren - z.B. wenn Sie Disketten ha­
- ben, von denen Sie nicht genau wissen, für welche
- Zwecke sie zuvor verwendet wurden.
- Wenn Sie diese Menufunktion aktivieren, werden Sie
- zunächst gefragt, ob Sie die Diskette auch formatie­
- ren wollen. Bejahen Sie die Frage, so werden Ihnen
- mehrere Formate zur Auswahl angeboten:
-
-#on ("b")#
- +------------------------------------+
- | Formatieren einer Diskette |
- | |
- | Dies sind die möglichen Formate: |
- | |
- | 1 ..... 40 Spur - 360 KB |
- | 2 ..... 80 Spur - 720 KB |
- | 3 ..... 5 1/4" - 1,2 MB |
- | 4 ..... 3 1/2" - 1,4 MB |
- | s ..... Standard - Format |
- | |
- | 1 2 3 4 s |
- +------------------------------------+
-#off("b")#
-
- Erkundigen Sie sich bei Ihrem Händler, welches
- Format Sie bei Ihrem Rechner und den von Ihnen ver­
- wendeten Disketten einstellen müssen. Manche Rechner
- unterstützen diese Operation innerhalb des EUMEL-
- Systems auch gar nicht, das Formatieren muß dann ir­
- gendwie anders außerhalb des EUMEL-Systems gesche­
- hen.
- Wenn Sie die Formatierung abgeschlossen oder auch
- übersprungen haben, beginnt die eigentliche Initiali­
- sierung der Diskette. Dabei wird als erstes der Ar­
- chivname auf die Diskette geschrieben. Alle alten Da­
- ten, die sich ggf. auf der Diskette befinden, werden
- auch bei diesem Vorgang unwiederbringlich (!) ge­
- löscht.
- Zur Sicherheit überprüft #on("b")#gs-DIALOG#off("b")# in jedem Falle,
- ob es sich um eine EUMEL - Diskette handelt, und er­
- fragt Ihr Einverständnis, ob die Diskette wirklich
- initialisiert werden soll. Geben Sie hierzu Ihr Ein­
- verständnis, dann erfragt #on("b")#gs-DIALOG#off("b")# noch den (neuen)
- Archivnamen. Hatte die Diskette schon einen Namen,
- dann wird dieser zum Ãœberschreiben angeboten. Wollen
- Sie den alten Archivnamen beibehalten, so brauchen
- Sie nur die <RETURN>-Taste zu tippen, ansonsten kön­
- nen Sie den Namen auch zuvor verändern oder einen
- ganz neuen Namen hinschreiben. Anhand des ausgege­
- benen Namens können Sie auch überprüfen, ob Sie die
- richtige Diskette eingelegt haben.
- Das Initialisieren funktioniert natürlich nur,
- wenn Sie als Zieltask einen Archivmanager eingestellt
- haben - ansonsten ist diese Menufunktion gesperrt
- (nicht aktivierbar!).
-
- Fehlerfälle:
- - Formatieren ist nicht auf dem System möglich
- - Sehen Sie auch unter 'r Reservieren'
- 'z Zieltask einstellen'
-
-#on("u")##on("b")#z Zieltask einstellen#off("b")##off("u")#
- Mit dieser Menufunktion können Sie festlegen, mit
- welcher Zieltask Sie kommunizieren, d.h. z.B. Dateien
- austauschen möchten. Normalerweise ist hier das Archiv
- am eigenen Rechner eingestellt. Das wird auch nach
- Aufklappen des Pull-Down-Menus im Kasten rechts
- unten angezeigt.
- Sie können aber auch eine andere Task einstellen
- (z.B. die Vatertask oder die Task 'PUBLIC'), um mit diesen
- Dateien auszutauschen oder um sich auch nur einen
- Überblick über die dort vorhandenen Dateien zu ver­
- schaffen. Wenn Sie mit Ihrem Rechner in ein EUMEL-Netz
- integriert sind, können Sie auch auf Tasks anderer
- Rechner zugreifen oder auch Disketten von Laufwerken
- anderer Rechner einlesen (z.B. wenn Sie Disketten ande­
- rer Formate haben, die von Ihrem Rechner nicht gelesen
- werden können).
- Dabei werden zwei Anforderungen an die Zieltask
- gestellt: Sie muß existieren und bereit für den Datei­
- austausch sein, d.h es muß eine Managertask sein, auf
- die Sie Zugriff haben. Versuchen Sie auf andere Tasks
- zuzugreifen, so erhalten Sie entsprechende (Fehler-)­
- Meldungen.
- Zu beachten ist noch, daß es im EUMEL-System ver­
- schiedene Arten von Managertasks gibt - Archivmana­
- ger und normale Dateimanager. Der Unterschied besteht
- darin, daß ein Archivmanager vom Benutzer vor dem
- Zugriff reserviert werden muß - anschließend hat nur
- dieser Benutzer (bis zur Aufgabe der Reservierung) ein
- Zugriffsrechts auf den Manager. Normale Dateimanager
- können dagegen von mehreren Benutzern in beliebiger
- Reihenfolge angesprochen werden.
- Ein Archivmanager kann auch auf bestimmte Disket­
- tenformate spezialisert sein (z.B. auf das Lesen von
- DOS-Disketten). Manche Rechner haben auch mehrere
- Archivmanager für verschiedene Laufwerke etc. Durch
- Einstellen unterschiedlicher Archivmanager können
- Sie dann auf verschiedenen Laufwerken archivieren.
- Nach Aktivieren dieses Menupunktes werden Ihnen
- die folgenden Alternativen angeboten:
-
-#on ("b")#
- +-------------------------------------------+
- | Dateiaustausch gewünscht mit: |
- | |
- | a ... Archiv (Eigene Station) |
- | |
- | v ... Vatertask |
- | |
- | p ... 'PUBLIC' (Eigene Station) |
- | |
- | s ... Sonstige Task |
- | |
- | |
- | Archiv Vatertask PUBLIC Sonstige |
- +-------------------------------------------+
-#off("b")#
-
- Da der Dateiaustausch mit dem Standardarchiv der
- eigenen Station (Task: 'ARCHIVE'), mit der Vatertask
- und der Task 'PUBLIC' recht häufig in Anspruch genom­
- men wird, sind diese drei Optionen unter den Alterna­
- tiven direkt angegeben. Entscheiden Sie sich für eine
- dieser drei Tasks, so nimmt #on("b")#gs-DIALOG#off("b")# alle notwendi­
- gen Einstellungen vor. Möchten Sie dagegen in Kon­
- takt mit einer anderen Task treten, so wählen Sie die
- Alternative 's ... Sonstige Task'.
-
- In diesem Falle haben Sie noch 3 Angaben zu machen:
-
- - Zunächst werden Sie nach dem Namen der Zieltask
- gefragt. Geben Sie den Namen der Zieltask - ohne
- Anführungsstriche (!) - ein und schließen Sie die
- Eingabe mit der <RETURN>-Taste ab. (Den ausgegebe­
- nen Namen der z.Z. eingestellten Task können Sie
- dabei verändern bzw. überschreiben.)
- - Dann wird die Nummer der Station im EUMEL-Netz
- erfragt, auf der sich die Zieltask befindet. Die
- Nummer Ihrer Station wird als Vorschlag ausgege­
- ben. Wollen Sie mit einer Task auf Ihrem Rechner
- kommunizieren, so brauchen Sie diesen Vorschlag
- nur durch Drücken der <RETURN>-Taste zu bestäti­
- gen; ansonsten tragen Sie zuvor die entsprechende
- Stationsnummer ein. Ist Ihr Rechner nicht in ein
- EUMEL-Netz integriert, so wird die Stationsnummer
- 0 (Null) ausgegeben. Bitte bestätigen Sie diese Sta­
- tionsnummer durch Tippen der <RETURN>-Taste.
- - Zum Abschluß müssen Sie noch angeben, ob die ein­
- gestellte Zieltask ein Archivmanager ist oder
- nicht.
-
- #on("b")#gs-DIALOG#off("b")# versucht dann den Kontakt herzustellen.
- Je nachdem, welche Einstellung Sie vorgenommen ha­
- ben, sind bestimmte Funktionen innerhalb des Menus
- nicht aktivierbar. #on("b")#gs-DIALOG#off("b")# läßt nur die Funktionen
- zu, die aufgrund Ihrer Einstellungen zulässig sind.
- Im Kasten rechts unten auf dem Bildschirm wird
- jeweils angezeigt, welche Zieltask eingestellt ist.
- Erscheint in diesem Kasten auch ein Hinweis auf den
- Archivnamen, so haben Sie einen Archivmanager einge­
- stellt. Ist dagegen vor dem Namen der Zieltask noch
- eine Zahl und ein Schrägstrich angegeben, so haben
- Sie eine Zieltask auf einem anderen Rechner einge­
- stellt.
- Bedenken Sie, daß Operationen mit Tasks auf ande­
- ren Stationen länger andauern können - werden Sie
- nicht ungeduldig!
- Sie können die Einstellung der Zieltask jederzeit
- wieder verändern!
-
- Fehlerfälle:
- - Die eingestellte Zieltask existiert nicht.
- - Die eingestellte Zieltask existiert zwar, ist aber
- nicht empfangsbereit, d.h. ein Zugriff von Ihrer
- Task aus ist nicht möglich!
- - Das Netz ist nicht funktionsbereit (Collector-Task
- fehlt).
- - Die Kommunikation war nicht erfolgreich.
- - Die gewünschte Operation kann mit der eingestell­
- ten Zieltask nicht ausgeführt werden (Zieltask ist
- z.B. gar kein Archivmanager - Sie aber versuchen,
- das Laufwerk zu reservieren)
-
diff --git a/doc/dialog/gs-dialog-5 b/doc/dialog/gs-dialog-5
deleted file mode 100644
index f2b17cf..0000000
--- a/doc/dialog/gs-dialog-5
+++ /dev/null
@@ -1,176 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (49)#
-#headodd#
-#center#gs-DIALOG#right#%
-
-#end#
-#headeven#
-%#center#gs-DIALOG
-
-#end#
-#center#5
-
-#center#Informationen für Lehrer/Programmierer
-
-
-5.1 "Verschlüsselung" der Dateien auf der Diskette
-
- Wenn Sie sich die Inhalte der Dateien angesehen haben,
-in denen die Programme für #on("b")#gs-DIALOG#off("b")# enthalten sind,
-werden Sie festgestellt haben, daß der Code dicht gepackt
-ist. Das war notwendig, um die gesamten Programme auf
-einer Diskette unterzubringen.
- Allerdings ist der Code #on("u")#nicht#off("u")# verschlüsselt - nur
-dichter gepackt. Auf der gelieferten Diskette befindet
-sich eine Datei mit Namen "gs-DIALOG decompress". In die­
-ser Datei ist das (einfache) Komprimier- und Dekompri­
-mierprogramm enthalten. Insertieren Sie dieses Programm
-in einer Task. Anschließend stehen Ihnen zwei Befehle zur
-Verfügung:
-
-PROC komprimiere (TEXT CONST dateiname):
- Die angegebene Datei wird komprimiert; die Datei steht
- anschließend unter gleichem Namen zur Verfügung.
-
-PROC dekomprimiere (TEXT CONST dateiname):
- Eine zuvor mit 'komprimiere' bearbeitete Datei wird -
- bis auf die Leerzeilen - in den Ursprungszustand über­
- führt. Die Datei steht anschließend wieder unter glei­
- chem Namen zur Verfügung.
-
- Dieser 'Service' ist vornehmlich für Lehrer gedacht.
-So können Programmteile im Unterricht Gegenstand von
-Betrachtungen sein; Schüler können nach optimaleren
-Algorithmen für Teillösungen suchen - ggf. Anregungen
-geben. Sinnvoll ist es, das eigentliche Programm nicht zu
-verändern, um die Lauffähigkeit der unter #on("b")#gs-DIALOG#off("b")#
-entwickelten Software nicht zu gefährden.
-
-
-5.2 Nutzung der Graphikzeichen auf anderen Rechnern/
-Terminals
-
- Wie schon unter "2.4 Nutzung der 'Semi - Graphik -
-Zeichen'" erwähnt, ist #on("b")#gs-DIALOG#off("b")# darauf vorbereitet, für
-'IBM - kompatible Rechner' und für Terminals 'Beehive
-FT20' die Umrahmungen der Kästen als durchgezogene Li­
-nien auszugeben - dadurch gewinnt die Bildschirmdar­
-stellung.
- #on("b")#gs-DIALOG#off("b")# ist aber hinsichtlich der Graphikzeichen
-nur für diese Endgeräte vorbereitet und benutzt in allen
-anderen Fällen Zeichen des normalen Zeichensatzes.
- Sie können sich aber, sofern Ihr Rechner/Terminal
-über solche Semi - Graphikzeichen verfügt, leicht selbst
-eine Anpassung dafür erstellen. Auch darauf ist
-#on("b")#gs-DIALOG#off("b")# schon vorbereitet. Keine Angst, versuchen Sie
-es ruhig einmal. Sie können nichts falsch machen; denn
-sollte es Ihnen nicht gelingen, so können Sie jederzeit
-mit dem Befehl 'std graphic char' und einem anschließen­
-den <RETURN> die Standardeinstellung wieder vornehmen.
- Informieren Sie sich in Ihrer Terminal-/Rechner­
-beschreibung, welche Codes ausgegeben werden müssen, um
-die Grahpikzeichen darzustellen. Folgende Zeichen werden
-benötigt:
-
- Ecke oben links : ω (f)
- Ecke oben rechts : � (g)
- Ecke unten links : � (e)
- Ecke unten rechts : � (h)
-
- Balken oben : � (n)
- Balken unten : Ì‚ (o)
- Balken links : Ì„ (m)
- Balken rechts : ̃ (l)
- Kreuz : Ì— (i)
-
- waagerechte Linie : ̇ (k)
- senkrechte Linie : � (j)
-
- ---------------------------------------------
-
- ( Cursor sichtbar : ( ESC . 1 ) )
- ( Cursor unsichtbar : ( ESC . 0 ) )
-
-
- #on("b")#gs-DIALOG#off("b")# müssen nun die speziellen Codes Ihres Rech­
-ners/Terminals mitgeteilt werden. Dafür stehen die fol­
-genden Prozeduren zur Verfügung:
-
-PROC ecke oben links (TEXT CONST zeichenkette);
-PROC ecke oben rechts (TEXT CONST zeichenkette);
-PROC ecke unten links (TEXT CONST zeichenkette);
-PROC ecke unten rechts (TEXT CONST zeichenkette);
-PROC balken oben (TEXT CONST zeichenkette);
-PROC balken unten (TEXT CONST zeichenkette);
-PROC balken links (TEXT CONST zeichenkette);
-PROC balken rechts (TEXT CONST zeichenkette);
-PROC waagerecht (TEXT CONST zeichenkette);
-PROC senkrecht (TEXT CONST zeichenkette);
-PROC kreuz (TEXT CONST zeichenkette);
-
-PROC cursor on (TEXT CONST zeichenkette);
-PROC cursor off (TEXT CONST zeichenkette);
-
- Sofern möglich, kann auch noch ein Code eingegeben
-werden, damit der Cursor auf dem Bildschirm sichtbar bzw.
-unsichtbar ist.
- Wie man sich selbst eine Anpassung schreiben kann,
-wollen wir hier an einem Beispiel aufzeigen. Wir schrei­
-ben dazu eine Anpassung für das Terminal 'Ampex 210+'.
- In der Terminalbeschreibung ist angegeben, wie das
-Terminal konfiguriert sein muß - diese Konfiguartion
-haben wir eingestellt. Weiterhin ist angegeben, daß auf
-die Grapikzeichen durch die Zeichenfolge 'ESC $' umge­
-schaltet und durch die Zeichenfolge 'ESC %' auf den nor­
-malen Zeichensatz zurückgeschaltet wird. Für die jeweils
-speziellen Graphikzeichen sind bestimmte Buchstaben an­
-zugeben (z.B. für die 'Ecke oben links' der Buchstabe 'f').
-Die Zeichen für dieses Terminal sind oben hinter den Gra­
-phikzeichen in Klammern angegeben. Für 'ESC' muß der Code
-'27' ausgegeben werden.
-
-PACKET eigene graphikanpassung DEFINES
-
- private graphic char:
-
-PROC private graphic char:
- ecke oben links (""27"$f"27"%");
- ecke oben rechts (""27"$g"27"%");
- ecke unten links (""27"$e"27"%");
- ecke unten rechts (""27"$h"27"%");
- balken oben (""27"$n"27"%");
- balken rechts (""27"$l"27"%");
- balken links (""27"$m"27"%");
- balken unten (""27"$o"27"%");
- waagerecht (""27"$k"27"%");
- senkrecht (""27"$j"27"%");
- kreuz (""27"$i"27"%");
- cursor on (""27".1");
- cursor off (""27".0");
-END PROC private graphic char;
-
-END PACKET eigene graphikanpassung;
-
- Nachdem das Programm insertiert und der Befehl
-'private graphic char' gegeben ist, steht in dieser Task
-und allen Söhnen davon die Graphikanpassung für das
-Terminal 'Ampex 210+' zur Verfügung.
-
-
-5.3 Fehlerbehandlung
-
- Haben Sie z.B. das Menu durch Tippen der <SV>-Taste
-verlassen, so kann es vorkommen, daß anschließend das
-Menu auf dem Bildschirm nicht ordnungsgemäß aufgebaut
-wird. Verlassen Sie dann die Menuebene durch die Tasten­
-folge <ESC><q>.
-
-Wenn 'gib kommando:' erscheint, geben Sie den Befehl
-
- reset dialog <RETURN>
-
- Dadurch wird das Menusystem in den Anfangszustand
-gesetzt. Anschließend können Sie das von Ihnen ge­
-wünschte Programm (wieder) aufrufen.
-
diff --git a/doc/dialog/gs-dialog-Inhaltsverzeichnis b/doc/dialog/gs-dialog-Inhaltsverzeichnis
deleted file mode 100644
index 741744f..0000000
--- a/doc/dialog/gs-dialog-Inhaltsverzeichnis
+++ /dev/null
@@ -1,45 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-Inhaltsverzeichnis
-
-
-1 Was kann gs-DIALOG 3
-
-2 Installation von gs-DIALOG 6
-2.1 Voraussetzungen 6
-2.2 Lieferumfang 6
-2.3 Installation 6
-2.4 Nutzung der 'Semi-Graphik-Zeichen' 10
-
-3 Umgang mit den Menus; Eine Beispielsitzung 12
-3.1 Aufruf der Archivverwaltung 12
-3.2 Bedienung des Menusystems 14
- - Aufbau der Menus (Bildschirmaufbau) 14
- - Auswahl der Menupunkte 15
- - Informationen zu einem Menupunkt 18
- - Informationen zur Bedienung des Menus 19
- - Aktivierbare und nicht aktivierbare
- Menupunkte 20
- - Aktivieren von Menupunkten 21
- - Dateiauswahl 22
- - Ja/Nein - Fragen 26
- - Eingaben 26
- - Alternativen 26
- - Verlassen des Menus 27
-3.3 Zusammenfassung/Kurzbeschreibung 28
-
-4 Beschreibung der Menufunktionen 30
-4.1 Menufunktionen zum Oberbegriff 'Dateien' 30
-4.2 Menufunktionen zum Oberbegriff 'Archiv' 36
-
-5 Informationen für Lehrer/Programmierer 49
-5.1 "Verschlüsselung" der Dateien auf der
- Diskette 49
-5.2 Nutzung der Graphikzeichen auf andere
- Rechnern/Terminals 50
-5.3 Fehlerbehandlung 53
-
-
-
-
-
diff --git a/doc/dos/dos-dat-handbuch b/doc/dos/dos-dat-handbuch
deleted file mode 100644
index a1e4fd4..0000000
--- a/doc/dos/dos-dat-handbuch
+++ /dev/null
@@ -1,650 +0,0 @@
-____________________________________________________________________________
-
-
-#on("b")##on ("u")#
-#center#Betriebssystem E U M E L
-#off ("u")#
-
-
-#center#MS-DOS-DAT
-
-
-
-
-#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#
-#free(4.5)#
-
-#center#Lesen und Schreiben
-#center#von
-#center#MS-DOS Dateien
-
-#on ("b")##center#MS-DOS-DAT#off ("b")#
-#free(1.5)#
-
-
-#center#Version 2.0
-
-#center#Stand 10.09.87
-#page#
-#pagenr ("%",1)##setcount (1)##block##pageblock##count per page#
-#headeven#
-% #center#MS-DOS-DAT
-#center#____________________________________________________________
-
-#end#
-#headodd#
-#center#MS-DOS-DAT#right#%
-#center#____________________________________________________________
-
-#end#
-#on("bold")#
-#ib#1. Allgemeines#ie#
-#off ("b")#
-
-Dieses Programm ermöglicht MS-DOS Dateien vom EUMEL aus von Disketten zu
-lesen und auf Disketten zu schreiben. Die Benutzerschnittstelle ist ähnlich der des
-EUMEL-Archivs organisiert. Der Benutzer kommuniziert mit einer Task des
-EUMEL-Systems, nämlich mit der Task 'DOS'. Diese wickelt dann über das Archiv­
-laufwerk die Diskettenzugriffe ab. Der Benutzer meldet die MS-DOS Diskette mit
-'reserve ("...", /"DOS")' an und kann dann mit 'list (/"DOS")', 'fetch ("...", /"DOS")',
-'save ("...", /"DOS")' und weiteren Kommandos auf die MS-DOS Diskette zugreifen.
-Für das Schreiben und Lesen (save, fetch) stehen insgesamt 7 verschiedene Be­
-triebsarten zur Verfügung. Man kann in eine Datei im ASCII Code mit und ohne
-Anpassung der Umlaute, im IBM-ASCII Code, im Atari-ST Code oder ganz ohne
-Codeumsetzung lesen bzw. schreiben. Die Betriebsart selbst wird beim Anmelden der
-MS-DOS Diskette durch den Textparameter des 'reserve'-Kommandos bestimmt.
-
-Die gleiche Benutzerschnittstelle gilt für die Kommunikation mit der Task 'DOS HD'.
-Diese Task liest und schreibt aber nicht auf der Diskette, sondern in der MS-DOS
-Partition der Festplatte (falls vorhanden).
-
-
-#on("bold")#
-#ib#2. Benutzeranleitung #ie#
-#off ("b")#
-Im Normalfall will man als Benutzer eine EUMEL-Textdatei auf eine MS-DOS
-Diskette schreiben oder eine mit z.B. Word-Star erstellte MS-DOS-Textdatei in
-das EUMEL-System einlesen (implementierte Formate siehe Abschnitt 3).
-
-Lesen einer MS-DOS-Datei:
-
-#linefeed (1.25)#
-#on ("b")#
- reserve ("file ascii german", /"DOS");
- (* MS-DOS-Diskette ins Laufwerk einlegen *)
- fetch (filename, /"DOS");
- release (/"DOS")
-#off ("b")#
-
-Schreiben einer MS-DOS-Datei:
-
-#on ("b")#
- reserve ("file ascii german", /"DOS");
- (* MS-DOS-Diskette ins Laufwerk einlegen *)
- save (filename, /"DOS");
- release (/"DOS")
-#off("b")#
-#linefeed (1.0)#
-
-
-Sollen statt der Umlaute []{|}\ verwendet werden, so ist statt "file ascii german" "file
-ascii" einzustellen. Eine genaue Beschreibung aller 7 möglichen Betriebsarten wird in
-Abschnitt 6 gegeben. Der Dateiname 'file name' unterliegt den im Abschnitt 4 be­
-schriebenen Einschränkungen.
-
-
-#on("bold")#
-#ib#3. Implementierte Formate#ie#
-#off("b")#
-
-Diese Hardware ermöglicht das Bearbeiten von MS-DOS Disketten mit Hilfe der
-Task /"DOS" und (falls es sich um einen MS-DOS fähigen Rechner mit MS-DOS Parti­
-tion auf der Festplatte handelt) das Bearbeiten von Daten in der MS-DOS Partition
-der Platte.
-
-#on("bold")#
-#ib#3.1 Arbeiten mit der Task /"DOS"#ie#
-#off ("b")#
-
-Die Task /"DOS" verwendet das Archivlaufwerk als MS-DOS Datenträger. Es sind
-alle mit dem IBM-Format der DOS Version 2 und 3 kompatiblen Formate für 5.25
-Zoll und 3.5 Zoll Disketten implementiert, sofern diese 512 Byte große Sektoren
-verwenden und im ersten Sektor einen erweiterten BIOS-Parameterblock (BPB)
-enthalten (hierzu gehören auch mit dem Atari ST bearbeitete Disketten). Weiterhin
-sind die beiden von IBM verwendeten Formate der DOS Version 1 implementiert (5.25
-Zoll, ein- bzw. zweiseitig, 40 Spuren a 8 Sektoren).
-
-Die einzige Hardwarevoraussetzung besteht darin, daß der Hardwareanpassungs­
-modul (SHard) alle von DOS benutzten Sektoren lesen und schreiben können muß.
-
-#on("bold")#
-#ib#3.2 Arbeiten mit der Task /"DOS HD"#ie#
-#off ("b")#
-
-Die Task /"DOS HD" verwendet die MS-DOS Partition der Festplatte als Daten­
-träger (falls eine solche vorhanden ist und das SHard diese ansprechen kann). Hier
-gibt es keine Beschränkungen bezüglich des Plattentyps.
-
-
-#on("bold")#
-#ib#4. Dateibenennung#ie#
-#off ("b")#
-
-Die Namen für MS-DOS Dateien unterliegen bestimmten Regeln. Ein Dateiname
-kann aus
-- einem bis acht Zeichen oder
-- einem bis acht Zeichen gefolgt von einem Punkt und einer Namenserweiterung
- von einem bis drei Zeichen
-bestehen.
-
-Gültige Zeichen sind
-- die Buchstaben A bis Z
-- die Ziffern 0 bis 9
-- die Sonder- und Satzzeichen $ \# & § ! ( ) { }
-
-Da weitere Sonderzeichen in verschiedenen MS-DOS Versionen in unterschiedlich­
-em Umfang erlaubt sind, ist ihre Verwendung beim Schreiben (save) vom EUMEL aus
-nicht zugelassen. Beim Lesen und Löschen dagegen sind sie erlaubt.
-
-Außerdem sind die Buchstaben a - z erlaubt. Diese werden beim Zugriff auf das
-MS-DOS Inhaltsverzeichnis (Directory) in große Buchstaben konvertiert. Durch das
-Kommando 'fetch ("Test", /"DOS")' wird also die MS-DOS Datei mit dem Namen
-'TEST' in die EUMEL Datei mit dem Namen 'Test' gelesen; 'save ("test", /"DOS")'
-überschreibt dann die MS-DOS-Datei 'TEST' (natürlich nach Anfrage).
-
-
-#on("bold")#
-#ib#5. Beschreibung der Kommandos#ie#
-#off ("b")#
-
-In diesem Abschnitt steht der Begriff Dostask beim Arbeiten mit der Floppy für die
-Task /"DOS" und beim Arbeiten mit der MS-DOS Partition der Platte für die Task
-/"DOS HD". Analog steht der Begriff Dosbereich beim Arbeiten mit der Floppy für die
-Floppy und beim Arbeiten mit der MS-DOS Partition der Platte für diese Partition.
-
-#on("bold")#
-THESAURUS OP ALL (TASK CONST task)
-#off ("b")#
- Wird der 'ALL'-Operator für die Dostask aufgerufen, so wird ein Thesaurus ge­
- liefert. In diesem Thesaurus sind alle im Dosbereich vorhandenen Dateien einge­
- tragen. Die vorhandenen Unterinhaltsverzeichnisse (Subdirectories) werden nicht
- eingetragen.
-
-
-#on("bold")#
-PROC check (TEXT CONST filename, TASK CONST task)
-#off ("b")#
- Durch Aufruf dieser Prozedur für die Dostask wird die Datei 'filename' im Dosbe­
- reich prüfgelesen. Es werden nur die mit Daten belegten Blöcke prüfgelesen. Sollen
- auch der Einträge im Inhaltsverzeichnis überprüft werden, so erreicht man dies
- durch vorheriges neues Anmelden mit der Prozedur 'reserve'.
-
-
-#on("bold")#
-PROC clear (TASK CONST task)
-#off ("b")#
- Durch Aufruf dieser Prozedur für die Task /"DOS" wird die gesamte Diskette ge­
- löscht. Mit dieser Prozedur können #on ("u")#nur MS-DOS formatierte Disketten#off ("u")# behandelt
- werden. Soll eine Diskette dagegen für den Gebrauch unter MS-DOS initialisiert
- werden, so ist sie auf einem MS-DOS-Rechner zu formatieren.
-
- Der Aufruf dieser Prozedur für die Task /DOS HD" ist aus Sicherheitsgründen nicht
- erlaubt.
-
-
-#on("bold")#
-PROC erase (TEXT CONST filename, TASK CONST task)
-#off ("b")#
- Durch Aufruf dieser Prozedur für die Dostask wird die Datei 'filename' im Dosbe­
- reich gelöscht.
-
-
-#on("bold")#
-BOOL PROC exists (TEXT CONST name, TASK CONST task)
-#off ("b")#
- Wird diese Prozedur für die Dostask aufgerufen, so liefert sie 'TRUE', falls eine
- Datei mit dem Namen 'name' im Dosbereich existiert. Andernfalls liefert sie
- 'FALSE'.
-
-
-#on("bold")#
-PROC fetch (TEXT CONST filename, TASK CONST task)
-#off ("b")#
- Durch Aufruf dieser Prozedur für die Dostask wird die Datei 'filename' aus dem
- Dosbereich gelesen. Hierbei wird in der beim Anmelden (reserve ("...", dostask))
- bestimmten Betriebsart gelesen (siehe Abschnitt 6).
-
-
-#on("bold")#
-PROC list (TASK CONST task)
-#off ("b")#
- Wird diese Prozedur für die Dostask aufgerufen, so werden alle Dateien des In­
- haltsverzeichnisses und alle Unterverzeichnisse des Dosbereichs aufgelistet.
-
-
-#on("bold")#
-PROC release (TASK CONST task)
-#off ("b")#
- Der Aufruf dieser Prozedur für die Task Dostask hebt deren Reservierung auf.
- Gleichzeitig wird auch der für block i/o benutzte Kanal freigegeben, so daß bei
- Benutzung der Task /"DOS" der Archivkanal durch das EUMEL-Archiv wieder
- benutzt werden kann.
-
- Um möglichst effizient arbeiten zu können, werden Inhaltsverzeichnis und Ket­
- tungsblock des Dosbereichs als Kopie im EUMEL gehalten. Der hierdurch belegte
- Speicher wird beim 'release' wieder freigegeben. Dies ist bei kleinen Systemen
- besonders wichtig.
-
-
-#on("bold")#
-PROC reserve (TEXT CONST mode, TASK CONST task)
-#off ("b")#
- Durch Aufruf für die Dostask werden Operationen mit dem Dosbereich angemel­
- det. Gleichzeitig koppelt sich die Dostask an den entsprechenden Kanal an.
- (/"DOS" an Kanal 31 und /"DOS HD" an Kanal 29). Die Anmeldung wird abge­
- lehnt, wenn der für die MS-DOS Operationen benötigte Kanal belegt ist (z.B. bei
- Kanal 31 durch eine Archiv­Operation). Ähnlich wie beim EUMEL-Archiv bleibt
- diese Reservierung bis 5 Minuten nach dem letzten Zugriff gültig.
-
- Wird beim Arbeiten mit der Task /"DOS" die MS-DOS Diskette gewechselt, so
- muß erneut 'reserve ("...", /"DOS")' aufgerufen werden. Nur so ist gewährleistet,
- daß das Inhaltsverzeichnis der neuen Diskette geladen wird.
-
- Der Text 'mode' gibt die Betriebsart für das Schreiben und Lesen der Diskette
- sowie den Pfad für das Bearbeiten von Subdirectories an und nicht wie beim
- EUMEL-Archiv den Diskettennamen. Es gilt folgende Systax:
-
- modus :[\directory][\directory]...[\directory]
-
- Hierbei sind die Angaben in eckigen Klammern optional. Wird kein Pfad angege­
- ben, so wird mit dem Hauptdirektory der Diskette gearbeitet. Ansonsten wird mit
- dem Directory gearbeitet, welches durch den hinter dem Doppelpunkt angegeben
- Pfad bezeichnet wird. Als 'modus' können alle in Abschnitt 6 beschriebenen Be­
- triebsarten verwendet werden.
-
-
-#on("bold")#
-PROC save (TEXT CONST filename, TASK CONST task)
-#off ("b")#
- Durch Aufruf dieser Prozedur für die Dostask wird die Datei 'filename' in den
- Dosbereich geschrieben. Hierbei wird in der beim Anmelden (reserve ("...",
- dostask)) bestimmten Betriebsart geschrieben (siehe Abschnitt 6).
-
-
-#on("bold")#
-#ib#6. Die Betriebsarten von 'fetch' und 'save'#ie#
-
-#ib#6.1 Betriebsart: file ascii#ie#
-
-#on("bold")#
-fetch ("filename", dostask)
-#off ("b")#
- Die MS-DOS Datei 'filename' wird in die EUMEL-Datei 'filename' kopiert. Dabei
- werden von allen Zeichen nur die niederwertigen 7 Bit gemäß DIN 66 003, ASCII
- Code, internationale Referenzversion interpretiert. Die Datei wird so aufbereitet, daß
- ein Bearbeiten mit dem EUMEL-Editor möglich ist. Dies geschieht folgenderma­
- ßen:
- - Alle im EUMEL darstellbaren Zeichen werden auf diese abgebildet.
- - Die Zeichenfolgen CR LF, LF CR, LF, CR (CR = carriage return, LF = line­
- feed) beenden einen Satz in der MS-DOS-Datei. Dementsprechend wird
- eumelseitig die aktuelle Zeile beendet.
- - Das Zeichen FF (form feed) beendet eumelseitig die aktuelle Zeile. Außerdem
- wird ein Satz mit dem Inhalt "\#page\#" eingefügt.
- - TAB's (Code 9) werden mit Blanks zur nächsten 8ter-Position expandiert.
- - 'Ctrl z' in der MS-DOS Datei wird als Dateiende interpretiert. Fehlt dieses,
- so wird bis zum letzten Zeichen des letzten Sektors der Datei gelesen.
- - Alle anderen Zeichen mit 0 <= code (zeichen) <=  31 (Steuerzeichen)
- werden durch eine Ersatzdarstellung dargestellt (der Code des Zeichens wird
- als 3 stellige Dezimalzahl eingeschlossen von \#-Zeichen dargestellt).
-
-
-#on("bold")#
-save ("filename", dostask)
-#off ("b")#
- Die EUMEL-Datei 'filename' wird nach MS-DOS geschrieben. Unter MS-DOS
- wird der ASCII Code, internationale Referenzversion gemäß DIN 66 003 verwendet.
- Dies geschieht folgendermaßen:
- - Die EUMEL-spezifischen Druckzeichen (Trenn -, Trenn k, Druck \#, ge­
- schütztes Blank) werden in -, k, \# und Blank umgesetzt.
- - Alle in der internationalen Referenzversion des ASCII Codes vorhandenen
- Eumel-Zeichen werden auf diese abgebildet.
- - Alle in der internationalen Referenzversion des ASCII Codes nicht vorhande­
- nen Eumel-Zeichen werden durch eine Ersatzdarstellung dargestellt (der
- Code des Zeichens wird als 3 stellige Dezimalzahl eingeschlossen von
- \#-Zeichen dargestellt)
- - Steht in einer Zeile nur das Kommando '\#page\#' so wird dieses in ein Sei­
- tenvorschubsteuerzeichen (""12"") umgewandelt.
- - Eine dreistellige Dezimalzahl eingeschlossen von \# Zeichen wird als Ersatz­
- darstellung für das Zeichen mit dem durch die Dezimalzahl angegebenen
- Code betrachte. Diese Ersatzdarstellung wird beim Schreiben aufgelöst (d.h.
- durch das entsprechende Zeichen ersetzt).
- - Nach jeder Zeile wird 'carriage return' und ' linefeed' angefügt
- - Am Ende der Datei wird 'ctrl z' angehängt.
-
-
-#on("bold")#
-#ib#6.2 Betriebsart: file ascii german#ie#
-
-fetch ("filename", dostask)
-#off ("b")#
- Die MS-DOS Datei 'filename' wird in die EUMEL-Datei 'filename' kopiert. Dabei
- werden von allen Zeichen nur die niederwertigen 7 Bit gemäß DIN 66 003, ASCII
- Code, deutsche Referenzversion interpretiert. Die Datei wird so aufbereitet, daß ein
- Bearbeiten mit dem EUMEL-Editor möglich ist. Dies geschieht wie in der Be­
- triebsart 'file ascii', jedoch stehen statt []{}|\ die Umlaute und ß zur Verfügung.
-
-
-#on("bold")#
-save ("filename", dostask)
-#off ("b")#
- Die EUMEL-Datei 'filename' wird nach MS-DOS geschrieben. Unter MS-DOS
- wird der ASCII Code, deutsche Referenzversion gemäß DIN 66 003 verwendet. Dies
- geschieht wie in der Betriebsart 'file ascii', jedoch stehen statt []{}|\ die Umlaute
- zur Verfügung.
-
-
-#on("bold")#
-#ib#6.3 Betriebsart: file ibm#ie#
-
-fetch ("filename", dostask)
-#off ("b")#
- Die MS-DOS Datei 'filename' wird in die EUMEL-Datei 'filename' kopiert. Dabei
- werden alle Zeichen wie in der von IBM verwendeten Version des ASCII Codes
- interpretiert. Die Datei wird so aufbereitet, daß ein Bearbeiten mit dem EUMEL-
- Editor möglich ist. Dies geschieht folgendermaßen:
- - Alle im EUMEL darstellbaren Zeichen werden auf diese abgebildet.
- - Die Zeichenfolgen CR LF, LF CR, LF, CR (CR = carriage return, LF = line­
- feed) beenden einen Satz in der MS-DOS-Datei. Dementsprechend wird
- eumelseitig die aktuelle Zeile beendet.
- - Das Zeichen FF (form feed) beendet eumelseitig die aktuelle Zeile. Außerdem
- wird ein Satz mit dem Inhalt "\#page\#" eingefügt.
- - TAB's (Code 9) werden mit Blanks zur nächsten 8ter-Position expandiert.
- - Alle anderen Zeichen mit 0 <= code (zeichen) <=  31 (Steuerzeichen)
- werden durch eine Ersatzdarstellung dargestellt (der Code des Zeichens wird
- als 3 stellige Dezimalzahl eingeschlossen von \#-Zeichen dargestellt).
-
-
-#on("bold")#
-save ("filename", dostask)
-#off ("b")#
- Die EUMEL-Datei 'filename' wird nach MS-DOS geschrieben. Unter MS-DOS
- wird der ASCII Code in der von IBM verwendeten Version verwendet. Dies ge­
- schieht folgendermaßen:
- - Die EUMEL-spezifischen Druckzeichen (Trenn -, Trenn k, Druck \#, ge­
- schütztes Blank) werden in -, k, \# und Blank umgesetzt.
- - Alle in der IBM Version des ASCII Codes vorhandenen Eumel-Zeichen
- werden auf diese abgebildet.
- - Alle in der IBM Version des ASCII Codes nicht vorhandenen Eumel-Zeichen
- werden durch eine Ersatzdarstellung dargestellt (der Code des Zeichens wird
- als 3 stellige Dezimalzahl eingeschlossen von \#-Zeichen dargestellt)
- - Steht in einer Zeile nur das Kommando '\#page\#' so wird dieses in ein Sei­
- tenvorschubsteuerzeichen (""12"") umgewandelt.
- - Eine dreistellige Dezimalzahl eingeschlossen von \# Zeichen wird als Ersatz­
- darstellung für das Zeichen mit dem durch die Dezimalzahl angegebenen
- Code betrachte. Diese Ersatzdarstellung wird beim Schreiben aufgelöst (d.h.
- durch das entsprechende Zeichen ersetzt).
- - Nach jeder Zeile wird 'carriage return' und ' linefeed' angefügt
-
-
-#on("bold")#
-#ib#6.4 Betriebsart: file atari st#ie#
-
-fetch ("filename", dostask)
-#off ("b")#
- Die MS-DOS Datei 'filename' wird in die EUMEL-Datei 'filename' kopiert. Dabei
- werden alle Zeichen wie in der vom Atari ST verwendeten Version des ASCII Codes
- interpretiert. Die Datei wird so aufbereitet, daß ein Bearbeiten mit dem EUMEL-
- Editor möglich ist. Dies geschieht folgendermaßen:
- - Alle im EUMEL darstellbaren Zeichen werden auf diese abgebildet.
- - Die Zeichenfolgen CR LF, LF CR, LF, CR (CR = carriage return, LF = line­
- feed) beenden einen Satz in der MS-DOS-Datei. Dementsprechend wird
- eumelseitig die aktuelle Zeile beendet.
- - Das Zeichen FF (form feed) beendet eumelseitig die aktuelle Zeile. Außerdem
- wird ein Satz mit dem Inhalt "\#page\#" eingefügt.
- - TAB's (Code 9) werden mit Blanks zur nächsten 8ter-Position expandiert.
- - Alle anderen Zeichen mit 0 <= code (zeichen) <=  31 (Steuerzeichen)
- werden durch eine Ersatzdarstellung dargestellt (der Code des Zeichens wird
- als 3 stellige Dezimalzahl eingeschlossen von \#-Zeichen dargestellt).
-
-
-#on("bold")#
-save ("filename", dostask)
-#off ("b")#
- Die EUMEL-Datei 'filename' wird nach MS-DOS geschrieben. Unter MS-DOS
- wird der ASCII Code in der vom Atari ST verwendeten Version verwendet. Dies
- geschieht folgendermaßen:
- - Die EUMEL-spezifischen Druckzeichen (Trenn -, Trenn k, Druck \#, ge­
- schütztes Blank) werden in -, k, \# und Blank umgesetzt.
- - Alle in der vom Atari ST verwendeten Version des ASCII Codes vorhandenen
- Eumel-Zeichen werden auf diese abgebildet.
- - Alle in der vom Atari ST verwendeten Version des ASCII Codes nicht
- vorhandenen Eumel-Zeichen werden durch eine Ersatzdarstellung dargestellt
- (der Code des Zeichens wird als 3 stellige Dezimalzahl eingeschlossen von
- \#-Zeichen dargestellt)
- - Steht in einer Zeile nur das Kommando '\#page\#' so wird dieses in ein Sei­
- tenvorschubsteuerzeichen (""12"") umgewandelt.
- - Eine dreistellige Dezimalzahl eingeschlossen von \# Zeichen wird als Ersatz­
- darstellung für das Zeichen mit dem durch die Dezimalzahl angegebenen
- Code betrachte. Diese Ersatzdarstellung wird beim Schreiben aufgelöst (d.h.
- durch das entsprechende Zeichen ersetzt).
- - Nach jeder Zeile wird 'carriage return' und ' linefeed' angefügt
-
-
-#on("bold")#
-#ib#6.5 Betriebsart: file transparent#ie#
-
-fetch ("filename", dostask)
-#off ("b")#
- Die MS-DOS Datei 'filename' wird in die EUMEL-Datei 'filename' kopiert. Dabei
- werden von allen Zeichen alle 8 Bit interpretiert. Es werden keine Zeichen einge­
- fügt, gelöscht oder gewandelt. Somit stehen dann auch CR und LF Zeichen in der
- EUMEL-Datei.
-
- Da eine solche Datei noch Steuerzeichen enthält, ist beim Bearbeiten mit dem
- Editor Vorsicht geboten.
-
-
-#on("bold")#
-save ("filename", dostask)
-#off ("b")#
- Die EUMEL-Datei 'filename' wird nach MS-DOS geschrieben. Es werden keine
- Codeumsetzungen durchgeführt. Insbesondere muß die EUMEL-Datei auch die CR
- LF Sequenzen für das Zeilenende enthalten.
-
-
-#on("bold")#
-#ib#6.6 Betriebsart: row text#ie#
-#off ("b")#
-
-Diese Betriebsart ist nur für Programmierer interessant. Sie ist für die Umsetzung
-exotischer Codes in den EUMEL-Code mittels ELAN-Programmen gedacht.
-
-#on("bold")#
-fetch ("filename", dostask)
-#off ("b")#
- Die MS-DOS Datei 'filename' wird in einen Datenraum mit folgender Struktur
- kopiert:
-
- STRUCT (INT benutzte texte, ROW 4000 TEXT datensatz)
-
- Dabei bekommt der Datenraum den Type 1000. Der Integer 'benutzte texte' gibt an,
- wieviele Elemente des ROW 4000 TEXT benutzt sind. In jedem benutzten Element
- des ROW 4000 TEXT steht der Inhalt einer logischen Gruppe der MS-DOS Disket­
- te. (Eine logische Gruppe umfaßt bei einer einseitig beschriebenen MS-DOS
- Diskette 512 Byte und bei einer zweiseitig beschriebenen 1024 bzw. 2048 Byte). In
- dieser Betriebsart werden keine Zeichen der MS-DOS Datei konvertiert oder
- interpretiert, so daß also auch alle Steuerzeichen erhalten bleiben.
-
-
-#on("bold")#
-save ("filename", dostask)
-#off ("b")#
- Hier bezeichnet 'filename' einen Datenraum der Struktur:
-
- STRUCT (INT benutzte texte, ROW 4000 TEXT datensatz)
-
- Dieser Datenraum muß den Type 1000 haben.
- Es werden die benutzten Texte (1 bis benutzte texte) aneinandergehängt und ohne
- irgendwelche Konvertierungen bzw. Interpretationen als MS-DOS Datei 'filename'
- geschrieben. Dies bedeutet, daß die Texte auch alle von MS-DOS benötigten
- Steuerzeichen (z.B. 'ctrl z' als Dateiendekennzeichen) enthalten müssen.
-
-
-#on("bold")#
-#ib#6.7 Betriebsart: ds#ie#
-#off ("b")#
-Diese Betriebsart ist nur für den Programmierer interessant. Sie ermöglicht das Abbil­
-den von Datenstrukturen zwischen MS-DOS und EUMEL.
-
-#on("bold")#
-fetch ("filename", dostask)
-#off ("b")#
- Die MS-DOS Datei 'filename' wird blockweise in den Datenraum 'filename' ko­
- piert. Hierbei wird der erste Block der MS-DOS Datei in die 2. Seite des Daten­
- raums kopiert. (Die 2. Seite eines Datenraums ist die erste, die von einer Daten­
- struktur voll überdeckt werden kann).
-
-
-#on("bold")#
-save ("filename", dostask)
-#off ("b")#
- Der Datenraum 'filename' wird ab seiner 2. Seite in die MS-DOS Datei 'filename'
- geschrieben. Hierbei werden alle Seiten des Datenraums (auch die nicht allokier­
- ten) bis einschließlich der letzten allokierten Datenraumseite geschrieben.
-
-
-#on("bold")#
-#ib#7. Installation#ie#
-#off ("b")#
-
-Die Software zur Generierung der Tasks /"DOS" und /"DOS HD" wird auf einem
-EUMEL-Archiv ausgeliefert.
-
-#on("bold")#
-#ib#7.1 Installation der Task /"DOS"#ie#
-
-#ib#7.1.1 Installation im Multi-User#ie#
-#off ("b")#
-
-Die Software muß in einer privilegierten Task mit dem Namen 'DOS' installiert wer­
-den. Dies geschieht folgendermaßen:
-
-
- begin ("DOS", "SYSUR")
-
- archive ("austausch");
- fetch ("dos inserter", archive);
- run ("dos inserter")
-
-
-Danach stehen die Prozeduren
-
-
- PROC dos manager
- PROC dos manager (INT CONST channel)
-
-
-zur Verfügung. Beide Prozeduren machen die aufrufende Task zur Kommunikations­
-task für das Schreiben und Lesen von MS-DOS Disketten. Die erste benutzt dazu
-den Archivkanal (Kanal 31), bei der zweiten ist der Kanal über den Parameter ein­
-stellbar. Eine dieser Prozeduren muß jetzt aufgerufen werden.
-
-#on("bold")#
-#ib#7.1.2. Installation im Single-User#ie#
-#off ("b")#
-
-Die Software wird im Monitor ('gib Kommando'-Modus) durch folgende Kommandos
-installiert:
-
-
- archive ("austausch");
- fetch ("dos inserter", archive);
- run ("dos inserter")
-
-
-Für das Schreiben und Lesen von MS-DOS Disketten wird der Archivkanal (Kanal
-31) benutzt.
-
-
-#on("bold")#
-#ib#7.2 Installation der Task /"DOS HD"#ie#
-#off ("b")#
-
-Die Software muß in einer privilegierten Task mit dem Namen 'DOS HD' installiert
-werden. Dies geschieht folgendermaßen:
-
-
- begin ("DOS HD", "SYSUR")
-
- archive ("austausch");
- fetch ("dos hd inserter", archive);
- run ("dos hd inserter")
-
-
-Danach steht die Prozedur
-
-
- PROC dos manager
-
-
-zur Verfügung. Sie macht die aufrufende Task zur Kommunikationstask für das
-Schreiben und Lesen in der MS-DOS Partition der Platte. Sie benutzt dazu den
-Kanal 29, der, wie im Portierungshandbuch für den 8086 beschrieben, implementiert
-sein muß.
-
-#page#
-#headeven#
-#end#
-
-
-
-
-
-Herausgegeben von:
-
- Gesellschaft für Mathematik und Datenverarbeitung mbH
- (GMD)
- Schloß Birlinghoven
- 5205 Sankt Augustin 1
-
- und
-
- Hochschulrechenzentrum der Universität Bielefeld
- (HRZ)
- Universitätsstraße
- 4800 Bielefeld 1
-
-Autor:
-
- Frank Klapper
-
-überarbeitet von:
-
- Thomas Müller
- Hansgeorg Freese (GMD)
-
-Umschlaggestaltung:
-
- Hannelotte Wecken
-
-
-
-
-
-
diff --git a/doc/dynamo/dynamo handbuch b/doc/dynamo/dynamo handbuch
deleted file mode 100644
index 4012973..0000000
--- a/doc/dynamo/dynamo handbuch
+++ /dev/null
@@ -1,1826 +0,0 @@
-#block##pageblock##page (2)##setcount (1)##count per page#
-#head#
-#center#DYNAMO-Compiler
-#center#____________________________________________________________
-
-#end#
-#bottom odd#
-#center#____________________________________________________________
-GMD #right#DYNAMO - %
-#end#
-#bottom even#
-#center#____________________________________________________________
-DYNAMO - % #right#GMD
-#end#
-
-#ib#1. Einleitung#ie#
-
-
-
-Diese Handbuch beschreibt die Funktion des EUMEL-DYNAMO-Compilers in der
-Version 3.3+ und seine Einschränkungen oder Änderungen gegenüber dem
-DYNAMO-Sprachstandard. In keiner Weise kann diese Beschreibung eine Einfüh­
-rung in die Programmiersprache DYNAMO ersetzen!
-
-Die beschriebene Compilerversion enthält nun auch ein Modul zur Unterstützung von
-hochauflösender Grafik durch die häufig in IBM-PC/AT-Kompatiblen eingesetzte
-CGA-Grafikkarte. Dennoch ist es einfach möglich, diesen Grafikmodus auszuschal­
-ten, und somit die alte, zeichenorientierte Grafik weiter zu verwenden.
-
-Der DYNAMO-Compiler wurde 1983 von Robert Keil und Torsten Fröhlich (Helm­
-holtz-Gymnasium, Bonn) im Rahmen des MIKROS-Projektes am Informatik-Kolleg
-der GMD entwickelt. Für Spezifikation und Betreuung der Entwicklung war Dr. Diether
-Craemer verantwortlich, software-technische Unterstützung kam von Prof. John
-Henize, Dr. Peter Heyderhoff, Rudolf Legde und Dipl.- Math. Lothar Oppor. Die
-Grafik wurde von D.Giffeler beigesteuert.
-
-
-
-
-#ib#1.1. Referenzliteratur#ie#
-
-
-
-
- [1] Craemer, Diether
- "Mathematisches Modellieren dynamischer Vorgänge"
- e. Einf. in die Programmiersprache DYNAMO
- Stuttgart, Teuber, 1985
- ISBN 3-519-02477-2
-
- [2] Craemer, Diether
- "Fluß und Zustand - Simulation dynamischer Vorgänge in DYNAMO"
- in: LOGIN 5 (1985), Heft 1, S. 20-23
-
- [3] Pugh, Alexander L.
- "DYNAMO II User's Manual"
- Cambridge, London 1973: MIT-Press
- ISBN 0-262-66018-0
-#page#
-
-#ib#1.2. Die Programmiersprache DYNAMO#ie#
-
-
-
-DYNAMO wurde von einer Gruppe um Jay FORRESTER am Massachusetts Institute
-of Technology (MIT) um 1960 entwickelt. Die Sprache basiert auf der #on ("i")# System
-Dynamic#off ("i")# von FORRESTER.
-
-In DYNAMO (#on ("u")##on ("b")#Dyna#off ("b")##off ("u")#mic #on ("u")##on ("b")#Mo#off ("b")##off ("u")#delling Language) können Systeme, in denen Veränderun­
-gen kontinuierlich geschehen, modelliert und simuliert werden.
-
-Kontinuierliche Veränderungen von Größen werden über deren Veränderungsrate im
-Wesentlichen nach folgender Gleichung berechnet
-
-Größe jetzt = Größe früher + DT * Veränderungsrate,
-
-dabei ist DT die Länge des Zeitintervalls von "früher" bis "jetzt".
-
-Außer diesen Gleichungen für Größen braucht man Gleichungen für die Verände­
-rungsraten, für Hilfsgrößen, zur Initialisierung von Größen, zur Definition von Konstan­
-ten und Tabellen, zu Angaben von Simulationsläufen und zur Wiedergabe von Ergeb­
-nissen in Zahlentabellen oder Diagrammen.
-
-Alle diese Gleichungen können einfach in der Form, wie man sie aus dem Mathema­
-tik-Unterricht der Sekundarstufe kennt, hingeschrieben werden, ohne sich Gedanken
-über den Ablauf des Programms machen zu müssen.
-
-#on ("b")#
-DYNAMO ist also eine einfache funktional-applikative, nicht-prozedurale Sprache.#off ("b")#
-
-Das macht ihren Reiz und ihre Leistungsfähigkeit aus, die zur Formulierung der be­
-kannten Weltmodelle von FORRESTER, MEADOWS ("Die Grenzen des Wachstums"),
-PESTEL, MESAROVIC u.a. in dieser Sprache führten.
-
-Anwendungsgebiete der Sprache sind ökologische, gesellschaftliche, wirtschaftliche
-und technische Systeme, deren dynamisches Verhalten der Modellbildner nachbilden
-und studieren möchte.
-
-Im Allgemeinen verfolgt der Modellbildner mit seinem Modell einen Zweck (Verhaltens­
-änderung des nachgebildeten Systems), so daß auch neben gesicherten Fakten die
-Wertvorstellungen des Modellbildners in das Modell eingehen.
-
-
-
-
-#ib#1.3 Kurz-Einführung in die DYNAMO-
-Schreibweise#ie#
-
-
-
-Die System Dynamic Methode benutzt als Analogie-Bild den Archetyp des Flusses:
-
- - Wasser fließt durch das Flußbett, kann in Seen gestaut und in der Ge­
- schwindigkeit durch Schleusen und Wehre reguliert werden.
-
- - Analog dazu "fließt" Geld auf dem Überweisungsweg, wird in Konten gestaut,
- und die Liquidität kann durch Zinssätze reguliert werden.
-
- - Gedanken "fließen" auf Nervenbahnen, werden im Gehirn gespeichert, und
- Gedankenströme werden über Synapsen reguliert.
-
- - Autos "fließen" über Straßen, werden auf Parkplätzen gestaut, und der Ver­
- kehrsfluß wird über Ampeln reguliert.
-
- - Menschen "fließen" über Wanderwege, halten sich in Wohnorten auf, und die
- Bevölkerungsdynamik wird durch ein komplexes, rückgekoppeltes Zusammen­
- spiel von Ein- und Auswanderungsraten sowie Geburts- und Sterberaten
- reguliert.
-
-Am letzten Beispiel wird deutlich, daß sich ein soziales Phänomen nur im Zusam­
-menwirken vieler netzartig miteinander verbundener Variablen beschreiben läßt (wenn
-überhaupt).
-
-Solange jedoch einigen Variablen ZUSTANDS-CHARAKTER ("Wasserstand") und
-anderen VERÄNDERUNGS-CHARAKTER ("Flußgeschwindigkeit") zugeordnet
-werden kann, können die Größen für Berechnungen folgender Art verwendet werden:
-
-
- Wasserstand jetzt = Wasserstand früher + vergangene Zeit *
- (Zuflußrate - Abflußrate)
-
-
-analog:
-
- Bevölkerung jetzt = Bevölkerung früher + vergangene Zeit *
- (Geburtsrate - Sterberate)
-
-
-Diese Schreibweise kann praktisch so in ein Computerprogramm übernommen wer­
-den. Mit geringfügigen Änderungen handelt es sich bei diesen Gleichungen schon um
-gültige Zeilen in der Programmiersprache DYNAMO.
-
-In DYNAMO wird er Zeitpunkt "jetzt" durch das Anhängsel .K, der Zeitpunkt "früher"
-durch das Anhängsel .J, die Zeitspanne von jetzt bis später durch das Anhängsel .KL,
-die Zeitspanne von früher bis jetzt durch das Anhänsel .JK und die vergangene Zeit
-mit DT (wie "Delta Tempus": Zeitdifferenz) bezeichnet. Die Variablen mit Zustands-
-Charakter heißen LEVELS (Niveaus) und die Veränderungs-Charakter heißen RATES
-(Veränderungsraten, Geschwindigkeiten). Die entsprechenden Gleichungen werden mit
-L bzw. R gekennzeichnet. Es gib weitere Kennzeichnungen:
-
- C für Konstantendefinition (constant)
- T für Tabellendefintion (table)
- A für Hilfsgrößen (auxiliaries)
- N für Anfangswerte (initial)
- X für Folgezeile (extension)
- PRINT für Ausgabe von Zahlen
- PLOT für Ausgabe von Diagrammen
-
-Ein einfaches Bevölkerungsmodell könnte z.B. so geschriben werden:
-
-
- L BEVÖLKERUNG.K=BEVÖLKERUNG.J+DT*(GEBURTENRATE.JK
- X -STERBERATE.JK)
- R STERBERATE.KL=5
- R GEBURTENRATE.KL=20
- N BEVÖLKERUNG=1000
- C DT=1 (jedes Jahr wird neu berechnet)
- C LENGTH=60 (60 Jahre werden simuliert)
- PRINT BEVÖLKERUNG
-
-
-Für eine tiefere Einführung in DYNAMO sollte man die Referenzliteratur zu Rate
-ziehen.
-
-
-
-
-#ib#1.4 Eine erste, kleine Sitzung mit dem
-DYNAMO-System#ie#
-
-
-
-Wir gehen davon aus, daß das DYNAMO-System in ihrer Task generiert worden ist
-(siehe 2.).
-
- 1. Tippen Sie das obrige Programm mittels des EUMEL-Editors ab.
-
- 2. Verlassen Sie den Editor mit <ESC><q> und starten Sie den DYNAMO-
- Compiler durch die Eingabe des Befehls "dynamo".
-
- 3. Nach erfolgreichem Ãœbersetzen sollte Ihnen nun das DYNAMO-Runtime-
- System zur Verfügung stehen. Durch den Befehl 'run' wird das Programm aus­
- geführt und Sie erhalten eine Zahlenkolonne, die die Entwicklung der Bevöl­
- kerung in den zu untersuchenden 60 Jahren angibt. Falls Ihnen beim Abtippen
- des Programms Fehler unterlaufen sein sollten, so kann das Programm nicht
- fehlerfrei übersetzt werden. Fehlermeldunggen zur Compile-Zeit des
- DYNAMO-Compilers werden im Paralleleditor angezeigt; das Programm kann
- im oberen der beiden Editorfenster (in diesem befinden Sie sich auch nach
- Fehlern) korrigiert werden. Danach können Sie erneut wie nach Punkt 2 ver­
- fahren.
-#page#
-
-
-
-#ib#2. Generierung des DYNAMO-Compilers#ie#
-
-
-
-Der DYNAMO-Compiler, seine Funktionen und die Beispielprogramme werden auf
-zwei Archiv-Disketten a#b#' 360 KB ausgeliefert.
-
-Zum Generieren des DYNAMO-Systems legen Sie bitte die erste Diskette in das
-Dikettenlaufwerk Ihres Rechners und durch folgende Kommandozeile lesen Sie den
-Generator vom Archiv und starten ihn:
-
-
- archive ("dynamo"); fetch ("dyn.inserter", archive); run
-
-
-Danach holt der Generator alle benötigten Dateien vom eingelegten Archiv bzw. von
-dem zweiten Archiv (nachdem er Sie zum Wechseln der Diskette aufgefordert hat).
-Anschließend wird der DYNAMO-Compiler insertiert. Am Ende der Generierung
-werden Sie gefragt werden, ob Sie den Compiler mit Grafik#u##count ("Grafik")##e# oder ohne benutzen
-wollen. Nach der Meldung "dynamo system generiert" können Sie den Compiler#foot#
-#u##value ("Grafik")##e# Es kann z.Zt. nur eine CGA-Grafikkarte betrieben werden
-#end#
-nutzen.
-#page#
-
-
-
-#ib#3. Der EUMEL-DYNAMO-Compiler#ie#
-
-
-
-Der im EUMEL-System implementierte DYNAMO-Compiler ist ein 2-Pass-
-Compiler, der die DYNAMO-Programme zunächst in ELAN übersetzt. Der Vorteil
-dieser Methode besteht darin, daß es möglich ist, übersetzte Programme unabhängig
-vom DYNAMO-Compiler zur Ausführung bringen zu können.
-
-Die Notation der im folgenden aufgeführten ELAN-Prozeduren des Compilers ent­
-spricht der in den EUMEL-Handbüchern üblichen Prozedurkopf-Schreibweise.
-
-Als Beispiel:
-
-
- dynamo ("dyn.grasshasenfuchs")
-
-
-ein Beispiel für den Aufruf der Prozedur mit der Prozedurkopf-Schreibweise
-
- PROC dynamo (TEXT CONST filename)
-
-auf der Kommando-Ebene des Betriebssystems EUMEL.
-
-Der Prozedur 'dynamo' wird beim Aufruf der Dateiname (TEXT) 'filename' übergeben
-und dadurch der Compiler auf die Datei mit dem Namen 'filename' angewendet.
-
-
-
-
-#ib#3.1. Benutzung des DYNAMO-Compiler#ie#
-
-
-
-Um ein DYNAMO-Programm zu Übersetzen, gibt es grundsätzlich zwei Möglichkei­
-ten. Erst einmal kann man ein DYNAMO-Programm in ein ELAN-Programm um­
-wandeln, jedoch ohne es dabei zur Ausführung zu bringen. Dieses ELAN-Programm
-kann man nun unabhängig vom eingentlichen Compiler starten. Die zweite, wohl öfter
-angewendete Methode ist, ein DYNAMO-Programm in ein ELAN-Programm zu
-compilieren, wobei es danach direkt ausgeführt wird. Ob danach ein ELAN-
-Programm zur Verfügung stehen soll, kann der Benutzer selbst entscheiden.
-
-
-PROC dynamo
-
- Zweck: Aufruf des DYNAMO-Compilers mit 'quelldatei' = 'last param', d.h. das
- zu übersetzende Programm steht in der zuletzt bearbeiteten Datei.
-
-
-PROC dynamo (TEXT CONST quelldatei)
-
- Zweck: Ruft den DYNAMO-Compiler für die Datei 'quelldatei' auf. Anmerkung:
- Gleichbedeutend mit 'dynamo (quelltext, quelltext + ".elan", TRUE)', s.
- nächste Prozedur.
-
- Beispiel:
-
-
- dynamo ("dyn.grashasenfuchs")
-
-
- Der DYNAMO-Compiler wird auf die Datei "dyn.grashasenfuchs" ange­
- wendet.
-
-
-PROC dynamo (TEXT CONST quelldatei, zieldatei,
- BOOL CONST pass2 ausfuehren)
-
- Zweck: Diese Prozedur startet den DYNAMO-Compiler. 'quelldatei' gibt den
- Namen der Datei an, in welcher der DYNAMO-Quelltext enthalten ist,
- 'zieldatei' ist der Name der Datei, die das erzeugte ELAN-Programm
- beinhalten soll. Wenn 'pass2 ausfuehren' = TRUE, dann wird dieses auch
- durch den ELAN-Compiler weiterverarbeitet (das Programm wird zur
- Ausführung gebracht).
-
- Beispiel:
-
-
- dynamo ("dyn.grashasenfuchs",
- "grashasenfuchs.elanprogramm", FALSE)
-
-
- Im obigen Beispiel wird der in der Datei "dyn.grashasenfuchs" enthaltene
- DYNAMO-Quelltext in die Datei "grashasenfuchs.elanprogramm" als
- ELAN-Programm geschrieben. Das ELAN-Programm wird nicht ausge­
- führt.
-
-
-PROC erase (BOOL CONST erase option)
-
- Zweck: Wenn 'erase option' = TRUE, so werden die erzeugten ELAN-Programme
- nach Beendigung der Ausführung gelöscht, bei 'erase option' = FALSE
- bleiben sie erhalten (Voreinstellung: 'erase option' = FALSE).
-
-
-PROC error listing (TEXT CONST fehlerdatei)
-
- Zweck: Falls gewünscht ist, die Fehlermeldungen, die ggf. beim Übersetzen ein­
- treten, auch in eine Datei zu schreiben, so können Sie hier unter 'fehler­
- datei' einen Dateinamen angeben. Bei der Angabe von "" wird die Umlei­
- tung in die Datei ausgeschaltet werden (Voreingestellt ist 'fehlerdatei' =
- "").
-
-
-PROC graphic (BOOL CONST graphic option)
-
- Zweck: Mit dieser Prozedur läßt sich einstellen, ob bei der DYNAMO-Anweisung
- PLOT die hochauflösende Grafik ('graphic option' = TRUE) oder die zei­
- chenorientierte Grafik ('grafik option' = FALSE) verwendet werden soll. Die
- Voreinstellung wird bei der Installation des Compilers erfragt.
-
-
-PROC protokoll (BOOL CONST protokoll option)
-
- Zweck: Bei 'protokoll option' = TRUE werden alle Textausgaben, die bei der
- Laufzeit des DYNAMO-Programmes auftreten, nicht nur auf dem Bild­
- schirm dargestellt, sondern auch in eine Datei mit dem Namen "dyn.out"
- protokolliert (voreingestellt ist 'protokoll option' = FALSE). Die Datei
- "dyn.out" enthält auch Seitenvorschubbefehle ('\#page\#') und sollte nur mit
- einem EUMEL-Printer ausgedruckt werden.
-
-
-
-
-#ib#3.2. Abweichungen gegenüber dem
- Sprachstandard#ie#
-
-
-
- - Die Länge der Namen ist nicht auf 7 Zeichen festgelegt, sondern praktisch be­
- liebig (32000). Dies ist eine Erweiterung; wer seine Programme auch auf ande­
- ren DYNAMO-Compilern laufen lassen will, sollte sich aber auf 7 Zeichen be­
- schränken.
-
- - Zahlen werden intern mit einer Mantisse von 13 Stellen abgespeichert, von denen
- nur die ersten 7 bei der Ausgabe dargestellt werden. Die größte darstellbare Zahl
- ist daher 9.999999999999e126.
-
- - Die maximale Anzahl der Gleichungen ist auf 950 festgelegt.
-
- - Der Compiler akzeptiert aus Gründen der besseren Lesbarkeit auch Programme,
- die in Kleinschrift geschrieben sind. Dabei ist es sinnvoll, die Quellprogramme
- konsistent zu halten (d.h. Groß- und Kleinschrift nicht zu vermischen). Man
- sollte grundsätzlich Kleinschrift vorziehen, da diese vom Compiler auch effizienter
- verarbeitet werden kann.
-
- - Quellprogramme dürfen eine beliebige Zahl von Leerzeilen enthalten. X - Befeh­
- le (Fortschreibungszeilen) werden davon nicht beeinflußt.
-
- - In der augenblicklichen Version 3.3 des Compilers gelten folgende Einschränkun­
- gen :
-
- 1. Bei der Verarbeitung von Array-Gleichungen werden Compilerseitig keine
- Semantik-Überprüfungen auf eventuell unzureichende Initialisierung oder
- Überlappung (d.h. mehrfaches Setzen desselben Elements) durchgeführt.
- Defaultmäßig bekommen alle Elemente einer Array-Gleichung bei der Initiali­
- sierung den Wert '0.0' zugewiesen.
-
- 2. Die maximale Größe von Tables und Array-Gleichungen ist durch Verwen­
- dung des Vector-Pakets auf 4000 Elemente festgelegt. Da pro Table-Ele­
- ment aber zur Zeit eine Zeile im Zielprogramm generiert wird, sollte man dies
- besser nicht ausnutzen.
-
- 3. Supplementary-Gleichungen werden aus Kompatibilitäts-Gründen korrekt
- übersetzt, aber sonst wie Auxiliary-Gleichungen behandelt.
-
- 4. Print ('prtper')- und Plotperiode ('pltper') werden nur als Konstanten verarbei­
- tet. Falls Gleichungen für 'prtper' oder 'pltper' angegeben werden, so bewirken
- diese keine Veränderung.
-
- 5. Array-Gleichungen dürfen nicht mehr als eine Dimension besitzen.
-
- 6. Für Gleichungen, die Makro-Aufrufe enthalten, sollten Initialisierungs (N)-
- Gleichungen angegeben werden.
-
-
-
-#ib#3.3. Das DYNAMO Runtime-System#ie#
-
-
-
-Nach erfolgreicher Übersetzung wird vom Zielprogramm das Runtime-System aufge­
-rufen. In diesem Modus (das DYNAMO-Runtime-System meldet sich mit "dynamo
-runtime system :") ist es möglich, Konstanten zu ändern und DynamoProgramme zur
-Ausführung zu bringen.
-
-Im DYNAMO-Runtime-System stehen folgende Kommandos zur Verfügung (näheres
-zur Notation siehe Kapitel 4, S. #to page ("Anweisungen und Funktionen")#).
-
-
- run
-
- Zweck: Ausführen des übersetzten Programms
-
-
- run <name>
-
- Zweck: Ausführen des übersetzten Programms und retten des Konstantendaten­
- raums in des Datenraum mit dem Namen "<name>.const". Existiert der
- Datenraum bereits, werden die Konstanten aus dem Datenraum in den
- Lauf übernommen. Somit ermöglicht der Compiler, Konstantenwerte aus
- einem früheren Lauf wieder zu verwenden.
-
-
- c <Konstantenname>=Wert [/<Konstantenname>=Wert [...]]
-
- Zweck: Änderung einer oder mehrerer Konstanten
-
-
- ?
-
- Zweck: Anzeigen der Konstanten und ihrer Werte
-
-
- quit
-
- Zweck: Verlassen des Runtime-Systems
-
-
- help
-
- Zweck: Zeigt eine kurze Erklärung
-
-
-Bei PRINT- und PLOT-Ausgaben sind folgende Kommandos möglich:
-
- + Nächster Bildschirm
- o (Off), keine Unterbrechung der Ausgabe (nicht möglich bei hochauflösen­
- der Grafik)
- e (End), Zurück zum Runtime System
- p Phasendiagramm (nur bei hochauflösender Grafik möglich)
-
-
-
-#ib#3.4. Fehlermeldungen des
- DYNAMO-Compilers#ie#
-
-
-
-Falls der Compiler einen Fehler im DYNAMO-Programm entdeckt, gibt er eine Feh­
-lermeldung nach dem folgenden Muster aus:
-"Fehler in Zeile <zeilennummer> bei >> <symbol> << : <fehlertext>.
-
-Im folgenden sind alle Fehlermeldungen und Möglichkeiten zur Abhilfe aufgelistet,
-sofern diese nicht klar ersichtlich sind:
-
- 1 GLEICHUNG DOPPELT DEFINIERT
-
- 2 DOPPELTE INITIALISIERUNG
-
- 3 FALSCHER ZEILENTYP
- -> Erlaubt sind : a, c, l, n, r, s, print, plot, note, spec, *, x, macro, mend,
- for, noise, run.
-
- 4 VERSCHACHTELTE MAKRO-DEFINITION
- -> 'mend' - Befehl fehlt.
-
- 5 MAKRO-NAME ERWARTET
-
- 6 '(' ERWARTET
-
- 7 FORMALER PARAMETER ERWARTET
-
- 8 ')' NACH PARAMETERLISTE ERWARTET
-
- 9 BEI AUXILIARIES NUR SUBSKRIPTION MIT '.K' ERLAUBT
-
-10 BEI KONSTANTEN-DEFINITION NAME ERWARTET
-
-11 BEI LEVELS NUR SUBSKRIPTION MIT '.K' ERLAUBT
-
-12 BEI RATES NUR SUBSKRIPTTION MIT '.KL' ERLAUBT
-
-13 BEI TABLE-DEFINITIONEN KEINE SUBSKRIPTION ERLAUBT
-
-14 X - BEFEHL HIER NICHT ERLAUBT
-
-15 BEI FOR-DEFINITION NAME ERWARTET
-
-16 '=' NACH FOR-VARIABLE ERWARTET
-
-17 BEREICHSANGABE ERWARTET
-
-18 ',' ERWARTET
-
-19 LOKALE GLEICHUNG NUR IN MAKRO ERLAUBT
-
-20 BEI DEFINITION NAME ERWARTET
-
-21 '=' ERWARTET
-
-22 INDEX NICHT KORREKT
- -> Als Index ist nur erlaubt : <for variable> !,
- <add op> <ganze zahl>!.
- <add op> ::= "+"; "-".
-
-23 ')' NACH INDIZIERUNG ERWARTET
-
-24 PRTPER NICHT DEFINIERT
- -> Wenn das Programm einen Print-Befehl enthält, muß 'prtper' (Printperiode)
- als Konstante definiert werden.
-
-25 PLTPER NICHT DEFINIERT
- -> Wenn das Programm einen Plot-Befehl enthält, muß 'pltper' (Plotperiode)
- als Konstante definiert werden.
-
-26 '/' ODER ',' BEI PLOT ERWARTET
-
-27 NAME ALS PLOTPARAMETER ERWARTET
-
-28 DOPPELTE SCALE - ANGABE IN EINER GRUPPE
- -> Wenn mehrere Plotparameter mit ',' getrennt werden (also die gleiche Ska­
- lierung erhalten), dürfen nicht mehrere feste Skalierungen angegeben wer­
- den.
-
-29 ERSTE SCALE - ANGABE ERWARTET
-
-30 ZWEITE SCALE - ANGABE ERWARTET
-
-31 ')' NACH SCALE - ANGABE FEHLT
-
-32 PRINTPARAMETER NICHT DEFINIERT
-
-33 PRINTPARAMETER ERWARTET
-
-34 TIME DARF NUR INITIALISIERT WERDEN
-
-35 DT NICHT DEFINIERT
-
-36 LENGTH NICHT DEFINIERT
-
-37 BEI KONSTANTEN - DEFINITION ZAHL ERWARTET
-
-38 BEI INITIALISIERUNG KONSTANTE ERWARTET
-
-39 LEVELS MUESSEN INITIALISIERT WERDEN
-
-40 KONSTANTE BEI TABLE ERWARTET
-
-41 '/' ODER "," ERWARTET
-
-42 TABLE - DEFINITION OHNE BENUTZUNG
-
-43 SIMULTANE GLEICHUNGEN
- -> Bei dem Versuch, A, R, oder N - Gleichungen zu sortieren, trat eine
- direkte oder indirekte Rekursion auf.
-
-44 FAKTOR ERWARTET
- -> Erwartet : <zahl>;
- <funktions aufruf>;
- <macro aufruf>;
- <gleichungs name>;
- '(', <ausdruck>, ')';
- <monadischer operator>, <faktor>.
- <monadischer operator> ::= '+'; '-'.
-
-45 TIME MUSS MIT '.J' ODER '.K' SUBSKRIBIERT WERDEN
-
-46 SYMBOL NICHT DEFINIERT
-
-47 FUNKTION NICHT DEFINIERT
-
-48 UNZULAESSIGE INDIZIERUNG
- -> Die Indices auf beiden Seiten der Gleichung müssen immer gleich sein.
-
-49 FALSCHE PARAMETERANZAHL
-
-50 FALSCHES TRENNSYMBOL ZWISCHEN PARAMETERN
-
-51 ALS PARAMETER TABLE ERWARTET
-
-52 FALSCHER PARAMETER IN TABLEFUNKTION
-
-53 ZU VIELE AKTUELLE PARAMETER
-
-54 ')' NACH MAKROAUFRUF FEHLT
-
-55 REKURSIVER MAKROAUFRUF
-
-56 BEI N - GLEICHUNG KEINE SUBSKRIPTION ERLAUBT
-
-57 FALSCHE SUBSKRIPTION IN AUXILIARY - GLEICHUNG
-
-58 ')' ERWARTET
-
-59 FALSCHE SUBSKRIPTION IN LEVEL - GLEICHUNG
-
-60 FALSCHE SUBSKRIPTION IN RATE - GLEICHUNG
-
-61 FOR - VARIABLE NICHT DEFINIERT
- -> Eine FOR - Variable muß vor der ersten Benutzung definiert werden.
-
-62 KONSTANTE ERWARTET
-
-63 FALSCHES REAL - FORMAT
- -> Exponent fehlt
-
-64 GLOBALE GLEICHUNG IN MACRO NICHT ERLAUBT
-
-65 DOPPELTE DEFINITION BEI MEHRFACHEM MAKROAFRUF
-
-66 ALS NOISE - PARAMETER ZAHL ERWARTET
-#page#
-
-#ib#4. Anweisungen und Funktionen des
- EUMEL-DYNAMO-Compilers#ie#
-#goal page ("Anweisungen und Funktionen")#
-
-
-Dieses Kapitel gibt eine alphabetische Übersicht über die im EUMEL-DYNAMO-
-Compiler realisierten Anweisungen und Funktionen (wertliefernde Algorithmen).
-
-Die Beschreibung der Anweisungen und Funktionen ist nach der DYNAMO-
-Syntaxregel angegeben, wobei folgende Zeichen mit besonderer Bedeutung verwendet
-werden:
-
- [] optionale Angabe
- [...] beliebig häufige Wiederholung der letzten optionalen Angabe
- < > in spitzen Klammern stehende Namen sind Variablen- bzw. Konstan­
- tennamen
- <Name> steht für einen beliebigen Bezeichner gemäß der DYNAMO-Syntax
- <Zahl> bezeichnet einen beliebigen Wert (also auch eine Ausdruck)
- {} Alternative Angabe
-
- X DYNAMO Anweisung, kennzeichnet eine Fortsetzungsszeile der
- vorhergegangenen Anweiung (S. #to page ("X")#)
-
-Alle Anweisungen und Funktionen werden nach dem gleichen Schema dargestellt:
-
-
-
-Funktionsname#right#Typ (Funkt. oder Anweisung)
-
-
-Zweck: Schlagwort zur Wirkung
-
-Format: Beschreibung des Formates (spezielle Zeichen s.o.)
-
-Erklärung: kurze Beschreibung der Anweisung/Funktion
-
-Beispiel: Anwendung der Anweisung/Funktion
-
-Programm: Beispielprogramm, in welchem die Anweisung/Funktion angewendet wird.
-
-Referenz: Verweis auf ähnliche oder äquivalente Anweisungen/Funktionen im
- Format '<Funktions- bzw. Anweisungsname>, Seitennummer'.
-
-
-Eine oder mehrere dieser Felder können fehlen (z.B. wenn es keine Referenz oder
-kein Beispielprogramm gibt).
-#page#
-
-
-
-#ib#4.1. Übersicht über die Anweisungen und
- Funktionen#ie#
-
-
-
-#goal page ("A")##ib (2)#A#ie (2)##on ("i")##right#Anweisung#off ("i")#
-
-
-Zweck: Auxiliary-Gleichung (A-Gleichung, Hilfsgleichung)
-
-Format: A <Auxiliary-Name>.K=<Ausdruck>#u##count ("Ausdruck")##e#
-#foot#
-#u##value ("Ausdruck")##e# genaueres über die Definition eines Ausdruckes siehe [1], S. 93
-#end#
-
-Erklärung: Mit Hilfe von Auxiliary-Gleichungen werden Level- und Hilfsgrößen
- (Auxiliaries) zum selben Zeitpunkt verknüpft.
-
-Beispiel: A JM.K=MM.K/MEJ
-
-Programm: "dyn.workfluc"
-
-
-
-#ib (2)#ABS#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Absolutbetrag
-
-Format: ABS(<Zahl>)
-
-Erklärung: Liefert den Absolutbetrag
-
-
- IF <Zahl> >= 0 THEN
- <Zahl>
- ELSE
- - <Zahl>
- END IF
-
-Beispiel: N X=ABS(A*2.0)
-
-
-
-#goal page ("ARCTAN")#ARCTAN#on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Berechnung der trigonometrischen Funktion Arcustangens
-
-Format: ARCTAN(<Zahl>)
-
-Erklärung: Berechnet den Arcustangens von <Zahl>; Ergebnis im Bogenmaß.
-
-Beispiel: N X=ARCTAN(TAN(1.3)) (X = 1.3)
-
-
-Referenz: COSD, S. #to page ("COSD")#
- SIN, S. #to page ("SIN")#
- SIND, S. #to page ("SIND")#
- TAN, S. #to page ("TAN")#
- TAND, S. #to page ("TAND")#
- ARCTAND, S. #to page ("ARCTAN")#
- COS, S. #to page ("COS")#
-
-
-
-#goal page ("ARCTAND")##ib (2)#ARCTAND#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Berechnung der trigonometrischen Funktion Arcustangens
-
-Format: ARCTAND(<Zahl>)
-
-Erklärung: Berechnet den Arcustangens von <Zahl>; Ergebnis im Gradmaß
-
-Beispiel: N X=ARCTAND(TAND(45.0)) (X = 45.0)
-
-
-Referenz: COSD, S. #to page ("COSD")#
- SIN, S. #to page ("SIN")#
- SIND, S. #to page ("SIND")#
- TAN, S. #to page ("TAN")#
- TAND, S. #to page ("TAND")#
- COS, S. #to page ("COS")#
- ARCTAN, S. #to page ("ARCTAND")#
-
-
-
-#goalpage ("C")##ib (2)#C#ie (2)##on ("i")##right#Anweisung#off ("i")#
-
-
-Zweck: Konstantendefinition
-
-Format: C <Name>=<Zahl>
-
-Erklärung: Werte, die während eines Simulationslaufes gleich bleiben, können durch
- die Konstantendefintion benannt werden (s. auch 'c' im Runtime-
- System).
-
-Beispiel: C POPI=30.3
-
-Programm: "dyn.wohnen"
-
-
-
-#goal page ("CLIP")##ib (2)#CLIP#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Wert nach Bedingung
-
-Format: CLIP(<Zahl1>,<Zahl2>,<Zahl3>,<Zahl4>)
-
-Erklärung: Liefert den Wert des ersten Argumentes, wenn das dritte Argument
- größer oder gleich dem vierten Argument ist. Andernfalls wird der Wert
- des zweiten Argumentes geliefert.
-
-
- IF <Zahl3> >= <Zahl4> THEN
- <Zahl1>
- ELSE
- <Zahl2>
- END IF
-
-Beispiel: N X=CLIP(1.0,2.0,3.0,4.0) (X = 2.0)
-
-
-Programm: "dyn.welt/forrester"
-
-Referenz: FIFGE, S. #to page ("FIFGE")# (äquivalente Funktion)
-
-
-
-#goalpage ("COS")#COS#on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Berechnung der trigonometrischen Funktion Cosinus
-
-Format: COS(<Zahl>)
-
-Erklärung: Es wird der Cosinus des Wertes <Zahl>, welcher im Bogenmaß vorlie­
- gen muß, geliefert.
-
-Beispiel: N X=COS(1.6)
-
-Referenz: COSD, S. #to page ("COSD")#
- SIN, S. #to page ("SIN")#
- SIND, S. #to page ("SIND")#
- TAN, S. #to page ("TAN")#
- TAND, S. #to page ("TAND")#
- ARCTAN, S. #to page ("ARCTAN")#
- ARCTAND, S. #to page ("ARCTAND")#
-
-
-
-#goal page ("COSD")##ib (2)#COSD#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Berechnung der trigonometrischen Funktion Cosinus
-
-Format: COSD(<Zahl>)
-
-Erklärung: Es wird der Cosinus des Wertes <Zahl>, welcher im Gradmaß vorliegen
- muß, geliefert.
-
-Beispiel: N X=COSD(33.5)
-
-Referenz: COS, S. #to page ("COS")#
- SIN, S. #to page ("SIN")#
- SIND, S. #to page ("SIND")#
- TAN, S. #to page ("TAN")#
- TAND, S. #to page ("TAND")#
- ARCTAN, S. #to page ("ARCTAN")#
- ARCTAND, S. #to page ("ARCTAND")#
-
-
-
-#goal page ("EXP")##ib (2)#EXP#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Exponentialfunktion zur Basis e
-
-Format: EXP(<Zahl>)
-
-Erklärung: Liefert e#u#<Zahl>#e#
-
-Beispiel: N X=EXP(1.0) (X = 2.71 = e)
-
-
-Referenz: LN, S. #to page ("LN")# (Umkehrfunktion)
-
-
-
-#goal page ("FIFGE")##ib (2)#FIFGE#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Wert nach Bedingung (#on ("u")#f#off ("u")#irst #on ("u")#if#off ("u")# #on ("u")#g#off ("u")#reater or #on ("u")#e#off ("u")#qual)
-
-Format: FIFGE(<Zahl1>,<Zahl2>,<Zahl3>,<Zahl4>)
-
-Erklärung: Liefert den Wert des ersten Argumentes, wenn das dritte Argument
- größer oder gleich dem vierten Argument ist. Andernfalls wird der Wert
- des zweiten Argumentes geliefert.
-
-
- IF <Zahl3> >= <Zahl4> THEN
- <Zahl1>
- ELSE
- <Zahl2>
- END IF
-
-Beispiel: N X=FIFGE(1.0,2.0,3.0,4.0) (X = 2.0)
-
-
-Referenz: CLIP, S. #to page ("CLIP")# (äquivalente Funktion)
-
-
-
-#goal page ("FIFZE")##ib (2)#FIFZE#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Wert nach Bedingung (#on ("u")#f#off ("u")#irst #on ("u")#if#off ("u")# #on ("u")#ze#off ("u")#ro)
-
-Format: FIFZE(<Zahl1>,<Zahl2>,<Zahl3>)
-
-Erklärung: Wenn der Parameter <Zahl3> den Wert 0 hat, so wird <Zahl1>
- geliefert, andernfalls <Zahl2>
-
-
- IF <Zahl3> = 0 THEN
- <Zahl1>
- ELSE
- <Zahl2>
- END IF
-
-Beispiel: N X=FIFZE(1.0,2.0,3.0) (X = 2.0)
-
-
-Referenz: SWITCH, S. #to page ("SWITCH")#
-
-
-
-#goal page ("FLOOR")##ib (2)#FLOOR#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Vorkommastellen
-
-Format: FLOOR(<Zahl>)
-
-Erklärung: Liefert die Vorkommastellen von <Zahl>
-
-Beipiel: N X=FLOOR(3.14) (X = 3.0)
-
-
-Referenz: FRAC, S. #to page ("FRAC")#
-
-
-
-#ib (2)#FOR#ie (2)##on ("i")##right#Anweisung#off ("i")#
-
-
-Zweck: Schleifen-Definition
-
-Format: FOR <Name>=<Zahl1>,<Zahl2>
-
-Erklärung: <Name> bezeichnet eine Schleifenvariable, die von <Zahl1> bis
- <Zahl2> hochgezählt wird. Somit ist es möglich, gleiche Berechnungen
- für die verschiedenen Werte einer Tabelle durchzuführen.
-
-Beispiel: FOR BERECHNUNGSZEITRAUM=1900,2100
-
-
-Programm: "dyn.bev"
-
-
-
-#goal page ("FRAC")##ib (2)#FRAC#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Nachkommastellen
-
-Format: FRAC(<Zahl>)
-
-Erklärung: Liefert die Nachkommastellen von <Zahl>
-
-Beispiel: N X=FRAC(3.14) (X = 0.14)
-
-
-Referenz: FLOOR, S. #to page ("FLOOR")#
-
-
-
-#goal page ("L")##ib (2)#L#ie (2)##on ("i")##right#Anweisung#off ("i")#
-
-
-Zweck: Level-Gleichung
-
-Format: L <Level-Name>.K=<Level-Name>.J+
- <Vergangenheitsausdruck>
-
-Erklärung: Die Level-Gleichung stellt einen gegenwärtigen Wert in Bezug zu
- seinem Wert in der Vergangenheit und seiner Veränderungsrate in der
- bis dahin vergangenen Zeit (Vergangenheitsausdruck s. [1], S. 96).
-
-Beispiel: L HASEN.K=CLIP(HASEN.J+DT*(HGRATE.JK
- X -HSRATE.JK),0,HASEN.J,0)
-
-Programm: "dyn.grashasenfuchs"
-
-
-
-#goal page ("LN")##ib (2)#LN#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Logarithmus-Funktion
-
-Format: LN(<Zahl>)
-
-Erklärung: Berechnet den natürlichen Logarithmus von <Zahl>
-
-Beispiel: N X=LN(1.0) (X = 0.0)
-
-
-Programm: "dyn.wasseröko"
-
-Referenz: LOG2, S. #to page ("LOG2")#
- LOG10, S. #to page ("LOG10")#
- EXP, S. #to page ("EXP")#
-
-
-
-#goal page ("LOG2")##ib (2)#LOG2#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Logarithmus-Funktion
-
-Format: LOG2(<Zahl>)
-
-Erklärung: Berechnet den Logarithmus von <Zahl> zur Basis 2
-
-Beispiel: N X=LOG2(8.0) (X = 3.0)
-
-
-Referenz: LN, S. #to page ("LN")#
- LOG10, S. #to page ("LOG10")#
-
-
-
-#goal page ("LOG10")##ib (2)#LOG10#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Logarithmus-Funktion
-
-Format: LOG10(<Zahl>)
-
-Erklärung: Berechnet den Logarithmus von <Zahl> zur Basis 10
-
-Beispiel: N X=LOG10(100.0) (X = 2.0)
-
-
-Referenz: LOG2, S. #to page ("LOG2")#
- LN, S. #to page ("LN")#
- EXP, S. #to page ("EXP")#
-
-
-
-#goal page ("MACRO")##ib (2)#MACRO#ie (2)##on ("i")##right#Anweisung#off ("i")#
-
-
-Zweck: Macro-Definition
-
-Format: MACRO <Name>(<Ausdruck>[,<Ausdruck>[...]])
-
-Erklärung: Durch die Verwendung der MACRO-Anweisung können Sie einer oder
- mehreren DYNAMO-Gleichungen einen Namen geben (<Name>).
- Macros müssen durch MEND abgeschloßen werden und dürfen #on ("u")#nicht#off ("u")#
- rekursiv aufgerufen werden (vergl. Refinements in ELAN).
-
-Beispiel: MACRO SMOOTH(IN,DEL)
- L SMOOTH.K=SMOOTH.J+DT*(IN.J-SMOOTH.J)/DEL
- N SMOOTH=IN
- MEND
-
-Programm: "dyn.mac" (diese Datei enthält alle bisherigen Makros)
-
-Referenz: MEND, S. #to page ("MEND")#
-
-
-
-#goal page ("MAX")##ib (2)#MAX#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Maximum zweier Größen
-
-Format: MAX(<Zahl1>,<Zahl2>)
-
-Erklärung: Liefert die größere Zahl aus <Zahl1> und <Zahl2>
-
-
- IF <Zahl1> > <Zahl2> THEN
- <Zahl1>
- ELSE
- <Zahl2>
- END IF
-
-Beispiel: N X=MAX(1.0,2.0) (X = 2.0)
-
-
-Referenz: MIN, S. #to page ("MIN")#
-
-
-
-#goal page ("MEND")##ib (2)#MEND#ie (2)##on ("i")##right#Anweisung#off ("i")#
-
-
-Zweck: Macro-Definition
-
-Format: MEND
-
-Erklärung: MEND beendet eine Macro-Definition
-
-Beispiel: MACRO SMOOTH(IN,DEL)
- L SMOOTH.K=SMOOTH.J+DT*(IN.J-SMOOTH.J)
- X /DEL
- N SMOOTH=IN
- MEND
-
-Programm: "dyn.mac" (diese Datei enthält alle bisherigen Makros)
-
-Referenz: MACRO, S. #to page ("MACRO")#
-
-
-
-#goal page ("MIN")##ib (2)#MIN#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Minimum zweier Größen
-
-Format: MIN(<Zahl1>,<Zahl2>)
-
-Erklärung: Liefert die kleinere Zahl aus <Zahl1> und <Zahl2>
-
-Beispiel: N X=MIN(1.0,2.0) (X = 1.0)
-
-
-Programm: "dyn.forst7"
-
-Referenz: MAX, S. #to page ("MAX")#
-
-
-
-#goal page ("N")##ib (2)#N#ie (2)##on ("i")##right#Anweisung#off ("i")#
-
-
-Zweck: Initialisierungsgleichung
-
-Format: N <Name>=<Zahl>
-
-Erklärung: Initialisert eine Variable mit dem Bezeichner <Name> auf den Wert
- <Zahl>, d.h. es wird ihr ein Startwert zugewiesen.
-
-Beispiel: N X=1900
-
-Programm: "dyn.grashasenfuchs"
-
-
-
-#goal page ("NOISE")##ib (2)#NOISE#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Pseudo-Zufallszahlen-Generator
-
-Format: NOISE(<Zahl>)
-
-Erklärung: Diese Funktion liefert eine Pseudo-Zufallszahl zwischen -0.5 und +0.5
- und setzt einen neuen Startwert für den Generator fest. Der Parameter
- <Zahl> wird nicht ausgewertet.
-
-Beispiel: N X=NOISE(0)
-
-Referenz: NORMRN, S. #to page ("NORMRN")#
-
-
-
-#goal page ("NORMRN")##ib (2)#NORMRN#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Pseudo-Zufallszahlen-Generator
-
-Format: NORM(<Zahl1>,<Zahl2>)
-
-Erklärung: Liefert einen Wert zwischen <Zahl1> - <Zahl2> * 2.4 und <Zahl1>
- + <Zahl2> * 2.4.
-
-Beispiel: N X=NORM(1.0,10.0)
-
-Referenz: NOISE, S. #to page ("NOISE")#
-
-
-
-#ib (2)#NOTE#ie (2)##on ("i")##right#Anweisung#off ("i")#
-
-
-Zweck: Kommentar
-
-Format: NOTE <Kommentarzeile>
-
-Erklärung: Die Zeilen, die mit NOTE gekennzeichnet sind, werden vom Compiler als
- Kommentarzeilen erkannt und nicht beachtet. NOTE-Zeilen haben nur
- dokumentierenden Charakter und sind für den Programmlauf ohne jede
- Bedeutung. Dennoch sollte man, wenn immer möglich, Kommentare in
- sein DYNAMO-Programm einfügen, denn sie sind in DYNAMO an­
- nähernd die einzige Möglichkeit, ein Programm lesbar zu machen, damit
- es auch nach längerer Zeit noch korrigiert werden kann.
-
-Beispiel: NOTE Dies ist eine Kommentarzeile
-
-Programm: "dyn.welt/forrester"
-
-
-
-#goal page ("PLOT")##ib (2)#PLOT#ie (2)##on ("i")##right#Anweisung#off ("i")#
-
-
-Zweck: Darstellen der Ergebnisse in Diagrammform
-
-Format: PLOT <Name>[=<Druckzeichen>][(<Skalenbegin>,
- <Skalenende>)][/...][,...]
-
-Erklärung: Durch diese Anweisung werden die Größen nach PLTPER Zeiteinheiten
- in einem Diagramm ausgegeben. Die Angabe eines Druckzeichens ist
- nur bei zeichenorientierten Grafik erforderlich, denn bei hochauflösender
- Grafik werden die Graphen der verschiedenen Größen durch unterschied­
- liche Linientypen gezeichnet; fehlt bei der zeichenorientierten Grafik das
- Druckzeichen, so werden die Graphen durch die Zahlen von 0...9 darge­
- stellt. Bei "/" werden verschiedene, bei "," gleiche Skalen benutzt.
-
-Beispiel: PLOT GRAS=G(995,1005)/HASEN=H(85,115)
- X /FUECHS=F(15,35)
-
-Programm: "dyn.grashasenfuchs"
-
-Referenz: PRINT, S. #to page ("PRINT")#
-
-
-
-#goal page ("POWER")##ib (2)#POWER#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Potenzfunktion
-
-Format: POWER(<Zahl1>,<Zahl2>)
-
-Erklärung: Liefert <Zahl1>#u#<Zahl2>#e#
-
-Beipiel: N X=POWER(2, 2) (X = 4)
-
-
-Referenz: SQRT, S. #to page ("SQRT")#
-
-
-
-#goal page ("PRINT")##ib (2)#PRINT#ie (2)##on ("i")##right#Anweisung#off ("i")#
-
-
-Zweck: Darstellung der Ergebnisse in Tabellenform
-
-Format: PRINT <Name>[/...][,...]
-
-Erklärung: Durch diese Anweisung werden die Werte (<Name>) nach PRTPER
- Zeiteinheiten in einer Tabelle ausgegeben. Die Ausgabe kann umgeleitet
- werden (s. 'protokoll').
-
-Beispiel: PRINT GBEV,BEV(1),BEV(40),BEV(60),BEV(63)
- X ,BEV(65),ZBEV,PRENT
-
-Programm: "dyn.bev"
-
-Referenz: PLOT, S. #to page ("PLOT")#
-
-
-
-#goal page ("R")##ib (2)#R#ie (2)##on ("i")##right#Anweisung#off ("i")#
-
-
-Zweck: Rate-Gleichung
-
-Format: R<Rate-Name>.KL=<Gegenwartsausdruck>
-
-Erklärung: Eine Rate-Gleichung stellt die Veränderungsrate in Bezug zu den aktu­
- ellen Level-Größen.
-
-Beispiel: R FGRATE.KL=FGK*HASEN*FUECHS.K
-
-
-Programm: "dyn.grashasenfuchs"
-
-Referenz: A, S. #to page ("A")#
- C, S. #to page ("C")#
- L, S. #to page ("L")#
-
-
-
-#ib (2)#RAMP#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Wert nach Bedingung
-
-Format: RAMP(<Zahl1>,<Zahl2>)
-
-Erklärung: Wenn TIME kleiner <Zahl2>, dann liefert RAMP 0, andernfalls wird
- <Zahl1> * (TIME - <Zahl2>) geliefert.
-
-
- IF TIME < <Zahl2> THEN
- 0
- ELSE
- <Zahl1> * (TIME - <Zahl2>)
- END IF
-
-
-
-#goal page ("RUN")##ib (2)#RUN#ie (2)##on ("i")##right#Anweisung#off ("i")#
-
-
-Zweck: Ãœberschrift
-
-Format: RUN <Ãœberschrift>
-
-Erklärung: Gibt dem aktuellen Lauf eine Überschrift. Gleichzeitig ist
- "<Überschrift>.const" der Name eines Datenraums, in dem die Kon­
- stanten dieses Laufs aufgehoben werden (s. 'run' im Runtime-System).
-
-Beispiel: RUN Ãœberschrift
-
-Referenz: *, S. #to page ("*")#
-
-
-
-#ib (2)#S#ie (2)##on ("i")##right#Anweisung#off ("i")#
-
-
-Zweck: Supplementary-Gleichung
-
-Format: S <Name>.K=<Vergangenheitsausdruck>
-
-Erklärung: Gleichungen für Hilfsgrößen werden durch Supplementary-Gleichungen
- ausgedrückt.
-
-Beispiel: S SCHADSTOFFVERHÄLTNIS.K=COZWEI.K/OZWEI.K
-
-
-
-
-#ib (2)#SCLPRD#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Skalarprodukt
-
-Format: SCLPRD(<Tabelle1>,<Zahl1>,<Zahl2>,<Tabelle2>,<Zahl3>)
-
-Erklärung: Liefert das Skalarprokukt der Tabellen <Tabelle1> und <Tabelle2>,
- wobei <Zahl1> und <Zahl2> den Ausschnitt aus der ersten Tabelle
- angeben und <Zahl3> den Startindex für den Vektor in der zweiten
- Tabelle angibt.
-
-Beispiel: GB.K=SCLPRD(BEV.K,15,44,GR,1)/2
-
-
-Programm: "dyn.bev"
-
-
-
-#goal page ("SIN")##ib (2)#SIN#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Berechnung der trigonometrischen Funktion Sinus
-
-Format: SIN(<Zahl>)
-
-Erklärung: Berechnet den Sinus von <Zahl>, welche im Bogenmaß angegeben
- wird.
-
-Beispiel: N X=SIN(0.5)
-
-Referenz: COS, S. #to page ("COS")#
- COSD, S. #to page ("COSD")#
- SIND, S. #to page ("SIND")#
- TAN, S. #to page ("TAN")#
- TAND, S. #to page ("TAND")#
- ARCTAN, S. #to page ("ARCTAN")#
- ARCTAND, S. #to page ("ARCTAND")#
-
-
-
-#goal page ("SIND")##ib (2)#SIND#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Berechnung der trigonometrischen Funktion Sinus
-
-Format: SIND(<Zahl>)
-
-Erklärung: Berechnet den Sinus von <Zahl>, welche im Gradmaß angegeben wird.
-
-Beispiel: N X=SIND(45.0)
-
-Referenz: COS, S. #to page ("COS")#
- SIN, S. #to page ("SIN")#
- COSD, S. #to page ("COSD")#
- TAN, S. #to page ("TAN")#
- TAND, S. #to page ("TAND")#
- ARCTAN, S. #to page ("ARCTAN")#
- ARCTAND, S. #to page ("ARCTAND")#
-
-
-
-#ib (2)#SPEC#ie (2)##on ("i")##right#Anweisung#off ("i")#
-
-
-Zweck: Lauf-Anweisung
-
- DT=<Zahl1>
-Format: SPEC { LENGTH=<Zahl2> }[/...]
- PLTPER=<Zahl3>
- PRTPER=<Zahl4>
-
-Erklärung: Durch die Lauf-Anweisung werden die Systemkonstanten festgesetzt.
- Sie darf pro Lauf nur einmal benutzt werden.
-
-Beispiel: SPEC DT=1/PLTPER=1/PRTPER=1/LENGTH=2000
-
-
-Referenz: C, S. #to page ("C")# (SPEC kann durch C-Def. ersetzt werden)
-
-
-
-#goal page ("SQRT")##ib (2)#SQRT#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Quadratwurzel
-
-Format: SQRT(<Zahl>)
-
-Erklärung: Berechnet die Quadratwurzel aus <Zahl>
-
-Beispiel: N X=SQRT(4.0) (X = 2.0)
-
-
-Referenz: POWER, S. #to page ("POWER")#
-
-
-
-#ib (2)#STEP#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-Zweck: Wert nach Bedingung
-
-Format: STEP(<Zahl1>,<Zahl2>)
-
-Erklärung: Ist TIME kleiner <Zahl2>, so wird 0 geliefert, ansonsten <Zahl1>
-
-
- IF TIME < <Zahl2> THEN
- 0.0
- ELSE
- <Zahl1>
- END IF
-
-Beispiel: N X=STEP(12.0,12.0)
-
-
-
-#goal page ("SUM")##ib (2)#SUM#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Summierung einer Tabelle
-
-Format: SUM(<Tabelle>)
-
-Erklärung: Liefert die Summe der Einträge in einer Tabelle
-
-Beispiel: A GESAMTBEV.K=SUM(BEV.K)
-
-Programm: "dyn.bev"
-
-Referenz: SUMV, S. #to page ("SUMV")#
-
-
-
-#goal page ("SUMV")##ib (2)#SUMV#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Summierung einer Tabelle
-
-Format: SUMV(<Tabelle>,<Zahl1>,<Zahl2>)
-
-Erklärung: Summierung der Einträge in der Tabelle von Element <Zahl1> bis
- Element <Zahl2>
-
-Beispiel: A ZBEV.K=SUMV(BEV.K,16,59) Teilbevölkerung
-
-
-Programm: "dyn.bev"
-
-Referenz: SUM, S. #to page ("SUM")#
-
-
-
-#goal page ("SWITCH")##ib (2)#SWITCH#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Wert nach Bedingung
-
-Format: SWITCH(<Zahl1>,<Zahl2>,<Zahl3>)
-
-Erklärung: Wenn der Parameter <Zahl3> den Wert 0 hat, so wird <Zahl1>
- geliefert, andernfalls <Zahl2> (gleichbedeutend mit FIFZE).
-
-
- IF <Zahl3> = 0 THEN
- <Zahl1>
- ELSE
- <Zahl2>
- END IF
-
-Beispiel: N X=SWITCH(1.0,2.0,3.0) (X = 2.0)
-
-
-Referenz: FIFZE, S. #to page ("FIFZE")#
-
-
-
-#goal page ("T")##ib (2)#T#ie (2)##on ("i")##right#Anweisung#off ("i")#
-
-
-Zweck: Tabellen-Definition
-
-Format: T <Name>=<Zahl1>[/<Zahl2>[....]]
-
-Erklärung: Durch die T-Anweisung wird eine Tabelle definiert, die Elemente wer­
- den durch "/" getrennt hintereinander angegeben.
-
-Beispiel: T TABELLE=1/2/3/4/5/6/8/9/10/11/12
-
-
-Programm: "dyn.bev"
-
-Referenz: TABLE, S. #to page ("TABLE")#
- TABHL, S. #to page ("TABHL")#
-
-
-
-#goal page ("TABHL")##ib (2)#TABHL#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Tabellenfunktion
-
-Format: TABHL(<Tabelle>,<Zahl1>,<Zahl2>,<Zahl3>)
-
-Erklärung: IF <Zahl1> < <Zahl2> THEN
- <Tabelle> (<Zahl2>)
- ELIF <Zahl2> <= <Zahl1> AND <Zahl1> <= <Zahl3> THEN
- TABLE (<Tabelle>, <Zahl1>, <Zahl2>, <Zahl3>)
- ELSE
- <Tabelle> (<Zahl3>)
- END IF
-
-Beispiel: A BRMM.K=TABHL(BRMMT,MSL.K,0,5,1)
-
-
-Programm: "dyn.welt/forrester"
-
-Referenz: T, S. #to page ("T")#
- TABLE, S. #to page ("TABLE")#
-
-
-
-#goal page ("TABLE")##ib (2)#TABLE#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Tabellenfunktion
-
-Format: TABLE(<Tabelle>,<Zahl1>,<Zahl2>,<Zahl3>,<Zahl4>)
-
-Erklärung: Verknüpft die Werte aus <Tabelle> mit <Zahl1>, wobei <Zahl2> den
- ersten und <Zahl3> den letzten Tabelleneintrag angibt. <Zahl4> stellt
- die Schrittweite dar.
-
-Beispiel: T TABELLE=1/2/3/4/5
- A BEISP.K=TABLE(TABELLE,X.K,2,4,1)
-
-Programm: "dyn.welt/forrester"
-
-Referenz: T, S. #to page ("T")#
- TABHL, S. #to page ("TABHL")#
-
-
-
-#goal page ("TAN")##ib (2)#TAN#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Berechnung der trigonometrischen Funktion Tangens
-
-Format: TAN(<Zahl>)
-
-Erklärung: Berechnet den Tangens von <Zahl>, welche im Bogenmaß angegeben
- wird.
-
-Beispiel: N X=TAN(0.5)
-
-Referenz: COS, S. #to page ("COS")#
- SIN, S. #to page ("SIN")#
- COSD, S. #to page ("COSD")#
- SIND, S. #to page ("TAN")#
- TAND, S. #to page ("TAND")#
- ARCTAN, S. #to page ("ARCTAN")#
- ARCTAND, S. #to page ("ARCTAND")#
-
-
-
-#goal page ("TAND")##ib (2)#TAND#ie (2)##on ("i")##right#Funktion#off ("i")#
-
-
-Zweck: Berechnung der trigonometrischen Funktion Tangens
-
-Format: TAND(<Zahl>)
-
-Erklärung: Berechnet den Tangens von <Zahl>, welche im Gradmaß angegeben
- wird.
-
-Beispiel: N X=TAND(45.0)
-
-Referenz: COS, S. #to page ("COS")#
- SIN, S. #to page ("SIN")#
- COSD, S. #to page ("COSD")#
- TAN, S. #to page ("TAN")#
- SIND, S. #to page ("SIND")#
- ARCTAN, S. #to page ("ARCTAN")#
- ARCTAND, S. #to page ("ARCTAND")#
-
-
-
-#goalpage ("X")##ib (2)#X#ie (2)##on ("i")##right#Anweisung#off ("i")#
-
-
-Zweck: Fortsetzungszeile
-
-Format: X <Fortsetzungszeile>
-
-Erklärung: Eine in der vorangegangenen Zeile nicht beendete Anweisung wird nach
- einer X-Anweisung fortgesetzt (Es können beliebig viele X-Anweisun­
- gen nacheinander folgen).
-
-Beispiel: T TABELLE=1/2/3/4/5/6/7/8/9/10/11/12/13/14
- X /15/16/17/18/19
-
-Programm: "dyn.bev"
-
-
-
-#goal page ("*")##ib (2)#*#ie (2)##on ("i")##right#Anweisung#off ("i")#
-
-
-Zweck: Ãœberschrift
-
-Format: * <Ãœberschrift>
-
-Erklärung: Gibt dem aktuellen Lauf eine Überschrift
-
-Beispiel: * Ãœberschrift
-
-Referenz: RUN, S. #to page ("RUN")#
-#page#
-
-#ib#5. Makros in DYNAMO#ie#
-
-
-
-
-Der DYNAMO-Compiler bietet die Möglichkeit, benutzereigene Funktionen zu definie­
-ren. Makros werden ähnlich wie Refinements in ELAN in das DYNAMO-Programm
-eingesetzt. Beim EUMEL-DYNAMO-Compiler werden mit "zz" beginnende Namen
-generiert, so daß Sie es vermeiden sollten, eigene Namen mit "zz" beginnen zu
-lassen. Weiterhin sollte man als Namen der aktuellen Parameter nicht die Namen der
-formellen Parameter verwenden.
-
-Folgende Makros werden standardmäßig vom DYNAMO-Compiler zur Verfügung
-gestellt:
-
- macro delay1 (in, del) Verzögerung erster Ordnung
-
- macro delay3 (in, del) Verzögerung dritter Ordnung
- Material
-
- macro delay3p (in, del, ppl) Verzögerung dritter Ordnung mit
- Pipeline
-
- macro delinf3 (in, del) Verzögerung dritter Ordnung für
- Information
-
- macro smooth (in, del) Verzögerung erster Ordnung für
- Information
-
-
-
-
-#ib#5.1. Insertieren von Makros#ie#
-
-
-
-
-Makros werden durch folgende Prozedur in die Compilertabelle eingetragen:
-
-
-PROC insert macro (TEXT CONST filename):
-
- Zweck: Fügt die in der Datei 'filename' enthaltenen Makros in die Makrotabelle ein.
- Die Datei sollte zweckmäßigerweise nur Makrodefinitionen enthalten. Es ist
- - im Gegensatz zu normalen DYNAMO-Programmen - nicht nötig, die
- Systemkonstanten zu definieren (die Standard-Makros sind in der Datei
- "dyn.mac" enthalten; diese Datei kann beliebig ergänzt werden).
-
-
-
-
-#ib#5.2. Aufbau eines Makros#ie#
-
-
-
-
-Makros beginnen in DYNAMO immer mit der Anweisung MACRO (s. auch Seite #to page ("MACRO")#)
-und enden mit MEND (s. Seite #to page ("MEND")#). Dazwischen steht ein Makrorumpf, bestehend
-aus einer oder mehreren DYNAMO-Gleichungen. Beim Makroaufruf können, soweit
-vorher definiert, Parameter angegeben werden, jedoch rekursiv aufrufen kann man
-Makros nicht.
-
-Beispiel: MACRO SMOOTH (IN, DEL)
- L SMOOTH.K = SMOOTH.J + DT * (IN.J - SMOOTH.J)
- X /DEL
- N SMOOTH = IN
- MEND
-
-Lokale Variablen in Makros beginnen mit einem $-Zeichen. Der Makro-Expandierer
-ersetzt das $-Zeichen durch "zz" gefolgt von einer Zahl. Aus diesem Grund sollen
-eigene Namen nicht mit "zz" beginnen.
-
-Falls Sie eine Fehlermeldung bekommen, die sich auf einen mit "zz" beginnenden
-Namen bezieht, sollten Sie den Fehler in dem entsprechenden Makro suchen.
-
-#on ("b")#
-Achtung: #off ("b")#Makros sollten nur von fortgeschrittenden DYNAMO-Programmieren
- verwendet werden, da Makros Eigenschaften von Refinements (textuelle
- Ersetzung) und Prozeduren (Parameterübergabe) vereinigen. Der daraus
- folgende Effekt ist nicht ganz einfach zu durchschauen.
-#page#
-
-
-
-#ib#6. Erweiterung des Sprachumfangs#ie#
-
-
-
-
-Während Makros in DYNAMO geschrieben werden, ist es ferner möglich, die Menge
-der Funktionen mittels der Sprache ELAN zu erweitern.
-
-Hierbei geht man wie folgt vor:
-
- 1. Schreiben einer Funktion in ELAN (näheres siehe unten)
-
- 2. Einbinden der Funktion in die Tabellen des DYNAMO-Compilers
-
- 2.1. Einschreiben des Namens der Funktion, gefolgt von den Typen der Ein­
- gabeparameter in die bestehende Datei "dyn.std", wobei folgende Typen
- existieren:
-
- r real (Datentyp REAL)
- t table (Datentyp TAB)
-
- Abgeschlossen wird die "dyn.std"-Datei durch die Zeichensequenz "/*".
-
- Beispiele:
-
- power rr table trrrr /*
-
-
- 2.2. Laden der Funktion(en) mittels der Prozedur 'init std ("dyn.std")'
-
-
-Eine zur Einbindung in den DYNAMO-Compiler vorgesehene ELAN-Funktion wird
-unter Beachtung gewisser Regeln erstellt:
-
- 1. Die deklarierten ELAN-Prozeduren dürfen nur Parameter vom Typ REAL oder
- TAB besitzen oder gänzlich ohne Parameter sein.
-
- 2. Der Typ des Resultaten muß vom Typ REAL sein.
-
-Zur Manipulation von Tabellen wurde der Datentyp TAB geschaffen, auf welchen man
-wie auf das Standard-Vektorpaket zugreifen kann.
-
-Beispiel:
-
- REAL PROC abs (REAL CONST a):
- IF a < 0.0 THEN
- -a
- ELSE
- a
- END IF
- END PROC abs;
-
- PROC sumv (TAB CONST tab, REAL CONST erstes, letztes):
- REAL VAR summe := 0.0;
- INT VAR i;
- FOR i FROM int (erstes) UPTO int (letztes) REPEAT
- summe INCR wert (tab, i)
- END REPEAT;
- summe
- END PROC sumv
-
-
-
-
-#ib#6.1. Für fortgeschrittende ELAN-Program­
- mierer#ie#
-
-
-
-Der Quellcode des EUMEL-DYNAMO-Compilers wird mit ausgeliefert. Daher
-können Einschränkungen (s. 3.2 Abweichungen gegenüber dem Sprachstandard)
-leicht beseitigt werden. Wem z.B. die Anzahl der Gleichungen (950) zu wenig ist, der
-kann im Quelltext des Compilers diesen Wert (annähernd) beliebig nach oben hin
-erhöhen.
-
diff --git a/doc/dynamo/dynamo handbuch.index b/doc/dynamo/dynamo handbuch.index
deleted file mode 100644
index af77d79..0000000
--- a/doc/dynamo/dynamo handbuch.index
+++ /dev/null
@@ -1,69 +0,0 @@
-#block##pageblock##page (52)#
-#head#
-#center#DYNAMO-Compiler
-#center#____________________________________________________________
-
-#end#
-#bottom odd#
-#center#____________________________________________________________
-GMD #right#DYNAMO - %
-#end#
-#bottom even#
-#center#____________________________________________________________
-DYNAMO - % #right#GMD
-#end#
-Anhang - Übersicht über Anweisungen und
-Funktionen
-
-
-#clear pos##l pos (0.0)##r pos (10.0)##fillchar (" ")#
-#table#
-A 21
-ABS 21
-ARCTAND 22
-C 23
-CLIP 23
-COSD 24
-EXP 25
-FIFGE 25
-FIFZE 26
-FLOOR 26
-FOR 27
-FRAC 27
-L 28
-LN 28
-LOG2 29
-LOG10 29
-MACRO 30
-MAX 31
-MEND 31
-MIN 32
-N 32
-NOISE 33
-NORMRN 33
-NOTE 34
-PLOT 35
-POWER 35
-PRINT 36
-R 36
-RAMP 37
-RUN 37
-S 38
-SCLPRD 38
-SIN 39
-SIND 39
-SPEC 40
-SQRT 40
-STEP 41
-SUM 41
-SUMV 42
-SWITCH 42
-T 43
-TABHL 43
-TABLE 44
-TAN 44
-TAND 45
-X 45
-* 46
-#table end#
-
diff --git a/doc/dynamo/dynamo handbuch.inhalt b/doc/dynamo/dynamo handbuch.inhalt
deleted file mode 100644
index 2d1b1f3..0000000
--- a/doc/dynamo/dynamo handbuch.inhalt
+++ /dev/null
@@ -1,131 +0,0 @@
-____________________________________________________________________________
-
-
-#on("b")##on ("u")#
-#center#Betriebssystem E U M E L
-#off ("u")#
-
-
-#center#DYNAMO
-
-
-
-
-#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#
-#block#
-#center#____________________________________________________________________________
-
- Copyright 1988
-
- Selbstverlag GMD
- Alle Rechte vorbehalten.
- Insbesondere ist die Überführung in maschinenlesbare
- Form, sowie das Speichern in Informationssystemen, auch
- auszugsweise, nur mit schriftlicher Genehmigung der
- GMD gestattet.
-#center#____________________________________________________________________________
-
-
- Herausgeber:
-
- Gesellschaft für Mathematik und Datenverarbeitung mbH
-
- Postfach 1240, Schloß Birlinghoven
- D-5205 Sankt Augustin 1
- Telefon(02241) 14-1, Telex 8 89 469 gmd d
- Telefax(02241) 14 28 89, BTX *43900\#
- Teletex 2627-224135=GMDVV
-
-
-Autor:
-
- Christian Szymanski
-
-nach Anregungen von:
-
- Diether Craemer, Robert Keil
-
-überarbeitet von:
-
- Thomas Müller
-
-Texterstellung:
-
- Dieser Text wurde mit der EUMEL-Textverarbeitung erstellt und aufbereitet und
- mit dem Agfa Laserdrucksystem P400 gedruckt.
-
-
-
- Hinweis:
-
-#on("italics")#
- Diese Dokumentation wurde mit größtmöglicher Sorgfalt erstellt. Dennoch wird
- für die Korrektheit und Vollständigkeit der gemachten Angaben keine Gewähr
- übernommen. Bei vermuteten Fehlern der Software oder der Dokumentation
- bitten wir um baldige Meldung, damit eine Korrektur möglichst rasch erfolgen
- kann. Anregungen und Kritik sind jederzeit willkommen.#off("italics")#
-#page#
-#pagenr ("%", 1")##setcount (1)##block##pageblock##count per page#
-#head#
-#center#DYNAMO-Compiler
-#center#____________________________________________________________
-
-#end#
-#bottom odd#
-#center#____________________________________________________________
-GMD #right#DYNAMO - %
-#end#
-#bottom even#
-#center#____________________________________________________________
-DYNAMO - % #right#GMD
-#end#
-
-Inhalt
-
-
-
-#clear pos##lpos (0.0)##r pos (10.0)##fillchar (" ")#
-#table#
-1. Einleitung 2
- 1.1. Referenzliteratur 2
- 1.2. Die Programmiersprache DYNAMO 3
- 1.3. Kurz-Einführung in die DYNAMO-Schreibweise 4
- 1.4. Eine erste, kleine Sitzung mit dem DYNAMO-System 6
-
-2. Generierung des DYNAMO-Compilers 7
-
-3. Der EUMEL-DYNAMO-Compiler 8
- 3.1. Benutzung des DYNAMO-Compiler 8
- 3.2. Abweichungen gegenüber dem Sprachstandard 11
- 3.3. Das DYNAMO Runtime-System 12
- 3.4. Fehlermeldungen des DYNAMO-Compilers 14
-
-4. Anweisungen und Funktionen des EUMEL-DYNAMO-Compilers 19
- 4.1. Übersicht über die Anweisungen und Funktionen 21
-
-5. Makros in DYNAMO 47
- 5.1. Insertieren von Makros 48
- 5.2. Aufbau eines Makros 48
-
-6. Erweiterung des Sprachumfangs 50
- 6.1. Für fortgeschrittende ELAN-Programmierer 51
-
-Anhang - Übersicht über Anweisungen unf Funktionen 52
-#table end#
-
diff --git a/doc/eudas/abb.1-1 b/doc/eudas/abb.1-1
deleted file mode 100644
index 06c27fd..0000000
--- a/doc/eudas/abb.1-1
+++ /dev/null
@@ -1,94 +0,0 @@
-init dgs;
-window (0.0, 0.0, 13.5, 7.1); (*viewport (0.0,0.0,13.5,7.1); *)
-scale (1.0,1.0,0.0,0.0);
-(*clear pixels;*)
-
-karteikasten (1.0, 3.5, "Kartei A", "Wegner", "Herbert");
-karteikasten (5.0, 0.5, "Kartei B", "Regmann", "Karin");
-
-LET myname = "abb.1-1";
-save pixels (myname + ".p");
-FILE VAR f := sequential file (modify, myname + ".p");
-to line (f, 1); insert record (f);
-write record (f, "#linefeed (0.8)#");
-insert record (f); write record (f, myname);
-to eof (f); insert record (f); write record (f, myname);
-to line (f, 1);
-(*
-pause (10000);
-*)
-PROC karteikasten (REAL CONST x, y, TEXT CONST name, t name, t vorname) :
-
- move (x - 0.1, y);
- draw (x + 3.6, y);
- draw (x + 3.6, y + 1.0);
- draw (x - 0.1, y + 1.0);
- draw (x - 0.1, y);
-
- move (x + 0.1, y + 1.1);
- draw (x + 0.5, y + 1.5);
- move (x + 0.1, y + 1.1);
- draw (x + 3.6, y + 1.1);
- move (x - 0.1, y + 1.0);
- draw (x + 0.5, y + 1.6);
-
- move (x + 3.6, y);
- draw (x + 5.2, y + 1.6);
- draw (x + 5.2, y + 2.6);
- draw (x + 3.6, y + 1.0);
- move (x + 3.6, y + 1.1); draw (x + 5.0, y + 2.5);
- move (x + 5.2, y + 2.6); draw (x + 5.0, y + 2.6);
-
- move (x + 0.5, y + 1.1);
- draw (x + 0.5, y + 2.5);
- draw (x + 4.0, y + 2.5);
- draw (x + 4.0, y + 1.5);
- move (x + 0.5, y + 2.5);
- draw (x + 1.5, y + 3.5);
- draw (x + 5.0, y + 3.5);
- draw (x + 5.0, y + 2.5);
- move (x + 5.0, y + 3.5);
- draw (x + 4.0, y + 2.5);
- REAL VAR x off := 0.1;
- WHILE x off < 1.0 REP
- move (x + 0.5 + xoff, y + 2.5 + x off);
- draw (x + 4.0 + xoff, y + 2.5 + xoff);
- draw (x + 4.0 + xoff, y + 1.5 + xoff);
- x off INCR 0.1
- END REP;
- font size (0.5);
- font expansion (1.5);
- move (x + 0.5, y + 0.2); draw (name);
- font size (0.25);
- move (x + 0.7, y + 2.10); draw ("Name");
- move (x + 0.7, y + 1.65); draw ("Vorname");
- move (x + 0.7, y + 1.20); draw ("Strasse");
- move (x + 2.1, y + 2.10); draw (": " + t name);
- move (x + 2.1, y + 1.65); draw (": " + t vorname);
- move (x + 2.1, y + 1.20); draw (":");
-
-END PROC karteikasten;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/doc/eudas/abb.4-1 b/doc/eudas/abb.4-1
deleted file mode 100644
index 439e052..0000000
--- a/doc/eudas/abb.4-1
+++ /dev/null
@@ -1,43 +0,0 @@
-init dgs;
-window (0.0, 0.0, 13.5, 3.2); viewport (0.0,0.0,13.5,3.2);
-(* scale (2.0,2.0,0.0,0.0); *)
-(*clear pixels;*)
-
-font size (0.25);
-font expansion (1.5);
-
-INT VAR i;
-FOR i FROM 0 UPTO 4 REP
- move (2.0, real (i) * 0.5);
- draw (10.0, real (i) * 0.5);
- move (2.1, real (i) * 0.5 + 0.1);
- draw ("Feld " + code (code ("E") - i));
-END REP;
-move (2.0, 2.5);
-draw (10.0, 2.5);
-move (2.0, 2.5);
-draw (2.0, 0.0);
-move (3.5, 3.0);
-draw (10.0, 3.0);
-FOR i FROM 1 UPTO 4 REP
- move (2.0 + real (i) * 1.5, 3.0);
- draw (2.0 + real (i) * 1.5, 0.0);
- move (2.2 + real (i) * 1.5, 2.6);
- draw ("Satz " + text (i))
-END REP;
-move (9.5, 3.0);
-draw (9.5, 0.0);
-(*
-pause (1000);
-*)
-
-LET myname = "abb.4-1";
-save pixels (myname + ".p");
-FILE VAR f := sequential file (modify, myname + ".p");
-to line (f, 1); insert record (f);
-write record (f, "#linefeed (0.8)#");
-insert record (f); write record (f, myname);
-to eof (f); insert record (f); write record (f, myname);
-to line (f, 1);
-
-
diff --git a/doc/eudas/abb.4-2 b/doc/eudas/abb.4-2
deleted file mode 100644
index a836def..0000000
--- a/doc/eudas/abb.4-2
+++ /dev/null
@@ -1,46 +0,0 @@
-init dgs;
-window (0.0, 0.0, 13.5, 2.0); viewport (0.0,0.0,13.5,2.0);
-(*scale (1.7,1.7,-1.6,0.0);*)
-(*
-clear pixels;
-*)
-
-kasten (1.0, 0.0, 3.0, 1.5);
-kasten (7.0, 0.0, 3.0, 1.5);
-font size (0.4); font expansion (1.5);
-move (1.8, 0.6); draw ("Menü");
-move (7.9, 0.6); draw ("Hilfe");
-move (4.5, 1.0); draw (6.5, 1.0);
- draw (6.25, 1.25); move (6.5, 1.0); draw (6.25, 0.75);
-move (6.5, 0.5); draw (4.5, 0.5);
- draw (4.75, 0.75); move (4.5, 0.5); draw (4.75, 0.25);
-font size (0.25);
-move (5.0, 1.1); draw ("ESC '?'");
-move (5.0, 0.6); draw ("ESC 'q'");
-move (10.5, 1.0); draw (11.5, 1.0); draw (11.5, 0.5); draw (10.5, 0.5);
- draw (10.75, 0.75); move (10.5, 0.5); draw (10.75, 0.25);
-move (11.8, 0.9); draw ("ESC 'w'");
-move (11.8, 0.4); draw ("ESC 'z'");
-
-
-LET myname = "abb.4-2";
-save pixels (myname + ".p");
-FILE VAR f := sequential file (modify, myname + ".p");
-to line (f, 1); insert record (f);
-write record (f, "#linefeed (0.8)#");
-insert record (f); write record (f, myname);
-to eof (f); insert record (f); write record (f, myname);
-to line (f, 1);
-(*
-pause (9000);
-*)
-PROC kasten (REAL CONST x anf, y anf, x l, y l) :
-
- move (x anf, y anf);
- draw (x anf, y anf + y l);
- draw (x anf + x l, y anf + y l);
- draw (x anf + x l, y anf);
- draw (x anf, y anf)
-
-END PROC kasten;
-
diff --git a/doc/eudas/abb.6-1 b/doc/eudas/abb.6-1
deleted file mode 100644
index fb83242..0000000
--- a/doc/eudas/abb.6-1
+++ /dev/null
@@ -1,75 +0,0 @@
-init dgs;
-window (0.0, 0.0, 13.5, 4.0); viewport (0.0,0.0,13.5,4.0);
-(*scale (1.0,1.0, 0.0,0.0);*)
-(*
-clear pixels;
-*)
-
-move (2.25, 1.0); draw (4.75, 1.0);
-move (2.25, 3.0); draw (4.75, 3.0);
- move (2.5, 1.0); draw (2.5, 3.3);
- move (3.0, 1.0); draw (3.0, 3.3);
- move (3.5, 1.0); draw (3.5, 3.3);
- move (4.0, 1.0); draw (4.0, 3.3);
- move (4.5, 1.0); draw (4.5, 3.3);
-font size (0.30); font expansion (1.5);
-move (2.6, 3.1); draw ("4");
-move (2.6, 2.0); draw ("M");
-move (3.1, 3.1); draw ("5");
-move (3.1, 2.0); draw ("N");
-move (3.6, 3.1); draw ("6");
-move (3.6, 2.0); draw ("O");
-move (4.1, 3.1); draw ("7");
-move (4.1, 2.0); draw ("P");
- pfeil (3.75, 0.75);
-
-move (5.0, 2.0); draw (7.0, 2.0); draw (6.75, 2.25);
- move (7.0, 2.0); draw (6.75, 1.75);
-move (5.0, 2.1); draw ("Einfügen");
-
-move (7.25, 1.0); draw (8.5, 1.0); move (9.0, 1.0); draw (10.25, 1.0);
-move (7.25, 3.0); draw (8.5, 3.0); move (9.0, 3.0); draw (10.25, 3.0);
- move (7.5, 1.0); draw (7.5, 3.3);
- move (8.0, 1.0); draw (8.0, 3.3);
- move (8.5, 1.0); draw (8.5, 3.3);
- move (9.0, 1.0); draw (9.0, 3.3);
- move (9.5, 1.0); draw (9.5, 3.3);
- move (10.0, 1.0); draw (10.0, 3.3);
-move (7.6, 3.1); draw ("4");
-move (7.6, 2.0); draw ("M");
-move (8.1, 3.1); draw ("5");
-move (8.1, 2.0); draw ("N");
-move (8.6, 3.1); draw ("6");
-move (9.1, 3.1); draw ("7");
-move (9.1, 2.0); draw ("O");
-move (9.6, 3.1); draw ("8");
-move (9.6, 2.0); draw ("P");
-
-pfeil (8.75, 0.75);
-
-PROC pfeil (REAL CONST x spitze, y spitze) :
-
- move (x spitze, y spitze);
- draw (x spitze + 0.25, y spitze - 0.25);
- draw (x spitze + 0.1, y spitze - 0.25);
- draw (x spitze + 0.1, y spitze - 0.5);
- draw (x spitze - 0.1, y spitze - 0.5);
- draw (x spitze - 0.1, y spitze - 0.25);
- draw (x spitze - 0.25, y spitze - 0.25);
- draw (x spitze, y spitze)
-
-END PROC pfeil;
-
-
-LET myname = "abb.6-1";
-save pixels (myname + ".p");
-FILE VAR f := sequential file (modify, myname + ".p");
-to line (f, 1); insert record (f);
-write record (f, "#linefeed (0.8)#");
-insert record (f); write record (f, myname);
-to eof (f); insert record (f); write record (f, myname);
-to line (f, 1);
-(*
-pause (9000)
-*)
-
diff --git a/doc/eudas/abb.6-2 b/doc/eudas/abb.6-2
deleted file mode 100644
index 7771a29..0000000
--- a/doc/eudas/abb.6-2
+++ /dev/null
@@ -1,77 +0,0 @@
-init dgs;
-window (0.0, 0.0, 13.5, 5.0); viewport (0.0,0.0,13.5,5.0);
-(*scale (1.4,1.4, 0.0,0.0);*)
-(*clear pixels;*)
-
-move (2.5, 4.5); draw (12.4, 4.5); draw (12.4, 4.0); draw (11.0, 4.0);
- draw (11.0, 3.5); move (10.5, 3.5); draw (10.5, 4.0); draw (2.5, 4.0);
-move (13.5, 4.5); draw (12.5, 4.5); draw (12.5, 3.5); move (13.0, 3.5);
- draw (13.0, 4.0); draw (13.5, 4.0);
-move (2.5, 3.5); draw (13.5, 3.5); move (13.5, 3.0); draw (10.0, 3.0);
- draw (10.0, 2.5); move (9.5, 2.5); draw (9.5, 3.0); draw (2.5, 3.0);
-move (10.5, 3.0); draw (10.5, 2.5); move (11.0, 2.5); draw (11.0, 3.0);
-move (12.5, 2.5); draw (12.5, 3.0); move (13.0, 3.0); draw (13.0, 2.5);
-move (2.5, 2.5); draw (6.4, 2.5); draw (6.4, 2.0); draw (4.0, 2.0);
- draw (4.0, 1.5); draw (6.5, 1.5); draw (6.5, 2.5); draw (13.5, 2.5);
- move (13.5, 2.0); draw (7.0, 2.0); draw (7.0, 1.5); draw (9.0, 1.5);
- draw (9.0, 1.0); draw (3.5, 1.0); draw (3.5, 2.0); draw (2.5, 2.0);
-move (9.5, 2.0); draw (9.5, 1.0); draw (10.4, 1.0); draw (10.4, 1.5);
- draw (10.0, 1.5); draw (10.0, 2.0);
-move (10.5, 2.0); draw (10.5, 1.0); draw (13.0, 1.0); draw (13.0, 2.0);
- move (11.0, 2.0); draw (11.0, 1.5); draw (12.5, 1.5); draw (12.5, 2.0);
-move (4.5, 1.5); draw (4.75, 1.25); draw (4.5, 1.0);
-move (5.5, 1.5); draw (5.75, 1.25); draw (5.5, 1.0);
-move (7.5, 1.5); draw (7.75, 1.25); draw (7.5, 1.0);
-move (11.5, 1.5); draw (11.75, 1.25); draw (11.5, 1.0);
-
-font size (0.25); font expansion (1.4);
-move (2.5, 4.1); draw ("K0");
-move (2.5, 3.1); draw ("N0");
-move (2.5, 2.1); draw ("A0");
-
-move (0.0, 4.1); draw ("'Kalender'");
-move (0.0, 3.1); draw ("'Namen'");
-move (0.0, 2.1); draw ("'Adressen'");
-move (0.0, 1.1); draw ("Arbeitskopie");
-
-move (4.9, 1.1); draw ("A1");
-move (5.9, 1.1); draw ("A2");
-move (7.9, 1.1); draw ("A3");
-move (11.9, 1.1); draw ("K1");
-
-x alignment (right);
-move (13.5, 4.1); draw ("K1");
-move (13.5, 3.1); draw ("N0");
-move (13.5, 2.1); draw ("A2");
-
-x alignment (normal);
-font size (0.2);
-INT VAR i;
-FOR i FROM 0 UPTO 10 REP
- time (2.5 + real (i) * 1.0, i)
-END REP;
-
-PROC time (REAL CONST x pos, INT CONST nr) :
-
- move (x pos, 4.9); draw (x pos, 4.6);
- move (x pos, 3.9); draw (x pos, 3.6);
- move (x pos, 2.9); draw (x pos, 2.6);
- move (x pos, 1.9); draw (x pos, 1.6);
- move (x pos, 0.9); draw (x pos, 0.6);
- move (x pos + 0.1, 0.6); draw (text (nr))
-
-END PROC time;
-
-
-LET myname = "abb.6-2";
-save pixels (myname + ".p");
-FILE VAR f := sequential file (modify, myname + ".p");
-to line (f, 1); insert record (f);
-write record (f, "#linefeed (0.8)#");
-insert record (f); write record (f, myname);
-to eof (f); insert record (f); write record (f, myname);
-to line (f, 1);
-(*
-pause (9000);
-*)
-
diff --git a/doc/eudas/abb.7-1 b/doc/eudas/abb.7-1
deleted file mode 100644
index 3536ad9..0000000
--- a/doc/eudas/abb.7-1
+++ /dev/null
@@ -1,46 +0,0 @@
-init dgs;
-window (0.0, 0.0, 13.5, 6.0); viewport (0.0,0.0,13.5,6.0);
-(*scale (1.7,1.7, 0.0,0.0);*)
-(*clear pixels;*)
-
-kasten (5.0, 4.5, 3.0, 1.0);
-kasten (5.0, 1.5, 3.0, 1.0);
-kasten (1.5, 3.0, 3.0, 1.0);
-font size (0.35); font expansion (1.5);
-x alignment (center);
-move (6.5, 4.8); draw ("Druckmuster");
-move (6.5, 1.8); draw ("Druckdatei");
-move (3.0, 3.3); draw ("EUDAS-Datei");
-move (6.5, 0.0); draw ("Drucker");
-
-move (6.5, 4.25); draw (6.5, 2.75); draw (6.25, 3.0);
- move (6.5, 2.75); draw (6.75, 3.0);
-move (4.75, 3.5); draw (6.25, 3.5); draw (6.0, 3.75);
- move (6.25, 3.5); draw (6.0, 3.25);
-move (6.5, 1.25); draw (6.5, 0.5); draw (6.75, 0.75);
- move (6.5, 0.5); draw (6.25, 0.75);
-
-
-PROC kasten (REAL CONST x anf, y anf, x l, y l) :
-
- move (x anf, y anf);
- draw (x anf, y anf + y l);
- draw (x anf + x l, y anf + y l);
- draw (x anf + x l, y anf);
- draw (x anf, y anf)
-
-END PROC kasten;
-
-
-LET myname = "abb.7-1";
-save pixels (myname + ".p");
-FILE VAR f := sequential file (modify, myname + ".p");
-to line (f, 1); insert record (f);
-write record (f, "#linefeed (0.8)#");
-insert record (f); write record (f, myname);
-to eof (f); insert record (f); write record (f, myname);
-to line (f, 1);
-(*
-pause (9000);
-*)
-
diff --git a/doc/eudas/abb.9-1 b/doc/eudas/abb.9-1
deleted file mode 100644
index 774b78b..0000000
--- a/doc/eudas/abb.9-1
+++ /dev/null
@@ -1,41 +0,0 @@
-init dgs;
-window (0.0, 0.0, 13.5, 4.0); viewport (0.0,0.0,13.5,4.0);
-(*scale (1.7,1.7, 0.0,0.0);*)
-(*clear pixels;*)
-
-move (1.5, 1.0); draw (8.75, 1.0);
-move (1.5, 3.5); draw (8.75, 3.5);
-INT VAR i;
-FOR i FROM 0 UPTO 9 REP
- move (1.75 + real (i) * 0.75, 3.7);
- draw (1.75 + real (i) * 0.75, 1.0);
-END REP;
-
-move (4.7, 3.7); draw (4.7, 1.0);
-
-font size (0.25); font expansion (1.5);
-x alignment (center);
-FOR i FROM 0 UPTO 8 REP
- move (2.125 + real (i) * 0.75, 3.6); draw (text (i + 110))
-END REP;
-FOR i FROM 1 UPTO 5 REP
- move (2.125 + real (i + 3) * 0.75, 0.6); draw ("(" + text (i) + ")")
-END REP;
-
-font size (0.35); x alignment (left);
-move (2.0, 0.0); draw ("Datei A");
-move (5.0, 0.0); draw ("Datei B");
-
-
-LET myname = "abb.9-1";
-save pixels (myname + ".p");
-FILE VAR f := sequential file (modify, myname + ".p");
-to line (f, 1); insert record (f);
-write record (f, "#linefeed (0.8)#");
-insert record (f); write record (f, myname);
-to eof (f); insert record (f); write record (f, myname);
-to line (f, 1);
-(*
-pause (9000)
-*)
-
diff --git a/doc/eudas/abb.9-2 b/doc/eudas/abb.9-2
deleted file mode 100644
index 4e9444d..0000000
--- a/doc/eudas/abb.9-2
+++ /dev/null
@@ -1,96 +0,0 @@
-init dgs;
-window (0.0, 0.0, 13.5, 6.5); viewport (0.0,0.0,13.5,6.5);
-(*scale (1.7,1.7, 0.0,0.0);*)
-(*clear pixels;*)
-
-INT VAR i;
-move (4.0, 0.0); draw (4.0, 2.0);
-move (5.5, 0.0); draw (5.5, 2.0);
-FOR i FROM 0 UPTO 4 REP
- move (4.0, real (i) * 0.5);
- draw (5.5, real (i) * 0.5)
-END REP;
-
-move (4.0, 3.0); draw (4.0, 6.0);
-move (5.5, 3.0); draw (5.5, 6.0);
-FOR i FROM 0 UPTO 6 REP
- move (4.0, real (i) * 0.5 + 3.0);
- draw (5.5, real (i) * 0.5 + 3.0)
-END REP;
-
-move (7.5, 2.0); draw (7.5, 6.0);
-move (9.0, 2.0); draw (9.0, 6.0);
-FOR i FROM 0 UPTO 8 REP
- move (7.5, real (i) * 0.5 + 2.0);
- draw (9.0, real (i) * 0.5 + 2.0)
-END REP;
-
-strichel (5.5, 6.0, 7.5, 6.0);
-strichel (5.5, 3.0, 7.5, 3.0);
-strichel (5.5, 1.0, 7.5, 3.0);
-strichel (5.5, 0.0, 7.5, 2.0);
-
-move (5.5, 4.75); draw (6.0, 4.75);
- draw (6.0, 1.75); draw (5.5, 1.75);
-move (4.0, 3.75); draw (3.5, 3.75);
- draw (3.5, 1.25); draw (4.0, 1.25);
-
-font size (0.4); font expansion (1.5);
-move (0.0, 0.8); draw ("Koppeldatei");
-move (0.0, 4.3); draw ("Hauptdatei");
-move (10.0, 4.3); draw ("virtuelle");
-move (10.0, 3.4); draw ("Datei");
-
-font size (0.3);
-move (4.5, 0.1); draw ("H2");
-move (4.5, 0.6); draw ("H1");
-move (4.5, 1.1); draw ("B");
-move (4.5, 1.6); draw ("A");
-move (4.5, 3.1); draw ("F4");
-move (4.5, 3.6); draw ("B");
-move (4.5, 4.1); draw ("F3");
-move (4.5, 4.6); draw ("A");
-move (4.5, 5.1); draw ("F2");
-move (4.5, 5.6); draw ("F1");
-move (8.0, 5.6); draw ("F1");
-move (8.0, 5.1); draw ("F2");
-move (8.0, 4.6); draw ("A");
-move (8.0, 4.1); draw ("F3");
-move (8.0, 3.6); draw ("B");
-move (8.0, 3.1); draw ("F4");
-move (8.0, 2.6); draw ("H1");
-move (8.0, 2.1); draw ("H2");
-
-PROC strichel (REAL CONST x anf, y anf, x end, y end) :
-
- REAL VAR laenge := x end - x anf;
- INT VAR teile := int (abstand/ 0.4);
- REAL VAR verhaeltnis := (y end - y anf) / laenge;
- laenge := laenge / (real (2 * teile + 1));
- INT VAR i;
- FOR i FROM 0 UPTO teile REP
- move (x anf + real (i + i) * laenge,
- y anf + verhaeltnis * real (i + i) * laenge);
- draw (x anf + real (i + i + 1) * laenge,
- y anf + verhaeltnis * real (i + i + 1) * laenge)
- END REP .
-
-abstand :
- sqrt ((y end - y anf) + (y end - y anf) +
- (x end - x anf) * (x end - x anf)) .
-
-END PROC strichel;
-
-
-LET myname = "abb.9-2";
-save pixels (myname + ".p");
-FILE VAR f := sequential file (modify, myname + ".p");
-to line (f, 1); insert record (f);
-write record (f, "#linefeed (0.8)#");
-insert record (f); write record (f, myname);
-to eof (f); insert record (f); write record (f, myname);
-to line (f, 1);
-(*
-pause (9000);
-*)
-
diff --git a/doc/eudas/abb.9-3 b/doc/eudas/abb.9-3
deleted file mode 100644
index 9b190ab..0000000
--- a/doc/eudas/abb.9-3
+++ /dev/null
@@ -1,113 +0,0 @@
-init dgs;
-window (0.0, 0.0, 13.5, 7.0); viewport (0.0,0.0,13.5,7.0);
-(*scale (1.7,1.7, 0.0,0.0);*)
-(*clear pixels;*)
-
-x alignment (center);
-font size (0.3); font expansion (1.2);
-kasten (1.5, 5.0, 2.0, 1.5);
-move (2.5, 5.9); draw ("EUDAS-");
-move (2.5, 5.3); draw ("Datei 1");
-move (3.5, 5.75); draw (4.0, 5.75);
-kasten (4.0, 5.0, 2.0, 1.5);
-move (5.0, 5.9); draw ("gekettete");
-move (5.0, 5.3); draw ("Datei A");
-move (6.0, 5.75); draw (6.5, 5.75);
-kasten (6.5, 5.0, 2.0, 1.5);
-move (7.5, 5.9); draw ("gekettete");
-move (7.5, 5.3); draw ("Datei B");
-kasten (1.5, 2.0, 2.0, 1.5);
-move (2.5, 2.9); draw ("gekoppelte");
-move (2.5, 2.3); draw ("Datei C");
-kasten (4.0, 0.0, 2.0, 1.5);
-move (5.0, 0.9); draw ("gekoppelte");
-move (5.0, 0.3); draw ("Datei D");
-
-punkt (9.0, 5.75);
-punkt (9.25, 5.75);
-punkt (9.5, 5.75);
-
-strichel (1.0, 4.5, 10.0, 4.5);
-strichel (1.0, 7.0, 10.0, 7.0);
-strichel (1.0, 4.5, 1.0, 7.0);
-x alignment (right); font size (0.4);
-move (10.0, 3.9);
-draw ("Hauptdatei");
-
-punkt (2.5, 3.75);
-punkt (2.5, 4.0);
-punkt (2.5, 4.25);
-
-punkt (5.0, 1.75);
-punkt (5.0, 2.0);
-punkt (5.0, 2.25);
-punkt (5.0, 2.5);
-punkt (5.0, 2.75);
-punkt (5.0, 3.0);
-punkt (5.0, 3.25);
-punkt (5.0, 3.5);
-punkt (5.0, 3.75);
-punkt (5.0, 4.0);
-punkt (5.0, 4.25);
-
-PROC punkt (REAL CONST x pos, y pos) :
-
- LET p size = 0.025;
- move (x pos, y pos + p size);
- draw (x pos + p size, y pos);
- draw (x pos, y pos - p size);
- draw (x pos - p size, y pos);
- draw (x pos, y pos + p size)
-
-END PROC punkt;
-
-
-PROC strichel (REAL CONST x anf, y anf, x end, y end) :
-
- REAL VAR laenge := x end - x anf;
- INT VAR teile := int (abstand/ 0.4);
- REAL VAR senkrecht, verhaeltnis;
- IF laenge <> 0.0 THEN
- verhaeltnis := (y end - y anf) / laenge; senkrecht := 1.0
- ELSE
- verhaeltnis := 1.0; senkrecht := 0.0 ;
- laenge := y end - y anf
- END IF;
- laenge := laenge / (real (2 * teile + 1));
- INT VAR i;
- FOR i FROM 0 UPTO teile REP
- move (x anf + real (i + i) * laenge * senkrecht,
- y anf + verhaeltnis * real (i + i) * laenge);
- draw (x anf + real (i + i + 1) * laenge * senkrecht,
- y anf + verhaeltnis * real (i + i + 1) * laenge)
- END REP .
-
-abstand :
- sqrt ((y end - y anf) * (y end - y anf) +
- (x end - x anf) * (x end - x anf)) .
-
-END PROC strichel;
-
-PROC kasten (REAL CONST x anf, y anf, x l, y l) :
-
- move (x anf, y anf);
- draw (x anf, y anf + y l);
- draw (x anf + x l, y anf + y l);
- draw (x anf + x l, y anf);
- draw (x anf, y anf)
-
-END PROC kasten;
-
-
-LET myname = "abb.9-3";
-save pixels (myname + ".p");
-FILE VAR f := sequential file (modify, myname + ".p");
-to line (f, 1); insert record (f);
-write record (f, "#linefeed (0.8)#");
-insert record (f); write record (f, myname);
-to eof (f); insert record (f); write record (f, myname);
-to line (f, 1);
-(*
-pause (9000)
-*)
-
diff --git a/doc/eudas/abb.9-4 b/doc/eudas/abb.9-4
deleted file mode 100644
index e243265..0000000
--- a/doc/eudas/abb.9-4
+++ /dev/null
@@ -1,98 +0,0 @@
-init dgs;
-window (0.0, 0.0, 13.5, 6.0); viewport (0.0,0.0,13.5,6.0);
-(*scale (1.7,1.7, 0.0,0.0);*)
-(*clear pixels;*)
-
-kasten (2.0, 1.0, 1.4, 2.0);
-kasten (3.5, 1.0, 1.4, 2.0);
-kasten (6.5, 1.0, 1.4, 2.0);
-kasten (2.0, 3.4, 1.4, 2.0);
-kasten (5.0, 3.4, 1.4, 2.0);
-kasten (6.5, 3.4, 1.4, 2.0);
- strichel (3.5, 3.4, 3.5, 5.4);
- strichel (3.5, 5.4, 4.9, 5.4);
- strichel (4.9, 5.4, 4.9, 3.4);
- strichel (4.9, 3.4, 3.5, 3.4);
-move (1.9, 2.7); draw (1.5, 2.7);
-draw (1.5, 4.6); draw (1.9, 4.6);
-
-x alignment (center);
-font size (0.3); font expansion (1.4);
-
-move (2.7, 5.6); draw ("22-1");
-move (2.7, 4.9); draw ("X");
-move (2.7, 4.4); draw ("K");
-move (2.7, 2.5); draw ("K");
-move (2.7, 2.0); draw ("N1");
-move (2.7, 0.4); draw ("(114)");
-
-move (4.2, 5.6); draw ("22-2");
-move (4.2, 4.9); draw ("X");
-move (4.2, 4.4); draw ("K");
-move (4.2, 2.5); draw ("K");
-move (4.2, 2.0); draw ("N2");
-move (4.2, 0.4); draw ("(209)");
-
-move (5.7, 5.6); draw ("23-1");
-move (5.7, 4.9); draw ("Y");
-move (5.7, 4.4); draw ("L");
-
-move (7.2, 5.6); draw ("24-1");
-move (7.2, 4.9); draw ("Z");
-move (7.2, 4.4); draw ("M");
-move (7.2, 2.5); draw ("M");
-move (7.2, 0.4); draw ("(17)");
-
-font size (0.4); x alignment (normal);
-move (8.5, 2.0); draw ("Koppeldatei");
-move (8.5, 4.4); draw ("Hauptdatei");
-
-PROC strichel (REAL CONST x anf, y anf, x end, y end) :
-
- REAL VAR laenge := x end - x anf;
- INT VAR teile := int (abstand/ 0.4);
- REAL VAR senkrecht, verhaeltnis;
- IF laenge <> 0.0 THEN
- verhaeltnis := (y end - y anf) / laenge; senkrecht := 1.0
- ELSE
- verhaeltnis := 1.0; senkrecht := 0.0 ;
- laenge := y end - y anf
- END IF;
- laenge := laenge / (real (2 * teile + 1));
- INT VAR i;
- FOR i FROM 0 UPTO teile REP
- move (x anf + real (i + i) * laenge * senkrecht,
- y anf + verhaeltnis * real (i + i) * laenge);
- draw (x anf + real (i + i + 1) * laenge * senkrecht,
- y anf + verhaeltnis * real (i + i + 1) * laenge)
- END REP .
-
-abstand :
- sqrt ((y end - y anf) * (y end - y anf) +
- (x end - x anf) * (x end - x anf)) .
-
-END PROC strichel;
-
-PROC kasten (REAL CONST x anf, y anf, x l, y l) :
-
- move (x anf, y anf);
- draw (x anf, y anf + y l);
- draw (x anf + x l, y anf + y l);
- draw (x anf + x l, y anf);
- draw (x anf, y anf)
-
-END PROC kasten;
-
-
-LET myname = "abb.9-4";
-save pixels (myname + ".p");
-FILE VAR f := sequential file (modify, myname + ".p");
-to line (f, 1); insert record (f);
-write record (f, "#linefeed (0.8)#");
-insert record (f); write record (f, myname);
-to eof (f); insert record (f); write record (f, myname);
-to line (f, 1);
-(*
-pause (9000)
-*)
-
diff --git a/doc/eudas/abb.9-5 b/doc/eudas/abb.9-5
deleted file mode 100644
index c00655c..0000000
--- a/doc/eudas/abb.9-5
+++ /dev/null
@@ -1,51 +0,0 @@
-init dgs;
-window (0.0, 0.0, 13.5, 7.0); viewport (0.0,0.0,13.5,7.0);
-(*scale (1.7,1.7, 0.0,0.0);*)
-(*clear pixels;*)
-
-kasten (1.5, 0.0, 3.5, 2.0);
-kasten (7.0, 0.0, 3.5, 2.0);
-kasten (4.0, 4.0, 4.0, 3.0);
- kasten (5.0, 5.5, 2.0, 1.0);
-
-move (3.25, 2.25); draw (4.75, 3.75);
- draw (4.5, 3.75); move (4.75, 3.75); draw (4.75, 3.5);
- move (3.25, 2.25); draw (3.5, 2.25);
- move (3.25, 2.25); draw (3.25, 2.5);
-move (8.75, 2.25); draw (7.25, 3.75);
- draw (7.5, 3.75); move (7.25, 3.75); draw (7.25, 3.5);
- move (8.75, 2.25); draw (8.5, 2.25);
- move (8.75, 2.25); draw (8.75, 2.5);
-
-x alignment (center);
-font size (0.4); font expansion (1.4);
-
-move (3.25, 0.2); draw ("Benutzer A");
-move (8.75, 0.2); draw ("Benutzer B");
-move (6.0, 4.3); draw ("Manager");
-font size (0.3);
-move (6.0, 5.6); draw ("Kunden");
-
-PROC kasten (REAL CONST x anf, y anf, x l, y l) :
-
- move (x anf, y anf);
- draw (x anf, y anf + y l);
- draw (x anf + x l, y anf + y l);
- draw (x anf + x l, y anf);
- draw (x anf, y anf)
-
-END PROC kasten;
-
-
-LET myname = "abb.9-5";
-save pixels (myname + ".p");
-FILE VAR f := sequential file (modify, myname + ".p");
-to line (f, 1); insert record (f);
-write record (f, "#linefeed (0.8)#");
-insert record (f); write record (f, myname);
-to eof (f); insert record (f); write record (f, myname);
-to line (f, 1);
-(*
-pause (9000)
-*)
-
diff --git a/doc/eudas/bildergenerator b/doc/eudas/bildergenerator
deleted file mode 100644
index 8129476..0000000
--- a/doc/eudas/bildergenerator
+++ /dev/null
@@ -1,25 +0,0 @@
-PROC starten :
-
- command dialogue (FALSE);
- disable stop;
- fetch (name, /"DGS NEC");
- run (name);
- save (name + ".p", /"DGS NEC");
- end (myself)
-
-END PROC starten;
-
-TEXT VAR name;
-
-PROC gen (TEXT CONST t) :
-
- name := t;
- begin ("p", PROC starten, a);
- TASK VAR a;
- WHILE exists (a) REP pause (100) END REP
-
-END PROC gen;
-
-gen ("abb.4-2");
-gen ("abb.6-1");
-
diff --git a/doc/eudas/eudas.hdb.1 b/doc/eudas/eudas.hdb.1
deleted file mode 100644
index 40b5a84..0000000
--- a/doc/eudas/eudas.hdb.1
+++ /dev/null
@@ -1,267 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (3)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-#center##on("b")#"Was kann EUDAS ?
-
-
-
-In diesem Kapitel wollen wir Ihnen erklären, was EUDAS Ihnen ei­
-gentlich bringen soll. Sie arbeiten sicher nicht nur aus Spaß am
-Computer, sondern wollen ihn für bestimmte Aufgaben einsetzen. Ein
-Computer kann bestimmte Aufgaben nur dann bearbeiten, wenn er
-dafür programmiert worden ist.
- EUDAS ist nun ein Programm, das allgemein Aufgaben der Da­
-tenverwaltung lösen kann. Zunächst wollen wir Ihnen erläutern,
-wodurch dieses Anwendungsgebiet genau charakterisiert wird.
-
-
-1.1 Textverarbeitung und Datenverwaltung
-
-Es gibt zwei Einsatzbereiche des Computers, die von fast jedem An­
-wender benötigt werden, egal auf welchem Spezialgebiet er tätig ist:
-nämlich die #on("i")#Textverarbeitung#off("i")# und die #on("i")#Datenverwaltung#off("i")#. Durch die
-Unterscheidung dieser beiden Bereiche werden die charakteristi­
-schen Merkmale der Datenverwaltung abgegrenzt.
-
-#on("b")#Textverarbeitung#off("b")# Die Textverarbeitung befaßt sich damit,
-einen beliebigen Text auf einem Rechner zu erfassen und anschließend
-über einen Drucker wieder auszugeben. Der Sinn dieser Arbeit liegt
-darin, daß man einen einmal eingegebenen Text sehr einfach ändern
-kann. Außerdem kann der Computer einige unangenehme Aufgaben
-übernehmen, die beim Schreiben von Texten auftreten: die Auftei­
-lung auf Zeilen und Seiten, die Seitennumerierung und vieles mehr.
- Charakteristisch für die Textverarbeitung ist, daß der Einfluß
-des Computers sich auf kosmetische Details beschränkt. Die Spei­
-cherung und eventuelle Aufbereitung zum Drucken haben praktisch
-nichts mit dem Inhalt des Textes zu tun. Dies wäre für den Rechner
-auch sehr schwierig, da die im Text enthaltenen Informationen in
-menschlicher Sprache vorliegen, die für einen Rechner nicht ver­
-ständlich ist.
-
-#on("b")#Datenverwaltung#off("b")# Bei der Datenverwaltung werden ebenfalls
-textuelle Informationen gespeichert, diese liegen aber in einer aufberei­
-teten Form vor, die einen Teil des Inhalts für den Computer ver­
-ständlich macht. Bei der Datenverwaltung werden Objekte betrach­
-tet, die verschiedene Eigenschaften haben können. Ein solches
-Objekt kann z.B. eine Person sein. Als Eigenschaften werden mit
-dieser Person zusammenhängende Informationen betrachetet, die für
-die jeweilige Anwendung wichtig sind.
- Ein Beispiel für eine solche Betrachtungsweise ist der Arbeit­
-nehmer im Betrieb. Einige der typischerweise erfaßten Daten sind
-Name, Adresse, Telefon, Geburtsdatum und Geschlecht. Alle diese
-Daten sind Eigenschaften oder #on("i")#Attribute#off("i")#, die einem bestimmten
-Menschen mehr oder weniger fest zugeordnet sind.
- Die Betonung inhaltlicher Beziehungen erleichtert es dem Com­
-puter, die gespeicherten Daten in verschiedenen Variationen aus­
-zuwerten.
-
-#on("b")#Beispiel#off("b")# Um die Unterscheidung zwischen Textverarbeitung
-und
-Datenverwaltung deutlicher zu machen, werden im folgenden Bei­
-spiel die Informationen über eine Person in zwei unterschiedlichen
-Formen dargeboten, die für den Menschen die gleiche Aussagekraft
-haben:
-
- 1. Frau Magdalene Kant, geb. Hagedorn, wurde am 12. Januar
- 1946 geboren. Sie wohnt in Bonn in der Meckenheimer Allee
- 112. Seit 1977 arbeitet sie in unserer Firma. Sie ist tele­
- fonisch erreichbar unter der Nummer 0228/356782.
-
- 2. Name: Magdalene
- Vorname: Kant
- Geburtsname: Hagedorn
- Geburtsdatum: 12.01.46
- Geschlecht: weiblich
- Strasse: Meckenheimer Allee 112
- PLZ: 5200
- Wohnort: Bonn 1
- Vorwahl: 0228
- Telefon: 356782
- beschäftigt seit: 1977
-
-Die Form der Darstellung wie in der ersten Alternative eignet sich
-nur für den Menschen, da die gleiche Information auf viele ver­
-schiedene Weisen ausgedrückt werden könnte (z.B. unterschiedlicher
-Satzbau). Die zweite Alternative beschränkt sich auf die für die
-bestimmte Anwendung wesentlichen Zusammenhänge; der Computer
-kann die Aufteilung der Information in einzelne Attribute ausnut­
-zen.
- In dieser zweiten Form können Sie Daten mit EUDAS erfassen
-und auch auswerten. Die Attribute können Sie jeweils passend zu
-den erfaßten Daten selbst bestimmen.
- Für Daten in der ersten Form steht Ihnen die EUMEL-Textver­
-arbeitung zur Verfügung. EUDAS wurde so entwickelt, daß Sie auch
-Daten an die Textverarbeitung übergeben können.
- Es ist nämlich möglich, einen freien Text aus der Attributdar­
-stellung automatisch zu erzeugen, indem Sie dem Computer den
-Satzbau mit entsprechenden Platzhaltern vorgeben. Der Rechner
-setzt die einzelnen Attribute dann an die angegebenen Stellen.
-Diese Funktion ist ein Kernstück von EUDAS und wird in Abschnitt
-1.3 näher erläutert.
-
-
-1.2 EUDAS als Karteikasten
-
-Wie Sie vielleicht schon bemerkt haben, ähnelt die zweite Form der
-Darstellung einer Karteikarte, auf der Platz für bestimmte Einträge
-freigehalten wird. Anhand dieses Modells können Sie sich in vielen
-Fällen die Arbeitsweise von EUDAS veranschaulichen. Sie sollten die
-Analogie allerdings nicht zu weit treiben: EUDAS schaufelt ja nicht
-wirklich mit Karteikarten herum. Manche Funktionen sind eben
-computerspezifisch und ließen sich mit Karteikarten gar nicht
-durchführen.
- Mit EUDAS können Sie die möglichen Einträge auf den Karteikar­
-ten (also die Attribute) völlig frei bestimmen; die einzige Beschrän­
-kung besteht darin, daß Sie in einem Karteikasten nur Karten mit
-völlig gleichem Aufbau verwenden können. Wenn Sie eine neue Kar­
-teikarte entwerfen wollen, brauchen Sie nur Namen für die einzel­
-nen Einträge anzugeben. EUDAS zeigt Ihnen dann quasi eine Karte
-am Bildschirm, in der diese Einträge aufgeführt sind.
- Sie können nun am Bildschirm Daten auf diese Karteikarten
-schreiben. Dabei dürfen die Einträge fast beliebig lang sein; wenn
-der Platz auf dem Bildschirm nicht reicht, können Sie sich Ihre
-überdimensionale Karteikarte in Ausschnitten ansehen.
- Die einmal eingegebenen Daten bleiben nun so lange gespei­
-chert, wie Sie wollen (bzw. bis Ihr Rechner zusammenfällt). Haben
-Sie beim Eintragen Fehler gemacht, können Sie diese jederzeit kor­
-rigieren oder später noch weitere Informationen ergänzen.
-
-#free (7.5)#
-
-#center#Abb. 1-1 EUDAS als Karteikasten
-
-
-#on("b")#Anwendungen#off("b")# Mit den gespeicherten Daten können Sie nun
-ver­
-schiedene Dinge anstellen (bzw. vom Rechner anstellen lassen). Das
-Einfachste ist natürlich das, was Sie mit einer Kartei auch machen
-würden, sich nämlich einzelne Karteikarten anzuschauen.
- Um eine bestimmte Karteikarte herauszufinden, geben Sie
-EUDAS einfach den Inhalt vor, nach dem gesucht werden soll. Hier
-zeigt sich bereits der erste Vorteil eines Computers: Die Suche in
-der EUDAS-Kartei ist viel schneller, als Sie es von Hand könnten.
-Außerdem kann der Rechner keine Karte zufällig übersehen.
- EUDAS zeigt sich auch dann überlegen, wenn Sie einen ganz
-bestimmten Teil der Kartei durchforsten müssen. Eine Bücherei muß
-z.B. regelmäßig alle Bücher heraussuchen, deren Leihfrist über­
-schritten ist. Der Computer durchsucht in solchen Fällen ermü­
-dungsfrei auch große Datenmengen.
- Wenn Sie die Karteikarten in einer bestimmten Reihenfolge
-haben wollen, kann EUDAS auch das Sortieren übernehmen. Weitere
-automatische Vorgänge betreffen z.B. das Rauswerfen überflüssiger
-oder veralteter Karten. Die Einträge können auch nach einer be­
-stimmten Vorschrift alle geändert werden. Solche Aufgaben treten
-z.B. in der Schule auf, wo die Schüler jedes Jahr versetzt werden
-müssen (natürlich bis auf Ausnahmen).
- Auch Beziehungen zwischen verschiedenen Karteien kann
-EUDAS herstellen. Dies kann man noch einmal an dem Beispiel der
-Bücherei illustrieren. Wenn ein Buch gefunden wurde, dessen Leih­
-frist überschritten ist, muß der zugehörige Ausleiher gefunden und
-angeschrieben werden. Das Heraussuchen beider Karten kann EUDAS
-in einem Arbeitsgang durchführen.
-
-
-1.3 Drucken
-
-Eine besondere Stärke von EUDAS ist die Möglichkeit, die gespei­
-cherten Daten in schriftlicher Form auszuwerten. Dadurch, daß die
-Daten in einer Form gespeichert sind, die den Inhalt widerspiegelt,
-können die gleichen Daten in vielen verschiedenen Formen auf
-Papier ausgegeben werden.
-
-
-
-
- Karl Eudas
- An Poltersdorf
- XXXXXXXXXXX
- XXXXXXXXXXX
-
- XXXX XXXXXXXXXXXX
-
- Lieber XXXXXXX !
-
- Dies ist ein Beispiel für ein
- Druckmuster.
-
- Viele Grüße
-
-
-
-#center#Abb. 1-2 Muster für die Druckausgabe
-
-
-Zu diesem Zweck geben Sie EUDAS ein Muster des gewünschten Aus­
-drucks vor. Der Rechner setzt dann an entsprechend markierten
-Leerstellen die gespeicherten Informationen ein und druckt das
-Ergebnis aus. Auf diese Weise ersparen Sie sich die umfangreiche
-Schreibarbeit, die anfällt, wenn die Informationen auf den Kartei­
-karten in anderer Form benötigt werden.
- Natürlich müssen Sie zum Entwerfen des Formulars kein ge­
-wiefter Programmierer sein. Wenn Sie einen Rundbrief verschicken
-wollen, schreiben Sie den Brief, als wollten Sie Ihn nur einmal
-schicken. Lediglich im Adressfeld müssen Sie Platzhalter an den
-Stellen vorsehen, an denen später die wirklichen Adressen stehen
-sollen.
-
-#on("b")#Verwendungsmöglichkeiten#off("b")# Die Möglichkeiten für solche
-Formulare
-sind unbegrenzt. Beispiele sind Briefe, Adreßaufkleber, Überwei­
-sungsaufträge und sortierte Listen. Mit den Inhalten einer Kartei
-können Sie beliebig viele verschiedene Ausgaben erzeugen. Bei dem
-obigen Beispiel der Leihbücherei könnten Sie EUDAS dazu einsetzen,
-nicht nur die säumigen Ausleiher herauszufinden, sondern die Mah­
-nung gleich fertig für einen Fensterbriefumschlag herzustellen. Für
-den Bediener bliebe die einzige Tätigkeit, diesen Vorgang anzuwer­
-fen.
- Wie weiter oben schon erwähnt, können Sie diese Ausgaben von
-EUDAS auch zur Textverarbeitung übernehmen. So können Sie zum
-Beispiel die Literaturliste für ein Buch mit EUDAS führen und Aus­
-züge später jeweils an die passenden Stellen einfügen.
-
-#on("b")#Berechnungen#off("b")# Die Druckfunktion von EUDAS kann jedoch nicht
-nur
-zum Ausfüllen von Formularen verwendet werden. Wenn Sie Berech­
-nungen anstellen oder Auswertungen vornehmen wollen, können Sie
-im Druckmuster auch Anweisungen der Sprache ELAN verwenden.
-Damit haben Sie eine komplette Programmiersprache für Ihre Muster
-zur Verfügung.
- Ehe Sie einen Schreck bekommen: Selbst für komplizierte Muster
-brauchen Sie nur einen ganz kleinen Teil von ELAN zu beherrschen,
-da die meiste Arbeit immer von EUDAS übernommen wird (Sie müssen
-also nicht etwa selber ein ganzes Programm schreiben).
- Anwendungen für diese Möglichkeit gibt es genug. Angefangen
-von einfachen Zählungen bis hin zu statistischen Auswertungen,
-von einfachen Summen bis zum kompletten Rechnungsschreiben.
-Immer nimmt Ihnen EUDAS alles das ab, was automatisch ablaufen
-kann. Sie versorgen EUDAS nur noch mit den passenden Formeln für
-Ihre Anwendung.
-
-
-1.4 Grenzen
-
-Natürlich können Sie nicht alle Probleme mit EUDAS gleichermaßen
-gut lösen. EUDAS verwendet ein einfaches Modell (Karteikasten) und
-versucht, mit möglichst wenig Informationen von Ihrer Seite auszu­
-kommen. Kompliziertere Sachverhalte verlangen auch kompliziertere
-Strukturen, die Sie dann selbst entwerfen müssen. Eine einfache
-Lösung mit EUDAS kann in solchen Fällen zu langsam oder zu um­
-ständlich sein.
- Wenn Sie jedoch die wenigen Strukturprinzipien von EUDAS
-verstanden haben, werden Sie sehr schnell viele Probleme mit
-EUDAS lösen können. Zuerst erfassen Sie einfach alle Daten, die Sie
-brauchen und überlegen sich erst dann, in welcher Form Sie diese
-Daten haben wollen. Auch nachträglich können Sie jederzeit noch
-neue Daten und Formulare hinzufügen, so daß Sie mit der Zeit
-EUDAS gewinnbringend für viele Routineaufgaben benutzen werden.
-
diff --git a/doc/eudas/eudas.hdb.10 b/doc/eudas/eudas.hdb.10
deleted file mode 100644
index 442f575..0000000
--- a/doc/eudas/eudas.hdb.10
+++ /dev/null
@@ -1,510 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (97)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-10 Datenabfrage am Bildschirm
-
-
-
-10.1 Feldauswahl
-
-Da die Anzahl der möglichen Felder bei EUDAS-Dateien viel größer
-ist als die Anzahl der zur Verfügung stehenden Zeilen auf dem
-Bildschirm (255 gegenüber 22), muß es eine Möglichkeit geben, auch
-die übrigen Felder anzusehen.
-
-#on("b")#Rollen#off("b")# Dazu kann man den Bildschirmausschnitt in
-vertikaler
-Richtung #on("i")#rollen#off("i")#. Sie müssen sich die Bildschirmanzeige als einen
-Ausschnitt des wirklichen Satzes vorstellen. Um weitere Inhalte des
-Satzes zu sehen, verschieben Sie den Ausschnitt einfach.
- Dazu dienen die beiden Tastenkombinationen ESC OBEN und ESC
-UNTEN. Diese Kombinationen wirken nur im Menü "Einzelsatz". An
-der Bildschirmanzeige ändert sich natürlich nur dann etwas, wenn
-es noch weitere Felder zum Anzeigen gibt.
- Ob dies der Fall ist, können Sie an zwei Indikatoren ablesen.
-Zum einen wird hinter dem letzten Feld eine markierte Abschluß­
-zeile ausgegeben. Ist diese nicht sichtbar, gibt es noch Felder, die
-Sie mit ESC UNTEN hochholen können. Zum anderen steht die Num­
-mer der ersten Zeile in der Überschrift. Ist diese Nummer größer als
-1, können Sie mit ESC OBEN noch Felder sichtbar machen.
- Das Rollen ist oft auch dann notwendig, wenn sich ein Feld
-über mehrere Zeilen erstreckt. In diesem Fall kann es passieren,
-daß die erste Zeile des Feldes nicht mehr sichtbar ist, da sie ober­
-halb des Anzeigebereichs liegen würde.
-
-#on("b")#Feldauswahl#off("b")# Eine weitere Möglichkeit bei zu vielen Feldern
-be­
-steht darin, nur die interessanten Felder zur Anzeige auszuwählen.
-Dies geschieht mit der Funktion
-#free (0.2)#
-
- F Feldauswahl
-
-#free (0.2)#
-Ihnen werden alle Felder zur Auswahl angeboten. Kreuzen Sie die
-Felder an, die Sie sehen wollen und denken Sie daran, daß die Rei­
-henfolge des Ankreuzens beachtet wird. Anschließend werden Ihnen
-nur die ausgewählten Felder angezeigt. Falls Sie kein Feld ankreu­
-zen, bleibt die alte Feldauswahl bestehen.
- Wollen Sie wieder alle Felder sehen, müssen Sie diese nicht alle
-einzeln ankreuzen. Mit HOP 'x' in der Auswahl werden alle Felder
-angekreuzt (die noch nicht angekreuzt waren). Diese Tastenkombi­
-nation können Sie allgemein bei einer Auswahl verwenden. Sie
-können die Kreuzchen mit 'o' auch wieder löschen, um zum Beispiel
-"alle außer einem" auszuwählen.
- Beachten Sie, daß die Auswahl der anzuzeigenden Felder nichts
-mit der eigentlichen Dateistruktur zu tun hat, sondern nur für die
-Anzeige gilt. Den Verarbeitungsfunktionen (zum Beispiel Drucken)
-stehen natürlich nach wie vor alle Felder zur Verfügung.
- Unvermutete Effekte können dann entstehen, wenn Sie bei
-einer eingestellten Feldauswahl ändern oder einfügen. Die nicht
-ausgewählten Felder werden beim Ändern natürlich nicht geändert
-und beim Einfügen einfach leer gelassen.
-
-
-10.2 Satzeditor
-
-An dieser Stelle sollen noch einige weitere Funktionen des Satz­
-editors vorgestellt werden, die Sie noch nicht kennengelernt haben.
-
-#on("b")#Rollen im Satzeditor#off("b")# Sie können auch rollen, wenn Sie sich
-im
-Satzeditor befinden (also beim Suchen, Einfügen und Ändern). Den­
-ken Sie daran, daß Sie die Einzelsatzanzeige immer mit ESC OBEN
-und ESC UNTEN rollen, während sonst (Editor, Auswahl von Datei­
-namen) immer mit HOP OBEN und HOP UNTEN gerollt wird.
- Diese Diskrepanz hat technische Gründe und läßt sich leider
-nicht vermeiden. Wie Sie sich vielleicht erinnern, führt das Blättern
-mit HOP OBEN und HOP UNTEN im Satzeditor dazu, daß die Korre­
-spondenz zwischen Feldnamen und Feldinhalt verlorengeht. Daher
-muß an dieser Stelle mit ESC statt HOP gearbeitet werden.
-
-#on("b")#Ähnliche Sätze#off("b")# Wenn Sie mehrere ähnliche Sätze eintragen
-müssen,
-bietet Ihnen EUDAS eine Erleichterung an. Sie können nämlich beim
-Einfügen die Daten eines anderen Satzes übernehmen.
- Dazu müssen Sie beim Ändern oder Einfügen des anderen Satzes
-ESC 'p' drücken. Der Inhalt des Satzes wird dann in einen Zwischen­
-speicher gebracht. Beachten Sie, daß im Gegensatz zum EUMEL-
-Editor kein Text markiert sein muß, sondern immer der ganze Satz
-transportiert wird.
- Beim Einfügen eines neuen Satzes können Sie diesen Satz dann
-mit ESC 'g' in den Satzeditor übernehmen. Alle vorherigen Inhalte
-werden überschrieben. Anschließend können Sie die Daten nach
-Wunsch abändern.
- Der Inhalt des Zwischenspeichers kann beliebig oft auf diese
-Weise kopiert werden. Der Inhalt des Zwischenspeichers wird bei
-Ändern der Feldauswahl oder beim Öffnen einer neuen Datei ge­
-löscht.
-
-#on("b")#Tagesdatum#off("b")# Im Satzeditor können Sie mit ESC 'D' das
-aktuelle
-Tagesdatum abfragen. Es wird an der aktuellen Cursorposition ein­
-getragen, als ob Sie es selbst getippt hätten.
- Auf diese Weise können Sie Sätze einfach mit Datum versehen
-oder nach Sätzen suchen, die mit dem Tagesdatum in Beziehung
-stehen (zum Beispiel 'Fälligkeit = Heute').
-
-
-10.3 Suchmuster
-
-Die bisher genannten Möglichkeiten des Suchmusters sind noch
-etwas beschränkt. Eine Bedingung in unserer Adressendatei, die wir
-im Suchmuster noch nicht ausdrücken können, wäre zum Beispiel:
-Suche alle Adressen der Personen, die Wegner oder Simmern heißen.
- Diese Alternative, Wegner ODER Simmern, kann nun in EUDAS
-durch ein Komma ausgedrückt werden:
-
-
- Name Wegner,Simmern
- Vorname
-
-
-Beachten Sie, daß hinter dem Komma kein Leerzeichen folgen darf,
-wie Sie es vielleicht gewohnt sind, in einem Text zu schreiben.
-EUDAS kann nämlich nicht unterscheiden, ob Sie das Leerzeichen
-nur aus optischen Gründen geschrieben haben, oder ob Sie danach
-suchen wollen.
-
-#on("b")#Lokale Alternative#off("b")# Die eben beschriebene
-Konstruktionsmethode
-heißt #on("i")#lokale Alternative#off("i")#. Lokal deshalb, weil Sie nur innerhalb
-eines Feldes gilt. Was das bedeuten soll, sehen Sie, wenn Sie die
-Bedingung mit einer weiteren Bedingung für ein anderes Feld kom­
-binieren:
-
-
- Name Wegner,Simmern
- Vorname
- Strasse
- PLZ 5*
- Ort
-
-
-Dieses Muster hat die Bedeutung: Wähle alle Personen namens Weg­
-ner oder Simmern aus, die im PLZ-Bereich 5 wohnen. Die beiden
-Bedingungen für den Namen sind mit der Bedingung für die PLZ mit
-UND verknüpft - das heißt, eine der beiden ersten Bedingungen muß
-zutreffen #on("i")#und#off("i")# die untere Bedingung. Dieses UND ist global, da es
-Bedingungen für verschiedene Felder miteinander verbindet.
- Natürlich können Sie für mehrere Felder gleichzeitig lokale
-Alternativen angeben. Eine anderes Suchmuster könnte zum Beispiel
-so aussehen:
-
-
- Name Wegner,Simmern
- Vorname
- Strasse
- PLZ 5,5000
- Ort
-
-
-In diesem Fall muß eine ausgewählte Person Wegner oder Simmern
-heißen und in Köln wohnen.
-
-#on("b")#Globale Alternative#off("b")# Es wird nun aber für bestimmte
-Situationen
-noch eine andere Art von Alternativen benötigt. Als Beispiel soll
-ein Suchmuster dienen, das folgende Bedingung ausdrückt. Gesucht
-ist eine weibliche Person mit Namen Simmern oder eine männliche
-Person mit Namen Wegner.
- Dieser Fall läßt sich mit unseren bisherigen Mitteln nicht lö­
-sen. Es wird nämlich eine Alternative zwischen zwei zusammen­
-gesetzten Bedingungen gefordert. Als Ausweg bietet sich an, prak­
-tisch mehrere Suchmuster anzugeben, die dann mit ODER verknüpft
-werden.
- Um diese verschiedenen Suchmuster optisch am Bildschirm zu
-kennzeichnen, wird ein Semikolon als sogenannte #on("i")#globale Alternati­
-ve#off("i")# verwendet. Das Semikolon trennt das Suchmuster quasi in ver­
-schiedene Spalten auf, die jeweils eine eigene Bedingung enthalten
-können. Unser gewünschtes Suchmuster würde also so aussehen:
-
-
- Name Wegner;Simmern
- Vorname
- Strasse
- PLZ
- Ort
- m/w m;w
-
-
-Ebenso wie bei lokalen Alternativen darf hinter dem Semikolon kein
-Leerzeichen folgen. Daher kann das zweite Semikolon auch nicht
-direkt unter dem ersten stehen. Die Spalten werden also einfach nur
-durchgezählt: nach dem ersten Semikolon beginnt die zweite Spal­
-te, nach dem zweiten Semikolon die dritte usw.
- In Zeilen, in denen keine Bedingungen stehen, kann auch das
-Semikolon weggelassen werden. Es kann ebenfalls weggelassen wer­
-den, wenn die weiteren Spalten leer sind. Steht ein Semikolon direkt
-am Anfang der Zeile, so ist die erste Spalte leer.
- Um dies zu illustrieren, sei hier noch ein weiteres Beispiel
-angegeben:
-
-
- Name Wegner
- Vorname ;Anna-Maria
- Strasse
-
-
-In diesem Fall muß eine ausgewählte Person mit Nachnamen Wegner
-oder mit Vornamen Anna-Maria heißen.
-
-#on("b")#Stern#off("b")# Bis jetzt haben Sie hauptsächlich Bedingungen
-betrachtet,
-die exakt zutreffen mußten. Sie wissen aber bereits, daß man auch
-Bedingungen angeben kann, bei denen nur ein Teil des zu suchen­
-den Feldes bekannt ist, nämlich indem der unbekannte Teil mit
-einem Stern markiert wird.
- In Kapitel 5 haben Sie gelernt, daß der Stern nur am Anfang
-und Ende des Musters stehen kann. Dies trifft nicht ganz zu, denn
-Sie können den Stern auch inmitten eines Textes anwenden. So
-trifft die Bedingung 'Si*n' auf alle Namen zu, die mit 'Si' beginnen
-und mit 'n' enden.
- Beachten Sie hier das "und" in der Formulierung der Bedingung.
-Das Muster ist eigentlich eine Schreibweise für zwei Bedingungen
-für ein Feld, die mit UND verknüpft sind.
- Sie können auch noch weitere Sterne in das Muster aufnehmen.
-Dabei gibt es jedoch eine Kleinigkeit zu beachten. Das Muster
-'*x*y*' bedeutet: das Feld muß ein 'x' und ein 'y' enthalten. Über
-die Reihenfolge der beiden Zeichen ist jedoch in dieser Bedingung
-nichts gesagt, obwohl es vielleicht vom Aussehen suggeriert wird.
- Denken Sie daran, keine zwei Sterne nebeneinander zu schrei­
-ben - eine solche Bedingung hätte keinen Sinn.
- Es gibt eine weitere spezielle Bedingung, die mit Hilfe des
-Sterns formuliert wird. Ein einzelner Stern bedeutet nämlich: Das
-Feld ist nicht leer. Beachten Sie den kleinen Unterschied: ein Stern
-in einem Muster kann für einen beliebigen Text stehen, der auch
-leer sein kann. Ein einzelner Stern jedoch steht für einen beliebigen
-Text, der nicht leer ist.
- Damit Sie ein Gefühl für die Verwendung des Sterns bekommen,
-hier noch ein paar Beispiele:
-
-
-Mei*r*
-
- Der Name beginnt mit 'Mei' und enthält ein 'r'. Trifft zu auf
- 'Meier', 'Meiring', aber nicht auf 'Meiling' oder 'Merzei'.
-
-
-Donau*dampf*schiff*schaft
-
- Feld beginnt mit 'Donau', endet mit 'schaft' und enthält
- 'dampf' und 'schiff'. Trifft zu auf 'Donaudampfschiffahrtsge­
- sellschaft', aber auch auf 'Donaugesellschiffdampffahrtschaft'.
-
-
-Roller*erfahren
-
- Dieses Muster muß man ganz genau interpretieren. Es bedeutet:
- der Inhalt beginnt mit 'Roller' und endet mit 'erfahren'. Das
- Muster trifft nicht nur auf 'Roller erfahren' sondern auch auf
- 'Rollerfahren' zu. Der Stern verliert also in diesem Fall seine
- symbolische Bedeutung als Platzhalter für einen bestimmten
- Text.
-
-#on("b")#Vergleiche#off("b")# Es gibt in EUDAS noch weitere Muster, die
-einen gan­
-zen Bereich von Werten auswählen. Diese betreffen Bedingungen der
-Art "größer als" und "kleiner als". Solche Vergleichsbeziehungen
-werden durch zwei Punkte dargestellt.
- So wählt das Muster 'K..' alle Felder aus, die in der alphabe­
-tischen Reihenfolge hinter 'K' liegen, wobei das 'K' selbst mit ein­
-geschlossen ist. Umgekehrt trifft '..K' auf alle Felder zu, die davor
-liegen.
- Sie können beide Bedingungen auch kombinieren. So trifft die
-Bedingung 'A..K' auf alle Felder zu, die im Lexikon unter 'A' bis
-'J' erscheinen (die Felder mit 'K' sind hier ausgeschlossen). Beach­
-ten Sie, daß die direkte Kombination wieder die Verknüpfung zweier
-einzelner Bedingungen mit UND darstellt.
-
-#on("b")#Negation#off("b")# Um den Bereich möglicher Suchmuster noch zu
-erweitern,
-können Sie einzelne Bedingungen auch noch verneinen. Dies ge­
-schieht durch Voranstellen zweier Minuszeichen. So bedeutet das
-Muster '--Meier', daß alle Personen ausgewählt werden, die nicht
-Meier heißen.
- Die Verneinung bezieht sich immer auf das unmittelbar folgende
-Muster (bis zum nächsten Komma, Semikolon oder dem Zeilenende)
-und nicht etwa auf eine ganze Zeile. Sie umfaßt jedoch die UND-
-Verknüpfung der kombinierten Bedingungen. So sind zum Beispiel die
-Muster '--E..M', '--E..,--..M' und '..E,M..' völlig gleichbedeu­
-tend.
-
-#on("b")#Feldvergleich#off("b")# Als letztes haben Sie im Suchmuster auch
-noch die
-Möglichkeit, ein Feld mit anderen Feldern des gleichen Satzes zu
-vergleichen. Bisher hatten Sie ein Feld ja immer nur mit konstanten
-Texten verglichen.
- Um dies zu erreichen, geben Sie statt eines Vergleichstextes
-den Feldnamen des Feldes an, mit dem Sie vergleichen wollen. Zur
-Kennzeichnung müssen Sie dem Namen noch ein '&' voranstellen.
-Diese Konstruktion funktioniert mit allen bisher besprochenen Ver­
-gleichen. Beispielsweise trifft
-
-
- Feld1 ..&Feld2
-
-
-auf alle Sätze zu, in denen der Inhalt von Feld1 kleiner ist als der
-Inhalt von Feld2.
- Im Gegensatz zum Druckmuster dürfen in den Feldnamen zwar
-Leerzeichen enthalten sein, nicht jedoch
-#free (0.2)#
-
- .. * , ;
-
-#free (0.2)#
-da diese Zeichen als reservierte Zeichen gelten und jeweils als
-Begrenzer wirken. Die gleiche Beschränkung gilt dementsprechend
-auch für konstante Vergleichstexte.
- Beachten Sie, daß hinter dem '&' bis zum nächsten Begrenzer­
-zeichen ein gültiger (vorhandener) Feldname stehen muß. Anderen­
-falls wird der Text als konstantes Muster betrachtet.
- Wie schon oben gesagt, kann der Feldvergleich mit allen Ver­
-gleichen verwendet werden. Auch gemischte Konstruktionen sind
-zulässig, beispielsweise
-
-
- Feld1 A..&Feld3,*&Feld9*
-
-
-Diese Bedingung trifft zu, wenn Feld1 größer oder gleich 'A', aber
-kleiner als der Inhalt von Feld3 ist, oder wenn der Inhalt von Feld9
-darin vorkommt.
-
-#on("b")#Optimierung#off("b")# Hier noch eine Bemerkung zur Geschwindigkeit
-des
-Suchens. Je mehr Bedingungen Sie angeben, desto mehr Vergleiche
-müssen beim Suchen angestellt werden und desto länger dauert es.
- Das erste Feld einer Datei erfährt jedoch eine Sonderbehand­
-lung. Wenn Sie für dieses Feld ein Muster für Übereinstimmung
-angeben, kann der Suchvorgang enorm beschleunigt werden, da das
-erste Feld einer Datei intern speziell verwaltet wird. Damit das
-Verfahren funktioniert, dürfen keine globalen Alternativen oder
-lokale Alternativen für das erste Feld verwendet werden.
- Diese Suchoptimierung sollten Sie bereits beim Einrichten einer
-Datei berücksichtigen. Geben Sie als erstes Feld das an, nach dem
-am ehesten direkt gesucht wird. Typisches Beispiel hierfür ist der
-Nachname, aber auch Artikelnummern sind sinnvoll. Wichtig ist, daß
-das erste Feld nicht zu oft identisch ist und auch mehr als zwei
-Buchstaben enthält, damit die Optimierung ihre volle Wirksamkeit
-entfaltet.
- Denken Sie daran, daß durch die Feldauswahl ein beliebiges
-Feld als erstes auf dem Bildschirm stehen kann. Für die Optimierung
-wird jedoch immer das Feld betrachtet, das beim Einrichten der
-Datei als erstes angegeben wurde.
-
-
-10.4 Markieren
-
-Manchmal entsteht die Situation, daß Sie eine Reihe von Sätzen
-bearbeiten wollen, aber keine Suchbedingung formulieren können,
-die auf alle diese Sätze zutrifft. In diesem Fall bietet EUDAS Ihnen
-die Möglichkeit, solche Sätze von Hand zu markieren.
- Ein Beispiel: Sie haben eine ganze Reihe von Sätzen geändert
-und wollen diese Änderungen als Protokoll ausdrucken. Es läßt sich
-aber nicht mit Hilfe eines Suchmusters feststellen, welche Sätze
-geändert wurden.
- Als Abhilfe wählen Sie bei jedem geänderten Satz die Funktion
-#free (0.2)#
-
- M Markierung
-
-#free (0.2)#
-Dadurch wird der bisher unmarkierte Satz markiert. Dies wird
-kenntlich an der Anzeige 'MARK+' in der Ãœberschrift. Sobald Sie den
-ersten Satz markiert haben, erscheint bei jedem Satz, ob er markiert
-ist oder nicht.
- Haben Sie einen Satz irrtümlich markiert, können Sie die Mar­
-kierung mit der gleichen Funktion auch wieder entfernen.
- Alle Funktionen, die bisher die durch das Suchmuster ausge­
-wählten Sätze bearbeitet haben, arbeiten nun nur noch auf den
-markierten Sätzen. Somit können Sie anschließend mit der Druck­
-funktion die gewünschten Sätze drucken. Die Markierung hat also
-Priorität über die eingestellte Suchbedingung. Lediglich die Bewe­
-gung am Bildschirm beachtet immer nur die Suchbedingung.
- Sie können alle Markierungen der Datei mit der Funktion
-#free (0.2)#
-
- Alle Markier.
- L Löschen
-
-#free (0.2)#
-im Menü 'Gesamtdatei' wieder entfernen. Anschließend wird beim
-Drucken wieder das Suchmuster beachtet. Die Markierungen ver­
-schwinden auch, wenn eine neue Datei geöffnet wird. Die Markie­
-rungen sind also nicht permanent in einer Datei gespeichert, son­
-dern existieren nur, während die Datei geöffnet ist.
- Bei Koppeldateien können Sie aus technischen Gründen immer
-nur alle Kombinationen auf einmal markieren. Die Markierung einer
-Kombination markiert auch alle anderen Kombinationen des gleichen
-Satzes.
-
-
-10.5 Ãœbersicht
-
-Wie Sie bisher gesehen haben, zeigte EUDAS immer einen einzigen
-Satz in dem Standardformular auf dem Bildschirm. Es gibt jedoch
-auch eine Möglichkeit, mehrere Sätze gleichzeitig zu betrachten.
-Dazu dient die Funktion
-#free (0.2)#
-
- U Ãœbersicht
-
-#free (0.2)#
-im Menü 'Gesamtdatei'.
- In der Ãœbersicht nimmt jeder Satz nur eine Bildschirmzeile in
-Anspruch. Die Feldinhalte werden, durch Komma getrennt, in der
-Zeile nacheinander aufgezählt, bis kein Platz mehr vorhanden ist.
-Am Anfang jeder Zeile steht die Satznummer und ob der jeweilige
-Satz markiert ist (entweder '+' für markiert oder '-'). In der Über­
-schrift stehen in gleicher Weise die Feldnamen angegeben.
- Der aktuelle Satz wird innerhalb der Ãœbersichtsanzeige immer
-durch eine inverse Satznummer dargestellt. Es werden nur die durch
-das eingestellte Suchmuster ausgewählten Sätze gezeigt. Trifft die
-Selektionsbedingung nicht auf den aktuellen Satz zu, wird an seiner
-Stelle zur Information ein leerer Platzhalter angezeigt. Hinter dem
-letzten Satz wird auch das Dateiende als besonders gekennzeichne­
-ter Satz angegeben.
-
-___________________________________________________________________________________________
-
- ÜBERSICHT: Blättern: HOP OBEN, HOP UNTEN Ende: ESC q Hilfe: ESC ?
- Satznr. Name, Vorname, PLZ, Ort, Strasse, m/w,
- 1 - Wegner, Herbert, Krämergasse 12, 5000, Köln, m,
- 2 - Sandmann, Helga, Willicher Weg 109, 5300, Bonn 1, w,
- 3 - Katani, Albert, Lindenstr. 3, 5210, Troisdorf, m,
- 4 - Ulmen, Peter, Mozartstraße 17, 5, Köln 60, m,
- 5 - Regmann, Karin, Grengelweg 44, 5000, Köln 90, w,
- 6 - Arken, Hubert, Talweg 12, 5200, Siegburg, m,
- 7 - Simmern, Anna-Maria, Platanenweg 67, 5, Köln 3, w,
- 8 - Kaufmann-Drescher, Angelika, Hauptstr. 123, 53, Bonn 2, w,
- 9 - Fuhrmann, Harald, Glockengasse 44, 5000, Köln 1, m,
- 10 - Seefeld, Friedrich, Kabelgasse, 5000, Köln-Ehrenfeld, m,
- 11 - << DATEIENDE >>
-
-___________________________________________________________________________________________
-
-
-#center#Abb. 10-1 Ãœbersicht
-
-
-#on("b")#Feldauswahl#off("b")# Wenn Sie die Funktion aufrufen, haben Sie
-zuerst
-noch die Möglichkeit, nur einen Teil der vorhandenen Felder zur
-Anzeige auszuwählen. Dazu bejahen Sie die Frage und können dann
-die Felder in der gewünschten Reihenfolge ankreuzen. Analog zur
-Funktion 'Feldauswahl' wird auch hier die zuletzt für die Übersicht
-verwendete Feldauswahl beibehalten, wenn Sie die Frage verneinen
-oder kein Feld ankreuzen. Die Feldauswahl für die Übersicht ist
-unabhängig von der Feldauswahl für die normale Satzanzeige.
- Von der Möglichkeit zur Feldauswahl sollten Sie Gebrauch ma­
-chen, denn durch die komprimierte Darstellung der Ãœbersicht kann
-meistens nur ein kleiner Teil eines Satzes dargestellt werden.
-
-#on("b")#Rollen#off("b")# Nachdem die Sätze auf dem Bildschirm erschienen
-sind,
-haben Sie wieder die Möglichkeit, die Darstellung zu rollen. Dazu
-können Sie die Pfeiltasten OBEN und UNTEN sowie die Tastenkombi­
-nationen HOP OBEN und HOP UNTEN verwenden. Diese Funktionen
-verschieben den invers dargestellten aktuellen Satz und funktio­
-nieren wie im Editor. Beachten Sie auch hier wieder den Unterschied
-zum Rollen in der Einzelsatzanzeige.
- Das Rollen wirkt wie ein Positionieren mit 'Weiter' oder 'Zu­
-rück'. Nach der Rückkehr aus der Übersicht können Sie sich also an
-einer ganz anderen Stelle in der Datei befinden.
- Es stehen Ihnen zum Rollen auch noch die folgenden Tasten­
-kombinationen zur Verfügung (wie im Editor): HOP RETURN macht
-den aktuellen Satz zum ersten auf der Seite. ESC '1' zeigt den er­
-sten Satz der Datei, ESC '9' analog dazu den letzten.
- Wenn Sie eine komplizierte Suchbedingung eingestellt haben
-und EUDAS viele Sätze erfolglos überprüfen muß, dauert der Bild­
-aufbau natürlich entsprechend lange. EUDAS gibt zu Ihrer Informa­
-tion aber immer die Nummer des Satzes aus, der gerade überprüft
-wird. Außerdem werden Tastenbefehle nach jeder Zeile angenommen,
-so daß Sie schon weiterblättern können, wenn Sie den ersten Satz
-gesehen haben.
-
-#on("b")#Markieren#off("b")# In der Übersicht können Sie auch Sätze
-markieren. Mit
-'+' markieren Sie den aktuellen Satz; mit '-' entfernen Sie die Mar­
-kierung wieder. So können Sie einfach die Sätze ankreuzen, die Sie
-später bearbeiten wollen.
-
-#on("b")#Verlassen#off("b")# Mit ESC 'q' können Sie die Übersicht wieder
-verlassen,
-auch mitten beim Aufbau des Bildes. Haben Sie erkannt, daß EUDAS
-sinnlos mit einer falschen Suchbedingung sucht, können Sie die
-Funktion auch mit ESC 'h' (Halt) abbrechen und gegebenenfalls ein
-neues Suchmuster einstellen.
-
diff --git a/doc/eudas/eudas.hdb.11 b/doc/eudas/eudas.hdb.11
deleted file mode 100644
index 6a59847..0000000
--- a/doc/eudas/eudas.hdb.11
+++ /dev/null
@@ -1,674 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (109)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-11 Funktionen zur Bearbeitung
-
-
-
-11.1 Sortieren
-
-Wenn Sie die Sätze in Ihrer EUDAS-Datei in einer bestimmten Rei­
-henfolge haben wollen (dies wird in vielen Fällen zum Drucken
-verlangt), müssen Sie die Datei sortieren. Sie können EUDAS ange­
-ben, in welcher Reihenfolge die Sortierung erfolgen soll. Um die
-aktuelle Datei zu sortieren, rufen Sie die Funktion
-#free (0.2)#
-
- Akt. Datei
- S Sortieren
-
-#free (0.2)#
-auf. Falls die Datei noch nie sortiert wurde, wird Ihnen auf jeden
-Fall die Sortierreihenfolge zum Auswählen angeboten. Anderenfalls
-werden Sie gefragt, ob Sie die vorherige Sortierreihenfolge ändern
-wollen.
- Das Sortieren wird als Veränderung betrachtet und nur auf der
-Arbeitskopie durchgeführt!
-
-#on("b")#Sortierreihenfolge#off("b")# Die Sortierreihenfolge gibt an, welche
-Felder in
-welcher Reihenfolge beim Vergleichen zweier Sätze benutzt werden
-sollen. Zuerst wird das an erster Stelle angegebene Feld verglichen.
-Sind die Inhalte hier unterschiedlich, wird die Einordnung der Sätze
-nach diesem Feld bestimmt.
- Sind die Inhalte in diesem Feld aber gleich, so wird nach dem
-nächsten Feld verglichen. Ist kein weiteres Feld in der Sortierrei­
-henfolge angegeben, wird der Vergleich an dieser Stelle mit einem
-zufälligen Ergebnis abgebrochen, das heißt, es kann nicht vorher­
-gesagt werden, welcher der beiden Sätze zuerst kommt.
- Die Sortierreihenfolge können Sie in einer Menüauswahl einge­
-ben. Kreuzen Sie die Felder an, die Sie vergleichen wollen und ach­
-ten Sie auf die richtige Reihenfolge. Die eingegebene Reihenfolge
-wird in der Datei gespeichert, um beim nächsten Sortiervorgang
-wiederverwendet zu werden.
- Nachdem Sie alle bei der Sortierung zu berücksichtigenden
-angekreuzt haben, werden Sie für jedes dieser Felder gefragt, ob
-nach dem Feld aufsteigend oder absteigend sortiert werden soll.
-
-#on("b")#Ablauf#off("b")# Der Ablauf des Sortierens wird durch Ausgabe von
-Satz­
-nummern dargestellt. Bis zur ausgegebenen Satznummer sind alle
-Sätze richtig sortiert. Bei Bedarf kann der Vorgang durch SV und
-dann 'halt' abgebrochen werden. Die Datei bleibt dabei auf jeden
-Fall intakt.
-
-#on("b")#Optimierung#off("b")# Die gespeicherte Sortierreihenfolge wird auch
-noch zu
-einer weiteren Optimierung benutzt. Wenn eine Datei sortiert war
-und nur wenige Änderungen stattgefunden haben, brauchen beim
-nächsten Sortiervorgang nur die wenigen veränderten Sätze einzeln
-einsortiert zu werden. Das funktioniert natürlich nur unter der
-Voraussetzung, daß die gleiche Sortierreihenfolge gewählt wird. Das
-Sortieren braucht in diesem Fall erheblich weniger Zeit.
-
-#on("b")#Probleme#off("b")# Normalerweise werden die einzelnen Felder nach
-dem
-EUMEL-Zeichencode verglichen. Das bedeutet, daß sich die Reihen­
-folge der Zeichen nach dem EUMEL-Zeichencode richtet. Ein Zeichen
-mit einem höheren Code wird also vor einem Zeichen mit einem
-niedrigeren Code einsortiert.
- In manchen Fällen ergeben sich mit diesem Vergleichsverfahren
-aber auch Schwierigkeiten. Wenn in einem Feld Zahlen oder DM-
-Beträge stehen, führt die Methode zu falschen Ergebnissen. Die '10'
-wird zum Beispiel vor der '2' einsortiert. Warum? Texte werden
-immer linksbündig geschrieben und verglichen. Bei Zahlen richtet
-sich die Wertigkeit jedoch nach dem Abstand vom Komma.
- Da bei Texten zuerst das erste Zeichen verglichen wird, ent­
-steht hier durch Vergleich von '1' und '2' der Eindruck, die '10'
-käme vor der '2'. Korrigieren könnte man dies, indem man ein Leer­
-zeichen vor die '2' schreibt. Wenn also die (nicht geschriebenen)
-Dezimalkommata direkt untereinanderstehen, werden Zahlen richtig
-verglichen.
-
-#on("b")#Typ ZAHL#off("b")# EUDAS hat jedoch eine bequemere Art, dieses
-Problem zu
-behandeln. Ein Feld, das Zahlen enthalten soll, bekommt einen spe­
-ziellen Typ ZAHL zugewiesen, der zu einer richtigen Sortierung
-führt.
- Bei Feldern vom Typ ZAHL ignoriert EUDAS bei Vergleichen alle
-nichtnumerischen Zeichen und vergleicht den Wert der Zahl. So
-können Sie zum Beispiel in einem Satz '2,50 DM' und im anderen
-Satz '10 DM' eintragen - EUDAS kann jetzt die richtige Reihenfolge
-feststellen.
- Übrigens: falls Sie numerische Werte lieber mit einem Dezi­
-malpunkt statt einem Dezimalkomma schreiben, können Sie EUDAS
-das mit dem ELAN-Kommando
-
-
- dezimalkomma (".")
-
-
-mitteilen. Wenn Sie ein solches Kommando eingeben wollen, können
-Sie im EUDAS-Menü ESC ESC drücken. In der Statuszeile erscheint
-dann die Aufforderung:
-
-
- Gib Kommando:
-
-
-Hier können Sie wie im Editor oder im EUMEL-Monitor ein beliebiges
-Kommando eingeben und ausführen.
- Die Normaleinstellung für das Dezimalkomma erreichen Sie
-wieder durch das Kommando
-
-
- dezimalkomma (",")
-
-
-
-#on("b")#Typ ändern#off("b")# Die Feldtypen sind eine permanente Eigenschaft
-einer
-EUDAS-Datei. Beim Einrichten einer neuen Datei wird zunächst der
-Standardtyp für alle Felder genommen. Sie erhalten jedoch Gelegen­
-heit, abweichende Feldtypen zu vergeben, wenn Sie die Frage
-
-___________________________________________________________________________________________
-
- Feldnamen oder Feldtypen ändern (j/n) ?
-___________________________________________________________________________________________
-
-
-bejahen.
- Auch nachträglich können Sie die Feldtypen noch ändern. Dies
-geschieht mit der Funktion
-#free (0.2)#
-
- F Feldstrukt.
-
-#free (0.2)#
-im Menü 'Öffnen'. Zunächst werden Sie gefragt, ob Sie noch weitere
-Feldnamen anfügen wollen. So könnten Sie die Datei um weitere
-Felder ergänzen, die bei allen Sätzen zunächst leer sind. Die neuen
-Felder müssen Sie wie beim Einrichten der Datei untereinander im
-Editor schreiben.
- Als zweites erscheint dann die gleiche Frage wie oben. Wenn
-Sie diese bejahen, wird Ihnen eine Auswahl der zu ändernden Fel­
-der mit Feldnamen und den zugehörigen Feldtypen angeboten. Kreu­
-zen Sie hier die Felder an, deren Feldtypen Sie ändern möchten.
- Da Sie mit dieser Funktion sowohl Feldnamen als auch Feld­
-typen verändern können, wird Ihnen für jedes Feld zunächst der
-Name zum Ändern angeboten. Sie können den Namen korrigieren oder
-überschreiben. Die Namensänderung hat jedoch keine Auswirkung
-auf den Feldinhalt!
- Wenn Sie den Namen nicht ändern wollen, drücken Sie einfach
-RETURN. Anschließend können Sie für das Feld den neuen Feldtyp
-angeben. Tippen Sie einen der vier Feldtypen als Text ein und
-drücken Sie RETURN. Anschließend hat das Feld einen neuen Typ.
-Die verschiedenen möglichen Typen werden jetzt genau erklärt.
-
-#on("b")#Feldtypen#off("b")# TEXT ist der Standardtyp, der die Feldinhalte
-nach
-EUMEL-Zeichencode vergleicht. Den Typ ZAHL hatten wir schon
-weiter oben kennengelernt. Daneben gibt es noch den Typ DATUM.
- Dieser Typ vergleicht Daten der Form 'tt.mm.jj'. Soll ein sol­
-ches Datum richtig einsortiert werden, müßte es anderenfalls in der
-Reihenfolge umgedreht werden (also 'jj.mm.tt'). Dies ist aber nicht
-nötig, wenn das Feld den Typ DATUM bekommt. Beachten Sie, daß
-alle Inhalte, die nicht die beschriebene Form haben, als gleich be­
-trachtet werden.
- Der letzte Typ ist DIN. Dabei werden Texte nach DIN 5007 ver­
-glichen. Das bedeutet, daß Groß- und Kleinbuchstaben als gleich
-angesehen werden, daß alle nichtalphabetischen Zeichen ignoriert
-werden und die Umlaute ihren richtigen Platz bekommen (Umlaute
-werden in normalen Texten hinter allen anderen Zeichen einsor­
-tiert). Da hierfür ein relativ großer Zeitaufwand notwendig ist,
-sollte dieser Typ nur dann gewählt werden, wenn er erforderlich ist.
-Den schnellsten Vergleich ermöglicht der Typ TEXT.
-
-#on("b")#Hinweis#off("b")# Beachten Sie, daß mit der Vergabe von Feldtypen
-keine
-Überprüfung der Eingabe verbunden ist. Insbesondere beim Datum
-wird nicht geprüft, ob die Form 'tt.mm.jj' eingehalten wurde. Wollen
-Sie solche Überprüfungen vornehmen, lesen Sie bitte Abschnitt 11.3.
-
-
-11.2 Kopieren
-
-In diesem Abschnitt sollen Sie erfahren, wie Sie eine EUDAS-Datei
-#on("i")#kopieren#off("i")# können. Diese Funktion kann nicht nur ein inhaltsgleiches
-Duplikat einer EUDAS-Datei herstellen (dies könnten Sie einfacher
-durch eine logische Kopie bewerkstelligen, s. 16.1), sondern auch
-komplizierte Umstrukturierungen vornehmen.
-
-#on("b")#Kopiermuster#off("b")# Der Schlüssel zu dieser Leistungsfähigkeit
-ist das
-#on("i")#Kopiermuster#off("i")#. Wie beim Druckmuster legen Sie dadurch die genauen
-Auswirkungen der Funktion fest.
- Für jedes Feld in der Zieldatei, in die kopiert werden soll,
-enthält das Kopiermuster die Angabe, woraus der Inhalt dieses
-Feldes entstehen soll. Durch Auswahl und Reihenfolge dieser Anga­
-ben bestimmen Sie die Struktur der Zieldatei.
- Im einfachsten Fall sieht die Kopieranweisung für ein Feld wie
-folgt aus:
-
-
- "Feldname" K f ("Feldname");
-
-
-Das 'K' dient zur Festlegung der Kopierfunktion. Auf der linken
-Seite steht in Anführungsstrichen der Name des Zielfeldes. Der
-Ausdruck auf der rechten Seite gibt den zukünftigen Inhalt des
-Feldes an. Der Ausdruck im obigen Beispiel steht einfach für den
-Inhalt des Feldes 'Feldname' in der aktuellen Datei. Das Semikolon
-am Ende dient zur Abgrenzung, da der ganze Ausdruck auch mehrere
-Zeilen lang sein darf.
- In der oben genannten Form würde das Feld 'Feldname' iden­
-tisch in die Zieldatei kopiert. Weitere Möglichkeiten besprechen wir
-später.
-
-#on("b")#Feldreihenfolge#off("b")# Zunächst wollen wir uns damit befassen,
-wie Sie
-die Feldreihenfolge in der Zieldatei beeinflussen können. Dies ge­
-schieht einfach dadurch, daß Sie die Kopieranweisungen in der ge­
-wünschten Reihenfolge aufschreiben. Damit können wir bereits ein
-erstes komplettes Beispiel betrachten:
-
-
- "Name" K f ("Name");
- "Vorname" K f ("Vorname");
- "PLZ" K f ("PLZ");
- "Ort" K f ("Ort");
- "Strasse" K f ("Strasse");
- "m/w" K f ("m/w");
-
-
-Dieses Kopiermuster würde die bereits beschriebene Adressendatei
-identisch kopieren, da alle Felder in der gleichen Reihenfolge vor­
-kommen.
- Wenn Sie jedoch die Feldreihenfolge ändern wollen (um zum
-Beispiel ein anderes Feld als erstes zu optimieren), brauchen Sie
-bloß die Reihenfolge im Kopiermuster zu verändern:
-
-
- "Ort" K f ("Ort");
- "Name" K f ("Name");
- "Vorname" K f ("Vorname");
- "PLZ" K f ("PLZ");
- "Strasse" K f ("Strasse");
- "m/w" K f ("m/w");
-
-
-Im Gegensatz zur Auswahl der Feldreihenfolge für die Anzeige än­
-dern Sie so die Feldreihenfolge für die Zieldatei permanent.
-
-#on("b")#Felder anfügen#off("b")# Die beiden angegebenen Kopiermuster haben
-jedoch
-nur dann die beschriebene Wirkung, wenn die Zieldatei noch nicht
-existert. Bei einer existierenden Datei kann die Feldreihenfolge
-nicht mehr geändert werden; daher hat die Reihenfolge der Kopier­
-anweisungen dann keine Wirkung.
- Sie können jedoch zu einer existierenden Zieldatei noch Felder
-hinzufügen. EUDAS verwendet nämlich folgende einfache Vorschrift:
-
-#limit (12.0)#
- Wenn als Zielfeld in einer Kopieranweisung ein Feld
- genannt wird, das in der Zieldatei noch nicht vorkommt,
- wird es als weiteres Feld der Zieldatei hinzugefügt.
-#limit (13.5)#
-
-Diese Strategie hat im Fall der nicht existierenden Datei zur Folge,
-daß alle Felder neu sind und in der Reihenfolge ihres Auftretens
-eingerichtet werden. Existiert die Datei schon, werden zusätzliche
-Felder am Ende angefügt.
- Beachten Sie, daß zusätzliche Felder für eine existierende
-Datei nur in den neu hinzukopierten Sätzen gefüllt sind. In den
-alten Sätzen bleiben alle neuen Felder einfach leer.
-
-#on("b")#Satzauswahl#off("b")# An dieser Stelle sollte erwähnt werden, daß
-wie bei
-allen Funktionen, die die gesamte Datei betreffen, nur die durch die
-Suchbedingung ausgewählten Sätze kopiert werden. Ist mindestens
-ein Satz markiert, werden nur die markierten Sätze kopiert und die
-Suchbedingung ignoriert.
-
-#on("b")#Teildatei#off("b")# Jetzt können Sie auch die zweite wichtige
-Aufgabe des
-Kopierens verstehen. Sie können aus einer Datei einen Teil der
-Sätze und einen Teil der Felder #on("i")#herausziehen#off("i")#. Danach haben Sie
-unter Umständen eine wesentlich kleinere Datei, die sich auch
-schneller bearbeiten läßt. Gerade wenn Sie nicht den allerneuesten
-64-Bit-Supercomputer haben, können Sie so viel Zeit sparen, wenn
-Sie wiederholt nur mit einem Teil der Datei arbeiten müssen.
- Die Auswahl der Sätze für einen solchen Zweck erfolgt über ein
-Suchmuster; im Kopiermuster geben Sie dann nur die gewünschten
-Felder an.
-
-#on("b")#Aufruf#off("b")# An dieser Stelle wollen wir jetzt endlich
-behandeln, wie
-Sie die Kopierfunktion aufrufen. Dazu gibt es die Auswahl
-#free (0.2)#
-
- Satzauswahl
- K Kopieren
-
-#free (0.2)#
-im Menü "Gesamtdatei". Als erstes werden Sie nach dem Namen der
-Zieldatei gefragt. Existiert die Zieldatei schon und war sie vorher
-sortiert, werden Sie gefragt, ob Sie die Datei zum Schluß wieder
-sortieren wollen. Wie immer beim Sortieren werden auch hier gege­
-benenfalls nur die neu hinzugekommenen Sätze einsortiert.
- Als nächstes müssen Sie den Namen des Kopiermusters angeben.
-Da das Kopiermuster eine normale Textdatei ist, können Sie sich
-einen beliebigen Namen ausdenken, unter dem das Muster dann
-gespeichert wird.
- Wollen Sie das Kopiermuster nicht aufbewahren, sondern nur
-einmal verwenden, brauchen Sie keinen Namen anzugeben. Drücken
-Sie einfach RETURN und für die Dauer des Kopierens wird das
-Kopiermuster als unbenannte Datei eingerichtet.
- Nachdem Sie den Namen des Kopiermusters eingegeben haben,
-gelangen Sie in den Editor, wo Sie das Muster ändern können. Damit
-Sie beim ersten Mal nicht so viel tippen müssen, bietet EUDAS Ihnen
-bei einer neuen Musterdatei ein #on("i")#Standard-Kopiermuster#off("i")# zum Ändern
-an. Das Aussehen des Standard-Kopiermusters richtet sich danach,
-ob die Zieldatei schon existiert oder nicht.
- Existiert die Zieldatei noch nicht, so werden im Standard-
-Kopiermuster alle Felder der Ausgangsdatei in ihrer originalen Rei­
-henfolge angegeben. Wenn Sie dieses Muster nicht noch ändern, wird
-die aktuelle Datei identisch kopiert.
- Sie können jedoch die Feldreihenfolge verändern oder Felder
-weglassen, indem Sie einfach die entsprechenden Zeilen vertauschen
-oder löschen. Für Umbenennungen überschreiben Sie einfach den
-Namen auf der linken Seite der Kopieranweisung. So können Sie das
-Kopiermuster mit geringstem Aufwand erstellen.
- Existiert die Zieldatei jedoch schon, werden Ihnen im Kopier­
-muster alle Felder der Zieldatei angeboten. Bei Feldern, die in der
-aktuellen Datei nicht vorkommen, erscheint folgende Anweisung:
-
-
- "Anrede" K "";
-
-
-Obwohl die Anweisung in diesem Fall keine Wirkung hat (wenn man
-sie wegließe, würde das Feld ebenfalls leer bleiben), ist sie dennoch
-aufgeführt, damit Sie auf der rechten Seite einen entsprechenden
-Ausdruck einsetzen können.
- Bei den angebotenen Anweisungen hat eine Änderung der Rei­
-henfolge oder eines Feldnamens keinen Sinn, da diese Felder ja alle
-bereits existieren. Jedoch können Sie die Ausdrücke auf der rechten
-Seite variieren und neue Anweisungen (Felder) hinzufügen.
-
-#on("b")#Ablauf#off("b")# Wenn Sie die Eingabe des Kopiermusters mit ESC 'q'
-verlas­
-sen, wird das Kopiermuster übersetzt. Dabei können Fehlermeldun­
-gen auftreten. Sie können dann die Fehler korrigieren, wobei Sie die
-Fehlermeldungen gleichzeitig auf dem Bildschirm sehen können. War
-das Kopiermuster korrekt, werden alle ausgewählten (bzw. markier­
-ten) Sätze der aktuellen Datei in die Zieldatei kopiert und diese
-anschließend gegebenenfalls noch sortiert.
- Die kopierten Sätze werden jeweils am Ende der Zieldatei ange­
-fügt. War die Zieldatei vorher schon sortiert, können Sie angeben,
-daß die neuen Sätze zum Schluß noch einsortiert werden. Anderen­
-falls können Sie die Datei anschließend mit der Funktion 'Sortieren'
-sortieren.
-
-#on("b")#ELAN-Ausdrücke#off("b")# Wenn Sie schon einmal programmiert haben,
-wird
-Ihnen vielleicht aufgefallen sein, daß ein Kopiermuster einem
-ELAN-Programm verdächtig ähnlich sieht. Diese Vermutung trügt Sie
-nicht. Dies läßt den Schluß zu, daß Sie noch mehr ELAN hier an­
-bringen können.
- Haben Sie noch nie programmiert, sollten Sie jetzt nicht in
-Panik geraten, denn das Wichtigste dieses Abschnitts haben Sie
-bereits gelernt. Vielleicht sind Ihnen die folgenden Beispiele bereits
-ganz nützlich. Um alle Möglichkeiten auszunutzen, sollten Sie sich
-aber irgendwann (später!) mit den Kapiteln 14 und 15 befassen, in
-denen Sie Genaueres erfahren.
- Zunächst sei festgestellt, daß der rechte Teil einer Kopieran­
-weisung ein beliebiger ELAN-Ausdruck sein kann, der einen TEXT
-liefert. Den wichtigsten Ausdruck kennen Sie bereits:
-
-
- f ("Feldname")
-
-
-liefert den Inhalt des Feldes 'Feldname' des aktuellen Satzes der
-aktuellen Datei. Gibt es das Feld nicht, erscheint eine Fehlermel­
-dung bei der Ausführung.
- Sie können jedoch auch einen konstanten Text angeben, der
-dann für alle Sätze gleich ist. Dazu schließen Sie den Text einfach
-in Anführungsstriche ein. Die folgende Kopieranweisung dient dazu,
-ein neues Feld einzurichten, das aber vorläufig noch leer bleiben
-soll:
-
-
- "Feldname" K "";
-
-
-Ebenso können Sie mehrere Felder zu einem neuen verbinden, zum
-Beispiel:
-
-
- "Wohnort" K f ("PLZ") + " " + f ("Ort");
-
-
-Das Pluszeichen kennzeichnet die Aneinanderreihung von zwei Tex­
-ten. Denken Sie auch immer an das Semikolon am Ende. In gleicher
-Weise können Sie viele andere Textfunktionen verwenden, die in
-Kapitel 14 beschrieben sind.
- Prinzipiell können Sie auch Bedingungen mit IF abfragen, wie
-zum Beispiel in der folgenden Ãœbersetzung:
-
-
- IF f ("m/w") = "w" THEN
- "Anrede" K "Frau"
- ELSE
- "Anrede" K "Herr"
- END IF;
-
-
-Auf diese Weise können Sie Kodierungen verschiedenster Art auto­
-matisch umsetzen. Sie müssen hierbei jedoch unbedingt darauf ach­
-ten, daß innerhalb der IF-Konstruktion immer eine Kopieranweisung
-ausgeführt wird. Falls nämlich kein Fall zutrifft und für ein Feld
-keine Kopieranweisung ausgeführt wird, wird das Feld bei einer
-neuen Datei auch nicht richtig eingerichtet.
-
-
-11.3 Tragen
-
-In Kapitel 6 hatten Sie gesehen, wie man einzelne Sätze aus der
-aktuellen Datei in eine andere trägt, und auch, wie man sie wieder
-zurückholen kann. Diese Funktion diente im wesentlichen dazu,
-nicht mehr benötigte Sätze zu entfernen.
- Sie haben aber auch die Möglichkeit, eine ganze Reihe von
-Sätzen in einem Arbeitsgang zu tragen, nämlich alle durch das
-Suchmuster ausgewählten beziehungsweise alle markierten Sätze.
-Diese Funktion dient ebenfalls dazu, Sätze zu entfernen, beispiels­
-weise alle Sätze, die vor einem gewissen Stichtag liegen. Als wei­
-tere Anwendung können Sie beim Tragen aber auch Bedingungen
-überprüfen.
- Diese #on("i")#Prüfbedingungen#off("i")# sollen sicherstellen, daß die Daten in
-einer Datei ganz bestimmten Richtlinien entsprechen. Zum Beispiel
-kann geprüft werden, ob ein eingegebenen Datum stimmen kann, ob
-ein Satz doppelt aufgenommen wurde oder ob eine Artikelnummer die
-richtige Anzahl von Stellen hat.
- Die Prüfbedingungen werden einer Datei fest zugeordnet. Sie
-können mit der Funktion
-#free (0.2)#
-
- P Prüfbed.
-
-#free (0.2)#
-im Menü 'Öffnen' eingegeben oder geändert werden. Die Prüfbedin­
-gungen werden als Text im Editor geschrieben.
-
-#on("b")#Ablauf#off("b")# Das ganze Verfahren läuft nun so ab: Sie fügen neue
-Sätze
-immer erst in eine Zwischendatei ein, die die gleiche Struktur wie
-die eigentliche Datei hat. Wenn Sie alle Sätze fertig eingegeben
-haben, tragen Sie diese Datei komplett in die gewünschte Datei.
-Dabei werden die Prüfbedingungen getestet.
- Erfüllt ein Satz die Bedingungen, wird er anstandslos getragen.
-Trifft eine Bedingung aber nicht zu, bleibt der Satz in der Zwi­
-schendatei und eine entsprechende Meldung wird ausgegeben. Die
-Meldungen werden gespeichert, um Sie später nochmal abrufen zu
-können.
- Sie müssen jetzt in der Zwischendatei die notwendigen Ände­
-rungen durchführen, damit die Prüfbedingungen erfüllt werden. Beim
-Aufruf der Funktion
-#free (0.2)#
-
- A Ändern
-
-#free (0.2)#
-können Sie mit Hilfe der Tastenkombination ESC 'P' (großes P) die
-Datei mit den Fehlermeldungen in einem kleinen Teilfenster editie­
-ren. Anhand dieser Hinweise können Sie dann den Satz korrigieren.
-Die Meldungen bleiben bis zum nächsten Öffnen oder Tragen erhal­
-ten.
- Nach der Korrektur können Sie den gleichen Vorgang erneut
-aufrufen - es sind ja nur noch die zuerst fehlerhaften Sätze in der
-Zwischendatei. Bei Bedarf können Sie diesen Vorgang wiederholen,
-bis alle Sätze korrekt übernommen worden sind.
-
-#on("b")#Aufruf#off("b")# Das Tragen wird aufgerufen durch die Funktion
-#free (0.2)#
-
- Satzauswahl
- T Tragen
-
-#free (0.2)#
-Nach Eingabe des Zieldateinamens müssen Sie noch angeben, ob Sie
-die Prüfbedingungen testen wollen.
-
-#on("b")#Prüfbedingungen#off("b")# Zu diskutieren bleibt noch die Form der
-Prüfbe­
-dingungen. Diese stellen ein kleines ELAN-Programm dar, in dem
-einige spezielle Prozeduren zum Prüfen enthalten sind. Wenn Sie
-nicht ELAN programmieren können, sollte Sie diese Bemerkung nicht
-erschrecken: die Prüfbedingungen sind einfach genug.
- Sie schreiben also die Prüfbedingungen jeweils untereinander.
-Eine mögliche Bedingung ist
-
-
- wertemenge ("Feldname", "Wert1,Wert2,Wert3,Wert4");
-
-
-Diese Bedingung gibt an, daß das Feld einen der angegebenen Werte
-haben muß. Die Werte werden untereinander durch Komma getrennt.
-Es gibt jedoch keine Möglichkeit, Werte mit Komma darzustellen, da
-das Komma immer als Trennung wirkt. Leerzeichen dürfen in den
-Werten vorkommen, sie müssen dann aber auch genau so im Feld
-stehen.
- Wir könnten zum Beispiel eine Bedingung für unser Feld 'm/w'
-wie folgt formulieren
-
-
- wertemenge ("m/w", "m,w");
-
-
-EUDAS würde sich dann beschweren, wenn das Feld leer wäre (ir­
-gendein Geschlecht muß die Person ja wohl haben). Wenn das Feld
-auch leer sein darf, geben Sie einfach zwei Kommata hintereinander
-oder ein Komma am Anfang an:
-
-
- wertemenge ("m/w", ",m,w");
-
-
-Eine andere Möglichkeit der Prüfbedingung besteht darin, eine
-Maske für ein Feld zu definieren. Diese Maske gibt an, daß an be­
-stimmten Stellen des Feldes nur bestimmte Zeichen stehen dürfen.
-So könnte man zum Beispiel folgende Maske für ein Datumsfeld
-angeben:
-
-
- feldmaske ("Datum", "99.99.99");
-
-
-Die Neunen haben hier eine spezielle Bedeutung und und stehen für
-eine beliebige Ziffer. Es gibt noch einige weitere Zeichen, die eine
-reservierte Bedeutung haben, nämlich:
-
-
- '9' für jede Ziffer (wie schon erwähnt)
- 'X' für jedes Zeichen
- 'A' für jeden Großbuchstaben
- 'a' für jeden Kleinbuchstaben
- '*' für eine Folge beliebiger Zeichen
-
-
-Alle anderen Zeichen im Muster stehen für sich selbst. Eine Sonder­
-stellung besitzt der Stern; er sollte sparsam verwendet werden, da
-seine Benutzung etwas aufwendiger ist. Der Stern kann auch für
-eine leere Zeichenfolge stehen. Als weiteres Beispiel könnte man
-definieren
-
-
- feldmaske ("Name", "A*");
-
-
-damit immer ein Name angegeben ist, der noch dazu mit einem Groß­
-buchstaben beginnt.
- Für Bedingungen, die sich nicht mit diesen beiden Prozeduren
-formulieren lassen, gibt es noch
-
-
- pruefe ("Feldname", Bedingung);
-
-
-Diese Prozedur erhält einen logischen (booleschen) Wert als Parame­
-ter, der einen Vergleich darstellt. Ist dieser Parameter falsch
-(FALSE), wird eine entsprechende Fehlermeldung protokolliert. So
-könnte man folgende Bedingung angeben:
-
-
- pruefe ("Alter", wert ("Alter") > 18.0);
-
-
-Diese Bedingung würde sicherstellen, daß alle Personen in der Datei
-volljährig sind ('wert' ist eine von EUDAS definierte Funktion, die
-den Inhalt eines Feldes als REAL-Zahl liefert - denken Sie auch
-daran, daß der ELAN-Compiler Zahlen mit Dezimalpunkt geschrieben
-haben möchte).
- Da die Prüfbedingungen ein ELAN-Programm sind, können Sie
-natürlich sämtliche ELAN-Anweisungen verwenden.
- Weiterhin haben Sie die Möglichkeit, Doppeleinträge zu verhin­
-dern. Dazu geben Sie mit Hilfe der Prozedur
-
-
- eindeutige felder (n);
-
-
-wieviele Felder vom ersten an eindeutig sein sollen. Ein zu tragen­
-der Satz, der mit irgendeinem anderen Satz in diesen Feldern über­
-einstimmt, wird als fehlerhaft zurückgewiesen. In unserer Adressen­
-datei könnte man
-
-
- eindeutige felder (2);
-
-
-angeben. Damit würde ein neuer Satz mit bereits vorhandenem Na­
-men und Vornamen abgelehnt.
-
-#on("b")#Limit#off("b")# Aus technischen Gründen können die Prüfbedingungen
-einer
-Datei nur 2000 Zeichen umfassen. Wollen Sie aufwendigere Bedin­
-gungen konstruieren, sollten Sie sich diese als Prozedur definieren
-und insertieren. In den Prüfbedingungen müssen Sie dann nur diese
-Prozedur aufrufen.
-
-
-11.4 Automatische Änderungen
-
-Mit EUDAS können Sie die geöffnete Datei nicht nur satzweise von
-Hand ändern, sondern auch automatisch die ganze Datei. Dazu müs­
-sen Sie dem Rechner eine Vorschrift geben, nach der er handeln
-kann. Ein solches #on("i")#Änderungsmuster#off("i")# stellt im Prinzip schon ein klei­
-nes Programm dar. Der Änderungsvorgang wird durch die Auswahl
-#free (0.2)#
-
- V Verändern
-
-#free (0.2)#
-aufgerufen. Dabei wird der Name des Änderungsmusters erfragt. Dies
-ist eine normale Textdatei. Existiert das Muster noch nicht, können
-Sie den Inhalt an dieser Stelle im Editor angeben. Anschließend
-werden alle ausgewählten Sätze nach der Vorschrift bearbeitet.
-Dabei wird jeweils die aktuelle Satznummer ausgegeben.
-
-#on("b")#Änderungsmuster#off("b")# Da auch ein Kopiermuster ein Programm ist,
-ist
-es nicht erstaunlich, daß Änderungsmuster ganz ähnlich aussehen.
-Eine typische Zeile sieht etwa so aus:
-
-
- "Feldname" V "neuer Inhalt";
-
-
-Diese Zeile bedeutet: Ersetze den Inhalt des Feldes 'Feldname'
-durch den Text 'neuer Inhalt'. Anstelle des neuen Textes kann
-wieder ein beliebiger ELAN-Ausdruck stehen. Ein Beispiel, in dem
-ein Feld einen Stern angehängt bekommt, sieht dann so aus:
-
-
- "Feldname" V f ("Feldname") + "*";
-
-
-Beachten Sie, daß Sie den Ausdruck auf der rechten Seite eventuell
-in Klammern setzen müssen (obwohl der Operator 'V' die niedrigste
-Priorität hat). Wenn Sie sich nicht sicher sind, können Sie den Aus­
-druck immer in Klammern einschließen.
- Ebenso wie im Kopiermuster können Sie hier beliebige ELAN-
-Ausdrücke verwenden. Auch IF-Abfragen und ähnliche Konstruktio­
-nen sind möglich, im Gegensatz zum Kopiermuster sogar ohne Be­
-schränkungen.
- Im Vergleich zu einem separat geschriebenen ELAN-Programm
-hat das Änderungsmuster den Vorteil, daß Sie nur die eigentlichen
-Veränderungsanweisungen kodieren müssen. Die wiederholte Anwen­
-dung auf die ausgewählten Sätze erledigt EUDAS automatisch. Wol­
-len Sie eine solche Änderungsanweisung fest insertieren, so brau­
-chen Sie das Muster nur in eine Prozedur zu verpacken und EUDAS
-zu übergeben (Näheres s. Referenzhandbuch).
-
diff --git a/doc/eudas/eudas.hdb.12 b/doc/eudas/eudas.hdb.12
deleted file mode 100644
index fba5ca5..0000000
--- a/doc/eudas/eudas.hdb.12
+++ /dev/null
@@ -1,446 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (123)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-12 Weitere Möglichkeiten zum Drucken
-
-
-
-12.1 Anschluß an die Textverarbeitung
-
-Auf zweierlei Art und Weise kann der EUDAS-Druckgenerator mit
-den Programmen der EUMEL-Textverarbeitung zusammenarbeiten.
-Zum ersten können Ausgabedateien des Druckprozesses anschließend
-mit den Textkosmetik-Werkzeugen bearbeitet werden. Zum anderen
-kann EUDAS im Editor direkt Daten aus einer EUDAS-Datei in die
-editierte Datei importieren.
-
-#on("b")#Druckrichtung#off("b")# Wie Sie schon in Kapitel 7 gesehen haben,
-kann
-man die Ausgabe des Druckgenerators statt auf den Drucker in eine
-Datei umleiten. Die Datei erhält dann einen automatisch generierten
-Namen. Sie können jedoch auch festlegen, daß die Ausgabe in eine
-ganz bestimmte Datei geschrieben werden soll. Dazu wählen Sie die
-Funktion
-
-
- Ausgabe
- R Richtung
-
-
-im Druckmenü. Es erscheint die Frage
-
-___________________________________________________________________________________________
-
- Ausgabe automatisch zum Drucker (j/n) ?
-___________________________________________________________________________________________
-
-
-Verneinen Sie die Frage und es erscheint
-
-___________________________________________________________________________________________
-
- Ausgabe in bestimmte Datei (j/n) ?
-___________________________________________________________________________________________
-
-
-Wenn Sie diese Frage auch verneinen, erhält die Ausgabedatei einen
-automatisch generierten Namen. Wenn Sie die Frage aber bejahen,
-können Sie anschließend den Namen der Ausgabedatei angeben.
- Existiert die angegebene Datei schon, wird der Ausdruck am
-Ende der Datei angefügt. Anderenfalls wird die Datei neu eingerich­
-tet.
- Die Angabe der Ausgabedatei gilt jedoch nur für den folgenden
-Druckvorgang. Wenn Sie mehrmals in die gleiche Datei drucken wol­
-len, müssen Sie den Namen immer wieder neu angeben. Falls Sie dies
-vergessen, wird die folgenden Male wieder ein Name automatisch
-generiert.
-
-#on("b")#Begrenzung der Dateigröße#off("b")# Für kleinere Systeme ist es
-vorteilhaft,
-wenn die Druckausgabe nicht in einer großen Datei gesammelt wird,
-sondern sich auf mehrere kleine Dateien verteilt. Da die Ausgabe­
-datei nach dem Drucken gelöscht wird, kann man auf diese Weise
-einen Hintergrundengpaß vermeiden. Es besteht die Möglichkeit, die
-maximale Größe der Ausgabedatei mit dem ELAN-Kommando
-
-
- maxdruckzeilen (1000)
-
-
-auf eine bestimmte Zeilenzahl (maximal 4000) zu beschränken. Wenn
-der Druckgenerator nach der Bearbeitung eines Satzes feststellt,
-daß diese Maximalzahl überschritten wurde, wird die Ausgabedatei
-direkt gedruckt (falls durch 'Richtung' eingestellt) und eine neue
-Ausgabedatei eröffnet.
-
-#on("b")#Initialisierungsteil#off("b")# Dabei ist jedoch zu beachten, daß
-Drucker­
-steuerungsanweisungen, die im Vorspann eingestellt wurden, jetzt in
-der neuen Datei nicht mehr vorhanden sind. In einem solchen Fall
-würden die folgenden Teile der Ausgabe mit einer anderen Einstel­
-lung gedruckt.
- Um dies zu vermeiden, können Sie solche Anweisungen in den
-#on("i")#Initialisierungsteil#off("i")# schreiben. Der Initialisierungsteil umfaßt alle
-Zeilen des Druckmusters bis zum ersten Abschnitt, also bis zur
-ersten Anweisung. Zeilen im Initialisierungsteil werden beim Eröff­
-nen einer neuen Ausgabedatei an den Anfang dieser Datei ge­
-schrieben.
- Druckersteuerungsanweisungen, die ein bestimmtes Schriftbild
-der Ausgabe erzeugen ('type', 'limit', 'linefeed', 'start' usw.), sollten
-also in den Initialisierungsteil vor Beginn aller Abschnitte ge­
-schrieben werden.
-
-#on("b")#Nachbearbeitung#off("b")# Wenn Sie in der Druckausgabe verschiedene
-Schriften oder Proportionalschrift verwenden wollen, sollten Sie die
-folgenden Hinweise beachten. Da EUDAS keine Informationen über
-die Schriftbreiten und -größen hat, werden alle Schrifttypen gleich
-behandelt. Dies gilt insbesondere für die Zeilenbreite, die ja durch
-das Dateilimit des Druckmusters festgelegt ist.
- So kann es passieren, daß Zeilen mit kleinen Schrifttypen zu
-früh abgeschnitten werden, während Zeilen mit großen Schriften
-nicht mehr auf das Blatt passen. Für diesen Fall sollten Sie das
-größte benötigte Limit einstellen (zum Beispiel 135 bei Schmal­
-schrift auf DIN A 4) und die Ausgabedatei anschließend mit 'line­
-form' bearbeiten.
- 'lineform' verteilt zu langen Text auf mehrere Zeilen. Außerdem
-werden gegebenenfalls Trennungen durchgeführt.
- 'lineform' benötigt zur Information Absatzmarken. Fehlt an
-einer Zeile die Absatzmarke, wird die nächste Zeile so weit wie
-möglich direkt angehängt. Die Absatzmarken in der Ausgabedatei
-werden direkt aus dem Druckmuster übernommen (es ist nicht mög­
-lich, Absatzzeilen durch eingesetzte Leerzeichen zu erzeugen). Im
-Normalfall sollten alle Zeilen im Druckmuster eine Absatzmarke
-haben.
- Wenn Sie seitenorientierte Überschriften haben möchten, kön­
-nen Sie auch 'pageform' einsetzen. Die gewünschten Überschrift­
-anweisungen können Sie im Initialisierungsteil angeben.
- Die beiden Funktionen wählen Sie über den Menüpunkt
-
-
- N Nachbearb.
-
-
-im Druckmenü. Dort können Sie den Namen der Ausgabedatei ange­
-ben, die Sie bearbeiten möchten. Es wird jeweils gefragt, ob Sie
-'lineform' und 'pageform' anwenden wollen. Das Ergebnis der Bear­
-beitung können Sie danach ausdrucken.
-
-#on("b")#EUDAS im Editor#off("b")# Wenn Sie sich im Editor zum Zweck der
-Textver­
-arbeitung befinden, können Sie Daten aus einer EUDAS-Datei direkt
-in die editierte Datei übernehmen. Dazu wählen Sie zunächst die
-gewünschten Sätze aus - danach geben Sie den Namen eines Druck­
-musters an. EUDAS druckt die gewählten Sätze unter Beachtung des
-Druckmusters direkt in die editierte Datei.
- Wenn Sie das Kommando
-
-
- eudas
-
-
-im Editor geben (nach ESC ESC), gelangen Sie in ein spezielles
-Kurzprogramm, das alle notwendigen Information von Ihnen erfragt.
- Zunächst müssen Sie den Namen der gewünschten EUDAS-Datei
-angeben. Diese Datei wird dann automatisch geöffnet. Vorher geöff­
-nete Dateien werden nach Anfrage gesichert. Beachten Sie, daß
-keine Datei mehr geöffnet ist, wenn Sie später EUDAS wieder normal
-aufrufen.
- Danach wird Ihnen eine Übersicht aller Sätze gezeigt - in einer
-Form, die Sie aus der Funktion 'Ãœbersicht' bereits kennen. Wie dort
-wird Ihnen zunächst eine Auswahl der Felder angeboten, um die
-Anzeige übersichtlich zu halten. Anschließend können Sie noch ein
-Suchmuster angeben.
- In der Übersicht können Sie sich dann zu einem bestimmten
-Satz bewegen oder mehrere Sätze markieren. Nach dem Verlassen der
-Übersicht können Sie den aktuellen Satz oder alle ausgewählten
-(bzw. markierten) Sätze drucken. Natürlich können Sie auch beide
-Fragen verneinen.
- Zum Drucken wird der Name des Druckmusters erfragt. Dieses
-muß bereits existieren. Die Ausgabe wird an der Stelle eingefügt, an
-der der Cursor in der editierten Datei steht - die Zeile wird bei
-Bedarf aufgesplittet.
- Nach dem Drucken können Sie den Vorgang wiederholen, wenn
-Sie zum Beispiel einen weiteren Satz drucken wollen. Dazu können
-Sie auch ein neues Suchmuster angeben. Markierungen von Sätzen
-werden nach dem Drucken gelöscht.
-
-
-12.2 Spaltendruck
-
-Für manche Anwendungen reicht es nicht aus, wenn die bearbeite­
-ten Sätze jeweils untereinander in der Ausgabe erscheinen. Häufig­
-stes Beispiel dafür ist der Etikettendruck. Hierfür werden vielfach
-mehrbahnige Formulare eingesetzt.
- In diesem Fall müssen die Sätze bis zur gewünschten Anzahl
-von Spalten nebeneinander gesetzt werden - erst danach wird die
-nächste Reihe angefangen.
- EUDAS unterstützt diese Anwendung. Dazu wird hinter der
-'%WIEDERHOLUNG'-Anweisung die Anzahl der Spalten als Parameter
-geschrieben (durch Leerzeichen getrennt). Der Wiederholungsteil
-wird dann mit der angegebenen Anzahl von Spalten gedruckt. Zu
-beachten ist, daß Vorspann und Nachspann diese Spaltenanordnung
-durchbrechen, also immer hinter dem bisher Gedruckten beginnen.
- Die Spaltenbreite wird vom Dateilimit des Druckmusters be­
-stimmt. Die Zeilen eines Wiederholungsteils werden bis zum Limit
-mit Leerzeichen aufgefüllt, wenn der nächste Wiederholungsteil
-danebengesetzt wird.
- Alternativ kann die Spaltenbreite in Zeichen auch als zweiter
-Parameter angegeben werden. Der Wert gilt jedoch nur für den Wie­
-derholungsteil - Vor- und Nachspann richten sich immer nur nach
-dem Dateilimit.
- Es spielt keine Rolle, ob die nebeneinandergesetzten Wieder­
-holungsteile unterschiedliche Längen haben. Die kürzeren Teile
-werden einfach bei Bedarf durch Leerzeilen ergänzt. Es ist jedoch zu
-beachten, daß sich auf diese Weise unterschiedliche Längen für die
-einzelnen Reihen ergeben können.
- Beispiel: Das Ergebnis für Satz 1, 3, 4 und 5 sei vier Zeilen
-lang, für Satz 2 aber fünf Zeilen. Bei zweispaltigem Druck wird die
-erste Reihe eine Zeile länger als die folgenden (s. dazu Abb. 12-1).
-
-
- Satz 1 Satz 2
- braucht braucht
- vier Zeilen. ausnahmsweise
- ---------------- fünf Zeilen.
- ----------------
- Satz 3 Satz 4
- braucht braucht
- vier Zeilen. vier Zeilen.
- ---------------- ----------------
- Satz 5
- braucht
- vier Zeilen.
- ----------------
-
-#center#Abb. 12-1 Seitenaufteilung beim Spaltendruck
-
-
-#on("b")#Beispiel#off("b")# Zum Abschluß noch als Beispiel ein Druckmuster
-für ein
-dreibahniges Etikettenformular. Die Spaltenbreite und die Länge des
-Wiederholungsteils richten sich natürlich nach dem verwendeten
-Formular und müssen im Einzelfall ausprobiert werden.
-
-
- % VORSPANN
- \#start (1.0, 0.8)\#
- % WIEDERHOLUNG 3 40
-
- &Vorname %Name
- &Strasse
-
- &PLZ %Ort
- \#free (1.693)\#
-
-
-
-12.3 Modi
-
-Gesetzt der Fall, Sie wollen eine Tabelle drucken, deren Einträge
-auf jeden Fall in voller Länge erscheinen sollen, auch wenn sie die
-Spaltenbreite überschreiten. Dies würde bedeuten, daß Tabellenein­
-träge nach rechts geschoben werden, wenn vorhergehende Einträge
-länger sind. Für diesen Fall können also nur Feldmuster variabler
-Position (mit '%') eingesetzt werden. Diese werden jedoch auch nach
-links geschoben, wenn vorher kürzere Inhalte auftreten.
-
-#on("b")#Tabellenmodus#off("b")# Um dieses Linksschieben zu unterdrücken,
-können
-Sie mit folgender Anweisung im Musterteil in den #on("i")#Tabellenmodus#off("i")#
-umschalten:
-
-
- % MODUS 2
-
-
-Der so eingestellte Modus gilt bis zum Ende des jeweiligen Ab­
-schnitts. Zu Beginn eines Abschnitts ist der Modus 1 (Normalmodus)
-eingestellt.
-
-#on("b")#Beispiel#off("b")# Um diese Anweisung auszuprobieren, sollten Sie
-folgendes Druckmuster auf unsere Beispieldatei anwenden:
-
-
- % WIEDERHOLUNG
- % MODUS 2
- &Vorname %Name
-
-
-In der Ausgabe können Sie sehen, daß der Nachname nicht nach
-links geschoben wird, so daß eine Tabelle entsteht. Ist der Vorname
-jedoch zu lang, wird die Tabelleneinteilung durchbrochen und der
-Nachname nach rechts geschoben, um den Vornamen nicht abschnei­
-den zu müssen:
-
-
- Herbert Wegner
- Helga Sandmann
- Albert Katani
- Peter Ulmen
- Karin Regmann
- Hubert Arken
- Anna-Maria Simmern
- Angelika Kaufmann-Drescher
- Harald Fuhrmann
- Friedrich Seefeld
-
-
-#on("b")#Zeilenfortsetzung#off("b")# Eine weitere Möglichkeit, überlange
-Feldinhalte
-einzusetzen, besteht darin, daß der Rest des Inhaltes, der nicht
-mehr in den reservierten Raum paßt, in der nächsten Zeile fortge­
-setzt wird. Dies wird im Modus 3 erreicht. Falls ein Feldinhalt ab­
-geschnitten werden müßte, wird in diesem Modus die gleiche Mu­
-sterzeile nochmal mit den restlichen Inhalten gedruckt. Dies wird
-fortgesetzt, bis alle Inhalte abgearbeitet sind.
- Damit die Fortsetzung sinnvoll ist, wird das letzte Wort ganz in
-die nächste Zeile übernommen, falls es zerschnitten würde (ähnlich
-wie im Editor). Der dadurch freiwerdende Raum in der vorigen Zeile
-wird mit Leerzeichen gefüllt. Ist rechtsbündiges Einsetzen verlangt,
-werden die einzelnen Teile jeweils rechtsbündig in ihrem reservier­
-ten Platz justiert.
- Dieser Modus ist besonders interessant, wenn Sie längere Kom­
-mentare in eine EUDAS-Datei eintragen, die Sie dann natürlich auch
-wieder drucken wollen. Den Text tragen Sie bereits in mehreren
-Zeilen in die EUDAS-Datei ein. Beachten Sie, daß der Umbruch des
-Textes im Druck nicht mit dem Umbruch des Textes am Bildschirm
-übereinstimmt. Wollen Sie dies verhindern, müssen Sie jeden Absatz
-des Textes in ein eigenes Feld schreiben.
- Wie zu Anfang des Kapitels bereits angedeutet, kann der Um­
-bruch bei Proportionalschrift nicht korrekt sein, da EUDAS die Zei­
-chenbreiten nicht kennt. Um die nachfolgende Bearbeitung mit
-'lineform' zu ermöglichen, werden bei fortgesetzten Feldern grund­
-sätzlich keine Absatzmarken an die Zeilen geschrieben. Lediglich die
-letzte Fortsetzungszeile erhält eine Absatzmarke.
- In den Fortsetzungszeilen, werden die Feldmuster, deren Inhalte
-bereits abgearbeitet sind, leer eingesetzt. Die Mustertexte zwischen
-den Feldmustern werden in den Fortsetzungszeilen durch Leerzei­
-chen ersetzt.
- Die Anzahl der Fortsetzungszeilen kann durch die Anweisung
-
-
- % MEHR n
-
-
-auf eine bestimmte Zahl 'n' festgelegt werden. Wenn alle Inhalte
-abgearbeitet wurden, aber die Anzahl der Zeilen noch nicht erreicht
-ist, werden entsprechend viele Zeilen mit leeren Inhalten erzeugt.
- Die Zeilenwiederholung kann auch mit dem Tabellenmodus kom­
-biniert werden. Dies wird im Modus 4 erreicht. Felder variabler
-Position werden auch in diesem Modus nicht nach links geschoben.
-Außerdem werden aber in Fortsetzungszeilen die Mustertexte zwi­
-schen den Feldmustern wiederholt, um z.B. Tabellenbegrenzungen zu
-erzeugen.
-
-#on("b")#Beispiele#off("b")# Zur Verdeutlichung hier noch einige Beispiele.
-Das folgende Druckmuster:
-
-
- % WIEDERHOLUNG
- % MODUS 3
- Kommentar: &Kommentar
- ----------
-
-
-könnte folgende Ausgabe bewirken:
-
-
- Kommentar: Dies ist ein längerer Kommentar aus
- einer EUDAS-Datei, der zum Drucken
- auf eine Breite von 48 Zeichen
- umbrochen worden ist. Nur die letzte
- Zeile hat eine Absatzmarke.
- ----------
-
-
-Soll die Anzahl der Zeilen immer gleich bleiben, könnte man folgen­
-des Druckmuster verwenden:
-
-
- % WIEDERHOLUNG
- % MODUS 3
- % MEHR 5
- Kommentar: &Kommentar
- ----------
-
-
-Mit einem kürzeren Text ergäbe sich folgendes Bild:
-
-
- Kommentar: Nur ein kurzer Text.
-
-
-
-
- ----------
-
-
-Für eine Tabelle würde man den Modus 4 benutzen:
-
-
- % VORSPANN
- --------------------------------------------------------
- ! Abk. ! Kommentar !
- !---------+--------------------------------------------!
- % WIEDERHOLUNG
- % MODUS 4
- ! &abk ! &Kommentar&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& !
- ----------+---------------------------------------------
-
-
-Als Ausgabe könnte folgender Text erscheinen:
-
-
- --------------------------------------------------------
- ! Abk. ! Kommentar !
- !---------+--------------------------------------------!
- ! MA11 ! Dieser Kurs hat eine Menge an besonderen !
- ! ! Eigenschaften, die ihn für jüngere !
- ! ! Teilnehmer geeignet erscheinen lassen. !
- !---------+--------------------------------------------!
- ! TD04 ! Stellt keine besonderen Anforderungen. !
- !---------+--------------------------------------------!
- ! PM01 ! Seit dem 01.01. eingerichtet und noch !
- ! ! nicht voll besetzt. !
- ----------+---------------------------------------------
-
-
-Beachten Sie hier, daß Tabelleneinträge hier nicht wie im Modus 2
-geschoben, sondern auf weitere Zeilen verteilt werden, wenn sie zu
-lang sind. Außerdem werden die Tabellenbegrenzungen mit wieder­
-holt. Das Feldmuster für Kommentar muß jedoch mit fester Länge
-angegeben werden, da sonst die rechte Tabellenbegrenzung bis zum
-Dateilimit geschoben würde.
-
-#on("b")#Zusammenfassung#off("b")# Zum Abschluß dieses Abschnitts eine
-Zusammenfassung aller möglichen Modi:
-
- Modus Effekt
-
- 1 Normalmodus.
- '%'-Feldmuster werden auch nach links geschoben.
- Keine Zeilenwiederholung.
-
- 2 Tabellenmodus.
- '%'-Feldmuster werden nicht nach links geschoben.
- Keine Zeilenwiederholung.
-
- 3 Normalmodus mit Zeilenwiederholung.
- '%'-Feldmuster werden auch nach links geschoben.
- Zeilenwiederholung ohne Zwischentexte.
-
- 4 Tabellenmodus mit Zeilenwiederholung.
- '%'-Feldmuster werden nicht nach links geschoben.
- Zeilenwiederholung mit Zwischentexten.
-
-
diff --git a/doc/eudas/eudas.hdb.13 b/doc/eudas/eudas.hdb.13
deleted file mode 100644
index 435fbfc..0000000
--- a/doc/eudas/eudas.hdb.13
+++ /dev/null
@@ -1,757 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (133)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-13 Programmierung von Druckmustern
-
-
-
-13.1 Abkürzungen
-
-In den vorigen Kapiteln haben Sie erfahren, daß man Feldmuster
-von ganz bestimmter Länge definieren kann, deren Inhalt in genau
-dieser Länge eingesetzt und bei Bedarf abgeschnitten wird. Bei der
-Angabe dieser Länge spielt jedoch die Länge des Feldnamens eine
-ganz entscheidende Rolle. Das kürzeste Feldmuster fester Länge, das
-Sie definieren können, ist nämlich zwei Zeichen länger als der Feld­
-name (ein Musterzeichen vorher und eins nachher).
- Hätte das Feld 'PLZ' den Namen 'Postleitzahl' bekommen, so
-müßte ein solches Feldmuster mindestens eine Länge von 14 Zeichen
-haben. Damit Sie mit diesem Feldnamen auch ein Feldmuster der
-Länge 4 bekommen können (Postleitzahlen haben in den seltensten
-Fällen mehr als 4 Stellen), haben Sie die Möglichkeit, den Namen
-'Postleitzahl' für die Verwendung im Druckmuster geeignet abzu­
-kürzen.
- Abkürzungen haben jedoch noch eine viel weitreichendere
-Bedeutung. Mit ihnen ist es möglich, nicht nur die Feldinhalte einer
-EUDAS-Datei einzusetzen, sondern auch jeden anderen Text, den Sie
-mit einem ELAN-Programm erzeugen können.
- Die einfachsten zusätzlichen Daten, die Sie verwenden können,
-sind z.B. Datum und Uhrzeit. Für weitergehende Zwecke können Sie
-die Inhalte der EUDAS-Datei auch für Berechnungen verwenden und
-damit so umfangreiche Probleme wie das Schreiben von Rechnungen
-oder statistische Auswertungen unter Verwendung eines Druck­
-musters lösen.
-
-#on("b")#Abkürzungsteil#off("b")# Abkürzungen werden in einem speziellen
-Abkür­
-zungsteil am Ende eines Abschnittes angegeben. Der Abkürzungsteil
-wird durch die Anweisung
-
-
- % ABKUERZUNGEN
-
-
-eingeleitet. Eine Abkürzungsdefinition hat eine ähnliche Form wie
-ein Refinement (Falls Sie nicht wissen, was das ist, vergessen Sie
-es). Zu Beginn steht der Name der Abkürzung in Form eines Feld­
-musters, beginnend in der ersten Spalte. Danach folgt, durch Leer­
-zeichen getrennt, ein Doppelpunkt in der gleichen Zeile. Daran
-schließt sich ein beliebiger ELAN-Ausdruck an, der sich in freiem
-Format über beliebig viele Zeilen erstrecken kann und mit einem
-Punkt abgeschlossen werden muß. Dieser ELAN-Ausdruck muß ein
-TEXT-Objekt liefern.
-
-#on("b")#Feldinhalt#off("b")# Für die Abfrage von Inhalten aus einer
-EUDAS-Datei ist der Ausdruck
-
-
- f ("Feldname")
-
-
-vordefiniert. Die Abkürzung des Feldes 'Postleitzahl' würde also als
-Ausschnitt folgendermaßen aussehen:
-
-
- % ABKUERZUNGEN
- &p : f ("Postleitzahl") .
-
-
-Mit dieser Definition kann man im Muster so verfahren, als ob das
-Feld 'Postleitzahl' auch 'p' hieße. Diese einfachste Form der Ab­
-kürzung können Sie natürlich variieren, indem Sie für 'p' und
-'Postleitzahl' Ihre eigenen Namen einsetzen.
-
-#on("b")#Übersetzung#off("b")# Beachten Sie, daß das Druckmuster in ein
-ELAN-Pro­
-gramm umgeformt werden muß, da ELAN-Ausdrücke in ihm vorkom­
-men. Das automatisch erzeugte ELAN-Programm wird dann vom
-ELAN-Compiler übersetzt und ausgeführt. Fehler in den ELAN-Aus­
-drücken im Abkürzungsteil können erst vom ELAN-Compiler ent­
-deckt werden. Dieser kennt jedoch das Druckmuster nicht und mel­
-det die Fehler anhand des generierten Programms. Sie müssen in
-einem solchen Fall aufpassen, daß Sie die Fehlerquelle an der rich­
-tigen Stelle im Druckmuster lokalisieren (Hilfestellungen dazu sind
-im Kapitel über die Übersetzung von Druckmustern zu finden).
-
-#on("b")#Beispiel#off("b")# Um die Verwendung von Abkürzungen zu
-demonstrieren, wollen wir folgendes Druckmuster betrachten:
-
-
- % VORSPANN
- Adressenliste als Beispiel für Abkürzungen
- Stand: &Datum
- ------------------------------------------
- % ABKUERZUNGEN
- &Datum : date .
-
- % WIEDERHOLUNG
- &&l : &Vorname %Name
- &Strasse
- &&p& &Ort
- ------------------------------------------
- % ABKUERZUNGEN
- &l : lfd nr .
- &p : f ("PLZ") .
-
- % NACHSPANN
- &l Adressen gedruckt.
-
-
-Dieses Beispiel enthält eine ganze Reihe interessanter Details. Als
-erstes sollten Sie registrieren, daß auch im Vorspann oder Nach­
-spann Feldmuster verwendet werden können. Soll in diesem Fall ein
-Feldinhalt aus der EUDAS-Datei eingesetzt werden, so werden beim
-Vorspann die Inhalte des ersten und beim Nachspann die Inhalte des
-letzten durch Suchmuster ausgewählten Satzes verwendet. Daher
-kann auch jeder Abschnitt einen Abkürzungsteil haben. Abkürzun­
-gen gelten jedoch für alle Abschnitte (s. '&l'); die Aufteilung in
-mehrere Abkürzungsteile fördert im wesentlichen die Übersichtlich­
-keit.
- Versuchen Sie, an diesem Beispiel die wichtigsten Unterschiede
-zwischen dem #on("i")#Musterteil#off("i")# und dem #on("i")#Abkürzungsteil#off("i")# eines Abschnittes
-zu verstehen. Das Format des Musterteiles soll in die Ausgabe
-übernommen werden; daher ist dort die Stellung jedes Wortes wich­
-tig. Im Abkürzungsteil definieren Sie Abkürzungen ohne bestimm­
-tes Format - mit der einzigen Ausnahme, daß eine Abkürzungs­
-definition mit einem '&' in der ersten Spalte anfangen und ein
-Leerzeichen vor dem Doppelpunkt haben muß. Wie Sie sehen, dürfen
-dort Leerzeilen zur besseren Lesbarkeit eingefügt werden.
-Sie sollten bei unserem Beispiel folgende Ausgabe erhalten:
-
-
- Adressenliste als Beispiel für Abkürzungen
- Stand: 28.12.84
- ------------------------------------------
- 1 : Herbert Wegner
- Krämergasse 12
- 5000 Köln
- ------------------------------------------
- 2 : Helga Sandmann
- Willicher Weg 109
- 5300 Bonn 1
- ------------------------------------------
- 3 : Albert Katani
- Lindenstr. 3
- 5210 Troisdorf
- ------------------------------------------
- 4 : Peter Ulmen
- Mozartstraße 17
- 5 Köln 60
- ------------------------------------------
- 5 : Karin Regmann
- Grengelweg 44
- 5000 Köln 90
- ------------------------------------------
- 6 : Hubert Arken
- Talweg 12
- 5200 Siegburg
- ------------------------------------------
- 7 : Anna-Maria Simmern
- Platanenweg 67
- 5 Köln 3
- ------------------------------------------
- 8 : Angelika Kaufmann-Drescher
- Hauptstr. 123
- 53 Bonn 2
- ------------------------------------------
- 9 : Harald Fuhrmann
- Glockengasse 44
- 5000 Köln 1
- ------------------------------------------
- 10 : Friedrich Seefeld
- Kabelgasse
- 5000 Köln-Ehrenfeld
- ------------------------------------------
- 10 Adressen gedruckt.
-
-
-Nun zu den Abkürzungen im einzelnen. Das Feld 'PLZ' muß abge­
-kürzt werden, damit es rechtsbündig vor den Ort gedruckt werden
-kann. Die Abkürzung 'p' benutzt die im vorigen Kapitel beschriebe­
-ne Form zur Abfrage des Feldinhaltes.
- 'Datum' wird als Abkürzung für das aktuelle Datum definiert,
-ein häufig benötigter Fall. 'date' ist der ELAN-Ausdruck, der das
-Datum liefert. (Bemerkung für ELAN-Programmierer: der Name der
-Abkürzung gehorcht nicht der ELAN-Syntax für Bezeichner).
- Eine für Tabellen sinnvolle Funktion wird bei der Definition
-von 'l' verwendet. Der von EUDAS definierte Ausdruck 'lfd nr' lie­
-fert die laufende Nummer des gerade gedruckten Satzes als Text.
-Dabei ist zu beachten, daß die laufende Nummer nicht mit der Satz­
-nummer übereinstimmt, sondern nur während des Druckvorganges
-von 1 an bei jedem gedruckten Satz hochgezählt wird. Diese Funk­
-tion dient dazu, die Sätze in der Liste durchzunumerieren.
- Die laufende Nummer soll in der Liste rechtsbündig mit Doppel­
-punkt vor dem Namen stehen. Dazu wird das Feldmuster '&&l' be­
-nutzt, eine Form, die eigentlich keinen Sinn hat (die Kombination
-'variable Länge' und 'rechtsbündig' gibt es nicht). Um ein möglichst
-kurzes Feldmuster schreiben zu können, wird in diesem Fall jedoch
-feste Länge unterstellt (auch ohne folgendes '&'). Damit hat das
-kürzeste Feldmuster fester Länge drei Zeichen sowohl im linksbün­
-digen ('&l&') wie auch im rechtsbündigen Fall ('&&l').
-
-#on("b")#Auswertungen#off("b")# Die Verwendung der Abkürzung 'l' im Nachspann
-kann als erstes Beispiel für eine Auswertungsfunktion gelten. Da
-für den Nachspann die Daten des letzten Satzes verwendet werden,
-erscheint hier die laufende Nummer des letzten Satzes und somit die
-Anzahl der Sätze, die gedruckt wurden. Das kann dazu benutzt
-werden, die Sätze zu zählen, die eine bestimmte Suchbedingung
-erfüllen. Folgendes Druckmuster zählt die Anzahl der Frauen oder
-Männer in der Datei:
-
-
- % NACHSPANN
- &l Personen mit dem Geschlecht '%<m/w>' vorhanden.
- % ABKUERZUNGEN
- &l : lfd nr .
-
-
-Wenn Sie vor dem Drucken jetzt die Suchbedingung 'm' für das Feld
-'m/w' einstellen, werden alle Männer ausgewählt. Das Drucken be­
-steht in diesem Fall nur aus dem Hochzählen der laufenden Nummer
-für jeden Mann. Im Nachspann kann das Ergebnis dann ausgegeben
-werden; zugleich soll der aktuelle Wert des Feldes 'm/w' gedruckt
-werden, damit das Druckmuster auch für das Zählen der Frauen
-verwendet werden kann.
- Die beiden möglichen Ausgaben würden dann so aussehen:
-
-
- 6 Personen mit dem Geschlecht 'm' vorhanden.
-
- 4 Personen mit dem Geschlecht 'w' vorhanden.
-
-
-#on("b")#Zusammenfassung#off("b")# Wir können die Erkenntnisse dieses
-Abschnittes wie folgt zusammenfassen:
-
-* Feldmuster können auch im Vorspann und Nachspann verwendet
- werden. Im Vorspann werden die Daten des ersten, im Nachspann
- die Daten des letzten ausgewählten Satzes verwendet.
-
-* Der Musterteil eines Abschnittes definiert ein Format; der Ab­
- kürzungsteil ist formatfrei.
-
-* 'lfd nr' dient zum Durchnumerieren aller gedruckten Sätze.
-
-* Ein rechtsbündiges Feldmuster hat immer auch feste Länge.
-
-#on("b")#Komplexe Abkürzungen#off("b")# Mit Hilfe von Abkürzungen können wir
-jetzt auch bessere Musterbriefe schreiben. Ein Problem, das bereits
-angesprochen wurde, besteht darin, daß in der Anrede je nach Ge­
-schlecht 'Herr' oder 'Frau' stehen soll. Um dieses Problem zu lösen,
-wird der Inhalt des Feldes 'm/w' benötigt.
- Da in einer Abkürzung jede ELAN-Anweisung erlaubt ist, die
-einen Text liefert, können natürlich auch #on("i")#IF-Anweisungen#off("i")# verwen­
-det werden. Mit diesen Informationen können wir jetzt die Abkür­
-zung 'Anrede' definieren:
-
-
- % ABKUERZUNGEN
- &Anrede :
- IF f ("m/w") = "w" THEN
- "Frau"
- ELSE
- "Herr"
- END IF .
-
-
-Für Nicht-Programmierer: Die IF-Anweisung besteht aus einer Ab­
-frage und zwei Alternativen. Die Abfrage steht zwischen dem IF und
-dem THEN und besteht in der Regel aus einer Abfrage, ob zwei
-Dinge gleich oder ungleich (<>), größer oder kleiner sind. Außerdem
-können mehrere Abfragen mit AND (und) und OR (oder) kombiniert
-werden. Näheres dazu im Kapitel 14.
- Die Alternative hinter dem THEN wird ausgewählt, wenn die
-Abfrage zutrifft. An dieser Stelle sind wieder beliebige Ausdrücke
-erlaubt, die einen Text liefern, einschließlich erneuter IF-Anwei­
-sungen (Schachtelung). Die Alternative zwischen ELSE und END IF
-wird ausgewählt, wenn die Abfrage nicht zutrifft.
-
-#on("b")#Textkonstanten#off("b")# Bisher wurden nur ELAN-Funktionen als
-Textlie­
-feranten betrachtet ('date', 'lfd nr', 'f'). In unserem Fall werden
-aber #on("i")#Textkonstanten#off("i")# in den Alternativen der IF-Anweisung benö­
-tigt. Textkonstanten werden in ELAN in Anführungsstriche einge­
-schlossen, die aber nicht zum Text gehören. Innerhalb einer Text­
-konstanten werden Leerzeichen wie alle anderen Zeichen angesehen
-(erscheinen also auch nachher in der Ausgabe).
- Bei solchen Abkürzungen, die längere Anweisungen umfassen,
-sollten Sie das freie Format ausnutzen und eine möglichst über­
-sichtliche Darstellung wählen. Wie Sie sehen, muß nur der Doppel­
-punkt noch in der ersten Zeile stehen, der Rest kann sich beliebig
-auf die folgenden Zeilen erstrecken.
-
-#on("b")#Beispiel#off("b")# Ein typischer Einsatz einer IF-Anweisung für die
-Anrede sieht so aus:
-
-
- % WIEDERHOLUNG
-
- Sehr geehrte&Anrede %<Name>!
-
- ...
- % ABKUERZUNGEN
- &Anrede :
- IF f ("m/w") = "m" THEN
- "r Herr"
- ELSE
- " Frau"
- END IF .
-
-
-Sie sollten jetzt diese Konstruktion in einen Musterbrief einfügen
-können. Probieren Sie ihn dann als Beispiel aus !
-
-#on("b")#Weitere Möglichkeiten#off("b")# Durch Verwendung von Abkürzungen ist
-es
-auch möglich, rechtsbündige Felder mit einer Länge von weniger als
-3 Zeichen zu simulieren. Dies geschieht mit Hilfe der Textoperatio­
-nen von ELAN. Ohne ELAN-Vorkenntnisse können Sie dieses Bei­
-spiel überlesen. In unserer Liste im obigen Beispiel sind die laufen­
-den Nummern höchstens zweistellig und sollten deshalb auch nur
-zwei Stellen belegen. Dies würde folgende Abkürzung ermöglichen:
-
-
- % ABKUERZUNGEN
- &l : text (lfd nr als zahl, 2) .
- lfd nr als zahl : int (lfd nr) .
-
-
-Die Prozedur 'text' wird dazu benutzt, eine Zahl rechtsbündig auf
-zwei Stellen zu formatieren (s. EUMEL-Benutzerhandbuch). Da die
-Abkürzung immer eine Länge von zwei Zeichen hat, kann sie auch in
-einem Feldmuster variabler Länge eingesetzt werden. Die Attribute
-'feste Länge' und 'rechtsbündig' werden in diesem Fall also nicht
-durch das Feldmuster, sondern durch die Abkürzung selbst erzeugt.
- Um die Prozedur 'text' anwenden zu können, muß die laufende
-Nummer als Zahl (sprich: INT-Objekt) vorliegen. Diese Umwandlung
-wird mit der Prozedur 'int' vorgenommen, die einen Text in eine
-Zahl umwandelt. Obwohl man 'int (lfd nr)' direkt in den Aufruf von
-'text' hätte schreiben können, wird hier als Demonstration dafür ein
-Refinement verwendet.
- Refinements können in einem Abkürzungsteil neben Abkürzun­
-gen stehen und von allen Abkürzungen benutzt werden. Sie werden
-ähnlich geschrieben wie Abkürzungen, nur ihr Name muß in Klein­
-buchstaben geschrieben werden, dafür muß er nicht in der ersten
-Spalte anfangen und kann Leerzeichen enthalten. Bei komplizierte­
-ren Ausdrücken sollten Refinements zur besseren Lesbarkeit einge­
-setzt werden.
- Sie können die IF-Anweisung auch mit beliebig vielen ELIF-
-Teilen versehen. Achten Sie jedoch darauf, daß die IF-Anweisung
-#on("i")#immer#off("i")# irgendeinen Wert liefern muß. Sie dürfen also den ELSE-Teil
-nicht weglassen. Statt einer IF-Anweisung können Sie natürlich
-auch eine SELECT-Anweisung verwenden. Es stehen Ihnen im Prin­
-zip alle werteliefernden Anweisungen von ELAN zur Verfügung.
- Die Programmiersprache ELAN bietet Ihnen noch weit mehr
-Möglichkeiten, als hier beschrieben werden können. So können Sie
-sich eigene Prozeduren definieren und diese dann in Abkürzungen
-verwenden. In Kapitel 14 und 15 finden Sie eine Einführung in die
-wichtigsten Konstrukte, die für EUDAS gebraucht werden.
-
-
-13.2 Bedingte Musterteile
-
-Wenn größere Teile des Druckmusters in Abhängigkeit von bestimm­
-ten Daten unterschiedlich ausfallen sollen, werden die dazu benö­
-tigten Abkürzungen sehr umfangreich. Für solche Fälle kann man
-IF-Anweisungen auch im Musterteil eines Abschnitts verwenden. In
-diesem Fall werden die Alternativen der IF-Anweisung durch
-Musterzeilen dargestellt.
- Im Musterteil müssen jedoch die Zeilen, die Teil der IF-An­
-weisung sind, von den Musterzeilen unterschieden werden. Deshalb
-werden die Anweisungszeilen durch ein '%'-Zeichen in der ersten
-#on("i")#und#off("i")# zweiten Spalte gekennzeichnet. Das zweite '%'-Zeichen dient
-zur Unterscheidung von Anweisungen an den Druckgenerator, die
-nicht an den ELAN-Compiler übergeben werden sollen.
- Mit einer IF-Anweisung im Musterteil kann man das Anredepro­
-blem auch folgendermaßen lösen:
-
-
- % WIEDERHOLUNG
- %% IF f ("m/w") = "w" THEN
- Sehr geehrte Frau &<Name>!
- %% ELSE
- Sehr geehrter Herr &<Name>!
- %% END IF;
-
-
-Beachten Sie den Unterschied, daß die IF-Anweisung hier mit einem
-Semikolon abgeschlossen werden muß - in Abkürzungen mußte ja ein
-Punkt danach folgen. Außerdem darf hier der ELSE-Teil (die zweite
-Alternative) fehlen, während in einer Abkürzung in jeder Alternati­
-ve etwas stehen muß (zumindest der leere Text "").
- Falls sich der IF-THEN-Teil über mehr als eine Zeile erstrek­
-ken soll, muß jede dieser Zeilen mit '%%' beginnen, da die Folgezei­
-len sonst als Musterzeilen gedruckt würden. Benutzen Sie in einem
-solchen Fall jedoch besser ein Refinement, das Sie im Abkürzungs­
-teil definieren müssen.
- Sie können im Musterteil auch andere ELAN-Anweisungen
-verwenden. Der Unterschied zu Abkürzungen liegt darin, daß die
-Musterzeilen nicht als Werte angesehen werden, die die Anweisung
-liefern muß, sondern als Anweisungen, die dort aufgeführten Mu­
-sterzeilen einzusetzen und zu drucken. Daher kann im Musterteil
-auch eine FOR-Schleife sinnvoll sein, wenn in Abhängigkeit eines
-Wertes eine bestimmte Anzahl von Zeilen gedruckt werden soll.
-
-
-13.3 Ãœbersetzung
-
-Wenn Sie bis jetzt auch als ELAN-Programmierer immer noch nicht
-ganz durchblicken, wie Sie welche ELAN-Anweisungen verwenden
-können, dann ist das noch kein Anlaß zur Sorge. Es ist kaum mög­
-lich, die genauen Auswirkungen beliebiger Anweisungen zu be­
-schreiben, ohne den Übersetzungsprozeß zu schildern, der diese
-Anweisungen zu einem ELAN-Programm zusammenbindet. Daher soll
-diese Übersetzung jetzt genauer erklärt werden.
-
-#on("b")#Übersetzungsmechanismus#off("b")# Alle Zeilen eines Abkürzungsteils
-wer­
-den direkt in das Programm übernommen, wobei der Name einer Ab­
-kürzung durch einen beliebig gewählten Refinementnamen ersetzt
-wird ('abk' + eine laufende Nummer). Alle Abkürzungen und Re­
-finements werden als globale Refinements definiert, also außerhalb
-von Prozeduren. Dadurch wird erreicht, daß sie an jeder Stelle
-verwendet werden können.
- Damit eine Abkürzung richtig als Refinement übersetzt wird,
-muß sie ein TEXT-Objekt als Wert liefern. Die anderen Refinements
-sind beliebig, da Sie nur in selbstdefinierten Anweisungen verwen­
-det werden. Die Refinements der Abkürzungen werden in einer Zu­
-weisung an eine TEXT-Variable verwendet, damit der Druckgenera­
-tor auf den entsprechenden Wert zugreifen kann.
- Jeder Abschnitt wird dagegen als eine Prozedur übersetzt. Jede
-Folge von Musterzeilen wird in eine Anweisung übersetzt, diese
-Musterzeilen einzusetzen und zu drucken. Jede '%%'-Anweisung
-wird einfach unverändert dazwischen geschrieben. Die Vorspann-
-Prozedur wird einmal zu Anfang aufgerufen, die Prozedur für den
-Wiederholungsteil einmal für jeden ausgewählten Satz und die Nach­
-spann-Prozedur einmal am Schluß.
- Bei Fehlern im ELAN-Teil zeigt der Compiler das erzeugte Pro­
-gramm zusammen mit seinen Fehlermeldungen im Paralleleditor. Sie
-müssen nun die Fehlermeldung lokalisieren und anhand der eben
-gegebenen Hinweise in das ursprüngliche Druckmuster zurücküber­
-setzen, damit Sie dort den Fehler korrigieren können.
-
-#on("b")#Beispiel#off("b")# Nun müßten Sie genug Informationen haben, um
-beliebige
-ELAN-Anweisungen in das Druckmuster einfügen zu können. Als
-Beispiel wollen wir versuchen, alle Männer und Frauen in der
-Adressendatei zu zählen, ohne ein Suchmuster einstellen zu müssen
-und ohne den Druckvorgang zweimal ablaufen zu lassen (wie dies
-bei dem obigen Beispiel der Fall war). Ein erster Versuch könnte so
-aussehen:
-
-
- % VORSPANN
- %% INT VAR maenner, frauen;
- %% maenner := 0;
- %% frauen := 0;
- % WIEDERHOLUNG
- %% IF f ("m/w") = "m" THEN
- %% maenner INCR 1
- %% ELSE
- %% frauen INCR 1
- %% END IF
- % NACHSPANN
- &maenner Männer und %frauen Frauen vorhanden.
-
-
-Aber Vorsicht! In diesem Beispiel sind mehrere Fehler eingebaut.
-Finden Sie sie!
-
-#on("b")#Fehler im Beispiel#off("b")# Der erste Fehler befindet sich im
-Nachspann.
-Hier wird versucht, die Namen der beiden Variablen 'maenner' und
-'frauen' direkt in einem Feldmuster zu verwenden. Diese beiden
-Namen sind dem Druckgenerator nicht bekannt, sondern nur dem
-ELAN-Compiler. Um die Werte der beiden Variablen einsetzen zu
-können, müssen Sie also zwei geeignete Abkürzungen definieren.
- Der zweite Fehler ist schwieriger zu finden. Wie oben gesagt,
-wird jeder Abschnitt in eine Prozedur übersetzt. Die in einem Ab­
-schnitt definierten Variablen können also nur in diesem Abschnitt
-verwendet werden (sie sind lokal) und auch nicht im Abkürzungs­
-teil, da dieser wieder global vereinbart wird. Die beiden im Vor­
-spann definierten Variablen stehen also im Wiederholungsteil und im
-Nachspann nicht zur Verfügung.
-
-#on("b")#Anweisungen im Initialisierungsteil#off("b")# Für diesen Fall gibt
-es die
-Möglichkeit, ELAN-Anweisungen vor allen Abschnitten im Initiali­
-sierungsteil zu definieren. Diese Anweisungen sind dann ebenfalls
-global. Das richtige Druckmuster finden Sie auf der nächsten Seite.
- Natürlich könnten Sie die Initialisierung der beiden Variablen
-auch noch aus dem Vorspann herausnehmen. Denken Sie daran, daß
-Sie aus INT-Variablen erst einen Text machen müssen, ehe Sie sie
-in eine Musterzeile einsetzen können. Beachten Sie Schreibweise der
-Variablen: in ELAN können die Umlaute nicht in Bezeichnern ver­
-wendet werden, daher muß die Variable mit 'ae' geschrieben wer­
-den. Im Mustertext und in Abkürzungs- und Feldnamen können die
-Umlaute jedoch frei verwendet werden.
-
-
- %% INT VAR maenner, frauen;
- % VORSPANN
- %% maenner := 0;
- %% frauen := 0;
- % WIEDERHOLUNG
- %% IF f ("m/w") = "m" THEN
- %% maenner INCR 1
- %% ELSE
- %% frauen INCR 1
- %% END IF
- % NACHSPANN
- &m Männer und %f Frauen vorhanden .
- % ABKUERZUNGEN
- &m : text (maenner) .
- &f : text (frauen) .
-
-
-
-13.4 Gruppen
-
-Der Druckgenerator bietet die Möglichkeit, Vorspann und Nachspann
-nicht nur am Anfang und am Ende, sondern auch an bestimmten
-Stellen zwischen Sätzen zu drucken. Diese Stellen sind dadurch
-bestimmt, daß ein bestimmtes Merkmal (z.B. ein Feldinhalt) seinen
-Wert ändert. Ein solches Merkmal wird im Druckmuster #on("i")#Gruppe#off("i")# ge­
-nannt.
- Ein Beispiel für die Verwendung von Gruppen ist eine Schüler­
-datei, die nach Klassen geordnet ist. Definiert man das Feld 'Klas­
-se' als Gruppe, so wird jeweils am Ende einer Klasse ein Nachspann
-und am Beginn einer Klasse ein Vorspann gedruckt.
- Dieses Verfahren ist eine Erweiterung der bisher beschriebenen
-Methode, indem eine Datei quasi in mehrere Dateien untergliedert
-wird, die jedoch in einem Arbeitsgang gedruckt werden können.
-Voraussetzung dafür ist jedoch, daß die Datei nach dem Gruppen­
-merkmal geordnet ist - der Druckgenerator sammelt nicht erst alle
-Schüler einer Klasse aus der Datei, sondern erwartet sie hinter­
-einander.
-
-#on("b")#Gruppendefinition#off("b")# Eine Gruppe wird im Initialisierungsteil
-des
-Druckmusters (also vor allen Abschnitten) definiert. Notwendige
-Daten sind eine Nummer zur Identifizierung und das Merkmal. Die
-Nummer sollte am sinnvollsten von 1 an vergeben werden; die mög­
-lichen Werte sind nach oben hin beschränkt. Das Merkmal ist ein
-beliebiger ELAN-Ausdruck, der einen Text liefert. Sinnvollerweise
-wird er den Inhalt eines Feldes enthalten.
- Gruppendefinitionen müssen nach allen ELAN-Anweisungen im
-Initialisierungsteil folgen, und zwar, weil die Gruppendefinitionen
-alle in einer Prozedur zusammengefaßt werden, die bei jedem neuen
-Satz auf Gruppenwechsel testet.
- Unter der Annahme, daß die oben erwähnte Schülerdatei ein
-Feld 'Klasse' besitzt, würde die Gruppe wie folgt definiert:
-
-
- % GRUPPE 1 f ("Klasse")
-
-
-Nach der Anweisung 'GRUPPE' folgt die Gruppennummer und dann
-ein ELAN-Ausdruck. Die ganze Definition muß in einer Zeile stehen;
-reicht der Platz nicht aus, müssen Sie in einem Abkürzungsteil ein
-Refinement definieren.
-
-#on("b")#Klassenliste#off("b")# Das komplette Druckmuster für die
-Klassenliste könn­
-te folgendes Aussehen haben, wenn außer 'Klasse' auch noch die
-Felder 'Name' und 'Vorname' vorhanden sind:
-
-
- % GRUPPE 1 f ("Klasse")
- % VORSPANN
- Klassenliste für Klasse &Klasse
- ----------------------------
- % WIEDERHOLUNG
- &Vorname %Name
- % NACHSPANN
- \#page\#
-
-
-Wenn eine Gruppe definiert ist, werden im Nachspann immer die
-Feldinhalte des letzten Satzes vor dem Gruppenwechsel gedruckt, im
-Vorspann die Inhalte des ersten Satzes nach dem Wechsel. Daher
-kann hier im Vorspann die Klasse gedruckt werden, da sie sich erst
-ändert, wenn schon wieder der nächste Vorspann gedruckt wird.
-
-#on("b")#Mehrere Gruppen#off("b")# Wie die Identifikation über eine
-Gruppennummer
-vermuten läßt, können Sie mehrere Gruppen definieren. Nachspann
-und Vorspann werden jeweils gedruckt, wenn sich das Merkmal ir­
-gendeiner Gruppe ändert. Ob eine bestimmte Gruppe gewechselt hat,
-kann mit der Abfrage
-
-
- BOOL PROC gruppenwechsel (INT CONST gruppennummer)
-
-
-in einer IF-Anweisung ermittelt werden. Vor dem ersten und nach
-dem letzten Satz wechseln automatisch alle Gruppen.
- Die ganze Datei bildet eine Quasi-Gruppe mit der Nummer 0.
-Sie ist immer definiert und wechselt nur vor dem ersten und nach
-dem letzten Satz. Sie ist es, die bewirkt, daß Vorspann und Nach­
-spann in ihrer normalen Weise gedruckt werden.
-
-#on("b")#Anwendungsbeispiel#off("b")# Um einige der Möglichkeiten zu
-illustrieren,
-die durch Gruppen geschaffen werden, wollen wir als Beispiel eine
-Anwendung betrachten, die neue Wege für die Benutzung von EUDAS
-aufzeigt.
- Aus einer Datei, in der für jede Bestellung der Kunde, der Ar­
-tikel, die bestellte Menge und der Einzelpreis des Artikels einge­
-tragen werden, sollen anschließend Rechnungen gedruckt werden.
-Die Datei soll folgende Felder haben:
-
-
- 'Kundennummer'
- 'Artikelnummer'
- 'Einzelpreis'
- 'Menge'
-
-
-Als Voraussetzung müssen die Bestellungen in der Datei jeweils
-nach Kunden geordnet vorliegen. Die Kundennummer wird als Gruppe
-definiert, so daß die Bestellungen eines Kunden zu einer Rechnung
-zusammengefaßt werden können. Das Druckmuster rechnet dann die
-einzelnen Preise zusammen und gibt eine Endsumme aus.
- Damit in der Rechnung Name und Adresse des Kunden auftau­
-chen können, wird zu der Bestellungsdatei die Kundendatei gekop­
-pelt, die folgende Felder haben soll:
-
-
- 'Kundennummer'
- 'Name'
- 'Vorname'
- 'Strasse'
- 'PLZ'
- 'Ort'
-
-
-Stellen Sie sich zum Ausprobieren des folgenden Druckmusters ge­
-gebenenfalls eigene Daten zusammen. Hier nun das Druckmuster:
-
-
- %% REAL VAR gesamtpreis, summe;
- % GRUPPE 1 f ("Kundennummer")
- % VORSPANN
- %% summe := 0.0;
- Fa. Kraus & Sohn
- Schotterstr. 10
-
- 5000 Köln 1
- &Vorname %Name
- &Strasse
-
- &PLZ &Ort &Datum
-
- R E C H N U N G
- ===============
-
- Menge Artikelnr. Einzelpreis Gesamtpreis
- ------------------------------------------------
- % ABKUERZUNGEN
- &Datum : date .
-
- % WIEDERHOLUNG
- %% gesamtpreis := round
- %% (wert ("Einzelpreis") * wert ("Menge"), 2);
- %% summe INCR gesamtpreis;
- &Menge &Artikelnummer &&&&epr&& &&&&gpr&&
- % ABKUERZUNGEN
- &epr : f ("Einzelpreis") .
- &gpr : zahltext (gesamtpreis, 2) .
-
- % NACHSPANN
- ------------------------------------------------
- Summe: &&&&sum&&
- + 14% MWSt. &&&Mwst&&
- =========
- Endbetrag &&&&end&&
- \#page\#
- % ABKUERZUNGEN
- &sum : zahltext (summe, 2) .
- &Mwst : zahltext (mwst, 2) .
- &end : zahltext (summe + mwst, 2) .
- mwst : round (summe * 0.14, 2) .
-
-
-Im Initialisierungsteil dieses Druckmusters wird die Kundennummer
-als Gruppe definiert. Dies hat zur Folge, daß für jeden neuen Kun­
-den eine neue Rechnung begonnen wird, nachdem vorher im Nach­
-spann die Rechnungssumme des vorherigen Kunden berechnet und
-ausgedruckt wurde. Vor dieser Gruppendefinition sind 'gesamtpreis'
-und 'summe' definiert, die später als globale Variablen zur Verfü­
-gung stehen sollen. Diese Zeile darf nicht nach der Gruppendefini­
-tion stehen.
- Im Vorspann wird der Kopf der Rechnung angegeben. Dieser
-enthält neben den Daten des Kunden (aus der gekoppelten Kun­
-dendatei) noch das Datum. Die Kundennummer wird nur zum Kop­
-peln und als Gruppenmerkmal benötigt, erscheint also nicht auf der
-Rechnung.
- Es fällt auf, daß im Firmennamen ein '&'-Zeichen auftaucht,
-das doch für die Markierung von Feldmustern reserviert ist. Die
-beiden Musterzeichen können jedoch im normalen Text auftauchen,
-wenn ihnen direkt ein Leerzeichen folgt. In diesem Fall werden Sie
-nicht als Beginn eines Feldmusters interpretiert, sondern unverän­
-dert gedruckt. Der gleiche Fall taucht noch mit '%' im Nachspann
-auf.
- Im Wiederholungsteil wird zunächst aus dem Einzelpreis und der
-Menge des jeweiligen Artikels der Gesamtpreis für diesen Artikel
-berechnet. Für die Abfrage der Feldinhalte wird die Funktion 'wert'
-verwendet, die wie 'f' funktioniert, jedoch gleich einen REAL-Wert
-liefert.
- Zu beachten ist, daß 'wert' wie beim Sortieren von Zahl alle
-Sonderzeichen ignoriert. Weiterhin müssen die Zahlen mit dem ein­
-gestellten Dezimalkomma geschrieben werden (also normalerweise
-mit Komma), damit ihr Wert richtig erkannt wird. Anderenfalls soll­
-ten Sie den Dezimalpunkt einstellen (s. 11.1).
- Damit kaufmännisch richtig gerechnet wird, wird der Gesamt­
-preis auf 2 Nachkommastellen gerundet und erst dann aufsummiert.
-Würde der Gesamtpreis nur zum Einsetzen gerundet, könnten bei der
-anschließenden Addition der nicht gerundeten Werte eine falsche
-Gesamtsumme entstehen.
- Erst nach diesen Berechnungen kann die Musterzeile folgen, in
-die die Werte dann eingesetzt werden. Um eine Ausgabe mit zwei
-Nachkommastellen zu erzeugen, wird die von EUDAS definierte
-Funktion 'zahltext' benutzt. Diese erzeugt aus einem REAL-Wert
-einen Text mit der angegebenen Anzahl von Kommastellen und setzt
-das korrekte Dezimalkomma ein. Das Ergebnis dieser Funktion wird
-dann rechtsbündig eingesetzt.
- Im Nachspann wird dann der summierte Wert mit aufgeschlage­
-ner Mehrwertsteuer gedruckt. Die Mehrwertsteuer muß ebenfalls auf
-zwei Nachkommastellen gerundet werden.
-
-#on("b")#Erweiterung#off("b")# Zur Erweiterung könnten Sie die Bestelldatei
-noch mit
-einer Artikeldatei koppeln, die etwa folgende Struktur haben würde:
-
-
- 'Artikelnummer'
- 'Bezeichnung'
- 'Einzelpreis'
-
-
-In diesem Fall könnten Sie noch jeweils die Artikelbezeichnung in
-eine Rechnungszeile drucken. Außerdem würde der Preis zentral
-gespeichert. Eine entsprechende Änderung des Druckmusters sollte
-Ihnen keine Schwierigkeiten bereiten.
-
-
-
diff --git a/doc/eudas/eudas.hdb.14 b/doc/eudas/eudas.hdb.14
deleted file mode 100644
index 1aa3c87..0000000
--- a/doc/eudas/eudas.hdb.14
+++ /dev/null
@@ -1,724 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (151)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-14 Ausdrücke in ELAN
-
-
-
-14.1 Was sind Ausdrücke ?
-
-In diesem Kapitel wollen wir uns mit ELAN-Ausdrücken beschäfti­
-gen, wie sie für EUDAS gebraucht werden. Natürlich kann dies keine
-ernsthafte Einführung für ELAN-Programmierer sein - mit solchen
-Ambitionen halten Sie sich am besten an die entsprechende ELAN-
-Literatur.
- Dieser Text richtet sich eher an den Benutzer, der kaum Erfah­
-rung mit ELAN hat, aber die Möglichkeiten von EUDAS optimal nut­
-zen will. Viele fortgeschrittene Fähigkeiten von EUDAS laufen ja
-über ELAN-Programme.
-
-#on("b")#Vorkommen#off("b")# Sie haben ELAN-Ausdrücke bereits an
-verschiedenen
-Stellen eingesetzt, wenn Sie sich mit den vorhergehenden Kapiteln
-befaßt haben. ELAN-Ausdrücke werden in nahezu allen Verarbei­
-tungsfunktionen benötigt.
- Im Druckmuster dienen sie dazu, den Inhalt eines Feldmusters
-festzulegen. Die Definition einer Abkürzung besteht immer aus dem
-Namen der Abkürzung und einem Ausdruck. Ebenso wird in einer
-Gruppendefinition ein Ausdruck angegeben.
- Beim Kopiermuster und beim Änderungsmuster besteht jeweils
-die rechte Seite einer Anweisung aus einem Ausdruck. Weiterhin
-werden Ausdrücke auch in anderen ELAN-Konstruktionen benötigt,
-wie zum Beispiel direkt am Anfang einer IF-Anweisung.
-
-#on("b")#Bedeutung#off("b")# Ein Ausdruck steht allgemein für einen Wert. Im
-ein­
-fachsten Fall kann dies eine Konstante sein, der Wert des Aus­
-drucks ändert sich also nicht. Anderenfalls spricht man von einem
-zusammengesetzten Ausdruck. Dessen Wert ergibt sich dann durch
-die Ausführung der im Ausdruck angegebenen Operationen. Dieser
-Wert kann je nach dem aktuellen Zustand des Systems verschieden
-sein, da er jedes Mal neu berechnet wird, wenn er gebraucht wird.
- Ein Beispiel für einen zusammengesetzten Ausdruck ist 2+2
-Dieser Ausdruck steht für den Wert 4.
- Der Wert eines Ausdrucks ist das, was uns eigentlich interes­
-siert. Beim Druckvorgang wird dieser Wert dann gedruckt, beim
-Kopieren und Verändern in ein Feld eingetragen.
-
-#on("b")#Zusammensetzung#off("b")# Ausdrücke lassen sich aus verschiedenen
-Ele­
-menten zusammensetzen. Grundlage bilden die Konstanten. Konstan­
-ten können durch #on("i")#Operatoren#off("i")# miteinander verknüpft werden. So ist
-in dem Ausdruck 2+3 das '+' ein Operator, der die Konstanten 2
-und 3 verknüpft. Das Ergebnis der Verknüpfung hängt natürlich vom
-jeweiligen Operator ab.
- Wie Sie schon in der Schule gelernt haben ("Punktrechnung vor
-Strichrechnung"), muß man die Reihenfolge der Operatoren festlegen,
-wenn mehrere Operatoren im Spiel sind. Ähnliche Regeln gibt es für
-alle Operatoren in ELAN.
- Wenn eine andere Reihenfolge der Operatoren erwünscht ist,
-können Sie diese durch Einsatz von Klammern verändern. Auch dies
-dürfte Ihnen aus der Schule noch in Erinnerung sein. Der Unter­
-schied in ELAN ist lediglich, daß es dort einige zusätzliche Opera­
-toren gibt, die Ihnen nicht aus der Mathematik vertraut sind.
- Ein weiteres Konstruktionselement von Ausdrücken sind #on("i")#Funk­
-tionen#off("i")#. Auch diese kennen Sie aus der Schule. Lediglich die
-Schreibweise muß für den "dummen" Computer etwas ausführlicher
-gehalten werden (Beispiel: sin (3.14 * x)).
- Die Argumente der Funktion hinter dem Funktionsnamen müssen
-auf jeden Fall in Klammern stehen. In der Terminologie der Pro­
-grammiersprachen spricht man von #on("i")#Parametern#off("i")#. Parameter können
-wieder komplexe Ausdrücke sein. Bei Funktionen mit mehreren
-Parametern werden diese durch Komma getrennt:
-
-
- min (2.5 * x, x + 1.25)
-
-
-
-14.2 Datentypen
-
-Bevor wir beginnen, konkrete Ausdrücke zu behandeln, müssen wir
-erst das Konzept der #on("i")#Datentypen#off("i")# einführen. Grundidee dabei ist,
-daß es verschiedene Klassen von Werten gibt, die nicht einfach
-untereinander gemischt werden können.
- So gibt es in ELAN einen grundlegenden Unterschied zwischen
-#on("i")#Zahlen#off("i")# und #on("i")#Texten#off("i")#. Texte bestehen aus einer beliebigen Aneinan­
-derreihung von Zeichen, die im Normalfall nur für den betrachten­
-den Menschen eine Bedeutung haben. Mit Zahlen kann man dagegen
-Berechnungen anstellen.
- Der tiefere Grund für die Trennung in verschiedene Typen ist
-also, daß für jeden Typ gewisse Operationen definiert snd, die nur
-für diesen Typ sinnvoll sind. So ist zum Beispiel die Addition der
-beiden Texte "abc" und "-/-" völlig sinnlos.
- Aber nicht nur die Operationen sind verschieden, sondern auch
-die interne Darstellung im Rechner. So werden der Text "1234" und
-die Zahl 1234 völlig anders gespeichert, obwohl man ihnen die glei­
-che Bedeutung beimessen könnte.
-
-#on("b")#Grundtypen#off("b")# In ELAN gibt es vier verschiedene Grundtypen,
-die für
-uns wichtig sind. Sie können sich in ELAN auch eigene Typen
-schaffen, dies geht jedoch weit über unsere Bedürfnisse hinaus.
- Der in EUDAS am meisten verwendete Typ heißt #on("i")#TEXT#off("i")#. TEXT-
-Objekte bestehen aus einer Folge von 0 bis 32000 Zeichen. Die Zei­
-chen entstammen einem Satz von 256 verschiedenen Symbolen, die
-jeweils eine andere Darstellung haben. Einige der Zeichen lassen
-sich überhaupt nicht darstellen, sondern führen bestimmte Funktio­
-nen aus (zum Beispiel Bildschirm löschen).
- Sämtliche Feldinhalte einer EUDAS-Datei sind TEXTe, ebenso
-die Zeilen von Textdateien. Auch Datei- und Feldnamen sind
-TEXTe. Von daher besteht eigentlich kein Grund, warum Sie sich
-außer zur Programmierung noch mit anderen Datentypen beschäfti­
-gen sollten.
- Neben den Texten gibt es noch die Zahlen. Diese sind in ihrer
-internen Darstellung so beschaffen, daß ein effizientes Rechnen mit
-ihnen möglich ist. Andererseits können sie nicht mehr beliebige
-Informationen darstellen, sondern haben eine sehr eingeschränkte
-Bedeutung.
- Um unterschiedichen Bedürfnissen gerecht zu werden, gibt es in
-ELAN zwei verschiedene Zahltypen. Der Typ #on("i")#INT#off("i")# umfaßt nur ganze
-Zahlen ohne Kommastellen. Damit die Zahl möglichst wenig Spei­
-cherplatz belegt, ist der Wertebereich bei den meisten Rechnern auf
--32768..32767 beschränkt (die krummen Zahlen ergeben sich wegen
-der Binärarithmetik des Rechners). Dieser Typ eignet sich am besten
-zum Abzählen und zum Auswählen aus einer festen Anzahl von
-Objekten (zum Beispiel Feld 1 bis Feld 255).
- Zum eigentlichen Rechnen gibt es den Typ #on("i")#REAL#off("i")#. Dieser umfaßt
-auch Kommazahlen. Genauigkeit, Wertebereich und Darstellung sind
-nahezu identisch mit den Möglichkeiten eines Taschenrechners. der
-Typ REAL wird immer dann verwendet, wenn mit realen Größen
-(Geldbeträge, physikalische Werte) gerechnet werden muß.
- Zuletzt gibt es noch den Typ #on("i")#BOOL#off("i")#. Er hat nur zwei mögliche
-Werte, nämlich TRUE (wahr) und FALSE (falsch). Er wird dazu benö­
-tigt, Ausdrücke zu schreiben, die den Zweig einer IF-Anweisung
-bestimmen.
-
-#on("b")#Denotation#off("b")# ELAN verfügt über einen strengen Typenschutz;
-das
-heißt, Objekte verschiedenen Typs dürfen nicht gemischt werden.
-Daher muß schon bei der Schreibweise der Konstanten festgelegt
-sein, welchen Typ die Konstante hat.
- Bei Texten geschieht dies durch den Einschluß in Anführungs­
-striche. Die Anführungsstriche sorgen gleichzeitig auch für eine
-Abgrenzung der Zeichen des Textes und des umgebenden Programms.
-Sie kennen diese Schreibweise bereits von vielen Stellen in EUDAS.
- Ebenfalls keine Probleme bereitet der Typ BOOL, da die
-Schreibweise der beiden möglichen Werte TRUE und FALSE eindeutig
-ist.
- Problematisch wird es bei den Zahlen. Da die ganzen Zahlen in
-den rationalen Zahlen enthalten sind, muß für die ganzen Zahlen
-durch die Schreibweise festgelegt werden, zu welchem der beiden
-Typen sie gehören. Man hat festgelegt, daß REAL-Zahlen immer mit
-Komma geschrieben werden müssen, während Zahlen ohne Komma den
-Typ INT haben (das Komma wird in ELAN bei den REAL-Zahlen in
-internationaler Schreibweise als Punkt notiert).
- So ist 4 eine INT-Zahl, während 4.0 den Typ REAL besitzt.
-Denken Sie in Zukunft immer daran, welcher Zahltyp jeweils ver­
-langt wird und richten Sie die Schreibweise danach.
-
-#on("b")#Unterschied zu Feldtypen#off("b")# Verwechseln Sie die hier
-vorgestellten
-Datentypen nicht mit den Feldtypen einer EUDAS-Datei. Die Feld­
-typen beziehen sich immer auf den gleichen Datentyp, nämlich
-TEXT. Die Feldtypen bestimmen lediglich die spezielle Behandlung
-des Feldes beim Suchen und Sortieren, während Datentypen tat­
-sächlich Unterschiede in der Speicherung und den anwendbaren
-Operationen bedeuten.
- Daher können Sie Feldtypen auch nach Bedarf ändern, während
-der Datentyp eines Objekts ein für alle Mal feststeht. Merken Sie
-sich, daß Feldinhalte in EUDAS immer den Typ TEXT haben.
-
-#on("b")#Umwandlungen#off("b")# Obwohl verschiedene Datentypen nicht
-miteinander
-gemischt werden dürfen, können sie mit speziellen Funktionen in­
-einander umgewandelt werden. So ist zum Beispiel die Addition von
-1 und 1.5 verboten, aber der folgende Ausdruck
-
-
- real (1) + 1.5
-
-
-liefert den Wert 2.5 mit dem Typ REAL. Umgekehrt geht die Um­
-wandlung mit der Funktion 'int', dabei werden jedoch die Nachkom­
-mastellen abgeschnitten. Weitere Hinweise dazu erhalten Sie im
-Abschnitt 14.4.
- Wichtiger jedoch ist die Umwandlung von Zahlen in TEXT-Ob­
-jekte. Was Sie auf Ihrem Bildschirm oder Ausdruck sehen, sind ja
-immer nur Zeichenfolgen und damit Texte. Zahlen (INT oder REAL)
-in ihrer internen Darstellung können Sie prinzipiell nicht sehen. Sie
-müssen zur Darstellung immer in Texte umgewandelt werden.
- Auch beim Rechnen mit Werten aus EUDAS-Dateien müssen
-mehrere Umwandlungen stattfinden. Der Feldinhalt, der ja ein TEXT
-ist, muß zunächst in eine Zahl umgewandelt werden. Dann wird mit
-dieser Zahl gerechnet. Wenn das Ergebnis wieder in ein Feld einge­
-tragen oder gedruckt werden soll, muß eine Rückumwandlung in
-einen Text vorgenommen werden.
- Die zum Umwandeln benötigten Funktionen werden ebenfalls im
-Abschnitt 14.4 besprochen.
-
-#on("b")#Funktionsbeschreibung#off("b")# In den zwei folgenden Abschnitten
-sollen
-die wichtigsten Funktionen und Operatoren anhand von Beispielen
-beschrieben werden. Da jede Funktion nur auf bestimmte Datentypen
-angewendet werden kann, gibt es eine Notation, die genau die Form
-eines Funktionsaufrufs festlegt.
-
-
- INT PROC min (INT CONST a, b)
-
-
-Die obige Schreibweise hat folgende Bedeutung: Spezifiziert wird die
-Funktion 'min', die als Ergebnis einen INT-Wert liefert (das INT
-ganz links). Die Bezeichnung PROC gibt an, daß es sich um eine
-Funktion handelt. In Klammern ist dann angegeben, welche Parame­
-ter verwendet werden müssen. Die Funktion hat zwei Parameter,
-beide vom Typ INT. Die Bezeichnung CONST gibt an, daß auch Kon­
-stanten verwendet werden dürfen (Normalfall).
- Zu beachten ist, daß bei jedem Aufruf beide Parameter vorhan­
-den und vom Typ INT sein müssen. Anderenfalls gibt es eine Feh­
-lermeldung.
- Die gleiche Schreibweise wird auch zur Spezifikation von Ope­
-ratoren verwendet:
-
-
- INT OP + (INT CONST a, b)
-
-
-Jedoch dürfen Operatoren nicht mit Parametern in Klammern ge­
-schrieben werden, sondern der Operator wird zwischen die Parameter
-geschrieben.
- Eine Besonderheit von ELAN ist es, daß es verschiedene Opera­
-toren und Funktionen mit gleichem Namen geben kann. Die Funktio­
-nen werden nur unterschieden nach dem Typ ihrer Parameter. So
-gibt es nicht nur den oben genannten Operator '+', sondern auch
-den folgenden:
-
-
- REAL OP + (REAL CONST a, b)
-
-
-Obwohl im Aussehen gleich, handelt es sich doch um verschiedene
-Operatoren mit möglicherweise völlig verschiedener Wirkung. Dies
-sieht man an diesem Beispiel:
-
-
- TEXT OP + (TEXT CONST a, b)
-
-
-Dieser Operator führt nun keine Addition aus, sondern eine #on("i")#Verket­
-tung#off("i")# zweier Texte. Je nach Typ der Parameter wird der entspre­
-chende Operator ausgesucht.
-
-
-14.3 TEXT-Funktionen
-
-In diesem Abschnitt wollen wir die wichtigsten Funktionen und
-Operatoren zur Behandlung von Texten beschreiben. Wie Sie noch
-sehen werden, spielt dabei aber auch der Typ INT eine gewisse
-Rolle.
-
-#on("b")#EUDAS-Abfragen#off("b")# Die wichtigste Funktion zur Abfrage von
-Inhal­
-ten der aktuellen Datei sollten Sie bereits kennen:
-
-
- TEXT PROC f (TEXT CONST feldname)
-
-
-Neu ist eigentlich nur die Schreibweise der Spezifikation. Sie sollten
-aber in der Lage sein, daraus einen konkreten Ausdruck zu kon­
-struieren. Bisher haben wir immer die Schreibweise
-
-
- f ("Feldname")
-
-
-verwendet. Dies ist jedoch nur ein Beispiel. Die korrekte Angabe
-finden Sie oben.
- Die Funktion 'f' darf natürlich nicht angewendet werden, wenn
-keine Datei geöffnet ist. In die Verlegenheit kommen Sie aber nur
-beim Ausprobieren, denn alle gefährlichen EUDAS-Funktionen sind
-sonst gesperrt.
- Falls das angegebene Feld nicht existiert, wird mit einer Feh­
-lermeldung abgebrochen. Beachten Sie, daß dies immer erst bei der
-Ausführung festgestellt werden kann. Bei der Eingabe, zum Beispiel
-eines Druckmusters, kann dies noch nicht überprüft werden.
- Eine weitere Abfrage, die EUDAS während des Druckens ermög­
-licht, ist die Funktion
-
-
- TEXT PROC lfd nr
-
-
-Diese hat keine Parameter und liefert die laufende Nummer des
-gedruckten Satzes.
- Diese beiden Funktionen können als Ausgangsbasis dienen zur
-Manipulation mit weiteren Funktionen.
-
-#on("b")#Verkettung#off("b")# Zur Verkettung von Teiltexten gibt es den oben
-schon
-beschriebenen Operator '+'. Wenn Sie mehr als zwei Texte verketten
-wollen, können Sie den Operator beliebig hintereinander verwenden:
-
-
- f ("PLZ") + " " + f ("Ort")
-
-
-Wie in diesem Beispiel können Sie sowohl Konstanten als auch Tex­
-te, die von anderen Funktionen geliefert werden, verketten. Beach­
-ten Sie, daß die Texte immer ohne Zwischenraum aneinandergehängt
-werden; daher wird im obigen Beispiel ein Leerzeichen extra ange­
-geben.
- Wenn Sie eine bestimmte Anzahl von gleichen Zeichen haben
-möchten (zum Beispiel für horizontale Linien oder große Zwischen­
-räume), können Sie dafür folgenden Operator verwenden:
-
-
- TEXT OP * (INT CONST anzahl, TEXT CONST einzeltext)
-
-
-Hier sehen Sie als Beispiel einen Operator, der mit verschiedenen
-Datentypen arbeitet. Sie müssen die Parameter jedoch immer in der
-angegebenen Reihenfolge benutzen. Das folgende Beispiel ist kor­
-rekt:
-
-
- 20 * "-"
-
-
-während dies nicht erlaubt ist:
-
-
- "-" * 20
-
-
-Wieder können Sie diesen Operator mit anderen Funktionen verknü­
-pfen:
-
-
- "!" + 10 * " " + "!" + 5 * "-" + "!"
-
-
-Da der Multiplikationsoperator Vorrang vor der Addition hat, kom­
-men Sie hier sogar ohne Klammern aus (überlegen Sie sich, wo ein
-Fehler auftreten würde, wenn dies nicht so wäre). Als Ergebnis
-dieses komplexen Ausdrucks ergäbe sich der folgende Text:
-
-
- "! !-----!"
-
-
-#on("b")#Teiltexte#off("b")# Um auch Teile von Texten bearbeiten zu können,
-werden
-die Zeichen eines Textes von 1 an (mit INT-Zahlen) durchnumeriert.
-Anhand dieser Positionen können Sie Teiltexte extrahieren.
- Damit Sie die Position des letztes Zeichens (und damit die An­
-zahl der Zeichen) erfragen können, gibt es die Funktion
-
-
- INT PROC length (TEXT CONST text)
-
-
-Wieviel Zeichen in einem Feld stehen, können Sie also mit
-
-
- length (f ("Feldname"))
-
-
-erfahren.
- Einen Teiltext bekommen Sie mit der Funktion 'subtext'. Diese
-gibt es in zwei Ausführungen.
-
-
- TEXT PROC subtext (TEXT CONST text, INT CONST anfang)
-
-
-liefert den Teiltext von einer bestimmten Position an (einschließ­
-lich) bis zum Textende. Mit
-
-
- TEXT PROC subtext (TEXT CONST t, INT CONST anf, ende)
-
-
-können Sie auch die Position des letzten Zeichens (einschließlich)
-angeben. Daher würden die beiden folgenden Aufrufe
-
-
- subtext (f ("Feldname"), 1)
- subtext (f ("Feldname"), 1, length (f ("Feldname")))
-
-
-den Feldinhalt unverändert liefern. Ein weiteres Beispiel:
-
-
- subtext ("Ein Text als Beispiel", 5, 8)
-
-
-liefert als Ergebnis "Text".
- Es gibt noch den Operator 'SUB', der jeweils nur ein Zeichen
-aus dem Text liefert:
-
-
- TEXT OP SUB (TEXT CONST text, INT CONST stelle)
-
-
-Der Aufruf ist gleichwertig zu einem Aufruf von 'subtext', in dem
-beide Stellen gleich sind.
- Bei beiden Funktionen wird nicht vorhandener Text einfach
-ignoriert. So liefert
-
-
- subtext ("Hallo", 4, 8)
-
-
-das Ergebnis "lo" und
-
-
- "Hallo" SUB 10
-
-
-den leeren Text "".
-
-#on("b")#Verschachtelte Ausdrücke#off("b")# Wie Sie bereits gesehen haben,
-kann
-man Ausdrücke ineinander verschachteln. Dies ist in unserem Fall
-sehr nützlich, wenn Teiltexte bestimmt werden sollen, deren Posi­
-tion nicht konstant ist. Ein Beispiel, in dem 'length' bei der Fest­
-legung der Endposition verwendet wird, haben Sie weiter oben
-bereits gesehen.
- Als weitere Möglichkeit können Sie mit Positionen, die ja INT-
-Zahlen sind, ganz normal rechnen. Folgender Ausdruck liefert zum
-Beispiel die letzten drei Zeichen eines Feldes:
-
-
- subtext (f ("Feldname"), length (f ("Feldname")) - 2)
-
-
-Wichtig ist, daß ein Ausdruck, der wieder als Parameter für einen
-anderen Ausdruck verwendet werden soll, den richtigen Typ hat,
-der von dem anderen Ausdruck verlangt wird.
- In dem obigen Beispiel muß als Position ein INT verwendet
-werden. Diese Position wird vom Operator '-' berechnet. Es gibt
-aber nur einen Subtraktionsoperator, der einen INT liefert, nämlich
-den, der wiederum zwei INTs subtrahiert. Glücklicherweise sind
-sowohl 'length' als auch die 2 vom Typ INT, anderenfalls wäre der
-Ausdruck fehlerhaft. 'length' wiederum benötigt einen TEXT als
-Parameter, der von der Funktion 'f' stammt, die als Parameter eben­
-falls einen TEXT verlangt.
- Wie Sie sehen, kann es durchaus verwickelt zugehen, wenn ein
-Ausdruck aus den verschiedensten Teilausdrücken unterschiedlichen
-Typs zusammengesetzt ist. Die gleiche Überprüfung wie eben ge­
-schildert sollten Sie bei jedem Ausdruck vornehmen, damit keine
-Fehlermeldung erscheint.
-
-#on("b")#Variable Positionen#off("b")# Zur Berechnung von Positionen gibt es
-noch eine weitere nützliche Prozedur, nämlich
-
-
- INT PROC pos (TEXT CONST text, teiltext)
-
-
-Sie liefert die Position, an der der angegebene Teiltext zum ersten
-Mal in dem Text vorkommt, oder 0, wenn der Teiltext nicht darin
-vorkommt. So ist
-
-
- pos ("Hallo", "l") = 3
-
-
-und
-
-
- pos ("Hallo", "lo") = 4
-
-
-und
-
-
- pos ("Hallo", "xx") = 0
-
-
-Diese Funktion kann zum Beispiel dazu verwendet werden, ein Feld
-in mehrere Teile aufzuspalten. Sind zum Beispiel Name und Vorname
-in einem Feld durch Leerzeichen getrennt hintereinandergeschrie­
-ben, liefert
-
-
- subtext (f ("Name"), 1, pos (f ("Name"), " ") - 1)
-
-
-den Vornamen und entsprechend
-
-
- subtext (f ("Name"), pos (f ("Name"), " ") + 1)
-
-
-den Nachnamen. Soll die Position erst ab einer gewissen Stelle ge­
-sucht werden, gibt es noch die folgende Variation der Funktion:
-
-
- INT PROC pos (TEXT CONST text, teiltext, INT CONST ab)
-
-
-Bei dieser Funktion wird erst ab der angegebenen Stelle einschließ­
-lich gesucht.
-
-
-14.4 Rechenfunktionen
-
-#on("b")#Umwandlungen#off("b")# Bevor mit dem Inhalt eines Feldes gerechnet
-wer­
-den kann (auch wenn das Feld den Feldtyp ZAHL hat), muß der Wert
-des Feldinhaltes als REAL-Zahl berechnet werden. Dazu gibt es die
-Funktion
-
-
- REAL PROC wert (TEXT CONST feldname)
-
-
-Die Funktion 'wert' ignoriert alle Sonderzeichen in dem Feld außer
-dem Minuszeichen (als Vorzeichen) und dem eingestellten Dezimal­
-komma. Wenn das Feld 'Summe' beispielsweise "-***20,09 DM" ent­
-hält, ergibt sich
-
-
- wert ("Summe") = 20.09
-
-
-Zum kaufmännischen Rechnen ist es manchmal erforderlich, den Wert
-auf eine bestimmte Anzahl von Nachkommastellen zu runden. Diese
-Anzahl kann man bei einer Variante von 'wert' als Parameter ange­
-ben:
-
-
- REAL PROC wert (TEXT CONST feldname,
- INT CONST kommastellen)
-
-
-Mit den so erhaltenen Werten können Sie dann die weiter unten
-beschriebenen Berechnungen durchführen. Bevor Sie das Ergebnis
-jedoch drucken oder in ein Feld eintragen können, müssen Sie den
-REAL-Wert wieder in einen TEXT verwandeln. Dazu dient die Funk­
-tion
-
-
- TEXT PROC zahltext (REAL CONST wert,
- INT CONST kommastellen)
-
-
-Der übergebene Wert wird mit der gewünschten Anzahl von Komma­
-stellen als Text formatiert. Dazu wird der Wert gerundet. Außerdem
-wird statt eines Punktes das eingestellte Dezimalkomma eingesetzt.
-Die Länge des Textes richtet sich nach der Anzahl von benötigten
-Stellen, es werden also keine führenden Nullen oder Leerzeichen
-eingesetzt (dafür kann man den Text beim Drucken ja rechtsbündig
-einsetzen).
- Wird 0 als Kommastellen angegeben, wird auch kein Dezimal­
-komma erzeugt (Darstellung wie ein INT). Als Abkürzung können Sie
-auch
-
-
- TEXT PROC zahltext (TEXT CONST feldname,
- INT CONST kommastellen)
-
-
-als Ersatz für
-
-
- zahltext (wert ("Feldname"), kommastellen)
-
-
-verwenden. So kann ein Feld einheitlich zum Drucken formatiert
-werden.
-
-#on("b")#Arithmetik#off("b")# Sowohl mit INT- als auch mit REAL-Zahlen
-(jedoch
-nicht gemischt) können Sie die üblichen Rechenoperatoren '+', '-'
-und '*' verwenden. Auch Minimum ('min') und Maximum ('max') sind
-für zwei Parameter dieser Typen definiert.
- Lediglich die Division wird bei beiden Typen unterschiedlich
-gehandhabt. Für REAL-Zahlen gibt es den Operator '/' für die
-übliche Division. Da die ganzzahlige Division eine andere Bedeutung
-hat, wird dafür der Operator 'DIV' verwendet. Den Rest der ganz­
-zahligen Division liefert 'MOD'.
- 'abs' liefert den Wert eines REAL oder INT ohne das Vorzeichen.
-Die Umwandlungsfunktionen 'int' und 'real' hatten wir ja bereits
-weiter oben erwähnt.
- Für REAL-Zahlen gibt es noch weitere mathematische Funktio­
-nen (Exponentialfunktion, Trigonometrie), die Sie am besten im
-EUMEL-Benutzerhandbuch nachschlagen, wenn Bedarf dafür besteht.
-
-
-14.5 Abfragen
-
-#on("b")#IF-Abfragen#off("b")# Wie Sie schon im vorigen Kapitel gesehen
-haben,
-kann man in Druckmustern auch IF-Abfragen als Ausdrücke ver­
-wenden. Die IF-Abfragen können zwar auch ineinander verschach­
-telt werden, sie dürfen jedoch nicht mehr innerhalb eines normalen
-Ausdrucks angewendet werden.
- Eine IF-Abfrage enthält 3 Teilausdrücke in folgender Form:
-
-
- IF 'BOOL-Ausdruck' THEN
- 'Ausdruck1'
- ELSE
- 'Ausdruck2'
- END IF
-
-
-Der erste Ausdruck muß einen Wert vom Typ BOOL liefern, der ent­
-scheidet, welcher der beiden Teilausdrücke ausgewertet wird. Wir
-werden gleich noch sehen, was für Möglichkeiten es da gibt.
- Die beiden Teilausdrücke dürfen auch wieder IF-Abfragen sein,
-sind sie es jedoch nicht, dürfen in ihnen dann keine IF-Abfragen
-mehr vorkommen. Die IF-Abfragen liegen also immer auf der äußer­
-sten Ebene.
- Die beiden Teilausdrücke dürfen einen beliebigen Typ haben, er
-muß jedoch für beide gleich sein.
- Als Ergebnis der IF-Abfrage wird 'Ausdruck1' geliefert, wenn
-der BOOL-Ausdruck wahr ist, sonst 'Ausdruck2'.
-
-#on("b")#Vergleiche#off("b")# Die wesentlichen Operationen, die boolesche
-Ausdrücke
-zur Verwendung in IF-Abfragen bilden, sind die Vergleichsoperato­
-ren:
-
-
- = <> <= >= < >
-
-
-Sie vergleichen jeweils zwei Elemente vom Typ TEXT, INT oder REAL
-und liefern TRUE (wahr) oder FALSE (falsch). Selbstverständlich
-können auch sie zwei zusammengesetzte Teilausdrücke vergleichen.
- Eine Anwendung ist zum Beispiel der Test, ob ein Text in einem
-anderen enthalten ist:
-
-
- IF pos (f ("Betrag"), "DM") > 0 THEN
- "deutsches Geld"
- ELSE
- "ausländisches Geld"
- END IF
-
-
-Die Funktion 'pos' wird hier dazu benutzt, festzustellen, ob es sich
-um deutsches oder ausländisches Geld handelt.
- Oft müssen jedoch mehrere Vergleiche miteinander kombiniert
-werden. Zu diesem Zweck gibt es die beiden Operatoren AND (und)
-und OR (oder). Damit AND das Ergebnis TRUE liefert, müssen beide
-Vergleiche wahr sein, bei OR muß mindestens einer der beiden wahl
-sein.
- Die Reihenfolge aller dieser Operatoren ist so gewählt, daß
-normalerweise keine Klammern benötigt werden. Funktionen haben
-immer Vorrang vor Operatoren, bei den Operatoren kommt die Multi­
-plikation vor der Addition, dann kommen die Vergleiche, danach das
-AND und danach das OR. Alle anderen Operatoren (#on("i")#insbesondere
-SUB#off("i")#) teilen sich den letzten Rang.
- Wenn Sie also in einem Ausdruck mehrere Vergleiche mit AND
-und OR verknüpfen, und das OR soll stärker binden als das AND,
-müssen Sie dies durch Klammern ausdrücken.
- Den oben besprochenen Operator SUB sollten Sie immer in
-Klammern setzen, wenn Sie ihn in einem Vergleich benutzen. Da er
-die niedrigste Priorität hat, gäbe es sonst mit Sicherheit Fehler:
-
-
- IF (f ("Name") SUB 1) = "M" THEN
- "vielleicht Müller"
- ELSE
- "bestimmt nicht"
- END IF
-
-
-#on("b")#Refinements#off("b")# Bisher hatten wir gesagt, daß IF-Abfragen
-nicht
-innerhalb von anderen Ausdrücken verwendet werden dürfen. Diese
-Einschränkung kann man umgehen, indem man #on("i")#Refinements#off("i")# verwen­
-det.
- Ein Refinement hat im Druckmuster eine ähnliche Wirkung wie
-eine Abkürzung, lediglich der Name darf nur mit Kleinbuchstaben
-und Ziffern geschrieben sein und kann nicht als Feldmuster ver­
-wendet werden.
-
-
- &abk :
- subtext (f ("Name"), namensanfang) .
- namensanfang :
- IF pos (f ("Name"), " ") > 0 THEN
- pos (f ("Name"), " ") + 1
- ELSE
- length (f ("Name"))
- END IF .
-
-
-Innerhalb von Refinements dürfen auch wieder andere Refinements
-verwendet werden.
- Auch in Kopier- und Änderungsmustern können Sie Refinements
-verwenden. Hier müssen Sie jedoch darauf achten, daß alle Refine­
-ments am Ende gesammelt werden und vor dem ersten Refinement
-ein Punkt stehen muß. Ebenso müssen die Refinements wie im
-Druckmuster durch Punkte voneinander getrennt sein:
-
-
- "Anrede" K anrede;
- .
- anrede :
- IF f ("m/w") = "w" THEN
- "Frau"
- ELSE
- "Herr"
- END IF .
-
-
-
diff --git a/doc/eudas/eudas.hdb.15 b/doc/eudas/eudas.hdb.15
deleted file mode 100644
index c0a22cf..0000000
--- a/doc/eudas/eudas.hdb.15
+++ /dev/null
@@ -1,286 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (165)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-15 Anweisungen in ELAN
-
-
-
-15.1 Variablen und Zuweisungen
-
-Im vorigen Kapitel haben wir Ausdrücke in ELAN kennengelernt. Der
-Wert eines Ausdrucks wird bei jeder Verwendung erneut berechnet.
-Wenn wir den Wert eines Ausdrucks aufbewahren wollen, müssen wir
-ihn schon in eine EUDAS-Datei schreiben.
- Oft tritt jedoch die Notwendigkeit auf, Werte zu merken, ohne
-sie in einer Datei zu speichern. Beispiel dafür ist ein Zählvorgang im
-Druckmuster. In jedem Wiederholungsteil muß der dazukommende
-Wert zum bisherigen, aufsummierten und aufbewahrten Wert addiert
-werden. Das Zwischenergebnis der Zählung muß also irgendwo ge­
-speichert werden.
-
-#on("b")#Variablen#off("b")# Zu diesem Zweck gibt es Variablen. Sie sind
-ähnlich wie
-Felder in einer Datei. Ihre Existenz ist jedoch unabhängig von einer
-Datei. Außerdem sind sie zu Anfang nicht einfach leer, sondern
-haben einen undefinierten Wert.
- Variablen müssen im Programm definiert werden. Sie existieren
-dann während der Ausführung dieses Programms und gehen an­
-schließend verloren. Zu Beginn des Programms sind sie, wie schon
-gesagt, undefiniert.
- Eine Variable muß immer einen Typ haben. Dieser Typ ist für
-die Lebensdauer der Variable unveränderlich. Die Variable kann
-natürlich nur Werte dieses Typs annehmen.
- Eine Variablendefinition (oder auch -deklaration) besteht aus
-der Angabe eines Typs, dem Schlüsselwort VAR und einem freige­
-wählten Namen. Wie schon bei den Refinements darf ein solcher
-Name nur aus Kleinbuchstaben (keine Umlaute) und eventuell Zif­
-fern bestehen. Dagegen darf der Name Leerzeichen enthalten.
-Beispiel:
-
-
- INT VAR zaehler;
- TEXT VAR feldname;
- REAL VAR mein ergebnis 1;
-
-
-Das Semikolon am Ende beschließt die Definition.
- Die Lebensdauer einer Variablen hängt davon ab, an welcher
-Stelle sie definiert ist. Eine Variable, die im Druckmuster im Initia­
-lisierungsteil definiert ist, behält ihren Wert für die gesamte Dauer
-des Druckvorgangs. Eine Variable in einem Abschnitt lebt dagegen
-nur für eine Abarbeitung dieses Abschnitts. Bei der nächsten Abar­
-beitung ist sie wieder undefiniert.
- Das gleiche gilt für Kopier- und Änderungsmuster. Auch hier
-sind Variablen nur für die Dauer der Bearbeitung eines Satzes
-gültig.
-
-#on("b")#Zuweisung#off("b")# Um einer Variablen einen Wert zu geben, führt
-man eine
-#on ("i")#Zuweisung#off("i")# aus. Die Zuweisung wird durch Doppelpunkt und Gleich­
-heitszeichen aneinandergeschrieben gekennzeichnet. Auf der linken
-Seite steht die Variable, auf der rechten Seite eine Ausdruck:
-
-
- zaehler := 1;
-
-
-Wie oben schließt das Semikolon die Anweisung ab. Nach der Aus­
-führung hat die Variable den Wert 1. Der Wert vorher ist für die
-Zuweisung egal, er kann definiert oder undefiniert sein.
- Eine Variable kann in einem Ausdruck verwendet werden, indem
-man einfach den Namen hinschreibt. Der Ausdruck
-
-
- zaehler + 1
-
-
-hat nach der obigen Zuweisung den Wert 2. Eine Variable muß bei
-der Verwendung definiert sein, sonst können beliebige Fehler ent­
-stehen. Es muß also vor der ersten Verwendung ausdrücklich eine
-Zuweisung erfolgt sein.
- Da Variablen in Ausdrücken verwendet werden können und
-Ausdrücke auf der rechten Seite einer Zuweisung stehen, ist folgen­
-de Konstruktion möglich:
-
-
- zaehler := zaehler + 1;
-
-
-Diese Zeile bewirkt, daß der Wert der Variable um 1 erhöht wird.
-Zuerst wird bei der Zuweisung der Wert des Ausdrucks auf der rech­
-ten Seite bestimmt. Zu diesem Zeitpunkt habe die Variable bei­
-spielsweise den Wert 1. Der Ausdruck hat dann den Wert 2 (1+1).
-Dieser Wert wird der neue Wert der Variablen.
- Bei der nächsten Ausführung würde sich der gleiche Vorgang
-wiederholen, so daß die Variable anschließend den Wert 3 hat.
- Auch bei der Zuweisung gilt natürlich, daß die Variable auf der
-linken Seite den gleichen Datentyp haben muß wie der Ausdruck auf
-der rechten Seite.
-
-#on("b")#Initialisierung#off("b")# Sie können Variablendeklaration und
-Zuweisung
-auch miteinander verknüpfen, so daß die Variable gleich zu Anfang
-einen Wert erhält:
-
-
- INT VAR zaehler := 0;
-
-
-Dieses Verfahren ist eine gute Vorsichtsmaßregel, damit Sie keine
-undefinierten Variablen verwenden.
-
-#on("b")#Inkrement#off("b")# Da der Fall so häufig auftritt, daß der Wert
-einer Vari­
-ablen um einen bestimmten Wert erhöht wird (bei allen Zählvorgän­
-gen), gibt es auch dafür eine Abkürzung, und zwar die beiden Ope­
-ratoren INCR und DECR.
-
-
- zaehler INCR 1;
- mein ergebnis 1 DECR 24.4;
-
-
-Die Operatoren sind für REALs und INTs definiert. INCR erhöht um
-einen Betrag, DECR erniedrigt. Auf der rechten Seite darf wieder ein
-beliebiger Ausdruck stehen.
- Für TEXTe gibt es eine ähnliche Abkürzung, allerdings nur für
-die Addition (Verkettung). Hier heißt der Operator CAT. Die beiden
-folgenden Zeilen haben die gleiche Bedeutung:
-
-
- feldname := feldname + ".";
- feldname CAT ".";
-
-
-
-15.2 Weitere Konstruktionen
-
-#on("b")#IF#off("b")# Die Ihnen bereits bekannte IF-Konstruktion dient nicht
-nur
-dazu, Werte zu liefern, sondern steuert auch die Abarbeitung von
-beliebigen Anweisungen. Diese Anweisungen können Kopier- und
-Änderungsanweisungen sein (s. Kapitel 11), oder die oben beschrie­
-benen Zuweisungen.
- In einem Teil der IF-Konstruktion können auch mehrere Anwei­
-sungen stehen. Diese müssen dann jedoch unbedingt durch Semiko­
-lon getrennt sein. Mehrere Anweisungen hintereinander haben ein­
-fach die Bedeutung der Ausführung in der notierten Reihenfolge.
- Als drittes kann auch der ELSE-Teil weggelassen, da nicht in
-jedem Fall ein Ergebnis erwartet wird. Falls die Bedingung nicht
-zutrifft, muß nicht unbedingt etwas ausgeführt werden.
-
-
- IF zaehler > 0 THEN
- zaehler DECR 1;
- mein ergebnis 1 INCR wert ("zaehlfeld")
- END IF;
-
-
-Auch diese IF-Konstruktion kann wieder geschachtelt werden. Für
-viele Fälle gibt es jedoch einen ELIF-Teil, der die Verschachtelung
-erspart:
-
-
- IF f ("m/w") = "m" THEN
- maenner INCR 1
- ELIF f ("m/w") = "w" THEN
- frauen INCR 1
- ELSE
- zweifelhaft INCR 1
- END IF;
-
-
-Der ELIF-Teil beinhaltet noch einmal einen Test. Dieser Test wird
-jedoch nur dann durchgeführt, wenn die erste Bedingung falsch war.
-Gibt es noch mehr Wahlmöglichkeiten, können Sie beliebig viele
-ELIF-Teile benutzen.
- Beachten Sie, daß die letzte Anweisung in einem Teil der IF-
-Konstruktion nicht unbedingt ein folgendes Semikolon haben muß
-(das Semikolon soll nur trennen). Ein Semikolon an dieser Stelle
-kann aber auch nicht schaden.
-
-#on("b")#Werteliefernde Programme#off("b")# Nicht nur Ausdrücke können Werte
-lie­
-fern, sondern auch ganze Anweisungsfolgen. Dies ist eine Erweite­
-rung der werteliefernden IF-Konstruktion. Sie können dies für Ab­
-kürzungen oder Refinements ausnutzen.
-
-
- endergebnis :
- gesammelte zeichen CAT ".";
- gesammelte zeichen .
-
-
-In diesem Beispiel werden in einer Textvariable bestimmte Zeichen
-gesammelt. Zum Schluß soll ein Punkt angefügt werden und dieser
-Text dann als Ergebnis des Refinements geliefert werden.
- Damit eine Anweisungsfolge einen Wert liefert, muß am Ende
-der Anweisungsfolge ein Ausdruck stehen. Der Wert des Ausdrucks
-nach Abarbeitung der Anweisungen ist dann der Wert der Anwei­
-sungsfolge.
- Allerdings kann man den gleichen Wert oft verschieden aus­
-drücken. Folgendes Refinement hat die gleiche Wirkung wie oben:
-
-
- endergebnis :
- gesammelte zeichen + "." .
-
-
-In manchen Fällen ist eine Formulierung als werteliefernde Anwei­
-sungsfolge jedoch übersichtlicher.
-
-#on("b")#Beispiel#off("b")# Zum Abschluß dieses Kapitels wollen wir als
-Beispiel eine
-statistische Auswertung einer Zahlenreihe als Druckmuster formu­
-lieren.
- Gegeben sei eine Datei mit folgenden Feldern:
-
-
- "Meßwert 1"
- "Meßwert 2"
-
-
-Wir wollen als Ergebnis Mittelwert und Standardabweichung der
-beiden Meßwerte ausdrucken. Dazu dient das Druckmuster auf der
-folgenden Seite.
- Im Initialisierungsteil des Druckmusters werden die notwendi­
-gen Variablen definiert und initialisiert. Beachten Sie hier, daß in
-einer Definition mehrere Variablen durch Komma getrennt aufgeführt
-werden können, wenn sie den gleichen Typ haben.
- Im Wiederholungsteil müssen dann jeweils die Zwischensummen
-aktualisiert werden. Da mit der Funktion 'wert' eine relativ auf­
-wendige Umwandlung verbunden ist, wird der Wert des jeweiligen
-Feldes erst einmal in einer Variable zwischengespeichert, da er
-mehrmals benötigt wird. Diese Zwischenspeicherungsvariable muß
-nicht initialisiert werden
- Im Nachspann werden dann die Ergebnisse gedruckt. Die Formeln
-sind jeweils als Abkürzungen definiert. Die Funktion 'zahltext' sorgt
-dafür, daß die Werte mit drei Nachkommastellen (gerundet) aufge­
-führt werden.
- Da die Formeln relativ komplex sind, werden sie auf mehrere
-Zeilen verteilt (in ELAN hat das Zeilenende keine Bedeutung).
-
-
- %% REAL VAR
- %% messwert,
- %% summe 1 := 0.0, quadratsumme 1 := 0.0,
- %% summe 2 := 0.0, quadratsumme 2 := 0.0;
- %% INT VAR anzahl := 0;
- % WIEDERHOLUNG
- %% anzahl INCR 1;
- %% messwert := wert ("Meßwert 1");
- %% summe 1 INCR messwert;
- %% quadratsumme 1 INCR messwert * messwert;
- %% messwert := wert ("Meßwert 2");
- %% summe 2 INCR messwert;
- %% quadratsumme 2 INCR messwert * messwert;
- % NACHSPANN
- &anz Meßwerte.
- Meßwert 1 Meßwert 2
- Mittelwert &&mw1&&&& &&mw2&&&&
- Standardabweichung &&st1&&&& &&st2&&&&
- % ABKUERZUNGEN
- &mw1 : zahltext (summe 1 / real (anzahl), 3) .
- &mw2 : zahltext (summe 2 / real (anzahl), 3) .
- &st1 : zahltext
- (sqrt ((quadratsumme 1 - summe 1 * summe 1 /
- real (anzahl)) / real (anzahl - 1)), 3) .
- &st2 : zahltext
- (sqrt ((quadratsumme 2 - summe 2 * summe 2 /
- real (anzahl)) / real (anzahl - 1)), 3) .
-
-
-Mit entsprechenden Formeln können Sie dieses Beispiel für Ihre
-eigenen Statistiken erweitern. Die Beispiele der letzten beiden Ka­
-pitel sollten Ihnen genügend Anregungen dafür gegeben haben.
-
diff --git a/doc/eudas/eudas.hdb.16 b/doc/eudas/eudas.hdb.16
deleted file mode 100644
index 5f5d575..0000000
--- a/doc/eudas/eudas.hdb.16
+++ /dev/null
@@ -1,350 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (171)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-16 Dateiverwaltung mit EUDAS
-
-
-
-16.1 Dateien im System
-
-Zum Bearbeiten von Dateien innerhalb des Systems gibt es das Menü
-'Dateien', das Sie bereits in Kapitel 4 kurz kennengelernt haben.
-An dieser Stelle sollen die übrigen Funktionen dieses Menüs be­
-sprochen werden.
-
-
- --------------
- Dateien System
- U Ãœbersicht
- --------------
- Datei
- L Löschen
- N Umbenennen
- K Kopieren
- P Platzbedarf
- A Aufräumen
- --------------
-
-#center#Abb. 16-1 Menü 'Dateien'
-
-
-Beachten Sie, daß alle Funktionen in diesem Menü mit Dateien
-beliebiger Struktur arbeiten können, also sowohl mit Textdateien
-als auch EUDAS-Dateien (und anderen). Dies liegt daran, daß
-Dateien an dieser Stelle einfach als "schwarze Kästen" mit beliebi­
-gem Inhalt betrachtet werden.
-
-#on("b")#Ãœbersicht#off("b")# Die Funktion 'Ãœbersicht' haben Sie bereits
-ausprobiert.
-Sie zeigt in einem Editorfenster an der rechten Seite alle Dateien,
-die sich in Ihrer Task befinden. Falls nicht alle Dateien auf den
-Bildschirm passen, können Sie das Fenster mit HOP OBEN und HOP
-UNTEN rollen. Sie verlassen die Übersicht wie üblich mit ESC 'q'.
-
-#on("b")#Löschen#off("b")# Auch die Funktion 'Löschen' sollten Sie schon
-kennen.
-Mit dieser Funktion verschwindet eine Datei auf Nimmerwieder­
-sehen. Daher werden Sie sicherheitshalber immer gefragt, ob Sie die
-Datei wirklich löschen wollen. Sie können in einer Auswahl auch
-alle zu löschenden Dateien ankreuzen (dann wird trotzdem nochmal
-gefragt).
- Eine EUDAS-Datei, die gerade geöffnet ist, können Sie nicht
-löschen (sonst würde EUDAS zumindest durcheinanderkommen). Sie
-müssen die Datei zuerst sichern - oder nicht sichern, aber die
-Arbeitskopien löschen.
-
-#on("b")#Umbenennen#off("b")# Mit der Funktion 'Umbenennen' können Sie einer
-Datei
-einen neuen Namen geben. Sie werden zuerst aufgefordert, den alten
-Namen der Datei einzugeben. Alternativ können Sie hier wieder die
-umzubenennenden Dateien auswählen. Danach wird Ihnen (für jede
-ausgewählte Datei) der alte Dateiname zum Überschreiben angebo­
-ten.
- Sie können diesen Namen mit den üblichen Editierfunktionen
-verändern oder mit HOP RUBOUT löschen und ganz neu eingeben.
-Auf diese Weise sparen Sie sich erheblichen Tippaufwand, wenn Sie
-einen langen Dateinamen an nur einer Stelle verändern wollen.
-
-#on("b")#Kopieren#off("b")# Wie in Abschnitt 11.2 bereits angedeutet, gibt es
-eine
-Funktion zum logischen Kopieren von Dateien. Dies ist eine Funk­
-tion, die sich auf spezielle Eigenschaften des EUMEL-Systems
-stützt. Wenn Sie eine Datei #on("i")#logisch#off("i")# kopieren, wird lediglich ein
-Verweis kopiert. Die Daten werden zunächst nur einmal für beide
-Dateien gespeichert.
- Natürlich hätte das Ganze wenig Sinn, wenn danach bei Ände­
-rungen immer beide Dateien geändert würden. Bei Änderungen an
-einer Datei werden jedoch nur die geänderten Daten getrennt ange­
-legt, der Rest wird weiterhin gemeinsam benutzt. Die beiden Dateien
-sind also nach außen hin komplett unabhängig, intern werden je­
-doch gemeinsame Daten so weit wie möglich geteilt. Auf diese Weise
-wird sowohl Zeit als auch Speicherplatz gespart.
- Dieses Verfahren ist besonders dann sinnvoll, wenn Sie sich
-einen bestimmten Stand einer Datei aufbewahren wollen. In diesem
-Fall stellen Sie sich eine logische Kopie her und arbeiten mit dem
-Original weiter. Es werden dann nur die Daten zusätzlich angelegt,
-die Sie seit der Kopie verändert haben.
- EUDAS benutzt die gleiche Funktion auch für die Arbeitskopie.
-Die Arbeitskopie teilt ebenfalls ihre Daten mit dem Original. Ande­
-renfalls wäre es ja auch zeitlich gar nicht möglich, beim Öffnen eine
-Arbeitskopie anzufertigen.
- Beim Aufruf der Funktion 'Kopieren' werden Sie zunächst nach
-dem Namen der Datei gefragt (wie üblich mit Auswahlmöglichkeit).
-Dann können Sie einen neuen Namen für die Kopie angeben. Dieser
-neue Name darf jedoch nicht für eine andere Datei vergeben sein.
-Wollen Sie eine andere Datei überkopieren, müssen Sie diese zu­
-nächst löschen.
- Denken Sie daran, daß die hier beschriebene Funktion sich
-wesentlich vom Kopieren im Menü 'Gesamtdatei' unterscheidet. Dort
-wird nämlich eine tatsächliche Kopie durchgeführt, dafür können Sie
-sich dann auch selektiv bestimmte Daten herausgreifen. Außerdem
-gilt die dortige Funktion nur für EUDAS-Dateien.
-
-#on("b")#Platzbedarf#off("b")# Zu Ihrer Information können Sie sich auch den
-Platz­
-bedarf anzeigen lassen, den eine Datei auf dem Speichermedium hat.
-Wenn Sie den Namen der Datei angegeben haben, wird Ihnen die
-Größe in "Kilobyte" (KB) angegeben. Ein KB entspricht etwa 1000
-Zeichen, also einer halben vollgeschriebenen Bildschirmseite.
- Bei logisch kopierten Dateien wird für jede Datei der benötigte
-Platz separat angegeben. Sie können die Zahlen also nicht einfach
-addieren, um den Gesamtspeicherbedarf zu ermitteln, da Sie dann
-die gemeinsam benutzten Bereiche doppelt zählen würden.
-
-#on("b")#Aufräumen#off("b")# Wenn eine Datei viel geändert wurde, führen zwei
-Effekte zu einer langsameren Verarbeitung dieser Datei. Zum einen
-wird durch Textleichen der Platzbedarf größer. Dies tritt vor allem
-dann auf, wenn zu einzelnen Sätzen immer etwas hinzugefügt wurde
-(eine Folge der Flexibilität, mit variablen Textlängen operieren zu
-dürfen).
- Da der Platzbedarf der Datei also wächst, sind mehr Speicher­
-zugriffe notwendig, als es dem Inhalt entspricht. Doch nicht nur der
-Platz, sondern auch die Verteilung der Sätze machen sich unange­
-nehm bemerkbar. Da vergrößerte Sätze intern am Ende der Datei
-gespeichert werden, werden logisch aufeinanderfolgende Sätze phy­
-sikalisch weit verstreut.
- Der gleiche Effekt ensteht auch durch Umsortieren oder Ein­
-fügen von Sätzen. Um die Datei sequentiell zu bearbeiten, sind also
-ständig wechselnde Speicherzugriffe erforderlich.
- Die beiden beschriebenen Effekte führen zur Geschwindigkeits­
-verringerung. Dies kann verhindert werden, indem die Datei in eine
-frische Datei umkopiert wird. Diesen Vorgang nennt man #on("i")#Reorgani­
-sieren#off("i")#. Dafür gibt es die Funktion 'Aufräumen'.
- Während des Umkopierens werden die Satznummern ausgegeben.
-Achten Sie darauf, daß zum Reorganisieren genügend Platz auf dem
-System vorhanden ist, um eine komplette Kopie der zu reorganisie­
-renden Datei aufzunehmen.
- Zum Reorganisieren muß nämlich tatsächlich eine physikalische
-Kopie angefertigt werden. Eine logische Kopie oder das Schreiben
-auf das Archiv reorganisieren eine Datei dagegen nicht, wohl aber
-die Funktion 'Kopieren' im Menü 'Gesamtdatei'.
- Da der Inhalt gelesen werden muß, funktioniert die Funktion
-'Aufräumen' im Gegensatz zu den oben gemachten Versprechungen
-nur für Textdateien oder EUDAS-Dateien, nicht aber für andere
-Dateitypen. Die Unterscheidung der Dateitypen wird automatisch
-vorgenommen.
-
-
-16.2 Dateien auf dem Archiv
-
-Mit den Funktionen im Menü 'Archiv' können Sie nicht nur Dateien
-auf dem Archiv behandeln, sondern auch in anderen Tasks oder per
-EUMEL-Netz sogar auf anderen Rechnern.
-
-
- --------------
- Dateien Archiv
- U Ãœbersicht
- D Ãœb. Drucken
- --------------
- Datei
- K Kopieren
- vom Archiv
- S Schreiben
- auf Archiv
- L Löschen
- auf Archiv
- --------------
- Archivdiskette
- I Init
- --------------
- Z Zielarchiv
- P Paßwort
- R Reservieren
- --------------
-
-#center#Abb. 16-2 Menue 'Archiv'
-
-
-#on("b")#Zielarchiv#off("b")# Dazu können Sie die Task einstellen, mit der
-Sie arbei­
-ten möchten. Normaleinstellung ist die Task 'ARCHIVE', die Ihre
-Archivdiskette bedient. Dies wird auch in der untersten Bildschirm­
-zeile angezeigt.
- Die Task stellen Sie mit der Funktion 'Zielarchiv' ein. Sie
-werden dann nach dem Namen der Task gefragt. Diese Task muß
-eine Managertask sein (also unabhängig vom Bildschirm arbeiten)
-und sie muß bereits existieren.
- Wenn Sie auf Ihrem Rechner das EUMEL-Netz installiert haben,
-werden Sie auch nach der Nummer der Zielstation gefragt, also der
-Nummer des Rechners, auf dem die gewünschte Task arbeitet. Durch
-Drücken von RETURN wird automatisch Ihre eigene Stationsnummer
-verwendet.
- Nun gibt es zwei Arten von Managertasks, mit denen EUDAS
-zusammenarbeiten kann, #on("i")#Archivmanager#off("i")# und normale Dateimanager.
-Der Unterschied besteht darin, daß ein Archivmanager für einen
-Benutzer reserviert werden muß, damit man nicht auf Disketten
-eines anderen Benutzers zugreifen kann. Normale Dateimanager
-können und sollen dagegen von mehreren Benutzern in beliebiger
-Reihenfolge angesprochen werden.
- Manche Rechner haben mehrere Archivmanager für mehrere
-Diskettenlaufwerke. Durch das Einstellen des Zielarchivs können Sie
-auf verschiedenen Laufwerken archivieren. Ein Archivmanager kann
-sich natürlich auch auf einem anderen Rechner befinden. Sie benut­
-zen dann dessen Diskettenlaufwerk.
- Beim Einstellen des Zielarchivs wird als letztes gefragt, ob die
-Zieltask ein Archivmanager ist oder nicht. Im Normalfall sollten Sie
-die Frage bejahen, wenn Sie 'ARCHIVE' einstellen, und ansonsten
-verneinen (s. die obigen Ausnahmefälle).
- Das eingestellte Zielarchiv wird jeweils in der untersten Bild­
-schirmzeile angezeigt.
- Die Reservierung eines Archivmanagers findet beim ersten Zu­
-griff statt. Beim Umschalten des Zielarchivs oder Verlassen des
-Menüs wird die Reservierung automatisch wieder aufgehoben.
-
-#on("b")#Übersicht#off("b")# Mit der Funktion 'Übersicht' können Sie eine
-Auflistung
-aller Dateien abrufen, die sich auf der Archivdiskette (bzw. in dem
-eingestellten Manager) befinden. Wie die Dateiübersicht im System
-können Sie die Darstellung wie im Editor rollen und mit ESC 'q'
-verlassen.
- Wollen Sie die Ãœbersicht gedruckt haben, rufen Sie die Funktion
-'Übersicht drucken' auf. Die Übersicht wird dann nochmals zusam­
-mengestellt und gleich gedruckt.
-
-#on("b")#Schreiben und Lesen#off("b")# Mit den Funktionen 'Kopieren vom
-Archiv'
-und 'Schreiben auf Archiv' können Sie Dateien zwischen dem Archiv
-und Ihrer Task hin und her transportieren. Es wird jeweils eine
-Kopie angefertigt, das heißt das Original auf der Diskette oder in
-Ihrer Task wird nicht verändert.
- Wenn die transportierte Datei an ihrem Ziel schon existiert,
-wird gefragt, ob die vorher existierende Datei gelöscht (überschrie­
-ben) werden soll. Überschreiben aus Versehen ist nicht möglich,
-wenn Sie die Frage sorgfältig beantworten.
- Beim Aufruf der Funktionen können Sie den gewünschten Da­
-teinamen angeben oder in der Auswahl ankreuzen. Die Auswahl ist
-hier besonders sinnvoll, wenn Sie mehrere Dateien (eventuell sogar
-in einer bestimmten Reihenfolge) sichern müssen. Außerdem können
-Sie ja keine Datei transportieren, die nicht existiert; alle Möglich­
-keiten werden Ihnen also durch Ankreuzen angeboten.
- Beachten Sie, daß beim Überschreiben einer Datei auf einer
-Archivdiskette der Speicherplatz der alten (überschriebenen) Ver­
-sion im allgemeinen nicht wiederverwendet werden kann. In diesem
-Fall kann das Archiv voll werden, obwohl eigentlich genügend Platz
-da wäre.
-
-#on("b")#Löschen#off("b")# Das gleiche Problem tritt auf beim Löschen einer
-Datei
-auf dem Archiv. Mit der Funktion 'Löschen auf Archiv' können Sie
-zwar die Datei auf der Diskette ungültig machen, der Platz wird
-jedoch nur dann wiederverwendet, wenn es die letzte Datei auf der
-Diskette war. Anderenfalls bleiben "Leichen" übrig, die Sie in der
-Archivübersicht als Striche erkennen können.
- Diese Probleme treten jedoch mit anderen Managern nicht auf,
-da diese Ihren Speicherplatz intelligenter verwalten können.
-
-#on("b")#Initialisieren#off("b")# Als Abhilfe bei einem übergelaufenen Archiv
-müssen
-Sie das ganze Archiv initialisieren und neu beschreiben. Dazu gibt
-es die Funktion 'Init'.
- Diese Funktion müssen Sie auch dann verwenden, wenn Sie eine
-Archivdiskette zum ersten Mal verwenden. Auf dem Archiv muß
-nämlich als erstes der Archivname eingetragen werden, ehe es be­
-nutzt werden kann. Diesen Namen müssen Sie hier angeben.
- Alle alten Daten des Archivs werden komplett gelöscht. Daher
-müssen Sie vorher die noch gültigen Daten vom Archiv ins System
-kopiert haben. Wenn das Archiv vorher schon beschrieben war,
-werden Sie anhand des Namens gefragt, ob Sie die richtige Diskette
-zum Ãœberschreiben eingelegt haben.
- Wenn Sie eine fabrikneue Diskette aus der Verpackung nehmen,
-müssen Sie diese vor der Initialisierung #on("i")#formatieren#off("i")#. Dabei wird die
-Diskette auf ein bestimmtes physikalisches Format eingestellt. Ohne
-diese Operation ist weder Schreiben noch Lesen überhaupt möglich.
- In der Regel muß eine Diskette nur einmal formatiert werden.
-Sie können sie jedoch jederzeit wieder formatieren (wenn Sie zum
-Beispiel nicht wissen, was Ihnen da für eine alte Diskette in die
-Finger geraten ist).
- Am Anfang des Initialisierens werden Sie gefragt, ob Sie die
-Diskette formatieren wollen. Manche Rechner unterstützen diese
-Operation innerhalb des EUMEL-Systems nicht. In diesem Fall (und
-natürlich auch sonst normalerweise) müssen Sie die Frage vernei­
-nen. Das Formatieren muß dann vorher irgendwie außerhalb des
-Systems geschehen sein.
- Das Initialisieren funktioniert natürlich nur bei Archivmana­
-gern. Bei einer anderen Zieltask ist diese Funktion gesperrt.
-
-#on("b")#Paßwort#off("b")# Dateien in einem allgemeinen Dateimanager (nicht
-jedoch
-auf dem Archiv) können Sie mit einem Paßwort gegen unbefugten
-Zugriff sichern. Sinnvolle Voraussetzung dafür ist, daß der Datei­
-manager selbst mit einem anderen Paßwort gegen Betreten gesichert
-ist.
- Das von Ihnen verwendete Paßwort geben Sie mit der Funktion
-'Paßwort' ein. Damit Ihnen niemand über die Schulter schauen
-kann, werden alle Zeichen auf dem Bildschirm als Punkte darge­
-stellt. Anschließend müssen Sie das Paßwort noch einmal eingeben,
-damit sich kein unbemerkter Schreibfehler eingeschlichen hat.
- Das Paßwort wird dann bei allen Transport- und Löschopera­
-tionen abgefragt. Eine Datei im Manager erhält Ihr Paßwort zuge­
-wiesen, wenn Sie sie das erste Mal im Manager ablegen. Bei allen
-folgenden Zugriffen muß das gleiche Paßwort eingestellt sein, sonst
-wird der Zugriff verweigert.
- Natürlich können Sie für verschiedene Dateien verschiedene
-Paßwörter einstellen. Trotz Einstellung eines Paßworts können auch
-andere Benutzer ihre Dateien im gleichen Manager ablegen.
- Sie können auch für Schreiben (und Löschen) sowie Lesen
-unterschiedliche Paßwörter einstellen. Dazu benutzen Sie einfach
-einen Trennstrich in der Form
-
-
- Schreibpaßwort/Lesepaßwort
-
-
-Soll eine Datei überhaupt nicht überschrieben oder gelöscht werden
-können, können Sie '-' als Schreibpaßwort verwenden:
-
-
- -/Lesepaßwort
-
-
-Die Datei kann dann nur beim direkten Betreten der Managertask
-verändert werden.
- Wollen Sie die Paßworteinstellung wieder aufheben, drücken Sie
-bei der Paßworteingabe nur RETURN, da der leere Text als "kein
-Paßwort" interpretiert wird.
-
-#on("b")#Reservieren#off("b")# Wollen Sie eine Task als Zieltask verwenden,
-die zwar
-kein Archivmanager ist, aber reserviert werden muß (zum Beispiel
-'DOS' zum Ansprechen fremder Diskettenformate) müssen Sie die
-Reservierung mit der Funktion 'Reservieren' selbst vornehmen. Die
-Zieltask darf nicht als Archivmanager gekennzeichnet sein (dann ist
-die Funktion 'Reservieren' nämlich gesperrt).
- Bei der Reservierung müssen Sie den Reservierungsparameter
-(abhängig von der Art der Zieltask - bei 'DOS' beispielsweise den
-Modus) als Text eingeben. Nach der Reservierung können Sie die
-anderen Funktionen des Archivmenüs verwenden.
- Die Freigabe der Zieltask erfolgt automatisch beim Verlassen
-des Menüs oder beim Einstellen einer neuen Zieltask.
-
diff --git a/doc/eudas/eudas.hdb.2 b/doc/eudas/eudas.hdb.2
deleted file mode 100644
index f3f14e1..0000000
--- a/doc/eudas/eudas.hdb.2
+++ /dev/null
@@ -1,178 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (11)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-2 Installation des Programms
-
-
-
-Bevor Sie EUDAS auf Ihrem System benutzen können, müssen Sie das
-Programm zuvor installieren. Wenn EUDAS schon auf Ihrem System
-zur Verfügung steht, können Sie dieses Kapitel getrost überlesen.
-
-
-2.1 Lieferumfang
-
-EUDAS wird auf einer Diskette geliefert, die alle notwendigen Pro­
-gramme enthält. Um den Inhalt der Diskette feststellen zu können,
-starten Sie Ihr System und bringen es dazu, daß 'gib kommando:'
-erscheint. Dann legen Sie die Diskette ein und geben das Kommando
-
-
- archive ("EUDAS"); list (archive); release (archive)
-
-
-Anschließend erscheint eine Übersicht der auf dem Archiv vorhan­
-denen Programmteile. Folgende Namen sollten sich in dieser Über­
-sicht wiederfinden:
-
-
- "eudas.1"
- "eudas.2"
- "eudas.3"
- "eudas.4"
- "eudas.init"
- "eudas.generator"
- "Adressen"
-
-
-Eventuell können noch weitere Namen in der Übersicht auftauchen.
-Sollte einer der angegebenen Namen nicht vorhanden sein, rekla­
-mieren Sie die Diskette. Falls Sie statt der Übersicht eine Fehler­
-meldung erhalten, sollten Sie überprüfen, ob die Diskette das rich­
-tige Format besitzt oder Ihr Diskettenlaufwerk Probleme bereitet.
- Wenn Sie so den Inhalt der Diskette kontrolliert haben, können
-Sie EUDAS installieren. Je nachdem, ob Sie ein Single-User oder ein
-Multi-User System benutzen, sind die Anweisungen unterschiedlich.
-Sie brauchen nur den Sie betreffenden der beiden folgenden Ab­
-schnitte zu lesen. Falls Sie nicht wissen, welches System Sie benut­
-zen: ein Multi-User System wird auf der Systemdiskette und am
-Bildschirm durch die Kennzeichnung 'EUMEL x.y.z/M' identifiziert,
-bei einem Single-User System steht als letztes Zeichen ein 'S'.
-
-
-2.2 Single-User
-
-Dieser Abschnitt betrifft Sie nur, wenn Sie EUDAS auf einem
-Single-User System installieren wollen.
- Sie können EUDAS immer nur auf einer bestimmten Hinter­
-grunddiskette installieren. Auf dieser Diskette sollten noch min­
-destens 250 KB frei sein (stellen Sie dies durch das Kommando
-'storage info' sicher). EUDAS kann anschließend auch nur auf dieser
-Diskette verwendet werden.
- Starten Sie nun die gewünschte Diskette. Dann legen Sie die
-Diskette, auf der EUDAS sich befindet, in das Archivlaufwerk. Geben
-Sie dann das Kommando
-
-
- archive ("EUDAS"); fetch ("eudas.generator", archive); run
-
-
-Sie haben damit das Generatorprogramm gestartet, das die Installa­
-tion automatisch durchführt. Lassen Sie während dieses Vorganges
-das EUDAS-Archiv eingelegt. Sie werden benachrichtigt, wenn die
-Generierung abgeschlossen ist.
- Wenn Sie EUDAS auf allen Ihren Hintergrunddisketten haben
-möchten, können Sie das so erzeugte System als Muttersystem
-sichern. Mit dem Kommando 'save system' können Sie den Hinter­
-grund komprimiert auf eine leere Archivdiskette schreiben. Mit
-dieser Sicherung können Sie dann jederzeit neue Systemdisketten
-wie von Ihrem Originalsystem herstellen.
-
-#on("b")#Einschränkungen#off("b")# Aus Platzgründen hat die
-Single-User-Version von EUDAS folgende Einschränkungen:
-#free (0.2)#
- Sie können die Funktionen Ketten und Koppeln nicht verwenden.
-#free (0.2)#
- Sie können im Druckmuster keine ELAN-Anweisungen und -Aus­
- drücke verwenden.
-#free (0.2)#
- Es stehen nur einige allgemeine Hilfstexte zur Verfügung.
-#free (0.2)#
- Funktionen, die mehrere Tasks vorausssetzen, sind ebenfalls
- gesperrt.
-#free (0.2)#
-Die betreffenden Funktionen sind zwar gegebenenfalls im Menü
-enthalten, lassen sich aber nicht aufrufen.
-
-
-2.3 Multi-User
-
-Dieser Abschnitt betrifft Sie nur, wenn Sie EUDAS auf einem Mul­
-ti-User System installieren wollen.
- EUDAS muß in einer bestimmten Task installiert werden. Alle
-neuen Söhne und Enkel dieser Task können dann EUDAS aufrufen.
-Im Normalfall wird diese Task 'PUBLIC' sein.
- Zum Installieren müssen Sie in diese Task gehen (in diesem
-Beispiel 'PUBLIC'). Dazu rufen Sie durch Tippen der SV-Taste den
-Supervisor und geben das Kommando
-
-
- continue ("PUBLIC")
-
-
-Stelle Sie mit Hilfe des 'storage info'-Kommandos fest, ob auf Ihrem
-Hintergrund noch mindestens 300 KB frei sind (dieser Platz wird zur
-Generierung benötigt). Dann legen Sie die EUDAS-Archivdiskette ein
-und geben folgendes Kommando
-
-
- archive ("EUDAS"); fetch ("eudas.generator", archive); run
-
-
-Falls die Task 'PUBLIC' Söhne besitzt, werden Sie gefragt, ob Sie
-diese löschen wollen. EUDAS steht nämlich nur in den Söhnen zur
-Verfügung, die #on("i")#nach#off("i")# der Installation eingerichtet wurden. Antworten
-Sie auf die Frage durch einfaches Tippen von 'j' oder 'n'. wenn Sie
-die Frage verneinen, können Sie die Generierung zu diesem Zeit­
-punkt auch noch abbrechen und zunächst die Söhne aufräumen.
- Es erscheint die Frage
-
-
- Ausführliche Hilfstexte installieren ? (j/n)
-
-
-Verneinen Sie die Frage, wenn in Ihrem System der Speicherplatz
-kritisch ist (zum Beispiel wenn Sie keine Festplatte haben). Es
-werden dann nur die wichtigsten allgemeinen Hilfstexte installiert
-(Ersparnis etwa 40 KByte).
- Anschließend wird die automatische Generierung gestartet.
-Lassen Sie die EUDAS-Archivdiskette eingelegt. Die Generierung ist
-beendet, wenn das EUMEL-Bild erscheint. Die Task, in der die
-Generierung stattfindet, wird automatisch zu einer Managertask, das
-heißt, daß man von ihr Söhne einrichten kann.
- Sie können das so erweiterte System auch mit 'save system' auf
-einer oder mehreren Archivdiskette sichern. Lesen Sie dazu die
-Hinweise zur Systemsicherung im EUMEL-Systemhandbuch.
-
-#on("b")#Korrekturversionen#off("b")# Falls Sie später einmal eine
-Korrekturversion
-von EUDAS bekommen, sollten Sie vor der neuen Generierung die
-Task, in der EUDAS vorher generiert war, löschen (Vorsicht: alle
-Söhne werden mitgelöscht) und wieder neu einrichten. Anderenfalls
-bleibt die alte Version als unzugängliche "Leiche" auf Ihrem System
-liegen.
- In diesem Fall und auch, wenn Sie mehrere Programme in der
-gleichen Task installieren, kann es zum Überlauf der internen Über­
-setzertabellen kommen. Für größere Installationen oder wenn Sie
-viele verschiedene Programme benutzen, empfiehlt es sich, zur
-Generierung eine eigene Task 'EUDAS' als Sohn von 'PUBLIC' zu
-verwenden. Sie dürfen dann aber in 'PUBLIC' nicht zu viel insertie­
-ren, da 'EUDAS' ja alle Programme von 'PUBLIC' erbt. Denken Sie
-daran, daß Sie EUDAS nur in Tasks benutzen können, die unter der
-Task 'EUDAS' eingerichtet wurden.
-
-
-
-
-
-
diff --git a/doc/eudas/eudas.hdb.3 b/doc/eudas/eudas.hdb.3
deleted file mode 100644
index e89ff4f..0000000
--- a/doc/eudas/eudas.hdb.3
+++ /dev/null
@@ -1,515 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (15)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-3 Ein Beispiel zum Ausprobieren
-
-
-
-Bevor Sie in die tieferen Geheimnisse von EUDAS einsteigen, sollen
-Sie in diesem Kapitel erst einige Erfahrungen mit der Bedienung
-sammeln. Dadurch erhalten Sie Sicherheit im Umgang mit dem Pro­
-gramm und haben bereits einen Eindruck dessen, was Sie anschlie­
-ßend erwartet.
- Das Durchlesen dieses Kapitels ist nur dann sinnvoll, wenn Sie
-die Anweisungen selbst am Rechner ausprobieren. Anderenfalls
-beginnen Sie besser mit dem nächsten Kapitel.
- Im folgenden sind die Eingaben, die Sie machen sollen, kursiv
-gedruckt, während Ausgaben des Rechners normal erscheinen.
-Außerdem erscheinen spezielle Tasten in spitzen Klammern:
-
-
- <RET>
-
-
-Bitte tippen Sie nicht die eckigen Klammern oder Großbuchstaben,
-sondern die entsprechende Taste. Oft haben die Sondertasten auch
-etwas andere Bezeichnungen (die obige zum Beispiel 'CR', 'Carriage
-Return', 'RETURN', 'ENTER'). Bitte fragen Sie bei Unklarheiten Ihren
-Systemlieferanten oder -betreuer.
-
-
-3.1 Start
-
-Die Anweisungen zum Starten von EUDAS sind unterschiedlich, je
-nachdem wie Ihr System eingerichtet ist. Bitte beachten Sie daher
-die verschiedenen Fälle.
-
-1. Falls Sie EUDAS nicht selbst installiert haben, fragen Sie am
- besten Ihren Systembetreuer. Ansonsten verhalten Sie sich wie
- unter 2.
-
-2. Falls Sie EUDAS nach den Anweisungen von Kapitel 2 in einem
- Multi-User-System eingerichtet haben, müssen Sie zunächst eine
- Arbeitstask (Arbeitsbereich) einrichten. Dazu tippen Sie die
- SV-Taste (diese trägt häufig die unterschiedlichsten Bezeich­
- nungen). Es erscheint
-
-
- EUMEL x.y.z/M
-
- gib supervisor kommando :
-
-
- Sie tippen nun folgendes Kommando:
-
-
- #on("i")#begin ("arbeit")#off("i")#<RET>
-
-
- Vergessen Sie nicht die RETURN-Taste am Schluß. Machen Sie
- jetzt weiter bei Punkt 4.
-
-3. Falls Sie ein Single-User-System besitzen, starten Sie die
- Systemdiskette und geben das Datum ein. Dann machen Sie wei­
- ter mit Punkt 4.
-
-4. Danach erscheint:
-
-
- gib kommando :
-
-
- und Sie tippen:
-
-
- #on("i")#eudas#off("i")#<RET>
-
-
- Als Ergebnis wird das EUDAS-Eingangsmenü angezeigt (s. Abb.
- 3-1 auf der nächsten Seite).
-
-
-3.2 Daten eintragen
-
-Als Beispiel sollen Sie eine kleine Adressenkartei einrichten. Der
-Fachausdruck für eine elektronische Kartei ist #on("i")#Datei#off("i")#.
-
-___________________________________________________________________________________________
-
- EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv
- --------------:
- EUDAS-Datei :
- O Öffnen :
- - Ketten :
- - Koppeln : EEEEE U U DDDD A SSSS
- --------------: E U U D D A A S
- Arbeitskopie : EEE U U D D AAAAA SSS
- - Sichern : E U U D D A A S
- --------------: EEEEE UUU DDDD A A SSSS
- Aktuelle Datei:
- - Notizen : Version 4.3
- - Feldstrukt. : Stand: 14.07.87
- - Prüfbeding. :
- --------------: (C) Copyright
- Mehrbenutzer : Thomas Berlage
- M Manager : Software-Systeme
- --------------:
- :
- :
- :
- :
- :
- Akt.Datei: Manager: Datum: 22.07.87
-___________________________________________________________________________________________
-
-
-#center#Abb. 3-1 EUDAS-Eingangsmenü
-
-
- Zunächst müssen Sie eine neue Datei einrichten. Dazu tippen
-Sie die Leertaste. Dadurch wird die invers dargestellte Funktion
-'Öffnen' ausgeführt. Folgen Sie bitte dem nachstehenden Dialog auf
-der rechten Bildschirmseite:
-
-
- Name der Datei: #on ("i")#Mitglieder#off("i")#<RET>
- "Mitglieder" neu einrichten ? (j/n) #on("i")#j#off("i")#
-
-
-Unter der Ãœberschrift 'Neue Feldnamen' tippen Sie jetzt folgendes
-(bitte keine Leerstellen vor den Namen tippen):
-
-
- #on("i")#Name#off("i")#<RET>
- #on("i")#Vorname#off("i")#<RET>
- #on("i")#PLZ#off("i")#<RET>
- #on("i")#Ort#off("i")#<RET>
- #on("i")#Strasse#off("i")#<RET>
- #on("i")#m/w#off("i")#<ESC>#on("i")#q#off("i")#
-
-
-Zum Schluß beantworten Sie noch eine Frage:
-
-
- Feldnamen oder Feldtypen aendern ? (j/n) #on("i")#n#off("i")#
-
-
-Damit ist die neue Datei eingerichtet.
- Nun tippen Sie die Pfeiltaste <RECHTS>. Es erscheint ein neues
-Menübild (s. Abb. 3-2).
-
-___________________________________________________________________________________________
-
- EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv
- --------------: Satz 1 .........ENDE... Mitglieder .......... Feld 1
- Positionieren : Name
- W Weiter : Vorname
- Z Zurück : PLZ
- N Satz.Nr : Ort
- --------------: Strasse
- Suchbedingung : m/w
- S Setzen : ...........................................................
- L Löschen :
- M Markierung :
- --------------:
- Datensatz :
- E Einfügen :
- A Ändern :
- T Tragen :
- H Holen :
- --------------:
- F Feldauswahl :
- --------------:
- :
- :
- :
-
-___________________________________________________________________________________________
-
-
-#center#Abb. 3-2 Menü 'Einzelsatz'
-
-
-Nun tippen Sie so lange die Pfeiltaste <UNTEN>, bis die Funktion
-'Einfügen' invers markiert ist. Dann tippen Sie die Leertaste zum Aus­
-führen dieser Funktion. Die Schreibmarke springt nach rechts ins
-Datenfeld zum Eingeben. Geben Sie jetzt den ersten Datensatz wie
-folgt ein:
-
-
- #on("i")#Wegner#off("i")#<RET>
- #on("i")#Herbert#off("i")#<RET>
- #on("i")#5000#off("i")#<RET>
- #on("i")#Köln#off("i")#<RET>
- #on("i")#Krämergasse 12#off("i")#<RET>
- #on("i")#m#off("i")#<ESC>#on("i")#w#off("i")#
-
-
-Anschließend wird das Datenfeld wieder freigemacht, so daß Sie
-gleich den zweiten Datensatz eingeben können. Dies tun Sie auf die
-gleiche Weise, nur mit anderen Daten:
-
-
- #on("i")#Sandmann#off("i")#<RET>
- #on("i")#Helga#off("i")#<RET>
- #on("i")#5300#off("i")#<RET>
- #on("i")#Bonn 1#off("i")#<RET>
- #on("i")#Willicher Weg 109#off("i")#<RET>
- #on("i")#w#off("i")#<ESC>#on("i")#w#off("i")#
-
-
-Ebenso verfahren Sie dann weiter mit den folgenden Daten. Falls Sie
-sich vertippt haben, können Sie mit den vier Pfeiltasten an die
-entsprechende Stelle gehen und die falschen Buchstaben über­
-schreiben.
-
-
- #on("i")#Katani#off("i")#<RET>
- #on("i")#Albert#off("i")#<RET>
- #on("i")#5210#off("i")#<RET>
- #on("i")#Troisdorf#off("i")#<RET>
- #on("i")#Lindenstr. 3#off("i")#<RET>
- #on("i")#m#off("i")#<ESC>#on("i")#w#off("i")#
-
- #on("i")#Ulmen#off("i")#<RET>
- #on("i")#Peter#off("i")#<RET>
- #on("i")#5#off("i")#<RET>
- #on("i")#Köln 60#off("i")#<RET>
- #on("i")#Mozartstraße 17#off("i")#<RET>
- #on("i")#m#off("i")#<ESC>#on("i")#w#off("i")#
-
- #on("i")#Regmann#off("i")#<RET>
- #on("i")#Karin#off("i")#<RET>
- #on("i")#5000#off("i")#<RET>
- #on("i")#Köln 90#off("i")#<RET>
- #on("i")#Grengelweg 44#off("i")#<RET>
- #on("i")#w#off("i")#<ESC>#on("i")#w#off("i")#
-
- #on("i")#Arken#off("i")#<RET>
- #on("i")#Hubert#off("i")#<RET>
- #on("i")#5200#off("i")#<RET>
- #on("i")#Siegburg#off("i")#<RET>
- #on("i")#Talweg 12#off("i")#<RET>
- #on("i")#m#off("i")#<ESC>#on("i")#w#off("i")#
-
- #on("i")#Simmern#off("i")#<RET>
- #on("i")#Anna-Maria#off("i")#<RET>
- #on("i")#5#off("i")#<RET>
- #on("i")#Köln 3#off("i")#<RET>
- #on("i")#Platanenweg 67#off("i")#<RET>
- #on("i")#w#off("i")#<ESC>#on("i")#w#off("i")#
-
- #on("i")#Kaufmann-Drescher#off("i")#<RET>
- #on("i")#Angelika#off("i")#<RET>
- #on("i")#53#off("i")#<RET>
- #on("i")#Bonn#off("i")#<RET>
- #on("i")#Hauptstr. 123#off("i")#<RET>
- #on("i")#w#off("i")#<ESC>#on("i")#w#off("i")#
-
- #on("i")#Fuhrmann#off("i")#<RET>
- #on("i")#Harald#off("i")#<RET>
- #on("i")#5000#off("i")#<RET>
- #on("i")#Köln 1#off("i")#<RET>
- #on("i")#Glockengasse 44#off("i")#<RET>
- #on("i")#m#off("i")#<ESC>#on("i")#w#off("i")#
-
-
-Bei der letzten Adresse ist die letzte Taste unterschiedlich, da Sie
-keine weiteren Daten mehr eintragen wollen. Bitte beachten Sie dies.
-
-
- #on("i")#Seefeld#off("i")#<RET>
- #on("i")#Friedrich#off("i")#<RET>
- #on("i")#5000#off("i")#<RET>
- #on("i")#Köln-Ehrenfeld#off("i")#<RET>
- #on("i")#Kabelgasse#off("i")#<RET>
- #on("i")#m#off("i")#<ESC>#on("i")#q#off("i")#
-
-
-Damit die neu eingetragenen Daten permanent gespeichert sind,
-müssen Sie sie #on("i")#sichern#off("i")#. Dazu kehren Sie durch Tippen von <LINKS>
-in das erste Menü zurück. Dort tippen Sie wieder so lange <UNTEN>,
-bis die Funktion 'Sichern' markiert ist. Tippen Sie dann die Leer­
-taste zum Ausführen und folgen dem nachstehenden Dialog:
-
-
- Arbeitskopie "Mitglieder" veraendert! Sichern ? (j/n) #on("i")#j#off("i")#
- Alte Version ueberschreiben ? (j/n) #on("i")#j#off("i")#
- Interne Arbeitskopien loeschen ? (j/n) #on("i")#j#off("i")#
-
-
-Damit steht Ihnen nun eine Mitgliederdatei mit 10 Einträgen zur
-weiteren Verfügung.
-
-
-3.3 Daten abfragen
-
-Um Daten abzufragen, müssen Sie die Datei zunächst wieder öffnen.
-Dazu bewegen Sie die inverse Markierung durch mehrmaliges Tippen
-von <OBEN> nach oben bis zur Funktion 'Öffnen' und tippen Sie die
-Leertaste. Danach ergibt sich folgender Dialog:
-
-
- Name der Datei: #on("i")#Mitglieder#off("i")#<RET>
- Wollen Sie etwas aendern (eine Arbeitskopie einrichten)
- ? (j/n) #on("i")#n#off("i")#
-
-
-Danach gehen Sie durch Tippen von <RECHTS> in das zweite Menü.
-Dort erscheint jetzt die zehnte Adresse.
- Zunächst sollen Sie an den Anfang gehen. Dazu schieben Sie
-die Markierung auf die Funktion 'Satz.Nr' mit Hilfe der Pfeiltasten
-und tippen dann die Leertaste. Nach folgender Angabe
-
-
- Neue Satznummer: #on("i")#1#off("i")#<RET>
-
-
-erscheint die erste Adresse. Nun sollen Sie nach der Adresse von
-Harald Fuhrmann suchen. Dazu bringen Sie die Markierung auf die
-Funktion 'Suchbedingung Setzen' und tippen die Leertaste. Die
-Schreibmarke springt wieder in das Datenfeld. Dort geben Sie ein:
-
-
- #on("i")#Fuhrmann#off("i")#<ESC>#on("i")#q#off("i")#
-
-
-In der markierten Überschrift erscheint 'SUCH-' zum Zeichen, daß
-eine Suchbedingung eingestellt ist. Dann schieben Sie die Markie­
-rung auf die Funktion 'Weiter' und tippen die Leertaste. Kurz da­
-nach erscheint die Adresse von Herrn Fuhrmann mit dem Hinweis
-'SUCH+' (gefunden).
- Führen Sie dann die Funktion 'Zurück' aus (Verschieben der
-Markierung und Tippen der Leertaste). Es erscheint wieder die erste
-Adresse mit dem Hinweis 'SUCH-' (kein weiterer Fuhrmann gefun­
-den). Führen Sie dann die Funktion `Suchbedingung Löschen' aus.
-Der 'SUCH'-Hinweis verschwindet wieder.
- Als nächstes sollen Sie die Daten nach allen weiblichen Mit­
-gliedern durchsuchen. Dazu führen Sie wieder die Funktion 'Such­
-bedingung Setzen' aus. Diesmal tippen Sie im Datenfeld fünfmal die
-Pfeiltaste <UNTEN>, bis die Schreibmarke neben der Bezeichnung
-'m/w' steht. Dort tippen Sie
-
-
- #on("i")#w#off("i")#<ESC>#on("i")#q#off("i")#
-
-
-Wenn Sie jetzt die Funktion 'Weiter' ausführen, erscheint das erste
-weibliche Mitglied, Frau Sandmann. Da aber noch weitere Frauen in
-der Datei vorkommen, führen Sie erneut 'Weiter' aus und es erschei­
-nen die nächsten weiblichen Mitglieder.
- Wenn kein gesuchtes Mitglied mehr gefunden wurde, erscheint
-ein leeres Datenfeld mit den Bezeichnungen 'ENDE' und 'SUCH-' in
-der Überschrift. Durch mehrmaliges Ausführen von 'Zurück' können
-Sie die weiblichen Mitglieder wieder in der umgekehrten Reihenfolge
-ansehen, bis Sie an den Anfang der Datei kommen.
- Bitte lassen Sie die Suchbedingung eingestellt, denn im näch­
-sten Abschnitt wollen wir alle weiblichen Mitglieder ausdrucken.
-
-
-3.4 Drucken
-
-Zuerst begeben Sie sich durch zweimaliges Tippen von <RECHTS> in
-das Druckmenü, das in Abb. 3-3 gezeigt wird.
-
-___________________________________________________________________________________________
-
- EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv
- --------------:
- Satzauswahl :
- D Drucken :
- --------------:
- Druckausgabe :
- R Richtung :
- --------------:
- Textdatei :
- E Editieren :
- A Ausdrucken :
- N Nachbearb. :
- --------------:
- :
- :
- :
- :
- :
- :
- :
- :
- :
- :
- Akt.Datei: "Mitglieder" Datum: 22.07.87
-___________________________________________________________________________________________
-
-
-#center#Abb. 3-3 Menü 'Drucken'
-
-
-Zunächst müssen Sie ein Druckmuster erstellen, das angibt, wie der
-Druck aussehen soll. Dazu führen Sie die Funktion 'Textdatei Edi­
-tieren' aus. Es erscheint die Aufforderung:
-
-
- Name der Datei: #on("i")#liste#off("i")#<RET>
-
-
-Dann wird der Bildschirm gelöscht und Sie können folgendes einge­
-ben:
-
-
- #on("i")#% VORSPANN#off ("i")#<RET>
- #on("i")#Liste der weiblichen Mitglieder#off ("i")#<RET>
- #on("i")#-------------------------------#off ("i")#<RET>
- #on("i")#% WIEDERHOLUNG#off ("i")#<RET>
- #on("i")#&Vorname %Name#off ("i")#<ESC>#on("i")#q#off("i")#
-
-
-Ebenso wie beim Eingeben von Daten können Sie hier mit den Pfeil­
-tasten auf fehlerhafte Stellen zurückgehen und dort korrigieren.
- Nun sollten Sie sich vergewissern, ob Ihr Drucker eingeschaltet
-und bereit (Ready) ist. Falls Sie keinen Drucker haben, folgen Sie
-bitte den Anweisungen unter 2. Anderenfalls gehen Sie wie folgt
-vor.
-
-1. Rufen Sie die Funktion 'Richtung' auf und beantworten Sie
- folgende Frage:
-
-
- Ausgabe automatisch zum Drucker ? (j/n) #on("i")#j#off("i")#
-
-
- Dann rufen Sie die Funktion 'Drucken' auf und geben den Namen
- des Druckmusters an:
-
-
- Name des Druckmusters: #on("i")#liste#off ("i")#<RET>
-
-
- Als Ergebnis sollte folgende Liste auf Ihrem Drucker erscheinen:
-
-
- Liste der weiblichen Mitglieder
- -------------------------------
- Helga Sandmann
- Karin Regmann
- Anna-Maria Simmern
- Angelika Kaufmann-Drescher
-
-
-2. Rufen Sie die Funktion 'Richtung' auf und beantworten Sie
- folgende Fragen:
-
-
- Ausgabe automatisch zum Drucker ? (j/n) #on("i")#n#off("i")#
- Ausgabe in bestimmte Datei ? (j/n) #on("i")#n#off("i")#
-
-
- Dann rufen Sie die Funktion 'Drucken' auf und geben den Namen
- des Druckmusters an:
-
-
- Name des Druckmusters: #on("i")#liste#off ("i")#<RET>
-
-
- Nach dem Ende des Druckprozesses (wenn das Sternchen vor
- 'Drucken' wieder durch ein 'D' ersetzt worden ist), rufen Sie
- wieder die Funktion 'Textdatei Editieren' auf und geben folgen­
- den Namen an:
-
-
- Name der Datei: #on("i")#liste.a$1#off("i")#<RET>
-
-
- Es erscheint die gleiche Ausgabe wie unter 1 beschrieben auf
- dem Bildschirm. Wenn Sie die Ausgabe genug gesehen haben,
- kehren Sie durch
-
-
- <ESC>#on("i")#q#off("i")#
-
-
- wieder in das Menü zurück.
-
-
-3.5 Ergebnis
-
-Da Sie sich wieder im Menü befinden, könne Sie EUDAS durch
-
- <ESC>#on("i")#q#off("i")#
-
-wieder verlassen. Danach können Sie Ihre Sitzung beenden, etwas
-Anderes tun oder EUDAS erneut aufrufen.
-
- Sie haben nun selbst ausprobiert, wie Sie unter EUDAS Daten
-eingeben können, wie Sie diese Daten abrufen und in ihnen suchen
-können. Sie haben die Daten auch schon ausgedruckt.
- Damit Sie besser verstehen, was Sie soeben gemacht haben,
-werden Sie in den folgenden vier Kapiteln die Grundfunktionen von
-EUDAS mit den dazugehörigen Erläuterungen kennenlernen.
- Danach können Sie dann selber Ihre eigene Anwendung entwer­
-fen und EUDAS zu Ihrer Arbeitserleichterung einsetzen.
-
-
-
-
-
-
diff --git a/doc/eudas/eudas.hdb.5 b/doc/eudas/eudas.hdb.5
deleted file mode 100644
index b5927ea..0000000
--- a/doc/eudas/eudas.hdb.5
+++ /dev/null
@@ -1,386 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (43)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-5 Gespeicherte Daten abfragen
-
-
-
-5.1 Öffnen
-
-Als letzte Vorbereitung, bevor Sie mit der Adreßdatei spielen kön­
-nen, müssen Sie die Datei wie einen Karteikasten #on("i")#öffnen#off("i")#. Nach dem
-Öffnen beziehen sich alle weiteren Funktionen auf die gerade ge­
-öffnete Datei. Aus diesem Grund darf auch immer nur eine einzige
-Datei geöffnet sein - als hätte auf Ihrem Schreibtisch nur ein Kar­
-teikasten Platz.
- Dazu wählen Sie jetzt wieder das erste Menü an. Dort finden
-Sie die Funktion
-#free (0.2)#
-
- O Öffnen
-
-#free (0.2)#
-Wählen Sie diese Funktion aus. Dann drücken Sie die Leertaste, um
-die Funktion auszuführen. Als erstes erscheint im unteren Teil des
-Bildschirms eine Frage:
-
-___________________________________________________________________________________________
-
- Wollen Sie etwas aendern (eine Arbeitskopie anlegen) (j/n) ?
-___________________________________________________________________________________________
-
-
-Der Cursor bleibt hinter der Frage stehen. Sie kennen diesen Frage­
-zustand ja schon.
- In diesem Fall wollen Sie an der Spieldatei nichts verändern,
-Sie beantworten die Frage also mit einem 'n'. Als nächstes werden
-Sie nach dem Namen gefragt (Beachten Sie auch hier wieder die
-Statuszeile).
- Tippen Sie nun 'Adressen' und beenden Sie die Eingabe mit
-RETURN. EUDAS öffnet die Datei und kehrt zum Menü zurück. Alter­
-nativ können Sie die Datei auch in einer Auswahl ankreuzen, wenn
-Sie ESC 'z' tippen.
-
-#on("b")#Fußzeile#off("b")# Nach der Ausführung dieser Funktion sollten Sie
-Ihre
-Aufmerksamkeit auf die letzte Zeile des Bildschirms richten. Hier
-finden Sie jetzt folgendes vor:
-
-___________________________________________________________________________________________
-
- Akt.Datei: "Adressen" Manager: Datum: 22.07.87
-___________________________________________________________________________________________
-
-
-Neben dem Datum und dem eingestellten Manager (dies kommt viel
-später) sehen Sie hier, welche Datei Sie geöffnet haben und nun
-bearbeiten können. Diese Fußzeile finden Sie auch in den ande­
-ren Menüs. Lediglich die mittlere Angabe ändert sich bei den ande­
-ren Menüs (eine Erläuterung dazu finden Sie in späteren Kapiteln).
-
-#on("b")#Anzeige#off("b")# Zum Anzeigen der Daten in der Adreßdatei müssen Sie
-das
-zweite Menü 'Einzelsatz' anwählen (durch Drücken der Pfeiltaste
-RECHTS). Am linken Rand erscheint das neue Menü mit den Anzei­
-gefunktionen. Der Rest des Bildschirms enthält das Formular für die
-Adreßdatei mit den Daten des ersten Satzes. Abbildung 5-1 zeigt
-das Bild, das sich dann ergibt.
-
-___________________________________________________________________________________________
-
- EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv
- --------------: Satz 1 ................... Adressen ....... Zeile 1
- Positionieren : Name Wegner
- W Weiter : Vorname Herbert
- Z Zurück : PLZ 5000
- N Satz.Nr : Ort Köln
- --------------: Strasse Krämergasse 12
- Suchbedingung : m/w m
- S Setzen : ...........................................................
- L Löschen :
- M Markierung :
- --------------:
- Datensatz :
- - Einfügen :
- - Ändern :
- - Tragen :
- - Holen :
- --------------:
- F Feldauswahl :
- --------------:
- :
- :
- :
-
-___________________________________________________________________________________________
-
-
-#center#Abb. 5-1 Menü 'Einzelsatz'
-
-
-Das automatisch generierte Formular zeigt immer genau einen Satz.
-Das Formular besteht aus drei Teilen: der Ãœberschrift, dem Feldteil
-und der Abschlußzeile. In der #on("i")#Überschrift#off("i")# steht der Name der Datei
-("Adressen"), die Satznummer (1) und die Nummer der ersten ange­
-zeigten Zeile (immer 1, außer wenn die Datei mehr Felder hat, als
-auf den Bildschirm passen). In manchen Fällen können auch noch
-weitere Informationen dort auftauchen, wie wir später sehen wer­
-den.
- Im #on("i")#Feldteil#off("i")# befindet sich der eigentliche Inhalt, und zwar sind
-links markiert die Feldnamen zu sehen, während rechts die zugehö­
-rigen Inhalte des betreffenden Satzes stehen. Dieses Bild ähnelt
-einer Karteikarte mit einem festen Format.
- Die #on("i")#Abschlußzeile#off("i")# am Ende gibt an, daß für diesen Satz keine
-weiteren Informationen mehr vorhanden sind. Wir werden aber spä­
-ter noch sehen, wie man anderenfalls die restlichen Informatio­
-nen sichtbar machen kann.
-
-
-5.2 Bewegen
-
-Nun wollen Sie nicht immer nur einen Satz betrachten (das wäre ja
-furchtbar langweilig). Daher müssen Sie die Möglichkeit haben, sich
-in der Datei zu "bewegen". Dies geschieht mit Hilfe der beiden
-Funktionen
-#free (0.2)#
-
- W Weiter
-
-#free (0.2)#
-und
-#free (0.2)#
-
- Z Zurück
-
-#free (0.2)#
-Sie haben die Wirkung, daß der Satz mit der nächsthöheren bzw.
-nächstniedrigeren Satznummer angezeigt wird. Natürlich funktioniert
-dies nur, wenn noch ein Satz vorhanden ist: am Anfang (Satz 1)
-können Sie nicht zurückgehen. In diesem Fall ignoriert EUDAS Ihren
-Befehl einfach.
- Wenn Sie bis zum Ende der Datei gehen (keine Angst - diese
-Datei enthält nur 10 Sätze), werden Sie feststellen, daß zum Schluß
-ein ganz leerer Satz erscheint. Dieser Satz ist eine Art Endemarkie­
-rung; er informiert Sie, daß keine weiteren Sätze vorhanden sind.
-Dieser Satz ist aber kein richtiger Satz, daher wird in der Über­
-schrift 'ENDE' angezeigt. (Wenn Ihnen diese Art Endemarkierung
-merkwürdig erscheint: sie hat schon einen triftigen Grund, s.6.2).
- Um einen Satz mit bekannter Satznummer gezielt anzuwählen,
-können Sie die Funktion
-#free (0.2)#
-
- N Satz.Nr
-
-#free (0.2)#
-verwenden. Sie müssen anschließend die Satznummer eingeben (Bitte
-mit RETURN beenden). Ist der Satz vorhanden, erscheint dieser,
-ansonsten stehen Sie am Ende der Datei.
-
-#on("b")#Aufruf über Buchstaben#off("b")# Vielleicht ist Ihnen inzwischen
-schon
-aufgefallen, daß vor jeder Funktion in einem Menü ein Buchstabe
-steht. Damit hat es folgendes auf sich: da das Positionieren des
-Cursors zum Auswählen einer Funktion mehrere Tastendrücke erfor­
-dern kann, haben Sie die Möglichkeit, jede Funktion auch über
-einen Buchstaben auszuführen.
- Dies ist besonders dann sinnvoll, wenn Sie mit den eben be­
-sprochenen Funktionen schnell in der Datei "blättern" wollen. An­
-dererseits müssen Sie sich aber für eine schnelle Reaktion auch
-einige der Tasten merken. Für die Praxis empfiehlt sich folgender
-Kompromiß: die meistgebrauchten Funktionen über Buchstaben und
-der Rest durch Positionieren im Menü.
-
-
-5.3 Suchen
-
-Stellen Sie sich vor, die Datei wäre größer und Sie müßten eine
-bestimmte Adresse heraussuchen. Dazu würden Sie durch die ganze
-Datei durchgehen, bis die gewünschte Adresse erscheint. Das wäre
-natürlich bei vielen Adressen eine ungeheuer mühselige Arbeit, die
-mit einem Karteikasten wahrscheinlich schneller zu erledigen wäre.
- EUDAS bietet Ihnen jedoch die Möglichkeit, nach bestimmten
-Sätzen zu suchen. Dazu müssen Sie angeben, wonach gesucht werden
-soll. Als Beispiel wollen wir die Adresse von Frau Simmern su­
-chen. Bewegen Sie sich zunächst zurück bis auf den ersten Satz.
-Dann wählen Sie die Funktion
-#free (0.2)#
-
- Suchbedingung
- S Setzen
-
-#free (0.2)#
-Auf dem Bildschirm verschwinden die Feldinhalte und der Cursor
-steht hinter dem ersten Feldnamen. Dies bedeutet, daß Sie neben
-die Feldnamen etwas schreiben können. Auch in der Statuszeile
-erscheint statt der Anzeige der Menünamen ein Hinweis auf die
-Eingabemöglichkeit (s. Abb. 5-2). Sie befinden sich jetzt in einem
-Zustand, in dem Sie hinter die Feldnamen etwas schreiben können
-(dem sogenannten #on("i")#Satzeditor#off("i")#).
- Als Angabe, was gesucht werden soll, schreiben Sie jetzt in der
-ersten Zeile neben 'Name' die Bedingung 'Simmern'. Sie haben jetzt
-ein einfaches #on("i")#Suchmuster#off("i")# angegeben. Ein Suchmuster besteht aus
-Bedingungen, die neben die Feldnamen geschrieben werden. Unser
-einfaches Suchmuster lautet übersetzt:
-
- Wähle alle Sätze aus, bei denen 'Simmern' im Feld 'Name'
- steht.
-
-Beenden Sie die Eingabe des Suchmusters mit ESC 'q'. Es erscheint
-wieder das vorherige Bild, mit dem Unterschied, daß jetzt in der
-Ãœberschrift ein 'SUCH-' auftaucht. EUDAS steht immer noch auf dem
-ersten Satz.
- Die Anzeige 'SUCH' gibt an, daß ein Suchmuster eingestellt
-wurde. Das Minuszeichen bedeutet, daß der aktuelle Satz die Such­
-bedingung jedoch #on("i")#nicht#off("i")# erfüllt.
-
-___________________________________________________________________________________________
-
- SUCHMUSTER EINGEBEN: Abbruch: ESC h Beenden: ESC q Hilfe: ESC ?
- --------------: Satz 1 .................... ............... Zeile 1
- Positionieren : Name Simmern
- W Weiter : Vorname
- Z Zurück : PLZ
- N Satz.Nr : Ort
- --------------: Strasse
- Suchbedingung : m/w
- * Setzen : ...........................................................
- L Löschen :
- M Markierung :
- --------------:
- Datensatz :
- - Einfügen :
- - Ändern :
- - Tragen :
- - Holen :
- --------------:
- F Feldauswahl :
- --------------:
- :
- :
-___________________________________________________________________________________________
-
-
-#center#Abb. 5-2 Eingabe eines Suchmusters
-
-
-#on("b")#Positionierung#off("b")# Das Suchen beginnt erst, wenn Sie sich in
-der Datei
-bewegen. In diesem Fall erhalten die Funktionen 'Satz weiter' und
-'Satz zurück' eine etwas geänderte Bedeutung. Sie gehen nämlich
-nicht einfach zum nächsten bzw. vorigen Satz, sondern zum näch­
-sten bzw. vorigen Satz.
- Als Indikator, daß Sie sich auf dem gesuchten Satz befinden,
-dient die Anzeige 'SUCH+'. Probieren Sie dies jetzt aus, indem Sie
-weitergehen. Als nächster Satz erscheint der gewünschte Satz 7. Die
-nicht ausgewählten Sätze wurden also übersprungen. Das gleiche
-passiert, wenn Sie noch weiter gehen. Da kein passender Satz mehr
-vorhanden ist, erscheint der leere Endesatz.
-
-#limit (12.0)#
- Denken Sie daran, daß das Einstellen der Suchbedingung
- noch keine Suche bewirkt. Diese müssen Sie selbst
- durch Positionieren mit 'Weiter' oder 'Zurück' auslösen.
-#limit (13.5)#
-
-Sollten Sie sich nicht am Anfang der Datei befinden, wenn Sie eine
-Suchbedingung einstellen, kann es sein, daß sich der gesuchte Satz
-vor oder hinter der aktuellen Position befindet. In diesem Fall
-müssen Sie entscheiden, ob Sie vorwärts oder rückwärts gehen.
-Wenn Sie rückwärts gehen und der Satz ist nicht in diesem Ab­
-schnitt, erscheint der erste Satz mit der Anzeige 'SUCH-'. Gehen Sie
-dann wieder vorwärts, finden Sie den Satz auf jeden Fall.
- Die Funktion 'Satz.Nr' richtet sich natürlich nicht nach der
-eingestellten Bedingung, da Sie ja eine bestimmte Satznummer wün­
-schen. Aus der 'SUCH'-Anzeige können Sie jedoch entnehmen, ob
-die Suchbedingung auf diesen Satz zutrifft.
-
-#on("b")#Suchbedingung löschen#off("b")# Wollen Sie wieder alle Sätze sehen,
-müssen Sie die Funktion
-#free (0.2)#
-
- Suchbedingung
- L Löschen
-
-#free (0.2)#
-auswählen. Die Anzeige 'SUCH' verschwindet wieder, um anzudeu­
-ten, daß keine Suchbedingung mehr eingestellt ist.
-
-#on("b")#Beispiel#off("b")# Um den Charakter einer Selektion nochmal deutlich
-zu
-machen, sollen Sie jetzt eine Bedingung einstellen, die auf mehrere
-Sätze zutrifft. Dies hätte uns auch eben passieren können, wenn es
-mehrere Simmern gegeben hätte. Wir können zum Beispiel alle weib­
-lichen Personen auswählen.
- Als erstes löschen Sie die alte Suchbedingung. Tun Sie dies
-nicht, wird Ihnen beim nächsten Eingeben das alte Suchmuster zum
-Ändern angeboten. Dies ist praktisch, wenn ein Suchmuster nicht
-den erhofften Erfolg brachte und Sie es modifizieren wollen.
- Danach wählen Sie erneut die Funktion 'Suchbedingung setzen'.
-Nun bewegen Sie den Cursor mit der Pfeiltaste UNTEN neben den
-Feldnamen 'm/w'. Dort tragen Sie die Bedingung 'w' ein. Verlassen
-Sie die Eingabe mit ESC 'q'.
- Wenn Sie sich jetzt in der Datei bewegen, sehen Sie, daß immer
-nur weibliche Personen angezeigt werden - die männlichen werden
-unterdrückt (in Umkehrung der Realität).
-
-
- ! 1 ! ! 3 ! 4 ! ! 6 !
- +-----+-----+-----+-----+-----+-----+-----+
- !Name ! .. ! ! .. ! .. ! ! .. !
- ! ! ! ! ! ! ! !
- : : : : :
- ! ! ! ! ! ! ! !
- !m/w ! w ! ! w ! w ! ! w !
- +-----+-----+ +-----+-----+ +-----+
-
-#center#Abb. 5-3 Wirkung einer Selektion
-
-
-
-5.4 Suchbedingungen
-
-Im letzten Abschnitt haben Sie gesehen, wie das Einstellen einer
-Suchbedingung funktioniert. In diesem Abschnitt sollen Sie weitere
-Möglichkeiten zur Formulierung von Suchmustern kennenlernen.
- Die erste Möglichkeit kennen Sie schon. Wenn neben einen
-Feldnamen ein Text geschrieben wird, bedeutet dies, daß ausge­
-wählte Sätze im Inhalt dieses Feldes mit dem Text übereinstimmen
-müssen.
-
-#on("b")#Kombination#off("b")# Nun kann es sein, daß mehrere Bedingungen
-gelten
-müssen. Im ersten Beispiel des vorigen Abschnitts hätten wir zum
-Beispiel auch noch den Vornamen 'Anna-Maria' angeben können, um
-bei mehreren Simmern die richtige auszuwählen. Wird also in mehre­
-re Felder eine Bedingung geschrieben, müssen alle diese Bedingun­
-gen gleichzeitig zutreffen.
- Würden Sie in unserem Beispiel noch als dritte Bedingung 'm'
-für das Feld 'm/w' angeben, würde gar kein Satz mehr ausgewählt,
-da Anna-Maria Simmern natürlich nicht männlich ist. Auch das
-kann also passieren.
-
-
- Name Simmern
- Vorname Anna-Maria
- ..
- ..
- m/w m
-
-#center#Abb. 5-4 Kombination von Bedingungen
-
-
-#on("b")#Stern#off("b")# Die Bedingungen, die wir bis jetzt kennengelernt
-haben,
-müssen alle ganz exakt zutreffen. Häufig tritt aber der Fall auf,
-daß der gesuchte Name nicht genau bekannt ist. In diesem Fall
-kann der Name im Suchmuster auch teilweise eingegeben werden.
-Der unbekannte Teil am Anfang oder am Ende wird einfach durch
-einen Stern markiert.
- Wenn Sie also als Bedingung 'Sim*' für den Namen angeben, so
-würde dies auf den Namen Simmern zutreffen, aber zum Beispiel
-auch auf Simmerath oder Simon. Die Bedingung '*mern' würde nicht
-nur auf Simmern zutreffen, sondern auch auf Pommern.
- Der Stern kann aber auch für einen leeren Text stehen. So
-trifft 'Simmern*' auf Simmern zu, aber auch auf Doppelnamen. die
-mit Simmern beginnen. Wissen Sie jetzt nicht, ob Simmern in dem
-Doppelnamen vorne oder hinten erscheint, können Sie auch an bei­
-den Seiten einen Stern machen. Die Bedingung '*Simmern*' trifft
-nicht nur auf Simmern, sondern sowohl auf Deckerath-Simmern als
-auch auf Simmern-Jakob zu.
- Es gibt noch eine Reihe von weiteren Möglichkeiten, Bedingun­
-gen im Suchmuster zu formulieren. Auch komplexe Kombinationen
-von Bedingungen sind möglich. Mit dem bisher Besprochenen sollten
-Sie aber in vielen Fällen auskommen. Die übrigen Möglichkeiten
-werden in Abschnitt 10.2 erklärt. Schauen Sie bei Bedarf dort nach.
-
-
diff --git a/doc/eudas/eudas.hdb.6 b/doc/eudas/eudas.hdb.6
deleted file mode 100644
index e617881..0000000
--- a/doc/eudas/eudas.hdb.6
+++ /dev/null
@@ -1,394 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (51)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-6 Daten eingeben und ändern
-
-
-
-6.1 Neue Datei einrichten
-
-Nachdem Sie sich bis jetzt an einer existierenden Datei erprobt
-haben, können Sie nun dazu übergehen, eine eigene neue Datei
-einzurichten. Als Beispiel sollen Sie ein kleines Telefonregister
-erstellen.
- Dazu gehen Sie wieder in das Menü 'Öffnen' zurück und wäh­
-len erneut die Funktion
-#free (0.2)#
-
- O Öffnen
-
-#free (0.2)#
-indem Sie mehrmals OBEN tippen, bis die Funktion markiert. Dann
-tippen Sie die Lerrtaste zum Ausführen. Als Dateinamen geben Sie
-'Telefonnummern' an.
- Da die Datei 'Telefonnummern' noch nicht existiert, werden Sie
-gefragt:
-
-
- "Telefonnummern" neu einrichten ? (j/n) #on("i")#j#off("i")#
-
-
-Es kann ja sein, daß Sie sich vertippt haben und eine andere,
-existierende Datei meinten. In unserem Fall wird die Datei aber
-wirklich neu eingerichtet, daher bejahen Sie die Frage.
-
-#on("b")#Feldnamen eingeben#off("b")# Wenn Sie beim Öffnen eine Datei neu
-einrich­
-ten, müssen Sie zuerst die Feldnamen festlegen, zum Beispiel diese:
-
-
- 'Name'
- 'Vorname'
- 'Strasse'
- 'PLZ'
- 'Ort'
- 'Telefon'
- 'Bemerkungen'
-
-
-Ihnen wird jetzt Gelegenheit gegeben, die Feldnamen untereinander
-einzugeben. Zur Korrektur können Sie die gleichen Tasten verwen­
-den wie im Editor (beachten Sie dazu die Statuszeile am oberen
-Bildschirmrand.
- Geben Sie die Namen in dieser Reihenfolge ein. Tippen Sie nach
-jedem Namen die RETURN-Taste, damit der nächste Name in eine
-neue Zeile kommt. Beenden Sie die Eingabe mit ESC 'q'.
- Die folgende Frage ermöglicht es Ihnen, noch weitere Eigen­
-schaften der Felder festzulegen. Dies ist jedoch im Normalfall nicht
-nötig. Beantworten Sie also die Frage mit 'n'. Ihre Datei ist nun
-eingerichtet.
- Wie Sie sehen, besteht das Einrichten einer Datei eigentlich
-nur aus der Eingabe der Feldnamen. Wenn Sie später noch Felder
-anfügen wollen, ist dies ohne weiteres möglich.
-
-
-6.2 Sätze Einfügen
-
-Nachdem die Datei nun eingerichtet worden ist, sollen Sie zunächst
-einige Sätze eingeben. Wenn Sie wieder das Menü 'Einzelsatz' an­
-wählen, sehen Sie nur den leeren Satz mit der Anzeige 'ENDE', der
-das Dateiende markiert. Um neue Sätze aufzunehmen, gibt es die
-Funktion
-#free (0.2)#
-
- E Einfügen
-
-#free (0.2)#
-Wenn Sie diese Funktion aufrufen, geschieht etwas Ähnliches wie
-beim Eingeben des Suchmusters. Der Cursor wandert wieder hinter
-den ersten Feldnamen und in der Statuszeile erscheint die Auffor­
-derung
-
-___________________________________________________________________________________________
-
- SATZ EINFUEGEN: Abbruch: ESC h Beenden: ESC q Hilfe: ESC ?
-___________________________________________________________________________________________
-
-
-Sie können nun die Feldinhalte der einzelnen Felder neben die
-entsprechenden Feldnamen schreiben. Mit der RETURN-Taste schlie­
-ßen Sie eine Zeile ab und gelangen in die nächste.
- Um eventuelle falsche Eingaben zu korrigieren, können Sie
-ähnlich wie im Editor mit den Pfeiltasten herumfahren und falsche
-Eingaben überschreiben. Die Taste RUBOUT löscht falsche Zeichen.
-Sie beenden die Eingabe mit ESC 'q'. Anschließend ist der neue Satz
-vorhanden.
-
-
-#free (4.5)#
-
-#center#Abb. 6-1 Einfügen
-
-
-#on("b")#Wirkung#off("b")# Die Wirkungsweise der Funktion 'Einfügen'
-verdeutlicht
-die Abb. 6-1. Dargestellt ist ein Ausschnitt aus einer Datei mit den
-Sätzen 4 bis 7 und durch Buchstaben dargestellten, beliebigen In­
-halten. Satz 6 sei der aktuelle Satz.
- Beim Einfügen wird nun vor dem aktuellen Satz eine Lücke für
-den neuen Satz geschaffen, die zunächst noch leer ist und dann von
-Ihnen ausgefüllt werden muß. Die Satznummern aller folgenden Sätze
-erhöhen sich um 1.
- Die Leerstelle bleibt nur dann erhalten, wenn Sie Daten für den
-neuen Satz eingeben. Anderenfalls wird nach ESC 'q' wieder der alte
-Zustand hergestellt.
- Dieses Verfahren erklärt auch, warum das Ende der Datei ein
-leerer Pseudosatz ist. Um nämlich am Ende der Datei einen neuen
-Satz anzufügen, muß man vor dem Endesatz einen Satz einfügen.
- Nachdem Sie also jetzt den ersten Satz eingegeben haben,
-müssen Sie sich wieder zum Ende bewegen, damit der nächste Satz
-hinter dem ersten steht. Für diesen häufig benötigten Vorgang gibt
-es eine Abkürzung: Wenn Sie die Eingabe mit ESC 'w' (Weiter) statt
-ESC 'q' beenden, geht EUDAS nach dem Einfügen des Satzes weiter
-zum nächsten und fügt dort wieder einen Satz ein.
- Auf diese Weise können Sie also schnell eine ganze Reihe von
-Sätzen nacheinander eingeben. Nachdem Sie einen Satz eingegeben
-haben, tippen Sie ESC 'w' und können gleich anschließend schon mit
-der Eingabe des nächsten Satzes beginnen. Alle so eingegebenen
-Sätze erscheinen nachher in der Reihenfolge der Eingabe.
-
-#on("b")#Satzeditor#off("b")# Bei der Eingabe eines neuen Satzes haben Sie
-nahezu
-alle Möglichkeiten, die auch der EUMEL-Editor bietet. Der be­
-schreibbare Bereich ist jedoch kleiner. Er umfaßt das ganze Gebiet,
-in dem sonst die Feldinhalte erscheinen.
- Wie beim Editor können Sie den Cursor mit den Cursortasten
-(Pfeiltasten) bewegen. Mit der Taste RUBOUT können Sie ein Zeichen
-löschen. Die restlichen Zeichen der Zeile rücken dann nach. Mit
-RUBIN dagegen schalten Sie in einen Einfügemodus um. Alle einge­
-gebenen Zeichen werden dann eingefügt - der Rest der Zeile rückt
-entsprechend nach rechts. Nochmaliges Tippen von RUBIN schaltet
-wieder in den alten Modus. Welcher Modus eingeschaltet ist, steht
-in der Ãœberschriftzeile.
- Mit der Kombination ESC RUBOUT können Sie den Rest einer
-Zeile ab der Cursorposition löschen. Steht der Cursor in der ersten
-Spalte, wird dementsprechend die ganze Zeile gelöscht. Im Unter­
-schied zum EUMEL-Editor rücken die folgenden Zeilen jedoch nicht
-herauf.
- Entsprechend fügen Sie mit der Funktion ESC RUBIN eine neue
-Zeile ein. Dies ist immer dann erforderlich, wenn ein Feldinhalt
-nicht auf eine Zeile paßt. Der Teil der Zeile, der hinter dem Cursor
-steht, wird bei ESC RUBIN in die neue Zeile mitgenommen.
- Normalerweise tippen Sie ESC RUBIN, wenn Sie an das Ende
-einer Zeile kommen. Wenn Sie aber weiterschreiben, wird die Zeile
-einfach gerollt. Dies ist nicht weiter schlimm, aber Sie können den
-ganzen Feldinhalt nicht auf einmal sehen.
- In der normalen Anzeige wird ein überlanger Inhalt auf jeden
-Fall auf mehrere Zeilen verteilt.
-
-#on("b")#Warnung#off("b")# Ein Hinweis für alle, die sich mit der
-Editorbedienung
-schon auskennen: EUDAS benutzt den Editor als Unterprogramm.
-Jedoch haben einige Editorfunktionen unliebsame Auswirkungen.
-Besonders gefährlich sind hier HOP RUBOUT und HOP RUBIN. Diese
-Funktion zerstören die Korrespondenz zwischen Feldnamen und
-Feldinhalten, das heißt der Feldinhalt steht nicht mehr neben dem
-Feldnamen.
- Weiterhin können Sie das Editorbild rollen, ohne daß die Feld­
-namen mitrollen (zum Beispiel wenn Sie in der untersten Zeile
-RETURN drücken). In diesem Fall ist die Korrespondenz auch nicht
-erhalten, das heißt die Inhalte stehen falsch, sind aber eigentlich
-richtig.
- In solchen Fällen erscheint am oberen oder unteren Rand der
-Hinweis "Bitte ESC '1' druecken". Wenn das Editorbild nur gerollt
-wurde, verschwindet durch ESC '1' der Hinweis wieder und das Bild
-ist in Ordnung. Wenn jedoch Zeilen gelöscht oder eingefügt wurden,
-müssen Sie diese Änderungen von Hand wieder rückgängig machen,
-bis der Hinweis verschwindet. Sie sollten also HOP RUBOUT und HOP
-RUBIN im Satzeditor nicht verwenden.
- Im Zweifelsfall, wenn Sie meinen, den Satz durcheinanderge­
-bracht zu haben, können Sie immer mit ESC 'h' abbrechen. Es steht
-dann der vorherige Zustand für einen neuen Versuch zur Verfügung.
-
-
-6.3 Daten ändern
-
-Wenn Sie nachträglich noch eingegebene Daten ändern wollen, kön­
-nen Sie die Funktion
-#free (0.2)#
-
- A Ändern
-
-#free (0.2)#
-verwenden. Sie haben anschließend wie beim Einfügen Gelegenheit,
-neue Daten einzugeben. Allerdings werden Ihnen die bisherigen
-Daten gleich mit angeboten, so daß Sie nur die Änderungen ein­
-geben müssen. Alles andere kann unverändert bleiben. Auch diese
-Funktion wird mit ESC 'q' verlassen. ESC 'w' funktioniert beim
-Ändern ebenfalls (der nächste Satz wird zum Ändern angeboten).
- Stellen Sie beim Ändern oder Einfügen fest, daß Sie irgendeinen
-krassen Fehler gemacht haben, können Sie die Operation mit ESC 'h'
-abbrechen. Beim Ändern bleibt dann der alte Zustand unverändert,
-beim Einfügen wird kein Satz eingefügt.
-
-#on("b")#Löschen#off("b")# Für den Fall, daß Sie einen Satz wieder ganz aus
-der
-Datei löschen wollen, hat EUDAS eine besondere Vorsichtsmaßnahme
-vorgesehen. Damit der Satz nicht gleich unwiederbringlich verloren­
-geht, müssen Sie ihn zunächst in eine andere Datei #on("i")#tragen#off("i")#. Falls
-das Löschen ein Irrtum war, können Sie den Satz von dort noch
-wiederholen. In vielen Fällen besteht ohnehin die Anforderung, daß
-auch die nicht mehr aktuellen Daten noch eine gewisse Zeit aufge­
-hoben werden müssen.
- Zum Tragen gibt es die Funktion
-
-
- Datensatz
- T Tragen
-
-
-Sie werden nach einem Dateinamen gefragt. Geben Sie hier zum
-Beispiel 'müll' an. Da diese Datei noch nicht existiert, werden Sie
-gefragt, ob Sie sie neu einrichten wollen (falls Sie sich vielleicht
-verschrieben haben). Danach wird der aktuelle Satz in die Datei
-'müll' transportiert. Am Bildschirm erscheint der nächste Satz. Der
-getragene Satz kommt an das Ende der Zieldatei.
- Eine Bedingung beim Tragen ist, daß die Zieldatei immer die
-gleichen Felder haben muß wie die aktuelle Datei. Sie können also
-nicht aus verschieden strukturierten Dateien in die gleiche Datei
-tragen.
- Zum Zurückholen eines Satzes benutzen Sie die Funktion
-
-
- Datensatz
- H Holen
-
-
-Der letzte Satz der Datei, die Sie angeben, wird vor dem aktuellen
-Satz eingefügt. Dadurch wird der Effekt des letzten Tragens wieder
-aufgehoben.
- Um die getragenen Sätze endgültig zu vernichten, müssen Sie
-die Zieldatei als Ganzes löschen. Die dazu notwendige Funktion aus
-dem Menü 'Dateien' haben Sie bereits in Abschnitt 4.4 kennenge­
-lernt.
-
-
-6.4 Arbeitskopie sichern
-
-Wenn Sie eine Datei zum Ändern öffnen oder sie gerade neu einge­
-richtet haben, wird von dieser Datei intern eine Arbeitskopie ange­
-legt, die dann geändert wird. Sie müssen diese Arbeitskopie nach
-den Änderungen sichern, damit die Änderungen wirksam werden.
- In unserem Beispiel ist die Datei "Telefonnummern" immer noch
-leer. Die Änderungen sind momentan nur in der internen Kopie
-vorhanden. Wenn Sie die Datei zum Beispiel auf eine Archivdiskette
-schreiben wollten, würden Sie eine leere Datei auf der Diskette
-haben.
- Zum Sichern rufen Sie die Funktion
-#free (0.2)#
-
- S Sichern
-
-#free (0.2)#
-im ersten Menü auf. Es erscheint dann folgende Frage:
-
-___________________________________________________________________________________________
-
- Arbeitskopie "Telefonnummern" veraendert! Sichern (j/n) ?
-___________________________________________________________________________________________
-
-
-Beantworten Sie diese Frage mit 'j'. Als nächstes wird gefragt:
-
-___________________________________________________________________________________________
-
- Alte Version überschreiben (j/n) ?
-___________________________________________________________________________________________
-
-
-Beantworten Sie auch diese Frage mit 'j'. Die Arbeitskopie über­
-schreibt dann die (leere) Version vor dem Ändern.
- Wenn Sie die Frage verneint hätten, könnten Sie anschließend
-einen neuen Namen für die Arbeitskopie angeben. Dies wäre dann
-sinnvoll, wenn Sie den Stand vor den Änderungen noch aufbewahren
-wollen. In diesem Fall ist es jedoch nutzlos, die alte leere Datei
-noch behalten zu wollen.
- Abschließend wird gefragt, ob Sie die Arbeitskopien löschen
-wollen. Wenn Sie noch weiter mit der Datei arbeiten wollen, vernei­
-nen Sie diese Frage. Die Datei bleibt dann geöffnet. Anderenfalls
-müßten Sie die Datei neu öffnen, wenn Sie sie wieder ansehen wol­
-len.
-
-#on("b")#Arbeitskopien#off("b")# Es ist sehr wichtig, daß Sie sich die
-Funktionsweise
-mit der Arbeitskopie immer vor Augen halten, damit Sie später bei
-der Arbeit mit EUDAS nicht überrascht werden.
- Eine Arbeitskopie wird immer dann angelegt, wenn Sie beim
-Öffnen einer EUDAS-Datei angeben, daß Sie diese Datei ändern
-wollen. In dem Beispiel haben Sie eine neue Datei eingerichtet.
-EUDAS nimmt dann automatisch an, daß Sie ändern wollen. Öffnen
-Sie eine existierende Datei, werden Sie gefragt
-
-___________________________________________________________________________________________
-
- Wollen Sie etwas ändern (Arbeitskopie anlegen) (j/n) ?
-___________________________________________________________________________________________
-
-
-Wenn Sie diese Frage verneinen, wird keine Arbeitskopie angelegt;
-alle Änderungsfunktionen werden jedoch gesperrt. Daran können Sie
-auch erkennen, daß keine Arbeitskopie vorliegt.
- Die Arbeitskopie, die EUDAS sich anlegt, ist anonym. Wenn Sie
-sich also im Menü 'Dateien' eine Übersicht zeigen lassen, erscheint
-nur das Original. Bevor Sie mit diesem Original etwas anstellen
-(zum Beispiel auf Archiv schreiben), sollten Sie sich vergewissern,
-daß Sie die Arbeitskopie gesichert haben, da das Original sonst
-nicht auf dem neuesten Stand ist.
- Um Sie in diesem Fall zu warnen, erscheint vor einer geöffneten
-Datei in einer Dateiauswahl das Symbol <!>, zum Beispiel:
-
-
- o <!> "Telefonnummern"
- o "Mitglieder"
-
-
-Wenn Sie dieses Symbol sehen, sollten Sie die Datei lieber erst
-sichern, bevor Sie etwas mit ihr anstellen.
-
-#on("b")#Beispiel#off("b")# Um die Arbeitsweise von EUDAS noch besser zu
-verstehen,
-betrachten Sie das Beispiel in Abb. 6-2. Nehmen Sie an, Sie haben
-drei EUDAS-Dateien 'Kalender', 'Namen' und 'Adressen' mit ihren
-Anfangsinhalten K0, N0 und A0 (symbolisch). In dem Diagramm sind
-die Vorgänge zu den Zeitpunkten 0 bis 10 mit ihren Auswirkungen
-auf die Inhalte der Dateien und der Arbeitskopie dargestellt.
-
-
-#free (5.5)#
-#center#Abb. 6-2 Beispiel zur Arbeitskopie
-
-
-Zu den einzelnen Zeitpunkten passiere folgendes:
-
-0: Anfangszustand. Es wurde noch keine Datei geöffnet, also ist
- keine Arbeitskopie vorhanden. Es könnte aber auch eine
- beliebige Datei ohne Änderungserlaubnis geöffnet sein.
-#free (0.2)#
-1: Die Datei 'Adressen' wird geöffnet zum Ändern. Der momen­
- tane Zustand der Datei wird als Arbeitskopie übernommen.
-#free (0.2)#
-2: Es wird eine Änderung vorgenommen (zum Beispiel) ein Satz
- eingefügt). Diese Änderung betrifft aber nur die Kopie - die
- Datei 'Adressen' als Original bleibt unverändert.
-#free (0.2)#
-3: Eine weitere Änderung führt zum Inhalt A2 der Arbeitsko­
- pie.
-#free (0.2)#
-4: Aufruf von 'Sichern'. Die alte Version von 'Adressen' wird
- überschrieben und durch den Inhalt A2 ersetzt. Die Frage
- nach dem Löschen der Arbeitskopie wird verneint; daher bleibt
- die Kopie auch erhalten.
-#free (0.2)#
-5: Die Kopie wird erneut verändert.
-#free (0.2)#
-6: Aufruf von 'Sichern'. Die Frage, ob die Kopie gesichert wer­
- den soll, wird verneint. Die Arbeitskopie soll jedoch gelöscht
- werden. Als Ergebnis geht die Änderung A3 verloren (viel­
- leicht war diese Änderung ein Irrtum). Die Datei 'Adressen'
- wird nicht verändert. Es ist keine Arbeitskopie mehr vor­
- handen.
-#free (0.2)#
-7: Die Datei 'Namen' wird zum Ändern geöffnet.
-#free (0.2)#
-8: Die Datei 'Kalender' wird zum Ändern geöffnet. Da an der
- vorigen Arbeitskopie keine Änderungen vorgenommen wurden,
- kann die Kopie einfach überschrieben werden. Anderenfalls
- wäre an dieser Stelle die Möglichkeit zum Sichern angeboten
- worden.
-#free (0.2)#
-9: Es wird eine Änderung durchgeführt.
-#free (0.2)#
-10: Die geänderte Arbeitskopie wird gesichert, das Original über­
- schrieben und die Arbeitskopie gelöscht (Normalfall).
-
-
diff --git a/doc/eudas/eudas.hdb.7 b/doc/eudas/eudas.hdb.7
deleted file mode 100644
index d6f1bf3..0000000
--- a/doc/eudas/eudas.hdb.7
+++ /dev/null
@@ -1,687 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (61)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-7 Ausdrucken der Daten
-
-
-
-7.1 Druckmuster
-
-Nachdem Sie sich die Inhalte der EUDAS-Datei ausgiebig am Bild­
-schirm angesehen haben, möchten Sie die gespeicherten Daten sicher
-auch in gedruckter Form auf Papier sehen. Sie können eine
-EUDAS-Datei jedoch nicht ohne weiteres ausdrucken, da sie eine
-andere Struktur als normale Textdateien hat.
- Vor dem Drucken müssen also die Inhalte der EUDAS-Datei
-zunächst in lesbarer Form in eine Textdatei geschrieben werden.
-EUDAS kann diese Aufgabe jedoch ohne Ihre Hilfe nicht alleine be­
-wältigen.
- Es taucht nämlich das Problem auf, daß die Dateiinhalte in
-vielen verschiedenen Formen dargestellt werden können (Sie erin­
-nern sich sicher noch an das erste Kapitel). Vielleicht wollen Sie
-bestimmte Überschriften haben oder die Daten müssen auf ein be­
-stimmtes Formular passen.
- Um die Ausgabe nach Ihren Wünschen zu gestalten, müssen Sie
-also dem Rechner genau angeben, an welcher Stelle welche Felder
-gedruckt werden sollen usw. Dies geht am einfachsten, indem Sie
-dem Rechner ein Muster vorsetzen, nach dem er dann die richtigen
-Ausdrucke erstellen kann. Dieses Muster schreiben Sie in eine eige­
-ne Textdatei, die #on("i")#Druckmuster#off("i")# genannt wird. Aus den Daten der
-EUDAS-Datei und der Form, die im Druckmuster angegeben ist, wird
-dann eine weitere Textdatei erzeugt, die die Daten in der ge­
-wünschten Form enthält und die anschließend automatisch gedruckt
-werden kann.
- Durch ein Druckmuster erhalten Sie fast völlige Freiheit in der
-Gestaltung Ihrer Ausdrucke. Zum Beispiel können aus einer einzigen
-Adressendatei einfache Listen, Einladungskarten oder Rundbriefe
-erzeugt werden. Für eine einfache Adressenliste entspricht das
-Druckmuster einer Zeile der Liste, wobei angegeben wird, in welche
-Spalten die Inhalte gedruckt werden. Zum Drucken von Einladungs­
-karten wird als Druckmuster eine Einladungskarte verwendet, in der
-die Stellen markiert sind, an denen die Adresse erscheinen soll. Das
-gleiche kann man mit einem Brief machen, der dann mit jeder
-Adresse einmal ausgedruckt wird.
-
-#on("b")#Druckverfahren#off("b")# Man kann sich diesen Druckprozeß wie folgt
-vorstellen:
-
-
-#free (6.5)#
-
-#center#Abb. 7-1 Druckverfahren
-
-
-Vereinfacht gesagt (das genaue Verfahren wird später beschrieben)
-wird für jeden Satz der EUDAS-Datei das Druckmuster einmal in die
-Druckdatei übernommen. Dabei werden die Inhalte aus der EUDAS-
-Datei in einer noch anzugebenden Weise an den gewünschten Stellen
-eingefügt.
- Im weiteren sollen Sie erfahren, wie ein Druckmuster genau
-aussieht und wie daraus ein Ausdruck entsteht.
-
-#on("b")#Beispiel#off("b")# Im folgenden sollen Sie zur Demonstration die
-bereits in
-Kapitel 3 und 4 beschriebene Beispieldatei verwenden. Nach Mög­
-lichkeit sollten Sie die angegebenen Beispiele mit dieser Datei
-selbst am Rechner ausprobieren.
-
-Folgende Sätze befinden sich in der Datei:
-
-
- Vorname Name, Strasse, PLZ Ort, m/w
- -------------------------------------------------------
- Herbert Wegner, Krämergasse 12, 5000 Köln, m
- Helga Sandmann, Willicher Weg 109, 5300 Bonn 1, w
- Albert Katani, Lindenstr. 3, 5210 Troisdorf, m
- Peter Ulmen, Mozartstraße 17, 5 Köln 60, m
- Karin Regmann, Grengelweg 44, 5000 Köln 90, w
- Hubert Arken, Talweg 12, 5200 Siegburg, m
- Anna-Maria Simmern, Platanenweg 67, 5 Köln 3, w
- Angelika Kaufmann-Drescher, Hauptstr. 123, 53 Bonn 2, w
- Harald Fuhrmann, Glockengasse 44, 5000 Köln 1, m
- Friedrich Seefeld, Kabelgasse, 5000 Köln-Ehrenfeld, m
-
-
-Wie Sie sehen, wurde die Reihenfolge der Felder gegenüber der Datei
-teilweise verändert und Name und Vorname ohne Komma hinterein­
-andergeschrieben, während die anderen Feldinhalte durch Komma
-getrennt sind. Diese Liste wurde unter Verwendung eines Druck­
-musters erzeugt.
- Da dieses Druckmuster jedoch vorerst noch zu kompliziert ist,
-sollen Sie erst einmal ein einfacheres Druckmuster erstellen und
-versuchen, nur die Namen aus der Datei in Tabellenform auszuge­
-ben.
- Das dafür nötige Druckmuster hat folgendes Aussehen:
-
-
- % WIEDERHOLUNG
- ! &Name ! &Vorname !
-
-
-Das Druckmuster besteht nur aus zwei Zeilen, von der die zwei­
-te das eigentliche Muster darstellt. Die erste Zeile ist eine #on("i")# Anwei­
-sung#off("i")# an den Druckgenerator. 'WIEDERHOLUNG' gibt an, daß die
-folgenden Zeilen für jeden Satz wiederholt werden sollen (warum
-diese Angabe notwendig ist, werden Sie später einsehen). Das Pro­
-zentzeichen kennzeichnet eine Anweisung und muß unbedingt in der
-ersten Spalte des Druckmusters stehen, also ganz am linken Rand.
- In der zweiten Zeile ist zu sehen, daß das Zeichen '&' dazu
-benutzt wird, die Stellen zu markieren, an denen nachher Feldin­
-halte eingesetzt werden sollen. Hinter dem '&'-Zeichen folgt der
-Name des Feldes, das an dieser Stelle eingesetzt werden soll. Eine
-solche Konstruktion wird #on("i")#Feldmuster#off("i")# genannt. Beachten Sie, daß
-Feldnamen hier immer ohne Anführungsstriche geschrieben werden
-müssen. Die Ausrufungszeichen bilden den eigentlichen Mustertext
-und werden unverändert als Tabellenbegrenzung in die Ausgabe
-übernommen.
- Als Ergebnis des Druckprozesses sollte folgende Ausgabe auf
-dem Drucker erscheinen:
-
-
- ! Wegner ! Herbert !
- ! Sandmann ! Helga !
- ! Katani ! Albert !
- ! Ulmen ! Peter !
- ! Regmann ! Karin !
- ! Arken ! Hubert !
- ! Simmern ! Anna-Maria !
- ! Kaufmann-Drescher ! Angelika !
- ! Fuhrmann ! Harald !
- ! Seefeld ! Friedrich !
-
-
-Sie können erkennen, daß die Feldmuster in der Ausgabe jeweils
-durch den Inhalt des zugehörigen Feldes ersetzt worden sind. Der
-übrige Text in der Musterzeile ist unverändert geblieben. Beachten
-Sie, daß das '&' ein reserviertes Zeichen ist, das ein Feldmuster im
-umgebenden Text kennzeichnet und daher (vorerst) nicht gedruckt
-werden kann.
-
-
-7.2 Aufruf
-
-In diesem Abschnitt sollen Sie erfahren, wie Sie diese Ausgabe
-selbst erzeugen können. Damit der Druckgenerator arbeiten kann,
-müssen Sie die Datei 'Adressen' erst einmal öffnen. Anschließend
-wählen Sie das Menü 'Drucken' an.
-
-#on("b")#Druckmuster erstellen#off("b")# Als nächstes müssen Sie das
-Druckmuster erstellen. Hierfür gibt es die Funktion
-#free (0.2)#
-
- Textdatei
- E Editieren
-
-#free (0.2)#
-da das Druckmuster eine normale Textdatei ist.
- Wählen Sie diese Funktion. Sie werden dann nach einem Namen
-für das Druckmuster gefragt. Wir wollen das Druckmuster 'Namens­
-liste' nennen - Sie können aber auch einen beliebigen anderen
-Namen wählen. Denken Sie daran, die Anführungsstriche nicht mit
-einzugeben.
- Es erscheint anschließend das gewohnte Editorbild mit einer
-entsprechenden Statuszeile. Geben Sie die zwei Zeilen des Druck­
-musters ein und beenden Sie den Editor mit ESC 'q'. Damit ist das
-Druckmuster fertig.
-
- Die hier beschriebene Funktion können Sie nicht nur zum Er­
-stellen, sondern auch zum Ändern und einfachen Ansehen eines
-Druckmusters bzw. einer Textdatei allgemein verwenden. Es wird
-Ihnen immer der jeweilige Inhalt präsentiert, den Sie dann nach
-Belieben abändern können oder nicht.
-
-___________________________________________________________________________________________
-
- EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv
- --------------:
- Satzauswahl :
- D Drucken :
- --------------:
- Druckausgabe :
- R Richtung :
- --------------:
- Textdatei :
- E Editieren :
- A Ausdrucken :
- N Nachbearb. :
- --------------:
-
-___________________________________________________________________________________________
-
-#center#Abb. 7-2 Menü "Drucken"
-
-
-#on("b")#Ausgaberichtung#off("b")# Bevor Sie jetzt weitermachen, sollten Sie
-über­
-prüfen, ob an Ihrem System ein Drucker angeschlossen ist. Der
-Drucker sollte bei den folgenden Versuchen betriebsbereit sein.
- Ist kein Drucker angeschlossen oder wollen Sie kein Papier
-verschwenden, haben Sie die Möglichkeit, den Ausdruck als Text­
-datei zu erhalten. Dazu wählen Sie die Funktion
-#free (0.2)#
-
- Ausgabe
- R Richtung
-
-#free (0.2)#
-an. Beantworten Sie beide Fragen, die Ihnen gestellt werden, mit
-'n'. Die Ausgaben stehen dann nachher in Dateien mit einem Namen
-der Form
-#free (0.2)#
-
- Namensliste.a$n
-
-#free (0.2)#
-die Sie sich mit der oben beschriebenen Funktion dann genau wie
-ein Druckmuster anschauen können. Der Name besteht also aus dem
-Namen des Druckmusters, dem ein '.a$' angehängt wird. Die Nummer
-'n' dient zur Unterscheidung bei mehreren aufeinanderfolgenden
-Ausgaben. Um Verwirrung zu vermeiden, sollten Sie die Datei nach
-dem Anschauen löschen (im Menü 'Dateien').
-
-#on("b")#Druckaufruf#off("b")# Wenn Sie diese Hinweise beachtet haben, können
-Sie den Druckvorgang mit der Auswahl
-#free (0.2)#
-
- Satzauswahl
- D Drucken
-
-#free (0.2)#
-starten. Sie werden hier nach dem Namen des Druckmusters gefragt,
-das Sie verwenden wollen (Sie können ja durchaus eine ganze Reihe
-von verschiedenen Druckmustern haben).
- Sie können den Ablauf des Druckvorganges daran verfolgen,
-daß jeweils die Nummer des Satzes ausgegeben wird, der gerade
-bearbeitet wird. Probieren Sie eventuell auch kleine Abwandlungen
-des Druckmusters aus, indem Sie die Tabellenspalten schmaler oder
-breiter machen oder die Ausrufungszeichen durch ein anderes Zei­
-chen ersetzen (je nach Geschmack).
-
-#on("b")#Ausgabedatei#off("b")# Wollen Sie die erzeugte Ausgabe (die in der
-Datei
-'Namensliste.a$1' steht) irgendwann tatsächlich ausdrucken, ver­
-wenden Sie die Funktion
-#free (0.2)#
-
- A Ausdrucken
-
-#free (0.2)#
-Sie werden dann nach dem Namen der Textdatei gefragt. Beachten
-Sie, daß Sie diese Funktion #on("i")#nicht#off("i")# zum Drucken von EUDAS-Dateien
-verwenden können, da aus einer EUDAS-Datei erst eine Druckdatei
-erzeugt werden muß.
- Auch wenn Sie angegeben haben, daß die Ausgabe des Druck­
-prozesses direkt ausgedruckt werden soll, startet Ihr Drucker erst,
-wenn EUDAS die ganze Datei durchgegangen ist und der Vorgang für
-Sie beendet ist. Dies liegt am EUMEL-System, das nur vollständige
-Druckaufträge entgegennimmt, damit sich mehrere Benutzer nicht in
-die Quere kommen können. In einem Multi-User-System können Sie
-weiterarbeiten, während der Drucker beschäftig ist.
-
-#on("b")#Fehler#off("b")# Bevor der eigentliche Druckprozeß gestartet wird,
-wird das
-Druckmuster auf unsinnige oder unverständliche Konstruktionen
-überprüft. Ist dem Druckgenerator etwas suspekt, gibt er eine Feh­
-lermeldung aus, in der die fragliche Situation von seiner Seite aus
-beschrieben wird. Er kann natürlich nicht Ihren Fehler "verstehen".
-Daher müssen Sie unter Umständen eine Fehlermeldung erst inter­
-pretieren, ehe Sie die wahre Ursache erkennen können.
- Damit Sie einen aufgetretenen Fehler gleich korrigieren können,
-werden Ihnen das Druckmuster und die Fehlermeldungen parallel auf
-dem Bildschirm zum Ändern und Anschauen angeboten. Sie können
-mit dem Editor das Druckmuster ändern und in den Fehlermeldungen
-blättern. Diese Konfiguration wird Paralleleditor genannt. Mit ESC
-'w' wechseln Sie zwischen den beiden Bildschirmhälften.
-
-#on("b")#Suchbedingung#off("b")# Wollen Sie nicht alle Namen ausdrucken, so
-können
-Sie vorher ein Suchmuster einstellen, das nur auf die gewünschten
-Namen zutrifft (wie im Kapitel 5 beschrieben). Der Druckgenerator
-richtet sich immer nach dem aktuell eingestellten Suchmuster und
-druckt nur die ausgewählten Sätze. Wenn Sie zum Beispiel die Na­
-men aller Frauen ausdrucken wollen, stellen Sie im Tastenmodus ein
-Suchmuster ein (das sollten Sie können), das für das Feld 'm/w' die
-Bedingung 'w' enthält. Danach können Sie den Druckgenerator auf­
-rufen. Vergessen Sie nicht, das Suchmuster anschließend wieder zu
-löschen.
-
-#on("b")#Feldnamen abfragen#off("b")# Wenn Sie selber ein Druckmuster
-erstellen,
-wird es häufiger vorkommen, daß Sie die genaue Schreibweise der
-Feldnamen nicht im Kopf haben. Für diesen Zweck definiert EUDAS
-im Editor eine spezielle Tastenkombination.
- Wenn Sie dort ESC 'F' tippen (großes 'F'), erhalten Sie eine
-Auswahl aller Felder der gerade geöffneten Datei. Sie können sich
-die Namen einfach ansehen, aber auch direkt in den Text des
-Druckmusters übernehmen.
- Wenn Sie nämlich vor dem Verlassen der Auswahl mit ESC 'q'
-ein Feld ankreuzen, wird anschließend der Name in Anführungs­
-strichen an die Position geschrieben, an der vor dem Aufruf der
-Cursor stand. Auf diese Weise können Sie sich auch das Tippen
-langer Feldnamen vereinfachen.
- Beachten Sie, daß Sie im Normalfall im Druckmuster die Anfüh­
-rungsstriche wieder entfernen müssen. Die Anführungsstriche dienen
-zur Abgrenzung, wie weit der Feldname geht. Falls der Name Leer­
-zeichen enthält, beachten Sie bitte den Absatz 'Abgrenzung der
-Feldnamen' in Abschnitt 7.4.
-
-
-7.3 Abschnitte
-
-Die Tabellen, die Sie bis jetzt erzeugen können, sehen optisch noch
-nicht sehr gut aus. Es fehlt auf jeden Fall eine vernünftige Über­
-schrift. Um eine Überschrift zu erzeugen, können Sie im Druckmuster
-einen #on("i")#Vorspann#off("i")# definieren, der ganz zu Anfang einmal gedruckt
-wird.
- Dieser Vorspann wird durch die Anweisung
-
-
- % VORSPANN
-
-
-eingeleitet (bitte nicht vergessen, daß das '%'-Zeichen für eine
-Anweisung in der ersten Spalte stehen muß). Die folgenden Zeilen
-bis zur 'WIEDERHOLUNG'-Anweisung gehören zum Vorspann. Ein
-Druckmuster für unsere Namensliste mit Überschrift könnte dann so
-aussehen:
-
-
- % VORSPANN
- Alle Namen aus der EUDAS-Datei 'adressen'
- -----------------------------------------
- % WIEDERHOLUNG
- ! &Name ! &Vorname !
-
-
-Der Druckgenerator erzeugt mit diesem Druckmuster die gewünschte
-Liste mit Überschrift. Sie können als Vorspann natürlich auch einen
-beliebigen anderen Text verwenden.
- In einer analogen Weise können Sie die Liste noch durch eine
-waagerechte Linie abschließen, indem Sie einen #on("i")#Nachspann#off("i")# definie­
-ren. Die dafür notwendige Anweisung heißt
-
-
- % NACHSPANN
-
-
-Die Zeilen nach dieser Anweisung werden gedruckt, nachdem alle
-Sätze bearbeitet worden sind. Das folgende Druckmuster erzeugt
-schon eine sehr schöne Liste:
-
-
- % VORSPANN
- Alle Namen aus der EUDAS-Datei 'adressen'
- -----------------------------------------
- % WIEDERHOLUNG
- ! &Name ! &Vorname !
- % NACHSPANN
- -----------------------------------------
-
-
-nämlich:
-
-
- Alle Namen aus der EUDAS-Datei 'adressen'
- -----------------------------------------
- ! Wegner ! Herbert !
- ! Sandmann ! Helga !
- ! Katani ! Albert !
- ! Ulmen ! Peter !
- ! Regmann ! Karin !
- ! Arken ! Hubert !
- ! Simmern ! Anna-Maria !
- ! Kaufmann-Drescher ! Angelika !
- ! Fuhrmann ! Harald !
- ! Seefeld ! Friedrich !
- -----------------------------------------
-
-
-Die drei Teile, aus denen ein Druckmuster bestehen kann (Vorspann,
-Nachspann und Wiederholungsteil), werden #on("i")#Abschnitte#off("i")# genannt. Wie
-Sie später noch sehen werden, haben Abschnitte eine Reihe von
-gemeinsamen Eigenschaften. Ein Abschnitt wird durch eine eigene
-Anweisung eingeleitet und endet, wenn ein anderer Abschnitt be­
-ginnt oder das Druckmuster zu Ende ist. Alle Abschnitte können
-auch weggelassen werden, irgendein Abschnitt muß aber immer
-vorhanden sein. So ist es zum Beispiel möglich, ein Druckmuster zu
-bauen, das nur aus einem Nachspann besteht (Sie werden allerdings
-jetzt noch nicht verstehen können, warum so etwas sinnvoll sein
-kann).
- Zum Abschluß dieses Kapitels hier noch einmal eine Übersicht
-der bisher vorgestellten Anweisungen:
-
-
- Anweisung ! Bedeutung
- ---------------+----------------------------------
- % VORSPANN ! leitet Vorspann ein
- % WIEDERHOLUNG ! leitet Wiederholungsteil ein
- % NACHSPANN ! leitet Nachspann ein
-
-
-
-7.4 Feldmuster
-
-Mit den bis jetzt beschriebenen Möglichkeiten des Druckgenerators
-können Sie schon sehr viel anfangen. Es fehlt aber noch die Mög­
-lichkeit, mehrere Feldinhalte direkt hintereinander zu schreiben,
-egal wie lang diese Inhalte sind. Diese Fähigkeit wird zum Beispiel
-für die anfangs vorgestellte Liste benötigt.
-
-#on("b")#Variable Position#off("b")# Die Feldmuster, die Sie bis jetzt
-kennen, begin­
-nen mit einem '&'-Zeichen und werden immer genau an der Stelle
-gedruckt, an der sie stehen (feste Position). Sie können ein Feld­
-muster aber auch mit '%' beginnen lassen. In diesem Fall kann der
-Inhalt verschoben werden (variable Position), je nachdem, ob vorhe­
-rige Inhalte kürzer oder länger sind.
- '%' ist wie '&' ein reserviertes Zeichen, kann also nicht direkt
-gedruckt werden. Da '&' und '%' Feldmuster einleiten, heißen sie
-#on("i")#Musterzeichen#off("i")#.
- Um Feldmuster variabler Position einmal auszuprobieren, soll­
-ten Sie unser bisheriges Druckmuster in der folgenden Weise um­
-schreiben:
-
-
- % WIEDERHOLUNG
- &Vorname %Name
-
-
-(Vorspann und Nachspann der Einfachheit halber mal weggelassen).
-Als Ergebnis erhalten wir:
-
-
- Herbert Wegner
- Helga Sandmann
- Albert Katani
- Peter Ulmen
- Karin Regmann
- Hubert Arken
- Anna-Maria Simmern
- Angelika Kaufmann-Drescher
- Harald Fuhrmann
- Friedrich Seefeld
-
-
-Das Feldmuster '%Name' ist also entsprechend der Länge des Vor­
-namens nach links oder nach rechts gerutscht. Zu beachten ist, daß
-ein Feldmuster mit '%' nicht in der ersten Spalte stehen darf, denn
-dann würde die Zeile als Anweisung angesehen. Ein Feldmuster
-variabler Position wäre ja auch in der ersten Spalte wenig sinnvoll.
-
-#on("b")#Feste Länge#off("b")# Außer den beiden bisher besprochenen einfachen
-Arten (mit '&' oder '%') gibt es noch weitere Ausprägungen von
-Feldmustern für besondere Fälle. Wird ein Feldmuster noch von
-weiteren Musterzeichen gefolgt, dann wird dieses Feldmuster immer
-in der reservierten Länge eingesetzt. Die reservierte Länge reicht
-vom ersten bis zum letzten Musterzeichen. Durch die zusätzlichen
-Musterzeichen wird also ein bestimmter Platz freigehalten.
- Ersetzt man im obigen Druckmuster '&Vorname' durch
-'&Vorname&&', wird der Effekt des folgenden '%'-Feldes wieder
-aufgehoben, da jetzt für alle Vornamen die gleiche Länge verwendet
-wird (Probieren Sie dies aus).
- Bei einem solchen Feldmuster mit fester Länge wird der Inhalt
-abgeschnitten, falls er diese Länge überschreitet; ist der Inhalt
-kürzer, wird rechts mit Leerstellen aufgefüllt. Aber auch bei Feld­
-mustern mit variabler Länge (also ohne folgende Musterzeichen)
-kann abgeschnitten werden, nämlich genau dann, wenn der Inhalt so
-lang ist, daß ein folgendes Feld mit fester Position (mit '&' anfan­
-gend) überschrieben würde. Hätten wir also in unserem ersten
-Druckmuster nicht genügend Platz für die Spalten vorgesehen,
-wären einige Namen abgeschnitten worden (probieren Sie es nochmal
-aus, falls es Ihnen nicht schon passiert ist).
- In einem weiteren Fall werden Feldmuster variabler Länge
-abgeschnitten, nämlich wenn die generierte Zeile die maximale
-Zeilenlänge überschreitet. Die maximale Zeilenlänge richtet sich
-nach dem Dateilimit, das für das Druckmuster eingestellt ist. Nor­
-malerweise ist dies 77, so daß Sie in Normalschrift die Zeilenbreite
-auf einem DIN A4-Blatt nicht überschreiten.
- Benutzen Sie jedoch breites Papier oder eine schmale Schrift,
-sollten Sie während der Eingabe des Druckmusters ESC ESC tippen
-und das Kommando
-
-
- limit (135)
-
-
-eingeben. EUDAS nutzt dann die volle Zeilenbreite aus.
-
-#on("b")#Rechtsbündig#off("b")# Sie sind jetzt aber noch nicht zu Ende mit
-den
-Feldmustervariationen. Eine letzte Möglichkeit besteht darin, den
-Inhalt rechtsbündig in ein Feldmuster einzusetzen. Dies hat natür­
-lich nur Sinn bei fester Länge. Man erreicht dies dadurch, daß man
-das Feldmuster mit mehreren Musterzeichen beginnen läßt. So ist
-
-
- %%Vorname%
-
-
-die rechtsbündige Version von
-
-
- %Vorname%%
-
-
-Beide Feldmuster sind gleich lang, beim ersten wird jedoch am lin­
-ken Rand aufgefüllt oder abgeschnitten, beim zweiten dagegen am
-rechten Rand.
-
-#on("b")#Zusammenfassung#off("b")# Hier noch einmal eine Zusammenstellung
-aller möglichen Feldmustertypen:
-
-
- Typ ! Beispiel ! Position ! Länge ! bündig
- ----+-----------+------------------------------
- 1 ! &Name ! fest ! variabel ! links
- 2 ! %Name ! variabel ! variabel ! links
- 3 ! &Name&&& ! fest ! fest ! links
- 4 ! %Name%%% ! variabel ! fest ! links
- 5 ! &&&Name& ! fest ! fest ! rechts
- 6 ! %%%Name% ! variabel ! fest ! rechts
-
-
-Wir können zusammenfassen:
-#free (0.2)#
-* Feldmuster dienen im Druckmuster dazu, Stellen zu markieren, an
- denen Inhalte eingesetzt werden sollen.
-#free (0.2)#
-* Feldmuster beginnen mit einem Musterzeichen ('&' oder '%');
- darauf folgt der Feldname.
-#free (0.2)#
-* Durch '&' wird feste und durch '%' variable Position festgelegt.
-#free (0.2)#
-* Durch zusätzliche Musterzeichen kann eine feste Länge angege­
- ben werden; mehrere Musterzeichen am Anfang führen zu rechts­
- bündigem Einsetzen.
-
-#on("b")#Abgrenzung der Feldnamen#off("b")# Als nächstes sollen Sie den Fall
-be­
-trachten, daß Sie einen Namen in der oft auftretenden Form
-
-
- Name, Vorname
-
-
-schreiben wollen. Die Schwierigkeit liegt in dem Komma, das direkt
-hinter dem Namen folgen soll. Sie könnten versuchen, diese Situa­
-tion im Druckmuster folgendermaßen darzustellen:
-
-
- % WIEDERHOLUNG
- &Name, %Vorname
-
-
-In diesem Fall erhalten Sie aber die Fehlermeldung
-
-
- FEHLER in Zeile 2 bei >>Name,<<
- diese Abkuerzung ist nicht definiert
-
-
-Wenn Sie sich nicht genau vorstellen können, wie der Druckgenera­
-tor ein Feldmuster liest, wird Ihnen dieser Fehler mysteriös er­
-scheinen, denn 'Name' ist doch als Feld definiert (was eine Abkür­
-zung ist, werden Sie in Kapitel 13 lernen). Den entscheidenden
-Hinweis liefert jedoch das Komma. Offensichtlich hat der Druck­
-generator das Komma als Teil des Feldnamens angesehen.
- Dies liegt daran, daß ja irgendwann der Feldname in einem
-Feldmuster beendet sein muß. Normalerweise interpretiert der
-Druckgenerator ein Leerzeichen oder Musterzeichen als Ende des
-Namens, alle vorherigen Zeichen gehören mit zum Feldnamen. Wenn
-nun aber nach dem Feldmuster kein Leerzeichen folgen soll (wie in
-unserem Beispiel) oder der Feldname selbst Leerzeichen enthält
-(dies ist ja erlaubt, könnte aber im Druckmuster nie erkannt wer­
-den), muß noch eine zusätzliche Angabe erfolgen.
- In solchen Fällen kann der Feldname in spitze Klammern einge­
-schlossen werden. Der Druckgenerator sieht den Feldnamen dann bei
-der ersten schließenden Klammer als beendet an, wobei die Klam­
-mern natürlich nicht zum Feldnamen gehören, aber auch nicht ge­
-druckt werden.
- Das obige Beispiel müßte also richtig so formuliert werden:
-
-
- % WIEDERHOLUNG
- &<Name>, %Vorname
-
-
-Wenn Sie dieses Druckmuster ausprobieren, werden Sie sehen, daß
-die Namen tatsächlich in der gewünschten Form erscheinen.
-
-#on("b")#Leerautomatik#off("b")# Es gibt noch eine trickreiche Automatik in
-EUDAS,
-die in manchen Fällen ganz nützlich ist - und zwar in Fällen, in
-denen Sie mehrere Felder als Aufzählung durch Leerzeichen ge­
-trennt drucken wollen. Nehmen wir an, unsere Adreßdatei hätte
-noch ein Feld 'Titel', in das Sie bei Bedarf 'Dr.' oder 'Prof. Dr.'
-eintragen. In der Adresse würden Sie dann angeben:
-
-
- &Titel %Vorname %Name
-
-
-Wenn der Titel jedoch leer ist, würde ein störendes Leerzeichen vor
-dem Namen bleiben. In einem solchen Fall entfernt EUDAS das Leer­
-zeichen automatisch. Vorbedingung für diese Automatik ist, daß es
-sich um ein Feld variabler Länge handelt und vor dem Feld noch ein
-Leerzeichen steht (außer in Spalte 1).
-
-#on("b")#Aufgabe#off("b")# Sie sollten jetzt die Möglichkeiten des
-Druckgenerators
-soweit kennengelernt haben, daß Sie ein Druckmuster für die zu
-Anfang des Kapitels erwähnte Liste aller Dateiinhalte erstellen
-können. Versuchen Sie dies zunächst allein, ehe Sie die Lösung
-nachschauen.
-
-
-Hier nun die Lösung:
-
-
- % VORSPANN
- Vorname Name, Strasse, PLZ Ort, m/w
- -------------------------------------------------------
- % WIEDERHOLUNG
- &Vorname %<Name>, %<Strasse>, %PLZ %<Ort>, %m/w
-
-
-Beachten Sie die spitzen Klammern, die nötig sind, um das Kom­
-ma ohne Zwischenraum anzuschließen.
-
-#on("b")#Beispiel#off("b")# Als letztes Beispiel sollen Sie einen Fall
-betrachten, bei
-dem pro Satz mehr als eine einzelne Listenzeile gedruckt werden
-soll, und zwar sollen Sie einen Brief schreiben, in den der Druck­
-generator die Adressen verschiedener Leute einfügen soll. Die Er­
-stellung von Formbriefen ist eine sehr häufige Anwendung von
-EUDAS. Mit den bisher beschriebenen Konstrukten kann man etwa
-folgendes Druckmuster schreiben:
-
-
- % WIEDERHOLUNG
- &Vorname %Name
- &Strasse
- &PLZ %Ort
-
- Lieber &Vorname !
-
- Ich lade Dich mit diesem Brief zu
- meiner nächsten Party ein.
- Bring gute Laune und was zu Essen mit.
-
- Viele Grüße
- \#page\#
-
-
-Die letzte Zeile zeigt eine Möglichkeit, von der Sie wahrscheinlich
-öfter Gebrauch machen werden, nämlich Druckersteuerungsanwei­
-sungen in das Druckmuster einzufügen. Die Anweisung '\#page\#'
-wird an den Drucker weitergereicht und bewirkt, daß nach jedem
-Brief eine neue Seite angefangen wird (Sie wollen sicher nicht
-mehrere Briefe auf ein Blatt drucken). Sie können auch andere An­
-weisungen verwenden, z.B. neue Schrifttypen einstellen. Informieren
-Sie sich gegebenenfalls, welche Anweisungen die Textkosmetik zur
-Verfügung stellt.
-
-#on("b")#Ausblick#off("b")# Sie kennen jetzt bereits einen großen Teil der
-Möglich­
-keiten des Druckgenerators. Einige wünschenswerte Fähigkeiten
-fehlen jedoch noch. So wäre es vorteilhaft, wenn abhängig vom
-Inhalt des Feldes 'm/w' die Anrede 'Sehr geehrter Herr' oder 'Sehr
-geehrte Frau' erzeugt werden könnte. Außerdem könnte das im
-Rechner vorhandene Datum automatisch in den Brief übernommen
-werden. Diese Möglichkeiten werden den Kapiteln 12 und 13 be­
-schrieben.
- Sie sollten diese jedoch erst dann durchlesen, wenn Sie eine
-gewisse Sicherheit im Umgang mit Druckmustern erlangt haben.
-Zuvor sollten Sie die Inhalte dieses Kapitels beherrschen, damit Sie
-EUDAS gut nutzen können.
-
diff --git a/doc/eudas/eudas.hdb.8 b/doc/eudas/eudas.hdb.8
deleted file mode 100644
index 83246e9..0000000
--- a/doc/eudas/eudas.hdb.8
+++ /dev/null
@@ -1,211 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (75)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-8 Was war und was noch kommt
-
-
-
-8.1 Rückblick
-
-So! Wenn Sie bis hierhin gut mitgearbeitet haben, haben Sie die
-erste und wichtigste Etappe beim Erlernen von EUDAS schon ge­
-schafft. Bevor Sie kennenlernen, was für Möglichkeiten Ihnen EUDAS
-sonst noch bietet, wollen wir die wichtigsten Dinge rekapitulieren,
-die Sie gelernt haben sollten.
-
-#on("b")#EUDAS-Dateien#off("b")# Sie sollten wissen, wie EUDAS-Dateien
-aussehen,
-und daß sie sich von normalen Textdateien unterscheiden. Diese
-Unterscheidung sollten Sie immer beachten, denn es gibt Funktio­
-nen, die nur EUDAS-Dateien annehmen (zum Beispiel 'Öffnen'),
-andere, die nur Textdateien annehmen (zum Beispiel 'Textdatei
-erstellen') und solche, die mit beliebigen Arten von Dateien "ohne
-Ansehen der Person" funktionieren (zum Beispiel 'Kopieren vom
-Archiv').
-
-#on("b")#Bedienung#off("b")# Sie sollten wissen, wie man eine Funktion im
-Menü
-aufruft; wie Sie EUDAS die notwendigen Informationen (zum Beispiel
-Dateinamen) mitgeben und wie Sie in besonderen Situationen (Feh­
-ler, Abbruch) reagieren können. Zur problemlosen Bedienung sollten
-Sie auch die jeweilige Statuszeile interpretieren können.
-
-#on("b")#Dateiverwaltung#off("b")# Sie sollten wissen, wie Sie Dateien von
-Archiv­
-disketten holen und dort auch wieder abspeichern können. Dazu ist
-die Dateiauswahl durch Ankreuzen sehr hilfreich. Sie sollten von
-Anfang an darauf achten, daß Sie Ihre Dateien regelmäßig auf dem
-Archiv sichern, damit Sie bei etwaigen Problemen mit Ihrem Rechner
-die Daten nicht verlieren.
-
-#on("b")#Öffnen#off("b")# Sie sollten wissen, daß Sie eine EUDAS-Datei vor
-dem
-Bearbeiten erst öffnen müssen. Weiterhin sollten Sie mit der Ar­
-beitskopie umgehen können, die EUDAS bei Änderungen anlegt.
-Denken Sie daran, Ihre Datei nach Änderungen zu sichern. Sie soll­
-ten auch neue EUDAS-Dateien mit eigener Struktur anlegen können.
-
-#on("b")#Ansehen und Ändern#off("b")# Sie sollten wissen, wie Sie die Daten
-Ihrer
-EUDAS-Dateien am Bildschirm abrufen können - entweder manuell
-oder mit Hilfe eines Suchmusters. Sie sollten Änderungen und Ein­
-fügungen durchführen können.
-
-#on("b")#Drucken#off("b")# Sie sollten wissen, wie Sie die Daten einer
-EUDAS-Datei
-mit Hilfe eines Druckmusters ausdrucken können. Denken Sie daran,
-daß dies ein zweistufiger Vorgang ist (Generierung der Druckdatei -
-Ausgeben an Drucker), den Sie an verschiedenen Stellen beeinflus­
-sen können.
-
-Lesen Sie das entsprechende Kapitel erneut durch, wenn Sie sich bei
-einem Punkt dieser Aufzählung nicht sicher sind. Wichtig ist auch,
-daß Sie die bschriebenen Funktionen selbst am Rechner ausprobiert
-haben.
- Wenn Sie dies alles geduldig absolviert haben, sind Sie in der
-Lage, EUDAS sinnvoll für Ihre eigenen Probleme einzusetzen. Sie
-sollten jetzt ruhig versuchen, eigene Lösungen zu realisieren. Sicher
-werden Sie dabei erkennen, daß Ihnen noch einige Möglichkeiten
-fehlen. Die Chancen sind aber gut, daß EUDAS Ihnen diese Möglich­
-keiten bietet.
- Im nächsten Abschnitt erhalten Sie einen Überblick darüber,
-was EUDAS noch zur Verfügung stellt. Dort können Sie sich orien­
-tieren, welche Kapitel Sie lesen sollten, wenn Sie bestimmte Fragen
-haben.
-
-
-8.2 Ausblick
-
-Im zweiten Teil dieses Handbuchs erwarten Sie eine ganze Reihe
-interessanter Themen. Dort werden Erweiterungen und Verallgemei­
-nerungen von Funktionen beschreiben, die Sie bereits kennen. Viele
-Funktionen sind jedoch ganz neu und manchmal auch nicht ganz
-einfach zu beherrschen.
-
-#on("b")#Kapitel 9#off("b")# Das neunte Kapitel befaßt sich mit der
-grundsätzlichen
-Struktur der geöffneten Datei. Sie erfahren, daß Sie mehr als eine
-Datei gleichzeitig öffnen und bearbeiten können. Zum einen können
-Sie gleichartige Dateien verketten oder Dateien über Beziehungen
-koppeln. Insbesondere das Koppeln ist eine wichtige Grundlage für
-viele fortgeschrittene Anwendungen von EUDAS.
- In diesem Kapitel wird auch beschrieben, wie Sie auf einem
-Mehrplatzsystem von mehreren Plätzen aus auf die gleichen EUDAS-
-Dateien zugreifen können. Die Fähigkeiten von EUDAS auf diesem
-Gebiet erreichen nicht das Niveau von großen Datenbanksystemen,
-sind jedoch einfach anzuwenden und in vielen Fällen nützlich.
-
-#on("b")#Kapitel 10#off("b")# Im zehnten Kapitel erfahren Sie, wie Sie den
-Bildschirm
-übersichtlicher gestalten können, wenn Sie Dateien mit zahlreichen
-Feldern benötigen. Sie können bestimmte Felder auswählen, aber
-auch die Sätze einfach ausschnittweise ansehen.
- Das Suchmuster besitzt noch viele Fähigkeiten, die im ersten
-Teil nicht zur Sprache gekommen sind. Sie können mehrere Bedin­
-gungen auf verschiedene Weisen miteinander kombinieren. Auch
-einige neue Vergleiche treten auf. Außerdem können Sie mehrere
-Felder eines Satzes miteinander vergleichen.
- Zum schnellen Ãœberblick steht Ihnen eine Funktion bereit, die
-jeweils einen Satz pro Bildschirmzeile anzeigt. In dieser Ãœbersicht
-können Sie blättern und auch Sätze markieren (ankreuzen), um Sie
-später zu bearbeiten.
-
-#on("b")#Kapitel 11#off("b")# Das elfte Kapitel ist den Funktionen zur
-Bearbeitung
-gewidmet. Dort erfahren Sie, wie Sie eine Datei sortieren können.
-Außerdem können Sie eine Datei ausschnittweise kopieren, wobei Sie
-noch eine Vielzahl von Manipulationsmöglichkeiten haben.
- Auch das Tragen von mehreren Sätzen in einem Arbeitsgang ist
-möglich. Dabei können Konsistenzbedingungen einer Datei überprüft
-werden.
- Als letztes erfahren Sie, wie man eine EUDAS-Datei automa­
-tisch nach einer beliebigen Vorschrift ändern kann. Hier, wie bei
-den vorherigen Funktionen, werden Sie zum ersten Mal erkennen,
-wieviel man mit der Programmiersprache ELAN innerhalb von EUDAS
-ohne viel Aufwand machen kann.
-
-#on("b")#Kapitel 12#off("b")# Das nächste Kapitel zeigt Ihnen weitere
-Möglichkeiten
-zum Drucken. Sie können die Druckausgabe vor dem Drucken noch
-mit den Programmen der EUMEL-Textverarbeitung aufbereiten. Auch
-innerhalb der EUMEL-Textverarbeitung können Sie EUDAS aufrufen,
-um Daten aus einer EUDAS-Datei in den Text einzufügen.
- EUDAS kann auch in mehreren Spalten drucken (zum Beispiel
-für Etiketten). Schließlich wird noch beschrieben, wie Sie lange
-Felder auf mehrere Zeilen aufteilen können und welche speziellen
-Möglichkeiten Sie zur Erzeugung von Tabellen haben.
-
-#on("b")#Kapitel 13#off("b")# Ab hier beginnt die Beschreibung dessen, was
-die
-Ausgabe des Druckgenerators so ungeheuer anpassungsfähig macht:
-die Verwendung der Programmiersprache ELAN.
- Mit einfachsten ELAN-Elementen können Sie komplizierte For­
-matierungswünsche erfüllen. Dazu können Sie den Inhalt von Feld­
-mustern durch vorherige Bearbeitung und durch die Abfrage von
-Bedingungen manipulieren. Ganze Musterteile können in Abhängig­
-keit von Bedingungen variabel gestaltet werden.
- Auch der Ablauf von Druckvorgängen kann von Bedingungen
-abhängig gemacht werden. So lassen sich gesteuert Vorspann und
-Nachspann innerhalb des Ausdrucks einfügen und Zwischenüber­
-schriften oder -summen bilden (Gruppenverarbeitung).
-
-#on("b")#Kapitel 14 und 15#off("b")# Für denjenigen, der noch nie mit ELAN zu
-tun
-hatte, werden diese Möglichkeiten sicher nicht ganz einfach zu
-verstehen sein. Obwohl die vorherigen Kapitel viele benutzbare
-Beispiele enthalten, ist zur vollen Ausnutzung ein gewisses Ver­
-ständnis von ELAN notwendig.
- Dies soll in den Kapitel 14 und 15 vermittelt werden, und zwar
-in dem Umfang, in dem es in EUDAS nötig ist (Sie sollen hier nicht
-zum ELAN-Programmierer ausgebildet werden). Für den ELAN-
-Kenner bieten diese Kapitel sicher nichts Neues, aber sie enthalten
-viele Beispiele und Beschreibungen der Funktionen, die für EUDAS
-wichtig sind.
- Dabei geht Kapitel 15 weiter auf die Sprachmittel für Zählvor­
-gänge, Auswertungen und statistische Anwendungen ein, während in
-Kapitel 14 die grundlegenden Ausdrücke zur Formulierung von
-Manipulationen besprochen werden.
-
-#on("b")#Kapitel 16#off("b")# Im letzten Kapitel geht es dann wieder
-harmloser zu.
-Hier werden die Funktionen beschrieben, die unter EUDAS zur
-allgemeinen Dateiverwaltung zur Verfügung stehen. Im Grunde sind
-dies alles Funktionen, die vom EUMEL-System zur Verfügung ge­
-stellt werden. EUDAS integriert sie lediglich in ein Menüsystem,
-damit Sie als Benutzer die Funktionen möglichst einfach aufrufen
-können.
- Aber auch dem erfahrenen EUMEL-Benutzer bieten die Funktio­
-nen einen zusätzlichen Komfort, da auch hier die praktische Aus­
-wahl durch Ankreuzen in allen Funktionen vertreten ist. Außerdem
-wird die Anzahl von Tastendrücken zum Erreichen eines Ziels ver­
-ringert. Daher besteht auch für den "Profi" keine Notwendigkeit,
-grundsätzlich mit einer Kommandoschnittstelle weiterzuarbeiten.
-
-#on("b")#Referenzhandbuch#off("b")# Im Referenzhandbuch sind alle hier
-besproche­
-nen Funktionen noch einmal in einer sehr kurzen, zusammenfassen­
-den und abstrakten Form aufgeführt. Dort sollen Sie nachschlagen,
-wenn Sie eine ganz bestimmte Information suchen und sich mit
-EUDAS bereits auskennen.
- Sie können jedoch auch ohne das Referenzhandbuch auskommen,
-denn alles, was Sie wissen müssen, steht auch hier im Benutzer­
-handbuch.
- Das Referenzhandbuch enthält auch einen Teil, der sich spe­
-ziell an den ELAN-Programmierer wendet, der besondere Anwendun­
-gen mit EUDAS realisieren will. Allerdings sollten alle dort be­
-schriebenen Möglichkeiten mit Vorsicht betrachtet werden, da sie im
-Normalfall nicht so abgesichert sind, wie die hier beschriebenen
-Fähigkeiten. Auch sollten Sie mit den Einsatzmöglichkeiten von
-ELAN, wie sie in den Kapitel 11 und 13 beschrieben sind, wirklich
-alle praktischen Probleme erledigen können.
-
diff --git a/doc/eudas/eudas.hdb.9 b/doc/eudas/eudas.hdb.9
deleted file mode 100644
index 341feca..0000000
--- a/doc/eudas/eudas.hdb.9
+++ /dev/null
@@ -1,556 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (83)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-9 Das virtuelle Dateikonzept
-
-
-
-9.1 Konzept
-
-Bisher haben Sie zu einem Zeitpunkt immer nur eine EUDAS-Datei
-bearbeiten können. Wenn Sie zu einer anderen Datei wechseln woll­
-ten, mußten Sie die eine Datei sichern und die andere Datei wieder
-öffnen. Es gibt jedoch Fälle, in denen Beziehungen zwischen mehre­
-ren Dateien bestehen. Daher kann EUDAS auch mit mehreren Dateien
-gleichzeitig umgehen.
- Es hat jedoch Vorteile, wenn man nur mit einer Datei arbeitet.
-Sie müssen dann nicht immer den Namen der gewünschten Datei
-angeben, wenn Sie eine Funktion ausführen. Dies brauchen Sie nur
-einmal beim Öffnen zu tun - danach ist eindeutig festgelegt, wel­
-che Datei gemeint ist.
- EUDAS versucht diese Vorteile auch bei mehreren Dateien zu
-erhalten. Die verschiedenen Dateien werden so kombiniert, daß eine
-neue Datei entsteht. Sie arbeiten dann nur mit dieser Datei, die alle
-Daten der Einzeldateien enthält.
- Damit Sie aber nicht so lange warten müssen, geschieht dieser
-Kombinationsvorgang erst beim Ansehen. Die kombinierte Datei ist
-also nicht wirklich vorhanden, sondern ihre Einzelsätze werden nur
-bei Bedarf erzeugt. Daher heißt diese Gesamtdatei auch #on("i")#virtuelle#off("i")#
-(scheinbare) Datei.
- Eine Kombination von Dateien ist auf zwei Arten möglich. Sie
-können gleichartige Dateien hintereinander#on("i")#ketten#off("i")#, oder Sie können
-Dateien über gemeinsame Felder #on("i")#koppeln#off("i")#. Beide Methoden können
-auch kombiniert werden.
-
-#on("b")#Änderungen#off("b")# Die virtuelle Datei kann auch verändert werden.
-Die
-Veränderungen werden dann in den entsprechenden Ursprungsda­
-teien vorgenommen. Es ist jedoch nicht immer eindeutig, wie diese
-Änderungen aussehen sollen. Achten Sie daher auf die speziellen
-Regeln, die bei solchen Änderungen gelten, damit Sie die Auswir­
-kungen einer Änderung abschätzen können.
- Wenn Sie Veränderungen vorgenommen haben, müssen Sie die
-Arbeitskopien anschließend wieder sichern. Denken Sie daran, daß
-EUDAS immer auf unbenannten Kopien arbeitet, wenn Sie ändern
-wollen. Beim Sichern von mehreren Dateien wird Ihnen zu jeder
-Datei einzeln angezeigt, ob sie tatsächlich verändert wurde. Sie
-können dann ebenfalls einzeln entscheiden, ob Sie die Datei sichern
-wollen oder nicht.
-
-
-9.2 Ketten
-
-Wenn Sie einmal EUDAS-Dateien mit mehreren tausend Sätzen er­
-stellen, werden Sie feststellen, daß deren Handhabung recht um­
-ständlich sein kann. Da die Datei sehr groß ist, dauern zum Beispiel
-Kopiervorgänge aufs Archiv viel länger als bei kleinen Dateien.
- Wenn Sie nun auch noch für jede kleine Änderung die Datei
-vom Archiv holen und anschließend wieder zurückschreiben müssen,
-werden Sie einen Weg suchen, diese Arbeit zu erleichtern. Die ein­
-fachste Möglichkeit wäre, einen schnelleren Rechner zu kaufen. Dies
-ist gleichzeitig aber auch die teuerste.
-
-
-#free (4.5)#
-
-#center#Abb. 9-1 Verkettung von A und B
-
-
-EUDAS ermöglicht es Ihnen nun, die große Datei in mehrere kleine
-aufzuspalten. In der Regel gibt es bei solch großen Dateien ein
-Kriterium, nach dem die Sätze in verschiedene Dateien verteilt
-werden können. Jede einzelne Datei kann nun bequem geändert
-werden.
- Ein Problem entsteht jedoch, wenn alle Dateien zusammen ver­
-arbeitet werden müssen (zum Beispiel beim Drucken). Für einen
-solchen Vorgang können Sie die kleineren Dateien logisch aneinan­
-derketten.
- Dies bedeutet für Sie, daß alle kleinen Dateien wie eine große
-Datei wirken. Wenn Sie beim Bewegen in der Datei das Ende einer
-einzelnen Datei erreichen, kommen Sie automatisch an den Anfang
-der nächsten Datei.
-
-#on("b")#Aufruf#off("b")# Damit dies funktioniert, müssen die Dateien
-natürlich
-gleiche Feldstruktur haben. Außerdem ist die Zahl der verkettbaren
-Dateien aus technischen Gründen auf 10 beschränkt.
- Sie können die Dateien verketten, indem Sie die Funktion
-#free (0.2)#
-
- K Ketten
-
-#free (0.2)#
-im Menü 'Öffnen' aufrufen.
-
-#on("b")#Änderungen#off("b")# In der virtuellen Datei ist sowohl Einfügen als
-auch
-Ändern erlaubt. Beim Einfügen ist jedoch zu beachten, daß am Ende
-einer Datei nicht angefügt werden kann. Dies liegt daran, daß Sie
-entweder vor dem letzten Satz der einen Datei oder vor dem ersten
-Satz der anderen Datei einfügen. Der Endesatz der einen Datei, der
-normalerweise sichtbar wäre, wird übersprungen.
- Am Ende der letzten Datei können Sie natürlich anfügen, da
-deren Endemarkierung als Ende der ganzen Datei ja wieder sichtbar
-ist.
-
-
-9.3 Koppeln
-
-Nachdem das Verketten von Dateien noch ganz einfach zu verstehen
-war, kommt jetzt eine Funktion auf Sie zu, die kompliziertere Mög­
-lichkeiten in sich birgt: nämlich das Koppeln.
- Es kommt häufiger vor, daß sich ein Feld einer Datei auf einen
-bestimmten Satz in einer anderen Datei bezieht. So könnten zum
-Beispiel die Ausleihen einer Bücherei in folgender Datei gespeichert
-sein:
-
-
- 'Name'
- 'Vorname'
- 'Datum'
- 'Buch-Nr.'
-
-
-Wenn jetzt ein Ausleiher sein Rückgabedatum überschritten hat,
-möchte die Bücherei dem Kunden ein Mahnschreiben schicken. Auf
-diesem Schreiben soll aber nicht die Buch-Nr. erscheinen, sondern
-Autor und Titel des Buches.
- Diese Sekundärinformationen sind in einer anderen Datei ge­
-speichert, der Bestandskartei:
-
-
- 'Buch-Nr.'
- 'Autor'
- 'Titel'
- 'Verlag'
-
-
-Alle Dateistrukturen hier sind natürlich zwecks größerer Übersicht­
-lichkeit vereinfacht. Um jetzt dem Kunden das Mahnschreiben zu
-schicken, müssen die Informationen in den beiden Dateien korreliert
-werden.
-
-#on("b")#Aufruf#off("b")# Zuerst wird die Ausleihdatei normal geöffnet. Dazu
-wird dann die Bestandsdatei mit Hilfe der Funktion
-#free (0.2)#
-
- K Koppeln
-
-#free (0.2)#
-gekoppelt. Dies hat folgenden Effekt:
- Die Sätze erscheinen normal so, wie sie in der Ausleihdatei
-auftauchen, also für jede Ausleihe genau ein Satz. Dazu erscheint
-aber jeweils die Beschreibung des ausgeliehenen Buches aus der
-Bestandsdatei: die beiden Dateien wurden über das Feld "Buch-Nr."
-gekoppelt.
- Als Struktur ergibt sich für die kombinierte Datei:
-
-
- 'Name'
- 'Vorname'
- 'Datum'
- 'Buch-Nr.'
- 'Titel'
- 'Autor'
- 'Verlag'
-
-
-Die Felder der Koppeldatei wurden also noch hinzugefügt.
-
-#on("b")#Koppelfelder#off("b")# Zwei Dinge sind in diesem Zusammenhang
-wichtig:
-Damit der Koppelvorgang ohne allzuviele Vorgaben auskommen kann,
-müssen Felder, über die gekoppelt wird, den gleichen Namen haben
-- und zwar exakt Zeichen für Zeichen. Zum zweiten muß ein solches
-#on("i")#Koppelfeld#off("i")# am Anfang der gekoppelten Datei (in unserem Fall der
-Bestandsdatei) stehen. Dies ist aus technischen Gründen notwendig,
-damit der Koppelvorgang in vernünftiger Geschwindigkeit ablaufen
-kann.
-
-
-#free (7.0)#
-
-#center#Abb. 9-2 Schema des Koppelvorgangs
-
-
-#on("b")#Mehrere Dateien#off("b")# Genau wie beim Ketten ist die Kombination
-der
-Dateien nicht physikalisch, sondern nur scheinbar vollzogen worden.
-Bis zum Limit der maximal geöffneten Dateien (10) können Sie auch
-weitere Dateien dazukoppeln. Die Koppelfelder dieser Dateien kön­
-nen sich jedoch immer nur auf die erste Datei beziehen, also nicht
-auf eine andere Koppeldatei.
- Dies könnte man in unserem Beispiel ausnutzen. Die Bücherei
-hat sicher auch eine Datei ihrer Mitglieder. Diese könnte etwa so
-aussehen:
-
-
- 'Name'
- 'Vorname'
- 'm/w'
- 'Strasse'
- 'PLZ'
- 'Ort'
-
-
-Diese Datei können wir ebenfalls zur Ausleihdatei dazukoppeln.
-Damit haben wir auch gleich die Quelle gewonnen, aus der wir die
-Anschrift für das Mahnschreiben gewinnen können.
- Die Kopplung geschieht in diesem Fall über zwei Felder, näm­
-lich 'Name' und 'Vorname'. Damit ein Mitglied eindeutig identifi­
-ziert wird, werden beide Namen gebraucht. Dies berücksichtigt auch
-das Koppelverfahren. Wiederum müssen die Namen exakt mit Namen
-der ersten Datei übereinstimmen.
- Wenn mehrere Koppelfelder für eine Koppeldatei notwendig sind,
-müssen Sie alle hintereinander stehen. Wäre die Struktur der Mit­
-gliederdatei etwa
-
-
- 'Name'
- 'Titel'
- 'Vorname'
- 'm/w'
- 'Strasse'
- 'PLZ'
- 'Ort'
-
-
-würde nur über 'Name' gekoppelt, da 'Titel' in der ersten Datei
-nicht vorkommt. Alle weiteren Felder können dann keine Koppelfel­
-der mehr werden. Durch Umstellen der Feldreihenfolge der Koppel­
-datei (durch Umkopieren) oder durch entsprechende Benennung von
-Feldern können Sie immer den gewünschten Effekt erzielen.
-
-
-#free (8.0)#
-
-#center#Abb. 9-3 Aufbau der virtuellen Datei
-
-
-#on("b")#Zusammenfassung#off("b")# An dieser Stelle wollen wir die Ergebnisse
-dieses Abschnitts als Regel zusammenfassen:
-
-#limit (12.0)#
- Die ersten Felder der Koppeldatei, die wörtlich an be­
- liebiger Stelle auch in der ersten Datei auftauchen,
- werden Koppelfelder genannt. Zu einem Satz der ersten
- Datei wird ein Satz der Koppeldatei gezeigt, der im In­
- halt der Koppelfelder übereinstimmt.
-#limit (13.5)#
-
-Übersetzt in unser Beispiel heißt dies: 'Buch-Nr.' bzw. 'Name' und
-'Vorname' sind Koppelfelder. Zu einer bestimmten Ausleihe erschei­
-nen die Daten des Buches mit der angegebenen Buch-Nr. bzw. die
-Adresse des Mitgliedes mit den angegebenen Namen.
-
-
-9.4 Auswirkungen des Koppelns
-
-Nachdem Sie nun das Grundprinzip des Koppelns kennen, sollen Sie
-einige Auswirkungen dieses Verfahrens kennenlernen.
- Ein Beispiel dazu finden Sie in Abb. 9-4. Dargestellt sind je­
-weils die Satznummern und einige Inhalte. Die zweite Zeile in der
-Hauptdatei und die erste in der Koppeldatei stellen das Koppelfeld
-dar.
-
-
-#free (6.5)#
-
-#center#Abb. 9-4 Kombinationen
-
-
-#on("b")#Kombinationen#off("b")# Zuerst muß geklärt werden, was passiert,
-wenn es
-keinen passenden Satz in der Koppeldatei gibt. Zum Beispiel könnte
-eine Buchnummer eingegeben worden sein, die in der Bestandsdatei
-nicht existiert. In diesem Fall zeigt EUDAS für die Felder der Kop­
-peldatei einfach einen leeren Inhalt an (siehe Satz 23 der Haupt­
-datei, es gibt keinen Satz mit 'L' in der Koppeldatei).
- Wenn umgekehrt zu einem bestimmten Buch keine Ausleihe
-existiert, macht das natürlich nichts - das Buch erscheint nur
-dann, wenn Sie die Bestandsdatei alleine öffnen.
- Weiterhin kann es passieren, daß es zwei passende Sätze in der
-Koppeldatei gibt. Dies kommt dann vor, wenn zwei Mitglieder glei­
-chen Namen und gleichen Vornamen haben (was gar nicht so selten
-ist). In diesem Fall zeigt EUDAS beide Kombinationen an (siehe
-Satz 23 der Hauptdatei). Die Ausleihe erscheint also zweimal, je­
-weils mit einem anderen Mitglied.
- Damit man diesen Fall ohne weiteres erkennen kann, führt
-EUDAS bei Kopplungen zwei Nummern: zum einen die normale Satz­
-nummer und zum anderen eine Kombinationsnummer. In dem eben
-besprochenen Fall würde die Satznummer gleichbleiben, die Kombi­
-nationsnummer aber hochgezählt werden. Am Bildschirm wird die
-Kombinationsnummer durch Bindestrich getrennt hinter die Satz­
-nummer geschrieben, wenn Sie Dateien koppeln.
- Das Durchgehen aller Kombinationen zu einem Satz der Haupt­
-datei passiert aber nur dann, wenn Sie sich mit der Funktion 'Satz
-weiter' in der Datei bewegen. Wenn Sie rückwärts gehen oder auf
-einen bestimmten Satz positionieren, wird immer nur die erste Kom­
-bination angezeigt (Dies hat zum Teil technische Gründe). Beim
-Zurückgehen von Satz 23-1 in dem Beispiel würde also auf Satz
-22-1 positioniert und die Kombination 22-2 übersprungen.
-
-#on("b")#Änderungen#off("b")# Auch wenn Sie Dateien gekoppelt haben, können
-Sie
-immer noch Sätze ändern und einfügen (wenn Sie dies beim Öffnen
-erlaubt haben). Die Auswirkungen der Veränderungen sind jedoch
-nicht mehr ganz so einfach wie bei geketteten Dateien, wo sich die
-Änderungen ja einfach auf den aktuellen Satz bezogen.
- Als Grundregel gilt, daß Änderungen möglichst wenig Auswir­
-kungen auf die Koppeldateien haben sollen. Das führt dazu, daß
-beim Einfügen eines neuen Satzes oder beim Entfernen eines Satzes
-durch Tragen keine Aktion in der Koppeldatei durchgeführt wird.
-Dies ist auch nicht nötig, denn wenn zum Beispiel ein neuer (zu­
-nächst leerer) Satz eingefügt wird, existiert sowieso noch kein
-passender Satz in der Koppeldatei und die entsprechenden Felder
-bleiben leer. Hingegen darf beim Entfernen eines Satzes der Satz in
-der Koppeldatei nicht entfernt werden, da er ja noch zu einem an­
-deren Satz gehören könnte.
- Änderungen an den Koppelfeldern können nun zu drei verschie­
-denen Reaktionen führen:
-
-1. Es wird kein Satz der Koppeldatei geändert, sondern nur ein
- neuer passender Satz gesucht. Dies geschieht immer dann, wenn
- außer den Koppelfeldern nur leere Inhalte für die Felder der
- Koppeldatei angegeben sind. Nach dem Ändern oder Einfügen
- werden dann die Inhalte des neuen Koppelsatzes angezeigt.
-
- Beispiel: Bei einer Ausleihe geben Sie Name und Vorname des
- Ausleihers an, nicht aber seine Adresse. Wenn Sie den Satzedi­
- tor beim Einfügen mit ESC 'q' verlassen, wird die zugehörige
- Adresse angezeigt (falls der entsprechende Name in der Kop­
- peldatei vorhanden ist).
-
-2. Es wird ein neuer Satz in der Koppeldatei angefügt. Dies ge­
- schieht immer dann, wenn die Koppelfelder verändert wurden
- und die anderen Felder der Koppeldatei nicht leer sind. Da­
- durch soll verhindert werden, daß die Koppelfelder in einem
- Satz verändert werden, der vielleicht noch zu einem anderen
- Satz paßt.
-
- Beispiel: Sie geben bei einer Ausleihe auch die Adresse mit
- an. Wenn eine Person mit gleichem Namen und Vornamen bereits
- existiert, wird die dort gespeicherte Adresse nicht überschrie­
- ben. Stattdessen wird die zweite Adresse auch in die Koppel­
- datei eingetragen. Beim nächsten Ansehen bekommen Sie dann
- zwei Adressen angezeigt. So wird verhindert, daß Sie ungewollt
- die erste Adresse vernichten.
-
-3. Der Satz in der Koppeldatei wird verändert. Dies geschieht nur
- dann, wenn die Koppelfelder unverändert geblieben sind, der
- Rest sich aber geändert hat.
-
- Beispiel: Sie ändern eine Ausleihe mit der zugehörigen
- Adresse. Sie geben nur eine neue Straße an und lassen Name
- und Vorname unverändert. Der Satz in der Koppeldatei enthält
- anschließend die neue Straße.
-
-Da Koppeldateien keine Sortierung besitzen müssen, werden neue
-Sätze der Koppeldatei immer am Ende angefügt. Dies ist zu beach­
-ten, wenn die Koppeldatei auch allein verwendet werden soll. Ge­
-gebenenfalls müssen Sie die Koppeldatei dann erst sortieren.
-
-
-9.5 Umschalten auf Koppeldatei
-
-Häufig kommt es vor, daß Sie beim Einfügen eines neuen Satzes mit
-gekoppelten Dateien die Verbindung mit einem existierenden Satz
-der Koppeldatei erreichen wollen, aber den notwendigen Inhalt der
-Koppelfelder nicht auswendig wissen.
- So wollen Sie beim Eingeben einer Ausleihe Name und Vorname
-des Entleihers nicht immer wieder abtippen. Dabei ist auch die
-Gefahr von Eingabefehlern sehr groß. Stattdessen wollen Sie lieber
-erst den Entleiher in der Mitgliederdatei suchen und dessen Namen
-dann automatisch in den Entleihsatz übernehmen.
- Hierfür bietet Ihnen EUDAS eine Unterstützung an.
-
-#on("b")#Ausführung#off("b")# Während Sie sich in der virtuellen Datei
-befinden,
-können Sie auf eine bestimmte Koppeldatei umschalten, die Sie dann
-wie eine Einzeldatei bearbeiten können. Beim Zurückschalten haben
-Sie dann die Möglichkeit, die Koppelfelder des gefundenen Satzes zu
-übernehmen.
- Das Umschalten bewirken Sie durch die Tastenkombination ESC
-'K' (großes K) nur im Menü 'Einzelsatz' sowie im Satzeditor beim
-Einfügen und Ändern. An anderen Stellen hat dieser Befehl keine
-Wirkung. Bei mehreren Koppeldateien werden Ihnen die Dateien der
-Reihenfolge nach angeboten. Durch Verneinung aller Fragen können
-Sie die Funktion ohne Wirkung beenden.
- Haben Sie nun umgeschaltet, wird Ihnen die Koppeldatei dar­
-geboten, als hätten Sie sie allein geöffnet. Sie können die Datei
-auch beliebig ändern (wenn Sie dies beim Öffnen angegeben haben).
-Nur die Anzeige <KOPPEL> in der Bildüberschrift zeigt an, daß Sie
-sich in einer Koppeldatei befinden. Sie können auch Funktionen in
-anderen Menüs aufrufen.
- Das Zurückschalten geschieht im Menü 'Einzelsatz' mit der
-gleichen Tastenkombination. Alle Einstellungen der virtuellen Datei
-von vorher bis auf die Feldauswahl bleiben erhalten.
- Wenn Sie nicht im Menü, sondern im Satzeditor (also beim
-Ändern oder Einfügen) umschalten, werden Sie zunächst wieder aus
-dem Satzeditor rausgeworfen. Sie können dann in der Koppeldatei
-den gewünschten Satz aufsuchen (oder neu eintragen). Beim Zurück­
-schalten werden Sie gefragt, ob Sie die Koppelfelder übernehmen
-wollen oder nicht. Danach kehren Sie automatisch wieder in den
-Satzeditor zurück, wobei jetzt die Koppelfelder gegebenenfalls aus­
-gefüllt oder überschrieben sind.
- Durch erneutes Umschalten können Sie den Vorgang auch für
-weitere Koppeldateien wiederholen.
- Die Position, die Sie beim Umschalten in der Koppeldatei einge­
-nommen haben, wird bis zum nächsten Umschalten gespeichert. Sie
-kommen dann zunächst wieder auf den gleichen Satz. So können Sie
-die gleichen Koppelfelder wie beim letzten Mal übernehmen, indem
-Sie einfach zweimal ESC 'K' tippen.
-
-#on("b")#Beispiel#off("b")# Der typische Vorgang beim Entleihen würde dann
-wie folgt
-aussehen. Zunächst öffnen Sie die Entleihdatei mit Änderungser­
-laubnis; dann koppeln Sie die Mitgliederdatei und die Bestandsdatei
-dazu.
- Für eine neue Ausleihe rufen Sie zunächst die Funktion 'Ein­
-fügen' auf. Dann tippen Sie ESC 'K' und schalten auf die Mitglie­
-derdatei um. Dort suchen Sie das Mitglied und schalten wieder zu­
-rück. Existierte das Mitglied noch nicht, können Sie es gleich ein­
-tragen. Beim Zurückschalten übernehmen Sie den Namen des Mit­
-glieds.
- Dann tragen Sie die Nummer des Buches ein (die müssen Sie nur
-dann suchen, wenn Sie nicht auf dem Buch steht). Das Entleihdatum
-erhalten Sie mit Hilfe der Tastenkombination ESC 'D' (wird im näch­
-sten Kapitel beschrieben).
- Wollen Sie mehrere Ausleihen für ein Mitglied eintragen, so
-tippen Sie beim nächsten Einfügen einfach zweimal ESC 'K', ohne
-dazwischen eine Positionierung vorzunehmen.
-
-
-9.6 Mehrfachbenutzung
-
-EUDAS ermöglicht es mehreren Benutzern an einem Rechner, mit den
-gleichen Dateien zu arbeiten. Dies ist eigentlich nichts Besonderes,
-denn das EUMEL-System ist ja bereits von Haus aus dazu geeignet.
-Es müssen jedoch einige Schutzvorkehrungen getroffen werden,
-damit dadurch keine Probleme entstehen.
- Als Grundvoraussetzung für die Mehrfachbenutzung müssen
-EUDAS-Dateien in einer unabhängigen #on("i")#Managertask#off("i")# gespeichert
-sein. Eine Managertask kann man sich durch das Kommando 'global
-manager' einrichten. In dieser Task sollte dann nicht mehr gearbei­
-tet werden.
- Stattdessen kann sich der Benutzer Dateien aus dieser Mana­
-gertask kopieren und auch wieder dorthin zurückschreiben. Wie Sie
-dies im EUDAS-Menü bewerkstelligen können, wird im Kapitel 16
-beschrieben. Es sei nochmal betont, daß dies eine Methode ist, die
-Sie für beliebige Dateien verwenden können.
- Im Kapitel 16 ist weiterhin auch beschrieben, wie Sie solche
-Dateien mit #on("i")#Passworten#off("i")# schützen können, so daß sie nicht jeder
-benutzen kann. Schauen Sie bei Bedarf dort nach.
-
-
-#free (7.7)#
-
-#center#Abb. 9-5 Mehrfachbenutzung
-
-
-#on("b")#Konflikte#off("b")# Wir wollen uns jedoch jetzt um ein Problem
-kümmern, das
-bei dieser Art von Mehrfachbenutzung auftritt. Nehmen wir an,
-unsere Bücherei habe zwei Plätze, an denen Entleihen durchgeführt
-werden können. Beide Plätze sollen mit der gleichen Entleihdatei
-arbeiten (wie Sie gleich noch sehen werden und aus anderen Grün­
-den würde man EUDAS für eine solche Bücherei nicht einsetzen -
-wir wollen hier nur das Prinzip illustrieren).
- Der Ablauf wäre dann folgendermaßen. Jeder Platz kopiert sich
-für eine Entleihe die gemeinsame Datei aus der Managertask, öffnet
-sie, trägt die Entleihe ein und sichert die Datei wieder. Dann wird
-die Datei in die Managertask zurückgeschrieben, wo sie die alte
-Entleihdatei ersetzt.
- Abgesehen von dem viel zu hohen manuellen Aufwand kann der
-Fall eintreten, daß beide gleichzeitig eine Entleihe bearbeiten.
-Nehmen wir an, beide benutzen die Entleihdatei mit dem symboli­
-schen Inhalt A. Auf Platz 1 kommt noch die Entleihe B, auf Platz 2
-die Entleihe C dazu. Platz 1 will anschließend den Inhalt AB zu­
-rückschreiben, Platz 2 den Inhalt AC.
- Je nach der zeitlichen Reihenfolge wird nur eine der beiden
-Versionen übrigbleiben, da derjenige, der später zurücksichert, die
-vorherige Version überschreibt. Richtig sollte die endgültige Version
-ABC herauskommen. Unser Beispiel führt jedoch auf jeden Fall zu
-einer fehlerhaften Datei.
- Grund dafür ist, daß beim Zurückschreiben der ganzen Datei ein
-Platz gesperrt werden muß, während der andere Platz eine Datei
-zum Ändern angefordert hat. Man könnte auch dazu übergehen, nur
-einzelne Sätze zu übertragen; diese Methode wird jedoch von EUDAS
-wegen des hohen Aufwandes nicht unterstützt (daher würde man
-EUDAS eben auch nicht für eine Mehrplatz-Bücherei nehmen).
- In vielen Fällen reicht das Sperren ganzer Dateien jedoch aus,
-besonders, wenn nicht ganz so häufig an einzelnen Sätzen geändert
-wird. EUDAS bietet dafür neben der notwendigen Sperre auch noch
-eine automatische Versendung der Dateien an.
-
-#on("b")#Manager#off("b")# Es bietet sich an, dieses Kopieren der Dateien
-beim Öff­
-nen (auch Koppeln und Ketten) und Sichern automatisch durchzu­
-führen. Als Voraussetzung dafür müssen Sie EUDAS angeben, mit
-welcher Managertask Sie arbeiten wollen. Dazu dient die Funktion
-#free (0.2)#
-
- M Manager
-
-#free (0.2)#
-im Menü 'Öffnen'. Sie werden dann nach dem Namen der Task ge­
-fragt. Geben Sie keinen Namen an, wird der Managermodus wieder
-ausgeschaltet. Welche Task als Manager eingestellt ist, sehen Sie in
-der untersten Bildschirmzeile.
- In der Task, die Sie angeben, muß EUDAS insertiert sein (oder
-in einem Vater), da sonst die Sperre nicht funktioniert.
- Wenn Sie nun einen solchen Manager angegeben haben, können
-Sie beim Öffnen Dateinamen aus dieser Task angeben. Auch bei ESC
-'z' werden Ihnen alle Namen aus dem Manager mit angeboten. Wenn
-Sie einen solchen Namen angeben, der nicht aus Ihrer eigenen Task
-stammt, wird die Datei vor dem Öffnen automatisch kopiert. Wenn
-Sie angegeben haben, daß Sie die Datei verändern wollen, wird in
-der Managertask eine entsprechende Sperre gesetzt.
- Wenn Sie die Datei nach Änderungen dann sichern, wird die
-geänderte Kopie zurückgeschrieben. Die Sperre wird jedoch erst
-dann aufgehoben, wenn Sie die Arbeitskopien endgültig löschen.
- Möchte nun ein anderer Benutzer diese Datei öffnen, während
-Sie sie ändern, kann er dies nur, wenn er sie nicht ändern will.
-Natürlich wird die Datei dann auch nicht wieder zurückgeschickt.
-Will er sie ändern, erhält er eine Fehlermeldung und kann den
-Versuch später wiederholen.
-
-#on("b")#Vorsichtsmaßregeln#off("b")# Bedenken Sie, daß der Schutz nur
-wirksam sein
-kann, wenn Sie diesen Vorgang nicht unter Umgehung der Menü­
-steuerung ausführen. Würden Sie sich zum Beispiel eine Datei vom
-Manager holen (s. Kapitel 16), ohne daß Sie ein Änderungsvorhaben
-anmelden können, können Sie diese Datei ja trotzdem ändern und
-wieder zurückschicken. In diesem Fall hat EUDAS keine Kontrolle
-mehr über die Datei.
- Aus dem gleichen Grund sollten Sie sich die Managertask auch
-nicht an Ihren Bildschirm holen, denn auch dann könnten Sie ohne
-Kontrolle Änderungen durchführen (zudem kann der Manager wäh­
-rend dieser Zeit nicht auf andere Benutzer reagieren).
- Nur wenn Sie eine neue Datei im Manager anlegen, müssen Sie
-dies von Hand tun. Dazu erstellen Sie die Datei ganz normal und
-schreiben Sie mit der in Kapitel 16 beschriebenen Funktion zum
-Manager. Sie sollten jedoch darauf achten, daß dort nicht schon
-eine Datei gleichen Namens liegt (EUDAS fragt ja dann, ob über­
-schrieben werden soll).
-
diff --git a/doc/eudas/eudas.hdb.inhalt b/doc/eudas/eudas.hdb.inhalt
deleted file mode 100644
index 62134f8..0000000
--- a/doc/eudas/eudas.hdb.inhalt
+++ /dev/null
@@ -1,133 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-Inhalt
-
-
-
- Vorwort . . . . . . . . . . . . . . . . . . . i
- Inhalt . . . . . . . . . . . . . . . . . . . . iii
-
-
-I. Die ersten Schritte
-
-#on("b")#1 Was kann EUDAS ?#off("b")#
-#free (0.2)#
-1.1 Textverarbeitung und Datenverwaltung . . . . . 3
-1.2 EUDAS als Karteikasten . . . . . . . . . . . . 5
-1.3 Drucken . . . . . . . . . . . . . . . . . . . 7
-1.4 Grenzen . . . . . . . . . . . . . . . . . . . 9
-
-#on("b")#2 Installation#off("b")#
-#free (0.2)#
-2.1 Lieferumfang . . . . . . . . . . . . . . . . . 11
-2.2 Single-User . . . . . . . . . . . . . . . . . 12
-2.3 Multi-User . . . . . . . . . . . . . . . . . . 13
-
-#on("b")#3 Ein Beispiel zum Ausprobieren#off("b")#
-#free (0.2)#
-3.1 Start . . . . . . . . . . . . . . . . . . . . 15
-3.2 Daten eintragen . . . . . . . . . . . . . . . 16
-3.3 Daten abfragen . . . . . . . . . . . . . . . . 21
-3.4 Drucken . . . . . . . . . . . . . . . . . . . 22
-3.5 Ergebnis . . . . . . . . . . . . . . . . . . . 24
-
-
-II. Einführung in die Benutzung
-
-#on("b")#4 Umgang mit Dateien und Menüs#off("b")#
-#free (0.2)#
-4.1 EUDAS-Dateien . . . . . . . . . . . . . . . . 27
-4.2 EUDAS-Menüs . . . . . . . . . . . . . . . . . 29
-4.3 Archivmenü . . . . . . . . . . . . . . . . . . 32
-4.4 Dateiverwaltung . . . . . . . . . . . . . . . 37
-4.5 Bedienungsregeln . . . . . . . . . . . . . . . 39
-
-#on("b")#5 Gespeicherte Daten abfragen#off("b")#
-#free (0.2)#
-5.1 Öffnen . . . . . . . . . . . . . . . . . . . . 43
-5.2 Bewegen . . . . . . . . . . . . . . . . . . . 45
-5.3 Suchen . . . . . . . . . . . . . . . . . . . . 46
-5.4 Suchbedingungen . . . . . . . . . . . . . . . 49
-
-#on("b")#6 Daten eingeben und ändern#off("b")#
-#free (0.2)#
-6.1 Neue Datei einrichten . . . . . . . . . . . . 51
-6.2 Sätze einfügen . . . . . . . . . . . . . . . . 52
-6.3 Daten ändern . . . . . . . . . . . . . . . . . 55
-6.4 Arbeitskopie sichern . . . . . . . . . . . . . 56
-
-#on("b")#7 Ausdrucken der Daten#off("b")#
-#free (0.2)#
-7.1 Druckmuster . . . . . . . . . . . . . . . . . 61
-7.2 Aufruf . . . . . . . . . . . . . . . . . . . . 64
-7.3 Abschnitte . . . . . . . . . . . . . . . . . . 67
-7.4 Feldmuster . . . . . . . . . . . . . . . . . . 69
-
-#on("b")#8 Was war und was noch kommt#off("b")#
-#free (0.2)#
-8.1 Rückblick . . . . . . . . . . . . . . . . . . 75
-8.2 Ausblick . . . . . . . . . . . . . . . . . . . 76
-
-
-III. Weitere Möglichkeiten
-
-#on("b")#9 Das virtuelle Dateikonzept#off("b")#
-#free (0.2)#
-9.1 Konzept . . . . . . . . . . . . . . . . . . . 83
-9.2 Ketten . . . . . . . . . . . . . . . . . . . . 84
-9.3 Koppeln . . . . . . . . . . . . . . . . . . . 85
-9.4 Auswirkungen des Koppelns . . . . . . . . . . 89
-9.5 Umschalten auf Koppeldatei . . . . . . . . . . 92
-9.6 Mehrfachbenutzung . . . . . . . . . . . . . . 93
-
-#on("b")#10 Datenabfrage am Bildschirm#off("b")#
-#free (0.2)#
-10.1 Feldauswahl . . . . . . . . . . . . . . . . . 97
-10.2 Satzeditor . . . . . . . . . . . . . . . . . . 98
-10.3 Suchmuster . . . . . . . . . . . . . . . . . . 99
-10.4 Markieren . . . . . . . . . . . . . . . . . . 104
-10.5 Ãœbersicht . . . . . . . . . . . . . . . . . . 105
-
-#on("b")#11 Funktionen zur Bearbeitung#off("b")#
-#free (0.2)#
-11.1 Sortieren . . . . . . . . . . . . . . . . . . 109
-11.2 Kopieren . . . . . . . . . . . . . . . . . . . 112
-11.3 Tragen . . . . . . . . . . . . . . . . . . . . 118
-11.4 Automatische Änderungen . . . . . . . . . . . 121
-
-#on("b")#12 Weitere Möglichkeiten zum Drucken#off("b")#
-#free (0.2)#
-12.1 Anschluß an die Textverarbeitung . . . . . . . 123
-12.2 Spaltendruck . . . . . . . . . . . . . . . . . 126
-12.3 Modi . . . . . . . . . . . . . . . . . . . . . 128
-
-#on("b")#13 Programmierung von Druckmustern#off("b")#
-#free (0.2)#
-13.1 Abkürzungen . . . . . . . . . . . . . . . . . 133
-13.2 Bedingte Musterteile . . . . . . . . . . . . . 141
-13.3 Ãœbersetzung . . . . . . . . . . . . . . . . . 142
-13.4 Gruppen . . . . . . . . . . . . . . . . . . . 144
-
-#on("b")#14 Ausdrücke in ELAN#off("b")#
-#free (0.2)#
-14.1 Was sind Ausdrücke ? . . . . . . . . . . . . . 151
-14.2 Datentypen . . . . . . . . . . . . . . . . . . 152
-14.3 TEXT-Funktionen . . . . . . . . . . . . . . . 156
-14.4 Rechenfunktionen . . . . . . . . . . . . . . . 160
-14.5 Abfragen . . . . . . . . . . . . . . . . . . . 161
-
-#on("b")#15 Anweisungen in ELAN#off("b")#
-#free (0.2)#
-15.1 Variablen und Zuweisungen . . . . . . . . . . 165
-15.2 Weitere Konstruktionen . . . . . . . . . . . . 168
-
-#on("b")#16 Dateiverwaltung mit EUDAS#off("b")#
-#free (0.2)#
-16.1 Dateien im System . . . . . . . . . . . . . . 171
-16.2 Dateien auf dem Archiv . . . . . . . . . . . . 174
-
-
-IV. Anhang
-
- Register . . . . . . . . . . . . . . . . . . . 181
-
diff --git a/doc/eudas/eudas.hdb.macros b/doc/eudas/eudas.hdb.macros
deleted file mode 100644
index d06e6d1..0000000
--- a/doc/eudas/eudas.hdb.macros
+++ /dev/null
@@ -1,80 +0,0 @@
-#*format#
-#limit (13.5)##start (3.5,2.5)##pagelength (21.0)##block#
-#:firsthead (false)#
-#linefeed (1.07)#
-#*macro end#
-#*text#
-#type ("prop10")#
-#linefeed (1.07)#
-#*macro end#
-#*beispiel#
-#type ("12")#
-#linefeed (0.97)#
-#*macro end#
-#*bildschirm#
-#type ("17")#
-#linefeed(0.83)#
-#*macro end#
-#*proc#
-#type ("12")#
-#*macro end#
-#*endproc#
-#free (0.1)#
-#type ("prop10")#
-#linefeed (1.0)#
-#*macro end#
-#*abschnitt ($1,$2,$3)#
-#headodd#
-#on("b")#$1#right#$3 %#off("b")#
-#free (1.0)#
-#end#
-#on("b")##ib(9)#$1#ie(9,"   $3")# $2#off("b")#
-#*macro end#
-#*char($1)#
-$1
-#*macro end#
-#*kapitel ($1,$2,$3,$4)#
-#free (1.3)#
-#"nlq"#
-#type("roman.24")#
-#on("b")##center#$1#off("b")#
-#free (0.2)#
-#type ("roman.18")#
-#on("b")##center#$2 #off("b")#
-#on("b")##center# $3#off("b")#
-#on("b")##center#$4#off("b")#
-#type ("prop10")#
-#free (0.6)#
-#headeven#
-#on("b")#% $2 $3 $4#off("b")#
-#free (1.0)#
-#end#
-#headodd#
-#right##on("b")#%#off("b")#
-#free (1.0)#
-#end#
-#*macro end#
-#*f2#
-#free (0.2)#
-#*macro end#
-#*a ($1)#
-#on("b")#$1.#off("b")# 
-#*macro end#
-#*bsp ($1)#
-#type("12")#$1#type("prop")#
-#*macro end#
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/doc/eudas/eudas.hdb.titel b/doc/eudas/eudas.hdb.titel
deleted file mode 100644
index b8cc805..0000000
--- a/doc/eudas/eudas.hdb.titel
+++ /dev/null
@@ -1,99 +0,0 @@
-#limit (14.0)#
-____________________________________________________________________________
-
-
-#on("b")##on ("u")#
-#center#Betriebssystem E U M E L
-#off ("u")#
-
-
-#center#E U D A S
-
-
-
-
-#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#
-
-#free (6.0)#
-#on("b")#EUDAS#off("b")#
-#free (1.0)#
-#on("b")#Anwender-#off("b")#
-#on("b")#Datenverwaltungssystem#off("b")#
-#free (2.0)#
-#on ("b")#VERSION 4#off("b")#
-#free(1.0)#
-#on("u")#                                                    #off("u")#
-#free (0.5)#
-#on("b")#BENUTZERHANDBUCH#off("b")#
-#block#
-#page#
-#free (12.0)#
-Ausgabe Juli 1987
-
-Dieses Handbuch und das zugehörige Programm sind urheberrechtlich
-geschützt. Die dadurch begründeten Rechte, insbesondere der Ver­
-vielfältigung in irgendeiner Form, bleiben dem Autor vorbehalten.
-
-Es kann keine Garantie dafür übernommen werden, daß das Pro­
-gramm für eine bestimmte Anwendung geeignet ist. Die Verantwor­
-tung dafür liegt beim Kunden.
-
-Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrekt­
-heit und Vollständigkeit der Angaben wird aber keine Gewähr über­
-nommen. Das Handbuch kann jederzeit ohne Ankündigung geändert
-werden.
-
-(c) Copyright 1987 Thomas Berlage
- Software-Systeme
- Im alten Keller 3
-#free (0.1)#
- D-5205 Sankt Augustin 1
-#page#
-#free (7.0)#
-#center##on("b")#I.#off("b")#
-#free (1.0)#
-#center##on("b")#DIE#off("b")#
-#center##on("b")#ERSTEN#off ("b")#
-#center##on("b")#SCHRITTE#off("b")#
-#page#
-#free (7.0)#
-#center##on("b")#II.#off("b")#
-#free (1.0)#
-#center##on("b")#EINFÃœHRUNG#off("b")#
-#center##on("b")#IN DIE#off ("b")#
-#center##on("b")#BENUTZUNG#off("b")#
-#page#
-#free (7.0)#
-#center##on("b")#III.#off("b")#
-#free (1.0)#
-#center##on("b")#WEITERE#off("b")#
-#center##on("b")#MÖGLICHKEITEN#off("b")#
-#page#
-#free (7.0)#
-#center##on("b")#IV.#off("b")#
-#free (1.0)#
-#center##on("b")#ANHANG#off("b")#
-
-
-
-
-
-
-
-
diff --git a/doc/eudas/eudas.hdb.vorwort b/doc/eudas/eudas.hdb.vorwort
deleted file mode 100644
index 6f7f17c..0000000
--- a/doc/eudas/eudas.hdb.vorwort
+++ /dev/null
@@ -1,89 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-____________________________________________________________________________
-
-
-#on("b")##on ("u")#
-#center#Betriebssystem E U M E L
-#off ("u")#
-
-
-#center#EUDAS
-
-
-
-
-#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#
-Vorwort
-
-
-
-Lieber EUDAS-Benutzer !
-
-Dieses Handbuch soll Sie bei Ihrer Arbeit mit EUDAS begleiten. Ob­
-wohl EUDAS nicht schwierig zu bedienen ist, gibt es doch eine Reihe
-von Dingen zu lernen, ehe Sie ein EUDAS-Spezialist geworden sind.
- Um Ihnen diesen Weg möglichst einfach zu machen, ist die
-EUDAS-Dokumentation in zwei Handbücher aufgeteilt. Dies ist das
-#on("b")#Benutzerhandbuch#off("b")#, das Ihnen eine gut lesbare Einführung in alle
-Fähigkeiten von EUDAS bieten soll. Außerdem gibt es noch das
-#on("b")#Referenzhandbuch#off("b")#, das Ihnen zum Nachschlagen und als Hilfe beim
-Programmieren dienen soll.
-
- Bis Sie EUDAS gut beherrschen, sollten Sie sich also mit dem
-Benutzerhandbuch beschäftigen. Das Benutzerhandbuch ist nochmal
-in drei Teile aufgeteilt, um Ihnen das Lernen zu erleichtern. In
-jedem Teil werden die vorher behandelten Dinge zyklisch wieder
-aufgenommen und auf höherem Niveau erweitert.
- Der allererste Teil des Handbuchs umfaßt nur drei Kapitel und
-soll Ihnen über den ersten Tag mit EUDAS hinweghelfen. Dort finden
-Sie eine Übersicht, was Sie mit EUDAS anfangen können, wie Sie das
-Programm auf Ihrem Rechner installieren und ein kurzes Beispiel
-zum Ausprobieren.
- Im zweiten Teil lernen Sie dann die Grundkonzepte von EUDAS
-anhand von zahlreichen Beispielen kennen. Sie sollten die Beispiele
-am Rechner ausprobieren und ihre Bedeutung verstehen. Nach dem
-Durcharbeiten dieses Teils (was höchstens wenige Tage in Anspruch
-nimmt) sind Sie dann in der Lage, EUDAS für eigene Zwecke anzu­
-wenden.
- Wenn Ihre Ansprüche dann wachsen, sollten Sie sich mit dem
-dritten Teil befassen. Hier erhalten Sie Einblick in weitergehende
-Möglichkeiten von EUDAS. Die einzelnen Kapitel sind relativ unab­
-hängig voneinander, so daß Sie nur die für Sie interessanten
-genauer durchlesen müssen.
- In Kapitel 8 finden Sie als Orientierung nicht nur eine Wieder­
-holung dessen, was Sie im zweiten Teil gelernt haben sollten, son­
-dern auch eine Übersicht, welche weiteren Möglichkeiten im dritten
-Teil noch beschrieben werden.
-
- Im Referenzhandbuch finden Sie später, wenn Sie einige Erfah­
-rung gesammelt haben, eine genaue Beschreibung der Wirkungsweise
-aller Funktionen. Um diese zu verstehen, sollten Sie jedoch bereits
-eine grobe Ahnung der Wirkungsweise haben.
- Als zweites finden Sie im Referenzhandbuch Informationen für
-Programmierer, die EUDAS-Funktionen in eigenen Programmen ver­
-wenden wollen. Dies sollte jedoch in den meisten Fällen nicht not­
-wendig sein, so daß dieser Teil für Spezialisten reserviert bleibt.
-
- Trotz größter Bemühungen kann das Handbuch natürlich nicht
-frei von Unklarheiten und Fehlern sein. Anregungen und Kritik sind
-daher dringend erwünscht, um diese Dokumentation zu verbessern.
-
-Und nun viel Spaß bei Ihrer Arbeit mit EUDAS !
-
diff --git a/doc/eudas/eudas.ref.1 b/doc/eudas/eudas.ref.1
deleted file mode 100644
index 7c66368..0000000
--- a/doc/eudas/eudas.ref.1
+++ /dev/null
@@ -1,326 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (3)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-Zustände und Bedienung
-
-
-
-1.1 Zustände
-
-EUDAS befindet sich zu jeder Zeit in einem von 11 verschiedenen
-Zuständen. Für jeden Zustand ist festgelegt, welche Eingabetasten
-benutzt werden können und welche Wirkung sie haben. Bestimmte
-Tastenfunktionen führen in einen anderen Zustand. Obwohl für
-jeden Zustand andere Tastenkombinationen gültig sind, wird für die
-gleiche Funktion in jedem Zustand auch die gleiche Taste oder
-Tastenkombination verwendet.
- Die wichtigsten Tastenfunktionen eines Zustandes werden in
-der #on("i")#Statuszeile#off("i")# am oberen Bildschirmrand angezeigt.
- Im folgenden sind alle möglichen Zustände als Übersicht be­
-schrieben. Eine Übersicht der Zustandsübergänge enthält Abb. 1-1.
- Zu jedem Zustand wird die entsprechende Statuszeile darge­
-stellt sowie alle möglichen Tastenfunktionen und ihre Bedeutung.
-
-EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv
-
-_____________________________________________________
-
-OBEN Anwahl der nächsthöheren Funktion
-UNTEN Anwahl der nächsttieferen Funktion
-RECHTS Anwahl des nächsten Menüs zur Rechten
-LINKS Anwahl des nächsten Menüs zur Linken
-HOP OBEN Anwahl der ersten Funktion
-HOP UNTEN Anwahl der letzten Funktion
-'1' .. '6' Anwahl des entsprechenden Menüs
-LEER Ausführen der gewählten Funktion
-'Buchstabe' Ausführen der Funktion mit 'Buchstabe' davor
-ESC '?' Hilfestellung zur gewählten Funktion
-ESC ESC Eingabe von ELAN-Kommandos
-
-
-HILFE: Beenden: ESC q Seite weiter: ESC w Seite zurueck: ESC z
-
-_____________________________________________________
-
-ESC 'w' Blättern zur nächsten Seite
-ESC 'z' Blättern zur vorigen Seite
-ESC 'q' Verlassen (Rückkehr in alten Zustand)
-
-
-AUSWAHL: Ankreuzen: 'x' Durchstreichen: 'o' Beenden: ESC q Hilfe: ESC ?
-
-_____________________________________________________
-
-'x' Auswahl ankreuzen
-'o' Ankreuzen rückgängig machen
-LEER Ankreuzen und Auswahl sofort verlassen
-OBEN Zur nächsten Auswahl nach oben
-UNTEN Zur nächsten Auswahl nach unten
-HOP OBEN Zur obersten Auswahl bzw. eine Seite zurück
-HOP UNTEN Zur untersten Auswahl bzw. eine Seite weiter
-HOP RETURN Aktuelle Auswahl wird erste auf der Seite
-ESC '1' zur ersten Auswahl
-ESC '9' zur letzten Auswahl
-ESC 'q' Auswahl verlassen und weitermachen
-ESC '?' Hilfe zur Auswahl
-HOP 'x' alle freien Wahlen ankreuzen
-HOP 'o' alle Kreuze entfernen
-ESC 'h' Auswahl und Funktion abbrechen
-
-
-EINGABE: Bestätigen: RETURN Zeigen: ESC z Abbrechen: ESC h Hilfe: ESC ?
-
-_____________________________________________________
-
-RECHTS zum nächsten Zeichen
-LINKS zum vorigen Zeichen
-HOP RECHTS zum letzten Zeichen
-HOP LINKS zum ersten Zeichen
-RUBOUT Zeichen löschen
-RUBIN Einfügemodus umschalten
-HOP RUBOUT Rest der Zeile löschen
-'Zeichen' Zeichen überschreiben oder einfügen
-RETURN Eingabe abschließen und weitermachen
-ESC '?' Hilfe zur Eingabe
-ESC 'h' Eingabe und Funktion abbrechen
-ESC 'z' Auswahl zeigen (falls in Statuszeile aufgeführt)
-
-
-FRAGE: Bejahen: j,J Verneinen: n,N Abbrechen: ESC h Hilfe: ESC ?
-
-_____________________________________________________
-
-'j', 'J' Frage bejahen
-'n', 'N' Frage verneinen
-ESC '?' Hilfe zur Frage
-ESC 'h' Frage und Funktion abbrechen
-
-
-!!! FEHLER !!! Quittieren: ESC q Hilfe zur Meldung: ESC ?
-
-_____________________________________________________
-
-ESC '?' Hilfe zum Fehler
-ESC 'Taste' Fehler quittieren
-'Taste' Fehler quittieren
-
-
-SATZ ÄNDERN: Abbruch: ESC h Beenden: ESC q Hilfe: ESC ?
-SATZ EINFÃœGEN: Abbruch: ESC h Beenden: ESC q Hilfe: ESC ?
-SUCHMUSTER EINGEBEN: Abbruch: ESC h Beenden: ESC q Hilfe: ESC ?
-
-_____________________________________________________
-
-ESC OBEN eine Seite zurück blättern
-ESC UNTEN eine Seite vor blättern
-ESC '?' Hilfe zum Satzeditor
-ESC 'p' ganzen Satz merken (nicht bei Suchmuster)
-ESC 'g' Satz durch gemerkten ersetzen (nicht bei Such­
- muster)
-ESC 'h' Abbruch der Funktion
-ESC 'D' Tagesdatum schreiben
-ESC 'F' Prüffehler nach Tragen editieren
-ESC 'w' Verlassen und mit nächstem Satz erneut aufrufen
- (nicht im Suchmuster)
-ESC 'z' Verlassen und mit vorigem Satz erneut aufrufen
- (nicht im Suchmuster)
-ESC RUBIN Rest der Zeile in neue Zeile umbrechen
-ESC RUBOUT Rest der Zeile löschen
-HOP RUBIN nicht verwenden!
-HOP RUBOUT nicht verwenden!
-
-Weitere Tasten siehe EUMEL-Benutzerhandbuch (Editor).
-
-
-Bitte warten..
-
-_____________________________________________________
-
-keine Tasten erlaubt (außer SV)
-
-
-ZEIGEN: Blättern: HOP OBEN, HOP UNTEN Ende: ESC q Hilfe: ESC ?
-
-_____________________________________________________
-
-HOP OBEN auf erste Zeile bzw. eine Seite zurück
-HOP UNTEN auf letzte Zeile bzw. eine Seite vor
-ESC '?' Hilfe zur Ãœbersicht
-ESC 'h' Abbruch der Funktion
-ESC 'q' Verlassen
-
-
-EDITIEREN: Abbruch: ESC h Verlassen: ESC q Hilfe: ESC ?
-
-_____________________________________________________
-
-ESC 'F' Feldnamen anzeigen und auswählen
-ESC 'h' Abbruch der Funktion
-
-Weitere Tasten siehe EUMEL-Benutzerhandbuch (Editor).
-
-
-Gib Kommando:
-
-_____________________________________________________
-
-Tasten siehe EINGABE.
-
-
-#free (18.5)#
-
-#center#Abb. 1-1 Zustandsübergänge
-
-
-
-
-1.2 Menüs
-
-Menüs dienen zur Auswahl von Funktionen. Sie werden am linken
-Rand des Bildschirms angezeigt. Welches Menü aktiv ist, wird durch
-Markierung des Menünamens in der obersten Bildschirmzeile unter
-allen zur Verfügung stehenden Menüs angezeigt. In jedem Menü ist
-die zuletzt ausgeführte Funktion ebenfalls markiert.
-
-#on("b")#Ausführen von Funktionen#off("b")# Zum Ausführen einer bestimmten
-Funk­
-tion wird mit Hilfe der Cursortasten ein bestimmtes Menü und die
-gewünschte Funktion angewählt. Die Funktion wird dann durch
-Drücken der Leertaste ausgeführt. Alternativ kann auch der vor der
-Funktion stehende Buchstabe gedrückt werden.
- Die einzelnen Menüs können auch durch Nummern (1 bis 6)
-angewählt werden (absolute Positionierung).
- Soll eine andere Taste als die Leertaste zum Ausführen ver­
-wendet werden, so kann dies durch die Prozedur 'ausfuehrtaste'
-angegeben werden (s. Abschnitt 10.3).
- Funktionen, deren Ausführung augenblicklich nicht möglich
-oder nicht sinnvoll ist, werden durch ein vorangestelltes Minuszei­
-chen gekennzeichnet. Sie können zwar angewählt, nicht aber ausge­
-führt werden.
- Durch ESC '?' wird ein erläuternder Hilfstext zur gerade ange­
-wählten Funktion angezeigt. Näheres dazu s. Abschnitt 1.4.
- Durch ESC ESC kann ein beliebiges ELAN-Kommando eingegeben
-und ausgeführt werden. Die Eingabe des Kommandos erfolgt in der
-Statuszeile.
-
-
-1.3 Auswahl
-
-Die Auswahlfunktion dient dazu, aus vorhandenen Datei- oder
-Feldnamen in bestimmter Reihenfolge auszuwählen. Die einzelnen
-Namen werden untereinander aufgelistet.
- Vor jedem Namen ist ein 'o' zum Ankreuzen angegeben. Mit den
-Cursortasten kann der Cursor vor einen bestimmten Namen positio­
-niert werden. Mit 'x' kann dieser Name dann angekreuzt werden. Das
-Ankreuzen kann durch 'o' wieder rückgängig gemacht werden.
- Die Reihenfolge des Ankreuzens wird durch vorangestellte
-Nummern gekennzeichnet. Die Namen werden von der entsprechenden
-Funktion später in genau dieser Reihenfolge verwendet.
- Wenn nicht alle Namen auf den Bildschirm passen, kann die
-Darstellung gerollt werden. Ein Teil der Ãœberschrift bleibt dabei
-stehen; am Anfang und am Ende wird jeweils eine Abschlußzeile zur
-Kennzeichnung mitgerollt.
- Mit ESC '?' kann eine Hilfestellung abgerufen werden. Mit ESC
-'q' wird die Auswahl beendet. Mit ESC 'h' können die Auswahl und
-die in Ausführung befindliche Operation abgebrochen werden.
-
-
-1.4 Hilfe und Dialog
-
-In den meisten Situationen kann durch ESC '?' eine spezifische
-Hilfestellung abgerufen werden. Die Anzeige der Hilfsinformation
-geschieht im rechten Bildschirmteil.
- Die Texte sind seitenweise aufgebaut. Es wird immer eine Seite
-angezeigt. Mit ESC 'w' bzw. ESC 'z' kann auf die nächste bzw, vorige
-Seite umgeblättert werden. Mit ESC 'q' wird die Hilfestellung wieder
-verlassen und die Situation wiederhergestellt, in der die Hilfe auf­
-gerufen wurde.
-
-#on("b")#Fragen#off("b")# Die meisten Funktionen wickeln zur Eingabe von
-zusätz­
-lichen Parametern oder zum Stellen von Fragen einen Dialog in der
-unteren Schirmhälfte ab. Es gibt zwei Möglichkeiten des Dialogs:
-eine Frage oder die Eingabe eines Textes.
- Bei einer Frage kann man mit 'j' oder 'n' antworten. Sowohl
-große als auch kleine Buchstaben werden akzeptiert. Mit ESC '?'
-kann eine Hilfsinformation zu der Frage abgerufen werden. ESC 'h'
-bricht die fragende Funktion ab.
-
-#on("b")#Eingabe#off("b")# Bei der Eingabe eines Textes können die üblichen
-Opera­
-tionen zum Editieren in einer Zeile verwendet werden. Die Eingabe
-wird durch RETURN beendet. Auch hier kann durch ESC '?' eine
-Hilfsinformation abgerufen werden. ESC 'h' bricht ebenfalls die fra­
-gende Funktion ab. In einigen Fällen (ersichtlich aus der Statuszei­
-le) kann durch ESC 'z' eine Auswahl der verfügbaren Namen abgeru­
-fen werden.
-
-
-1.5 Editor
-
-Der EUMEL-Editor wird in EUDAS auf zweierlei Weise aufgerufen.
-Zum einen dient er im Satzformular zum Eingeben von Daten und
-Suchmustern. Dort wird er als #on("i")#Satzeditor#off("i")# bezeichnet. Da hier die
-Feldnamen mit berücksichtigt werden müssen, gibt es einige Unter­
-schiede zum normalen Editor.
- An anderen Stellen wird der Editor ohne Änderungen eingesetzt
-zum Eingeben von Feldnamen oder Mustern. In diesem Fall finden
-Sie die Bedienungshinweise im EUMEL-Benutzerhandbuch.
-
-#on("b")#Satzeditor#off("b")# Beim Ändern, Einfügen und Eingeben des
-Suchmusters
-wird im EUDAS-Formular der Editor aufgerufen. Das Editorfenster
-beschränkt sich auf den rechten Teil des Formulars, der einen Teil
-der Überschrift und die Feldinhalte umfaßt. Im Satzeditor können
-dann die entsprechenden Inhalte eingegeben bzw. verändert werden.
- Rollen unter Beibehaltung der Korrespondenz ist durch ESC
-OBEN und ESC UNTEN möglich. Diese Funktionen wirken wie bei der
-Anzeige - das Editorfenster wird ebenfalls entsprechend mitgerollt.
-Mit ESC '1' kann wie üblich auf die erste, mit ESC '9' auf die letzte
-Zeile gesprungen werden. Auch diese Funktionen passen die Feld­
-namen entsprechend an.
- Falls die für ein Feld vorgesehenen Zeilen nicht für den Inhalt
-ausreichen, kann durch ESC RUBIN eine weitere Zeile für dieses Feld
-bereitgestellt werden. ESC RUBIN wirkt wie zweimal HOP RUBIN, die
-Korrespondenz mit den Feldnamen bleibt jedoch gewahrt.
- Zum Löschen steht ESC RUBOUT zur Verfügung. Es löscht eine
-ganze Zeile, aber nur, wenn für dieses Feld noch andere Zeilen zur
-Verfügung stehen, wird die Zeile tatsächlich vom Bildschirm ent­
-fernt. Im Normalfall bleibt sonst eine Leerzeile für dieses Feld ste­
-hen.
- Ist die Information für ein Feld auf mehrere Zeilen verteilt, so
-werden diese Zeilen zur Verarbeitung aneinandergehängt. Gegebe­
-nenfalls wird zwischen zwei Zeilen noch ein Leerzeichen eingefügt.
- Der Editor kann wie üblich mit ESC 'q' verlassen werden. ESC
-'h' bricht die Funktion ab, ohne die erfolgten Änderungen und Ein­
-gaben zu berücksichtigen. Mit ESC 'w' und ESC 'z' kann das Bearbei­
-ten von mehreren Sätzen beschleunigt werden. Durch diese Tasten­
-kombinationen wird der Editor verlassen und die gleiche Operation
-(Ändern/Einfügen) beim nächsten bzw. vorigen Satz wiederholt.
-
-#on("b")#Hinweis#off("b")# Aus technischen Gründen kann das Editorfenster
-gegen­
-über den Feldnamen verschoben werden (durch Rollen mit HOP
-UNTEN zum Beispiel). Dabei geht die sichtbare Korrespondenz zwi­
-schen Feldnamen und Feldinhalten verloren. Ein solcher Fall wird
-durch einen markierten Balken mit entsprechender Meldung ange­
-zeigt. Durch ESC '1' wird das Fenster aber wieder zurechtgerückt.
- Aus diesem Grund sollte im Satzeditor auf HOP OBEN und HOP
-UNTEN sowie auf RETURN am Ende des Fensters verzichtet werden.
-Auch HOP RUBIN und HOP RUBOUT sollten nicht verwendet werden,
-weil auf diese Weise die Anzahl der Zeilen verändert wird. Eine
-solche Störung kann nicht durch ESC '1' beseitigt werden. Von Hand
-müssen die entsprechenden Zeilen wieder gelöscht oder eingefügt
-werden.
-
-
diff --git a/doc/eudas/eudas.ref.10 b/doc/eudas/eudas.ref.10
deleted file mode 100644
index fbfcf7e..0000000
--- a/doc/eudas/eudas.ref.10
+++ /dev/null
@@ -1,406 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (97)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-10 Programmierung der Menüs
-
-
-
-10.1 Menüformat
-
-EUDAS verwendet drei verschiedene Strukturen zur Benutzerunter­
-stützung: Menü, Auswahl und Hilfestellung. Ein Menü dient zur
-Auswahl von Funktionen, eine Auswahl bietet Feld- oder Datei­
-namen an und eine Hilfestellung zeigt einen Informationstext.
- Alle diese Strukturen werden aus einer Initialisierungsdatei
-eingelesen. Die Initialisierungsdatei ist eine normale Textdatei. Ihr
-Format soll in diesem Abschnitt beschrieben werden.
- Die Strukturen können in beliebiger Reihenfolge in der Initiali­
-sierungsdatei stehen. Jede Struktur wird durch eine spezielle
-Anweisung eingeleitet. Anweisungen beginnen ähnlich wie im
-Druckmuster mit einem Prozentzeichen. Dementsprechend gibt es die
-drei Anweisungen
-
-
- % MENUE "Name"
- % AUSWAHL "Name"
- % HILFE "Gebiet/Name"
-
-
-die jeweils eine Struktur einleiten. Beendet wird eine Definition
-immer mit
-
-
- % ENDE
-
-
-#on("b")#Menü#off("b")# Für ein Menü wird noch der Text angegeben, der auf
-dem
-Bildschirm erscheinen soll. Er wird durch die Anweisung
-
-
- % BILD
-
-
-eingeleitet. Danach folgen Zeilen mit dem Bildschirminhalt in der
-gewünschten Größe (die tatsächliche Anzeigegröße wird erst beim
-Aufruf angegeben). Dabei werden die Auswahlpositionen, auf denen
-der Cursor sich bewegen kann, durch ein geschütztes Leerzeichen in
-Spalte 2 festgelegt.
- Nach der Angabe des Bildes muß für jede mögliche Auswahl­
-position noch eine weitere Angabe gemacht werden. Die Auswahl­
-positionen (oder Felder) werden dabei von oben nach unten durch­
-gezählt. Begonnen wird mit der Nummer 1.
- Eine Felddefinition hat das Format
-
-
- % FELD nr "Hilfstext" "Tasten"
-
-
-Die Nummer identifiziert das Feld. Der Hilfstext gibt den Namen der
-Hilfestellung an, die gezeigt werden soll, wenn auf diesem Feld ESC
-'?' gedrückt wird. Die Tasten sind alle Zeichen, die gedrückt werden
-können, um dieses Feld direkt auszuführen.
- Anschließend an die Felddefinition kann in weiteren Zeilen
-noch ein ELAN-Programm folgen, das bei Auswahl des Feldes aus­
-geführt wird.
-
-#on("b")#Auswahl#off("b")# Für eine Auswahl muß zuerst ein Vorspann angegeben
-werden, der immer in den ersten Bildschirmzeilen der Auswahl an­
-gezeigt wird. Dieser wird durch
-
-
- % VORSPANN
-
-
-eingeleitet. Danach folgt das Bild. Das Bild setzt sich aus drei Tei­
-len zusammen. Die erste Zeile, in der ein geschütztes Leerzeichen
-vorkommt, bildet den Wiederholungsteil. Diese Zeile wird nachher so
-oft wie nötig mit entsprechenden Inhalten wiederholt, wobei das
-geschützte Leerzeichen als Bindestrich dargestellt wird, auf dem
-sich der Cursor bewegen kann. Die Teile davor und danach werden
-jeweils bei Bedarf mitgerollt.
- Die Wiederholungszeile darf mehrere geschützte Leerzeichen
-enthalten. Die Inhalte werden dann in mehreren Spalten angezeigt.
-Zu beachten ist, daß vor einem Trennstrich noch mindestens fünf
-Zeichen Platz für eine laufende Nummer bleiben müssen.
-
-#on("b")#Hilfe#off("b")# Der Name einer Hilfestellung setzt sich aus zwei
-Teilen
-zusammen, die durch einen Schrägstrich getrennt werden. Der erste
-Name gibt die Kategorie der Hilfestellung an, der zweite Name den
-Einzeltext. Dies dient dazu, die relativ große Zahl der Hilfstexte
-überschaubar zu machen. Als Beispiel
-
-
- % HILFE "JA/Allgemein"
-
-
-Eine Hilfestellung besteht einfach aus mehreren Seiten Text. Jede
-Seite wird durch die AnweisungQ
-
-
-Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q
-
-
-Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈
-Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈
-Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈
-Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈
-Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q
-
-
-Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q
-
-
-Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q̈Q
-Q̈Q̈Q̈Q̈Q̈Q̈Q̈estellung, wobei die Seiten einfach von 1 an durch­
-gezählt werden. Anschließend darf für diese Seite natürlich kein
-Text folgen.
-
-
-10.2 Verwaltung der Menüs
-
-Alle Menüdaten werden intern in Datenräumen gehalten. Dabei sind
-die einzelnen Strukturen getrennt. Mit 'menuedaten einlesen' kön­
-nen Menüdaten aus einer Struktur gelesen und abgespeichert wer­
-den. Existierende Strukturen werden dabei überschrieben, neue
-hinzugefügt.
- Mit 'menuenamen' können die vorhandenen Strukturen abgefragt
-werden. Mit 'menue loeschen' werden einzelne Strukturen oder alle
-Menüdaten gelöscht. Damit die Datenräume mit den Menüdaten auch
-an Söhne übergeben werden, ist der 'global manager' entsprechend
-geändert. Dies wird im einzelnen durch 'menue manager' bewirkt.
-Der neue Global Manager akzeptiert auch Anfragen von Tasks, die
-nicht Söhne oder Enkel sind.
-
-
-PROC menuedaten einlesen (TEXT CONST dateiname)
-
- Die in der Datei enthaltenen Strukturen werden eingelesen und
- abgespeichert. Treten bei diesem Prozeß Fehler auf, so wird
- eine entsprechende Meldung ins EUMEL-Notizbuch geschrieben
- und nachher im Paralleleditor angezeigt.
-
-
-THESAURUS PROC menuenamen (INT CONST index)
-
- Liefert die Namen der Strukturen. Der Index hat folgende Be­
- deutung:
- 1: Hilfskategorien
- 2: Menüs
- 3: Auswahlen
- Ist der Index negativ, so werden die Hilfsnamen der entspre­
- chenden Hilfskategorie geliefert, die im Thesaurus den Index
- mit umgekehrtem Vorzeichen hat.
-
-
-PROC menue loeschen (TEXT CONST name, INT CONST index)
-
- Löscht den Namen in dem Thesaurus mit dem angegebenen In­
- dex, falls dort der Name vorhanden ist.
-
-
-PROC menue loeschen (BOOL CONST hilfen reduzieren)
-
- Löscht alle Menüdaten. Ist 'hilfen reduzieren' verlangt, wird
- beim späteren Einlesen der Hilfstexte jeweils nur der erste
- Text einer Kategorie gespeichert, um Platz zu sparen.
-
-
-PROC global manager
-
- Geänderter Manager, der die Menüdatenräume in Söhne trans­
- portiert und Sperren setzen kann. Ersetzt den normalen 'free
- global manager'. Nur im Multi-User-System vorhanden.
-
-
-PROC menue manager (DATASPACE VAR ds,
- INT CONST order, phase,
- TASK CONST order task)
-
- Eigentliche Manager-Routine. Kann dazu dienen, Managererwei­
- terungen vorzunehmen. Nur im Multi-User-System vorhanden.
- Beispiel: der Manager soll nur Aufträge von Söhnen annehmen.
-
-
- PROC new manager (DATASPACE VAR ds,
- INT CONST order, phase,
- TASK CONST order task):
-
- LET begin code = 4;
- IF order task < myself OR order = begin code OR
- order task = supervisor THEN
- menue manager (ds, order, phase, order task)
- ELSE
- errorstop ("kein Sohn")
- END IF
-
- END PROC new manager;
-
- global manager (PROC new manager)
- (* startet den Manager *)
-
-
-
-10.3 Aufruf
-
-Menüs werden mit der Prozedur 'menue anbieten' aufgerufen. Dabei
-muß neben den Namen ein Fenster übergeben werden, in dem die
-Menüs dann angezeigt werden. Es ist darauf zu achten, daß das
-Fenster groß genug ist, um wenigstens die Auswahlpositionen im
-Bild zu haben.
- Außerdem muß eine Prozedur übergeben werden, die die einzel­
-nen Funktionen ausführt. Diese Prozedur erhält als Parameter die
-Nummer der ausgewählten Funktion.
- Mit 'waehlbar' können Auswahlen gesperrt werden. Diese Anga­
-be kann jedoch nicht vor Aufruf von 'menue anbieten' erfolgen, da
-dann alle Sperren erstmal gelöscht werden. Zum Setzen der Sperren
-beim Betreten eines Menüs dient ein besonderer Code, mit dem die
-übergebene Prozedur aufgerufen wird.
- Eine Auswahl wird mit der Prozedur 'auswahl anbieten' aufge­
-rufen. Diese bekommt ebenfalls ein Fenster übergeben, außerdem
-den Namen einer Hilfestellung, die bei Bedarf aufgerufen werden
-kann. Weiterhin muß eine Prozedur übergeben werden, die die aus­
-zuwählenden Texte erzeugt. Die gewählten Texte können anschlie­
-ßend mit der Prozedur 'wahl' abgefragt werden.
- Eine Hilfestellung wird durch die Prozedur 'hilfe anbieten'
-ausgegeben. Dabei muß außer dem Namen auch noch ein Fenster
-übergeben werden.
- Mit 'status anzeigen' kann ein Text in der Statuszeile ausge­
-geben werden. Die Menüprogramme tun dies für ihren Bereich jedoch
-selbst.
-
-
-PROC menue anbieten (ROW 6 TEXT CONST menuenamen,
- FENSTER VAR f,
- BOOL CONST esc erlaubt,
- PROC (INT CONST, INT CONST) interpreter)
-
- Die angegebenen Menüs werden in dem Fenster 'f' angezeigt.
- Das Fenster wird nach Beendigung des Menüs als verändert
- gekennzeichnet. Die Namen der 6 Menüs werden in die Titelzeile
- aufgenommen. Die Menünamen sollten mit einer Menüidentifika­
- tion versehen sein, zum Beispiel "EUDAS.Öffnen". Der Text vor
- dem Punkt wird an den Anfang der Titelzeile gestellt und bei
- den einzelnen Menünamen unterdrückt. Nicht benötigte Menüs
- müssen als "" angegeben werden.
-
- 'esc erlaubt' gibt an, ob mit ESC ESC ein Kommandodialog ge­
- führt werden kann. Die übergebene Prozedur muß die einzelnen
- Funktionen ausführen, die als Zahl übergeben werden. Der
- Interpreter wird im 'disable stop' aufgerufen, daher ist in der
- Regel ein 'enable stop' erforderlich.
-
- Die Parameter für 'interpreter' haben folgende Bedeutung:
- Par. 1: 0 Aufruf zur Initialisierung der Sperren
- oder anderen Initialisierungen zu Beginn
- 1..6 Angabe des aktuellen Menüs
- Par. 2: 1..23 Aufruf der entsprechenden Funktion
- 0 Eintritt in ein neues Menü (wird vor der
- Ausgabe dieses Menüs aufgerufen)
- -1 Verlassen des Menüs
- -2 Bildschirmupdate (nach Eintritt in das
- Menü, wenn das Menü ganz ausgegeben ist,
- oder wenn der Bildschirm nach 'Gib
- Kommando:' zerstört worden ist)
-
- FEHLER:
-
- #on("i")#"Name" existiert nicht.#off("i")#
- Das angegebene Menü ist nicht vorhanden.
-
-
-PROC waehlbar (INT CONST menuenr, funktionsnr
- BOOL CONST moeglich)
-
- Setzt die Funktionssperre der angegebenen Funktion. Muß in­
- nerhalb von 'menue anbieten' aufgerufen werden. Zu Beginn von
- 'menue anbieten' sind jeweils alle Funktionen erlaubt.
-
-
-PROC ausfuehrtaste (TEXT CONST taste)
-
- Setzt die Taste, die Funktionen ausführt. Ist standardmäßig die
- Leertaste.
-
- FEHLER:
-
- #on("i")#falsche Ausfuehrtaste#off("i")#
- Es muß ein einzelnes Zeichen angegeben werden, das nicht
- bereits anderweitig verwendet wird.
-
-
-PROC auswahl anbieten (TEXT CONST name, FENSTER CONST f,
- TEXT CONST hilfe,
- PROC (TEXT VAR, INT CONST) inhalt)
-
- Ruft die Auswahl in dem angegebenen Fenster auf. 'hilfe' wird
- als Hilfestellung verwendet. Die Prozedur 'inhalt' liefert den
- Text, der an der n-ten Position stehen soll. Wenn keine wei­
- teren Texte vorhanden sind, muß für alle weiteren Positionen
- "" geliefert werden.
-
- FEHLER:
-
- #on("i")#"Name" existiert nicht.#off("i")#
- Die angegebene Auswahl ist nicht vorhanden.
-
-
-INT PROC wahl (INT CONST stelle)
-
- Liefert die Nummer des Textes, der an der n-ten Stelle ausge­
- wählt wurde. Wurde kein weiterer Text mehr gewählt, so wird 0
- geliefert.
-
-
-PROC hilfe anbieten (TEXT CONST name, FENSTER CONST f)
-
- Bietet den Hilfstext in dem angegebenen Fenster an. Existiert
- die Hilfe innerhalb der angegebenen Kategorie nicht, wird die
- erste Hilfe der Kategorie angezeigt.
-
- FEHLER:
-
- #on("i")#Hilfe existiert nicht#off("i")#
- Die angegebene Hilfskategorie ist nicht vorhanden.
-
-
-PROC status anzeigen (TEXT CONST zeile)
-
- Zeigt den angegebenen Text in der obersten Bildschirmzeile an.
-
-
-10.4 Dialog
-
-EUDAS führt den Benutzerdialog in einem Fenster, dessen Größe
-durch 'dialogfenster' eingestellt wird. Das Dialogfenster wird zei­
-lenweise belegt. 'dialog' reserviert eine neue Zeile für eine beliebi­
-ge Ausgabe. Wenn das Fenster voll ist oder überschrieben wurde,
-wird in der ersten Zeile wieder angefangen. Den gleichen Effekt
-kann man mit 'neuer dialog' erreichen.
- Mit 'ja' kann man im Dialogfenster eine Frage stellen. Als Ant­
-wort kann auch eine Hilfestellung angefordert werden oder die
-Funktion abgebrochen werden. Mit 'editget' kann man nach Auffor­
-derung einen Text eingeben lassen. Dabei stehen die gleichen
-zusätzlichen Möglichkeiten zur Verfügung.
- Mit 'fehler ausgeben' kann eine durch 'errorstop' erzeugte Feh­
-lermeldung im Dialogfenster angezeigt werden. Der Benutzer muß
-erst eine Taste drücken, ehe er weitermachen kann. Auch hier kann
-eine Hilfestellung zu der Fehlermeldung abgerufen werden.
-
-
-PROC dialogfenster (INT CONST x, y, xl, yl)
-
- Gibt die Fenstergröße und -position des Dialogfensters an. Für
- den ganzen Bildschirm müßte (1, 1, 79, 24) angegeben werden.
-
-
-PROC dialog
-
- Positioniert den Cursor auf die nächste Dialogzeile im Dialog­
- fenster. Wurde das Fenster verändert, wird das Fenster ge­
- löscht und auf die erste Zeile positioniert.
-
-
-PROC neuer dialog
-
- Sorgt dafür, daß der nächste Aufruf von 'dialog' wieder in
- einem leeren Fenster beginnt.
-
-
-BOOL PROC ja (TEXT CONST frage, hilfe)
-
- Stellt die angegebene Frage. Es kann die angegebene Hilfsin­
- formation abgerufen werden. Außerdem wird durch ESC 'h' ein
- Abbruch (errorstop ("")) erzeugt.
-
-
-PROC editget (TEXT CONST prompt, TEXT VAR eingabe,
- TEXT CONST res, hilfe)
-
- Gibt den Text 'prompt' aus und editiert dahinter 'eingabe'. Es
- kann die angegebene Hilfsinformation abgerufen werden. 'res'
- gibt an, bei welchen ESC-Folgetasten das Editieren beendet
- werden soll. In einem solchen Fall wird als Eingabe (ESC + die
- gedrückte Taste) zurückgeliefert.
-
-
-PROC fehler ausgeben
-
- Im Dialogfenster wird die letzte Fehlermeldung ausgegeben.
- Gleichzeitig wird der Fehlerzustand gelöscht. Der Benutzer muß
- eine Taste drücken, um weiterzumachen. Alternativ kann die
- Hilfsinformation "FEHLER/" + text (errorcode) abgerufen wer­
- den.
-
-
diff --git a/doc/eudas/eudas.ref.11 b/doc/eudas/eudas.ref.11
deleted file mode 100644
index 48d36c3..0000000
--- a/doc/eudas/eudas.ref.11
+++ /dev/null
@@ -1,347 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (105)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-11 Programmierung von Anwendungen
-
-
-
-Zur Realisierung eigener EUDAS-Anwendungen mit Hilfe von ELAN-
-Programmen gibt es mehrere Möglichkeiten mit zunehmender Lei­
-stungsfähigkeit, aber auch steigender Komplexität und Fehleranfäl­
-ligkeit. In den folgenden Abschnitten werden die drei wesentlichen
-Methoden vorgestellt. Sie sollten erst dann eine kompliziertere
-Methode in Angriff nehmen, wenn Sie die einfachere beherrschen.
-
-
-11.1 Musterprogramme
-
-Die bevorzugte Methode zur Erstellung eigener Anwendungen unter
-EUDAS ist die Programmierung von Mustern. EUDAS läßt dies bei
-Druckmustern, Kopiermustern und Änderungsmustern zu.
- In diesem Fall steuert EUDAS den Ablauf des Programms im
-groben automatisch. Die jeweils unterschiedlichen Anweisungen, was
-im einzelnen zu tun ist, werden in ELAN programmiert. Aus dem
-Muster mit diesen zusätzlichen Anweisungen generiert EUDAS dann
-das Programm und führt es mit Hilfe des ELAN-Compilers aus.
-
-#on("b")#Vorteile#off("b")# Diese Methode hat den Vorteil, daß nur die
-minimal not­
-wendigen Anweisungen tatsächlich selbst programmiert werden
-müssen. Dafür reichen bereits geringe ELAN-Kenntnisse vollkommen
-aus. Ein Muster kann relativ schnell erstellt und getestet werden.
-Durch den einfachen Aufbau ist auch die Fehlerwahrscheinlichkeit
-beim Entwickeln geringer als bei anderen Methoden.
- Daneben lassen sich die Musterprogramme jeweils bequem im
-Menü durch Angabe des Namens oder durch Ankreuzen ausführen,
-also auch durch unbedarfte Benutzer.
-
-#on("b")#Nachteile#off("b")# Nachteil dieser Methode ist, daß jeweils beim
-Aufruf das
-Programm nochmal neu erzeugt und übersetzt werden muß, da die
-Übersetzung auch von der gerade geöffneten Datei abhängt. Dies
-stört besonders bei umfangreichen Druckmustern (auf langsamen
-Rechnern).
- Zum zweiten wird ein umfangreiches Druckmuster auch bald
-unübersichtlich, da Strukturierungshilfen für größere Programme
-fehlen. Der eigentliche Mustertext ist dann schwer von den zahlrei­
-chen Abkürzungen zu trennen.
- Als Abhilfe für diese beiden Nachteile bietet es sich an, um­
-fangreichere Abkürzungen bzw. Ausdrücke eingebettet in ein
-ELAN-Paket aus dem Muster herauszunehmen und vorher zu in­
-sertieren.
- Dadurch fällt zum einen die ständige Neuübersetzung dieser
-Ausdrücke weg, zum anderen ist das eigentliche Muster wieder
-überschaubar. Voraussetzung zur Anwendung eines solchen Musters
-ist dann jedoch, daß das zugehörige Paket in der jeweiligen Task
-bereits vorher übersetzt wurde.
- Die nachfolgenden Beispiele zeigen, wie dieses Verfahren in der
-Realität aussehen kann.
-
-#on("b")#Beispiel 1#off("b")# In der Schulverwaltung soll ein Kopier- oder
-Ände­
-rungsmuster erstellt werden, das die Versetzung am Schuljahresende
-realisiert. Angenommen wird eine Datei, die alle Schüler enthält.
-Schüler, die nicht versetzt werden, sind vorher im Feld 'Versetzung'
-mit einem beliebigen Text gekennzeichnet worden (zum Beispiel
-'Nachprüfung' o.ä.).
- Die Versetzung kann auf zweierlei Weise erfolgen: zum einen
-durch automatische Änderung, wenn die alte Version noch auf einer
-Archivdiskette aufgehoben wird, oder durch Kopieren in eine neue
-Datei.
- Bei beiden Mustern ist die einzige Änderung die Angabe der
-neuen Klasse. Daher bietet es sich an, eine Prozedur 'neue klasse'
-zu definieren, die als Ergebnis die neue Klasse eines Schülers lie­
-fert. Diese Prozedur kann dann im Änderungsmuster wie folgt ver­
-wendet werden:
-
-
- "Klasse" V neue klasse;
-
-
-Entsprechend läuft die Verwendung im Kopiermuster:
-
-
- "Name" K f ("Name");
- "Vorname" K f ("Vorname");
- "Klasse" K neue klasse;
- ...
-
-
-Die Prozedur 'neue klasse' muß dann in einem Paket definiert wer­
-den, das etwa folgendes Aussehen haben könnte (spezifische Ände­
-rungen natürlich möglich):
-
-
- PACKET klassenwechsel DEFINES neue klasse:
-
- TEXT PROC neue klasse :
-
- IF f ("Versetzung") = "" THEN
- klasse um 1 erhoeht
- ELSE
- alte klasse ohne zusatz
- END IF .
-
- klasse um 1 erhoeht :
- INT CONST alte klasse := int (f ("Klasse"));
- IF alte klasse < 9 THEN
- "0" + text (alte klasse + 1) + zusatz
- ELSE
- text (alte klasse + 1) + zusatz
- END IF .
-
- zusatz :
- f ("Klasse") SUB 3.
-
- alte klasse ohne zusatz :
- subtext (f ("Klasse"), 1, 2) .
-
- END PROC neue klasse;
-
- END PACKET klassenwechsel;
-
-
-Schüler, die versetzt werden, erhalten ihre neue Jahrgangsstufe mit
-dem alten Klassenzusatz zugeteilt. Dabei ist darauf zu achten, daß
-die Klassen 5 bis 9 eine '0' vorangestellt bekommen, damit die
-Sortierung funktioniert.
- Schüler, die nicht versetzt werden, behalten ihre alte Jahr­
-gangsstufe, allerdings ohne einen Klassenzusatz, der ihnen an­
-schließend manuell zugewiesen werden muß.
- Zur Benutzung muß das oben angegebene Paket in eine Text­
-datei geschrieben und mit dem Kommando 'insert' fest insertiert
-werden.
-
-#on("b")#Beispiel 2#off("b")# Aus einer Datei mit bibliographischen Einträgen
-sollen
-bestimmte Literaturhinweise gedruckt werden. Der Literaturhinweis
-soll jeweils als Endlostext umbrochen werden. Dafür müssen in einer
-Abkürzung alle Daten verkettet werden. Es sei das folgende ein­
-fache Druckmuster vorgegeben:
-
-
- % WIEDERHOLUNG
- % MODUS 3
- [&<krz>] &titel
-
- % ABKUERZUNGEN
- &krz : f ("Kurzbez") . (* z.B. "Lew84" *)
- &titel : titel lang .
-
-
-Die Prozedur 'titel lang' wird in folgendem Paket definiert:
-
-
- PACKET bibliographie DEFINES titel lang :
-
- TEXT VAR puffer; (* verringert Heap-Belastung *)
-
- TEXT PROC titel lang :
-
- puffer := f ("Name 1");
- puffer CAT ", ";
- puffer CAT f ("Vorname 1");
- ggf weitere namen;
- titel kursiv;
- enthalten in;
- erscheinungsort und jahr;
- puffer .
-
- ggf weitere namen:
- IF f ("Name 2") <> "" THEN
- puffer CAT "; ";
- puffer CAT f ("Name 2")
- END IF .
-
- titel kursiv :
- puffer CAT " \#on (""i"")\#";
- puffer CAT f ("Titel");
- puffer CAT "\#off (""i"")\#, " .
-
- enthalten in :
- IF f ("in") <> "" THEN
- puffer CAT " in: ";
- puffer CAT f ("in");
- puffer CAT ", "
- END IF .
-
- erscheinungsort und jahr :
- puffer CAT f ("Ort");
- puffer CAT ", ";
- puffer CAT f ("Jahr") .
-
- END PROC titel lang;
-
- END PACKET bibliographie;
-
-
-Die Puffervariable wird verwendet, um die bei Verwendung des
-Operators '+' entstehende Heapbelastung zu verringern. An diese
-Variable werden nacheinander alle notwendigen Daten mit den ent­
-sprechenden Trennzeichen angehängt.
- Im Druckmuster wird dieser lange Text dann im Modus 3 auf
-mehrere Zeilen umbrochen, wobei die Einrückung erhalten bleibt. Die
-Druckausgabe kann dann bei Bedarf noch mit 'lineform' bearbeitet
-werden, um einen noch besseren Umbruch zu erzielen.
-
-
-11.2 Dateianwendungen
-
-Die zweite Möglichkeit der Programmierung unter EUDAS besteht
-darin, ELAN-Programme zu schreiben, die EUDAS-Dateien mit Hilfe
-des in Kapitel 6 beschriebenen Datentyps EUDAT manipulieren. Die
-Programmierung gestaltet sich ähnlich wie mit FILEs.
-
-#on("b")#Vorteile#off("b")# Durch dieses Verfahren haben Sie volle Freiheit
-der Pro­
-grammierung. Da lediglich die Struktur der EUDAS-Dateien als
-Datenspeicher verwendet wird, sind sehr viele Anwendungen denk­
-bar.
- Außerdem können so beliebig viele Dateien gleichzeitig bear­
-beitet werden. Da die Programme nicht auf die virtuelle Datei zu­
-greifen, ist ein Konflikt mit dem aktuellen Zustand von EUDAS
-nahezu ausgeschlossen.
-
-#on("b")#Nachteile#off("b")# Der Nachteil dieses Verfahrens ist, daß viele
-Dinge
-selbst programmiert werden müssen, so zum Beispiel das Durchgehen
-einer Datei. Auch die Hilfsmittel der virtuellen Datei wie Such­
-muster, Koppeln und alle Anwendungen, die auf die virtuelle Datei
-zugreifen, stehen nicht zur Verfügung.
-
-#on("b")#Beispiel 1#off("b")# Die in Abschnitt 6.6 vorgestellte Anwendung als
-Asso­
-ziativspeicher kann als Beispiel für diese Methode dienen.
-
-#on("b")#Beispiel 2#off("b")# Eine EUDAS-Datei (zum Beispiel eine
-Schülerdatei) soll
-in mehrere Dateien aufgespalten werden (zum Beispiel klassen­
-weise). Dies kann durch das folgende Beispielprogramm bewirkt
-werden:
-
-
- LET
- klassenfeld = 3,
- quellname = "Schüler",
- zielname = "Jahrgang ";
- ROW 9 EUDAT VAR ziel;
- EUDAT VAR quelle;
- SATZ VAR feldnamen;
-
- quelle oeffnen;
- zieldateien einrichten;
- auf satz (quelle, 1);
- WHILE NOT dateiende (quelle) REP
- aktuellen satz kopieren;
- weiter (quelle)
- END REP .
-
- quelle oeffnen :
- oeffne (quelle, quellname);
- feldnamen lesen (quelle, feldnamen) .
-
- zieldateien einrichten :
- INT VAR i;
- FOR i FROM 1 UPTO 9 REP
- oeffne (ziel (i), zielname + text (i + 4));
- feldnamen aendern (ziel (i), feldnamen)
- END REP .
-
- aktuellen satz kopieren :
- SATZ VAR satz;
- satz lesen (quelle, satz);
- satz einfuegen (ziel (stufe), satz);
- weiter (ziel (stufe)) .
-
- stufe :
- TEXT VAR klasse;
- feld lesen (satz, klassenfeld, klasse);
- int (klasse) - 4 .
-
-
-
-11.3 Integrierte Anwendungen
-
-Die schwierigste Möglichkeit, Anwendungen unter EUDAS zu reali­
-sieren, ist ihre Integration. Ein solches Programm greift selbst auf
-die virtuelle Datei zu, nutzt die Funktionen von EUDAS so weit wie
-möglich und definiert vielleicht sogar ein eigenes Menü.
-
-#on("b")#Vorteile#off("b")# Auf diese Weise können natürlich alle
-Möglichkeiten
-ausgeschöpft werden. Sie können Programme erstellen, die als eine
-natürliche Erweiterung von EUDAS wirken oder EUDAS ganz erset­
-zen.
-
-#on("b")#Nachteile#off("b")# Eine solche Integration ist aber besonders
-schwierig,
-wenn EUDAS und die Erweiterung nebeneinander benutzt werden
-sollen. In diesem Fall hat EUDAS keine komplette Kontrolle der
-Interaktion, so daß leicht undefinierte Zustände möglich sind.
- Weniger Probleme treten auf, wenn sichergestellt ist, daß nur
-die Anwendung selbst verwendet wird. Auch in diesem Fall ist zu
-beachten, daß EUDAS nicht als Programmierumgebung für Anwen­
-dungssysteme konzipiert wurde und daher nicht immer leicht zu
-benutzen ist.
- Am einfachsten ist es noch, nur eigene Menüs für eine andere
-Anwendung zu verwenden, da die Menüprozeduren relativ unabhän­
-gig vom Rest sind.
-
-#on("b")#Richtlinien#off("b")# Bei Erweiterungen von EUDAS sind folgende
-Richtlinien zu beachten:
-
-1. Ein Programm, das selber Dateien für die virtuelle Datei öffnen
- will, sollte vorher prüfen, ob noch eine Datei geöffnet ist und in
- diesem Fall abbrechen. Beim Multi-User-Betrieb ist nämlich
- sonst nicht gewährleistet, daß alle Sperren wieder entfernt
- werden.
-
-2. Ein solches Programm sollte seine eigenen Dateien vor dem
- Wechsel zu EUDAS selbst wieder sichern und die Arbeitskopien
- löschen, damit der Ausgangszustand zu Beginn des Programms
- wiederhergestellt wird.
-
-3. Programme, die Menüs benutzen, sollten nicht unter EUDAS auf­
- gerufen werden, da sonst eine Beeinflussung der EUDAS-Menüs
- möglich ist.
-
-An dieser Stelle soll noch einmal von der Erstellung integrierter
-Anwendungen abgeraten werden, wenn es auch andere Möglichkeiten
-gibt, das gegebene Problem mit EUDAS zu lösen. Der hohe Aufwand
-dieser Methode rechtfertigt sich nur in wenigen Fällen.
- Experimentierfreudige Anwender werden sich durch diese War­
-nung sowieso nicht abhalten lassen. Ihnen sollte aber bewußt sein,
-daß ein solches Vorgehen auf eigene Gefahr stattfindet und kein
-Anspruch auf Beratung oder Fehlerbeseitigung in einem solchen Fall
-besteht.
-
diff --git a/doc/eudas/eudas.ref.2 b/doc/eudas/eudas.ref.2
deleted file mode 100644
index 2447897..0000000
--- a/doc/eudas/eudas.ref.2
+++ /dev/null
@@ -1,830 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (13)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-2 Zusammenstellung der Funktionen
-
-
-
-Im folgenden finden Sie eine Übersicht über alle Menüfunktionen. Zu
-jeder Funktion ist aufgeführt, welche Parameter angegeben werden
-müssen. Die Parameter werden als Text erfragt. Bei einigen Funk­
-tionen können alle möglichen Parameterwerte mit ESC 'z' (Zeigen)
-als Auswahl abgerufen werden. Bei manchen können in der Auswahl
-mehrere Werte angekreuzt werden, die dann nacheinander abgear­
-beitet werden. Welcher Fall zutrifft, ist jeweils aufgeführt.
-
-
-2.1 Menü 'Öffnen'
-
-
-#linefeed (0.5)#
-#on ("b")#O EUDAS-Datei Öffnen#off("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: EUDAS-Dateiname, mit Zeigen, eine Wahl
-
-Zweck: Stellt eine EUDAS-Datei als aktuelle Arbeitsdatei ein.
- Falls eine vorher geöffnete Datei verändert wurde,
- wird sie nach Anfrage gesichert. Falls die zu öffnende
- Datei noch nicht existiert, kann sie nach Anfrage
- eingerichtet werden. Dabei müssen dann die Feld­
- namen angegeben werden.
-
- Es wird gefragt, ob die Datei geändert werden soll. In
- diesem Fall wird eine Arbeitskopie hergestellt. Fast
- alle EUDAS-Funktionen beziehen sich nachher auf die
- so eingestellte Datei.
-
- Ist ein Mehrbenutzer-Manager eingestellt, kann auch
- eine Datei aus dieser Managertask als Parameter
- angegeben werden. Die Datei wird dann automatisch
- von dort kopiert und eine Sperre im Manager gesetzt,
- falls Änderungen vorgenommen werden sollen.
-
-Verweise: Abschnitt 3.2
- Benutzerhandbuch Abschnitt 5.1 und 9.1
-
-
-#linefeed (0.5)#
-#on("b")#E EUDAS-Datei Ketten#off("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: EUDAS-Dateiname, mit Zeigen, mehrfache Wahl
-
-Zweck: Falls bereits eine EUDAS-Datei geöffnet ist, kann eine
- weitere Datei gleicher Struktur logisch angekettet
- werden. Bei der Bearbeitung werden dann beide Datei­
- en wie eine zusammenhängende Datei behandelt.
-
- Die gekettete Datei kann ebenfalls verändert werden,
- wenn dies beim Öffnen der ersten Datei angegeben
- wurde. Die angegebene Datei kann auch aus einem
- Manager stammen.
-
-Verweise: Abschnitt 3.2
- Benutzerhandbuch Abschnitt 9.2
-
-
-#linefeed (0.5)#
-#on("b")#K EUDAS-Datei Koppeln#off("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: EUDAS-Dateiname, mit Zeigen, mehrfache Wahl
-
-Zweck: Falls bereits eine Datei geöffnet ist, kann eine andere
- EUDAS-Datei dazugekoppelt werden. Dazu muß min­
- destens das erste Feld der zu koppelnden Datei in der
- bereits geöffneten Datei vorkommen.
-
- Nach dem Koppeln erscheinen beide Dateien wie eine
- Datei. Zu jedem Satz der ersten Datei erscheinen je­
- weils alle Sätze der Koppeldatei, die in dem Koppelfeld
- übereinstimmen.
-
- Die gekoppelte Datei kann ebenfalls verändert werden,
- wenn dies beim Öffnen der ersten Datei angegeben
- wurde. Die angegebene Datei kann auch aus einem
- Manager stammen.
-
-Verweise: Abschnitt 3.3
- Benutzerhandbuch Abschnitt 9.3 und 9.4
-
-
-#linefeed (0.5)#
-#on("b")#S Arbeitskopie Sichern#off("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Wurde eine EUDAS-Datei geöffnet und verändert, muß
- zum Schluß die veränderte Arbeitskopie wieder ge­
- sichert werden. Die Arbeitskopie kann entweder ge­
- löscht werden, die alte Version ersetzen oder unter
- einem neuen Namen registriert werden.
-
- Für jede veränderte Datei wird zunächst erfragt, ob
- die alte Version überschrieben werden soll. Dies ist
- der Normalfall. Bei Verneinung dieser Frage muß ein
- neuer Name für die Arbeitskopie angegeben werden.
-
- Zum Schluß wird erfragt, ob alle Arbeitskopien ge­
- löscht werden sollen (Normalfall: ja). Anderenfalls
- bleiben die Dateien weiter geöffnet.
-
-Verweise: Abschnitt 3.5
- Benutzerhandbuch Abschnitt 6.4
-
-
-#linefeed (0.5)#
-#on("b")#N Notizen ansehen/ändern#off("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Zu jeder EUDAS-Datei kann als Notiz ein beliebiger
- Text gespeichert werden. Dieser Text der aktuellen
- Datei wird mit dieser Funktion im Editor angezeigt
- und kann verändert werden, wenn eine Arbeitskopie
- angelegt wurde. Anderenfalls werden etwaige Verän­
- derungen einfach ignoriert.
-
-Verweise: Abschnitt 3.1
-
-
-#linefeed (0.5)#
-#on("b")#F Feldstruktur ändern#off("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Mit dieser Funktion können neue Felder an die aktu­
- elle Datei angefügt werden. Außerdem lassen sich
- Feldnamen und Feldtypen ändern. Die Feldtypen be­
- stimmen die Behandlung eines Feldes beim Suchen oder
- Sortieren (z.B. von Zahlen).
-
- Zunächst wird erfragt, ob neue Feldnamen angefügt
- werden sollen. Diese können dann im Editor eingege­
- ben werden. Danach wird gefragt, ob Feldnamen oder
- Feldtypen geändert werden sollen (neu angefügte
- Felder erhalten erst einmal den Typ TEXT). Falls die
- Frage bejaht wird, können in einer Auswahl die zu
- ändernden Felder angekreuzt werden. Für jedes ange­
- kreuzte Feld werden dann der Name und der Typ zum
- Ãœberschreiben angeboten.
-
-Verweise: Abschnitt 3.1
- Benutzerhandbuch Abschnitt 11.1
-
-
-#linefeed (0.5)#
-#on("b")#P Prüfbedingungen ansehen/ändern#off("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Beim Tragen in eine EUDAS-Datei können Bedingungen
- für die zu tragenden Sätze überprüft werden. Diese
- Bedingungen für die aktuelle Datei können mit dieser
- Funktion angezeigt und, falls erlaubt, auch geändert
- werden.
-
-Verweise: Abschnitt 3.1 und 4.4
- Benutzerhandbuch Abschnitt 11.3
-
-
-#linefeed (0.5)#
-#on("b")#M Mehrbenutzer Manager einstellen#off("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: Managertaskname, kein Zeigen
-
-Zweck: EUDAS kann beim Öffnen eine Datei von einer anderen
- Task des Systems kopieren. Dadurch können mehrere
- Benutzer kontrolliert auf die gleiche Datei zugreifen.
- Wenn diese Möglichkeit verwendet werden soll, muß
- mit dieser Funktion zunächst die in Frage kommende
- Managertask angegeben werden.
-
-Verweise: Abschnitt 3.7
- Benutzerhandbuch Abschnitt 9.6
-
-
-2.2 Menü 'Einzelsatz'
-
-
-#linefeed (0.5)#
-#on("b")#W Weiter#off("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Geht einen Satz weiter in der aktuellen Datei - falls
- eine Suchbedingung eingestellt ist, weiter zum näch­
- sten ausgewählten Satz.
-
-Verweise: Abschnitt 4.2
- Benutzerhandbuch Abschnitt 5.2
-
-
-#linefeed (0.5)#
-#on("b")#Z Zurück#off("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Geht einen Satz zurück in der aktuellen Datei - falls
- eine Suchbedingung eingestellt ist, zurück zum vori­
- gen ausgewählten Satz.
-
-Verweise: Abschnitt 4.2
- Benutzerhandbuch Abschnitt 5.2
-
-
-#linefeed (0.5)#
-#on("b")#N Auf Satz Nr. ..#off("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Positioniert auf einen bestimmten Satz der aktuellen
- Datei, dessen Satznummer eingegeben werden muß, und
- zwar unabhängig, ob der Satz durch die Suchbedingung
- ausgewählt wird oder nicht. Trifft die eingestellte
- Suchbedingung nicht auf den Satz zu, erscheint
- 'SUCH-' in der Ãœberschrift. Existiert die eingegebene
- Satznummer nicht, positioniert EUDAS hinter den
- letzten Satz der Datei.
-
-Verweise: Benutzerhandbuch Abschnitt 5.2
-
-
-#linefeed (0.5)#
-#on("b")#S Suchbedingung Setzen#off("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Es kann eine neue Suchbedingung für die aktuelle
- Datei eingegeben werden, bzw. eine vorher eingestellte
- Suchbedingung wird zum Ändern angeboten. Die Such­
- bedingung wird in Form eines Suchmusters in das
- Satzformular geschrieben.
-
- Die eingestellte Suchbedingung wird beim Positionieren
- und bei allen Bearbeitungsfunktionen beachtet.
-
-Verweise: Abschnitt 4.2
- Benutzerhandbuch Abschnitt 5.3, 5.4 und 10.3
-
-
-#linefeed (0.5)#
-#on("b")#L Suchbedingung Löschen#off("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Die eingestellte Suchbedingung wird wieder gelöscht.
-
-Verweise: Abschnitt 4.2
- Benutzerhandbuch Abschnitt 5.3
-
-
-#linefeed (0.5)#
-#on ("b")#M Markierung umkehren#off("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Mit dieser Funktion können einzelne Sätze zur späte­
- ren Bearbeitung markiert werden. Falls der aktuelle
- Satz bereits markiert ist, wird die Markierung wieder
- entfernt, ansonsten wird er markiert.
-
- Wenn mindestens ein Satz markiert ist, beachten die
- Bearbeitungsfunktionen nur die markierten Sätze. So
- kann eine manuelle Auswahl durchgeführt werden. Die
- Markierung bleibt nur bis zum Sichern bestehen. Sie
- ist keine permanente Eigenschaft einer EUDAS-Datei.
-
-Verweise: Abschnitt 4.2
- Benutzerhandbuch Abschnitt 10.4
-
-
-#linefeed (0.5)#
-#on ("b")#E Datensatz Einfügen#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Mit dieser Funktion wird vor dem aktuellen Satz ein
- leerer Satz eingefügt, für den anschließend die Feld­
- inhalte im Satzformular eingetragen werden können.
-
-Verweise: Abschnitt 3.4
- Benutzerhandbuch Abschnitt 6.2 und 10.2
-
-
-#linefeed (0.5)#
-#on ("b")#A Datensatz Ändern#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Die Inhalte des aktuellen Satzes werden im Satzformu­
- lar zum Ändern angeboten.
-
-Verweise: Abschnitt 3.4
- Benutzerhandbuch Abschnitt 6.3 und 10.2
-
-
-#linefeed (0.5)#
-#on ("b")#T Datensatz Tragen#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: EUDAS-Dateiname, mit Zeigen, eine Wahl
-
-Zweck: Mit dieser Funktion kann der aktuelle Satz in eine
- anderen EUDAS-Datei gleicher Struktur transportiert
- werden. In der Zieldatei wird er am Ende angefügt.
-
-Verweise: Abschnitt 4.4
- Benutzerhandbuch Abschnitt 6.3
-
-
-#linefeed (0.5)#
-#on ("b")#H Datensatz Holen#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: EUDAS-Dateiname, mit Zeigen, eine Wahl
-
-Zweck: Mit dieser Funktion kann der letzte Satz einer ande­
- ren Datei vor dem aktuellen Satz eingefügt werden,
- sofern die Struktur gleich ist. Damit kann ein vorher­
- gegangenes Tragen rückgängig gemacht werden.
-
-Verweise: Abschnitt 4.4
- Benutzerhandbuch Abschnitt 6.3
-
-
-#linefeed (0.5)#
-#on ("b")#F Feldauswahl#off("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Die Felder der aktuellen Datei werden in einer Aus­
- wahl angeboten. Am Bildschirm werden danach nur die
- ausgewählten Felder in der gewählten Reihenfolge
- dargestellt. Die Auswahl hat jedoch nur Auswirkung
- auf die Darstellung am Bildschirm, anderen Funktionen
- stehen nach wie vor alle Felder zur Verfügung. Die
- Auswahl gilt bis zum Sichern, sie wird also nicht mit
- der Datei abgespeichert.
-
-Verweise: Abschnitt 4.1
- Benutzerhandbuch Abschnitt 10.1
-
-
-2.3 Menü 'Gesamtdatei'
-
-
-#linefeed (0.5)#
-#on ("b")#K Satzauswahl Kopieren#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: EUDAS-Dateiname, mit Zeigen, eine Wahl
- Name Kopiermuster, ohne Zeigen
-
-Zweck: Mit dieser Funktion werden die ausgewählten bzw.
- markierten Sätze der aktuellen Datei in eine andere
- Datei kopiert. Welche Felder kopiert werden sollen und
- in welcher Reihenfolge, wird durch ein Kopiermuster
- festgelegt. Dieses Kopiermuster kann benannt werden
- oder unbenannt nur für ein Mal erstellt werden. Wird
- das Kopiermuster neu erstellt, wird ein Standard-
- Kopiermuster zum Ändern angeboten.
-
-Verweise: Abschnitt 4.4
- Benutzerhandbuch Abschnitt 11.2
-
-
-#linefeed (0.5)#
-#on ("b")#T Satzauswahl Tragen#off("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: EUDAS-Dateiname, mit Zeigen, eine Wahl
-
-Zweck: Transportieren der ausgewählten bzw. markierten
- Sätze in eine andere Datei gleicher Struktur. Die Sätze
- werden in der Zieldatei am Ende eingefügt.
-
-Verweise: Abschnitt 4.4
- Benutzerhandbuch Abschnitt 11.3
-
-
-#linefeed (0.5)#
-#on ("b")#V Satzauswahl Verändern#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: Name Änderungsmuster, mit Zeigen, mehrfache Wahl
-
-Zweck: Bearbeiten der ausgewählten bzw. markierten Sätze
- der aktuellen Datei nach Vorgabe einer Änderungs­
- vorschrift.
-
-Verweise: Abschnitt 4.4
- Benutzerhandbuch Abschnitt 11.4
-
-
-#linefeed (0.5)#
-#on ("b")#U Ãœbersicht Satzauswahl#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Anzeige aller ausgewählten Sätze in einem Über­
- sichtsformat mit einem Satz pro Bildschirmzeile. Die
- Felder, die in der Ãœbersicht angezeigt werden sollen,
- können vorher ausgewählt werden. In der Übersicht ist
- Blättern und Markieren von Sätzen möglich.
-
-Verweise: Abschnitt 4.1
- Benutzerhandbuch Abschnitt 10.5
-
-
-#linefeed (0.5)#
-#on ("b")#S Aktuelle Datei Sortieren#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Sortieren der aktuellen Datei in beliebiger Reihenfolge
- auf- oder absteigend. Zum Sortieren muß eine Ar­
- beitskopie angelegt sein. Die Feldreihenfolge, in der
- sortiert werden soll, wird vorher erfragt.
-
-Verweise: Abschnitt 4.3
- Benutzerhandbuch Abschnitt 11.1
-
-
-#linefeed (0.5)#
-#on ("b")#L Alle Markierungen Löschen#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Löschen aller Markierungen der aktuellen Datei.
-
-Verweise: Abschnitt 4.2
- Benutzerhandbuch Abschnitt 10.4
-
-
-2.4 Menü 'Drucken'
-
-
-#linefeed (0.5)#
-#on ("b")#D Satzauswahl Drucken#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: Name Druckmuster, mit Zeigen, mehrfache Wahl
-
-Zweck: Ausdruck des Inhalts der ausgewählten oder markier­
- ten Sätze in druckbarer Form nach Vorgabe eines
- Druckmusters. Die Ausgabe kann automatisch zum
- Drucker geschickt werden oder erst in einer Datei
- zwischengespeichert werden.
-
-Verweise: Kapitel 5
- Benutzerhandbuch Abschnitt 7.1 und 7.2
-
-
-#linefeed (0.5)#
-#on ("b")#R Richtung Druckausgabe#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Mit dieser Funktion kann festgelegt werden, ob die
- Druckausgabe automatisch zum Drucker geschickt wird,
- in eine bestimmte Datei oder in eine automatisch
- eingerichtete Datei geschrieben wird.
-
- Die Angabe einer bestimmten Datei gilt nur für den
- nächsten Druckvorgang. Sie muß also gegebenenfalls
- wieder neu eingestellt werden.
-
-Verweise: Abschnitt 5.2
- Benutzerhandbuch Abschnitt 7.2 und 12.1
-
-
-#linefeed (0.5)#
-#on ("b")#E Textdatei Editieren#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: Name Textdatei, mit Zeigen, mehrfache Wahl
-
-Zweck: Aufruf des EUMEL-Editors zum Erstellen und Ändern
- von Druckmustern und Änderungsmustern sowie zum
- Ansehen der Druckausgabe.
-
-Verweise: Benutzerhandbuch Abschnitt 7.2
-
-
-#linefeed (0.5)#
-#on ("b")#A Textdatei Ausdrucken#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: Name Textdatei, mit Zeigen, mehrfache Wahl
-
-Zweck: Mit dieser Funktion kann eine Textdatei oder die
- zwischengespeicherte Ausgabe des Druckens einer
- EUDAS-Datei zum Drucker geschickt werden.
-
-Verweise: Benutzerhandbuch Abschnitt 7.2
-
-
-#linefeed (0.5)#
-#on ("b")#N Textdatei Nachbearbeiten#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: Name Textdatei, mit Zeigen, mehrfache Wahl
-
-Zweck: Mit dieser Funktion kann die zwischengespeicherte
- Ausgabe des Druckens einer EUDAS-Datei mit den
- Textkosmetikprogrammen 'lineform' und 'pageform'
- bearbeitet werden.
-
-Verweise: Benutzerhandbuch Abschnitt 12.1
-
-
-2.5 Menü 'Dateien'
-
-
-#linefeed (0.5)#
-#on ("b")#U Ãœbersicht Dateien System#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Übersicht über die Dateien im System in der aktuellen
- Benutzertask.
-
-Verweise: Benutzerhandbuch Abschnitt 16.1
-
-
-#linefeed (0.5)#
-#on ("b")#L Datei Löschen#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: Dateiname, mit Zeigen, mehrfache Wahl
-
-Zweck: Löschen einer beliebigen Datei in der aktuellen Be­
- nutzertask nach Anfrage.
-
-Verweise: Benutzerhandbuch Abschnitt 16.1
-
-
-#linefeed (0.5)#
-#on ("b")#N Datei Umbenennen#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: Dateiname, mit Zeigen, mehrfache Wahl
- Neuer Name, ohne Zeigen
-
-Zweck: Umbenennen einer beliebigen Datei in der aktuellen
- Benutzertask.
-
-Verweise: Benutzerhandbuch Abschnitt 16.1
-
-
-#linefeed (0.5)#
-#on ("b")#K Datei Kopieren#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: Dateiname, mit Zeigen, mehrfache Wahl
- Zieldateiname, ohne Zeigen
-
-Zweck: Anfertigen einer logischen Kopie einer beliebigen
- Datei in der aktuellen Benutzertask.
-
-Verweise: Benutzerhandbuch Abschnitt 16.1
-
-
-#linefeed (0.5)#
-#on ("b")#P Platzbedarf einer Datei#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: Dateiname, mit Zeigen, mehrfache Wahl
-
-Zweck: Zeigt den belegten Speicherplatz einer beliebigen
- Datei in der aktuellen Benutzertask.
-
-Verweise: Benutzerhandbuch Abschnitt 16.1
-
-
-#linefeed (0.5)#
-#on ("b")#A Datei Aufräumen#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: Dateiname, mit Zeigen, mehrfache Wahl
-
-Zweck: Reorganisieren einer Textdatei oder einer EUDAS-
- Datei, um Platz zu sparen oder den Zugriff zu be­
- schleunigen. Empfiehlt sich bei stark veränderten
- oder umsortierten Dateien.
-
-Verweise: Benutzerhandbuch Abschnitt 16.1
-
-
-2.6 Menü 'Archiv'
-
-
-#linefeed (0.5)#
-#on ("b")#U Ãœbersicht Dateien Archiv#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Übersicht aller Dateien auf der eingelegten Archivdis­
- kette.
-
-Verweise: Benutzerhandbuch Abschnitt 16.2
-
-
-#linefeed (0.5)#
-#on ("b")#D Archivübersicht Drucken#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Die Archivübersicht wird direkt zum Drucker ge­
- schickt.
-
-Verweise: Benutzerhandbuch Abschnitt 16.2
-
-
-#linefeed (0.5)#
-#on ("b")#K Datei Kopieren vom Archiv#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: Dateiname, mit Zeigen, mehrfache Wahl
-
-Zweck: Eine Datei auf der Archivdiskette wird in die aktuelle
- Benutzertask kopiert.
-
-Verweise: Benutzerhandbuch Abschnitt 16.2
-
-
-#linefeed (0.5)#
-#on ("b")#S Datei Schreiben auf Archiv#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: Archivname
- Dateiname, mit Zeigen, mehrfache Wahl
-
-Zweck: Eine Datei aus der aktuellen Benutzertask wird auf
- die eingelegte Archivdiskette geschrieben.
-
-Verweise: Benutzerhandbuch Abschnitt 16.2
-
-
-#linefeed (0.5)#
-#on ("b")#L Datei Löschen auf Archiv#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: Archivname
- Dateiname, mit Zeigen, mehrfache Wahl
-
-Zweck: Löschen einer Datei auf der eingelegten Archivdisket­
- te. Der Platz kann jedoch nicht immer wiederverwendet
- werden.
-
-Verweis: Benutzerhandbuch Abschnitt 16.2
-
-
-#linefeed (0.5)#
-#on ("b")#I Archivdiskette Initialisieren#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: keine
-
-Zweck: Mit dieser Funktion kann eine Archivdiskette komplett
- gelöscht werden. Die Diskette kann dabei auch gleich­
- zeitig formatiert werden, falls der Rechner dies zu­
- läßt. Das Initialisieren ist notwendig, bevor eine neue
- Diskette als Archiv verwendet werden kann.
-
-Verweise: Benutzerhandbuch Abschnitt 16.2
-
-
-#linefeed (0.5)#
-#on ("b")#Z Zielarchiv einstellen#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: Managertaskname, ohne Zeigen
-
-Zweck: Mit dieser Funktion kann eine Managertask angegeben
- werden, die als Ziel der Archivoperationen dient.
- Damit können Dateien auch in beliebigen Managertasks
- oder über das EUMEL-Netz gesichert werden.
-
- Es wird erfragt, ob die angegebene Task ein Archiv­
- manager oder ein gewöhnlicher Dateimanager ist.
-
-Verweise: Benutzerhandbuch Abschnitt 16.2
-
-
-#linefeed (0.5)#
-#on ("b")#P Paßwort einstellen#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: Paßwort
-
-Zweck: Mit dieser Funktion kann ein Paßwort eingestellt
- werden, das bei der Kommunikation mit allgemeinen
- Managertasks überprüft wird.
-
-Verweise: Benutzerhandbuch Abschnitt 16.2
-
-
-#linefeed (0.5)#
-#on ("b")#R Archivmanager Reservieren#off ("b")#
-#linefeed (1.07)#
-_____________________________________________________
-
-Parameter: Reservierungstext
-
-Zweck: Falls als Zielarchiv eine Managertask eingestellt ist,
- die zwar kein Archivmanager ist, aber reserviert
- werden muß (z.B. 'DOS'), kann die Reservierung mit
- dieser Funktion ausgeführt werden. Die Freigabe
- erfolgt automatisch beim Verlassen des Menüs.
-
-Verweise: Benutzerhandbuch Abschnitt 16.2
-
-
-
-2.7 Kurzabfrage
-
-Wird 'eudas' innerhalb des EUMEL-Editors aufgerufen, so wird eine
-spezielle Kurzabfrage gestartet. Diese ermöglicht die Übernahme von
-Druckdaten direkt in die editierte Datei.
- Zunächst wird der Dateiname der zu verwendenden EUDAS-
-Datei erfragt. Diese Datei wird dann geöffnet. Vorher geöffnete und
-veränderte Dateien werden nach Anfrage gesichert.
- Als nächstes kann für die folgende Übersicht eine Feldauswahl
-eingestellt werden, damit die relevanten Felder auch auf dem Bild­
-schirm erscheinen.
- Danach beginnt ein wiederholbarer Prozeß mit der Eingabe
-eines Suchmusters nach Anfrage. Die ausgewählten Sätze werden
-dann in einer Übersicht gezeigt. In der Übersicht können auch Sätze
-markiert werden.
- Nach Verlassen der Übersicht bestehen drei Möglichkeiten zum
-Drucken: Falls mindestens ein Satz markiert wurde, können nach
-Anfrage alle markierten Sätze gedruckt werden. Wurde kein Satz
-markiert, können nach Anfrage alle ausgewählten (bzw. vorher
-angezeigten) Sätze gedruckt werden. Wird diese Frage jeweils ver­
-neint, kann nach Anfrage auch der aktuelle Satz als einziger ge­
-druckt werden.
- Wurde eine der Fragen bejaht, wird der Name des Druckmusters
-erfragt, das bereits existieren muß. Das Ergebnis der Druckausgabe
-wird dann an der aktuellen Cursorposition in der editierten Datei
-eingefügt.
- Der Prozeß kann danach mit einem anderen Suchmuster wieder­
-holt werden. Dabei werden alle Markierungen wieder gelöscht.
-
diff --git a/doc/eudas/eudas.ref.3 b/doc/eudas/eudas.ref.3
deleted file mode 100644
index 9b58b9b..0000000
--- a/doc/eudas/eudas.ref.3
+++ /dev/null
@@ -1,270 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (31)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-3 Das virtuelle Dateimodell
-
-
-
-3.1 Dateistruktur
-
-Eine EUDAS-Datei hat folgende Bestandteile:
-
-- 0 bis 5000 #on("i")#Sätze#off("i")#, von 1 an durchnumeriert. Jeder Satz enthält für
- jedes Feld einen variabel langen Text als Inhalt, der standard­
- mäßig leer ist.
-
-- 1 bis 256 #on("i")#Felder#off("i")#, die die Sätze aufteilen. Jedes Feld besitzt einen
- #on("i")#Feldnamen#off("i")# als Text und einen von vier #on("i")#Feldtypen#off("i")# (TEXT, ZAHL,
- DATUM oder DIN). Der Feldname dient zur Identifizierung des
- Feldes, der Feldtyp spezifiziert die Art der Behandlung beim Ver­
- gleichen von Feldern.
-
-- Drei Zusatztexte. Der erste nimmt die #on("i")#Prüfbedingungen#off("i")# auf, der
- zweite speichert das Datum der letzten Veränderung und der
- dritte kann allgemeine #on("i")#Notizen#off("i")# aufnehmen.
-
-- Einen #on("i")#Satzzeiger#off("i")#, der einen bestimmten Satz als aktuellen Satz
- auszeichnet. Der Satzzeiger kann durch Positionierungsoperatio­
- nen verändert werden.
-
-- Eine #on("i")#Sortierreihenfolge#off("i")#, die angibt, in welcher Feldreihenfolge die
- Datei zuletzt sortiert worden ist. Dazu für jeden Satz eine Anga­
- be, ob er entsprechend dieser Reihenfolge an der richtigen Posi­
- tion steht.
-
-- Eine interne Datenstruktur, die beschleunigten Zugriff auf eine
- Satz nach dem Inhalt des ersten Feldes ermöglicht. Diese Struktur
- steht ganz unter Kontrolle von EUDAS und kann nicht von außen
- manipuliert werden.
-
-
-3.2 Öffnen
-
-#on("b")#Virtuelle Datei#off("b")# Die meisten EUDAS-Funktionen arbeiten
-nicht
-direkt auf einer EUDAS-Datei, sondern auf der sogenannten #on("i")#vir­
-tuellen Datei#off("i")#, die aus mehreren realen Dateien bestehen kann. Die
-virtuelle Datei erscheint nach außen hin wie eine einzelne
-EUDAS-Datei. Die Operationen auf der virtuellen Datei werden je­
-weils auf die einzelnen Bestandteile abgebildet.
- Damit eine EUDAS-Datei Bestandteil der virtuellen Datei wird,
-muß sie geöffnet werden. Dieses Öffnen kann auf dreierlei Art und
-Weise geschehen.
- Das Öffnen der ersten Datei stellt eine neue virtuelle Datei
-her. Die Feldnamen und Feldeigenschaften der ersten Datei werden
-in der virtuellen Datei übernommen. Dies ist der Normalfall, in dem
-sich die virtuelle Datei noch nicht von der zugrundeliegenden Datei
-unterscheidet.
- Bei diesem ersten Öffnen muß angegeben werden, ob die vir­
-tuelle Datei verändert werden soll oder nicht. Falls die virtuelle
-Datei verändert werden soll, wird eine Arbeitskopie aller geöffneten
-Dateien angelegt. Die Ursprungsdateien können erst am Ende der
-Arbeit mit den geänderten Kopien überschrieben werden.
-
-#on("b")#Weitere Dateien#off("b")# Weitere Dateien können gekettet oder
-gekoppelt
-werden. Gekettete Dateien werden logisch an die zuerst geöffnete
-Datei angehängt. Ihre Dateistruktur wird ignoriert, sollte aber mit
-der ersten Datei übereinstimmen. Die Folge aneinander geketteter
-EUDAS-Dateien wird als #on("i")#Hauptdatei#off("i")# bezeichnet.
- In der Hauptdatei werden die Sätze von 1 an durchnumeriert;
-die Aufeinanderfolge der Sätze wird durch die Anordnung der Sätze
-in den einzelnen Dateien und die Reihenfolge bestimmt, in der die
-Dateien gekettet wurden.
- Die gekoppelten Dateien werden der Hauptdatei untergeordnet.
-Die in ihnen enthaltenen Informationen werden nur angezeigt, wenn
-sie mit einem Satzinhalt der Hauptdatei korrespondieren. Der
-Mechanismus dieser Satzkopplung wird im nächsten Abschnitt
-beschrieben.
-
-
-#free (8.0)#
-
-#center#Abb. 3-1 Schematischer Aufbau der virtuellen Datei
-
-
-
-3.3 Koppeln
-
- Die Sätze der gekoppelten Dateien werden in Relation zu den
-Sätzen in der Hauptdatei gesetzt. Zu jedem Satz in der Hauptdatei
-kann eine Anzahl von Sätzen aus jeder Koppeldatei gehören. Diese
-Sätze müssen in den Inhalten der sogenannten #on("i")#Koppelfelder#off("i")# über­
-einstimmen.
- Welche Felder Koppelfelder sind, richtet sich nach den Feld­
-namen. Die ersten Felder der Koppeldatei, die auch in der Haupt­
-datei vorhanden sind, werden als Koppelfelder betrachtet. Die Kop­
-pelfelder müssen also bei der Koppeldatei am Anfang stehen - in
-der Hauptdatei kann jedes beliebige Feld ein Koppelfeld sein.
- Wenn eine Datei zur virtuellen Datei gekoppelt wird, werden
-alle Felder, die nicht Koppelfelder sind, in die virtuelle Datei auf­
-genommen. Die Koppelfelder brauchen nicht noch mal wiederholt zu
-werden, da ihr Inhalt ja immer identisch ist.
- Zu beachten ist, daß bei diesem Verfahren auch Namenskonflik­
-te entstehen können, wenn nach den Koppelfeldern später wieder
-ein Feldname vorkommt, der auch in der Hauptdatei vorhanden ist.
-In den Fällen, in denen Felder durch ihren Namen angesprochen
-werden, ist dann das zweite Feld gleichen Namens nicht verfügbar.
-
-
-#free (7.0)#
-
-#center#Abb. 3-2 Schema des Koppelvorgangs
-
-
-#on("b")#Kombinationen#off("b")# Beim Vorwärtsgehen in der virtuellen Datei
-werden
-zu jedem Satz der Hauptdatei nacheinander alle möglichen Kombina­
-tionen der zugehörigen Koppelsätze angezeigt, denn es können
-mehrere passende Koppelsätze vorhanden sein. Die Satznummer
-bleibt dabei gleich; die einzelnen Kombinationen werden von 1 an
-durchgezählt. Beim Rückwärtsgehen wird aus technischen Gründen
-immer nur die erste Kombination angezeigt.
- Existiert zu einem Satz kein passender Koppelsatz, so bleiben
-die entsprechenden Felder leer. Die Koppelsätze müssen in der
-ganzen Koppeldatei gesucht werden, daher ist bei großen Koppel­
-dateien die Suchzeit zu berücksichtigen.
-
-
-3.4 Änderungen
-
-In der virtuellen Datei kann auch geändert werden. Dabei ist jedoch
-Vorsicht angebracht. Es muß festgelegt sein, wie Änderungen der
-einzelnen Felder auf die beteiligten Dateien abgebildet werden.
- Falls die virtuelle Datei keine Koppeldateien enthält, werden
-Änderungen am aktuellen Satz an der zugehörigen Datei durchge­
-führt. Das Löschen eines Satzes wird auch direkt in der Datei
-durchgeführt. Ein neuer Satz wird immer in der Datei eingefügt, zu
-der der aktuelle Satz gehört - am Ende der ersten Datei kann also
-kein Satz eingefügt werden, wenn noch weitere Dateien folgen.
- Enthält die virtuelle Datei Koppeldateien, werden die Änderun­
-gen in der Hauptdatei wie oben beschrieben durchgeführt. Änderun­
-gen, die Felder in den Koppeldateien betreffen, werden nach folgen­
-der Entscheidungstabelle behandelt:
-
- 1 2 3 4 5
- ---------------
- Koppelfelder verändert N J J N N
- Übrige Felder verändert N - - J J
- Ãœbrige Felder leer - J N - N
- Vorher Koppelsatz vorhanden - - - J N
- ---------------
- Neuen Satz einfügen x x
- Koppelsatz ändern x
- Kopplung aktualisieren x
-
-Fall 1: Es wurden keine Veränderungen an den Feldern des Kop­
- pelsatzes vorgenommen, daher ist auch keine Aktion not­
- wendig.
-
-Fall 2: Eines der Koppelfelder wurde verändert. Die Änderung wird
- in der Hauptdatei durchgeführt. Die übrigen Felder des
- Koppelsatzes sind jedoch als leer angegeben. In diesem Fall
- wird der Koppelsatz nicht verändert, sondern nur eine
- neue Korrespondenz gesucht.
-
-Fall 3: Eines der Koppelfelder wurde verändert, gleichzeitig ent­
- halten aber auch die anderen Felder Informationen. In
- diesem Fall wird ein neuer Satz in der Koppeldatei ange­
- fügt, der die neuen Inhalte enthält. So wird vermieden,
- daß an anderer Stelle plötzlich kein passender Koppelsatz
- mehr vorhanden ist.
-
-Fall 4: Nur Felder der Koppeldatei, die nicht Koppelfelder sind,
- wurden verändert, außerdem existierte ein korrespondie­
- render Satz in der Koppeldatei. In diesem Fall werden die
- Informationen im Koppelsatz abgeändert.
-
-Fall 5: Wie 4, nur war vorher noch kein Koppelsatz vorhanden
- (Felder waren leer). In diesem Fall muß ein neuer Satz in
- die Koppeldatei eingefügt werden. Einfügungen in die
- Koppeldatei geschehen immer am Dateiende.
-
-#on("b")#Einfügen/Löschen#off("b")# Beim Löschen eines Satzes der virtuellen
-Datei
-durch Tragen bleiben die Koppeldateien unverändert. Nach dem
-Einfügen eines neuen Satzes wird nur dann ein Satz in einer Kop­
-peldatei eingefügt, wenn dieser Satz nicht nur Koppelfelder enthal­
-ten würde. Falls beim Einfügen nur die Koppelfelder angegeben
-werden, wird ein korrespondierender Satz in der Koppeldatei ge­
-sucht. Vergleichen Sie hierzu die Regeln beim Ändern.
-
-
-3.5 Sichern
-
-Falls Änderungen der virtuellen Datei erlaubt sind, arbeitet EUDAS
-immer auf Sicherheitskopien der beteiligten Dateien. Eine Datei, die
-wirklich verändert wurde, muß vor dem Aufbau einer neuen virtuel­
-len Datei gesichert oder explizit gelöscht werden.
- Für jede einzelne Datei kann festgelegt werden, ob sie gesi­
-chert werden soll oder nicht. Als Hilfe wird dazu für jede Datei
-angegeben, ob sie tatsächlich verändert wurde oder nicht. Die
-Arbeitskopie kann beim Sichern die alte Version überschreiben oder
-unter einem neuen Namen gesichert werden.
- Am Ende des Sicherns können die Arbeitskopien gelöscht wer­
-den. Anderenfalls werden die Dateien so betrachtet, als ob sie di­
-rekt nach dem Sichern wieder geöffnet worden wären und stehen
-weiterhin zur Verfügung.
- Falls alle Dateien entweder gesichert oder nicht verändert
-sind, werden beim nächsten Öffnen einer neuen virtuellen Datei die
-vorherigen Arbeitskopien gelöscht.
-
-
-3.6 Umschalten auf Koppeldatei
-
-Falls eine Datei gekoppelt ist, kann man die virtuelle Datei auf
-diese Koppeldatei umschalten. Dadurch verhält sich die virtuelle
-Datei so, als ob nur diese Koppeldatei geöffnet wäre. Die Einstel­
-lungen der Hauptdatei wie Markierungen und Suchbedingung bleiben
-jedoch erhalten und stehen beim Zurückschalten wieder zur Verfü­
-gung.
- Die Satzposition der Koppeldatei beim letzten Umschalten wird
-ebenfalls gespeichert und wird beim nächsten Umschalten wieder
-eingenommen, unabhängig von der tatsächlichen Satzposition der
-Koppeldatei zu diesem Zeitpunkt.
- Für die Koppeldatei können eigene Markierungen vergeben
-werden, die auch nach dem Umschalten gespeichert bleiben. Auch
-ein Suchmuster kann für die Koppeldatei eingestellt werden, dies
-geht jedoch beim Zurückschalten wieder verloren. Die eingestellte
-Feldauswahl für die Bildschirmanzeige geht leider bei jedem Um­
-schalten verloren.
- Das Umschalten kann entweder im Menü 'Einzelsatz' oder beim
-Einfügen und Ändern durch ESC 'K' bewirkt werden, ebenso das
-Zurückschalten nur im Menü 'Einzelsatz'. Beim Umschalten aus Ein­
-fügen oder Ändern erfolgt beim Zurückschalten eine Rückkehr in
-diesen Zustand. Dabei können nach Anfrage die Koppelfelder des
-aktuellen Satzes der Koppeldatei in die Hauptdatei übernommen und
-damit eine bestimmte Kopplung bewirkt werden.
-
-
-3.7 Mehrbenutzerbetrieb
-
-Durch Einstellen einer Managertask für den Mehrbenutzerbetrieb
-können auch Dateien dieser Managertask beim Öffnen direkt ver­
-wendet werden. Die Datei wird automatisch aus der Managertask
-kopiert und geöffnet.
- Falls die Datei geändert werden soll, wird eine Sperre in der
-Managertask gesetzt, die verhindert, daß auch ein anderer Benutzer
-diese Datei zum Ändern öffnet. Beim Sichern erfolgt dann ein Rück­
-schreiben der Arbeitskopie. Die Sperre wird jedoch erst dann zu­
-rückgesetzt, wenn alle Arbeitskopien gelöscht werden, da erst dann
-keine Möglichkeit des Rückschreibens mehr besteht.
- Alle Dateien der Managertask werden bei der Dateiauswahl zum
-Öffnen mit angeboten. Falls eine Datei in beiden Tasks existiert,
-wird die Datei in der Managertask genommen, die Datei der eigenen
-Task jedoch erst nach Anfrage überschrieben.
- Damit die Sperre funktionieren kann, muß EUDAS in der Mana­
-gertask zur Verfügung stehen und die Task muß #on("i")#nach#off("i")# dem Insertie­
-ren von EUDAS als 'global manager' definiert werden (nicht 'free
-global manager' verwenden).
-
diff --git a/doc/eudas/eudas.ref.4 b/doc/eudas/eudas.ref.4
deleted file mode 100644
index cfd6daf..0000000
--- a/doc/eudas/eudas.ref.4
+++ /dev/null
@@ -1,441 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (39)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-4 Ansehen und Bearbeiten
-
-
-
-4.1 Anzeige
-
-Die Anzeige und Eingabe von Einzelsätzen sowie die Eingabe von
-Suchmustern geschieht in einem Standardformular in einem recht­
-eckigen Fenster. Dieses Fenster befindet sich in der rechten Bild­
-schirmhälfte.
- Das Formular besteht aus vier Teilen: der Ãœberschrift, den
-Feldnamen, den Feldinhalten und der Abschlußzeile (s. Abbildung).
-
- Ãœberschrift
-#free (0.3)#
- Satz 33 ..SUCH+..MARK-... datei ............... Feld 1
- Feld 1
- Feld 2
- Feld 3 Feldinhalte
-
- Feld 4
- ..............................................................
-#free (0.3)#
- Feldnamen Abschlußzeile
-
-
-
-#on("b")#Ãœberschrift#off("b")# Die Ãœberschrift zeigt folgende Informationen
-an:
-
- Satz n[-m]
- Die Satznummer des aktuellen Satzes, bei gekoppelten Dateien
- auch die Satzkombination.
-
- SUCH+/-
- Zeigt an, ob der aktuelle Satz die eingestellte Suchbedingung
- erfüllt oder nicht (wird während Eintragungen nicht angezeigt).
- Wenn keine Suchbedingung eingestellt ist, erscheint diese An­
- zeige nicht.
-
- MARK+/-
- Zeigt an, ob der aktuelle Satz markiert ist oder nicht (Wird
- während Eintragungen nicht angezeigt). Wenn kein Satz mar­
- kiert ist, erscheint diese Anzeige nicht.
-
- ENDE
- Wird hinter dem letzten Satz der Datei als Kennzeichnung des
- Endesatzes ausgegeben.
-
- 'Dateiname'
- Gibt den Namen der ersten geöffneten Datei an.
-
- <KOPPPEL>
- Erscheint statt des Dateinamens, wenn auf eine Koppeldatei
- umgeschaltet wurde.
-
- Feld n/Zeile n
- Zeilennummer des obersten angezeigten Feldes (bei Anzeige)
- bzw. der aktuellen Cursorzeile (während Eintragungen).
-
-#on("b")#Feldteil#off("b")# Die Feldnamen sind zur Unterscheidung von den
-Feld­
-inhalten invers dargestellt. Die Breite der Feldnamen richtet sich
-nach der Länge des längsten Feldnamens. Ist dieser zu lang, um
-noch eine ordentliche Anzeige zu ermöglichen, wird bei einer be­
-stimmten Länge der Rest des Namens abgeschnitten.
- Zwischen dem Feldnamen an der linken Seite und dem dane­
-benstehenden Feldinhalt besteht immer eine Korrespondenz, d.h. der
-Inhalt eines Feldes wird direkt neben dem Namen dargestellt. In der
-Regel wird pro Feld eine Bildschirmzeile reserviert. Kann der Feld­
-inhalt jedoch nicht mehr in einer Zeile untergebracht werden, wer­
-den weitere Zeilen zur Darstellung dieses Feldes herangezogen. In
-diesen Zeilen steht statt des Feldnamens nur ein markierter Leer­
-raum.
- Alle folgenden Zeilen ohne Namen gehören zu dem gleichen
-Feld. Der Inhalt wird auf diese Zeilen umbrochen, d.h. wenn ein
-Wort nicht mehr auf die Zeile paßt, wird es komplett in die nächste
-Zeile geschrieben (wie beim Editor). Wörter werden nur dann zer­
-schnitten, wenn sie nicht als Ganzes auf eine Zeile passen. Wörter
-werden untereinander durch Leerzeichen getrennt.
- Aus Effizienzgründen werden in bestimmten Fällen auch mehr
-Folgezeilen als nötig angezeigt. Hat nämlich ein neuer Satz einen
-kürzeren Inhalt als der vorige, so werden die Feldnamen nur dann
-wieder zusammengerückt, wenn das ganze Bild neugeschrieben wer­
-den muß. Anderenfalls werden nur die Feldinhalte aktualisiert.
- Die Bildausgabe wird unterbrochen, wenn 'w' oder 'z' gedrückt
-wurde, da dann die Inhalte des aktuellen Satzes nicht mehr inter­
-essieren.
-
-#on("b")#Rollen#off("b")# Da nicht alle Felder auf den Bildschirm passen
-müssen, kann das Bild gerollt werden.
- Mit ESC UNTEN wird um eine Seite nach unten geblättert, mit
-ESC OBEN wieder zurück. Hinter dem letzten Feld erscheint ein
-markierter Balken als Abschlußzeile. Weiter als bis zum Erscheinen
-dieses Balken kann nicht gerollt werden. Mit ESC '1' wird ganz an
-den Anfang gerollt, mit ESC '9' ganz ans Ende.
- Bei Feldern, die sich über mehrere Zeilen erstrecken, kann es
-passieren, daß nach dem Rollen die erste Bildschirmzeile nicht die
-erste Zeile eines Feldes ist, also der erste Teil eines Feldes nicht
-dargestellt wird. Trotzdem wird in diesem Fall in der ersten Anzei­
-gezeile der Feldname angezeigt.
-
-#on("b")#Feldauswahl#off("b")# Man kann auswählen, welche Felder in welcher
-Rei­
-henfolge angezeigt werden sollen. Dies dient der besseren Ãœbersicht.
-Von der Anzeige werden nur die ausgewählten Felder behandelt, die
-anderen Felder bleiben leer, werden nicht verändert oder berück­
-sichtigt. Die Anzeigeauswahl ändert jedoch nichts an der Datei­
-struktur.
- Die Feldauswahl ist keine permanente Eigenschaft einer
-EUDAS-Datei. Sie geht daher bei einem neuen Öffnen oder beim
-Umschalten auf eine Koppeldatei verloren.
-
-#on("b")#Ãœbersicht#off("b")# Im Gegensatz zur normalen Anzeige, bei der ein
-Satz pro
-Bildschirm dargestellt wird, können in der Übersicht mehrere Sätze
-gleichzeitig überschaut werden. Dabei wird jeder Satz in einer Zeile
-untergebracht. Die Auswahl der Felder, die in der Übersicht er­
-scheinen sollen, wird vor Beginn der Funktion erfragt.
- In jeder Zeile steht die Nummer des jeweiligen Satzes, eine
-Anzeige, ob er markiert ist (+) oder nicht (-) und die Feldinhalte
-in der gewählten Reihenfolge und Auswahl, jeweils duch Komma und
-Leerzeichen getrennt. Inhalte, die nicht mehr auf die Zeile passen,
-werden abgeschnitten.
- Es werden nur durch das Suchmuster ausgewählte Sätze ange­
-zeigt. Ist der aktuelle Satz nicht ausgewählt, so erscheint an seiner
-Stelle '<< >>' als Hinweis. In der Überschrift sind die Feldnamen
-angegeben - durch Komma getrennt, so viele wie hinpassen.
- Die Satznummer des aktuellen Satzes ist jeweils markiert. In
-der Übersicht kann geblättert werden. HOP OBEN und HOP UNTEN,
-OBEN und UNTEN wirken wie im Editor.
- Durch '+' oder '-' kann auch die Markierung des aktuellen
-Satzes verändert werden.
-
-
-4.2 Satzauswahl
-
-Die Auswahl der Sätze, die gedruckt oder mit den Funktionen aus
-Abschnitt 4.4 bearbeitet werden sollen, kann entweder durch eine
-Suchbedingung oder durch Markierung vorgenommen werden. Wenn
-mindestens ein Satz markiert ist, werden von den Bearbeitungs­
-funktionen nur die markierten Sätze behandelt. Anderenfalls wird
-die eingestellte Suchbedingung beachtet.
- Die Bildschirmanzeige richtet sich immer nur nach der einge­
-stellten Suchbedingung.
-
-#on("b")#Suchmuster#off("b")# Ein Suchmuster gibt für jedes Feld bestimmte
-Bedin­
-gungen an. Es wird im Standardformular mit Hilfe des Satzeditors
-eingegeben. Dabei stehen neben jedem Feld die Bedingungen für
-dieses Feld in einer intuitiv verständlichen Form. Folgende Einzel­
-bedingungen sind möglich:
-
- Muster Inhalt ist gleich Muster
- Muster.. Inhalt ist größergleich Muster
- ..Muster Inhalt ist kleiner Muster
- Muster1..Muster2 Inhalt liegt dazwischen
- *Muster Inhalt endet mit Muster
- Muster* Inhalt beginnt mit Muster
- *Muster* Inhalt enthält Muster
- * Inhalt ist nicht leer
- ++ Satz markiert (unabhängig vom Feldinhalt)
-
-Die ersten vier Einzelbedingungen beachten auch den Typ eines
-Feldes (wie er bei der Feldstruktur eingegeben werden kann und
-beim Sortieren beachtet wird). So werden z.B. bei der Gleichheit von
-Zahlen alle nicht-numerischen Zeichen ignoriert (s. Sortieren).
- Die drei Bedingungen mit Stern können auch miteinander ver­
-knüpft werden. Die Einzelbedingungen müssen dann alle zutreffen,
-damit der Satz ausgewählt wird. So bedeutet zum Beispiel das
-Muster 'M1*M2*M3*M4', daß das Feld mit 'M1' beginnen und mit 'M4'
-enden muß. Außerdem muß es 'M2' und 'M3' enthalten, jedoch nicht
-unbedingt in der angegebenen Reihenfolge.
- Wird der Mustertext durch '&' und einen gültigen Feldnamen der
-aktuellen Datei ersetzt, findet der Vergleich nicht mit einem
-Mustertext, sondern mit dem Inhalt des angegebenen Feldes statt.
-Als Feldtyp für den Vergleich wird in diesem Fall der Typ des Fel­
-des genommen, in dem der Vergleich steht.
-
-#on("b")#Verknüpfung#off("b")# Einzelbedingungen können durch Voranstellen
-von
-'--' verneint werden. Einzelbedingungen für verschiedene Felder
-werden mit UND verknüpft.
- Es gibt zwei Arten der ODER-Verknüpfung: die lokale und die
-globale. Die lokale ODER-Verknüpfung wird durch ein Komma zwi­
-schen Einzelbedingungen realisiert. Sie hat eine höhere Priorität als
-das UND zwischen verschiedenen Feldern. So hat folgendes Such­
-muster
-
-
- Feld1 Bed1,Bed2
- Feld2 Bed3
-
-
-die Bedeutung
-
-
- ( Bed1 (Feld1) ODER Bed2 (Feld2) ) UND Bed3 (Feld3)
-
-
-Die globale ODER-Verknüpfung wird durch ein Semikolon repräsen­
-tiert. Alle Einzelbedingungen nach dem n-ten Semikolon aller Zeilen
-werden zu einer Alternative zusammengefaßt. Damit hat das Such­
-muster
-
-
- Feld1 Bed1;Bed2
- Feld2 Bed3
-
-
-die Bedeutung
-
-
- ( Bed1 (Feld1) UND Bed3 (Feld2) ) ODER Bed2 (Feld1)
-
-
-Damit ergibt sich für die Priorität der einzelnen Konstruktionen
-folgende Reihenfolge:
-
- höchste Einzelbedingung
- Verkettung von Einzelbedingungen (UND)
- Verneinung
- lokales ODER
- UND zwischen Feldern
- niedrigste globales ODER
-
-#on("b")#Optimierung#off("b")# Wenn für das erste Feld einer Datei eine
-Gleich-
-Bedingung angegeben wurde und keine globale Alternative vorhan­
-den ist, kann der Suchvorgang wegen der Dateistruktur optimiert
-werden, indem nur Sätze untersucht werden müssen, die im ersten
-Feld den gesuchten Text enthalten.
-
-#on("b")#Reservierte Zeichen#off("b")# Im Rahmen der Analyse einer
-Musterzeile
-wirken folgende Zeichenfolgen als unbeschränkt reservierte Zeichen:
-
-
- , ; .. *
-
-
-Sie dürfen daher in keinem Mustertext oder Feldnamen vorkommen,
-da sie als Separator wirken. Die beiden folgenden Zeichenfolgen
-werden nur zu Anfang eines durch die vorstehenden Separatoren
-gebildeten Abschnitts erkannt:
-
-
- -- & ++
-
-
-Sie dürfen daher prinzipiell an weiterer Stelle vorkommen, ohne als
-Sonderzeichen erkannt zu werden. Alle anderen Zeichen in der Zeile
-werden dem Mustertext bzw. Feldnamen ohne weitere Interpretation
-zugeordnet.
-
-
-4.3 Sortieren und Reorganisieren
-
-Eine EUDAS-Datei kann in einer beliebigen Feldreihenfolge sortiert
-werden. Mit dieser Angabe kann man bestimmen, welche Felder beim
-Vergleich zweier Sätze berücksichtigt werden sollen und in welcher
-Reihenfolge.
- Die Sortierreihenfolge wird in der Datei gespeichert und wird
-anschließend immer wieder verwendet, wenn keine anderen Angaben
-gemacht wurden.
- Der Sortierzustand einer Datei wird ebenfalls gespeichert. Wenn
-nur wenige Sätze seit der letzten Sortierung verändert wurden,
-müssen auch nur diese Sätze einsortiert werden.
-
-#on("b")#Feldtypen#off("b")# Um eine korrekte Sortierung auch von Zahlen oder
-Daten sicherzustellen, wird jedem Feld einer EUDAS-Datei ein Feld­
-typ zugeordnet, der beim Sortieren (und auch beim Suchen) berück­
-sichtigt wird.
- Es gibt folgende Feldtypen (als Standard wird der Typ TEXT
-verwendet):
-
- TEXT Vergleich von Texten nach dem EUMEL-Code der einzel­
- nen Zeichen. Dies ist Standard und sorgt für schnellst­
- möglichen Vergleich. Die weiteren Typen brauchen erheb­
- lich mehr Zeit.
-
- DIN Vergleich nach DIN 5007 (s. EUMEL-Benutzerhandbuch).
- Umlaute werden korrekt eingeordnet, Groß- und Klein­
- buchstaben werden gleichbehandelt, Sonderzeichen werden
- ignoriert.
-
- ZAHL Der Wert einer Zahl wird verglichen. Außer den Ziffern,
- dem Dezimalkomma und dem Minuszeichen vor der ersten
- Ziffer werden alle anderen Zeichen ignoriert. Das Dezi­
- malkomma ist standardmäßig auf ',' eingestellt, kann aber
- verändert werden (s. Abschnitt 6.5). Die nicht ignorierten
- Zeichen werden in eine REAL-Zahl umgewandelt und dann
- verglichen.
-
- DATUM Es werden Daten der Form 'tt.mm.jj' verglichen. In diesem
- Fall werden Tag und Jahr vertauscht und dann vergli­
- chen. Texte mit einer anderen Länge als 8 werden alle
- als gleich betrachtet.
-
-#on("b")#Reorganisieren#off("b")# Wenn viele Änderungen an einer EUDAS-Datei
-vorgenommen worden sind, steigt ihr Platzbedarf durch viele Text­
-leichen an. In diesem Fall empfiehlt es sich, die Datei zu reorgani­
-sieren. Auch wenn beim Sortieren viele Sätze vertauscht wurden,
-sollte die Datei reorganisiert werden, da beim Sortieren die physi­
-kalische Reihenfolge der Sätze nicht verändert wird. In diesem Fall
-ergibt sich nach dem Reorganisieren ein Geschwindigkeitsvorteil.
-
-
-4.4 Bearbeiten
-
-#on("b")#Kopieren#off("b")# Durch Kopieren kann ein Ausschnitt aus der
-virtuellen
-Datei in eine andere EUDAS-Datei kopiert werden. Es werden alle
-ausgewählten Sätze kopiert. Wenn mindestens ein Satz markiert ist,
-werden alle markierten Sätze als ausgewählt betrachtet, ansonsten
-alle, die durch die Suchbedingung angegeben sind. Die kopierten
-Sätze werden am Ende der Zieldatei angefügt.
- Welche Felder kopiert werden sollen, wird durch das Kopier­
-muster angegeben. Hierbei können auch mehrere Felder zu einem
-verschmolzen werden. Allgemein ergeben sich die Felder der Ziel­
-datei aus einem beliebigen ELAN-Ausdruck.
- Das Kopiermuster ist ein ELAN-Programm und enthält im we­
-sentlichen Ausdrücke der Form
-
-
- "Feldname" K Ausdruck ;
-
-
-Durch diese Anweisung wird der Ausdruck in das Feld der Zieldatei
-mit dem angegebenen Namen kopiert. Existiert dieses Feld in der
-Zieldatei noch nicht, so wird es als letztes angefügt. Falls die
-Zieldatei noch nicht existiert, wird sie eingerichtet. In diesem Fall
-bestimmt also die Reihenfolge der 'K'-Ausdrücke die Reihenfolge der
-Feldnamen in der Zieldatei.
- Da die Reihenfolge der 'K'-Ausdrücke wichtig ist, dürfen diese
-nicht in einer IF-Anweisung stehen, sondern müssen für jeden Satz
-komplett in der gleichen Reihenfolge ausgeführt werden.
-
-#on("b")#Standard-Kopiermuster#off("b")# Vor dem Kopieren wird ein Standard-
-Kopiermuster zum Editieren angeboten, das sich nach der Zieldatei
-richtet. Existiert die Zieldatei noch nicht, wird das Muster so kon­
-struiert, daß alle Felder der virtuellen Datei unverändert kopiert
-werden. Wollen Sie einige Felder nicht kopieren, brauchen Sie nur
-die entsprechenden Zeilen zu löschen; wollen Sie die Felder in eine
-andere Reihenfolge bringen, müssen Sie die Zeilen umordnen.
- Existiert die Zieldatei bereits, gibt das Standard-Kopiermuster
-an, daß alle Felder der Zieldatei einen Wert erhalten. Ist ein Feld
-der Zieldatei in der virtuellen Datei enthalten, so wird dieses ko­
-piert, ansonsten erhält das Feld einen leeren Inhalt. Sie können in
-diesem Fall weitere Felder angeben oder für die leeren Felder Aus­
-drücke formulieren.
-
-#on("b")#Tragen#off("b")# Durch Tragen werden alle ausgewählten Sätze der
-virtuel­
-len Datei in eine andere Datei transportiert. Sie sind in der vir­
-tuellen Datei dann nicht mehr vorhanden. Damit bei diesem Vorgang
-keine Informationen verlorengehen können, muß die Zieldatei so
-viele Felder haben wie die virtuelle Datei. Normalerweise sollte sie
-in der Feldstruktur mit der virtuellen Datei übereinstimmen.
- Die getragenen Sätze werden jeweils am Ende der Datei ange­
-fügt.
- Beim Tragen können zusätzlich noch Konsistenzbedingungen
-überprüft werden. Die Prüfbedingungen sind in der Zieldatei gespei­
-chert und können beim Ändern der Feldstruktur angegeben werden.
- Die Prüfbedingung ist ein ELAN-Programm, das vor dem Tragen
-des jeweiligen Satzes ausgeführt wird. Durch spezielle Testprozedu­
-ren kann das Tragen des Satzes verhindert werden, wenn diese
-Prozeduren ein negatives Ergebnis liefern. Gleichzeitig wird eine
-Meldung in eine Protokolldatei geschrieben, die dann zur Identifi­
-zierung der fehlerhaften Sätze dienen kann.
- Folgende Prüfprozeduren stehen zur Verfügung (siehe auch
-Abschnitt 8.3):
-
-
- pruefe ("Feldname", Bedingung)
-
- Hiermit kann eine beliebige Bedingung (BOOL-Ausdruck in
- ELAN) überprüft werden.
-
-
- wertemenge ("Feldname", "Wert1,Wert2,...,Wertn")
-
- Das Feld muß einen in der angegebenen Liste enthaltenen
- Werte annehmen.
-
-
- feldmaske ("Feldname", "Maske")
-
- Das Feld wird auf Übereinstimmung mit der Maske geprüft.
- Fünf spezielle Zeichen in der Maske können dabei auf
- mehrere Zeichen zutreffen:
- '9' alle Ziffern
- 'a' alle Kleinbuchstaben, Umlaute, 'ß'
- 'A' alle Großbuchstaben, Umlaute
- 'X' alle Zeichen
- '*' Folge von beliebigen Zeichen
- Der Stern sollte sparsam angewendet werden, da er verar­
- beitungsaufwendig ist.
-
-
- eindeutige felder (n)
-
- Die Zahl 'n' gibt an, die wieviel ersten Felder der Zieldatei
- eindeutig sein müssen. Stimmt der zu tragende Satz mit
- einem Satz der Zieldatei in diesen Feldern überein, wird
- eine Fehlermeldung erzeugt.
-
-Es können auch einzelne Sätze manuell getragen werden. In diesem
-Fall wird die Prüfbedingung nicht getestet. Ebenso kann der Satz
-wieder zurückgeholt und in der aktuellen Datei eingefügt werden.
-
-#on("b")#Nach Vorschrift ändern#off("b")# Die ausgewählten Sätze der
-virtuellen
-Datei können automatisch nach einer Verarbeitungsvorchrift geän­
-dert werden. Die Verarbeitungsvorschrift ist ein ELAN-Programm, in
-dem mit Hilfe des Operators 'V' Änderungen angegeben werden:
-
-
- "Feldname" V TEXT-Ausdruck ;
-
-
-Das angegebene Feld erhält den Inhalt, der durch den Ausdruck
-angegeben ist. Änderungen an Koppeldateien werden wie im Dialog
-behandelt (s. Abschnitt 3.4).
-
-
-
-
diff --git a/doc/eudas/eudas.ref.5 b/doc/eudas/eudas.ref.5
deleted file mode 100644
index 02971ea..0000000
--- a/doc/eudas/eudas.ref.5
+++ /dev/null
@@ -1,432 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (49)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-5 Drucken und Druckmuster
-
-
-
-5.1 Druckmustersyntax
-
-Ein Druckmuster ist eine Beschreibung für die Form, in der die In­
-halte einer EUDAS-Datei ausgedruckt werden sollen. Der syntakti­
-sche Aufbau des Druckmusters ist zeilenorientiert und gehorcht
-folgender Syntax:
-
- Druckmuster :
- [ Initialisierungsteil ]
- [ Vorspann ]
- [ Wiederholungsteil ]
- [ Nachspann ]
-
- Initialisierungsteil :
- ( Kommandozeile #char (""124"")# Textzeile )*
- ( GRUPPE-Anweisung #char(""124"")# Textzeile )*
-
- Vorspann :
- VORSPANN-Anweisung Abschnitt
-
- Wiederholungsteil :
- WIEDERHOLUNG-Anweisung Abschnitt
-
- Nachspann :
- NACHSPANN-Anweisung Abschnitt
-
- Abschnitt :
- Musterteil
- [ ABKUERZUNGEN-Anweisung Abkürzungsteil ]
-
- Musterteil :
- ( Musterzeile #char(""124"")# Kommandozeile #char(""124"")#
- MODUS-Anweisung #char (""124"")# MEHR-Anweisung )*
-
-Zur Notation: [] bedeutet optional, ()* beliebig häufige Wiederho­
-lung, #char(""124"")# Alternative und keine Angabe einfache Aneinanderreihung.
-Die verschiedenen Zeilentypen werden weiter unten beschrieben.
- Zusätzlich gilt die Bedingung, daß von Vorspann, Wiederho­
-lungsteil und Nachspann mindestens einer vorhanden sein muß.
-
-#on("b")#Zeilentypen#off("b")# Im Druckmuster gibt es 6 verschiedene
-Zeilentypen:
-
-#on("i")#Kommandozeilen#off("i")#
- Eine Kommandozeile beginnt mit '%%' in der ersten und zweiten
- Spalte. Der Inhalt der Zeile ab Spalte 3 wird dem ELAN-Compi­
- ler übergeben. Die Bedeutung dieser Zeilen ergibt sich aus dem
- in 5.4 beschriebenen Ãœbersetzungsmechanismus.
-
-#on("i")#Anweisungen#off("i")#
- Anweisungen beginnen mit '%' in der ersten Spalte und dienen
- zur Steuerung des Druckgenerators. Der Name der Anweisung
- muß in Großbuchstaben und ohne Leerzeichen geschrieben
- werden. Davor dürfen sich noch Leerzeichen befinden. An­
- schließend können noch Parameter folgen, die nur durch Leer­
- zeichen getrennt aneinander gereiht werden. Die Syntax einer
- Anweisung ähnelt der eines Operators in ELAN.
-
-#on("i")#Textzeilen#off("i")#
- Textzeilen sind die nicht anderweitig markierten Zeilen im
- Initialisierungsteil. Sie werden unverändert an den Anfang
- jeder Druckdatei gestellt.
-
-#on("i")#Musterzeilen#off("i")#
- Musterzeilen sind nicht besonders gekennzeichnete Zeilen im
- Musterteil. Sie enthalten Feldmuster und werden nach dem
- Einsetzen von Inhalten in die Ausgabedatei übernommen. Die
- Interpretation der Musterzeilen wird in Abschnitt 5.3 beschrie­
- ben.
-
-#on("i")#Abkürzungszeilen#off("i")#
- Abkürzungszeilen markieren den Beginn einer Abkürzung im
- Abkürzungsteil eines Abschnittes. Sie werden durch '&' in der
- ersten Spalte gekennzeichnet. Darauf folgt ohne Zwischenraum
- der Name einer Abkürzung (ohne Leerzeichen) und danach
- durch Leerzeichen getrennt ein Semikolon. Der Name der Ab­
- kürzung wird bei der Übersetzung durch einen Refinementnamen
- ersetzt und die Zeile dem ELAN-Compiler übergeben. Der Rest
- der Zeile kann also den Beginn eines werteliefernden Refine­
- ments enthalten.
-
-#on("i")#Programmzeilen#off("i")#
- Programmzeilen sind die nicht durch '&' markierten Zeilen im
- Abkürzungsteil. Sie werden unverändert an den ELAN-Compiler
- übergeben. Der erlaubte Inhalt richtet sich nach dem Überset­
- zungsmechanismus (5.4).
-
-
-5.2 Der Druckvorgang
-
-Der Druckvorgang besteht im wesentlichen darin, daß für alle zu
-bearbeitenden Sätze der Wiederholungsteil einmal interpretiert wird
-und das Ergebnis in eine Ausgabedatei geschrieben wird, die dann
-gedruckt werden kann. Wenn mindestens ein Satz markiert ist, wer­
-den alle markierten Sätze der virtuellen Datei bearbeitet, ansonsten
-alle durch die Suchbedingung erfaßten.
-
-#on("b")#Gruppen#off("b")# Eine #on("i")#Gruppe#off("i")# ist eine Folge von Sätzen, die in einem be­
-stimmten Merkmal übereinstimmen. Durch eine GRUPPE-Anweisung
-der Form
-
-
- % GRUPPE n Ausdruck
-
-
-werden aufeinanderfolgende Sätze mit gleichem Wert des angegebe­
-nen Ausdrucks gruppiert. Ãœber die Nummer 'n' kann festgestellt
-werden, ob sich das angegebene Merkmal verändert hat. Dies ge­
-schieht mit der Prozedur
-
-
- BOOL PROC gruppenwechsel (INT CONST gruppennr)
-
-
-Immer wenn zwischen zwei Sätzen ein Gruppenwechsel stattfindet,
-wird beim vorigen Satz der Nachspann und beim folgenden Satz der
-Vorspann einmal interpretiert. Dies führt dazu, daß entsprechende
-Vorspann- bzw. Nachspannzeilen gedruckt werden.
- Vor dem ersten und nach dem letzten zu bearbeitenden Satz
-wechseln alle Gruppen, d.h. dort wird immer ein Vorspann bzw.
-Nachspann erzeugt.
- Ist ein zu interpretierender Abschnitt nicht vorhanden, so wird
-an dieser Stelle keine Ausgabe erzeugt. Die Textzeilen des Initali­
-sierungsteils werden auf jeden Fall bei Beginn des Druckvorganges
-in die Ausgabedatei geschrieben. Falls die Ausgabedatei voll ist,
-wird eine neue Datei angefangen und die Zeilen des Initialisie­
-rungsteils erneut an den Anfang gestellt.
-
-
- Satz- Gruppen- Ausgabe
- nummer merkmal
-#free (0.1)#
- Initialisierungsteil
- -------------------------------------------------
- 1 x Vorspann
- WDH-Teil
- 2 x WDH-Teil
- Nachspann
- -------------------------------------------------
- 3 y Vorspann
- WDH-Teil
- 4 y WDH-Teil
- 5 y WDH-Teil
- Nachspann
- -------------------------------------------------
- ENDE
-
-#center#Abb. 5-1 Ablauf des Druckvorganges mit Gruppen
-
-
-#on("b")#Spaltendruck#off("b")# Normalerweise werden die Ausgaben der
-einzelnen
-Abschnitte hintereinander in der Ausgabedatei plaziert. Durch An­
-gabe einer Nummer als Parameter in der WIEDERHOLUNG-Anweisung
-können auch soviel Spalten wie angegeben nebeneinander gedruckt
-werden. Die Spaltenbreite wird dabei durch das Dateilimit (Komman­
-do 'limit' im Editor) festgelegt. Alternativ kann die Spaltenbreite
-auch als zweiter Parameter durch Leerzeichen getrennt angegeben
-werden.
- Vorspann und Nachspann werden jedoch auf jeden Fall wieder
-in eine eigene Zeile geschrieben, der Spaltendruck also unterbro­
-chen.
-
-
-5.3 Interpretation von Musterzeilen
-
-Musterzeilen können Feldmuster enthalten, die bei der Interpreta­
-tion durch entsprechende Inhalte ersetzt werden, ehe die Muster­
-zeile in die Ausgabedatei übernommen wird. Der Beginn eines Feld­
-musters wird durch ein Musterzeichen ('&' oder '%') markiert. Wo
-und wie der Inhalt eingesetzt wird, kann durch folgende Variationen
-angegeben werden:
-
-
- Typ ! Beispiel ! Position ! Länge ! bündig
- ----+-----------+------------------------------
- 1 ! &Name ! fest ! variabel ! links
- 2 ! %Name ! variabel ! variabel ! links
- 3 ! &Name&&& ! fest ! fest ! links
- 4 ! %Name%%% ! variabel ! fest ! links
- 5 ! &&&Name& ! fest ! fest ! rechts
- 6 ! %%%Name% ! variabel ! fest ! rechts
-
-
-Der in dem Feldmuster angegebene Name muß Name einer Abkür­
-zung in irgendeinem Abkürzungsteil oder eines Feldes sein. Der
-Name darf kein Leerzeichen oder Musterzeichen enthalten. Falls dies
-doch der Fall ist, muß der Name in spitze Klammern eingeschlossen
-werden.
- Bei fester Länge wird bei zu kurzem Inhalt mit Leerzeichen
-aufgefüllt, bei zu langem Inhalt abgeschnitten. Bei linksbündigem
-Einsetzen geschieht dies an der rechten, sonst an der linken Seite.
- Feldmuster variabler Länge können je nach Inhalt dazu führen,
-daß der folgende Teil der Musterzeile verschoben wird. Für diesen
-Einsetzprozeß gelten die folgenden Regeln:
-
-#on("b")#Position#off("b")# Feldmuster fester Position (mit '&' beginnend)
-werden
-immer in der Position eingesetzt, in der sie stehen. Feldmuster
-variabler Position (mit '%' beginnen) können nach rechts verschoben
-werden, wenn vorherige Inhalte länger als ihre Muster sind, und
-nach links, wenn Modus 1 oder 3 eingestellt ist und vorherige In­
-halte kürzer sind.
-
-#on("b")#Länge#off("b")# Feldmuster variabler Länge erhalten auf jeden Fall
-den
-Platz, der durch die Länge des Feldmusters reserviert ist. Sind die
-Inhalte kürzer, kann der gewonnene Platz als Reserve für andere
-Feldmuster verwendet werden; sind die Inhalte länger, so wird der
-Inhalt so weit eingesetzt, wie noch Reserve vorhanden ist und der
-Rest abgeschnitten.
- Muß in ein Feldmuster variabler Länge ein leerer Inhalt einge­
-setzt werden, so werden beim Drucken auch die auf das Feldmuster
-folgenden Leerzeichen unterdrückt, falls vor dem Feldmuster noch
-ein Leerzeichen steht oder das Feldmuster in Spalte 1 beginnt.
- Feldmuster fester Länge werden immer in ihrer reservierten
-Länge eingesetzt. Sie werden im folgenden behandelt wie Feldmuster
-variabler Länge, deren Inhalt so lang ist wie das Feldmuster.
-
-#on("b")#Verteilung#off("b")# Die Verteilung der verschiebbaren Feldmuster
-auf der
-Zeile geschieht jeweils in dem Abschnitt zwischen zwei Feldmustern
-fester Position bzw. Zeilenanfang oder Zeilenende. Für jeden Ab­
-schnitt wird festgestellt, wieviel Stellen die Inhalte insgesamt mehr
-oder weniger als ihre Muster benötigen.
- Der Längenausgleich geschieht zwischen dem letzten Feldmuster
-und dem Ende des Abschnitts. Dort wird ein Pufferplatz bestimmt,
-der bei Überlänge bis auf ein Leerzeichen verkleinert werden kann
-und an dem bei Unterlänge zusätzliche Leerzeichen eingefügt wer­
-den.
- Außer am Pufferplatz wird an keinem Mustertext des Abschnitts
-etwas geändert. Zwischentexte zwischen den Feldmustern werden
-unverändert übertragen und mit den umgebenden Feldmustern ver­
-schoben.
- Als Pufferplatz wird die erste Lücke hinter dem letzten Feld­
-muster eines Abschnittes verwendet, die mehr als ein Leerzeichen
-enthält. Ist keine solche Lücke vorhanden, wird das Ende des Ab­
-schnitts verwendet, falls dort ein Leerzeichen steht, und sonst das
-Ende des letzten Feldmusters.
- Die durch den Pufferplatz und kürzere Inhalte gewonnene Re­
-serve wird von links an die Feldmuster mit Überlänge verteilt, bis
-die Reserve verbraucht ist.
-
-#on("b")#Zeilende#off("b")# Das Zeilenende wird als ein Quasi-Feldmuster mit
-fester
-Position aufgefaßt, das am Limit der Druckmusterdatei steht. Es
-sind also keine Einsetzungen möglich, die über das Limit der Datei
-hinausgehen. Als Pufferplatz wird hier jedoch die erste Blanklücke
-vom Zeilenende her verwendet, damit Mustertexte am Zeilenende
-gegebenenfalls stehenbleiben. Ist keine solche Lücke vorhanden, so
-wird das Zeilenende als Pufferplatz verwendet.
- Obwohl nicht als Pufferplatz ausgewiesen, kann der Raum zwi­
-schen Zeilenende und Dateilimit als Reserve verwendet werden.
-
-#on("b")#Modi#off("b")# Der Einsetzmechanismus kann durch die MODUS-Anweisung
-mit einem Parameter verändert werden. Folgende Modi stehen zur
-Verfügung:
-
-
- Modus ! Effekt
- ------+----------------------------------------
- 1 ! Normalmodus.
- ! '%'-Feldmuster werden auch
- ! nach links geschoben.
- ! Keine Zeilenwiederholung.
- ------+----------------------------------------
- 2 ! Tabellenmodus.
- ! '%'-Feldmuster werden nicht
- ! nach links geschoben.
- ! Keine Zeilenwiederholung.
- ------+----------------------------------------
- 3 ! Normalmodus mit Zeilenwiederholung.
- ! '%'-Feldmuster werden auch
- ! nach links geschoben.
- ! Zeilenwiederholung ohne Zwischentexte.
- ------+----------------------------------------
- 4 ! Tabellenmodus mit Zeilenwiederholung.
- ! '%'-Feldmuster werden nicht
- ! nach links geschoben.
- ! Zeilenwiederholung mit Zwischentexten.
- ------+----------------------------------------
-
-
-Bei Zeilenwiederholung werden Inhalte in einer folgenden Zeile
-fortgesetzt, falls sie in der ersten Zeile nicht untergebracht werden
-konnten. Dazu wird die Musterzeile mit den Restinhalten erneut
-interpretiert. Je nach Modus werden auch die Zwischentexte noch
-wiederholt. Der Restinhalt umfaßt immer noch das ganze letzte Wort,
-das nicht mehr auf die vorige Zeile paßte. Es findet also ein Um­
-bruch statt. Die Positionen, die in der vorigen Zeile vom Anfang des
-Wortes eingenommen würden, werden durch Leerzeichen ersetzt.
- Durch die MEHR-Anweisung mit einem Parameter kann die Zahl
-der Zeilenwiederholungen für die nächste Musterzeile festgesetzt
-werden. Dies hat jedoch nur eine Auswirkung, falls Zeilenwieder­
-holung zugelassen ist. Stehen zur Interpretation keine Restinhalte
-mehr zur Verfügung, wird mit leeren Inhalten weitergearbeitet. Kann
-ein Inhalt bei der vorgegebenen Anzahl von Zeilen nicht ganz dar­
-gestellt werden, wird der Rest nicht ausgegeben.
-
-
-5.4 Anschluß zum ELAN-Compiler
-
-Falls in einem Druckmuster Abkürzungen, Kommandozeilen oder
-Gruppendefinitionen vorkommen, wird das Druckmuster in ein
-ELAN-Programm umgewandelt, das dann vom ELAN-Compiler über­
-setzt wird.
- Alle Zeilen eines Abkürzungsteils werden direkt in das Pro­
-gramm übernommen, wobei der Name einer Abkürzung durch einen
-beliebig gewählten Refinementnamen ersetzt wird ('abk' + eine lau­
-fende Nummer). Alle Abkürzungen und Refinements werden als glo­
-bale Refinements definiert, also außerhalb von Prozeduren. Dadurch
-wird erreicht, daß sie an jeder Stelle verwendet werden können.
- Damit eine Abkürzung richtig als Refinement übersetzt wird,
-muß sie ein TEXT-Objekt als Wert liefern. Die anderen Refinements
-sind beliebig, da sie nur in selbstdefinierten Anweisungen verwen­
-det werden. Die Refinements der Abkürzungen werden in einer Zu­
-weisung an eine TEXT-Variable verwendet, damit der Druckgenera­
-tor auf den entsprechenden Wert zugreifen kann.
- Jeder Abschnitt wird dagegen als eine Prozedur übersetzt. Eine
-Folge von Musterzeilen wird in eine Anweisung übersetzt, diese
-Musterzeilen einzusetzen und zu drucken. Eine '%%'-Anweisung wird
-einfach unverändert dazwischengeschrieben. Die Prozedur für den
-Wiederholungsteil wird einmal für jeden ausgewählten Satz aufgeru­
-fen, die Vorspann- und die Nachspann-Prozedur einmal bei jedem
-Gruppenwechsel.
- Anweisungen im Initialisierungsteil werden an den Anfang des
-Programms als globale Definitionen gestellt.
-
-#on("b")#Fehler#off("b")# Findet sich in dem erzeugten ELAN-Programm ein
-Fehler,
-der durch den Druckgenerator nicht erkannt werden konnte (z.B.
-eine Abkürzung liefert keinen Wert), so muß der ELAN-Compiler
-diesen Fehler erkennen. Anschließend zeigt er das erzeugte Pro­
-gramm zusammen mit seinen Fehlermeldungen im Paralleleditor. Sie
-müssen nun die Fehlermeldung lokalisieren und anhand der eben
-gegebenen Hinweise in das ursprüngliche Druckmuster zurücküber­
-setzen, damit Sie dort den Fehler korrigieren können.
-
-
-5.5 Fehlermeldungen
-
-Folgende Fehlermeldungen können bei der Übersetzung eines Druck­
-musters auftreten:
-
-#on("i")#keine schliessende Klammer in Feldmuster#off("i")#
- Wenn der Name in einem Feldmuster in spitze Klammern einge­
- schlossen werden soll, muß noch in der gleichen Zeile eine
- schließende Klammer vorhanden sein.
-
-#on("i")#kein Kommando in Kommandozeile#off("i")#
- Eine Zeile, die mit '%' beginnt, enthält keinen weiteren Text.
-
-#on("i")#unbekanntes Kommando#off("i")#
- Das erste Wort in einer Kommandozeile ist kein bekanntes Kom­
- mando.
-
-#on("i")#kein % WIEDERHOLUNG gefunden#off("i")#
- Das Druckmuster enthält keine Anweisung, die den Beginn eines
- Abschnittes markiert. Es muß aber mindestens ein Abschnitt
- vorhanden sein.
-
-#on("i")#nur GRUPPE-Anweisung erlaubt#off("i")#
- Im Initialisierungsteil ist nur die GRUPPE-Anweisung erlaubt.
-
-#on("i")#keine ELAN-Anweisung im Initialisierungsteil nach Gruppen­
-definition#off("i")#
- Sobald im Initialisierungsteil eine GRUPPE-Anweisung aufgetreten
- ist, ist keine Kommandozeile mehr möglich.
-
-#on("i")#illegale Gruppennummer#off("i")#
- In einer GRUPPE-Anweisung wurde eine zu große Nummer angege­
- ben. Gruppen sollten von 1 an durchnumeriert werden.
-
-#on("i")#diese Gruppe wurde schon definiert#off("i")#
- Eine Gruppennummer wurde mehrfach verwendet.
-
-#on("i")#diese Abkürzung ist nicht definiert#off("i")#
- Ein Name in einem Feldmuster tritt nicht als Feld-oder Abkür­
- zungsname auf. Eventuell enthält er ein Leerzeichen!
-
-#on("i")#dieser Abschnitt wurde schon einmal definiert#off("i")#
- Kein Abschnitt kann mehrmals angegeben werden.
-
-#on("i")#falscher Modus#off("i")#
- In einer MODUS-Anweisung wurde ein nicht definierter Modus als
- Parameter angegeben.
-
-#on("i")#diese Anweisung darf im Musterteil nicht vorkommen#off("i")#
-
-#on("i")#im Abkürzungsteil darf keine Anweisung auftreten#off("i")#
-
-#on("i")#in dieser Zeile stehen zu viele Feldmuster#off("i")#
- Es können maximal 24 Feldmuster in einer Zeile stehen. Abhilfe:
- mehrere Feldmuster durch eine Abkürzung zusammenfassen.
-
-#on("i")#das Druckmuster enthält zu viele Feldmuster#off("i")#
- Die Gesamtanzahl der Feldmuster ist begrenzt. Abhilfe: mehrere
- Feldmuster durch eine Abkürzung zusammenfassen.
-
-#on("i")#nach dem "&" soll direkt der Name einer Abkürzung folgen#off("i")#
- In einer Abkürzungszeile stehen Leerzeichen hinter dem '&'.
-
-#on("i")#kein Doppelpunkt nach Abkürzung#off("i")#
- Nach dem Abkürzungsnamen in einer Abkürzungszeile muß durch
- ein Leerzeichen getrennt ein Doppelpunkt folgen.
-
-#on("i")#Abkürzung mehrfach definiert#off("i")#
- Die Abkürzung wurde unter dem gleichen Namen schon einmal,
- vielleicht in einem anderen Abschnitt, definiert.
-
-#on("i")#das Druckmuster enthält zu viele Abkürzungen#off("i")#
- Abhilfe: mehrere Abkürzungen zu einem Ausdruck zusammenfas­
- sen.
-
-
diff --git a/doc/eudas/eudas.ref.6 b/doc/eudas/eudas.ref.6
deleted file mode 100644
index 7c8ada6..0000000
--- a/doc/eudas/eudas.ref.6
+++ /dev/null
@@ -1,399 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (61)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-6 Struktur von EUDAS-Dateien
-
-
-
-EUDAS-Dateien können unabhängig von EUDAS über den Daten­
-typ EUDAT manipuliert werden. Die zur Verfügung stehenden Zu­
-griffsoperationen sind in diesem Kapitel beschrieben.
- Der Datentyp EUDAT ist analog zum Datentyp FILE. Jede
-EUDAT-Variable kann an eine EUDAS-Datei angekoppelt werden.
-Dadurch lassen sich beliebig viele EUDAS-Dateien gleichzeitig be­
-arbeiten. Wie der Abschnitt 6.6 zeigt, sind so auch ganz andere
-Anwendungen realisierbar.
- Die wesentlichen EUDAS-Funktionen (Ansehen, Suchen, Druk­
-ken) können jedoch nicht direkt auf EUDAT-Variablen angewendet
-werden, sondern greifen auf die virtuelle Datei zu, die im nächsten
-Kapitel beschreiben wird.
-
-
-6.1 Der Datentyp SATZ
-
-Der Datentyp SATZ stellt einen einzelnen EUDAS-Satz dar, der
-intern als TEXT realisiert ist. Ein SATZ besteht aus bis zu 256
-Feldern, die jeweils einen TEXT enthalten können. Nach dem Initi­
-alisieren sind alle Felder mit "" vorbelegt. Die Felder können über
-Nummern von 1 bis 256 angesprochen werden.
- Damit kann man sich einen SATZ als dynamisches ROW n TEXT
-vorstellen, das bis zu 256 Elemente haben kann. Anders als ein
-entsprechendes ROW belegt ein leerer SATZ praktisch keinen Spei­
-cherplatz.
- Folgende Zugriffsprozeduren stehen zur Verfügung:
-
-TYPE SATZ
-
-OP := (SATZ VAR, SATZ CONST)
-
-PROC satz initialisieren (SATZ VAR)
- Jeder SATZ muß vor Benutzung initialisiert werden.
-
-INT PROC felderzahl (SATZ CONST)
- Liefert die Nummer des höchsten belegten Feldes.
-
-PROC feld lesen (SATZ CONST, INT CONST feldnr,
- TEXT VAR inhalt)
- Liest den Inhalt des Feldes 'feldnr' in 'inhalt'.
-
- FEHLER:
-
- #on("i")#n ist keine Feldnummer#off("i")#
- 'n' liegt außerhalb des Bereiches 1..256.
-
-PROC feld bearbeiten (SATZ CONST, INT CONST feldnr,
- PROC (TEXT CONST, INT CONST, INT CONST) bearbeite)
- Ruft 'bearbeite' auf, wobei 'bearbeite' ein Text und zwei Posi­
- tionen in diesem Text übergeben werden. Die Positionen geben
- das erste und das letzte Zeichen des durch 'feldnr' ausgewähl­
- ten Feldes an. Ist der Anfang größer als das Ende, so ist das
- Feld leer.
-
- FEHLER:
-
- #on("i")#n ist keine Feldnummer#off("i")#
- 'n' liegt außerhalb des Bereiches 1..256.
-
-PROC feld aendern (SATZ VAR, INT CONST feldnr,
- TEXT CONST inhalt)
- Schreibt 'inhalt' in das Feld mit der Nummer 'feldnr'
-
- FEHLER:
-
- #on("i")#n ist keine Feldnummer#off("i")#
- 'n' liegt außerhalb des Bereiches 1..256.
-
-INT PROC feldindex (SATZ CONST, TEXT CONST muster)
- Falls eines der Felder 'muster' enthält, wird die Nummer dieses
- Feldes geliefert, sonst 0.
-
-
-6.2 Der Datentyp EUDAT
-
-Der Datentyp EUDAT muß ähnlich wie ein FILE an einen benann­
-ten oder unbenannten Datenraum angekoppelt werden. Der Daten­
-raum hat anschließend den Typ 3243. Weitere Zugriffe auf eine
-EUDAT-Variable sind erst nach erfolgtem Ankoppeln zulässig. An­
-derenfalls können undefinierte Fehler entstehen.
-
-TYPE EUDAT
-
-PROC oeffne (EUDAT VAR, TEXT CONST dateiname)
- Koppelt die EUDAT-Variable an die EUDAS-Datei mit dem
- Namen 'dateiname' an. Die Datei wird eingerichtet, falls sie
- noch nicht existiert.
-
- FEHLER:
-
- #on("i")#Datei ist keine EUDAS-Datei#off("i")#
- Die angegebene Datei hat nicht den Typ 3243.
-
-PROC oeffne (EUDAT VAR, DATASPACE CONST ds)
- Koppelt die EUDAT-Variable an den Datenraum 'ds'.
-
- FEHLER:
-
- #on("i")#Datei ist keine EUDAS-Datei#off("i")#
- Der Datenraum wurde bereits verwendet und hat nicht den Typ
- 3243.
-
-Eine EUDAS-Datei ist in Felder und Sätze unterteilt. Die Felder
-werden beim Zugriff über Nummern angesprochen. Jedem Feld ist
-jedoch zur Identifikation ein TEXT als Feldname zugeordnet. Die
-Feldnamen werden als SATZ gespeichert, wobei jedes Feld seinen
-zugeordneten Namen enthält.
-
-INT PROC felderzahl (EUDAT CONST)
- Liefert Anzahl der benannten Felder. Ist zu Anfang 0.
-
-PROC feldnamen aendern (EUDAT VAR,
- SATZ CONST neue namen)
- Setzt die Feldnamen einer Datei. Ist 'felderzahl (neue namen)'
- größer als die Felderzahl der Datei, so wird die Felderzahl der
- Datei entsprechend heraufgesetzt.
-
-PROC feldnamen lesen (EUDAT CONST, SATZ VAR namen)
- Liefert alle Feldnamen in einer SATZ-Variablen.
-
-Eine EUDAS-Datei enthält drei zusätzliche Notiztexte. Zwei davon
-sind bereits reserviert, und zwar:
-#free (0.2)#
- 1: Prüfbedingungen
- 2: Datum der letzten Änderung
-
-Der dritte kann für freie Notizen verwendet werden.
-
-PROC notizen lesen (EUDAT CONST, INT CONST notiz nr,
- TEXT VAR notizen)
- Schreibt die Notizen der EUDAS-Datei in 'notizen' ('notiz nr' =
- 1,2,3).
-
-PROC notizen aendern (EUDAT VAR, INT CONST notiz nr,
- TEXT CONST notizen)
- Ändert die Notizen. Alte Notizen werden dabei überschrieben
- ('notiz nr' = 1,2,3).
-
-
-6.3 Satzposition
-
-Eine EUDAS-Datei läßt sich sequentiell vorwärts und rückwärts
-bearbeiten. Dazu gibt es eine aktuelle Satzposition. Ein bestimmter
-Satz kann auch direkt angesprungen werden. Die Prozeduren, die
-nach dem Inhalt des ersten Feldes suchen, arbeiten besonders
-schnell, da die entsprechenden Sätze über eine Hashmethode gefun­
-den werden.
-
-INT PROC satznr (EUDAT CONST)
- Liefert aktuelle Satzposition.
-
-INT PROC saetze (EUDAT CONST)
- Liefert Anzahl der Sätze.
-
-BOOL PROC dateiende (EUDAT CONST)
- Liefert TRUE, wenn 'satznr' groesser als 'saetze' ist. Die letzte
- erreichbare Satzposition liegt um eins hinter dem letzten Satz
- (um auch am Ende anfügen zu können).
-
-PROC auf satz (EUDAT VAR, INT CONST satznr)
- Positioniert auf den gewünschten Satz. Bei nicht existierenden
- Sätzen wird auf den ersten bzw. hinter den letzten Satz ge­
- sprungen.
-
-PROC weiter (EUDAT VAR)
- Geht einen Satz weiter, jedoch nicht über das Dateiende hinaus.
-
-PROC zurueck (EUDAT VAR)
- Geht einen Satz zurück, falls der erste Satz noch nicht erreicht
- ist.
-
-PROC auf satz (EUDAT VAR, TEXT CONST muster)
- Positioniert auf den ersten Satz, der als erstes Feld 'muster'
- enthält, anderenfalls hinter den letzten Satz.
-
-PROC weiter (EUDAT VAR, TEXT CONST muster)
- Geht weiter, bis das erste Feld 'muster' enthält, bzw. bis hinter
- den letzten Satz.
-
-PROC zurueck (EUDAT VAR, TEXT CONST muster)
- Geht zurück, bis das erste Feld 'muster' enthält, bzw. auf den
- ersten Satz der EUDAS-Datei.
-
-
-6.4 Satzzugriffe
-
-Der aktuelle Satz ist ein SATZ-Objekt. Auf die Felder des aktuellen
-Satzes kann direkt zugegriffen werden.
-
-PROC feld lesen (EUDAT CONST, INT CONST feldnr,
- TEXT VAR inhalt)
- Wirkt wie 'feld lesen' auf den aktuellen Satz.
-
-PROC feld aendern (EUDAT VAR, INT CONST feldnr,
- TEXT CONST inhalt)
- Wirkt wie 'feld aendern' auf den aktuellen Satz.
-
-PROC feld bearbeiten (EUDAT CONST, INT CONST feldnr,
- PROC (TEXT CONST, INT CONST, INT CONST) bearbeite)
- Wirkt wie 'feld bearbeiten' auf den aktuellen Satz.
-
-Der aktuelle Satz kann auch als Ganzes bearbeitet werden.
-
-PROC satz lesen (EUDAT CONST, SATZ VAR satz)
- Liefert den aktuellen Satz.
-
-PROC satz aendern (EUDAT VAR, SATZ CONST satz)
- Ersetzt den aktuellen Satz durch 'satz'.
-
-PROC satz einfuegen (EUDAT VAR, SATZ CONST satz)
- Fügt 'satz' vor dem aktuellen Satz ein.
-
- FEHLER:
-
- #on("i")#EUDAS-Datei voll#off("i")#
- Eine EUDAS-Datei faßt mindestens 5000 Sätze.
-
-PROC satz loeschen (EUDAT VAR)
- Löscht den aktuellen Satz.
-
-
-6.5 Sortieren und Reorganisieren
-
-Zum Sortieren können für die einzelnen Felder Typen angegeben
-werden, damit auch Zahlen und Daten richtig sortiert werden kön­
-nen. Außerdem kann die Feldreihenfolge angegeben werden, nach
-der sortiert werden soll.
-
-PROC feldinfo (EUDAT VAR, INT CONST feldnr, info)
- Setzt den Feldtyp des Feldes 'feldnr'. Es bedeuten
- -1 : normaler Text (Standard)
- 0 : Text nach DIN. Ziffern und Sonderzeichen werden igno­
- riert. Groß-und Kleinbuchstaben gelten gleich. Umlaute
- werden beachtet.
- 1 : Zahl (beim Vergleich werden alle Zeichen außer Zif­
- fern ignoriert).
- 2 : Datum. Es werden Daten der Form "tt.mm.jj" vergli­
- chen.
-
-INT PROC feldinfo (EUDAT CONST, INT CONST feldnr)
- Der Feldtyp des angegebenen Feldes wird geliefert. Zu Anfang
- ist -1 voreingestellt.
-
-INT PROC unsortierte saetze (EUDAT CONST)
- Liefert die Anzahl von Sätzen, die seit dem letzten Sortiervor­
- gang geändert wurden. Bei einer neuen Datei, die noch nie
- sortiert wurde, wird immer 0 geliefert.
-
-PROC dezimalkomma (TEXT CONST komma)
- Stellt das Dezimalkomma ein, das beim Vergleich von Zahlen
- gelten soll.
-
- FEHLER:
-
- #on("i")#Nicht erlaubtes Dezimalkomma#off("i")#
- Nur Texte der Länge 1 sind zugelassen.
-
-TEXT PROC dezimalkomma
- Liefert das eingestellte Dezimalkomma ("," ist voreingestellt).
-
-PROC sortiere (EUDAT VAR, TEXT CONST reihenfolge)
- Sortiert die Datei in der von 'reihenfolge' angegebenen Reihen­
- folge. Dabei enthält 'reihenfolge' an der Stelle 2*i+1 den Code
- der Feldnummer, die als i-te in der Sortierung berücksichtigt
- werden soll. Das Zeichen an der Stelle 2*i gibt an, ob das Feld
- mit der davorstehenden Feldnummer aufsteigend ('+') oder
- absteigend ('-') sortiert werden soll.
-
-PROC sortiere (EUDAT VAR)
- Sortiert die Datei in der zuletzt eingestellten Reihenfolge.
- Wurde noch keine Reihenfolge angegeben, wird die Datei in der
- Feldreihenfolge sortiert.
-
-TEXT PROC sortierreihenfolge (EUDAT CONST)
- Liefert die zuletzt eingestellte Reihenfolge. Wurde noch nicht
- sortiert, so wird "" geliefert.
-
-Nach umfangreichen Änderungen an einer EUDAS-Datei ist eine
-Reorganisation sinnvoll, um "Textleichen" zu beseitigen.
-
-PROC reorganisiere (TEXT CONST dateiname)
- Die EUDAS-Datei mit dem Namen 'dateiname' wird reorgani­
- siert.
-
-
-6.6 EUDAS-Dateien als Assoziativspeicher
-
-In diesem Abschnitt soll ein Beispiel erläutert werden, in dem
-EUDAS-Dateien unabhängig von EUDAS für einen ganz anderen
-Zweck benutzt werden. Das folgende kurze Paket soll ein Abkür­
-zungsverzeichnis realisieren, das auf einer EUDAS-Datei basiert.
-
-
- PACKET abkuerzungsverzeichnis
- DEFINES
- verzeichnis laden,
- abkuerzung einfuegen,
- abkuerzung aendern,
- abkuerzung loeschen,
- langform :
-
- EUDAT VAR verz;
- SATZ VAR satz;
- TEXT VAR inhalt;
-
- PROC verzeichnis laden (TEXT CONST dateiname) :
-
- oeffne (verz, dateiname)
-
- END PROC verzeichnis laden;
-
- PROC abkuerzung einfuegen (TEXT CONST abk, lang) :
-
- auf satz (verz, abk);
- IF NOT dateiende (verz) THEN
- errorstop ("Abkürzung existiert bereits")
- ELSE
- satz initialisieren (satz);
- feld aendern (satz, 1, abk);
- feld aendern (satz, 2, lang);
- satz einfuegen (satz)
- END IF
-
- END PROC abkuerzung einfuegen;
-
- PROC abkuerzung aendern (TEXT CONST abk, lang) :
-
- auf satz (verz, abk);
- IF dateiende (verz) THEN
- errorstop ("Abkürzung existiert nicht")
- ELSE
- feld aendern (verz, 2, lang)
- END IF
-
- END PROC abkuerzung aendern;
-
- PROC abkuerzung loeschen (TEXT CONST abk) :
-
- auf satz (verz, abk);
- IF NOT dateiende (verz) THEN
- satz loeschen (verz)
- END IF
-
- END PROC abkuerzung loeschen;
-
- TEXT PROC langform (TEXT CONST abk) :
-
- auf satz (verz, abk);
- IF dateiende (verz) THEN
- inhalt := "";
- errorstop ("Abkürzung nicht vorhanden")
- ELSE
- feld lesen (verz, 2, inhalt)
- END IF;
- inhalt
-
- END PROC langform;
-
- END PACKET abkuerzungsverzeichnis;
-
-
-Die Prozedur 'verzeichnis laden' koppelt die interne EUDAT-Vari­
-able 'verz' an eine benannte EUDAS-Datei, die eventuell vorher mit
-EUDAS erstellt wurde. In diesem Beispiel sind die Feldnamen egal;
-falls die übergebene EUDAS-Datei noch nicht existiert, wird sie mit
-0 Feldern eingerichtet, was aber nur für eine spätere Anzeige mit
-EUDAS störend wäre.
- Grundlage für das Aufsuchen einer bestimmten Abkürzung bil­
-det immer die Prozedur 'auf satz', die nach dem Inhalt des ersten
-Feldes optimiert sucht. Falls die Abkürzung nicht gefunden wurde,
-wird auf das Dateiende positioniert, daher wird jeweils 'dateiende'
-abgefragt.
- Beim Einfügen eines neuen Satzes muß eine komplette Satz­
-variable angegeben werden, die bereits mit den Inhalten gefüllt ist.
-Beim späteren Ändern kann jedoch direkt auf ein Feld zugegriffen
-werden, ohne die Satzvariable explizit rauszuholen.
- Die Abfrage einer bestimmten Abkürzung bereitet dann keine
-Schwierigkeiten mehr.
- Für die Verwendung von EUDAS-Dateien in diesem Beispiel
-spricht zum einen die einfache Programmierung, zum anderen aber
-auch die Möglichkeit, das erstellte Verzeichnis mit den Hilfsmitteln
-
diff --git a/doc/eudas/eudas.ref.7 b/doc/eudas/eudas.ref.7
deleted file mode 100644
index 31b3031..0000000
--- a/doc/eudas/eudas.ref.7
+++ /dev/null
@@ -1,447 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (71)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-7 Verwaltung der offenen Dateien
-
-
-Die in diesem Kapitel beschriebene Schnittstelle verbindet mehrere
-EUDAS-Dateien zu einem großen Dateimodell. Diese virtuelle Datei
-dient als Grundlage für die meisten EUDAS-Funktionen. Zuerst muß
-eine Datei als Bestandteil der virtuellen Datei geöffnet werden, ehe
-sie bearbeitet werden kann. Es ist so bei den Funktionen keine
-Angabe mehr nötig, welche Datei gemeint ist.
- Diese Schnittstelle ist in vielen Teilen für die interne
-EUDAS-Anwendung ausgelegt. Bei einigen Prozeduren werden aus
-Effizienzgründen keinerlei Überprüfungen auf illegale Aufrufe oder
-Parameter durchgeführt. Wollen Sie eine solche Prozedur dennoch
-verwenden, sollten Sie die Einhaltung der angegebenen Bedingungen
-sorgfältig überprüfen.
-
-
-7.1 Dateiverwaltung
-
-Mit 'oeffne' wird eine Datei zum Bearbeiten geöffnet. Mit 'kette' und
-'kopple' können weitere Dateien dazugekettet bzw. dazugekoppelt
-werden. Durch 'sichere' können veränderte Kopien zurückgeschrie­
-ben werden. Durch 'dateien loeschen' werden die internen Kopien
-gelöscht.
- Mit 'anzahl dateien' kann die Anzahl der vorhandenen Dateien
-erfragt werden. 'anzahl koppeldateien' gibt Auskunft darüber, wie­
-viel Dateien davon gekoppelt sind. 'aendern erlaubt' gibt den Status
-wieder, der beim Öffnen der ersten Datei angegeben wurde. 'inhalt
-veraendert' gibt an, ob die angegebene Datei verändert wurde. Mit
-'eudas dateiname' können die Namen der geöffneten Dateien erfragt
-werden. Bei jedem 'oeffne' wird 'dateiversion' um 1 erhöht. Dies
-dient dazu, ein erfolgtes neues Öffnen von anderen Stellen aus zu
-entdecken.
- Mit 'auf koppeldatei' kann die virtuelle Datei auf eine Koppel­
-datei umgeschaltet werden, so daß der Eindruck entsteht, nur diese
-Datei wäre geöffnet worden.
-
-PROC oeffne (TEXT CONST dateiname,
- BOOL CONST aendern erlaubt)
- Falls Ändern erlaubt sein soll, wird eine Kopie der angegebenen
- Datei zur Bearbeitung für EUDAS angelegt. Vorher geöffnete
- Dateien werden gelöscht. Die Änderungserlaubnis wird entspre­
- chend gesetzt. Es wird die Satzposition der EUDAS-Datei ange­
- nommen (Ausnahme: steht die EUDAS-Datei hinter dem letzten
- Satz, wird auf Satz 1 positioniert). 'dateiversion' sowie 'anzahl
- dateien' werden um 1 erhöht.
-
- FEHLER:
-#f1#
- #on("i")#Datei nicht gesichert#off("i")#
- Eine vorher geöffnete Datei war verändert, aber nicht gesi­
- chert.
-#f1#
- #on("i")#Datei existiert nicht#off("i")#
- Die angegebene Datei ist nicht vorhanden.
-#f1#
- #on("i")#Datei ist keine EUDAS-Datei#off("i")#
- Die angegebene Datei hat nicht den für EUDAS-Dateien festge­
- legten Typ.
-
-PROC kopple (TEXT CONST dateiname)
- Die angegebene Datei wird zu den bereits geöffneten Dateien
- dazugekoppelt. Falls Ändern erlaubt ist, wird eine Kopie dieser
- Datei verwendet. Dabei werden die ersten Felder der Datei, die
- bereits in der Hauptdatei vorhanden sind, als Koppelfelder
- festgelegt. Alle weiteren Felder werden zusätzlich zu den bis­
- herigen angelegt. 'dateiversion', 'anzahl dateien' und 'anzahl 
- koppeldateien' werden um 1 erhöht.
-
- FEHLER:
-#f1#
- #on("i")#keine Datei geoeffnet#off("i")#
- Es muß vorher eine Datei geöffnet werden.
-#f1#
- #on("i")#Zuviel Dateien geoeffnet#off("i")#
- Die Anzahl der gleichzeitig geöffneten Dateien ist begrenzt.
-#f1#
- #on("i")#Datei existiert nicht#off("i")#
- Die angegebene Datei ist nicht vorhanden.
-#f1#
- #on("i")#Datei ist keine EUDAS-Datei#off("i")#
- Die angegebene Datei hat nicht den für EUDAS-Dateien festge­
- legten Typ.
-#f1#
- #on("i")#Zu viele Felder#off("i")#
- Die Anzahl der Felder insgesamt ist begrenzt.
-#f1#
- #on("i")#Zu viele Koppelfelder#off("i")#
- Die Anzahl der Koppelfelder ist begrenzt.
-#f1#
- #on("i")#keine Koppelfelder vorhanden#off("i")#
- Das erste Feld der zu koppelnden Datei ist in der Hauptdatei
- nicht vorhanden (unterschiedliche Feldnamen).
-
-PROC kette (TEXT CONST dateiname)
- Die angegebene Datei wird an die Hauptdatei angekettet, d.h.
- die Sätze der neuen Datei werden am bisherigen Dateiende
- angefügt. Falls Ändern erlaubt ist, wird eine Kopie dieser Datei
- verwendet. Die zu kettende Datei muß in der Feldstruktur nicht
- mit der Hauptdatei übereinstimmen. Die aktuelle Satzposition
- wird beibehalten. 'dateiversion' und 'anzahl dateien' werden um
- 1 erhöht.
-
- FEHLER:
-#f1#
- #on("i")#keine Datei geoeffnet#off("i")#
- Es muß vorher eine Datei geöffnet werden.
-#f1#
- #on("i")#Zuviel Dateien geoeffnet#off("i")#
- Die Anzahl der gleichzeitig geöffneten Dateien ist begrenzt.
-#f1#
- #on("i")#Datei existiert nicht#off("i")#
- Die angegebene Datei ist nicht vorhanden.
-#f1#
- #on("i")#Datei ist keine EUDAS-Datei#off("i")#
- Die angegebene Datei hat nicht den für EUDAS-Dateien festge­
- legten Typ.
-
-PROC sichere (INT CONST dateinr, TEXT CONST dateiname)
- Die geöffneten Dateien werden in der Reihenfolge ihres Öffnens
- durchnumeriert (von 1 an). Die Arbeitskopie mit der angegebe­
- nen Nummer wird unter dem angegebenen Namen gesichert, aber
- selbst nicht verändert. Die vorher unter diesem Namen vorhan­
- dene Datei wird gelöscht. War die zu sichernde Arbeitskopie
- verändert worden, so wird sie anschließend als nicht verändert
- angesehen.
- Bedingungen:
- 1 <= dateinr <= anzahl dateien
-
-PROC dateien loeschen (BOOL CONST auch geaenderte)
- Es werden alle geöffneten Arbeitskopien gelöscht. EUDAS wird
- wieder in den Anfangszustand versetzt. Wird 'auch geaenderte'
- angegeben, wird bei geänderten, aber nicht gesicherten Dateien
- die Fehlermeldung unterdrückt.
-
- FEHLER:
-#f1#
- #on("i")#Datei nicht gesichert#off("i")#
- Eine vorher geöffnete Datei war verändert, aber nicht gesi­
- chert.
-
-BOOL PROC auf koppeldatei
- Liefert TRUE, wenn auf eine Koppeldatei umgeschaltet wurde.
-
-PROC auf koppeldatei (INT CONST nr)
- Umschalten auf Koppeldatei 'nr'. Ist bereits umgeschaltet, wird
- wieder zurückgeschaltet. In diesem Fall werden bei 'nr' = 1 die
- Koppelfelder übernommen, anderenfalls nicht. Beim Umschalten
- bleiben Satzposition, Markierungen und Suchmuster gespeichert.
- In der Koppeldatei wird die beim letzten Umschalten eingestell­
- te Position wieder eingenommen. 'dateiversion' wird um 1 er­
- höht.
-
-INT PROC anzahl dateien
- Gibt die Anzahl der insgesamt geöffneten Dateien an.
-
-INT PROC anzahl koppeldateien
- Gibt die Anzahl der gekoppelten Dateien an.
-
-BOOL PROC aendern erlaubt
- Reflektiert den Status, der bei 'oeffne' gesetzt wurde.
-
-BOOL PROC inhalt veraendert (INT CONST dateinr)
- Gibt an, ob die geöffnete Datei mit der angegebenen Nummer
- verändert wurde. Wird ggf. von 'sichere' zurückgesetzt.
- Bedingung:
- 1 <= dateinr <= anzahl dateien
-
-TEXT PROC eudas dateiname (INT CONST dateinr)
- Liefert den Namen, unter dem die entsprechende Datei geöffnet
- wurde.
- Bedingung:
- 1 <= dateinr <= anzahl dateien
-
-INT PROC dateiversion
- Wird bei jedem 'oeffne', 'kette' und 'kopple' zyklisch erhöht.
-
-INT PROC folgedatei (INT CONST dateinr)
- Eine geöffnete EUDAS-Datei wird in eine von zwei Listen auf­
- genommen, die der geketteten Dateien und die der gekoppelten.
- Diese Prozedur liefert jeweils die Nummer der nächsten Datei in
- der Liste, am Ende aber 0. Die Liste der geketteten Dateien
- beginnt immer mit 1, mit 'folgedatei (0)' erhält man die erste
- gekoppelte Datei.
- Bedingung:
- 0 <= dateinr <= anzahl dateien
-
-
-7.2 Feldstruktur
-
-Die einzelnen Sätze der kombinierten EUDAS-Datei sind in Felder
-unterteilt. Diese setzen sich zusammen aus den Feldern der Haupt­
-datei und der einzelnen Koppeldateien, wobei die Koppelfelder je­
-weils nur einmal auftauchen.
- 'anzahl felder' liefert die Anzahl der vorhanden Felder. Mit
-'feldnamen lesen' und 'feldnamen bearbeiten' können die Feldnamen
-abgefragt werden. 'feldnummer' liefert einen Index für einen vor­
-gegebenen Feldnamen, da die Felder immer über Nummern angespro­
-chen werden.
- Die Prozeduren 'feld lesen' und 'feld bearbeiten' ermöglichen
-den Zugriff auf den Feldinhalt des aktuellen Satzes; durch 'feld
-aendern' kann dieser Inhalt abgeändert werden.
-
-INT PROC anzahl felder
- Liefert die Anzahl der vorhanden Felder.
-
-PROC feldnamen lesen (INT CONST feldnr,
- TEXT VAR feldname)
- Liefert in 'feldname' den Namen des Feldes mit der Nummer
- 'feldnr'.
- Bedingung:
- 1 <= feldnr <= anzahl felder
-
-PROC feldnamen bearbeiten (INT CONST feldnr,
- PROC (TEXT CONST, INT CONST, INT CONST) bearbeite)
- Die Prozedur 'bearbeite' wird aufgerufen. Als Parameter werden
- ein Text und Anfangs- und Endposition des gewünschten Feld­
- namens in diesem Text übergeben. Verhindert unnötiges Kopie­
- ren des Feldnamens in eine TEXT-Variable. Der übergebene
- Text darf nicht verändert werden!
- Bedingung:
- 1 <= feldnr <= anzahl felder
-
-INT PROC feldnummer (TEXT CONST feldname)
- Liefert den index zu dem angegebenen Feldnamen. Falls ein
- solcher Name nicht existiert, wird 0 geliefert.
-
-PROC feld lesen (INT CONST feldnr, TEXT VAR inhalt)
- Liefert den Inhalt des angegebenen Feldes.
- Bedingung:
- 1 <= feldnr <= anzahl felder
-
-PROC feld bearbeiten (INT CONST feldnr,
- PROC (TEXT CONST, INT CONST, INT CONST) bearbeite)
- Die Prozedur 'bearbeite' wird aufgerufen. Der Feldinhalt des
- angegebenen Feldes steht im übergebenen Text innerhalb der
- Grenzen. Ist die Obergrenze kleiner als die Untergrenze, so ist
- das Feld leer.
- Bedingung:
- 1 <= feldnr <= anzahl felder
-
-PROC feld aendern (INT CONST feldnr, TEXT CONST inhalt)
- Ändert den Inhalt des angegebenen Feldes.
- Bedingung:
- NOT ende der datei
- 1 <= feldnr <= anzahl felder
-
-INT PROC feldinfo (INT CONST feldnummer)
- Liefert den Typ des angegebenen Feldes.
- Bedingung:
- 1 <= feldnummer <= anzahl felder
-
-PROC notizen lesen (INT CONST nr, TEXT VAR inhalt)
- Liest die angegebenen Notizen ('nr' = 1,2,3) aus der ersten
- Datei oder der umgeschalteten Koppeldatei.
-
-PROC notizen aendern (INT CONST nr, TEXT CONST inhalt)
- Ändert die Notizen ('nr' = 1,2,3) der ersten Datei oder der um­
- geschalteten Koppeldatei.
-
-
-7.3 Positionierung
-
-Das virtuelle Dateimodell von EUDAS verfügt ebenfalls über eine
-Satzposition, die verändert werden kann.
- Durch 'satznummer' wird die aktuelle Satznummer geliefert,
-beim Koppeln kann über 'satzkombination' die Reihenfolge der Kop­
-pelkombinationen bestimmt werden. 'dateiende' zeigt an, ob die
-Satzposition hinter dem letzten Satz liegt. Mit 'weiter' und 'zurueck'
-erfolgt die eigentliche Positionierung. Hier kann außer der Positio­
-nierung um Einzelsätze auch die Positionierung auf den nächsten
-ausgewählten oder markierten Satz angefordert werden. Mit 'auf 
-satz' schließlich kann ein bestimmter Satz angesprungen werden.
-
-INT PROC satznummer
- Liefert die Nummer des aktuellen Satzes. Die Sätze werden von
- 1 an durchnumeriert, wobei über die geketteten Dateien wei­
- tergezählt wird.
- Bedingung:
- anzahl dateien > 0
-
-INT PROC satzkombination
- Liefert die laufende Nummer der Koppelkombination des aktuel­
- len Satzes. Wird nur durch 'weiter' im Einzelsatzmodus erhöht.
- Normalerweise 1.
- Bedingung:
- anzahl dateien > 0
-
-BOOL PROC dateiende
- Gibt an, ob die Satzposition hinter dem letzten Satz liegt.
-
-PROC weiter (INT CONST modus)
- Erhöht die aktuelle Satzposition. Für 'modus' gibt es 3 Möglich­
- keiten:
- 1: Falls eine weitere Satzkombination besteht, wird diese ein­
- genommen, sonst zum nächsten Satz.
- 2: Zum nächsten durch Suchbedingung ausgewählten Satz. Wird
- optimiert.
- 3: Zum nächsten markierten Satz. Wird optimiert.
- Ist kein Satz mehr vorhanden, wird die Satzposition hinter dem
- letzten Satz eingenommen.
- Bedingung:
- anzahl dateien > 0
-
-PROC zurueck (INT CONST modus)
- Geht um einen Satz zurück. Die Modusangabe ist wie bei 'wei­
- ter', jedoch wird im Modus 1 keine weitere Satzkombination
- ausprobiert. Die Positionierung endet bei Satz 1.
- Bedingung:
- anzahl dateien > 0
-
-PROC auf satz (INT CONST satznr)
- Geht auf den angegebenen Satz. Ist 'satznr' < 1, wird auf Satz 1
- positioniert, ist der angegebene Satz nicht vorhanden, wird
- hinter den letzten Satz positioniert. Es wird jeweils die erste
- Satzkombination eingenommen.
- Bedingung:
- anzahl dateien > 0
-
-
-7.4 Änderungen
-
-Sätze des Dateimodells können eingefügt oder gelöscht werden.
-Durch das Einfügen entsteht ein leerer Satz vor dem aktuellen Satz;
-alle weiteren Sätze rücken eine Stelle weiter. Beim Löschen wird
-dieser Vorgang wieder rückgängig gemacht.
- Durch 'satz einfuegen' wird ein Leersatz eingefügt; durch
-'satz loeschen' wird der aktuelle Satz gelöscht.
- Sätze in gekoppelten Dateien werden grundsätzlich nicht ge­
-löscht; auch beim Einfügen entsteht nicht automatisch ein Leersatz
-in den gekoppelten Dateien. Änderungen in den Koppeldateien
-(durch 'feld aendern') werden gepuffert. Durch 'aenderungen ein­
-tragen' werden die Änderungen dann in die Koppeldateien eingetra­
-gen. Dabei kann auch ein neuer Satz in die Koppeldatei eingefügt
-werden. Bei Positionierungen wird diese Prozedur automatisch auf­
-gerufen.
-
-PROC satz einfuegen
- Fügt vor dem aktuellen Satz einen Leersatz ein.
- Bedingung:
- anzahl dateien > 0
-
-PROC satz loeschen
- Löscht den aktuellen Satz. Hat hinter dem letzten Satz keine
- Wirkung.
- Bedingung:
- anzahl dateien > 0
-
-PROC aenderungen eintragen
- Trägt die gepufferten Änderungen in die Koppeldateien ein.
- Dabei können die folgenden Fälle auftreten:
- 1. Der Satz in der Koppeldatei wird geändert.
- Dies geschieht dann, wenn vorher ein passender Satz in der
- Koppeldatei vorhanden war und die Koppelfelder nicht ver­
- ändert wurden.
- 2. In der Koppeldatei wird ein neuer Satz eingefügt.
- Wenn die Koppelfelder und noch andere Felder einer Datei
- geändert wurden, wird in dieser Datei ein neuer Satz einge­
- fügt.
- 3. Es wird neu gekoppelt.
- Wurden nur die Koppelfelder einer Datei geändert, wird ein
- neuer, zu diesen Feldern passender Satz gesucht. Nach
- 'aenderungen eintragen' erscheinen unter den Feldern der
- Datei die neuen Inhalte.
-
-
-7.5 Suchbedingungen
-
-Ãœber 'suchbedingung' kann eine Suchbedingung eingetragen werden,
-die für jeden Satz geprüft werden soll. Mit 'satz ausgewaehlt' wird
-erfragt, ob der aktuelle Satz die Suchbedingung erfüllt. Die Such­
-bedingung kann mit 'suchbedingung loeschen' wieder ausgeschaltet
-werden.
- Einzelne Sätze können auch markiert werden. Nach einem Öff­
-nen ist zunächst kein Satz markiert. Durch 'markierung  aendern'
-kann die Markierung eines Satzes geändert werden. 'satz markiert'
-fragt ab, ob der aktuelle Satz markiert ist. 'markierte saetze' liefert
-die Anzahl der markierten Sätze. Mit 'markierungen loeschen' wer­
-den alle Markierungen entfernt.
-
-PROC suchbedingung (INT CONST feldnr,
- TEXT CONST bedingung)
- Stellt für das angegebene Feld die im Text als Muster angege­
- bene Suchbedingung ein. Weitere Aufrufe verknüpfen die Be­
- dingungen mit UND (auch wenn das gleiche Feld erneut angege­
- ben wird).
- Bedingung:
- anzahl dateien > 0
- 1 <= feldnr <= anzahl felder
-
- FEHLER:
-#f1#
- #on("i")#Suchmuster zu umfangreich#off("i")#
- Es wurden zu viele Vergleiche gefordert.
-
-BOOL PROC satz ausgewaehlt
- Gibt an, ob die Suchbedingung auf den aktuellen Satz zutrifft.
- Hinter dem letzten Satz wird immer FALSE geliefert.
- Bedingung:
- anzahl dateien > 0
-
-PROC suchbedingung lesen (INT CONST feldnr, TEXT VAR bedingung)
- Liefert die zuletzt für das angegebene Feld eingestellte Bedin­
- gung, falls die Suchbedingung nicht gelöscht und keine Datei
- neu geöffnet wurde.
- Bedingung:
- 1 <= feldnr <= anzahl felder
-
-PROC suchbedingung loeschen
- Löscht die eingestellte Suchbedingung wieder. Anschließend
- sind alle Sätze ausgewählt.
- Bedingung:
- anzahl dateien > 0
-
-PROC markierung aendern
- Ändert die Markierung des aktuellen Satzes ins Gegenteil.
- Bedingung:
- anzahl dateien > 0
-
-BOOL PROC satz markiert
- Gibt an, ob der aktuelle Satz markiert ist.
- Bedingung:
- anzahl dateien > 0
-
-INT PROC markierte saetze
- Gibt an, wieviel Sätze insgesamt markiert sind.
- Bedingung:
- anzahl dateien > 0
-
-PROC markierungen loeschen
- Löscht alle Markierungen.
- Bedingung:
- anzahl dateien > 0
-
diff --git a/doc/eudas/eudas.ref.8 b/doc/eudas/eudas.ref.8
deleted file mode 100644
index fc2b3bc..0000000
--- a/doc/eudas/eudas.ref.8
+++ /dev/null
@@ -1,454 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (83)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-8 Funktionen zur Bearbeitung
-
-
-
-Die Verarbeitungsfunktionen arbeiten jeweils auf der aktuell geöff­
-neten Datei. Falls mindestens ein Satz markiert ist, werden nur
-markierte Sätze bearbeitet, anderenfalls die durch die Suchbedin­
-gung ausgewählten Sätze.
-
-
-8.1 Drucken
-
-Zum Drucken wird ein Druckmuster als Textdatei benötigt. Dessen
-Name muß beim Aufruf der Prozedur 'drucke' angegeben werden.
-Werden beim Ãœbersetzen des Druckmusters Fehler entdeckt, so wird
-der Paralleleditor aufgerufen und kein Druckvorgang durchgeführt.
- Normalerweise sendet der Druckgenerator die Ausgabe direkt
-zum Drucker. Alternativ kann die Ausgabe auch in eine Datei ge­
-schrieben werden. Dieses Verfahren kann mit 'direkt drucken' umge­
-stellt werden. Der Aufruf
-
-
- direkt drucken (TRUE)
-
-
-sendet alle Dateien direkt zum Drucker, mit
-
-
- direkt drucken (FALSE)
-
-
-wird die Ausgabe in Dateien abgelegt. Diese Dateien erhalten Namen
-der Form
-
-
- "Druckmustername.a$n"
-
-
-wobei 'n' eine laufende Nummer zur Unterscheidung ist.
- Soll die Druckausgabe in eine ganz bestimmte Datei geleitet
-werden, so kann vor dem Aufruf von 'drucke' die Prozedur 'druck­
-datei' aufgerufen werden, die als Parameter den Namen der Ausga­
-bedatei erhält. Existiert die Datei noch nicht, wird sie eingerichtet,
-ansonsten wird die Ausgabe am Ende angehängt.
- Die Einstellung der Ausgabedatei gilt nur für einen Druckvor­
-gang und überschreibt für diesen Druckvorgang 'direkt drucken'.
-Beim nächsten Druckvorgang wird wieder die durch 'direkt drucken'
-festgelegte Einstellung verwendet.
- Wenn beim Drucken ein großes Ausgabevolumen anfällt, kann es
-sinnvoll sein, die Ausgabe in mehrere kleine Dateien aufzuteilen.
-Dies gilt auch, wenn direkt gedruckt werden soll, da auch in diesem
-Fall eine Zwischendatei erzeugt werden muß. Die maximale Anzahl
-von Zeilen pro Datei wird durch 'max druckzeilen' angegeben.
- Der dort angegeben Wert gilt nur ungefähr - ein Wechsel der
-Ausgabedatei findet dann statt, wenn die Ausgabedatei nach Bear­
-beitung eines Satzes die Maximalanzahl überschritten hat. In die
-neue Datei wird anschließend zuerst der Initialisierungsteil des
-Druckmusters kopiert, ehe mit der Ausgabe des nächsten Satzes
-fortgefahren wird.
-
-Die Prozeduren im einzelnen:
-
-
-PROC drucke (TEXT CONST druckmuster)
-
- Die aktuell geöffnete Datei wird nach dem angegebenen Druck­
- muster gedruckt.
-
- FEHLER:
-#f1#
- #on("i")#Datei "druckmuster" existiert nicht#off("i")#
- Das angegebene Druckmuster ist nicht vorhanden.
-#f1#
- #on("i")#keine Datei geoeffnet#off("i")#
- Zum Drucken muß eine Datei geöffnet sein.
-#f1#
- #on("i")#direkt Drucken nicht möglich#off("i")#
- Es ist kein Druckprogramm installiert oder der Spooler läßt sich
- mit 'print' nicht ansprechen. Der Druck wird abgebrochen, die
- Ausgabedatei ist noch vorhanden.
-
-
-PROC direkt drucken (BOOL CONST ja)
-
- Gibt an, ob die Druckausgaben direkt gedruckt oder in einer
- Datei gesammelt werden sollen.
-
-
-PROC druckdatei (TEXT CONST ausgabedatei)
-
- Leitet die Druckausgabe des nächsten Druckvorgangs in die
- Datei 'ausgabedatei'. Die Einstellung von 'direkt drucken' wird
- für diesen Druckvorgang überschrieben. Die Ausgabe wird am
- Ende der Datei angehängt, falls nötig, wird die Ausgabedatei
- vorher eingerichtet.
-
-
-PROC maxdruckzeilen (INT CONST zeilen)
-
- Stellt die maximale Anzahl von Zeilen für die Ausgabedatei ein.
- Beim Überschreiten dieses Wertes wird eine neue Datei ange­
- fangen. Standardwert ist 4000.
-
-
-TEXT PROC lfd nr
-
- Liefert während des Druckens die laufende Nummer des gerade
- gedruckten Satzes als Text.
-
-
-BOOL PROC gruppenwechsel (INT CONST gruppennr)
-
- Kann innerhalb eines Vor- oder Nachspanns beim Drucken ab­
- gefragt werden, um festzustellen, ob die angegebene Gruppe
- gewechselt und damit den Vor- bzw. Nachspann mitverursacht
- hat (es können zu einem Zeitpunkt mehrere Gruppen wechseln).
- Die Gruppennummer 0 gibt die Standardgruppe an, die nur vor
- dem ersten und nach dem letzten Satz wechselt.
-
-
-8.2 Kopieren
-
-Zum selektiven Kopieren von EUDAS-Dateien wird ein Kopiermuster
-benötigt. Dieses gibt die Zuordnung zwischen Feldern der Ziel- und
-der Quelldatei an. Die Quelldatei ist immer die aktuell geöffnete
-Datei.
- Die Kopierfunktion wird durch 'kopiere' aufgerufen. Parameter
-sind der Name der Zieldatei und das Kopiermuster als FILE. Alter­
-nativ kann statt des Kopiermusters eine Prozedur übergeben wer­
-den, die die Kopieranweisungen erhält.
- Der eigentliche Kopiervorgang wird durch den Operator 'K'
-bewirkt. Dieser erhält den Zielfeldnamen und einen TEXT-Aus­
-druck als Parameter. Der Wert des TEXT-Ausdrucks wird in das
-jeweilige Feld der Zieldatei geschrieben.
- Existiert die Zieldatei noch nicht, so wird sie mit den Feldern
-eingerichtet, die in den einzelnen 'K'-Ausdrücken angegeben sind
-und zwar in der angeführten Reihenfolge. Existiert die Zieldatei, so
-werden gegebenenfalls noch nicht vorhandene Felder am Ende ange­
-fügt.
- Die Prozedur 'std kopiermuster' liefert zu einer gegebenen
-Zieldatei ein Standard-Muster, das als Auswahlgrundlage dienen
-kann. Existiert die Zieldatei nicht, werden alle Felder der Quell­
-datei 1 : 1 kopiert, anderenfalls wird zu jedem Feld der Zieldatei
-ein passendes Feld der Quelldatei gesucht - die Feldreihenfolge
-richtet sich in diesem Fall nach der Zieldatei.
-
-
-PROC kopiere (TEXT CONST dateiname,
- FILE VAR kopiermuster)
-
- Die aktuell geöffnete Datei wird nach den Angaben in 'kopier­
- muster' in die Datei 'dateiname' kopiert. Das Kopiermuster wird
- dem ELAN-Compiler übergeben. Tritt bei der Übersetzung ein
- Fehler auf, wird der Paralleleditor aufgerufen.
-
- FEHLER:
-#f1#
- #on("i")#Datei ist keine EUDAS-Datei#off("i")#
- Zieldatei existiert, ist aber keine EUDAS-Datei.
-#f1#
- #on("i")#keine Datei geoeffnet#off("i")#
- Es muß eine virtuelle Datei vorhanden sein.
-
-
-PROC kopiere (TEXT CONST dateiname, PROC kopierfunktion)
-
- Wie oben, nur ist die Kopierfunktion gleich als Prozedur vor­
- handen.
-
- FEHLER:
-#f1#
- #on("i")#Datei ist keine EUDAS-Datei#off("i")#
- Zieldatei existiert, ist aber keine EUDAS-Datei.
-#f1#
- #on("i")#keine Datei geoeffnet#off("i")#
- Es muß eine virtuelle Datei vorhanden sein.
-
-
-OP K (TEXT CONST feldname, ausdruck)
-
- Kopiert den Ausdruck in das Feld 'feldname' der Zieldatei.
- Dieses Feld wird eingerichtet, falls es noch nicht existiert.
- Dieser Operator ist nur während eines Kopiervorganges de­
- finiert (also in einem Kopiermuster oder einer Kopierfunktion).
- Er darf nicht in einer IF-Klausel stehen, sondern muß bei
- jedem Satz mit gleichem Feldnamen an der gleichen Stelle auf­
- gerufen werden.
-
-
-PROC std kopiermuster (TEXT CONST dateiname,
- FILE VAR kopiermuster)
-
- Liefert ein Standard-Kopiermuster, abhängig von der Zieldatei
- 'dateiname'. Existiert diese nicht, wird die Quelldatei unverän­
- dert kopiert, ansonsten richtet sich das Kopiermuster nach der
- Zieldatei.
-
-
-8.3 Tragen
-
-Durch Tragen können Sätze komplett in eine Zieldatei transportiert
-werden. In der Quelldatei sind sie anschließend nicht mehr vorhan­
-den. Eine ganze Auswahl von Sätzen kann mit 'trage' transportiert
-werden. 'trage satz' transportiert nur den aktuellen Satz. Mit
-'hole satz' kann der letzte Satz der Zieldatei wieder zurückgeholt
-werden, so daß eine EUDAS-Datei auch als Zwischenspeicher für
-Einzelsätze verwendet werden kann.
- Existiert die Zieldatei bereits, muß sie mindestens so viele
-Felder wie die Quelldatei besitzen, damit keine Informationen ver­
-lorengehen können. Die Feldnamen müssen nicht übereinstimmen.
-Existiert die Zieldatei noch nicht, wird sie mit den Feldern der
-Quelldatei eingerichtet.
- Die Tragefunktion kann um eine gleichzeitige Prüfung erweitert
-werden. Dabei werden Bedingungen überprüft, die bei der Zieldatei
-gespeichert sind. Sätze, die diese Bedingungen verletzen, werden
-nicht getragen. Eine entsprechende Meldung wird in eine Protokoll­
-datei geschrieben, die als Parameter übergeben werden muß.
- Die Prüfbedingungen stehen als ausführbares Programm in den
-Notizen der Zieldatei. Prüfbedingungen können mit mehreren Proze­
-duren formuliert werden. 'pruefe' nimmt eine beliebige Bedingung als
-Parameter und gibt bei Mißerfolg eine Meldung aus. 'wertemenge'
-prüft auf Übereinstimmung mit einem der angegebenen Werte. 'feld­
-maske' legt eine Maske für ein Feld fest, die auf den Inhalt zutref­
-fen muß.
- Mit Hilfe der Prozedur 'eindeutige felder' können Satzduplikate
-erkannt werden. Auch diese werden nicht getragen.
- Die bei den Prüfbedingungen angegebenen Feldnamen müssen in
-der Quelldatei vorhanden sein. Falls eine Prüfprozedur außerhalb
-von 'trage' aufgerufen wird, führt eine Verletzung der Prüfbedin­
-gung zu einem 'errorstop'.
-
-
-PROC trage (TEXT CONST dateiname,
- FILE VAR protokoll, BOOL CONST test)
-
- Alle ausgewählten Sätze werden in die Datei 'dateiname' getra­
- gen. Diese wird gegebenenfalls eingerichtet. Falls 'test' ange­
- geben ist, werden die in den Notizen der Zieldatei enthaltenen
- Bedingungen geprüft. Nur in diesem Fall muß 'protokoll' initial­
- isiert sein.
-
- FEHLER:
-#f1#
- #on("i")#kein Satz zum Tragen vorhanden#off("i")#
- Die Quelldatei ist leer oder es ist keine Datei geöffnet.
-#f1#
- #on("i")#Datei ist keine EUDAS-Datei#off("i")#
- Zieldatei existiert, ist aber keine EUDAS-Datei.
-#f1#
- #on("i")#Zieldatei hat falsche Felderzahl#off("i")#
- Zu wenig Felder in der Zieldatei.
-
-
-PROC trage satz (TEXT CONST dateiname)
-
- Der aktuelle Satz wird in die Datei 'dateiname' getragen.
-
- FEHLER:
-#f1#
- #on("i")#kein Satz zum Tragen vorhanden#off("i")#
- Keine Datei geöffnet oder Datei ist am Ende.
-#f1#
- #on("i")#Datei ist keine EUDAS-Datei#off("i")#
- Zieldatei existiert, ist aber keine EUDAS-Datei.
-#f1#
- #on("i")#Zieldatei hat falsche Felderzahl#off("i")#
- Zu wenig Felder in der Zieldatei.
-
-
-PROC pruefe (TEXT CONST feldname, BOOL CONST bedingung)
-
- Wenn die angegebene Bedingung FALSE liefert, wird eine Mel­
- dung in die Protokolldatei geschrieben und der jeweilige Satz
- nicht getragen.
-
-
-PROC wertemenge (TEXT CONST feldname. menge)
-
- Es wird geprüft, ob das angegebene Feld in der Wertemenge
- enthalten ist. Die einzelnen Werte in der Wertemenge werden
- dabei durch Komma getrennt. Leerzeichen sind signifikant.
-
-
-PROC feldmaske (TEXT CONST feldname, maske)
-
- Es wird geprüft, ob das angegebene Feld zu der Maske paßt. Die
- Zeichen in der Maske haben dabei folgende Bedeutung:
- '9' trifft auf jede Ziffer zu
- 'X' trifft auf jedes Zeichen zu
- 'A' trifft auf jeden Großbuchstaben zu (einschließlich
- Umlaute)
- 'a' trifft auf jeden Kleinbuchstaben zu (einschließlich
- Umlaute und 'ß')
- '*' trifft auf eine Folge beliebiger Zeichen zu (auch die
- leere Folge). Eine sparsame Verwendung wird empfoh­
- len, da die Bearbeitung sehr aufwendig ist.
- Alle anderen Zeichen treffen nur auf ein gleiches Zeichen zu.
-
-
-PROC eindeutige felder (INT CONST anzahl)
-
- Gibt an, die wieviel ersten Felder einen Satz eindeutig identifi­
- zieren sollen. Ein Satz, der mit einem Satz der Datei in diesen
- Feldern übereinstimmt, wird nicht getragen. Ohne diese Angabe
- wird keine derartige Prüfung vorgenommen.
-
-
-PROC hole satz (TEXT CONST dateiname)
-
- Holt den letzten Satz der angegebenen Datei und fügt ihn vor
- dem aktuellen Satz ein.
-
- FEHLER:
-#f1#
- #on("i")#"dateiname" existiert nicht#off("i")#
-#f1#
- #on("i")#Datei ist keine EUDAS-Datei#off("i")#
- Zieldatei existiert, ist aber keine EUDAS-Datei.
-#f1#
- #on("i")#Zieldatei hat falsche Felderzahl#off("i")#
- Zu viele Felder in der angegebenen Datei.
-#f1#
- #on("i")#Kein Satz zum Tragen vorhanden#off("i")#
- Die angegebene Datei ist leer.
-#f1#
- #on("i")#keine Datei geoeffnet#off("i")#
- Es muß eine virtuelle Datei vorhanden sein.
-
-
-8.4 Verarbeitung
-
-Die ausgewählten Sätze der aktuellen Datei können nach einer
-Verarbeitungsvorschrift verändert oder geprüft werden. Dies ge­
-schieht durch die Prozedur 'verarbeite'. Als Parameter kann ent­
-weder ein Verarbeitungsmuster als FILE oder die Verarbeitungs­
-funktion direkt als Prozedur übergeben werden.
- Die Vorschrift wird durch den Operator 'V' realisiert.
-
-
-PROC verarbeite (FILE VAR verarbeitungsmuster)
-
- Die aktuelle Datei wird nach dem angegebenen Muster bearbei­
- tet. Enthält die Vorschrift, die dem ELAN-Compiler übergeben
- wird, einen Fehler, wird der Paralleleditor aufgerufen.
-
- FEHLER:
-#f1#
- #on("i")#keine Datei geoeffnet#off("i")#
- Es muß eine virtuelle Datei vorhanden sein.
-
-
-PROC verarbeite (PROC verarbeitungsfunktion)
-
- Wie oben, nur wird die Vorschrift direkt als Prozedur überge­
- ben.
-
- FEHLER:
-#f1#
- #on("i")#keine Datei geoeffnet#off("i")#
- Es muß eine virtuelle Datei vorhanden sein.
-
-
-OP V (TEXT CONST feldname, ausdruck)
-
- Das angegebene Feld des aktuellen Satzes wird durch den Aus­
- druck ersetzt.
-
- FEHLER:
-#f1#
- #on("i")#Das Feld "feldname" ist nicht definiert.#off("i")#
- Das angegebene Feld ist nicht vorhanden.
-
-
-8.5 Funktionen in Ausdrücken
-
-Für Ausdrücke bei den in diesem Kapitel beschriebenen Prozeduren
-sind einfache Funktionen zur Abfrage von Feldinhalten vorhanden.
-Mit 'f' kann der Inhalt eines benannten Feldes erfragt werden, bei
-'wert' wird der Inhalt erst in eine REAL-Zahl umgewandelt, wobei
-nichtnumerische Zeichen ignoriert werden.
- Die Prozedur 'textdarstellung' kann dazu verwendet werden,
-den Wert einer TEXT-Variablen als TEXT-Denoter in ELAN-Syntax
-darzustellen.
- Die Prozedur 'zahltext' kann dazu verwendet werden, aus einer
-REAL-Zahl einen mit der richtigen Zahl von Nachkommastellen ver­
-sehenen, variabel langen Text zu machen.
-
-
-TEXT PROC f (TEXT CONST feldname)
-
- Liefert den Inhalt des angegebenen Feldes.
-
- FEHLER:
-#f1#
- #on("i")#Das Feld "feldname" ist nicht definiert.#off("i")#
-
-
-REAL PROC wert (TEXT CONST feldname)
-
- Liefert den Inhalt des angegebenen Feldes als REAL. Dabei
- werden nichtnumerische Zeichen ignoriert, ausgenommen das
- Minuszeichen und das eingestellte Dezimalkomma (s. 'dezimal­
- komma'). Tritt kein numerisches Zeichen auf, wird der Wert 0.0
- geliefert.
-
- FEHLER:
-#f1#
- #on("i")#Das Feld "feldname" ist nicht definiert.#off("i")#
-
-
-REAL PROC wert (TEXT CONST feldname, INT CONST kommastellen)
-
- Wie 'wert' mit einem Parameter, nur daß das Ergebnis auf die
- angegebene Anzahl von Nachkommastellen gerundet wird.
-
- FEHLER:
-#f1#
- #on("i")#Das Feld "feldname" ist nicht definiert.#off("i")#
-
-
-TEXT PROC textdarstellung (TEXT CONST anzeigetext)
-
- Liefert 'anzeigetext' als TEXT-Denoter, also in Anführungs­
- strichen. Anführungsstriche im Text werden dabei verdoppelt.
- Steuerzeichen von 0 bis 31 werden in lesbare Form gebracht.
-
-
-TEXT PROC zahltext (REAL CONST wert, INT CONST kommastellen)
-
- Liefert den Text des angegebenen Werts mit dem eingestellten
- Dezimalkomma und mit der angegebenen Zahl von Nachkomma­
- stellen. Sind die Kommastellen 0, wird auch das Komma unter­
- drückt. Der Text erhält soviel Stellen, wie zur Darstellung
- benötigt werden.
-
-
-TEXT PROC zahltext (TEXT CONST feldname,
- INT CONST kommastellen)
-
- Wirkt wie 'zahltext (wert (feldname), kommastellen)'.
-
diff --git a/doc/eudas/eudas.ref.9 b/doc/eudas/eudas.ref.9
deleted file mode 100644
index dc2dd0d..0000000
--- a/doc/eudas/eudas.ref.9
+++ /dev/null
@@ -1,194 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (93)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-9 Anzeige
-
-
-
-9.1 Fensterverwalter
-
-Funktionen, die einen Teil des Bildschirms in einem rechteckigen
-Fenster beschreiben, werden über den Fensterverwalter untereinan­
-der koordiniert. Jede Funktion fordert für ihren Fensterbereich eine
-Variable vom Typ FENSTER an. Vor jedem Bildschirmzugriff kann die
-Funktion erfahren, ob andere Programme den Bildschirm im Fenster­
-bereich überschrieben haben. Gleichzeitig meldet sie damit Verän­
-derungen an anderen Fenstern an, die sich mit dem eigenen über­
-schneiden.
-
-
-PROC fenster initialisieren (FENSTER VAR neu)
-
- Jede Fenstervariable muß vor Benutzung initialisiert werden.
-
-
-PROC fenstergroesse setzen (FENSTER VAR fenster,
- INT CONST x anf, y anf,
- x laenge, y laenge)
-
- Die Fenstergröße des Fensters wird gesetzt. 'x anf' und 'y anf'
- werden von 1..n gezählt. Die Größe eines 24x80-Bildschirms
- entspricht den Angaben (1, 1, 79, 24). Da das letzte Zeichen
- einer Zeile wegen Rollgefahr nicht benutzt werden kann, werden
- nur 79 Spalten angegeben.
-
- FEHLER:
-
- #on("i")#zu viele Fenster#off("i")#
- Es sind nur 16 verschiedene Fenstergrößen möglich.
-
-
-PROC fenstergroesse (FENSTER CONST fenster,
- INT VAR x anf, y anf,
- x laenge, y laenge)
-
- Meldet die eingestellte Größe des Fensters.
-
-
-PROC fensterzugriff (FENSTER CONST mein fenster,
- BOOL VAR veraendert)
-
- Ein Zugriff auf 'mein fenster' wird angemeldet. 'veraendert' gibt
- an, ob das Fenster seit dem letzten Zugriff durch einen über­
- schneidenden Zugriff verändert wurde. Beim ersten Zugriff ist
- 'veraendert' immer TRUE.
-
-
-PROC fenster veraendert (FENSTER CONST fenster)
-
- Falls ein Unterprogramm eine FENSTER-Variable des Hauptpro­
- grammes benutzt, kennzeichnet das Unterprogramm das Fenster
- mit dieser Prozedur als benutzt, damit das Hauptprogramm das
- Bild neu ausgibt.
-
-
-PROC bildschirm neu
-
- Gibt an, daß der Bildschirm von einer Funktion benutzt wurde,
- die ihre Zugriffe nicht über den Fensterverwalter anmeldet.
- Alle Fenster werden als verändert gekennzeichnet.
-
-
-9.2 Anzeigegrundfunktionen
-
-Sämtliche Anzeigefunktionen werden in einem Fenster abgewickelt,
-dessen Größe durch 'anzeigefenster' bestimmt wird.
- Die Funktion 'bildausgeben' übernimmt die eigentliche Ausgabe.
-Dabei kann durch Parameter mitgeteilt werden, ob sich an der Datei
-außer der Markierung etwas geändert hat. Hat sich nichts geändert,
-wird zur Optimierung unter Umständen nur die Markierung neu
-ausgegeben. Das Bild wird jedoch auf jeden Fall ganz ausgegeben,
-wenn das Fenster von anderer Seite verändert wurde. Auch das
-Öffnen einer neuen Datei wird automatisch erkannt und richtig
-behandelt.
- Welche Felder dargestellt werden sollen, kann durch 'feldaus­
-wahl' angegeben werden. Dabei ist für jeden Anzeigemodus eine
-eigene Feldauswahl möglich. Die Darstellung kann durch 'rollen' in
-vertikaler Richtung verschoben werden.
- Mit 'uebersicht' kann die Ãœbersicht ausgegeben werden. Ihre
-Größe wird durch 'uebersichtsfenster' angegeben.
-
-
-PROC anzeigefenster (INT CONST x anf, y anf,
- x laenge, y laenge)
-
- Das Anzeigefenster wird in der entsprechenden Größe reser­
- viert.
-
- FEHLER:
-
- #on("i")#Anzeigefenster zu klein#off("i")#
- Das Fenster ist zu schmal (< 40 Zeichen), um eine sinnvolle
- Anzeige zuzulassen.
-
-
-PROC bild ausgeben (BOOL CONST datei veraendert)
-
- Im Anzeigefenster wird das Bild je nach eingestelltem Modus
- ausgegeben, wenn das Fenster verändert wurde oder 'satz ver­
- aendert' TRUE ist. 'satz veraendert' muß immer dann angegeben
- werden, wenn am Inhalt der virtuellen Datei etwas verändert
- wurde.
-
-
-PROC feldauswahl (TEXT CONST feldcode)
-
- Die im aktuellen Modus anzuzeigenden Felder und ihre Reihen­
- folge werden ausgewählt. Dabei enthält 'feldcodes' an der i-ten
- Stelle den Code der Feldnummer des Feldes, das an i-ter Posi­
- tion erscheinen soll.
-
-
-PROC rollen (INT CONST anzahl)
-
- Die Darstellung wird um die angegebene Anzahl von Zeilen
- gerollt. Bei einer positiven Angabe wird zu höheren Feld- bzw.
- Satznummern gerollt (Bild bewegt sich umgekehrt). Beim ersten
- bzw. letzten Feld bzw. Satz hört das Rollen automatisch auf.
-
-
-PROC uebersichtsfenster (INT CONST x anf, y anf,
- x laenge, y laenge)
-
- Legt die Größe des Übersichtsfensters fest.
-
-
-PROC uebersicht (TEXT CONST feldauswahl)
-
- Ruft eine Übersicht der aktuellen Datei auf, in der geblättert
- und markiert werden kann. In 'feldauswahl' steht an der Stelle
- i der Code der Feldnummer, die als i-tes in der Aufzählung
- erscheinen soll.
-
-
-9.3 Editorfunktionen
-
-Es stehen drei Funktionen zur Verfügung, die den Editor im Anzei­
-gemodus benutzen. Sie dienen zum Einfügen und Ändern sowie zum
-Eingeben eines Suchmusters.
- Der Editor wird durch ESC 'q' verlassen. Weitere ESC-Funk­
-tionen, die zum Verlassen führen sollen, können durch 'exit zeichen'
-angegegeben und nach Funktionsausführung mit 'exit durch' abge­
-fragt werden.
-
-
-PROC aendern (PROC hilfe)
-
- Bietet den aktuellen Satz zum Ändern an. Steht die virtuelle
- Datei am Ende, wird automatisch 'einfuegen' durchgeführt. Bei
- ESC '?' wird 'hilfe' aufgerufen.
-
-
-PROC einfuegen (PROC hilfe)
-
- Fügt vor dem aktuellen Satz einen Satz ein, dessen Inhalt im
- Editor angegeben wird. Bei ESC '?' wird 'hilfe' aufgerufen.
-
-
-PROC suchen (PROC hilfe)
-
- Im Editor wird eine neue Suchbedingung eingegeben. Bei ESC '?'
- wird 'hilfe' aufgerufen.
-
-
-PROC exit durch (TEXT CONST zeichenkette)
-
- Gibt die Zeichen an, die beim Drücken nach ESC zum Verlassen
- des Editors führen sollen. Die eingegebenen Daten werden je­
- doch vorher auf jeden Fall noch verarbeitet.
-
-
-TEXT PROC exit durch
-
- Gibt an, durch welches Zeichen der Editor verlassen wurde.
-
diff --git a/doc/eudas/eudas.ref.fehler b/doc/eudas/eudas.ref.fehler
deleted file mode 100644
index 736d009..0000000
--- a/doc/eudas/eudas.ref.fehler
+++ /dev/null
@@ -1,139 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (115)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-Fehlermeldungen
-
-
-
-In diesem Kapitel sind alle Fehlermeldungen aufgeführt, die von
-EUDAS erzeugt werden und zum Abbruch einer Funktion führen
-können.
-
-#on("i")#'n' ist keine Feldnummer#off("i")#
- Es wurde eine Nummer als Feldnummer angegeben, die nicht er­
- laubt ist.
-
-#on("i")#Datei ist keine EUDAS-Datei#off("i")#
- Es wurde versucht, eine andere Datei als EUDAS-Datei zu bear­
- beiten.
-
-#on("i")#inkonsistente EUDAS-Datei#off("i")#
- Die interne Struktur der Datei ist zerstört. Kann durch Hardware­
- probleme (Archiv-Lesefehler) oder EUDAS-interne Fehler ent­
- standen sein.
-
-#on("i")#EUDAS-Datei voll#off("i")#
- Eine EUDAS-Datei kann nur eine bestimmte Anzahl von Sätzen
- aufnehmen (mindestens 5000).
-
-#on("i")#Nicht erlaubtes Dezimalkomma#off("i")#
- Als Dezimalkomma kann nur ein einzelnes Zeichen angegeben
- werden.
-
-#on("i")#Zuviel Dateien geoeffnet#off("i")#
- Es können nicht mehr als 10 Dateien gleichzeitig geöffnet, geket­
- tet und gekoppelt sein.
-
-#on("i")#Zu viele Felder#off("i")#
- Alle geöffneten Dateien zusammen dürfen nicht mehr als 256
- Felder der virtuellen Datei ergeben.
-
-#on("i")#Zu viele Koppelfelder#off("i")#
- Es dürfen insgesamt nicht mehr als 32 Koppelfelder entstehen.
-
-#on("i")#keine Koppelfelder vorhanden#off("i")#
- Eine Datei kann nicht gekoppelt werden, wenn Sie kein Koppelfeld
- besitzt.
-
-#on("i")#keine Datei geoeffnet#off("i")#
- Es kann nicht gekettet oder gekoppelt werden, wenn noch keine
- Datei geöffnet wurde. Ebenfalls sind keine Verarbeitungsproze­
- duren möglich.
-
-#on("i")#Nicht möglich, wenn auf Koppeldatei geschaltet#off("i")#
- Wenn auf eine Koppeldatei umgeschaltet wurde, ist Öffnen, Ketten
- und Koppeln nicht möglich.
-
-#on("i")#kein direkter Dateizugriff bei geketteten oder gekoppelten Dateien#off("i")#
- Wenn Dateien gekettet oder gekoppelt sind, ist Sortieren und
- Ändern der Feldstruktur nicht möglich.
-
-#on("i")#Datei nicht gesichert#off("i")#
- Eine vorher geöffnete Datei ist verändert und nicht gesichert.
-
-#on("i")#Datei wird von anderer Task geändert#off("i")#
- Das Öffnen der Datei zum Ändern ist im Moment nicht möglich, da
- ein anderer Benutzer sie bereits ändert.
-
-#on("i")#Suchmuster zu umfangreich#off("i")#
- Ein Suchmuster darf nicht mehr als 100 Vergleiche erfordern.
-
-#on("i")#direkt Drucken nicht moeglich#off("i")#
- Entweder ist kein Druckprogramm installiert oder die Spooltask
- reagiert nicht.
-
-#on("i")#Das Feld "Feldname" ist nicht definiert#off("i")#
- Sie haben einen falschen Namen angegeben.
-
-#on("i")#Kein Satz zum Tragen vorhanden#off("i")#
- Es wurde versucht, aus einer leeren Datei oder am Dateiende zu
- tragen.
-
-#on("i")#Zieldatei hat falsche Felderzahl#off("i")#
- Eine Zieldatei beim Tragen hat weniger Felder als die aktuelle
- Datei. Daher würden beim Tragen Informationen verlorengehen.
-
-#on("i")#Zieldatei darf nicht geöffnet sein#off("i")#
- Eine geöffnete Datei ist als Zieldatei nicht zulässig.
-
-#on("i")#Das Feld "Feldname" verletzt die Pruefbedingung#off("i")#
- Eine Prüfprozedur wurde außerhalb des Tragens aufgerufen und
- die Bedingung war nicht erfüllt.
-
-#on("i")#Das Feld "Feldname" ist nicht in der Wertemenge#off("i")#
- Eine Prüfprozedur wurde außerhalb des Tragens aufgerufen und
- die Bedingung war nicht erfüllt.
-
-#on("i")#Das Feld "Feldname" stimmt nicht mit der Maske ueberein#off("i")#
- Eine Prüfprozedur wurde außerhalb des Tragens aufgerufen und
- die Bedingung war nicht erfüllt.
-
-#on("i")#Zu viele Fenster#off("i")#
- Es sind nicht mehr als 16 verschiedene Größen von Fenstern
- möglich.
-
-#on("i")#Fenster zu klein#off("i")#
- Ein Menü wurde in einem zu kleinen Fenster aufgerufen.
-
-#on("i")#Hilfe existiert nicht#off("i")#
- Es wurde versucht, eine nicht vorhandene Hilfestellung aufzu­
- rufen.
-
-#on("i")#Hilfe ist leer#off("i")#
- Die angewählte Hilfestellung enthält keinen Text.
-
-#on("i")#Anzeigefenster zu klein#off("i")#
- Das Anzeigefenster muß mindestens 40 Zeichen breit sein.
-
-#on("i")#Ungueltige Satznummer#off("i")#
- Der angegebene Text stellt keine Satznummer dar.
-
-#on("i")#kein rekursiver Aufruf#off("i")#
- Innerhalb von EUDAS darf 'eudas' nicht erneut aufgerufen wer­
- den.
-
-#on("i")#Task existiert nicht#off("i")#
- Es wurde versucht, eine nicht existente Task als Manager einzu­
- stellen.
-
-
diff --git a/doc/eudas/eudas.ref.inhalt b/doc/eudas/eudas.ref.inhalt
deleted file mode 100644
index ae997cb..0000000
--- a/doc/eudas/eudas.ref.inhalt
+++ /dev/null
@@ -1,120 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (3)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-Inhalt
-
-
-
- Vorwort . . . . . . . . . . . . . . . . . . . i
- Inhalt . . . . . . . . . . . . . . . . . . . . iii
-
-
-I. Funktionen zum Nachschlagen
-
-#on("b")#1 Zustände und Bedienung#off("b")#
-#free (0.2)#
-1.1 Zustände . . . . . . . . . . . . . . . . . . . 3
-1.2 Menüs . . . . . . . . . . . . . . . . . . . . 8
-1.3 Auswahl . . . . . . . . . . . . . . . . . . . 8
-1.4 Hilfe und Dialog . . . . . . . . . . . . . . . 9
-1.5 Editor . . . . . . . . . . . . . . . . . . . . 9
-
-#on("b")#2 Zusammenstellung der Funktionen#off("b")#
-#free (0.2)#
-2.1 Menü 'Öffnen' . . . . . . . . . . . . . . . . 13
-2.2 Menü 'Einzelsatz' . . . . . . . . . . . . . . 17
-2.3 Menü 'Gesamtdatei' . . . . . . . . . . . . . . 21
-2.4 Menü 'Drucken' . . . . . . . . . . . . . . . . 23
-2.5 Menü 'Dateien' . . . . . . . . . . . . . . . . 25
-2.6 Menü 'Archiv' . . . . . . . . . . . . . . . . 27
-2.7 Kurzabfrage . . . . . . . . . . . . . . . . . 29
-
-#on("b")#3 Das virtuelle Dateimodell#off("b")#
-#free (0.2)#
-3.1 Dateistruktur . . . . . . . . . . . . . . . . 31
-3.2 Öffnen . . . . . . . . . . . . . . . . . . . . 32
-3.3 Koppeln . . . . . . . . . . . . . . . . . . . 33
-3.4 Änderungen . . . . . . . . . . . . . . . . . . 34
-3.5 Sichern . . . . . . . . . . . . . . . . . . . 36
-3.6 Umschalten auf Koppeldatei . . . . . . . . . . 36
-3.7 Mehrbenutzerbetrieb . . . . . . . . . . . . . 37
-
-#on("b")#4 Ansehen und Bearbeiten#off("b")#
-#free (0.2)#
-4.1 Anzeige . . . . . . . . . . . . . . . . . . . 39
-4.2 Satzauswahl . . . . . . . . . . . . . . . . . 42
-4.3 Sortieren und Reorganisieren . . . . . . . . . 44
-4.4 Bearbeiten . . . . . . . . . . . . . . . . . . 46
-
-#on("b")#5 Drucken und Druckmuster#off("b")#
-#free (0.2)#
-5.1 Druckmustersyntax . . . . . . . . . . . . . . 49
-5.2 Der Druckvorgang . . . . . . . . . . . . . . . 51
-5.3 Interpretation von Musterzeilen . . . . . . . 52
-5.4 Anschluß zum ELAN-Compiler . . . . . . . . . . 56
-5.5 Fehlermeldungen . . . . . . . . . . . . . . . 57
-
-
-II. EUDAS für Programmierer
-
-#on("b")#6 Struktur von EUDAS-Dateien#off("b")#
-#free (0.2)#
-6.1 Der Datentyp SATZ . . . . . . . . . . . . . . 61
-6.2 Der Datentyp EUDAT . . . . . . . . . . . . . . 63
-6.3 Satzposition . . . . . . . . . . . . . . . . . 64
-6.4 Satzzugriffe . . . . . . . . . . . . . . . . . 65
-6.5 Sortieren und Reorganisieren . . . . . . . . . 66
-6.6 EUDAS-Dateien als Assoziativspeicher . . . . . 68
-
-#on("b")#7 Verwaltung der offenen Dateien#off("b")#
-#free (0.2)#
-7.1 Dateiverwaltung . . . . . . . . . . . . . . . 71
-7.2 Feldstruktur . . . . . . . . . . . . . . . . . 75
-7.3 Positionierung . . . . . . . . . . . . . . . . 77
-7.4 Änderungen . . . . . . . . . . . . . . . . . . 78
-7.5 Suchbedingungen . . . . . . . . . . . . . . . 79
-
-#on("b")#8 Funktionen zur Bearbeitung#off("b")#
-#free (0.2)#
-8.1 Drucken . . . . . . . . . . . . . . . . . . . 83
-8.2 Kopieren . . . . . . . . . . . . . . . . . . . 85
-8.3 Tragen . . . . . . . . . . . . . . . . . . . . 87
-8.4 Verarbeitung . . . . . . . . . . . . . . . . . 89
-8.5 Funktionen in Ausdrücken . . . . . . . . . . . 90
-
-#on("b")#9 Anzeige#off("b")#
-#free (0.2)#
-9.1 Fensterverwalter . . . . . . . . . . . . . . . 93
-9.2 Anzeigegrundfunktionen . . . . . . . . . . . . 94
-9.3 Editorfunktionen . . . . . . . . . . . . . . . 95
-
-#on("b")#10 Programmierung der Menüs#off("b")#
-#free (0.2)#
-10.1 Menüformat . . . . . . . . . . . . . . . . . . 97
-10.2 Verwaltung der Menüs . . . . . . . . . . . . . 99
-10.3 Aufruf . . . . . . . . . . . . . . . . . . . . 101
-10.4 Dialog . . . . . . . . . . . . . . . . . . . . 103
-
-#on("b")#11 Programmierung von Anwendungen#off("b")#
-#free (0.2)#
-11.1 Musterprogramme . . . . . . . . . . . . . . . 105
-11.2 Dateianwendungen . . . . . . . . . . . . . . . 109
-11.3 Integrierte Anwendungen . . . . . . . . . . . 111
-
-
-III. Anhang
-
- Fehlermeldungen . . . . . . . . . . . . . . . 115
- Prozeduren mit Parametern . . . . . . . . . . 119
- Register . . . . . . . . . . . . . . . . . . . 125
-
diff --git a/doc/eudas/eudas.ref.macros b/doc/eudas/eudas.ref.macros
deleted file mode 100644
index 1d24468..0000000
--- a/doc/eudas/eudas.ref.macros
+++ /dev/null
@@ -1,73 +0,0 @@
-#*format#
-#limit (13.5)##start (3.5,2.5)##pagelength (21.0)##block#
-#:firsthead (false)#
-#linefeed (1.07)#
-#*macro end#
-#*text#
-#type ("prop10")#
-#linefeed (1.07)#
-#*macro end#
-#*beispiel#
-#type ("12")#
-#linefeed (0.97)#
-#*macro end#
-#*bildschirm#
-#type ("15")#
-#linefeed(0.83)#
-#*macro end#
-#*proc#
-#type ("12")#
-#*macro end#
-#*endproc#
-#free (0.1)#
-#type ("prop10")#
-#linefeed (1.07)#
-#*macro end#
-#*abschnitt ($1,$2,$3)#
-#headodd#
-#on("b")#$1#right#$3 %#off("b")#
-#free (1.0)#
-#end#
-#on("b")##ib(9)#$1#ie(9,"   $3")# $2#off("b")#
-#*macro end#
-#*char($1)#
-$1
-#*macro end#
-#*kapitel ($1,$2,$3,$4)#
-#free (1.3)#
-#"nlq"#
-#type("roman.24")#
-#on("b")##center#$1#off("b")#
-#free (0.2)#
-#type ("roman.18")#
-#on("b")##center#$2 #off("b")#
-#on("b")##center# $3#off("b")#
-#on("b")##center#$4#off("b")#
-#type ("prop10")#
-#free (0.6)#
-#headeven#
-#on("b")#% $2 $3 $4#off("b")#
-#free (1.0)#
-#end#
-#headodd#
-#right##on("b")#%#off("b")#
-#free (1.0)#
-#end#
-#*macro end#
-#*f2#
-#free (0.2)#
-#*macro end#
-#*a ($1)#
-#on("b")#$1.#off("b")# 
-#*macro end#
-#*bsp ($1)#
-#type("12")#$1#type("prop")#
-#*macro end#
-#*f1#
-#free (0.1)#
-#*macro end#
-
-
-
-
-
diff --git a/doc/eudas/eudas.ref.proz b/doc/eudas/eudas.ref.proz
deleted file mode 100644
index 2007bc1..0000000
--- a/doc/eudas/eudas.ref.proz
+++ /dev/null
@@ -1,205 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (119)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-Prozeduren mit Parametern
-
-
-
-
-:= (SATZ VAR, SATZ CONST) 6.1
-
-aendern (PROC hilfe) 9.3
-aendern erlaubt : BOOL 7.1
-aenderungen eintragen 7.4
-anzahl dateien : INT 7.1
-anzahl felder : INT 7.2
-anzahl koppeldateien : INT 7.1
-anzeigefenster (INT CONST x anf, y anf,
- x laenge, y laenge) 9.2
-auf satz (EUDAT VAR, INT CONST satznr) 6.3
-auf satz (EUDAT VAR, TEXT CONST muster) 6.3
-auf satz (INT CONST satznr) 7.3
-ausfuehrtaste (TEXT CONST taste) 10.3
-auswahl anbieten (TEXT CONST name, FENSTER CONST f,
- TEXT CONST hilfe,
- PROC (TEXT VAR, INT CONST) inhalt) 10.3
-
-bild ausgeben (BOOL CONST datei veraendert) 9.2
-bildschirm neu 9.1
-
-dateiende (EUDAT CONST) : BOOL 6.3
-dateiende : BOOL 7.3
-dateien loeschen (BOOL CONST auch geaenderte) 7.1
-dateiversion : INT 7.1
-dezimalkomma (TEXT CONST komma) 6.5
-dezimalkomma : TEXT 6.5
-dialog 10.4
-dialogfenster (INT CONST x anf, y anf,
- x laenge, y laenge) 10.4
-direkt drucken (BOOL CONST ja) 8.1
-druckdatei (TEXT CONST dateiname) 8.1
-drucke (TEXT CONST mustername) 8.1
-
-editget (TEXT CONST prompt, TEXT VAR eingabe,
- TEXT CONST res, hilfe) 10.4
-eindeutige felder (INT CONST anzahl) 8.3
-einfuegen (PROC hilfe) 9.3
-eudas dateiname (INT CONST dateinr) : TEXT 7.1
-EUDAT 6.2
-exit durch (TEXT CONST exit zeichen) 9.3
-exit durch : TEXT 9.3
-
-f (TEXT CONST feldname) : TEXT 8.5
-fehler ausgeben 10.4
-feld aendern (SATZ VAR, INT CONST feldnr,
- TEXT CONST inhalt) 6.1
-feld aendern (EUDAT VAR, INT CONST feldnr,
- TEXT CONST inhalt) 6.4
-feld aendern (INT CONST feldnr, TEXT CONST inhalt) 7.2
-feldauswahl (TEXT CONST feldcodes) 9.2
-feld bearbeiten (SATZ CONST, INT CONST feldnr,
- PROC (TEXT CONST, INT CONST, INT CONST) bearbeite) 6.1
-feld bearbeiten (EUDAT CONST, INT CONST feldnr,
- PROC (TEXT CONST, INT CONST, INT CONST) bearbeite) 6.4
-feld bearbeiten (INT CONST feldnr,
- PROC (TEXT CONST, INT CONST, INT CONST) bearbeite) 7.2
-felderzahl (SATZ CONST) : INT 6.1
-felderzahl (EUDAT CONST) : INT 6.2
-feldindex (SATZ CONST, TEXT CONST muster) : INT 6.1
-feldinfo (EUDAT VAR, INT CONST feldnr, info) 6.5
-feldinfo (EUDAT CONST, INT CONST feldnr) : INT 6.5
-feld lesen (SATZ CONST, INT CONST feldnr,
- TEXT VAR inhalt) 6.1
-feld lesen (EUDAT CONST, INT CONST feldnr,
- TEXT VAR inhalt) 6.4
-feld lesen (INT CONST feldnr, TEXT VAR inhalt) 7.2
-feldmaske (TEXT CONST feldname, maske) 8.3
-feldnamen aendern (EUDAT VAR, SATZ CONST namen) 6.2
-feldnamen bearbeiten (INT CONST feldnr,
- PROC (TEXT CONST, INT CONST, INT CONST) bearbeite) 7.2
-feldnamen lesen (EUDAT CONST, SATZ VAR namen) 6.2
-feldnamen lesen (INT CONST feldnr, TEXT VAR name) 7.2
-feldnummer (TEXT CONST feldname) : INT 7.2
-FENSTER 9.1
-fenstergroesse (FENSTER CONST f,
- INT VAR x anf, y anf,
- x laenge, y laenge) 9.1
-fenstergroesse setzen (FENSTER VAR fenster,
- INT CONST x anf, y anf,
- x laenge, y laenge) 9.1
-fenster initialisieren (FENSTER VAR fenster) 9.1
-fenster veraendert (FENSTER CONST fenster) 9.1
-fensterzugriff (FENSTER CONST fenster,
- BOOL VAR veraendert) 9.1
-
-global manager 10.2
-gruppenwechsel (INT CONST gruppennr) : BOOL 8.1
-
-hilfe anbieten (TEXT CONST name, FENSTER CONST f) 10.3
-hole satz (TEXT CONST dateiname) 8.3
-
-inhalt veraendert (INT CONST dateinr) : BOOL 7.1
-ja (TEXT CONST frage, hilfe) : BOOL 10.4
-
-K (TEXT CONST feldname, ausdruck) 8.2
-kette (TEXT CONST dateiname) 7.1
-kopiere (TEXT CONST dateiname, FILE VAR muster) 8.2
-kopiere (TEXT CONST dateiname, PROC kopierfunktion) 8.2
-kopple (TEXT CONST dateiname) 7.1
-
-lfd nr : TEXT 8.1
-
-markierte saetze : INT 7.5
-markierung aendern 7.5
-markierungen loeschen 7.5
-maxdruckzeilen (INT CONST anzahl zeilen) 8.1
-menue anbieten (ROW 6 TEXT CONST menuenamen,
- FENSTER VAR f,
- BOOL CONST esc erlaubt,
- PROC (INT CONST, INT CONST) interpreter) 10.3
-menuedaten einlesen (TEXT CONST dateiname) 10.2
-menue loeschen (TEXT CONST name, INT CONST index) 10.2
-menue loeschen (BOOL CONST hilfen reduzieren) 10.2
-menue manager (DATASPACE VAR ds,
- INT CONST order, phase,
- TASK CONST order task) 10.2
-menuenamen (INT CONST index) : THESAURUS 10.2
-
-neuer dialog 10.4
-notizen aendern (EUDAT VAR, INT CONST notiz nr,
- TEXT CONST notizen) 6.2
-notizen lesen (EUDAT CONST, INT CONST notiz nr,
- TEXT VAR notizen) 6.2
-
-oeffne (EUDAT VAR, TEXT CONST dateiname) 6.2
-oeffne (TEXT CONST dateiname,
- BOOL CONST aendern erlaubt) 7.1
-
-pruefe (TEXT CONST feldname, BOOL CONST bedingung) 8.3
-
-reorganisiere (TEXT CONST dateiname) 6.5
-rollen (INT CONST anzahl) 9.2
-
-saetze (EUDAT CONST) : INT 6.3
-SATZ 6.1
-satz aendern (EUDAT VAR, SATZ CONST neuer satz) 6.4
-satz ausgewaehlt : BOOL 7.5
-satz einfuegen (EUDAT VAR, SATZ CONST satz) 6.4
-satz einfuegen 7.4
-satz initialisieren (SATZ VAR satz) 6.1
-satzkombination : INT 7.3
-satz lesen (EUDAT CONST, SATZ VAR satz) 6.4
-satz loeschen (EUDAT VAR) 6.4
-satz loeschen 7.4
-satz markiert : BOOL 7.5
-satznr (EUDAT CONST) : INT 6.3
-satznummer : INT 7.3
-sichere (INT CONST dateinr, TEXT CONST dateiname) 7.1
-sortiere (EUDAT VAR, TEXT CONST reihenfolge) 6.5
-sortiere (EUDAT VAR) 6.5
-sortierreihenfolge (EUDAT CONST) : TEXT 6.5
-status anzeigen (TEXT CONST zeile) 10.3
-std kopiermuster (TEXT CONST dateiname, FILE VAR f) 8.2
-suchbedingung (INT CONST feldnr,
- TEXT CONST bedingung) 7.5
-suchbedingung loeschen 7.5
-suchen (PROC hilfe) 9.3
-
-textdarstellung (TEXT CONST text) : TEXT 8.5
-trage (TEXT CONST dateiname, FILE VAR protokoll,
- BOOL CONST test) 8.3
-trage satz (TEXT CONST dateiname) 8.3
-
-unsortierte saetze (EUDAT CONST) : INT 6.5
-
-V (TEXT CONST feldname, ausdruck) 8.4
-verarbeite (FILE VAR verarbeitungsmuster) 8.4
-verarbeite (PROC verarbeitungsfunktion) 8.4
-
-waehlbar (INT CONST menuenr, funktionsnr,
- BOOL CONST moeglich) 10.3
-wahl (INT CONST stelle) : INT 10.3
-weiter (EUDAT VAR) 6.3
-weiter (EUDAT VAR, TEXT CONST muster) 6.3
-weiter (INT CONST modus) 7.3
-wert (TEXT CONST feldname) : REAL 8.5
-wert (TEXT CONST feldname, INT CONST kommastellen) : REAL 8.5
-wertemenge (TEXT CONST feldname, menge) 8.3
-
-zahltext (REAL CONST wert, INT CONST kommastellen) : TEXT 8.5
-zahltext (TEXT CONST feldname,
- INT CONST kommastellen) : TEXT 8.5
-zurueck (EUDAT VAR) 6.3
-zurueck (EUDAT VAR, TEXT CONST muster) 6.3
-zurueck (INT CONST modus) 7.3
-
diff --git a/doc/eudas/eudas.ref.reg b/doc/eudas/eudas.ref.reg
deleted file mode 100644
index a34307a..0000000
--- a/doc/eudas/eudas.ref.reg
+++ /dev/null
@@ -1,436 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (125)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-Register
-
-
-
-#columns (2, 0.5)#
-#limit (6.5)#
-ABKUERZUNGEN-Anweisung 49
-Abkürzungsteil 49
-Abkürzungsverzeichnis 68
-Abkürzungszeile 50
-Abschlußzeile 39
-aendern 96
-Ändern 10, 19
- -, nach Vorschrift 48
-aendern erlaubt 74
-Änderungen 34
-aenderungen eintragen 79
-Änderungsmuster 21
-Alternative 43
-Ankreuzen 8
-anzahl dateien 74
-anzahl felder 75
-anzahl koppeldateien 74
-Anzeige 39, 93
-anzeigefenster 95
-Arbeitskopie 13, 32
- -, löschen 15, 36
- -, sichern 15, 36
-Archivmanager 28
- -, reservieren 29
-Archiv (Menü) 27
-Archivübersicht drucken 27
-Assoziativspeicher 68
-auf koppeldatei 74
-Aufräumen 26
-auf satz 65, 78
-Auf Satz Nr. 17
-Ausdrucken 24
-Ausführen 8
-ausfuehrtaste 8, 102
-AUSWAHL 97
-AUSWAHL: 4
-Auswahl 8
- -, Format 98
-auswahl anbieten 103
-
-Bearbeiten 46
-BILD 97
-bild ausgeben 95
-bildschirm neu 94
-
-Datei, aufräumen 26
- -, kopieren (logisch) 25
- -, kopieren vom Archiv 27
- -, löschen 25
- -, löschen auf Archiv 28
- -, Platzbedarf 26
- -, reorganisieren 26
- -, schreiben auf Archiv 27
- -, umbenennen 25
- -, virtuelle 32, 71
-Dateianwendungen 109
-Dateien Archiv, Ãœbersicht 27
-dateiende 64, 78
-dateien loeschen 74
-Dateien (Menü) 25
-Dateien System, Ãœbersicht 25
-Dateilimit 52
-Dateimanager 28
-Dateiname 40
-dateiversion 75
-DATUM 45
-Dezimalkomma 45
-dezimalkomma 67
-dialog 104
-Dialog 9, 103
-dialogfenster 104
-DIN 45
-direkt drucken 83f.
-Druckausgabe, Richtung 23
-druckdatei 85
-drucke 84
-Drucken 23, 49, 83
- -, Archivübersicht 27
-Drucken (Menü) 23
-Druckmuster 23, 49, 83
- -, Fehler 56
-Druckvorgang 51
-
-editget 104
-EDITIEREN: 6
-Editieren 23
- -, Zeile 9
-Editor 9, 29
-eindeutige felder 47, 89
-einfuegen 96
-Einfügen 10, 19
- -, Satz 36
- -, Zeile 10
-EINGABE: 4
-Eingabe 9
-Einzelsatz (Menü) 17
-ELAN-Compiler 56
-ELAN-Kommandos 8
-ENDE 97
-Endekennzeichnung 40
-ESC '?' 6
-ESC '9' 4
-ESC '1' 4
-ESC '?' 4
-ESC '?' 3
-ESC 'D' 5
-ESC ESC 3
-ESC 'F' 5f.
-ESC 'g' 5
-ESC 'h' 4ff.
-ESC 'K' 36
-ESC OBEN 5
-ESC 'p' 5
-ESC 'q' 4, 6
-ESC RUBIN 5
-ESC RUBOUT 5
-ESC UNTEN 5
-ESC 'w' 4f.
-ESC 'z' 4f.
-eudas 29
-EUDAS: 3
-EUDAS-Datei, aufspalten 110
- -, drucken 23, 49, 83
- -, einrichten 13
- -, ketten 14, 32
- -, kopieren 21, 46, 85
- -, koppeln 14, 32
- -, nach Vorschrift ändern 48
- -, öffnen 13, 32
- -, reorganisieren 67
- -, sortieren 22
- -, Struktur 31, 61
- -, tragen 46, 87
- -, Ãœbersicht 22
- -, verändern 21
-eudas dateiname 75
-EUDAT 61, 63, 109
-EUMEL-Netz 28
-exit durch 96
-
-f 91
-FEHLER 5
-fehler ausgeben 104
-Feld 31
-FELD 98
-feld aendern 62, 65, 76
-Feldauswahl 20, 41, 95
-feld bearbeiten 62, 65, 76
-felderzahl 62, 63
-feldindex 62
-feldinfo 66, 77
-Feldinhalt 31, 39
-feld lesen 65, 76
-feldmaske 47, 89
-Feldmuster 53
-Feldname 31, 39
- -, ändern 16
- -, anfügen 16
-feldnamen aendern 63
-feldnamen bearbeiten 76
-feldnamen lesen 64, 76
-feldnummer 76
-Feldstruktur 15
-Feldtyp 31, 42
-Feldtypen 45, 66
- -, ändern 16
-Feldvergleich 43
-Fenster 93
-fenstergroesse 94
-fenstergroesse setzen 93
-fenster initialisieren 93
-fenster veraendert 94
-fensterzugriff 94
-folgedatei 75
-Folgezeilen 41
-Formular 39
-FRAGE: 5
-Fragen 9
-Funktion, ausführen 8
- -, gesperrte 8
-
-Gesamtdatei (Menü) 21
-Gib Kommando: 6
-global manager 36, 100
-Gruppe 51
-GRUPPE-Anweisung 49
-gruppenwechsel 51, 85
-
-Hauptdatei 32
-HILFE: 4
-HILFE 97, 99
-Hilfe 9
- -, Format 98
-hilfe anbieten 103
-Holen 19
-hole satz 89
-HOP LINKS 4
-HOP 'o' 4
-HOP OBEN 3ff.
-HOP RECHTS 4
-HOP RETURN 4
-HOP RUBOUT 4
-HOP UNTEN 3ff.
-HOP 'x' 4
-
-inhalt veraendert 74
-Initialisieren 28
-Initialisierungsteil 49
-
-ja 104
-
-K 46, 86
-kette 73
-Ketten 14, 32
-Klassenwechsel 106
-Kombinationen 34
-Kommandos 8
-Kommandozeile 50
-kopiere 86
-Kopieren 21, 46, 85
-Kopieren (logisch) 25
-Kopieren vom Archiv 27
-Kopiermuster 21, 46
-KOPPEL 40
-Koppeldatei, umschalten auf 36
-Koppelfelder 33
-Koppeln 14, 32f.
-kopple 72
-Kurzabfrage 29
-
-LEER 3f.
-Leertaste 8
-lfd nr 85
-lineform 24
-LINKS 3f.
-Literaturangaben 108
-Löschen 25
- -, Satz 36
- -, Zeile 10
-Löschen auf Archiv 28
-
-Manager 13
-Manager (Mehrbenutzer) 16, 36
-markierte saetze 81
-Markierung 18, 40, 42
-markierung aendern 81
-Markierungen löschen 22
-markierungen loeschen 81
-maxdruckzeilen 85
-MEHR-Anweisung 50
-MENUE 97
-Menü 8
- -, Aufruf 101
- -, Verwaltung 99
-menue anbieten 101
-menuedaten einlesen 99
-Menüformat 97
-menue loeschen 100
-menue manager 100
-menuenamen 100
-Modi 55
-MODUS-Anweisung 50
-Musterprogramme 105
-Musterteil 50
-Musterzeichen 53
-Musterzeile 50
- -, Interpretation 52
-
-Nachbearbeiten 24
-Nachspann 49
-NACHSPANN-Anweisung 49
-Namenskonflikte 33
-neuer dialog 104
-Normalmodus 55
-Notizen 15, 31, 64
-notizen aendern 64, 77
-notizen lesen 64, 77
-
-'o' 4
-OBEN 3f.
-ODER-Verknüpfung 43
-oeffne 63, 72
-Öffnen 32
-Öffnen (Menü) 13
-
-pageform 24
-Paralleleditor 56, 83
-Paßwort 29
-Platzbedarf 26
-Positionieren 17, 31, 64, 77
-Priorität 44
-Programmzeile 51
-Protokolldatei 47
-Prüfbedingungen 16, 31, 47, 64,
- 87
-pruefe 47, 88
-Pufferplatz 54
-
-RECHTS 3f.
-Refinement 56
-reorganisiere 67
-Reorganisieren 26, 45, 67
-Reservieren 29
-RETURN 4
-Richtung Druckausgabe 23
-rollen 95
-Rollen 41
-RUBIN 4
-RUBOUT 4
-
-saetze 64
-SATZ 61
-Satz 31
-satz aendern 66
-satz ausgewaehlt 80
-Satzauswahl 42
-Satzeditor 9
-satz einfuegen 66, 79
-Satzformular 39
-satz initialisieren 62
-satzkombination 77
-satz lesen 66
-satz loeschen 66, 79
-satz markiert 81
-satznr 64
-satznummer 77
-Satznummer 39
-Satzposition 64
-Satzzeiger 31
-Satzzugriffe 65
-Schreiben auf Archiv 27
-SEITE 99
-sichere 73
-Sichern 15, 36
-sortiere 67
-Sortieren 22, 31, 44, 66
-Sortierreihenfolge 31, 44
-sortierreihenfolge 67
-Sortierzustand 45
-Spaltendruck 52
-Sperre 36
-Standard-Kopiermuster 21, 46
-status anzeigen 103
-Statuszeile 3
-std kopiermuster 87
-Suchbedingung 17, 39, 42
- -, löschen 18
- -, setzen 18
-suchbedingung 80
-suchbedingung lesen 80
-suchbedingung loeschen 80
-suchen 96
-Suchen, Optimierung 44
-Suchmuster 42
- -, eingeben 10
-
-Tabellenmodus 55
-Tasten 3
-Tastenfunktionen 3
-TEXT 45
-textdarstellung 91
-Textdatei, ausdrucken 24
- -, editieren 23
- -, nachbearbeiten 24
-Textzeile 49f.
-trage 88
-Tragen 16, 19, 21, 46, 87
-trage satz 88
-
-uebersicht 95
-uebersichtsfenster 95
-Umbenennen 25
-Umbruch 40, 55
-Umschalten auf Koppeldatei 36
-UND-Verknüpfung 43
-unsortierte saetze 67
-UNTEN 3f.
-Ãœberschrift 39
-Ãœbersicht 22, 41
-Ãœbersicht Dateien Archiv 27
-Ãœbersicht Dateien System 25
-
-V 48, 90
-Verändern 21
-verarbeite 90
-Verarbeitung 89
-Verknüpfung von Bedingungen
-43
-virtuelle Datei 32, 71
-VORSPANN 98
-Vorspann 49
-VORSPANN-Anweisung 49
-
-waehlbar 102
-wahl 103
-Warten 6
-weiter 65, 78
-Weiter 17
-wert 91
-wertemenge 47, 88
-WIEDERHOLUNG-Anweisung 49
-Wiederholungsteil 49
-
-'x' 4
-
-ZAHL 45
-zahltext 91
-Zeichen, reservierte 44
-ZEIGEN: 6
-Zeilenende 54
-Zeilenwiederholung 55
-Zielarchiv 28
-Zurück 17
-zurueck 65, 78
-Zustand 3
-Zustandsübergänge 7
-
diff --git a/doc/eudas/eudas.ref.titel b/doc/eudas/eudas.ref.titel
deleted file mode 100644
index 223a839..0000000
--- a/doc/eudas/eudas.ref.titel
+++ /dev/null
@@ -1,91 +0,0 @@
-#limit (14.0)#
-____________________________________________________________________________
-
-
-#on("b")##on ("u")#
-#center#Betriebssystem E U M E L
-#off ("u")#
-
-
-#center#gs-MP BAP
-
-
-
-
-#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#
-#free (6.0)#
-#on("b")#EUDAS#off("b")#
-#free (1.0)#
-#on("b")#Anwender-#off("b")#
-#on("b")#Datenverwaltungssystem#off("b")#
-#free (2.0)#
-#on ("b")#VERSION 4#off("b")#
-#free(1.0)#
-#on("u")#                                                    #off("u")#
-#free (0.5)#
-#on("b")#REFERENZHANDBUCH#off("b")#
-#block#
-#page#
-#free (9.5)#
-Hergestellt mit Hilfe der EUMEL-Textverarbeitung und des Pro­
-gramms FontMaster der Martin Schönbeck GmbH.
-#free (1.7)#
-Ausgabe September 1987
-
-Dieses Handbuch und das zugehörige Programm sind urheberrechtlich
-geschützt. Die dadurch begründeten Rechte, insbesondere der Ver­
-vielfältigung in irgendeiner Form, bleiben dem Autor vorbehalten.
-
-Es kann keine Garantie dafür übernommen werden, daß das Pro­
-gramm für eine bestimmte Anwendung geeignet ist. Die Verantwor­
-tung dafür liegt beim Kunden.
-
-Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrekt­
-heit und Vollständigkeit der Angaben wird aber keine Gewähr über­
-nommen. Das Handbuch kann jederzeit ohne Ankündigung geändert
-werden.
-
-(c) Copyright 1987 Thomas Berlage
- Software-Systeme
- Im alten Keller 3
-#free (0.1)#
- D-5205 Sankt Augustin 1
-#page#
-#free (7.0)#
-#center##on("b")#I.#off("b")#
-#free (1.0)#
-#center##on("b")#FUNKTIONEN#off("b")#
-#center##on("b")#ZUM#off ("b")#
-#center##on("b")#NACHSCHLAGEN#off("b")#
-#page#
-#free (7.0)#
-#center##on("b")#II.#off("b")#
-#free (1.0)#
-#center##on("b")#EUDAS#off("b")#
-#center##on("b")#FÃœR#off ("b")#
-#center##on("b")#PROGRAMMIERER#off("b")#
-#page#
-#free (7.0)#
-#center##on("b")#III.#off("b")#
-#free (1.0)#
-#center##on("b")#ANHANG#off("b")#
-
-
-
-
diff --git a/doc/eudas/eudas.ref.vorwort b/doc/eudas/eudas.ref.vorwort
deleted file mode 100644
index f911be8..0000000
--- a/doc/eudas/eudas.ref.vorwort
+++ /dev/null
@@ -1,81 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (1)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-____________________________________________________________________________
-
-
-#on("b")##on ("u")#
-#center#Betriebssystem E U M E L
-#off ("u")#
-
-
-#center#EUDAS
-
-
-
-
-#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#
-#center#1
-
-Vorwort
-
-
-
-Lieber EUDAS-Benutzer!
-
-Dies ist das zweite Handbuch, das Sie zu EUDAS bekommen. Wenn
-Sie sich mit EUDAS noch nicht auskennen, sollten Sie zunächst das
-#on("i")#Benutzerhandbuch#off("i")# zu Rate ziehen, ehe Sie in dieses Handbuch
-schauen.
-
- Das #on("i")#Referenzhandbuch#off("i")# ist in zwei Teile geteilt. Im ersten Teil
-finden Sie eine Übersicht über alle EUDAS-Funktionen (im Kapitel
-2) sowie zusammengefaßte Informationen über die Bedienung (Kapi­
-tel 1) und die genaue Wirkung der einzelnen Funktionen (Kapitel 3
-bis 5). Dieser Teil soll Ihnen zum Nachschlagen dienen, wenn Sie
-eine bestimmte Information suchen.
- Im zweiten Teil sind alle Informationen zusammengefaßt, die
-ein Programmierer zur Benutzung der EUDAS-Funktionen braucht. Es
-sei an dieser Stelle jedoch davon abgeraten, sofort eigene Program­
-me zu schreiben, da sich in vielen Fällen die gleiche Wirkung auch
-durch Programmierung innerhalb von EUDAS-Funktionen erreichen
-läßt (zum Beispiel in Druck- und Änderungsmustern).
- Im Zweifelsfall orientieren Sie sich anhand von Kapitel 11, wie
-Sie Ihr Problem am besten lösen können.
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/doc/eudas/ref.abb.1-1 b/doc/eudas/ref.abb.1-1
deleted file mode 100644
index d3b3217..0000000
--- a/doc/eudas/ref.abb.1-1
+++ /dev/null
@@ -1,42 +0,0 @@
-#limit (13.5)#
-#start (3.5, 5.0)#
-#lpos (0.5)##c pos (3.5)##c pos (4.7)##cpos (7.0)##c pos (10.5)#
-#table#
-      eudas   ESC q  
-
-    ESC ESC   ESC h
-#free (0.2)#
-GIB KDO:     EUDAS  
-#free (0.2)#
-    ESC h    
-    RET        LEER  'Buchst.'  
-
-        ESC q          
-
-        FEHLER
-
-
-  WARTEN      
-      n, j  
-        FRAGE
-
-      RET  
-        EINGABE
-#linefeed (0.5)#
-
-
-        ESC z          
-      ESC q  
-#linefeed (1.0)#
-        AUSWAHL
-
-      ESC q  
-        EDITIEREN
-
-      ESC q  
-        SATZEDITOR
-ESC ?   ESC q        
-      ESC q  
-HILFE       ZEIGEN
-
-
diff --git a/doc/eudas/register b/doc/eudas/register
deleted file mode 100644
index 9cca0fc..0000000
--- a/doc/eudas/register
+++ /dev/null
@@ -1,490 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (181)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-Register
-
-
-
-#columns (2, 0.5)#
-#limit (6.5)#
-% 63, 69, 148
-%% 141
-& 63, 69, 103, 148
-<!> 57
--- 103
-.. 102
-.a$ 65
-'+' 107
-'-' 107
-
-Abbruch 35
-Abkürzungen 133
-Abkürzungsteil 134, 140
-Absatzmarken 125, 129
-Abschlußzeile 45
-Abschneiden 71
-Abschnitt 67, 69, 134
-Alternative 99
- -, globale 100
- -, lokale 99
-AND 162
-Ändern 55
-Änderungen 83, 85, 90, 95
- -, automatisch 121
-Änderungsmuster 121, 166
-Anführungsstrich 27, 34
-Ankreuzen 36, 40
-Anrede 138
-Anweisung 63
- -, Textkosmetik 74
-Anzeige 44
- -, rollen 97
-Arbeitsbereich 16
-Arbeitskopie 56, 84, 173
- -, Beispiel 58
- -, löschen 57
-Arbeitstask 16
-Archiv 32
- -, anmelden 34
- -diskette 36
- -, lesen 34
- -, löschen 176
- -manager 175, 177
- -menü 33, 174
- -name 34, 36
- -, schreiben 36
- -übersicht 175
-Arithmetik 161
-Attribut 4, 29
-Aufräumen 173
-Ausdrucken 66
-Ausdrücke 116, 151
- -, Zusammensetzung 152
-Ausgabedatei 66
-Ausgaberichtung 65
-Auswahlzustand 36, 40
-Automatische Änderungen 121
-
-Bedienungsregeln 39
-begin 16
-Benutzerhandbuch i
-Berechnungen 8
-Bewegen 45
-Bildschirmaufbau 45
-Bitte warten 34, 40
-blättern 46
-BOOL 154, 162
-
-Carriage Return 15
-CAT 167
-CONST 155
-CR 15
-Cursor 35, 46
- -tasten 54
-
-date 137
-Datei 27
- -arten 27
- -, aufräumen 173
- -auswahl 36
- -größe, Begrenzung 124
- -, kopieren 172
- -limit 71
- -, löschen 38, 172
- -namen 172
- -, Platzbedarf 173
- -, reorganisieren 174
- -sperre 95
- -, umbenennen 172
- -verwaltung 37
- -, virtuelle 83
-Dateien, Archiv 174
- - (Menü) 38, 171
- -, System 171
-DATEIENDE 106
-Daten, ändern 55
- -, anzeigen 44
- -, sichern 33
- -typen 152
- -typen, umwandeln 154
- -verwaltung 3
-Datum 44, 99, 133, 137
-DATUM 112
-DECR 167
-Denotation 154
-Dezimalkomma 111, 161
-Dezimalpunkt 148
-DIN 112
-Diskette 28, 32
- -, formatieren 176
- -, initialisieren 176
-Diskettenlaufwerk 175
-Doppeleinträge 121
-DOS 178
-Druckausgabe, Bearbeitung 125
-Drucken 7, 61
- -, Ablauf 66
- -, Aufruf 64, 66
- - (Menü) 22, 65
- -, Ãœbersicht 175
-Druckersteuerungsanweisungen
- 74, 124
-Druckmuster 13, 23, 61, 166
- -, Fehler 134
- -, Ãœbersetzung 134, 142
- -, Zeilenlänge 71
-Druckrichtung 123
-Druckverfahren 62
-
-Editieren 64
-Editor 34, 41, 52, 125
-eindeutige felder 121
-Einfügen 18, 52
-Eingabe, Daten 52
- -, Suchmuster 46
-Eingabeüberprüfung 112
-Eingabezustand 35, 40
-Eingangsmenü 17
-Einzelsatz (Menü) 18, 44, 92, 97
-ELAN-Anweisungen 141
-ELAN-Ausdrücke 116, 151
-ELAN-Compiler 134
-ELIF 168
-ELSE 139
-ENDE 45
-Endesatz 45, 48, 53, 85
-ENTER 15
-ESC '1' 107
-ESC '?' 31, 39, 40
-ESC '9' 107
-ESC 'D' 99
-ESC ESC 41, 111
-ESC 'F' 67
-ESC 'g' 99
-ESC 'h' 35, 39, 40, 55, 107
-ESC 'K' 92
-ESC OBEN 97
-ESC 'p' 99
-ESC 'P' 118
-ESC 'q' 32ff.,40 , 47, 65, 107
-ESC RUBIN 54
-ESC RUBOUT 54
-ESC UNTEN 97
-ESC 'w' 32, 40, 53
-ESC 'z' 32, 36, 40, 95
-Etiketten 126
-eudas 30, 125
-EUDAS-Archivdiskette 11, 29
-EUDAS-Datei 27, 61, 171
- -, drucken 61
- -, einrichten 17, 51
- -, Grenzen 29
- -, kopieren 113
- -, Mehrfachbenutzung 93
- -, Struktur 28
-EUDAS, Aufruf 30
- -, Installation 11
- -, Start 15
- -, Verlassen 24, 32
-EUMEL-Netz 175
-EUMEL-Textverarbeitung 5
-EUMEL-Zeichencode 110
-
-f 117, 134, 156
-FALSE 154
-Fehler, Druckmuster 66
- -, quittieren 36
- -zustand 35, 40
-Feld 29
-Feldauswahl 97, 106
-Felder, anfügen 111, 114
-Feldinhalt 29, 156, 160
-feldmaske 120
-Feldmuster 63, 69
-Feldmustertypen 71
-Feldnamen 29, 67
- -, abfragen 67
- -, Abgrenzung 72
- -, ändern 112
- -, eingeben 51
- -, Länge 133
-Feldreihenfolge 113
-Feldstruktur 111
-Feldteil 45
-Feldtypen 110, 154
- -, ändern 111
-Feldvergleich 103
-Formatieren 177
-Formbrief 74
-Formular 8, 44
-Fragezustand 38, 40
-Funktionen 152
- -, ausführen 31, 46
- -, auswählen 30
- -, gesperrt 31
-Fußzeile 44
-
-Gib Kommando 41, 11
-global manager 93
-GRUPPE 145
-Gruppen 144
- -definition 145
- -, mehrere 145
- -wechsel 145
-gruppenwechsel 145
-
-halt 39, 110
-Hardwarefehler 33
-Hauptdatei 87ff.
-Hilfe 31
-Hilfezustand 31, 40
-Hilfstexte 13, 31
-Hintergrunddiskette 12
-Hintergrundengpaß 124
-Holen 56
-HOP OBEN 40, 98, 106
-HOP RETURN 106
-HOP RUBIN 54
-HOP RUBOUT 54
-HOP UNTEN 40, 98, 106
-HOP 'x' 98
-
-IF 117
-IF-Abfragen 161, 168
-IF-Anweisungen 138
-INCR 167
-Init 176
-Initialisierungsteil 124, 143
-Installation 11
-int 140
-INT 153
-
-K 113
-Karteikarten 5
-KB 173
-Ketten 13, 83, 85, 95
-Kilobyte 173
-Klammern 163
- -, spitze 72
-Kombination 89
-Kombinationsnummer 90
-Kopieren, logisch 172
- -, EUDAS-Datei 112
- - (vom Archiv) 34, 176
-Kopieranweisung 113
-Kopiermuster 113, 115, 166
- -, Ãœbersetzung 116
-KOPPEL 92
-Koppeldatei, Markierung 105
- -, Position 93
- -, umschalten 92
-Koppelfeld 86, 89
- -, übernehmen 92
-Koppeln 13, 83, 85, 95
- -, mehrere Dateien 87
-Koppelvorgang, Schema 87
-Korrekturversion 14
-
-Länge, feste 70, 137
- -, variable 70
-Leerautomatik 73
-Leertaste 17, 31
-length 158
-lfd nr 137, 157
-limit 71, 125
-lineform 125, 129
-LINKS 31, 35
-linksbündig 71
-Linksschieben 128
-list (archive) 34
-Löschen 55
- - (auf Archiv) 176
- - (Datei) 172
-
-Manager 93, 95
-Managertask 175
-MARK 104
-Markieren 104
- -, in Ãœbersicht 107
-Markierung 104
- -, löschen 105
-maxdruckzeilen 124
-MEHR 129
-Mehrfachbenutzung 93
-Menü 30
-Menüzustand 31, 40
-min 155
-Modi 128
-Multi-User 12
-Multi-User-System 16
-Musterbrief 139
-Musterteil 135
-Musterzeichen 70
-
-Nachbearbeitung 125
-Nachspann 68, 144
-NACHSPANN 68
-Negation 103
-Netz 175
-Numerieren 137
-
-'o' 40, 98
-OBEN 30, 106
-ODER 100
-Öffnen 17, 21, 43, 51, 57, 83, 95
- - (Menü) 30
-Operatoren 152, 155
- -, Priorität 163
-OR 163
-
-pageform 125
-Paralleleditor 67, 142
-Parameter 152
-Paßwort 94, 177
-Pfeiltasten 54
-Platzbedarf, Datei 173
-pos 159
-Position, feste 69
- -, variable 69
-Positionierung 48
-Proportionalschrift 129
-Prüfbedingungen 118
-pruefe 120
-PUBLIC 13
-
-REAL 153
-real 155
-RECHTS 31, 55
-rechtsbündig 71, 137
-Referenzhandbuch i, 79
-Refinement 134, 140, 163
-Reorganisieren 174
-Reservieren 178
-RET 15
-RETURN 15
-Richtung, Druckausgabe 65, 123
-Rollen 97, 106
-RUBIN 35, 54
-RUBOUT 35, 54
-Runden 160
-
-Satz 29
- -, anwählen 46
- -editor 41, 47, 53, 92, 98
- -, einfügen 52
- -, holen 56
- -, löschen 55
- -, tragen 55
-Satz.Nr 46, 48
-Satznummer 45, 90
-Satzauswahl, kopieren 114
-Schreiben (auf Archiv) 36, 176
-Schreibmarke 35
-Schrifttypen 125
-Selektion 48
-Sichern 20, 56, 84, 95
-Single-User 12
-Single-User-System 16
-Sortieren 109
- -, Optimierung 110
- -, Zieldatei 115
-Sortierreihenfolge 109
-Spaltenbreite 126
-Spaltendruck 126
-Speicherplatz 14, 38, 176
- -, Datei 173
-Sperren von Dateien 95
-Standard-Kopiermuster 115
-Stationsnummer 175
-Statistik 169
-Statuszeile 31, 39
-Stern 50, 101
-SUB 158, 163
-subtext 158
-SUCH 47
-Suchbedingung f. Drucken 67
-Suchbedingung, Kombination 49
-Suchbedingung löschen 48
-Suchbedingung setzen 46
-Suchen 21, 46
- -, Optimierung 104
-Suchmuster 47, 99
- -, Eingabe 47
-SV-Taste 16, 39
-System 32
-
-Tabellenmodus 128
-Tagesdatum 99
-Task, Manager 93
-Tasks 13
-Teildatei 114
-Teiltexte 158
-TEXT 112, 153
-text 140
-Textdatei 28, 61, 171
- -, ändern 65
- -, ansehen 65
- -, ausdrucken 66
- -, editieren 64
-Texte, verketten 156
-Text-Funktionen 156
-Textkonstanten 139
-Text, konstanter 117
-Text, Länge 158
-Textverarbeitung 3, 123
-THEN 139
-Tragen 55, 118
-TRUE 154
-
-Uhrzeit 133
-Umbruch 129
-Umlaute 143
-Umschalten auf Koppeldatei 92
-UND 100ff.
-UNTEN 30, 106
-Ãœberschrift 45, 68
-Ãœbersicht (Archiv) 34, 175
- - (Dateien) 37, 171
- - (Sätze) 105
-
-V 122
-VAR 165
-Variablen 165
- -, Initialisierung 143, 167
- -, Lebensdauer 166
- -, Typ 165
-Verändern 121
-Vergleiche 102, 162
-virtuelle Datei 83
-Vorspann 68, 144
-VORSPANN 68
-
-Weiter 45, 48, 90
-wert 148, 160
-wertemenge 119
-WIEDERHOLUNG 63, 126
-
-'x' 36, 40
-
-ZAHL 110
-zahltext 148, 160
-Zeichen, reservierte 64, 69, 103
-Zeigen 40
-Zeile einfügen 54
-Zeilenfortsetzung 129
-Zeilenlänge 71
-Zielarchiv 175
-Zieldatei, Struktur 113
-Zurück 45, 48, 90
-Zustand 31, 40
-Zuweisung 166
-
-
diff --git a/doc/eudas/uedas.hdb.4 b/doc/eudas/uedas.hdb.4
deleted file mode 100644
index ecbfd58..0000000
--- a/doc/eudas/uedas.hdb.4
+++ /dev/null
@@ -1,686 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (27)#
-#headodd#
-#center#EUDAS#right#%
-
-#end#
-#headeven#
-%#center#EUDAS
-
-#end#
-#center#1
-
-4 Umgang mit Dateien und Menüs
-
-
-
-Zu Anfang dieses Teils sollen Sie zunächst die Terminologie von
-EUDAS kennenlernen. Das Karteikartenmodell des ersten Kapitels
-muß ja auf einem Rechner realisiert werden. Dazu müssen erst eini­
-ge Ausdrücke erklärt werden.
-
-
-4.1 EUDAS-Dateien
-
-Der wichtigste Ausdruck, der Ihnen noch sehr häufig begegnen wird,
-ist #on("i")#Datei#off("i")#. Eine Datei ist eine Sammlung von Informationen in einem
-Computer, die als ein Objekt transportiert und behandelt werden
-können. Dieser Name wurde analog zu "Kartei" gebildet, mit dem
-Unterschied, daß eine "Daten-Kartei" gemeint ist.
- Jede Datei hat einen eigenen Namen, durch den sie identifiziert
-wird. Der Name ist oft in Anführungsstriche eingeschlossen - die
-Anführungsstriche gehören jedoch nicht zum Namen, sondern dienen
-nur zur Abgrenzung, welche Zeichen zum Namen gehören. Der Name
-ist also wie die Aufschrift auf einem Aktenordner. Wenn alle Ordner
-im Schrank stehen, können Sie anhand des Namens den richtigen
-Ordner finden, anderenfalls müßten Sie alle Ordner öffnen.
-
-#on("b")#Dateiarten#off("b")# Dateien werden nun für viele verschiedene Arten
-von
-Informationen benutzt. Sie können einerseits Texte enthalten oder
-auch Karteien, Grafiken, Formeln oder Zahlenkolonnen. Sie haben
-bereits im ersten Kapitel den Unterschied zwischen Datenverwaltung
-und Textverarbeitung kennengelernt. In diesem Zusammenhang sind
-die beiden ersten Verwendungsweisen wichtig.
-
-#limit (12.0)#
- #on("i")#Textdateien#off("i")#
- sind Dateien, die normale Texte enthalten, die mit
- dem Editor verändert und einfach ausgedruckt
- werden können. In ihnen werden also Informationen
- gespeichert, wie die Textverarbeitung sie benötigt.
-
- #on("i")#EUDAS-Dateien#off("i")#
- sind dagegen Dateien, die Informationen in der
- Form von Karteikarten enthalten. Sie haben also
- die Struktur, wie sie von der Datenverwaltung be­
- nötigt wird.
-#limit (13.5)#
-
- Der Computer kann aber auch alle Arten von Dateien gleich­
-behandeln, und zwar dann, wenn der Inhalt der Dateien nicht be­
-trachtet werden muß.
- Ein häufiger Fall ist zum Beispiel, wenn Dateien zur Sicherung
-auf eine Diskette geschrieben werden sollen. In diesem Fall genügt
-die Angabe des Namens; dem Rechner ist es egal, welchen Inhalt die
-Datei hat.
- Anders ist es aber, wenn Sie den Inhalt betrachten wollen.
-Dazu brauchen Sie dann ein Programm, das die innere Struktur der
-Datei kennt. Textdateien können Sie zum Beispiel mit dem Editor
-ansehen. EUDAS-Dateien müssen Sie jedoch mit EUDAS ansehen, da
-der Editor die EUDAS-Struktur nicht kennt. Es ist in vielen Fällen
-sinnvoll, durch einen Zusatz im Dateinamen zu kennzeichnen, ob es
-sich um eine Textdatei oder eine EUDAS-Datei handelt.
-
-
-#free (3.7)#
-
-#center#Abb. 4-1 Struktur einer EUDAS-Datei
-
-
-#on("b")#Terminologie#off("b")# EUDAS verwendet bestimmte Ausdrücke, um die
-Strukturelemente einer EUDAS-Datei zu kennzeichnen. Die Struktur
-einer EUDAS-Datei ist schematisch in Abb. 4-1 dargestellt. Die
-Ausdrücke wurden nun nicht direkt aus dem Karteikartenmodell
-übernommen, da es auch noch andere Modelle gibt und keine fal­
-schen Assoziationen auftreten sollen.
- EUDAS verwendet die Bezeichnung #on("i")#Satz#off("i")# für eine Karteikarte.
-Eine EUDAS-Datei besteht also aus einer Anzahl von gleichartigen
-Sätzen. Zur Veranschaulichung kann man sich diese nebeneinander­
-gelegt vorstellen.
- Jeder Satz ist unterteilt in sogenannte #on("i")#Felder#off("i")#. Ein Feld ent­
-spricht einem Attribut bzw. einem Eintrag auf der Karteikarte. Ein
-Feld ist wiederum unterteilt in einen #on("i")#Feldnamen#off("i")# und einen #on("i")#Feldin­
-halt#off("i")#.
- Der Feldname identifiziert ein bestimmtes Feld innerhalb eines
-Satzes. Die Feldnamen sind natürlich für alle Sätze gleich. Die
-Feldnamen einer EUDAS-Datei sind beliebig und können von Ihnen
-selbst festgelegt werden.
- Der Feldinhalt enthält die eigentliche Information des entspre­
-chenden Attributs. Der Feldinhalt darf ebenfalls aus beliebig vielen
-Zeichen bestehen. Die Feldinhalte sind natürlich für jeden Satz
-verschieden und stellen die eigentliche gespeicherte Information
-dar.
-
-#on("b")#Grenzen#off("b")# Aus technischen Gründen gibt es natürlich auch
-einige
-Beschränkungen, die hier nicht verschwiegen werden sollen. Eine
-Datei kann maximal etwa 5000 Sätze enthalten, ein Satz darf aus
-maximal 255 Feldern bestehen. Insgesamt kann ein Satz etwa 32000
-Zeichen umfassen. Die einzelnen Sätze in der EUDAS-Datei werden
-durch ihre jeweilige Positionsnummer identifiziert, also quasi von 1
-bis 5000 durchnumeriert.
-
-
-4.2 EUDAS-Menüs
-
-In den folgenden Abschnitten sollen Sie lernen, wie die Bedienung
-von EUDAS funktioniert. Dazu sollen Sie eine EUDAS-Beispieldatei
-von der EUDAS-Diskette in Ihr System holen. Diese Datei brauchen
-Sie dann später, um die Funktionen von EUDAS zu kennenzulernen.
- Die Beispieldatei hat den gleichen Inhalt wie die in Kapitel 3
-von Ihnen erstellte Datei. Falls Ihnen also die EUDAS-Archiv­
-diskette nicht zur Verfügung steht, können Sie in diesem Kapitel
-auch jede andere Archivdiskette verwenden.
- Bitte beachten Sie im folgenden, daß Sie einfache Anführungs­
-striche nicht mit eingeben, doppelte Anführungsstriche aber wohl.
-
-#on("b")#EUDAS-Aufruf#off("b")# Zuerst müssen Sie EUDAS aufrufen. Dazu
-begeben
-Sie sich in die in Kapitel 3 eingerichtete Task ('continue ("arbeit")')
-und geben bei 'gib kommando:' das Kommando 'eudas':
-
-
- gib kommando:
- #on("i")#eudas#off("i")#<RET>
-
-
-Falls Ihr System über Menüs gesteuert wird, müssen Sie eine ent­
-sprechende Funktion wählen. Anschließend erscheint folgendes
-Menü:
-
-___________________________________________________________________________________________
-
- EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv
- --------------:
- EUDAS-Datei :
- O Öffnen :
- - Ketten :
- - Koppeln :
- --------------:
- Arbeitskopie :
- - Sichern :
- --------------:
- Aktuelle Datei:
- - Notizen :
- - Feldstrukt. :
- - Prüfbeding. :
- --------------:
- Mehrbenutzer :
- M Manager :
- --------------:
- :
- :
- :
- :
- :
- Akt.Datei: Manager: Datum: 22.07.87
-___________________________________________________________________________________________
-
-
-#on("b")#Menüs#off("b")# Ein #on("i")#Menü#off("i")# ist eine Auswahl für einige verschiedene Funk­
-tionen. Die Funktionen sind jeweils benannt und werden durch einen
-davorstehenden Buchstaben oder ein Minuszeichen gekennzeichnet.
-Eine der Funktionen ist immer durch inverse Darstellung markiert.
- Diese Markierung können Sie nun mit Hilfe der Pfeiltasten OBEN
-und UNTEN verschieben. Auf diese Weise können Sie sich die ge­
-wünschte Funktion auswählen. Die Funktionen werden jedoch durch
-das Markieren nicht ausgeführt. Sie können also beliebig mit den
-Pfeiltasten herumexperimentieren.
- Ausgeführt wird die markierte Funktion, wenn Sie die Leertaste
-drücken. Sofort erscheint ein Stern vor dem Funktionsnamen, um
-anzuzeigen, daß die Ausführung beginnt. Probieren Sie dies jetzt
-nicht aus, dazu ist später Gelegenheit.
- Funktionen mit einem Minuszeichen davor können Sie zwar
-anwählen (markieren), aber nicht ausführen. Solche Funktionen sind
-momentan gesperrt, weil ihre Ausführung keinen Sinn hat oder sogar
-Fehler erzeugen würde.
- Mit den Pfeiltasten LINKS und RECHTS können Sie im Menüzu­
-stand weitere EUDAS-Menüs abrufen. Welche Menüs zur Verfügung
-stehen, zeigt Ihnen die oberste Bildschirmzeile. Das aktuelle Menü
-ist jeweils invers dargestellt.
-
-#on("b")#Hilfe#off("b")# Wenn Sie nun wissen möchten, welche Bedeutung die
-mar­
-kierte Funktion hat (die Funktionsbezeichnungen sind aus Platz­
-gründen sehr kurz gehalten), können Sie einen #on("i")#Hilfstext#off("i")# zu dieser
-Funktion abrufen. Dies erfolgt durch die Betätigung der Tasten ESC
-und '?' hintereinander. Diese doppelten Tastenkombinationen mit der
-ESC-Taste am Anfang werden Ihnen noch sehr häufig begegnen -
-denken Sie immer daran, die Tasten hintereinander und nicht
-gleichzeitig zu tippen. Der zeitliche Abstand zwischen den Tasten­
-drücken kann beliebig lang sein; hingegen sollten Sie eine Taste
-nicht zu lange drücken, da sonst eventuell eine automatische Wie­
-derholfunktion Ihrer Tastatur startet.
- Probieren Sie nun die Tastenkombination ESC '?' aus. Als Reak­
-tion erscheint in der rechten Hälfte des Bildschirms ein Text. Dieser
-sollte Ihnen die gewünschten Informationen bieten.
- Gleichzeitig hat sich aber auch die oberste Bildschirmzeile
-verändert. Sie zeigt jetzt folgendes Bild:
-
-___________________________________________________________________________________________
-
- HILFE: Beenden: ESC q Seite weiter: ESC w Seite zurueck: ESC z
-___________________________________________________________________________________________
-
-
-#on("b")#Zustände#off("b")# Wenn Sie sich nicht im Menü befinden, fungiert
-die ober­
-ste Zeile als sogenannte #on("i")#Statuszeile#off("i")#. Diese Zeile zeigt immer an, in
-welchem #on("i")#Zustand#off("i")# das Programm sich befindet. Der Zustand des Pro­
-gramms hat nämlich Einfluß darauf, welche Tasten Sie drücken
-können und wie das Programm darauf reagiert. Die Statuszeile zeigt
-daher außer dem Zustand auch die wichtigsten Tastenfunktionen.
- Sie kennen jetzt also schon zwei Zustände von EUDAS: den
-Menüzustand und den Hilfe-Zustand.
-
-#on("b")#Hilfe-Zustand#off("b")# Vom Menüzustand kommen Sie über die
-Tastenkom­
-bination ESC '?' in den Hilfe-Zustand. Im Hilfe-Zustand haben die
-Pfeiltasten OBEN und UNTEN keine Wirkung mehr (probieren Sie dies
-aus).
- Ein Hilfstext besteht im allgemeinen aus mehreren Seiten. Die
-erste Seite enthält dabei die speziellen Informationen, danach
-folgen dann allgemeine Informationen. Mit den Tastenkombinationen
-ESC 'w' und ESC 'z' können Sie zwischen den Seiten umschalten
-(denken Sie daran, was oben über Tastenkombinationen gesagt
-wurde). Wenn Sie dies ausprobieren, werden Sie auf der zweiten
-Seite allgemeine Hinweise zur Menübedienung finden. Auf der letz­
-ten Seite wird ESC 'w' ignoriert, ebenso ESC 'z' auf der ersten Seite.
- Mit der Tastenkombination ESC 'q' (quit) kehren Sie aus dem
-Hilfezustand in den vorherigen Zustand zurück. Diese Tastenkombi­
-nation löst allgemein in EUDAS die Rückkehr in den alten Zustand
-aus. Wenn Sie ESC 'q' getippt haben, erscheint die alte Menüzeile
-und Sie können wieder Funktionen auswählen.
- Der Hilfszustand läßt sich von nahezu allen (noch zu bespre­
-chenden) Zuständen mit ESC '?' aufrufen. Es wird jeweils ein zum
-aktuellen Zustand passender Hilfstext ausgegeben.
- Die möglichen Zustandsübergange sind nochmal in Abb. 4-2
-zusammengefaßt.
-
-
-#free (2.5)#
-
-#center#Abb. 4-2 Menü- und Hilfezustand
-
-
-#on("b")#EUDAS verlassen#off("b")# Im Menüzustand können Sie EUDAS jederzeit
-durch Tippen von ESC 'q' verlassen. Sie landen dann wieder bei 'gib
-kommando:'.
-
-
-4.3 Archivmenü
-
-#on("b")#System/Archiv#off("b")# An dieser Stelle müssen Sie sich die Begriffe #on("i")#Archiv#off("i")#
-und #on("i")#System#off("i")# klarmachen. Als Archiv bezeichnet man die Möglichkeit,
-bei Bedarf Disketten in Ihren Rechner einlegen können, um Dateien
-(und Programme) von anderen Rechnern zu übernehmen. Um diese
-Dateien bearbeiten zu können, müssen Sie sie in das System (Ihre
-Festplatte oder Hintergrunddiskette) kopieren.
- Die wichtigste Aufgabe des Archivs ist es, Daten vor Beschädi­
-gung zu sichern. Durch Fehlbedienung oder Systemfehler kann es
-nämlich leicht geschehen, daß die Daten in Ihrem System verloren
-gehen oder zerstört werden. Wenn Sie die Daten jedoch auf einer
-Diskette gesichert und die Diskette sicher verwahrt haben, können
-Sie die Daten wiederherstellen.
- Es ist sehr wichtig, daß Sie Ihre Dateien auf Archivdisketten
-sichern, denn ein einziger Hardwarefehler kann die Arbeit von
-Jahren vernichten (Sagen Sie nicht: "Mir passiert so etwas nicht" -
-bis jetzt hat es noch jeden erwischt).
-
-___________________________________________________________________________________________
-
- EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv
- --------------:
- Dateien Archiv:
- U Übersicht :
- D Ãœb. Drucken :
- --------------:
- Datei :
- K Kopieren :
- vom Archiv :
- S Schreiben :
- auf Archiv :
- L Löschen :
- auf Archiv :
- --------------:
- Archivdiskette:
- I Init :
- --------------:
- Z Zielarchiv :
- P Paßwort :
- - Reservieren :
- --------------:
- :
- :
- Akt.Datei: Ziel: "ARCHIVE" Datum: 22.07.87
-___________________________________________________________________________________________
-
-
-#center#Abb. 4-3 Archivmenü
-
-
-#on("b")#Archivmenü#off("b")# Wenn Sie EUDAS aufrufen, befinden Sie sich
-immer im
-ersten Menü. Sie benötigen jedoch jetzt Funktionen aus dem sech­
-sten Menü 'Archiv'. Wählen Sie dieses Menü jetzt an. Es erscheint
-das in Abb. 4-3 dargestellte Bild. Die Funktionen in diesem Menü
-befassen sich mit beliebigen Dateien auf dem Archiv.
- Für den Versuch legen Sie bitte die EUDAS-Archivdiskette ein.
-Dann wählen Sie die Funktion 'Übersicht' in dem Menü an, wenn sie
-nicht schon markiert ist. Sie können nun die ausgewählte Funktion
-durch Tippen der Leertaste ausführen.
- In der obersten Zeile erscheint nun der Hinweis 'Bitte war­
-ten..'. Er zeigt an, daß nun eine Funktion ausgeführt wird, bei der
-Sie zunächst nichts tun können. Sie sollten in diesem Zustand keine
-Tasten drücken, denn EUDAS kann nicht darauf reagieren.
-
-#on("b")#Archivübersicht#off("b")# Nach einer mehr oder minder langen
-Aktivitäts­
-phase Ihres Diskettenlaufwerks erscheint dann die Archivübersicht.
-Das Erscheinungsbild mit dem markierten Editorbalken in der ober­
-sten Zeile kommt Ihnen vielleicht bekannt vor. Sie haben nämlich
-nichts anderes als das EUMEL-Kommando 'list (archive)' ausgeführt.
-Neu ist lediglich die Statuszeile:
-
-___________________________________________________________________________________________
-
- ZEIGEN: Blättern: HOP OBEN, HOP UNTEN Beenden: ESC q Hilfe: ESC ?
-___________________________________________________________________________________________
-
-
-Wenn Sie sich die Ãœbersicht angeschaut haben, verlassen Sie den
-Editor wieder mit ESC 'q'.
- Beachten Sie, daß Sie unter EUDAS das Archiv nicht extra an­
-melden müssen; dies geschieht automatisch, wenn Sie eine Funktion
-aufrufen. Bei Leseoperationen müssen Sie nicht einmal den Archiv­
-namen wissen. Das Archiv wird automatisch wieder abgemeldet,
-wenn Sie das Archivmenü verlassen.
-
-#on("b")#Archiv lesen#off("b")# Unter den in der Ãœbersicht aufgelisteten
-Dateien
-sollten Sie auch die Datei finden, die Sie brauchen. Sie heißt
-'Adressen'. An dieser Stelle ein kleiner Hinweis: An vielen Stellen
-werden Sie sehen, daß Dateinamen in Anführungsstriche einge­
-schlossen sind. Die Anführungsstriche gehören jedoch #on("i")#nicht#off("i")# zum
-Namen. Sie dienen nur zur Abgrenzung, da in Dateinamen beliebige
-Zeichen erlaubt sind. Wenn Sie aufgefordert werden, einen Datei­
-namen einzugeben, müssen Sie dies immer ohne Anführungsstriche
-tun.
- Hoffentlich haben Sie in der ganzen Diskussion nicht das Ziel
-aus den Augen verloren: Sie sollten eine Datei ins System holen, um
-nachher mit ihr zu experimentieren. Zu diesem Zweck gibt es im
-Archivmenü die Funktion
-#free (0.2)#
-
- K Kopieren
- (vom Archiv)
-
-#free (0.2)#
-Wählen Sie diese Funktion jetzt mit den Pfeiltasten aus und drücken
-Sie zum Ausführen die Leertaste.
-
-#on("b")#Eingabezustand#off("b")# Nach kurzem 'Bitte warten..'-Zustand werden
-Sie
-im rechten Bildschirmteil nach dem Namen der Datei gefragt. Gleich­
-zeitig erscheint eine neue Statuszeile. Es ergibt sich folgendes Bild:
-
-___________________________________________________________________________________________
-
- EINGABE: Bestätigen: RETURN Zeigen: ESC z Abbrechen: ESC h Hilfe: ESC ?
- --------------:Dateiname:
- Dateien Archiv:
- U Übersicht :
- D Ãœb. drucken :
- --------------:
- Datei :
- * Kopieren :
- vom Archiv :
- ...
-
-___________________________________________________________________________________________
-
-
-Sie können in diesem Zustand den Namen der gewünschten Datei
-eingeben. Außer den in der Statuszeile genannten Funktionen kön­
-nen Sie die aus dem Editor bekannten Tasten benutzen, um den
-Text in der Zeile gegebenenfalls zu korrigieren (Pfeiltasten LINKS
-und RECHTS, RUBOUT, RUBIN). Die Schreibmarke (Cursor) zeigt Ihnen
-an, wo das nächste Zeichen plaziert wird.
-
-#on("b")#Abbruch#off("b")# Eine Tastenkombination verdient noch besondere
-Beach­
-tung: Mit ESC 'h' können Sie in vielen Situationen eine Funktion
-noch abbrechen - zum Beispiel wenn Sie irrtümlich die falsche
-Funktion gewählt haben.
- Im Gegensatz zu ESC 'q' erfolgt hier die sofortige Rückkehr aus
-der Funktion ins Menü, möglichst ohne daß die Funktion Auswir­
-kungen hinterläßt. Bei einem Abbruch bleibt also in der Regel das
-System unverändert.
-
-#on("b")#Fehlerzustand#off("b")# Um auch die Fehlerbehandlung von EUDAS
-auszu­
-probieren, sollten Sie hier einen falschen Namen eingeben, zum
-Beispiel:
-#free (0.2)#
-
- Dateiname: #on("i")#Adresen#off("i")#<RET>
-
-#free (0.2)#
-EUDAS sucht jetzt auf der Diskette nach einer Datei dieses Namens,
-findet sie aber nicht. Als Reaktion erscheint dann die Meldung:
-
-___________________________________________________________________________________________
-
- !!! FEHLER !!! Quittieren: ESC q Hilfe zur Meldung: ESC ?
- --------------:Dateiname: Adresen
- Dateien Archiv:>>> "Adresen" gibt es nicht
- U Ãœbersicht :
- D Ãœb. drucken :
- --------------:
- ...
-
-___________________________________________________________________________________________
-
-
-Im Normalfall sollten Sie die Fehlermeldung mit ESC 'q' quittieren,
-damit Sie den Befehl erneut versuchen können. Auch hier haben Sie
-die Möglichkeit, eine besondere Information zu dem Fehler abzurufen
-(es liegen jedoch nicht für alle möglichen Fehler spezielle Texte
-vor).
- Nach dem Quittieren des Fehlers befinden Sie sich wieder im
-Menüzustand. Wiederholen Sie jetzt die Funktion, indem Sie die
-Leertaste tippen. Sie werden dann erneut nach dem Namen gefragt.
-
-#on("b")#Auswahlzustand#off("b")# Um endlich ans Ziel zu kommen, benutzen Sie
-diesmal eine sehr komfortable Abkürzung, die EUDAS Ihnen bietet.
-Durch Drücken von ESC 'z' können Sie sich nämlich alle möglichen
-Namen anzeigen lassen und den gewünschten einfach ankreuzen.
- Anschließend sieht der Bildschirm wie in Abb. 4-4 aus. In die­
-sem Zustand können Sie mit den Pfeiltasten den Cursor zur ge­
-wünschten Datei bewegen und diese ankreuzen. Da Sie auch meh­
-rere Dateien in beliebiger Folge ankreuzen können, erscheint eine
-'1' vor der Datei zur Anzeige der Reihenfolge. Sie wollen aber nur
-diese eine Datei 'Adressen' holen und beenden die Auswahl daher
-mit ESC 'q'. Wenn alles glattgeht, wird jetzt die Datei vom Archiv
-ins System kopiert.
-
-#on("b")#Archiv schreiben#off("b")# Auf nahezu gleiche Weise können Sie mit
-der Funktion
-
-
- S Schreiben
- auf Archiv
-
-
-eine Datei wieder auf die Diskette schreiben. Als erstes müssen Sie
-dann den Namen der Archivdiskette eingeben, damit Sie nicht aus
-Versehen auf eine falsche Archivdiskette schreiben.
- Auch hier können Sie die gewünschten Dateien ankreuzen (na­
-türlich bietet EUDAS dann die Dateien des Systems an). Sie brau­
-chen keine Angst zu haben, aus Versehen eine Datei mit gleichem
-Namen zu überschreiben - EUDAS fragt in solchen Fällen immer
-nochmal an.
-
-___________________________________________________________________________________________
-
- AUSWAHL: Ankreuzen: 'x' Durchstreichen: 'o' Beenden: ESC q Hilfe: ESC ?
- --------------:--------------------------------------------------------------
- Dateien Archiv: Auswahl der Dateien auf dem Archiv.
- U Übersicht : Gewuenschte Datei(en) bitte ankreuzen:
- D Ãœb. Drucken :--------------------------------------------------------------
- --------------: o "eudas.1"
- Datei : o "eudas.2"
- * Kopieren : o "eudas.3"
- vom Archiv : o "eudas.4"
- S Schreiben : o "eudas.init"
- auf Archiv : o "eudas.generator"
- L Löschen : o "Adressen"
- auf Archiv :--------------------------------------------------------------
- --------------:
- Archivdiskette:
- I Init :
- --------------:
- Z Zielarchiv :
- P Paßwort :
- - Reservieren :
- --------------:
- :
- :
- Akt.Datei: Ziel: "ARCHIVE" Datum: 22.07.87
-___________________________________________________________________________________________
-
-
-#center#Abb. 4-4 Dateiauswahl
-
-
-
-4.4 Dateiverwaltung
-
-So: nach dieser anstrengenden Arbeit sollen Sie sich überzeugen,
-daß die Datei 'Adressen' nun wirklich im System zur Verfügung
-steht. Dazu gehen Sie mit LINKS ein Menü zurück. Dieses Menü
-beschäftigt sich mit Dateien im System und ist in Abb. 4-5 gezeigt.
- Auch hier finden Sie eine Funktion "Ãœbersicht". Rufen Sie diese
-auf. Ganz analog zum Archiv erscheint eine Ãœbersicht aller Dateien
-im Editor. Verlassen Sie die Ãœbersicht wieder mit ESC 'q'.
-
-___________________________________________________________________________________________
-
- EUDAS: Öffnen Einzelsatz Gesamtdatei Drucken Dateien Archiv
- --------------:
- Dateien System:
- U Ãœbersicht :
- --------------:
- Datei :
- L Löschen :
- N Umbenennen :
- K Kopieren :
- P Platzbedarf :
- A Aufräumen :
- --------------:
- :
- :
- :
- :
- :
- :
- :
- :
- :
- :
- :
- Akt.Datei: Task: "arbeit" Datum: 22.07.87
-___________________________________________________________________________________________
-
-
-#center#Abb. 4-5 Menü 'Dateien'
-
-
-#on("b")#Datei löschen#off("b")# Eine weitere Funktion aus diesem Menü werden
-Sie ebenfalls noch öfter brauchen, nämlich
-#free (0.2)#
-
- L Löschen
-
-#free (0.2)#
-Mit dieser Funktion können Sie eine Datei wieder aus dem System
-entfernen - zum Beispiel wenn Sie sich die Adressen angesehen
-haben und danach den Speicherplatz nicht weiter verschwenden
-wollen. Als letztes Beispiel sollen Sie auch diese Funktion aufrufen
-(keine Angst, wir löschen die Datei nicht wirklich, es gibt vorher
-noch eine Notbremse).
-
-#on("b")#Fragezustand#off("b")# Als erstes werden Sie wieder nach dem
-Dateinamen
-gefragt (dies ist Ihnen schon bekannt). Hier haben Sie jetzt die
-Wahl, ob Sie den Namen eingeben oder mit ESC 'z' ankreuzen. Da das
-Löschen unwiederbringlich ist, werden Sie anschließend zur Sicher­
-heit gefragt, ob Sie die Datei wirklich löschen wollen:
-
-___________________________________________________________________________________________
-
- FRAGE: Bejahen: j,J Verneinen: n,N Abbrechen: ESC h Hilfe: ESC ?
- --------------:Dateiname: Adressen
- Dateien System:"Adressen" im System loeschen (j/n) ?
- U Ãœbersicht :
- --------------:
- ...
-
-___________________________________________________________________________________________
-
-
-Diese Frage können Sie bejahen oder verneinen (oder die Funktion
-ohne Auswirkungen abbrechen). In diesem Fall sollten Sie die Frage
-verneinen - es sei denn, Ihnen hat das Spielen mit EUDAS so gut
-gefallen, daß Sie die ganze Prozedur wiederholen und die Datei
-nochmal vom Archiv holen wollen.
-
-
-4.5 Bedienungsregeln
-
-Mit dieser letzten Demonstration haben Sie jetzt schon fast alle
-Arten des Umgangs mit EUDAS kennengelernt. Sicher ist dies beim
-ersten Mal sehr verwirrend. Mit vier Regeln können Sie jedoch
-EUDAS immer bedienen:
-
-#limit (12.0)#
- 1. Achten Sie darauf, welche möglichen Tastendrücke
- in der Statuszeile stehen. Richten Sie sich danach!
-#free (0.2)#
- 2. Sind Sie sich unsicher, rufen Sie Hilfsfunktion mit
- ESC '?' auf. Damit erhalten Sie weitere Informatio­
- nen.
-#free (0.2)#
- 3. Funktioniert diese Tastenkombination nicht (geben
- Sie dem Rechner eine kurze Zeit zum Reagieren),
- versuchen Sie die Tastenkombinationen ESC 'h' (Ab­
- bruch) oder ESC 'q' (Verlassen). Falls sich daraufhin
- etwas verändert, fangen Sie wieder mit 1. an.
-#free (0.2)#
- 4. Erfolgt darauf keine Reaktion, drücken Sie die SV-
- Taste und versuchen Sie das Programm mit 'halt' zu
- stoppen. Führt auch das nicht zum Erfolg, hat sich
- Ihr Rechner "aufgehängt". Sie müssen den Rechner
- dann neu starten. Wenn Sie keine Erfahrung mit
- einer solchen Situation haben, wenden Sie sich an
- Ihren Händler oder Systembetreuer.
-#limit (13.5)#
-
-Im Zusammenhang mit dem letzten Punkt sei nochmal auf die Wich­
-tigkeit einer regelmäßigen Datensicherung auf Archivdisketten
-hingewiesen. Im Normalfall sollten Sie aber mit den Punkten 1 bis 3
-zurechtkommen.
-
-#on("b")#Zustände#off("b")# Im letzten Abschnitt haben Sie eine ganze Reihe
-von
-Zuständen kennengelernt, die EUDAS einnehmen kann. In jedem
-Zustand haben Sie verschiedene Möglichkeiten zur Reaktion. Glück­
-licherweise erscheinen diese Möglichkeiten zum großen Teil in der
-Statuszeile.
- Damit Sie die verwirrenden Erfahrungen des letzten Abschnitts
-etwas ordnen können, wollen wir an dieser Stelle die verschiedenen
-Zustände noch einmal zusammenfassen. Der Beschreibung vorange­
-stellt ist die jeweilige Kennzeichnung am Beginn der Statuszeile.
-
-EUDAS: #on("b")# Sie können mit ESC 'w' und ESC 'z' im Hilfstext blättern. Mit
- ESC 'q' kommen Sie in den alten Zustand.
-
-AUSWAHL: Hier können Sie die gewünschten Namen mit 'x' ankreuzen
- und mit 'o' wieder entfernen. Normales Beenden mit ESC 'q'.
- Hilfestellung durch ESC '?'. Abbruch der gesamten Funktion mit
- ESC 'h'.
-
-EINGABE: Hier können Sie eine einzelne Zeile eingeben oder ändern
- (wie im Editor). Einfügen und Löschen mit RUBIN und RUBOUT.
- Abbruch und Hilfestellung möglich.
-
-FRAGE: Beantworten Sie die gestellte Frage mit 'j' oder 'n'. Abbruch
- (ESC 'h') und Hilfestellung (ESC '?') möglich.
-
-ZEIGEN: Mit HOP OBEN und HOP UNTEN können Sie in der Übersicht
- blättern. Ende der Übersicht mit ESC 'q'. Hilfestellung möglich.
-
-!!! FEHLER !!! Quittieren Sie die Meldung mit ESC 'q'. Hilfestellung
- möglich.
-
-Bitte warten.. In diesem Zustand keine Taste drücken, der Rechner
- ist beschäftigt.
-
-Drei weitere Zustände, die Sie noch nicht kennengelernt haben, sind
-hier schon mal der Vollständigkeit halber aufgeführt:
-
-SATZ ÄNDERN:
-SATZ EINFÃœGEN:
-SUCHMUSTER EINGEBEN: Satzeditor zum Eingeben von Feldinhalten.
- Normales Verlassen mit ESC 'q'. Abbruch und Hilfestellung mög­
- lich. Beschreibung s. 6.2.
-
-EDITIEREN: EUMEL-Editor mit Änderungsmöglichkeit für beliebige
- Texte. Normales Verlassen mit ESC 'q'. Hilfestellung möglich.
- Beschreibung der Möglichkeiten siehe EUMEL-Benutzerhand­
- buch.
-
-Gib Kommando: Hier können Sie ein beliebiges ELAN-Kommando ein­
- geben und mit RETURN bestätigen. Abbruch und Hilfestellung
- möglich. Kann im Menü durch ESC ESC aufgerufen werden.
-
-Wie Sie sehen, werden auch hier wieder die gleichen Tastenkombi­
-nationen verwendet, die Sie schon kennen.
- In dieser Übersicht sind jeweils nur die wichtigsten Tastenkom­
-binationen aufgeführt. Informieren Sie sich gegebenenfalls mit ESC
-'?'. Einige weitere Tastenfunktionen werden Sie im folgenden noch
-kennenlernen. Eine vollständige Übersicht finden Sie im Referenz­
-handbuch.
-
diff --git a/doc/graphic/GRAPHIK.book b/doc/graphic/GRAPHIK.book
deleted file mode 100644
index 435d9e4..0000000
--- a/doc/graphic/GRAPHIK.book
+++ /dev/null
@@ -1,897 +0,0 @@
-#type ("times8")##limit (11.0)##start (2.2, 1.5)##pagelength (17.4)##block#
-
-#head#
-#type ("triumb14")#
-#center#EUMEL-Grafik-System
-
-#type ("times8")#
-#end#
-#type ("triumb14")# Teil 10: Graphik#type ("times8")#
-
-
-#type ("trium12")#
-#on("b")#1. Ãœbersicht#off("b")#
-#type ("times8")#
-
-#limit (7.0)##type("times6")#
- #on("i")#Dieser Teil des Benutzer-Handbuchs beschreibt die Graphik-
- Fähigkeiten des EUMEL-Systems. Die Graphik-Pakete gehö­
- ren nicht zum Eumel-Standard, sondern sind Anwenderpake­
- te, die im Quellcode ausgeliefert und von jeder Installation in das
- System aufgenommen werden können. #off("i")#
-#limit (11.0)#
-#foot#
- Eventuell müssen Programme erstellt werden, die die Anpassungen für spezielle graphische Geräte einer Installation
- vornehmen, soweit diese nicht von den EUMEL-Anbietern bezogen werden können.
-#end#
-
-#type("times8")#
- Das #on("b")#Graphik-System#off("b")# ermöglicht es, durch ELAN-Programme geräteunabhängige Infor­
- mationen für Zeichnungen (#on("i")#Graphiken#off("i")#) zu erstellen. Die Graphik erzeugenden Programme
- brauchen dabei keine geräteabhängigen Größen oder Unterprogramme zu enthalten. Sie
- befassen sich somit ausschließlich mit der Erzeugung der problemorientierten Information
- für die Konstruktion einer Zeichnung. Nach der geräteunabhängigen Erzeugung einer
- Graphik kann diese auf unterschiedlichen Geräten ausgegeben werden (z.B. erst auf einem
- Terminal zur Kontrolle und dann auf einem Plotter).
-
- Die EUMEL-Graphik umfaßt zwei- und dreidimensionale Graphik. Im dreidimensiona­
- len Fall sind perspektivische, orthografische und schiefwinklige Projektionen mit beliebi­
- gen Betrachtungswinkeln möglich.
-
- Bei der EUMEL-Graphik wird streng zwischen Erzeugung und Manipulation von Gra­
- phiken auf der einen und der Darstellung der erzeugten Bilder auf der anderen Seite
- unterschieden. Für die Erzeugung und Manipulation der Graphiken wird von den Paketen
- #on("i")#picture#off("i")# und #on("i")#picfile#off("i")# der Datentype #on("b")#PICTURE#off("b")# bzw. #on("b")#PICFILE#off("b")# zur Verfügung gestellt. Dabei
- müssen Ausschnitt, Maßstab, Betrachtungswinkel und Projektionsart erst bei der Darstel­
- lung festgelegt werden. Diese Konstruktion des Graphik-Systems hat folgende Vorteile:
-
- a) Programme, die Graphik-Information erzeugen, sind geräteunabhängig. Das bedeu­
- tet, das der Programmierer sich ausschließlich mit einem logischen Problem befassen
- muß und nicht mit gerätespezifischen Besonderheiten.
-
- b) Graphiken können auf mehreren unterschiedlich gearteten Geräten mehrmals darge­
- stellt werden, ohne daß das erzeugende Programm geändert oder neu gestartet werden
- muß. Z.B. kann ein Programmierer eine Graphik erst auf dem Terminal überprüfen,
- bevor er die Graphik auf einem Plotter zeichnen läßt.
-
- c) Graphiken können leicht geändert (z. B. vergrößert oder in eine Richtung gestreckt
- o.ä.) werden, ohne daß sie erneut erzeugt werden müssen. Zudem können Graphiken
- aneinander oder übereinander gelegt werden.
-
- d) Graphiken mit unterschiedlichen Farben, Strichen usw. können leicht erzeugt werden.
-
- e) Der Anschluß von neuen Graphik.Geräten durch Benutzer ist leicht möglich, ohe daß
- die Graphik-Programme geändert werden müssen.
-
- f) Plotter können wie Drucker an einen Spooler gehängt werden.
-
- g) Bilder können als PICFILEs gespeichert und versandt werden.
-
- h) Es können auch auf Systemen ohne graphische Ausgabegeräte Graphiken erzeugt
- werden.
-
- i) Es können mit einfachen Mitteln universelle Unterprogrammpakete erstellt werden,
- um die Standardzeichnungen (Darstellen einer Funktion, Balken oder Liniendiagram­
- me, Achsen etc.) zu erstellen.
-
-
-#type ("trium12")#
-#on("b")#2. Erzeugung von Bildern#off("b")#
-#type ("times8")#
-
- Bilder entstehen in Objektion vom Datentyp #on("b")#PICTURE#off("b")#. Diese müssen mit der Prozedur
- #on("i")#nilpicture#off("i")# initialisiert werden. Sie enthalten dann ein leeres Bild, dessen Dimension noch
- nicht festgelegt ist. Die Dimension eines #on("i")#PICTURE#off("i")#s wird mit dem ersten Schreibzugriff
- (#on("i")#move, draw#off("i")# o.ä.) festgelegt. Ein #on("i")#PICTURE#off("i")# kann immer nur entweder zwei- oder
- dreidimensional sein.
- Außerdem kann einem #on("i")#PICTURE#off("i")# mit der Prozedur #on("i")#pen#off("i")# genau ein virtueller Stift zugeord­
- net oder der aktuelle Stift erfragt werden (Standardeinstellung: 1).
-
- Für Erzeugung eines Bildes wird ein virtueller Zeichenstift benutzt, dem bei der Darstel­
- lung jeweils genau ein realer Stift zugeordnet wird. Dieser Stift kann mit der Prozedur
- #on("b")#move#off("b")# oder #on("b")#move r #off("b")#auf eine bestimmte Stelle positioniert werden ohne zu zeichnen. Mit
- #on("b")#draw#off("b")# oder #on("b")#draw r#off("b")# wird eine Linie von der letzten Position zur angegebene Position
- gezeichnet. Die aktuelle Stiftposition kann dabei mit #on("b")#where#off("b")# abgefragt werden.
- Außerdem existiert noch die Prozedur #on("b")#draw#off("b")# die einen Text zur Beschriftung der Zeich­
- nung darstellt, sowie #on("b")#bar#off("b")# zum Zeichnen eines Balkens für Balkendiagramme, #on("b")#circle#off("b")# zum
- Zeichnen eines Kreisbogens für Kreisdiagramme und #on("b")#mark#off("b")# zum Markiern von Positionen.
- Dabei wird die aktuelle Stiftposition aber nicht verändert.
-
-#type ("trium12")#
-#on("b")#3. Manipulation von PICTUREs#off("b")#
-#type ("times8")#
-
- Erstellte PICTUREs können auch als Ganzes manipuliert werde. Dazu dienen die Prozedu­
- ren #on("b")#translate, stretch#off("b")# und #on("b")#rotate#off("b")#. Es ist auch möglich mehrere PICTURE mit dem Opera­
- tor #on("b")#CAT#off("b")# aneinanderzufügen, wenn beide PICTURE die gleiche Dimension haben. In
- solcherart manipulierten Bildern kann ohne Einschränkung weitergezeichnet werden,
- solange die maximale Größe nicht überschritten wird.
-
-#type ("trium12")#
-#on("b")#4. Darstellung und Speicherung #off("b")#
-#type ("times8")#
-
- Für die Darstellung und Speicherung der erzeugten Bilder existiert der Typ #on("b")#PICFILE#off("b")#.
- Dieser besteht aus eienm Datenraum mit max. 1024 PICTUREs, die mit den Prozeduren #on("b")#
- delete picture, insert picture, read picture, write picture, get picture#off("b")# und #on("b")#put picture#off("b")# einge­
- geben bzw. ausgegeben werden können.
- Für die Positionierung innerhalb eines PICFILES stehen die Prozeduren #on("b")#to pic, up, down,
- eof, picture no, pictures#off("b")# zur Verfügung.
- Für die Assoziation mit einem benannten Datenraum existiert ähnlich wie beim Datentyp
- FILE die Prozedur #on("b")#picture file#off("b")#; unbenannte Datenräume können mit dem Operator #on("b")#:=#off("b")#
- assoziert werden.
- Die Darstellung des PICFILES auf einem Zeichengerät erfolgt mit der Prozdur #on("b")#plot#off("b")#.
- Da die Graphiken aber in #on("i")#Weltkoordinaten#off("i")# erzeugt werden und die spätere Darstellung
- vollkommen unbeachtet bleibt, müssen gewisse Darstellungsparameter für die Zeichnung
- gesetzt werden. Dies Parameter werden im PICFILE abgelegt und gelten jeweils für alle
- darin enthaltenen PICTURE. Dadurch ist es möglich, einen PICFILE mit spezifierter
- Darstellungsart über einen SPOOLER an einen Plotter zu senden oder die bei der letzten
- Betrachtung gewählte Darstellung beizubehalten oder zu ändern.
- Für die Darstellung können den virtuellen Stiften mit der Prozedur #on("b")#select pen#off("b")# reale Stifte
- zugeordnet werden. Voreingestellt ist für alle virtuellen Stifte die Standardfarbe, Standard­
- stärke und durchgängige Linie. Mit #on("b")#background#off("b")# kann eine bestimmte Hintergrundfarbe
- gewählt werden.
- Indem man einem PICTURE den Stift 0 zuordnet, kann man dieses auch Ausblenden
- wenn es bei dieser Darstellung stört.
- Die Größe der realen Zeichenfläche kann mit #on("b")#viewport#off("b")# eingestellt werden, wobei die
- gesamte Zeichenfäche voreingestellt ist. Dadurch können auch mehrere PICFILE auf ein
- Blatt oder einen Bildschirm gezeichnet werden, wenn man durch Angabe von #on("i")#background
-  (0)#off("i")# das Löschen der Zeichenfläche unterdrückt.
-
-
-#type ("trium12")#
-#on("b")#5. Darstellung zweidimensionaler Graphik#off("b")#
-#type ("times8")#
-
- Bei der Darstellung zweidimensionaler Bilder muß der zu zeichnende Ausschnitt (das
- #on("i")#Fenster#off("i")#) angegeben werden. Mit der Prozedur #on("b")#window#off("b")# wird durch Angabe der minimalen
- und maximalen X- bzw. Y-Koordinaten ein Fenster definiert. Linien, die über dieses
- Fenster hinausgehen, werden abgeschnitten. Dadurch kann man einen beliebigen Detailaus­
- schnitt eines Bildes ausgeben, ohne das Bild neu generieren zu müssen.
- Da das so definierte Fenster auf die mit #on("i")#viewport#off("i")# definierte Zeichenfläche abgebildet wird,
- ist der Abbildungsmaßstab durch das Zusammenspiel von #on("i")#viewport#off("i")# und #on("i")#window#off("i")# bestimmt.
- Wenn eine Winkeltreue Darstellung erreicht werdenn soll, muß das Verhältnis der durch
- #on("i")#viewport#off("i")# eingestellten Breite und Höhe und das Verhältnis des durch #on("i")#window#off("i")# eingestellten
- Ausschnitts gleich sein.
-
-#type ("trium12")#
-#on("b")#6. Darstellung dreidimensionaler Graphik#off("b")#
-#type ("times8")#
-
- Bei dreidimensionalen Zeichnungen wird das Fenster ebenfalls mit #on("b")#window#off("b")# definiert,
- wobei dann allerdings auch der Wertebereich der dritten Dimension (Z-Koordinaten) zu
- berücksichtigen ist. Auch hierbei werden Linien, die über die spezifierte Darstellungs­
- fläche hinausgehen abgeschnitten. Das Abschneiden erfolgt allerdings erst nach der Projek­
- tion auf die Darstellungsfläche, so daß auch Vektoren zu sehen sind, die über das mit
- #on("i")#window#off("i")# angegebene Quader hinausgehen, wenn ihre Projektion innerhalb der Zeichen­
- fläche liegt.
- Da die dreidimensionale Graphik auf eine zweidimensionale Fläche projeziert wird,
- können aber noch weitere Darstellungsparameter angegeben werden. Der Betrachtungswin­
- kel wird mit Hilfe der Prozedur #on("b")#view#off("b")# angegeben. Ebenfalls kann mit #on("b")#view#off("b")# der Winkel der
- Y-Achse zur Horizontalen angegeben werden.
- Zur Spezifikation der gewünschten Projektionsart existieren #on("b")#orthographic#off("b")# (orthographische
- Projektion), #on("b")#perspective#off("b")# (perspektivische Projektion, der Fluchtpunkt ist frei wählbar) und
- #on("b")#oblique#off("b")# (schiefwinklige Projektion).
-
-#page#
-#type ("trium12")#
-#on("b")#7. Beispiele#off("b")#
-#type ("times8")#
-
- #on("u")#Sinuskurve#off("u")#
-
-#type("micro")#
-initialisiere picfile;
-zeichne überschrift;
-zeichne achsen;
-zeichne sinuskurve;
-wähle darstellung;
-plot (p) .
-
-initialisiere picfile:
- PICFILE VAR p :: picture file ("SINUS") .
-
-zeichne überschrift:
- PICTURE VAR überschrift :: nilpicture;
- move (überschrift, -pi/2.0, 1.0);
- draw (überschrift, "sinus (x) [-pi, +pi]", 0.0, 1.0, 0.6);
- put picture (p, überschrift) .
-
- zeichne achsen:
- PICTURE VAR achsen :: nilpicture;
- zeichne x achse;
- zeichne y achse;
- put picture (p, achsen) .
-
- zeichne x achse:
- move (achsen, -pi, 0.0);
- draw (achsen, pi, 0.0) .
-
- zeichne y achse:
- move (achsen, 0.0, -1.0);
- draw (achsen, 0.0, +1.0) .
-
- zeichne sinuskurve:
- PICTURE VAR sinus :: nilpicture;
- REAL VAR x :: -pi;
-
- move (sinus, x, sin (x));
- REP x INCR 0.1;
- draw (sinus, x, sin (x))
- UNTIL x >= pi PER;
-
- put picture (p, sinus) .
-
- wähle darstellung:
- window (p, -pi, pi, -1.0, 1.3);
- viewport (p, 0.0, 0.0, 0.0, 0.0) .
-
-#page#
-#type ("times8")#
- #on("u")#Achsenkreuz#off("u")#
-
-#type("micro")#
-initialisiere picfile;
-zeichne die x achse;
-zeichne die y achse;
-zeichne die z achse;
-stelle das achsenkreuz dar .
-
-initialisiere picfile:
- PICFILE VAR p :: picture file ("KREUZ") .
-
- zeichne die x achse:
- PICTURE VAR x achse := nilpicture;
- move (x achse, -1.0, 0.0, 0.0);
- draw (x achse, "-X", 0.0, 0.0, 0.0);
- draw (x achse, 1.0, 0.0, 0.0);
- draw (x achse, "+X", 0.0, 0.0, 0.0);
- put picture (p, x achse) .
-
- zeichne die y achse:
- PICTURE VAR y achse := nilpicture;
- move (y achse, 0. 0, -1.0, 0.0);
- draw (y achse, "-Y", 0.0, 0.0, 0.0);
- draw (y achse, 0.0, 1.0, 0.0);
- draw (y achse, "+Y", 0.0, 0.0, 0.0);
- put picture (p, y achse) .
-
- zeichne die z achse:
- PICTURE VAR z achse := nilpicture;
- move (z achse, 0. 0, 0.0, -1.0);
- draw (z achse, "-Z", 0.0, 0.0, 0.0);
- draw (z achse, 0.0, 0.0, 1.0);
- draw (z achse, "+Z", 0.0, 0.0, 0.0);
- put picture (p, z achse) .
-
- stelle das achsenkreuz dar:
- viewport (p, 0. 0, 1.0, 0.0, 1.0);
- window (p, -1.1, 1.1, -1.1, 1.1);
- oblique (p, 0.25, 0.15);
- plot (p) .
-
-#foot#
- #type("times6")#
- Diese beiden Beispielprogramme befinden sich ebenfalls auf dem STD-Archive unter dem Namen #on("i")#Beispiel.Sinus#off("i")# und
- #on("i")#Beispiel.Kreuz#off("i")#.
-#end#
-
-#page#
-#type ("triumb14")# Beschreibung der Graphik-Prozeduren
-#type ("times8")#
-
-
-#type ("trium12")#
-#on("b")#1. PICTURE-Prozeduren#off("b")#
-#type ("times8")#
-
-#limit (7.0)##type("times6")#
- #on("i")#Zweidimensionale PICTURES brauchen weniger Speicherplatz
- als dreidimensionale. Daher werden in einigen Fehlermeldungen
- unterschiedliche Größen angegeben.
-
-#limit (11.0)##type("times8")#
-
-#type("times10")##on("b")#:=#off("b")##type("times8")#
- OP := (PICTURE VAR l, PICTURE CONST r)
- Zweck: Zuweisung
-
-#type("times10")##on("b")#CAT#off("b")##type("times8")#
- OP CAT (PICTURE VAR l, PICTURE CONST r)
- Zweck: Aneinanderfügen von zwei PICTURE.
- Fehlerfälle:
- * left dimension <> right dimension
- Es können nur PICTURE mit gleicher Dimension angefügt werden.
- * Picture overflow
- Die beiden PICTURE überschreiten die maximale Größe eines PICTURE.
-
-#type("times10")##on("b")#nilpicture#off("b")##type("times8")#
- PICTURE PROC nilpicture
- Zweck: Die Prozedur liefert ein leeres PICTURE zur Initialisierung.
-
- PICTURE PROC nilpicture (INT CONST pen)
- Zweck: Die Prozedur liefert ein leeres PICTURE mit dem Stift #on("i")#pen#off("i")# zur Initialisierung.
-
-#type("times10")##on("b")#draw#off("b")##type("times8")#
- PROC draw (PICTURE VAR p, TEXT CONST text, REAL CONST angle, height, ­
- width)
- Zweck: Der angegebene Text wird unter dem Winkel #on("i")#angle#off("i")# gegenüber der Waagerech­
- ten mit der Zeichenhöhe #on("i")#hight#off("i")# und der Breite #on("i")#width#off("i")# gezeichnet. #on("i")#angle#off("i")# wird in
- Winkelgrad angegeben. #on("i")#height#off("i")# und #on("i")#width#off("i")# werden in #on("i")#Prozenten#off("i")# der Breite bzw.
- Höhe der Zeichenfläche angegeben, bei 0 wird
- die Standardhöhe- und breite angenommen.
- Der Anfang ist dabei die aktuelle Stiftposition, die nicht verändert wird. Es könne
- auch die Steuerzeichen ""1"", ""2"", ""3"", ""10"", ""13"" benutzt werden,
- wobei sie immer in der Richtung #on("i")#angle#off("i")# wirken.
- Fehlerfälle:
- * Picture overflow
- Der Text paßt nicht mehr in das PICTURE.
-
-#type("times10")##on("b")#draw#off("b")##type("times8")#
- PROC draw (PICTURE VAR p, REAL CONST x, y, z)
- Zweck: Zeichnen einer Linie von der aktuellen Position zur Position (x, y, z).
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
- * Picture is two dimensional
-
- PROC draw (PICTURE VAR p, REAL CONST x, y)
- Zweck: Zeichnen einer Linie von der aktuellen Position zur Position (x, y).
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
- * Picture is three dimensional
-
-#type("times10")##on("b")#draw r#off("b")##type("times8")#
- PROC draw r (PICTURE VAR p, REAL CONST x, y, z)
- Zweck: Zeichnen einer Linie der Länge (x, y, z) relativ zur aktuellen Position.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
- * Picture is two dimensional
-
- PROC draw r (PICTURE VAR p, REAL CONST x, y)
- Zweck: Zeichnen einer Linie der Länge (x, y) relativ zur aktuellen Position.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
- * Picture is three dimensional
-
-#type("times10")##on("b")#move#off("b")##type("times8")#
- PROC move (PICTURE VAR p, REAL CONST x, y, z)
- Zweck: Die aktuelle Position wird auf (x, y, z) gesetzt.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
- * Picture is two dimensional
-
- PROC move (PICTURE VAR p, REAL CONST x, y)
- Zweck: Die aktuelle Position wird auf (x, y) gesetzt.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
- * Picture is three dimensional
-
-#type("times10")##on("b")#move r#off("b")##type("times8")#
- PROC move r (PICTURE VAR p, REAL CONST x, y, z)
- Zweck: Die aktuelle Position wird um (x, y, z) erhöht.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
- * Picture is two dimensional
-
- PROC move r (PICTURE VAR p, REAL CONST x, y)
- Zweck: Die aktuelle Position wird um (x, y) erhöht.
- Position.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
- * Picture is three dimensional
-
-
-#type("times10")##on("b")#bar#off("b")##type("times8")#
- PROC bar (PICTURE VAR p, REAL CONST width, hight, INT CONST pattern):
- Zweck: Die Prozedur zeichnet an der aktuellen Position einen Balken mit dem Muster
- #on("i")#pattern#off("i")#:
- 0 = Leerer Balken
- 1 = Gepunkteter Balken
- 2 = Gefüllter Balken
- 3 = Horizontale Linien
- 4 = Vertikale Linien
- 5 = Gekreuzte Linien
- 6 = Diagonale Linien von Links nach Rechts
- 7 = Diagonale Linien von Rechts nach Links
- 8 = Gekreuzte diagonale Linien
- > 8 = nicht normiertes Sondermuster
- Die aktuelle Stiftposition wird dabei nicht verändert.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
- * Picture is three dimensional
-
- PROC bar (PICTURE VAR p, REAL CONST from, to, hight, INT CONST pattern):
- Zweck: Die Prozedur zeichnet einen Balken von der Position #on("i")#from#off("i")# zur Position #on("i")#to#off("i")# und der
- Höhe #on("i")#height#off("i")# mit dem Muster #on("i")#pattern#off("i")#.
- s.o.
-
-#type("times10")##on("b")#circle#off("b")##type("times8")#
- PROC circle (PICTURE VAR p, REAL CONST radius, from, to, INT CONST pattern)
- Zweck: Die Prozedur zeichnet an der aktuellen Position ein Kreissegment vom Winkel
- #on("i")#from#off("i")# bis #on("i")#to#off("i")# (im Gradmaß) mit dem Muster #on("i")#pattern#off("i")# (s.o.). Der #on("i")#radius#off("i")# wird in
- Prozenten der Diagonalen der Zeichenfläche angegeben.
- Die aktuelle Stiftposition wird dabei nicht verändert. Dieses Kreissegment ist in
- jedem Fall 2-dimensional, so das es durch Drehungen nicht verändert wird.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
- * Picture is three dimensional
-
-#type("times10")##on("b")#mark#off("b")##type("times8")#
- PROC mark (PICTURE VAR p, REAL CONST size, INT CONST no)
- Zweck: Es wird ein Marker mit der Größe #on("i")#size#off("i")# in Prozenten der Diagonalen der Zeichen­
- fläche an der aktuellen Stiftposition ausgegeben, ohne diese zu verändern. Es
- sollten dabei mindestens 10 verschiedene Marker gewählt werden können.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
-
-#type("times10")##on("b")#dim#off("b")##type("times8")#
- INT PROC dim (PICTURE CONST pic)
- Zweck: Liefert die Dimension eines PICTURE.
-
-#type("times10")##on("b")#pen#off("b")##type("times8")#
- INT PROC pen (PICTURE CONST p)
- Zweck: Liefert den virtuellen Stift des PICTURE
-
- PICTURE PROC pen (PICTURE CONST p, INT CONST pen)
- Zweck: Setzen des (virtuellen) Stiftes eines PICTURE.
- Bei #on("i")#pen#off("i")# = 0 wird das Picture nicht gezeichnet.
- Fehlerfälle:
- * pen out of range
- Der gewünschte Stift ist kleiner als 0 oder größer als 16.
-
-#type("times10")##on("b")#extrema#off("b")##type("times8")#
- PROC extrema (PICTURE CONST p, REAL VAR x min, x max, y min, y max)
- Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICTURE.
- Fehlerfälle:
- * Picture is three dimensional
-
- PROC extrema (PICTURE CONST p, REAL VAR x min, x max, y min, y max,  
- z min, z max)
- Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICTURE.
- Fehlerfälle:
- * Picture is two dimensional
-
-#type("times10")##on("b")#where#off("b")##type("times8")#
- PROC where (PICTURE CONST p, REAL VAR x, y, z)
- Zweck: Die Prozedur liefert die aktuelle Stiftposition.
- Fehlerfälle:
- * Picture is two dimensional
-
- PROC where (PICTURE CONST p, REAL VAR x, y, z)
- Zweck: Die Prozedur liefert die aktuelle Stiftposition. Fehlerfälle:
- * Picture is three dimensional
-
-#type("times10")##on("b")#rotate#off("b")##type("times8")#
- PROC rotate (PICTURE VAR p, REAL CONST angle)
- Zweck: Das PICTURE wird um den Punkt (0, 0) um den Winkel #on("i")#angle#off("i")# (im Gradmaß) im
- mathematisch positiven Sinn gedreht.
-
- PROC rotate (PICTURE CONST p, REAL CONST phi, theta, lambda)
- Zweck: Das PICTURE wird um den Winkel #on("i")#lambda#off("i")# um die Drehachse #on("i")#(phi, theta)#off("i")# ge­
- dreht.
-
-#type("times10")##on("b")#stretch#off("b")##type("times8")#
- PROC stretch (PICTURE VAR pic, REAL CONST sx, sy)
- Zweck: Das PICTURE wird in X-Richtung um den Faktor #on("i")#sx#off("i")#, in Y-Richtung um den
- Faktor #on("i")#sy#off("i")# gestreckt (bzw. gestaucht). Dabei bewirkt der Faktor
- s > 1 eine Streckung
- 0 < s < 1 eine Stauchung
- s < 0 zusätzlich eine Achsenspiegelung.
- Fehlerfälle:
- * Picture is three dimensional
-
- PROC stretch (PICTURE VAR p, REAL CONST sx, sy, sz)
- Zweck: s. o.
- Fehlerfälle:
- * Picture is two dimensional
-
-#type("times10")##on("b")#translate#off("b")##type("times8")#
- PROC translate (PICTURE VAR p, REAL CONST dx, dy)
- Zweck: Das PICTURE wird um #on("i")#dx#off("i")# und #on("i")#dy#off("i")# verschoben. Fehlerfälle:
- * Picture is three dimensional
-
- PROC translate (PICTURE VAR p, REAL CONST dx, dy, dz)
- Zweck: Das PICTURE wird um #on("i")#dx, dy#off("i")# und #on("i")#dz#off("i")# verschoben. Fehlerfälle:
- * Picture is two dimensional
-
-
-#type ("trium12")#
-#on("b")#2. PICFILE-Prozeduren#off("b")#
-#type ("times8")#
-
-#type("times10")##on("b")#plot#off("b")##type("times8")#
- PROC plot (TEXT CONST name)
- Zweck: Der PICFILE mit dem Namen #on("i")#name#off("i")# wird entsprechend der angegebenen Dar­
- stellungsart gezeichnet. Diese Parameter (#on("i")#perspective, orthographic, oblique, view,
- window etc.#off("i")#) müssen vorher eingestellt werden.
- Fehlerfälle:
- * PICFILE does not exist
- Es existiert kein PICFILE mit dem Namen #on("i")#name#off("i")#
-
- PROC plot (PICFILE VAR p)
- Zweck: Der PICFILE #on("i")#p#off("i")# wird entsprechend der angegebenen Darstellungsart gezeichnet.
- Diese Parameter müssen vorher eingestellt werden:
-
- #on("b")#zweidimensional:#off("b")#
- obligat: #on("i")#window#off("i")# (zweidimensional)
- optional: #on("i")#view#off("i")# (zweidimensional)
- #on("i")#viewport#off("i")#
- #on("i")#select pen#off("i")#
-
- #on("b")#dreidimensional:#off("b")#
- obligat: #on("i")#window#off("i")# (dreidimensional)
- optional: #on("i")#view#off("i")# (dreidimensional)
- #on("i")#orthographic | perspective | oblique#off("i")#
- #on("i")#viewport#off("i")#
- #on("i")#select pen#off("i")#
-
-
-#type("times10")##on("b")#select pen#off("b")##type("times8")#
- PROC select pen (PICFILE VAR p, INT CONST pen, colour, thickness, line type)
- Zweck: Für die Darstellung des Bildes #on("i")#p#off("i")# soll dem #on("i")#virtuellen#off("i")# Stift #on("i")#pen#off("i")# ein realer Stift
- zugeordnet werden, der möglichst die Farbe #on("i")#colour#off("i")# und die Dicke #on("i")#thickness#off("i")# hat
- und dabei Linien mit dem Typ #on("i")#line type#off("i")# zeichnet. Es wird die beste Annäherung
- für das Ausgabegerät genommen.
- Dabei gelten folgende Vereinbarungen:
-
- #on("b")#Farbe:#off("b")# Negative Farben werden XOR gezeichnet (dunkel wird hell und hell wird
- dunkel), Farbe 0 ist der Löschstift und positive Farben überschreiben
- (ersetzen) den alten Punkt mit folgenden Werten:
-
- 1 Standardfarbe des Endgerätes
- 2 rot
- 3 blau
- 4 grün
- 5 schwarz
- 6 weiß
- > 6 nicht normierte Sonderfarben
-
-
- #on("b")#Dicke:#off("b")# 0 Standardstrichstärke des Endgerätes
- > 0 Strichstärke in 1/10 mm.
-
-
- #on("b")#Linientyp:#off("b")#
- 0 keine sichtbare Linie
- 1 durchgängige Linie
- 2 gepunktete Linie
- 3 kurz gestrichelte Linie
- 4 lang gestrichelte Linie
- 5 Strichpunktlinie
- > 5 nicht normierte Linie
-
-
- Die hier aufgeführten Möglichkeiten müssen nicht an allen graphischen Endge­
- räten vorhanden sein. Der geräteabhängige Graphik-Treiber wählt jeweils die
- bestmögliche Annäherung.
-
- Fehlerfälle:
- * pen out of range
- #on("i")#pen#off("i")# muss im Bereich 1-16 sein.
-
-#type("times10")##on("b")#background#off("b")##type("times8")#
- PROC background (PICFILE VAR p, INT CONST colour)
- Zweck: Der Hintergrund wird auf die Farbe #on("i")#colour#off("i")# (s.o.) gesetzt wenn möglich.
- Bei der Angabe #on("i")#background (p, 0)#off("i")# wird das Löschen des Bildschirms unterdrückt,
- so daß das Zeichen mehrerer PICFILE auf einem Blatt möglich wird.
-
- INT PROC background (PICFILE CONST p):
- Zweck: Liefert die eingestellte Hintergrundfarbe.
-
-#type("times10")##on("b")#view#off("b")##type("times8")#
- PROC view (PICFILE VAR p, REAL CONST alpha)
- Zweck: Setzt den Winkel der Y-Achse zur Senkrechten auf #on("i")#alpha#off("i")# Grad, falls diese nicht
- senkrecht auf der Betrachtungsebene steht.
-
- PROC view (PICFILE VAR p, REAL CONST phi, theta)
- Zweck: Dreidimensionale Bilder werden häufig nicht direkt von vorne dargestellt, son­
- dern für die Betrachtung gedreht. Mit der Prozedur #on("i")#view#off("i")# kann die Betrachtungs­
- richtung durch die Polarwinkel #on("i")#phi#off("i")# und #on("i")#theta#off("i")# (im Gradmass) angegeben werden.
- Voreingestellt ist #on("i")#phi#off("i")# = 0 und #on("i")#theta#off("i")# = 0, d.h. senkrecht von oben (Die #on("i")#X-
- Achse#off("i")# bildet die Horizontale und die #on("i")#Y-Achse#off("i")# bildet die Vertikale).
- Im Gegensatz zu #on("i")#rotate#off("i")# hat #on("i")#view#off("i")# keine Wirkung auf das eigentliche Bild (die
- PICTURE werden nicht verändert), sondern nur auf die gewählte Darstellung. So
- addieren sich zwar aufeinanderfolgende #on("i")#Rotationen#off("i")#, #on("i")#view#off("i")# aber geht immer von der
- Nullstellung aus. Auch kann das Bild durch eine #on("i")#Rotation#off("i")# ganz oder teilweise aus
- oder in das Darstellungsfenster (#on("i")#window#off("i")# gedreht werden. Bei #on("i")#view#off("i")# verändern sich
- die Koordinaten der Punkte nicht, d. h. das Fenster wird mitgedreht.
-
- PROC view (PICFILE VAR p, REAL CONST x, y, z)
- Zweck: Wie oben, nur werden die Winkel nicht in Polarkoordinaten angegeben, sondern
- es wird die Blickrichtung als Vektor in Karthesischen Koordinaten angegeben.
- (Der Betrachtungsvektor muß nicht normiert sein).
-
-#type("times10")##on("b")#viewport#off("b")##type("times8")#
- PROC viewport (PICFILE VAR p, REAL CONST hormin, hormax, vertmin, vertmax)
- Zweck: Die Zeichenfläche auf dem Endgerät, auf dem das Bild dargestellt werden soll,
- wird spezifiziert. Dabei wird sowohl die Größe als auch die relative Lage der
- Zeichenfläche definiert. Der linke untere Eckpunkt der physikalischen Zeichen­
- fläche des Gerätes hat die Koordinaten (0, 0). Die definierte Zeichenfläche er­
- streckt sich
-
- #on("i")#hormin - hormax#off("i")# in der Horizontalen,
- #on("i")#vertmin - vertmax#off("i")# in der Vertikalen.
-
- So liegt der linke untere Eckpunkt dann bei (#on("i")#hormin, hormax#off("i")#), der rechte obere
- Eckpunkt bei (#on("i")#hormax, vertmax#off("i")#).
-
- Damit sowohl geräteunabhängige als auch maßstabgetreue Zeichnungen möglich
- sind, können die Koordinaten in drei Arten spezifiziert werden:
- a) #on("b")#Gerätekoordinaten#off("b")#
- Die Koordinaten können Werte von 0.0 bis 2.0 annehmen. Dabei hat die
- kürzere Seite der physikalischen Zeichenfläche definitionsgemäß die Länge
- 1.0.
- b) #on("b")#Absolute Koordinaten#off("b")#
- Die Werte werden in #on("i")#cm#off("i")# angegeben. Dabei müssen die Maximalwerte aber
- größer als 2.0 sein, da sonst Fall a) angenommen wird.
- c) #on("b")#Maximale Zeichenfläche#off("b")# Bei der Angabe (0.0, 0.0, 0.0, 0.0) wird die maxi­
- male physikalische Zeichenfläche eingestellt.
-
- Voreingestellt ist
- viewport (0.0, 0.0, 0.0, 0.0)
- d.h. die größtmögliche physikalische Zeichenfläche, beginnend mit der linken
- unteren Ecke.
- Der Abbildungsmaßstab wird durch das Zusammenspiel von #on("i")#viewport#off("i")# und
- #on("i")#window#off("i")# festgelegt (s. dort). Dabei ist insbesondere darauf zu achten, daß winkel­
- treue Darstellung nur bei gleichen Verhältnissen von X-Bereich und Breite bzw.
- von Y-Bereich und Höhe möglich ist.
-
-
-#type("times10")##on("b")#window#off("b")##type("times8")#
- PROC window (PICFILE VAR p, REAL CONST x min, x max, y min, y max)
- Zweck: Für die Darstellung eines zweidimensionalen Bildes wird das darzustellende
- Fenster definiert. Alle Bildpunkte, deren X-Koordinaten im Intervall [#on("i")#x min, x
- max#off("i")#] und deren Y-Koordinaten im Bereich [#on("i")#y min, y max#off("i")#] liegen, gehören zum
- definierten Fenster.Vektoren, die außerhalb dieses Fensters liegen, gehen über die
- durch #on("i")#viewport#off("i")# Fläche hinaus und werden abgeschnitten.
-
- Der Darstellungsmaßstab ergibt sich als
-
- #ub#               x max - x min               #ue#
- horizontale Seitenlänge der Zeichenfläche
-
-
- #ub#               y max - y min               #ue#
- vertikale Seitenlänge der Zeichenfläche
-
- PROC window (PICFILE VAR p, REAL CONST x min, x max, y min, y max,  
- z min, z max)
-
- Zweck: Für die darstellung eines dreidimensionalen Bildes wird das darzustellende Fenster
- definiert. Alle Bildpunkte, deren X-Koordinaten im Intervall [#on("i")#x min, x max#off("i")#],
- deren Y-Koordinaten im Bereich [#on("i")#y min, y max#off("i")#] und deren Z-Koordinaten im
- Bereich [#on("i")#z min, z max#off("i")#] liegen, gehören zum definierten Fenster. Dieses dreidi­
- mensionale Fenster (#on("i")#Quader#off("i")#) wird entsprechend der eingestellten Projektionsart
- (orthographisch, perspektivisch oder schiefwinklig) und den Betrachtungswinkeln
- (s. #on("i")#view#off("i")#) auf die spezifizierte Zeichenfläche abgebildet.
- Anders als im zweidimensionalen Fall ist das Problem der Maßstaäbe nicht mehr
- nur durch das Zusammenspiel von #on("i")#window#off("i")# und #on("i")#viewport#off("i")# zu beschreiben. Hier
- spielen auch die Projektionsart und Darstellungswinkel herein.
-
-#type("times10")##on("b")#oblique#off("b")##type("times8")#
- PROC oblique (PICFILE VAR p, REAL CONST a, b)
- Zweck: Bei dem (dreidimensionalen) Bild #on("i")#p#off("i")# wird #on("u")#schiefwinklig#off("u")# als gewünschte Projek­
- tionsart eingestellt. Dabei ist (#on("i")#a, b#off("i")#) der Punkt auf der X-Y-Ebene, auf den der
- EinheitsVektor der Z-Richtung abgebildet werden soll.
-
-#type("times10")##on("b")#orthographic#off("b")##type("times8")#
- PROC orthographic (PICFILE VAR p)
- Zweck: Bei dem (dreidimensionalen) Bild #on("i")#p#off("i")# wird #on("u")#orthographisch#off("u")# als gewünschte Projek­
- tionsart eingestellt. Bei der orthographischen Projektion wird ein dreidimensio­
- naler Körper mit parallelen Strahlen senkrecht auf der Projektionsebene abge­
- bildet.
-
-#type("times10")##on("b")#perpective#off("b")##type("times8")#
- PROC perspective (PICFILE VAR p, REAL CONST cx, cy, cz)
- Zweck: Bei dem (dreidimensionalen) Bild #on("i")#p#off("i")# wird #on("u")#perspektivisch#off("u")# als gewünschte Projek­
- tionsart eingestellt. Der Punkt (#on("i")#cx, 1/cy, cz#off("i")#) ist der Fluchtpunkt der Projektion,
- d. h. alle Parallen zur Z-Achse schneiden sich in diesem Punkt.
-
-#type("times10")##on("b")#extrema#off("b")##type("times8")#
- PROC extrema (PICFILE VAR p, REAL VAR x min, x max, y min, y max)
- Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICFILE.
-
- PROC extrema (PICFILE VAR p, REAL VAR x min,x max,y min,y max,z min,z max)
- Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICFILE.
-
-#type ("trium12")#
-#on("b")#3. Prozeduren zur Manipulation von PICFILE#off("b")#
-#type("times 8")#
-
-#type("times10")##on("b")#:=#off("b")##type("times8")#
- OP := (PICFILE VAR l, PICFILE CONST r)
- Zweck: Zuweisung des PIFILEs #on("i")#r#off("i")# an das PICFILE #on("i")#l#off("i")#
-
- OP := (PICFILE VAR p, DATASPACE CONST d)
- Zweck: Assoziert die PICFILE Variable #on("i")#p#off("i")# mit dem Datenraum #on("i")#d#off("i")# und initialisiert die
- Variable, wenn nötig.
- Fehlerfälle:
- * dataspace is no PICFILE
- Der anzukoppelnde Datenraum hat einen unzulässigen Typ
-
-#type("times10")##on("b")#picture file#off("b")##type("times8")#
- DATASPACE PROC picture file (TEXT CONST name)
- Zweck: Assoziaten eines benannten Datenraumes mit einem PICFILE (s.o.).
-
-#type("times10")##on("b")#to pic#off("b")##type("times8")#
- PROC to pic (PICFILE VAR p, INT CONST pos)
- Zweck: Positioniert auf das PICTURE Nummer #on("i")#pos#off("i")#.
- Fehlerfälle:
- * Position underflow
- Es wurde eine Position kleiner Null angegeben.
- * Position after eof
- Es wurde versucht, hinter das Ende eines PICFILE zu positionieren. Die letzte
- erlaubte Position ist #on("i")#pictures (p)+1#off("i")#.
-
-#type("times10")##on("b")#up#off("b")##type("times8")#
- PROC up (PICFILE VAR p)
- Zweck: Positioniert genau ein PICTURE zurück.
- Fehlerfall:
- * Position underflow
- Es wurde versucht, vor das erste PICTURE zu positionieren
-
- PROC up (PICFILE VAR p, INT CONST n)
- Zweck: Positioniert genau #on("i")#n#off("i")# Picture zurück.
- Fehlerfall:
- * Position underflow
- Es wurde versucht, vor das erste PICTURE zu positionieren
-
-#type("times10")##on("b")#down#off("b")##type("times8")#
- PROC down (PICFILE VAR p)
- Zweck: Positioniert genau ein PICTURE vorwärts.
- Fehlerfall:
- * Position after eof
- Es wurde versucht, hinter das Ende eines PICFILE zu positionieren. Die letzte
- erlaubte Position ist #on("i")#pictures (p)+1#off("i")#.
-
- PROC down (PICFILE VAR p, INT CONST n)
- Zweck: Positioniert genau #on("i")#n#off("i")# Picture vorwärts.
- Fehlerfall:
- * Position after eof
- Es wurde versucht, hinter das Ende eines PICFILE zu positionieren Die letzte
- erlaubte Position ist #on("i")#pictures (p)+1#off("i")#.
-
-#type("times10")##on("b")#delete picture#off("b")##type("times8")#
- PROC delete picture (PICFILE VAR p)
- Zweck: Löscht das aktuelle PICTURE
-
-#type("times10")##on("b")#insert picture#off("b")##type("times8")#
- PROC insert picture (PICFILE VAR p)
- Zweck: Fügt ein PICTURE #on("u")#vor#off("u")# der aktuellen Position ein.
-
-#type("times10")##on("b")#read picture#off("b")##type("times8")#
- PROC read picture (PICFILE CONST p, PICTURE VAR pic)
- Zweck: Liest das aktuelle PICTURE.
-
-#type("times10")##on("b")#write picture#off("b")##type("times8")#
- PROC write picture (PICFILE VAR p, PICTURE CONST pic)
- Zweck: Schreibt das PICTURE #on("i")#pic#off("i")# auf der aktuellen Position.
-
-#type("times10")##on("b")#put picture#off("b")##type("times8")#
- PROC put picture (PICFILE VAR p, PICTURE CONST pic)
- Zweck: Schreibt das PICTURE #on("i")#pic#off("i")# an die aktuelle Position und erhöht diese um 1.
-
-#type("times10")##on("b")#get picture#off("b")##type("times8")#
- PROC get picture (PICFILE VAR p, PICTURE VAR pic)
- Zweck: Liest das PICTURE #on("i")#pic#off("i")# an dir aktuellen Position und erhöht diese um 1.
-
-#type("times10")##on("b")#eof#off("b")##type("times8")#
- BOOL PROC eof (PICFILE CONST p)
- Zweck: Liefert genau dann #on("i")#TRUE#off("i")#, wenn das Ende eines PICFILE erreicht ist.
-
-#type("times10")##on("b")#picture no#off("b")##type("times8")#
- INT PROC picture no (PICFILE CONST p)
- Zweck: Liefert die Nummer des aktuellen PICTURE.
-
-#type("times10")##on("b")#pictures#off("b")##type("times8")#
- INT PROC pictures (PICFILE CONST p)
- Zweck: Liefert die Anzahl PICTURE eines PICFILE.
-
-
-#page#
-#type ("trium12")#
-#on("b")#4. Auslieferungsumfang#off("b")#
-#type ("times8")#
-
- Die EUMEL-GRAPHIK wird auf einer Diskette mit folgendem Inhalt ausgeliefert.
- Archive #on("i")#Graphik#off("i")#:
-
- "gen Graphik"
- "gen Plotter"
- "GRAPHIK.book"
- "GRAPHIK.Picfile"
- "GRAPHIK.Transform"
- "GRAPHIK.Plot"
- "GRAPHIK.Plotter"
- "GRAPHIK.Server"
- "GRAPHIK.vektor plot"
- "ZEICHENSATZ"
- "PC.plot"
- "HP7475.plot"
- "Beispiel.Kreuz"
- "Beispiel.Sinus"
-
-
-
- #on("u")#Dateiinhalte#off("u")#
-
- 1. "gen Graphik" Installationsprogramm für Terminals
- 2. "gen Plotter" Installationsprogramm für Plotter
- 3. "GRAPHIK.book" enthält diese Beschreibung.
- 4. "GRAPHIK.Picfile" enthält die Pakete #on("i")#picture#off("i")# und #on("i")#picfile#off("i")#.
- 5. "GRAPHIK.Transform" stellt das Paket #on("i")#transformation#off("i")# zur Verfügung, in dem
- interne Prozeduren zur Projektion definiert werden.
- 6. "GRAPHIK.Plot" definiert die Prozedur #on("i")#plot#off("i")# zur Darstellung eines
- PICFILES auf dem Terminal
- 7. "GRAPHIK.Plotter" definiert die Prozedur #on("i")#plotter#off("i")# zur Darstellung eines
- PICFILES auf dem Plotter
- 8. "GRAPHIK.Server" Server für einen Plotter-Spool
- 9. "GRAPHIK.vektor plot" enthält Hilfsprogramme, die bei der Erstellung einer
- eigenen Terminalanpassung benutzt werden können.
- 10. "ZEICHENSATZ" enthält einen Zeichensatz für Terminals die im Graphik
- Modus keinen Text ausgeben können.
- 11. "PC.plot" Terminalanpassung für IBM-PC und ähnliche.
- 12. "HP7475.plot" Terminalanpassung für HP7474-Plotter und Geräte mit
- HP-GL.
- 13. "Beispiel.Kreuz" Beispielprogramm
- 14. "Beispiel.Sinus" Beispielprogramm
-
-#type ("trium12")#
-#on("b")#5. Installation#off("b")#
-#type ("times8")#
-
-
- In der Datei #on("i")#gen Graphik#off("i")# ist ein Installationspragramm enthalten. Nach dem Starten des
- Programms mit #on("i")#run ("gen Graphik")#off("i")# fragt es nach dem Dateinamen der Terminalanpas­
- sung.
- Steht keine Terminalanpassung für ein Endgerät zur Verfügung (und kann auch nicht
- beschafft werden) so kann man durch Insertieren der Datei #on("i")#GRAPHIK.Picfile#off("i")# lediglich die
- Leistungen der Pakete #on("i")#Picture#off("i")# und #on("i")#Picfile#off("i")# nutzen, ohne die erzeugten Graphiken darstellen
- zu können.
- Zur Benutzung eines #on("i")#Plotters#off("i")# über einen Spooler wird die Datei #on("i")#gen Plotter#off("i")# gestartet.
-
-
- Beispiel:
- 1. archive ("Graphik")
- 2. fetch all (archive)
- 3. release (archive)
- 4. run ("gen Graphik")
- <-- PC.Plot
-
-
-#type ("trium12")#
-#on("b")#6. Besonderheiten der PC.plot-Anpassung#off("b")#
-#type ("times8")#
-
-
- Da der IBM-PC verschiedene Graphik- und Text-Modi kennt, wird durch das Pro­
- gramm #on("i")#PC.plot#off("i")# die Prozedur #on("i")#graphik#off("i")# zusätzlich zur Verfügung gestellt. Sie erlaubt es den
- PC in verschiedenen Graphik-Modi zu betreiben.
-
- PROC graphik (INT CONST modus, pause)
-
- Modus: 0 --- Keine Graphik (normaler Textmodus)
- 1 --- hochauflösende Graphik, 50 Zeilen,
- 640 * 400 Punkte, einfarbig
- 2 --- hochauflösende Graphik, 25 Zeilen,
- 640 * 400 Punkte, einfarbig
- 3 --- mittlere Auflösung, 640 * 200 Punkte, 3 Farben
- 4 --- IBM-PC Auflösung, 320 * 200 Punkte, 3 Farben.
-
- Pause: Da der PC bei #on("i")#end plot#off("i")# wieder in den Normalmodus umschaltet und die Graphik
- dann nicht mehr zu sehen ist, kann man eine #on("i")#pause#off("i")# angeben. Die hier eingestellte
- Zeit ist aber nicht die Länge der Pause, sondern der Kehrwert der Blinkfrequenz
- proportional.
-
-
diff --git a/doc/graphic/graphik beschreibung b/doc/graphic/graphik beschreibung
deleted file mode 100644
index 53ebe49..0000000
--- a/doc/graphic/graphik beschreibung
+++ /dev/null
@@ -1,661 +0,0 @@
-#type ("basker12")##limit (16.0)##block#
-
-#head#
-#type ("triumb18")#
-#center#EUMEL-Grafik-System
-#type ("basker12")#
-#end#
- #on("italics")#gescheit, gescheiter,
- gescheitert#off("italics")#
-
-#type ("basker14")#
-#on("bold")#Beschreibung der Graphik-Prozeduren#off("bold")#
-#type ("basker12")#
-
- #on("italics")#Zweidimensionale PICTURE brauchen weniger Speicherplatz als dreidimen­
- sionale. Daher werden in einigen Fehlermeldungen unterschiedliche Größen
- angegeben.#off("italics")#
-
-#on("underline")#Picture-Prozeduren#off("underline")#
-PICTURE
-
-
-:=
- OP := (PICTURE VAR l, PICTURE CONST r)
- Zweck: Zuweisung
-
-CAT
- OP CAT (PICTURE VAR l, PICTURE CONST r)
- Zweck: Aneinanderfügen von zwei PICTURE.
- Fehlerfälle:
- * left dimension <> right dimension
- Es können nur PICTURE mit gleicher Dimension angefügt werden.
- * Picture overflow
- Die beiden PICTURE überschreiten die maximale Größe eines
- PICTURE.
-
-nilpicture
- PICTURE PROC nilpicture
- Zweck: Die Prozedur liefert ein leeres PICTURE zur Initialisierung.
-
-draw
- PROC draw (PICTURE VAR p, TEXT CONST text)
- Zweck: Der angegebene Text wird gezeichnet. Der Anfang ist dabei die aktuelle
- Stiftposition, die nicht verändert wird.
- Fehlerfälle:
- * Picture overflow
- Der Text paßt nicht mehr in das PICTURE.
-
- PROC draw (PICTURE VAR p, TEXT CONST text, REAL CONST angle,
- height, bright)
- Zweck: Der angegebene Text wird unter dem Winkel #on("italics")#angle#off("italics")# gegenüber der
- Waagerechten mit der Zeichenhöhe #on("italics")#hight#off("italics")# und der Breite #on("italics")#bright#off("italics")# gezeich­
- net. Der Anfang ist dabei die aktuelle Stiftposition, die nicht verändert
- wird.
- Fehlerfälle:
- * Picture overflow
- Der Text paßt nicht mehr in das PICTURE.
-
- PROC draw (PICTURE VAR p, REAL CONST x, y, z)
- Zweck: Zeichnen einer Linie von der aktuellen Position zur Position (x, y, z).
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
- * Picture is two dimensional
-
- PROC draw (PICTURE VAR p, REAL CONST x, y)
- Zweck: Zeichnen einer Linie von der aktuellen Position zur Position (x, y).
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
- * Picture is three dimensional
-
-draw r PROC draw r (PICTURE VAR p, REAL CONST x, y, z)
- Zweck: Zeichnen einer Linie der Länge (x, y, z) relativ zur aktuellen Position.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
- * Picture is two dimensional
-
- PROC draw r (PICTURE VAR p, REAL CONST x, y)
- Zweck: Zeichnen einer Linie der Länge (x, y) relativ zur aktuellen Position.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
- * Picture is three dimensional
-
-draw cm
- PROC draw cm (PICTURE VAR p, REAL CONST x, y)
- Zweck: Zeichnen einer Linie von der aktuellen Position zur Position (x, y) cm.
- Dabei werden die angegebenen Projektionsparameter nicht beachtet,
- sondern die Angaben in #on("bold")#Zentimeter#off("bold")# berechnet.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
-
-draw cm r
- PROC draw cm r (PICTURE VAR p, REAL CONST x, y)
- Zweck: Zeichnen einer Linie der Länge (x, y) cm relativ zur aktuellen Position.
- Dabei werden die angegebenen Projektionsparameter nicht beachtet,
- sondern die Angaben in #on("bold")#Zentimeter#off("bold")# berechnet.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
-
-move
- PROC move (PICTURE VAR p, REAL CONST x, y, z)
- Zweck: Die aktuelle Position wird auf (x, y, z) gesetzt.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
- * Picture is two dimensional
-
- PROC move (PICTURE VAR p, REAL CONST x, y)
- Zweck: Die aktuelle Position wird auf (x, y) gesetzt.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
- * Picture is three dimensional
-
-move r
- PROC move r (PICTURE VAR p, REAL CONST x, y, z)
- Zweck: Die aktuelle Position wird um (x, y, z) erhöht.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
- * Picture is two dimensional
-
- PROC move r (PICTURE VAR p, REAL CONST x, y)
- Zweck: Die aktuelle Position wird um (x, y) erhöht.
- Position.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
- * Picture is three dimensional
-
-move cm
- PROC move cm (PICTURE VAR p, REAL CONST x, y)
- Zweck: Die aktuelle Position wird auf (x, y) cm gesetzt. Dabei werden die an­
- gegebenen Projektionsparameter nicht beachtet, sondern die Angaben in #on("bold")#
- Zentimeter#off("bold")# berechnet.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
-
-move cm r
- PROC move cm r (PICTURE VAR p, REAL CONST x, y)
- Zweck: Die aktuelle Position wird um (x, y) cm erhöht. Dabei werden die an­
- gegebenen Projektionsparameter nicht beachtet, sondern die Angaben in #on("bold")#
- Zentimeter#off("bold")# berechnet.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
-
-bar
- PROC bar (PICTURE VAR p, REAL CONST width, hight, INT CONST
- pattern):
- Zweck: Die Prozedur zeichnet an der aktuellen Position einen Balken mit dem
- Muster #on("italics")#pattern#off("italics")#: 0 = Leerer Balken
- 1 = Gepunkteter Balken
- 2 = Gefüllter Balken
- 3 = Horizontale Linien
- 4 = Vertikale Linien
- 5 = Gekreuzte Linien
- 6 = Diagonale Linien von Links nach Rechts
- 7 = Diagonale Linien von Rechts nach Links
- 8 = Gekreuzte diagonale Linien.
- Die aktuelle Stiftposition wird dabei nicht verändert.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
- * Picture is three dimensional
- * Unknown pattern
- Das angegebene Muster liegt nicht im Bereich 0-8
-
-circle
- PROC circle (PICTURE VAR p, REAL CONST from, to, INT CONST
- pattern)
- Zweck: Die Prozedur zeichnet an der aktuellen Position ein Kreissegment vom
- Winkel #on("italics")#from#off("italics")# bis #on("italics")#to#off("italics")# (im Gradmaß) mit dem Muster #on("italics")#pattern#off("italics")# (s.o.). Die
- aktuelle Stiftposition wird dabei nicht verändert.
- Fehlerfälle:
- * Picture overflow
- Zu viele Befehle in einem PICTURE
- * Picture is three dimensional
- * Unknown pattern
- Das angegebene Muster liegt nicht im Bereich 0-8
-
-dim
- INT PROC dim (PICTURE CONST pic)
- Zweck: Liefert die Dimension eines PICTURE.
-
-pen
- INT PROC pen (PICTURE CONST p)
- Zweck: Liefert den virtuellen Stift des PICTURE
-
- PROC pen (PICTURE VAR p, INT CONST pen)
- Zweck: Setzen des (virtuellen) Stiftes eines PICTURE. Bei pen=0 wird das
- Picture nicht gezeichnet.
- Fehlerfälle:
- * pen out of range
- Der gewünschte Stift ist kleiner als 0 oder größer als 16.
-
-extrema
- PROC extrema (PICTURE CONST p, REAL VAR x min, x max, y min, y
- max)
- Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICTURE.
- Fehlerfälle:
- * Picture is three dimensional
-
- PROC extrema (PICTURE CONST p, REAL VAR x min, x max, y min, y
- max, z min, z max)
- Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICTURE.
- Fehlerfälle:
- * Picture is two dimensional
-
-where
- PROC where (PICTURE CONST p, REAL VAR x, y, z)
- Zweck: Die Prozedur liefert die aktuelle Stiftposition (Angaben mit #on("italics")#cm#off("italics")# werden
- dabei nicht berücksichtigt).
- Fehlerfälle:
- * Picture is two dimensional
-
- PROC where (PICTURE CONST p, REAL VAR x, y, z)
- Zweck: Die Prozedur liefert die aktuelle Stiftposition (Angaben mit #on("italics")#cm#off("italics")# werden
- dabei nicht berücksichtigt).
- Fehlerfälle:
- * Picture is three dimensional
-
-rotate:
- PROC rotate (PICTURE VAR p, REAL CONST angle)
- Zweck: Das PICTURE wird um den Punkt (0, 0) um den Winkel #on("italics")#angle#off("italics")# (im
- Gradmaß) im mathematisch positiven Sinn gedreht.
- Dabei werden nur die Werte von #on("italics")#draw, draw r, move #off("italics")# und #on("italics")#move r#off("italics")#
- verändert.
-
- PROC rotate (PICTURE CONST p, REAL CONST phi, theta, lambda ) :
- PICTURE 1-397
- Zweck: Das PICTURE wird um den Winkel #on("italics")#lambda#off("italics")# um die Drehachse #on("italics")#(phi,
- theta)#off("italics")# gedreht.
- Dabei werden nur die Werte von #on("italics")#draw, draw r, move #off("italics")# und #on("italics")#move r#off("italics")#
- verändert.
-
-stretch
- PROC stretch (PICTURE VAR pic, REAL CONST sx, sy)
- Zweck: Das PICTURE wird in X-Richtung um den Faktor #on("italics")#sx#off("italics")#, in Y-Rich­
- tung um den Faktor #on("italics")#sy#off("italics")# gestreckt (bzw. gestaucht). Dabei bewirkt der
- Faktor
- s > 1 eine Streckung
- 0 < s < 1 eine Stauchung
- s < 0 zusätzlich eine Achsenspiegelung.
- Dabei werden nur die Werte von #on("italics")#draw, draw r, move #off("italics")# und #on("italics")#move r#off("italics")#
- verändert.
- Fehlerfälle:
- * Picture is three dimensional
-
- PROC stretch (PICTURE VAR p, REAL CONST sx, sy, sz)
- Zweck: s. o.
- Fehlerfälle:
- * Picture is two dimensional
-
-translate
- PROC translate (PICTURE VAR p, REAL CONST dx, dy)
- Zweck: Das PICTURE wird um #on("italics")#dx#off("italics")# und #on("italics")#dy#off("italics")# verschoben.
- Dabei werden nur die Werte von #on("italics")#draw, draw r, move #off("italics")# und #on("italics")#move r#off("italics")#
- verändert.
- Fehlerfälle:
- * Picture is three dimensional
-
- PROC translate (PICTURE VAR p, REAL CONST dx, dy, dz)
- Zweck: s. o.
- Fehlerfälle:
- * Picture is two dimensional
-
-plot PROC plot (PICTURE CONST p)
- Zweck: Das Picfile wird gezeichnet.
- Achtung: Es wird kein #on("italics")#begin plot#off("italics")# oder #on("italics")#end plot#off("italics")# durchgeführt. Es wird
- auch kein Stift gsetzt und die Projektionsparameter bleiben
- unverändert.
-
-
-#on("underline")#Graphische PICFILE-Prozeduren#off("underline")#
-plot
- PROC plot (TEXT CONST name)
- Zweck: Der PICFILE mit dem Namen #on("italics")#name#off("italics")# wird entsprechend der angegebenen
- Darstellungsart gezeichnet. Diese Parameter (#on("italics")#perspective, orthographic,
- oblique, view, window etc.#off("italics")#) müssen vorher eingestellt werden.
- Fehlerfälle:
- * PICFILE does not exist
- Es existiert kein PICFILE mit dem Namen #on("italics")#name#off("underline")#
-
- PROC plot (PICFILE VAR p)
- Zweck: Der PICFILE #on("italics")#p#off("italics")# wird entsprechend der angegebenen Darstellungsart ge­
- zeichnet. Diese Parameter müssen vorher eingestellt werden:
-
- #on("bold")#zweidimensional:#off("bold")#
- obligat: #on("italics")#window#off("italics")# (zweidimensional)
- optional: #on("italics")#view#off("italics")# (zweidimensional)
- #on("italics")#viewport#off("italics")#
- #on("italics")#select pen#off("italics")#
-
- #on("bold")#dreidimensional:#off("bold")#
- obligat: #on("italics")#window#off("italics")# (dreidimensional)
- optional: #on("italics")#view#off("italics")# (dreidimensional)
- #on("italics")#orthographic | perspective | oblique#off("italics")#
- #on("italics")#viewport#off("italics")#
- #on("italics")#select pen#off("italics")#
-
-
-select pen
- PROC select pen (PICFILE VAR p, INT CONST pen, colour, thickness, line
- type,
- BOOL VAR hidden lines) Zweck: Für die
- Darstellung des Bildes #on("italics")#p#off("italics")# soll dem #on("italics")#virtuellen#off("italics")# Stift #on("italics")#pen#off("italics")# ein realer Stift
- zugeordnet werden, der möglichst die Farbe #on("italics")#colour#off("italics")# und die Dicke #on("italics")#thick­
- ness#off("italics")# hat und dabei Linien mit dem Typ #on("italics")#line type#off("italics")# zeichnet. Es wird die
- beste Annäherung für das Ausgabegerät genommen.
- Wenn #on("italics")#hidden lines#off("italics")# auf TRUE gesetzt wird, werden bei dreidimensionalen
- Zeichnungen die verdeckten Linien mitgezeichnet, ansonsten werden sie
- unterdrückt. Um sicherzustellen, das der Algorithmus auch funktioniert,
- müssen die Linien allerdings von vorn nach hinten gezeichnet werden. Es
- ist also nicht möglich, das Bild so zu drehen, das die hinteren Linien
- zuerst gezeichnet werden.
- Dabei gelten folgende Vereinbarungen:
-
- #on("bold")#Farbe:#off("bold")# Negative Farben werden XOR gezeichnet (dunkel wird hell und
- hell wird dunkel), Farbe 0 ist der Löschstift und positive Farben
- überschreiben (ersetzen) den alten Punkt mit folgenden Werten:
-
- 1 Standardfarbe des Endgerätes
- 2 rot
- 3 blau
- 4 grün
- 5 schwarz
- 6 weiß
- > 6 nicht normierte Sonderfarben
-
-
- #on("bold")#Dicke:#off("bold")# 0 Standardstrichstärke des Endgerätes, ansonsten Strichstärke in
- 1/10 mm.
-
-
- #on("bold")#Linientyp:#off("bold")#
- 0 keine sichtbare Linie
- 1 durchgängige Linie
- 2 gepunktete Linie
- 3 kurz gestrichelte Linie
- 4 lang gestrichelte Linie
- 5 Strichpunktlinie
- > 5 nicht normierte Linie
-
- #on("bold")#Verdeckte Linien:#off("bold")#
- TRUE Verdeckte Linien werden mitgezeichnet
- FALSE Verdeckte Linien werden unterdrückt (nur bei drei­
- dimensionalen PICTURE)
-
- Die hier aufgeführten Möglichkeiten müssen nicht an allen graphischen
- Endgeräten vorhanden sein. Der geräteabhängige Graphik-Treiber wählt
- jeweils die bestmögliche Annäherung.
-
- Fehlerfälle:
- * pen out of range
- #on("italics")#pen#off("italics")# muss im Bereich 1-16 sein.
-
-background
- PROC background (PICFILE VAR p, INT CONST colour)
- Zweck: Der Hintergrund wird auf die Farbe #on("italics")#colour#off("italics")# (s.o.) gesetzt wenn möglich.
-
- INT PROC background (PICFILE CONST p):
- Zweck: Liefert die eingestellte Hintergrundfarbe.
-
-view
- PROC view (PICFILE VAR p, REAL CONST alpha)
- Zweck: Setzt den Winkel der Y-Achse zur Senkrechten auf #on("italics")#alpha#off("italics")# Grad, falls
- diese nicht senkrecht zur Betrachtungsebene steht.
-
- PROC view (PICFILE VAR p, REAL CONST phi, theta)
- Zweck: Dreidimensionale Bilder werden häufig nicht direkt von vorne dargestellt,
- sondern für die Betrachtung gedreht. Mit der Prozedur #on("italics")#view#off("italics")# kann die
- Betrachtungsrichtung durch die Polarwinkel #on("italics")#phi#off("italics")# und #on("italics")#theta#off("italics")# (im Gradmass)
- angegeben werden. Voreingestellt ist #on("italics")#phi#off("italics")# = 0 und #on("italics")#theta#off("bold")# = 0, d.h. senk­
- recht von oben.
-
- Im Gegensatz zu #on("italics")#rotate#off("italics")# hat #on("italics")#view#off("italics")# keine Wirkung auf das eigentliche Bild
- (PICFILE), sondern nur auf die gewählte Darstellung. So addieren sich
- zwar aufeinanderfolgende #on("italics")#Rotationen#off("italics")#, #on("italics")#view#off("italics")# aber geht immer von der
- Nullstellung aus. Auch kann das Bild durch eine #on("italics")#Rotation#off("italics")# ganz oder
- teilweise aus oder in das Darstellungsfenster (#on("italics")#window#off("italics")# gedreht werden. Bei
- #on("italics")#view#off("italics")# verändern sich die Koordinaten der Punkte nicht, d. h. das Fenster
- wird mitgedreht.
-
- PROC view (PICFILE VAR p, REAL CONST x, y, z)
- Zweck: Wie oben, nur werden die Winkel nicht in Polarkoordinaten angegeben,
- sondern es wird die Blickrichtung als Vektor in Karthesischen Koordina­
- ten angegeben. (Die Länge darf ungleich 1 sein).
-
-viewport
- PROC viewport (PICFILE VAR p, REAL CONST hormin, hormax, vertmin,
- vertmax) : 1-709
- Zweck: Die Zeichenfläche auf dem Endgerät, auf dem das Bild dargestellt werden
- soll, wird spezifiziert. Dabei wird sowohl die Größe als auch die relative
- Lage der Zeichenfläche definiert. Der linke untere Eckpunkt der physi­
- kalischen Zeichenfläche des Gerätes hat die Koordinaten (0, 0). Die
- definierte Zeichenfläche erstreckt sich
-
- #on("italics")#hormin - hormax#off("italics")# in der Horizontalen,
- #on("italics")#vertmin - vertmax#off("italics")# in der Vertikalen.
-
- So liegt der linke untere Eckpunkt dann bei (#on("italics")#hormin, hormax#off("italics")#), der rechte
- obere Eckpunkt bei (#on("italics")#hormax, vertmax#off("italics")#).
-
- Damit sowohl geräteunabhängige als auch maßstabgetreue Zeichnungen
- möglich sind, können die Koordinaten in zwei Arten spezifiziert werden:
- a) #on("bold")#Gerätekoordinaten#off("bold")#
- Die Koordinaten können Werte von 0.0 bis 2.0 annehmen. Dabei
- hat die kürzere Seite der physikalischen Zeichenfläche definitionsge­
- mäß die Länge 1.0.
- b) #on("bold")#Absolute Koordinaten#off("bold")#
- Die Werte werden in #on("italics")#cm#off("italics")# angegeben. Dabei müssen die Maximal­
- werte aber größer als 2.0 sein, da sonst Fall a) angenommen wird.
-
- Voreingestellt ist
-
- viewport (0.0, 1.0, 0.0, 1.0)
-
- d.h. das größtmögliche Quadrat, beginnend mit der linken unteren Ecke
- der physikalischen Zeichenfläche. In vielen Fällen wird diese Einstellung
- ausreichen, so daß der Anwender kein eigenes #on("italics")#viewport#off("italics")# definieren muss.
-
- Der Abbildungsmaßstab wird durch das Zusammenspiel von #on("italics")#viewport#off("italics")# und
- #on("italics")#window#off("italics")# festgelegt (s. dort). Dabei ist insbesondere darauf zu achten, daß
- winkeltreue Darstellung nur bei gleichen X- und Y-Maßstab möglich
- ist. Da man oft quadratische Fenster (#on("italics")#window#off("italics")#) verwendet, wurde als
- Standardeinstellung auch ein quadratisches #on("italics")#viewport#off("italics")# gewählt.
-
- Hinweis: Mit der Prozedur #on("italics")#check limit#off("italics")# aus dem PACKET #on("italics")#basis plot#off("italics")# kann die
- Überprüfung der Grenzen des eingestellten #on("italics")#viewport#off("italics")#-Bereiches ein-
- bzw. ausgeschaltet werden. Bei eingeschateter Überprüfung, werden
- Linien, die den Bereich überschreiten, am Rand abgetrennt.
-
-
-window
- PROC window (PICFILE VAR p, REAL CONST x min, x max, y min, y max)
- Zweck: Für die Darstellung eines zweidimensionalen Bildes wird das darzustel­
- lende Fenster definiert. Alle Bildpunkte, deren X-Koordinaten im In-
- tervall [#on("italics")#x min, x max#off("italics")#] und deren Y-Koordinaten im Bereich [#on("italics")#y min, y
- max#off("italics")#] liegen, gehören zum definierten Fenster.Vektoren, die außerhalb
- dieses Fensters liegen, gehen über die durch #on("italics")#viewport#off("italics")# Fläche hinaus
- (s.dort).
-
- Der Darstellungsmaßstab ergibt sich als
-
- #ub#               x max - x min               #ue#
- horizontale Seitenlänge der Zeichenfläche
-
-
- #ub#               y max - y min               #ue#
- vertikale Seitenlänge der Zeichenfläche
-
- PROC window (PICFILE VAR p, REAL CONST x min, x max, y min, y max,
- z min, z max)
-
- Zweck: Für die darstellung eines dreidimensionalen Bildes wird das darzustellende
- Fenster definiert. Alle Bildpunkte, deren X-Koordinaten im Intervall [#on("italics")#x
- min, x max#off("italics")#], deren Y-Koordinaten im Bereich [#on("italics")#y min, y max#off("italics")#] und
- deren Z-Koordinaten im Bereich [#on("italics")#z min, z max#off("italics")#] liegen, gehören zum
- definierten Fenster. Dieses dreidimensionale Fenster (#on("italics")#Quader#off("italics")#) wird ent­
- sprechend der eingestellten Projektionsart (orthographisch, perspektivisch
- oder schiefwinklig) und den Betrachtungswinkeln (s. #on("italics")#view#off("italics")#) auf die spezi­
- fizierte Zeichenfläche abgebildet.
- Anders als im zweidimensionalen Fall ist das Problem der Maßstaäbe
- nicht mehr nur durch das Zusammenspiel von #on("italics")#window#off("italics")# und #on("italics")#viewport#off("italics")# zu
- beschreiben. Hier spielen auch die Projektionsart und Darstellungswinkel
- herein.
-
-oblique:
- PROC oblique (PICFILE VAR p, REAL CONST a, b)
- Zweck: Bei dem (dreidimensionalen) Bild #on("italics")#p#off("italics")# wir #on("underline")#schiefwinklig#off("underline")# als gewünschte
- Projektionsart eingestellt. Dabei ist (#on("italics")#a, b#off("italics")#) der Punkt auf der X-Y-
- Ebene, auf den der Einheitsvektor der Z-Richtung abgebildet werden
- soll.
-
-orthographic
- PROC orthographic (PICFILE VAR p)
- Zweck: Bei dem (dreidimensionalen) Bild #on("italics")#p#off("italics")# wir #on("underline")#orthographisch#off("underline")# als gewünschte
- Projektionsart eingestellt. Bei der orthographischen Projektion wird ein
- dreidimensionaler Körper mit parallelen Strahlen senkrecht auf der Pro­
- jektionsebene dabgebildet.
-
-perpective
- PROC perspective (PICFILE VAR p, REAL CONST cx, cy, cz)
- Zweck: Bei dem (dreidimensionalen) Bild #on("italics")#p#off("italics")# wir #on("underline")#perspectivisch#off("underline")# als gewünschte
- Projektionsart eingestellt. Der Punkt (#on("italics")#cx, 1/cy, cz#off("underline")#) ist der Fluchtpunkt der
- Projektion, d. h. alle Parallen zur Z-Achse schneiden sich in diesem
- Punkt.
-
-extrema
- PROC extrema (PICFILE VAR p, REAL VAR x min, x max, y min, y max)
- Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICFILE.
-
- PROC extrema (PICFILE VAR p, REAL VAR x min,x max,y min,y max,z
- min,z max) : 1-651
- Zweck: Die Prozedur liefert die größten und kleinsten Werte des PICFILE.
-
-
-#on("underline")#Prozeduren zur Manipulation von PICFILE#off("underline")#
-:=
- OP := (PICFILE VAR p, DATASPACE CONST d)
- Zweck: Assoziert die PICFILE Variable #on("italics")#p#off("italics")# mit dem Datenraum #on("italics")#d#off("italics")# und initialisiert
- die Variable, wenn nötig.
- Fehlerfälle:
- * dataspace is no PICFILE
- Der anzukoppelnde Datenraum hat einen unzulässigen Typ
-
-picture file
- DATASPACE PROC picture file (TEXT CONST name)
- Zweck: Assoziaten eines benannten Datenraumes mit einem PICFILE (s.o.).
-
-put
- PROC put (FILE VAR f, PICFILE VAR p)
- Zweck: Schreibt den Inhalt eines PICFILE in ein FILE. Die Informationen
- werden im internen Format abgelegt.
-
-get
- PROC get (PICFILE VAR p, FILE VAR f)
- Zweck: Liest den Inhalt eines PICFILE aus einem FILE. Die Informationen
- müssen mit #on("italics")#put#off("italics")# geschrieben worden sein.
- Fehlerfall:
- * Picfile overflow
- Es können nur maximal 1024 Picture (Sätze) in einem PICFILE abgelegt
- werden.
-
-to first pic
- PROC to first pic (PICFILE VAR p)
- Zweck: Positioniert auf das erste PICTURE.
-
-to eof
- PROC to last pic (PICFILE VAR p)
- Zweck: Positioniert hinter das letzte PICTURE.
-
-to pic
- PROC to pic (PICFILE VAR p, INT CONST pos)
- Zweck: Positioniert auf das PICTURE Nummer #on("italics")#pos#off("italics")#.
- Fehlerfälle:
- * Position underflow
- Es wurde eine Position kleiner Null angegeben. * Position after
- eof Es wurde versucht, hinter das Ende eines PICFILE zu positionieren
-
-up
- PROC up (PICFILE VAR p)
- Zweck: Positioniert genau ein PICTURE zurück.
- Fehlerfall:
- * Position underflow
- Es wurde versucht, vor das erste PICTURE zu positionieren
-
- PROC up (PICFILE VAR p, INT CONST n)
- Zweck: Positioniert genau #on("italics")#n#off("italics")# Picture zurück.
- Fehlerfall:
- * Position underflow
- Es wurde versucht, vor das erste PICTURE zu positionieren
-
-down
- PROC down (PICFILE VAR p)
- Zweck: Positioniert genau ein PICTURE vorwärts.
- Fehlerfall:
- * Position after eof
- Es wurde versucht, hinter das Ende eines PICFILE zu positionieren
-
- PROC down (PICFILE VAR p, INT CONST n)
- Zweck: Positioniert genau #on("italics")#n#off("italics")# Picture vorwärts.
- Fehlerfall:
- * Position after eof
- Es wurde versucht, hinter das Ende eines PICFILE zu positionieren
-
-is first picture
- BOOL PROC is first picture (PICFILE CONST p)
- Zweck: Liefert genau dann #on("italics")#TRUE#off("italics")#, wenn das erste PICTURE erreicht ist.
-
-eof
- BOOL PROC eof (PICFILE CONST p)
- Zweck: Liefert genau dann #on("italics")#TRUE#off("italics")#, wenn das Ende eines PICFILE erreicht ist.
-
-picture no
- INT PROC picture no (PICFILE CONST p)
- Zweck: Liefert die Nummer des aktuellen PICTURE.
-
-pictures
- INT PROC pictures (PICFILE CONST p)
- Zweck: Liefert die Anzahl PICTURE eines PICFILE.
-
-delete picture
- PROC delete picture (PICFILE VAR p)
- Zweck: Löscht das aktuelle PICTURE
-
-insert picture
- PROC insert picture (PICFILE VAR p)
- Zweck: Fügt ein PICTURE #on("underline")#vor#off("underline")# der aktuellen Position ein.
-
-read picture
- PROC read picture (PICFILE CONST p, PICTURE VAR pic)
- Zweck: Liest das aktuelle PICTURE.
-
-write picture
- PROC write picture (PICFILE VAR p, PICTURE CONST pic)
- Zweck: Schreibt das PICTURE #on("italics")#pic#off("italics")# auf der aktuellen Position.
-
-put picture
- PROC write picture (PICFILE VAR p, PICTURE CONST pic)
- Zweck: Schreibt das PICTURE #on("italics")#pic#off("italics")# hinter das letzte PICTURE des PICFILE.
- Die aktuelle Position wird nicht verändert.
-
-#page#
- #on("italics")#Wo wir sind, da klappt nichts,
- aber wir können nicht überall sein !#off("italics")#
-
-#type ("basker14")#
-#on("bold")#Kurzbeschreibung des Graphik-Editors#off("bold")#
-#type ("basker12")#
-
-In der Kommondozeile werden folgende Informationen angezeigt:
-
-#on("revers")#LEN nnnnn <...Name...> DIM n PEN nn Picture nnnn
-#off("revers")#
-
-
-Folgende Kommandos stehen zur Verfügung:
-
- PICTURE PROC pic neu
- PICFILE PROC picfile neu
- PROC neu zeichnen
-
- OP UP n (n PICTURE up)
- OP DOWN n (n PICTURE down)
- OP T n (to PICTURE n)
-
- PROC oblique (REAL CONST a, b)
- PROC orthographic
- PROC perspective (REAL CONST cx, cy, cz)
- PROC window (BOOL CONST dev)
- PROC window (REAL CONST x min, x max, y min, y max)
- PROC window (REAL CONST x min, x max, y min, y max, z min, z max)
- PROC viewport (REAL CONST h min, h max, v min, v max)
- PROC view (REAL CONST alpha)
- PROC view (REAL CONST phi, theta)
- PROC view (REAL CONST x, y, z)
-
- PROC pen (INT CONST n)
- PROC select pen (INT CONST pen, colour, thickness, line type, BOOL CONST
- hidden)
- PROC background (INT CONST colour)
-
- PROC extrema pic
- PROC extrema picfile
- PROC selected pen
-
- PROC rotate (REAL CONST angle)
- PROC rotate (REAL CONST phi, theta, lambda )
- PROC stretch (REAL CONST sx, sy)
- PROC stretch (REAL CONST sx, sy, sz)
- PROC translate (REAL CONST dx, dy)
- PROC translate (REAL CONST dx, dy, dz)
-
diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Inhaltsverzeichnis b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Inhaltsverzeichnis
deleted file mode 100644
index 5726636..0000000
--- a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Inhaltsverzeichnis
+++ /dev/null
@@ -1,45 +0,0 @@
-#limit (11.5)##pagelength (16.5)#
-#start (1.8,1.0)#
-Inhaltsverzeichnis
-
-
-
-1 Was kann gs-Herbert und Robbi 3
-
-2 Allgemeines zum Hamster-/Robotermodell 6
-2.1 Entstehung 6
-2.2 Kurzbeschreibung des Hamster-/Roboter-
- Modells 7
-2.2.1 Befehle und Tests 7
-2.2.2 Landschafts-/Arbeitsfeldgestaltung 9
-2.3 Einsatzbereich 11
-2.4 Hinweise für den Einsatz in der Ausbildung 12
-2.5 Aufgabenmaterial 14
-2.6 Erfahrungen mit dem Hamster-/Roboter-Modell 14
-
-3 Installation von gs-Herbert und Robbi 17
-3.1 Voraussetzungen 17
-3.2 Lieferumfang 17
-3.3 Installation 18
-3.4 Direktstart des Medells 20
-
-4 Beschreibung der Menufunktionen 22
-4.1 Kurzhinweise zur Bedienung des Menus 23
-4.2 Menufunktionen zum Oberbegriff 'Info' 27
-4.3 Menufunktionen zum Oberbegriff 'Landschaft' 29
- Menufunktionen zum Oberbegriff 'Arbeitsfeld' 29
-4.4 Menufunktionen zum Oberbegriff 'Programm' 35
-4.5 Menufunktionen zum Oberbegriff 'Lauf' 41
-4.6 Menufunktionen zum Oberbegriff 'Archiv' 46
-
-5 Detailbeschreibung der Basisbefehle 61
-
-6 Zusätzliche Kommandos 66
-
-
-
-
-
-
-
-
diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 1 b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 1
deleted file mode 100644
index 73c95f9..0000000
--- a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 1
+++ /dev/null
@@ -1,93 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (3)#
-#headodd#
-#center#gs-Herbert und Robbi#right#%
-
-#end#
-#headeven#
-%#center#gs-Herbert und Robbi
-
-#end#
-#center#1
-
-#center#Was
-#center#kann
-#center#gs-Herbert und Robbi
-
-
- Mit #on("b")#gs-Herbert und Robbi#off("b")# liegt das von Lothar Oppor
-entwickelte und von Wolfgang Weber weiterentwickelte
-Hamster-Modell nun eingebettet in die komfortable,
-menuorientierte Benutzerschnittstelle #on("b")#gs-DIALOG#off("b")# vor. Das
-Programm stellt eine wesentliche Erweiterung des 'alten'
-Hamster - Modells dar. Neben einer zweiten Modellvarian­
-te (Roboter) wurden eine Reihe nützlicher Funktionen in
-das Modell integriert. Sämtlich Funktionen werden über
-ein übersichtliches Menu angeboten, was gerade dem An­
-fänger die Arbeit mit dem Computer erleichtert.
-
- #on("b")#gs-Herbert und Robbi#off("b")# kann zur Einführung in das al­
-gorithmische Problemlösen eingesetzt werden und soll
-dazu dienen, Programmierung #on("u")#einfach#off("u")# und #on("u")#spielerisch#off("u")# zu
-erlernen - ohne Ablenkung durch Betriebssystem oder gar
-Hardware-Eigenheiten.
-
- Das Modell ist so einfach und überschaubar, daß ein
-Anfänger schon nach einer halben Stunde in der Lage ist,
-sich selbst kleine Aufgaben zu stellen und diese zu lösen.
-Die Modellumgebung ist so komfortabel, daß der Anfänger
-nach einer kurzen Einweisung selbständig mit dem Compu­
-termodell umgehen kann.
-
-- Durch die Menuführung sind nur noch wenige Be­
- triebssystemkommandos zur Bedienung des Systems
- notwendig.
-
-- Der Benutzer kann jederzeit Informationen anfordern
- über:
- - den zur Verfügung stehenden Befehlsumfang,
- - die Möglichkeiten, den Lauf des Hamsters/Robo­
- ters zu beeinflussen,
- - die Möglichkeiten hinsichtlich der Landschafts­
- gestaltung/Arbeitsfeldgestaltung
- - die Bedienung des Menusystems
- - die Wirkung der einzelnen Menufunktionen
- - die Möglichkeiten/Bedienung des Editors
-
-- Neben der Steuerung des Hamsters/Roboters durch
- Programme kann der Hamster/Roboter auch interaktiv
- gesteuert werden; dabei wird ein Protokoll der ausge­
- führten Aktionen in Form eines ablauffähigen ELAN-
- Programms angelegt. Dieses Protokoll (Programm) kann
- jederzeit eingesehen werden. Natürlich kann anschlie­
- ßend der Hamster/Roboter die gleichen Aktionen, die
- zuvor von Hand ausgeführt wurden, auch nach diesem
- Programm ausführen.
-
-- Durch den (optional) erweiterbaren Befehlssatz kann
- #on("b")#gs-Herbert und Robbi#off("b")# den Erfordernissen und der Lei­
- stungsfähigkeit der Lernenden leicht angepaßt wer­
- den.
-
-- Auch das Editieren und Drucken von Programmen sowie
- Landschaften/Arbeitsfeldern erfolgt vom Menu aus.
-
-- Die Archivoperationen, die gerade Anfängern zunächst
- große Probleme bereiten, können sämtlichst komforta­
- bel vom Menu aus gehandhabt werden. Dabei werden
- Anfragen an den Benutzer gestellt, die zumeist nur
- mit 'ja' oder 'nein' zu beantworten sind; oder der Be­
- nutzer hat in einer Auswahlliste die gewünschten Da­
- teinamen anzukreuzen.
-
-- Die Archivoperationen stehen dem Benutzer auch unab­
- hängig vom Hamster-/Robotermodell unter #on("b")#gs-DIALOG#off("b")#
- zur Verfügung, so daß beim Verlassen der Modellum­
- gebung "kein Bruch zu befürchten ist".
-
-- Die Fehlermeldungen sind detailliert und leicht ver­
- ständlich, so daß auch Anfänger die Fehlerquelle(n)
- zumeist ohne zusätzliche Hilfen lokalisieren und be­
- seitigen können.
-
diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 2 b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 2
deleted file mode 100644
index 52526d6..0000000
--- a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 2
+++ /dev/null
@@ -1,389 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (6)#
-#headodd#
-#center#gs-Herbert und Robbi#right#%
-
-#end#
-#headeven#
-%#center#gs-Herbert und Robbi
-
-#end#
-#center#2
-
-#center#Allgemeines
-#center#zum
-#center#Hamster-/Robotermodell
-
-
-2.1 Entstehung
-
- Das Hamster - Modell wurde in der Gesellschaft für
-Mathematik und Datenverarbeitung (GMD), einer Großfor­
-schungseinrichtung des Bundes und des Landes Nord­
-rhein-Westfalen, von Lothar Oppor in Anlehnung an das
-Modell 'Karel the Robot' von Richard E. Pattis (Stanford
-University, USA) entwickelt und zunächst innerhalb der
-GMD und schon bald im Schulbereich eingesetzt.
- Wolfgang Weber, Lehrer an der Gesamtschule Leopolds­
-höhe bei Bielefeld, entwickelte in Zusammenhang mit sei­
-ner Arbeit am Landesinstitut für Schule und Weiterbil­
-dung in Soest dieses Modell seit 1984 weiter. Sein Ziel war
-es, das Modell um solche Komponenten zu erweitern, daß es
-auch für Schüler der Sekundarstufe I im Anfangsunter­
-richt eingesetzt werden kann. Besondere Bedeutung kam
-dabei der Entwicklung einer komfortablen, einfach zu be­
-dienenden Benutzerschnittstelle zu, die es dem Anfänger
-ermöglicht, sich von Beginn an mit der eigentlichen Pro­
-blemstellung auseinanderzusetzen, ohne von Betriebssy­
-stem oder gar Hardware-Eigenheiten abgelenkt zu werden.
- Mit dem vorliegenden Programm #on("b")#gs-Herbert und Robbi#off("b")#,
-das in die komfortable, menuorientierte Benutzer­
-schnittstelle #on("b")#gs-DIALOG#off("b")# eingebettet ist, dürfte diese Ar­
-beit vorerst zu einem Abschluß gebracht sein. Mit diesem
-Programm liegt nun eine Modellumgebung vor, die den
-gestellten Anforderungen gerecht wird.
-
-
-2.2 Kurzbeschreibung des Hamster-/Roboter-Modells
-
- Das Hamster- und das Roboter - Modell sind analog
-aufgebaut und in Art und Umfang der Befehle identisch.
-Im ersten Modell kann 'Herbert der Hamster', im zweiten
-Modell 'Robbi der Roboter' auf dem Bildschirm durch vier
-sogenannte Basisbefehle gesteuert werden - 'Herbert' in
-einer 'Landschaft', 'Robbi' auf einem 'Arbeitsfeld' - beides
-Ebenen, die aus 23 x 40 Kacheln bestehen.
- Auf dieser Ebene können sich noch Hindernisse und
-'Körner' (für Herbert) oder 'Werkstücke' (für Robbi) befin­
-den. Die Hindernisse stellen auf dem Bildschirm Barrieren
-dar, die umgangen werden müssen. Die Körner bzw. Werk­
-stücke können von Herbert in seinen 'Backentaschen' bzw.
-von Robbi in seinem 'Behälter' aufgenommen oder daraus
-(wieder) abgelegt werden.
-
-
-2.2.1 Befehle und Tests
-
- Für die Steuerung von Herbert bzw.Robbi stehen vier
-Basisbefehle zur Verfügung (die in beiden Modellvarian­
-ten gleich sind):
-
-#on("u")#vor#off("u")#
- Gehe eine Kachel (einen Schritt) in Laufrichtung vor.
-
-#on("u")#links um#off("u")#
- Drehe Dich, wo Du stehst, um 90 Grad nach links.
-
-#on("u")#nimm#off("u")#
- Nimm da, wo Du stehst, ein Korn/Werkstück auf.
-
-#on("u")#gib#off("u")#
- Lege da, wo Du stehst, aus den Backentaschen/dem Be­
- hälter ein Korn/Werkstück ab.
-
- Da nur dort ein Korn/Werkstück aufgenommen werden
-kann, wo auch eines vorhanden ist oder nur vorgegangen
-werden kann, wenn die nächste Kachel noch zur Land­
-schaft/zum Arbeitsfeld gehört und nicht blockiert ist,
-sind die Befehle 'nimm', 'gib' und 'vor' nicht uneinge­
-schränkt ausführbar. Aus diesem Grunde sind noch die
-folgenden #on("u")#Basistests#off("u")# definiert:
-
-#on("u")#vorn frei#off("u")#
- testet, ob die vor ihm liegende Kachel frei ist.
-
-#on("u")#korn da / werkstueck da#off("u")#
- testet, ob auf der Kachel, auf der er steht, mindestens
- ein Korn/Werkstück liegt.
-
-#on("u")#backen leer /behaelter leer#off("u")#
- testet, ob kein Korn/Werkstück in den Backentaschen/im
- Behälter ist.
-
- Darüberhinaus können Sie bei der Installation des
-Systems noch festlegen, ob die folgenden #on("u")#Zusatztests#off("u")# zur
-Verfügung stehen sollen oder nicht:
-
-#on("u")#links frei#off("u")#
- testet, ob die Kachel links neben ihm frei ist.
-
-#on("u")#rechts frei#off("u")#
- testet, ob die Kachel rechts neben ihm frei ist.
-
-#on("u")#hinten frei#off("u")#
- testet, ob die Kachel hinter ihm frei ist.
-
-#on("u")#korn vorn / werkstueck vorn#off("u")#
- testet, ob auf der Kachel vor ihm mindestens ein Korn/
- Werkstück liegt.
-
-#on("u")#korn links / werkstueck links#off("u")#
- testet, ob auf der Kachel links neben ihm mindestens
- ein Korn/ Werkstück liegt.
-
-#on("u")#korn rechts / werkstueck rechts#off("u")#
- testet, ob auf der Kachel rechts neben ihm mindestens
- ein Korn/Werkstück liegt
-
-#on("u")#korn hinten / werkstueck hinten#off("u")#
- testet, ob auf der Kachel hinter ihm mindestens ein
- Korn/Werkstück liegt.
-
- Es gibt #on("u")#keinen#off("u")# Testbefehl, mit dem überprüft werden
-kann, ob der Rand der Ebene erreicht ist.
-
-
-2.2.2 Landschaftsgestaltung/Arbeitsfeldgestaltung
-
- Der Benutzer kann selber Landschaften/Arbeitsfelder
-erstellen, auf denen Herbert bzw. Robbi bewegt werden
-kann. Es können aber auch fertige Ebenen verändert wer­
-den.
- Eine Landschaft/ein Arbeitsfeld ist eine Ebene aus
-23 x 40 Kacheln. Eine Kachel kann auf dem Bildschirm so
-aussehen:
-
- Leere Kachel : Blank und Punkt (" .")
- Kornkachel : Blank und kleines o (" o")
- Hindernis : zwei Nummernzeichen ("\#\#")
-
- In dieser Landschaft steht auf einer der Kacheln Her­
-bert bzw. Robbi:
-
- "A" mit Blickrichtung nach oben
- ">" mit Blickrichtung nach rechts
- "V" mit Blickrichtung nach unten
- "<" mit Blickrichtung nach links
-
-
-#on("u")#Beispiel:#off("u")# Ausschnitt aus einer Landschaft:
-
-#on("b")#
- . . . . . . . . . . . . . . . . . . . .
- . . o o o o o o o o o o . . . . . . . .
- . . o . . . . . . . . o . . . . . . . .
- . . o . . . . . . . . o . . . . . . . .
- . o o .\#\#\#\#\#\#\#\#\#\#\#\# . o . . . . . . . .
- . o . .\#\# .V. . .\#\# . o o o o o o o . .
- . o . .\#\# . o . .\#\# . . . . . . . o . .
- . o o o o o o . .\#\# . . . o o o o o . .
- . . . .\#\# . . . .\#\# . . . o . . . . . .
- . . . .\#\# . . . .\#\# . . . o o o o . . .
- . . . .\#\#\#\#\#\#\#\#\#\#\#\# . . . . . . o o . .
- . . . . . . . . . . . . . . . . . . . .
-
-Während der Landschaftsgestaltung wirken folgende
-Tasten:
-
-<h> halt, beende die Landschafts-/Arbeitsfeld­
- gestaltung
-<\#> setze ein Hindernis und gehe ein Feld
- weiter
-<LEERTASTE> leere das Feld und gehe ein Feld weiter
-<g> lege hier ein Korn/Werkstück ab
-<n> nimm ein Korn/Werkstück auf (falls hier
- welche liegen)
-<z> zeige, wie viele Körner/Werkstücke hier
- liegen
-<k> ersetze diese Landschaft/diese Arbeitsfeld
- durch die Kopie einer bereits vorhandenen
- anderen Landschaft/eines bereits vorhan­
- denen anderen Arbeitsfeldes
-
-- Durch Drücken der Fragezeichentaste (<?>) während der
- Landschafts-/Arbeitsfeldgestaltung, können Sie sich
- diese Hinweise auch auf dem Bildschirm einblenden
- lassen.
-
-- Mit den Pfeiltasten kann Herbert/Robbi bewegt und
- seine Richtung verändert werden.
-
-- Die Landschaftsgestaltung wird durch Tippen der
- Taste <h> abgeschlossen. Die Position und die Blick­
- richtung, die Herbert bzw. Robbi zu diesem Zeitpunkt
- innehat, wird als Startposition vermerkt.
-
-- Auf dem Bildschirm wird dann noch die Zahl der Kör­
- ner/Werkstücke erfragt, die Herbert bzw.Robbi zu Be­
- ginn des Laufes in seinen Backentaschen/in seinem
- Behälter haben soll. Hier muß eine Zahl zwischen 0 und
- 32767 eingegeben werden.
-
-
-2.3 Einsatzbereich
-
- Das Hamster-/Roboter-Modell soll dazu dienen, die
-Grundelemente des algorithmischen Problemlösens (Folge,
-Auswahl, Wiederholung etc.) #on("u")#einfach#off("u")# und #on("u")#spielerisch#off("u")# zu
-erlernen und sie in der Programmiersprache ELAN zu co­
-dieren. In der Bildschirmdarstellung erinnert das Ham­
-ster-/Roboter-Modell zunächst an ein einfaches Tele­
-spiel, eine Anwendung des Computers, die sicher bekannt
-ist. Darüberhinaus lassen sich leicht Bezüge zur Steue­
-rung von Industrierobotern herstellen.
- Durch die komfortable Benutzerschnittstelle wird dem
-Anwender in der Anfangsphase eine Auseinandersetzung
-mit dem Betriebssystem "erspart". Die Arbeit mit dem Mo­
-dell setzt #on("u")#keine Vorerfahrungen und Kenntnisse#off("u")# voraus.
-Das Modell ist schon nach weniger als einer halben Stun­
-de für den Anfänger überschaubar. Er kann dann schon
-Aufgaben lösen, sich selbst Aufgaben stellen bzw. die
-gegebene Aufgabenstellung erweitern.
- Das Modell zielt auf die Aktivierung des Lernenden
-und die Mitarbeit in allen Punkten: Aufgabenstellung,
-Lösungsgestaltung, Lösungstest und -verifizierung. Der
-Lernfortschritt kann in stärkerem Maße als im "herkömm­
-lichen Programmierunterricht" von den Lernenden selbst
-bestimmt werden. Der spielerische Anfang, die Veran­
-schaulichung der Programmausführung auf dem Bild­
-schirm, die Möglichkeit Fehler direkt und eigenständig
-zu erkennen, fördern die Motivation, die Kreativität und
-die Fehler- und Frustrationstoleranz.
-
-
-2.4 Hinweise für den Einsatz in der Ausbildung
-
- Das Hamster-/Roboter-Modell ist angelegt für "Pro­
-grammieren" mit Bleistift und (kariertem) Papier. Für die
-Ãœberlegungen, die anzustellen sind, ist der Computer
-selbst in der Anfangsphase #on("u")#nicht notwendig#off("u")#. Man kann
-Kachel-Landschaften / Kachel-Arbeitsfelder aufzeich­
-nen und vorgegebene oder sich selbst gestellte Aufgaben
-lösen. Die erstellten Programme werden ausgeführt, indem
-man z.B. eine kleine Büroklammer als Hamster/Roboter auf
-dem Papier oder der Folie dem Programm entsprechend ver­
-schiebt. Heftzwecken oder Pfennigstücke können als Kör­
-ner/ Werkstücke und Streichholzstücke als Hindernisse
-dienen.
- #on("b")#gs-Herbert und Robbi#off("b")# verfügt auch über die Möglich­
-keit, den Hamster/Roboter interaktiv zu steuern. Auch
-hierüber ist ein Einstieg in den Umgang mit dem Modell
-möglich. Bei der interaktiven Steuerung kann der Ham­
-ster/Roboter von Hand durch Tastendruck auf dem Bild­
-schirm bewegt werden. Dabei können nur die vier Basisbe­
-fehle ('vor', 'links um', 'nimm' und 'gib') verwendet werden.
-Während der Steuerung von Hand wird ein "Protokoll" der
-ausgeführten Befehle angelegt - und zwar gleich in Form
-eines ablauffähigen ELAN-Programms. Dadurch hat der
-Benutzer einerseits die Möglichkeit, die Anweisungen, die
-durch Tastendruck gegeben wurden, zu kontrollieren,
-andererseits kann anschließend die Folge der eingegebe­
-nen Anweisungen auch als Programm vom Computer ausge­
-führt werden ('Teach in').
-
- Nach diesem "ersten Kennenlernen des Modells" sollte
-man dann aber bei Problemstellungen, die ein systemati­
-sches Vorgehen erfordern, die Arbeit mit dem Computer
-unterbrechen und die Algorithmen jeweils auf dem Papier
-entwerfen. Auf die Ausführung der erstellten Anwei­
-sungsfolgen von Hand auf Papier/Folie sollte man #on("u")#auf
-keinen Fall gänzlich verzichten#off("u")# - auch, um den Lernen­
-den zu verdeutlichen, daß die Befehlsfolgen sowohl vom
-"Prozessor Mensch" als auch vom "Prozessor Computer"
-ausgeführt werden können; der Computer also nur ein
-Hilfswerkzeug ist.
- Erst wenn das Bilden eigener benannter Anweisungen
-(Refinements/Prozeduren) den Lernenden hinreichend ver­
-traut ist, ist es sinnvoll, umfangreichere Problemstel­
-lungen anzugehen. Da dann auch die Programmausführung
-von Hand mühsam wird und ihren Reiz verliert, sollte man
-(wieder) zum Computermodell übergehen, um mit dessen Hil­
-fe die Programme auszuführen und zu überprüfen.
- Nachdem die Lernenden die Basisbefehle sicher beherr­
-schen und eigene benannte Anweisungen unter Verwendung
-der Basisbefehle konstruieren können, können dann nach
-und nach die vorgegebenen Tests und damit auch die ande­
-ren Elemente der Algorithmenentwicklung (Auswahl, Wie­
-derholung etc.) in den Unterricht eingebracht werden.
- Als notwendig hat es sich erwiesen, von Anfang an auf
-eine saubere Strukturierung und Modularisierung der
-Algorithmen zu achten. Gerade Lernende mit "Program­
-miererfahrung" neigen dazu, möglichst "kurze" Program­
-me schreiben zu wollen. Besonderen Wert sollten Sie auf
-eine treffende Namensgebung der einzelnen Module legen,
-selbst wenn die Lernenden das oft als "lästige Schreibar­
-beit" empfinden. Aufgaben können ein Einzel-, Partner-
-und Gruppenarbeit bearbeitet werden. Dabei hat sich die
-Arbeit in kleinen Gruppen als besonders effektiv erwie­
-sen. Die Lernenden sind untereinander zumeist sehr kri­
-tisch und fordern sich gegenseitig auf, "lesbare" Pro­
-gramme zu schreiben. Ein Austausch der Programme unter
-den Gruppen kann diesen Anspruch noch zusätzlich för­
-dern.
-
-
-2.5 Aufgabenmaterial
-
- Zum Hamster-Roboter-Modell sind inzwischen eine Rei­
-he von Aufgaben / Aufgabensystemen enstanden. An dieser
-Stelle soll auf zwei Veröffentlichungen hingewiesen
-werden, in denen Sie solche Aufgaben / Aufgabensysteme
-finden können:
-
-Weber, Wolfgang et al., Das Hamster-/Roboter-Modell,
- in: Landesinstitut für Schule und Weiterbildung
- (Hrsg.), Materialien zur Lehrerfortbildung in
- Nordrhein-Westfalen, Heft 1, Neue Technologien
- - Informations- und Kommunikationstechnologi­
- sche Inhalte im Wahlpflichtunterricht der Klas­
- sen 9/10, Soest, 1986
-
-Ambros, Wolfgang, Der Hamster, Programmieren lernen in
- einer Modellwelt, J.B. Metzlersche Verlagsbuch­
- handlung, Stuttgart, 1987
-
-
-2.6 Erfahrungen mit dem Hamster-/Roboter-Modell
-
- Seit 1982 wird das Hamster - Modell in der GMD zur
-Programmierausbildung eingesetzt. Die Ergebnisse sind
-hervorragend: Die Teilnehmer bewältigen in derselben
-Zeit erheblich mehr Inhalte als früher ohne Modell. Moti­
-vation, Selbständigkeit und Initiative prägen sich er­
-heblich früher und merklich stärker aus. Außerdem sind
-die am Modell erworbenen Kenntnisse tiefer und sicherer.
- Seit 1983 wird das Hamster - Modell auch in mehreren
-Schulen mit sehr gutem Erfolg eingesetzt. Der Erfolg ist
-am größten im Blockunterricht (3 - 5 Tage z.B. in Projekt­
-wochen, Schullandheimaufenthalten etc.). Aber auch im
-stundenweisen Unterricht wird das Hamster-/Roboter-
-Modell mit gutem Erfolg eingesetzt.
- Beide Zugänge, der Einstieg über das Arbeiten mit
-Bleistift und Papier und der Einstieg über die interakti­
-ve Steuerung des Hamsters/Roboters, haben sich als prak­
-tikabel erwiesen. Der Zugang über die interaktive Steue­
-rung bietet den Vorteil, die zumeist sehr hohe Motivation
-der Lernenden, "endlich mit dem Computer arbeiten zu
-können", auszunutzen. Sie lernen dabei das Computermo­
-dell auf einfache Weise kennen und haben einen ersten
-Umgang mit Bildschirm und Tastatur. Kleine, einfache
-Problemstellungen können von ihnen durch die interak­
-tive Steuerung schnell und sicher bearbeitet werden.
-"Nebenbei" lernen sie, neben der Wirkung der Basisbefeh­
-le, durch das mitgeführte Protokoll auch die Codierung
-in der Programmiersprache kennen. Allerdings verliert
-die interaktive Steuerung relativ schnell ihren Reiz,
-wenn die Lernenden erkennen, daß nur sehr einfache Pro­
-blemstellungen damit bearbeitet werden können. Dann
-sollte aber zur Arbeit mit Papier und Bleistift überge­
-gangen werden.
- Die Entscheidung, ganz auf das Arbeiten mit Papier
-und Bleistift zu verzichten, hat sich als sehr nachteilig
-erwiesen. Die Lernenden "hacken" die Programme in die
-Maschine und handeln eher nach dem "Prinzip von Versuch
-und Irrtum" als nach sorgfältigen Überlegungen. Bei
-komplexeren Problemstellungen scheitern diese Teilneh­
-mer zumeist.
- Erfahrungsgemäß nimmt nach einiger Zeit der Wunsch
-stark zu, eigene Ausgaben auf dem Bildschirm zu erzeugen
-und andere Problembereiche zu bearbeiten (zum "richtigen
-Programmieren" überzugehen). Sie sollten diesen Schritt
-dann auch nicht zu lange hinauszögern und das Modell
-auf keinen Fall überstrapazieren. Da das Modell selbst
-und auch der Umgang damit sehr einfach ist, besteht auch
-später die Möglichkeit, zum Modell zurückzukehren, um
-hieran weitere Elemente der Algorithmenentwicklung in
-einfacher und anschaulicher Form einzuführen.
-
-
diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 3 b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 3
deleted file mode 100644
index c34b752..0000000
--- a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 3
+++ /dev/null
@@ -1,199 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (17)#
-#headodd#
-#center#gs-Herbert und Robbi#right#%
-
-#end#
-#headeven#
-%#center#gs-Herbert und Robbi
-
-#end#
-#center#3
-
-#center#Installation
-#center#von
-#center#gs-Herbert und Robbi
-
-
- Bevor Sie #on("b")#gs-Herbert und Robbi#off("b")# auf Ihrem Computer
-benutzen können, müssen Sie das Programm zunächst in­
-stallieren. Wenn #on("b")#gs-Herbert und Robbi#off("b")# auf Ihrem System
-schon zur Verfügung steht, können Sie dieses Kapitel
-ruhig überspringen.
-
-
-3.1 Voraussetzungen
-
- Um #on("b")#gs-Herbert und Robbi#off("b")# auf Ihrem Computer betreiben
-zu können, muß das EUMEL-Betriebssystem installiert
-sein. #on("b")#gs-Herbert und Robbi#off("b")# setzt die Multi-User-Version
-voraus und ist lauffähig ab Version 1.7.5. #on("b")#gs-Herbert und
-Robbi#off("b")# setzt weiterhin voraus, daß auf Ihrem Computer
-bereits das Programm #on("b")#gs-DIALOG#off("b")# installiert ist.
-
-
-3.2 Lieferumfang
-
- #on("b")#gs-Herbert und Robbi#off("b")# wird auf einer Diskette gelie­
-fert, die alle notwendigen Programme enthält (die Instal­
-lation von #on("b")#gs-DIALOG#off("b")# wird dabei vorausgesetzt!). Um den
-Inhalt der Diskette feststellen zu können, starten Sie
-Ihr System und bringen es dazu, daß 'gib kommando:' er­
-scheint. Dann legen Sie die Diskette ein und geben das
-Kommando:
-
-archive("gs-Herbert und Robbi");list(archive);
-release(archive) <RETURN>
-
- Anschließend erscheint eine Übersicht der auf dem
-Archiv vorhandenen Programme. Folgende Programme soll­
-ten sich in der Ãœbersicht befinden:
-
- "gs-Herbert und Robbi 1"
- "gs-Herbert und Robbi 2"
- "gs-Herbert und Robbi 3"
- "gs-MENUKARTE:Herbert und Robbi"
- "gs-Herbert und Robbi/gen"
-
- Eventuell können noch weitere Namen auf der Diskette
-vorhanden sein. Wenn Sie den Inhalt der Diskette kon­
-trolliert haben und diese Programme auf der Diskette
-vorhanden sind, können Sie #on("b")#gs-Herbert und Robbi#off("b")# instal­
-lieren.
- Sollten Sie statt der Ãœbersicht eine Fehlermeldung
-erhalten, überprüfen Sie bitte, ob die Diskette das rich­
-tige Format besitzt oder ob Ihr Diskettenlaufwerk Pro­
-bleme macht. Sollten dagegen Programme fehlen, so rekla­
-mieren Sie die Diskette.
-
-
-3.3 Installation
-
- #on("b")#gs-Herbert und Robbi#off("b")# muß in einer Task installiert
-werden, in der bereits das Programm #on("b")#gs-DIALOG#off("b")# zur Ver­
-fügung steht. Alle Söhne und Enkel der neuen Task kön­
-nen anschließend das Hamster-/ Roboter-Modell aufrufen.
-Richten Sie also eine Task als Sohn der Task ein, in der
-auf Ihrem Computer bereits #on("b")#gs-DIALOG#off("b")# installiert ist. Wir
-nehmen hier an, daß #on("b")#gs-DIALOG#off("b")# in der Task 'MENU' instal­
-liert ist und die neue Task den Namen 'HAMSTER' erhalten
-soll. (Sie können für die Task auch einen beliebigen an­
-deren Namen wählen):
-
-#on("b")#
- <SV> (Supervisor - Taste)
-
-#off("b")#
- --> gib supervisor kommando:
-#on("b")#
- begin ("HAMSTER","MENU") <RETURN>
-#off("b")#
-
- --> gib kommando:
-
- (Arbeiten mehrere Personen mit dem Computer, dann ist
-es sinnvoll, diese Task vor unbefugtem Zugriff durch ein
-Passwort zu schützen. Wie das gemacht wird, können Sie in
-Ihrem EUMEL-Benutzerhandbuch erfahren.)
-
- Legen Sie dann die Archivdiskette ein, auf der sich
-#on("b")#gs-Herbert und Robbi#off("b")# befindet, und geben Sie das folgen­
-de Kommando:
-
-#on("b")#
- archive("gs-Herbert und Robbi") <RETURN>
-
- fetch("gs-Herbert und Robbi/gen",archive) <RETURN>
-
- run <RETURN>
-#off("b")#
-
- Sie haben damit das Generatorprogramm gestartet.
-Zunächst werden Sie gefragt, ob Sie den erweiterten Be­
-fehlssatz (mit Zusatztests) für den Hamster und Roboter
-zur Verfügung gestellt haben möchten. Beantworten Sie
-diese Frage je nach Wunsch mit 'ja' oder 'nein' durch Tip­
-pen der Taste <j> bzw. <n>.
- Daraufhin wird die Installation automatisch durchge­
-führt. Lassen Sie während des gesamten Vorgangs die Ar­
-chivdiskette eingelegt. Die Generierung ist beendet, wenn
-der EUMEL-Eingangsbildschirm erscheint. Die Task, in der
-die Generierung stattfindet, wird automatisch zur Mana­
-gertask, das heißt, daß Söhne von ihr eingerichtet werden
-können.
- Richten Sie sich gleich eine Sohntask (z.B mit dem Na­
-men 'hamster1') ein, dann können Sie das System sofort
-ausprobieren. Gehen Sie dazu folgendermaßen vor:
-
-#on("b")#
- <SV> (Supervisor - Taste)
-
-#off("b")#
- --> gib supervisor kommando:
-#on("b")#
- begin ("hamster1","HAMSTER") <RETURN>
-#off("b")#
-
- --> gib kommando:
-
-
-Mit dem Kommando
-
-#center##on("b")#hamster <RETURN> bzw. roboter <RETURN>#off("b")#
-
-rufen Sie nun das
-
-#center#Hamster-Modell bzw. Roboter-Modell
-
-auf.
-
-
-3.4 Direktstart des Modells
- (Steht erst ab gs-DIALOG Version 1.1 zur Verfügung)
-
- In Kapitel 3.3 haben wir Ihnen gezeigt, wie sie eine
-Sohntask einrichten und hier durch das Kommando 'ham­
-ster' bzw. 'roboter' das System aufrufen können. Wenn Sie
-immer nur mit einer Modellvariante arbeiten oder vor dem
-Benutzer die 'gib kommando:'-Ebene verbergen wollen,
-können Sie das System auch so einrichten, daß sich sofort
-nach Einrichten des Arbeitsbereichs das Menusystem mel­
-det. Für den Anfänger kann das die Arbeit durchaus er­
-leichtern.
- Gehen Sie dazu in die Task, unterhalb der die Sohntasks
-eingerichtet werden sollen:
-
-#on("b")#
- <SV> (Supervisor - Taste)
-
-#off("b")#
- --> gib supervisor kommando:
-#on("b")#
- continue ("HAMSTER") <RETURN>
-#off("b")#
-
- --> gib kommando:
-#on("b")#
- direktstart ("hamster", TRUE) <RETURN>
-#off("b")#
-
- Durch das Kommando haben Sie festgelegt, daß sich
-alle Sohntasks direkt mit dem Hamstermenu melden. Möch­
-ten Sie lieber mit dem Roboter-Modell arbeiten, ist nur
-'hamster' durch 'roboter' zu ersetzen.
- Durch den zweiten Parameter 'TRUE' legen Sie fest, daß
-in den Sohntasks nach Verlassen des Menus die jeweilige
-Task automatisch gelöscht wird. Statt 'TRUE' können Sie
-hier auch den Wert 'FALSE' eintragen. Dann wird nach Ver­
-lassen des Menus angefragt, ob die Task gelöscht werden
-soll. Wird die Frage bejaht, wird gelöscht - sonst wird die
-Task abgekoppelt (break) und kann durch 'continue' wieder
-angekoppelt werden.
- Anmerkung: In der Task, in der Sie das Kommando
-'direktbefehl' gegeben haben, sollte nicht das Kommando
-'monitor' gegeben werden, da Sie durch dieses Kommando
-auch diese Task zu einer Task machen, die sich direkt mit
-dem Menu meldet und ggf. bei Verlassen des Menus automa­
-tisch gelöscht wird!
-
diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 4 b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 4
deleted file mode 100644
index 4f2d79a..0000000
--- a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 4
+++ /dev/null
@@ -1,1312 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (22)#
-#headodd#
-#center#gs-Herbert und Robbi#right#%
-
-#end#
-#headeven#
-%#center#gs-Herbert und Robbi
-
-#end#
-#center#4
-
-#center#Beschreibung
-#center#der
-#center#Menufunktionen
-
-
- Nach Aufruf meldet sich #on("b")#gs-Herbert und Robbi mit
-#on("u")#einem#off("u")# der folgenden Menus:
-
-
-#on("b")#
-HAMSTER: Info Landschaft Programm Lauf Archiv
-+---------------------------+--------------------------------------------
-| l Landschaftsgestaltung |
-| b Befehlsvorrat |
-| s Steuerung des Laufs |
-+---------------------------+
-
-
-
-
-
-
-
-
-
-
-
-
--------------------------------------------------------------------------
-Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
-#off("b")#
-
-#on("u")#oder#off("u")#
-
-#on("b")#
-ROBOTER: Info Arbeitsfeld Programm Lauf Archiv
-+----------------------------+--------------------------------------------
-| a Arbeitsfeldgestaltung |
-| b Befehlsvorrat |
-| s Steuerung des Laufs |
-+----------------------------+
-
-
-
-
-
-
-
-
-
-
-
-
---------------------------------------------------------------------------
-Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
-#off("b")#
-
- Beide Varianten sind, wie schon gesagt, analog auf­
-gebaut. Aus diesem Grunde werden wir uns in den folgen­
-den Ausführungen auf die Beschreibung der Hamster -
-Variante beschränken.
-
-
-4.1 Kurzhinweise zur Bedienung des Menus
-
- Die Bedienung des Menus ist sehr einfach. Eine aus­
-führliche Beschreibung dazu finden Sie in den Unterla­
-gen zum Programmsystem #on("b")#gs-DIALOG#off("b")#. An dieser Stelle sol­
-len nur die wesentlichen Bedienungsvorgänge beschrieben
-werden.
-
-- Mit der Tastenfolge <ESC><?> können Sie sich Informa­
- tionen zur Bedienung des Menusystems in das Menu
- einblenden lassen
-
-- Mit den Pfeiltasten <rechts> und <links> können Sie
- zwischen den "Oberbegriffen" in der Kopfzeile wählen.
- Der aktuelle Oberbegriff ist jeweils invers darge­
- stellt. Das ausgeklappte 'Pull-Down-Menu' bezieht sich
- auf diesen invers dargestellten Oberbegriff.
-
-- Mit den Pfeiltasten <hoch> und <runter> können Sie
- zwischen den Menufunktionen wählen, die Ihnen im
- aktuellen Pull-Down-Menu zur Auswahl angeboten
- werden. Die aktuell angewählte Menufunktion wird
- jeweils invers dargestellt. Die Trennlinien, die in
- einigen Pull-Down-Menus sichtbar sind, dienen nur
- der optischen Untergliederung; sie können nicht an­
- gewählt werden und werden deshalb automatisch über­
- sprungen. Die einzelnen Menupunkte sind "zyklisch
- miteinander verknüpft", das heißt, man gelangt vom
- untersten Menupunkt wieder zum obersten und umge­
- kehrt. Menupunkte, vor denen ein Minuszeichen steht
- ('-'), sind (zur Zeit) nicht aktivierbar; auch sie können
- nicht angewählt werden und werden einfach über­
- sprungen.
-
-- Durch Tippen der Fragezeichentaste (<?>) können Sie
- sich jeweils zur aktuellen Menufunktion (invers im
- Pull-Down-Menu) Informationen in das Menu einblen­
- den lassen.
-
-- Um eine Menufunktion ausführen zu lassen, bewegen
- Sie sich mit den Pfeiltasten auf die gewünschte Menu­
- funktion im aktuellen Pull-Down-Menu und tippen
- dann die <RETURN>-Taste. Steht vor dem gewünschten
- Menupunkt ein einzelner Buchstabe oder eine Ziffer,
- so kann durch Tippen der entsprechenden Taste diese
- Menufunktion dadurch direkt aufgerufen werden. So­
- bald eine Menufunktion aufgerufen worden ist, er­
- scheint davor ein Stern ('*'). Daraus können Sie ent­
- nehmen, daß das System bereits den Auftrag ausführt.
-
-- An verschiedenen Stellen werden Fragen an Sie ge­
- richtet, die Sie mit 'ja' oder 'nein' beantworten müssen.
- Tippen Sie dazu entsprechend der Entscheidung die
- Taste <j> (für 'ja') bzw. <n> (für 'nein').
-
-- Werden Ihnen vom Menu aus Dateinamen zur Auswahl
- angeboten, so können Sie den auf dem Bildschirm
- sichtbaren Pfeil vor den gewünschten Namen positio­
- nieren. Mit den Tasten <x> oder <RETURN> können Sie
- den Namen ankreuzen. Ist die Auswahl mehrerer Datein­
- amen möglich, so können Sie den Vorgang wiederholen.
- Mit den Tasten <o> oder <RUBOUT> können Sie auch ein
- Kreuz vor einem Namen wieder löschen. Daneben gibt es
- noch einige Tastenfunktionen, die für die Bedienung
- recht hilfreich sein können. Tippen Sie während der
- Auswahl die Fragezeichentaste (<?>), so werden Ihnen
- alle Bedienungsmöglichkeiten auf dem Bildschirm an­
- gezeigt. Eine Auswahl, in der mehrere Dateien ange­
- kreuzt werden dürfen, wird durch die Tastenfolge
- <ESC><q> verlassen. Anschließend wird die eingestellte
- Operation mit den angekreuzten Dateien ausgeführt.
- Sind Sie versehentlich in eine solche Auswahl ge­
- langt, so können Sie den Vorgang durch die Tasten­
- kombination <ESC><h> abbrechen.
-
-- An einigen Stellen werden Sie aufgefordert, eine Ein­
- gabe zu machen (z.B. einen Dateinamen einzugeben). Wird
- Ihnen hier ein Vorschlag gemacht, den Sie akzeptieren,
- so brauchen Sie zur Bestätigung nur die <RETURN>-
- Taste zu tippen. Gefällt Ihnen der Vorschlag nicht
- oder wird Ihnen kein Vorschlag gemacht, so machen Sie
- bitte die gewünschte Eingabe. Zum Schreiben stehen
- Ihnen alle aus dem Editor bekannten Funktionen zur
- Verfügung. Mit der Taste <RUBOUT> können Sie Buch­
- staben löschen, mit <RUBIN> einfügen. Die Eingabe wird
- durch Tippen der <RETURN>-Taste abgeschlossen. Ist
- der von Ihnen gewünschte Name schon in Ihrer Task
- vorhanden und steht in der Fußzeile der Hinweis 'Zei­
- gen: <ESC><z>', dann können Sie sich auch alle vorhan­
- denen Namen zur Auswahl anbieten lassen und durch
- Ankreuzen den beabsichtigten Namen auswählen.
-
-- Ihnen können auch mehrere Alternativen angeboten
- werden, zwischen denen Sie wählen müssen. In der un­
- tersten Zeile eines solchen Kastens, in denen Ihnen die
- Alternativen auf dem Bildschirm eingeblendet werden,
- sind die Möglichkeiten aufgeführt, die darüber be­
- schrieben sind. Mit den Pfeiltasten können sie die
- Markierung auf die gewünschte Alternative positio­
- nieren und dann durch die <RETURN>-Taste zur Aus­
- führung bringen. (Manchmal ist das auch durch Tippen
- der den Alternativen vorangestellten Buchstaben oder
- Ziffern möglich).
-
-- Durch die Tastenfolge <ESC><q> kann das Menu insge­
- samt verlassen werden. Damit das nicht versehentlich
- geschieht, wird jeweils die Frage gestellt, ob Sie das
- Menu tatsächlich verlassen wollen. Diese Frage beant­
- worten Sie bitte je nach Wunsch mit 'ja' oder 'nein'
- durch Tippen der Tasten <j> bzw. <n>.
-
-#page#
-4.2 Menufunktionen zum Oberbegriff 'Info'
-
- Das auf dem Bildschirm sichtbare Pull-Down-Menu ist
-oben abgebildet.
-
-#on("u")##on("b")#l Landschaftsgestaltung (a Arbeitsfeldgestaltung)#off("b")##off("u")#
- Mit dieser Funktion können Sie sich alle Tasten,
- die bei der Landschafts-/Arbeitsfeldgestaltung
- wirksam sind, anzeigen lassen.
- In der Anzeige wird die jeweilige Tastenfunktion
- erläutert. Während der Landschafts-/Arbeitsfeld­
- gestaltung können Sie sich diese Informationen
- durch Tippen der Fragezeichentaste (<?>) ebenfalls
- einblenden lassen.
-
-#on("u")##on("b")#b Befehlsvorrat#off("b")##off("u")#
- Mit dieser Funktion können Sie sich die Befehle,
- die Ihnen vom jeweiligen Modell zur Verfügung ge­
- stellt werden, auf dem Bildschirm anzeigen lassen.
- Anhand dieser Informationen können Sie auch
- feststellen, ob in dem System, das Ihnen zur Verfü­
- gung steht, der "eingeschränkte" oder "erweiterte"
- Befehlssatz hinsichtlich der Tests realisiert ist.
-
-#on("u")##on("b")#s Steuerung des Laufs#off("b")##off("u")#
- Mit dieser Funktion können Sie sich die Möglich­
- keiten anzeigen lassen, wie Sie auf einen Hamster-
- /Roboterlauf durch Tastendruck Einfluß nehmen
- können:
-
- <ESC> : beende den Lauf (Programmabbruch
- durch Tastendruck)
- <?> : zeige diese Information (während des
- Programmablaufs!)
-
- 0 : Einzelschritt (dazu beliebige Taste
- drücken)
- 1 : geringste Geschwindigkeit
- 9 : höchste Geschwindigkeit
- 2 ... 8 : dazwischenliegende Geschwindigkeiten
-
- <+> : laufe schneller
- <-> : laufe langsamer
-
- Zu Beginn eines Laufes ist die Geschwindigkeit '5'
- eingestellt.
-#page#
-4.3 Menufunktionen zum Oberbegriff 'Landschaft'(Ar­
- beitsfeld)
-
-#on("b")#
-HAMSTER: Info Landschaft Programm Lauf Archiv
-----------+--------------------+------------------------------------------
- | n Neu erstellen |
- | a Ansehen/Ändern |
- | ---------------- |
- | v Verzeichnis |
- | ---------------- |
- | l Löschen |
- | d Drucken |
- | ---------------- |
- | k Kopieren |
- | u Umbenennen |
- +--------------------+
-
-
-
-
-
---------------------------------------------------------------------------
-Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
-#off("b")#
-
-#on("u")##on("b")#n Neu erstellen#off("b")##off("u")#
- Mit dieser Funktion können Sie eine neue Land­
- schaft/ein neues Arbeitsfeld unter einem neuen
- Namen anlegen und gestalten.
- Sie werden zunächst nach einem Namen für die
- #on("u")#neue#off("u")# Landschaft/das #on("u")#neue#off("u")# Arbeitsfeld gefragt. Ge­
- ben Sie einen beliebigen Namen (#on("u")#ohne Anführungs­
- zeichen (!)#off("u")# und #on("u")#ohne das Präfix 'Flaeche:' (!)#off("u")#) ein und
- schließen Sie die Eingabe durch <RETURN> ab. Dar­
- aufhin wird Ihnen auf dem Bildschirm eine leere
- Landschaft/ein leeres Arbeitsfeld angeboten.
- Sollte schon eine Landschaft/ein Arbeitsfeld
- mit diesem Namen in der Task vorhanden sein, so
- werden Sie darauf aufmerksam gemacht. Sie können
- sich während der Landschaftsgestaltung auch je­
- derzeit eine Aufstellung der wirksamen Tasten mit
- Beschreibung der Funktionen auf den Bildschirm
- ausgeben lassen. Drücken Sie dazu die Fragezeichen­
- taste (<?>).
-
- Fehlerfälle:
- - Eine Landschaft/ein Arbeitsfeld mit dem vorge­
- schlagenen Namen existiert schon.
-
-#on("u")##on("b")#a Ansehen/Ändern#off("b")##off("u")#
- Mit dieser Funktion können Sie schon in Ihrer
- Task existierende Landschaften/Arbeitsfelder zur
- Ansicht oder zur Ãœberarbeitung anfordern.
- Sie werden zunächst gefragt, ob Sie #on("u")#die zuletzt
- bearbeitete Landschaft#off("u")#/#on("u")#das zuletzt bearbeitete Ar­
- beitsfeld#off("u")# ansehen bzw. verändern möchten (sofern
- Sie schon vorher mit dem Modell in der Task gear­
- beitet haben).
- Bejahen Sie diese Frage, dann wird Ihnen diese
- Landschaft/dieses Arbeitsfeld zur Bearbeitung
- angeboten. Verneinen Sie die Frage dagegen, so ge­
- langen Sie in die 'Auswahl' (d.h es werden Ihnen alle
- Landschaften/Arbeitsfelder in der Task zur Auswahl
- angeboten). Nachdem Sie einen der Namen angekreuzt
- haben, wird Ihnen die ausgewählte Landschaft/das
- ausgewählte Arbeitsfeld zur Bearbeitung auf dem
- Bildschirm angeboten. Ihnen stehen die Tastenfunk­
- tionen wie bei der Neuerstellung zur Verfügung.
-
- Fehlerfälle:
- - In der Task existiert noch keine Landschaft/kein
- Arbeitsfeld.
-
-#on("u")##on("b")#v Verzeichnis#off("b")##off("u")#
- Mit dieser Funktion können Sie sich einen Über­
- blick über die in Ihrer Task vorhandenen Land­
- schaften/Arbeitsfelder verschaffen.
- Nach Aufruf dieser Funktion wird eine Liste der
- Landschaften/Arbeitsfelder auf dem Bildschirm
- ausgegeben, die sich in Ihrer Task befinden. Da die
- Liste selbst eine Datei ist, kann Sie mit der Tasten­
- kombination <ESC><q> verlassen werden - hierauf
- wird auch in der Kopfzeile der Datei hingewiesen.
- Falls nicht alle Namen auf den Bildschirm passen,
- können Sie das Fenster mit <HOP><runter> und
- <HOP><hoch> verschieben.
-
-#on("u")##on("b")#l Löschen#off("b")##off("u")#
- Mit dieser Funktion können Sie Landschaften/
- Arbeitsfelder, die Sie nicht mehr benötigen, die
- unnötig Platz belegen, löschen. Aber Vorsicht! Die
- Landschaften/Arbeitsfelder verschwinden durch
- diese Funktion unwiederbringlich!
- Nach Aufruf dieser Funktion werden Ihnen alle
- Landschaften/Arbeitsfelder, die sich in Ihrer Task
- befinden, zur Auswahl angeboten. Hier können Sie
- die gewünschten Namen ankreuzen. Die Auswahl wird
- dann durch die Tastenfolge <ESC><q> verlassen.
- Für jede einzelne Landschaft/jedes einzelne Ar­
- beitsfeld wird noch einmal zur Sicherheit gefragt,
- ob sie/es auch tatsächlich gelöscht werden soll. Zur
- Bestätigung tippen Sie bitte die Taste <j> ('ja') - zur
- Verhinderung <n> ('nein').
-
- Fehlerfälle:
- - In der Task exsitiert noch keine Landschaft/
- kein Arbeitsfeld.
-
-#on("u")##on("b")#d Drucken#off("b")##off("u")#
- Mit dieser Funktion können Sie Landschaften/
- Arbeitsfelder über einen angeschlossenen Drucker
- ausgeben lassen.
- Nach Aufruf dieser Funktion werden Ihnen alle
- Landschaften/Arbeitsfelder, die sich in Ihrer Task
- befinden, zur Auswahl angeboten. Hier können Sie
- die gewünschten Namen ankreuzen. Die Auswahl wird
- dann durch die Tastenfolge <ESC><q> verlassen.
- Die angekreuzten Landschaften/Arbeitsfelder
- werden anschließend zum Drucker geschickt. Der
- Vorgang wird auf dem Bildschirm protokolliert.
-
- Fehlerfälle:
- - In der Task existiert noch keine Landschaft/
- kein Arbeitsfeld.
- - Der Drucker ist nicht funktionsbereit.
- - Der Drucker wird nicht über die Task 'PRINTER'
- betrieben.
- - Auf Ihrem System werden die Druckkosten abge­
- rechnet. Sie müssen sich mit einer Codenummer
- identifizieren.
-
-#on("u")##on("b")#k Kopieren#off("b")##off("u")#
- Mit dieser Funktion können Sie sich eine Kopie
- einer/eines bereits in der Task vorhandenen Land­
- schaft/Arbeitsfeldes anlegen. Das ist z.B. dann
- sinnvoll, wenn Sie sich einen bestimmten 'Stand'
- aufbewahren wollen oder wenn Sie eine Land­
- schaft/ein Arbeitsfeld gestalten wollen, das einem
- bereits vorhandenen ähnelt.
- Nach Aufruf dieser Funktion werden Ihnen alle
- Landschaften/Arbeitsfelder, die sich in Ihrer Task
- befinden, zur Auswahl angeboten. Nach Ankreuzen
- eines Namens wird die Auswahl automatisch verlas­
- sen.
- Anschließend wird der angekreuzte Name ange­
- zeigt und der Name für die Kopie erfragt. Es muß ein
- Name eingetragen werden, der in dieser Task noch
- nicht für eine Landschaft/ein Arbeitsfeld verge­
- ben wurde - ansonsten erfolgt ein Hinweis darauf
- und es wird nicht kopiert!
- Da man aber oft für die Kopie einen ähnlichen
- Namen wie für das Original wählt, wird der 'alte'
- Name vorgeschlagen. Aus genannten Gründen muß er
- aber verändert werden. Sie können diesen Namen mit
- den üblichen Editierfunktionen verändern oder mit
- <HOP><RUBOUT> löschen und ganz neu eingeben. Sie
- sparen aber eine Menge Tipparbeit, wenn Sie einen
- langen Namen nur an einer Stelle ändern wollen.
-
- Fehlerfälle:
- - Eine Landschaft/ein Arbeitsfeld mit dem ge­
- wünschten Namen existiert bereits in der Task.
-
-#on("u")##on("b")#u Umbenennen#off("b")##off("u")#
- Mit dieser Funktion können Sie einer bereits
- vorhandenen Landschaft/einem bereits vorhandenen
- Arbeitsfeld einen neuen Namen geben.
- Nach Aufruf dieser Funktion werden Ihnen alle
- Landschaften/Arbeitsfelder, die sich in Ihrer Task
- befinden, zur Auswahl angeboten. Nach Ankreuzen
- eines Namens wird die Auswahl automatisch verlas­
- sen.
- Anschließend wird dieser Name angezeigt und der
- zukünftige Name für die Landschaft/das Arbeitsfeld
- erfragt. Es muß ein Name eingetragen werden, der in
- dieser Task noch nicht für eine Landschaft/ein Ar­
- beitsfeld vergeben wurde - ansonsten erfolgt ein
- Hinweis darauf und die Landschaft/das Arbeitsfeld
- wird nicht umbenannt!
- Da man aber oft den 'neuen' Namen in Anlehnung
- an den 'alten' Namen wählt, wird der 'alte' Name vor­
- geschlagen. Aus genannten Gründen muß er aber
- verändert werden. Sie können diesen Namen mit den
- üblichen Editierfunktionen verändern oder mit
- <HOP><RUBOUT> löschen und ganz neu eingeben. Sie
- sparen aber eine Menge Tipparbeit, wenn Sie einen
- langen Namen nur an einer Stelle ändern wollen.
-
- Fehlerfälle:
- - Eine Datei mit dem gewünschten Namen existiert
- bereits in der Task.
-#page#
-4.4 Menufunktionen zum Oberbegriff 'Programm'
-
-#on("b")#
-HAMSTER: Info Landschaft Programm Lauf Archiv
----------------------+--------------------+-------------------------------
- | n Neu erstellen |
- | a Ansehen/Ändern |
- | ---------------- |
- | v Verzeichnis |
- | ---------------- |
- | l Löschen |
- | d Drucken |
- | ---------------- |
- | k Kopieren |
- | u Umbenennen |
- +--------------------+
-
-
-
-
-
---------------------------------------------------------------------------
-Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
-#off("b")#
-
-#on("u")##on("b")#n Neu erstellen#off("b")##off("u")#
- Mit dieser Funktion können Sie eine neue Pro­
- grammdatei anlegen und beschreiben.
- Sie werden zunächst nach einem Namen für die
- #on("u")#neue#off("u")# Programmdatei gefragt. Geben Sie einen belie­
- bigen Namen (#on("u")#ohne Anführungszeichen (!)#off("u")#) ein und
- schließen Sie die Eingabe durch <RETURN> ab. Dar­
- aufhin wird Ihnen auf dem Bildschirm eine neue Da­
- tei zum Beschreiben angeboten.
- Sollte schon eine Programmdatei mit diesem Na­
- men in der Task vorhanden sein, so werden Sie dar­
- auf aufmerksam gemacht.
- Sie können sich während des Schreibens die
- wichtigsten Tastenfunktionen des Editers einblen­
- den lassen. Tippen Sie dazu die Tastenfolge <ESC><?>.
- Es erscheint dann das folgende Angebot aus dem Sie
- auswählen können:
-
- #on("b")#
- +--------------------------------------------------+
- | Der EUMEL - Editor |
- | |
- | b ... Beschreibung des Editors |
- | w ... Wichtige Tasten |
- | p ... Positionieren der Schreibmarke |
- | k ... Korrigieren im Text (Einfügen/Löschen) |
- | m ... Markierte Textpassagen bearbeiten |
- | l ... Lernen im Editor |
- | a ... Anweisungen im Editor (Kommandodialog) |
- | |
- | z ... Zurück in den Schreibmodus |
- | |
- | b w p k m l a z |
- +--------------------------------------------------+
-#off("b")#
-
- Fehlerfälle:
- - Eine Datei mit dem vorgeschlagenen Namen exi­
- stiert schon.
-
-#on("u")##on("b")#a Ansehen/Ändern#off("b")##off("u")#
- Mit dieser Funktion können Sie sich Dateien, die
- schon in Ihrer Task existieren, ansehen oder auch
- verändern.
- Sie werden zunächst gefragt, ob Sie #on("u")#die zuletzt
- bearbeitete Programmdatei#off("u")# ansehen bzw. verändern
- möchten (sofern Sie schon vorher mit dem Modell in
- der Task gearbeitet haben).
- Bejahen Sie diese Frage, dann wird Ihnen diese
- Programmdatei zur Bearbeitung angeboten. Vernei­
- nen Sie die Frage dagegen, so gelangen Sie in die
- 'Auswahl' (d.h es werden Ihnen alle Programmdateien
- in der Task zur Auswahl angeboten). Nachdem Sie
- einen der Namen angekreuzt haben, wird Ihnen die
- ausgewählte Programmdatei zur Bearbeitung auf dem
- Bildschirm angeboten.
-
- Fehlerfälle:
- - In der Task existiert noch keine Programmdatei.
-
-#on("u")##on("b")#v Verzeichnis#off("b")##off("u")#
- Mit dieser Funktion können Sie sich einen Über­
- blick über die in Ihrer Task vorhandenen Programm­
- dateien verschaffen.
- Nach Aufruf dieser Funktion wird eine Liste der
- Programmdateien auf dem Bildschirm ausgegeben, die
- sich in Ihrer Task befinden. Da die Liste selbst eine
- Datei ist, kann Sie mit der Tastenkombination
- <ESC><q> verlassen werden - hierauf wird auch in
- der Kopfzeile der Datei hingewiesen. Falls nicht
- alle Namen auf den Bildschirm passen, können Sie
- das Fenster mit <HOP><runter> und <HOP><hoch> ver­
- schieben.
-
-#on("u")##on("b")#l Löschen#off("b")##off("u")#
- Mit dieser Funktion können Sie Programmdateien,
- die Sie nicht mehr benötigen, die unnötig Platz be­
- legen, löschen. Aber Vorsicht! Die Programmdateien
- verschwinden durch diese Funktion unwieder­
- bringlich!
- Nach Aufruf dieser Funktion werden Ihnen alle
- Programmdateien, die sich in Ihrer Task befinden,
- zur Auswahl angeboten. Hier können Sie die ge­
- wünschten Namen ankreuzen. Die Auswahl wird dann
- durch die Tastenfolge <ESC><q> verlassen.
- Für jede einzelne Programmdatei wird noch ein­
- mal zur Sicherheit gefragt, ob sie auch tatsächlich
- gelöscht werden soll. Zur Bestätigung tippen Sie
- bitte die Taste <j> ('ja') - zur Verhinderung <n>
- ('nein').
-
- Fehlerfälle:
- - In der Task exsitiert noch keine Programmdatei
-
-#on("u")##on("b")#d Drucken#off("b")##off("u")#
- Mit dieser Funktion können Sie Programmdateien
- über einen angeschlossenen Drucker ausgeben las­
- sen.
- Nach Aufruf dieser Funktion werden Ihnen alle
- Programmdateien, die sich in Ihrer Task befinden,
- zur Auswahl angeboten. Hier können Sie die ge­
- wünschten Namen ankreuzen. Die Auswahl wird dann
- durch die Tastenfolge <ESC><q> verlassen.
- Die angekreuzten Programmdateien werden an­
- schließend zum Drucker geschickt. Der Vorgang wird
- auf dem Bildschirm protokolliert.
-
- Fehlerfälle:
- - In der Task existiert noch keine Programmdatei.
- - Der Drucker ist nicht funktionsbereit.
- - Der Drucker wird nicht über die Task 'PRINTER'
- betrieben.
- - Auf Ihrem System werden die Druckkosten abge­
- rechnet. Sie müssen sich mit einer Codenummer
- identifizieren.
-
-#on("u")##on("b")#k Kopieren#off("b")##off("u")#
- Mit dieser Funktion können Sie sich eine Kopie
- einer bereits in der Task vorhandenen Programmda­
- tei anlegen. Das ist z.B. dann sinnvoll, wenn Sie sich
- einen bestimmten 'Stand' aufbewahren wollen oder
- wenn Sie ein Programm schreiben wollen, das einem
- bereits vorhandenen ähnelt.
- Nach Aufruf dieser Funktion werden Ihnen alle
- Programmdateien, die sich in Ihrer Task befinden,
- zur Auswahl angeboten. Nach Ankreuzen eines Na­
- mens wird die Auswahl automatisch verlassen.
- Anschließend wird der angekreuzte Name ange­
- zeigt und der Name für die Kopie erfragt. Es muß ein
- Name eingetragen werden, der in dieser Task noch
- nicht für eine Programmdatei vergeben wurde; an­
- sonsten erfolgt ein Hinweis darauf und es wird
- nicht kopiert!
- Da man aber oft für die Kopie einen ähnlichen
- Namen wie für das Original wählt, wird der 'alte'
- Name vorgeschlagen. Aus genannten Gründen muß er
- aber verändert werden. Sie können diesen Namen mit
- den üblichen Editierfunktionen verändern oder mit
- <HOP><RUBOUT> löschen und ganz neu eingeben. Sie
- sparen aber eine Menge Tipparbeit, wenn Sie einen
- langen Namen nur an einer Stelle ändern wollen.
-
- Fehlerfälle:
- - Eine Programmdatei mit dem gewünschten Namen
- existiert bereits in der Task.
-
-#on("u")##on("b")#u Umbenennen#off("b")##off("u")#
- Mit dieser Funktion können Sie einer bereits
- vorhandenen Programmdatei einen neuen Namen ge­
- ben.
- Nach Aufruf dieser Funktion werden Ihnen alle
- Programmdateien, die sich in Ihrer Task befinden,
- zur Auswahl angeboten. Nach Ankreuzen eines Na­
- mens wird die Auswahl automatisch verlassen.
- Anschließend wird dieser Name angezeigt und der
- zukünftige Name für die Programmdatei erfragt. Es
- muß ein Name eingetragen werden, der in dieser Task
- noch nicht für eine Programmdatei vergeben wurde -
- ansonsten erfolgt ein Hinweis darauf und die Pro­
- grammdatei wird nicht umbenannt!
- Da man aber oft den 'neuen' Namen in Anlehnung
- an den 'alten' Namen wählt, wird der 'alte' Name vor­
- geschlagen. Aus genannten Gründen muß er aber
- verändert werden. Sie können diesen Namen mit den
- üblichen Editierfunktionen verändern oder mit
- <HOP><RUBOUT> löschen und ganz neu eingeben. Sie
- sparen aber eine Menge Tipparbeit, wenn Sie einen
- langen Namen nur an einer Stelle ändern wollen.
-
- Fehlerfälle:
- - Eine Programmdatei mit dem gewünschten Namen
- existiert bereits in der Task.
-#page#
-4.5 Menufunktionen zum Oberbegriff 'Lauf'
-
-#on("b")#
-HAMSTER: Info Landschaft Programm Lauf Archiv
----------------------------+------------------------+---------------------
- | l Lauf nach Programm |
- | h Handsteuerung |
- +------------------------+
-
-
-
-
-
-
-
-
-
-
---------------------------------------------------------------------------
-Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
-#off("b")#
-
-#on("u")##on("b")#l Lauf nach Programm#off("b")##off("u")#
- Mit dieser Menufunktion können Sie den Ham­
- ster/Roboter nach einem Programm in einer Land­
- schaft/einem Arbeitsfeld laufen lassen. Sowohl das
- Programm als auch die Landschaft/das Arbeitsfeld
- müssen bereits existieren.
- Sie werden zunächst gefragt, ob der Hamster/
- Roboter #on("u")#das zuletzt bearbeitete Programm#off("u")# ausführen
- soll. Bejahen Sie die Frage, so wird dieses Programm
- ausgeführt; verneinen Sie die Frage dagegen, so
- gelangen Sie in die 'Auswahl'. Nach Ankreuzen des
- gewünschten Programmnamens wird das ausgewählte
- Programm ausgeführt.
- Nach der Abfrage bezüglich des Programmnamens
- erfolgt dann eine weitere Abfrage nach dem Namen
- der Landschaft/ des Arbeitsfeldes, in der/dem der
- Hamster/Roboter nach dem zuvor ausgewählten Pro­
- gramm laufen soll. Auch hier werden Sie zunächst
- gefragt, ob Sie #on("u")#die zuletzt benutzte Landschaft/das
- zuletzt benutzte Arbeitsfeld#off("u")# verwenden möchten.
- Bejahen Sie die Frage, so wird das Programm in
- dieser Landschaft/in diesem Arbeitsfeld ausge­
- führt; verneinen Sie dagegen die Frage, so werden
- Ihnen alle in der Task vorhandenen Landschaften/
- Arbeitsfelder zur Auswahl angeboten. Durch An­
- kreuzen eines Landschafts-/Arbeitsfeldnamens wird
- die betreffende Landschaft/das betreffende Ar­
- beitsfeld ausgewählt und das Programm in dieser
- Landschaft/in diesem Arbeitsfeld ausgeführt.
- Daneben haben Sie auch die Möglichkeit, im Pro­
- gramm selbst als erste Anweisung den Befehl 'lands­
- chaft ("Name");' oder 'arbeitsfeld ("Name");' anzuge­
- ben. Für 'Name' muß dann natürlich der gewünschte
- Landschafts-/Arbeitsfeldname eingetragen sein. Ist
- eine solche Anweisung #on("u")#am Programmanfang#off("u")# vorhan­
- den, so wird an Sie #on("u")#keine#off("u")# Abfrage bezüglich des
- Landschafts-/Arbeitsfeldnamens gestellt; das Pro­
- gramm wird in der #on("u")#angegebenen#off("u")# Landschaft/im #on("u")#ange­
- gebenen#off("u")# Arbeitsfeld ausgeführt.
- Sind im Programm noch Fehler enthalten, so wer­
- den das Programm und die Fehlermeldungen gleich­
- zeitig auf dem Bildschirm dargestellt (Paralleledi­
- tor) und zur Korrektur angeboten. Für die Pro­
- grammkorrektur stehen ebenfalls alle Editorfunk­
- tionen zur Verfügung.
- Während des Hamster-/Roboterlaufs können Sie
- durch Tastendruck Einfluß nehmen (Geschwindigkeit
- verändern, Programm abbrechen etc). Sehen Sie dazu
- auch die Menufunktion 's Steuerung des Laufs' unter
- dem Oberbegriff 'Info'. Standardmäßig beginnt ein
- solcher Lauf immer mit einer mittleren Geschwin­
- digkeit.
- Ist der Hamster-/Roboterlauf ohne Fehler been­
- det worden, werden Sie gefragt, ob Sie die Land­
- schaft/das Arbeitsfeld in dem zuletzt angezeigten
- Zustand aufbewahren wollen. Bejahen Sie diese Fra­
- ge, so wird die Landschaft/das Arbeitsfeld in eine
- Datei geschrieben. Die neue Landschaft/das neue
- Arbeitsfeld erhält den Namen der alten Land­
- schaft/des alten Arbeitsfeldes und das Zusatzkenn­
- zeichen '.x'.
- Sollte Ihnen beim Programmieren ein Fehler un­
- terlaufen sein (z.B. eine Endlosschleife, so kann mit
- der Taste <ESC> der Hamster-/Roboterlauf abgebro­
- chen werden ("Notbremse").
-
-#on("u")##on("b")#h Handsteuerung#off("b")##off("u")#
- Mit dieser Funktion können Sie den Hamster/
- Roboter in einer/einem vorbereiteten Landschaft/
- Arbeitsfeld durch Tasten steuern. Alle gültigen
- Tastenbefehle werden in einem Protokoll festgehal­
- ten. Da das entstehende Protokoll ein ELAN-
- Programm ist, kann der Hamster/Roboter anschlie­
- ßend die gleichen Aktionen anhand des Programms
- wiederholt ausführen ('Teach In').
- Sie werden zunächst gefragt, ob die Land­
- schaft/das Arbeitsfeld, in dem der Hamster/Roboter
- gesteuert werden soll, schon existiert. Beantworten
- Sie die Frage mit 'nein', so werden Sie aufgefordert,
- zunächst die Landschaft/das Arbeitsfeld zu gestal­
- ten. Bejahen Sie die Frage, werden Ihnen alle in Ih­
- rer Task vorhandenen Landschaften/Arbeitsfelder
- zur Auswahl angeboten. Sie brauchen nur die ge­
- wünschte Landschaft/das gewünschte Arbeitsfeld
- anzukreuzen. Die/das angekreuzte Landschaft/Ar­
- beitsfeld erscheint dann in folgender Darstellung
- auf dem Bildschirm:
-
-#on("b")#
-#on("u")#Beispiel#off("u")#:
-
- <v>or <l>inks um <n>imm <g>ib <p>rotokoll <e>nde
-. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-. . . . . . . . . . . . V . . . . . . . . . . . . . . . . . . . . .
-. . . . . . . . . . . . o\#\# o . . . . . . . . . . . . . . . . . . .
-. . . . . . . . . . . . .\#\# . . . . . . . . . . . . . . . . . . . .
-. . . . . . . . . . . . o\#\# . . . . . . . . . . . . . . . . . . . .
-. . . . . . . . . . . . .\#\# o . . . o . . . . . . . . . . . . . . .
-. . . . . . . . . . . . o\#\#\#\#\#\#\#\#\#\#\#\# o . . . . . . . . . . . . . .
-. . . . . . . . . . . . . . o . o .\#\# . . . . . . . . . . . . . . .
-. . . . . . . . . . . . . . . . . o\#\# . . . . . . . . . . . . . . .
-. . . . . . . . . . . . . . . . . .\#\# . . . . . . . . . . . . . . .
-. . . . . . . . . . . . . . . . . o\#\#o. . . . . . . . . . . . . . .
-. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-Gib Hamster-Befehl: letzter Befehl:
-
-#off("b")#
- Durch Tastendruck können Sie nun den Hamster/
- Roboter steuern (<v> - vor, <l> - links um, <n> -
- nimm, <g> - gib). Sofern die Aktion ausführbar ist,
- wird sie auf dem Bildschirm auch ausgeführt. Wird
- dagegen eine Aktion verlangt, die nicht ausgeführt
- werden kann (z.B. <v>, wenn der Hamster/Roboter
- direkt vor einem Hindernis steht), so erscheint eine
- entsprechende Fehlermeldung in der untersten Zeile
- des Bildschirms. Nach einer kurzen Pause können
- dann weitere Eingaben gemacht werden. Eine Fehlbe­
- dienung führt also #on("u")#nicht#off("u")# zu einem Programmabbruch!
- In der untersten Bildschirmzeile wird auch jeweils
- der letzte Befehl zur Kontrolle angezeigt.
- Alle korrekten Eingaben werden protokolliert.
- Durch Drücken der Taste <p> (- protokoll) können Sie
- sich jederzeit das während der Ausführung angeleg­
- te Protokoll zeigen lassen. Es entsteht nämlich
- automatisch im Hintergrund ein ablauffähiges
- ELAN-Programm. Im Anschluß an eine solche Hand­
- steuerung können Sie den Hamster/Roboter dann in
- der gleichen Landschaft/im gleichen Arbeitsfeld
- nach diesem Protokoll (Dateiname: PROTOKOLL) vom
- Programm aus gesteuert laufen lassen.
-#page#
-4.6 Menufunktionen zum Oberbegriff 'Archiv'
-
-#on("b")#
-HAMSTER: Info Landschaft Programm Lauf Archiv
----------------------------------+-------------------------+--------------
- | r Reservieren |
- | - Neue Diskette |
- | --------------------- |
- | - Schreiben |
- | - Checken |
- | - Kombination |
- | - Holen/Lesen |
- | - Löschen |
- | --------------------- |
- | - Verzeichnis |
- | - Drucken |
- | --------------------- |
- | i Initialisieren |
- | z Zieltask einstellen |
- +---------------------+ +-------------------------+
- | Dateiaustausch mit: |
- | Archiv |
- | Archivname: |
- | --- |
- +---------------------+
---------------------------------------------------------------------------
-Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
-#off("b")#
-
- In diesem Kapitel werden alle die Menufunktionen be­
-schrieben, die Ihnen unter dem Oberbegriff 'Archiv' im
-Menu angeboten werden. Mit den Funktionen in diesem
-Menu können Sie aber nicht nur Dateien auf dem Archiv
-behandeln, sondern auch in anderen Tasks im Multi-
-User-System oder über das EUMEL-Netz sogar auf anderen
-Rechnern!
- Wenn Sie dieses Pull-Down-Menu gerade aufgeschlagen
-haben, sind nicht alle Funktionen aktivierbar! Um weitere
-Funktionen zu aktivieren, muß erst einer der aktivierba­
-ren Menupunkte gewählt werden.
- Bei der Archivbehandlung werden Ihnen jeweils alle in
-der Task vorhandenen Dateien zur Auswahl angeboten. Das
-System unterscheidet nicht von sich aus - wie unter den
-Oberbegriffen 'Landschaft'/'Arbeitsfeld' und 'Programm' -
-zwischen Landschaften/Arbeitsfeldern und Programmda­
-teien. In den hier gezeigten Listen können Sie aber Land­
-schaften/Arbeitsfelder daran erkennen, daß ihnen das
-Präfix 'Flaeche:' vorangestellt ist.
-
-#on("u")##on("b")#r Reservieren#off("b")##off("u")# (des Archivlaufwerks)
- Im EUMEL-Multi-User-System haben normalerwei­
- se mehrere Personen das Zugriffsrecht auf das Ar­
- chivlaufwerk. Allerdings muß der Zugriff so gere­
- gelt werden, daß sich die Beteiligten dabei nicht
- gegenseitig "in die Quere kommen". Ein Zugriff auf
- das Archivlaufwerk erfordert zunächst eine Anmel­
- dung. Ist diese Anmeldung erfolgt, kann von den an­
- deren Beteiligten so lange nicht mehr auf das Lauf­
- werk zugegriffen werden - bis es wieder freigege­
- ben worden ist.
- Diese Anmeldung des Archivlaufwerkes erfolgt
- über die Menufunktion 'r Reservieren'. Greift be­
- reits eine andere Task auf das Laufwerk zu, so er­
- halten Sie darüber einen Hinweis auf dem Bild­
- schirm. Ansonsten wird an Sie die Frage gestellt, ob
- die Diskette eingelegt und das Laufwerk geschlos­
- sen ist.
- Erst zu diesem Zeitpunkt ist sichergestellt, daß
- Sie den alleinigen Zugriff auf das Laufwerk haben.
- Deshalb sollten Sie, wenn Sie mit mehreren Personen
- am Computer arbeiten, erst zum Zeitpunkt der Frage­
- stellung die Diskette ins Laufwerk einlegen.
- Nachdem Sie die Diskette eingelegt und die Frage
- bejaht haben, ermittelt das System selbständig den
- Namen der eingelegten Diskette, zeigt den Namen auf
- dem Bildschirm (im kleinen Kasten links unten) an
- und aktiviert die anderen Menupunkte des Pull-
- Down-Menus.
- Beim Verlassen des Pull-Down-Menus, wenn eine
- andere Zieltask eingestellt wird oder wenn das Menu
- gänzlich verlassen wird, wird die Reservierung au­
- tomatisch aufgehoben!
-
- Fehlerfälle:
- - Das Laufwerk ist von einer anderen Task belegt.
- - Die Diskette ist falsch eingelegt oder das Lauf­
- werk ist nicht richtig geschlossen.
- - Die Diskette ist nicht formatiert bzw. initiali­
- siert.
- - Die Diskette kann nicht gelesen werden (keine
- EUMEL-Diskette, Diskette hat ein falsches For­
- mat, Diskette ist verschmutzt...).
-
-#on("u")##on("b")#n Neue Diskette#off("b")##off("u")# (anmelden)
- Der Dateiaustausch mit einer Diskette ist nur
- dann möglich, wenn der im System eingestellte Dis­
- kettenname (auf dem Bildschirm im kleinen Kasten
- unten links sichtbar) mit dem tatsächlichen Namen
- der Diskette übereinstimmt. Nach einem Disketten­
- wechsel ist das aber in der Regel nicht mehr der
- Fall. Greift man dann auf die neu eingelegte Dis­
- kette zu, so erscheint die Fehlermeldung: 'Falscher
- Archivname! Bitte neue Diskette anmelden!'.
- Das Anmelden einer neuen Diskette - ohne einen
- neuen Reserviervorgang - wird durch diese Menu­
- funktion ermöglicht. Nach Aktivieren dieses Menu­
- punktes wird der Name der eingelegten Diskette er­
- mittelt, im System eingestellt und auf dem Bild­
- schirm angezeigt.
- Im Gegensatz zur Menufunktion 'r Reservieren'
- greift das System ohne Anfrage an den Benutzer auf
- das Archivlaufwerk zu (die Reservierung bleibt ja
- bestehen). Ist das Archivlaufwerk reserviert, so ist
- die Neuanmeldung einer Diskette über diese Menu­
- funktion weniger zeitaufwendig.
-
- Fehlerfälle:
- - wie unter 'r Reservieren'.
-
-#on("u")##on("b")#s Schreiben#off("b")##off("u")# (Kopieren)
- Alle Dateien der eigenen Task werden zur Aus­
- wahl angeboten. Wenn Sie die Auswahl durch die
- Tastenfolge <ESC><q> verlassen, überprüft das Sy­
- stem zunächst, ob die Dateien in der eingestellten
- Zieltask schon vorhanden sind. Ist das der Fall,
- wird erfragt, ob die dort vorhandenen Dateien über­
- schrieben, d.h. gelöscht werden dürfen (s.u.). An­
- schließend werden alle angekreuzten Dateien in der
- Reihenfolge, in der Sie sie angekreuzt haben, in die
- eingestellte Zieltask kopiert. Der Vorgang wird auf
- dem Bildschirm protokolliert. Die Originaldateien
- in der eigenen Task bleiben dabei erhalten.
- Wenn in der Zieltask schon eine Datei existiert,
- die den gleichen Namen hat wie eine Datei, die Sie
- dorthin kopieren möchten, so wird angefragt, ob die
- vorher schon existierende Datei überschrieben (ge­
- löscht!) werden soll. Bejahen Sie diese Frage, so wird
- die bereits in der Zieltask existierende Datei (un­
- wiederbringlich) gelöscht und die gewünschte Datei
- dorthin transportiert. Ein Überschreiben aus Ver­
- sehen ist nicht möglich, wenn Sie die an Sie gestell­
- te Frage sorgfältig beantworten.
- Verneinen Sie die Frage, so wird die Datei auch
- nicht hinübertransportiert! Sie können die Datei
- aber umbenennen (Menufunktion 'u Umbenennen' un­
- ter den Oberbegriffen 'Landschaft'/Arbeitsfeld' bzw.
- 'Programm') und anschließend mit anderem Namen
- hinüberschreiben.
- Beachten Sie, daß beim Überschreiben einer Datei
- auf einer Archivdiskette der Speicherplatz der al­
- ten (überschriebenen) Version im allgemeinen nicht
- wiederverwendet werden kann. In einem solchen Fall
- könnte die Diskette voll geschrieben werden, obwohl
- eigentlich genügend Platz vorhanden wäre. Zur Op­
- timierung wird deshalb zuerst überprüft, ob die
- angekreuzten Dateien schon in der Zieltask vorhan­
- den sind und löscht diese, wenn Sie Ihr Einver­
- ständnis geben. Erst anschließend werden die Datei­
- en insgesamt kopiert.
- Normalerweise ist als Zieltask das Archivlauf­
- werk der eigenen Station eingestellt. Mit der Menu­
- funktion 'z Zieltask einstellen' kann diese Einstel­
- lung aber verändert werden.
-
- Fehlerfälle:
- - Die Diskette ist falsch eingelegt oder beschä­
- digt.
- - Die Diskette kann nicht beschrieben werden
- (Schreibfehler).
- - Die Diskette ist voll.
- - Sehen Sie auch unter 'r Reservieren'
- 'z Zieltask einstellen'.
-
-#on("u")##on("b")#c Checken#off("b")##off("u")#
- Diese Menufunktion kann nur ausgeführt werden,
- wenn der Dateiaustausch mit einem Archiv(manager)
- erfolgt - ansonsten ist diese Menufunktion auch
- nicht aktivierbar. Die Menufunktion dient dazu, auf
- Diskette geschriebene Dateien auf Lesefehler hin zu
- prüfen. Es empfiehlt sich, diese Prüfroutine auf
- neu auf die Diskette geschriebene Dateien anzuwen­
- den. Sehen Sie dazu auch 'k Kombination'.
- Alle Dateien der eingestellten Zieltask (Archiv)
- werden zur Auswahl angeboten. Wenn Sie die Auswahl
- durch die Tastenfolge <ESC><q> verlassen, werden
- alle angekreuzten Dateien in der Reihenfolge, in
- der Sie sie angekreuzt haben, "gecheckt", d.h. auf
- Lesefehler hin überprüft. Der Vorgang wird auf dem
- Bildschirm protokolliert.
-
- Fehlerfälle:
- - Lesefehler auf dem Archiv.
- - Sehen Sie auch unter 'r Reservieren'.
-
-#on("u")##on("b")#k Kombination#off("b")##off("u")#
- Diese Menufunktion ist eine Kombination aus den
- beiden Menufunktionen 's Schreiben' und 'c Checken'
- (Sehen Sie weitere Informationen auch dort!).
- Alle Dateien der eigenen Task werden zur Aus­
- wahl angeboten. Wenn Sie die Auswahl durch die Ta­
- stenfolge <ESC><q> verlassen, werden alle ange­
- kreuzten Dateien in der Reihenfolge, in der Sie sie
- angekreuzt haben, in die eingestellte Zieltask ko­
- piert (gegebenenfalls müssen bereits vorhandene
- Dateien gleichen Namens in der Zieltask gelöscht
- werden). Anschließend werden alle Dateien, die gera­
- de geschrieben wurden, gecheckt, d.h. auf Lesefehler
- hin untersucht. Beide Vorgänge werden auf dem
- Bildschirm protokolliert.
- Da die 'Check' - Operation nur bei Archivmana­
- gern zulässig ist, ist diese Menufunktionen eben­
- falls nur bei Archivmanagern aktivierbar. Zur Er­
- läuterung sehen Sie bitte auch unter 'z Zieltask
- einstellen'.
-
-#on("u")##on("b")#h Holen/Lesen#off("b")##off("u")#
- Die Menufunktion dient dazu, Dateien, die bereits
- auf einer Archivdiskette oder in einer anderen Task
- existieren, in die eigene Task zu kopieren.
- Alle Dateien der eingestellten Zieltask werden
- zur Auswahl angeboten. Anschließend werden Kopien
- der angekreuzten Dateien in der Reihenfolge des
- Ankreuzens in die eigene Task geholt. Das Original
- in der Zieltask bleibt dabei unverändert! Der Vor­
- gang wird auf dem Bildschirm protokolliert.
- Sind in der eigenen Task schon Dateien mit glei­
- chem Namen vorhanden, so wird gefragt, ob die 'al­
- ten' Dateien überschrieben (gelöscht) werden dürfen.
- Nur wenn Sie zustimmen, werden die in Ihrer Task
- existierenden Dateien (unwiederbringlich!) gelöscht
- und Kopien der gleichnamigen Dateien aus der Ziel­
- task angefertigt.
- Stimmen Sie dem Löschvorgang nicht zu, dann
- bleiben die bisherigen Dateien in Ihrer Task erhal­
- ten - die Dateien aus der Zieltask werden dann aber
- auch nicht in Ihre Task kopiert! Um dennoch die Ko­
- pien zu erhalten, können Sie die namensgleichen
- Dateien in Ihrer Task umbenennen und dann erst die
- Dateien aus der anderen Task anfordern.
- Normalerweise werden die Dateien vom Archiv der
- eigenen Station geholt. Mit dem Menupunkt 'z Ziel­
- task einstellen' kann diese Einstellung verändert
- werden.
-
- Fehlerfälle:
- - Lesefehler auf dem Archiv.
- - Sehen Sie auch unter 'r Reservieren'
- 's Schreiben'
- 'z Zieltask einstellen'.
-
-#on("u")##on("b")#l Löschen#off("b")##off("u")#
- Die Menufunktion dient dazu, Dateien in der
- Zieltask (unwiederbringlich!) zu löschen. Dazu wer­
- den alle Dateien der eingestellten Zieltask zur Aus­
- wahl angeboten. Anschließend werden die angekreuz­
- ten Dateien in der Reihenfolge ihres Ankreuzens
- gelöscht. Zur Sicherheit muß noch einmal für jede
- einzelne Datei bestätigt werden, daß sie auch tat­
- sächlich gelöscht werden soll.
- Beachten Sie, daß beim Löschen einer Datei auf
- einer Archivdiskette der Speicherplatz im allgemei­
- nen nicht wieder verwendet werden kann. In einem
- solchen Fall könnte die Diskette voll geschrieben
- werden, obwohl eigentlich genügend Platz vorhan­
- den wäre. Diese Probleme treten bei anderen Tasks,
- die keine Archivmanager sind, nicht auf, da deren
- Speicherplatz intelligenter verwaltet wird.
- Normalerweise ist als Zieltask das Archiv der
- eigenen Station eingestellt. Mit dem Menupunkt 'z
- Zieltask einstellen' kann diese Einstellung verän­
- dert werden.
-
- Fehlerfälle:
- - Sehen Sie auch unter 'r Reservieren'
- 's Schreiben'
- 'z Zieltask einstellen'.
-
-#on("u")##on("b")#v Verzeichnis#off("b")##off("u")#
- Mit dieser Menufunktion können Sie sich einen
- Überblick über die in der Zieltask (z.B. auf dem Ar­
- chiv) vorhandenen Dateien verschaffen.
- Nach Aufruf der Funktion wird eine Liste der
- Dateien auf dem Bildschirm ausgegeben, die sich in
- der Zieltask (z.B. auf dem Archiv) befinden. Ist die
- Zieltask ein Archiv(manager), so wird auch ange­
- zeigt, wieviel Platz auf der Diskette belegt ist. Da
- die Liste selbst eine Datei ist, kann sie mit der Ta­
- stenkombination <ESC><q> verlassen werden. Falls
- nicht alle Dateinamen auf den Bildschirm passen,
- können Sie das Fenster mit <HOP><hoch> und
- <HOP><runter> verschieben.
-
- Fehlerfälle:
- - Sehen Sie unter 'z Zieltask einstellen'.
-
-#on("u")##on("b")#d Drucken#off("b")##off("u")#
- Das Verzeichnis der Dateien in der Zieltask, das
- man mit der Menufunktion 'v Verzeichnis' auf dem
- Bildschirm angezeigt bekommt, kann mit dieser Me­
- nufunktion ausgedruckt werden.
- Zur Sicherheit wird angefragt, ob wirklich ein
- solches Dateiverzeichnis der Zieltask gedruckt wer­
- den soll. Bejaht man die Frage, so wird ein Dateiver­
- zeichnis erstellt und zum Drucker geschickt.
-
- Fehlerfälle:
- - Der Drucker ist nicht funktionsbereit.
- - Der Drucker wird nicht über die Task 'PRINTER'
- betrieben.
- - Auf Ihrem System werden die Druckkosten abge­
- rechnet. Sie müssen sich mit einer Codenummer
- identifizieren.
-
-#on("u")##on("b")#i Initialisieren#off("b")##off("u")#
- Diese Menufunktion gestattet es, frische Disket­
- ten zu formatieren, zu initialisieren bzw. be­
- schriebene Disketten vollständig zu löschen und
- ggf. dabei umzubenennen. Bei Aufruf dieser Menu­
- funktion wird - sofern noch nicht geschehen - das
- Archivlaufwerk automatisch reserviert.
- Wenn Sie eine fabrikneue Diskette aus der Ver­
- packung nehmen, müssen Sie diese zunächst #on("u")#forma­
- tieren#off("u")#. Dabei wird die Diskette auf ein festgelegtes
- physikalisches Format eingestellt. Ohne daß diese
- Operation vorausgegangen ist, kann eine Diskette
- weder beschrieben noch gelesen werden.
- Prinzipiell braucht eine Diskette nur ein einzi­
- ges Mal formatiert zu werden. Sie können Sie jedoch
- jederzeit wieder formatieren - z.B. wenn Sie Disket­
- ten haben, von denen Sie nicht genau wissen, für
- welche Zwecke sie zuvor verwendet wurden.
- Wenn Sie diese Menufunktion aktivieren, werden
- Sie so zunächst gefragt, ob Sie die Diskette auch
- formatieren wollen. Bejahen Sie die Frage, so werden
- Ihnen mehrere Formate zur Auswahl angeboten:
-
-#on ("b")#
- +------------------------------------+
- | Formatieren einer Diskette |
- | |
- | Dies sind die möglichen Formate: |
- | |
- | 1 ..... 40 Spur - 360 KB |
- | 2 ..... 80 Spur - 720 KB |
- | 3 ..... 5 1/4" - 1,2 MB |
- | 4 ..... 3 1/2" - 1,4 MB |
- | s ..... Standard - Format |
- | |
- | 1 2 3 4 s |
- +------------------------------------+
-#off("b")#
-
- Erkundigen Sie sich bei Ihrem Händler, welches
- Format Sie bei Ihrem Rechner und den von Ihnen
- verwendeten Disketten einstellen müssen. Manche
- Rechner unterstützen diese Operation innerhalb des
- EUMEL-Systems auch gar nicht, das Formatieren muß
- dann irgendwie anders außerhalb des EUMEL-Systems
- geschehen.
- Wenn Sie die Formatierung abgeschlossen oder
- auch übersprungen haben, beginnt die eigentliche
- Initialisierung der Diskette. Dabei wird als erstes
- der Archivname auf die Diskette geschrieben. Alle
- alten Daten, die sich ggf. auf der Diskette befinden,
- werden bei diesem Vorgang unwiederbringlich (!)
- gelöscht.
- Zur Sicherheit überprüft das System in jedem
- Falle, ob es sich um eine EUMEL - Diskette handelt,
- und erfragt Ihr Einverständnis, ob die Diskette
- wirklich initialisiert werden soll. Geben Sie hierzu
- Ihr Einverständnis, dann wird noch der (neue) Ar­
- chivname erfragt. Hatte die Diskette schon einen
- Namen, dann wird dieser zum Überschreiben angebo­
- ten. Wollen Sie den alten Archivnamen beibehalten,
- so brauchen Sie nur die <RETURN>-Taste zu tippen,
- ansonsten können Sie den Namen auch zuvor verän­
- dern oder einen ganz neuen Namen hinschreiben.
- Anhand des ausgegebenen Namens können Sie auch
- überprüfen, ob Sie die richtige Diskette eingelegt
- haben.
- Das Initialisieren funktioniert natürlich nur,
- wenn Sie als Zieltask einen Archivmanager einge­
- stellt haben - ansonsten ist diese Menufunktion
- gesperrt (nicht aktivierbar!).
-
- Fehlerfälle:
- - Formatieren ist nicht auf dem System möglich.
- - Sehen Sie auch unter 'r Reservieren'
- 'z Zieltask einstellen'.
-
-#on("u")##on("b")#z Zieltask einstellen#off("b")##off("u")#
- Mit dieser Menufunktion können Sie festlegen,
- mit welcher Zieltask Sie kommunizieren, d.h. z.B. Da­
- teien austauschen möchten. Normalerweise ist hier
- das Archiv am eigenen Rechner eingestellt. Das wird
- auch nach Aufklappen des Pull-Down-Menus im Ka­
- sten links unten angezeigt.
- Diese Menufunktion kann im Unterricht z.B. dazu
- genutzt werden, um fertiggestellte Hausaufgaben in
- eine bestimmte Task zu schicken (Vatertask) oder um
- von dort z.B. vorgefertigte Landschaften oder/und
- Programme abzuholen.
- Sie können aber auch eine andere Task einstellen
- (z.B. die Vatertask oder die Task 'PUBLIC'), um mit die­
- sen Dateien auszutauschen oder um sich auch nur ei­
- nen Überblick über die dort vorhandenen Dateien zu
- verschaffen. Wenn Sie mit Ihrem Rechner in ein
- EUMEL-Netz integriert sind, können Sie auch auf
- Tasks anderer Rechner zugreifen oder auch Disketten
- von Laufwerken anderer Rechner einlesen (z.B. wenn
- Sie Disketten anderer Formate haben, die von Ihrem
- Rechner nicht gelesen werden können).
- Dabei werden zwei Anforderungen an die Zieltask
- gestellt: Sie muß existieren und bereit für den Da­
- teiaustausch sein, d.h es muß eine Managertask sein,
- auf die Sie Zugriff haben. Versuchen Sie auf andere
- Tasks zuzugreifen, so erhalten Sie entsprechende
- (Fehler-)Meldungen.
- Zu beachten ist noch, daß es im EUMEL-System ver­
- schiedene Arten von Managertasks gibt - Archivma­
- nager und normale Dateimanager. Der Unterschied
- besteht darin, daß ein Archivmanager vom Benutzer
- vor dem Zugriff reserviert werden muß - anschlie­
- ßend hat nur dieser Benutzer (bis zur Aufgabe der
- Reservierung) ein Zugriffsrecht auf den Manager.
- Normale Dateimanager können dagegen von mehreren
- Benutzern in beliebiger Reihenfolge angesprochen
- werden.
- Ein Archivmanager kann auch auf bestimmte Dis­
- kettenformate spezialisert sein (z.B. auf das Lesen
- von DOS-Disketten). Manche Rechner haben auch meh­
- rere Archivmanager für verschiedene Laufwerke etc.
- Durch Einstellen unterschiedlicher Archivmanager
- können Sie dann auf verschiedenen Laufwerken ar­
- chivieren.
- Nach Aktivieren dieses Menupunktes werden Ihnen
- die folgenden Alternativen angeboten:
-
-#on ("b")#
- +-------------------------------------------+
- | Dateiaustausch gewünscht mit: |
- | |
- | a ... Archiv (Eigene Station) |
- | |
- | v ... Vatertask |
- | |
- | p ... 'PUBLIC' (Eigene Station) |
- | |
- | s ... Sonstige Task |
- | |
- | |
- | Archiv Vatertask PUBLIC Sonstige |
- +-------------------------------------------+
-
- Da der Dateiaustausch mit dem Standardarchiv
- der eigenen Station (Task: 'ARCHIVE'), mit der Vater­
- task und der Task 'PUBLIC' recht häufig in Anspruch
- genommen wird, sind diese drei Optionen unter den
- Alternativen direkt angegeben. Entscheiden Sie sich
- für eine dieser drei Tasks, so nimmt das System alle
- notwendigen Einstellungen vor. Möchten Sie dage­
- gen in Kontakt mit einer anderen Task treten, so
- wählen Sie die Alternative 's ... Sonstige Task'.
- In diesem Falle haben Sie noch 3 Angaben zu machen:
-
- - Zunächst werden Sie nach dem Namen der Zieltask
- gefragt. Geben Sie den Namen der Zieltask - ohne
- Anführungsstriche (!) - ein und schließen Sie die
- Eingabe mit der <RETURN>-Taste ab. (Den ausge­
- gebenen Namen der z.Z. eingestellten Task können
- Sie dabei verändern bzw. überschreiben.)
-
- - Dann wird die Nummer der Station im EUMEL-Netz
- erfragt, auf der sich die Zieltask befindet. Die
- Nummer Ihrer Station wird als Vorschlag ausge­
- geben. Wollen Sie mit einer Task auf Ihrem Rech­
- ner kommunizieren, so brauchen Sie diesen Vor­
- schlag nur durch Drücken der <RETURN>-Taste
- bestätigen - ansonsten tragen Sie zuvor die ent­
- sprechende Stationsnummer ein. Ist Ihr Rechner
- nicht in ein EUMEL-Netz integriert, so wird die
- Stationsnummer 0 (Null) ausgegeben. Bitte bestä­
- tigen Sie diese Stationsnummer durch Tippen der
- <RETURN>-Taste.
-
- - Zum Abschluß müssen Sie noch angeben, ob die
- eingestellte Zieltask ein Archivmanager ist oder
- nicht.
-
- Das System versucht dann den Kontakt herzu­
- stellen. Je nachdem, welche Einstellung Sie vorge­
- nommen haben, sind bestimmte Funktionen innerhalb
- des Menus nicht aktivierbar. Das System läßt nur
- die Funktionen zu, die aufgrund Ihrer Einstellun­
- gen zulässig sind.
- Im Kasten links unten auf dem Bildschirm wird
- jeweils angezeigt, welche Zieltask eingestellt ist.
- Erscheint in diesem Kasten auch ein Hinweis auf den
- Archivnamen, so haben Sie einen Archivmanager ein­
- gestellt. Ist dagegen vor dem Namen der Zieltask
- noch eine Zahl und ein Schrägstrich angegeben, so
- haben Sie eine Zieltask auf einem anderen Rechner
- eingestellt.
- Bedenken Sie, daß Operationen mit Tasks auf an­
- deren Stationen länger andauern können - werden
- Sie nicht ungeduldig!
- Sie können die Einstellung der Zieltask jeder­
- zeit wieder verändern!
-
- Fehlerfälle:
- - Die eingestellte Zieltask existiert nicht.
- - Die eingestellte Zieltask existiert zwar, ist aber
- nicht empfangsbereit, d.h. ein Zugriff von Ihrer
- Task aus ist nicht möglich!
- - Das Netz ist nicht funktionsbereit (Collector-
- Task fehlt).
- - Die Kommunikation war nicht erfolgreich.
- - Die gewünschte Operation kann mit der einge­
- stellten Zieltask nicht ausgeführt werden (Ziel­
- task ist z.B. gar kein Archivmanager - Sie aber
- versuchen, das Laufwerk zu reservieren).
-
diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 5 b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 5
deleted file mode 100644
index bb4a67b..0000000
--- a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 5
+++ /dev/null
@@ -1,167 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (61)#
-#headodd#
-#center#gs-Herbert und Robbi#right#%
-
-#end#
-#headeven#
-%#center#gs-Herbert und Robbi
-
-#end#
-#center#5
-
-#center#Detailbeschreibung
-#center#der
-#center#Basisbefehle
-
-
-#on("u")#'vor' bewirkt:#off("u")#
- - ein Eingabezeichen wird von der Tastatur gelesen
- und ausgewertet.
- - es wird je nach Verzögerungsfaktor (eine vorgege­
- bene Wartezeit, die auch während des Programmlaufs
- verändert werden kann) gewartet.
- - falls die Kachel vor dem Hamster/Roboter noch frei
- ist und zur Landschaft/zum Arbeitsfeld gehört,
- geht der Hamster/ Roboter um eine Kachel in der
- augenblicklichen Richtung vorwärts.
- - falls vor dem Hamster/Roboter ein Hindernis liegt,
- oder wenn er im Begriff ist, aus der Landschaft/aus
- dem Arbeitsfeld herauszulaufen, wird das Programm
- mit entsprechender Fehlermeldung abgebrochen.
-
-#on("u")#'links um' bewirkt:#off("u")#
- - wie bei 'vor': Annahme eines Tastendruckes und
- Warten.
- - eine Drehung des Hamsters/Roboters um 90 Grad ge­
- gen den Uhrzeigersinn.
-
-#on("u")#'nimm' bewirkt:#off("u")#
- - wie bei 'vor': Annahme eines Tastendruckes und
- Warten.
- - falls auf der Kachel, auf der der Hamster/Roboter
- steht, kein Korn/Werkstück liegt, wird das Programm
- mit entsprechender Fehlermeldung abgebrochen.
- - falls dort genau ein Korn/ein Werkstück liegt, wird
- dieses auf dem Bildschirm entfernt. Es wird zu denen
- in den Backentaschen/im Behälter addiert. Auf dem
- Bildschirm erscheint an der Stelle (" .").
- - falls mehrere Körner/Werkstücke dort liegen, wird
- eines zu denen in den Backentaschen/im Behälter
- addiert und von denen auf der Kachel subtrahiert.
- Auf dem Bildschirm erscheint weiterhin an der Stel­
- le (" o").
-
-#on("u")#'gib' bewirkt:#off("u")#
- - wie bei 'vor': Annahme eines Tastendruckes und
- Warten.
- - falls die Backentaschen/der Behälter leer sind/ist,
- wird das Programm mit entsprechender Fehlermel­
- dung abgebrochen.
- - falls auf der Kachel schon ein Korn/Werkstück oder
- mehrere Körner/Werkstücke liegen, wird zu ihnen
- eines addiert und von denen in den Backentaschen/
- im Behälter subtrahiert. Der Bildschirm ändert sich
- nicht.
- - falls noch kein Korn/Werkstück auf dieser Kachel
- liegt, wird auf dem Bildschirm ein (" o") ausgegeben
- und von den Körnern/Werkstücken in den Backenta­
- schen/im Behälter ein Korn/Werkstück subtrahiert.
-
-#on("u")#'vorn frei'#off("u")#
- - liefert den Wahrheitswert TRUE, wenn vor dem Ham­
- ster/ Roboter keine Hinderniskachel liegt, #on("u")#also
- auch dann, wenn der Hamster/Roboter im Begriff ist,
- über die Landschafts-/Arbeitsfeldgrenze (den
- Bildschirmrand) hinauszulaufen!#off("u")# Wenn vor dem Ham­
- ster/Roboter eine Hinderniskachel liegt, wird der
- Wahrheitswert FALSE geliefert.
-
-#on("u")#'links frei'#off("u")#
- - liefert den Wahrheitswert TRUE, wenn in Laufrich­
- tung links vom Hamster/ Roboter keine Hindernis­
- kachel liegt, #on("u")#also auch dann, wenn links vom Ham­
- ster/Roboter die Landschafts-/Arbeitsfeldgrenze
- (der Bildschirmrand) ist!#off("u")# Wenn links vom Hamster/
- Roboter eine Hinderniskachel liegt, wird der Wahr­
- heitswert FALSE geliefert.
-
-#on("u")#'rechts frei'#off("u")#
- - liefert den Wahrheitswert TRUE, wenn in Laufrich­
- tung rechts vom Hamster/Roboter keine Hindernis­
- kachel liegt, #on("u")#also auch dann, wenn rechts vom Ham­
- ster/Roboter die Landschafts-/Arbeitsfeldgrenze
- (der Bildschirmrand) ist!#off("u")# Wenn rechts vom Hamster/
- Roboter eine Hinderniskachel liegt, wird der Wahr­
- heitswert FALSE geliefert.
-
-#on("u")#'hinten frei'#off("u")#
- - liefert den Wahrheitswert TRUE, wenn in Laufrich­
- tung hinter dem Hamster/Roboter keine Hindernis­
- kachel liegt, #on("u")#also auch dann, wenn hinter dem Ham­
- ster/Roboter die Landschafts-/Arbeitsfeldgrenze
- (der Bildschirmrand) ist!#off("u")# Wenn hinter dem Hamster/
- Roboter eine Hinderniskachel liegt, wird der Wahr­
- heitswert FALSE geliefert.
-
-#on("u")#'korn da' und 'werkstueck da'#off("u")#
- - liefern den Wahrheitswert TRUE, wenn auf der
- Kachel, auf der der Hamster/Roboter steht, minde­
- stens ein Korn/Werkstück liegt. Ansonsten wird der
- Wahrheitswert FALSE geliefert.
-
-#on("u")#'korn vorn' und 'werkstueck vorn'#off("u")#
- - liefern den Wahrheitswert TRUE, wenn auf der
- Kachel, die in Laufrichtung vor dem Hamster/Robo­
- ter liegt, mindestens ein Korn/Werkstück liegt. An­
- sonsten wird der Wahrheitswert FALSE geliefert.
- - Zur "Untersuchung" wird die vor ihm liegende
- Kachel - sofern dort kein Hindernis ist - von ihm
- betreten. Wenn er im Begriff ist, aus der Land­
- schaft/dem Arbeitsfeld herauszulaufen, wird das
- Programm mit entsprechender Fehlermeldung abge­
- brochen.
-
-#on("u")#'korn links' und 'werkstueck links'#off("u")#
- - liefern den Wahrheitswert TRUE, wenn auf der
- Kachel, die in Laufrichtung links vom Hamster/
- Roboter liegt, mindestens ein Korn/Werkstück liegt.
- Ansonsten wird der Wahrheitswert FALSE geliefert.
- - Zur "Untersuchung" wird die links neben ihm lie­
- gende Kachel - sofern dort kein Hindernis ist - von
- ihm betreten. Wenn er im Begriff ist, aus der Land­
- schaft/dem Arbeitsfeld herauszulaufen, wird das
- Programm mit entsprechender Fehlermeldung abge­
- brochen.
-
-#on("u")#'korn rechts' und 'werkstueck rechts'#off("u")#
- - liefern den Wahrheitswert TRUE, wenn auf der
- Kachel, die in Laufrichtung rechts vom Hamster/
- Roboter liegt, mindestens ein Korn/Werkstück liegt.
- Ansonsten wird der Wahrheitswert FALSE geliefert.
- - Zur "Untersuchung" wird die rechts neben ihm lie­
- gende Kachel - sofern dort kein Hindernis ist - von
- ihm betreten. Wenn er im Begriff ist, aus der Land­
- schaft/dem Arbeitsfeld herauszulaufen, wird das
- Programm mit entsprechender Fehlermeldung abge­
- brochen.
-
-#on("u")#'korn hinten' und 'werkstueck hinten'#off("u")#
- - liefern den Wahrheitswert TRUE, wenn auf der
- Kachel, die in Laufrichtung hinter dem Hamster/
- Roboter liegt, mindestens ein Korn/Werkstück liegt.
- Ansonsten wird der Wahrheitswert FALSE geliefert.
- - Zur "Untersuchung" wird die hinter ihm liegende
- Kachel - sofern dort kein Hindernis ist - von ihm
- betreten. Wenn er im Begriff ist, aus der Land­
- schaft/dem Arbeitsfeld herauszulaufen, wird das
- Programm mit entsprechender Fehlermeldung abge­
- brochen.
-
-#on("u")#'backen leer' und 'behaelter leer'#off("u")#
- - liefern den Wahrheitswert TRUE, wenn kein Korn/
- kein Werkstück in den Backentaschen/im Behälter
- notiert ist. Ansonsten wird der Wahrheitswert FALSE
- geliefert.
-
diff --git a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 6 b/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 6
deleted file mode 100644
index 0aeeff0..0000000
--- a/doc/hamster/A5 - Doku: gs-Herbert und Robbi - Kapitel 6
+++ /dev/null
@@ -1,73 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (66)#
-#headodd#
-#center#gs-Herbert und Robbi#right#%
-
-#end#
-#headeven#
-%#center#gs-Herbert und Robbi
-
-#end#
-#center#6
-
-#center#Zusätzliche Kommandos
-
-
-PROC landschaft (TEXT CONST landschaftsname)
-PROC arbeitsfeld (TEXT CONST arbeitsfeldname)
- Steht einer dieser Prozeduraufrufe innerhalb eines
- Hamster-/ Roboterprogramms vor dem ersten Befehl (am
- Anfang der Datei), so wird die Anfrage nach einem Land­
- schafts-/Arbeitsfeldnamen zu Beginn des Laufs über­
- gangen. Außerdem ist es möglich, den Hamster/Roboter
- in einem Programm durch meherere Landschaften/Ar­
- beitsfelder laufen zu lassen. Beachten Sie bitte, daß
- der Landschaftsname / Arbeitsfeldname hier in Anfüh­
- rungszeichen, aber #on("u")#ohne#off("u")# das Präfix 'Flaeche:' angegeben
- werden muß!
-
-PROC geschwindigkeit (INT CONST wert)
- Möchte man von einem Programm aus eine bestimmte
- Geschwindigkeit des Hamsters/Roboters bei der Pro­
- grammausführung festlegen oder die Geschwindigkeit
- vom Programm aus verändern, so kann man diese Proze­
- dur verwenden. Zulässig sind für 'wert' nur Werte zwi­
- schen 0 und 9. Dabei bedeuten:
- 0: Einzelschrittmodus - Ausführung des nächsten
- Schritts auf Tastendruck
- 1: geringste Geschwindigkeit (Wartezeit : ca.
- 50 Zehntelsekunden )
- 9: höchste Geschwindigkeit (Wartezeit :
- keine)
- 2 - 8 sind dazwischenliegende Geschwindigkeiten
-
-TEXT PROC taste
- Diese Prozedur liefert jeweils ein eingetipptes
- Zeichen. Die Taste <ESC>, welche zum Programmabbruch
- dient, wirkt sich schon aus, bevor hier ein Zeichen ge­
- liefert werden könnte.
-
-PROC druckereinstellung fuer flaechenausdruck
- Für den Landschafts-/Arbeitsfeldausdruck ist der
- Standardschrifttyp des Druckers voreingestellt. Dabei
- müssen 80 Druckpositionen in einer Zeile Platz haben.
- Außerdem sind voreingestellt : \#limit (20.5)\#, \#on("b")\#
- (Fettdruck) und \#start (0.0,0.0)\#. Zur Darstellung der
- Hinderniskacheln wird das Zeichen '\#\#' (Code 222) ver­
- wendet. Kann Ihr Drucker dieses Zeichen nicht darstel­
- len (z.B. Typenraddrucker mit deutschem Zeichenzatz), so
- können Sie hier ein #on("u")#anderes Zeichen#off("u")# auswählen. Weiter­
- hin können Sie mit dieser Prozedur einen #on("u")#anderen
- Schrifttyp#off("u")# und eine #on("u")#andere Startposition#off("u")# (linker obe­
- rer Eckpunkt des Druckfeldes) einstellen. Nachdem Sie
- das Kommando gegeben haben, wird zunächst der ge­
- wünschte Schrifttyp erfragt. Geben Sie hier einen in
- Ihrer Installation vorhandenen Schrifttyp an (nur den
- Namen - ohne Anführungszeichen!). Anschließend werden
- Sie nacheinander nach den beiden Startwerten (erst die
- x-Richtung und dann die y-Richtung) gefragt. Geben
- Sie hier jeweils einen Wert (als REAL) ein. Bedenken Sie
- dabei, daß die 80 Druckpositionen nebeneinander Platz
- haben müssen!
-
diff --git a/doc/hamster/gs-Herbert und Robbi handbuch.impressum b/doc/hamster/gs-Herbert und Robbi handbuch.impressum
deleted file mode 100644
index 4c8e79d..0000000
--- a/doc/hamster/gs-Herbert und Robbi handbuch.impressum
+++ /dev/null
@@ -1,87 +0,0 @@
-____________________________________________________________________________
-
-
-#on("b")##on ("u")#
-#center#Betriebssystem E U M E L
-#off ("u")#
-
-
-#center#gs-Herbert und Robbi
-
-
-
-
-#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#
-
-#free (4.0)##on("b")#
-#center#gs-Herbert und Robbi
-
-
-#center#Benutzerhandbuch
-
-
-#center#Version 1.0
-
-
-#off("b")##center#copyright
-#center#Eva Latta-Weber
-#center#Software- und Hardware-Systeme, 1988
-#center#ERGOS GmbH, 1990
-#page#
-#block#
-#center#____________________________________________________________________________
-
-
-Copyright:  ERGOS GmbH   März 1990
-
- Alle Rechte vorbehalten. Insbesondere ist die Überführung in
- maschinenlesbare Form sowie das Speichern in Informations­
- systemen, auch auszugsweise, nur mit schriftlicher Einwilliging
- Einwilligung der ERGOS GmbH gestattet.
-
-#center#____________________________________________________________________________
-
-Es kann keine Gewähr übernommen werden, daß das Programm für eine
-bestimmte Anwendung geeignet ist. Die Verantwortung dafür liegt beim
-Anwender.
-
-Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrektheit und
-Vollständigkeit der Angaben kann keine Gewähr übernommen werden. Das
-Handbuch kann jederzeit ohne Ankündigung geändert werden.
-
-Texterstellung :  Dieser Text wurde mit der ERGOS-L3 Textverarbeitung
- erstellt und aufbereitet und auf einem Kyocera Laser­
- drucker gedruckt.
-
-
-
-
-#center#___________________________________________________________________________
-
-
-
-Ergonomic Office Software GmbH
-
-Bergstr. 7 Telefon: (02241) 63075
-5200 Siegburg Teletex: 2627-2241413=ERGOS
- Telefax: (02241) 63078
-
-
-#center#____________________________________________________________________________
-
diff --git a/doc/lisp/lisp handbuch b/doc/lisp/lisp handbuch
deleted file mode 100644
index 022c561..0000000
--- a/doc/lisp/lisp handbuch
+++ /dev/null
@@ -1,2260 +0,0 @@
-____________________________________________________________________________
-
-
-#on("b")##on ("u")#
-#center#Betriebssystem E U M E L
-#off ("u")#
-
-
-#center#Lisp
-
-
-
-
-#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#
-#free(7.0)#
-#center#LISP - Handbuch
-#free(2.0)#
-Stand: 08.08.86
-
-Installation von LISP
-
-begin ("LISP")
-reserve ("sprachen",archive)
-fetch all(archive)
-insert ("lisp.1")
-insert ("lisp.2")
-insert ("lisp.3")
-insert ("lisp.4")
-global manager
-begin ("lisp","LISP")
-fetch ("lisp.bootstrap")
-lisp
-#page#
-#start(2.5,1.5)#
-#block#
-#pageblock#
-#head#
-#center#LISP-Handbuch
-#center#%
-
-
-#end#
-
-
-#center#L I S P H a n d b u c h
-
-
-#center#Autor: John Mc.Carthy (M.I.T.1962)
-#center#übersetzt und angepaßt von J.Durchholz, P.Heyderhoff
-#center#Gesellschaft für Mathematik und Datenverarbeitung Sankt Augustin
-
-
-
-Inhaltsverzeichnis
-
-
-
-1. Die Sprache LISP #right##topage("p1")#
-
-1.1 Symbolische Ausdrücke #right##topage("p1.1")#
-1.2 Elementare Funktionen #right##topage("p1.2")#
-1.3 Listen Notation #right##topage("p1.3")#
-1.4 Syntax und Semantik der Sprache #right##topage("p1.4")#
-
-2. Das LISP-Interpreter-System #right##topage("p2")#
-
-2.1 Die universelle LISP-Funktion "evalquote" #right##topage("p2.1")#
-2.2 Anwendungsregeln und Beispiele #right##topage("p2.2")#
-2.3 Variablen #right##topage("p2.3")#
-2.4 Konstanten #right##topage("p2.4")#
-2.5 Funktionen #right##topage("p2.5")#
-
-3. Erweitertes LISP #right##topage("p3")#
-
-3.1 Gequotete Parameter #right##topage("p3.1")#
-3.2 Funktionen mit beliebig vielen Parametern #right##topage("p3.2")#
-3.3 Funktionale Parameter #right##topage("p3.3")#
-3.4 Prädikate und boolesche Konstanten #right##topage("p3.4")#
-3.5 Unbenannte Atome #right##topage("p3.5")#
-3.6 Aufruf von EUMEL aus #right##topage("p3.6")#
-
-4. Detailbeschreibungen #right##topage("p4")#
-
-4.1 Grundfunktionen #right##topage("p4.1")#
-4.2 Weitere Funktionen sowie Eingabe und Ausgabe #right##topage("p4.2")#
-4.3 Interpreter #right##topage("p4.3")#
-4.4 Kommandoprozeduren #right##topage("p4.4")#
-#page#
-
-1. Die Sprache LISP#goalpage("p1")#
-
-
-
-Die Sprache LISP ist primär für die Symbolmanipulation entworfen. Sie wurde für
-symbolische Berechnungen in verschiedenen Gebieten der künstlichen Intelligenz
-eingesetzt, u.a. für Differential- und Integralrechnung, Schaltkreistheorie, Mathemati­
-sche Logik, Spiele, etc..
-
-LISP ist eine formale mathematische Sprache. Daher ist es möglich, eine genaue und
-vollständige Beschreibung zu geben. Das ist der Sinn des ersten Abschnitts dieses
-Handbuchs. Andere Abschnitte werden Möglichkeiten zum vorteilhaften Einsatz von
-LISP und die Erweiterungen, die die Benutzung erleichtern, beschreiben.
-
-LISP unterscheidet sich von den meisten Programmiersprachen in drei Punkten.
-
-Der erste Punkt liegt in der Natur der Daten. In der Sprache LISP haben alle Daten
-die Form symbolischer Ausdrücke, die wir verkürzend LISP-Ausdrücke nennen wer­
-den. LISP-Ausdrücke haben keine Längenbegrenzung und eine verzweigte Baum­
-struktur, so daß Unterausdrücke leicht isoliert werden können. In LISP wird der meiste
-Speicherplatz für das Abspeichern der LISP-Ausdrücke in Form von Listenstruktu­
-ren gebraucht.
-
-Der zweite wichtige Teil der Sprache LISP ist die Quellsprache, die festlegt, wie die
-LISP-Ausdrücke verarbeitet werden sollen.
-
-Drittens kann LISP als LISP-Ausdrücke geschriebene Programme interpretieren und
-ausführen. Deshalb kann man die Sprache analog zu Assemblersprachen und im
-Gegensatz zu den meisten anderen höheren Programmiersprachen einsetzen, um
-Programme zu generieren, die gleich ausgeführt werden sollen.
-
-
-#page#
-
-1.1 Symbolische Ausdrücke #goalpage("p1.1")#
-
-
-
-Ein elementarer Ausdruck ist ein Atom.
-
-Definition: Ein Atom ist eine Zeichenkette bestehend aus Großbuchstaben und
- Ziffern.
-
-
-Beispiele: A
- APFEL
- TEIL2
- EXTRALANGEZEICHENKETTEAUSBUCHSTABEN
- A4B66XYZ2
-
-
-Diese Symbole werden atomar genannt, weil sie als Ganzes aufgefaßt werden, das
-durch die LISP-Funktionen nicht weiter geteilt werden kann. A, B, und AB haben
-keinerlei Beziehung zueinander, außer der, daß sie alle verschiedene Atome sind.
-
-Alle LISP-Ausdrücke werden aus Atomen und den Satzzeichen "(", ")" und "."
-aufgebaut. Die grundlegende Operation zum Aufbau von LISP-Ausdrücken ist die,
-zwei LISP-Ausdrücke zusammenzufassen, um einen größeren herzustellen. Aus den
-zwei Atomen A und B kann man so den LISP-Ausdruck (A.B) bilden.
-
-Definition: Ein LISP-Ausdruck ist entweder ein Atom, oder aus folgenden Elemen­
- ten in dieser Reihenfolge aufgebaut: Eine öffnende Klammer, ein
- LISP-Ausdruck, ein Punkt, ein LISP-Ausdruck, eine schließende
- Klammer. Zwischen den Bestandteilen eines nichtatomaren LISP-Aus­
- druck können beliebig viele Leerzeichen eingestreut sein.
-
-Diese Definition ist rekursiv.
-
-
-Beispiele: ATOM
- (A . B)
- (A . (B . C))
- ((A1 . A2) . B)
- ((U . V) . (X . Y))
- ((U . V) . (X . (Y . Z)))
-
-
-Um die Struktur solcher Ausdrücke zu verdeutlichen, wird in diesem Handbuch oft
-eine graphische Darstellung gewählt. In dieser Darstellung sind die Atome weiterhin
-Zeichenketten, statt der Paare steht jetzt aber ein Kasten
-
-
- +-----+-----+
- | o | o |
- +-----+-----+
-
-
-von dem zwei Zeiger ausgehen, die auf die graphische Darstellung des ersten bzw.
-zweiten Elements des Paars zeigen.
-
-
-
-Beispiele: (A . B) +-----+-----+
- | o | o |
- +--+--+--+--+
- | |
- V V
- A B
-
- (A . (B . C)) +-----+-----+
- | o | o |
- +--+--+--+--+
- | |
- V V
- A +-----+-----+
- | o | o |
- +--+--+--+--+
- | |
- V V
- B C
-
- ((U . V) . (X . (Y . Z))) +-----+-----+
- | o | o |
- +--+--+--+--+
- | |
- V V
- +-----+-----+ +-----+-----+
- | o | o | | o | o |
- +--+--+--+--+ +--+--+--+--+
- | | | |
- V V V V
- U V X +-----+-----+
- | o | o |
- +--+--+--+--+
- | |
- V V
- Y Z
-
-
-
-
-
-
-#page#
-
-1.2 Elementare Funktionen #goalpage("p1.2")#
-
-
-Wir werden einige elementare Funktionen auf LISP-Ausdrücken einführen. Um die
-Funktionen von den LISP-Ausdrücken zu unterscheiden, werden wir Funktionsnamen
-mit Klein- statt Großbuchstaben schreiben. Außerdem steht der Funktionsname
-gefolgt von den Argumenten, auf die die Funktion angewendet werden soll, in Klam­
-mern eingeschlossen in einer Liste. Dabei sind die Argumente durch Blanks vonein­
-ander getrennt.
-
-Die erste Funktion, die wir einführen, heißt "cons". Sie hat zwei Argumente und wird
-dafür benutzt, LISP-Ausdrücke aus kleineren LISP-Ausdrücken aufzubauen.
-
-
- Funktionsaufruf: Ergebnis:
-
-Beispiele: (cons A B) = (A . B)
- (cons (A . B) C) = ((A . B) . C)
- (cons (cons A B) C) = ((A . B) . C)
-
-
-Die Beispiele zeigen Funktionsaufrufe. Ein Funktionsaufruf ist eine Liste beginnend
-mit einem Funktionsnamen, gefolgt von Argumenten. Alle Funktionsaufrufe haben ein
-Ergebnis, das im Fall von LISP-Funktionen immer ein LISP-Ausdruck ist.
-
-In diesen Beispielen kommt nur die Funktion "cons" vor. Das letzte Beispiel ist ein
-Fall von Funktionsverkettung, das heißt, als Argument steht ein Funktionsaufruf. Um
-das Ergebnis eines Funktionsaufrufs zu berechnen, das Funktionsaufrufe als Argu­
-mente enthält, muß man statt dieser Argumente die Ergebnisse dieser Funktionsaufru­
-fe einsetzen, so daß man den äußeren Funktionsaufruf in einen Aufruf ohne Funk­
-tionsaufrufe als Argumente umwandelt.
-
-
-Beispiel: (cons (cons A B) C) = (cons (A . B) C) = ((A . B) . C)
-
-
-Es ist möglich, durch Verkettung der Funktion "cons" jeden LISP-Ausdruck aus
-seinen atomaren Komponenten aufzubauen.
-
-Die folgenden beiden Funktionen tun das genaue Gegenteil von "cons": sie liefern
-die Unterausdrücke eines gegebenen LISP-Ausdrucks.
-
-Die Funktion "head" hat ein Argument. Ihr Wert ist der erste Unterausdruck des
-zusammengesetzen Arguments. Der "head" eines Atoms ist nicht definiert.
-
-
-Beispiele: (head (A . B)) = A
- (head (A . (B1 . B2))) = A
- (head ((A1 . A2) . B)) = (A1 . A2)
- (head A) ist nicht definiert
-
-
-Die Funktion "tail" hat ebenfalls ein Argument, und sie liefert das Argument bis auf
-dessen "head".
-
-
-Beispiele: (tail (A . B)) = B
- (tail (A . (B1 . B2))) = (B1 . B2)
- (tail ((A1 . A2) . B)) = B
- (tail A) ist nicht definiert
- (head (tail (A . (B1 . B2)))) = B1
- (head (tail (A . B))) ist nicht definiert
- (head (cons A B)) = A
-
-
-Es ist bei jedem LISP-Ausdruck möglich, durch eine geeignete Verkettung von
-"head" und "tail" zu jedem Atom im Ausdruck zu gelangen.
-
-Wenn "x" und "y" irgendwelche LISP-Ausdrücke repräsentieren, gelten die folgen­
-den Gleichungen immer:
-
-
- (head (cons x y)) = x
- (tail (cons x y)) = y
-
-
-Außerdem gilt die folgende Gleichung für jeden nichtatomaren LISP-Ausdruck "z":
-
-
- (cons (head z) (tail z)) = z
-9
-
-Die Symbole "x", "y" und "z", die wir in diesen Gleichungen benutzt haben, nennt
-man Variablen. In LISP werden Variable benutzt, um LISP-Ausdrücke zu repräsentie­
-ren, und zwar repräsentiert eine Variable in einer Gleichung immer denselben
-LISP-Ausdruck. Variablennamen werden wie Funktionsnamen gebildet, d.h. sie
-können Kleinbuchstaben und Ziffern enthalten.
-
-Eine Funktion, deren Wert "wahr" oder "falsch" sein kann, wird Prädikat genannt. In
-LISP werden die Werte "wahr" und "falsch" durch die Atome "T" (true) und "F"
-(false) vertreten. Ein LISP-Prädikat ist also eine Funktion, deren Wert entweder "T"
-oder "F" ist.
-
-Das Prädikat "eq" ist ein Gleichheitstest für Atome. Es ist bei nicht atomaren Argu­
-menten nicht definiert.
-
-
-Beispiele: (eq A A) = T
- (eq A B) = F
- (eq A (A . B)) ist nicht definiert
- (eq (A . B) B) ist nicht definiert
- (eq (A . B) (A . B)) ist nicht definiert
-
-
-Das Prädikat "atom" hat das Ergebnis ("liefert") "T", wenn sein Argument atomar ist,
-und "F", wenn sein Argument zusammengesetzt ist.
-
-
-Beispiele: (atom EXTRALANGEZEICHENKETTE) = T
- (atom (U . V)) = F
- (atom (head (U . V))) = T
-
-#page#
-
-1.3 Listen-Notation #goalpage("p1.3")#
-
-
-
-Alle LISP-Ausdrücke, die wir bisher gesehen haben, waren in Punkt-Notation
-geschrieben. Normalerweise ist es allerdings einfacher, statt der vielen Punkte und
-Klammern Listen von LISP-Ausdrücken zu schreiben, etwa in der Art (A B C XYZ).
-
-LISP bietet eine solche Alternative zur Punkt-Notation an:
-
-Definition: Die Liste (a1 a2 ... an) ist äquivalent zum LISP-Ausdruck
- (a1 . (a2 . (... . (an . NIL) ... ))).
-
-Graphisch ausgedrückt heißt das:
-
-
- +-----+-----+
- | o | o |
- +--+--+--+--+
- | |
- V V
- a1 +-----+-----+
- | o | o |
- +--+--+--+--+
- | |
- V V
- a2
- .
- .
- .
-
- +-----+-----+
- | o | o |
- +--+--+--+--+
- | |
- V V
- an NIL
-
-
-
-Oft werden wir für Listen auch die graphische Form
-
-
- +-----+-----+ +-----+-----+ +-----+-----+
- | o | o--+-->| o | o--+--> . . . | o | o--+--> NIL
- +--+--+-----+ +--+--+-----+ +--+--+-----+
- | | |
- V V V
- a1 a2 an
-
-
-benutzen.
-
-Aus der Graphik wird deutlich, daß NIL als eine Art Abschlußmarkierung für Listen
-dient.
-
-Eine leere Liste wird durch das Atom NIL dargestellt. Das Prädikat "null" liefert "T",
-wenn sein Argument eine leere Liste ist, sonst "F".
-
-
-Beispiele: (null NIL) = T
- (null () ) = T
- (null (A B)) = F
-
-
-Die Listenelemente können selbst wieder Listen oder Paare in Punkt-Notation sein,
-so daß Listen- und Punkt-Notation beliebig kombinierbar sind.
-
-
- Beispiele: (A B C) = (A . (B . (C . NIL)))
-
- +-----+-----+ +-----+-----+ +-----+-----+
- | o | o--+-->| o | o--+-->| o | o--+--> NIL
- +--+--+-----+ +--+--+-----+ +--+--+-----+
- | | |
- V V V
- A B C
-
- ((A . B) C) = ((A . B) . (C . NIL))
-
- +-----+-----+ +-----+-----+
- | o | o--+-->| o | o--+--> NIL
- +--+--+-----+ +--+--+-----+
- | |
- V V
- +-----+-----+ C
- | o | o |
- +--+--+--+--+
- | |
- V V
- A B
-
- ((A B) C) = ((A . (B . NIL)) . (C . NIL))
-
- +-----+-----+ +-----+-----+
- | o | o--+--------------->| o | o--+--> NIL
- +--+--+-----+ +--+--+-----+
- | |
- | V
- V C
- +-----+-----+ +-----+-----+
- | o | o--+-->| o | o--+--> NIL
- +--+--+-----+ +--+--+-----+
- | |
- V V
- A B
-
- (A) = (A . NIL)
-
- +-----+-----+
- | o | o--+--> NIL
- +--+--+-----+
- |
- V
- A
-
- ((A)) = ((A . NIL) . NIL)
-
- +-----+-----+
- | o | o--+--> NIL
- +--+--+-----+
- |
- V
- +-----+-----+
- | o | o--+--> NIL
- +--+--+-----+
- |
- V
- A
-
-
-
-
-
-Es ist sehr hilfreich, mit den Ergebnissen der elementaren Funktionen vertraut zu
-sein, wenn diese Listen als Argumente erhalten. Zwar können die Ergebnisse notfalls
-immer durch Ãœbersetzung in Punkt-Notation bestimmt werden, aber ein direktes
-Verständnis ist einfacher.
-
-
-Beispiele: (head (A B C)) = A
- (tail (A B C)) = (B C)
-
-
- (Daher auch die Namen "head" und "tail"! Frei übersetzt heißen die
- beiden Funktionen "anfang" und "rest".)
-
-
- (cons A (B C)) = (A B C)
-
-#page#
-
-1.4 Syntax und Semantik der Sprache #goalpage("p1.4")#
-
-
-
-Wir haben bisher einen Datentyp (LISP-Ausdrücke) und fünf elementare Funktionen
-eingeführt. Außerdem haben wir die folgenden Eigenschaften der Sprache beschrie­
-ben:
-
-1. Funktions- und Variablennamen werden wie die Namen von Atomen geschrie­
- ben, außer, daß dafür Klein- statt Großbuchstaben verwendet werden.
-2. Die Argumente einer Funktion folgen dieser in der Liste. Eine solche Liste von
- Funktion und folgenden Argumenten heißt Funktionsaufruf und hat einen LISP-
- Ausdruck als Ergebnis.
-3. Funktionen können dadurch verkettet werden, daß ein Argument aus einem Funk­
- tionsaufruf selbst wieder ein Funktionsaufruf ist, dessen Argumente selbst wieder
- Funktionsaufrufe sein können, usw.
-
-Diese Regeln erlauben es, Funktionsdefinitionen wie
-
-
- (third x) = (head (tail (tail x)))
-
-
-zu schreiben. "third" holt das dritte Element aus einer Liste.
-
-Die Klasse der Funktionen, die man auf diese Weise bilden kann, ist ziemlich be­
-schränkt und nicht sehr interessant. Eine viel größere Funktionenklasse kann man mit
-Hilfe des bedingten Ausdrucks schreiben; es handelt sich dabei um eine Möglichkeit,
-Verzweigungen in Funktionsdefinitionen einzubauen.
-
-Ein bedingter Ausdruck hat die Form
-
-
- (cond (p1 a1) (p2 a2) ... (pn an) )
-
-
-Jedes pi ist ein Ausdruck, dessen Wert "T" oder "F" ist, also ein Prädikat. Die ai
-sind beliebige LISP-Ausdrücke.
-
-Die Bedeutung eines bedingten Ausdrucks ist folgende: Wenn p1 wahr ist, ist a1 der
-Wert des ganzen Ausdrucks. Wenn p1 falsch ist, wird getestet, ob p2 wahr ist; wenn
-das der Fall ist, ist a2 der Wert des Ausdrucks. Die pi werden also von links nach
-rechts durchgegangen, bis ein wahrer Ausdruck gefunden ist; das zugehörige ai ist
-dann der Wert des bedingten Ausdrucks. Wenn kein wahres pi gefunden ist, ist der
-bedingte Ausdruck nicht definiert.
-Jedes pi oder ai kann selbst wieder ein LISP-Ausdruck, ein Funktionsaufruf oder ein
-bedingter Ausdruck sein.
-
-
-Beispiel: (cond ((eq (head x) A) (cons B (tail x))) (T x) )
-
-
-Das Prädikat "T" ist immer wahr. Man liest es am besten als "SONST". Den Wert
-dieses Ausdruck erhält man, wenn man "head" von x durch B ersetzt, wenn der
-gerade gleich mit A ist, und sonst erhält man x.
-
-Der Hauptzweck von bedingten Ausdrücken ist die rekursive Definition von Funktio­
-nen.
-
-
-Beispiel: (firstatom x) = (cond ((atom x) x)
- ( T (firstatom (head x)))
- )
-
-
-Dies Beispiel definiert die Funktion "firstatom", die das erste Atom jedes LISP-Aus­
-drucks bestimmt. Diesen Ausdruck kann man so lesen: wenn "x" ein Atom ist, ist "x"
-selbst die Antwort; sonst muß "firstatom" auf "head" von "x" angewandt werden.
-
-Wenn also "x" ein Atom ist, wird der erste Zweig gewählt, der "x" liefert; sonst wird
-der zweite Zweig "firstatom (head x)" gewählt, weil "T" immer wahr ist.
-
-Die Definition von "firstatom" ist rekursiv, d.h. "firstatom" ist mit durch sich selbst
-definiert. Allerdings, wenn man immerzu den "head" von irgendeinem LISP-Aus­
-druck nimmt, errreicht man irgendwann ein Atom, so daß der Prozeß immer wohlde­
-finiert ist.
-
-Es gibt rekursive Funktionen, die nur für bestimmte Argumente wohldefiniert sind, für
-bestimmte andere dagegen unendlich rekursiv. Wenn das EUMEL-LISP-System
-einen Funktionsionsaufruf mit einer solchen Funktion und "kritischen" Argumenten
-interpretiert, gerät es in unendliche Rekursion, bis entweder der zur Verfügung ste­
-hende Platz im LISP-Heap ausgeschöpft ist (im Heap werden die LISP-Ausdrücke
-gespeichert) oder bis der Laufzeitstack überläuft (der Laufzeitstack ist ein normaler­
-weise unsichtbarer Bestandteil des ELAN-Systems).
-Wir werden jetzt die Berechnung von "(firstatom ((A . B) . C))" durchführen. Zunächst
-ersetzen wir die Variable x in der Funktionsdefinition durch ((A . B) . C) und erhalten
-
-
- (firstatom ((A . B) . C)) =
- (cond ( (atom ((A . B) . C)) ((A . B) . C) )
- ( T (firstatom (head ((A . B) . C))) )
- )
-
-((A . B) . C) ist kein Atom, deshalb wird daraus
-
- = (cond ( T (firstatom (head ((A . B) . C)))) )
- = (firstatom (head ((A . B) . C)) )
- = (firstatom (A . B))
-
-
-
-An diesem Punkt müssen wir wieder die Definition von "firstatom" benutzen, diesmal
-aber für "x" überall "(A . B)" einsetzen.
-
-
- (firstatom (A . B)) = (cond ( (atom (A . B)) (A . B) )
- (T (firstatom (head (A . B))) )
- )
- = (cond (T (firstatom (head (A . B))) ) )
- = (firstatom (head (A . B)) )
- = (firstatom A)
- = (cond ((atom A) A)
- (T (firstatom (head A)) )
- )
- = A
-
-
-Wenn in den bedingten Ausdrücken statt der LISP-Ausdrücke arithmetische Aus­
-drücke verwendet würden, könnte man damit auch numerische Rechenvorschriften
-definieren, wie z.B. den Betrag einer Zahl durch
-
-
- (abs x) = (cond ((x < 0) -x) (T x) )
-
-
-oder die Fakultät durch
-
-
- (fak n) = (cond ((n = 0) 1)
- (T (x * (fak (n - 1))))
- )
-
-
-Die Fakultät terminiert bei negativen Argumenten nicht.
-
-Es ist bei den meisten Mathematikern (außer den Logikern) üblich, das Wort "Funk­
-tion" nicht präzise zu verwenden und auf Ausdrücke wie "2x+y" anzuwenden. Da wir
-Ausdrücke benutzen werden, die Funktionen repräsentieren, benötigen wir eine
-Notation, die Funktionen und Ausdrücke unterscheidet. Dafür ist die Lambda-Nota­
-tion von Alonzo Church geeignet.
-"f" soll ein Ausdruck sein, der für eine Funktion zweier ganzzahliger Variablen steht.
-
-Dann sollte es sinnvoll sein, den Funktionsaufruf
-
-
- (f 3 4)
-
-
-zu schreiben, so daß man dadurch den Wert dieses Funktionsaufrufs berechnen kann;
-z.B. könnte "(summe 3 4) = 7" gelten.
-
-Wenn man "2x + y" als Funktion ansieht, kann man den Funktionsaufruf
-
-
- ((2x + y) 3 4)
-
-
-schreiben. Der Wert dieses Ausdrucks ist aber nicht eindeutig bestimmt, denn es ist
-überhaupt nicht klar, ob nun "2*3+4" oder 2*4+3" gemeint ist. Eine Zeichenfolge
-wie "2x + y" werden wir deshalb Ausdruck und nicht Funktion nennen. Ein Ausdruck
-kann in eine Funktion umgewandelt werden, indem man die Zuordnung von Argumen­
-ten und Variablen festlegt. Bei "2x + y" könnte man beispielsweise festlegen, daß
-"x" immer das erste und "y" immer das zweite Argument sein soll.
-Wenn "a" ein Ausdruck in den Variablen x1, ... xn ist, dann ist
-
-
- (lambda (x1 ... xn) a)
-
-
-eine Funktion mit n Argumenten. Den Wert der Funktionsaufrufe mit dieser Funktion
-(also der Ausdrücke der Form
-
-
- ((lambda (x1 ... xn) a) (b1 ... bn))
- erhält man, indem man die Variablen x1 ... xn durch die n Argumente des Aufrufs
-ersetzt. Beispielsweise ist
-
-
- ((lambda (x y) (2*x + y)) (3 4)) = 2*3 + 4 = 10 ,
-
-
-während
-
-
- ((lambda (y x) (2*x + y)) (3 4)) = 2*4 + 3 = 11
-
-
-ist.
-
-Die Variablen in einem Lambdaausdruck sind sogenannte Parameter (oder gebundene
-Variable). Interessant ist, daß eine Funktion sich nicht ändert, wenn man eine Variable
-systematisch durch eine andere Variable ersetzt, die nicht bereits im Lambdaausdruck
-vorkommt.
-
-
- (lambda (x y) (2*y + x))
-
-
-ist also dasselbe wie
-
-
- (lambda (u v) (2*v + u)) .
-
-
-Manchmal werden wir Ausdrücke benutzen, in denen eine Variable nicht durch das
-Lambda gebunden ist. Beispielsweise ist das n in
-
-
- (lambda (x y) (x*n + y*n))
-
-
-nicht gebunden. Eine solche nicht gebundene Variable nennt man frei.
-Wenn für eine freie Variable vor der Benutzung kein Wert vereinbart wurde, ist der
-Wert des Funktionsaufrufs nicht definiert, falls der Wert der Variablen auf das Ergeb­
-nis einen Einfluß hat.
-
-Die Lambdanotation reicht allein für die Definition rekursiver Funktionen nicht aus.
-Neben den Variablen muß auch der Name der Funktion gebunden werden, weil er
-innerhalb der Funktion für eine Zeichenfolge steht.
-
-Wir hatten die Funktion "firstatom" durch die Gleichung
-
-
- (firstatom x) = (cond ((atom x) x)
- (T (firstatom (head x)))
- )
-
-
-definiert. Mit der Lambda-Notation können wir schreiben:
-
-
- firstatom = (lambda (x) (cond ((atom x) x)
- (T (firstatom (head x)))
- ) )
-
-
-
-Das Gleichheitszeichen ist in Wirklichkeit nicht Teil der LISP-Sprache, sondern eine
-Krücke, die wir nicht mehr brauchen, wenn wir die richtige Schreibweise eingeführt
-haben.
-
-Die rechte Seite der obigen Gleichung ist als Funktion nicht vollständig, da dort nichts
-darauf hinweist, daß das "firstatom" im einem bedingten Ausdruck für eben die rechte
-Seite steht. Deshalb ist die rechte Seite als Definition für die linke Seite ("firstatom")
-noch nicht geeignet.
-
-Damit wir Definitionen schreiben können, in denen der Name der gerade definierten
-Funktion auftaucht, führen wir die Label-Notation ein (engl. label = Marke, (Preis-)
-Schildchen). Wenn "a" eine Funktion ist, und "n" ihr Name, schreiben wir "(label n
-a)".
-
-Nun können wir die Funktion "firstatom" ohne Gleichheitszeichen schreiben:
-
-
- (label firstatom (lambda (x) (cond ((atom x) x)
- (T (firstatom (head x)))
- ) ) )
-
-
-In dieser Definition ist "x" eine gebundene Variable und "firstatom" ein gebundener
-Funktionsname.
-#page#
-
-2. Das LISP-Interpreter-System#goalpage("p2")#
-
-
-
-2.1 Die universelle LISP-Funktion
- "evalquote" #goalpage("p2.1")#
-
-
-
-Ein Interpreter oder eine allgemeine Funktion ist eine Funktion, die den Wert jedes
-gegebenen Ausdrucks berechnen kann, wenn der Ausdruck in einer geeigneten Form
-vorliegt. (Wenn der zu interpretierende Ausdruck einen Aufruf einer unendlich rekur­
-siven Funktion enthält, wird der Interpreter natürlich ebenfalls unendlich rekursiv.)
-Wir sind jetzt in der Lage, eine allgemeine LISP-Funktion
-
-
- (evalquote function arguments)
-
-
-zu definieren. "evalquote" muß als erstes Argument ein LISP-Ausdruck übergeben
-werden. Dieser wird als Funktion aufgefasst und auf die folgenden Argumente ange­
-wendet.
-
-Im Folgenden sind einige nützliche Funktionen zur Manipulation von LISP-Aus­
-drücken angegeben. Einige von ihnen werden als Hilfsfunktionen für die Definition von
-"evalquote" gebraucht, die wir uns vorgenommen haben.
-
-
- (equal x y)
-
-
-ist ein Prädikat, das wahr ist, wenn seine Argumente gleiche LISP-Ausdrücke sind.
-(Das elementare Prädikat "eq" ist ja nur für Atome definiert.)
-
-Die Definition von "equal" ist ein Beispiel für einen bedingten Ausdruck innerhalb
-eines bedingten Ausdrucks.
-
-
-(label equal
- (lambda (x y)
- (cond
- ((atom x) (cond
- ((atom y) (eq x y))
- (T F)
- )
- )
- ((equal (head x) (head y)) (equal (tail x) (tail y)))
- (T F)
- )
- )
-)
-
-
-
-Folgende Funktion liefert einen LISP-Ausdruck, der gleich mit "destination" ist,
-außer daß darin überall statt "old" "new" steht.
-
-
-(changeall (destination old new))
-
-= (cond ((equal destination old) new)
- ((atom destination) destination)
- (T (cons (changeall (head destination) old new)
- (changeall (tail destination) old new)
- )
- )
- )
-
-
-Beispielsweise gilt
-
-
-(changeall ((A . B) . C) B (X . A)) = ((A . (X . A)) . C)
-
-
-Die folgenden Funktionen sind nützlich, wenn Listen verarbeitet werden sollen.
-
-1. (append x y)
- hängt an die Liste "x" den LISP-Ausdruck "y".
-
-
- (append x y) =
- (cond ((null x) y)
- (T (cons (head x) (append (tail x) y) ))
- )
-
-
-2. (member list pattern)
- Dies Prädikat testet, ob der LISP-Ausdruck "pattern" in der Liste "list" vor­
- kommt.
-
-
- (member list pattern) =
- (cond ((null list) F)
- ((equal (head list) pattern) T)
- (T (member (tail list) pattern))
- )
-
-
-3. (pairlist list1 list2 oldpairlist)
- Diese Funktion liefert eine Liste von Paaren, die die sich entsprechenden Elemen­
- te der Listen "list1" und "list2" enthalten, und an der noch die Liste "oldpairlist"
- hängt.
-
-
-
- (pairlist list1 list2 oldpairlist) =
- (cond ((null list1) oldpairlist)
- (T (cons (cons (head list1) (head list2))
- (pairlist (tail list1) (tail list2) oldpairlist)
- )
- )
- )
-
-
-Beispiel:
- (pairlist (A B C) (U V W) ((D . X) (E . Y)) ) =
- ((A . U) (B . V) (C . W) (D . X) (E . Y))
-
-
-Eine solche Liste von Paaren wird auch Assoziationsliste genannt, wenn das erste
-Element jedes Paars ein Atom ist, das über diese Liste mit dem zweiten Element
-assoziiert ist.
-
-5. (association pattern associationlist)
- Wenn "association list" eine Assoziationsliste wie oben beschrieben ist, liefert
- "association" das Paar der Liste, dessen erstes Element "pattern" ist. Es ist also
- eine Funktion zum Durchsuchen von Tabellen.
-
-
- (association pattern alist) =
- (cond ((eq (head (head alist)) pattern) (head alist))
- (T (association pattern (tail alist)))
- )
-
-Beispiel:
-
-(association B ( (A . (M N))
- (B . (HEAD X))
- (C . (QUOTE M))
- (B . (TAIL X))
- ) ) = (B . (HEAD X))
-
-
-(replace expr alist)
- "alist" muß eine Assoziationsliste sein. "replace" produziert einen Ausdruck, der
- "expr" sehr ähnlich ist, nur sind alle Atome darin durch den LISP-Ausdruck
- ersetzt, mit dem sie in "alist" assoziiert sind.
-
-
- (replace expr alist) =
- (cond ((atom expr) (association expr alist))
- (T (cons (replace (head expr) alist)
- (replace (tail expr) alist)
- )
- )
- )
-
-Beispiel:
-
- (replace (X SCHRIEB Y)
- ((Y . (GOETZ VON BERLICHINGEN)) (X . GOETHE))
- )
-
- = (GOETHE SCHRIEB (GOETZ VON BERLICHINGEN))
-
-
-
-Die allgemeine Funktion "evalquote", die wir jetzt definieren wollen, gehorcht der
-folgendem Beispiel zugrundeliegenden Regel:
-
-
-Beispiel:
- (evalquote
-Funktion: (LAMBDA (X Y) (CONS (HEAD X) Y) )
-Argumente: (A B) (C D)
- )
-=
- (apply
-Funktion: (LAMBDA (X Y) (CONS (HEAD X) Y))
-Argumentliste: ((QUOTE (A B)) (QUOTE (C D)))
-Bindung: NIL
- )
-
-
-Die Argumente von "evalquote" werden also zu einer gequoteten Argumentliste von
-"apply". Die QUOTE-Funktion bewirkt, daß das Argument der QUOTE-Funktion
-wörtlich genommen, also nicht weiter evaluiert wird. Das dritte Argument von "apply",
-das NIL ist eine leere Bindeliste zur Bindung von Parametern und Argumenten im
-nächsten Schritt:
-
-
-=
- (eval
-Argumente: (CONS (HEAD X) Y)
-Bindung: ((X.(A B)) (Y . (C D)))
- )
-=
- (cons (head (A B)) (C D))
-=
- (A C D) = Ergebnis von "evalquote" .
-
-
-"evalquote" wird hauptsächlich durch die Hilfsfunktion "apply" definiert. "apply"
-berechnet Funktionsaufrufe, indem es die Argumente und die Parameter der Funktion
-bindet und den Funktionsrumpf berechnet. Die Bindungen werden in einer Assozia­
-tionsliste, der Bindeliste, gespeichert. Da bedingte Ausdrücke und Konstanten formal
-wie Funktionsaufrufe von Funktionen "cond" und "quote" aussehen, werden sie auch
-so behandelt.
-
-Wir definieren also:
-
-
- (evalquote fkt expr) = (apply fkt (quote expr) NIL) .
-
-
-sowie :
-
-
- (eval expr binding) =
- (cond ((atom expr) (tail (association expr binding)))
- (T (apply (head expr) (tail expr) binding))
- )
-
-
-"eval" stellt also erst fest, ob es sich um ein Atom oder um einen Funktionsaufruf
-handelt. Da es nur diese beiden Möglichkeiten gibt, ist diese Einteilung vollständig.
-
-Atome sind immer Übersetzungen von Variablen, für die eine Bindung existieren muß,
-so daß ihr Wert aus der Bindeliste geholt wird.
-
-Funktionsaufrufe sind immer Listen; im zweiten Zweig werden die Funktion und die
-Parameterliste getrennt und an "apply" übergeben.
-
-Um sich die Aktionen in diesem zweiten Zweig von "eval" genauer vorstellen zu
-können, ist vielleicht die in Abschnitt 1.1 beschriebene graphische Darstellungsmetho­
-de hilfreich; beispielsweise würde sich ein Lambda-Ausdruck so ausnehmen:
-
-
- +-----+-----+ +-----+-----+ +-----+-----+
- | o | o--+-->| o | o--+-->| o | o--+-->NIL
- +--+--+-----+ +--+--+-----+ +--+--+-----+
- | | |
- V V V
- LAMBDA Parameterliste Ausdruck
-
-
-"apply" bekommt nun von "eval" eine Funktion und eine Parameterliste sowie die
-Bindeliste übergeben. Mit diesen beiden macht es folgendes:
-
-
- (apply fn args binding) =
-(cond
- ((atom fn)
- (cond ((eq fn HEAD) (head (eval (head args) binding)))
- ((eq fn TAIL) (tail (eval (head args) binding)))
- ((eq fn CONS) (cons (eval (head args) binding)
- (eval (head (tail args)) binding)
- ) )
- ((eq fn ATOM) (atom (eval (head args) binding)))
- ((eq fn EQ) (eq (eval (head args) binding)
- (eval (head (tail args)) binding)
- ) )
- ((eq fn QUOTE) (head args))
- ((eq fn COND) (evalcond args binding))
- (T (apply (tail (association fn binding)) args binding))
- )
- ((eq (head fn) LABEL)
- (apply (head (tail (tail fn)))
- args (cons (cons (head (tail fn))
- (head (tail (tail fn)))
- )
- binding)
- ) )
- ((eq (head fn) LAMBDA) (eval (head (tail (tail fn)))
- (pairlist (head (tail fn))
- args binding)
- ) )
-)
-
-
-
-
-
-
-Das erste Argument von "apply" ist eine Funktion (unter der Voraussetzung, daß
-"quote" und "cond" als Funktionen anerkannt werden).
-
-Wenn es eine der elementaren Funktionen "head", "tail", "cons", "atom" oder "eq"
-ist, wird die jweilige Funktion auf die Argumente angewandt, die vorher berechnet
-werden. Diese Berechnung erfolgt mit "eval", das ja für Variablen Werte aus der
-Bindeliste liefert und für Funktionsaufrufe das, was "apply" mit ihnen machen kann.
-
-Wenn es sich um "quote" handelt, wird das erste Argument unverändert geliefert
-"quote" heißt ja "dies ist eine Konstante, die so, wie sie da steht, übernommen wer­
-den soll".
-
-Wenn es sich um "cond" handelt, wird die Funktion "eval cond" aufgerufen, doch
-auch ihre Argumente werden nicht berechnet, außerdem gehört die Assoziationsliste
-zu den Argumenten:
-
-
- eval (cond condlist, binding) =
- (cond ((eval (head (head condlist)) binding)
- (eval (head (tail (head condlist))) binding)
- )
- (T (cond (tail condlist) binding))
- )
-
-
-
-Hier empfiehlt es sich, einen bedingten Ausdruck in graphischer Form hinzuschreiben
-und die Auswertung anhand der Zeichnung nachzuvollziehen.
-
-Wenn die Funktion nichts von alledem ist, wird in der Bindeliste nachgesehen, ob
-dies Atom nicht an eine Funktion gebunden ist; falls ja, wird eine Auswertung dieser
-Funktion mit den gleichen Argumenten versucht.
-
-Wenn das erste Argument von "apply" kein Atom ist, muß es ein LABEL- oder ein
-LAMBDA-Ausdruck sein.
-
-Ein LABEL-Ausdruck hat die Form
-
-
- +-----+-----+ +-----+-----+ +-----+-----+
- | o | o--+-->| o | o--+-->| o | o--+--> NIL
- +--+--+-----+ +--+--+-----+ +--+--+-----+
- | | |
- V V V
- LABEL Name Funktion
-
-
-Funktionsname und Definition werden in einem funktionalen Eintrag in die Bindeliste
-eingefügt, so daß der Name an die Funktion gebunden ist.
-
-Ein LAMBDA-Ausdruck hat die Form
-
-
- +-----+-----+ +-----+-----+ +-----+-----+
- | o | o--+-->| o | o--+-->| o | o--+--> NIL
- +--+--+-----+ +--+--+-----+ +--+--+-----+
- | | |
- V V V
- LAMBDA Parameterliste Ausdruck
-
-
-Dabei ist die Parameterliste eine Liste von Atomen, den Parametern. Die Auswertung
-läuft so ab, daß die Parameter durch "pairlist" an die Argumente gebunden werden
-und mit dieser neuen Bindeliste der Ausdruck berechnet wird.
-
-Das EUMEL-LISP bietet eine Reihe weiterer Möglichkeiten, die erst später beschrie­
-ben werden. Hier können wir allerdings schon die folgenden Punkte abhandeln:
-
-1. Jede LISP-Eingabe ist ein LISP-Ausdruck. Der "head" dieses Ausdrucks wird
- als Funktion aufgefaßt und auf den gequoteten "tail" des Ausdrucks, nämlich die
- nicht zu evaluierenden Argumente angewandt. Die Übersetzung von Kleinbuchsta­
- ben in Großbuchstaben wird vom LISP-System übernommen.
-
-2. In der Theorie des reinen LISP müssen alle Funktionen außer den fünf Basisfunk­
- tionen an allen Stellen wieder definiert werden, an denen sie aufgerufen werden.
- Das ist eine für die Praxis äußerst unhandliche Regelung; das EUMEL-LISP-
- System kennt weitere vordefinierte Funktionen und bietet die Möglichkeit, beliebig
- viele weitere Standardfunktionen einzuführen, auch solche Funktionen, deren
- Argumente nicht berechnet werden (wie "quote") oder solche, die beliebig viele
- Argumente haben dürfen (wie "cond").
-
-3. Die Basisfunktion "eq" hat immer einen wohldefinierten Wert, dessen Bedeutung
- im Fall, daß Nicht-Atome verglichen werden, im Kapitel über Listenstrukturen
- erklärt wird.
-
-4. Außer in sehr seltenen Fällen schreibt man nicht (quote T), (quote F) oder (quote
- NIL), sondern T, F und NIL.
-
-5. Es besteht die Möglichkeit, mit Ganzzahlen zu rechen, die als weiterer Typ von
- Atomen gelten. Außerdem können TEXTe und Einzelzeichen (CHARACTERs)
- gespeichert werden.
-
-6. Es besteht die Möglichkeit der Ein- und Ausgabe von LISP-Ausdrücken, Ganz­
- zahlen, TEXTen und CHARACTERs.
-
-WARNUNG: Die oben angegebenen Definitionen von "eval" und "apply" dienen nur
- pädagogischen Zwecken und sind nicht das, was wirklich im Interpreter
- abläuft.
- Um zu entscheiden, was wirklich vor sich geht, wenn der Interpreter
- aufgerufen wird, sollte man sich an die ELAN-Quellprogramme halten.
-#page#
-
-2.2 Anwendungsregeln und Beispiele #goalpage("p2.2")#
-
-
-
-Die Funktionsweise des LISP-Interpreteres kann bequem unter Verwendung der
-Funktion "trace" verfolgt werden. Der Aufruf:
-
-
- (trace)
-
-
-schaltet den Trace-Protokollmodus des Interpreters ein bzw. aus.
-
-Das folgende Beispiel ist ein LISP-Programm, das die drei Funktionen "union",
-"intersection" und "member" als Standardfunktionen einführt Die Funktionen lauten
-folgendermaßen:
-
-
- (member pattern list) = (cond ((null list) F)
- ((eq (head list) pattern) T)
- (T (member pattern (tail list)))
- )
-
- (union x y) = (cond ((null x) y)
- ((member (head x) y) (union (tail x) y))
- (T (cons (head x) (union (tail x) y)))
- )
-
- (intersection x y) = (cond ((null x) NIL)
- ((member (head x) y)
- (cons (head x) (intersection
- (tail x) y))
- )
- (T (intersection (tail x) y))
- )
-
-
-Um die Funktionen als neue Standardfunktionen einzuführen, benutzen wir die Pseu­
-dofunktion "define":
-
-
- (DEFINE
- (MEMBER . (LAMBDA (PATTERN LIST)
- (COND ((NULL LIST) F)
- ((EQ (HEAD LIST) PATTERN) T)
- (T (MEMBER PATTERN (TAIL LIST)))
- ) ) )
- (UNION . (LAMBDA (X Y)
- (COND ((NULL X) Y)
- ((MEMBER (HEAD X) Y) (UNION (TAIL X) Y))
- (T (CONS (HEAD X) (UNION (TAIL X) Y)))
- ) ) )
- (INTERSECTION . (LAMBDA (X Y)
- (COND ((NULL X) NIL)
- ((MEMBER (HEAD X) Y)
- (CONS (HEAD X) (INTERSECTION (TAIL
- X) Y))
- )
- (T (INTERSECTION (TAIL X) Y))
- ) ) )
- )
-
-
-Die Funktion DEFINE, liefert als Pseudofunktion nicht nur einen LISP-Ausdruck als
-Ergebnis, sondern hat auch einen bleibenden Effekt, nämlich eine Veränderung im
-LISP-Heap.
-
-DEFINE hat beliebig viele Parameter der Form (Name . Funktion) und bewirkt, daß die
-Funktionen unter dem jeweiligen Namen im System verfügbar werden, also für die
-weitere Programmausführung definiert werden. Das Ergebnis von DEFINE ist eine
-Liste der neuen Funktionsnamen, also hier
-
-
- (MEMBER UNION INTERSECTION)
-
-
-Der Wert den der LISP-Interpreter bei Eingabe von
-
-
- (intersection (a1 a2 a3) (a1 a3 a5))
-
-
-liefert ist (A1 A3) ,
-
-
-Die Funktion
-
-
- (union (x y z) (u v w x))
-
-
-liefert (Y Z U V W X) .
-
-
-
-Es folgen einige elementare Regeln für LISP-Programme:
-
-1. Ein LISP-Programm besteht aus einem Funktionsaufruf. Im Beispiel ist das die
- Funktion DEFINE, die ihre Parameter (beliebig viele) berechnet und ausgibt. Die
- Berechnung der Parameter erfolgt dabei in der Reihenfolge der Parameter (norma­
- le LISP-Funktionen mit mehreren Parametern berechnen standardmäßig alle
- Parameter, allerdings in irgendeiner Reihenfolge).
-
-2. LISP ist formatfrei, d.h. jedes Symbol kann in jeder Spalte stehen. Für die Bedeu­
- tung des Programms ist nur die Reihenfolge der Symbole maßgeblich. Zeilen­
- wechsel wird als Leerzeichen aufgefaßt.
-
-3. Atome müssen mit einem Buchstaben anfangen, damit sie nicht mit Zahlen ver­
- wechselt werden.
-
-4. Ein LISP-Ausdruck der Form (A B C . D) ist eine Abkürzung für (A.(B.(C.D))).
- Jede andere Plazierung des Punkts ist ein Fehler (falsch wäre z.B. (A . B C) ).
-
-5. Eine Anzahl von Basisfuntionen existiert von Anfang an, ohne daß sie durch
- DEFINE eingeführt wurden. Der Programmierer kann weitere Funktionen bleibend
- oder für die Dauer eines Programmlaufs einführen; dabei ist die Reihenfolge der
- neuen Funktionen gleichgültig.
-#page#
-
-2.3 Variablen#goalpage("p2.3")#
-
-
-
-Eine Variable ist ein Symbol, das ein Argument einer Funktion repräsentiert. Man
-kann also schreiben: "a + b, wobei a = 3 und b = 4". In dieser Situation ist keine
-Verwechslung möglich, so daß klar ist, daß das Ergebnis 7 ist. Um zu diesem Ergeb­
-nis zu kommen, muß man die Zahlen anstelle der Variablen einsetzen und die Opera­
-tion ausführen, d.h. die Zahlen addieren.
-
-Ein Grund, weshalb das eindeutig ist, liegt darin, daß "a" und "b" nicht "direkt"
-addiert werden können, so daß etwa "ab" entsteht. In LISP kann die Situation viel
-komplizierter sein. Ein Atom kann eine Variable oder ein Atom sein.
-
-Sollte der zukünftige LISP-Benutzer an dieser Stelle entmutigt sein, sei ihm gesagt,
-daß hier nichts Neues eingeführt wird. Dieser Abschnitt ist nur eine Wiederholung der
-Ãœberlegungen aus Abschnitt 1.4. Alles, was wir in diesem Abschnitt sagen, kann man
-aus den Regeln für LISP-Ausdrücke oder aus der allgemeinen Funktion "evalquote"
-ableiten.
-
-Der Formalismus, der in LISP die Variablen kennzeichnet, ist die Lambdanotation von
-Church. Der Teil des Interpreters, der die Variablen an Werte bindet, heißt "apply".
-Wenn "apply" auf eine Funktion stößt, die mit LAMBDA anfängt, wird die Variablenli­
-ste (Argumentliste) mit der Parameterliste gepaart und am Anfang der Bindeliste
-eingefügt.
-
-Während der Berechnung des Funktionsrumpfs müssen manchmal Variablen durch
-ihre Werte ersetzt werden. Das geschieht dadurch, daß ihr Wert in der Bindeliste
-nachgesehen wird. Wenn eine Variable mehrmals gebunden wurde, wird die zuletzt
-etablierte Bindung verwendet. Der Teil des Interpreters, der diese "Berechnungen"
-und die Berechnung von Funktionsaufrufen durchführt, heißt "eval".
-
-
-
-#page#
-
-2.4 Konstanten#goalpage("p2.4")#
-
-
-
-Manchmal heißt es, eine Konstante stehe für sich selbst, im Gegensatz zu einer
-Variablen, die für etwas anderes, nämlich ihren Wert, steht.
-Dies Konzept funktioniert in LISP nicht so ohne weiteres; es ist hier sinnvoller, zu
-sagen, eine Variable ist konstanter als die andere, wenn sie in einer höheren Ebene
-gebunden ist und ihren Wert seltener ändert.
-In LISP bleibt eine Variable im Bereich des LAMBDA konstant, von dem sie gebunden
-ist. Wenn eine Variable einen festen Wert hat, unabhängig davon, was in der Bindeli­
-ste steht, wird sie (echte) Konstante genannt. Dies wird mit Hilfe der Eigenschaftsliste
-(E-Liste) des Atoms erreicht.
-Jedes Atom hat eine E-Liste, in der Paare von Atomen und beliebigen Strukturen
-gespeichert sind. Ein Atom hat die Eigenschaft A, wenn in seiner E-Liste ein Paar
-mit dem Atom A enthält; die dazugehörige "beliebige Struktur" heißt Wert dieser
-Eigenschaft.
-Wenn ein Atom die Eigenschaft APVAL besitzt, ist es eine Konstante, deren Wert der
-Wert der Eigenschaft ist.
-Konstanten können durch die Pseudofunktion
-
-
- (set atom wert)
-
-
-gesetzt werden; nach der Auswertung eines solchen Aufrufs hat das Atom "atom"
-immer den Wert "wert" - bis zum nächsten "set". Eine interessante Klasse von
-Konstanten sind solche Konstanten, die sich selbst als Wert haben. Ein Beispiel dafür
-ist NIL. Der Wert dieser Konstanten ist wieder NIL. Daher kann NIL nicht als Variable
-benutzt werden, da es ja eine Konstante ist. (T und F gehören ebenfalls zu dieser
-Klasse).
-
-#page#
-
-2.5 Funktionen#goalpage("p2.5")#
-
-
-
-Wenn ein LISP-Ausdruck für eine Funktion steht, ist die Situation ähnlich der, in der
-ein Atom für einen Wert steht. Wenn die Funktion rekursiv ist, muß sie einen Namen
-bekommen. Das geht mit einem LABEL-Ausdruck, der den Namen mit der Funk­
-tionsdefinition in der Bindeliste paart. Dadurch wird der Name an die Funktionsdefini­
-tion gebunden, so wie eine Variable an ihren Wert gebunden wird. In der Praxis setzt
-man LABEL selten ein. Normalerweise ist es einfacher, Name und Definition wie bei
-den Konstanten zu verknüpfen. Dies geschieht mit der Pseudofunktion DEFINE, die
-wir am Anfang des Kapitels benutzt haben.
-Diese Funktion kann beliebig viele Parameter der Form
-
-
- (atom . funktion)
-
-
-haben, wobei "atom" der Name der zu definierenden Funktion "funktion" werden soll.
-Sie bewirkt, daß die Definition unter der Eigenschaft FUNCTION in der E-Liste des
-Atoms abgelegt wird.
-#page#
-
-3. Erweitertes LISP#goalpage("p3")#
-
-
-In diesem Kapitel werden wir einige Erweiterungen zum reinen LISP einführen. Zu
-diesen Erweiterungen gehören Möglichkeiten für Arithmetik, Zeichenkettenverarbei­
-tung, Funktionen, die spezielle Argumente erwarten, und Ein- und Ausgabe.
-
-In allen Fällen handelt es sich bei den Erweiterungen um zusätzliche Funktionen. So
-heißt das Kommando für die Ausgabe eines LISP-Ausdrucks PUT. Syntaktisch ist
-PUT nichts anderes als eine Funktion mit einem Argument. Sie kann mit anderen
-Funktionen verkettet werden, und diese Verkettung wird ganz auf die übliche Art
-behandelt, zuerst Berechnung der innern, dann der äußeren Funktionsaufrufe. Ein
-Ergebnis ist nur in dem trivialen Sinn vorhanden, daß PUT sein Argument wieder
-liefert, also die Identität ist.
-
-Funktionen, die eine Aktion wie Ein- oder Ausgabe bewirken, oder die Langzeitwir­
-kung (gesehen auf die Ausführungsdauer des Programms) haben, wie DEFINE und
-SET, heißen Pseudofunktionen. Es ist eine Besonderheit von LISP, daß alle Funktio­
-nen einschließlich den Pseudofunktionen ein Ergebnis haben müssen. In einigen
-Fällen ist das Ergebnis trivial und kann ignoriert werden.
-
-In diesem Kapitel beschreiben wir verschiedene Erweiterungen der Sprache LISP, die
-im System fest enthalten sind.
-
-
-#page#
-
-3.1 Gequotete Parameter #goalpage("p3.1")#
-
-
-
-Bevor ein Argument an eine Funktion übergeben wird, wird erst sein Wert in der
-Bindeliste nachgesehen, d.h. es wird nicht der Name der Variablen übergeben, son­
-dern ihr Wert. Wenn das Argument als Konstante behandelt werden soll, muß es
-ge"quotet" werden, d.h. statt "argument" steht (quote argument). Wenn ein Argument
-einer Funktion immer als Konstante behandelt werden soll, ist es bequemer, das
-Argument nicht jedesmal zu quoten. Das EUMEL-LISP-System erlaubt, in diesem
-Fall den formalen Parameter in der Funktionsdefinition bereits zu quoten.
-
-Dieser Mechanismus wurde auch benutzt, um QUOTE zu implementieren; die Funk­
-tion lautet
-
-
- quote = (lambda ((QUOTE x)) x)
-
-
-
-
-#page#
-
-3.2 Funktionen mit beliebig vielen
- Argumenten #goalpage("p3.2")#
-
-
-
-Ein Beispiel ist "list", das beliebig viele Argumente haben kann, die zu einer Liste
-zusammengefaßt werden. Da eine Funktion nur eine feste Anzahl von Parametern
-haben kann, eine Funktion mit beliebig vielen Argumenten aber gewiß keine feste
-Anzahl von Argumenten hat, werden die beliebig vielen Argumente zu einer Liste
-zusammengefaßt und ein einziger Parameter wird an diese Liste gebunden. Da "list"
-genau diese Liste liefern soll, wird diese Funktion ebenfalls zu einer "Identität":
-
-
- list = (lambda ((INDEFINITE x)) x)
-
-
-Solche Parameter werden durch INDEFINITE gekennzeichnet. Sie können auch ge­
-quotet werden, indem man (INDEFINITE QUOTE parameter) schreibt; das wirkt so, als
-wären alle Argumente, die diesem Parameter zugeordnet werden, einzeln gequotet
-worden.
-
-
- evalquote = (lambda (fkt (INDEFINITE QUOTE expr))
- (apply fkt expr NIL) )
-
-
-
-#page#
-
-3.3 Funktionale Parameter #goalpage("p3.3")#
-
-
-
-In der Mathematik gibt es Funktionen, die andere Funktionen als Argument haben. In
-der Algebra könnte man die Funktion "(operation operator a b)" definieren, wobei
-"operator" ein funktionales Argument ist, das die Operation festlegt, die auf "a" und
-"b" ausgeführt werden soll. Beispielsweise gilt
-
-
- operation (+ 3 4) = 7
- operation (* 3 4) = 12
-
-
-In LISP sind funktionale Argumente sehr nützlich. Eine wichtige Funktion mit einem
-Argument ist MAPLIST. Ihre Definition ist
-
-
- (LAMBDA (LIST (FUNCTION FN))
- (COND ((NULL LIST) NIL)
- (T (CONS (FN (HEAD LIST)) (MAPLIST (TAIL LIST) FN)))
- ) )
-
-
-Diese Funktion nimmt eine Liste und eine Funktion als Argument und wendet die
-Funktion auf die Listenelemente an.
-
-
-#page#
-
-3.4 Prädikate und boolesche Konstanten #goalpage("p3.4")#
-
-
-
-Die booleschen Werte sind, wie in Kapitel 1 gesagt, T und F. Bei LISP-Ausdrücken
-müßte daraus (quote T) und (quote F) werden, aber da die APVALs dieser Atome
-wieder den Wert T und F haben, ist das quoten nicht nötig.
-
-Prädikate sind Funktionen, die T oder F als Ergebnis haben; es gibt also keine forma­
-len Unterschiede zwischen anderen Funktionen und Prädikaten.
-
-Daher ist es durchaus möglich, daß eine Funktion einen Wert liefert, der weder T
-noch F ist, daß aber durch einen bedingten Ausdruck an dieser Stelle ein boolescher
-Ausdruck verlangt wird. In diesem Fall ist die Wirkung des Ausdrucks nicht definiert.
-
-Das Prädikat EQ hat folgendes Verhalten:
-1. Wenn seine Argumente verschieden sind, ist das Ergebnis F.
-2. Wenn die Argumente dasselbe Atom sind, ist das Ergebnis T.
-3. Wenn die Argumente gleich, aber nicht atomar sind, ist das Ergebnis T oder F, je
- nachdem, ob sie ein und dasselbe Objekt im Heap sind oder nicht.
-
-#page#
-
-3.5 Unbenannte Atome #goalpage("p3.5")#
-
-
-
-Die meisten Atome im EUMEL-LISP haben einen Namen, der sie bei Ein- und
-Ausgabeoperationen identifiziert.
-Es gibt aber auch Atome, die keinen Namen haben und stattdessen durch ihre Werte
-repräsentiert werden. Momentan sind das Ganzzahlen und Zeichenketten (TEXTe);
-auch die booleschen Werte kann man in einem weiteren Sinn dazurechnen.
-
-
-
-
-3.5.1 Ganzzahlen
-
-
-
-Im EUMEL-LISP gibt es Funktionen, die Basisoperationen und Tests durchführen.
-
-Ganzzahlen haben folgende Eigenschaften:
-
-1. Eine Ganzzahl besteht aus einem optionalen Vorzeichen und einer Folge von
- Ziffern; zwischen Vorzeichen und Ziffern können Leerzeichen stehen.
-2. Der Wert einer Ganzzahl liegt zwischen -32768 und 32767 (minint und maxint).
-3. Eine Ganzzahl kann überall dort stehen, wo ein Atom stehen kann, außer als
- Parameter.
-4. Ganzzahlen sind Konstanten; sie brauchen also nicht gequotet werden.
-#page#
-
-3.5.2 Arithmetische Funktionen und Prädikate
-
-
-
-Es folgt eine Liste aller arithmetischen Funktionen.
-Wenn ein Argument einer dieser Zahlen keine Ganzzahl ist, erfolgt eine Fehlermel­
-dung.
-
- (sum x1 ... xn) liefert die Summe der xi; wenn keine Argumente gege­
- ben werden, wird 0 geliefert.
- (difference x y) liefert die Differenz von x und y.
- (product x1 ... xn) liefert das Produkt seiner Argumente; wenn
- keine Argumente gegeben werden, wird 1
- geliefert.
- (quotient x y) liefert den Quotienten von x und y, ohne den
- Rest zu berücksichtigen.
- (remainder x y) liefert den Rest der Division von x und y.
- (getint) liest eine Zahl vom Bildschirm ein und
- liefert sie.
- (putint x) gibt x auf den Bildschirm aus. Identitäts funktion.
-
-
-
-
-
-3.5.3 Zeichenkettenverarbeitung
-
-
-
-Im Moment ist nur Zeichenketten-Ein- und Ausgabe implementiert.
-Die Ausgabe löst bei Argumenten, die keine Zeichenketten sind, eine Fehlermeldung
-aus.
-
- (gettext) liest eine Zeichenkette ein und liefert sie.
- (puttext x) gibt eine Zeichenkette aus.
-
-
-
-
-3.5.4 Test auf Gleichheit
-
-
-
- (equal x y) testet, ob x und y vom gleichen Typ sind, und wenn ja, ob sie gleich
- sind.
-#page#
-
-3.6 Aufruf von EUMEL aus #goalpage("p3.6")#
-
-
-Bevor man den LISP-Interpreter benutzen kann, muß er folgendermaßen implemen­
-tiert werden:
-
-archive ("lisp")
-fetch all (archive)
-release (archive)
-check off
-insert ("lisp.1")
-insert ("lisp.2")
-insert ("lisp.3")
-insert ("lisp.4")
-check on
-
-
-Das LISP-System verfügt über einen Heap, in dem alle LISP-Ausdrücke gespei­
-chert sind. Standardmäßig enthält der Heap eine Reihe von Funktionen, die nicht in
-den LISP-Programmen definiert werden müssen (Übersichten über die Standardfunk­
-tionen siehe Kapitel 3.5).
-
-Mit
- lisp
-
-wird das LISP-System im EUMEL-Dialog gestartet. In einem Eingabefenster wird
-mit Hilfe des Paralleleditors eine LISP-EINGABE-Möglichkeit angeboten. Die Aus­
-gabe erfolgt in dem LISP-AUSGABE-Fenster.
-Das LISP-System kann folgendermaßen verlassen werden:
-<ESC> <ESC> break lisp <RETURN>.
-
-Statt dieser direkten Art der Benutzung der LISP-Maschine ist auch eine an ELAN
-angelehnte Art mit den Prozeduren "run lisp", insert lisp" usw. vorgesehen:
-
-Mit
-
- run lisp (TEXT CONST dateiname)
-
-wird eine Kopie des Heaps angelegt, das Programm aus der Datei "dateiname" in die
-Kopie eingelesen und gestartet. Durch diesen Kopiermechanismus wird der Original­
-heap vor Zusammenbrüchen des LISP-Systems geschützt.
-
- insert lisp (TEXT CONST dateiname)
-
-bewirkt dasselbe wie "run lisp"; allerdings wird jetzt direkt auf dem Originalheap
-gearbeitet. Dadurch sind alle Änderungen im Heap, die das Programm verursacht
-(meist Definition von Funktionen durch DEFINE) bleibend, aber auch ein Zusammen­
-bruch ist insoweit endgültig, als das LISP-System jetzt neu gestartet werden muß.
-Das geschieht mit
-
- start lisp system (DATASPACE CONST dsname)
-
-"dsname" gibt dabei den Datenraum an, der die zum Hochfahren notwendigen Daten
-enthält. Solche Daten im richtigen Format enthält der Datenraum "lisp.bootstrap".
-Wenn der zuletzt benutzte Heap mit nicht mehr durch LISP-Programme erreich­
-bare Strukturen vollgestopft ist, schafft die Prozedur
-
- collect lisp heap garbage
-
-Abhilfe; mit
-
- lisp storage info
-
-kann man den Erfolg kontrollieren.
-#page#
-
-4. Detailbeschreibungen#goalpage("p4")#
-
-
-
-
-
-4.1 Grundfunktionen #goalpage("p4.1")#
-
-
-
-Die Datei "lisp.1" enthält ein Paket, das die Grundlage des LISP-Systems bildet. Es
-implementiert
-
- - die primitiven LISP-Funktionen wie "cons", "null", etc.,
- - die Verwaltung des Heaps, in dem die LISP-Strukturen und die Objektliste
- (Oblist) gespeichert sind,
- - einen Datentyp SYM, dessen Wertevorrat aus Zeigern auf die im Heap gespei­
- cherten Strukturen besteht,
- - Funktionen zur Konversion allgemeiner Daten in LISP-Strukturen (bisher reali­
- siert: TEXT <--> SYM und INT <--> SYM).
-
-Durch die Implementation der Basisoperationen als exportierte und damit allgemein
-verfügbare ELAN-Prozeduren ist es möglich, LISP-Strukturen durch ELAN-Prog­
-ramme zu manipulieren; insbesonders können ELAN- und LISP-Programme über
-diese Strukturen miteinander kommunizieren.
-
-Anmerkung:
-Wenn Eigenschaften von "SYM"-Objekten beschrieben werden, sind immer die
-Eigenschaften der Strukturen gemeint, auf die die Objekte zeigen, wenn nichts ande­
-res angegeben wird.
-
-
-Es werden folgende Prozeduren exportiert:
-
- PROC initialize lisp system (DATASPACE CONST new heap):
- "new heap" ist der neue Datenraum, in dem der LISP-Heap ab sofort geführt
- wird.
- Vorsicht: Beim Wechsel zu einem neuen Datenraum sind die Werte der
- SYM-Variablen, die auf Strukturen im alten Heap zeigen, natürlich wertlos!
-
- PROC dump lisp heap (FILE VAR f):
- In "f" wird ein Dump des Heaps erstellt. Dieser Dump ist nur mit Kenntnis des
- Programmtextes aus "lisp 1" verständlich; er wird hier nicht beschrieben.
-
- PROC lisp storage (INT VAR size, used):
- Nach dem Aufruf gibt "size" die maximal verfügbare Anzahl von Knoten an,
- während "used" die Anzahl der tatsächlich von LISP-Strukturen belegten
- Knoten enthält. Zu diesen Strukturen können auch solche zählen, die nicht mehr
- durch "head" oder "tail" etc. erreichbar sind.
-
- PROC collect lisp heap garbage:
- Löscht die im LISP-Heap nicht mehr durch "atom (TEXT CONST)", "proper­
- ty", "head" und "tail" erreichbaren Strukturen. Es werden auch alle nur von
- ELAN-Programmen aus über SYM-Variable erreichbare Strukturen gelöscht, so
- daß die Werte dieser Variablen undefiniert werden.
- Die Müllabfuhr wird von keiner Prozedur dieses Pakets aufgerufen, d.h. der
- Benutzer, der ELAN-Programme einsetzt, braucht nicht alle Strukturen in den
- Eigenschaftslisten von Atomen aufzubauen, um sie vor einer versehentlichen
- Löschung durch die Müllabfuhr zu schützen, vorausgesetzt, er ruft sie nicht
- selbst auf. Er muß allerdings darauf achten, daß im Heap noch genug Platz
- bleibt.
-
- OP := (SYM VAR left, SYM CONST right):
- Nach der Zuweisung zeigt "left" auf die gleiche Struktur wie vorher "right".
-
- SYM CONST nil, pname;
- Zwei Konstanten, die dem LISP-System ständig zur Verfügung stehen müs­
- sen. Ihre Drucknamen sind "NIL" bzw. "PNAME" (vgl. Schlußbemerkungen)
-
- SYM PROC head (SYM CONST sym):
- Entspricht der im Handbuch beschriebenen Funktion "head".
-
- SYM PROC tail (SYM CONST sym):
- Entspricht der im Handbuch beschriebenen Funktion "tail".
-
- SYM PROC cons (SYM CONST head, tail):
- Liefert einen SYM-Wert "zeiger" auf eine neue Struktur. Es gilt:
- head ("zeiger") = "head" und tail ("zeiger") = "tail".
-
- BOOL PROC eq (SYM CONST sym 1, sym 2):
- Prüft, ob "sym 1" und "sym 2" auf dieselbe Struktur zeigen. Das ist genau dann
- der Fall, wenn sie durch Zuweisung auseinander hervorgegangen sind oder wenn
- sie auf das gleiche benannte Atom zeigen.
-
- BOOL PROC equal (SYM CONST sym 1, sym 2):
- Prüft, ob "sym 1" und "sym 2" dieselbe Struktur haben; "dieselbe Struktur"
- braucht aber nicht "Identität" zu bedeuten, wie "eq" das verlangt.
- Umgewandelte TEXTe und INTs werden richtig verglichen (siehe "sym (INT
- CONST)" und "sym (TEXT CONST)").
-
- BOOL PROC null (SYM CONST sym):
- Prüft, ob "sym" gleich der Konstanten "NIL" ist (entspricht
- eq ("sym", "NIL"), ist aber schneller).
-
- BOOL PROC atom (SYM CONST sym):
- Prüft, ob "sym" ein ( benanntes oder unbenanntes) Atom ist.
-
- BOOL PROC is named atom (SYM CONST sym):
- Prüft, ob "sym" ein benanntes Atom ist.
-
- PROC begin oblist dump:
- Vorbereitung für "next atom".
-
- SYM PROC next atom:
- Liefert das nächste Atom aus der Objektliste. In der Objektliste sind alle benann­
- ten Atome, die der Heap enthält, aufgeführt (bis auf Ausnahmen; s."delete
- atom"). "NIL" wird immer als letzte Atom geliefert.
-
- SYM PROC atom (TEXT CONST name):
- Liefert einen Zeiger auf das Atom mit dem Namen "name". Wenn kein solches
- Atom in der Objektliste vorhanden ist, wird "NIL" geliefert.
-
- SYM PROC new atom (TEXT CONST name):
- Liefert einen Zeiger auf das Atom mit dem Namen "name". Wenn kein solches
- Atom in der Objektliste vorhanden ist, wird ein neues mit diesem Namen in sie
- eingefügt.
-
- PROC create atom (TEXT CONST name):
- Fügt ein Atom mit dem Namen "name" in die Objektliste ein. Wenn ein solches
- Atom bereits existiert, wird stattdessen eine Fehlermeldung ausgegeben.
-
- PROC delete atom (SYM CONST atom):
- Streicht das Atom "atom" aus der Objektliste.
-
- PROC begin property list dump (SYM CONST atom):
- Vorbereitung für "next property".
-
- PROC next property (SYM VAR property id, property):
- Liefert die nächste Eigenschaft aus der Eigenschaftsliste des zuletzt durch
- "begin property list dump" vorbereiteten Atoms. Wenn es sich bei der Eigen­
- schaft um eine Flagge handelt, wird "property" auf "NIL" gesetzt; wenn es keine
- nächste Eigenschaft mehr gibt, werden "property" und "property id" auf "NIL"
- gesetzt.
- Der Dump der Eigenschaftsliste beeinträchtigt die "Verwendbarkeit" des Atoms in
- keiner Weise; es ist während des Dumps sogar möglich, Eigenschaften und
- Flaggen zu lesen. Wenn während des Dumps Eigenschaften oder Flaggen geän­
- dert oder geschrieben werden, ist mit fehlerhaften Dumpergebnissen zu rechnen.
-
- PROC add property (SYM CONST atom, property id, property):
- "property id" muß ein benanntes Atom sein. Führt eine neue Eigenschaft mit der
- Bezeichnung "property id" und dem Wert "property" ein. Wenn bereits eine
- Eigenschaft mit der gleichen Bezeichnung existiert, wird die alte Version über­
- deckt, ist aber weiter vorhanden.
-
- PROC alter property (SYM CONST atom, property id, property):
- Bringt die Eigenschaft mit der Bezeichnung "property id" auf den neuen Wert
- "property". Wenn eine Eigenschaft mit dieser Bezeichnung noch nicht existiert,
- wird eine Fehlermeldung ausgegeben.
-
- BOOL PROC property exists (SYM CONST atom, property id):
- Prüft, ob das Atom eine Eigenschaft mit der Bezeichnung "property id" besitzt.
-
- SYM PROC property (SYM CONST atom, property id):
- Liefert den Wert der gerade sichtbaren Eigenschaft des Atoms, die die Bezeich­
- nung "property id" hat. Falls die Eigenschaft nicht existiert, wird "NIL" geliefert.
-
- PROC delete property (SYM CONST atom, property id):
- Löscht den gerade sichtbaren Wert der Eigenschaft des Atoms, die die Bezeich­
- nung "property id" hat. Wenn eine ältere Version dieser Eigenschaft durch "add
- property" überdeckt wurde, wird diese jetzt wieder sichtbar. Jede Eigenschaft
- bildet also für jedes Atom einen Stapel (Stack).
-
- PROC add flag (SYM CONST atom, flag id):
- Das Atom "atom" erhält die Flagge "flag id". Ein Atom kann dieselbe Flagge
- durchaus mehrmals haben.
-
- BOOL PROC flag (SYM CONST atom, flag id):
- Prüft, ob "atom" mindestens eine Flagge "flag id" hat.
-
- PROC delete flag (SYM CONST atom, flag id):
- Löscht eine Flagge "flag id" von "atom". Wenn keine Flagge existiert, wird
- nichts getan.
-
- SYM PROC sym (TEXT CONST text):
- Konvertiert "text" in ein unbenanntes Atom und liefert einen Zeiger auf dies
- Atom.
-
- TEXT PROC text (SYM CONST sym):
- Konvertiert "sym" in einen TEXT zurück, wenn es sich um einen konvertierten
- TEXT handelt; wenn nicht, wird eine Fehlermeldung ausgegeben.
-
- BOOL PROC is text (SYM CONST sym):
- Prüft, ob "sym" ein konvertierter TEXT ist.
-
- SYM PROC sym character (TEXT CONST text):
- "text" muß genau ein Zeichen enthalten. Das Zeichen wird in ein
- CHARACTER-Objekt im Heap konvertiert und ein Zeiger auf dies Objekt gelie­
- fert.
-
- INT PROC character (SYM CONST sym):
- "sym" muß auf ein CHARACTER-Objekt zeigen. Geliefert wird der Code des
- dort gespeicherten Zeichens.
-
- SYM PROC sym (INT CONST i 1, i 2):
- Konvertiert "i 1" und "i 2" in ein unbenanntes Atom und liefert einen Zeiger
- darauf.
-
- INT PROC int 1 (SYM CONST sym):
- INT PROC int 2 (SYM CONST sym):
- Holt die Werte der ersten bzw. zweiten Ganzzahl aus "sym", wenn es sich um
- ein konvertiertes INT-Paar handelt; wenn nicht, wird eine Fehlermeldung ausge­
- geben.
-
- BOOL PROC is int pair (SYM CONST sym):
- Prüft, ob "sym" ein konvertiertes INT-Paar ist.
-
-
-Prozedurübergreifende Aussagen über das Paket "lisp.1":
-
- - Es gibt benannte und unbenannte Atome.
-
- - Die unbenannten Atome sind Konversionsprodukte.
-
- - Vor dem ersten Aufruf von "delete atom" sind alle benannten Atome in der Ob­
- jektliste enthalten; d.h. sie können alle durch "begin oblist dump" und wiederhol­
- ten Aufruf von "next atom" erreicht werden.
-
- - Jedes benannte Atom hat genau einen Namen, der immer gleich bleibt. Der
- Name ist als Eigenschaft mit der Bezeichnung "pname" in der Eigenschaftsliste
- gespeichert. "add property", "alter property" und "delete property" geben des­
- halb eine Fehlermeldung aus, statt ihre normalen Aktionen durchzuführen, wenn
- ihnen als Eigenschaftsbezeichnung "pname" übergeben wird.
-
- - Es gibt keine zwei Atome, die denselben Namen haben; dadurch reduziert sich
- die bei "eq" angegebene Fallunterscheidung auf einen Fall.
-
- - Es kann durchaus zwei unbenannte Atome mit gleichen Werten geben, die von
- "eq" nicht als gleich anerkannt werden, weil sie in verschiedenen Strukturen
- gespeichert sind. "equal" achtet nicht auf die Position, sondern auf die Werte
- der zu vergleichenden Strukturen.
-
- - Mehrfache Zugriffe auf die gleiche Eigenschaft desselben Atoms werden so opti­
- miert, daß die Eigenschaftsliste nur beim ersten Zugriff (meist durch "property
- exists") durchsucht werden muß.
-
-
-
-#page#
-
-4.2 Weitere Funktionen sowie Eingabe und
- Ausgabe #goalpage("p4.2")#
-
-
-
-Die Datei "lisp.2" enthält diverse Pakete, die die Verbindung vom LISP-System zur
-normalen EUMEL-Umgebung bilden. Momentan sind das Ein- und Ausgabe und
-(exemplarisch) die fünf Grundrechenarten für Ganzzahlen.
-
-Die Ein- und Ausgabe von LISP-Strukturen wird durch das Paket namens "lisp io"
-mit den folgenden Prozeduren ermöglicht:
-
- PROC get (FILE VAR f, SYM VAR sym):
- Nach dem Aufruf zeigt "sym" auf eine neue aus "f" eingelesene Struktur.
- In der ersten und hinter der letzten Zeile des S-Ausdrucks dürfen keine weiteren
- Daten stehen.
-
- PROC get all (FILE VAR f, SYM VAR sym):
- Wie "get (FILE V, SYM V)", nur daß die Datei nichts als den S-Ausdruck ent­
- halten darf.
-
- PROC get (SYM VAR sym):
- Es wird mit "get all" ein S-Audruck von einer Scratch-Datei eingelesen, die
- dem Benutzer vorher zum Editieren angeboten wird. Bei Einlesefehlern wird die
- Datei zu Korrigieren angeboten, bis keine Fehler mehr auftreten.
-
- PROC put (FILE VAR f, SYM CONST sym):
- Wenn "sym" ein Ganzzahlpaar ist, wird die erste Zahl ausgegeben; wenn es ein
- konvertierter TEXT ist, wird der ursprüngliche TEXT wieder ausgegeben; bei
- einem benannten Atom oder einer allgemeinen LISP-Struktur wird ein S-Aus­
- druck ausgegeben.
-
- PROC put (SYM CONST sym):
- Wie "put (FILE V, SYM CONST), außer daß die Augabe direkt auf den Bildschirm
- erfolgt.
-
-
-Das Paket "lisp int" enthält die Prozeduren
-
- SYM PROC sum (SYM CONST summandenliste);
- Erwartet eine Liste von "int pair"-Summanden und liefert deren Summe.
-
- SYM PROC difference (SYM CONST minuend, subtrahend):
- Liefert die Differenz der Parameter.
-
- SYM PROC product (SYM CONST faktorenliste):
- Liefert das Produkt der Listenelemente.
-
- SYM PROC quotient (SYM CONST dividend, divisor):
- Liefert den Quotienten der Parameter.
-
- SYM PROC remainder (SYM CONST dividend, divisor):
- Liefert den Rest.
-
-#page#
-
-4.3 Interpreter #goalpage("p4.3")#
-
-
-Die Datei "lisp.3" enthält das Paket "lisp interpreter", das die Prozedur
-
- SYM PROC evalquote (SYM CONST expression)
-
-exportiert. Es handelt sich dabei um den im EUMEL-LISP-Handbuch beschriebe­
-nen Interpreter.
-
-Wenn "expression" ein LISP-Ausdruck ist, liefert die Prozedur den Wert des Aus­
-drucks (vorausgesetzt, der LISP-Heap ist vorbereitet, siehe lisp.1).
-
-Wirkungsweise:
-"evalquote" ruft im Wesentlichen die Prozedur "eval" auf.
-"eval" erwartet als Argumente einen solchen LISP-Ausdruck wie "evalquote", benö­
-tigt aber zusätzlich eine sog. Bindeliste. In einer Bindeliste sind durch LAMBDA- und
-LABEL-Ausdrücke bereits gebundene Variable und ihre Werte gespeichert. Die
-Manipulation der Bindeliste ist durch eine Reihe von Refinements, die am Schluß des
-Pakets stehen, realisiert.
-
-Da bisher noch keine LAMBDA- oder LABEL-Ausdrücke verarbeitet wurden, über­
-gibt "evalquote" die leere Bindeliste.
-
-Wirkungsweise von
-
- SYM PROC eval (SYM CONST expression, association list):
-
-"eval" kann als erstes Argument ein Atom oder eine zusammengesetzte Struktur
-erhalten.
-
-Atome werden als Variable aufgefaßt, deren Wert in der Bindeliste aufzusuchen ist.
-Vor der Konsultation der Bindeliste wird allerdings noch nach der Eigenschaft APVAL
-des Atoms gesehen; wenn sie vorhanden ist, handelt es sich um eine Konstante wie
-NIL, T oder F, die einen festen Wert hat, nämlich den Wert dieser Eigenschaft. Da
-diese Konstanten sich selbst als Wert haben, gilt "eval (NIL, Bindeliste) = NIL"
-(entsprechend für "T" und "F").
-
-Wenn das erste Arugment von "eval" zusammengesetzt ist, wird angenommen, daß
-es sich um einen Funktionsaufruf der Form
-
-
- +-----+-----+
- | o | o--+--> Argumentliste
- +--+--+-----+
- |
- V
- Funktion
-
-
-handelt. Die Bestandteile "Funktion" und "Argumentliste" werden mit der Bindeliste
-übergeben an:
-
- SYM PROC apply (SYM CONST function, arguments, association list):
-
-"apply" hat die Aufgabe, die Argumente durch "eval" berechnen zu lassen (das
-unterbleibt allerdings unter bestimmten Umständen) und die Berechnungergebnisse an
-die Parameter der Funktion zu binden; zum Schluß muß der Wert des Funktions­
-rumpfs in Abhängigkeit von diesen neuen Bindungen als Ergebnis der gesamten
-Prozedur "apply" berechnet werden; diese Berechnung geschieht wieder durch
-"eval".
-
-Nur in einem LAMBDA-Ausdruck ist direkt bekannt, wo die Parameterliste steht.So­
-lange das nicht der Fall ist, muß entweder ein LABEL-Ausdruck oder ein Atom
-vorliegen.
-Ein LABEL-Ausdruck hat die Form
-
-
- +-----+-----+ +-----+-----+ +-----+-----+
- | o | o--+--->| o | o--+--->| o | NIL |
- +--+--+-----+ +--+--+-----+ +--+--+-----+
- | | |
- V V V
- LABEL Name Funktion
-
-
-Da der Name für die Dauer der Auswertung des Funktionsrumpfs an die Funktion
-gebunden sein muß, wird dis Paar als funktionaler Bindelisteneintrag gespeichert.
-Funktionale und nichtfunktionale Bindelisteneinträge sind eindeutig unterschieden.
-
-Nach dem Abspeichern wird wieder getestet, ob die Funktion diesmal ein
-LAMBDA-Ausdruck ist; wenn nicht, wird ein weiterer Schritt zum "Ablättern" von
-LABELs und Atomen versucht, usw.
-
-Wenn die Funktion ein Atom ist, werden analog zu den Vorgängen in "eval" erst die
-Eigenschaftsliste und dann die Bindeliste durchsucht.
-
-Ist die Eigenschaft FUNCTION in der Eigenschaftsliste vorhanden, ist der Wert der
-Eigenschaft die (evtl. weiter "abzublätternde") Funktion; ist die Eigenschaft nicht
-vorhanden, muß das Atom an eine Funktion gebunden sein, die dann aus der Binde­
-liste geholt werden kann.
-
-Da alle Funktionen (auch die Standardfunktionen) letztendlich als LAMBDA-Aus­
-drücke definiert sind, kommt "apply" auf diese Weise zuletzt zu einem LAMBDA-
-Ausdruck.
-
-Ein LAMBDA-Ausdruck hat die Form
-
-
- +-----+-----+ +-----+-----+ +-----+-----+
- | o | o--+--->| o | o--+--->| | |
- +--+--+-----+ +--+--+-----+ +-----+-----+
- | |
- V V
- LAMBDA Parameterliste
-
-
-Als nächster Schritt werden die Argumente für die zu berechnende Funktion an die
-Parameter der Parameterliste gebunden, d.h. es werden Parameter-Argument-Paare
-in die Bindeliste eingetragen.
-
-Die Methode des Eintrags ist je nach Art des Parameters unterschiedlich. Es gibt die
-folgenden Arten von Parametern:
-
-
- 1. |
- |
- V
- Name
-
-
- "Name" ist hier - wie bei den restlichen Fällen - der Name des Parame­
- ters. Diese Art von Parametern ist der Normalfall; die Argumente, die einem
- solchen Parameter entsprechen, werden durch "eval" berechnet und zusammen
- mit dem Parameter in einem Bindelisteneintrag gespeichert.
-
-
- 2. |
- |
- V
- +-----+-----+ +-----+-----+
- | o | o--+--->| o | NIL +
- +--+--+-----+ +--+--+-----+
- | |
- V V
- QUOTE Name
-
-
- In diesem Fall wird das Argument ohne weitere Verarbeitung in die Bindeliste
- übernommen. Die Wirkung ist die gleiche, als wäre das Argument durch
- "(QUOTE ... )" eingeschlossen.
-
-
- 3. |
- |
- V
- +-----+-----+ +-----+-----+
- | o | o--+--->| o | NIL |
- +--+--+-----+ +--+--+-----+
- | |
- V V
- FUNCTION Name
-
-
- Hier wird ein funktionaler Bindelisteneintrag erzeugt, so daß "Name" im Funk­
- tionsrumpf als Name einer Funktion auftreten kann.
-
-
- 4. |
- |
- V
- +-----+-----+ +-----+-----+
- | o | o--+--->| o | NIL |
- +--+--+-----+ +--+--+-----+
- | |
- V V
- INDEFINITE Name
-
-
- Dies ist ein Parameter, der beliebig viele berechnete Argumente aufnehmen
- kann. Der Einfachheit halber werden die Ergebnisse zu einer Liste zusammen­
- gefaßt und mit "Name" in einen Bindelisteneintrag gesteckt.
-
-
- 5. |
- |
- V
- +-----+-----+ +-----+-----+ +-----+-----+
- | o | o--+--->| o | o--+--->| o | NIL |
- +--+--+-----+ +--+--+-----+ +--+--+-----+
- | | |
- V V V
- INDEFINITE QUOTE Name
-
-
- Dieser Parameter kann wie der in Fall 4. aufgeführte beliebig viele Argumente
- aufnehmen, die zu einer Liste zusammengefaßt werden. Im Gegensatz zu 4.
- wird aber wie bei 2. nichts durch "eval" berechnet, sondern die Argumente so
- wie sie vorkommen übernommen.
-
-Auf einen Parameter der Form 4. oder 5. darf kein weiterer Parameter folgen, weil
-solch ein Parameter alle restlichen Argumente verbraucht. Solchen Parametern darf -
-als Ausnahme - auch kein Argument entsprechen; dann werden sie an die leere
-Liste (d.h. NIL) gebunden.
-
-Der letzte Kasten in der Beschreibung des LAMBDA-Ausdrucks ist mit Absicht leer
-geblieben; er kann eine der Formen
-
-
- +-----+-----+ +----------+----------+
- | o | NIL | oder | Ganzzahl | XXXXXXXX |
- +--+--+-----+ +----------+----------+
- |
- V
- Funktionsrumpf
-
-
-annehmen.
-
-Die erste Form heißt, daß die Funktion durch Berechnung des Funktionsrumpfs mittels
-"eval" berechnet werden soll; die zweite Form bewirkt den Aufruf einer der Standard­
-funktionen, je nachdem, welche Funktionsnummer bei "Ganzzahl" steht. In diesem
-zweiten Fall werden die Argumente aber nicht durch den Namen des Parameters
-identifiziert, sondern durch die Position des Eintrags in der Bindeliste. Dieser Pro­
-grammteil hängt also wesentlich von der Reihenfolge ab, in der die Bindelisteneinträ­
-ge, die bei der Parameter-Argument-Zuordnung entstehen, in die Bindeliste einge­
-fügt werden. Zur Zeit ist das die Umkehrung der Reihenfolge der Parameter.
-
-Die Namen der Refinements "arg 1", "arg 2", "arg 3" beziehen sich auch nicht auf
-die Position des Arguments in der Argumentsliste, sondern auf die Position des
-Eintrags in der Bindeliste.
-
-#page#
-
-4.4 Kommandoprozeduren #goalpage("p4.4")#
-
-
-
-Die Datei "lisp.4" enthält eine Reihe von Prozeduren, mit denen der LISP-Interpre­
-ter ähnlich wie der ELAN-Compiler aufgerufen werden kann.
-
-Die Prozedur
-
- start lisp system
-
-ermöglicht das erneute Starten des LISP-Systems, oder wenn "übersetzte" Pro­
-gramme, die in einem Heap einer anderen Task liegen, in dieser Task verarbeitet
-werden sollen.
-
-Die Prozedur
-
- lisp
-
-stellt die LISP-Maschine in einem Doppelfenster im Bildschirmdialog zur Verfügung.
-Bei der erstmaligen Benutzung muß die Datei "lisp.bootstrap" vorhanden sein.
-
-Die Prozedur
-
- break lisp
-
-koppelt die LISP-Task vom Benutzer-Terminal ab und baut das Doppelfenster für
-den Bildschirmdialog neu auf.
-
-
-Die Prozedur
-
- run lisp
-
-bewirkt, daß ein LISP-Programm eingelesen und ausgeführt wird; nach der Ausfüh­
-rung wird das Ergebnis der Berechnung ausgegeben. Diese Operationen werden auf
-einer Kopie des Heaps ausgeführt, so daß Änderungen keine Dauerwirkung haben.
-Mit
-
- run lisp again
-
-wird das zuletzt eingelesene Programm noch einmal gestartet; da dafür die gleiche
-Kopie des Heaps wie bei "run" benutzt wird, kann das Ergebnis diesmal anders sein.
-
- insert lisp
-
-wirkt wie "run lisp", außer daß diesmal alle Änderungen, die durch das Einlesen und
-Ausführen im Heap entstehen, dauerhaft sind.
-
-
- PROC start lisp system (DATASPACE CONST heap):
- Eine Kopie von "heap" wird der neue LISP-Heap. Wenn es sich um "nilspa­
- ce" handelt, werden einige organisatorische Strukturen im Heap aufgebaut und
- die Atome "NIL" und "PNAME" erzeugt.
-
- PROC start lisp system (DATASPACE CONST heap, FILE VAR f):
- Zunächst wird "start lisp system (heap)" gegeben.
- Danach werden die Eigenschaftsbeschreibungen aus "f" in Strukturen im Heap
- umgesetzt.
-
- Jede Beschreibung in "f" muß mit dem Zeilenanfang beginnen und kann sich
- über mehrere Zeilen erstrecken. Jede Beschreibung besteht aus den Elementen
- <Atom> <Eigenschaft> <Wert>
- wobei <Eigenschaft> der Name einer Eigenschaft (i.a. APVAL oder FUNCTION)
- und <Wert> ein beliebiger S-Ausdruck sein müssen. Die drei Elemente müs­
- sen jeweils durch mindestens ein Leerzeichen getrennt sein.
-
- Wenn das Atom <Atom> nicht existiert, wird es erzeugt; danach wird <Wert>
- unter <Eigenschaft> in der Eigenschaftsliste eingetragen.
-
- Wenn <Eigenschaft> NIL ist, muß <Wert> wegfallen; dann wird nichts in die
- Eigenschaftsliste eingetragen.
-
- DATASPACE PROC lisp heap:
- Liefert den LISP-Heap. Das ist manchmal für Sicherheitskopien etc. nützlich.
- Die durch "run lisp" erzeugten Kopien sind nicht zugänglich.
-
- PROC run lisp:
- Ruft "run lisp (last param)" auf.
-
- PROC run lisp (TEXT CONST file name):
- Das in der Datei "file name" stehende LISP-Programm (d.h. der dort stehende
- in einen S-Ausdruck übersetzte M-Ausdruck) wird in eine neue Kopie des
- LISP-Heaps eingelesen und ausgeführt. Evtl. vorher durch "run lisp" erzeugte
- Kopien des Heaps werden vorher gelöscht.
-
- Wenn das Programm syntaktisch nicht korrekt ist, wird es im Paralleleditor zur
- Korrektur angeboten.
-
- PROC run lisp again:
- Führt das zuletzt eingelesene Programm noch einmal im gleichen Heap aus.
-
- PROC insert lisp:
- Ruft "insert lisp (last param)" auf.
-
- PROC insert lisp (TEXT CONST file name):
- Wirkt wie "run lisp (file name)", nur daß alle Operationen auf dem Originalheap
- ausgeführt werden. Auch "run lisp again" wirkt nun nicht mehr auf der Kopie.
-
diff --git a/doc/menugenerator/menu-generator handbuch.1 b/doc/menugenerator/menu-generator handbuch.1
deleted file mode 100644
index c190c0a..0000000
--- a/doc/menugenerator/menu-generator handbuch.1
+++ /dev/null
@@ -1,100 +0,0 @@
-#type ("prop.lq")##limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (3)#
-#headodd#
-#center#ls-Menu-Generator#right#%
-
-#end#
-#headeven#
-%#center#ls-Menu-Generator
-
-#end#
-#type ("prop.breit.lq")#
-#center#1
-
-#center#Was
-#center#kann
-#center#ls-Menu-Generator
-#type ("prop.lq")#
-
-
- In diesem Kapitel wollen wir Ihnen erläutern, was Sie
-mit #on("b")#ls-Menu-Generator#off("b")# anfangen können. Wir gehen davon
-aus, daß Ihnen die Benutzerschnittstelle #on("b")#ls-DIALOG#off("b")# be­
-kannt ist und daß Sie bereits mit einigen Anwendungen
-unter #on("b")#ls-DIALOG#off("b")# gearbeitet haben. Weiterhin setzen wir
-voraus, daß Sie Programmierkenntnisse (EUMEL/ELAN) be­
-sitzen.
- Bisher war es Ihnen nur möglich, von uns fertigge­
-stellte Programme unter der komfortablen Benutzer­
-schnittstelle #on("b")#ls-DIALOG#off("b")# laufen zu lassen. Sie haben aber
-sicher erkannt, welche Vorteile es bietet, Programme un­
-ter einer einheitlichen Benutzeroberfläche zu realisie­
-ren:
- Zunächst profitiert natürlich der Anwender von der
-einfachen und immer einheitlichen Bedienung solcher
-Programme. Der Aufwand, sich in neue Programmsysteme
-einzuarbeiten, wird erheblich reduziert. #on("b")#ls-DIALOG#off("b")# wurde
-ja auch speziell für den Unterricht konzipiert und ent­
-wickelt: Ziel war es, Computerlaien einen Zugang zum
-Computer zu verschaffen und den Umgang mit dem Compu­
-ter zu vereinfachen.
-
- #on("b")#ls-Menu-Generator#off("b")#ist nun aber kein weiteres Anwen­
-dungsprogramm! #on("b")#ls-Menu-Generator#off("b")# ist stattdessen für
-den Programmierer gedacht, der selbst unter #on("b")#ls-DIALOG#off("b")#
-Anwendungssysteme entwickeln möchte. #on("u")#Wir erhoffen uns
-durch die Bereitstellung dieses Werkzeuges, daß sich auch
-andere engagierte Personen daran beteiligen, qualitativ
-hochwertige Software insbesondere für den Schulbereich
-unter #on("b")#ls-DIALOG#off("b")# zu entwickeln.#off("u")#
-
- Mit #on("b")#ls-Menu-Generator#off("b")# haben Sie zwei Komponenten
-erworben: Das Generator-Programm zur Erzeugung von
-Menukarten und eine umfangreichen Dokumentation. Dabei
-enthält die Dokumentation nicht nur Informationen dar­
-über, wie Sie mit dem Generator-Programm arbeiten kön­
-nen - das natürlich auch. Darüberhinaus werden Ihnen
-alle Möglichkeiten, die #on("b")#ls-DIALOG#off("b")# zur Programmgestal­
-tung bietet, ausführlich erläutert - das macht den we­
-sentlichen Teil der Dokumentation aus!
-
- #on("b")#ls-DIALOG#off("b")# ist eigentlich ein "Baukastensystem", auf
-das andere Programme zugreifen können. Sie wissen si­
-cherlich, wieviel Arbeit bei jedem Programm aufzuwen­
-den ist, um die Benutzerschnittstelle zu realisieren. Die
-Gestaltung und Pflege der Benutzerschnittstelle kann
-bis zu 50% der Gesamtarbeit an einem Programm ausmachen.
-#on("b")#ls-Menu-Generator#off("b")# soll Ihnen helfen, diese Arbeit zu
-verringern.
-
- Alle Informationen, die ein Menu betreffen, sind in
-der sogenannten 'Menukarte' abgelegt. Wird nun ein Pro­
-gramm unter #on("b")#ls-DIALOG#off("b")# aufgerufen, so wird die entspre­
-chende Menukarte aus der "Menukarten - Sammeltask" ('ls-
-MENUKARTEN') geholt und an das System angekoppelt. An­
-schließend wird dem Anwender das Menu auf dem Bildschirm
-angeboten.
- Das Erstellen solcher Menukarten ist mit dem Genera­
-torprogramm sehr einfach - es wird in Kapitel 4 beschrie­
-ben. Allerdings sollten Sie nicht die Arbeit unterschät­
-zen, die Sie für eine sorgfältig erstellte, mit allen In­
-formationtexten gefüllte Menukarte aufwenden müssen!
-
- Bei den meisten Programmmen reicht aber ein einfaches
-Menu nicht aus. Bei vielen Verarbeitungsfunktionen ist
-es notwendig, mit dem Anwender einen Dialog zu führen:
-z.B. muß ein Dateiname erfragt, eine Information ausgege­
-ben und bestätigt, eine Auswahl oder eine Entscheidung
-getroffen werden. Alle Möglichkeiten, die #on("b")#ls-DIALOG#off("b")# dazu
-bereitstellt, sind in Kapitel 5 dokumentiert.
-
- Einige Reihe von Verarbeitungsfunktionen treten in
-nahezu jeder Anwendung auf (Datei- und Archivhandling).
-Hier stellt #on("b")#ls-DIALOG#off("b")# schon vorgefertigte Module zur
-Verfügung. In Kapitel 6 zeigen wir Ihnen, wie Sie auf die­
-se Module zugreifen und sie in Ihr Programmsystem ein­
-binden können. In Kapitel 7 zeigen wir Ihnen außerdem,
-wie Sie eigene Fenster definieren können und welche Ope­
-rationen auf diesen Fenstern zur Verfügung stehen.
-
diff --git a/doc/menugenerator/menu-generator handbuch.2 b/doc/menugenerator/menu-generator handbuch.2
deleted file mode 100644
index 696ed28..0000000
--- a/doc/menugenerator/menu-generator handbuch.2
+++ /dev/null
@@ -1,87 +0,0 @@
-#type ("prop.lq")##limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (6)#
-#headodd#
-#center#ls-Menu-Generator#right#%
-
-#end#
-#headeven#
-%#center#ls-Menu-Generator
-
-#end#
-#type ("prop.breit.lq")#
-#center#2
-
-#center#Installation
-#center#von
-#center#ls-Menu-Generator
-#type ("prop.lq")#
-
-
- Bevor Sie #on("b")#ls-Menu-Generator#off("b")# auf Ihrem System benut­
-zen können, müssen Sie das Programm zunächst installie­
-ren. Wenn #on("b")#ls-Menu-Generator#off("b")# auf Ihrem System schon zur
-Verfügung steht, können Sie dieses Kapitel ruhig über­
-springen.
-
-
-2.1 Voraussetzungen
-
- Um #on("b")#ls-Menu-Generator#off("b")# auf Ihrem Computer betreiben
-zu können, muß das EUMEL-Betriebssystem (Multi-User-
-Version) installiert und das Programmpaket #on("b")#ls-DIALOG#off("b")#
-(Version 1.1) bereits insertiert sein.
-
-
-2.2 Lieferumfang
-
- #on("b")#ls-Menu-Generator#off("b")# wird auf einer Diskette geliefert,
-die alle notwendigen Programme enthält. Folgende Dateien
-sollten sich auf der Diskette befinden:
-
- "fonttab.ls-Menu-Generator"
- "ls-MENUBASISTEXTE"
- "Generatordatei: Archivmenu"
- "ls-Menu-Generator 1"
- "ls-Menu-Generator 2"
- "ls-Menu-Generator/gen"
-
- Eventuell können noch weitere Namen auf der Diskette
-vorhanden sein.
-
-
-2.3 Installation
-
-Die Installation erfolgt in #on("u")#zwei Schritten#off("u")#:
-
- #on("u")#Zunächst#off("u")# muß die mitgelieferte Fonttabelle
-('fonttab.ls-Menu-Generator') in die Task 'configurator'
-geholt werden. Da Sie aus dem 'UR-Zweig' des EUMEL-
-Systems keinen schreibenden Zugriff auf die Task
-'configurator' haben, müssen Sie die Task 'configurator'
-an Ihr Terminal koppeln und die Datei 'fonttab.ls-Menu-
-Generator' von der Diskette in die Task kopieren.
- #on("u")#Anschließend#off("u")# kann #on("b")#ls-Menu-Generator#off("b")# in einer Task
-installiert werden, in der bereits das Programm #on("b")#ls-DIALOG#off("b")#
-zur Verfügung steht. Richten Sie also eine Task als Sohn
-der Task ein, in der auf Ihrem Computer bereits #on("b")#ls-DIALOG#off("b")#
-installiert ist. Legen Sie dann die Archivdiskette ein,
-auf der sich #on("b")#ls-Menu-Generator#off("b")# befindet und geben Sie
-die folgenden Kommandos:
-
- archive("ls-Menu-Generator") <RETURN>
-
- fetch("ls-Menu-Generator/gen",archive) <RETURN>
-
- run <RETURN>
-
- Sie haben damit das Generatorprogramm gestartet; die
-Installation wird automatisch durchgeführt. Lassen Sie
-während des gesamten Vorgangs die Archivdiskette einge­
-legt. Die Generierung ist beendet, wenn der EUMEL-Ein­
-gangsbildschirm erscheint. Die Task, in der die Generie­
-rung stattfindet, wird automatisch zur Managertask, das
-heißt, daß Söhne von ihr eingerichtet werden können.
-
-
-
diff --git a/doc/menugenerator/menu-generator handbuch.3 b/doc/menugenerator/menu-generator handbuch.3
deleted file mode 100644
index e982988..0000000
--- a/doc/menugenerator/menu-generator handbuch.3
+++ /dev/null
@@ -1,155 +0,0 @@
-#block##pageblock#
-#pagenr("%",1)##setcount(1)##count per page#
-#headeven#
-gs-Menu-Generator
-#center#____________________________________________________________
-
-#end#
-#headodd#
-#right#gs-Menu-Generator
-#center#____________________________________________________________
-
-#end#
-#bottomeven#
-#center#____________________________________________________________
-3 - % #right#ERGOS
-#end#
-#bottomodd#
-#center#____________________________________________________________
-ERGOS #right# 3 - %
-#end#
-#ib#3 Die Arbeitsweise von gs-DIALOG#ie#
-
-
-In diesem Kapitel soll die grundsätzliche Arbeitsweise von gs-DIALOG erläutert
-werden. Sie erfahren, wie das Menusystem aufgebaut ist, wie man Menukarten an­
-koppelt und Menus zur Ausführung bringt. Ebenso wird erläutert, wie eine Menukarte
-aufgebaut ist.
-Wenn Sie die hier beschriebenen Vorgänge auf ihrem System nachvollziehen wollen,
-so muß in Ihrer Task das Programm 'gs-DIALOG' zur Verfügung stehen!
-
-
-#ib#3.1 Ankoppeln einer Menukarte - Ausführen eines Menus#ie#
-
-Vereinfacht gesagt ist eine Menukarte ein Datenraum, in dem alle Informationen, die
-zum Menu (zu den Menus) gehören, abgelegt sind. Der genaue Aufbau einer solchen
-Menukarte wird in Kapitel 3.2 beschrieben.
-Alle Menukarten, die auf einem System zur Verfügung stehen, werden in einer zentra­
-len Task ('gs-MENUKARTEN') bereitgehalten. Die Menukarten können von hier
-angefordert werden.
-Lassen Sie sich in Ihrem System eine Ãœbersicht der vorhandenen Menukarten geben
-(list (/"gs-MENUKARTEN") <RETURN> ). Darauf wird Ihnen gegebenenfalls folgen­
-de Ãœbersicht angeboten:
-
- 01.09.87 "gs-MENUKARTE:Archiv"
- 01.09.87 "gs-MENUKARTE:Herbert und Robbi"
- 01.09.87 "gs-MENUKARTE:MP-BAP"
- ...
-
-Zumindest die erste Menukarte müßte - sofern die gs-DIALOG-Basissoftware instal­
-liert ist - auf Ihrem System vorhanden sein. Die beiden anderen Menukarten sind
-natürlich nur dann vorhanden, wenn Sie die Programme 'gs-Herbert und Robbi'
-und 'gs-MP BAP' installiert haben.
-
-In einer weiteren Task (z.B. 'DIALOG') sind die Programme installiert, die es ermög­
-lichen, diese Menukarten zu handhaben. Alle Sohntasks dieser Task "erben" natür­
-lich diese Fähigkeiten. Von einer solchen Task aus kann nun eine Menukarte ange­
-fordert und ein darin enthaltenes Menu zur Ausführung gebracht werden. Das haben
-Sie sicher schon oft gemacht, z.B. wenn Sie den Befehl 'archiv' gegeben haben. Was
-hinter diesem Befehl steckt, sollen Sie sich jetzt klar machen:
-
-Wenn Sie den Befehl 'archiv' geben, wird zunächst die Menukarte
-'gs-MENUKARTE:Archiv' aus der Task 'gs-MENUKARTEN' angefordert und in Ihre
-Task kopiert. Davon merken Sie normalerweise nichts, denn nachdem die Ankopp­
-lung des Datenraumes (als unbenannter Datenraum) erfolgt ist, wird die Daten­
-raumkopie gelöscht; daher taucht der Name auch nie in Ihrer Dateiliste auf. Intern
-vermerkt das System, welche Menukarte aktuell angekoppelt ist. Soll wiederholt
-dieselbe Menukarte angekoppelt werden, so erübrigt sich das Kopieren aus der zen­
-tralen Bereitstellungstask.
-
-Nach dem Ankoppeln der Menukarte können Sie auf die in der Menukarte enthalte­
-nen Informationen zugreifen. Da in einer Menukarte mehrere Menus enthalten sein
-können, müssen Sie dem System noch mitteilen, welches Menu aktiviert werden soll.
-In der Menukarte 'gs-MENUKARTE:Archiv' ist nur ein Menu enthalten, das den
-Namen 'ARCHIV' hat (der Name des Menus erscheint übrigens bei der Präsentation
-immer oben links in der Kopfzeile).
-
-Sie sollen jetzt, ohne den Befehl 'archiv' zu verwenden, das Menu zur Ausführung
-bringen. Geben Sie dazu die folgenden Kommandos in der 'gib kommando:'- Ebene:
-
- #ib#install menu#ie# ("gs-MENUKARTE:Archiv");
- #ib#handle menu#ie# ("ARCHIV")
-
-Mit dem ersten Befehl koppeln Sie die genannte Menukarte an, mit dem zweiten
-Befehl bringen Sie das darin enthaltene Menu 'ARCHIV' zur Ausführung.
-Allerdings stellen Sie sicher auch einen Unterschied zur Ausführung des Befehls
-'archiv' fest, denn dort erscheint nicht erst unser "Software - Emblem" auf dem
-Bildschirm, sondern direkt das Menu.
-
-Wenn Ihnen eines der Programme 'gs-Herbert und Robbi' oder 'gs-MP BAP'
-bekannt ist, haben Sie unser Emblem aber sicher schon gesehen - wir verwenden es
-immer, um unsere Softwareprodukte kenntlich zu machen. Da man aber das Archiv­
-programm sehr häufig benötigt und es dann nur störend wirkt kann die Ausgabe
-unterdrückt werden. Daher gibt es den Befehl 'install menu' in zwei Versionen.
-Versuchen Sie es gleich einmal:
-
- install menu ("gs-MENUKARTE:Archiv", FALSE);
- handle menu ("ARCHIV")
-
-Die Präsentation des Menus erfolgt gleich aus zwei Gründen schneller als beim ersten
-Mal: einerseits wurde auf die Ausgabe unseres Software - Emblems verzichtet, ande­
-rerseits brauchte die Menukarte nicht erneut aus der Task 'gs-MENUKARTEN' kopiert
-zu werden, da sie ja schon angekoppelt war.
-Damit sind Sie nun in der Lage, Menukarten anzukoppeln und Menus zur Ausfüh­
-rung zu bringen.
-
-
-#ib#3.2 Aufbau/Inhalt einer Menukarte#ie#
-
-Eine Menukarte ist eine komplexe Datenstruktur, die bis zu 6 vollständige Menus
-aufnehmen kann. Weiterhin sind eine Reihe von Texten in jeder Menukarte abgelegt,
-auf die gs-DIALOG zurückgreift. Darüberhinaus kann der Anwendungsprogram­
-mierer bis zu 2000 Texte in die Menukarte auslagern, um so beim Insertieren seiner
-Programme den Umfang an Paketdaten geringer zu halten.
-Auf den ersten Blick scheint es wenig Sinn zu machen, mehrere Menus in einer
-Menukarte zu verwalten. Nehmen wir aber als Beispiel das Programmsystem
-gs-Herbert und Robbi. Hier ist ein Programm in zwei unterschiedlichen Ausprä­
-gungen zu behandeln. Sowohl das Hamster- als auch das Robotermenu befinden sich
-in einer Menukarte. Bei einem Wechsel zwischen den Modellen braucht also keine
-neue Menukarte angefordert, sondern nur ein neues Menu aus der aktuellen Menu­
-karte aktiviert zu werden.
-Zum anderen ist gs-DIALOG schon auf umfangreichere Programmsysteme vorberei­
-tet: Es ist nämlich möglich, von einem Menu aus ein weiteres Menu aus der aktuellen
-Menukarte zu aktivieren. Auf dem Bildschirm werden die beiden Menus dann ge­
-schachtelt (das zuletzt aktivierte vor dem aufrufenden Menu) angezeigt. Nach Verlas­
-sen der zweiten Menuebene gelangt der Benutzer automatisch in das Ausgangsmenu
-zurück.
-Zwar ist es nicht möglich, mehr als zwei Menus gleichzeitig zu aktivieren (geschach­
-telt auf dem Bildschirm darzustellen), doch können an verschiedenen Stellen des
-Ausgangsmenus ja unterschiedliche Menus aus der aktuellen Menukarte aktiviert
-werden.
-
-Jedes Menu in der Menukarte wird durch einen Namen gekennzeichnet. Dieser Name
-erscheint in der Kopfzeile oben links. Ãœber diesen Namen kann das Menu aktiviert
-werden.
-Ein Menu besteht aus den sogenannten 'Oberbegriffen', die in der Kopfzeile angezeigt
-werden. In einer Kopfzeile können bis zu 10 Oberbegriffe verwaltet werden. Da zu
-jedem Oberbegriff bis zu 15 Verarbeitungsfunktionen (in den Pull-Down-Menus)
-verwaltet werden können, ist es möglich, in einem Menu bis zu 150 Verarbeitungs­
-funktionen abzulegen. Nutzt man alle 6 Menus einer Menukarte, so können maximal
-bis zu 900 Verarbeitungsfunktionen in einer Menukarte verwaltet werden.
-
-Eine Verarbeitungsfunktion besteht aus der/dem
-
- - 'Ein-Zeichen-Kennung' - die angibt, durch welche Taste die Verarbei­
- tungsfunktion ggf. aktiviert werden kann;
- - 'Menupunktbezeichnung' - die im Pull-Down-Menu als Name für die
- Verarbeitungsfunktion erscheint;
- - 'Funktionsaufruf' - dem Namen der Prozedur, die bei der Aktivie­
- rung des Menupunktes zur Ausführung ge­
- bracht wird;
- - 'Informationstext' - der zur aktuellen Verarbeitungsfunktion durch
- Tippen der <?>-Taste abgerufen werden
- kann.
-
-
diff --git a/doc/menugenerator/menu-generator handbuch.4 b/doc/menugenerator/menu-generator handbuch.4
deleted file mode 100644
index 97e7491..0000000
--- a/doc/menugenerator/menu-generator handbuch.4
+++ /dev/null
@@ -1,424 +0,0 @@
-#block##pageblock#
-#pagenr("%",1)##setcount(1)##count per page#
-#headeven#
-gs-Menu-Generator
-#center#____________________________________________________________
-
-#end#
-#headodd#
-#right#gs-Menu-Generator
-#center#____________________________________________________________
-
-#end#
-#bottomeven#
-#center#____________________________________________________________
-4 - % #right#ERGOS
-#end#
-#bottomodd#
-#center#____________________________________________________________
-ERGOS #right# 4 - %
-#end#
-#ib#4 Erstellen einer neuen Menukarte#ie#
-
-
-Aus Kapitel 3 wissen Sie, wie man eine fertige Menukarte ankoppelt und wie man ein
-darin enthaltenes Menu zur Ausführung bringen kann. Außerdem wissen Sie bereits,
-welche Informationen in einer Menukarte untergebracht werden können. In diesem
-Kapitel nun wollen wir Ihnen zeigen, wie Sie eine eigene Menukarte entwickeln
-können.
-Damit Sie sich die Abläufe besser vorstellen können, werden wir die Vorgänge an
-einem Beispiel aufzeigen: Wir wollen eine 'kleine Textverarbeitung' schaffen, deren
-Verarbeitungsfunktionen über ein Menu angeboten werden.
-Es sei aber darauf hingewiesen, daß es nicht darum geht, eine voll funktionsfähige
-Textverarbeitung auszuarbeiten - vielmehr sollen die Erstellung der Menukarte und
-das Nutzen der durch gs-DIALOG bereitgestellten Werkzeuge exemplarisch auf
-gezeigt werden.
-
-
-#ib#4.1  Eintragen der Menupunkte#ie#
-
-Unsere Menukarte soll den Namen 'Kleine Textverarbeitung' erhalten, das darin
-enthaltene Menu den Namen 'SCRIPT'. Unter dem Oberbegriff 'Bearbeiten' sollen 5
-Verarbeitungsfunktionen angeboten werden. Insgesamt soll unser neues Menu fol
-genden Aufbau haben:
-
-SCRIPT: Bearbeiten
-
- n Neu erstellen
- a Ansehen/Ändern
- ----------------
- v Verzeichnis
- ----------------
- z Zeilenformtierung
- s Seitenformatierung
-
-
-
-Zur Erzeugung der zugehörigen Menukarte schreiben Sie folgendes Pro­
-gramm in eine Datei:
-
-
-oeffne menukarte ("Kleine Textverarbeitung");
-oeffne menu ("SCRIPT");
-
-oberbegriff ("Bearbeiten");
-
-menufunktion ("n", "Neu erstellen", "neue datei editieren","");
-menufunktion ("a", "Ansehen/Ändern", "alte datei editieren","");
-trennlinie;
-menufunktion ("v", "Verzeichnis", "verzeichnis ausgeben","");
-trennlinie;
-menufunktion ("z", "Zeilenformatierung", "zeilen formatieren","");
-menufunktion ("s", "Seitenformatierung", "seiten formatieren","");
-
-schliesse menu;
-schliesse menukarte;
-
-
-Bevor wir Ihnen die Einzelheiten erklären, sollten Sie zuerst einmal Ihr neu erstelltes
-Menu ausprobieren. Verlassen Sie dazu die Datei und geben Sie das Kommando 'run'.
-Nachdem das von Ihnen geschriebene Programm übersetzt worden ist, meldet sich
-der Menu-Generator.
-Die an Sie gestellte Frage 'Sollen auch Anwendungs texte in die Menukarte aufge­
-nommen werden (j/n)?' beantworten Sie einfach mit n(ein). Auf dem Bildschirm
-wird angezeigt, wie die Menukarte erstellt wird. Auf das Ende der Menukartengenerie­
-rung wird hingewiesen. Wenn Sie sich jetzt die Dateiliste Ihrer Task anzeigen lassen,
-taucht dort eine Datei mit Namen 'gs-MENUKARTE:Kleine Textverarbeitung' auf - das
-ist die neue Menukarte.
-Sie möchten sicher gleich ausprobieren, ob das Menu Ihren Vorstellungen entspricht.
-Geben Sie dazu das Kommando 'testinstallation ("gs-MENUKARTE:Kleine Textver­
-arbeitung")'. Bitte geben Sie den Text genauso ein wie hier angegeben!
-Nach kurzer Zeit erscheint der Hinweis 'Installation abgeschlossen!'. Geben Sie nun
-den Befehl 'handle menu ("SCRIPT")'; hierdurch aktivieren Sie das von Ihnen neu
-erstellte Menu - es erscheint auf dem Bildschirm.
-
-Ãœber den Befehl '#ib#testinstallation#ie#' haben Sie sich sicher gewundert. Ihnen ist ja
-schon der Befehl '#ib#install menu#ie#' bekannt. Dieser Befehl aber kann hier nicht ein­
-fach angewendet werden - er ist für den (späteren) "regulären Betrieb" vorgesehen.
-Bedenken Sie bitte zweierlei: Die Menukarte befindet sich nur in Ihrer Task, 'install
-menu' fordert die Menukarte aber aus der Task 'gs-MENU KARTEN' an. Ist eine
-Menukarte schon angekoppelt gewesen, so wird nicht erneut angekoppelt, sondern
-auf die angekoppelte Menukarte zurückgegriffen. Dies alles können wir bei der
-Menukartenerstellung nicht gebrauchen!
-Der Befehl 'testinstallation' sendet automatisch die Menukarte zur Task
-'gs-MENUKARTEN' und kennzeichnet Sie noch durch den eigenen Tasknamen (da
-durch können sich beim Multiuserbetrieb unterschiedliche Anwender mit gleichem
-Menukartennamen nicht gegenseitig stören). Die Menukarte wird anschließend in
-jedem Falle 'frisch' angekoppelt, so daß Sie nach dem Befehl immer die aktuelle
-Menukarte angekoppelt haben. Außerdem bleibt die Menukarte in Ihrer Task erhal­
-ten!
-
-Doch nun zur Erläuterung des oben notierten Programms:
-
-Ein Programm zur Erstellung einer Menukarte muß immer mit dem Befehl '#ib#oeffne
-menukarte#ie#' beginnen und mit dem Befehl '#ib#schliesse menukarte#ie#' abgeschlos­
-sen werden. Der Befehl 'oeffne menukarte' hat einen Parameter (TEXT CONST) -
-hierdurch wird festgelegt, welchen Namen die Menukarte haben soll. Durch das
-Kommando 'oeffne menu karte ("Menu 1")' entsteht also die Menukarte 'gs-MENU
-KARTE:Menu 1".
-In die Menukarte können jetzt bis zu 6 Menus eingetragen werden. Jeder Eintrag
-eines Menus beginnt mit dem Befehl '#ib#oeffne menu#ie#' und endet mit dem Befehl
-'#ib#schliesse menu#ie#'. Der Befehl 'oeffne menu' hat hier einen Parameter (TEXT
-CONST) - hierdurch wird festgelegt, welchen Namen das Menu erhalten soll. Unter
-diesem Namen kann später das Menu angesprochen werden (z.B. 'handle menu
-("SCRIPT")'.
-
-Den Befehl 'oeffne menu' gibt es noch in zwei weiteren Ausführungen:
-Mit drei Textparametern - neben dem Namen des Menus können hier noch zwei
-Prozedurnamen angegeben werden. Diese Prozeduren werden beim Einstieg in das
-Menu bzw. beim Verlassen des Menus aufgerufen. Hiervon wird z.B. Gebrauch ge­
-macht, wenn das Archiv-Menu in eine Menukarte integriert ist: Wenn das Menu
-verlassen wird, soll sichergestellt sein, daß das Archiv automatisch freigege ben wird.
-Mehr hierüber erfahren Sie im Kapitel 6.1, in dem aufgezeigt wird, wie das Archiv-
-Menu in andere Menus eingebunden wird.
-Mit sechs Textparametern - neben den eben genannten drei Parametern können noch
-drei Texte übergeben werden. Diese Texte werden beim Aufruf des Menus unten
-rechts auf dem Bildschirm ausgegeben. Bei unseren Software-Produkten (z.B.
-'gs-Herbert und Robbi') machen wir davon Gebrauch, um Hinweise auf das
-Produkt, die Versionsnummer etc. zu geben. Die Hinweise bleiben nur kurz auf dem
-Bildschirm und verschwinden nach kurzer Zeit automatisch, oder wenn Sie irgen
-deine Taste tippen. Bei der Notation der Texte müssen Sie sich allerdings an einige
-Regeln halten (sehen Sie dazu Kapitel 5.12).
-
-Zwischen den Befehlen 'oeffne menu' und 'schliesse menu' werden nun die Oberbe­
-griffe (Kopfzeile) und die zugehörigen Verarbeitungsfunktionen eingetragen. Dabei
-müssen Sie sich genau an folgende Abfolge halten:
-Zuerst wird jeweils der Oberbegriff genannt, der in der Kopfzeile auftauchen soll.
-Direkt unter dem jeweiligen Oberbegriff werden die Menufunktionen eingetragen, die
-im zugehörigen 'Pull-Down-Menu' als Verarbeitungsfunktionen angeboten werden
-sollen. Die einzelnen Oberbegriffe mit Ihren zugehörigen Verarbeitungsfunktionen
-werden blockweise hintereinander notiert. Dadurch ergibt sich die folgende Struktur:
-
-
-oeffne menu ("Menuname");
-
-oberbegriff ("Oberbegriff 1");
-
-menufunktion ("1", "Verarbeitungsfunktion 1", "", "");
-menufunktion ("2", "Verarbeitungsfunktion 2", "", "");
-...
-
-oberbegriff ("Oberbegriff 2");
-
-menufunktion ("1", "Verarbeitungsfunktion 1", "", "");
-menufunktion ("2", "Verarbeitungsfunktion 2", "", "");
-...
-
-oberbegriff ("Oberbegriff 3");
-
-menufunktion ("1", "Verarbeitungsfunktion 1", "", "");
-menufunktion ("2", "Verarbeitungsfunktion 2", "", "");
-...
-
-... schliesse menu;
-
-
-Die Oberbegriffe werden in die Kopfzeile von links nach rechts eingetragen. Maximal
-können 10 Oberbegriffe eingetragen werden. Wählen Sie die Bezeichnungen nicht zu
-lang, denn sie müssen alle neben dem Namen des Menus in der Kopfzeile Platz
-finden (Ansonsten erhalten Sie hierauf bei der Menukartengenerierung einen Hin­
-weis, die Generierung wird abgebrochen!)!
-
-Den Befehl '#ib#oberbegriff#ie#' gibt es in zwei Versionen:
-In der hier aufgezeigten Version mit einem (TEXT-) Parameter: Hierdurch wird der
-Oberbegriff in der Kopfzeile festgelegt. In der zweiten Version hat der Befehl drei
-(TEXT-)Parameter: Durch den ersten wird - wie eben - die Kopfzeilenbezeichnung
-festgelegt. Daneben können noch zwei Prozedurnamen angegeben werden. Die
-Prozedur mit dem erstgenannten Namen wird beim Einstieg (vor dem "Ausklappen"
-des Pull-Down-Menus) ausgeführt, die Prozedur mit dem zweitgenannten Namen vor
-dem Ausstieg ("Einklappen"). Beim 'Archiv-Pull-Down-Menu' machen wir hiervon
-Gebrauch. Beim Einstieg wird dafür gesorgt, daß nur bestimmte Verarbeitungsfunk­
-tionen aktivierbar sind; beim Ausstieg wird sichergestellt, daß das Archivlaufwerk
-automatisch freigegeben wird.
-
-Unter einem Oberbegriff können Sie bis zu 15 Verarbeitungsfunktionen in ein Pull-
-Down-Menu eintragen. Die Verarbeitungsfunktionen können Sie optisch vonein ander
-trennen. Dafür steht der Befehl '#ib#trennlinie#ie#' zur Verfügung. Aber beachten Sie, er
-belegt den gleichen Platz wie eine Verarbeitungsfunktion.
-
-Zum Eintragen einer Verarbeitungsfunktion steht der Befehl '#ib#menufunktion#ie#' zur
-Verfügung. Der Befehl besitzt vier (TEXT-)Parameter. Die ersten beiden Parameter
-werden auch auf dem Bildschirm ausgegeben.
-Der erste Parameter legt fest, über welche Taste diese Verarbeitungsfunktion direkt
-zur Ausführung gebracht werden kann. Wenn eine Eintragung erfolgt, muß diese aus
-genau einem Zeichen bestehen. Innerhalb eines Pull-Down-Menus muß dieses
-Zeichen eindeutig sein, d.h. es darf nur einmal verwendet werden. Ansonsten er­
-scheint bei der Menugenerierung eine Fehlermeldung.
-Der zweite Parameter ist die Bezeichnung der Verarbeitungsfunktion, die dem Be­
-nutzer im Pull-Down-Menu angeboten wird. Wählen Sie die Bezeichnung bitte immer
-prägnant und möglichst mit dem Buchstaben beginnend, den Sie auch als ersten
-Parameter angegeben haben! Der Länge dieser Bezeichnung ist nur durch die Bild­
-schirmbreite (nicht mehr als 60 Zeichen) begrenzt, allerdings wählt gs-DIALOG die
-Breite des Pull-Down-Menus nach der längsten Bezeichnung, die im jeweiligen Pull-
-Down-Menu auftritt. Wenn die Bezeichnungen ganz unterschiedlich lang sind, sieht
-das nicht sonderlich gut aus, aber probieren Sie es ruhig einmal aus und entscheiden
-Sie selbst.
-
-Der dritte Parameter ist der Name der Prozedur, die bei der Aktivierung der Verarbei­
-tungsfunktion ausgewählt werden soll. Zum Zeitpunkt der Erstellung und des Testens
-des Menusystems braucht diese Prozedur noch nicht zu existieren. Damit ist es
-möglich, die Menuentwicklung völlig unabhängig von der Entwicklung der Verarbei­
-tungsfunktionen zu betreiben; Sie brauchen nur die späteren Namen der aufzurufen­
-den Prozeduren festzulegen! Aktivieren Sie eine solche Verarbeitungsfunktion im
-Pull-Down-Menu, die noch nicht fertiggestellt ist, so erscheint der Hinweis 'unbe­
-kanntes Kommando' - das kann aber auch geschehen, wenn die Verarbeitungsfunk­
-tion schon existiert, Sie aber bei der Eintragung einen (Schreib-)Fehler gemacht
-haben!
-
-Der vierte Parameter ist der Text, der als sogenannter Infotext ausgegeben wird wenn
-Sie auf die entsprechende Verarbeitungsfunktion positioniert haben und hier die
-<?>-Taste tippen. In unserem Beispiel haben wir keinen Infotext eingetragen.
-Versuchen Sie im Menu jetzt die <?>-Taste zu tippen, so erscheint der Hinweis
-'Leider ist zu diesem Menupunkt kein Info-Text eingetragen!'. Für die Handhabung
-des Menus sind diese Informationstexte nicht wichtig, sie dienen ausschließlich der
-Information des Benutzers.
-Die Arbeit zur Formulierung/Abfassung dieser Texte sollten Sie nicht unterschätzen.
-Sie sollten sich bei einer ernsthaften Anwendung aber diese Arbeit machen. Gerade
-der Anfänger, der mit Ihrem Menusystem arbeitet, wird Ihnen diese Arbeit danken.
-Wie Sie diese Texte komfortabel erstellen und in die Menutafel einbinden können,
-erklären wir Ihnen im nächsten Kapitel.
-
-
-#ib#4.2 Erstellung und Einbinden von Informationstexten#ie#
-
-Bisher haben wir noch keine Informationstexte zu den Menupunkten in die Menu­
-karte eingetragen. Diese Eintragung erfolgt über den vierten Parameter des Befehls
-'menufunktion'. Möchten Sie dort nur einige wenige Worte eintragen, so kann das
-direkt geschehen. Meist aber sind die Informationen zu einem Menupunkt doch
-länger, sie erstrecken sich über mehrere Zeilen.
-Zur Übergabe des Informationstextes steht aber nur ein Textparameter zur Verfügung.
-Würde man längere Texte direkt eintragen, wäre das bei der Menukartenerstellung
-sicher sehr unübersichtlich. Zum anderen benötigt gs-DIALOG den Text schon in
-aufbereiteter Form, d.h. es müssen z.B. Zeilenenden etc. kenntlich gemacht wer den.
-Damit Sie sich nun nicht alle Regeln der Texterstellung für gs-DIALOG merken
-müssen, bietet Ihnen gs-Menu-Generator eine komfortable Möglichkeit, diese
-Informationstexte zu entwickeln. Wir wollen das an einem Beispiel verdeutlichen:
-
-Erzeugen Sie sich eine Datei mit dem Namen 'Textprobe' und schreiben Sie z.B.
-folgenden Text, der ein Informationstext zum Menupunkt 'Neu erstellen' sein könnte,
-hinein:
-
-Text neu erstellen
-
-Das System erfragt zunächst den Namen für die Datei, in die
-der neue Text geschrieben werden soll. Anschließend wird eine
-leere Datei mit dem gewünschten Namen zum Beschreiben
-angeboten.
-Das Schreiben in eine solche Datei wird durch viele Hilfen
-erleichtert. Deshalb ist es ratsam, sich nach und nach mit
-den Möglichkeiten, die der Editor bietet, vertraut zu machen.
-Die Möglichkeiten sind im EUMEL-Benutzerhandbuch ausführlich
-beschrieben.
-
-Verlassen Sie nun die Datei und geben Sie in der 'gib kommando:'-Ebene folgendes
-Kommando:
-
- #ib#textprozedur#ie# ("Textprobe", "mein erster infotext")
-
-Auf dem Bildschirm erscheint zunächst der Hinweis 'Bitte warten ...', anschließend
-werden Sie - wie aus der Textverarbeitung (lineform) bekannt - aufgefordert, entspre­
-chende Trennungen vorzunehmen.
-Das eben eingegebene Kommando bewirkt nämlich, daß der in der Datei 'Textprobe'
-enthaltene Text für gs-DIALOG so aufbereitet wird, daß er in einer Box innerhalb des
-Menus eingeblendet werden kann. Die Zeilen werden auf die entsprechende Länge
-zugeschnitten und der Text in den Zeilen wird geblockt, soweit Sie keine Absatzmarke
-(<RETURN>) gesetzt haben.
-Der so den Regeln von gs-DIALOG entsprechend aufbereitete Text wird automatisch
-in eine Textprozedur "verpackt", die den von Ihnen als zweiten Parameter übergebe­
-nen Namen erhält. Beachten Sie deshalb bei der Festlegung des Namens, daß er mit
-einem Kleinbuchstaben beginnt und weiterhin nur Kleinbuchstaben, Ziffern und
-Leerzeichen enthält!
-Diese Textprozedur finden Sie anschließend in der Datei 'Textprobe.a'. An der En­
-dung '.a' können Sie erkennen, daß in dieser Datei ein "aufbereiteter" Text enthalten
-ist.
-Wenn Sie sich, nachdem auf dem Bildschirm der Hinweis 'Textprozedur ist erstellt!'
-erschienen ist, die Datei 'Textprobe.a' ansehen, so hat diese folgenden Inhalt:
-
-
-TEXT PROC mein erster infotext:
-" Text neu erstellen "13"" +
-" "13"" +
-" Das System erfragt zunächst den Namen für die Datei, in die der "13""+
-" neue Text geschrieben werden soll. Anschließend wird eine leere "13""+
-" Datei mit dem gewünschten Namen zum Beschreiben angeboten. "13""+
-" Das Schreiben in eine solche Datei wird durch viele Hilfen er-"13""+
-" leichtert. Deshalb ist es ratsam, sich nach und nach mit den Mög-"13""+
-" lichkeiten, die der Editor bietet, vertraut zu machen. "13"" +
-" Die Möglichkeiten sind im EUMEL-Benutzerhandbuch ausführlich be-"13""+
-" schrieben. "
-END PROC mein erster infotext;
-
-
-Kopieren Sie nun den Inhalt der Datei 'Textprobe.a' in die Datei, in die Sie das Pro­
-gramm zur Generierung Ihrer Menukarte geschrieben haben und ergänzen Sie die
-Ein tragung beim ersten Menupunkt in folgender Weise:
-
-
-TEXT PROC mein erster infotext:
-" Text neu erstellen "13"" +
-" "13"" +
-" Das System erfragt zunächst den Namen für die Datei, in die der"13""+
-" neue Text geschrieben werden soll. Anschließend wird eine leere"13""+
-" Datei mit dem gewünschten Namen zum Beschreiben angeboten. "13""+
-" Das Schreiben in eine solche Datei wird durch viele Hilfen er-"13""+
-" leichtert. Deshalb ist es ratsam, sich nach und nach mit den Mög-"13""+
-" lichkeiten, die der Editor bietet, vertraut zu machen. "13""+
-" Die Möglichkeiten sind im EUMEL-Benutzerhandbuch ausführlich be-"13""+
-" schrieben. "
-END PROC mein erster infotext;
-
-oeffne menukarte ("Kleine Textverarbeitung");
-oeffne menu ("SCRIPT");
-
-oberbegriff ("Bearbeiten");
-
-menufunktion ("n", "Neu erstellen", "neue datei editieren",
- mein erster infotext);
-menufunktion ("a", "Ansehen/Ändern","alte datei editieren", "");
-trennlinie;
-menufunktion ("v", "Verzeichnis", "verzeichnis ausgeben", "");
-trennlinie;
-menufunktion ("z", "Zeilenformatierung", "zeilen formatieren", "");
-menufunktion ("s", "Seitenformatierung", "seiten formatieren", "");
-
-schliesse menu;
-schliesse menukarte;
-
-
-Starten Sie erneut das Programm mit 'run' und erstellen Sie dadurch eine neue
-Menukarte. Installieren Sie anschließend die neue Menukarte mit dem Kommando
-'test installation ("gs-MENUKARTE:Kleine Textverarbeitung")' und bringen Sie das
-Menu mit dem Kommando 'handle menu ("SCRIPT")' zur Ausführung. Wenn Sie jetzt
-auf dem Menu punkt 'n Neu erstellen' die <?>-Taste tippen, erscheint der von
-Ihnen eingegebene Infotext in einer Box innerhalb des Menus. Die Größe der Box
-wird automatisch durch den Text bestimmt. Die Box ist maximal 65 Zeichen breit
-und 14 Zeilen hoch.
-
-Nachdem Sie nun in der Lage sind, solche Informationstexte zu erstellen und sie in
-die Menukarte einzubinden, möchten wir Ihnen noch einige Möglichkeiten der
-"Kosmetik solcher Informationstexte" aufzeigen.
-Häufig möchte man die Überschrift eines solchen Informationstextes zentriert über
-dem Text dargestellt haben. Das läßt sich auch hier einfach bewerkstelligen: Schrei­
-ben Sie dazu als erstes Zeichen der Zeile, die zentriert werden soll, das Zeichen '%'
-und schließen Sie die Zeile mit einer Absatzmarke (<RETURN>) ab.
-Möchten Sie innerhalb des Textes eine Textpassage invers dargestellt haben, so kenn­
-zeichnen Sie den Anfang der Inversdarstellung durch das Zeichen '$' und das Ende
-der Inversdarstellung durch das Zeichen '&'. Der Text wird anschließend entspre­
-chend aufbereitet. Allerdings sollte die Textpassage nicht über Zeilengrenzen hinaus­
-gehen!
-Möchten Sie in unserem Beispiel die Überschrift zentriert und invers dargestellt
-haben, so ersetzen Sie die erste Zeile der Datei 'Textprobe' durch die Zeile: %$Text
-neu erstellen&. Wenn Sie anschließend den gesamten oben beschriebenen Vorgang
-wiederholen, erscheint die Ãœberschift zentriert und invers dargestellt innerhalb der
-Box im Menu.
-
-
-#ib#4.3 Auslagerung von anwendungsbezogenen Texten in die
-Menukarte#ie#
-
-Wie schon in Kapitel 3.2 erwähnt, kann der Anwendungsprogrammierer bis zu 2000
-Texte aus seinen Programmen in die Menukarte auslagern, um so den Umfang an
-Paketdaten geringer zu halten, allerdings darf die Gesamtkapazität einer Menukarte
-(eines Datenraumes) dabei nicht überschritten werden.
-
-Die Texte müssen in einer Datei zeilenweise notiert sein. Sie müssen (wie TEXT-Deno­
-ter) in Anführungsstriche eingefaßt sein, allerdings dürfen die Texte länger als
-(normale) TEXT-Denoter (255 Zeichen) sein. Innerhalb der Textzeile dürfen auch die
-Ausgabecodes "4", "5", "7", "10", "13", "14", und "15" verwendet werden. Innerhalb
-der Textzeile darzustellende Anführungszeichen unterliegen den gleichen Besonder­
-heiten wie sonst auch bei TEXT-Denotern.
-Machen wir ein Beispiel! Schreiben Sie in eine Datei mit Namen 'Neue Texte' die
-folgenden Zeilen:
-
-"Dieses ist der erste eingetragene Text!"
-"Hier ist eine "15"Markierung"14" im Text!"
-"Dieses ist die letzte Zeile!"
-
-Um diese Texte in die Menukarte einzubinden, starten Sie jetzt noch einmal Ihr
-Generierungprogramm für die Menukarte. Auf die Frage 'Sollen auch Anwendungstex­
-te in die Menukarte aufgenommen werden (j/n) ?' antworten Sie jetzt allerdings mit
-j(a). Daraufhin werden Ihnen die in Ihrer Task vorhandenen Dateien zur Auswahl
-angeboten. Kreuzen Sie die Datei 'Neue Texte' an, in der ja die eben genannten Texte
-eingetragen sind.
-Bei der Menukartengenerierung werden die Texte aus der Datei in die Menukarte
-eingebunden. Sollten Sie bei Notierung der Texte in der Datei formale Fehler gemacht
-haben, so werden Sie darauf hingewiesen.
-Um nun auf die eingelagerten Texte zurückgreifen zu können, muß erst einmal die
-neue Menukarte angekoppelt werden. Wie das geht, wissen Sie ja schon ('testin stalla­
-tion').
-Mit dem Befehl '#ib#anwendungstext#ie# (INT CONST zeilennummer)' (1 <= zeilen­
-nummer <= 2000) wird Ihnen nun der Text, der in der angegebenen Zeile steht,
-geliefert. Probieren Sie es doch gleich an Ihrer Menukarte aus: 'put (anwendungs­
-text (1))', 'put (anwendungstext (2))' usw.. Die eingelagerten Texte müßten jetzt auf
-dem Bildschirm erscheinen. Geben Sie eine Zeilennummer an, die nicht belegt ist, so
-wird der Text 'Kein Text vorhanden!' geliefert.
-
-Es können natürlich auch Texte abgelegt werden, die von gs-DIALOG aus aufgegrif­
-fen werden. Zur Konvertierung von Informationstexten steht die Prozedur '#ib#text zeile#ie#
-(TEXT CONST dateiname)' zur Verfügung. Diese Prozedur arbeitet genauso wie die
-Prozedur 'textprozedur', nur wird in der Ausgabedatei ('dateiname.a') der formatierte
-Text nicht als Textprozedur, sondern als einzeiliger Text geliefert. Sie können aber
-auch für gs-DIALOG Texte "von Hand" gestalten. Dazu müssen Sie sich an die
-Regeln für die Texte für gs-DIALOG halten, die in Kapitel 5.12 erläutert sind.
-
-
diff --git a/doc/menugenerator/menu-generator handbuch.5 b/doc/menugenerator/menu-generator handbuch.5
deleted file mode 100644
index c002f1a..0000000
--- a/doc/menugenerator/menu-generator handbuch.5
+++ /dev/null
@@ -1,975 +0,0 @@
-#block##pageblock#
-#pagenr("%",1)##setcount(1)##count per page#
-#headeven#
-gs-Menu-Generator
-#center#____________________________________________________________
-
-#end#
-#headodd#
-#right#gs-Menu-Generator
-#center#____________________________________________________________
-
-#end#
-#bottomeven#
-#center#____________________________________________________________
-5 - % #right#ERGOS
-#end#
-#bottomodd#
-#center#____________________________________________________________
-ERGOS #right# 5 - %
-#end#
-#ib#5  Dialoge innerhalb des Menus#ie#
-
-
-In Kapitel 4 haben Sie erfahren, wie Sie eine eigene Menukarte entwickeln können;
-sicher haben Sie das schon ausprobiert und sich Ihr selbstgestaltetes Menu auf dem
-Bildschirm angesehen. Bislang erscheint aber noch der Hinweis 'unbekanntes Kom­
-mando', wenn Sie eine Menufunktion aktivieren - denn die Prozeduren, die Sie bei
-der Aktivierung der Menufunktion aufrufen, sind ja noch nicht fertiggestellt!
-Bei vielen Menufunktionen ist es notwendig, mit dem Benutzer noch einen Dialog zu
-führen: z.B. muß ein Dateiname erfragt, eine Information ausgegeben und bestätigt,
-eine Auswahl oder eine Entscheidung getroffen werden. In diesem Kapitel sollen
-Ihnen nun die Möglichkeiten vorgestellt werden, die Ihnen zur Verfügung stehen, um
-einen solchen Dialog mit dem Benutzer zu führen. Dieser Dialog wird innerhalb des
-Menus geführt. Alle Prozeduren, die sich auf diesen Menu-Dialog beziehen, enthalten
-deshalb den Wortbestandteil 'menu'.
-
-Hier noch einige Tips! Damit Sie Ihre Menu-Dialoge testen können, empfiehlt
-sich folgendes Vorgehen: Sie erstellen zuerst Ihre Menukarte und tragen schon die
-Namen für die jeweils aufzurufenden Prozeduren ein - wie wir es in Kapitel 4 ge­
-macht haben. Mit 'testinstallation' installieren Sie dann in Ihrer Task die neue Menu­
-karte.
-Nun schreiben Sie Ihre Prozeduren, die Sie unter das Menu legen wollen. Ist eine
-Prozedur "testreif", so müssen Sie sie zunächst insertieren, denn das Menusystem gs-
-DIALOG kann nur auf insertierte Prozeduren zugreifen. Anschließend rufen Sie das
-Menu (z.B. 'SCRIPT') aus der Menukarte mit dem Befehl 'handle menu ("SCRIPT")'
-(Hier ist der jeweilige Menuname einzusetzen!) auf. Wenn Sie den entsprechenden
-Menupunkt aktivieren, müßte Ihr Programm ablaufen.
-Es ist günstig, eine eigene Task zum Testen der Prozeduren anzulegen, damit diese
-hin und wieder gelöscht werden kann.
-
-
-#ib#5.1 Eingabe eines Textes/Namens#ie# ('#ib#menuanswer#ie#')
-
-Wenn der Benutzer in unserem Beispiel die Menufunktion 'Neu erstellen' aktiviert
-hat, muß der Name der Datei erfragt werden, die neu erstellt werden soll. Dafür steht
-die Prozedur 'menuanswer' zur Verfügung. Die in die Menukarte eingetragene Proze­
-dur 'neue datei editieren' (Siehe Kapitel 4.1) könnte dann folgendermaßen aussehen:
-
-
-PROC neue datei editieren:
- TEXT VAR dateiname := menuanswer ("Bitte den gewünschten Dateinamen:",
- "", 5);
- IF dateiname <> "" AND NOT exists (dateiname)
- THEN command dialogue (FALSE); #ib#cursor on#ie#;
- edit (dateiname);
- #ib#cursor off#ie#; command dialogue (TRUE);
- regenerate menuscreen (* sehen Sie dazu Kapitel 5.10 *)
- FI
-END PROC neue datei editieren;
-
-
-Schauen wir uns zuerst die Prozedur 'menuanswer' an. Die Prozedur hat drei Para­
-meter. Mit dem ersten Parameter legen Sie den Text fest, der innerhalb der Box
-ausgegeben wird, die auf dem Bildschirm erscheint. Der Text dient ausschließlich der
-Information des Anwenders.
-Mit dem zweiten Parameter können Sie dem Benutzer einen Vorschlag für die Einga­
-be machen, der zum Editieren ausgegeben wird. Da eine solche Vorgabe aber in die­
-ser Situation sinnlos wäre, verzichten wir darauf ("").
-
-Die auf dem Bildschirm erscheinende Box hat folgendes Aussehen:
-
- +-------------------------------------+
- I Bitte den gewünschten Dateinamen: I
- I I
- I I
- I Eingabe: I
- +-------------------------------------+
-
-
-Die Boxbreite und -höhe wird vom System automatisch anhand des von Ihnen als
-ersten Parameter übergebenen Textes festgelegt. Sie haben noch verschiedene Mög­
-lichkeiten, diesen Text zu gestalten (mehrere Zeilen, Inversdarstellung etc.) - auf
-diese Möglichkeiten gehen wir in Kapitel 5.13 detailliert ein.
-In unserem Beispiel erscheint die Box in der Mitte des Menubildschirms. Diese
-Festlegung treffen wir durch die Angabe der Position '5' als dritten Parameter. Sie
-können hier zwischen 5 verschiedenen Positionen wählen: 1 - oben links, 2 - oben
-rechts, 3 - unten links, 4 - unten rechts, 5 - zentral im Menubildschirm - mehr dazu
-in Kapitel 5.12.
-
-Mit dem Erscheinen der obigen Box auf dem Bildschirm ändert sich automatisch
-auch die Fußzeile im Menu, über die der Benutzer Informationen zur Bedienung
-erhält. Hier erscheint der Hinweis: 'Fertig: <RETURN>  Abbruch: <ESC><h>'.
-Um diese Hinweise brauchen Sie sich aber nicht zu kümmern , da sie alle automa­
-tisch gesetzt werden.
-Die Prozedur 'menuanswer' hat noch folgende Besonderheit: Es ist nicht möglich,
-den Namen 'break' einzugeben! Diese Eingabe wird automatisch abgefangen. Es hat
-sich gezeigt, daß Anwender manchmal versuchen, über <ESC><q> die Eingabe
-zu verlassen. In diesem Falle entstünde hier eine Datei mit Namen 'break' - was aber
-nicht sinnvoll wäre.
-Nach der Eingabe liefert die Prozedur 'menuanswer' als Wert den vom Benutzer
-eingegebenen Text - dabei sind führende und folgende Leerzeichen schon abgeschnit­
-ten ('compress'). Wurde die Prozedur mit <ESC><h> verlassen, so wird niltext
-geliefert.
-
-Wird in obiger Prozedur die Eingabe mit <ESC><h> abgebrochen oder existiert
-bereits eine Datei mit dem eingegebenen Namen, so verschwindet die Box, und der
-Menubildschirm wird automatisch in den alten Zustand gebracht.
-Wenn schon eine Datei mit dem Namen existiert, dann wäre es sinnvoll, den Benutzer
-darauf aufmerksam zu machen. Wie ein solcher Hinweis in das Menu eingeblendet
-werden kann, erklären wir im Kapitel 5.2.
-
-gs-DIALOG ist so geschrieben, daß der Cursor möglichst wenig störend wirkt. Aus
-diesem Grunde wird der Cursor immer an einer Stelle "geparkt". Sofern Ihr System es
-zuläßt und eine entsprechende Anpassung vorliegt, wird der Cursor ganz ausgeschal­
-tet. Denken Sie bitte daran, auch wenn er auf Ihrem Bildschirm ständig sichtbar ist!
-Wenn also jetzt eine Eingabe erfolgen soll, ist es notwendig, den Cursor anzuschalten.
-Wenn Sie wieder in das Menu zurückkehren, sollte der Cursor wieder ausgeschal­
-tet werden, damit er dort nicht stört.
-Wenn Sie die Prozedur 'edit' mit einem neuen Namen als Parameter aufrufen, erfragt
-das System, ob die Datei neu eingerichtet werden soll. Diese Anfrage muß hier unter­
-drückt werden, damit nicht irgendwelche Texte in den Menubildschirm geschrieben
-werden. Das Unterdrücken der Abfrage erreichen Sie durch Ausschalten des Kom­
-mandodialoges. Nach Einrichten der Datei muß der Kommandodialog aber wieder
-eingeschaltet werden, da gs-DIALOG das Eingeschaltetsein für eine fehlerfreie Funk­
-tion voraussetzt!
-
-Mit dem Befehl '#ib#regenerate menuscreen#ie#' (sehen Sie dazu auch Kapitel 5.10) wird der
-aktuelle Menubildschirm erneut vollständig auf den Bildschirm geschrieben (repro­
-duziert). Das ist notwendig, weil die Prozedur 'edit' den Bildschirm benutzt hat.
-Durch diesen Befehl wird der Menubildschirm exakt in der Form hergestellt, wie er
-zuletzt ausgesehen hat. Auch wenn Sie geschachtelte Menubildschirme haben, wer­
-den diese durch den einen Befehl reproduziert. So können Sie in Ihren Verarbei­
-tungsfunktionen mit dem Bildschirm "machen was Sie wollen" - Sie kehren mit dem
-letztgenannten Befehl immer wieder so in das Menu zurück, wie Sie es verlassen
-haben.
-
-
-#ib#5.2 Ausgabe einer Information#ie# ('#ib#menuinfo#ie#')
-
-In der Prozedur 'neue datei editieren' (Kapitel 5.1) wäre es sinnvoll, den Benutzer zu
-informieren, wenn bereits eine Datei mit dem eingegebenen Namen existiert. Hierfür
-steht die Prozedur 'menuinfo' zur Verfügung.
-
-Beispiel:
-
-menuinfo (" Eine Datei mit dem Namen "13" existiert schon!");
-
-Dadurch wird folgende Box ins Menu geschrieben:
-
- +----------------------------+
- I I
- I Eine Datei mit dem Namen I
- I existiert schon I
- I I
- +----------------------------+
-
-Die Box erscheint in der Mitte des Menus (Position 5); in der Fußzeile wird der Hin­
-weis ausgegeben 'Zum Weitermachen bitte irgendeine Taste tippen!'. Dann wartet das
-System so lange, bis eine Taste gedrückt wird. Anschließend wird der aktuelle Menu­
-schirm wiederhergestellt.
-Die Prozedur 'menuinfo' gibt es noch in zwei weiteren Versionen, nämlich mit zwei
-bzw. drei Parametern. Im ersten Fall kann über den zweiten Parameter noch die
-Position (1, 2, 3, 4, 5) innerhalb des Menubildschirmes festgelegt werden (sehen Sie
-dazu Kapitel 5.12). Mit dem dritten Parameter kann ggf. noch die Wartezeit festgelegt
-werden, die das System maximal verstreichen läßt, bevor es von sich aus das Pro­
-gramm fortsetzt.
-
-'menuinfo (" Eine Datei mit dem Namen "13" existiert schon!", 3, 40)'
-
-gibt die oben gezeigte Box aus, aber links unten in der Ecke des Menubildschirms
-(Position 3). Das System wartet (maximal) 4 Sekunden (40 Zehntel) und setzt dann -
-auch ohne Tastendruck - das Programm fort. Diese Prozedur mit gesondert angege­
-bener Wartezeit verwendet man dann, wenn man nicht unbedingt die Kenntnisnahme
-der Information durch den Benutzer bestätigt haben möchte.
-
-
-#ib#5.3 Auswahl eines Namen durch Ankreuzen#ie# ('#ib#menuone#ie#')
-
-Während bei der Neuerstellung einer Datei ein Name neu erfragt werden muß, kann
-man beim Menupunkt 'Ansehen/Ändern' auf schon vorhandene Dateien zugreifen.
-Sie können dem Benutzer z.B. alle Dateien in der Task zur Auswahl anbieten. Sobald
-der Benutzer einen Namen angekreuzt hat, soll die entsprechende Datei geöffnet wer­
-den. Dafür steht der Befehl 'menuone' zur Verfügung:
-
-
-PROC alte datei editieren:
- TEXT CONST kopf :: "Textdatei ansehen/ändern",
- hinweis :: "Bitte gewünschte Datei ankreuzen";
- TEXT VAR dateiname := menuone (ALL myself, kopf, hinweis, FALSE);
- IF dateiname <> ""
- THEN #ib#cursor on#ie#;
- edit (dateiname);
- #ib#cursor off#ie#;
- FI;
- regenerate menuscreen
-END PROC alte datei editieren;
-
-
-Die Prozedur 'menuone' hat 4 Parameter: Als erster Parameter ist ein Thesaurus zu
-übergeben, in dem die zur Auswahl stehenden Namen enthalten sind. Zum Thesau­
-rushandling werden noch einige zusätzliche Funktionen zur Verfügung gestellt (z.B.
-daß nur Dateien eines bestimmten Typs zur Auswahl angeboten werden können) -
-diese Funktionen werden in Kapitel 5.14 erläutert. In unserem Beispiel werden alle
-Dateien zur Auswahl angeboten, die in der Task zur Verfügung stehen.
-Die beiden Texte, die als 2. und 3. Parameter übergeben werden, erscheinen zur
-Kennzeichnung im Kopf der Auswahlliste. Der als zweiter Parameter übergebene Text
-erscheint zentriert und invers dargestellt auf dem Bildschirm, der als dritter Parame­
-ter übergebene Text nur zentriert. Es ist sinnvoll, mit dem ersten Text (2.Parame­
-ter) die zur Zeit aktivierte Menufunktion anzuzeigen, denn der Menubildschirm wird
-ja durch die Auswahlliste überschrieben. So kann sich der Benutzer besser im Menu­
-system orientieren.
-Mit dem 4. Parameter wird festgelegt, ob der Bildschirm nach der Auswahl "ge­
-reinigt", d.h. der alte Menubildschirm wiederhergestellt werden soll. Da in unserem
-Falle normalerweise im Anschluß an die Auswahl eine Datei auf dem Bildschirm
-editiert wird, verzichten wir auf die "automatische Regenerierung" des Menubild­
-schirms. Dieses besorgen wir nach dem Editieren durch das Kommando 'regenerate
-menuscreen' "von Hand".
-Auf das Fenster, das für die Auswahl auf dem Bildschirm angezeigt wird, können Sie
-keinen Einfluß nehmen - es wird vom System selbständig festgelegt. Dadurch können
-Sie die Auswahl, wie auch die anderen Dialogkomponenten ebenso in geschachteleten
-Menus aufrufen, ohne daß es zu Problemen kommt.
-
-
-#ib#5.4 Auswahl mehrerer Namen durch Ankreuzen#ie# ('#ib#menusome#ie#')
-
-Es ist nicht immer sinnvoll, daß der Benutzer nur einen Namen auswählen, d.h.
-ankreuzen kann. Bei der Zeilenformatierung könnte man z.B. zulassen, daß gleich
-mehrere Dateinamen angekreuzt werden können. Im Anschluß an die Auswahl sollen
-dann alle angekreuzten Dateien mit 'lineform' bearbeitet werden. Für diesen Zweck
-steht die Prozedur 'menusome' zur Verfügung. Sie hat die gleichen Parameter wie die
-in 5.3 erläuterte Prozedur 'menuone' - nur daß hier die Auswahl mehrerer Namen
-möglich ist. Verläßt der Benutzer die Auswahl durch <ESC><q>, so wird ein
-Thesaurus mit allen angekreuzten Namen geliefert; bei Verlassen mit <ESC><h>
-ein leerer Thesaurus. Beispiel:
-
-
-PROC zeilen formatieren:
- TEXT CONST kopf :: "Textdateien zeilenweise formatieren",
- hinweis :: "Bitte gewünschte Dateien ankreuzen";
- THESAURUS VAR dateinamen := menusome (ALL myself, kopf, hinweis,
- FALSE);
- cursor on;
- formatiere dateien;
- cursor off;
- regenerate menuscreen.
-
- formatiere dateien:
- INT VAR zaehler;
- FOR zaehler FROM 1 UPTO highest entry (dateinamen) REP
- IF name (dateinamen, zaehler) <> ""
- THEN lineform (name (dateinamen, zaehler))
- FI
- PER
-END PROC zeilen formatieren;
-
-
-
-#ib#5.5 Eingabe eines Textes/Namens - alternativ: Auswahl
- durch Ankreuzen#ie# ('#ib#menuanswerone#ie#','#ib#menuanswersome#ie#')
-
-Sehr häufig kommt es vor, daß der Benutzer auf die zuletzt bearbeitete Datei zurück­
-greifen will. In Kapitel 5.3 haben wir dem Benutzer bei der Menufunktion 'Anse­
-hen/Ändern' gleich alle Dateien zur Auswahl angeboten. Hier wäre es vielleicht gün­
-stiger gewesen, ihm die zuletzt bearbeitete Datei anzubieten und erst auf Wunsch die
-Liste aller Dateien zum Ankreuzen. Das läßt sich auf verschiedene Weise realisieren -
-wir werden Ihnen in diesem und in den folgenden Kapiteln verschiedene Möglich­
-keiten aufzeigen:
-
-Sie können z.B. mit der Prozedur 'menuanswerone' arbeiten. Wie Sie schon aus dem
-Namen entnehmen können, handelt es sich dabei um eine Prozedur, die eigentlich
-aus zwei Prozeduren, nämlich 'menuanswer' und 'menuone' zusammengesetzt ist.
-Stellen Sie sich vor, sie führen den Namen der zuletzt bearbeiteten Datei in Ihrem
-Programm unter der Variablen 'letzte datei'. Dann könnte die Prozedur 'alte datei
-editieren' aus Kapitel 5.3 auch folgendermaßen geschrieben werden:
-
-
-TEXT VAR letzte datei;
-...
-
-
-PROC alte datei editieren:
- TEXT CONST hinweis letzte :: "Zuletzt bearbeitete Datei:",
- kopf :: "Textdatei ansehen/ändern",
- hinweis :: "Bitte gewünschte Datei ankreuzen";
- TEXT VAR dateiname := menuanswerone (hinweis letzte,
- letzte datei,
- ALL myself, kopf,
- hinweis, FALSE);
- IF dateiname <> ""
- THEN cursor on;
- edit (dateiname);
- letzte datei := dateiname;
- cursor off;
- FI;
- regenerate menuscreen
-END PROC alte datei editieren;
-
-
-Insgesamt hat die Prozedur 6 Parameter: Die ersten beiden Parameter beziehen sich
-auf die Eingabe ('menuanswer'). Wie dort kann auch hier der Text festgelegt werden,
-der in der Box auf dem Bildschirm erscheint.
-Der zweite Parameter ist der Text, der dem Benutzer zum Editieren angeboten wird -
-hier der zuletzt benutzte Dateiname. Möchte der Benutzer auf die Datei mit dem an­
-gebotenen Namen zugreifen, braucht er nur mit <RETURN> zu bestätigen.
-Möchte er die Auswahl zum Ankreuzen angeboten bekommen, so braucht er nur die
-Tastenfolge <ESC><z> (für 'Zeigen') zu tippen. Auf diese Auswahl beziehen sich
-die letzten 4 Parameter, die die gleiche Bedeutung haben wie bei der Prozedur
-'menuone'. Auf die Möglichkeit, durch <ESC><z> eine Auswahl angeboten zu
-bekommen, wird in der Fußzeile des Menus hingewiesen.
-
-Aber Achtung! Sie sollten sich einer "Gefahr" bei diesem Vorgehen bewußt sein. Der
-Benutzer hat natürlich so die Möglichkeit, auch einen anderen Namen als den vorge­
-schlagenen anzugeben - einen Namen, der noch nicht in der Dateiliste enthalten ist.
-In einem solchen Falle würde Ihnen bei obiger Prozedur der Menubildschirm "ka­
-puttgeschrieben", denn das System fragt (bei eingeschaltetem Kommandodialog) an,
-ob eine Datei mit dem Namen eingerichtet werden soll. Für diesen Fall sollten Sie also
-unbedingt eine Vorsorge treffen (z.B. indem Sie den Benutzer darauf hinweisen, daß
-der eingegebene Name nicht akzeptiert wird)!
-
-Sie vermuten sicher schon ganz richtig, daß es entsprechend auch die Prozedur
-'menuanswersome' gibt, die zunächst einen Dateinamen erfragt und auf Wunsch
-eine Auswahl anbietet, in der mehrere Dateinamen angekreuzt werden können. Die
-Prozedur hat ebenfalls 6 Parameter, die identisch zur Prozedur 'menuanswerone'
-sind. Allerdings liefert die Prozedur 'menuanswersome' in jedem Fall einen Thesau­
-rus; wurde die Auswahl mit <ESC><h> abgebrochen, so liefert sie einen leeren
-Thesaurus.
-
-
-#ib# 5.6 Die Ja/Nein - Entscheidung#ie# ('#ib#menuyes#ie#','#ib#menuno#ie#')
-
-In Kapitel 5.5 trat das Problem auf, daß der Benutzer einen "unzulässigen" Namen
-eingeben konnte. Dieses Problem können wir umgehen: Wir fragen den Benutzer ein­
-fach, ob er mit der zuletzt bearbeiteten Datei arbeiten will und lassen Ihm nur die
-Chance, mit 'Ja' oder 'Nein' zu antworten. Im ersten Fall bieten wir ihm eben diese
-Datei an - ansonsten die Auswahl zum Ankreuzen.
-
-Hierfür stehen die Prozeduren 'menuyes' und 'menuno' zur Verfügung, die von Ihrer
-Funktion her den Ihnen bekannten Prozeduren 'yes' und 'no' gleichen. Die beiden
-Menu-Prozeduren haben jeweils zwei Parameter:
-
-
-TEXT VAR letzte datei;
-...
-
-PROC alte datei editieren:
- TEXT CONST kopf :: "Textdatei ansehen/ändern",
- hinweis :: "Bitte gewünschte Datei ankreuzen";
- TEXT VAR dateiname;
- IF menuyes (" Wollen Sie mit der Datei "13"" +
- " '" +letzte datei+ "'"13" arbeiten", 5)
- THEN editiere letzte datei
- ELSE dateiname := menuone (ALL myself, kopf, hinweis, FALSE);
- editiere ausgewaehlte datei
- FI;
- regenerate menuscreen.
-
- editiere letzte datei:
- cursor on; edit (letzte datei); cursor off.
-
- editiere ausgewaehlte datei:
- IF dateiname <> ""
- THEN cursor on; edit (dateiname); cursor off;
- letzte datei := dateiname
- FI
-END PROC alte datei editieren;
-
-
-Ãœber den zweiten Parameter legen Sie die Position auf dem Bildschirm innerhalb des
-Menus fest (1, 2, 3, 4, 5; sehen Sie auch Kapitel 5.12). Der erste Parameter ist ein
-Text, welcher der gs-DIALOG-Syntax gehorchen muß (die Codes "13" bewirken
-einen Zeilenvorschub; sehen Sie auch Kapitel 5.13). Er wird in einer Box auf den
-Bildschirm geschrieben und durch 'Ja  Nein' ergänzt:
-
-
- +-----------------------------+
- I I
- I Wollen Sie mit der Datei I
- I 'Dateiname' I
- I arbeiten? I
- I I
- I Ja    Nein I
- I I
- +-----------------------------+
-
-Für 'Dateiname' ist auf Ihrem Bildschirm dann natürlich der aktuelle Inhalt von
-'letzte datei' eingetragen.
-Die Prozedur 'menuyes' liefert TRUE, wenn mit 'Ja' geantwortet wurde und FALSE,
-wenn mit 'Nein' geantwortet wurde. Die Prozedur 'menuno' wirkt wie 'NOT menuyes'.
-Nach Eingabe von 'Ja', 'Nein' (durch Tippen der Anfangsbuchstaben oder Positionie­
-rung auf die Antwort und anschließendem <RETURN>) wird der Menubildschirm
-automatisch regeneriert. Auch die entsprechenden Hinweise in der Fußzeile werden
-natürlich automatisch gesetzt.
-
-
-#ib#5.7 Die Alternativentscheidung#ie# ('#ib#menualternative#ie#')
-
-Im letzten Kapitel haben wir Ihnen die Prozeduren 'menuyes' und 'menuno' in Ihrer
-Wirkungsweise erläutert. Eigentlich sind die beiden Prozeduren nur ein (häufig
-benötigter) Spezialfall der Prozedur 'menualternative'. Die Funktionsweise der Proze­
-dur 'menualternative' dürfte Ihnen schon aus dem 'Archivmenu' bekannt sein: Wenn
-Sie eine neue Zieltask einstellen, werden Ihnen nämlich vier Alternativen zur Auswahl
-angeboten (Archiv, Vatertask, PUBLIC, Sonstige Task).
-Auf unsere Textverarbeitung bezogen könnten wir z.B. vor der Zeilenformatierung
-(lineform) über die Alternativentscheidung den gewünschten Schrifttyp abfragen. Wir
-wollen dem Benutzer in diesem Beispiel fünf Schrifttypen (schmal, elite, pica, letter,
-groß) zur Auswahl anbieten:
-
-
-
-TEXT VAR schrifttyp;
-...
-
-PROC schrifttyp waehlen:
- TEXT CONST info :: " Auswahl der Schrifttypen: "13""13""
- + " s ... schmal (17 Zeichen pro Zoll) "13""
- + " e ... elite (12 Zeichen pro Zoll) "13""
- + " p ... pica (10 Zeichen pro Zoll) "13""
- + " l ... letter (Proportionalschrift) "13""
- + " g ... groß ( 5 Zeichen pro Zoll) ",
-
- liste :: "schmal"13"elite"13"pica"13"letter"13"groß",
- tasten :: "seplgSEPLG";
-
- INT VAR auswahl := menualternative (info, liste, tasten, 5, TRUE);
- SELECT auswahl OF
- CASE 1, 101, 106: schrifttyp := "17"
- CASE 2, 102, 107: schrifttyp := "12"
- CASE 3, 103, 108: schrifttyp := "10"
- CASE 4, 104, 109: schrifttyp := "prop"
- CASE 5, 105, 110: schrifttyp := "5"
- OTHERWISE (* behalte alten Schrifttyp bei *)
- END SELECT
-END PROC schrifttyp waehlen;
-
-
-Hätten wir diese Prozedur in unsere Prozedur 'zeilen formatieren' eingebunden, so
-zeigte sich bei Aktivierung folgende Einblendung in den Menubildschirm:
-
-
-
- +---------------------------------------+
- I I
- I Auswahl der Schrifttypen: I
- I I
- I s ... schmal (17 Zeichen pro Zoll) I
- I e ... elite (12 Zeichen pro Zoll) I
- I p ... pica (10 Zeichen pro Zoll) I
- I l ... letter (Proportionalschrift) I
- I g ... groß ( 5 Zeichen pro Zoll) I
- I I
- I schmal elite pica letter groß I
- I I
- +---------------------------------------+
-
-Die Prozedur 'menualternative' besitzt insgesamt 5 Parameter. Wie Ihnen schon von
-von anderen Prozeduren bekannt ist, wird mit dem vorletzten (4.) Parameter die
-Position innerhalb des Menubildschirms bestimmt - hier also die Plazierung in die
-Mitte des Menubildschirms.
-Mit dem 5. Parameter können Sie noch festlegen, ob der Benutzer die Möglichkeit
-haben soll, die Alternativauswahl mit <ESC><h> abzubrechen (bei TRUE, wie im
-Beispiel) oder eben nicht.
-
-Mit dem 1. Parameter wird der Informationstext festgelegt, der auf dem Bildschirm
-innerhalb der Box erscheinen soll. Für die Funktion der Alternativauswahl ist die­
-ser Inhalt völlig belanglos - er dient ausschließlich der Information des Benutzers.
-Der Text kann - wie hier - z.B. durch eine Einteilung in Zeilen gestaltet werden
-(durch den Code "13").
-Der Text in den Zeilen sollte nicht zu breit sein, da er noch in eine Box innerhalb des
-Menubildschirms hineinpassen muß! Damit es auch bei geschachtelten Menus zu
-keinen Problemen kommt, sollte eine Zeile nicht breiter als 64 Zeichen sein. Aber
-keine Angst: Sie können gs-DIALOG durch zu lange Texte nicht durcheinanderbrin­
-gen - wenn Ihr Text zu breit ist, wird er rigoros abgeschnitten und einfach nicht
-angezeigt.
-
-Mit dem 2. Parameter übergeben Sie die Auswahlliste, die in der letzten Zeile der Box
-dargestellt wird. Hier dürfen insgesamt bis zu 10 Alternativen angegeben werden -
-bedenken Sie dabei aber unbedingt, daß diese Liste ebenfalls nicht zu lang werden
-darf (ebenfalls höchstens 64 Zeichen).
-Zwischen jeder von Ihnen notierten Alternative muß zur Kennung der Code "13"
-eingetragen werden - wie oben im Beispiel gezeigt. Da nachher in der Box zwischen
-den einzelnen Alternativen je drei Leerzeichen eingefügt werden, können Sie sich
-immer an der von Ihnen übergebenen Zeichenkette orientieren. Hat Ihre Auswahlliste
-nicht mehr als 64 Zeichen, dann ist sie in jedem Falle auf dem Bildschirm darstell­
-bar.
-Ãœber diese Auswahlliste erfolgt normalerweise die Auswahl. Mit den Cursortasten links
-und rechts kann der Benutzer auf die gewünschte Alternative positionieren (auf dem
-Bildschirm invers dargestellt) und dann die <RETURN>-Taste tippen.
-Die Prozedur 'menualternative liefert dann einen Zahlenwert, nämlich die Position
-der gewählten Alternative in der als 2. Parameter übergebenen Liste (wird in unse­
-rem Beispiel die Alternative 'letter' gewählt, so liefert die Prozedur den Wert 4).
-Haben Sie den Abbruch durch <ESC><h> zugelassen (5. Parameter), so wird im
-Falle eines solchen Abbruchs der Wert '0' geliefert.
-
-Mit dem 3. Parameter können Sie noch festlegen, über welche Tasten eine Auswahl
-erfolgen soll. Wenn Sie hier niltext ("") angeben, ist eine Auswahl über die Tasten
-nicht möglich. Im Beispiel haben wir hier die Anfangsbuchstaben der im Text ge­
-nannten Schrifttypen gewählt und als Eingabe sowohl Klein- als auch Großbuchsta­
-ben gestattet. Erfolgt nun die Auswahl über das Tippen einer zugelassenen Taste,
-dann wird Ihre Position in der im 3. Parameter übergebenen Zeichenkette ermittelt
-und der Wert '100' dazuaddiert. Tippt in unserem Falle der Benutzer die Taste
-<L>, wird der Wert '109' geliefert.
-
-Es erfolgt übrigens kein Hinweis in der Fußzeile, ob eine Auswahl über das Tippen
-einer Taste möglich ist! Wenn Sie von der Möglichkeit Gebrauch machen, sollten Sie
-dieses durch die Gestaltung Ihres Informationstextes andeuten - wie wir es im Bei­
-spiel auch getan haben.
-
-
-#ib#5.8 Die Menunotiz#ie# ('#ib#write menunotice#ie#', '#ib#erasemenunotice#ie#')
-
-Innerhalb des Menus können Sie für den Benutzer auch eine Notiz ablegen. Wir
-machen z.B. bei der Archivverwaltung Gebrauch davon. Dort wird nämlich ständig
-angezeigt, mit welcher Task kommuniziert wird und - sofern es sich um einen Ar­
-chivmanager handelt - wie die (angemeldete) Diskette heißt. Wenn Sie z.B. dem
-Benutzer das aktuelle Datum im Menu anzeigen wollen, insertieren Sie die folgende
-Prozedur:
-
-
-PROC datum anzeigen:
- write menunotice ("Datum: " + date, 4)
-END PROC datum anzeigen;
-
-
-Die Prozedur 'write menunotice' besitzt zwei Parameter. Mit dem ersten Parameter
-wird der Text übergeben, der in der Box ausgegeben werden soll. Er unterliegt eben­
-falls der gs-DIALOG-Syntax für Texte. Durch den zweiten Parameter wird wieder die
-Position innerhalb des Menus festgelegt (hier rechts unten: Position 4).
-
-Wenn Sie jetzt in Ihrer Menukarte die Prozedur 'oberbegriff  ("Bearbeiten")' in fol­
-gender Weise abändern:
-
-
- oberbegriff ("Bearbeiten", "datum anzeigen", "erase menunotice")
-
-
-dann wird jedesmal, wenn das Pull-Down-Menu unter dem Oberbegriff 'Bearbeiten'
-aufgefaltet wird, unten rechts (Position 4) das aktuelle Datum in einer Box ange­
-zeigt. Diese Notiz verschwindet, wenn in ein anderes Pull-Down-Menu gewechselt
-wird.
-
-Auf den ersten Eindruck scheinen die Prozeduren 'write menunotice' und 'menuinfo'
-gleich zu sein - das ist aber nicht der Fall: Bei 'menuinfo' wird der Text in einer Box
-ausgegeben und so lange gewartet, bis der Benutzer eine Taste getippt hat (oder die
-angegebene Zeit verstrichen ist). Bei 'write menunotice' wird ebenfalls ein Text in
-einer Box auf den Menubildschirm geschrieben. Diese Box bleibt aber über längere
-Zeit bestehen (auf Erscheinen und Verschwinden kann der Benutzer selbst keinen
-Einfluß nehmen!) - und zwar solange, bis die Notiz gelöscht wird (mit 'erase menu­
-notice'; in unserem Beispiel, wenn das Pull-Down-Menu gewechselt wird) oder durch
-ein neues 'write menunotice' überschrieben wird. In einem Menu kann nämlich zu
-einem Zeitpunkt nur eine Menunotiz abgelegt werden.
-Wenn der Bildschirm durch gs-DIALOG-Prozeduren überschrieben wird, wird die
-Menunotiz ebenfalls ständig mitaufgefrischt, und auch, wenn Sie den Befehl 'regene­
-rate menuscreen' oder 'refresh submenu' geben.
-
-
-#ib#5.9 Fußzeilen im Menu#ie# ('#ib#menufootnote#ie#', '#ib#oldmenufootnote#ie#')
-
-In den Fußzeilen innerhalb des Menus werden dem Benutzer Bedienhinweise ange­
-zeigt. Die Fußzeile wird aber auch dazu benutzt, den Benutzer über Prozesse zu
-informieren, die im Hintergrund ablaufen - erst recht dann, wenn Sie einige Zeit in
-Anspruch nehmen. Sie zeigen dem Benutzer an, daß er nicht "unruhig" zu werden
-braucht, sondern das System "mit sich" beschäftigt ist.
-Im allgemeinen braucht sich der Programmierer um diese Fußnoten nicht zu küm­
-mern, denn sie werden von den einzelnen Komponenten des Systems automatisch
-gesetzt. Wir können aber z.B. dem Benutzer einen Hinweis geben, wenn unter dem
-Menupunkt 'Verzeichnis' eine Liste erstellt wird. Die Prozedur könnte dann folgen­
-dermaßen notiert werden:
-
-
-PROC verzeichnis ausgeben:
- menufootnote ("Bitte warten... Ich erstelle eine Dateiliste");
- FILE VAR f :: sequential file (output, "Dateiliste");
- list (f); modify (f);
- old menufootnote;
- entferne eigenen namen;
- zeige liste an;
- forget ("Dateiliste", quiet).
-
- entferne eigenen namen:
- TEXT VAR zeile :: ""; INT VAR i;
- FOR i FROM lines (f) DOWNTO 1 REP
- to line (f, i);
- read record (f, zeile);
- UNTIL pos (zeile, "Dateiliste") > 0 PER;
- delete record (f).
-
- zeige liste an:
- to line (f, 1);
- menuwindowshow (f) (* Sehen Sie Kapitel 5.11.1*)
-END PROC verzeichnis ausgeben;
-
-
-Beachten Sie, daß der Text nicht länger als 64 Zeichen ist, damit er auch bei ge­
-schachtelten Menus vollständig ausgegeben werden kann. Sollte der Text dennoch zu
-lang sein, wird er vom System auf die entsprechende Länge gestutzt.
-Haben Sie mit 'menufootnote' eine eigene Fußzeile gesetzt, so können Sie die da­
-durch gelöschte Zeile durch den Befehl 'old menufootnote' wieder hinschreiben.
-Ansonsten wird Ihre Fußzeile von der nächsten automatisch (d.h. vom System) ge­
-setzten Fußnote überschrieben. In dem obigen Beispiel hätten Sie also gut auf den
-Befehl 'old menufootnote' verzichten können.
-
-Durch 'old menufootnote' wird die letzte Fußnote, die automatisch vom System ge­
-setzt wurde, reproduziert. Der in der obigen Prozedur verwendete Befehl 'menuwin­
-dowshow' ist bisher noch nicht erläutert. Sehen Sie dazu bitte das Kapitel 5.11.1.
-
-
-#ib#5.10 Wiederherstellung des Menubildschirms#ie# ('#ib#regenerate
- menuscreen#ie#','#ib#refresh submenu#ie#')
-
-Der Befehl 'regenerate menuscreen' ist Ihnen schon aus diversen Beispielprogram­
-men dieses Handbuches bekannt. Ist der Menubildschirm "kaputtgeschrieben" oder
-der Bildschirm für andere Zwecke benutzt worden, so läßt sich durch diesen Befehl
-der Menubildschirm in seinem letzten Zustand reproduzieren (auch bei geschachtel­
-ten Menus!). Durch den Befehl wird der Bildschirm gelöscht und komplett neu
-aufgebaut.
-
-Ein vollständiger Bildschirmaufbau ist aber gar nicht immer nötig. Wenn Sie sicher
-sind, daß durch Ihre Operationen nur der Bereich zwischen den beiden durchgezo­
-genen Linien, die die Kopf- und Fußzeile abtrennen, betroffen ist, brauchen Sie nur
-den Befehl 'refresh submenu' zu geben. Hierdurch wird das aktuelle Pull-Down-
-Menu neu aufgebaut und - sofern gesetzt - die Menunotiz. Wenn möglich, ist er dem
-Befehl 'regenerate menuscreen vorzuziehen, da hierfür weniger Zeit benötigt wird
-und weniger "Unruhe" auf dem Bildschirm entsteht.
-Sorgen Sie aber unbedingt dafür, daß der von Ihnen benutzte Bildschirmbereich
-zuvor "gereinigt" wird, denn das besorgt 'refresh subnmenu' nicht!
-
-
-#ib#5.11 Arbeiten im Menufenster#ie#
-
-Neben den vorab aufgezeigten Möglichkeiten können Sie innerhalb des Menus auch
-noch ein Fenster öffnen. Innerhalb dieses Fensters stehen Ihnen alle Möglichkei­
-ten zur Verfügung, die Sie auch sonst zum Beschreiben des gesamten Bildschirms
-haben - und noch einiges mehr.
-Wir machen z.B. intensiv beim Archivhandling Gebrauch davon. So werden Ihnen
-Verzeichnisse angezeigt, Sie können verfolgen, wie die einzelnen Dateien vom Archiv
-geholt werden oder dorthin geschrieben werden und einiges mehr. In diesem Kapitel
-wollen wir Ihnen die Möglichkeiten aufzeigen, die Sie innerhalb des Menufensters
-haben.
-
-Auf die Größe des Menufensters haben Sie keinen Einfluß, sie wird vom System ge­
-setzt ("normales" Menu: 77 Zeichen breit und 20 Zeichen hoch; geschachteltes
-Menu: 71 Zeichen breit und 16 Zeichen hoch). Hierdurch ist sichergestellt, daß alle
-Operationen auch in geschachtelten Menus ohne Probleme ausführbar sind. Alle
-Prozeduren, die sich auf Aktionen im Menufenster beziehen, enthalten die Silbe
-'menuwindow'.
-Sie können mit den hier beschriebenen Prozeduren ähnlich arbeiten, wie mit den
-entsprechenden Prozeduren ohne den Wortbestandteil 'menuwindow' auf dem
-ganzen Bildschirm. Allerdings gibt es einige Unterschiede, auf die Sie achten sollten!
-
-
-5.11.1 Datei anzeigen/editieren
- ('#ib#menuwindowshow#ie#', '#ib#menuwindowedit#ie#')
-
-Von der Prozedur 'menuwindowshow (FILE VAR f)' haben wir im letzten Kapitel
-schon Gebrauch gemacht, um das Verzeichnis der Dateien in der Task innerhalb des
-Menus anzuzeigen. Die Prozedur gibt es in zwei Versionen mit je einem Parameter.
-Einmal kann, wie im vorigen Kapitel, ein FILE angegeben werden, andererseits kann
-auch der Name der anzuzeigenden Datei als Text übergeben werden ('menuwindow­
-show (TEXT CONST dateiliste)'). Durch den Befehl wird innerhalb des Menus ein
-umrandetes Fenster geöffnet, in der das angegebene File/die Datei angezeigt wird. Bei
-'menuwindowshow' kann die Datei nur eingesehen, nicht aber schreibend verändert
-werden.
-Die Prozedur 'menuwindowedit' gibt es ebenfalls in den zwei Ausprägungen. Sie
-verhält sich zur vorgenannten identisch - nur kann hier auch die Datei schreibend
-verändert werden.
-
-
-5.11.2 Menufenster öffnen/anzeigen ('#ib#show menuwindow#ie#')
-
-Wenn Sie eigene Operationen in einem Fenster im Menu ausführen lassen wollen,
-muß dieses Fenster zunächst auf dem Bildschirm angezeigt werden. Durch den
-Befehl 'show menuwindow' wird ein entsprechender Rahmen innerhalb des Menus
-ausgegeben und der Bereich innerhalb dieses Rahmens (das Fenster) gelöscht.
-Auf die Größe des Fensters innerhalb des aktuellen Menus können Sie - wie bereits
-eingangs gesagt - keinen Einfluß nehmen.
-Zu einem Zeitpunkt kann immer nur ein Menufenster geöffnet sein, da das Fenster
-schon den größtmöglichen sinnvollen Bereich des aktuellen Menus belegt. Ein er­
-neutes 'show menuwindow' hätte die gleiche Wirkung wie das nachfolgend beschrie­
-bene 'menuwindowpage' - nur wird hier zusätzlich noch der Rahmen des Fensters
-mitausgegeben.
-
-
-5.11.3 Menufenster löschen (putzen) ('#ib#menuwindowpage#ie#')
-
-Durch den Befehl 'menuwindowpage' wird das Fenster innerhalb des aktuellen
-Menus gelöscht; der Rahmen des Fensters bleibt bestehen, da er nicht mit zum ei­
-gentlichen Fenster gehört. Durch den Befehl wird der Menubildschirm nicht(!)
-rekonstruiert!
-
-
-5.11.4 Positionierungen im Menufenster
- ('#ib#menuwindowline#ie#', '#ib#menuwindowcursor#ie#')
-
-Mit 'menuwindowline' wird, wie auch sonst auf dem Bildschirm, an den Anfang der
-nächsten Zeile positioniert. Diesen Befehl gibt es, ebenso wie den Befehl 'line' (der
-auf dem Gesamtbildschirm operiert) ohne und mit einem Parameter. Durch 'menu­
-windowline (3)' wird an den Anfang der "drittnächsten" Zeile innerhalb des Menu­
-fensters positioniert.
-
-Aber Achtung! Der Befehl 'menuwindowline' weist einen deutlichen Unterschied zum
-Ihnen bekannten Befehl 'line' auf. Wird nämlich die untere Fenstergrenze überschrit­
-ten, so rollt (scrollt) der Bildschirm nicht um die entsprechenden Zeilen nach oben,
-wie Sie es von 'line' gewohnt sind - statt dessen wird der Fensterinhalt gelöscht und
-wieder oben im Fenster zu schreiben begonnen. Es erscheint, als ob auf ein neues
-Fenster positioniert würde.
-Innerhalb des Fensters können Sie auch den Cursor positionieren, wie Sie es vom
-Bildschirm gewohnt sind - allerdings nur innerhalb der aktuell gültigen Grenzen. In
-einem Menu ist das Fenster 77 Zeichen breit und 20 Zeichen hoch; in einem ge­
-schachtelten Menu 71 Zeichen breit und 16 Zeichen hoch.
-Wird außerhalb des aktuellen Menufensters positioniert, wird das Fenster gelöscht
-und die Fensterposition (1, 1) angenommen.
-
-
-5.11.5 Informationen über die aktuelle Menu-Fenster position ('#ib#get
-menuwindowcursor#ie#', '#ib#remaining menuwindowlines#ie#')
-
-Mit der Prozedur 'get menuwindowcursor (INT VAR spalte, zeile)' kann die aktuelle
-Position des Cursors innerhalb des Menufensters erfragt werden. Die Prozedur hat
-zwei Parameter, die als 'INT VAR' deklariert sein müssen. Der erste Parameter enthält
-anschließend die aktuelle Spalte, der zweite die aktuelle Zeile.
-
-Mit der werteliefernden Prozedur 'remaining menuwindowlines' kann die Anzahl der
-noch verbleibenden Zeilen innerhalb des aktuellen Menufensters erfragt werden. Die
-Prozedur wurde deshalb zur Verfügung gestellt, weil der Fensterinhalt - im Gegensatz
-zum normalen Bildschirm - nicht gescrollt werden kann. So können Sie sich vorab
-informieren, ob der Text, der von Ihnen ausgegeben werden soll, noch Platz findet, so
-daß während der Ausgabe nicht plötzlich der Fensterinhalt gelöscht wird.
-
-
-5.11.6 Ausgabe/Eingabe innerhalb des Menufensters
- ('#ib#menuwindowout#ie#', '#ib#menuwindowget#ie#',
- '#ib#menuwindoweditget#ie#', '#ib#menuwindowyes#ie#',
- '#ib#menuwindowno#ie#')
-
-Innerhalb des Menufensters können mit der Prozedur 'menuwindowout' Texte ausge­
-geben werden - die Prozedur hat einen TEXT-Parameter. Sollen INTEGER- oder REAL-
-Werte ausgegeben werden, so müssen diese Werte zuerst in Texte konvertiert werden.
-Bitte beachten Sie unbedingt, daß innerhalb des Fensters nicht gescrollt wird und
-auch kein Zeilenumbruch stattfindet! Ist ein Text länger als die verbleibende Restzei­
-le, so wird der Text bis zum Fensterende ausgegeben und die Ausgabe am Anfang der
-nächsten Zeile fortgesetzt. So ist sichergestellt, daß in keinem Falle die Fenstergren­
-zen überschritten werden.
-Sobald die letzte Position des aktuellen Menufensters beschrieben ist (unten rechts in
-der Fensterecke), wird der Fensterinhalt komplett gelöscht und die Ausgabe in der
-ersten Zeile des "neuen" Fensters fortgesetzt. Auf Zeilenumbruch und Scrolling wurde
-verzichtet, da der Realisierungsaufwand dafür zu hoch gewesen wäre.
-
-Mit der Prozedur 'menuwindowget (TEXT VAR text)' können Sie auch Texte innerhalb
-des Menufensters einlesen - INTEGER-/ REAL-Werte müssen ggf. von Hand konvertiert
-werde. Die Eingabe wird durch <RETURN> abgeschlossen. Es muß mindestens ein
-Zeichen (ungleich Leerzeichen) eingegeben werden. Von der Eingabe werden die
-führenden Leerzeichen abgeschnitten.
-Ist der einzugebende Text länger als die noch verbleibende Restzeile, so wird der Text
-in der Restzeile gescrollt. Sind in der aktuellen Zeile weniger als 7 Zeichen für die
-Eingabe vorhanden, so wird automatisch für die Eingabe an den Anfang der nächsten
-Zeile positioniert.
-
-Ab gs-DIALOG-Version 1.1 steht auch die Prozedur 'menuwindoweditget (TEXT VAR
-text)' zur Verfügung, durch die ein Text zum Editieren vorgegeben werden kann. Es
-ist allerdings darauf zu achten, daß der Text in jedem Falle initialisiert wird!
-
-Die beiden Prozeduren 'menuwindowyes' und 'menuwindowno' ähneln den Ihnen
-bekannten Prozeduren 'yes' und 'no'. Sie operieren nur auf dem Menufenster. Be­
-denken Sie aber bitte, daß, wenn bei der Ausgabe des Textes die Fenstergrenze über­
-schritten wird, der Resttext in der nächsten Zeile ausgegeben wird. Wird dabei sogar
-die untere Fenstergrenze überschritten, so wird der komplette Fensterinhalt gelöscht
-und die Ausgabe in der linken oberen Ecke des "neuen Fensters" fortgesetzt!
-
-
-5.11.7 Weiter Prozeduren ('#ib#menuwindowcenter#ie#',
- '#ib#menuwindowstop#ie#')
-
-Es werden noch zwei weitere Prozeduren für das Menufenster zur Verfügung gestellt,
-die bei der Programmentwicklung ganz nützlich sein können.
-Mit 'menuwindowcenter (TEXT CONST text)' werden vor und hinter dem übergebe­
-nen Text so viele Leerzeichen angefügt, daß der Text zentriert in der Menufenster-Zei­
-le ausgegeben wird. Bevor Sie den Text mit 'menuwindowout' ausgeben, müssen Sie
-an den Anfang einer Zeile positionieren, denn die Anzahl der vorangestellten Blanks
-wird unter Annahme dieser Zeilenposition ermittelt! Innerhalb der Zeile werden ggf.
-vorhandene Texte überschrieben.
-
-Durch die Prozedur 'menuwindowstop' wird an den Anfang der übernächsten Zeile
-positionert und der Text 'Zum Weitermachen bitte irgendeine Taste tippen!' ausgege­
-ben. Danach wird so lange gewartet, bis eine Taste getippt wird. Mit 'menuwindow­
-stop (INT CONST zeilenzahl) kann auch noch die Anzahl der Zeilen bestimmt wer­
-den, die vorwärtspositioniert werden soll (Standard: 2 Zeilen).
-
-
-#ib#5.12 Festlegung der Boxpositionen innerhalb des Menus#ie#
-
-In vielen Fällen kann der Programmierer noch entscheiden, an welcher Position
-innerhalb des Menus die Box erscheinen soll (z. B. bei 'menuanswer', 'menuinfo',
-'menuyes', 'menuno', 'menunotice' etc.). Die Positionen sind von 1 bis 5 durchnu­
-meriert und haben folgende Bedeutung:
-
-+----------------------------------------+
-I I
-+----------------------------------------+
-I I
-I +-----+ +-----+ I
-I I 1 I I 2 I I
-I +-----+ +-----+ I
-I I
-I +-----+ I
-I I 5 I I
-I +-----+ I
-I I
-I +-----+ +-----+ I
-I I 3 I I 4 I I
-I +-----+ +-----+ I
-I I
-+----------------------------------------+
-I I
-+----------------------------------------+
-#page#
-#ib#5.13 gs-DIALOG-Syntax (Regeln zur Erstellung von Texten)#ie#
-
-Werden Texte als Parameter übergeben, die in einer Box ausgegeben werden sollen,
-so kann dieser Text durch Einfügen von Steuerzeichen noch gestaltet werden, z.B.
-kann der Programmierer so den Zeilenaufbau bestimmen.
-Das System analysiert den eingegebenen Text. Jedesmal, wenn innerhalb des Textes
-der Code "13" erscheint, wird innerhalb der Box auf den nächsten Zeilenanfang
-positioniert. So ist eine Einteilung eines Textes in Zeilen leicht möglich. Soll eine
-Leerzeile eingefügt werden, so geben Sie einfach zweimal den Code "13" ("13""13").
-Bei der Textanalyse wird die jeweilige Zeilenlänge vermerkt. Die Box wird vom System
-gerade so breit gewählt, daß die längste vorkommende "Zeile" im Text gerade noch in
-die Box paßt.
-Aber Vorsicht! Die jeweilige Box kann innerhalb des Menus nur eine Maximalgröße
-annehmen (64 Zeichen breit und 14 Zeilen hoch). Wird von einer "Zeile" diese
-Maximalgröße überschritten, so wird die Zeile abgeschnitten und nur bis zur Maxi­
-malbreite der Box ausgegeben.
-
-Ein Text für eine solche Box könnte z.B. so aussehen:
-
-
-menuinfo (" Informationstexte "13" sind meist"13" zu
-lang!")
-
-
-das ergibt folgende Ausgabe in der Box:
-
-
- +-----------------------+
- I I
- I Informationstexte I
- I sind meist I
- I zu lang I
- I I
- +-----------------------+
-
-Es ist auch möglich, in solchen Texten Textpassagen invers darzustellen. Dazu wer­
-den in den Text die Codes zum Ein- ("15") und Ausschalten ("14") der Markierung
-eingefügt. Solche markierten Textpassagen dürfen aber nicht über interne Zeilen­
-grenzen (Code "13") hinausgehen. Sie müßten dann am Zeilenende aus- und am
-nächsten Zeilenanfang wiedereingeschaltet werden.
-Soll in der obigen Box das Wort 'Informationstexte' invers dargestellt werden, so wäre
-z.B. folgendes Kommando zu geben:
-
-
-menuinfo (" "15"Informationstexte"14" "13"" +
- " sind meist"13" zu lang!")
-
-
-#ib#5.14 Thesaurushandling#ie#
-
-Neben den allgemein zur Verfügung gestellten Thesaurusoperationen stellt
-gs-DIALOG einige weitere bereit. Mit der Prozedur 'THESAURUS PROC #ib#infix namen#ie#
-(THESAURUS CONST thes, TEXT CONST infix)' werden aus allen Dateinamen des
-angegebenen Thesaurus die herausgefiltert, die den Wortbestandteil 'infix' enthalten -
-und zwar gleichgültig, an welcher Position! Die herausgefilterten Dateinamen werden
-in einem Thesaurus geliefert. Im Programmsystem 'gs-Herbert und Robbi' mach­
-en wir z.B. Gebrauch davon, wenn wir nur die Landschaften der eigenen Task zur
-Auswahl anbieten wollen:
-
-
-THESAURUS VAR thes :: infix namen (ALL myself, "Flaeche:")
-
-
-Daneben gibt es eine ähnliche Prozedur, mit der man die Dateien eines bestimmten
-Dateityps herausfiltern kann. Mit
-
-
-THESAURUS VAR thes :: infix namen (ALL myself, 1003)
-
-
-werden alle Dateien mit dem Typ '1003' (normale Textfiles) herausgefiltert. Neben
-den beiden gibt es auch noch eine Prozedur, die beide Fälle miteinander koppelt:
-
-
-THESAURUS VAR thes :: infix namen (ALL myself, "gs-MENUKARTE:", 1954)
-
-
-Mit der folgenden Prozedur:
-
-
-THESAURUS VAR thes :: #ib#ohne praefix#ie# (ALL myself, "Flaeche:")
-
-
-wird aus den Dateinamen im angegebenen Thesaurus jeweils der führende Wortbe­
-standteil entfernt. Wir machen z.B. in gs-Herbert und Robbi davon Gebrauch, um
-die Landschaften/Arbeitsfelder anbieten zu können, ohne jeweils den Wortbestandteil
-'Flaeche:' miterscheinen zu lassen.
-
-Ganz nützlich ist auch noch die folgende Informationsprozedur '#ib#not empty#ie#
-(THESAURUS CONST thes)', mit der man z.B. feststellen kann, ob eine Auswahl ohne
-Ankreuzen oder mit <ESC><h> abgebrochen wurde:
-
-
-
-PROC zeilen formatieren:
- TEXT CONST kopf :: "Textdateien zeilenweise formatieren",
- hinweis :: "Bitte gewünschte Dateien ankreuzen";
- THESAURUS VAR dateinamen := menusome (ALL myself, kopf, hinweis,
- FALSE);
-
- IF not empty (dateinamen)
- THEN cursor on;
- formatiere dateien;
- cursor off;
- FI;
- regenerate menuscreen.
-
- formatiere dateien:
- INT VAR zaehler;
- FOR zaehler FROM 1 UPTO highest entry (dateinamen) REP
- IF name (dateinamen, zaehler) <> ""
- THEN lineform (name (dateinamen, zaehler))
- FI
- PER
-END PROC zeilen formatieren;
-
-
-
-#ib#5.15 Aktivieren und Deaktivieren von Menupunkten#ie#
-
-Daß Verarbeitungsfunktionen aktiviert und deaktiviert werden können, haben Sie
-schon in unserem Archiv-Pull-Down-Menu gesehen. Deaktivierte Menupunkte sind
-durch ein vorgestelltes '-'-Zeichen gekennzeichnet; diese Menufunktionen werden
-übersprungen, wenn Sie versuchen, darauf zu positionieren.
-
-Zur Aktivierung und Deaktivierung von Menupunkten stehen die Prozeduren '#ib#activate#ie#
-(TEXT CONST menupunktname)' und '#ib#deactivate#ie# (TEXT CONST menupunktname)'
-zur Verfügung. Zu beachten ist, daß diese Prozeduren nicht ständig aufrufbar sind -
-der jeweils angegebene 'menupunktname' muß sich nämlich auf das aktuelle Pull-
-Down-Menu beziehen! Als Menupunktname muß jeweils der Name angegeben wer­
-den, der bei der entsprechenden Menufunktion als 2. Parameter übergeben wurde.
-Ist der angegebene 'menupunktname' im aktuellen Pull-Down-Menu nicht enthalten,
-so wird die Anweisung ignoriert!
-
-Auch bei den Prozeduren' activate (INT CONST punktnummer)' und 'deactivate (INT
-CONST punktnummer)' gilt diese Einschränkung. Die beiden Prozeduren arbeiten
-schneller als die eben aufgezeigten, denn es muß im aktuellen Pull-Down-menu
-nicht mehr nach der jeweiligen Position gesucht werden. Die Positionen werden von
-oben nach unten durchgezählt. Beachten Sie aber unbedingt, daß die Trennlinien
-mitgezählt werden müssen!
-Die Prozeduren "zeigen nur dann Wirkung", wenn sie von einer Verarbeitungsfunk­
-tion des aktuell entfalteten Pull-Down-Menus aus aufgerufen werden (das geschieht
-im Archivmenu z.B. aus den beiden Menufunktionen 'Reservieren' und 'Initialisieren'
-heraus) oder wenn Sie beim Einstieg in ein Pull-Down-Menu bzw. beim Ausstieg
-daraus aufgerufen werden; d.h. aus einer Prozedur heraus, die bei 'oberbegriff' als
-2./3. Parameter in das Menukarten-Generierungsprogramm eingetragen ist. Beim
-Archiv-Pull-Down-Menu besorgt das die Prozedur 'menu archiv grundeinstellung'
-(sehen Sie dazu auch Kapitel 6.1).
-
-
diff --git a/doc/menugenerator/menu-generator handbuch.6 b/doc/menugenerator/menu-generator handbuch.6
deleted file mode 100644
index a0dd3b5..0000000
--- a/doc/menugenerator/menu-generator handbuch.6
+++ /dev/null
@@ -1,235 +0,0 @@
-#block##pageblock#
-#pagenr("%",1)##setcount(1)##count per page#
-#headeven#
-gs-Menu-Generator
-#center#____________________________________________________________
-
-#end#
-#headodd#
-#right#gs-Menu-Generator
-#center#____________________________________________________________
-
-#end#
-#bottomeven#
-#center#____________________________________________________________
-6 - % #right#ERGOS
-#end#
-#bottomodd#
-#center#____________________________________________________________
-ERGOS #right# 6 - %
-#end#
-#ib#6  Einbinden der Datei- und Archivoperationen#ie#
-
-
-Sie haben bereits erfahren, wie Sie eine Menukarte generieren und ankoppeln kön­
-nen. Im letzten Kapitel haben wir Ihnen die Möglichkeiten aufgezeigt, innerhalb des
-Menus einen Dialog mit dem Benutzer zu führen. Sie sind somit in der Lage, Ihre
-eigenen Anwendungen unter der Benutzeroberfläche gs-DIALOG zu erstellen.
-Wie sich gezeigt hat, treten eine Reihe von Verarbeitungsfunktionen in nahezu jeder
-Anwendung auf. Im EUMEL-System benötigt man bei fast allen Anwendungspro­
-grammen auch die Möglichkeiten, Dateien auf dem Archiv zu sichern oder von dort
-zu holen; auch Umbenennen, Kopieren, Drucken, Reorganisieren ... von Dateien
-zählen sicher zu den häufig benötigten Verarbeitungsfunktionen. Wünschenswert ist
-es natürlich, daß in allen Programmen unter einer Benutzeroberfläche die "Stan­
-dard-Verarbeitungsfunktionen" in immer gleicher Weise zur Verfügung stehen!
-
-Dieser Vorteil liegt sogar nicht nur auf der Seite des Anwenders - auch der Anwen­
-dungsprogrammierer profitiert davon: Dann nämlich, wenn er diese Standard-Verar­
-beitungsfunktionen nicht immer neu schreiben muß, sondern auf vorgefertigte
-Prozeduren und natürlich auch auf die zugehörigen Informationstexte zurückgreift.
-
-Wir haben uns deshalb entschlossen, diese Standard-Verarbeitungsfunktionen zum
-Datei- und Archivhandling bereits in das Basissystem gs-DIALOG zu integrieren und
-Ihnen mit gs-Menu-Generator Dateien zur Verfügung zu stellen, in denen die
-Programme zur Einbindung dieser Prozeduren in Ihre eigenen Programmsysteme
-ebenso enthalten sind wie alle dazugehörigen Informationstexte.
-In diesem Kapitel soll nun beschrieben werden, wie Sie diese vorgefertigten Module in
-Ihre Menukarten/Programme einbinden können und was Sie dabei beachten müs­
-sen.
-
-
-#ib#6.1 Einbinden der Archivoperationen#ie#
-
-Auf der von uns gelieferten Diskette 'gs-Menu-Generator', befindet sich auch die
-Datei 'Generatordatei: Archivmenu'. Darin ist das vollständige Menukarten-Generie­
-rungs-Programm zur Generierung der Menukarte 'gs-MENUKARTE: Archiv' inclusive
-aller Informationstexte enthalten. U.a. befindet sich darin eben das folgende Pro­
-gramm:
-
-
-oeffne menukarte ("Archiv");
-oeffne menu ("ARCHIV", "", "menu archiv reservierung aufgeben");
-
-
-oberbegriff ("Dateien");
-
-menufunktion ("v", "Verzeichnis", "menu dateien verzeichnis",
- dateiverzeichnistext);
-trennlinie;
-menufunktion ("l", "Löschen", "menu dateien loeschen",
- dateiloeschentext);
-menufunktion ("d", "Drucken", "menu dateien drucken",
- dateidruckentext);
-trennlinie;
-menufunktion ("k", "Kopieren", "menu dateien kopieren",
- dateikopierentext);
-menufunktion ("u", "Umbenennen", "menu dateien umbenen­
- nen",
- dateiumbenennentext);
-trennlinie;
-menufunktion ("s", "Speicherplatz", "menu dateien speicherplatz",
- dateispeicherplatztext);
-menufunktion ("a", "Aufräumen", "menu dateien aufraeumen",
- dateiaufraeumtext);
-
-
-oberbegriff ("Archiv", "menu archiv grundeinstellung (4)",
- "menu archiv reservierung aufgeben");
-
-menufunktion ("r", "Reservieren", "menu archiv reservieren",
- archivreserviertext);
-menufunktion ("n", "Neue Diskette", "menu archiv neue diskette",
- neuediskettetext);
-trennlinie;
-menufunktion ("s", "Schreiben", "menu archiv schreiben",
- archivschreibtext);
-menufunktion ("c", "Checken", "menu archiv checken",
- archivchecktext);
-menufunktion ("k", "Kombination", "menu archiv schreibcheck",
- archivkombinationstext);
-menufunktion ("h", "Holen/Lesen", "menu archiv holen",
- archivholtext);
-menufunktion ("l", "Löschen", "menu archiv loeschen",
- archivloeschtext);
-trennlinie;
-menufunktion ("v", "Verzeichnis", "menu archiv verzeichnis",
- archivverzeichnistext);
-menufunktion ("d", "Drucken", "menu archiv verzeichnis
- drucken",
- archivdruckentext);
-trennlinie;
-menufunktion ("i", "Initialisieren", "menu archivinitialisieren",
- archivinitialisiertext);
-menufunktion ("z", "Zieltask einstellen", "menu archiv zieltask
- einstellen",
- archivzieltasktext);
-schliesse menu;
-schliesse menukarte;
-
-
-Wie schon oben erwähnt, sind auch alle Informationstexte in der Datei enthalten, die
-jeweils über den 4. Parameter der Prozeduren 'menufunktion' in die Menukarte
-eingebunden werden. Wir haben Sie hier nicht extra abgedruckt; Sie können ja die
-entsprechende Datei auf der Diskette einsehen!
-
-Zu dem Programm möchten wir jedoch noch einige wichtige Anmerkungen machen,
-damit Sie die entsprechenden Verarbeitungsfunktionen in Ihre Menukarte einbinden
-können.
-
-Wenden wir uns zunächst den Archivoperationen zu. gs-DIALOG stellt die folgenden
-Verarbeitungsfunktionen bereit:
-
-
- PROC #ib#menu archiv reservieren#ie#,
- PROC #ib#menu archiv neue diskette#ie#,
- PROC #ib#menu archiv schreiben#ie#,
- PROC #ib#menu archiv checken#ie#,
- PROC #ib#menu archiv schreibcheck#ie#,
- PROC #ib#menu archiv holen#ie#,
- PROC #ib#menu archiv loeschen#ie#,
- PROC #ib#menu archiv verzeichnis#ie#,
- PROC #ib#menu archiv verzeichnis drucken#ie#,
- PROC #ib#menu archiv initialisieren#ie#,
- PROC #ib#menu archiv zieltask einstellen#ie#,
-
-
-Durch diese elf Prozeduren werden die entsprechenden Menufunktionen ausgeführt.
-
-Außerdem werden noch folgende Prozeduren bereitgestellt:
-
-
- PROC #ib#menu archiv grundeinstellung#ie# (INT CONST ort)
- PROC #ib#menu archiv reservierung aufgeben#ie#
-
-
-Diesen beiden Prozeduren sollten Sie bei der Einbindung der Archivfunktionen in
-Ihre Menukarten besondere Beachtung schenken. Wie Sie im Programm auf der Seite
-zuvor sehen, taucht die Prozedur 'menu archiv reservierung aufgeben' gleich zweimal
-auf: einmal als 3.Parameter der Prozedur 'oberbegriff' und einmal als 3.Parameter
-der Prozedur 'oeffne menu' - und das aus folgendem Grund:
-
-Wenn der Benutzer die Archivoperationen verläßt, dann sollte automatisch das Archiv
-freigegeben werden, um so - auch bei Multi-User-Betrieb - ein einwandfreies Archiv­
-handling zu gewährleisten. Nun kann der Benutzer das Pull-Down-Menu 'Archiv' aber
-eben auf zweierlei Weise verlassen: Einmal durch den Wechsel in ein anderes Pull-
-Down-Menu der gleichen Menukarte - oder aber er verläßt insgesamt das Menu. Im
-ersten Falle wird das Archiv abgemeldet, weil ja die als 3.Parameter bei 'oberbegriff'
-eingetragene Prozedur ausgeführt wird - im zweiten Falle, weil die als 3.Parameter
-bei 'oeffne menu' eingetragene Prozedur ausgeführt wird. Diese Eintragungen sollten
-Sie auf keinen Fall bei der Einbindung der Archivoperationen vergessen.
-
-Die Prozedur 'menu archiv grundeinstellung (INT CONST ort)' sollte bei den Archiv­
-operationen immer als 2. Parameter in der Prozedur 'oberbegriff' übergeben wer­
-den. Nur wenn diese Prozedur beim Entfallten des Archiv-Pull-Down-Menus ausge­
-führt wird, ist die einwandfreie Funktion des Archivsystems sichergestellt. Dadurch
-geschieht nämlich folgendes:
-
- 1) Als Zieltask wird das Archiv der eigenen Station eingestellt - unabhängig
- davon, mit welcher Einstellung das Menu zuvor verlassen wurde.
-
- 2) Es wird die Zieltask auf dem Bildschirm angezeigt.
-
- 3) Die entsprechenden Menupunkte werden aktiviert bzw. deaktiviert.
-
- 4) Es wird festgelegt, an welcher Stelle innerhalb des Menus die Menunotiz zur
- Anzeige der Zieltask (und ggf. des Archivnamens) ausgegeben wird.
-
-Im Programm oben ist hierfür die Position 4 (rechts unten in der Ecke) gewählt. Wir
-haben diese Festlegung deswegen so getroffen, weil das Archiv-Pull-Down-Menu
-ziemlich weit links auf dem Bildschirm erscheint (es sind nur zwei Oberbegriffe
-eingetragen!). So stören sich Archiv-Pull-Down-Menu und die Menunotiz nicht gegen­
-seitig. In unseren Anwendungssystemen 'gs-Herbert und Robbi' und
-'gs-MP-BAP' haben wir dagegen die Position '3' eingetragen, damit die Menunotiz
-unten links in der Ecke erscheint, weil das Archiv-Pull-Down-Menu ganz rechts auf
-dem Bildschirm entfaltet wird.
-
-Achtung! Uns ist es sehr, sehr wichtig, daß zumindest die Archivfunktionen in allen
-Anwendungen unter gs-DIALOG in gleicher Weise zur Verfügung gestellt werden. Um
-das sicherzustellen, sind die Funktionen so in gs-DIALOG integriert, daß das System
-nur dann reibungslos funktioniert, wenn Sie sich an die eben aufgezeigten Regeln für
-die Einbindung in Ihr Anwendungssystem halten! Für die korrekte Funktionsweise
-muß im Archiv-Pull-Down-Menu auch immer exakt die Reihenfolge (der Aufbau) der
-Verarbeitungsfunktionen eingehalten werden. Auch die Namen sollten immer gleich
-gewählt werden!
-
-Wir hoffen, daß Sie als Programmierer für diese doch etwas rigorose Maßnahme
-Verständnis haben - dafür versichern wir Ihnen, daß wir sehr viel Gedanken und
-Arbeit in die Konstruktion des Archivsystems investiert haben!
-
-Auf eine Einschränkung muß allerdings noch hingewiesen werden:Das Archiv-
-Pull-Down-Menu kann aus technischen Gründen nicht das erste, ganz links in einem
-Menu stehende sein; es kann frühestens unter dem zweiten Oberbegriff in das Menu
-aufgenommen werden! Es ist z.Z. nicht möglich, im ganz links stehenden Pull-
-Down-Menu deaktivierte Menupunkte zu behandeln.
-
-
-#ib#6.2 Einbinden der Dateiopertionen#ie#
-
-gs-DIALOG stellt neben den Archivoperationen standardmäßig auch einige Dateiope­
-rationen bereit. Folgende Prozeduren stehen zur Verfügung:
-
-
- PROC #ib#menu dateien verzeichnis#ie#,
- PROC #ib#menu dateien loeschen#ie#,
- PROC #ib#menu dateien drucken#ie#,
- PROC #ib#menu dateien kopieren#ie#,
- PROC #ib#menu dateien umbenennen#ie#,
- PROC #ib#menu dateien speicherplatz#ie#,
- PROC #ib#menu dateien aufraeumen#ie#.
-
-
-Die Prozeduren bedürfen in Ihrer Wirkung sicher kaum einer Erklärung. Die Wir­
-kungsweise können Sie einfach ausprobieren, indem Sie die entsprechenden Ver­
-arbeitungsfunktionen im Archiv-Menu einfach einmal aktivieren.
-
-
diff --git a/doc/menugenerator/menu-generator handbuch.7 b/doc/menugenerator/menu-generator handbuch.7
deleted file mode 100644
index 2e6f0ba..0000000
--- a/doc/menugenerator/menu-generator handbuch.7
+++ /dev/null
@@ -1,367 +0,0 @@
-#block##pageblock#
-#pagenr("%",1)##setcount(1)##count per page#
-#headeven#
-gs-Menu-Generator
-#center#____________________________________________________________
-
-#end#
-#headodd#
-#right#gs-Menu-Generator
-#center#____________________________________________________________
-
-#end#
-#bottomeven#
-#center#____________________________________________________________
-7 - % #right#ERGOS
-#end#
-#bottomodd#
-#center#____________________________________________________________
-ERGOS #right# 7 - %
-#end#
-#ib#7  Eigene Fenster und Fensteroperationen #ie#
-
-
-In Kapitel 5.11 haben wir Ihnen gezeigt, wie Sie innerhalb des Menus ein Fenster
-(das Menufenster) öffnen können. Innerhalb dieses Bereichs stehen Ihnen die
-wesentlichen Ein- und Ausgabeoperationen zur Verfügung, die Sie auch sonst vom
-Bildschirm her kennen. Auf die Größe des Menufensters können Sie allerdings keinen
-Einfluß nehmen, da die Fenstergröße automatisch vom System (gs-DIALOG) festge­
-legt wird - je nachdem, ob Sie mit einem Menu oder mit geschachtelten Menus
-arbeiten.
-Auf die Einschränkungen bzw. Abweichungen gegenüber den Möglichkeiten, die Sie
-bei Benutzung des ganzen Bildschirms haben, haben wir Sie ausdrücklich hingewie­
-sen: So ist es nicht möglich, den Text innerhalb eines Fensters zu rollen (scrolling);
-statt dessen wird bei Ãœberschreiten der unteren Fenstergrenze der Fensterinhalt
-gelöscht und die Ausgabe oben im "neuen" Fenster fortgesetzt.
-Als wir gs-DIALOG konzipierten und die ersten Anwendungen unter dieser Benutzer­
-schnittstelle entwarfen, fiel uns auf, daß es sehr günstig für die Strukturierung des
-Bildschirms innerhalb der Anwendungsprogramme ist, wenn man den Bildschirm in
-Bereiche (Fenster) einteilen und den Fenstern entsprechende Funktionen zuweisen
-kann (z.B. Eingabe-, Informations-, Kontroll-Fenster etc.). Sinnvoll ist es dann, auch
-die entsprechenden Ein-/Ausgaberoutinen zur Verfügung zu haben, die sich auf die
-einzelnen Fenster beziehen.
-
-In diesem Kapitel werden wir Ihnen zeigen, wie Sie eigene Fenster definieren und
-darin Ein- und Ausgaben realisieren können. Für die Fenster gelten die gleichen
-Einschränkungen wie für das Menufenster - d.h. ein Rollen des Textes (scrolling) ist
-nicht möglich. Die Fensterposition und -größe innerhalb des Bildschirms können Sie
-aber festlegen.
-
-
-#ib#7.1 Definition von Fenstern ('window')#ie#
-
-Das Fensterkonzept in gs-DIALOG ist sehr einfach gehalten: Durch die Definition
-des Fenters werden nur Bereiche auf dem Bildschirm festgelegt, auf die sich
-bestimmte Ein-/Ausgabeprozeduren beziehen.
-
-Wir wollen Ihnen die Verwendung von Fenstern wieder an einem kleinen Beispiel
-verdeutlichen - bleiben wir dazu bei unserer Textverarbeitung: Für die Seitenforma­
-tierung müßte der Benutzer den oberen und linken Rand, die Schreibfeldbreite und
-die Schreibfeldlänge festlegen. Dazu wollen wir dem Benutzer die aktuellen Werte
-anzeigen und ggf. eine Neueinstellung vornehmen lassen. Ein Programm dazu könnte
-so aussehen:
-
-
-WINDOW VAR info :: window ( 2, 2, 32, 9),
- frage :: window (36, 2, 40, 3),
- daten :: window (36, 7, 40, 4);
-
-TEXT VAR oberer rand :: " 2.54",
- linker rand :: " 2.54",
- feldbreite :: "16.00",
- feldlaenge :: "24.50";
-
-
-zeige aktuelle werte an;
-frage nach neueinstellung.
-
-zeige aktuelle werte an:
- page; show (info);
- out (info, center (info, invers ("Aktuell eingestellte Werte:")));
- cursor (info, 2, 4);
- out (info, "Oberer Rand : " + oberer rand + " cm");
- cursor (info, 2, 5);
- out (info, "Linker Rand : " + linker rand + " cm");
- cursor (info, 2, 7);
- out (info, "Schreibfeldbreite : " + feldbreite + " cm");
- cursor (info, 2, 8);
- out (info, "Schreibfeldlänge : " + feldlaenge + " cm").
-
-frage nach neueinstellung:
- show (frage);
- cursor (frage, 1, 1);
- out (frage, center (frage, invers ("Papierformat einstellen:")));
- cursor (frage, 2, 3);
- IF yes ("Neueinstellung vornehmen")
- THEN neue werte erfragen
- FI.
-
-neue werte erfragen:
- show (daten);
- erfrage oberen rand;
- erfrage linken rand;
- erfrage feldbreite;
- erfrage feldlaenge.
-
-erfrage oberen rand:
- REAL VAR neuer oberer rand;
- cursor (daten, 1, 1);
- out (daten, center (daten, invers ("Oberen Rand einstellen:")));
- cursor (daten, 2, 3);
- out (daten, "Bitte den neuen Wert: ");
- get (daten, neuer oberer rand);
- oberer rand := text (neuer oberer rand, 5, 2);
- cursor (info, 23, 4);
- out (info, oberer rand).
-
-erfrage linken rand:
- (* analog zu 'erfrage oberen rand *).
-
-erfrage feldbreite:
- (* analog zu 'erfrage oberen rand *).
-
-erfrage feldlaenge:
- (* analog zu 'erfrage oberen rand *).
-
-
-
-Am Anfang des Programms werden drei Fenster definiert. Das "Infofenster" erscheint
-links oben auf dem Bildschirm, in ihm werden die aktuell eingestellten Werte ange­
-zeigt. Das "Fragefenster" erscheint neben dem ersten Fenster oben rechts auf dem
-Bildschirm.
-Beantwortet der Benutzer die dort ausgegebene Frage 'Neueinstellung vornehmen
-(j/n)?' mit 'ja', dann erscheint unter dem zweiten Fenster ein drittes
-("Datenfenster"). Innerhalb dieses Fensters können nacheinander die neuen Werte
-eingelesen werden (nicht alle Prozeduren sind hier ausgeführt!).
-
-Die Definition eines Fensters erfolgt in folgender Weise:
-
- #ib#WINDOW#ie# VAR fenstername :: #ib#window#ie# ( x, y, xsize, ysize);
-
-Der Fenstervariablen wird durch 'window' eine Größe zugeordnet. Mit den ersten
-beiden Werten legen Sie die linke obere Ecke des Fensters ('x' bezeichnet die Spalten,
-'y' die Zeilen) auf dem Gesamtbildschirm fest. Mit 'xsize' bestimmen Sie die Fenster­
-breite (Spaltenzahl), mit 'ysize' die Höhe des Fensters (Zeilenzahl). Der Fenster­
-cursor hat die Position (1,1).
-Die linke obere Ecke des ersten Fensters im Programm hat also die Position ( 2, 2).
-Das Fenster ist 32 Spalten breit und 9 Zeilen hoch; es kann unter dem Namen 'info'
-angesprochen werden.
-Bei der Festlegung der Fenstermaße ist der Rahmen des Fensters nicht berücksich­
-tigt - er gehört nicht zum Fenster dazu! Haben Sie die Absicht, das Fenster mit
-Rahmen auszugeben, dann sollten Sie das bei der Fensterdefinition berücksichtigen.
-Wir haben es im Beispielprogramm auch gemacht: Die linke obere Ecke hat gerade
-die Position (2,2) erhalten, damit noch der Rahmen Platz hat. Mit Rahmen ist unser
-Fenster also 34 Spalten breit und 11 Zeilen hoch. Die linke obere Ecke des zweiten
-Fensters ('frage') legen wir deshalb in die 36. Spalte und 2. Zeile, damit auch hier
-Platz für den Rahmen bleibt.
-Eine wichtige Einschränkung sollten Sie unbedingt berücksichtigen: Da manche
-Terminals mit Beschreiben der Position (80,24) automatisch den Bildschirm
-löschen, haben wir die maximale Ausdehnung eines umrandeten Fensters auf (2, 2,
-77, 22) festgelegt. Überschreiten Sie irgendwo diese Grenzen, dann wird kein Rah­
-men mehr erzeugt. Der Rahmen wird auch dann nicht erzeugt, wenn er in der 0.
-Zeile, 0.Spalte, 25 Zeile oder 80 Spalte zu liegen käme - erst recht natürlich nicht,
-wenn diese Werte noch unter- bzw. überschritten werden.
-
-
-#ib#7.2 Anzeigen/Löschen von Fenstern#ie#
- ('#ib#show#ie#', '#ib#page#ie#', '#ib#erase#ie#', '#ib#out frame#ie#')
-
-Mit dem Befehl 'show (WINDOW VAR w)' wird das Fenster 'w' angezeigt. Der Fenster­
-variablen müssen natürlich zuvor die Maße des Fensters zugewiesen sein. Durch den
-Befehl wird um den angegebenen Fensterbereich ein Rahmen gezogen und der
-"Innenbereich" des Fensters gelöscht. Möchten Sie das Fenster ohne Rahmen ange­
-zeigt haben, so verwenden Sie nur den Befehl 'page (WINDOW VAR w)'. Durch die­
-sen Befehl wird nur der "Innenbereich" des Fensters gelöscht.
-Haben Sie das Fenster einmal mit 'show' ausgegeben und wollen den Fensterinhalt
-löschen, so verwenden Sie auch hier den Befehl 'page (WINDOW VAR w)', denn der
-Rahmen braucht ja nicht erneut ausgegeben zu werden.
-Möchten Sie ein Fenster und den zugehörigen Rahmen löschen, dann steht Ihnen der
-Befehl 'erase (WINDOW VAR w) zur Verfügung: Durch den Befehl wird sowohl der
-"Innenbereich" des Fensters als auch der Rahmen gelöscht.
-Sie können natürlich auch selbst einen Rahmen um ein Fenster setzen. Dafür steht
-der Befehl 'out frame (WINDOW VAR w)' zur Verfügung. Der Rahmen wird ebenfalls
-um den durch 'w' bestimmten Fensterbereich gezogen - der "Innenbereich" bleibt
-unberührt!
-
-Sollten Sie ein Fenster mit dem Befehl 'show' ausgeben (oder mit 'out frame' einen
-Rahmen erzeugen) wollen, aber kein Rahmen auf dem Bildschirm erscheint, so
-haben Sie die zulässigen Fenstergrenzen überschritten. Sehen Sie dazu auch Kapitel
-7.1.
-
-
-#ib#7.3 Operationen innerhalb des Fensters#ie#
-
-Innerhalb des selbstdefinierten Fensters stehen Ihnen die gleichen Operationen zur
-Verfügung wie innerhalb des Menufensters. Bezieht sich eine Operation auf ein
-Fenster, so wird der interne Fensterbezeichner als erster Parameter übergeben.
-
-
-#ib#7.3.1 Datei anzeigen/editieren #ie#('#ib#edit#ie#', '#ib#show#ie#')
-
-Zum Anzeigen einer Datei steht die Prozedur 'show' zur Verfügung. Dabei kann
-einmal ein FILE angegeben werden ('show (WINDOW VAR w, FILE VAR f)') oder aber
-der Name der anzuzeigenden Datei ('show (WINDOW VAR w, TEXT VAR dateiname)').
-Die Datei kann nur eingesehen, nicht aber schreibend verändert werden.
-Die Prozedur 'edit' gibt es ebenfalls in den zwei Ausprägungen. Hier kann die Datei
-im Gegensatz zu 'show' auch schreibend verändert werden.
-Durch diesen Befehl wird jeweils innerhalb des angegebenen Fensters die Datei
-ausgegeben. Sofern die Lage des Fensters es zuläßt, wird automatisch ein Rahmen
-um das Dateifenster gezogen.
-
-
-#ib#7.3.2 Positionierungen im Fenster#ie#
- ('#ib#cursor#ie#', '#ib#get cursor#ie#', '#ib#line#ie#', '#ib#remaining lines#ie#')
-
-Mit 'cursor (WINDOW VAR w, INT CONST spalte, zeile)' können Sie den Cursor inner­
-halb des angegebenen Fensters positionieren. Werden dabei die Fenstergrenzen über-
-oder unterschritten, so wird der Fensterinhalt gelöscht und auf die Position (1, 1)
-innerhalb des Fensters positioniert.
-Mit der Prozedur 'get cursor (WINDOW VAR w, INT VAR spalte, zeile)' können Sie die
-aktuelle Cursorposition innerhalb des angegebenen Fensters erfragen.
-Wollen Sie an den Anfang der nächsten Zeile positionieren, dann verwenden Sie den
-Befehl 'line (WINDOW VAR w)' - wollen Sie gleich mehrere Zeilen vorwärtspositionie­
-ren, dann benutzen Sie den Befehl 'line (WINDOW VAR w, INT VAR anzahl zeilen)'.
-Wird allerdings bei einem der beiden letzten Befehle die untere Fenstergrenze über­
-schritten, so wird der Fensterinhalt gelöscht und die Operation in der ersten Zeile des
-neuen Fensters fortgesetzt.
-Die Informations-Prozedur 'remaining lines (WINDOW VAR w)' liefert Ihnen die
-Anzahl der unterhalb der aktuellen Zeile noch im Fenster vorhanden Zeilen.
-
-
-#ib#7.3.3 Ein- und Ausgaben innerhalb des Fensters#ie#
- ('#ib#out#ie#', '#ib#put#ie#', '#ib#putline#ie#', '#ib#get#ie#', '#ib#getline#ie#', '#ib#yes#ie#', '#ib#no#ie#')
-
-Mit der Prozedur 'out (WINDOW VAR w, TEXT CONST text)' können Sie einen Text
-innerhalb des angegebenen Fensters ausgeben. Paßt der Text nicht mehr in die
-aktuelle Zeile, so wird er in der nächsten Zeile fortgesetzt.
-Bedenken Sie, daß innerhalb der Fenster kein Wortumbruch realisiert ist. Ebenso­
-wenig ist das Rollen (scrolling) des Fensterinhalts möglich: Erfolgt die Ausgabe eines
-Textes über die untere Fenstergrenze hinaus, so wird der Fensterinhalt gelöscht und
-die Ausgabe an der Position (1, 1) des Fensters fortgesetzt.
-Zur Ausgabe von Texten stehen noch die beiden Prozeduren 'put (WINDOW VAR w,
-TEXT CONST text)' und 'putline (WINDOW VAR w, TEXT CONST text)' zur Verfügung.
-Bei erstgenannter Prozedur wird gegenüber 'out' an die Ausgabe noch ein Leerzei­
-chen angehängt, bei der zweiten wird zusätzlich an den Anfang der nächsten Zeile
-positioniert.
-Zahlenwerte können mit den Prozeduren 'put (WINDOW VAR w, INT CONST intwert)'
-und 'put (WINDOW VAR w, REAL CONST realwert)' ausgegeben werden. An die
-Zahlenwerte wird jeweils ein Leerzeichen angehängt.
-
-Für das Einlesen von Werten steht die Prozedur 'get' in mehreren Varianten zur
-Verfügung. Mit 'get (WINDOW VAR w, TEXT VAR text)' kann ein Text an der aktuellen
-Position des Fensters eingelesen werden. Stehen in der aktuellen Zeile des Fensters
-weniger als 5 Zeichenpositionen für die Eingabe zur Verfügung, so wird automatisch
-auf den Anfang der nächsten Zeile innerhalb des Fensters positioniert.
-Über einen dritten Parameter können noch zusätzliche Festlegungen getroffen wer­
-den: Soll die Eingabe noch durch weitere Zeichen (außer Positionierungszeichen)
-abgeschlossen werden können, so werden die Zeichen als TEXT übergeben( 'get
-(WINDOW VAR w, TEXT VAR text, TEXT CONST separator)'), soll die Maximallänge des
-einzugebenden Textes festgelegt sein, so wird diese als INT übergeben ('get (WINDOW
-VAR w, TEXT VAR text, INT CONST laenge)').
-
-Mit den Prozeduren 'get (WINDOW VAR w, INT VAR intwert)' und 'get (WINDOW VAR
-w, INT VAR realwert)' können auch Zahlenwerte innerhalb des Fensters eingelesen
-werden.
-
-Damit dem Anwender auch Vorschläge für der Eingabe gemacht werden können,
-steht die Prozedur 'editget' in zwei Variationen zur Verfügung. Bei 'editget' (WINDOW
-VAR w, TEXT VAR ausgabe) wird 'ausgabe zum Editieren ausgegeben. Daneben
-existiert noch ein 'editget' mit 7 Parametern, der detailliert bei der Zusammenstel­
-lung der Befehle erläutert ist.
-
-Ebenso wie auf dem Gesamtbildschirm und innerhalb des Menufensters stehen auch
-hier die beiden Prozeduren 'yes (WINDOW VAR w, TEXT CONST frage)' und 'no
-(WINDOW VAR w, TEXT CONST frage)' zur Verfügung.
-
-
-#ib#7.3.4 Weitere Prozeduren #ie#('#ib#center#ie#', '#ib#stop#ie#')
-
-Mit 'center (WINDOW VAR w, TEXT CONST text)' werden vor dem angegebenen Text
-so viele Leerzeichen angehängt, daß der Text zentriert in der aktuellen Fensterzeile
-ausgegeben wird - wenn der Cursur bei der Ausgabe auf der ersten Position der Zeile
-steht. Dabei werden aber bereits vorhandene Zeileninhalte überschrieben.
-
-Durch die Prozedur 'stop (WINDOW VAR w)' wird innerhalb des angegebenen Fen­
-sters an den Anfang der übernächsten Zeile positioniert und der Text " Zum Weiter­
-machen bitte irgendeine Taste tippen!" ausgegeben. Möchten Sie nicht an den Anfang
-der übernächsten Zeile positionieren, so können Sie die Anzahl der Zeilen auch
-explizit festlegen durch 'stop (WINDOW VAR w, INT CONST zeilenzahl).
-
-
-#ib#7.4 Boxoperationen#ie#
-
-Innerhalb des Menufensters (sehen Sie Kapitel 5) stehen Ihnen die Prozeduren
-'menuanswer', 'menuinfo', 'menuone', 'menusome', 'menuanswerone',
-'menuanswersome', 'menuyes', 'menuno', 'menualternative', 'write menunotice' und
-'menufootnote' zur Verfügung. Alle diese Prozeduren bezogen sich auf das von
-gs-DIALOG automatisch gesetzte Menufenster.
-Auch innerhalb der von Ihnen selbst definierten Fenster können Sie auf ähnliche
-Prozeduren zurückgreifen. Da wir die eben genannten Prozeduren in Kapitel 5 sehr
-detailliert beschrieben haben, werden wir hier nur auf die entsprechenden
-Beschreibungen verweisen und ggf. die Besonderheiten/Abweichnungen erwähnen.
-Zu beachten ist, daß innerhalb des Fensters weder die oberen noch die unteren zwei
-Zeilen von der "Box" beschrieben werden. Die oberen bleiben ständig frei - die unter­
-en werden zur Ausgabe der zugehörigen Benutzerinformation (Fußnote) benutzt -
-das sollten Sie bei der Festlegung der Fenstergröße bzw. bei der Länge der zu über­
-gebenden Texte berücksichtigen. Bei der Übergabe der Texte müssen Sie sich an die
-gs-DIALOG Syntax-Regeln halten, die in Kapitel 5.12 beschrieben sind.
-
-Die Prozedur '#ib#boxanswer#ie# (WINDOW VAR w, TEXT CONST ausgabetext, antwortvorgabe,
-INT CONST position)' arbeitet wie die Prozedur 'menuanswer (TEXT CONST ausgabe­
-text, antwortvorgabe, INT CONST position)' nur innerhalb des Fensters 'w' (sehen Sie
-auch Kapitel 5.1).
-
-Die Prozedur '#ib#boxinfo#ie#' gibt es in zwei Ausführungen: 'boxinfo (WINDOW VAR w, TEXT
-CONST text)' arbeitet wie 'menuinfo (TEXT CONST text)', allerdings auf dem angege­
-benen Fenster. Bei 'boxinfo (WINDOW VAR w, TEXT CONST text, INT CONST position,
-timelimit)' kann über den dritten Parameter noch die relative Position im angegebe­
-nen Fenster (sehen Sie dazu Kapitel 5.12) und über den vierten Parameter die Zeit­
-spanne festgelegt werden, für die die Information erscheint (sehen Sie auch Kap.
-5.2).
-
-Die Prozedur '#ib#boxone#ie# (WINDOW VAR w, THESAURUS CONST thesaurus, TEXT CONST
-text1, text2, BOOL CONST mit reinigung)' arbeitet wie die Prozedur 'menuone
-(THESAURUS CONST thesaurus, TEXT CONST text1, text2, BOOL CONST mit reini­
-gung)'. Zu bedenken ist hier, daß die Auswahl innerhalb des Fensters Platz finden
-muß. Der Aufruf dieser Prozedur ist daher nur möglich, wenn das angegebene Fen­
-ster mindestens 60 Spalten breit und 17 Zeilen hoch ist. Ansonsten kommt es zu
-einer Fehlermeldung (sehen Sie auch Kap. 5.3).
-
-Die Prozedur '#ib#boxsome#ie# (WINDOW VAR w, THESAURUS CONST thesaurus, TEXT
-CONST text1, text2, BOOL CONST mit reinigung)' arbeitet wie die Prozedur
-'menusome (THESAURUS CONST thesaurus, TEXT CONST text1, text2, BOOL CONST
-mit reinigung)'. Hinsichtlich der Fenstergröße gelten die gleichen Einschränkungen
-wie bei 'boxone' (sehen Sie auch Kap. 5.4).
-
-Die Prozeduren '#ib#boxanswerone#ie#' und '#ib#boxanswersome#ie#' entsprechen den Prozeduren
-'menuanswerone' und 'menuanswersome'; es wird nur zusätzlich jeweils als erster
-Parameter das aktuelle Fenster übergeben. Hinsichtlich der Fenstergröße gelten die
-gleichen Einschränkungen wie bei 'boxone' (sehen Sie auch Kap. 5.5).
-
-Die Prozeduren '#ib#boxyes#ie#', '#ib#boxno#ie#' und '#ib#boxalternative#ie#' entsprechen den Prozeduren
-'menuyes', 'menuno' und 'menualternative'; es wird nur zusätzlich jeweils als erster
-Parameter das aktuelle Fenster übergeben (sehen Sie auch Kap. 5.6 und 5.7).
-
-Die Prozedur '#ib#boxnotice#ie#' unterscheidet sich von der Prozedur 'write menunotice'
-erheblich: Letztgenannte Prozedur hat zwei Parameter. Durch den ersten wird der
-Ausgabetext übergeben, mit dem zweiten wird die relative Position innerhalb des
-Menubildschirms festgelegt. Sowohl Text als auch Position werden vom System ge­
-speichert. Bei jedem Neuaufbau eines Pull-Down-Menus oder des Menubildschirms
-wird die Notiz neu mitaufgebaut.
-Die Prozedur 'boxnotice (WINDOW VAR w, TEXT CONST text, INT CONST position, INT
-VAR x, y, xsize, ysize) dagegen hat sieben Parameter. Über den ersten wird das aktuel­
-le Fenster festgelegt. Die beiden nächsten Parameter entsprechen den beiden Para­
-metern von 'write menunotice'. Über die letzten vier Parameter werden die Posi­
-tion/Maße der Box geliefert, die ja erst durch das Aussehen der übergebenen Texte
-festgelegt werden. Weder Text noch Position der Boxnotiz werden vermerkt. Wollen Sie
-die Notiz löschen, so verwenden Sie eine der Prozeduren '#ib#page#ie# (INT CONST x, y, xsize,
-ysize)' oder '#ib#page up#ie# (INT CONST x, y, xsize, ysize)'. Im ersten Falle erscheint es dem
-Betrachter, als ob die Box von oben nach unten "aufgerollt" würde, im zweiten Falle
-von unten nach oben.
-
-Mit den Prozeduren '#ib#out footnote#ie# (WINDOW VAR w, TEXT CONST text)' wird in der
-untersten Zeile des Fensters 'w' der angegebene Text ausgegeben. In der vorletzten
-Zeile des Fensters wird eine Trennlinie ausgegeben. Die Fußnote incl. der Trennline
-kann durch den Befehl '#ib#erase footnote#ie#' gelöscht werden.
-
-
diff --git a/doc/menugenerator/menu-generator handbuch.8 b/doc/menugenerator/menu-generator handbuch.8
deleted file mode 100644
index 66eb6cf..0000000
--- a/doc/menugenerator/menu-generator handbuch.8
+++ /dev/null
@@ -1,1676 +0,0 @@
-#block##pageblock#
-#pagenr("%",1)##setcount(1)##count per page#
-#headeven#
-gs-Menu-Generator
-#center#____________________________________________________________
-
-#end#
-#headodd#
-#right#gs-Menu-Generator
-#center#____________________________________________________________
-
-#end#
-#bottomeven#
-#center#____________________________________________________________
-8 - % #right#ERGOS
-#end#
-#bottomodd#
-#center#____________________________________________________________
-ERGOS #right# 8 - %
-#end#
-#ib#8  Kurzbeschreibung der Befehle #ie#
-
-
-Durch #u#(*)#e# gekennzeichnete Prozeduren stehen (zumindest in der hier dokumentier­
-ten Form) erst ab gs-DIALOG Version 1.1 zur Verfügung!
-
-
-#ib#activate#ie#
-PROC activate (TEXT CONST punktname):
-
-Zweck: Mit der Prozedur kann ein (deaktivierter) Menupunkt im aktuellen
- Pull-Down-Menu aktiviert, d.h. zur Ausführung freigegeben werden. Das
- '-'-Zeichen vor der Punktbezeichnung verschwindet auf dem Bildschirm,
- statt dessen erscheint das Zeichen, über den die Menufunktion direkt
- aktivierbar ist. 'punktname' muß eine Punktbezeichnung sein, die genau
- in der angegebenen Schreibweise im aktuellen Pull-Down-Menu vorhan­
- den ist (über den 2. Parameter der Prozedur 'menufunktion' in die
- Menukarte eingetragen wurde) - ansonsten wird diese Anweisung igno­
- riert. Die Prozedur "zeigt nur dann Wirkung", wenn sie aus einer Verar­
- beitungsfunktion des aktuell entfalteten Pull-Down-Menus heraus oder
- durch die "Startprozedur"/"Leaveprozedur" des aktuellen Pull-Down-
- Menus (sehen Sie auch 'oberbegriff') aufgerufen wird.
- Die Veränderung wird nicht sofort auf dem Bildschirm angezeigt, sondern
- erst, wenn das Pull-Down-Menu das nächste Mal vom System regeneriert
- wird; ansonsten muß das Kommando 'refresh submenu' gegeben werden.
-
-
-PROC activate (INT CONST punktposition):#u#(*)#e#
-Zweck: arbeitet wie obiges 'activate', allerdings werden die Menupunkte nicht
- über ihre Bezeichnung, sondern über ihre Position im (aktuellen) Pull-
- Down-Menu identifiziert. Die Positionen sind von oben nach unten durch­
- numeriert. Beachten Sie, daß Trennlinien eine Position belegen und
- mitgezählt werden. Die Prozedur arbeitet schneller als obige!
-
-
-#ib#anwendungstext#ie#
-TEXT PROC anwendungstext (INT CONST zeilennummer):
-
-Zweck: Mit diesem Befehl können Texte angesprochen (geholt) werden, die in die
- Menukarte ausgelagert wurden. Es wird der Text aus der angekoppelten
- Menukarte geliefert, der bei der "Einlagerung" in der Zeile 'zeilen­
- nummer' stand.
-Fehler: Kein Text vorhanden! (In der angekoppelten Menukarte ist unter der
- 'zeilennummer' kein Anwendungstext eingetragen.)
- Bitte achten Sie auf folgendes: Wenn Sie eine neue Menukarte generiert
- haben, muß diese erst an die aktuelle Task gekoppelt werden, bevor Sie
- auf die dort eingetragenen (Anwendungs-)Texte zugreifen können (z.B.
- mit 'testinstallation').
-
-
-#ib#areax#ie#
-INT PROC areax (WINDOW VAR w)
-Zweck: Liefert den Wert 'x' des Fensters w.
-
-
-#ib#areaxsize#ie#
-INT PROC areaxsize (WINDOW VAR w)
-Zweck: Liefert den den Wert 'xsize' des Fensters w.
-
-
-#ib#areay#ie#
-INT PROC areay (WINDOW VAR w)
-Zweck: Liefert den den Wert 'y' des Fensters w.
-
-
-#ib#areaysize#ie#
-INT PROC areaysize (WINDOW VAR w)
-Zweck: Liefert den den Wert 'ysize' des Fensters w.
-
-
-#ib#balken links#ie#
-TEXT PROC balken links:
-
-Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als "linker
- Balken" (Ì„) ausgegeben wird.
-
-
-PROC balken links (TEXT CONST zeichen):
-
-Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
- stellung der "Kästen" als "linker Balken" ausgegeben werden soll.
-
-
-#ib#balken oben#ie#
-TEXT PROC balken oben:
-
-Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als "oberer
- Balken" (�) ausgegeben wird.
-
-
-PROC balken oben (TEXT CONST zeichen):
-
-Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
- stellung der "Kästen" als "oberer Balken" ausgegeben werden soll.
-
-
-#ib#balken rechts#ie#
-TEXT PROC balken rechts:
-
-Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als "rechter
- Balken" (̃) ausgegeben wird.
-
-
-PROC balken rechts (TEXT CONST zeichen):
-
-Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
- stellung der "Kästen" als "rechter Balken" ausgegeben werden soll.
-
-
-#ib#balken unten#ie#
-TEXT PROC balken unten:
-
-Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als "unterer
- Balken" (Ì‚) ausgegeben wird.
-
-
-PROC balken unten (TEXT CONST zeichen):
-
-Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
- stellung der "Kästen" als "unterer Balken" ausgegeben werden soll.
-
-
-#ib#boxalternative#ie#
-INT PROC boxalternative (WINDOW VAR w,
- TEXT CONST infotext,
- auswahlliste,
- zusatztasten,
- INT CONST position,
- BOOL CONST mit abbruch):
-
-Zweck: Vergl. 'menualternative'. Hier wird nur zusätzlich das Fenster festgelegt,
- das bei 'menualternative' automatisch gesetzt wird. Der 'infotext' muß
- den gs-DIALOG-Syntax-Regel gehorchen! Die 'auswahlliste' muß nach
- festen Regeln erstellt werden (sehen Sie Kap. 5.7)
-
-
-#ib#boxanswer#ie#
-TEXT PROC boxanswer (WINDOW VAR w,
- TEXT CONST infotext,
- vorgabe,
- INT CONST  position):
-
-Zweck: Vergl. 'menuanswer'. Hier wird nur zusätzlich das Fenster festgelegt, das
- bei 'menuanswer' automatisch gesetzt wird. Der 'infotext' muß den
- gs-DIALOG-Syntax-Regel gehorchen!
-
-
-#ib#boxanswerone#ie#
-TEXT PROC boxanswerone (WINDOW VAR w,
- TEXT CONST infotext,
- vorgabe,
- THESAURUS CONST thes,
- TEXT CONST ueberschrift,
- hinweis,
- BOOL CONST mit reinigung):
-
-Zweck: Vergl. 'menuanswerone'. Hier wird nur zusätzlich das Fenster festgelegt,
- das bei 'menuanswerone' automatisch gesetzt wird.
-Fehler: Fenster für Auswahl zu klein (x < 56, y < 15)
-
-
-#ib#boxanswersome#ie#
-THESAURUS PROC boxanswersome (WINDOW VAR w,
- TEXT CONST infotext,
- vorgabe,
- THESAURUS CONST thes,
- TEXT CONST ueberschrift,
- hinweis,
- BOOL CONST mit reinigung):
-
-Zweck: Vergl. 'menuanswersome'. Hier wird nur zusätzlich das Fenster festgelegt,
- das bei 'menuanswersome' automatisch gesetzt wird.
-Fehler: Fenster für Auswahl zu klein (x < 56, y < 15)
-
-
-#ib#boxinfo#ie#
-PROC boxinfo (WINDOW VAR w, TEXT CONST infotext,
- INT CONST position, timelimit):
-
-Zweck: Vergl. 'menuinfo'. Hier wird nur zusätzlich das Fenster festgelegt, das bei
- 'menuinfo' automatisch gesetzt wird. Der 'infotext' muß den gs-DIALOG-
- Syntax-Regel gehorchen!
-
-
-PROC boxinfo (WINDOW VAR w, TEXT CONST infotext):
-
- wirkt wie: boxinfo (w, infotext, 5, maxint)
-
-
-#ib#boxno#ie#
-BOOL PROC boxno (WINDOW VAR w,
- TEXT CONST frage,
- INT CONST  position):
-
- wirkt wie: NOT boxyes (w, frage, position)
-
-
-#ib#boxnotice#ie#
-PROC boxnotice (WINDOW VAR w,
- TEXT CONST infotext,
- INT CONST  position
- INT VAR x, y, xsize, ysize):
-
-Zweck: Mit 'w' wird das aktuelle Fenster festgelegt. In 'infotext' wird der Text
- übergeben, der als Notiz ausgegeben werden soll, der Text muß den
- gs-DIALOG-Syntax-Regeln entsprechen. Mit 'position' wird die relative
- Lage innerhalb des Fensters 'w' bestimmt. Ãœber die letzten vier Parameter
- werden die Position/Maße der Box geliefert. Weder Text noch Position
- werden vermerkt.
-
-
-#ib#boxone#ie#
-TEXT PROC boxone (WINDOW VAR w,
- THESAURUS CONST thes,
- TEXT CONST ueberschrift,
- hinweis,
- BOOL CONST mit reinigung):
-
-Zweck: Vergl. 'menuone'. Hier wird nur zusätzlich das Fenster festgelegt, das bei
- 'menuone' automatisch gesetzt wird.
-Fehler: Fenster für Auswahl zu klein (x < 56, y < 15)
-
-
-#ib#boxsome#ie#
-THESAURUS PROC boxsome (WINDOW VAR w,
- THESAURUS CONST thes,
- TEXT CONST ueberschrift,
- hinweis,
- BOOL CONST mit reinigung):
-
-Zweck: Vergl. 'menusome'. Hier wird nur zusätzlich das Fenster festgelegt, das
- bei 'menusome' automatisch gesetzt wird.
-Fehler: Fenster für Auswahl zu klein (x < 56, y < 15)
-
-
-#ib#boxyes#ie#
-BOOL PROC boxyes (WINDOW VAR w,
- TEXT CONST frage,
- INT CONST  position):
-
-Zweck: Vergl. 'menuyes'. Hier wird nur zusätzlich das Fenster festgelegt, das bei
- 'menuyes' automatisch gesetzt wird. Die 'frage' muß den gs-DIALOG-
- Syntax-Regel gehorchen!
-
-
-#ib#center#ie#
-TEXT PROC center (WINDOW VAR w, TEXT CONST text):
-
-Zweck: Vergl. 'menuwindowcenter'. Hier wird nur zusätzlich das Fenster festge­
- legt, das bei 'menuwindowcenter' automatisch gesetzt wird.
-
-
-TEXT PROC center (INT CONST laenge,
- TEXT CONST text):
-
-Zweck: "Ummantelt" 'text' mit Leerzeichen, so daß 'text' etwa in der Mitte zu
- stehen kommt. Der gelieferte Text hat die Länge 'laenge'.
-
-
-TEXT PROC center (TEXT CONST text):
-
- wirkt wie: center (79, text)
-
-
-#ib#clear buffer#ie#
-PROC clear buffer
-
-Zweck: Leert den Zeichenpuffer
-
-
-#ib#clear buffer and count#ie#
-INT PROC clear buffer and count (TEXT CONST
- zeichen):
-
-Zweck: Leert den Zeichenpuffer und liefert die Häufigkeit des Vorkommens von
- 'zeichen' im Zeichenpuffer.
-
-
-#ib#current menuwindow#ie#
-WINDOW PROC current menuwindow:
-
-Zweck: liefert das aktuelle Menufenster (die Einzelwerte können dann mit
- 'areax', 'areay', 'areaxsize' und 'areaysize' erfragt werden).
-
-
-#ib#cursor#ie#
-PROC cursor (WINDOW VAR w, INT CONST spalte,
- zeile):
-
-Zweck: Vergl. 'menuwindowcursor'. Hier wird nur zusätzlich das Fenster festge­
- legt, das bei 'menuwindowcursor' automatisch gesetzt wird.
-
-
-#ib#cursor off#ie#
-PROC cursor off:
-
-Zweck: Sofern die EUMEL-Installation die Möglichkeit bietet, wird der Cursor aus
- dem Bildschirm ausgeblendet.
- Wenn neue Verarbeitungsfunktionen entwickelt werden, sollte zu Beginn
- der Cursor eingeschaltet und nach Abschluß der Cursor wieder ausge­
- schaltet werden (sehen Sie auch Kap. 5.1).
-
-
-PROC cursor off (TEXT CONST zeichenkette):
-
-Zweck: Neufestlegung der 'zeichenkette', die ausgegeben werden soll, um bei der
- aktuellen EUMEL-Installation den Cursor auf den Befehl 'cursor off' hin
- auszuschalten.
-
-
-#ib#cursor on#ie#
-PROC cursor on:
-
-Zweck: Sofern die EUMEL-Installation die Möglichkeit bietet, wird der Cursor auf
- dem Bildschirm angezeigt. Wenn neue Verarbeitungsfunktionen entwik­
- kelt werden, sollte zu Beginn der Cursor eingeschaltet und nach Abschluß
- der Cursor wieder ausgeschaltet werden (sehen Sie auch Kap. 5.1).
-
-
-PROC cursor on (TEXT CONST zeichenkette):
-
-Zweck: Neufestlegung der 'zeichenkette', die ausgegeben werden soll, um bei der
- aktuellen EUMEL-Installation den Cursor auf den Befehl 'cursor on' hin
- anzuschalten.
-
-
-#ib#deactivate#ie#
-PROC deactivate (TEXT CONST punktname):
-
-Zweck: Vergl. 'activate (TEXT CONST punktname)'.
- Im Gegensatz zu der Prozedur wird hier 'punktname' deaktiviert und
- beim (nächsten) Erscheinen der Menupunktbezeichnung ein '-'Zeichen
- vorangestellt. Es gelten die gleichen Einschränkungen wie bei 'activate'!
-
-
-PROC deactivate (INT CONST punktposition):#u#(*)#e#
-Zweck: arbeitet wie obiges 'deactivate', allerdings werden die Menupunkte nicht
- über ihre Bezeichnung, sondern über ihre Position im (aktuellen) Pull-
- Down-Menu identifiziert. Die Positionen sind von oben nach unten durch­
- numeriert. Beachten Sie, daß Trennlinien eine Position belegen und
- mitgezählt werden. Die Prozedur arbeitet schneller als obige!
-
-
-#ib#direktstart#ie#
-PROC direktstart (TEXT CONST prozedurname,
- BOOL CONST mit loeschen):#u#(*)#e#
-Zweck: Macht aus der aktuellen Task eine Manager-Task ('global manager').
- Werden neue Sohntasks eingerichtet, so melden sich diese nicht - wie
- gewohnt - mit der 'gib kommando:'-Ebene. Statt dessen wird die Prozedur
- 'prozedurname' ausgeführt. Das Kommando ist dann sinnvoll, wenn sich
- die Sohntask gleich mit einem Menu melden soll. In der Prozedur
- 'prozedurname' muß dann die entsprechende Menukarte angekoppelt
- und das gewünschte Menu zur Ausführung gebracht werden. Hat 'mit
- loeschen den Wert 'TRUE', so wird nach Verlassen der Menuebene die
- Task automatisch gelöscht; bei 'FALSE' wird noch angefragt, ob die Task
- gelöscht werden soll. Wird die Frage bejaht, wird gelöscht; sonst wird die
- Task abgekoppelt (break) und kann durch 'continue' wieder angekoppelt
- werden.
- In der Task, in der das Kommando 'direktbefehl' gegeben wurde, sollte
- nicht das Kommando 'monitor' gegeben werden, da dadurch auch die­
- se Task zu einer Task gemacht würde, die sich direkt mit dem Menu
- meldet und ggf. bei Verlassen des Menus automatisch gelöscht wird! Die
- 'gib kommando:'-Ebene ist dadurch unzugänglich!
-
-
-#ib#ecke oben links#ie#
-TEXT PROC ecke oben links:
-
-Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" links oben in der
- Ecke (ω) ausgegeben wird.
-
-
-PROC ecke oben links (TEXT CONST zeichen):
-
-Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
- stellung der "Kästen" links oben in der Ecke ausgegeben werden soll.
-
-
-#ib#ecke oben rechts#ie#
-TEXT PROC ecke oben rechts:
-
-Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" rechts oben in
- der Ecke (�) ausgegeben wird.
-
-
-PROC ecke oben rechts (TEXT CONST zeichen):
-
-Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
- stellung der "Kästen" rechts oben in der Ecke ausgegeben werden soll.
-
-
-#ib#ecke unten links#ie#
-TEXT PROC ecke unten links:
-
-Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" links unten in
- der Ecke (�) ausgegeben wird.
-
-
-PROC ecke unten links (TEXT CONST zeichen):
-
-Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
- stellung der "Kästen" links unten in der Ecke ausgegeben werden soll.
-
-
-#ib#ecke unten rechts#ie#
-TEXT PROC ecke unten rechts:
-
-Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" rechts unten in
- der Ecke (�) ausgegeben wird.
-
-
-PROC ecke unten rechts (TEXT CONST zeichen):
-
-Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
- stellung der "Kästen" rechts unten in der Ecke ausgegeben werden soll.
-
-
-#ib#edit#ie#
-PROC edit (WINDOW VAR w, TEXT CONST dateiname):
-
-Zweck: Vergl. 'menuwindowedit'. Hier wird nur zusätzlich das Fenster festgelegt,
- das bei 'menuwindowedit' automatisch gesetzt wird.
-
-
-PROC edit (WINDOW VAR w, FILE VAR f):
-
-Zweck: Vergl. 'menuwindowedit'. Hier wird nur zusätzlich das Fenster festgelegt,
- das bei 'menuwindowedit' automatisch gesetzt wird.
-
-
-#ib#editget#ie#
-PROC editget (WINDOW VAR w, TEXT VAR text):#u#(*)#e#
-Zweck: Eingabe mit Editiermöglichkeit von 'text'. 'text' wird ausgegeben. Die
- Eingabe wird mit RETURN beendet. 'text' darf höchstens 79 Zeichen
- lang sein! Fehler: Text nicht initialisiert.
-
-
-PROC editget (WINDOW VAR w, TEXT VAR text,
- INT CONST max laenge, scroll,
- TEXT CONST sep, res,
- TEXT VAR exit char):#u#(*)#e#
-Zweck: Wie oben. Über 'max laenge' kann festgelegt werden , wie lang der einzu­
- gebende Text ('text') maximal sein darf. Ãœber 'scroll' wird die Breite des
- Zeilenfensters festgelegt, bevor gerollt wird (jedoch nicht über die rech­
- te Fenstergrenze hinaus). Über 'sep' können Zeichen bestimmt werden,
- bei denen die Eingabe (zusätzlich zu RETURN) beendet werden soll. Über
- 'res' können reservierte Tasten angegeben werden. Wird eine dieser
- Tasten mit ESC betätigt, wird die Eingabe beendet. In 'exit char' steht
- dann ESC und das Zeichen, mit dem der Editor verlassen wurde.
-Fehler: Text nicht initialisiert.
-
-
-#ib#erase#ie#
-PROC erase (WINDOW VAR fenster):
-
-Zweck: Der durch 'fenster' beschrieben Bildschirmbereich wird gelöscht - ein­
- schließlich des Rahmens, der den Fensterbereich umgibt (vergl. Sie auch
- 'page')!
-
-
-#ib#erase footnote#ie#
-PROC erase footnote (WINDOW VAR fenster):
-
-Zweck: Die letzten beiden Zeilen in 'fenster' (in der die Fußnote nebst Trennlinie
- eingetragen sind) werden gelöscht (vergl. Sie auch 'out footnote')!
-
-
-#ib#erase menunotice#ie#
-PROC erase menunotice:
-
-Zweck: Sofern zuvor mit 'write menunotice' (sehen Sie auch dort) eine Menunotiz
- gesetzt wurde, wird diese gelöscht, ansonsten hat die Prozedur keine
- Wirkung.
-
-
-#ib#get#ie#
-PROC get (WINDOW VAR w, TEXT CONST eingabe):
-
-Zweck: Vergl. 'menuwindowget'. Hier wird nur zusätzlich das Fenster festgelegt,
- das bei 'menuwindowget' automatisch gesetzt wird.
-
-
-PROC get (WINDOW VAR w, INT CONST wert):
-
-Zweck: Vergl. 'get (WINDOW VAR w, TEXT CONST eingabe)'. Der eingelesene Wert
- wird anschließend entsprechend konvertiert.
-
-
-
-PROC get (WINDOW VAR w, REAL CONST wert):
-
-Zweck: Vergl. 'get (WINDOW VAR w, TEXT CONST eingabe)'. Der eingelesene Wert
- wird anschließend entsprechend konvertiert.
-
-
-PROC get (WINDOW VAR w, TEXT CONST eingabe,
- INT CONST laenge):
-
-Zweck: Vergl. 'get (WINDOW VAR w, TEXT CONST eingabe)'. Zusätzlich wird die
- Eingabe beendet, wenn der eingegebene Text die Länge 'laenge' erreicht
- hat.
-
-
-PROC get (WINDOW VAR w, TEXT CONST eingabe,
- TEXT CONST separator):
-
-Zweck: Vergl. 'get (WINDOW VAR w, TEXT CONST eingabe)'. Zusätzlich werden
- über 'separtor' die Zeichen festgelegt, die zusätzlich zu den Positionie­
- rungszeichen die Eingabe beenden.
-
-
-#ib#get cursor#ie#
-PROC get cursor (WINDOW VAR w, INT VAR spalte,
- zeile):
-
-Zweck: Vergl. 'get menuwindowcursor'. Hier wird nur zusätzlich das Fenster
- festgelegt, das bei 'get menuwindowcursor' automatisch gesetzt wird.
-
-
-#ib#getline#ie#
-PROC getline (WINDOW VAR w, TEXT CONST eingabe):
-
-Zweck: Vergl. 'get (WINDOW VAR w, TEXT CONST eingabe). Nur wird hier die
- Eingabe ausschließlich über die Positionierungstasten - nicht aber über
- das Leerzeichen beendet.
-
-
-#ib#get menuwindowcursor#ie#
-PROC get menuwindowcursor (INT VAR spalte, zeile):
-
-Zweck: Mit der Prozedur wird die aktuelle Cursorposition innerhalb des Menu­
- fensters erfragt.
-
-
-#ib#handle menu#ie#
-PROC handle menu (TEXT CONST menuname):
-
-Zweck: Bringt das in der angekoppelten Menukarte enthaltene Menu mit dem
- Namen 'menuname' zur Ausführung, d.h. das entsprechende Menu wird
- auf dem Bildschirm präsentiert und kann mit den üblichen Tastenfunk­
- tionen gehandhabt werden.
- (Anmerkung: Die Menufunktionen können natürlich nur dann ausge­
- führt werden, wenn die zugehörigen Programme in der aktuellen Task
- zuvor insertiert wurden - ansonsten erscheint auf dem Bildschirm jeweils
- der Hinweis 'unbekanntes Kommando'!)
-Fehler: Das Menu 'menuname' ist nicht in der angekoppelten Menukarte!
-
-
-#ib#infix namen#ie#
-THESAURUS PROC infix namen (THESAURUS CONST thes,
- TEXT CONST infix):
-
-Zweck: Die Prozedur liefert einen Thesaurus, in dem alle Namen enthalten sind,
- die in 'thes' übergeben wurden und die den Wortbestandteil 'infix' enthal­
- ten (gleichgültig an welcher Position).
-
-
-THESAURUS PROC infix namen (THESAURUS CONST thes,
- INT CONST dateityp):
-
-Zweck: Die Prozedur liefert einen Thesaurus, in dem alle Dateinamen enthalten
- sind, die in 'thes' übergeben wurden und die den Dateityp 'dateityp'
- haben.
-
-
-THESAURUS PROC infix namen (THESAURUS CONST thes,
- TEXT CONST infix,
- INT CONST dateityp):
-
- wirkt wie: infix namen (infix namen (thes, infix), dateityp)
-
-
-#ib#install menu#ie#
-PROC install menu (TEXT CONST menukartenname,
- BOOL CONST mit emblem):
-
-Zweck: Mit diesem Befehl wird die Menukarte mit dem Namen 'menukarten­
- name' aus der Task 'gs-MENUKARTEN' in die aktuelle Task kopiert. Die
- Menukarte wird als unbenannter Datenraum an die Task gekoppelt. Der
- benannte Datenraum wird gelöscht. Der Name der angekoppelten Menu­
- karte wird vermerkt.
- Stimmt der Name der angekoppelten Menukarte mit dem Namen der
- angeforderten Menukarte überein, dann wird nicht erneut eine Kopie
- angefordert, sondern auf der bereits angekoppelten Menukarte gearbeitet.
- Hat 'mit emblem' den Wert 'TRUE', dann wird unser 'Software-Emblem'
- während des Ankoppelvorgangs auf dem Bildschirm ausgegeben, bei
- 'FALSE' nicht.
-Fehler: Die Menukarte 'menukartenname' existiert nicht in der Task
- 'gs-MENUKARTEN'.
-
-
-PROC install menu (TEXT CONST menukartenname):
-
- wirkt wie: install menu (TEXT CONST menukartenname, TRUE)
-
-
-#ib#invers#ie#
-TEXT PROC invers (TEXT CONST text):
-
-Zweck: Liefert den Text 'text' invers dargestellt. An den Text wird zuvor ein Leer­
- zeichen angehängt.
-
-
-#ib#kreuz#ie#
-TEXT PROC kreuz:
-
-Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als "Kreuz" (̗)
- ausgegeben wird.
-
-
-PROC kreuz (TEXT CONST zeichen):
-
-Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
- stellung der "Kästen" als "Kreuz" ausgegeben werden soll.
-
-
-#ib#line#ie#
-PROC line (WINDOW VAR w, INT CONST anzahl):
-
-Zweck: Vergl. 'menuwindowline'. Hier wird nur zusätzlich das Fenster festgelegt,
- das bei 'menuwindowline' automatisch gesetzt wird.
-
-
-PROC line (WINDOW VAR w):
-
- wirkt wie: line (w, 1)
-
-
-#ib#menualternative#ie#
-INT PROC menualternative (TEXT CONST infotext,
- auswahlliste,
- zusatztasten,
- INT CONST position,
- BOOL CONST mit abbruch):
-
-Zweck: Mit der Prozedur können dem Benutzer innerhalb des Menubildschirms
- mehrere Alternativen zur Entscheidung angeboten werden, von denen er
- sich für eine entscheiden kann.
- Auf dem Bildschirm wird innerhalb des Menus eine Box ausgegeben.
- Boxbreite und -höhe werden vom System automatisch anhand des über­
- gebenen 'infotext'es (bzw. der 'auswahlliste') festgelegt. Der in 'infotext'
- übergebene Text wird innerhalb der Box angezeigt. Der Text muß den
- gs-DIALOG-Syntax-Regeln (sehen Sie Kap. 5.13) entsprechen - er dient
- ausschließlich der Information des Benutzers.
- In der letzten Zeile der Box wird die 'auswahlliste' angeboten. Zwischen
- jeder notierten Alternative muß in 'auswahlliste' der code "13" eingetra­
- gen sein. In der Box werden zwischen den Alternativen je drei Leerzei­
- chen eingefügt. Es können maximal 10 Alternativen angegeben werden,
- die aber incl. der eingefügten Leerzeichen eine Gesamtbreite von 64
- Zeichen nicht überschreiten dürfen. Über diese Liste erfolgt durch Posi­
- tionierung und anschließendem <RETURN> die Entscheidung für eine
- Alternative. Die Prozedur liefert dann als Zahlenwert die Position der
- gewählten Alternative in der übergebenen Auswahlliste.
- Ãœber 'mit abbruch' wird festgelegt, ob die Alternativentscheidung durch
- die Tastenfolge <ESC><h> abgebrochen werden kann oder nicht. Ist
- das zulässig und geschehen, dann wird der Wert 0 geliefert.
- Ãœber 'zusatztasten' kann noch festgelegt werden, ob die Entscheidung
- auch durch Tippen bestimmter Tasten angegeben werden kann. Sind hier
- Zeichen angegeben und erfolgt die Entscheidung über das Tippen einer
- zugelassenen Taste, dann wird die Position der getippten Taste in der
- unter 'zusatztasten' übergebenen Zeichenkette ermittelt und der Wert 100
- hinzuaddiert (sehen Sie dazu auch Kap. 5.7).
- Nach der Entscheidung wird der Menubildschirm automatisch in den
- Ausgangszustand versetzt.
-
-
-#ib#menuanswer#ie#
-TEXT PROC menuanswer (TEXT CONST infotext,
- vorgabe,
- INT CONST position):
-
-Zweck: Die Prozedur ermöglicht den Dialog mit dem Benutzer innerhalb des
- Menus. Sie liefert einen vom Benutzer eingegebenen (bzw. modifizierten)
- Text/Namen.
- Auf dem Bildschirm wird innerhalb des Menus eine Box ausgegeben.
- Boxbreite und -höhe werden vom System automatisch anhand des über­
- gebenen 'infotext'es festgelegt. Der in 'infotext' übergebene Text wird
- innerhalb der Box angezeigt. Der Text muß den gs-DIALOG-Syntax-Regeln
- (sehen Sie Kap. 5.13) entsprechen.
- In der letzten Zeile der ausgegebenen Box erscheint der Text "Eingabe:".
- Ãœber 'vorgabe' kann dem Benutzer ein Text zum Editieren angeboten
- werden. Mit 'position' wird die relative Lage der Box innerhalb des Menu­
- bildschirms festgelegt (1, 2, 3, 4, 5: sehen Sie dazu Kap. 5.12).
- Die Eingabe kann durch <RETURN> abgeschlossen oder durch
- <ESC><h> abgebrochen werden, in letzterem Falle wird niltext ("")
- geliefert.
- Der gelieferte Wert ist von führenden und folgenden Leerzeichen befreit
- (compress). Es ist nicht möglich, den Namen 'break' einzugeben (sehen
- Sie dazu Kap.5.1).
-
-
-#ib#menuanswerone#ie#
-TEXT PROC menuanswerone (TEXT CONST infotext,
- vorgabe, THESAURUS CONST thesaurus,
- TEXT CONST ueberschrift, hinweis,
- BOOL CONST mit reinigung):
-
-Zweck: Die Prozedur ist aus den zwei Prozeduren 'menuanswer' und 'menuone'
- zusammengesetzt (sehen Sie auch dort). In einer Box innerhalb des
- Menus wird der 'infotext' ausgegeben und eine Eingabe erwartet; ggf.
- kann ein Text in 'vorgabe' zum Editieren ausgegeben werden. Wird die
- Eingabe mit <RETURN> abgeschlossen, wird der eingegebene Text
- geliefert. Statt der Eingabe kann der Benutzer sich durch die Tastenfolge
- <ESC><z> auch die in 'thesaurus' übergebenen Namen zur Auswahl
- anbieten lassen. Wird ein Name angekreuzt, wird dieser geliefert; wird die
- Auswahl durch <ESC><h> abgebrochen, wird niltext ("") geliefert.
-Fehler: Fenster für Auswahl zu klein (x < 56, y < 15)
-
-
-#ib#menuanswersome#ie#
-THESAURUS PROC menuanswersome (TEXT CONST
- infotext, vorgabe,
- THESAURUS CONST thesaurus,
- TEXT CONST ueberschrift, hinweis,
- BOOL CONST mit reinigung):
-
-Zweck: Die Prozedur ist aus den zwei Prozeduren 'menuanswer' und 'menusome'
- zusammengesetzt (sehen Sie auch dort). In einer Box innerhalb des
- Menus wird der 'infotext' ausgegeben und eine Eingabe erwartet; ggf.
- kann ein Text in 'vorgabe' zum Editieren ausgegeben werden. Wird die
- Eingabe mit <RETURN> abgeschlossen, wird der eingegebene Text in
- einem Thesaurus geliefert. Statt der Eingabe kann der Benutzer sich
- durch die Tastenfolge <ESC><z> auch die in 'thesaurus' übergebenen
- Namen zur Auswahl anbieten lassen. Werden Namen angekreuzt, werden
- diese in einem Thesaurus geliefert; wird die Auswahl durch
- <ESC><h> abgebrochen, wird ein leerer Thesaurus geliefert.
-Fehler: Fenster für Auswahl zu klein (x < 56, y < 15)
-
-
-#ib#menu archiv checken#ie#
-PROC menu archiv checken:
-
-Zweck: Ãœber diese Prozedur kann das "Checken" von Dateien auf dem Archiv in
- das Archiv-Pull-Down-Menu eingebunden werden. Sehen Sie dazu unbe­
- dingt Kap. 6.1!
-
-
-#ib#menu archiv grundeinstellung#ie#
-PROC menu archiv grundeinstellung (INT CONST ort):
-
-Zweck: Hierüber wird die Grundeinstellung des Archivpakets vorgenommen: Dazu
- wird als Zieltask das Archiv der eigenen Station eingestellt. Dieses wird
- auch über eine Menunotiz im Menu angezeigt. Die entsprechenden Menu­
- punkte werden aktiviert bzw. deaktiviert. Sehen Sie dazu unbedingt Kap.
- 6.1!
- Ãœber 'ort' wird festgelegt, an welcher Stelle innerhalb des Menus die
- Menunotiz zur Anzeige der Zieltask (und ggf. des Archivnamens) ausge­
- geben wird (sehen Sie dazu Kap. 5.12).
-
-
-#ib#menu archiv holen#ie#
-PROC menu archiv holen:
-
-Zweck: Ãœber diese Prozedur kann das Holen von Dateien vom Archiv in das
- Archiv-Pull-Down-Menu eingebunden werden. Sehen Sie dazu unbedingt
- Kap. 6.1!
-
-
-#ib#menu archiv initialisieren#ie#
-PROC menu archiv initialisieren:
-
-Zweck: Ãœber diese Prozedur kann das Formatieren/ Initialisieren eines Archivs in
- das Archiv-Pull-Down-Menu eingebunden werden. Sehen Sie dazu unbe­
- dingt Kap. 6.1!
-
-
-#ib#menu archiv loeschen#ie#
-PROC menu archiv loeschen:
-
-Zweck: Über diese Prozedur kann das Löschen von Dateien auf dem Archiv in das
- Archiv-Pull-Down-Menu eingebunden werden. Sehen Sie dazu unbedingt
- Kap. 6.1!
-
-
-#ib#menu archiv neue diskette#ie#
-PROC menu archiv neue diskette:
-
-Zweck: Ãœber diese Prozedur kann das Anmelden einer neuen Diskette bei schon
- reserviertem Archiv in das Archiv-Pull-Down-Menu eingebunden werden.
- Sehen Sie dazu unbedingt Kap. 6.1!
-
-
-#ib#menu archiv reservieren#ie#
-PROC menu archiv reservieren:
-
-Zweck: Ãœber diese Prozedur kann die Archivreservierung in das Archiv-Pull-
- Down-Menu eingebunden werden. Sehen Sie dazu unbedingt Kap. 6.1!
-
-
-#ib#menu archiv reservierung aufgeben#ie#
-PROC menu archiv reservierung aufgeben:
-
-Zweck: Ãœber diese Prozedur kann eine bestehende Archivreservierung aus dem
- Menu heraus aufgegeben werden. Sehen Sie dazu unbedingt Kap. 6.1!
-
-
-#ib#menu archiv schreibcheck#ie#
-PROC menu archiv schreibcheck:
-
-Zweck: Ãœber diese Prozedur kann das Schreiben von Dateien auf das Archiv und
- das sich automatisch daran anschließende "Checken" der zuvor geschrie­
- benen Dateien in das Archiv-Pull-Down-Menu eingebunden werden.
- Sehen Sie dazu unbedingt Kap. 6.1!
-
-
-#ib#menu archiv schreiben#ie#
-PROC menu archiv schreiben:
-
-Zweck: Ãœber diese Prozedur kann das Schreiben von Dateien auf das Archiv in
- das Archiv-Pull-Down-Menu eingebunden werden. Sehen Sie dazu unbe­
- dingt Kap. 6.1!
-
-
-#ib#menu archiv verzeichnis#ie#
-PROC menu archiv verzeichnis:
-
-Zweck: Ãœber diese Prozedur kann die Ausgabe eines Inhaltsverzeichnisses des
- Archivs auf dem Bildschirm in das Archiv-Pull-Down-Menu eingebunden
- werden. Sehen Sie dazu unbedingt Kap. 6.1!
-
-
-#ib#menu archiv verzeichnis drucken#ie#
-PROC menu archiv verzeichnis drucken:
-
-Zweck: Ãœber diese Prozedur kann die Ausgabe eines Inhaltsverzeichnisses des
- Archivs über den Drucker in das Archiv-Pull-Down-Menu eingebunden
- werden. Sehen Sie dazu unbedingt Kap. 6.1!
-
-
-#ib#menu archiv zieltask einstellen#ie#
-PROC menu archiv zieltask einstellen:
-
-Zweck: Über diese Prozedur kann die Festlegung der Zieltask, mit der die Inter­
- taskkommunikation abgewickelt werden soll, in das Archiv-Pull-Down-
- Menu eingebunden werden. Sehen Sie dazu unbedingt Kap. 6.1!
-
-
-#ib#menu dateien aufraeumen#ie#
-PROC menu dateien aufraeumen:
-
-Zweck: Durch diese Prozedur wird innerhalb des aktuellen Menus der Name der
- Datei erfragt, die aufgeräumt, d.h. reorganisiert werden soll. Existiert
- keine Datei mit dem angegebenen Namen, so erfolgt ein Hinweis darauf.
- Statt der Eingabe des Dateinamens kann auch die Tastenfolge
- <ESC><z> getippt werden. Daraufhin werden alle Dateinamen der
- Task zur Auswahl angeboten. Hier können die gewünschten Dateinamen
- angekreuzt werden. Anschließend werden die angekreuzten Dateien
- reorganisiert. Der Vorgang wird auf dem Bildschirm protokolliert. Am
- Ende des Vorgangs wird der Menubildschirm automatisch regeneriert. Es
- können natürlich nur Dateien des Typs 1003 (Textfiles) reorganisiert
- werden; sofern andere Dateien ausgewählt werden, erfolgt ein Hinweis
- darauf.
-
-
-#ib#menu dateien drucken#ie#
-PROC menu dateien drucken:
-
-Zweck: Durch diese Prozedur wird innerhalb des aktuellen Menus (auch bei
- geschachtelten(!)) der Name der Datei erfragt, die gedruckt werden soll.
- Anschließend wird die Datei mit dem angegebenen Namen gedruckt.
- Existiert keine Datei mit dem angegebenen Namen, so erfolgt ein Hinweis
- darauf.
- Statt der Eingabe des Dateinamens kann auch die Tastenfolge
- <ESC><z> getippt werden. Daraufhin werden alle Dateinamen der
- Task zur Auswahl angeboten. Alle angekreuzten Dateien werden an­
- schließend gedruckt. Der Vorgang wird auf dem Bildschirm protokolliert.
- Am Ende wird der Menubildschirm automatisch regeneriert.
-
-
-#ib#menu dateien kopieren#ie#
-PROC menu dateien kopieren:
-
-Zweck: Durch diese Prozedur wird innerhalb des aktuellen Menus der Name der
- Datei erfragt, die kopiert werden soll. Existiert keine Datei mit dem
- angegebenen Namen, so erfolgt ein Hinweis darauf. Statt der Eingabe des
- Dateinamens kann auch die Tastenfolge <ESC><z> getippt werden.
- Daraufhin werden alle Dateinamen der Task zur Auswahl angeboten. Hier
- kann ein Dateiname angekreuzt werden. Nun wird der Name erfragt, den
- die Kopie erhalten soll. Existiert der Name bereits, erfolgt ein Hinweis
- darauf, sonst wird die Datei kopiert. Der Menubildschirm wird automa­
- tisch regeneriert.
-
-
-#ib#menu dateien loeschen#ie#
-PROC menu dateien loeschen:
-
-Zweck: Durch diese Prozedur wird innerhalb des aktuellen Menus der Name der
- Datei erfragt, die gelöscht werden soll. Anschließend wird die Datei mit
- dem angegebenen Namen gelöscht, sofern die Sicherheitsabfrage zum
- Löschen mit 'Ja' beantwortet wurde. Existiert keine Datei mit dem ange­
- gebenen Namen, so erfolgt ein Hinweis darauf. Statt der Eingabe des
- Dateinamens kann auch die Tastenfolge <ESC><z> getippt werden.
- Daraufhin werden alle Dateinamen der Task zur Auswahl angeboten. Alle
- angekreuzten Dateien werden anschließend (nach jeweiliger Sicherheits­
- anfrage) gelöscht. Der Vorgang wird auf dem Bildschirm protokolliert. Am
- Ende wird der Menubildschirm automatisch regeneriert.
-
-
-#ib#menu dateien speicherplatz#ie#
-PROC menu dateien speicherplatz:
-
-Zweck: Durch diese Prozedur wird innerhalb des aktuellen Menus der Name der
- Datei erfragt, deren Speicherplatz ermittelt werden soll. Existiert keine
- Datei mit dem angegebenen Namen, so erfolgt ein Hinweis darauf. Statt
- der Eingabe des Dateinamens kann auch die Tastenfolge <ESC><z>
- getippt werden. Daraufhin werden alle Dateinamen der Task zur Aus­
- wahl angeboten. Hier können die gewünschten Dateinamen angekreuzt
- werden. Anschließend wird der Speicherplatz der angekreuzten Datei(en)
- ermittelt und im Menufenster ausgegeben. Im Anschluß an die Anzeige
- wird der Menubildschirm automatisch regeneriert.
-
-
-#ib#menu dateien umbenennen#ie#
-PROC menu dateien umbenennen:
-
-Zweck: Durch diese Prozedur wird innerhalb des aktuellen Menus der Name der
- Datei erfragt, die umbenannt werden soll. Existiert keine Datei mit dem
- angegebenen Namen, so erfolgt ein Hinweis darauf. Statt der Eingabe des
- Dateinamens kann auch die Tastenfolge <ESC><z> getippt werden.
- Daraufhin werden alle Dateinamen der Task zur Auswahl angeboten. Hier
- kann ein Dateiname angekreuzt werden. Nun wird der Name erfragt, den
- die Datei anschließend erhalten soll. Existiert der Name bereits, erfolgt ein
- Hinweis darauf, sonst wird die Datei umbenannt. Der Menubildschirm
- wird automatisch regeneriert.
-
-
-#ib#menu dateien verzeichnis#ie#
-PROC menu dateien verzeichnis
-
-Zweck: Mit der Prozedur kann innerhalb des aktuellen Menus ein Verzeichnis der
- Dateien der eigenen Task ausgegeben werden. Nach Verlassen des Ver­
- zeichnisses durch <ESC><q> wird der Menubildschirm automatisch
- regeneriert.
-
-
-#ib#menufootnote#ie#
-PROC menufootnote (TEXT CONST fussnotentext):
-
-Zweck: Mit der Prozedur kann der Text in der "Fußzeile" des aktuellen Menubild­
- schirms (zumeist Hinweise an den Benutzer) ersetzt werden. Der vorhan­
- dene Text wird gelöscht und stattdessen 'fussnotentext' notiert. Der Text
- bleibt so lange erhalten, bis er durch eine andere selbstgesetzte Fußnote
- ('menufootnote') oder durch die alte vom System gesetzte Fußnote ('old
- menufootnote'; sehen Sie auch dort) überschrieben wird. Sofern
- gs-DIALOG-Prozeduren aufgerufen werden, die selbst Ausgaben in der
- Fußzeile machen, wird die durch 'menufootnote' gesetzte Fußnote eben­
- falls überschrieben. Wenn der Text länger als die aktuelle Menubild­
- schirmbreite ist,wird der Text abgeschnitten. Damit der Text auch in
- geschachtelten Menus vollständig ausgegeben werden kann, sollte er nicht
- länger als 69 Zeichen sein.
-
-
-#ib#menufunktion#ie#
-PROC menufunktion (TEXT CONST kuerzel,
- punktbezeichnung,
- prozedurname,
- infotext):
-
-Zweck: Der Befehl wird für die Generierung von Menukarten benötigt. Mit diesem
- Befehl wird in das aktuell geöffnete Menu unter dem aktuellen Oberbe­
- griff eine Verarbeitungsfunktion eingetragen. Mit 'kuerzel' wird die Taste
- bestimmt, über die die Verarbeitungsfunktion direkt aktiviert werden
- kann. 'kuerzel' muß innerhalb eines Pull-Down-Menus eindeutig gewählt
- sein! Unter 'punktbezeichnung' wird der Text eingetragen, der im Pull-
- Down-Menu ausgegeben werden soll. In 'prozedurname' steht der Name
- der Prozedur (als Text(!)), die bei Aktivierung des Menupunktes ausge­
- führt werden soll. In 'infotext' steht der Text, der als Information zu
- diesem Menupunkt bei Tippen der <?>-Taste angezeigt werden soll.
-Fehler: Menupunkt-Kürzel ist länger als ein Zeichen.
- Menupunktkürzel kommt mehrfach vor.
- Menupunktbezeichnung ist zu lang (> 60 Zeichen).
- Zu viele Menupunkte in einem Pull-Down-Menu (> 15).
-
-
-#ib#menuinfo#ie#
-PROC menuinfo (TEXT CONST infotext, INT CONST
- position, timelimit):
-
-Zweck: Die Prozedur ermöglicht es, innerhalb des Menus einen Hinweis (Infor­
- mationstext) auszugeben. Im Menubildschirm erscheint der 'infotext' in
- einer Box. Boxbreite und -höhe werden vom System automatisch anhand
- des übergebenen 'infotext'es festgelegt. 'infotext' muß den gs-DIALOG-
- Syntax-Regeln (sehen Sie Kap. 5.13) entsprechen. Mit 'position' wird die
- relative Lage der Box innerhalb des Menubildschirms festgelegt (1, 2, 3,
- 4, 5: sehen Sie dazu Kap. 5.12). Mit 'timelimit' kann die Zeitdauer (in
- Zehntelsekunden) festgelegt werden, für die der Hinweis höchstens er­
- scheint. Die Anzeige kann vom Benutzer durch Tippen einer beliebigen
- Taste abgebrochen werden.
-
-
-PROC menuinfo (TEXT CONST infotext,
- INT CONST position):
-
- wirkt wie: menuinfo (infotext, position, maxint)
-
-
-PROC menuinfo (TEXT CONST infotext):
-
- wirkt wie: menuinfo (infotext, 5)
-
-
-#ib#menukartenname#ie#
-TEXT PROC menukartenname:#u#(*)#e#
-Zweck: Liefert den Namen der zur zeit angekoppelten Menukarte. Ist keine
- Menukarte angekoppelt, wird niltext ("") geliefert.
-
-
-#ib#menuno#ie#
-BOOL PROC menuno (TEXT CONST frage,
- INT CONST position):
-
- wirkt wie: NOT menuyes (frage, position)
-
-
-#ib#menuone#ie#
-TEXT PROC menuone (THESAURUS CONST thesaurus,
- TEXT CONST ueberschrift,
- hinweis,
- BOOL CONST mit reinigung):
-
-Zweck: Durch die Prozedur werden dem Benutzer innerhalb des Menubild­
- schirms Namen zur Auswahl angeboten. Nach Ankreuzen eines Namens
- wird die Auswahl automatisch verlassen. Der angekreuzte Name wird
- geliefert. Wird die Auswahl durch <ESC><h> abgebrochen, so wird
- niltext ("") geliefert. In 'thesaurus' wird ein THESAURUS mit den Namen
- übergeben, die zur Auswahl angeboten werden sollen (sehen Sie dazu
- auch Kap. 5.14). Die beiden Texte 'ueberschrift' und 'hinweis' erscheinen
- zur Kennzeichnung im Kopf der Auswahlliste: 'ueberschrift' zentriert und
- invers dargestellt, 'hinweis' nur zentriert. Hat 'mit reinigung' den Wert
- TRUE, so wird nach der Auswahl der Menubildschirm automatisch wie­
- deraufgebaut, bei FALSE wird darauf verzichtet.
-Fehler: Fenster für Auswahl zu klein (x < 56, y < 15)
-
-
-#ib#menusome#ie#
-THESAURUS PROC menusome (THESAURUS CONST
- thesaurus,
- TEXT CONST ueberschrift,
- hinweis,
- BOOL CONST mit reinigung):
-
-Zweck: Durch die Prozedur werden dem Benutzer innerhalb des Menubild­
- schirms Namen zur Auswahl angeboten. Die Auswahl kann durch die
- Tastenfolge <ESC><q> verlassen werden. Der/ die angekreuzte(n)
- Name(n) wird/werden in einem Thesaurus geliefert. Wird die Auswahl
- durch die Tastenfolge <ESC><h> abgebrochen oder wurde kein Name
- angekreuzt, dann wird ein leerer Thesaurus geliefert. In 'thesaurus' wird
- ein Thesaurus mit den Namen übergeben, die zur Auswahl angeboten
- werden sollen (sehen Sie dazu auch Kap. 5.14). Die beiden Texte
- 'ueberschrift' und 'hinweis' erscheinen zur Kennzeichnung im Kopf der
- Auswahlliste: 'ueberschrift' zentriert und invers dargestellt, 'hinweis' nur
- zentriert. Hat 'mit reinigung' den Wert TRUE, so wird nach der Auswahl
- der Menubildschirm automatisch wiederaufgebaut, bei FALSE wird darauf
- verzichtet.
-Fehler: Fenster für Auswahl zu klein (x < 56, y < 15)
-
-
-#ib#menuwindowcenter#ie#
-TEXT PROC menuwindowcenter (TEXT CONST text):
-
-Zweck: Die Prozedur liefert einen Text, der so lang ist, wie das aktuelle Menufen­
- ster breit ist. Dazu wird 'text' so mit Leerzeichen "ummantelt" daß 'text'
- etwa in der Mitte zu stehen kommt. Steht der Cursor bei Ausgabe dieses
- Textes am Anfang der Zeile, erscheint der Text zentriert in der Zeile
- (vorhandene Zeileninhalte werden dadurch überschrieben (der Cursor
- steht dann auf dem rechten Fensterrand!).
-
-
-#ib#menuwindowcursor#ie#
-PROC menuwindowcursor (INT CONST spalte, zeile):
-
-Zweck: Mit diesem Befehl kann der Cursor innerhalb des aktuellen Menufensters
- positioniert werden. Ein "normales" Menufenster ist 77 Zeichen breit und
- 20 Zeichen hoch; ein Menufenster in einem geschachtelten Menu ist 71
- Zeichen breit und 16 Zeichen hoch). (Sehen Sie auch die Informations­
- prozeduren 'get menuwindowcursor' und 'remaining menuwindowlines').
-Fehler: Wird außerhalb des aktuellen Menufensters positioniert, wird der Fenster­
- inhalt gelöscht und die Fensterposition (1,1) angenommen.
-
-
-#ib#menuwindowedit#ie#
-PROC menuwindowedit (TEXT CONST dateiname):
-
-Zweck: Durch den Befehl wird innerhalb des Menus ein umrandetes Fenster
- geöffnet und die Datei mit dem Namen 'dateiname' zum Editieren ausge­
- geben. Auf die Größe des Menufensters kann kein Einfluß genommen
- werden - sie wird selbständig vom System gesetzt ("normales" Menu: 77
- Zeichen breit und 20 Zeichen hoch; geschachteltes Menu 71 Zeichen
- breit und 16 Zeichen hoch).
-Fehler: Die Datei mit dem Namen 'dateiname' existiert nicht.
-
-
-PROC menuwindowedit (FILE VAR f):
-
-Zweck: Vergl. obige 'menuwindowedit'-Prozedur. Die Datei 'f' muß mit der Verar­
- beitungsart 'modify' assoziiert worden sein.
-
-
-#ib#menuwindoweditget#ie#
-PROC menuwindoweditget (TEXT VAR text):#u#(*)#e#
-Zweck: Vergl. 'menuwindowget (TEXT VAR text)' Zusätzlich kann hier in 'text' ein
- Text zum Editieren vorgegeben werden.
-Fehler: Text nicht initialisiert.
-
-
-#ib#menuwindowget#ie#
-PROC menuwindowget (TEXT VAR text):
-
-Zweck: Mit der Prozedur können Texte innerhalb des Menufensters eingelesen
- werden (INTEGER- und REAL-Werte müssen ggf. "von Hand" konvertiert
- werden). Die Eingabe wird durch <RETURN> abgeschlossen. Es muß
- mindestens ein Zeichen (ungleich Leerzeichen) eingegeben werden. Von
- der Eingabe werden die führenden Leerzeichen abgeschnitten. Ist der
- einzugebende Text länger als die noch verbleibende Restzeile, so wird der
- Text in der Restzeile gescrollt. Sind in der aktuellen Zeile weniger als 7
- Zeichenpositionen für die Eingabe vorhanden, so wird automatisch für die
- Eingabe an den Anfang der nächsten Zeile positioniert.
-
-
-#ib#menuwindowline#ie#
-PROC menuwindowline (INT CONST anzahl):
-
-Zweck: Die Prozedur 'menuwindowline' hat innerhalb des Menubildschirms eine
- ähnliche Wirkung wie die Prozedur 'line' auf dem Gesamtbildschirm. Es
- werden 'anzahl' Zeilenwechsel vorgenommen. Wird allerdings die untere
- Grenze des Menubildschirms überschritten, dann rollt (scrollt) der Bild­
- schirm nicht die entsprechende Anzahl Zeilen nach oben, statt dessen
- wird der Fensterinhalt gelöscht und die Operation oben im Fenster fort­
- gesetzt.
-
-
-PROC menuwindowline:
-
- wirkt wie: menuwindowline (1)
-
-
-#ib#menuwindowout#ie#
-PROC menuwindowout (TEXT CONST text):
-
-Zweck: Mit der Prozedur können innerhalb des aktuellen Menufensters Texte
- ausgegeben werden. Sollen INTEGER- oder REAL-Werte ausgegeben wer­
- den, müssen diese zunächst in Texte konvertiert werden. Ist der Text
- länger als die verbleibende Restzeile innerhalb des aktuellen Menufen­
- sters, so wird der Text bis zum Fensterende (rechts) ausgegeben und die
- Ausgabe am Anfang der nächsten Zeile fortgesetzt. Sobald die letzte Posi­
- tion des aktuellen Menufensters (unten rechts in der Fensterecke) be­
- schrieben wurde, wird der Fensterinhalt gelöscht und die Ausgabe an der
- Position (1,1) des Fensters fortgesetzt.
-
-
-#ib#menuwindowpage#ie#
-PROC menuwindowpage:
-
-Zweck: Durch den Befehl 'menuwindowpage' wird der Inhalt des Fensters inner­
- halb des aktuellen Menus gelöscht (das "Menufenster") (vergleichen Sie
- auch 'show menuwindow'). Der Rahmen des Fensters (der bei 'show
- menuwindow' ausgegeben wurde), bleibt bestehen, da er nicht mit zum
- eigentlichen Fenster gehört. Durch den Befehl wird der Menubildschirm
- nicht rekonstruiert! Soll das Fenster geschlossen werden, ist der Befehl
- 'regenerate menuscreen' zu geben.
-
-
-#ib#menuwindowshow#ie#
-PROC menuwindowshow (TEXT CONST dateiname):
-
-Zweck: Vergl. 'menuwindowedit'-Prozedur. Die Datei 'dateiname' kann nicht
- schreibend verändert werden.
-
-
-PROC menuwindowshow (FILE VAR f):
-
-Zweck: Vergl. obige 'menuwindowshow'-Prozedur. Die Datei 'f' muß mit der
- Verarbeitungsart 'modify' assoziiert worden sein.
-
-
-#ib#menuwindowstop#ie#
-PROC menuwindowstop (INT CONST zeilenzahl):
-
-Zweck: Innerhalb des Menufensters werden 'zeilenzahl' Zeilenwechsel vorge­
- nommen und der Text " Zum Weitermachen bitte irgendeine Taste tip­
- pen!" ausgegeben. Danach wird so lange gewartet, bis eine Taste getippt
- wird.
-
-
-PROC menuwindowstop:
-
- wirkt wie: menuwindowstop (2)
-
-
-#ib#menuyes#ie#
-BOOL PROC menuyes (TEXT CONST frage,
- INT CONST position):
-
-Zweck: Die Prozedur dient dazu, innerhalb des Menus eine Ja/Nein-Entscheidung
- des Benutzers einzuholen. Im Gegensatz zur Standardprozedur 'yes'
- arbeitet diese Prozedur unabhängig davon, ob der Kommandodialog ein-
- oder ausgeschaltet ist. Auf dem Bildschirm wird innerhalb des Menus eine
- Box ausgegeben. Boxbreite und -höhe werden vom System automatisch
- anhand der übergebenen 'frage' festgelegt. Der in 'frage' übergebene Text
- wird um ein Fragezeichen (?) ergänzt und innerhalb der Box angezeigt.
- Der Text muß den gs-DIALOG-Syntax-Regeln (sehen Sie Kap. 5.13)
- entsprechen. In der letzten Zeile der ausgegebenen Box erscheint der Text
- "Ja    Nein". Die Prozedur 'menuyes' liefert TRUE, wenn mit 'Ja' geantwor­
- tet wurde und FALSE, wenn mit 'Nein' geantwortet wurde (durch Tippen
- der Anfangsbuchstaben oder Positionierung auf die Antwort und ab­
- schließendes <RETURN>). Der Menubildschirm wird automatisch
- regeneriert. Mit 'position' wird die relative Lage der Box innerhalb des
- Menubildschirms festgelegt (1, 2, 3, 4, 5: sehen Sie dazu Kap. 5.12).
-
-
-#ib#no#ie#
-BOOL PROC no (WINDOW VAR w, TEXT CONST frage):
-
- wirkt wie: NOT yes (w, frage).
-
-
-#ib#not empty#ie#
-BOOL PROC not empty (THESAURUS CONST thes):
-
-Zweck: Dient der Prüfung, ob ein Thesaurus Namen enthält oder nicht. Die
- Prozedur liefert TRUE, wenn Namen in 'thes' enthalten sind, sonst FALSE.
-
-
-#ib#oberbegriff#ie#
-PROC oberbegriff (TEXT CONST punktname,
- startprocname,
- leaveprocname):
-
-Zweck: Der Befehl wird bei der Generierung von Menukarten benötigt. Mit diesem
- Befehl wird die Bezeichnung 'punktname' in die Kopfzeile des aktuell
- geöffneten Menus eingetragen. Die in 'startprocname' übergebene Proze­
- dur wird ausgeführt, bevor das zugehörige Pull-Down-Menu auf dem
- Bildschirm "ausgeklappt" wird; die in 'leaveprocname' übergebene Pro­
- zedur, wenn in ein anderes Pull-Down-Menu gewechselt wird (beachten
- Sie, daß die Prozedurnamen als Texte(!) übergeben werden).
-Fehler: Menukarte noch nicht geöffnet ('oeffne menukarte' fehlt).
- Menu noch nicht geöffnet ('oeffne menu' fehlt).
- Zu viele Oberbegriffe im Menu (> 10).
- Die Kopfzeile ist zu lang (> 70 Zeichen).
-
-
-PROC oberbegriff (TEXT CONST punktname):
-
- wirkt wie: oberbegriff (punktname, "", "")
-
-
-#ib#oeffne menu#ie#
-PROC oeffne menu (TEXT CONST menuname,
- einstiegsproc,
- ausstiegsproc, infotext1,
- infotext2, infotext3):
-
-Zweck: Der Befehl wird für die Generierung von Menukarten benötigt. Durch den
- Befehl wird innerhalb der Menukarte ein Menu mit dem Namen
- 'menuname' angelegt. Über diesen Namen kann das Menu auch später
- angesprochen werden (mit 'handle menu'). Die unter 'einstiegsproc'
- übergebene Prozedur wird bei der Aktivierung des Menus ausgeführt, die
- unter 'ausstiegsproc' übergebene Prozedur, wenn das Menu (mit
- <ESC><q>) verlassen wird (beachten Sie, daß die Prozedurnamen als
- Texte(!) übergeben werden!). In 'infotext1', 'infotext2' und 'infotext3'
- können Hinweise eingetragen werden, die bei Erscheinen des Menus auf
- dem Bildschirm für kurze Zeit in einer Box rechts unten angezeigt wer­
- den. Die Erstellung der Boxtexte ist an genaue Regeln gebunden (sehen
- Sie dazu Kap. 5.13). Sehen Sie auch bei 'schliesse menu'.
-
-
-PROC oeffne menu (TEXT CONST menuname,
- einstiegsproc,
- ausstiegsproc):
-
- wirkt wie: oeffne menu (menuname, einstiegsproc,
- ausstiegsproc, "", "", "")
-
-
-PROC oeffne menu (TEXT CONST menuname):
-
- wirkt wie: oeffne menu (menuname, "", "")
-
-
-#ib#oeffne menukarte#ie#
-PROC oeffne menukarte (TEXT CONST menukartenname):
-
-Zweck: Der Befehl wird bei der Generierung von Menukarten benötigt. Ein Pro­
- gramm zur Erstellung einer Menukarte muß immer mit diesem Befehl
- beginnen. Durch den Befehl wird ein Datenraum mit dem Namen
- 'gs-MENUKARTE:menukartenname' eingerichtet; der Wortbestandteil
- 'gs-MENUKARTE:' wird dabei automatisch vor den angegebenen Namen
- gesetzt (sehen Sie auch 'schliesse menukarte').
-Fehler: Eine Menukarte mit dem angegebenen Namen existiert bereits in der
- Task. Bei der Generierung wird dann angefragt, ob die alte Menukarte
- gelöscht werden darf.
-
-
-#ib#ohne praefix#ie#
-THESAURUS PROC ohne praefix (THESAURUS CONST thes,
- TEXT CONST praefix):
-
-Zweck: Liefert in einem Thesaurus alle Namen aus dem übergebenen Thesaurus
- 'thes', die mit dem Wortbestandteil 'praefix' beginnen. Bei den gelie­
- ferten Namen ist dieser führende Wortbestandteil entfernt.
-
-
-#ib#old menufootnote#ie#
-PROC old menufootnote:
-
-Zweck: Der aktuelle Text in der Fußzeile des aktuellen Menubildschirms wird
- durch den hier zuletzt vom System gesetzten Text überschrieben. Die
- Prozedur wird benutzt, um eine selbstgesetzte Fußnote (sehen Sie auch
- 'write menunotice') zu löschen.
-
-
-#ib#out#ie#
-PROC out (WINDOW VAR w, TEXT CONST text):
-
-Zweck: Vergl. 'menuwindowout'. Hier wird nur zusätzlich das Fenster festgelegt,
- das bei 'menuwindowout' automatisch gesetzt wird.
-
-
-#ib#out frame#ie#
-PROC out frame (WINDOW VAR fenster):
-
-Zweck: Um den durch 'fenster' angegebenen Bildschirmbereich wird ein Rahmen
- gezogen.
-
-
-#ib#out footnote#ie#
-PROC out footnote (WINDOW VAR fenster,
- TEXT CONST textzeile):
-
-Zweck: In der untersten Zeile des Fensters 'fenster' wird 'textzeile' ausgegeben, in
- der vorletzten Zeile eine Trennzeile. Sehen Sie auch 'erase footnote'.
-
-
-#ib#page#ie#
-PROC page (WINDOW VAR fenster,
- BOOL CONST mit rahmen):
-
-Zweck: Der durch 'fenster' beschriebene Fensterbereich wird gelöscht. Hat 'mit
- rahmen' den Wert TRUE, wird der Rahmenbereich ebenfalls gelöscht.
-
-
-PROC page (WINDOW VAR fenster):
-
- wirkt wie: page (fenster, FALSE).
-
-
-#ib#put#ie#
-PROC put (WINDOW VAR w, TEXT CONST text):
-
- wirkt wie: out (w, text + " ")
-
-
-PROC put (WINDOW VAR w, INT CONST zahl):
-
- wirkt wie: put (w, text (zahl))
-
-
-PROC put (WINDOW VAR w, REAL CONST zahl):
-
- wirkt wie: put (w, text (zahl))
-
-
-#ib#putline#ie#
-PROC putline (WINDOW VAR w, TEXT CONST text):
-
- wirkt wie: put (w, text); line (w)
-
-
-#ib#regenerate menuscreen#ie#
-PROC regenerate menuscreen:
-
-Zweck: Der Befehl wird verwendet, um den Menubildschirm (z.B. nach der
- Nutzung für anwendungsbezogene Ausgaben) in seinem letzten Zustand
- zu reproduzieren. Der Bildschirm wird gelöscht. Anschließend wird der
- aktuelle Menubildschirm vollständig neu aufgebaut - auch bei geschach­
- telten Menus. (sehen Sie auch 'refresh submenu')
-
-
-#ib#refresh submenu#ie#
-PROC refresh submenu:
-
-Zweck: Der Befehl dient dazu, das aktuelle Pull-Down-Menu (z.B. nach Über­
- schreiben) und ggf. eine gesetzte Menunotiz erneut auf den Bildschirm zu
- schreiben. Betroffen ist nur der Bereich zwischen den Trennlinien der
- Kopf- und Fußzeile. Für das vorausgehende Löschen verwendeter Bild­
- schirmbereich ist der Programmierer verantwortlich. Im Gegensatz zu
- 'regenerate menuscreen' findet hier kein kompletter Bildschirmaufbau
- statt. Wenn möglich, dann ist dieser Befehl dem Befehl 'regenerate
- menuscreen' wegen des geringeren Zeitaufwandes vorzuziehen.
-
-
-#ib#remaining lines#ie#
-INT PROC remaining lines (WINDOW VAR w):
-
-Zweck: Die Prozedur liefert die Anzahl der Zeilen im Fenster 'w', die noch
- zwischen Cursor und unterer Fenstergrenze vorhanden sind.
-
-
-#ib#remaining menuwindowlines#ie#
-INT PROC remaining menuwindowlines
-
-Zweck: Die Prozedur liefert die Anzahl der Zeilen im aktuellen Menufenster, die
- noch zwischen Cursor und unterer Fenstergrenze vorhanden sind.
-
-
-#ib#reset dialog#ie#
-PROC reset dialog:
-
-Zweck: Das Menusystem wird in den Anfangszustand versetzt. (Keine Menukarte
- angekoppelt; Anzahl der geöffneten Menus: 0)
-
-
-#ib#schliesse menu#ie#
-PROC schliesse menu:
-
-Zweck: Der Befehl wird bei der Generierung von Menukarten benötigt. Durch den
- Befehl wird ein Menu in einer Menukarte abgeschlossen (sehen Sie auch
- 'oeffne menu')
-
-
-#ib#schliesse menukarte#ie#
-PROC schliesse menukarte
-
-Zweck: Der Befehl wird bei der Generierung von Menukarten benötigt. Durch den
- Befehl wird eine Menukarte abgeschlossen (sehen Sie auch 'oeffne
- menukarte')
-
-
-#ib#senkrecht#ie#
-TEXT PROC senkrecht:
-
- Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als senkrechter
- Strich (�) ausgegeben wird.
-
-
-PROC senkrecht (TEXT CONST zeichen):
-
-Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
- stellung der "Kästen" als senkrechter Strich ausgegeben werden soll.
-
-
-#ib#show#ie#
-PROC show (WINDOW VAR fenster):
-
-Zweck: Das Fenster 'fenster' wird auf dem Bildschirm angezeigt (das Fenster
- muß zuvor durch 'window' initialisiert worden sein). Um den angegebe­
- nen Fensterbereich wird automatisch ein Rahmen gezogen. Der Rahmen
- gehört nicht zum Fenster dazu! (Soll das Fenster ohne Rahmen ausgege­
- ben werden, dann muß der Befehl 'page' verwendet werden.) Der Bereich
- innerhalb des Rahmens (Fensterbereich) wird gelöscht.
-
-
-#ib#show#ie#
-PROC show (WINDOW VAR w, TEXT CONST dateiname):
-
-Zweck: Vergl. 'menuwindowshow'. Hier wird nur zusätzlich das Fenster festgelegt,
- das bei 'menuwindowshow' automatisch gesetzt wird.
-
-
-PROC show (WINDOW VAR w, FILE VAR f):
-
-Zweck: Vergl. 'menuwindowshow'. Hier wird nur zusätzlich das Fenster festgelegt,
- das bei 'menuwindowshow' automatisch gesetzt wird.
-
-
-#ib#show menuwindow#ie#
-PROC show menuwindow:
-
-Zweck: Durch den Befehl 'show menuwindow' wird ein entsprechender Rahmen
- innerhalb des Menubildschirms ausgegeben und der Bereich innerhalb
- dieses Rahmens (das Fenster) gelöscht (sehen Sie auch 'menuwindow­
- page'). Innerhalb des Fensters können anschließend verschiedene Opera­
- tionen ausgeführt werden. Auf die Größe des Menufensters kann kein
- Einfluß genommen werden - sie wird selbständig vom System gesetzt
- ("normales" Menu: 77 Zeichen breit und 20 Zeichen hoch; geschachteltes
- Menu 71 Zeichen breit und 16 Zeichen hoch).
-
-
-#ib#stdinfoedit#ie#
-PROC stdinfoedit (TEXT CONST dateiname):#u#(*)#e#
-Zweck: Löscht den Bildschirm und bietet die Datei 'dateiname' in einem festge­
- legten zum Editieren an. In der Fußzeile wird die Information "Info:
- <ESC><?>  Verlassen: <ESC><q>" angezeigt. Nach Tippen von
- <ESC><?> werden Editorinformationen in den Bildschirm einge­
- blendet.
-
-
-PROC stdinfoedit (FILE VAR f):#u#(*)#e#
-Zweck: Wie obige 'stdinfoedit'-Prozedur'. Die Datei 'f' muß mit der Verarbei­
- tungsart 'modify' assoziiert worden sein.
-
-
-PROC stdinfoedit (TEXT CONST dateiname,
- INT CONST oberste zeile):#u#(*)#e#
-Zweck: Wie obige Prozedur (die wie 'stdwinfoedit (w, 1)' wirkt). Allerdings kön­
- nen bis zu zwei Zeilen oben auf dem Bildschirm unbenutzt bleiben (z.B.
- um die Kopfzeile des Menus weiterhin anzuzeigen). 'oberste zeile' gibt an,
- welche Bildschirmzeile die erste von dieser Prozedur benutzte ist
- (1<= oberste zeile<=3).
-
-
-PROC stdinfoedit (FILE VAR f,
- INT CONST oberste zeile):#u#(*)#e#
-Zweck: Wie obige 'stdinfoedit'-Prozedur'. Die Datei 'f' muß mit der Verarbei­
- tungsart 'modify' assoziiert worden sein.
-
-
-#ib#stop#ie#
-PROC stop (WINDOW VAR w, INT CONST zeilenzahl):
-
-Zweck: Vergl. 'menuwindowstop'. Hier wird nur zusätzlich das Fenster festgelegt,
- das bei 'menuwindowstop' automatisch gesetzt wird.
-
-
-PROC stop (WINDOW VAR w):
-
- wirkt wie: stop (w, 1).
-
-
-#ib#testinstallation#ie#
-PROC testinstallation (TEXT CONST menutafelname):
-
-Zweck: Die Menutafel mit dem Namen 'menutafelname' (muß mit dem
- 'gs-MENUKARTE:' beginnen!) wird als aktuelle Menutafel an gs-DIALOG
- gekoppelt. Durch den Befehl wird die angegebene Menutafel zur Task
- 'gs-MENUAKRTEN' geschickt. Dem Namen wird zur Kennzeichnung noch
- der Taskname der Sendertask angehängt (dadurch können sich bei
- Multi-User-Betrieb verschiedene Anwender mit gleichen Menukarten­
- namen nicht stören). Die Menukarte wird anschließend in jedem Fall
- "frisch" angekoppelt. Außerdem bleibt die Menukarte (als benannter
- Datenraum) in der Task erhalten!
- (Mit dem Befehl 'handle menu' kann nun ein Menu aus der Menukarte
- zur Ausführung gebracht werden oder mit 'anwendungstext' auf in die
- Menukarte ausgelagerte Texte zugegriffen werden.)
- Hinweis: Von Zeit zu Zeit muß der Systembetreuer die überflüssigen
- Menukarten aus der Task 'gs-MENUKARTEN' entfernen, da die Anwender
- aus Ihrer Task die Karten nicht löschen können!
-Fehler: 'menutafelname' gibt es nicht!
- 'menutafelname' hat falsche(n) Typ/Bezeichnung (keine
- gs-MENUKARTE)!
-
-
-#ib#trennlinie#ie#
-PROC trennlinie:
-
-Zweck: Der Befehl wird bei der Generierung von Menukarten benötigt. Durch den
- Befehl wird unter dem aktuellen Oberbegriff eine Trennlinie zur opti­
- schen Trennung einzelner Menupunkte eingetragen. Die Trennlinie belegt
- den gleichen Platz wie eine Verarbeitungsfunktion.
-Fehler: Zu viele Menupunkte in einem Pull-Down-Menu (maximal 15 incl. der
- Trennlinien!).
-
-
-#ib#textprozedur#ie#
-PROC textprozedur (TEXT CONST dateiname,
- prozedurname):
-
-Zweck: Der Befehl wird benötigt, um Texte entsprechend der gs-DIALOG-Syntax
- aufzuarbeiten. Der in die Datei 'dateiname' geschrieben Text wird bear­
- beitet. Die Prozedur eignet sich insbesondere dafür, Informationstexte
- aufzuarbeiten, die zu den einzelnen Menufunktionen ausgegeben werden,
- wenn der Benutzer die Tastenfolge <ESC><?> tippt (sehen Sie auch
- 'textzeile'). Der aufbereitete Text steht anschließend in der Datei 'datei­
- name.a'. Der Text ist in eine Textprozedur "verpackt", die den Namen hat,
- der als zweiter Parameter übergeben wird.
- Die Zeilen werden dabei so zugeschnitten, daß Sie in einer Box in das
- aktuelle Menu eingeblendet werden können. Boxbreite und -höhe werden
- automatisch gesetzt (max. 65 Zeichen breit und 14 Zeichen hoch)); die
- Zeilen werden geblockt, sofern in der Datei keine Absatzmarkierung
- (<RETURN>) am Ende der Zeile vorhanden ist. Soll eine Zeile zentriert
- werden, so muß als erstes Zeichen der Zeile das Zeichen '%' notiert sein -
- die Zeile muß durch eine Absatzmarke abgeschlossen sein. Textpassagen,
- die invers (markiert) dargestellt werden sollen, müssen duch das Zeichen
- '$' eingeleitet und durch das Zeichen '&' abgeschlossen werden. Markier­
- te Textpassagen dürfen (nach dem Zuschnitt!) nicht über Zeilengrenzen
- hinausgehen!
-Fehler: Datei 'dateiname' existiert nicht!
- Fonttabelle 'fonttab.gs-Menu-Generator' existiert nicht! (Fonttabelle von
- gs-Menu-Generator-Diskette in die Task 'configurator' laden!)
- Text ist zu lang - bitte kürzen! (Text darf in aufbereiteter Form maximal
- 14 Zeilen umfassen!)
- Zeilenformatierung mit <ESC> abgebrochen!
-
-
-
-#ib#textzeile#ie#
-PROC textzeile (TEXT CONST dateiname):
-
-Zweck: Der Befehl wird benötigt, um Texte entsprechend der gs-DIALOG-Syntax
- aufzuarbeiten. Der in die Datei 'dateiname' geschrieben Text wird bear­
- beitet. Die Prozedur eignet sich insbesondere dafür, anwendungsbezogene
- Texte aufzuarbeiten, die in die Menukarte ausgelagert werden sollen
- (sehen Sie auch 'textprozedur'). Der aufbereitete Text steht anschließend
- in der Datei 'dateiname.a' in einer Zeile notiert.
-
-
-#ib#waagerecht#ie#
-TEXT PROC waagerecht:
-
-Zweck: Liefert das Zeichen, das bei der Darstellung der "Kästen" als waagerechter
- Strich (̇) ausgegeben wird.
-
-
-PROC waagerecht (TEXT CONST zeichen):
-
-Zweck: Durch diese Prozedur kann das Zeichen festgelegt werden, das bei Dar­
- stellung der "Kästen" als waagerechter Strich ausgegeben werden soll.
-
-
-#ib#window#ie#
-WINDOW PROC window (INT CONST x, y, xsize, ysize):
-
-Zweck: Einer Fenstervariablen (WINDOW VAR name) wird die Lage und Größe
- zugeordnet (über den Zuweisungsoperator ':='). Gleichzeitig wird das
- Fenster initialisiert.
- Mit den ersten beiden Parametern wird die Lage der linken oberen Ecke
- des Fensters bestimmt (x: Spalte; y: Zeile). Mit 'xsize' wird die Fenster­
- breite, mit 'ysize' die Fensterhöhe festgelegt.
- Das Fenster wird noch nicht(!) angezeigt (sehen Sie dazu 'show' und
- 'page'). Ein Rahmen wird nicht zum Fenster gezählt; er kann aber mit
- der Prozedur 'show' ausgegeben werden. Ein Fenster darf nicht breiter als
- 80 und höher als 24 Zeichen sein. Umrahmte Fenster unterliegen weite­
- ren Einschränkungen (sehen Sie auch 'show'). Ein Fenster muß min­
- destens 6 Zeichen breit und 3 Zeichen hoch sein.
-Fehler: 'Window' ungültig
-
-
-#ib#write menunotice#ie#
-PROC write menunotice (TEXT CONST notiztext,
- INT CONST position):
-
-Zweck: Die Prozedur dient dazu, innerhalb des Menus in einer Box einen "dauer­
- haften Informationstext" auszugeben. Die Box bleibt nämlich so lange
- bestehen, bis sie explizit gelöscht (sehen Sie auch 'erase menunotice')
- oder durch einen neuen Notiztext überschrieben wird. Wenn der Bild­
- schirm durch gs-DIALOG-Prozeduren überschrieben wird, wird die
- Menunotiz ebenfalls ständig mitaufgefrischt und auch, wenn der Befehl
- 'regenerate menuscreen' oder 'refresh submenu' gegeben wird (Sehen Sie
- im Gegensatz dazu auch 'menuinfo' ("kurzzeitiger Informationstext").
- Im Menubildschirm erscheint der 'infotext' in einer Box. Boxbreite und
- -höhe werden vom System automatisch anhand des übergebenen 'notiz­
- text'es festgelegt. 'notiztext' muß den gs-DIALOG-Syntax-Regeln (sehen Sie
- Kap. 5.13) entsprechen. Mit 'position' wird die relative Lage der Box
- innerhalb des Menubildschirms festgelegt (1, 2, 3, 4, 5: sehen Sie dazu
- Kap. 5.12). In einem Menu kann zu einem Zeitpunkt nur eine Menunotiz
- abgelegt werden. Durch ein erneutes 'write menunotice' wir eine beste­
- hende Menunotiz überschrieben.
-
-
-#ib#yes#ie#
-BOOL PROC yes (WINDOW VAR w, TEXT CONST frage):
-
-Zweck: Vergl. 'menuwindowyes'. Hier wird nur zusätzlich das Fenster festgelegt,
- das bei 'menuwindowyes' automatisch gesetzt wird.
-
-
diff --git a/doc/menugenerator/menu-generator handbuch.impressum b/doc/menugenerator/menu-generator handbuch.impressum
deleted file mode 100644
index 404826d..0000000
--- a/doc/menugenerator/menu-generator handbuch.impressum
+++ /dev/null
@@ -1,88 +0,0 @@
-____________________________________________________________________________
-
-
-#on("b")##on ("u")#
-#center#Betriebssystem E U M E L
-#off ("u")#
-
-
-#center#ls Menü-Generator
-
-
-
-
-#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#
-
-#free (4.0)##on("b")#
-#center#gs-Menu-Generator
-
-
-#center#Benutzerhandbuch
-
-
-#center#Version 1.0
-
-
-#off("b")##center#copyright
-#center#Eva Latta-Weber
-#center#Software- und Hardware-Systeme, 1988
-#center#ERGOS GmbH, 1990
-#page#
-#block#
-#center#____________________________________________________________________________
-
-
-Copyright:  ERGOS GmbH   März 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.
-
-
-#center#____________________________________________________________________________
-
-Es kann keine Gewähr übernommen werden, daß das Programm für eine
-bestimmte Anwendung geeignet ist. Die Verantwortung dafür liegt beim
-Anwender.
-
-Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrektheit und
-Vollständigkeit der Angaben kann keine Gewähr übernommen werden. Das
-Handbuch kann jederzeit ohne Ankündigung geändert werden.
-
-Texterstellung :  Dieser Text wurde mit der ERGOS-L3 Textverarbeitung
- erstellt und aufbereitet und auf einem Kyocera Laser­
- drucker gedruckt.
-
-
-
-
-#center#___________________________________________________________________________
-
-
-
-Ergonomic Office Software GmbH
-
-Bergstr. 7 Telefon: (02241) 63075
-5200 Siegburg Teletex: 2627-2241413=ERGOS
- Telefax: (02241) 63078
-
-
-#center#____________________________________________________________________________
-
diff --git a/doc/menugenerator/menu-generator handbuch.index b/doc/menugenerator/menu-generator handbuch.index
deleted file mode 100644
index 0aacd97..0000000
--- a/doc/menugenerator/menu-generator handbuch.index
+++ /dev/null
@@ -1,258 +0,0 @@
-#block##pageblock#
-#pagenr("%",1)##setcount(1)##count per page#
-#headeven#
-gs-Menu-Generator
-#center#____________________________________________________________
-
-#end#
-#headodd#
-#right#gs-Menu-Generator
-#center#____________________________________________________________
-
-#end#
-#bottomeven#
-#center#____________________________________________________________
-I - % #right#ERGOS
-#end#
-#bottomodd#
-#center#____________________________________________________________
-ERGOS #right# I - %
-#end#
-Index
-
-
-activate 5 - 28
-activate 8 - 1
-anwendungstext 4 - 13
-anwendungstext 8 - 2
-areax 8 - 2
-areaxsize 8 - 2
-areay 8 - 2
-areaysize 8 - 2
-balken links 8 - 2
-balken oben 8 - 3
-balken rechts 8 - 3
-balken unten 8 - 3
-boxalternative 8 - 4
-boxalternative 7 - 10
-boxanswer 8 - 4
-boxanswer 7 - 9
-boxanswerone 8 - 4
-boxanswerone 7 - 10
-boxanswersome 8 - 5
-boxanswersome 7 - 10
-boxinfo 8 - 5
-boxinfo 7 - 9
-boxno 8 - 5
-boxno 7 - 10
-boxnotice 8 - 6
-boxnotice 7 - 10
-boxone 8 - 6
-boxone 7 - 10
-boxsome 8 - 6
-boxsome 7 - 10
-boxyes 8 - 7
-boxyes 7 - 10
-center 8 - 7
-center 7 - 8
-clear buffer 8 - 7
-clear buffer and count 8 - 7
-current menuwindow 8 - 8
-cursor 8 - 8
-cursor 7 - 6
-cursor off 8 - 8
-cursor off 5 - 6
-cursor off 5 - 2
-cursor on 8 - 8
-cursor on 5 - 6
-cursor on 5 - 2
-deactivate 8 - 9
-deactivate 5 - 28
-direktstart 8 - 9
-ecke oben links 8 - 10
-ecke oben rechts 8 - 10
-ecke unten links 8 - 10
-ecke unten rechts 8 - 10
-edit 8 - 11
-edit 7 - 6
-editget 8 - 11
-erase 7 - 5
-erase 8 - 11
-erase footnote 8 - 12
-erase footnote 7 - 11
-erase menunotice 8 - 12
-erasemenunotice 5 - 15
-get 8 - 12
-get 7 - 7
-get cursor 8 - 13
-get cursor 7 - 6
-getline 7 - 7
-getline 8 - 13
-get menuwindowcursor 5 - 21
-get menuwindowcursor 8 - 13
-handle menu 3 - 2
-handle menu 8 - 13
-infix namen 8 - 14
-infix namen 5 - 26
-install menu 3 - 2
-install menu 4 - 3
-install menu 8 - 14
-invers 8 - 15
-kreuz 8 - 15
-line 8 - 15
-line 7 - 6
-menualternative 8 - 15
-menualternative 5 - 12
-menuanswer 8 - 17
-menuanswer 5 - 2
-menuanswerone 8 - 17
-menuanswerone 5 - 8
-menuanswersome 5 - 8
-menuanswersome 8 - 18
-menu archiv checken 8 - 18
-menu archiv checken 6 - 4
-menu archiv grundeinstellung 6 - 4
-menu archiv grundeinstellung 8 - 18
-menu archiv holen 8 - 19
-menu archiv holen 6 - 4
-menu archiv initialisieren 8 - 19
-menu archiv initialisieren 6 - 4
-menu archiv loeschen 8 - 19
-menu archiv loeschen 6 - 4
-menu archiv neue diskette 8 - 19
-menu archiv neue diskette 6 - 4
-menu archiv reservieren 6 - 4
-menu archiv reservieren 8 - 19
-menu archiv reservierung aufgeben 6 - 4
-menu archiv reservierung aufgeben 8 - 19
-menu archiv schreibcheck 8 - 20
-menu archiv schreibcheck 6 - 4
-menu archiv schreiben 6 - 4
-menu archiv schreiben 8 - 20
-menu archiv verzeichnis 8 - 20
-menu archiv verzeichnis 6 - 4
-menu archiv verzeichnis drucken 6 - 4
-menu archiv verzeichnis drucken 8 - 20
-menu archiv zieltask einstellen 6 - 4
-menu archiv zieltask einstellen 8 - 20
-menu dateien aufraeumen 8 - 21
-menu dateien aufraeumen 6 - 6
-menu dateien drucken 6 - 6
-menu dateien drucken 8 - 21
-menu dateien kopieren 6 - 6
-menu dateien kopieren 8 - 22
-menu dateien loeschen 8 - 22
-menu dateien loeschen 6 - 6
-menu dateien speicherplatz 6 - 6
-menu dateien speicherplatz 8 - 22
-menu dateien umbenennen 8 - 23
-menu dateien umbenennen 6 - 6
-menu dateien verzeichnis 6 - 6
-menu dateien verzeichnis 8 - 23
-menufootnote 5 - 17
-menufootnote 8 - 23
-menufunktion 4 - 6
-menufunktion 8 - 24
-menuinfo 5 - 4
-menuinfo 8 - 24
-menukartenname 8 - 25
-menuno 8 - 25
-menuno 5 - 10
-menuone 5 - 6
-menuone 8 - 25
-menusome 5 - 7
-menusome 8 - 26
-menuwindowcenter 8 - 26
-menuwindowcenter 5 - 23
-menuwindowcursor 5 - 21
-menuwindowcursor 8 - 27
-menuwindowedit 8 - 27
-menuwindowedit 5 - 19
-menuwindoweditget 8 - 27
-menuwindoweditget 5 - 22
-menuwindowget 8 - 28
-menuwindowget 5 - 22
-menuwindowline 8 - 28
-menuwindowline 5 - 21
-menuwindowno 5 - 22
-menuwindowout 5 - 22
-menuwindowout 8 - 28
-menuwindowpage 8 - 29
-menuwindowpage 5 - 20
-menuwindowshow 5 - 19
-menuwindowshow 8 - 29
-menuwindowstop 5 - 23
-menuwindowstop 8 - 29
-menuwindowyes 5 - 22
-menuyes 5 - 10
-menuyes 8 - 30
-no 8 - 30
-no 7 - 7
-not empty 5 - 27
-not empty 8 - 30
-oberbegriff 8 - 31
-oberbegriff 4 - 5
-oeffne menu 8 - 31
-oeffne menu 4 - 3
-oeffne menukarte 8 - 32
-oeffne menukarte 4 - 3
-ohne praefix 5 - 26
-ohne praefix 8 - 32
-oldmenufootnote 5 - 17
-old menufootnote 8 - 32
-out 7 - 7
-out 8 - 33
-out footnote 7 - 11
-out footnote 8 - 33
-out frame 8 - 33
-out frame 7 - 5
-page 8 - 33
-page 7 - 11
-page 7 - 5
-page up 7 - 11
-put 8 - 33
-put 7 - 7
-putline 8 - 34
-putline 7 - 7
-refresh submenu 5 - 18
-refresh submenu 8 - 34
-regenerate menuscreen 8 - 34
-regenerate menuscreen 5 - 18
-regenerate menuscreen 5 - 4
-remaining lines 8 - 34
-remaining lines 7 - 6
-remaining menuwindowlines 5 - 21
-remaining menuwindowlines 8 - 34
-reset dialog 8 - 35
-schliesse menu 4 - 3
-schliesse menu 8 - 35
-schliesse menukarte 8 - 35
-schliesse menukarte 4 - 3
-senkrecht 8 - 35
-show 8 - 35
-show 7 - 5
-show 8 - 36
-show 7 - 6
-show menuwindow 8 - 36
-show menuwindow 5 - 20
-stdinfoedit 8 - 36
-stop 7 - 8
-stop 8 - 37
-testinstallation 8 - 37
-testinstallation 4 - 3
-textprozedur 4 - 8
-textprozedur 8 - 38
-text zeile 4 - 13
-textzeile 8 - 39
-trennlinie 4 - 6
-trennlinie 8 - 38
-waagerecht 8 - 39
-WINDOW 7 - 2
-window 7 - 4
-window 8 - 40
-write menunotice 8 - 40
-write menunotice 5 - 15
-yes 7 - 7
-yes 8 - 41
-
-
diff --git a/doc/menugenerator/menu-generator handbuch.inhalt b/doc/menugenerator/menu-generator handbuch.inhalt
deleted file mode 100644
index 8b1aef4..0000000
--- a/doc/menugenerator/menu-generator handbuch.inhalt
+++ /dev/null
@@ -1,72 +0,0 @@
-#type ("elite.lq")##limit (11.5)##pagelength (16.5)##pageblock#
-#start (1.8,0.0)#
-#type ("prop.breit.lq")#
-Inhaltsverzeichnis
-#type ("elite.lq")#
-
-
-1 Was kann ls-Menu-Generator 3
-
-2 Installation von ls-Menu-Generator 6
-2. 1 Voraussetzungen 6
-2. 2 Lieferumfang 6
-2. 3 Installation 7
-
-3 Die Arbeitsweise von ls-DIALOG 8
-3. 1 Ankoppeln einer Menukarte/ 8
- Ausführen eines Menus
-3. 2 Aufbau/Inhalt einer Menukarte 11
-
-4. Erstellen einer neuen Menukarte 13
-4. 1 Eintragen der Menupunkte 13
-4. 2 Erstellung und Einbinden von 20
- Informationstexten
-4. 3 Auslagerung von anwendungsbezogenen 24
- Texten in die Menukarte
-
-5. Dialoge innerhalb des Menus 27
-5. 1 Eingabe eines Textes/Namens 28
-5. 2 Ausgabe einer Information 31
-5. 3 Auswahl eines Namen durch Ankreuzen 32
-5. 4 Auswahl mehrerer Namen durch Ankreuzen 34
-5. 5 Eingabe eines Textes/Namens - alternativ: 35
- Auswahl durch Ankreuzen
-5. 6 Die Ja/Nein - Entscheidung 37
-5. 7 Die Alternativentscheidung 39
-5. 8 Die Menunotiz 43
-5. 9 Fußzeilen im Menu 44
-5.10 Wiederherstellung des Menubildschirms 46
-5.11 Arbeiten im Menufenster 47
-5.11.1 Datei anzeigen/editieren 48
-5.11.2 Menufenster öffnen/anzeigen 48
-5.11.3 Menufenster löschen(putzen) 49
-5.11.4 Positionierungen im Menufenster 49
-5.11.5 Informationen über die aktuelle 50
- Menu-Fensterposition
-5.11.6 Aus-/Eingabe innerhalb des Menufensters 51
-5.11.7 Weitere Prozeduren 52
-5.12 Festlegung der Boxpositionen innerhalb 53
- des Menus
-5.13 ls-DIALOG-Syntax 54
- (Regeln zur Erstellung von Texten)
-5.14 Thesaurushandling 55
-5.15 Aktivieren/Deaktivieren von Menupunkten 57
-
-6. Einbinden der Datei- und Archivoperationen 59
-6. 1 Einbinden der Archivoperationen 60
-6. 2 Einbinden der Dateioperationen 65
-
-7. Eigene Fenster und Fensteroperationen 66
-7. 1 Definition von Fenstern 67
-7. 2 Anzeigen/Löschen von Fenstern 70
-7. 3 Operationen innerhalb des Fensters 71
-7. 3.1 Datei anzeigen/editieren 71
-7. 3.2 Positionierungen im Fenster 72
-7. 3.3 Ein- und Ausgaben innerhalb des Fensters 73
-7. 3.4 Weitere Prozeduren 74
-7. 4 Boxoperationen 75
-
-8. Kurzbeschreibung der Befehle 78
-
-9. Register 125
-
diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Inhaltsverzeichnis b/doc/mp-bap/A5 - Doku: gs-MP BAP - Inhaltsverzeichnis
deleted file mode 100644
index 9507802..0000000
--- a/doc/mp-bap/A5 - Doku: gs-MP BAP - Inhaltsverzeichnis
+++ /dev/null
@@ -1,50 +0,0 @@
-#limit (11.5)##pagelength (16.5)##pageblock#
-#start (1.8,0.0)#
-Inhaltsverzeichnis
-
-
-1 Was kann gs-MP BAP 3
-
-2 Allgemeines zum Simulationsprogramm 6
-2.1 Entstehung 6
-2.2 Beschreibung des Programmkerns 7
- - ein Simulationslauf
-2.3 Das Teilprogramm 'Materialprüfung' 9
-2.4 Das Teilprogramm 'Bildschirmarbeitsplatz' 10
-2.5 Hinweise zum Einsatz des Programmsystems 12
-2.6 Erfahrungen mit dem Programmsystem 13
-2.7 Hinweise auf Arbeitsmaterial 14
-
-3 Installation von gs-MP BAP 16
-3.1 Voraussetzungen 16
-3.2 Lieferumfang 16
-3.3 Installation 17
-3.4 Organisation des Task - Systems 19
-3.5 Direktstart des Systems 20
-
-4 Eine kleine Beispielsitzung 22
-4.1 Aufruf von 'Bildschirmarbeitsplatz' (BAP) 22
-4.2 Einstellung von Simulationsparametern 23
-4.3 Ein Simulationslauf 26
-4.4 Die Simulationsauswertung/das Protokoll 28
-4.5 Hinweise zur Protokollauswertung 36
-4.5.1 Der Bewertungsfaktor 36
-4.5 2 Fehlerzeichenhäufigkeit in den Werkstücken 38
-4.5 3 Fehlerhafte Auswertungen 38
-
-5 Beschreibung der Menufunktionen 40
-5.1 Kurzhinweise zur Bedienung der Menus 40
-5.2 Menufunktionen z. Oberbegriff 'Simulation' 44
-5.3 Menufunktionen z. Oberbegriff 'Parameter' 48
-5.4 Menufunktionen z. Oberbegriff 'Konfiguration' 56
-5.5 Menufunktionen z. Oberbegriff 'Dateien' 58
-5.6 Menufunktionen z. Oberbegriff 'Archiv' 60
-
-6 Hinweise für den Systembetreuer 61
-
-
-
-
-
-
-
diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 1 b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 1
deleted file mode 100644
index e418764..0000000
--- a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 1
+++ /dev/null
@@ -1,119 +0,0 @@
-#type ("12.lq")##limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (3)#
-#headodd#
-#center#gs-MP BAP#right#%
-
-#end#
-#headeven#
-%#center#gs-MP BAP
-
-#end#
-#center#1
-
-#center#Was
-#center#kann
-#center#gs-MP BAP
-
-
- #on("b")#gs-MP BAP#off("b")# ist ein Programm, mit dem die Arbeit
-an einem Bildschirmarbeitsplatz unter ganz unter­
-schiedlichen Aspekten simuliert werden kann. Vom
-Benutzer wird dabei verlangt, eine Art "Kontrolltä­
-tigkeit am Bildschirm" auszuüben. Während dieser
-Arbeit werden Daten über den Arbeitsverlauf erfaßt,
-die (später) ausgewertet werden können.
- #on("b")#gs-MP BAP#off("b")# ist so gestaltet, daß es für ganz un­
-terschiedliche Zwecke eingesetzt werden kann. Es
-ist möglich, sämtliche Simulationsparameter den
-eigenen Wünschen und der jeweiligen Situation an­
-zupassen. Daneben besteht die Möglichkeit, die Si­
-mulationsprotokolle offensichtlich oder "heimlich"
-zu erfassen.
- #on("b")#gs-MP BAP#off("b")# kann dazu benutzt werden, um Anwendern
-lediglich die Belastungen eines Bildschirmarbeits­
-platzes an einem Beispiel darzulegen; es ist aber
-genauso möglich, ihm eindrucksvoll aufzuzeigen, wie
-eine Kontrolle am Bildschirmarbeitsplatz - ohne
-sein Wissen - erfolgen kann. Auf der Basis dieser
-Erfahrungen lassen sich dann ganz neue Fragestel­
-lungen thematisieren (Möglichkeiten/Befugnis der/
-zur Kontrolle am (Bildschirm-) Arbeitsplatz; Daten­
-schutz; Betriebsvereinbarungen zu Computerarbeits­
-plätzen und vieles mehr).
- Durch die Möglichkeit, die Simulationsparameter
-vielfältig zu variieren, können verschiedenste Un­
-tersuchungen mit dem Programm durchgeführt werden:
-Angefangen von Untersuchungen zur Konzentrations­
-fähigkeit bei unterschiedlichen Umgebungsbedingun­
-gen (z.B. Lichtverhältnisse, Musik am Arbeitsplatz,
-etc.), über Untersuchungen zum optimalen Arbeits­
-phasen - Pausen - Rhythmus (z.B. zur Fragestellung,
-ob lange Arbeitsphasen mit langen Pausen günstiger
-sind als kurze Arbeitsphasen mit immer wieder ein­
-gestreuten kleineren Pausen oder umgekehrt - wenn
-die Gesamtzeit konstant ist), bis hin zu Untersu­
-chungen zur Ergonomie von Computerarbeitsplätzen
-(z.B. hinsichtlich der Tastaturbelegung, Nützlich­
-keit eines eigenen Cursorblockes, etc.).
- Anhand der aufgezeigten Möglichkeiten wird
-sicher deutlich, daß der Einsatz des Programms
-nicht auf den Informatikunterricht beschränkt ist.
-Ebensogut ist, bei entsprechender Fragestellung,
-ein Einsatz im gesellschafts- / sozialwissenschaft­
-lichen Unterricht, im Biologieunterricht, in den
-kaufmännischen Lernbereichen oder im Technikunter­
-richt denkbar. Das Programm ist auch für die Aufar­
-beitung verschiedener Fragestellungen bei der Vor-
-und Nachbereitung von Betriebspraktika geeignet.
- Um all diese Möglichkeiten auch den Ausbildern
-offenzuhalten, die keinerlei Vorerfahrungen mit
-Computern haben, aber dieses Programm einsetzen
-möchten, ist die Simulationsumgebung so komforta­
-bel, daß jeder Benutzer innerhalb weniger Minuten
-das gesamte Programmsystem überblicken und bedienen
-kann.
-
-- Durch die Einbettung in die komfortable Benut­
- zerschnittstelle #on("b")#gs-DIALOG#off("b")#, sind nur noch wenige
- Betriebssystemkommandos zur Bedienung des Sy­
- stems notwendig.
-
-- Der Benutzer kann jederzeit Informationen über
- die Bedienung des Menusystems und die Wirkung
- der einzelnen Menufunktionen anfordern, die ihm
- daraufhin in den aktuellen Bildschirm eingeblen­
- det werden.
-
-- Dem Benutzer wird ständig angezeigt, welche Mög­
- lichkeiten der Bedienung bestehen, welche Tasten
- wirksam sind und welche Wirkung deren Betätigung
- hat. Menufunktionen, deren Wirkungen zu bestimm­
- ten Zeitpunkten sinnlos oder fehlerhaft wären,
- werden "inaktiviert", d.h. sind dem Benutzer gar
- nicht erst zugänglich.
-
-- Die Auswertung der Simulationsprotokolle erfolgt
- vom Menu aus durch einfaches Ankreuzen der ge­
- wünschten Protokolldateien. Es besteht sowohl
- die Möglichkeit, die Auswertungen auf dem Bild­
- schirm anzeigen als auch über den Drucker ausge­
- ben zu lassen.
-
-- Die Festlegung der Simulationsparameter ist kin­
- derleicht. Die aktuell eingestellten Werte kön­
- nen jederzeit eingesehen werden. Zur Einstellung
- werden umfangreiche Informationen und Hilfen
- ausgegeben. Eine Fehlbedienung ist ausgeschlos­
- sen.
-
-- In das System ist eine komfortable Archivbehand­
- lung integriert, so daß auch für den Computer­
- laien die Konservierung der Simulationsergebnis­
- se auf einfachste Weise möglich ist.
-
-- Bei auftretenden Fehlern erhält der Benutzer
- konkrete, verständliche Fehlermeldungen, die
- zumeist mit einem Zusatz versehen sind, wie die
- "Situation bereinigt werden kann".
-
diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 2 b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 2
deleted file mode 100644
index b063ea3..0000000
--- a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 2
+++ /dev/null
@@ -1,302 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (6)#
-#headodd#
-#center#gs-MP BAP#right#%
-
-#end#
-#headeven#
-%#center#gs-MP BAP
-
-#end#
-#center#2
-
-#center#Allgemeines
-#center#zum
-#center#Simulationsprogramm
-
-
-2.1 Entstehung
-
- Das Simulationsprogramm #on("b")#gs-MP BAP#off("b")# basiert auf
-einer Idee von Hartmut Spenn und Mene Wolf, die
-eine Unterrichtsreihe mit dem Titel "Der gläserne
-Arbeiter" im Rahmen der Materialien zur Lehrerfort­
-bildung in Nordrhein Westfalen (Neue Technologien,
-informations- und kommunikationstechnologische In­
-halte im Wahlpflichtunterricht der Klassen 9/10)
-beschrieben und dazu ein Grundprogramm für den C64
-in COMAL geschrieben haben.
- Dieses Grundprogramm diente einmal als Ausgangs­
-punkt für #on("b")#gs-MP BAP#off("b")#. Allerdings wuchsen die An­
-sprüche an das System immer mehr, so daß eine Reihe
-weiterer Funktionen hinzugefügt wurden. Ein wesent­
-liches Ziel war es, ein Simulationsprogramm zur
-Verfügung zu stellen, daß umfangreiche Variations­
-möglichkeiten - ohne jegliche Programmierkenntnisse
-- bietet; ein Programm, das selbst von einem völli­
-gen Computerlaien innerhalb weniger Minuten über­
-blickt und sicher bedient werden kann.
-
- Erst als die komfortable Benutzerschnittstelle
-#on("b")#gs-DIALOG#off("b")# zur Verfügung stand, konnte dieses Ziel
-erreicht werden. Heute präsentiert sich Ihnen ein
-Programmsystem, in dem Sie jede Programmfunktion
-von einem Menu aus wählen können. Durch Informa­
-tionstexte, die Sie jederzeit abrufen können, und
-durch die Bedienungshinweise werden Sie sicher
-durch das Programmsystem geführt. Sie haben komfor­
-table Möglichkeiten, die Simulationsparameter zu
-variieren. Das Programmsystem ist gegen Fehlbedie­
-nungen mehrfach abgesichert.
-
-
-2.2 Beschreibung des Programmkerns
- - ein Simulationslauf
-
- Mit #on("b")#gs-MP BAP#off("b")# kann die Arbeit an einem Bild­
-schirmarbeitsplatz simuliert werden. Der Benutzer
-übt am Bildschirm eine Art "Kontrolltätigkeit" aus.
-Die Interpretation dieser Tätigkeit ist offen: So
-kann man sich vorstellen, daß "Werkstücke" auf dem
-Bildschirm angezeigt werden, die auf Fehler hin
-untersucht werden sollen; dabei muß jeder gefundene
-Fehler markiert werden. Der Benutzer kann sich auch
-vorstellen, er sei bei einer Tageszeitung beschäf­
-tigt und habe die aus der Redaktion eingehenden
-Artikel auf Tippfehler hin zu untersuchen - natür­
-lich müssen die Tippfehler "verbessert" werden.
-Andere Interpretationen sind denkbar.
- Das Grundprinzip des Simulationslaufes ist recht
-einfach - ein typischer Bildschirm könnte so ausse­
-hen:
-#free (9.5)#
- Im oberen Bereich des Bildschirms werden alle
-Daten angezeigt, die der Benutzer während des Simu­
-lationslaufes benötigt. Links oben sind alle Tasten
-angegeben, die für die Handhabung des Programms
-notwendig sind. Rechts oben wird der Benutzer über
-die Simulationszeiten und das festgelegte 'Fehler­
-zeichen' informiert.
- Im unteren Bereich des Bildschirms wird ein
-rechteckiger Block ausgegeben, der sich aus ver­
-schiedenen Zeichen (z.B. Buchstaben, Ziffern, Son­
-derzeichen) zusammensetzt. Der Benutzer hat jetzt
-die Aufgabe, die Blöcke daraufhin zu untersuchen,
-ob in ihnen das angegebene Fehlerzeichen auftaucht.
- Entdeckt er solche Zeichen im Block auf dem
-Bildschirm, so ist es seine Aufgabe, den Cursor
-(Lichtfleck) auf dem Bildschirm mit Hilfe festge­
-legter Tasten an die entsprechende Position zu
-steuern und eine 'Ausbesserung' (Kennzeichnung/
-Korrektur) vorzunehmen. Ist der Benutzer der Mei­
-nung, alle Fehlerzeichen bearbeitet zu haben, so
-kann er den nächsten Block (das nächste Werkstück/
-den nächsten Artikel) durch Tippen einer festgeleg­
-ten Taste anfordern.
- Die Arbeit ist dabei streng in 'Arbeitsphasen'
-und 'Pausen' eingeteilt - der Rhythmus wird aber
-vom Programm und nicht vom Benutzer bestimmt. Wäh­
-rend des Simulationslaufes werden alle wesentlichen
-Kenndaten protokolliert. Diese können später ausge­
-wertet werden.
- In unserem konkreten Beispiel hat der Benutzer
-nach dem Fehlerzeichen 'F' zu suchen. Er hat insge­
-samt 34 Minuten zu arbeiten; dabei ist seine Ar­
-beitszeit eingeteilt in 3 Arbeitsphasen zu je 10
-Minuten mit zwei dazwischenliegenden Pausen von je
-2 Minuten.
- Zur Bedienung des Systems kann er die (Cursor-)
-Pfeiltasten <rechts>, <links>, <hoch> und <runter>
-benutzen; damit kann er den Lichtfleck innerhalb
-des Zeichen-Blocks bewegen. Zur Ausbesserung dient
-die <HOP>-Taste. Mit der <ESC>-Taste kann er je­
-weils die neuen Werkstücke (Artikel) zur Bearbei­
-tung anfordern.
-
-
-2.3 Das Teilprogramm 'Materialprüfung' (MP)
-
- Gemeinsamer Bestandteil beider Programmteile ist
-der sogenannte "Simulationslauf" - ein eben ge­
-schilderter Arbeitsprozeß am Bildschirm. Diesem
-Simulationslauf gehen im Teilprogramm 'Materialprü­
-fung' (MP) jedoch noch umfangreiche Informationen
-voraus, die dem Benutzer die anschließend zu ver­
-richtende Tätigkeit detailliert erläutern. Gleich
-nach Aufruf des Programmteils wird der Benutzer
-noch nach einer "Identifikation" gefragt und aufge­
-fordert, z.B. den Vor- und Nachnamen einzugeben.
-Die hier eingegebene Kennung ist auch Bestandteil
-des Namens des Protokolls, das über den dann fol­
-genden Simulationslauf angelegt wird.
- Am Ende des Simulationslaufes wird dem Benutzer,
-sofern das System entsprechend konfiguriert ist,
-eine 'Kurzauswertung' seiner Arbeit auf dem Bild­
-schirm präsentiert. Zusätzlich wird - ohne daß der
-Benutzer es merkt - das angelegte Protokoll in die
-Vatertask geschickt und in der eigenen Task ge­
-löscht.
-
-
-2.4 Das Teilprogramm 'Bildschirmarbeitsplatz'
- (BAP)
-
- Nach Aufruf des Teilprogramms erscheint auf dem
-Bildschirm ein Menu, von dem aus eine Vielzahl von
-Funktionen gewählt werden kann. Natürlich ist es
-auch von hier aus möglich, einen oben beschriebenen
-Simulationslauf zu starten. Im Gegensatz zum Pro­
-grammteil 'Materialprüfung' wird hier aber auf die
-umfangreichen Informationen zur Handhabung des
-Systems verzichtet und zum Abschluß auch keine Pro­
-tokolldatei zur Vatertask geschickt - die Proto­
-kolldatei verbleibt in der eigenen Task.
- Daneben können vom Menu aus auch Protokolldatei­
-en ausgewertet werden. Sie können dabei noch ent­
-scheiden, ob Sie die Auswertungen auf dem Bild­
-schirm angezeigt oder aber auf dem angeschlossenen
-Drucker ausgegeben haben möchten.
- Weiterhin können Sie sämtliche Simulationspara­
-meter vom Menu aus Ihren Wünschen gemäß einstellen.
-So ist es möglich, die Breite und Höhe des Werk­
-stücks zu variieren und zu entscheiden, ob die
-Werkstücke "normal" oder "invers" dargestellt wer­
-den sollen. Sie können das 'Fehlerzeichen' festle­
-gen und überhaupt die Zeichen bestimmen, aus denen
-die Werkstücke aufgebaut werden. Daneben haben Sie
-noch die Möglichkeit, zu bestimmen, welche Tasten
-auf der Tastatur welche Funktion beim Simulations­
-lauf haben sollen.
- Sie legen von hier aus auch fest, in wie viele
-Arbeitsphasen die Arbeitszeit unterteilt wird und
-wie lange eine einzelne Arbeitsphase und die zwi­
-schen den Arbeitsphasen liegende Pause dauern sol­
-len. Auch hinsichtlich der Bewertung können Sie
-Festlegungen treffen - nach dem von Ihnen hier ein­
-gestellten Wertungsschlüssel werden nämlich die
-Protokolldateien ausgewertet.
- Ihnen obliegt es auch, zu bestimmen, ob mit je­
-der Protokollauswertung die umfangreichen Erläute­
-rungen ausgegeben werden sollen und ob der Benutzer
-am Ende eines Simulationslaufes eine 'Kurzauswer­
-tung' über seine Arbeit auf dem Bildschirm erhalten
-soll oder nicht.
- Zusätzlich werden Ihnen noch eine Reihe von Mög­
-lichkeiten zur Datei- und Archivbehandlung angebo­
-ten. So können Sie komfortabel Dateien löschen,
-kopieren, umbenennen, etc., Dateien auf Diskette
-konservieren oder gespeicherte Dateien von dort
-holen und vieles mehr.
-
-
-2.5 Hinweise zum Einsatz des Programmsystems
-
- Aus den Beschreibungen in 2.3 und 2.4 ist Ihnen
-sicher schon die unterschiedliche Absicht, die hin­
-ter den beiden Programmteilen steckt, klar gewor­
-den. Die beiden Programmteile richten sich nämlich
-auch an ganz unterschiedliche Nutzergruppen.
- Das Teilprogramm 'Materialprüfung' (MP) ist vor­
-nehmlich für den 'unerfahrenen'/'unbefangenen' Be­
-nutzer gedacht. Ihm werden nämlich umfangreiche
-Informationen ausgegeben. Mit diesem Programmteil
-ist eben auch die "heimliche" Erfassung der Simula­
-tionsdaten möglich. Dieser Teil des Programms wird
-sicherlich dann Anwendung finden, wenn die Fragen
-um die Möglichkeiten und Gefahren der Kontrolle am
-(Bildschirm-) Arbeitsplatz im Vordergrund der Be­
-trachtungen stehen.
- Das Teilprogramm 'Bildschirmarbeitsplatz' (BAP)
-hat zumindest zwei ganz unterschiedliche Einsatz­
-aspekte:
-
- Einerseits dient es dem Lehrer/Ausbilder dazu,
-die gewünschten Simulationsparameter für das Teil­
-programm 'Materialprüfung' einzustellen. Die aktu­
-elle Einstellung, die mit dem Teilprogramm 'Bild­
-schirmarbeitsplatz' getroffen wurde, ist in der
-jeweilgen Task gültig, in der die Einstellung vor­
-genommen wurde. Die Einstellung wird aber auch von
-allen Sohntasks übernommen, die sich nach der je­
-weiligen Einstellung neu anmelden. Darüber hinaus
-dient dieses Teilprogramm dem Lehrer/Ausbilder
-dazu, die (ihm zugestellten) Simulationsprotokolle
-auszuwerten.
- Andererseits hat das Teilprogramm 'Bildschirm­
-arbeitsplatz' auch einen "eigenen Charakter":
-Gerade bei den schon oben angesprochenen Untersu­
-chungen (zur Konzentrationsfähigkeit in Abhängikeit
-von verschiedenen Faktoren, zur Bedeutung der Ar­
-beitsphasen-Pausen-Rhythmen, zur 'Ergonomie am Ar­
-beitsplatz', etc.) bietet sich hier ein schneller,
-komfortabler Wechsel zwischen Parametereinstellung
-und Simulationsläufen - ohne unnötigen Zeitverlust;
-erst recht, wenn mehrere Simulationsläufe aufeinan­
-der folgen.
-
-
-2.6 Erfahrungen mit dem Programmsystem
-
- Das Programmsystem wurde bereits in verschiede­
-nen Klassen/ Kursen ab der Jahrgangsstufe 8 einge­
-setzt, und zwar in verschiedenen Fachbereichen und
-Schulformen. Die Akzeptanz ist sehr hoch; die Hand­
-habung des Programmsystems bereitete selbst Kolle­
-gen, die noch nie zuvor an einem Computer gesessen
-hatten, keinerlei Schwierigkeiten. Von der Hand­
-habung des Programms her ist deshalb sicher auch
-keine Alteruntergrenze hinsichtlich der "Eignung"
-anzugeben.
- Jedoch scheint eine Bearbeitung mit den oben
-angegebenen Zielsetzungen erst auf dem Erfahrungs­
-horizont der Jahrgangsstufe 8 sinnvoll zu sein.
-Eine Bearbeitung der Fragestellungen in der von
-Hartmut Spenn und Mene Wolf (siehe Kapitel 2.7)
-vorgeschlagenen Tiefe scheint allerdings erst am
-Ende der Jahrgangsstufe 9 bzw. in der Jahrgangsstu­
-fe 10 erreichbar.
- Besonders interessant scheint der Einsatz bei
-der Vor- bzw. Nachbereitung von Betriebspraktika zu
-sein. Durch die unmittelbare Berührung mit den
-"neuen Technologien am Arbeitsplatz" ist das Inter­
-esse an der Bearbeitung entsprechender Fragestel­
-lungen sehr hoch und eine Sensibilisierung für die
-angesprochenen Problematiken zu erreichen.
- Die angegebenen Fragestellungen im Zusammenhang
-mit diesem Programmsystem können auch Thema einer
-Projektwoche/von Projekttagen sein. Besonders be­
-währt hat sich hier die Zusammenarbeit mit Kollegen
-aus dem gesellschafts-/sozialwissenschaftlichen
-Bereich. Ein Unterrichtsgang, z.B. in einen Super­
-markt mit modernen Scannerkassen, bei einer Tages­
-zeitung (Kleinanzeigenaufnahme am Freitag-Vormit­
-tag) o.ä., bei dem die "im Hintergrund (möglicher­
-weise) ablaufenden Prozesse" bewußt gemacht werden,
-kann das Vorhaben noch abrunden.
- Zum Einsatz in der Sekundarstufe II liegen erst
-wenige Erfahrungen vor. Mit Sicherheit bietet das
-Programm einen "anderen", interessanten Einstieg in
-den Informatikunterricht der Jahrgangsstufe 11 und
-kann auch bei der Aufarbeitung entsprechender Fra­
-gestellungen zu späteren Zeitpunkten herangezogen
-werden. Erfahrungen aus anderen Fachbereichen lie­
-gen (noch) nicht vor.
-
-
-2.7 Hinweise auf Arbeitsmaterial
-
- Ausdrücklich sei an dieser Stelle auf die Ausar­
-beitung von Hartmut Spenn und Mene Wolf hingewie­
-sen:
-
-Spenn, Hartmut; Wolf, Mene; Der gläserne Arbeiter,
- Elektronische Leistungs- und Verhaltenskon­
- trolle am Arbeitsplatz
- in: Landesinstitut für Schule und Weiterbildung
- (Hrsg.), Materialien zur Lehrerfortbildung
- in Nordrhein-Westfalen, Heft 4, Neue Tech­
- nologien - Informations- und Kommunuika­
- tionstechnologische Inhalte im Wahlpflicht­
- unterricht der Klassen 9/10, Soest, 1986.
-
diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 3 b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 3
deleted file mode 100644
index f589a93..0000000
--- a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 3
+++ /dev/null
@@ -1,237 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block##pageblock#
-#start (2.0,0.0)#
-#page (16)#
-#headodd#
-#center#gs-MP BAP#right#%
-
-#end#
-#headeven#
-%#center#gs-MP BAP
-
-#end#
-#center#3
-
-#center#Installation
-#center#von
-#center#gs-MP BAP
-
-
- Bevor Sie #on("b")#gs-MP BAP#off("b")# auf Ihrem Computer benutzen
-können, müssen Sie das Programm zunächst installie­
-ren. Wenn #on("b")#gs-MP BAP#off("b")# auf Ihrem System schon zur Ver­
-fügung steht, können Sie dieses Kapitel ruhig über­
-springen.
-
-
-3.1 Voraussetzungen
-
- Um #on("b")#gs-MP BAP#off("b")# auf Ihrem Computer betreiben zu
-können, muß das EUMEL-Betriebssystem installiert
-sein. #on("b")#gs-MP BAP#off("b")# setzt die Multi-User-Version voraus
-und ist lauffähig ab Version 1.7.5. #on("b")#gs-MP BAP#off("b")# setzt
-weiterhin voraus, daß auf Ihrem Computer bereits
-das Programm #on("b")#gs-DIALOG#off("b")# installiert ist.
-
-
-3.2 Lieferumfang
-
- #on("b")#gs-MP BAP#off("b")# wird auf einer Diskette geliefert, die
-alle notwendigen Programme enthält (die Installa­
-tion von #on("b")#gs-DIALOG#off("b")# wird dabei vorausgesetzt!). Um
-den Inhalt der Diskette feststellen zu können,
-starten Sie Ihr System und bringen es dazu, daß
-'gib kommando:' erscheint. Dann legen Sie die Dis­
-kette ein und geben das Kommando:
-
- archive("gs-MP BAP");list(archive);
- release(archive) <RETURN>
-
- Anschließend erscheint eine Übersicht der auf
-dem Archiv vorhandenen Programme. Folgende Program­
-me sollten sich in der Ãœbersicht befinden:
-
- "gs-MP BAP 1"
- "gs-MP BAP 2"
- "gs-MENUKARTE:MP-BAP"
- "gs-MP BAP/gen"
-
- Eventuell können noch weitere Namen auf der Dis­
-kette vorhanden sein. Wenn Sie den Inhalt der Dis­
-kette kontrolliert haben und diese Programme auf
-der Diskette vorhanden sind, können Sie #on("b")#gs-MP BAP#off("b")#
-installieren.
- Sollten Sie statt der Übersicht eine Fehlermel­
-dung erhalten, überprüfen Sie bitte, ob die Disket­
-te das richtige Format besitzt oder ob Ihr Disket­
-tenlaufwerk Probleme macht. Sollten dagegen Pro­
-gramme fehlen, so reklamieren Sie die Diskette.
-
-
-3.3 Installation
-
- #on("b")#gs-MP BAP#off("b")# muß in einer Task installiert werden,
-in der bereits das Programm #on("b")#gs-DIALOG#off("b")# zur Verfügung
-steht. Alle Söhne und Enkel der neuen Task können
-anschließend auf die Programme (Materialprüfung /
-Bildschirmarbeitsplatz) zugreifen. Richten Sie also
-eine Task als Sohn der Task ein, in der auf Ihrem
-Computer bereits #on("b")#gs-DIALOG#off("b")# installiert ist. Wir
-nehmen hier an, daß #on("b")#gs-DIALOG#off("b")# in der Task 'MENU'
-installiert ist und die neue Task den Namen 'MP
-BAP' erhalten soll. (Sie können für die Task auch
-einen beliebigen anderen Namen wählen):
-
-#on("b")#
- <SV> (Supervisor - Taste)
-#off("b")#
-
- --> gib supervisor kommando:
-#on("b")#
- begin ("MP BAP","MENU") <RETURN>
-#off("b")#
-
- --> gib kommando:
-
- (Arbeiten mehrere Personen mit dem Computer,
-dann ist es sinnvoll, diese Task vor unbefugtem
-Zugriff durch ein Passwort zu schützen. Wie das
-gemacht wird, können Sie in Ihrem EUMEL-Benutzer­
-handbuch erfahren.)
-
- Legen Sie dann die Archivdiskette ein, auf der
-sich #on("b")#gs-MP BAP#off("b")# befindet, und geben Sie das folgende
-Kommando:
-
-#on("b")#
- archive("gs-MP BAP") <RETURN>
-
- fetch("gs-MP BAP/gen",archive) <RETURN>
-
- run <RETURN>
-#off("b")#
-
- Sie haben damit das Generatorprogramm gestartet.
-Beantworten Sie die Frage, ob Sie das Archiv ange­
-meldet und die Diskette eingelegt haben, mit 'ja'
-durch Tippen der Taste <j>.
- Daraufhin wird die Installation automatisch
-durchgeführt. Lassen Sie während des gesamten Vor­
-gangs die Archivdiskette eingelegt. Sie erhalten
-einen Hinweis, wenn die Diskette entnommen werden
-kann! Die Generierung ist beendet, wenn der EUMEL-
-Eingangsbildschirm erscheint. Die Task, in der die
-Generierung stattfindet, wird automatisch zur Mana­
-gertask, das heißt, daß Söhne von ihr eingerichtet
-werden können.
- Richten Sie sich gleich eine Sohntask (z.B mit
-dem Namen 'mp bap') ein, dann können Sie das System
-sofort ausprobieren. Gehen Sie dazu folgendermaßen
-vor:
-
-#on("b")#
- <SV> (Supervisor - Taste)
-#off("b")#
-
- --> gib supervisor kommando:
-#on("b")#
- begin ("mp bap","MP BAP") <RETURN>
-#off("b")#
-
- --> gib kommando:
-
-Mit dem Kommando
-
-#center##on("b")#mp <RETURN> bzw. bap <RETURN>#off("b")#
-
-können Sie nun das Programm
-
-#center#'Materialprüfung' bzw. 'Bildschirmarbeitsplatz'
-
-aufrufen.
-
-
-3.4 Organisation des Task - Systems
-
- Wollen Sie unter anderem das Teilprogramm 'Ma­
-terialprüfung' (MP) nutzen, so sollten Sie beden­
-ken, daß die dabei entstehenden Simulationsproto­
-kolle in die Vatertask geschickt werden. Die Vater­
-task sollte sich daher ständig im Wartezustand be­
-finden, um die Protokolle auch aufnehmen zu können.
-So kann es sinnvoll sein, eine 'Zwischentask' ein­
-zurichten, damit auch andere ungestört mit dem Si­
-mulationsprogramm arbeiten können. Gehen Sie dazu
-etwa folgendermaßen vor:
- In der Task 'mp bap', in der Sie bisher gearbei­
-tet haben, geben Sie bei 'gib kommando:' den Be­
-fehl:
-
- #on("b")#global manager <RETURN>#off("b")#
-
- Sie gestatten dadurch, daß Söhne dieser Task
-eingerichtet werden können. Auf dem Bildschirm er­
-scheint der EUMEL-Eingangsbildschirm.
- Alle Anwender (Schüler) melden sich dann als
-Sohn der Task 'mp bap' an:
-
- #on("b")#begin ("Anwender1", "mp bap") <RETURN>#off("b")#
- #on("b")#begin ("Anwender2", "mp bap") <RETURN>#off("b")#
- #on("b")#begin ("Anwender3", "mp bap") <RETURN>#off("b")#
- ...
-
- Die Simulationsprotokolle finden Sie dann an­
-schließend in der Task 'mp bap'.
-
-
-3.5 Direktstart des Systems
- (Steht erst ab gs-DIALOG Version 1.1 zur Ver­
- fügung)
-
- In den Kapitel 3.3/3.4 haben wir Ihnen gezeigt,
-wie sie Sohntasks einrichten und hier durch das
-Kommando 'mp' bzw. 'bap' das System aufrufen kön­
-nen. Wenn Sie immer nur mit einer Modellvariante
-arbeiten oder vor dem Benutzer die 'gib komman­
-do:'-Ebene verbergen wollen, können Sie das System
-auch so einrichten, daß sich sofort nach Einrichten
-des Arbeitsbereichs das Menusystem meldet. Für den
-Anfänger kann das die Arbeit durchaus erleichtern.
- Gehen Sie dazu in die Task, unterhalb der die
-Sohntasks eingerichtet werden sollen:
-
-#on("b")#
- <SV> (Supervisor - Taste)
-
-#off("b")#
- --> gib supervisor kommando:
-#on("b")#
- continue ("mp bap") <RETURN>
-#off("b")#
-
- --> gib kommando:
-#on("b")#
- direktstart ("mp", TRUE) <RETURN>
-#off("b")#
-
- Durch das Kommando haben Sie festgelegt, daß
-sich alle Sohntasks direkt mit dem Programm 'Mate­
-rialprüfung' melden. Möchten Sie lieber mit 'Bild­
-schirmarbeitsplatz' arbeiten, ist nur 'mp' durch
-'bap' zu ersetzen. In diesem Falle meldet sich das
-System gleich mit dem BAP-Menu.
- Durch den zweiten Parameter 'TRUE' legen Sie
-fest, daß in den Sohntasks nach Verlassen des Menus
-die jeweilige Task automatisch gelöscht wird. Statt
-'TRUE' können Sie hier auch den Wert 'FALSE' ein­
-tragen. Dann wird nach Verlassen des Menus ange­
-fragt, ob die Task gelöscht werden soll. Wird die
-Frage bejaht, wird gelöscht - sonst wird die Task
-abgekoppelt (break) und kann durch 'continue' wie­
-der angekoppelt werden.
- Anmerkung: In der Task, in der Sie das Kommando
-'direktbefehl' gegeben haben, sollte nicht das Kom­
-mando 'monitor' gegeben werden, da Sie durch dieses
-Kommando auch diese Task zu einer Task machen, die
-sich direkt mit dem Menu meldet und ggf. bei Ver­
-lassen des Menus automatisch gelöscht wird!
-
diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 4 b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 4
deleted file mode 100644
index 6236d91..0000000
--- a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 4
+++ /dev/null
@@ -1,638 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block##pageblock#
-#start (2.0,0.0)#
-#page (22)#
-#headodd#
-#center#gs-MP BAP#right#%
-
-#end#
-#headeven#
-%#center#gs-MP BAP
-
-#end#
-#center#4
-
-#center#Eine
-#center#kleine
-#center#Beispielsitzung
-
-
-4.1 Aufruf von 'Bildschirmarbeitsplatz' (BAP)
-
- Wenn Sie, wie in Kapitel 3 beschrieben, eine
-Sohntask der Task eingerichtet haben, in der #on("b")#gs-MP
-BAP#off("b")# installiert ist, und dort bei 'gib kommando:'
-den Befehl:
-
- #on("b")#bap <RETURN>#off("b")#
-
-geben, erscheint - nach dem #on("b")#gs-DIALOG#off("b")#-Eingangsbild­
-schirm - das folgende Menu:
-
-#on("b")#
-BAP: Simulation Parameter Konfiguration Dateien Archiv
-+-------------------------------+-----------------------------------------
-| s Simulation ausführen |
-| --------------------------- |
-| a Auswertung auf Bildschirm |
-| d Drucken von Auswertungen |
-+-------------------------------+
-
-
-
-
-
-
-
-
-
---------------------------------------------------------------------------
-Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
-#off("b")#
-
-4.2 Einstellung von Simulationsparametern
-
- Bevor Sie eine Neueinstellung von Simulations­
-parametern vornehmen, sollten Sie sich einen Über­
-blick über die zur Zeit eingestellten Werte ver­
-schaffen. Zwar wäre es möglich, gleich einen Simu­
-lationslauf zu starten, doch müßten Sie dann gleich
-34 Minuten arbeiten - denn standardmäßig ist das
-Simulationssystem auf 3 Arbeitsphasen von je 10
-Minuten Dauer und zwei dazwischenliegende Pausen
-von je 2 Minuten eingestellt.
- Wenn Sie sich die Einstellung anzeigen lassen
-wollen, müssen Sie das Pull-Down-Menu wechseln.
-Gehen Sie als durch Tippen der Pfeiltaste <rechts>
-zum Oberbegriff 'Parameter'. Dadurch wird das fol­
-gende Pull-Down-Menu aufgeschlagen:
-
-#on("b")#
-BAP: Simulation Parameter Konfiguration Dateien Archiv
--------+---------------------------+--------------------------------------
- | e Einstellung anzeigen |
- | s Standardwerte |
- | ----------------------- |
- | b Breite des Werkstücks |
- | h Höhe des Werkstücks |
- | i Invers-/Normal |
- | z Zeichensatz |
- | f Fehlerzeichen |
- | t Tastenbelegung |
- | ----------------------- |
- | a Anzahl Arbeitsphasen |
- | d Dauer Arbeitsphase |
- | p Pausendauer |
- | ----------------------- |
- | w Wertungsschlüssel |
- +---------------------------+
-
---------------------------------------------------------------------------
-Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
-#off("b")#
-
-Nach Tippen der Taste <e> (für 'Einstellung anzei­
-gen') erscheint der folgende Bildschirm:
-
-#on("b")#
-+-----------------------------------++-----------------------------------+
-| || Wertungsschlüssel |
-| Breite : 15 Zeichen || Bewertungs- |
-| Höhe : 12 Zeichen || faktor |
-| Darstellung : normal || |
-| Zeichensatz : A...Z (26 Zeichen)||1.0| + |
-| Fehlerzeichen: F || | + |
-| || | + |
-| Nach rechts : <rechts> || | + |
-| Nach links : <links> || | + |
-| Nach oben : <hoch> ||0.5| + |
-| Nach unten : <runter> || | + |
-| Ausbesserung : <HOP> || | + |
-| Nächstes : <ESC> || | + |
-| || | + |
-| Anzahl der Arbeitsphasen: 3 ||0.0+--|--|--|--|--|--|--|--|--|--| |
-| Dauer einer Arbeitsphase: 10 min || 0.0 0.5 1.0|
-| Dauer einer Pause : 2 min || |
-| || Ausbesserungsrate|
-| Simulationsgesamtdauer : 34 min || |
-+-----------------------------------++-----------------------------------+
---------------------------------------------------------------------------
-Zum Weitermachen irgendeine Taste tippen!
-#off("b")#
-
- Oben links wird das "Aussehen" der Werkstücke
-auf dem Bildschirm beschrieben. Nach diesen Angaben
-sind die Werkstücke 15 Zeichen breit und 12 Zeichen
-hoch. Sie werden auf dem Bildschirm normal (nicht
-invers) dargestellt. Die Werkstücke werden aus den
-Großbuchstaben 'A ... Z' zusammengesetzt, wobei 'F'
-das Fehlerzeichen ist, nach dem gesucht werden
-soll.
- Der Cursor kann mit den Pfeiltasten (<rechts>,
-<links>, <hoch> und <runter>) innerhalb des Werk­
-stücks bewegt werden. Steht der Cursor auf einem
-Fehlerzeichen, so verschwindet es, wenn die <HOP>-
-Taste getippt wird. Nach Tippen der <ESC>-Taste
-erscheint das nächste Werkstück auf dem Bildschirm.
- Darunter sind die Informationen angegeben, die
-uns eigentlich interessieren: Die Anzahl/Zeiten für
-Arbeitsphasen und Pausen. Sie sollen die Simula­
-tionszeiten jetzt so verändern, daß die Gesamtsimu­
-lationszeit 3 Minuten beträgt. Wählen Sie dazu zu­
-erst die Menufunktion 'Anzahl Arbeitsphasen' durch
-Tippen der Taste <a>. Dann erscheint auf dem Bild­
-schirm folgendes Bild:
-
-#on("b")#
-+-------------------------++-------------------------------------------+
-| Informationen || Anzahl Arbeitsphasen festlegen: |
-| || |
-| Kleinster Wert: 2 || Anzahl Arbeitsphasen neu festlegen (j/n)? |
-| Größter Wert: 20 || |
-| || |
-| Eingestellter Wert: 3 || |
-+-------------------------++-------------------------------------------+
-
-
-
- +-------------------------------------+
- | Simulationszeiten: |
- | |
- | Anzahl der Arbeitsphasen: 3 |
- | Dauer einer Arbeitsphase: 10 min |
- | Dauer einer Pause : 2 min |
- | |
- | Simulationsgesamtdauer : 34 min |
- +-------------------------------------+
-
-
- Wenn Sie die im Fenster oben rechts gestellte
-Frage bejahen (Taste <j> tippen), ändert sich der
-Fensterinhalt:
-
-#on("b")#
-+-------------------------++---------------------------------------------+
-| Informationen || Anzahl Arbeitsphasen festlegen: |
-| || |
-| Kleinster Wert: 2 ||Mit den Pfeilen <hoch> und <runter> den Wert|
-| Größter Wert: 20 ||einstellen. Eingabe mit <RETURN> abschließen.|
-| || |
-| Eingestellter Wert: 3 ||Bitte die Anzahl der Arbeitsphasen: 3 |
-+-------------------------++---------------------------------------------+
-
- Bestimmt ist Ihnen schon klar, was zu tun ist:
-Mit der Pfeiltaste <runter> stellen Sie den
-kleinstmöglichen Wert (2) ein - anschließend tippen
-Sie die <RETURN>-Taste. Schauen Sie auf das Fenster
-ganz unten - jetzt hätten Sie nur noch 24 Minuten
-zu arbeiten. Bevor Sie die anderen Parameter ein­
-stellen, bestätigen Sie bitte, daß Sie mit der An­
-zahl der Arbeitsphasen einverstanden sind.
- Gehen Sie jetzt ebenso vor, um die 'Dauer (ei­
-ner) Arbeitsphase' und die 'Pausendauer' einzustel­
-len - eine Beschreibung dazu ist sicher überflüs­
-sig.
- Rechts im Fenster ist noch der 'Wertungsschlüs­
-sel' angegeben - seine Bedeutung erläutern wir aber
-erst in Zusammenhang mit der Auswertung der Simula­
-tionsprotokolle.
-
-
-4.3 Ein Simulationslauf
-
- So, jetzt können Sie zum Ausprobieren einen kur­
-zen Simulationslauf starten. Gehen Sie dazu zurück
-zum Pull-Down-Menu ganz links und wählen Sie hier
-die Menufunktion 'Simulation ausführen'. Zunächst
-werden Sie nach einer "Identifikation" gefragt.
-Geben Sie z.B. Ihren Namen ein und tippen Sie an­
-schließend die <RETURN>-Taste. Auf dem Bildschirm
-erscheinen oben alle Informationen, die Sie während
-der Simulation benötigen; darunter erscheint der
-Hinweis, daß mit dem nächsten Tastendruck die erste
-Arbeitsphase beginnt. Wenn das erste Werkstück auf
-dem Bildschirm erscheint, sieht das z.B. so aus:
-
-#on("b")#
-+-------------------------------+ +-------------------------------------+
-| Nach rechts : <rechts> | | Anzahl der Arbeitsphasen: 3 |
-| Nach links : <links> | | Dauer einer Arbeitsphase: 10 min |
-| Nach oben : <hoch> | | Dauer einer Pause : 2 min |
-| Nach unten : <runter> | | Simulationsgesamtdauer : 34 min |
-| Ausbesserung : <HOP> | | |
-| Nächstes : <ESC> | | Fehlerzeichen : F |
-+-------------------------------+ +-------------------------------------+
-
- GFMKLPDRFGTZQAL
- RTWOJLMNVWQHTRS
- PZBFVDDSWWAFGBD
- EWWQAKGHHJINMPA
- WSSDEKLJNHHGTFD
- GGTEWLVCXFFRPTR
- TREKGLMNTREFGTW
- TRWFGLMBVCCDSAQ
- HGFRWZTCXYAASWW
- MNNBHGTREWQKJLO
- CCXSDRFGHKLPOZR
- RWPPKHJUUZTFDSE
-
-
- Nun dürfen Sie einmal zeigen, was Sie können.
-Bitte achten Sie darauf, daß Sie in jeder Arbeits­
-phase mindestens ein Werkstück bearbeiten - sonst
-könnte es später zu Fehlern bei der Auswertung kom­
-men. Sie sollen sich ja auch nicht ausruhen, son­
-dern arbeiten!
- Pausen werden Ihnen auf dem Bildschirm ange­
-zeigt. Auch wenn Sie weiterarbeiten wollen - um die
-Pausen kommen Sie nicht herum! Am Ende einer Pause
-wird ein Hinweis auf das Pausenende ausgegeben.
- Nach der letzten Arbeitsphase erhalten Sie eine
-Kurzauswertung des aktuellen Simualtionslaufes auf
-den Bildschirm (wenn Ihnen das nicht gefällt, kön­
-nen Sie das später auch abschalten). Zur Erläute­
-rung der angegebenen Daten in der 'Kurzauswertung'
-sehen Sie bitte das folgende Kapitel.
-
-
-4.4 Die Simulationsauswertung/das Simulations­
- protokoll
-
- Wenn Sie wollen, können Sie das Protokoll, das
-über Ihre Arbeit angefertigt wurde, gleich auswer­
-ten lassen. Wählen Sie dazu die Menufunktion 'Aus­
-wertung auf Bildschirm' (im gleichen Pull-Down-
-Menu). Ihnen werden jetzt alle Protokolle, die sich
-in Ihrer Task befinden, zur Auswahl angeboten.
-Wahrscheinlich ist es zur Zeit nur eine Protokoll­
-datei.
- Jetzt sehen Sie auch, warum von Ihnen vor Simu­
-lationsbeginn eine "Identifikation" erbeten wurde.
-Sie ist Bestandteil des Protokollnamens - danach
-können Sie nämlich die Protokolle zuordnen. Verwen­
-den Sie mehrfach die gleiche Identifikation, so
-werden die Protokolle in der Reihenfolge ihrer An­
-lage durchnumeriert.
- Wenn Sie den/die Dateinamen angekreuzt haben
-(z.B. mit <RETURN>) und die Auswahl durch <ESC><q>
-verlassen, werden die angekreuzten Protokolldateien
-ausgewertet und anschließend auf dem Bildschirm
-angezeigt.
- Das Protokoll ist jeweils nach folgendem Schema
-aufgebaut: Zunächst werden Datum und Uhrzeit des
-Simulationslaufs ausgegeben; anschließend alle
-Kenndaten der Simulation, so daß daraus die gesamte
-Konfiguration des Simulationssystems rekonstruier­
-bar ist. Es folgt die "Gesamtauswertung" des Simu­
-lationslaufes, die identisch ist mit der auf dem
-Bildschirm angezeigten 'Kurzauswertung'. Die Ge­
-samtauswertung erfolgt nach den gleichen Grundsät­
-zen wie die sich anschließenden Auswertungen der
-einzelnen Werkstücke (es werden hier nur die ggf.
-angefallenen Pausenüberschreitung(en) mit in die
-Beurteilung einbezogen).
- Das Protokoll ist durch die angehängten Bemer­
-kungen nahezu selbsterklärend. Damit Sie sich einen
-Eindruck verschaffen können, haben wir auf den
-nächsten Seiten ein ausgewertetes Protokoll abge­
-druckt. Bitte studieren Sie es eingehend - insbe­
-sondere die Anmerkungen am Ende des Protokolls:
-
-
-
-
-
-
-#on("b")#
- gs-Protokoll: TEST - Auswertung
- ===============================
-Datum : 03.09.87 Uhrzeit (zu Beginn): 10:21
-
- Kenndaten der Werkstückbearbeitung:
- ===================================
-Nach rechts : <rechts> Anzahl der Arbeitsphasen: 3
-Nach links : <links> Dauer einer Arbeitsphase: 10 min
-Nach oben : <hoch> Dauer einer Pause : 2 min
-Nach unten : <runter> Simulationsgesamtdauer : 34 min
-Ausbesserung : <HOP>
-Nächstes : <ESC> Fehlerzeichen : F
-
-Werkstückbreite : 15 Zeichen
-Werkstückhöhe : 12 Zeichen
-Anzahl Zeichen pro Werkstück : 180 Zeichen
-Umfang des Zeichensatzes : A ... Z ( 26 Zeichen)
-
- Beispielwerkstück:
- ------------------
- QQSEUZSTABQBZWI
- UKZVNYPHCPLQMGH
- NDJZPCMOOPQQICL
- ARELRDKUOOZWOIE
- NASIPRLRQUKJHGN
- YJJVKIGWCJOLRTL
- FXSZBOBIBKQPYXN
- JJFKFMEVALZNDPU
- VTWWIHKWRMPMHZP
- CSSFZBOSACLARKQ
- WAAIMHJELLFKIWA
- XLNHUCZRVXOXHRL
-
-
-
- G e s a m t a u s w e r t u n g:
- ================================
-Anzahl der vollständig bearbeiteten Werkstücke : 51
-Anzahl der Zeichen pro Werkstück : 180
-Anzahl der insgesamt untersuchten Zeichen : 9180
-
-Anzahl der Bedienfehler : 3
-
-Anzahl der vorgegebenen Fehler : 363
-Anzahl der Fehlerkorrekturen : 304
-Arbeitszeit (incl. Pausenüberschreitungen) : 1792.5 sec
-Anzahl bearbeiteter Zeichen pro Sekunde : 5.1
-
-Ausbesserungsrate : 0.8
-Bewertungsfaktor : 0.8
-
-Gesamtbewertung (incl. Pausenüberschreitungen) : 4.3
-================================================ ========
-Arbeitszeit (ohne Pausenüberschreitungen) : 1788.5 sec
-Anzahl bearbeiteter Zeichen pro Sekunde : 5.1
-Gesamtbewertung (ohne Pausenüberschreitungen) : 4.3
-================================================ ========
-
-
- Einzelauswertung der Werkstücke:
- ================================
-
-Werk- | Anzahl | Vorge- | Anzahl | Benö- | Zei- | Aus- |Bewer- | Bewer-
-stück- | Be- | gebene | Kor- | tigte | chen | bes- |tungs- | tungs-
-nummer | dien- | Feh- | rek- | Zeit | pro | se- |faktor | zahl
- | feh- | ler- | turen | [sec] | Se- | rungs-| |
- | ler | zahl | | | kunde | rate | |
---------------------------------------------------------------------------
- | | | | | | | |
- 1 | 0 | 5 | 3 | 45.6 | 3.9 | 0.6 | 0.6 | 2.4
- 2 | 0 | 10 | 6 | 33.5 | 5.4 | 0.6 | 0.6 | 3.2
- 3 | 0 | 5 | 4 | 35.7 | 5.0 | 0.8 | 0.8 | 4.0
- 4 | 0 | 3 | 3 | 33.9 | 5.3 | 1.0 | 1.0 | 5.3
- 5 | 0 | 10 | 7 | 38.0 | 4.7 | 0.7 | 0.7 | 3.3
- 6 | 0 | 5 | 4 | 37.2 | 4.8 | 0.8 | 0.8 | 3.9
- 7 | 0 | 9 | 8 | 36.9 | 4.9 | 0.9 | 0.9 | 4.3
- 8 | 0 | 5 | 4 | 31.7 | 5.7 | 0.8 | 0.8 | 4.5
- 9 | 0 | 4 | 3 | 27.3 | 6.6 | 0.8 | 0.8 | 4.9
- 10 | 0 | 6 | 6 | 33.3 | 5.4 | 1.0 | 1.0 | 5.4
- 11 | 0 | 3 | 3 | 25.0 | 7.2 | 1.0 | 1.0 | 7.2
- 12 | 0 | 6 | 3 | 28.6 | 6.3 | 0.5 | 0.5 | 3.1
- 13 | 0 | 11 | 10 | 37.9 | 4.7 | 0.9 | 0.9 | 4.3
- 14 | 0 | 4 | 4 | 38.3 | 4.7 | 1.0 | 1.0 | 4.7
- 15 | 0 | 11 | 8 | 39.3 | 4.6 | 0.7 | 0.7 | 3.3
- 16 | 0 | 5 | 4 | 28.4 | 6.3 | 0.8 | 0.8 | 5.1
- 17 | 0 | 4 | 4 | 36.4 | 4.9 | 1.0 | 1.0 | 4.9
- 18 | 0 | 15 | 14 | 44.9 | 4.0 | 0.9 | 0.9 | 3.7
-
- PAUSE ---> Ãœberzogen um 2.2 sec
-
- 19 | 0 | 3 | 3 | 38.9 | 4.6 | 1.0 | 1.0 | 4.6
- 20 | 0 | 11 | 10 | 40.2 | 4.5 | 0.9 | 0.9 | 4.1
- 21 | 0 | 8 | 7 | 34.7 | 5.2 | 0.9 | 0.9 | 4.5
- 22 | 0 | 7 | 5 | 30.3 | 5.9 | 0.7 | 0.7 | 4.2
- 23 | 0 | 4 | 4 | 33.9 | 5.3 | 1.0 | 1.0 | 5.3
- 24 | 0 | 7 | 7 | 39.5 | 4.6 | 1.0 | 1.0 | 4.6
- 25 | 0 | 6 | 4 | 28.1 | 6.4 | 0.7 | 0.7 | 4.3
- 26 | 0 | 11 | 10 | 34.8 | 5.2 | 0.9 | 0.9 | 4.7
- 27 | 0 | 11 | 9 | 34.2 | 5.3 | 0.8 | 0.8 | 4.3
- 28 | 0 | 10 | 8 | 35.0 | 5.1 | 0.8 | 0.8 | 4.1
- 29 | 0 | 9 | 8 | 36.4 | 4.9 | 0.9 | 0.9 | 4.4
- 30 | 0 | 8 | 7 | 34.8 | 5.2 | 0.9 | 0.9 | 4.5
- 31 | 0 | 10 | 8 | 36.2 | 5.0 | 0.8 | 0.8 | 4.0
- 32 | 0 | 10 | 10 | 44.0 | 4.1 | 1.0 | 1.0 | 4.1
- 33 | 0 | 8 | 8 | 44.4 | 4.1 | 1.0 | 1.0 | 4.1
- 34 | 0 | 4 | 3 | 35.6 | 5.1 | 0.8 | 0.8 | 3.8
-
- PAUSE ---> Ãœberzogen um 1.8 sec
-
- 35 | 0 | 8 | 8 | 42.7 | 4.2 | 1.0 | 1.0 | 4.2
- 36 | 1 | 8 | 8 | 45.3 | 4.0 | 1.0 | 1.0 | 4.0
- 37 | 0 | 5 | 5 | 34.3 | 5.2 | 1.0 | 1.0 | 5.2
- 38 | 0 | 5 | 4 | 27.9 | 6.5 | 0.8 | 0.8 | 5.2
- 39 | 0 | 10 | 8 | 39.5 | 4.6 | 0.8 | 0.8 | 3.6
- 40 | 1 | 7 | 6 | 35.5 | 5.1 | 0.9 | 0.9 | 4.3
- 41 | 0 | 3 | 3 | 29.5 | 6.1 | 1.0 | 1.0 | 6.1
- 42 | 0 | 5 | 5 | 30.2 | 6.0 | 1.0 | 1.0 | 6.0
- 43 | 0 | 6 | 3 | 28.0 | 6.4 | 0.5 | 0.5 | 3.2
- 44 | 0 | 5 | 4 | 30.2 | 6.0 | 0.8 | 0.8 | 4.8
- 45 | 0 | 5 | 4 | 33.1 | 5.4 | 0.8 | 0.8 | 4.4
- 46 | 0 | 8 | 7 | 33.7 | 5.3 | 0.9 | 0.9 | 4.7
- 47 | 0 | 9 | 7 | 32.2 | 5.6 | 0.8 | 0.8 | 4.3
- 48 | 0 | 9 | 8 | 37.5 | 4.8 | 0.9 | 0.9 | 4.3
- 49 | 0 | 4 | 4 | 32.0 | 5.6 | 1.0 | 1.0 | 5.6
- 50 | 0 | 9 | 7 | 34.8 | 5.2 | 0.8 | 0.8 | 4.0
- 51 | 1 | 9 | 4 | 29.2 | 6.2 | 0.4 | 0.4 | 2.7
- | | | | | | | |
-==========================================================================
-
-( 52 | 0 | 7 | 7 | 35.9 | 5.0 | 1.0 | 1.0 | 5.0)
-
- Anmerkungen:
- =============
-
- - Das zuletzt bearbeitete Werkstück (in der obigen Tabelle unterhalb
- der letzten Trennlinie in Klammern angegeben) wurde nicht vollstän-
- dig innerhalb der zur Verfügung stehenden Zeit bearbeitet.
- Aus diesem Grunde wird es bei der Auswertung (Gesamtwertung) nicht
- berücksichtigt!
-
- - Bei der Auflistung der Daten der einzelnen Werkstücke sind auch die
- Pausen eingetragen, so daß sich die einzelnen Arbeitsphasen erken-
- nen und miteinander vergleichen lassen. Die dabei notierten Zeiten
- geben die Pausenüberschreitungen an. Diese Zeiten bleiben bei der
- Betrachtung der einzelnen Werkstücke unberücksichtigt, fließen aber
- in die Gesamtauswertung ein!
-
- - Die Anzahl der Bedienfehler ist ein Maß für die Sicherheit im Um-
- gang mit dem System. Bei den weiteren Auswertungen bleibt die Be-
- dienfehlerzahl allerdings unberücksichtigt!
-
- - Die 'Vorgegebene Fehlerzahl', die 'Anzahl Korrekturen' und die 'Be-
- nötigte Zeit [sec]' wurden bei der Bearbeitung des Werkstücks er-
- faßt. Auf diesen Daten beruhen die folgenden Auswertungen!
-
- - Da die Werkstücke ganz unterschiedliche Größen haben können, eignet
- sich die 'Benötigte Zeit [sec]', die für die Bearbeitung eines je-
- den Werkstücks ermittelt wird, als Maß für die "Arbeitsgeschwindig-
- keit" nicht! Stattdessen wird ermittelt, wie viele Zeichen pro Se-
- kunde "bearbeitet" wurden:
-
- Anzahl Zeichen pro Werkstück
- Zeichen pro Sekunde = ----------------------------
- Benötigte Zeit [sec]
-
- Die 'Anzahl Zeichen pro Werkstück' kann aus der Werkstückbreite und
- Werkstückhöhe ermittelt werden:
-
- Anzahl Zeichen pro Werkstück = Werkstückbreite * Werkstückhöhe
-
- - Aus der (zufällig) 'Vorgegebenen Fehlerzahl' und der 'Anzahl Kor-
- rekturen' wird die 'Ausbesserungsrate' ermittelt:
-
- Anzahl Korrekturen
- Ausbesserungsrate = ----------------------
- Vorgegebene Fehlerzahl
-
- Die Ausbesserungsrate gibt an, welcher Anteil der vorhandenen Feh-
- ler ausgebessert wurde. Sie ist ein Maß für die Güte der verrichte-
- ten Arbeit.
-
- - Der 'Bewertungsfaktor' ist abhängig von der 'Ausbesserungsrate'. Er
- läßt sich aus dem folgenden Diagramm entnehmen:
-
- Bewertungs-
- faktor
-
- 1.0| +
- | +
- | +
- | +
- | +
- 0.5| +
- | +
- | +
- | +
- | +
- 0.0+--|--|--|--|--|--|--|--|--|--|
- 0.0 0.5 1.0
- Ausbesserungsrate
-
-
- In diesem Diagramm ist festgelegt, wie die einzelnen 'Ausbesse-
- rungsraten' bewertet werden.
-
- - Am Ende wird die 'Bewertungszahl' folgendermaßen ermittelt:
-
- Bewertungszahl = Zeichen pro Sekunde * Bewertungsfaktor
-
- Da der 'Bewertungsfaktor' nur Werte zwischen 0 und 1 annehmen kann,
- ist die 'Bewertungszahl' ein Wert zwischen 0 und der 'Zeichen pro
- Sekunde'. Die "Arbeitsleistung" war um so größer, je höher die 'Be-
- wertungszahl ist.
-
-Eine weitere Kommentierung des Protokolls dürfte
-sich wohl erübrigen, wenn Sie die Anmerkungen in­
-tensiv studiert haben.
-
-
-4.5 Hinweise zur Protokollauswertung
-
-4.5.1 Der Bewertungsfaktor
-
- Sie haben sich sicher über den sogenannten 'Be­
-wertungsfaktor' gewundert, der an verschiedenen
-Stellen genannt wird - aber bisher unberücksichtigt
-blieb. In den bisher aufgezeigten Situationen war
-der Bewertungsfaktor identisch mit der 'Ausbesse­
-rungsrate'. Warum dieser Faktor gesondert einge­
-führt wurde, möchten wir an einem kleinen Beispiel
-erläutern:
- Wenn Ihnen der Auswertalgorithmus vor dem Simu­
-lationslauf bekannt gewesen wäre und Sie die Ab­
-sicht gehabt hätten, eine möglichst hohe Bewer­
-tungszahl zu erzielen, wäre folgende "Arbeitsstra­
-tegie" erfolgversprechend gewesen:
- Sobald ein Werkstück auf dem Bildschirm er­
-scheint, bewegen Sie den Cursor schnellstens zum
-ersten Fehlerzeichen, das Sie entdecken können und
-löschen es mit der Ausbesserungstaste. Sollten zu­
-fällig noch weiterer Fehlerzeichen in unmittelbarer
-Nähe zu sehen sein, so können Sie sie ja auch "aus­
-merzen" - aber dann schnell das nächste Werkstück
-anfordern usw.
- Machen wir uns klar, was das bedeutet: Da sie
-das Werkstück in sehr kurzer Zeit bearbeitet haben,
-wird der eigentlich entscheidende Faktor hinsicht­
-lich der Auswertung "enorm in die Höhe getrieben"
-(die Anzahl der Zeichen pro Sekunde). Da Sie bei
-dieser Strategie zumeist nur 2 - 4 Sekunden zur
-Bearbeitung eines Werkstücks brauchen, erhalten Sie
-- auf das obige Beispielprotokoll bezogen - Werte
-zwischen 90.0 und 45.0 (bearbeitete Zeichen pro
-Sekunde).
- Im Schnitt treten pro Werkstück etwa 7 Fehler­
-zeichen auf (sehen Sie dazu auch unter 'Aufbau der
-Werkstücke'), von denen Sie dann eines korrigiert
-haben. Sie kommen also auf eine durchschnittliche
-Ausbesserungsrate von 0.14. Wäre - wie im obigen
-Beispielprotokoll - der Bewertungsfaktor mit der
-Ausbesserungsrate identisch, so erhielten Sie Be­
-wertungszahlen zwischen 12.9 und 6.4. Ein deut­
-licher Unterschied zur "Leistung" die im Protokoll
-dokumentiert ist - oder?
- Das aber ist nicht Sinn der dem Benutzer ge­
-stellten Aufgabe! Es würde auch nicht einer sinn­
-vollen 'Kontrolltätigkeit' entsprechen, wenn derart
-viele Fehler unentdeckt blieben. Um hier "regulie­
-rend" einschreiten zu können, ist der 'Bewertungs­
-faktor' eingeführt worden. So können Sie festlegen,
-daß Werkstücke, in denen weniger als 80% der Fehler
-entdeckt wurden, bei der Auswertung unberücksich­
-tigt bleiben. Sie brauchen dazu nur den Bewertungs­
-schlüssel entsprechend einzustellen. ("Ziehen Sie
-dazu bei der Einstellung des Bewertungsschlüssels
-die ersten 8 Kreuzchen auf die Grundlinie").
- Anders ausgedrückt: Durch die Manipulation des
-Bewertungsschlüssels können Sie die Anforderungen,
-die an die Werkstückbearbeitung gestellt werden,
-festlegen. Hierdurch entscheiden Sie über die Wer­
-tigkeit von Schnelligkeit und Genauigkeit.
- Übrigens wird der zur Simulationszeit einge­
-stellte Wertungsschlüssel mit im Protokoll notiert.
-Eine Auswertung des Protokolls mit verschiedenen
-Wertungsschlüsseln ist so nicht möglich - und auch
-nicht sinnvoll. Denn sonst könnte es ja vorkommen,
-daß der Anwender ein ganz anderes Ergebnis in der
-Kurzauswertung auf dem Bildschirm gezeigt bekommt
-als er nachher im Protokoll nachlesen kann. Wenn
-Sie also mit einem veränderten Wertungsschlüssel
-arbeiten wollen, müssen Sie ihn #on("u")#vor dem Simula­
-tionslauf#off("u")# eingestellt haben!
-
-
-4.5.2 Fehlerzeichenhäufigkeit in den Werkstücken
-
- Die Häufigkeit des Auftretens der Fehlerzeichen
-in den einzelnen Werkstücken kann deutlich schwan­
-ken. Die Werkstücke werden nämlich mit Hilfe des
-Zufallszahlengenerators aufgebaut. Je nach Anzahl
-der verschiedenen Zeichen, die in einem Werkstück
-auftreten können, ändert sich auch der Anteil der
-auftretenden Fehlerzeichen.
- In unserem bisher betrachteten Beispiel können
-26 verschiedene Buchstaben im Werkstück auftreten.
-Ein Werkstück besteht aus 180 Zeichen. In 1/26 al­
-ler Fälle müßte also das Fehlerzeichen auftreten,
-d.h. also etwa 7 Fehlerzeichen pro Werkstück - al­
-lerdings auf eine große Anzahl von produzierten
-Werkstücken bezogen. Da die Werkstücke zufällig
-zusammengesetzt werden, gilt dieser Wert natürlich
-nicht für das einzelne Werkstück!
-
-
-4.5.3 Fehlerhafte Auswertungen
-
- In zwei Situationen kann es zu Fehlern bei der
-Auswertung von Protokollen kommen:
-
- Wurde der Simulationslauf mit der <SV>-Taste
-rigoros abgebrochen, so ist ggf. eine sinnvolle
-Auswertung des Protokolls nicht möglich, da nur
-unvollständige Daten vorhanden sind.
-
- In der letzten Arbeitsphase eines Simulations­
-laufes muß zumindest ein Werkstück angefordert wor­
-den sein. Dehnt ein Anwender die letzte Pause so
-lange aus, daß das Pausenende über das Ende der
-letzten Arbeitsphase hinausreicht, so erscheinen im
-Protokoll keine Werte für die einzelnen Werkstücke
-- in der Gesamtauswertung sind (fast) alle Werte
-auf '0' gesetzt.
-
diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 5 b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 5
deleted file mode 100644
index d08e4a7..0000000
--- a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 5
+++ /dev/null
@@ -1,699 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block##pageblock#
-#start (2.0,0.0)#
-#page (40)#
-#headodd#
-#center#gs-MP BAP#right#%
-
-#end#
-#headeven#
-%#center#gs-MP BAP
-
-#end#
-#center#5
-
-#center#Beschreibung
-#center#der
-#center#Menufunktionen
-
-#center#(Programmteil 'Bildschirmarbeitsplatz' (BAP))
-
-
-5.1 Kurzhinweise zur Bedienung des Menus
-
- Die Bedienung des Menus ist sehr einfach. Eine
-ausführliche Beschreibung dazu finden Sie in den
-Unterlagen zum Programmsystem #on("b")#gs-DIALOG#off("b")#. An dieser
-Stelle sollen nur die wesentlichen Bedienungsvor­
-gänge beschrieben werden.
-
-- Mit der Tastenfolge <ESC><?> können Sie sich
- Informationen zur Bedienung des Menusystems in
- das Menu einblenden lassen.
-
-- Mit den Pfeiltasten <rechts> und <links> können
- Sie zwischen den "Oberbegriffen" in der Kopfzei­
- le wählen. Der aktuelle Oberbegriff ist jeweils
- invers dargestellt. Das ausgeklappte 'Pull-
- Down-Menu' bezieht sich auf diesen invers darge­
- stellten Oberbegriff.
-
-- Mit den Pfeiltasten <hoch> und <runter> können
- Sie zwischen den Menufunktionen wählen, die
- Ihnen im aktuellen Pull-Down-Menu zur Auswahl
- angeboten werden. Die aktuell angewählte Menu­
- funktion wird jeweils invers dargestellt. Die
- Trennlinien, die in einigen Pull-Down-Menus
- sichtbar sind, dienen nur der optischen Unter­
- gliederung; sie können nicht angewählt werden
- und werden deshalb automatisch übersprungen. Die
- einzelnen Menupunkte sind "zyklisch miteinander
- verknüpft", das heißt, man gelangt vom untersten
- Menupunkt wieder zum obersten und umgekehrt.
- Menupunkte, vor denen ein Minuszeichen steht
- ('-'), sind (zur Zeit) nicht aktivierbar; auch
- sie können nicht angewählt werden und werden
- einfach übersprungen.
-
-- Durch Tippen der Fragezeichentaste (<?>) können
- Sie sich jeweils zur aktuellen Menufunktion (in­
- vers im Pull-Down-Menu) Informationen in das
- Menu einblenden lassen.
-
-- Um eine Menufunktion ausführen zu lassen, bewe­
- gen Sie sich mit den Pfeiltasten auf die ge­
- wünschte Menufunktion im aktuellen Pull-Down-
- Menu und tippen dann die <RETURN>-Taste. Steht
- vor dem gewünschten Menupunkt ein einzelner
- Buchstabe oder eine Ziffer, so kann durch Tippen
- der entsprechenden Taste diese Menufunktion da­
- durch direkt aufgerufen werden. Sobald eine Me­
- nufunktion aufgerufen worden ist, erscheint da­
- vor ein Stern ('*'). Daraus können Sie entneh­
- men, daß das System bereits den Auftrag aus­
- führt.
-
-- An verschiedenen Stellen werden Fragen an Sie
- gerichtet, die Sie mit 'ja' oder 'nein' beant­
- worten müssen. Tippen Sie dazu entsprechend der
- Entscheidung die Taste <j> (für 'ja') bzw. <n>
- (für 'nein').
-
-- Werden Ihnen vom Menu aus Dateinamen zur Auswahl
- angeboten, so können Sie den auf dem Bildschirm
- sichtbaren Pfeil vor den gewünschten Namen posi­
- tionieren. Mit den Tasten <x> oder <RETURN> kön­
- nen Sie den Namen ankreuzen. Ist die Auswahl
- mehrerer Dateinamen möglich, so können Sie den
- Vorgang wiederholen. Mit den Tasten <o> oder
- <RUBOUT> können Sie auch ein Kreuz vor einem
- Namen wieder löschen. Daneben gibt es noch eini­
- ge Tastenfunktionen, die für die Bedienung recht
- hilfreich sein können. Tippen Sie während der
- Auswahl die Fragezeichentaste (<?>), so werden
- Ihnen alle Bedienungsmöglichkeiten auf dem Bild­
- schirm angezeigt. Eine Auswahl, in der mehrere
- Dateien angekreuzt werden dürfen, wird durch die
- Tastenfolge <ESC><q> verlassen. Anschließend
- wird die eingestellte Operation mit den ange­
- kreuzten Dateien ausgeführt. Sind Sie versehent­
- lich in eine solche Auswahl gelangt, so können
- Sie den Vorgang durch die Tastenkombination
- <ESC><h> abbrechen.
-
-- An einigen Stellen werden Sie aufgefordert, eine
- Eingabe zu machen (z.B. einen Dateinamen einzu­
- geben). Wird Ihnen hier ein Vorschlag gemacht,
- den Sie akzeptieren, so brauchen Sie zur Bestä­
- tigung nur die <RETURN>-Taste zu tippen. Ge­
- fällt Ihnen der Vorschlag nicht oder wird Ihnen
- kein Vorschlag gemacht, so machen Sie bitte die
- gewünschte Eingabe. Zum Schreiben stehen Ihnen
- alle aus dem Editor bekannten Funktionen zur
- Verfügung. Mit der Taste <RUBOUT> können Sie
- Buchstaben löschen, mit <RUBIN> einfügen. Die
- Eingabe wird durch Tippen der <RETURN>-Taste
- abgeschlossen. Ist der von Ihnen gewünschte Name
- schon in Ihrer Task vorhanden und steht in der
- Fußzeile der Hinweis 'Zeigen: <ESC><z>', dann
- können Sie sich auch alle vorhandenen Namen zur
- Auswahl anbieten lassen und durch Ankreuzen den
- beabsichtigten Namen auswählen.
-
-- Ihnen können auch mehrere Alternativen angeboten
- werden, zwischen denen Sie wählen müssen. In der
- untersten Zeile eines solchen Kastens, in denen
- Ihnen die Alternativen auf dem Bildschirm einge­
- blendet werden, sind die Möglichkeiten aufge­
- führt, die darüber beschrieben sind. Mit den
- Pfeiltasten können sie die Markierung auf die
- gewünschte Alternative positionieren und dann
- durch die <RETURN>-Taste zur Ausführung bringen.
- (Manchmal ist das auch durch Tippen der den Al­
- ternativen vorangestellten Buchstaben oder Zif­
- fern möglich).
-
-- Durch die Tastenfolge <ESC><q> kann das Menu
- insgesamt verlassen werden. Damit das nicht ver­
- sehentlich geschieht, wird jeweils die Frage
- gestellt, ob Sie das Menu tatsächlich verlassen
- wollen. Diese Frage beantworten Sie bitte je
- nach Wunsch mit 'ja' oder 'nein' durch Tippen
- der Tasten <j> bzw. <n>.
-
-#page#
-5.2 Menufunktionen zum Oberbegriff 'Simulation'
-
-#on("b")#
-BAP: Simulation Parameter Konfiguration Dateien Archiv
-+-------------------------------+-----------------------------------------
-| s Simulation ausführen |
-| --------------------------- |
-| a Auswertung auf Bildschirm |
-| d Drucken von Auswertungen |
-+-------------------------------+
-
-
-
-
-
-
-
-
-
-
-
---------------------------------------------------------------------------
-Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
-#off("b")#
-
-#on("u")##on("b")#s Simulation ausführen#off("b")##off("u")#
- Mit dieser Menufunktion starten Sie einen
- Simulationslauf. Bevor Sie aber mit der Arbeit
- am Bildschirmarbeitsplatz beginnen können,
- wird eine "Identifikation" (Vor- und Nachname)
- von Ihnen verlangt. Das Protokoll, das bei der
- Simulation entsteht, erhält dann die hier ein­
- gegebene Kennung. Geben Sie für mehrere Proto­
- kolle den gleichen Namen an, so werden die
- Protokolle in der Reihenfolge ihrer Anlage
- durchnumeriert.
- Nach Eingabe der Kennung werden oben auf
- dem Bildschirm die zur Zeit eingestellten Si­
- mulationsdaten angezeigt - alle Daten, die Sie
- zur Bedienung während der Simulation benöti­
- gen. Die eigentliche Simulation beginnt erst
- mit dem nächsten Tastendruck; dazu erfolgt ein
- Hinweis auf dem Bildschirm.
- Nach Abschluß der Simulation wird Ihnen
- gegebenenfalls (sehen Sie dazu auch die Menu­
- funktion 'k Kurzauswertung' unter dem Oberbe­
- griff 'Konfiguration') eine Kurzauswertung auf
- dem Bildschirm ausgegeben. Anschließend gelan­
- gen Sie zurück in das Menu.
- Diese Menufunktion hat eine ähnliche Wir­
- kung wie der Aufruf des Programms 'Material­
- prüfung' (MP). Im Gegensatz zum Aufruf des
- Programms 'Materialprüfung' (MP - mit dem Be­
- fehl: mp <RETURN>) werden hier allerdings kei­
- ne ausführlichen Informationen vor dem eigent­
- lichen Simulationslauf ausgegeben, sondern es
- wird nur nach einer Identifikation (Vorname
- und Nachname) gefragt. Nach Abschluß der Si­
- mulation verbleibt das Protokoll in der Task -
- es wird nicht, wie im Programmteil 'Material­
- prüfung', in die Vatertask geschickt.
-
-#on("u")##on("b")#a Auswertung auf Bildschirm#off("b")##off("u")#
- Alle Simulationsprotokolle, die sich in
- Ihrer Task befinden, werden Ihnen zur Auswahl
- angeboten. Wenn Sie den/die gewünschten Proto­
- kollnamen angekreuzt und die Auswahl mit der
- Tastenfolge <ESC><q> verlassen haben, werden
- die Protokolle nacheinander in der Ankreuzrei­
- henfolge ausgewertet und die Auswertungen auf
- dem Bildschirm angezeigt.
- Die gesamte Auswertung kann zwar nicht auf
- einmal auf dem Bildschirm angezeigt werden -
- Sie können aber das Fenster mit <HOP><hoch>
- und <HOP><runter> rollen und so in die gesamte
- Datei Einsicht nehmen. Gegebenenfalls (sehen
- Sie dazu auch die Menufunktion 'u Umfang der
- Auswertung' unter dem Oberbegriff 'Konfigura­
- tion') werden an das Ende der eigentlichen
- Ergebnisse noch Erläuterungen zum Protokoll
- ausgegeben. (Zur Protokollauswertung selbst
- sehen Sie bitte Kapitel 4.4). Da die Auswer­
- tung jeweils in eine Datei geschrieben wird,
- können Sie sie mit der Tastenkombination
- <ESC><q> verlassen.
-
- Fehlerfälle: - Sehen Sie dazu bitte Kapitel
- 4.5.3
-
-#on("u")##on("b")#d Drucken von Auswertungen#off("b")##off("u")#
- Alle Simulationsprotokolle, die sich in
- Ihrer Task befinden, werden Ihnen zur Auswahl
- angeboten. Wenn Sie den/die gewünschten Proto­
- kollnamen angekreuzt und die Auswahl mit der
- Tastenfolge <ESC><q> verlassen haben, werden
- die Protokolle nacheinander in der Ankreuzrei­
- henfolge ausgewertet und die Auswertdateien
- zum Drucker geschickt.
- #on("b")#ACHTUNG!#off("b")# Zum Ausdruck von Simulationsproto­
- kollen muß unbedingt diese Menufunktion ge­
- wählt werden! Zwar können normale Textdateien
- auch mit dem Menupunkt 'Drucken' unter dem
- Oberbegriff 'Dateien' ausgedruckt werden - das
- gilt aber nicht für die bei den Simulationen
- erzeugten Protokolldateien, die Sie am Präfix
- 'gs-Protokoll:' erkennen können.
- Der Ausdruck der Protokollauswertungen er­
- folgt normalerweise im Standardschrifttyp Ih­
- res Druckers. Es besteht allerdings die Mög­
- lichkeit, einen anderen Schrifttyp für den
- Ausdruck der Protokolldateien einzustellen.
- Sehen Sie dazu bitte im Kapitel 6 'Hinweise
- für den Systembetreuer'.
-
-#page#
-5.3 Menufunktionen zum Oberbegriff 'Parameter'
-
-#on("b")#
-BAP: Simulation Parameter Konfiguration Dateien Archiv
--------+---------------------------+--------------------------------------
- | e Einstellung anzeigen |
- | s Standardwerte |
- | ----------------------- |
- | b Breite des Werkstücks |
- | h Höhe des Werkstücks |
- | i Invers-/Normal |
- | z Zeichensatz |
- | f Fehlerzeichen |
- | t Tastenbelegung |
- | ----------------------- |
- | a Anzahl Arbeitsphasen |
- | d Dauer Arbeitsphase |
- | p Pausendauer |
- | ----------------------- |
- | w Wertungsschlüssel |
- +---------------------------+
-
-
---------------------------------------------------------------------------
-Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
-#off("b")#
-
-#on("u")##on("b")#e Einstellung anzeigen#off("b")##off("u")#
- Auf dem Bildschirm erscheinen zwei Fenster.
- Im Fenster links werden alle Werte angezeigt,
- die die Parameter zur Zeit annehmen. Oben kön­
- nen Sie ablesen, welches Aussehen ein Werk­
- stück nach der augenblicklichen Einstellung
- auf dem Bildschirm hätte. Darunter ist angege­
- ben, welche Tasten bei der Bearbeitung der
- Werkstücke während des Simulationslauf benutzt
- werden können. Unten ist noch aufgeführt, wie
- viele Arbeitsphasen vorgesehen sind und wie
- lange die Arbeitsphasen, Pausen und die Ge­
- samtsimulation dauern.
- Im Fenster rechts wird ein Diagramm ausge­
- geben. Hier ist der Bewertungsfaktors in Ab­
- hängigkeit von der Ausbesserungsrate darge­
- stellt. Hinsichtlich der Bedeutung des Bewer­
- tungsfaktors sehen Sie bitte in Kapitel 4.5.1.
- Die Anzeige kann durch Tippen einer belie­
- bigen Taste verlassen werden.
-
-#on("u")##on("b")#s Standardwerte#off("b")##off("u")#
- Mit dieser Menufunktion können Sie mit ei­
- nem Tastendruck die sogenannten "Standardwer­
- te" einstellen - die Werte, die die Parameter
- haben, wenn das System "frisch installiert"
- ist.
- Zur Sicherheit zeigt das System die aktuel­
- len Werte an und erfragt, ob Sie die Standard­
- werte tatsächlich einstellen wollen. Bejahen
- Sie diese Frage, so werden alle aktuellen Wer­
- te durch die Standardwerte überschrieben und
- auf dem Bildschirm angezeigt. Von dieser Ein­
- stellung ist auch der Wertungsschlüssel be­
- troffen - der aber nicht angezeigt wird. Die
- Einstellung wird derart vorgenommen, daß Be­
- wertungsfaktor und Ausbesserungsrate identisch
- sind.
-
-#on("u")##on("b")#b Breite des Werkstücks#off("b")##off("u")#
- Mit dieser Menufunktion können Sie die An­
- zahl der Zeichen je Werkstückzeile festlegen.
- Im Fenster links oben werden der kleinstmög­
- liche Wert (1), der größtmögliche Wert (70)
- und der aktuell eingestellte Wert angezeigt.
- Unten erscheint zur Kontrolle ein Werkstück,
- das den aktuellen Parameterwerten entspricht.
- Im Fenster rechts oben wird an Sie die Fra­
- ge gerichtet, ob Sie tatsächlich eine Verände­
- rung vornehmen möchten. Haben Sie versehent­
- lich diesen Menupunkt gewählt, verneinen Sie
- einfach diese Frage (Taste <n>) und gelangen
- so - unter Beibehaltung des z.Z. eingestellten
- Wertes - zurück in das Menu.
- Bejahen Sie die Frage, so erhalten Sie die
- Möglichkeit, den bisher eingestellten Wert mit
- der Pfeiltaste <hoch> zu erhöhen, mit der
- Pfeiltaste <runter> zu erniedrigen - aller­
- dings nur innerhalb der angezeigten Grenzen.
- Wenn Sie die gewünschte Einstellung vorgenom­
- men und die Eingabe durch <RETURN> abgeschlos­
- sen haben, erscheint ein Werkstück in der neu
- eingestellten Breite unten auf dem Bildschirm.
- Bejahen Sie die Frage, ob Sie mit der Werk­
- stückbreite einverstanden sind, dann gelangen
- Sie ins Menu zurück; ansonsten können Sie die
- Werkstückbreite nach gleichem Verfahren erneut
- einstellen.
-
-#on("u")##on("b")#h Höhe des Werkstücks#off("b")##off("u")#
- Die Einstellung der Werkstückhöhe (Anzahl
- Zeichen pro Werkstückspalte) erfolgt analog
- zur Einstellung der Werkstückbreite - sehen
- Sie bitte dort.
-
-#on("u")##on("b")#i Invers-/Normal#off("b")##off("u")#
- Mit dieser Menufunktion können Sie festle­
- gen, ob das zu bearbeitende Werkstück 'normal'
- oder 'invers' dargestellt wird. Diese Darstel­
- lung ist aber immer in Abhängigkeit von der
- Grundeinstellung Ihres Bildschirms zu sehen.
- Wenn Ihr Bildschirm normalerweise helle Zei­
- chen auf dunklem Grund darstellt, so bedeutet
- 'normal' eben diese Einstellung; 'invers' be­
- deutet dann, daß die Zeichen des Werkstücks
- dunkel auf hellem Grund dargestellt werden -
- bei anderer Bildschirmgrundeinstellung eben
- umgekehrt.
- Unten auf dem Bildschirm wird Ihnen zur
- Kontrolle ein Werkstück in aktueller Darstel­
- lung gezeigt. Im Fenster oben rechts erscheint
- die Frage, ob Sie eine Veränderung der augen­
- blicklichen Einstellung wünschen. Je nachdem,
- ob Sie die Frage bejahen oder verneinen, wird
- eine Veränderung vorgenommen oder nicht.
-
-#on("u")##on("b")#z Zeichensatz#off("b")##off("u")#
- Mit dieser Menufunktion können Sie das Feh­
- lerzeichen festlegen und bestimmen, aus wel­
- chen Zeichen die Werkstücke zusammengesetzt
- werden sollen. Bejahen Sie die Frage nach der
- Neufestlegung des Zeichensatzes, so werden
- Ihnen im Fenster links alle möglichen Zeichen
- angezeigt. Die Zeichen werden hier in der Rei­
- henfolge ihres internen Codes ausgegeben. Sie
- können nun - indem Sie einfach die entspre­
- chende Taste tippen - eines der angegebenen
- Zeichen als 'Fehlerzeichen' bestimmen. Es wird
- daraufhin invers dargestellt.
- Anschließend können Sie die Zeichen bestim­
- men, die sonst noch im Werkstück vorkommen
- sollen. Allerdings sind Sie bei dieser Wahl
- nicht so frei wie bei der Wahl des Fehlerzei­
- chens. Es muß sich um einen zusammenhängenden
- Bereich von Zeichen handeln, die um das Feh­
- lerzeichen gruppiert sind - 'zusammenhängend'
- bezieht sich dabei auf die Reihenfolge der
- Zeichen im Fenster links.
- Die Festlegung selbst erfolgt in zwei Etap­
- pen. Zuerst können Sie den Bereich der Zeichen
- bestimmen, die in der Reihenfolge vor dem Feh­
- lerzeichen stehen. Mit der Pfeiltaste <hoch>
- markieren Sie den Bereich, der vor dem Fehler­
- zeichen liegt; mit der Pfeiltaste <runter>
- können Sie ggf. die Markierung wieder rückgän­
- gig machen. Wenn Sie so den gewünschten Be­
- reich markiert haben, tippen Sie die
- <RETURN>-Taste.
- Anschließend bestimmen Sie den Bereich hin­
- ter dem Fehlerzeichen auf vergleichbare Weise
- und schließen auch hier die Einstellung mit
- der <RETURN>-Taste ab. Daraufhin wird Ihnen
- der eingestellte Zeichensatz mit markiertem
- Fehlerzeichen noch einmal zur Kontrolle im
- Fenster links ausgegeben. Sind Sie mit der
- Einstellung einverstanden, so bejahen Sie die
- an Sie gerichtete Frage und gelangen ins Menu
- zurück; ansonsten können Sie nach gleichem
- Verfahren die Einstellung korrigieren.
-
-#on("u")##on("b")#f Fehlerzeichen#off("b")##off("u")#
- Diese Menufunktion ist dann sinnvoll zu
- wählen, wenn Sie den eingestellten Zeichensatz
- beibehalten und nur das Fehlerzeichen verän­
- dern wollen. Wenn Sie die Frage bejaht haben,
- eine Veränderung vornehmen zu wollen, haben
- Sie die Möglichkeit, durch Verschiebung der
- Markierung im Fenster links (durch die Tasten
- <hoch> und <runter>) das neue Fehlerzeichen
- einzustellen. Die Einstellung wird durch
- <RETURN> abgeschlossen. Sind Sie mit dem ein­
- gestellten Fehlerzeichen einverstanden, gelan­
- gen Sie zurück ins Menu; ansonsten können Sie
- Ihre Einstellung korrigieren.
-
-#on("u")##on("b")#t Tastenbelegung#off("b")##off("u")#
- Mit dieser Menufunktion können Sie die Ta­
- sten bestimmen, die bei einem Simulationslauf
- zur Bedienung des Systems benutzt werden kön­
- nen. Ihnen wird im Fenster links oben die ak­
- tuelle Einstellung angezeigt. Haben Sie sich
- entschlossen, eine Neueinstellung vorzunehmen,
- werden nacheinander die entsprechenden Tasten
- erfragt. Sie brauchen dabei jeweils nur die
- Taste zu tippen, die Sie für die entsprechende
- Funktion vorgesehen haben.
- Sie können die Tasten nahezu frei wählen.
- Es ist allerdings nicht erlaubt, die <SV>-
- Taste zu wählen. Ebensowenig wird die Einstel­
- lung akzeptiert, wenn Sie Mehrfachbelegungen
- vornehmen, d.h, eine Taste für mehrere Funk­
- tionen vorschlagen. Achten Sie deshalb immer
- auf den Kommentar zur Einstellung im Fenster
- unten links. Ist die Neueinstellung fehler­
- haft, so erfolgt ein Hinweis darauf - in einem
- solchen Falle bleibt die alte Tastenbelegung
- erhalten.
-
-#on("u")##on("b")#a Anzahl Arbeitsphasen#off("b")##off("u")#
- Mit dieser Menufunktion können Sie festle­
- gen, in wie viele Arbeitsphasen ein Simula­
- tionslauf jeweils eingeteilt werden soll. Im
- Fenster links oben werden der kleinstmögliche
- Wert (2), der größtmögliche Wert (20) und der
- aktuell eingestellte Wert angezeigt. Im Fen­
- ster unten wird die aktuelle Simulationsdauer
- angezeigt.
- Im Fenster rechts oben wird an Sie die Fra­
- ge gerichtet, ob Sie tatsächlich eine Verände­
- rung vornehmen möchten. Bejahen Sie die Frage,
- so erhalten Sie die Möglichkeit, den bisher
- eingestellten Wert mit der Pfeiltaste <hoch>
- zu erhöhen, mit der Pfeiltaste <runter> zu
- erniedrigen - allerdings nur innerhalb der
- angezeigten Grenzen.
- Wenn Sie die gewünschte Einstellung vorge­
- nommen und die Eingabe durch <RETURN> abge­
- schlossen haben, erscheinen die neuen Simula­
- tionszeiten im Fenster unten. Bejahen Sie die
- Frage, ob Sie mit der Arbeitsphasenanzahl ein­
- verstanden sind, dann gelangen Sie ins Menu
- zurück; ansonsten können Sie nach gleichem
- Verfahren die getroffene Einstellung korrigie­
- ren.
-
-#on("u")##on("b")#d Dauer Arbeitsphase#off("b")##off("u")#
- Mit dieser Menufunktion können Sie festle­
- gen, wie lange eine Arbeitsphase dauern soll.
- Es kann ein Wert zwischen 1 min und 60 min
- eingestellt werden. Das Einstellverfahren ver­
- läuft analog zur Festlegung der Anzahl der
- Arbeitsphasen - sehen Sie bitte dort.
-
-#on("u")##on("b")#p Pausendauer#off("b")##off("u")#
- Mit dieser Menufunktion können Sie festle­
- gen, wie lange die Pause zwischen je zwei Ar­
- beitsphasen dauern soll. Es kann ein Wert zwi­
- schen 1 min und 30 min eingestellt werden. Das
- Einstellverfahren verläuft analog zur Festle­
- gung der Anzahl der Arbeitsphasen - sehen Sie
- bitte dort.
-
-#on("u")##on("b")#w Wertungsschlüssel#off("b")##off("u")#
- Mit dieser Menufunktion können Sie den Wer­
- tungsschlüssel festlegen. Zur genauen Erläu­
- terung der Bedeutung des Bewertungsfaktors
- sehen Sie bitte Kapitel 4.5.1.
- Im Fenster links wird der aktuell einge­
- stellte Wertungsschlüssel angezeigt. Stellen
- Sie sich die ins Koordinatensystem eingetrage­
- nen Kreuzchen durch einen Streckenzug verbun­
- den vor. Entscheiden Sie sich für eine Neu­
- festlegung, dann können Sie mit den Pfeil­
- tasten <hoch> und <runter> nacheinander die
- einzelnen Kreuzchen im Koordinatensystem nach
- oben bzw. nach unten verschieben.
- Haben Sie ein Kreuzchen an die gewünschte
- Stelle positioniert, so tippen Sie als Kenn­
- zeichen dafür die <RETURN>-Taste. So gelangen
- Sie zum nächsten Kreuzchen bzw. nach dem letz­
- ten Kreuzchen zurück in das Fenster oben
- rechts. Wenn Sie mit dem eingestellten Wer­
- tungsschlüssel einverstanden sind, gelangen
- Sie zurück ins Menu; ansonsten können Sie die
- vorgenommene Einstellung korrigieren.
-
-#page#
-5.4 Menufunktionen zum Oberbegriff 'Konfigu­
- ration'
-
-#on("b")#
-BAP: Simulation Parameter Konfiguration Dateien Archiv
---------------------+---------------------------+-------------------------
- | u Umfang der Auswertung |
- | k Kurzauswertung |
- +---------------------------+
-
-
-
-
-
-
-
-
-
-
-
-
---------------------------------------------------------------------------
-Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
-#off("b")#
-
-#on("u")##on("b")#u Umfang der Auswertung#off("b")##off("u")#
- Mit dieser Menufunktion können Sie festle­
- gen, ob am Ende einer Protokollauswertung die
- sogenannten 'Anmerkungen', die die Zusammen­
- hänge im Protokoll erläutern, jeweils mit aus­
- gegeben werden sollen oder nicht. Die hier
- getroffene Festlegung gilt sowohl für die Aus­
- wertung auf dem Bildschirm als auch für den
- Ausdruck über einen angeschlossenen Drucker.
- Zum Verständnis der Auswertungen sind die
- Anmerkungen sehr hilfreich. Hat man aber meh­
- rere Simulationsläufe absolviert, bei denen
- der Wertungsschlüssel identisch ist, so wäre
- es überflüssig, jeweils die Anmerkungen mit
- ausgeben zu lassen.
- Die aktuelle Einstellung (mit/ohne Anmer­
- kungen) wird im Fenster links oben angezeigt.
- Im Fenster rechts oben wird die Frage ge­
- stellt, ob Sie eine Veränderung der Einstel­
- lung wünschen. Nur wenn Sie diese Frage beja­
- hen, wird die Einstellung verändert; ansonsten
- gelangen Sie unter Beibehaltung der alten Ein­
- stellung ins Menu zurück.
-
-#on("u")##on("b")#k Kurzsauswertung#off("b")##off("u")#
- Standardmäßig wird am Ende eines Simula­
- tionslaufes eine Kurzauswertung auf dem Bild­
- schirm ausgegeben. Wenn Sie diese überflüssig
- finden oder wenn Sie es aus didaktischen Grün­
- den vorziehen, auf eine solche Kurzauswertung
- zu verzichten, können Sie diese Kurzauswertung
- durch diese Menufunktion ab- bzw. wieder ein­
- schalten.
- Die hier getroffene Einstellung ist auch
- gültig für anschließend eingerichtete Sohn­
- tasks - und zwar sowohl für das Teilprogramm
- 'Bildschirmarbeitsplatz' als auch für das
- Teilprogramm 'Materialprüfung'.
- Die aktuelle Einstellung (mit/ohne Kurzaus­
- wertung) wird im Fenster links oben angezeigt.
- Im Fenster rechts oben wird die Frage ge­
- stellt, ob Sie eine Veränderung der Einstel­
- lung wünschen. Nur wenn Sie diese Frage beja­
- hen, wird die Einstellung verändert; ansonsten
- gelangen Sie unter Beibehaltung der alten Ein­
- stellung ins Menu zurück
-
-#page#
-5.5 Menufunktionen zum Oberbegriff 'Dateien'
-
-#on("b")#
-BAP: Simulation Parameter Konfiguration Dateien Archiv
-------------------------------------+-------------------+-----------------
- | v Verzeichnis |
- | --------------- |
- | l Löschen |
- | d Drucken |
- | --------------- |
- | k Kopieren |
- | u Umbenennen |
- | --------------- |
- | s Speicherplatz |
- | a Aufräumen |
- +-------------------+
-
-
-
-
-
-
-
---------------------------------------------------------------------------
-Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
-#off("b")#
-
- Die einzelnen Menufunktionen zu diesem Oberbe­
-griff sind detailliert im Handbuch zum Programm
-#on("b")#gs-DIALOG#off("b")# beschrieben und können dort nachgeschla­
-gen werden. An dieser Stelle seien nur einige Be­
-sonderheiten genannt, die hinsichtlich des Pro­
-grammsystems #on("b")#gs-MP BAP#off("b")# zutreffen:
- Protokolldateien, die während eines Simulations­
-laufs angelegt werden, können Sie am Präfix 'gs-
-Protokoll:' erkennen. Diese Protokolldateien können
-#on("u")#nicht#off("u")# mit der in diesem Pull-Down-Menu angegebenen
-Menufunktion 'd Drucken' über den Drucker ausge­
-druckt werden. Die Simulationsdaten sind in den
-Protokolldateien nämlich in einem gesonderten For­
-mat aufgezeichnet, das vom Drucker nicht ausgewer­
-tet werden kann.
- Für die Auswertung und den anschließenden Aus­
-druck dieser Protokolldateien ist die Menufunktion
-'d Drucken von Auswertungen' unter dem Oberbegriff
-'Simulation' bereitgestellt!
- Sie können den Protokolldateien mit der Menu­
-funktion 'u Umbenennen' einen neuen Namen geben.
-Achten Sie aber #on("u")#unbedingt(!)#off("u")# darauf, daß das Präfix
-'gs-Protokoll:' bei der Umbenennung erhalten bleibt
-- sonst wird die Datei nicht mehr als Protokollda­
-tei vom Auswertsystem erkannt!
- Die eben angesprochenen Protokolldateien können
-auch nicht mit der Menufunktion 'a Aufräumen' bear­
-beitet werden, da hier nur "normale" Textdateien
-akzeptiert werden - im übrigen sind die Protokoll­
-dateien immer optimal organisiert.
-
-#page#
-5.6 Menufunktionen zum Oberbegriff 'Archiv'
-
-#on("b")#
-BAP: Simulation Parameter Konfiguration Dateien Archiv
-------------------------------------------+-------------------------+-----
- | r Reservieren |
- | n Neue Diskette |
- | --------------------- |
- | s Schreiben |
- | c Checken |
- | k Kombination |
- | h Holen/Lesen |
- | l Löschen |
- | --------------------- |
- | v Verzeichnis |
- | d Drucken |
- | --------------------- |
- | i Initialisieren |
- | z Zieltask einstellen |
- +---------------------+ +-------------------------+
- | Dateiaustausch mit: |
- | Archiv |
- | Archivname: |
- | gs-MP BAP |
- +---------------------+
---------------------------------------------------------------------------
-Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>
-#off("b")#
-
- Die einzelnen Menufunktionen zu diesem Oberbe­
-griff sind detailliert im Handbuch zum Programm
-#on("b")#gs-DIALOG#off("b")# beschrieben und können dort nachgeschla­
-gen werden.
-
-
diff --git a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 6 b/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 6
deleted file mode 100644
index 7d485d7..0000000
--- a/doc/mp-bap/A5 - Doku: gs-MP BAP - Kapitel 6
+++ /dev/null
@@ -1,53 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block##pageblock#
-#start (2.0,0.0)#
-#page (61)#
-#headodd#
-#center#gs-MP BAP#right#%
-
-#end#
-#headeven#
-%#center#gs-MP BAP
-
-#end#
-#center#6
-
-#center#Hinweise
-#center#für den
-#center#Systembetreuer
-
-
- Für den Ausdruck von Protokollauswertungen ist
-der Standardschrifttyp des Druckers voreingestellt.
-Sie haben aber die Möglichkeit, einen anderen
-Schrifttyp für den Protokollausdruck einzustellen.
-Dafür sind die beiden folgenden Prozeduren vorbe­
-reitet:
-
-PROC druckereinstellung fuer protokolldatei
- (TEXT CONST schrifttyp, REAL CONST linker
- rand, oberer rand, schreibfeldbreite,
- schreibfeldlaenge)
-
- Geben Sie einen in Ihrer Installation vorhan­
- denen Schrifttyp an. Beachten Sie bei der
- Festlegung der anderen Maße (wie gewohnt in
- cm), daß auf dem Schreibfeld 80 Druckpositio­
- nen nebeneinander Platz haben müssen!
-
-
-PROC std druckereinstellung fuer protokolldatei
-
- Sie können mit diesem Befehl wieder die Ein­
- stellung vornehmen, die sonst standardmäßig
- von #on("b")#gs-MP BAP#off("b")# vorgegeben wird:
-
- schrifttyp : "" (Standard-
- schrifttyp)
- linker rand : 0.0 (cm)
- oberer rand : 0.0 (cm)
- schreibfeldbreite : 21.0 (cm)
- schreibfeldlaenge : 29.5 (cm)
-
-
-
-
diff --git a/doc/mp-bap/gs-MP BAP handbuch.impressum b/doc/mp-bap/gs-MP BAP handbuch.impressum
deleted file mode 100644
index 91c6ce0..0000000
--- a/doc/mp-bap/gs-MP BAP handbuch.impressum
+++ /dev/null
@@ -1,104 +0,0 @@
-____________________________________________________________________________
-
-
-#on("b")##on ("u")#
-#center#Betriebssystem E U M E L
-#off ("u")#
-
-
-#center#gs-MP BAP
-
-
-
-
-#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#
-
-#free (4.0)##on("b")#
-#center#gs-MP BAP
-
-
-#center#Benutzerhandbuch
-
-
-#center#Version 1.0
-
-
-#off("b")##center#copyright
-#center#Eva Latta-Weber
-#center#Software- und Hardware-Systeme, 1988
-#center#ERGOS GmbH, 1990
-#page#
-#block#
-#center#____________________________________________________________________________
-
-
-Copyright:  ERGOS GmbH   März 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.
-
-
-#center#____________________________________________________________________________
-
-Es kann keine Gewähr übernommen werden, daß das Programm für eine
-bestimmte Anwendung geeignet ist. Die Verantwortung dafür liegt beim
-Anwender.
-
-Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrektheit und
-Vollständigkeit der Angaben kann keine Gewähr übernommen werden. Das
-Handbuch kann jederzeit ohne Ankündigung geändert werden.
-
-Texterstellung :  Dieser Text wurde mit der ERGOS-L3 Textverarbeitung
- erstellt und aufbereitet und auf einem Kyocera Laser­
- drucker gedruckt.
-
-
-
-
-#center#___________________________________________________________________________
-
-
-
-Ergonomic Office Software GmbH
-
-Bergstr. 7 Telefon: (02241) 63075
-5200 Siegburg Teletex: 2627-2241413=ERGOS
- Telefax: (02241) 63078
-
-
-#center#____________________________________________________________________________
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/doc/net/netzhandbuch b/doc/net/netzhandbuch
deleted file mode 100644
index 7083462..0000000
--- a/doc/net/netzhandbuch
+++ /dev/null
@@ -1,2045 +0,0 @@
-____________________________________________________________________________
-
-
-#on("b")##on ("u")#
-#center#Betriebssystem E U M E L
-#off ("u")#
-
-
-#center#Netzsoftware
-
-
-
-
-#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#
-#pagenr ("%",1)##setcount(1)##block##pageblock##count per page#
-#headeven#
-#center#EUMEL Netzbeschreibung
-#center#____________________________________________________________
-
-#end#
-#headodd#
-#center#Inhalt
-#center#____________________________________________________________
-
-#end#
-#bottomeven#
-#center#____________________________________________________________
-Netz - % #right# GMD
-#end#
-#bottomodd#
-#center#____________________________________________________________
-GMD #right#Netz - %
-#end#
-
-#center#Inhalt
-
-#clear pos##lpos(1.0)##rpos(9.5)#
-#table#
-
-1. Einleitung #topage("0")#
-
-Teil 1: Netz einrichten und benutzen #topage("1")#
-
-
-1.1. Hardwarevoraussetzungen #topage("1.1")#
-1.2. Einrichten des Netzes #topage("1.2")#
-1.3. Benutzung des Netzes #topage("1.3")#
-1.4. Informationsmöglichkeiten #topage("1.4")#
-1.5. Eingriffsmöglichkeiten #topage("1.5")#
-1.6. Fehlerbehebung im Netz #topage("1.6")#
-1.7. Sicherheit im Netz #topage("1.7")#
-
-
-
-Teil 2: Arbeitsweise der Netzsoftware #topage("2")#
-
-
-2.1. Die Netztask #topage("2.1")#
-2.2. Protokollebenen #topage("2.2")#
-2.3. Stand der Netzsoftware #topage("2.3")#
-
-
-
-Teil 3: Netz-Hardware-Interface #topage("3")#
-
-
-3.1. Einführung #topage("3.1")#
-3.2. Arbeitsweise des Netz-Hardware-Interfaces #topage("3.2")#
-3.3. Netztreiber #topage("3.3")#
-3.4. Prozedurschnittstelle des EUMEL-Netzes #topage("3.4")#
-
-
-
-Anhang #topage("A")#
-
-
-1. Fehlermeldungen #topage("A.1")#
-2. Literaturhinweise #topage("A.2")#
-3. Index #topage("A.3")#
-
-#table end#
-#clear pos#
-
-#page#
-#pagenr ("%", 2)##setcount (1)##block##pageblock##count per page#
-#headeven#
-#center#EUMEL Netzbeschreibung
-#center#____________________________________________________________
-
-#end#
-#headodd#
-#center#Einleitung
-#center#____________________________________________________________
-
-#end#
-#bottomeven#
-#center#____________________________________________________________
-Netz - % #right#GMD
-#end#
-#bottomodd#
-#center#____________________________________________________________
-GMD #right#Netz - %
-#end#
-
-1. Einleitung
-
-#goalpage("0")#
-Das EUMEL-Netz dient dazu, mehrere EUMEL-Rechner (sog. #ib#Station#ie#en) miteinan­
-der zu koppeln. Diese Kopplung wird vom Betriebssystem dazu benutzt, das Sen­
-dungskonzept [1] so auszudehnen, daß Tasks verschiedener Stationen einander
-Datenräume zusenden können. Auf dem #ib#Sendungskonzept#ie# aufbauende Konzepte
-nutzen daher automatisch das Netz aus: So ist es z.B. möglich
-
-- von einer Station aus auf einer anderen zu drucken,
-
-- in die Task PUBLIC einer anderen Station #ib#Datei#ie#en zu sichern (save), vorausge­
- setzt, daß PUBLIC dort ein #on("b")#free global manager#off("b")# ist,
-
-- auf einer anderen Station zu archivieren (z.B. wenn das eigene Archivlaufwerk
- defekt ist oder ein anderes Format hat).
-
-Diese #ib#Netzversion#ie# kann ab EUMEL-Version 1.8.1 eingesetzt werden.
-
-Diese Netzbeschreibung besteht aus drei Teilen. In Teil 1 wird beschrieben, wie das
-EUMEL-Netz benutzt und eingerichtet wird. Als Benutzer eines EUMEL-
-Rechners, der vernetzt ist, ist nur dieser Teil der Netzbeschreibung für Sie wichtig.
-Teil 2 erklärt die Funktionsweise der #ib#Netzsoftware#ie#, im dritten Teil wird die Schnitt­
-stelle für die Anpassung anderer #ib#Netzhardware#ie# definiert.
-
-Hinweis:
-
-Zur erstmaligen #ib#Installation#ie# des EUMEL-Netzes ist außer dieser Beschreibung noch
-die Netzsoftware (auf Floppy) und die EUMEL-Netz-#ib#Installationsanleitung#ie#, die mit
-der Software geliefert wird, notwendig.
-
-In der vorliegenden Netzbeschreibung wird das EUMEL-Netz möglichst "hardware
-unabhängig" beschrieben. Wenn hardwareabhängige Beispiele gegeben werden, so
-ist die dort beschriebene Hardware stets die #ib#Datenbox#ie#.
-#pagenr ("%", 3)##setcount (1)##block##pageblock##count per page#
-#headeven#
-#center#EUMEL Netzbeschreibung
-#cneter#____________________________________________________________
-
-#end#
-#headodd#
-#center#Teil 1 : Netz einrichten und benutzen
-#center#____________________________________________________________
-
-#end#
-#bottomeven#
-#center#____________________________________________________________
-Netz - % #right#GMD
-#end#
-#bottomodd#
-#center#____________________________________________________________
-GMD #right#Netz - %
-#end#
-#page#
-
-Teil 1: Netz einrichten und benutzen
-#goalpage("1")#
-
-
-
-1.1. Hardwarevoraussetzungen
-#goalpage("1.1")#
-
-
-Zwei Stationen
-
-Sie können zwei #ib#Station#ie# miteinander vernetzen, wenn Sie dafür an jeder Station eine
-#ib#V.24#ie#-#ib#Schnittstelle#ie# zur Verfügung stellen.
-
-Diese beiden Schnittstellen verbinden Sie mit einem Kabel zur #ib#Rechnerkopplung#ie# [2].
-
-
-Mehrere Stationen
-
-Wenn Sie mehr als zwei Stationen vernetzen wollen, stehen Ihnen zwei Konzepte zur
-Verfügung: das Anlegen von #ib#Netzknoten#ie# bzw. das Verwenden eines #ib#Strang#ie#es. Die
-Konzepte können gemischt eingesetzt werden.
-
-Ein Strang besteht aus einer Anzahl von #ib#Netzbox#ie#en (z.B. KHW-Box oder Ethernet­
-anschluß).
-
-Jede Box besitzt eine #ib#Schnittstelle#ie# (z.B. #ib#V.24#ie#) zum Anschluß an einen der Kanäle
-1...15 der zugeordneten #ib#Station#ie# und eine weitere Schnittstelle zur #ib#Verbindung#ie# der
-Boxen untereinander.
-
-Ein #ib#Knoten#ie# ist eine Station, bei der der Netzbetrieb über mehrere Kanäle läuft.
-
-Da die #ib#Netzsoftware#ie# pro #ib#Kanal#ie# eines Knotens eine Task generiert, ist das Knoten­
-konzept dem Strangkonzept hinsichtlich des #ib#Durchsatz#ie#es unterlegen. Preisgünstiger
-ist jedoch das #ib#Knotenkonzept#ie#, weil dabei #ib#Netzbox#ie#en überflüssig werden.
-
-Beim Knotenkonzept wird eine #ib#Vermaschung#ie# nicht zur Optimierung benutzt (Ver­
-maschung heißt, daß eine #ib#Zielstation#ie# über verschiedene Knoten erreichbar ist). Daher
-sollte man keine Vermaschung vorsehen.
-
-#ib#Nachbarn#ie# sind Stationen, die an denselben #ib#Netzstrang#ie# angeschlossen oder direkt
-über ein #ib#V.24#ie#-Kabel verbunden sind.
-
-Bei der Entscheidung, welche Stationen man zu #ib#Knoten#ie# macht, sollte beachtet wer­
-den, daß (a) Stationen, zwischen denen hoher Verkehr besteht, Nachbarn werden und
-daß (b) besonders leistungsfähige Rechner #ib#Knoten#ie#stationen sein sollten.
-#page#
-
-1.2. Einrichten des Netzes
-#goalpage("1.2")#
-
-
-Hinweis: Dieses Kapitel ist nur für Systembetreuer wichtig.
-
-a) Legen Sie für die am Netz beteiligten Rechner #ib#Stationsnummer#ie#n fest (von 1 an
- aufsteigend).
-
- Die Boxen haben ebenfalls Stationsnummern. Die Stationsnummern der Box und
- des zugeordneten Rechners müssen übereinstimmen.
-
-
-b) Holen Sie an jeder #ib#Station#ie# die Task #on("bold")#configurator#off("bold")# an ein Terminal und geben Sie
- das Kommando #on("bold")##ib#define station#ie# (x)#off("bold")#, wobei #on("bold")#x#off("bold")# die gewählte Stationsnummer ist.
-
- Hinweis: Taskkommunikationen, die zu diesem Zeitpunkt laufen, führen zu feh­
- lerhaftem Verhalten. Dies liegt daran, daß durch #on("bold")#define station#off("bold")# alle
- #ib#Task-Id#ie#'s geändert werden müssen, weil eine #ib#Task-Id#ie# u.a. die
- Stationsnummer der eigenen Station enthält (siehe 1.3). TASK-
- Variablen, die noch Task-Id's mit keiner oder falscher Stationsnum­
- mer enthalten, können nicht mehr zum Ansprechen einer Task ver­
- wendet werden.
-
- Beispiel: Der #ib#Spoolmanager#ie# [3] richtet beim Kommando #on("bold")#start#off("bold")# einen #ib#Worker#ie# ein
- und merkt sich dessen #ib#Task-Id#ie# in einer TASK-Variablen, um sicher­
- zustellen, daß nur der Worker #ib#Datei#ie#en zum Drucken abholt. Wird jetzt
- das Kommando #on("bold")# define station#off("bold")# gegeben, kann der Spoolmanager
- seinen Worker nicht mehr identifizieren, weil der Worker eine neue
- Task-Id erhalten hat. Man muß daher vor #on("b")#define station#off("b")# den Worker
- löschen und ihn danach mit dem Kommando #on("bold")##ib#start#ie##off("bold")# im Spoolmanager
- wieder neu einrichten.
-
-
- Sinnvollerweise gibt man #on("bold")#define station#off("bold")# sofort nachdem man ein frisches System
- vom Archiv geladen hat.
-
- Zum Anschluß einer #ib#Datenbox#ie# #ib#konfigurieren#ie# Sie mit dem Kommando #on("bold")##ib#configurate#ie##off("bold")#
- den für das Netz vorgesehenen #ib#Kanal#ie# auf
-
- - transparent
- - 9600 #ib#Baud#ie# (Standardeinstellung der Boxen)
- - #ib#RTS/CTS#ie#-#ib#Protokoll#ie#
- - großen Puffer
- - 8 bit
- - even parity
- - 1 stopbit.
-
- Falls diese Einstellungen nicht alle angeboten werden, klären Sie mit Ihrem
- Rechnerlieferanten, ob und wie diese Einstellungen erreicht werden können.
-
- Hinweis: Notfalls kann auf das #ib#RTS/CTS#ie#-Protokoll verzichtet werden, wenn der
- Eingabepuffer der #ib#Station#ie# groß genug ist. Die Anzahl simultan laufen­
- der Netzkommunikationen ist dann auf
-
- puffergröße DIV 150
-
- begrenzt (bei Z80, 8086: 3; bei M20: 10).
-
- Hinweis: Es können auch andere #ib#Baud#ie#raten (2400, 4800, 19200) an der Box
- eingestellt werden.
-
-
-c) Achten Sie bei der #ib#Verbindung#ie# von der Station zur #ib#Netzbox#ie# (bzw. zur Gegen­
- station bei einem Zweistationennetz ohne Boxen) darauf, daß neben den Emp­
- fangs- und Sendeleitungen auch die Leitungen RTS und CTS verdrahtet wer­
- den, also ein 5-poliges Kabel verwendet wird [2]. Die #ib#Pin-Belegung#ie# der Boxen
- entspricht der eines Kabels zur Rechner-Rechner-Kopplung.
-
- Beispiel:
-
- Verbindung eines BICOS-Systems mit der Box:
-
- Stecker Stecker
- Pin Pin
-
- 2 <---------> 3
- 3 <---------> 2
- 4 <---------> 5
- 5 <---------> 4
- 7 <---------> 7
-
-
-d) Richten Sie eine Task #on("bold")##ib#net#ie##off("bold")# unter #on("bold")#SYSUR#off("bold")# ein und legen Sie eine #ib#Datei#ie# #on("b")##ib#netz#ie##off("b")# an, die
- Ihre #ib#Netzkonfiguration#ie# enthält, oder ändern Sie die mitgelieferte Datei ent­
- sprechend ab (siehe auch 1.5.).#goalpage("sperre")#
-
-
- Dem bisherigen Netz entspricht eine Datei #on("b")#netz#off("b")# mit folgendem Inhalt:
-
- definiere netz;
- routen (1,127,k);
- starte kanal (k,1,x);
- aktiviere netz.
-
- k: ihr netzkanal.
- x: IF yes ("#ib#Flußkontrolle#ie#") THEN 10 ELSE 3 FI.
-
-
-
- Laden Sie die Datei #on("b")##ib#net install#ie##off("b")# vom Archiv #on("b")#net#off("b")# und übersetzen Sie diese. Je nach­
- dem, welche EUMEL-Version auf der Maschine installiert ist, werden die notwen­
- digen Programmdateien insertiert.
-
- Es sind dies
-
- net report
- net hardware interface
- basic net
- net manager
-
-
- Das Netz wird dabei gestartet.
-
-
- Hinweis: Obwohl die Task #on("b")#net#off("b")# sich noch mit #on("bold")##ib#continue#ie##off ("bold")# an ein Terminal holen
- läßt, sollte man dies nur kurzzeitig tun, da der Netzverkehr solange
- blockiert ist.
-
- In der #ib#Datei#ie# #on("b")#netz#off("b")# sollte der #ib#Kanal#ie#, über den der meiste Verkehr erwar­
- tet wird, zuerst gestartet werden. Für ihn wird die Task #on("b")##ib#net port#ie##off("b")# gene­
- riert, für jeden weiteren Kanal wird eine Task #on("b")##ib#net port#ie# k#off("b")# (k=Kanal­
- nummer) generiert.
-#page#
-
-1.3. Benutzung des Netzes
-#goalpage("1.3")#
-
-
-Zur Benutzung des Netzes stehen folgende Operatoren und Prozeduren zur Verfü­
-gung:
-
-
-
-TASK OP #ib#/#ie# (INT CONST station, TEXT CONST taskname)
-
-liefert die Task #on("bold")#taskname#off("bold")# von der #ib#Station#ie# #on("bold")#station#off("bold")#.
-
-
-#ib#Fehlerfälle#ie#:
-
- - #ib(4)#Task "...." gibt es nicht#ie(4)#
-
- Die angeforderte Task gibt es auf der #ib#Zielstation#ie# nicht.
-
- - #ib(4)##ib#Collectortask#ie# fehlt#ie(4)#
-
- die Task #on("b")##ib#net port#ie##off("b")# existiert nicht (siehe 6).
-
- Hinweis: #on("b")#net port#off("b")# wird bei jedem Start des Netzes neu generiert und beim
- Auftreten eines nicht vorhergesehenen #ib#Fehler#ie#s beendet. Die Feh­
- lermeldung steht im #on("b")##ib#report#ie##off("b")# (siehe 4).
-
- - #ib(4)#Station x antwortet nicht#ie(4)#
-
- Eine nicht vorhandene oder abgeschaltete Station wurde angesprochen.
-
- Hinweis: Dieser #ib#Fehler#ie# wird angenommen, wenn eine Ãœberwachungszeit von
- ca. 30 Sekunden verstrichen ist, ohne daß Station x die Taskidenti­
- fikation angeliefert hat.
-
- - #ib(4)#Station x gibt es nicht#ie(4)#
-
- #ib#Station#ie# x steht nicht in den #ib#Routentabelle#ie#n.
-
- Diese Meldung kann auch erscheinen, wenn Station x erst kürzlich an das Netz
- angeschlossen wurde. Sie steht dann noch nicht in den Routentabellen (siehe
- auch 5.3.).
-
- Beispiel:
-
- list (5/"PUBLIC")
-
- Die Dateiliste von PUBLIC der Station 5 wird angefordert.
-
-
-
-TASK OP #ib#/#ie# (INT CONST station, TASK CONST task)
-
-liefert
-
-station / name (task)
-
-Beispiel:
-
- list (4/public)
-
-
-Fehlerfall:
-
- "......" #ib(4)#gibt es nicht#ie(4)#
-
- Auf der eigenen Station gibt es die Task #on("b")#task#off("b")# nicht.
- Der Taskname wird auf der eigenen Station bestimmt, wenn es dort die Task
- nicht gibt, führt dies zur obigen Fehlermeldung.
-
-Abhilfe:
-
- Statt list(4/public) das Kommando list (4/"PUBLIC") verwenden.
-
-
-
-INT PROC #ib#station#ie# (TASK CONST task)
-
-liefert die #ib#Stationsnummer#ie# der Task #on("bold")#task#off("bold")#.
-
-Beispiel:
-
- put (station (myself))
-
- gibt die eigene Stationsnummer aus.
-
-
-
-
-PROC #ib#reserve#ie# (TEXT CONST archivename, TASK CONST archivetask)
-
-dient dazu, das Archiv auf der #ib#Station#ie# #on("bold")#station#off("bold")# anzumelden.
-
-Beispiel:
-
- reserve ("std", 4/"ARCHIVE"); #ib#list#ie# (4/"ARCHIVE")
-
- gibt das Inhaltsverzeichnis der Archivfloppy im Laufwerk der Station 4 aus.
-
- Hinweis: Vergessen Sie bei solchen #ib#Querarchivierungen#ie# nicht die Stationsangabe
- bei jedem einzelnen Archivkommando (z.B fetch ("xxx", #on("bold")#4/#off("bold")#
- "ARCHIVE")).
-
- Hinweis: Querarchivieren ist langsam. Verwenden Sie es nur, wenn Sie Floppy­
- formate umsetzen wollen.
-
-
-
-
-PROC #ib#free global manager#ie#
-
-dient dazu, die eigene Task über das Netz ansprechbar zu machen. Jede andere
-Task im Netz kann dann die üblichen #ib#Manager#ie#aufrufe (#on("bold")##ib#save#ie##off ("bold")#, #on("bold")##ib#fetch#ie##off ("bold")#, usw.) an die
-eigene Task machen, sofern diese nicht an ein Terminal gekoppelt ist.
-
-Die Task wird (wie bei #on("bold")#break#off ("bold")#) abgekoppelt und meldet sich in Zukunft mit #on("bold")#mainte­
-nance#off ("bold")# statt mit #on("bold")#gib kommando#off ("bold")#.
-
-Beispiel:
-
- An Station 4 ruft man in der Task "hugo" das Kommando #on("bold")#free global manager#off("bold")#
- auf. Anschließend kann man von jeder Station aus z.B. #on("bold")#list (4/"hugo")#off ("bold")# usw. auf­
- rufen.
-
-
-
-
-TEXT PROC #ib#name#ie# (TASK CONST t)
-
-Diese (schon immer vorhandene) Prozedur wurde dahingehend erweitert, daß der
-Name einer auf einer anderen Station existierenden Task über Netz angefordert wird.
-
-Existiert die Task nicht, so wird #on("bold")##ib#niltext#ie##off ("bold")# geliefert.
-
-Hinweis: Die Prozedur #on("bold")##ib#exists#ie##off ("bold")# wurde nicht auf das Netz ausgedehnt, da sie in Situa­
- tionen eingesetzt wird, wo es auf eine sehr schnelle Antwort ankommt.
- Daher liefert #on("bold")#exists#off ("bold")# für eine stationsfremde Task immer FALSE. Will man
- wissen, ob eine solche Task existiert, verwende man die Abfrage
-
- #on("bold")#IF name (task) <> "" THEN ... #off ("bold")#.
-
-#ib#Fehlerfall#ie#:
-
- - #ib(4)#Station x antwortet nicht#ie(4)#
-
- - #ib(4)##ib#Station#ie# x gibt es nicht#ie(4)#
-
-#page#
-
-1.4. Informationsmöglichkeiten
-
-#goalpage("1.4")#
-
-In der Task #on("bold")#net#off("bold")# wird eine #ib#Datei#ie# #on("bold")##ib#report#ie##off("bold")# geführt, in der #ib#Fehlersituationen#ie# des Netzes
-verzeichnet werden. Diese Datei kann in jeder anderen Task auf derselben Station mit
-#on("bold")##ib#list#ie# (/"#ib#net#ie#")#off("bold")# angesehen werden. Eine Erklärung der wichtigsten Meldungen finden Sie
-im Anhang.
-
-In jeder Task kann durch das Kommando #on("bold")##ib#list#ie# (/"#ib#net port#ie#")#off("bold")# eine Übersicht über die
-momentan laufenden #ib#Netzübertragungen#ie# der eigenen #ib#Station#ie# erhalten werden (nur für
-den #ib#Kanal#ie#, an dem #on("b")##ib#net port#ie##off("b")# hängt). Entsprechendes gilt für die weiteren Netports der
-eigenen Station.
-
-Mit #on("bold")##ib#list#ie# (/"#ib#net list")#ie##off("bold")# erhält man die Informationen, die man mit #on("b")#list (/"net")#off("b")# und #on("b")##ib#list#ie##off("b")# auf
-alle Netports bekommt, sofern #on("b")##ib#listoption#ie##off("b")# (siehe S. #topage("listop")#) beim Generieren des Netzes
-aufgerufen wurde. Dieser Aufruf funktioniert auch bei fremden Stationen (z.B. #on("b")#list
-(5/"net list")#off("b")#).
-
-#page#
-
-1.5. Eingriffsmöglichkeiten
-
-#goalpage("1.5")#
-
-- Jede Task kann #ib#Sende#ie(1,"ströme")#- und #ib#Empfangsströme#ie#, die bei #on("bold")#list (/"net port")#off("bold")# gemel­
- det worden sind und die eigene Task betreffen, abbrechen. Hierzu ist das Kom­
- mando #on("bold")##ib#erase#ie# ("x", /"#ib#net port#ie#")#off ("bold")# zu geben, wobei x die #ib#Stromnummer#ie# (aus dem #on("bold")#list#off ("bold")#)
- ist.
- Unberechtigte #ib#Löschversuche#ie# werden abgewiesen.
- Von privilegierten Tasks aus können jedoch mit #on("b")##ib#erase#ie##off("b")# beliebige Ströme abge­
- brochen werden.
-
-
-- Durch das Kommando #on("bold")##ib#start#ie##off("bold")# kann von der Task #on("b")##ib#net#ie##off("b")# aus das Netz neu gestartet
- werden. Dies setzt eine gültige #ib#Datei#ie# #on("bold")#netz#off("bold")# voraus. Es wird ein #on("bold")##ib#run#ie##off("bold")# auf diese Datei
- gegeben. Das Kommando #on("b")##ib#start#ie##off("b")# ist nur noch aus Kompatibilitätsgründen zum alten
- Netz vorhanden.
-
-
-- Durch das Kommando #on("bold")##ib#routen aufbauen#ie##off("bold")# in der Task #on("b")##ib#net#ie##off("b")# werden die #ib#Routentabelle#ie#n
- neu aufgebaut. Dies kann notwendig werden, wenn eine neue #ib#Station#ie# ans Netz
- angeschlossen wurde (#ib#Fehlermeldung#ie# '#ib(4)#Station x gibt es nicht#ie(4)#'). #on("bold")#routen aufbauen#off ("bold")#
- muß zuvor auch an allen dazwischenliegenden #ib#Knotenstation#ie#en gegeben werden.
-
- #on("bold")#routen aufbauen#off ("bold")# erzeugt eine Task #on("b")##ib#router#ie##off("b")#, die sich an das Terminal koppelt (die
- Task #on("b")#net#off("b")# koppelt sich ab) und ein #ib#Protokoll#ie# ausgibt. Sind die #ib#Route#ie#n aufgebaut,
- beendet sich die Task #on("b")#router#off("b")# mit der Meldung #on("b")#fertig#off("b")#. Es werden nur Stationen
- bearbeitet, die nicht #ib#gesperrt#ie# (siehe S. #topage("sperre")#), und für die keine festen Routen
- vereinbart sind. Der Vorgang dauert ca. 5 Sek. pro nicht gesperrter Station und
- #ib#Netzkanal#ie#. Die #ib#Route#ie#n werden in einem #ib#Datenraum#ie# #on("b")##ib#port intern#ie##off("b")# hinterlegt.
-
-
-- Der Aufruf #on("bold")##ib#definiere netz#ie##off("bold")# leitet eine #ib#Netzdefinition#ie# in der #ib#Datei#ie# #on("bold")##ib#netz#ie##off("bold")# ein. Dabei
- werden alle augenblicklichen Netzkommunikationen gelöscht. Die Tasks #on("b")##ib#net port#ie#
- (k)#off("b")#, wobei #on("b")#k#off("b")# die #ib#Kanalnummer#ie# ist, und #on("b")##ib#net timer#ie##off("b")# werden gelöscht.
-
- Dieser Aufruf muß vor den Aufrufen von #on("bold")##ib#starte kanal#ie#, #ib#erlaube#ie#, #ib#sperre#ie#, #ib#routen#ie#,
- #ib#aktiviere netz#ie# und #ib#list option#ie##off("bold")# erfolgen.
-
-
-- PROC #ib#sperre#ie# (INT CONST a,z)
- bewirkt, daß die Stationen #on("bold")#a#off("bold")# bis #on("bold")#z#off("bold")# keine Manageraufrufe an Tasks dieser Station
- geben dürfen (Genauer gesagt werden sendecodes > 6 nicht weitergeleitet, son­
- dern ein errornak mit dem Text "#ib(4)#kein Zugriff auf Station#ie(4)#" zurückgeschickt).
-
- Dieser Aufruf muß vor dem ersten #on("bold")##ib#starte kanal#ie##off("bold")# erfolgen.
-
-
-- PROC #ib#erlaube#ie# (INT CONST a,z)
- bewirkt, daß die Stationen #on("bold")#a#off("bold")# bis #on("bold")#z#off("bold")# Manageraufrufe an Tasks dieser Station geben
- dürfen.
-
- Dieser Aufruf muß vor dem ersten #on("bold")##ib#starte kanal#ie##off("bold")# erfolgen.
-
- Beispiel: Alle Stationen außer 8 und 10 sollen #ib#gesperrt#ie# sein:
-
- #ib#sperre#ie# (1,127); erlaube (8,8); erlaube (10,10)
-
- Hinweis: 127 ist z.Zt. die maximale #ib#Stationsnummer#ie(1," maximale")#.
-
-
-- PROC #ib#routen#ie# (INT CONST a,z,k)
- legt fest, daß die Stationen #on("bold")#a#off("bold")# bis #on("bold")#z#off("bold")# an #ib#Kanal#ie# #on("bold")#k#off("bold")# direkt angeschlossen sind. Sen­
- dungen dieser Stationen werden nur bearbeitet, wenn sie über diesen Kanal her­
- einkommen (siehe 1.7.). Fehlt für eine Station ein entsprechender Routenaufruf, so
- darf sie über einen beliebigen #ib#Netzkanal#ie# angeschlossen sein. Dies wird dann von
- #on("bold")##ib#routen aufbauen#ie##off("bold")# ermittelt.
-
- PROC routen (INT CONST a,z,k,zw)
- legt fest, daß die Stationen #on("bold")#a#off("bold")# bis #on("bold")#z#off("bold")# indirekt über die #ib#Knotenstation#ie# #on("bold")#zw#off("bold")# angeschlos­
- sen sind, und #on("b")#zw#off("b")# am Kanal #on("bold")#k#off("bold")# hängt.
-
-
-- PROC #ib#starte kanal#ie# (INT CONST k,m,q)
- startet eine #ib#Netztask#ie# am #ib#Kanal#ie# #on("bold")#k#off("bold")# im Modus #on("bold")#m#off("bold")# [4]. Dabei wird mit #on("bold")#q#off("bold")# die Anzahl
- paralleler #ib#Empfangsströme#ie# festgelegt. Dadurch kann erreicht werden, daß der
- #ib#Empfangspuffer#ie# nicht überläuft, indem nicht mehr als #on("b")#q#off("b")# Ströme quittiert werden.
- Bei #ib#V.24#ie#-#ib#Schnittstelle#ie#n gebe man 3 (ohne #ib#Flußkontrolle#ie#) bzw. 10 (mit Flußkon­
- trolle) an.
-
-
-- PROC #ib#aktiviere netz#ie#
- muß als Abschluß in der Datei #on("bold")##ib#netz#ie##off("bold")# aufgerufen werden. Dabei wird die Task vom
- Terminal abgekoppelt. Falls es bei #on("bold")##ib#definere netz#ie##off("bold")# den #ib#Datenraum#ie# #on("b")##ib#port intern#ie##off("b")#, der
- die #ib#Route#ie#n enthält, nicht gab, wird #on("bold")##ib#routen aufbauen#ie##off("bold")# aufgerufen.
-
-
-- PROC #ib#listoption#ie##goalpage("listop")#
- erzeugt eine Task #on("b")##ib#net list#ie##off("b")#, die bei #on("bold")#list#off("bold")# den #ib#Fehlermeldung#ie#sreport und den Zustand
- aller Netports liefert. Diese Task ist auch über Netz ansprechbar. In der Regel
- sollte man #on("b")#listoption#off("b")# in der Datei #on("b")#netz#off("b")# aufrufen, es sei denn, das System ist sehr
- klein.
-
-#page#
-
-1.6. #ib#Fehlersuche#ie# im Netz
-
-#goalpage("1.6")#
-
-#ib#Fehler#ie# im Netz können sich verschiedenartig auswirken. Im folgenden wird auf einige
-Beispiele eingegangen:
-
-Beispiel:
-
- Auf #on("bold")#list (4/public)#off("bold")# erfolgt die Meldung '#ib(4)#Station#ie(4, " x antwortet nicht")# 4 antwortet nicht'.
-
-
-#ib#Fehler#ie#möglichkeiten:
-
- - #ib#Station#ie# 4 ist nicht eingeschaltet.
- Abhilfe: Station 4 einschalten. Kommando erneut geben.
-
-
- - #ib#Netztask#ie# an Station 4 ist nicht arbeitsfähig.
- Abhilfe: Kommando #on("bold")##ib#start#ie##off ("bold")# in der Task "net" auf Station 4.
-
-
- - Stationsnummern und Boxnummern stimmen nicht überein.
- Abhilfe: Mit #on("bold")#define station#off ("bold")# #ib#Stationsnummer#ie#n korrigieren (siehe 3.2).
-
-
- - #ib#Verbindung#ie# Rechner/Box am eigenen Rechner oder an Station 4 fehlt.
- Abhilfe: Verbindungen überprüfen. Durch Ansprechen einer dritten Station
- kann oft schnell geklärt werden, welche Rechner/Box-Verbindung
- defekt sein muß.
-
-
- - Verbindung der Boxen untereinander defekt.
- Abhilfe: Fehlende Verbindung, #ib#Masseschluß#ie# und #ib#Dreher#ie# (keine 1:1 Verbin­
- dung) überprüfen und beheben.
-
- Hinweis: Liegt z.B. ein Masseschluß vor, so kann es durchaus sein, daß
- Boxen, die nicht in der Nähe des Masseschlusses stehen, noch
- miteinander arbeiten können. Man kann aus der Tatsache, daß zwei
- Boxen miteinander arbeiten können, also nicht schließen, daß man
- nicht nach diesem Fehler suchen muß.
-
-
-
-Beispiel:
-
- Auf #on("bold")#list (4/public)#off("bold")# erfolgt keine Reaktion.
-
-
- - Station 4 ist während dieser Sendung zusammengebrochen.
- Abhilfe: Station 4 wieder starten. Die Bearbeitung des #on("bold")##ib#list#ie##off ("bold")#-Kommandos wird
- automatisch wieder aufgenommen.
-
-
- - PUBLIC auf Station 4 ist nicht im Managerzustand.
- Abhilfe: PUBLIC in den Managerzustand versetzen.
-
-
- - #ib#Fehler#ie# in der #ib#Netzhardware#ie#.
- Überprüfen Sie, ob
-
- - die Boxen eingeschaltet sind,
- - die Bereitlampe blinkt (wenn nicht: #ib#RESET#ie# an der Box),
- - die #ib#V.24#ie#-Kabel richtig stecken,
- - die Boxen untereinander verbunden sind (1 zu 1 Verbindungen der 5 poli­
- gen Diodenbuchsen).
-
-
- - Fehler bei der #ib#Netzinstallation#ie#.
- Überprüfen Sie, ob
-
- - alle Stationen an einem #ib#Strang#ie# gleiche oder kompatible Netzmodi einge­
- stellt haben [4],
- - alle Stationen an einem #ib#Netzstrang#ie# auf die gleiche #ib#Nutzdatenlänge#ie# einge­
- stellt sind,
- - bei der #ib#Kommunikation#ie# über #ib#Knoten#ie# alle Stationen die gleiche Nutzdaten­
- länge bei indirekten Sendungen eingestellt haben,
- - die #ib#Route#ie#n auf allen beteiligten Stationen korrekt eingestellt sind.
-
-
-
-Beispiel:
-
- Auf #on("bold")#list (4/public)#off("bold")# erfolgt die Meldung '#ib(4)##ib#Collectortask#ie# fehlt#ie(4)#'.
-
- - Das Kommando #on("b")##ib#start#ie##off("b")# (bzw #on("b")##ib#aktiviere netz#ie##off("b")# in der #ib#Datei#ie# #on("b")#netz#off("b")#) wurde nicht gege­
- ben. Somit existiert #on("b")##ib#net port#ie##off("b")# nicht.
- Abhilfe: Kommando #on("bold")#start#off ("bold")# in der Task #on("b")#net#off("b")# geben.
-
-
- - Die #ib#Netzsoftware#ie# ist auf einen nicht vorhergesehenen #ib#Fehler#ie# gelaufen. Dieser
- wird im #ib#Report#ie# vermerkt. #on("b")##ib#net port#ie##off("b")# wird dabei gelöscht.
- Abhilfe: Geben Sie in der Task #on("bold")#net#off("bold")# das Kommando #on("bold")#start#off("bold")#. Dadurch wird die
- Netzsoftware neu gestartet. Alle Netzkommunikationen dieser Station
- gehen verloren.
-
-
-
-Beispiel:
-
- Nach #on("bold")##ib#fetch#ie# ("hugo",4/public)#off("bold")# sind Teile der Datei "hugo" verfälscht.
-
- - Die #ib#V.24#ie#-#ib#Verbindung#ie# zur Box ist nicht in Ordnung.
- Abhilfe: Abstand zwischen Rechner und Box verkürzen; #ib#Baud#ie#rate ernie­
- drigen; durch Wechseln der #ib#V.24#ie#-#ib#Schnittstelle#ie# feststellen, ob diese
- defekt ist.
- Hinweis: Die Verbindung zwischen den Boxen ist durch #ib#Prüfsummen#ie# abge­
- sichert (Hardware).
-
-#page#
-
-1.7. Sicherheit im Netz
-
-#goalpage("1.7")#
-
-Bei Benutzung eines Rechnernetzes tauchen neue #ib#Sicherheitsprobleme#ie# auf. Um sie
-verstehen und eingrenzen zu können, muß man sich mit dem #ib#Sicherheitskonzept#ie# des
-Betriebssystems EUMEL vertraut machen:
-
-Eine Task im EUMEL kann nur manipuliert werden, wenn man sie entweder an ein
-Terminal koppelt oder ihr Sendungen zustellt.
-
-Das Ankoppeln kann über #ib#Paßwort#ie# abgesichert werden. Nach dem Ankoppeln kann
-die Task außerdem selbst bestimmen, wie sie die dann möglichen Eingaben behan­
-delt. So kann z.B. noch ein komplizierter Paßalgorithmus zu durchlaufen sein, bis
-man auf einer offenen Programmierumgebung landet.
-
-Sendungen können eine Task auch nur mit ihrem Einverständnis beeinflussen, da
-eine Sendung nur zugestellt wird, wenn die Task in der Prozedur #on("b")##ib#wait#ie##off("b")# steht. Insbe­
-sondere kann die Task den Absender einer Sendung überprüfen und gewisse Opera­
-tionen nur bei gewissen Absendern zulassen. So lehnt ein #on("b")##ib#global manager#ie##off("b")# z.B. alle
-Dateimanagerkommandos ab, die nicht von Nachkommen (z.B. Söhnen) der Task
-kommt. #on("b")##ib#free global manager#ie##off("b")# hingegen läßt Operationen wie #on("b")##ib#save#ie##off("b")# oder #on("b")##ib#erase#ie##off("b")# von
-beliebigen Tasks, auch von fremden #ib#Station#ie#en, zu. Will man nur bestimmte Fremd­
-stationen zulassen, kann man z.B. folgendes Schema verwenden:
-
- PROC my #ib#manager#ie#
- (DATASPACE VAR ds, INT CONST code, phase, TASK CONST source):
-
- IF station (source) = station (myself) OR station (source) = 10
- THEN
- free manager (ds, code, phase, source)
- ELSE
- errorstop ("kein Zugriff")
- FI
-
- END PROC my manager;
-
- global manager (PROC my manager)
-#page#
-Hier werden nur #on("b")#save#off("b")# usw. von Tasks der eigenen Station und der Station 10 zuge­
-lassen. Der Rest erhält die #ib#Fehlermeldung#ie# "kein Zugriff".
-
-Dieses Verfahren gewährt nur dann Sicherheit, wenn es nicht möglich ist, daß eine
-beliebige Station sich als Station 10 ausgibt.
-
-Damit das Netz diese Sicherheit garantieren kann, müssen natürlich gewisse phy­
-sische Voraussetzungen erfüllt sein. Wenn z.B. die Station 10 über eine #ib#V.24#ie# ange­
-schlossen ist, aber jeder die Möglichkeit hat, an diese #ib#Schnittstelle#ie# seinen eigenen
-Rechner anzuschliessen, dann kann das Netz natürlich nicht erkennen, ob es mit der
-echten Station 10 verkehrt.
-
-Es muß also sichergestellt sein, daß an Kanälen für das Netz nicht manipuliert werden
-kann. Bei einem #ib#Strang#ie# (Anschluß über #ib#Netzbox#ie#en) heißt das für die Boxen, daß sie
-nur #ib#Telegramm#ie#e weitervermitteln, die die eingestellte #ib#Quellstationsnummer#ie# enthalten.
-Sonst könnte jemand, der an denselben Strang wie #ib#Station#ie# 10 angeschlossen ist,
-#ib#Telegramm#ie#e erzeugen, die so aussehen, als kämen sie von 10.
-
-Die #ib#Netzsoftware#ie# ihrerseits darf nur Telegramme auswerten, die über die richtige
-#ib#Route#ie# (#ib#Kanal#ie# und #ib#Knotenstation#ie#) einlaufen.
-
-Leider hat dies die unangenehme Konsequenz, daß man automatisches Aufbauen und
-Ändern von Routen verbieten muß, wodurch die Wartung der #ib#Netzkonfiguration#ie#
-erschwert wird.
-
-Diese Version der #ib#Netzsoftware#ie# bietet den folgenden Kompromiß an: Nur für sicher­
-heitsrelevante #ib#Stationen#ie(1,", sicherheitsrelevante")# (im Beispiel Station 10) muß in der #ib#Datei#ie# #on("b")##ib#netz#ie##off("b")# die Route
-angegeben werden. Dies muß in allen Stationen geschehen, für die die Station
-sicherheitsrelevant ist, und in allen #ib#Knoten#ie# dazwischen.
-
-Für nicht sicherheitsrelevante Stationen werden #ib#Routeninformationen#ie# automatisch
-aufgebaut und geändert.
-
-Hinweis:
-Man wird oft ohne sicherheitsrelevante Stationen auskommen, indem man auf Ebenen
-oberhalb der Netzebene Paßwortkontrollen einführt. So ist es z.B. ja möglich, Dateien
-durch Paßworte zu schützen. Ein weiteres Beispiel ist ein #ib#Printerserver#ie#, der nur
-ausdruckt, wenn eine mitgegebene Abrechnungskennung stimmt. Dabei ist es sogar
-wünschenswert, daß die #ib#Station#ie# irrelevant ist, die den Druckauftrag gibt.
-#pagenr ("%",21)##setcount (1)##block##pageblock##count per page#
-#headeven#
-#center#EUMEL Netzbeschreibung
-#center#____________________________________________________________
-
-#end#
-#headodd#
-#center#Teil 2 : Arbeitsweise der Netzsoftware
-#center#____________________________________________________________
-
-#end#
-#bottomeven#
-#center#____________________________________________________________
-Netz - % #right#GMD
-#end#
-#bottomodd#
-#center#____________________________________________________________
-GMD #right#Netz - %
-#end#
-#page#
-
-Teil 2: Arbeitsweise der Netzsoftware
-#goalpage("2")#
-
-
-
-2.1. Die Netztask
-#goalpage("2.1")#
-
-
-In diesem Kapitel wird beschrieben, wie eine #ib#Netztask#ie# in das System eingebettet ist
-und welche Aufgaben sie hat. Unter Einhaltung dieser Konzepte kann die ausgeliefer­
-te Netzsoftware so geändert werden, daß sie beliebige andere #ib#Netzhardware#ie# unter­
-stützt. Die Netzsoftware ist so gegliedert, daß i.allg. nur eine hardwareabhängige
-Komponente ausgetauscht werden muß (siehe Teil 3).
-
-Die Kommunikation zwischen Tasks im EUMEL-Betriebssystem basiert auf einem
-#ib#Rendezvouskonzept#ie#: Die #ib#Zieltask#ie# einer Sendung muß empfangsbereit sein, wenn die
-#ib#Quelltask#ie# sendet.
-
-Die Kommunikationsprozeduren auf der niedrigsten Ebene sind #on("bold")##ib#send#ie##off ("bold")# (Senden) und
-#on("bold")##ib#wait#ie##off ("bold")# (Warten auf Empfang). Bei der Kommunikation werden ein Integer #on("bold")#code#off ("bold")# und ein
-#ib#Datenraum#ie# #on("bold")#dr#off ("bold")# übergeben. #on("bold")#code#off ("bold")# muß >= 0 sein, da negative Codes systemintern ver­
-wandt werden. Ist die empfangende Task an einen #ib#Kanal#ie# gekoppelt (#on("bold")##ib#continue#ie##off ("bold")#), so
-führt eine Zeicheneingabe auf diesem Kanal dazu, daß eine Sendung mit dem Code
--4 ankommt. Die Eingabedaten müssen mit den üblichen #ib#Eingabeprozeduren#ie# (#on("bold")##ib#inchar#ie##off ("bold")#
-usw.) abgeholt werden. Der übermittelte #ib#Datenraum#ie# und die Absendertask sind dabei
-ohne Bedeutung und dürfen nicht interpretiert werden.
-
-Die Prozedur #on("bold")#send#off ("bold")# hat einen #ib#Rückmeldeparameter#ie#, der besagt, ob die Sendung
-übermittelt wurde. Gibt es die Zieltask nicht oder steht sie nicht im #on("bold")#wait#off ("bold")#, so kann die
-Sendung nicht übermittelt werden.
-
-Ein Entwicklungskriterium für das EUMEL-Netz war es, möglichst wenig Unterstüt­
-zung von der virtuellen EUMEL-Maschine (#ib#EUMEL0#ie#) zu fordern, damit weitgehend in
-ELAN programmiert werden kann. Dadurch ist es möglich, eine (privilegierte) Task mit
-der Netzabwicklung zu betrauen.
-#page#
-Zunächst wird auf die #ib#EUMEL0#ie#-Unterstützung eingegangen:
-
-a) Es gibt die Prozedur #on("bold")##ib#define collector#ie##off ("bold")#, mit der die für das Netz verantwortliche
- Task der EUMEL0-Maschine bekannt gemacht wird. Diese Task wird im fol­
- genden #ib#Collector#ie# genannt.
-
-b) Es gibt die Prozedur #on("bold")##ib#define station#ie##off ("bold")#, die für den Rechner eine #ib#Stationsnummer#ie#
- einstellt. Anhand dieser Nummer werden die Rechner eines Netzes unterschie­
- den. Das Einstellen bewirkt, daß für alle Tasks die Stationsnummer in ihre
- #ib#Task-Id#ie# eingetragen wird (Task-Id's sind die Werte, die der Typ TASK anneh­
- men kann).
-
-c) Der Befehl #on("bold")##ib#station#ie# (task)#off ("bold")# liefert die Stationsnummer der #on("bold")#task#off ("bold")#. So liefert z.B.
- #on("bold")##ib#station#ie# (myself)#off ("bold")# die #ib#Stationsnummer#ie# des eigenen Rechners.
-
-d) Eine Sendung, deren #ib#Zieltask#ie# auf einem anderen Rechner liegt (also station (ziel)
- <> station (myself)), wird auf die #ib#Collectortask#ie# geleitet.
-
-e) Es gibt eine Prozedur #on("bold")##ib#collected destination#ie##off ("bold")#, die es dem Collector erlaubt, die
- eigentliche Zieltask einer auf ihn geleiteten Sendung zu erfahren.
-
-f) Es gibt eine Variante der Prozedur #on("bold")##ib#send#ie##off ("bold")#, die es dem Collector gestattet, der
- #ib#Zieltask#ie# eine andere Task als Absender vorzutäuschen.
-
-g) Es gibt eine spezielle #ib#Task-Id#ie# #on("bold")##ib#collector#ie##off ("bold")#, durch die der augenblicklich eingestell­
- te #ib#Collector#ie# erreicht wird. Diese wird als Zieltask beim Aufruf der Vermittlungs­
- dienste angegeben (siehe S. #topage("collector")#). Eine Sendung an #on("bold")#collector#off ("bold")# wird von EUMEL0
- an den derzeitig eingestellten Collector geschickt.
-
-Ein Collector kann also auf drei Wegen von den übrigen Tasks desselben Rechners
-Sendungen erhalten:
-
- 1. Ãœber ein normales #on("b")#send#off("b")# (z.B. bei #on("bold")#list (/"net port")#off ("bold")#, wenn #on("b")#net port#off("b")# der derzeitige
- #ib#Collector#ie# ist),
-
- 2. über ein #on("b")#send#off("b")# an die Task #on("bold")#collector#off ("bold")# (s.u.) und
-
- 3. als umgeleitete Sendung (z.B. bei #on("bold")#list#off ("bold")# an eine Task auf einem anderen
- Rechner).
-
-Der Collector kann diese Fälle anhand von #on("bold")#collected destination#off ("bold")# unterscheiden.
-
-Die Punkte d) bis f) dienen dazu, den Collector für über Netz kommunizierende Tasks
-unsichtbar zu machen: Der Collector taucht nicht als Ziel oder #ib#Quelle#ie# von Sendungen
-auf. Das ist notwendig, damit normale Tasks sich nicht darum kümmern müssen, ob
-eine Sendung übers Netz geht oder im eigenen Rechner bleibt.
-
-Wenn ein #ib#Datenraum#ie# an einen anderen Rechner geschickt wird, muß der gesamte
-Inhalt (z. Zt. max. 1 MB) übertragen werden. Dies macht bei der üblichen Netzhard­
-ware eine Zerlegung in #ib#Paket#ie#e nötig [5]. Bei der Zerlegung eines Datenraumes in
-Pakete (#ib#Telegramm#ie#e) gelten folgende Einschränkungen:
-
- - Ein Paket kann maximal eine #ib#Datenraumseite#ie# als #ib#Nutzdaten#ie# enthalten.
-
- - Die #ib#Nutzdatenlänge#ie# ist für einen #ib#Übertragungsweg#ie# konstant.
-
- - Alle Stationen eines #ib#Netzstrang#ie#s senden mit gleicher Nutzdatenlänge (#on("b")##ib#data
- length#ie##off("b")#).
-
- - Bei indirekter #ib#Kommunikation#ie(1,"indirekte")# (über #ib#Knoten#ie#) muß die Nutzdatenlänge für in­
- direkte Verbindungen (#on("b")##ib#data length via node#ie##off("b")#) auf allen beteiligten Stationen
- gleich eingestellt sein.
-
-
-Für Netze stehen spezielle Blockbefehle zur Verfügung:
-
-
-g) #ib#blockin#ie# / #ib#blockout#ie# (dr,seite,512+abstand,anzahl,rest)
-
- Es werden maximal #on("bold")#anzahl#off ("bold")# Bytes transferiert. In #on("bold")#rest#off ("bold")# wird zurückgemeldet, wie
- viele Bytes nicht bearbeitet wurden (z.B. weil der #ib#Kanal#ie# nichts anliefert). Bear­
- beitet werden die Bytes
-
- #on("bold")#seite#off ("bold")# * 512 + #on("bold")#abstand#off ("bold")#
-
- bis maximal
-
- #on("bold")#seite#off ("bold")# * 512 + #on("bold")#abstand#off ("bold")# + #on("bold")#anzahl#off ("bold")# - 1
-
- Der Kanal, an den die Task gekoppelt ist, wird dabei über #ib#Stream-IO#ie# (d.h.
- #on("bold")##ib#incharety#ie##off ("bold")#, bei #on("bold")#blockin#off ("bold")# bzw. #on("bold")#out#off ("bold")# bei #on("bold")#blockout#off ("bold")#) angesprochen.
-
- Hinweis: Die Anforderung darf nicht über #ib#Seitengrenze#ie# gehen, d.h.
-
- #on("bold")#abstand#off ("bold")# + #on("bold")#anzahl#off ("bold")# <= 512
-
- muß erfüllt sein.
-
-
-Eine Netzsendung läuft wie folgt ab:
-
-Die Task q auf Rechner rq mache ein #on("bold")##ib#send#ie##off ("bold")# an die Task z auf Rechner rz.
-
-1. Die Prozedur #on("bold")#send#off ("bold")# ist ein #ib#EUMEL0#ie#-Befehl. Die EUMEL0-Ebene erkennt, daß die
- Sendung an die #ib#Station#ie# rz geht, da die #ib#Stationsnummer#ie# in der #ib#Task-Id#ie# enthalten
- ist. Daher wird die Sendung zum #ib#Collector#ie# umgeleitet, den EUMEL0 wegen der
- Einstellung durch #on("bold")##ib#define collector#ie##off ("bold")# kennt, umgeleitet.
-
-2. Die Task Collector empfängt über #on("bold")##ib#wait#ie##off ("bold")# den #ib#Datenraum#ie#, den #ib#Sendecode#ie# und die
- Absendertask q. Die #ib#Zieltask#ie# z erfährt sie durch #on("bold")##ib#collected destination#ie##off ("bold")#.
-
-3. Der Collector nimmt Kontakt mit dem Collector des Rechners #on("b")#rz#off("b")# auf, dessen Sta­
- tionsnummer ja #on("bold")##ib#station#ie#(z)#off ("bold")# ist, und übermittelt diesem Sendecode, #ib#Quelltask#ie# (q),
- eigentliche Zieltask (z) und den #ib#Datenraum#ie#. Da die Collectoren in ELAN geschrie­
- ben sind, können sie an beliebige #ib#Netzhardware#ie# und #ib#Protokoll#ie#e angepaßt werden.
-
-4. Der #ib#Collector#ie# auf Rechner #on("b")#rz#off("b")# verwendet das spezielle #on("bold")#send#off ("bold")#, um der Zieltask die
- Sendung zuzustellen. Dadurch erscheint nicht der Collector, sondern die Task #on("b")#q#off("b")#
- als Absender der Sendung.
-
-Zur Abwicklung der #ib#Vermittlungsebene#ie# (siehe S. #topage("vermittlung")#) muß der Collector noch spe­
-zielle Funktionen beherrschen. Diese sind
-
- der #on("b")##ib#/#ie#-Operator#off("b")# (Taskname in #ib#Task-Id#ie# wandeln) und
- die #on("b")##ib#name#ie##off("b")#-Prozedur (Task-Id in Namen wandeln).
-
-Der #on("b")#/#off("b")#-Operator macht eine Sendung an den #on("bold")##ib#collector#ie##off ("bold")#, wobei im #ib#Datenraum#ie# der Name
-der Task steht und der #ib#Sendecode#ie# gleich der Stationsnummer ist (siehe [6] ). Der
-#ib#Collector#ie# setzt sich mit dem Collector dieser Station in Verbindung, damit dieser die
-Task-Id ermittelt und zurückschickt. Der eigene Collector schickt dann dem #on("b")#/#off("b")#-Oper­
-ator als Antwort einen Datenraum, der die #ib#Task-Id#ie# enthält.
-
-Umgekehrt läuft #on("bold")##ib#name#ie##off ("bold")# ab: Wenn die Task-Id von einer fremden Station ist, schickt
-#on("bold")#name#off ("bold")# eine Sendung an den #on("bold")##ib#collector#ie##off ("bold")#, wobei im Datenraum die Task-Id steht und
-Sendecode = 256 ist. Der Collector entnimmt die #ib#Stationsnummer#ie# der Task aus der
-Task-Id und läßt sich vom entsprechenden Collector den Tasknamen geben. Dieser
-wird der #on("bold")#name#off ("bold")#-Prozedur im Antwortdatenraum übergeben.
-
-Netztasks bauen sich #ib#Routentabellen#ie# auf (#ib#Datei#ie#name #on("b")##ib#port intern#ie##off("b")#). Aufgrund dieser
-Tabellen weiß jede #ib#Netztask#ie#, über welchen #ib#Kanal#ie# und welche #ib#Nachbarstation#ie# eine
-#ib#Zielstation#ie# erreichbar ist. Wenn der #ib#Collector#ie# einen Sendeauftrag erhält, prüft er, ob
-die Zielstation über seinen Kanal erreichbar ist. Wenn nicht, leitet er Parameter und
-#ib#Datenraum#ie# der Sendung an die geeignete Netztask weiter.
-#page#
-
-2.2. Ebenen
-
-#goalpage("2.2")#
-
-In diesem Kapitel werden die #ib#Protokollebenen#ie# für das Netz beschrieben, wie sie die
-ausgelieferte Netzsoftware benutzt und erwartet. Bei anderer Netzhardware als Daten­
-boxen müssen die Ebenen a) bis c) ausgetauscht werden [4]. Unter Einhaltung der im
-vorigen Kapitel beschriebenen Randbedingungen können auch die höheren Ebenen
-geändert werden.
-
-
-a) Physikalische Ebene
-
- - #ib#Station#ie# <--> Box
-
- #ib#V.24#ie#-#ib#Schnittstelle#ie# mit #ib#RTS/CTS#ie#-Handshake. Vollduplex.
-
- - Box <--> Box
-
- #ib#RS422#ie# über 2 verdrillte Leitungspaare (Takt und Daten).
-
-
-b) Verbindungsebene
-
- - Station <--> Box
-
- Asynchron
- 8 Bit
- Even Parity
- 2400/4800/9600/19200 #ib#Baud#ie# einstellbar über Lötbrücken)
-
- - Box <--> Box
-
- #ib#SDLC#ie#
- 400 KBaud
-#page#
-c) #ib#Netzebene#ie#
-#goalpage("quelle")#
-
- - Station <--> Box
-
- #ib#Telegrammformat#ie#: #ib#STX#ie#, <n>, <ziel>, <#ib#quelle#ie#>, <(n-4) byte>
-
- <n> ist #ib#Längenangabe#ie# ( 8 <= n <= 160)
- <ziel>, <quelle> sind #ib#Stationsnummer#ie#n. Diese müssen an den jeweiligen
- Boxen eingestellt sein.
-
- Box --> Station:
-
- Ein #ib#Telegramm#ie# kommt nur bei der #ib#Station#ie# an, bei deren Box die Nummer
- <ziel> eingestellt ist. Dadurch ist ein Mithören fremder #ib#Übertragung#ie# nicht
- möglich (Datenschutz).
-
- Zwischen Telegrammen können #ib#Fehlermeldung#ie#en der Box (Klartext) übermittelt
- werden (z.B. 'skipped x', wenn ein #ib#STX#ie# von der Box erwartet wurde, aber 'x'
- von der Station ankommt).
-
- Station --> Box:
-
- Ein Telegramm wird nur abgeschickt, wenn <#ib#quelle#ie#> mit der eingestellten
- Nummer übereinstimmt (Datenschutz: Man kann nicht vorschwindeln, eine
- beliebige Station zu sein, es sei denn, man hat physischen Zugriff zur Box und
- stellt dort die Stationsnummer um).
-
- - Box <--> Box
-
- #ib#Telegrammformat#ie#:
- FRAME, <ziel>, <#ib#quelle#ie#>, <daten>, <CRC-Code>
-
- Eine #ib#Längenangabe#ie# ist nicht nötig, da #ib#SDLC#ie# eine Rekonstruktion der Länge
- erlaubt.
-
- Telegramme mit falschen #ib#CRC-Code#ie# werden vernichtet. Auf höheren Ebenen
- muß dies durch #ib#Zeitüberwachung#ie# erkannt und behandelt werden.
-
-#page#
-d) Transportebene
-
- Diese Ebene wickelt das Rendezvous zwischen einer Task, die #on("bold")##ib#send#ie##off ("bold")# macht, und
- einer Task, die im #on("bold")##ib#wait#ie##off ("bold")# steht, ab [1].
-
- Der im #on("bold")#send#off ("bold")# angegebene #ib#Datenraum#ie# wird als Folge von #ib#Seiten#ie# (im EUMEL-
- Sinne: Pagingeinheit und Allokiereinheit) übermittelt, wobei jede Seite ggf. noch in
- n Byte große Stücke zerlegt wird. Es werden nur echt allokierte Seiten übermit­
- telt. Um nicht jedes #ib#Telegramm#ie# voll qualifizieren zu müssen, wird zunächst eine
- Art virtuelle #ib#Verbindung#ie# durch ein #ib#OPEN#ie#-Telegramm eröffnet. Danach folgen
- variabel viele #ib#DATA#ie#-Telegramme. Beide Sorten werden durch #ib#QUIT#ie#-Tele­
- gramme quittiert, um folgende Funktionen zu ermöglichen:
-
- #ib#Flußkontrolle#ie# (z.B. Zielrechner langsam),
- Wiederaufsetzen (verlorene Telegramme),
- Abbruch (z.B. weil Zieltask inzwischen beendet).
-
- Ein #ib#CLOSE#ie#-Telegramm ist nicht nötig, da das letzte DATA-Telegramm als
- solches erkannt werden kann (siehe unten).
-#page#
- - #ib#OPEN#ie#-Telegramm
-
-#clear pos#
- 0 1 2 3 4 5 6 7 8 9. Byte
-+------+------+------+------+-------------+-------------+-------------------+
-I STX I 24 I Ziel IQuelleI Endziel I Endquelle I Strom I
-+------+------+------+------+-------------+-------------+-------------------+
-
- 10 11 12 13 14 15 16 17
-+-------------+-------------+---------------------------+
-I Sequenz I Seite I Quelltask I
-+-------------+-------------+---------------------------+
-
- 18 19 20 21 22 23
-+---------------------------+-------------+
-I Zieltask I Code I
-+---------------------------+-------------+
-
-
-
- <#ib#ziel#ie#>, <#ib#quelle#ie#> siehe S. #topage("quelle")#
-
- <#ib#endziel#ie#> Eigentliche #ib#Zielstation#ie#. Ist <ziel> = <endziel>, so ist
- das #ib#Telegramm#ie# angekommen. Andernfalls muß die Station
- <ziel> den #ib#Nachbarn#ie# zum Erreichen des <endziel> als
- neues <ziel> einsetzen und das Telegramm an diesen
- Nachbarn weiterleiten.
-
- <#ib#endquelle#ie#> Eigentliche #ib#Absenderstation#ie#. <quelle> ist dagegen immer
- die Nummer der sendenden #ib#Nachbarstation#ie#.
-
- <#ib#strom#ie#> Die #ib#Stromnummer#ie# identifiziert die virtuelle #ib#Verbindung#ie#. Sie
- muß in den #ib#QUIT#ie#-Telegrammen angegeben werden.
-
- <#ib#sequenz#ie#> -1 (Kennzeichen für OPEN)
-
- <#ib#seite#ie#> Nummer der ersten echt allokierten #ib#Seite#ie# des #ib#Datenraum#ie#s
- (=-1, falls Nilspace)
-
- <#ib#quelltask#ie#> #ib#Task-Id#ie# der sendenden Task
-
- <#ib#zieltask#ie#> Task-Id der empfangenden Task
-
- <code> Wert des im #on("bold")##ib#send#ie##off ("bold")# angegebenen Codes
-#page#
- - #ib#DATA#ie#-Telegramm
-
-
-
-
-
- 0 1 2 3 4 5 6 7 8 9. Byte
-+------+------+------+------+-------------+-------------+-------------------+
-I STX I LängeI Ziel IQuelleI Endziel I Endquelle I Strom I
-+------+------+------+------+-------------+-------------+-------------------+
-
- 10 11 12 13 14
-+-------------+-------------+-----------------------------------------------+
-I Sequenz I Seite I n Byte Daten (Länge = 14 + n) I
-+-------------+-------------+-----------------------------------------------+
-
-
- <#ib#laenge#ie#> Gesamtlänge des Telegramms.
- #on("b")#laenge#off("b")# = #on("b")##ib#nutzlaenge#ie##off("b")# + 14.
- Für #on("b")#nutzlaenge#off("b")# sind nur die Werte 64,128,256 und 512
- zugelassen (siehe 1). #on("b")#laenge#off("b")# wird codiert dargestellt (siehe
- Teil 3).
-
-
- <#ib#sequenz#ie#> wird von Telegramm zu Telegramm hochgezählt. Sie dient
- der Ãœberwachung bzgl. verlorengegangener Telegramme
- bzw. durch #ib#Zeitüberwachung#ie# verdoppelter Telegramme.
-
- <#ib#seite#ie#> Nummer der x-ten echt allokierten Seite des #ib#Datenraum#ie#s
- (x = ((<sequenz> DIV anzahl pakete pro seite) + 2)
-
- <n byte> #ib#Nutzinformation#ie#. Diese gehört zur #ib#Adresse#ie# a des Daten­
- raums.
-
- a =
- N (<sequenz> DIV anzahl pakete pro seite + 1) * 512
- + (<sequenz> MOD anzahl pakete pro seite) * n
-
- wobei N (x) die Nummer der x-ten Seite und
- n die #ib#Nutzdatenlänge#ie# ist.
-
- Aus den Formeln ergibt sich, daß diese Nummer schon in
- einem vorhergehenden DATA/OPEN-Telegramm über­
- mittelt wurde (im Feld <seite>).
-
- - #ib#QUIT#ie#-Telegramm
-
-
- 0 1 2 3 4 5 6 7 8 9. Byte
-+------+------+------+------+-------------+-------------+-------------------+
-I STX I 12 I Ziel IQuelleI Endziel I Endquelle I Strom I
-+------+------+------+------+-------------+-------------+-------------------+
-
- 10 11
-+-------------+
-I Quit I
-+-------------+
-
-
-
- <#ib#strom#ie#> muß die #ib#Stromnummer#ie# sein, die in dem #ib#OPEN#ie#/#ib#DATA#ie#­
- Telegramm stand, das quittiert wird.
-
- <quit> 0 : ok. Nächstes Telegramm schicken.
-
- -1: #ib#Übertragung#ie# neu starten (mit #ib#OPEN#ie#), weil die Emp­
- fangsstation das OPEN nicht erhalten hat.
-
- -2: Übertragung ca. 20 Telegramme zurücksetzen.
-
- -3: Ãœbertragung abbrechen.
-
- -4: #ib#Quittung#ie# für letztes Telegramm einer Sendung.
-
-
-e) #ib#Vermittlungsebene#ie##goalpage("vermittlung")# #goalpage("collector")#
-
- Diese Ebene ist dafür zuständig, Namen von Tasks auf anderen Stationen in
- #ib#Task-Id#ie#'s (Werte des Typs TASK) zu wandeln und umgekehrt. Hierzu wird im
- entsprechenden #ib#OPEN#ie#-Telegramm der Code -6 (bzw. -7) als <code> ein­
- getragen. Die #ib#Netzempfangstask#ie# erkennt diese #ib#Codes#ie# und wickelt die Aufgaben
- selbst ab, so daß es dabei nicht nötig ist, irgendeine Task-Id der #ib#Zielstation#ie# zu
- kennen.
-
- Dieses Verfahren ist möglich, weil im #on("bold")##ib#send#ie##off ("bold")# nur positive Codes erlaubt sind.
-#page#
-f) #ib#Höhere Ebenen#ie#
-
- Höhere Ebenen sind nicht mehr netzspezifisch. Sie basieren alle auf dem Send/
- Wait-Konzept des EUMEL. So gibt es z.B. den #on("bold")##ib#global manager#ie##off ("bold")#, der Aufbewah­
- rung und Zugriff von #ib#Datei#ie#en in einer Task regelt. Dabei darf diese Task (bei der
- Variante #on("bold")##ib#free global manager#ie##off ("bold")#) auf einer beliebigen #ib#Station#ie# im Netz liegen. Wegen
- des #ib#Rendezvous-Konzept#ie#s können beliebige Sicherheitsstrategien benutzt werden
- (z.B.: keine Dateien an Station 11 ausliefern). Von großem Wert ist z.B., daß
- man ohne weiteres das Archiv (Floppylaufwerk) einer anderen Station anmelden
- und benutzen kann, wodurch eine einfache Konvertierung von Floppyformaten
- möglich ist. Dies ist möglich, weil auch die Archiv-Task der Stationen sich an
- das Globalmanagerprotokoll halten.
-
-
-
-
-
-Bemerkungen
-
-#ib#Fehlerbehandlung#ie# besteht bis Ebene c) darin, fehlerhafte #ib#Telegramm#ie#e einfach zu
-entfernen. Die Ebene d) überwacht den Netzverkehr sowieso über #ib#Timeout#ie#s, die eine
-Wiederholung eines Telegrammes bewirken, wenn die #ib#Quittung#ie# ausbleibt.
-
-Da bei der sendenden #ib#Station#ie# der ganze #ib#Datenraum#ie# zur Verfügung steht, ist eine
-#ib#Fenstertechnik#ie# (wie bei #ib#HDLC#ie#) nicht nötig. Es kann zu jedem Zeitpunkt um beliebig
-viele Telegramme zurückgesetzt werden.
-
-Da im EUMEL eine #ib#Textdatei#ie# ein #ib#Datenraum#ie# mit sehr komplexer Struktur ist (wegen
-der Insert/Delete-Möglichkeiten, ohne den Rest der #ib#Datei#ie# zu verschieben), ist es ein
-hoher Aufwand, von einem fremden Betriebssytem aus eine Textdatei in das
-EUMEL-Netz zu senden. Für solche Zwecke muß noch eine einfachere Dateistruktur
-definiert und entsprechende Dateikonverter erstellt werden.
-#page#
-
-2.3. Stand der Netzsoftware
-
-#goalpage("2.3")#
-
-Das EUMEL-System wickelt die Prozedur #on("bold")##ib#send#ie##off("bold")# über das Netz ab, wenn die Sta­
-tionsnummer der #ib#Zieltask#ie# ungleich der eigenen #ib#Stationsnummer#ie# ist. Umgekehrt kann
-man der von der Prozedur #on("bold")##ib#wait#ie##off("bold")# gelieferten Absendertask die #ib#Absenderstation#ie# entneh­
-men (siehe Prozedur #on("bold")##ib#station#ie##off("bold")# in Teil 1).
-
-Anders als bei einem #on("bold")##ib#send#ie##off("bold")# innerhalb einer Station meldet ein #on("bold")#send#off("bold")# an eine Task einer
-fremden Station immer 0 zurück (Task gibt es und Task war im wait), obwohl dies
-nicht der Fall sein muß. Ist die Sendung vollständig zur Zielstation übertragen, so
-versucht der dortige #ib#Collector#ie# diese hundertmal im Sekundenabstand zuzustellen.
-Bleibt das erfolglos, wird die Sendung vernichtet.
-#pagenr ("%", 33)##setcount (1)##block##pageblock##count per page#
-#headeven#
-#center#EUMEL Netzbeschreibung
-#center#____________________________________________________________
-
-#end#
-#headodd#
-#center#Teil 3 : Netz Hardware Interface
-#center#____________________________________________________________
-
-#end#
-#bottomeven#
-#center#____________________________________________________________
-Netz - % #right#GMD
-#end#
-#bottomodd#
-#center#____________________________________________________________
-GMD #right#Netz - %
-#end#
-#page#
-
-Teil 3: Netz-Hardware-Interface
-
-
-#goalpage("3")#
-
-
-3.1. Einführung
-
- #goalpage("3.1")#
-
-In diesem Teil der Netzbeschreibung wird die #ib#Schnittstelle#ie# beschrieben, über die
-#ib#Netzhardware#ie# (also #ib#Datenbox#ie#en, #ib#Netzbox#ie#en oder Netzkarten) an die EUMEL-Netz­
-Software angepaßt werden kann. Dieser Teil der Beschreibung ist also nur für Netz­
-implementatoren wichtig.
-
-Das EUMEL-Netz wurde dazu konzipiert, zwei oder mehr EUMEL-Rechner über
-#ib#V.24#ie#-Leitungen oder Datenboxen miteinander zu vernetzen. Dem heutigen Stand der
-Technik entsprechend, werden auf dem Markt eine Reihe von Möglichkeiten ange­
-boten, um PC's zu vernetzen. Diese Netze unterscheiden sich auch dadurch, daß
-unterschiedliche Medien zur Datenübertragung benutzt werden. Das #ib#EUMEL-
-Datenboxen-Netz#ie# benutzt Telefonkabel, #ib#Ethernet#ie# beispielsweise Koax-Kabel. Auch
-Lichtleiter werden zur Datenübertragung benutzt. Entsprechend gibt es eine ganze
-Menge Hardware (#ib#Treiber#ie#, Netzzugangsgeräte, Datenboxen, Anschlußkarten), die die
-Kopplung zwischen einem #ib#I/O-Kanal#ie# eines Rechners und dem Ãœbertragungsmedium
-(Kabel) übernimmt. Das Netz-Hardware-Interface soll als #ib#Schnittstelle#ie# zwischen der
-Netz­Software und dem Treiber dienen. Damit wird es möglich, mehrere EUMEL-
-Rechner über verschiedene (Teil-) Netze (in dieser Beschreibung Stränge genannt)
-und unterschiedliche #ib#Netzhardware#ie# (Treiber) miteinander zu verbinden. Für den
-EUMEL-Benutzer soll dabei kein Unterschied in der Benutzung des EUMEL-Netzes
-feststellbar sein.
-#page#
-Neben unterschliedlichen Übertragungsmedien und Treibern gibt es weitere Unter­
-schiede zwischen Netzen:
-
- - in der Netztopologie (Bus-, Ring- oder Sternnetze),
-
- - in den Netzzugangsverfahren (Token passing, time slice token, slotting oder
- CSMA/CD),
-
- - in der #ib#Ãœbertragungsgeschwindigkeit#ie#,
-
- - im Aufbau der einzelnen #ib#Pakete#ie(1,", Aufbau der")# (#ib#Netztelegramm#ie#e).
-
-Alles, was mit den ersten drei Punkten zusammenhängt, wird von den Netzzugangs­
-geräten behandelt.
-
-Der Paketaufbau aber muß zumeist im Rechner geschehen und kann in den seltens­
-ten Fällen ganz vom Treiber übernommen werden. Ebenso kann der Treiber aus den
-empfangenen Paketen nicht immer die Teile herausfiltern, die von der EUMEL-
-#ib#Netzsoftware#ie# gebraucht werden. Diese Aufgaben übernimmt das #ib#Netz-Hardware-
-Interface#ie#. Das Netz-Hardware-Interface stellt die #ib#Verbindung#ie# zwischen EUMEL-
-#ib#Netzsoftware#ie# und den verschiedenen Netzhardwarearten dar. Ähnlich wie bei den
-Drucker- und Terminal-Anpassungen wurde ein hardwareabhängiger Teil aus der
-Netzsoftware abgetrennt und in einem eigenen #ib#Paket#ie# zusammengefaßt. Beim Start
-des Netzes wird durch Angabe des entsprechenden #ib#Netzmodus#ie# für den jeweiligen
-#ib#Kanal#ie# die entsprechende Anpassung für den benutzten Treiber ausgewählt. Wenn
-andere, neue Treiber angepaßt werden sollen, so müssen lediglich in dem Paket #on("b")##ib#net
-hardware interface#ie##off("b")# die entsprechenden Prozeduren hinzugefügt und die #ib#Sprungleisten#ie#
-(#ib#SELECT#ie#-Statements) erweitert werden.
-
-Durch das #ib#Knotenkonzept#ie# in der #ib#Netzsoftware#ie# ist es möglich, über einen #ib#Knoten­
-rechner#ie# Teilnetze (Stränge), die mit unterschiedlicher #ib#Netzhardware#ie# arbeiten, mitein­
-ander zu verbinden. Es sind dann beispielsweise Verbindungen zwischen Rechnern,
-die über #ib#Ethernet#ie# vernetzt sind, und Rechnern auf dem EUMEL-Datenboxen-Netz
-möglich. Es ist auch möglich, mit einem Rechner Zugang zu einem Netz zu erhalten,
-für das spezielle #ib#Netzhardware#ie# erforderlich ist (Datenboxen, Ethernet-Anschluß). Man
-kann den Rechner über eine Rechner-Rechner-Kopplung (#ib#V.24#ie#) mit einem Rechner
-verbinden, der bereits ans Netz angeschlossen ist, und so (allerdings auf Kosten der
-Leistung des #ib#Knotenrechner#ie#s) Netzhardware einsparen.
-#page#
-
-3.2. Arbeitsweise des
- Netz-Hardware-Interfaces
-
-
-
-
-
- #goalpage("3.2")#
-
-Grob vereinfacht kann man sich die Arbeitsweise der #ib#EUMEL-Netz-Software#ie# so vor­
-stellen:
-
- reset box;
- REP
- IF zeichen da THEN lies telegramm ein
- ELIF telegramm auszugeben THEN gib telegramm aus
- FI
- PER .
-
-(Es ist nur der Teil der Software beschrieben, der die Kanalbehandlung betrifft).
-
-
-Das Zusammenspiel zwischen EUMEL-Netz und Netz-Hardware-Interface ge­
-schieht auf folgende Weise:
-
-
- #on("b")#reset box;#off("b")#
- REP
- IF zeichen da THEN #on("b")#next packet start#off("b")#;
- lies telegramm ein
- ELIF telegramm auszugeben THEN gib telegramm aus
- FI
- PER.
-
- gib telegramm aus:
- #on("b")#transmit header#off("b")#;
- gib eumelnetztelegramm aus;
- #on("b")#transmit trailer #off("b")#.
-
-Die fett gedruckten Programmteile werden im Netz-Hardware-Interface realisiert, die
-anderen Teile stecken in den darüberliegenden Teilen der EUMEL-Netz-Software.
-#page#
-Beim Senden eines #ib#Telegramm#ie#s wird von der #ib#Netzsoftware#ie# zuerst der #ib#Vorspann#ie# in
-einem #ib#Datenraum#ie# an das Hardware-Interface übergeben (#on("b")##ib#transmit header#ie##off("b")#). Im Hard­
-ware-Interface können aus dem Vorspann die entsprechenden Informationen (Tele­
-grammlänge, #ib#Zielstation#ie# usw.) entnommen werden. Dann wird von der Netzsoftware
-das Telegramm (inklusive Vorspann) per #on("b")##ib#blockout#ie##off("b")# übergeben. Danach wird #on("b")##ib#transmit
-trailer#ie##off("b")# aufgerufen, um dem Hardware-Interface das Ende des Telegramms zu mel­
-den. Beim Empfang ruft die Netzsoftware zuerst die #ib#I/O Control#ie# #ib#Telegrammfreigabe#ie#
-auf [7]. Danach wird das erste #ib#Zeichen#ie# des Telegramms angefordert (#on("b")##ib#next packet
-start#ie##off("b")#). Falls ein #ib#STX#ie# geliefert wurde, wird das Telegramm per #on("b")##ib#blockin#ie##off("b")# eingelesen. Falls
-#ib#Niltext#ie# zurückgeliefert wird, wird von der Netzsoftware #ib#Timeout#ie# angenommen. Alle
-anderen Zeichen werden so interpretiert, als ob Störungen aufgetreten wären. Die
-Netzsoftware übernimmt die #ib#Fehlerbehandlung#ie#. Dazu wird u. U. ein Leerlesen des
-Puffers vom Hardware-Interface verlangt (#on("b")##ib#flush buffers#ie##off("b")#).
-
-Bei der Einstellung der #ib#Nutzdatenlänge#ie# (#on("b")##ib#data length#ie##off("b")#) ist zu beachten, daß
-
-a) alle #ib#Station#ie#en, die an einem #ib#Strang#ie# hängen, auf die gleiche Nutzdatenlänge
- eingestellt sein müssen.
-
-b) Wenn mehrere Stränge über #ib#Knoten#ie# miteinander verbunden sind, muß die Nutz­
- länge für Sendungen über Knoten (#on("b")##ib#data length via node#ie##off("b")#) auf allen Stationen des
- gesamten Netzes gleich eingestellt sein. Die Zusammenfassung oder Aufteilung
- von #ib#Telegramm#ie#en in Knoten ist nicht möglich.
-
-c) Als mögliche Nutzdatenlänge sind folgende Werte erlaubt:
-
- 64, 128, 256 und 512 Byte.
-
- Größere Nutzdatenlängen sind zur Zeit nicht möglich.
-
-d) Je größer die #ib#Nutzdatenlänge#ie# ist, desto geringer ist der Overhead an #ib#Zeichen#ie#,
- die auf den Rechnern verarbeitet werden müssen. Allerdings muß der Rechner
- leistungsfähig genug sein, die ankommenden Blöcke schnell genung zu verarbei­
- ten, und die Netztreiber müssen entsprechend große Puffer haben.
-
-
-Alle implementierten Netzanpassungen sollen in einem Netz-Hardware-Interface
-zusammengefaßt werden. Dies ist notwendig, um über #ib#Knotenrechner#ie# Netzstränge
-verbinden zu können, die mit unterschiedlicher #ib#Netzhardware#ie# arbeiten. So können
-zum Beispiel ein #ib#Strang#ie#, der mit Datenboxen aufgebaut ist, und ein #ib#Ethernet#ie#-#ib#Strang#ie#
-über einen Knotenrechner miteinander verkoppelt werden.
-#page#
-Aus diesem Grund wurden #on("b")#Netzmodi#off("b")# eingeführt. Man kann dadurch, daß die Netz­
-modi, genau wie die #ib#Kanal#ie#angaben, in der #ib#Datei#ie# #on("b")##ib#netz#ie##off("b")# niedergelegt sind, ohne Aus­
-tausch einer Softwarekomponente die Netzhardware wechseln. Es gibt auch die
-Möglichkeit, durch verschiedene Netzmodi unterschiedliche Treiber an ein und das­
-selbe Netz anzuschließen. Beispielsweise gibt es für einige Rechnertypen Steckkarten,
-mit denen der Rechner an das Ethernet angeschlossen werden kann. Man kann,
-wenn diese Karten angepaßt sind, den #ib#Ethernet#ie#-Zugang über verschiedene Netz­
-anschlußkarten realisieren.
-
-Das Netz-Hardware-Interface muß folgende Aufgaben übernehmen:
-
- Bei der Ausgabe an den Treiber:
-
- - Generieren und Ausgeben des #ib#Paket#ie#headers,
- - Umsetzen von logischen Stationsadressen (#ib#Stationsnummer#ie#n) in phy­
- sische #ib#Adresse#ie#n,
- - Ausgeben der Daten (EUMEL-Netz-#ib#Telegramm#ie#e),
- - Generieren und Ausgeben des Trailers und evtl. Auffüllen des Pakets mit
- #ib#Füllzeichen#ie#, falls auf dem Netz eine Mindestlänge für Pakete gefordert
- wird.
-
- Bei der Eingabe vom Treiber:
-
- - Weglesen von #ib#Füllzeichen#ie#,
- - Prüfen der #ib#Adresse#ie#n,
- - Weglesen von #ib#Paket#ie#teilen, die in der EUMEL-Netz-Software nicht
- gebraucht werden.
-
- Weiterhin können Funktionen wie
-
- - Reset des Treibers,
- - Prüfung, ob Stationsadresse und #ib#Adresse#ie# im Treiber übereinstimmen,
- - Statistik und Service
-
- durch das Netz-Hardware-Interface übernommen werden.
-
-Dazu wird ein Satz von Prozeduren über die #ib#DEFINES#ie#-#ib#Schnittstelle#ie# des Netz-
-Hardware-Interfaces zur Verfügung gestellt. Wenn neue Treiber oder Netzarten
-implementiert werden sollen, so muß an diesem Interface nichts geändert werden. Die
-herausgereichten Prozeduren realisieren #ib#Sprungleisten#ie# (#ib#SELECT#ie#-Statements), über
-die durch Erweiterung (#ib#CASE#ie#) die Prozeduren erreicht werden können, die den ent­
-sprechenden #ib#Netzmodus#ie# realisieren. Außerdem werden Informationsprozeduren für die
-darüberliegenden Programmteile zur Verfügung gestellt.
-#page#
-
-3.3. Netztreiber
-
- #goalpage("3.3")#
-Unter #ib#Netztreiber#ie#n versteht man die Einheiten, die den Anschluß des Rechners an ein
-Netz realisieren. Das können #ib#Netzbox#ie#en sein, die mit dem Rechner über eine #ib#V.24#ie#-
-Leitung verbunden sind, aber auch Anschlußkarten, die direkt auf den Datenbus des
-Rechners gehen. Falls die #ib#Schnittstelle#ie# der Treiber-Hardware eine andere als die
-serielle #ib#V.24#ie# ist, muß in der Regel eine Anpassung für die Hardware im #ib#SHard#ie# vorge­
-nommen werden.
-
-Falls der Treiber über eine serielle #ib#V.24#ie#-#ib#Schnittstelle#ie# mit dem Rechner verbunden
-ist, wie das auch bei der direkten Kopplung oder dem Datenboxennetz der Fall ist,
-wird die hohe #ib#Ãœbertragungsgeschwindigkeit#ie# auf dem eigentlichen Netz durch die
-relativ geringe Ãœbertragungsgeschwindigkeit auf der #ib#V.24#ie#-#ib#Schnittstelle#ie# zwischen
-Rechner und Treiber (Box) gebremst. Ãœber andere Schnittstellen im Rechner, wenn
-sie mit #ib#Stream I/O#ie# [7] betrieben werden, kann man dies vermeiden. Diese Schnitt­
-stellen müssen vom SHard bedient werden.
-
-Wenn in den Rechner integrierte Netztreiber (Netzanschlußkarten) benutzt werden
-sollen, so muß in der Regel die Behandlung dieser Netzanschlußkarte im SHard
-durchgeführt werden.
-
-Um effizient implementieren zu können, sollte darauf geachtet werden, daß möglichst
-wenig zusätzliche #ib#Zeichen#ie# von der #ib#Netzsoftware#ie# bzw. dem Netz-Hardware-Inter­
-face bearbeitet werden müssen. Das Auffüllen von Paketen auf eine Mindestlänge
-sollte möglichst vom Treiber gemacht werden, ebenso wie das Weglesen dieser
-Zeichen.
-
-Um einen sicheren und effektiven Netzbetrieb zu garantieren, sollten die Treiber
-folgende Eigenschaften haben:
-
- - Die #ib#Stationsadresse#ie# ist im Treiber festgelegt, sie soll nicht ohne weiteres
- verändert werden können (Datenschutz).
- - Der Treiber reicht nur #ib#Paket#ie#e mit richtiger #ib#Zieladresse#ie#, keine #ib#Broad- oder
- Multicasts#ie# an die Netzsoftware weiter.
- - Der Treiber sendet nur #ib#Paket#ie#e mit richtiger #ib#Absenderadresse#ie# bzw. setzt die
- Absenderadresse selbst ein.
- - Die am Treiber eingestellte #ib#Adresse#ie# kann abgefragt werden, oder es wird,
- wenn ein Paket mit falscher #ib#Absenderadresse#ie# vom Rechner kommt, eine
- #ib#Fehlermeldung#ie# an den Rechner gegeben. Die Fehlermeldung muß durch das
- Netz-Hardware-Interface in den #on("b")##ib#report#ie##off("b")# eingetragen werden.
- - Falls Pakete mit #ib#Füllzeichen#ie# aufgefüllt werden müssen, sollten die Füll­
- zeichen durch den Treiber generiert und beim Empfang wieder entfernt
- werden.
- - Falls mehrere Betriebsmodi möglich sind, so sollten sie softwaremäßig
- einstellbar sein.
- - Falls die Treiber über eine serielle #ib#Schnittstelle#ie# an den Rechner angeschlos­
- sen werden, so sollte der Treiber konfigurierbar sein. In jedem Fall sollte die
- serielle Schnittstelle mit #ib#Flußkontrolle#ie# (#ib#RTS/CTS#ie#) implementiert werden.
-
-Zusätzlich ist ein Transparent-Modus als #ib#Netzmodus#ie# von Vorteil:
-
- - Der Modus (transparent) kann zu Testzwecken benutzt werden. Beispiels­
- weise um auch mit Rechnern kommunizieren zu können, die über Netz
- erreichbar sind, aber kein EUMEL-Netz-#ib#Protokoll#ie# benutzen.
-
- Modus n: transparent.
-
- Ausgabeseitig: Das #ib#Paket#ie# wird unverändert ausgegeben.
- #ib#Adresse#ie#n usw. müssen schon im Paket vor­
- handen sein. Es wird nicht mit #ib#Füllzeichen#ie#
- aufgefüllt.
- Eingabeseitig: Das Paket wird unverändert an die Netzsoft­
- ware weitergegeben.
-
-#page#
-
-3.4. Prozedurschnittstelle
- des EUMEL-Netzes
-
-
-
-
-
- #goalpage("3.4")#
-Im PACKET #on("b")##ib#net hardware interface#ie##off("b")# sind folgende Prozeduren untergebracht:
-
-
-
- BOOL PROC #ib#blockin#ie#
- (DATASPACE VAR ds, INT CONST seite, abstand, länge):
-
- Versucht, #on("b")#länge#off("b")# Zeichen vom #ib#Kanal#ie# einzulesen. Liefert TRUE, wenn alle
- Zeichen eingelesen wurden, FALSE, wenn innerhalb einer bestimmten
- Zeit nicht alle #on("b")#länge#off("b")# Zeichen eingelesen werden konnten (z.B. weil der
- Kanal nicht mehr Zeichen anliefert). Die eingelesenen Zeichen werden im
- #ib#Datenraum#ie# #on("b")#ds#off("b")# in #ib#Seite#ie# #on("b")#seite#off("b")# ab #on("b")#abstand#off("b")# bis #on("b")#abstand#off("b")# + #on("b")#länge#off("b")# - 1 abge­
- legt.
-
- #ib#Fehlerfall#ie#:
-
- #on("b")#blockin Abbruch#off("b")#
-
- Es werden weniger #ib#Zeichen#ie# innerhalb einer festgelegten Zeitspanne über
- den Kanal angeliefert, als mit #on("b")#länge#off("b")# gefordert.
-
- Passiert z.B., wenn die Kabel während einer Netzübertragung unter­
- brochen werden, oder wenn die Gegenstelle abgeschaltet wird. Das
- #ib#Telegramm#ie# wird vernichtet, die Prozedur liefert FALSE, es wird eine
- entsprechende Meldung im #on("b")##ib#report#ie##off("b")# erzeugt.
-
- PROC #ib#blockout#ie#
- (DATASPACE CONST ds, INT CONST seite, abstand, länge):
-
- Der Inhalt von Seite #on("b")#seite#off("b")# des #ib#Datenraum#ie#s #on("b")#ds#off("b")# wird von #on("b")#abstand#off("b")# bis
- #on("b")#abstand#off("b")# + #on("b")#länge#off("b")# - 1 ausgegeben.
-#page#
- PROC #ib#set net mode#ie# (INT CONST mode):
-
- Es wird der #ib#Netzmodus#ie# #on("b")#mode#off("b")# eingestellt. Im Netz-Hardware-Interface
- müssen alle Initialisierungen und Einstellungen vorgenommen werden,
- damit die mit #on("b")#mode#off("b")# geforderte #ib#Netzhardware#ie# unterstützt wird. Diese
- Prozedur wird bei jedem #on("b")##ib#start#ie##off("b")#-Kommando in der Netztask aufgerufen.
- Kann als Initialisierungsprozedur für dieses PACKET verwendet werden.
- Übergibt den in der #ib#Datei#ie# #on("b")##ib#netz#ie##off("b")# für diesen #ib#Kanal#ie# verlangten Netzmodus an
- das Netz-Hardware-Interface. Nach Aufruf dieser Prozedur müssen die
- wertliefernden Prozeduren #on("b")##ib#net mode#ie#, #ib#mode text#ie#, #ib#data length#ie##off("b")# und #on("b")##ib#data
- length via node#ie##off("b")# korrekt initialisiert sein. Der Aufruf von #on("b")##ib#net addess#ie##off("b")# muß
- die korrekten (physikalischen) #ib#Adresse#ie# der #ib#Station#ie#en liefern.
-
- TEXT PROC net address (INT CONST stationsnummer):
-
- Liefert die (Hardware-) Netz-#ib#Adresse#ie#, über die der EUMEL-Rechner
- mit der Stationsnummer #on("b")##ib#stationsnummer#ie##off("b")# beim aktuell für diesen Kanal
- eingestellten #ib#Netzmodus#ie# erreichbar ist. Auf diese #ib#Adresse#ie# muß der Treiber
- des entsprechenden Rechners eingestellt sein. Auch die eigene Netz-
- Adresse muß mit der im Treiber eingestellten #ib#Adresse#ie# übereinstimmen.
- Insbesondere müssen alle Stationen, die auf dem Netz arbeiten, dieselbe
- Netz-Adresse für eine #ib#Stationsnummer#ie# errechnen.
-
- TEXT PROC #ib#mode text#ie#:
-
- Liefert den Text (Namen) des eingestellten #ib#Netzmodus#ie#. Wird in #on("b")##ib#net
- manager#ie##off("b")# benutzt, um den Netzmodus im #on("b")##ib#report#ie##off("b")# anzugeben.
-
- TEXT PROC mode text (INT CONST mode):
-
- Liefert den Text (Namen) zu dem #ib#Netzmodus#ie# #on("b")#mode#off("b")#.
-
- INT PROC #ib#data length#ie# (INT CONST mode):
-
- Liefert die #ib#Nutzdatenlänge#ie# (#ib#Länge#ie# der Nettodaten des Eumel-
- Telegramms) im Netz. Wird von #on("b")##ib#basic net#ie##off("b")# beim Neustart aufgerufen. Muß
- in einem Netz auf allen Stationen eines #ib#Strang#ie#s denselben Wert liefern.
-
- Erlaubte Werte: 64, 128, 256 und 512.
-#page#
- INT CONST #ib#data length via node#ie#:
-
- Liefert die #ib#Nutzdatenlänge#ie# für Sendungen, die über #ib#Knoten#ie# gehen.
- Muß auf allen Stationen des Netzes gleich sein.
-
- Erlaubte Werte: 64, 128, 256 und 512.
-
- PROC #ib#decode packet length#ie# (INT VAR value):
-
- Die #ib#Länge#ie# eines Netztelegramms ist im #ib#Telegramm#ie# codiert enthalten. Mit
- dieser Prozedur wird aus dem Telegrammkopf die Telegrammlänge ermit­
- telt:
-
- Falls beim Aufruf dieser Prozedur in #on("b")#value#off("b")# der Wert des Feldes #on("b")#head#off("b")# aus
- der Struktur #on("b")#vorspann#off("b")#, die in #on("b")#ds#off("b")# per #on("b")##ib#transmit header#ie##off("b")# übergeben wurde,
- enthalten ist, so wird in #on("b")#value#off("b")# die Länge des EUMEL-Netztelegramms
- zurückgeliefert.
-
- PROC #ib#flush buffers#ie#:
-
- Liest den Eingabepuffer des #ib#Netzkanal#ie#s leer. Die eingelesenen Zeichen
- werden vernichtet. Wird nach Erkennen von #ib#Übertragungsfehler#ie#n aufge­
- rufen.
-
- TEXT PROC #ib#next packet start#ie#:
-
- Liefert genau ein #ib#Zeichen#ie# (in der Regel das erste Zeichen des EUMEL-
- Netztelegramms). Wird von der Netzsoftware immer dann aufgerufen,
- wenn ein neues #ib#Paket#ie# erwartet wird.
-
- Bedeutung des gelieferten Zeichens für die #ib#Netzsoftware#ie#:
-
- #ib#STX#ie#: korrekter #ib#Telegrammanfang#ie# (ist das erste Zeichen des
- EUMEL-Netztelegramms). Der Rest des EUMEL-Netztele­
- gramms steht im Eingabepuffer, ist also über #ib#blockin#ie# lesbar.
- Vorher wurden nur Zeichen eingelesen, die zum verwendeten
- #ib#Netzprotokoll#ie# gehören (z.B. #ib#Ethernet#ie#-#ib#Adresse#ie#n, #ib#Füllzeichen#ie#
- usw.).
- niltext: kein neues Telegramm da
-
- jedes andere Zeichen:
- Fehler. Entweder wurden Störzeichen eingelesen oder es
- gingen Zeichen verloren. #ib#Fehlerbehandlung#ie# erfolgt durch die
- Netzsoftware.
-#page#
- PROC #ib#transmit header#ie# (DATASPACE CONST ds):
-
- Wird vor Ausgabe eines jeden #ib#Telegramm#ie#s aufgerufen. In dem #ib#Datenraum#ie#
- #on("b")#ds#off("b")# wird von der EUMEL-Netz-Software der #on("b")##ib#Vorspann#ie##off("b")# übergeben. Über
- den jeweiligs eingestellten #ib#Netzmodus#ie# kann für jede implementierte Netz­
- art über eine #ib#Sprungleiste#ie# (#ib#SELECT#ie#) die Prozedur angesprungen werden,
- die den #ib#Header#ie# für den eingestellten Netzmodus erstellt und ausgibt.
- Struktur des von der EUMEL-Netz-Software benutzten Headers:
-
- BOUND STRUCT
- (INT head,
- zwischenziel,
- zielrechner,
- quellrechner,
- strom,
- sequenz,
- seitennummer ) VAR vorspann.
-
- Aus dem Inhalt des Feldes #on("b")#head#off("b")# kann mittels #on("b")##ib#decode packet length#ie##off("b")# die
- Gesamtlänge des EUMEL-Netztelegramms errechnet werden.
-
- PROC #ib#transmit trailer#ie#:
-
- Wird nach Ausgabe eines jeden Telegramms aufgerufen. Evtl. notwendige
- Nachspänne können ausgegeben werden. Die notwenigen Informationen
- wurden in #on("b")##ib#transmit header#ie##off("b")# übergeben und müssen aufbewahrt werden,
- falls sie im Trailer mitgeliefert werden müssen. Kann auch dazu benutzt
- werden, den unter diesem Packet liegenden Schichten (#ib#SHard#ie# oder Hard­
- ware) das Ende des Telegramms mitzuteilen. Notwendige #ib#Füllzeichen#ie#
- können in dieser Prozedur in das #ib#Paket#ie# eingebaut werden.
-
- PROC #ib#reset box#ie# (INT CONST net mode):
-
- Kann zur Initialisierung der #ib#Netzhardware#ie# benutzt werden. Wird von #on("b")##ib#basic
- net#ie##off("b")# beim jedem Neustart aufgerufen.
-
- INT PROC #ib#max mode#ie#:
-
- Liefert den Wert des größten erlaubten (implementierten) #ib#Netzmodus#ie#.
-
- INT PROC #ib#net mode#ie#:
-
- Liefert den eingestellten Netzmodus.
-#page#
-#pagenr ("%", 45)##setcount (1)##block##pageblock##count per page#
-#headeven#
-#center#EUMEL Netzbeschreibung
-#center#____________________________________________________________
-
-#end#
-#headodd#
-#center#Anhang
-#center#____________________________________________________________
-
-#end#
-#bottomeven#
-#center#____________________________________________________________
-Netz - % #right#GMD
-#end#
-#bottomodd#
-#center#____________________________________________________________
-GMD #right#Netz - %
-#end#
-#clear pos##lpos(1.0)##rpos(9.5)##goalpage("A")#
-
-Anhang: Netz-Meldungen#goalpage("A.1")#
-
-Mit dem Kommando #on("b")##ib#list#ie# (/"net list")#off("b")# (siehe Teil 1) erhalten Sie eine temporäre #ib#Datei#ie#
-auf den Bildschirm. Diese Datei könnte ungefähr so aussehen:
-
-____________________________________________________________________________
-
- N e u e r S t a r t 12:44 Stationsnummer : 38
- 01.06.87 12:55 net port 8:20:Nicht zustellbar. . Empfänger: "net dok". Quelle 34 Taskindex: 255
- 02.06.87 06:30 net port 8:1:wdh data. sqnr 7. Absender: "net dok". Ziel 34 Taskindex: 255
- 02.06.87 07:03 net port:20:Sequenzfehler: soll 13 ist 14. Empfänger: "POST". Quelle 33 Taskindex:
- 02.06.87 07:03 net port:blockin abbruch
- 02.06.87 07:03 net port:20:Sequenzreset von 13 auf 10. Empfänger: "POST". Quelle 33 Taskindex: 29
- 02.06.87 07:36 net port:Call gelöscht."net dok". Strom 1
- 02.06.87 07:43 net port 8:verbotene Route: 34
- 02.06.87 07:50 net port:Header inkorret eingelesen: %0 %2
- 02.06.87 07:50 net port:buffers flushed
- 02.06.87 07:52 net port:Weiterleitung nicht möglich für 34
- 02.06.87 07:53 net port 8:skipped0 6 G O 1 0 . 0 %13 %10 2 8 0 6 0 6 G O 1 0 . 0 %13 %10 2 8 0
- 02.06.87 08:14 net port 8:skipped%13 %10 S p e c . R e c e i v e E r r o r C 2
- 02.06.87 08:21 net port:20:Reopen. Empfänger: "WÜFE". Quelle 40 Taskindex: 22
- 02.06.87 09:25 net port:1:etwas rueckgespult. Absender: "-". Ziel 33 Taskindex: 51
- 02.06.87 09:25 net port:1:wdh data. sqnr 20. Absender: "-". Ziel 33 Taskindex: 51
- 02.06.87 09:54 net port:20:Blocknummer falsch, neu: 192, alt : -1. Empfänger: "WÜFE". Quelle 44
- 02.06.87 10:12 net port:Daten ohne Eroeffnung von 40 Sequenznr 7
- 02.06.87 10:23 net port:Header inkorret eingelesen: O X 0 3 8 B O X 0 4 4 E U %2
- 02.06.87 10:23 net port:buffers flushed
- 02.06.87 10:49 net port:1:wdh open. Absender: "-". Ziel 33 Taskindex: 255
- 02.06.87 10:49 net port:2:wdh open. Absender: "net dok". Ziel 33 Taskindex: 255
- 02.06.87 10:53 net port:1:Sequenzfehler: soll 2 ist 3. Empfänger: "net dok". Quelle 33 Taskindex:
- 02.06.87 10:54 net port:1:Sequenzreset von 8 auf 5. Empfänger: "net dok". Quelle 33 Taskindex: 11
- 02.06.87 10:56 net port:2:etwas rueckgespult. Absender: "-". Ziel 33 Taskindex: 51
- bekannte Stationen:
- 1(8,1) 2(8,2) 3(8,3) 4(8,4) 5(8,5) 6(8,6) 7(8,7) 8(8,8) 9(8,9) 10(8,10)
- 11(8,11) 12(8,12) 13(8,13) 14(8,14) 15(8,15) 16(8,16) 17(8,17) 18(8,18)
- 19(8,19) 20(8,20) 21(8,21) 22(8,22) 23(8,23) 24(8,24) 25(8,25) 26(8,26)
- 27(8,27) 28(8,28) 29(8,29) 30(8,30) 31(8,31) 32(8,32) 33(9,33) 34(8,34)
- 35(9,35) 36(9,36) 37(9,37) 39(9,39) 40(9,40) 41(9,41) 42(9,42) 43(9,43)
- 44(9,44) 45(9,45) 46(9,46) 47(9,47) 48(9,48)
- --------
- Eingestellte Netzmodi:
- net port 8 haengt an Kanal 8, Modus: (1) EUMEL-Netz 64 Byte
- net port haengt an Kanal 9, MODUS: (11) ETHERNET via V.24 512 Byte
-
- Nutzdatenlänge 512 Byte
- Nutzdatenlänge bei indirekter Verbindung: 64 Byte
- ********
- Netz-Software vom 23.05.87
- Rechner 38 um 11:11
- net port 8
-
- Strom 1 (sqnr7/8) sendet an 34 . Absender ist "net dok".
- net port
-
- Strom 1 (sqnr45/45) empfaengt von 40 . Empfaenger ist "PUBLIC".
-
-____________________________________________________________________________
-#page#
-Die Datei enthält den aktuellen #on("b")##ib#report#ie##off("b")#, in dem #ib#Fehlermeldung#ie#en der einzelnen Tasks
-gesammelt werden. Außerdem wird der Zustand aller Verbindungen (Ströme) von allen
-#on("b")##ib#net port#ie##off("b")#'s angezeigt. Im #on("b")#report#off("b")#-Teil kann man drei Informationsblöcke unterscheiden:
-
-a) den Block mit den Fehlermeldungen. Es werden jeweils Datum, Uhrzeit, der Name
- des betroffenen #on("b")#net port#off("b")# und, wenn notwendig, die #ib#Stromnummer#ie# angegeben.
- Darauf folgt der Meldungstext, der auch Informationen über Absender und Emp­
- fänger enthalten kann.
-
- <Datum> <Zeit> <Name der #ib#Kanaltask#ie#> : [<#ib#Stromnummer#ie#> : ] <Meldung>
-
-
-b) den Block mit der Liste der bekannten #ib#Station#ie#en. Ein Eintrag in dieser Liste ent­
- hält jeweils die Stationsnummer der bekannten Station und in Klammern dahin­
- ter die Nummer des Kanals auf diesem Rechner, über den die Station erreichbar
- ist und die Nummer der nächsten #ib#Zwischenstation#ie#.
-
- <Zielstation> (<Kanalnr>,<Zwischenstation>)
-
- Bei direkt erreichbaren Stationen ist Zwischenstation gleich #ib#Zielstation#ie#.
-
- Hinweis: Auch #ib#gesperrt#ie#e Stationen erscheinen in dieser Liste.
-
-
-c) den Block, der Auskunft über die Netzinstallation gibt. Es werden für jeden Netz­
- kanal die eingestellten Netzmodi angegeben. Des weiteren werden die beiden
- Größen #on("b")##ib#data length#ie##off("b")# (#ib#Nutzdatenlänge#ie#) und #on("b")##ib#data length via node#ie##off("b")# (Nutzdatenlänge bei
- indirekter Verbindung) angegeben. Zusätzlich erscheinen noch die #ib#Netzversion#ie# und
- die genaue Uhrzeit, zu der dieser #on("b")#report#off("b")# erstellt wurde.
-
-#page#
-Für jeden #on("b")##ib#net port#ie##off("b")# wird pro aktivem #ib#Strom#ie# folgende Meldung generiert:
-
-Strom <Stromnr> (sqnr<akt Seqnr>/<max Seqnr>) <Zustand> <Partner>
-
-
-<Stromnr> #ib#Stromnummer#ie#
-
-<akt Seqnr> #ib#Sequenznummer#ie# des gerade bearbeiteten #ib#Telegramm#ie#s
-
-<max Seqnr> Bei #ib#Sendeströme#ie#n die Nummer der letzten zu übertragenden
- #ib#Sequenz#ie#, bei Empfangsströmen in der Regel die Nummer der
- letzten Sequenz der gerade übertragenen #ib#Datenraumseite#ie#.
-
-<#ib#Zustand#ie#> Hier wird die Aktion (senden, empfangen usw.) und die Partner­
- station angegeben.
-
-<#ib#Partner#ie#> Der Name der Task mit der kommuniziert wird.
-
-
-Die Meldungen, die in der #ib#Datei#ie# #on("b")##ib#report#ie##off("b")# protokolliert werden, kann man in verschiedene
-Gruppen einordnen. Die eine Gruppe beschreibt Störungen durch #ib#Zeichenverluste#ie#
-oder ­verfälschungen, eine andere Gruppe protokolliert besondere Situationen, bei­
-spielsweise den Abbruch von #ib#Ãœbertragung#ie#en, und die letzte Gruppe befasst sich mit
-#ib#Fehlermeldung#ie#en, die ein Eingreifen von aussen notwendig machen. Je nachdem, ob
-die Station, auf der die Meldung protokolliert wird, Empfänger oder Absender ist, wird
-bei den Meldungen #ib#Stationsnummer#ie# und Taskname des Kommunikationspartners mit
-angegeben.
-
-Zur ersten Gruppe gehören:
-
-#ib(4)##ib#skipped#ie##ie(4)#
- 'skipped' oder skipped mit einem Zusatztext erscheint, wenn Zei­
- chen eingelesen wurden, die zu keinem gültigen #ib#Telegramm#ie# ge­
- hören. Dies kann passieren, wenn auf der Leitung zwischen
- Rechner und Box #ib#Zeichen#ie# verlorengegangen sind. Auch nach dem
- Einschalten oder nach einem Reset auf Box oder Rechner kann
- diese Meldung kommen. Mindestens ein Teil der eingelesenen
- Daten wird mit ausgegeben, wobei Steuerzeichen durch % und den
- Code des Steuerzeichens dargestellt werden. Die einzelnen Zeichen
- werden durch ein Blank voneinander getrennt.
-#page#
-#ib(4)##ib#Sequenzfehler#ie##ie(4)#
- Die #ib#Sequenznummer#ie# ist zu groß, es fehlen also Telegramme. Die
- Gegenstation wird aufgefordert, ab einem früheren Telegramm zu
- wiederholen.
-
-#ib(4)#wdh data#ie(4)#
- Das letzte Telegramm wird erneut geschickt. Passiert, wenn die
- #ib#Quittung#ie# für dieses Telegramm nach einer bestimmten Zeit nicht
- angekommen ist.
-
-#ib(4)##ib#Sequenzreset#ie##ie(4)#
- Die #ib#Sequenznummer#ie# des empfangenen Telegramms ist kleiner als
- die Sequenznummer des vorher empfangenen Telegramms. Die
- Verbindung wird bei der zuletzt empfangenen Sequenznummer
- fortgesetzt.
-
-#ib(4)#Blocknummer falsch#ie(4)#
- Die #ib#Seitennummer#ie# in dem #ib#Telegramm#ie# ist falsch.
-
-#ib(4)#etwas rueckgespult#ie(4)#
- Auf Anforderung der Gegenseite werden die letzten drei #ib#Datenraum­
- seite#ie#n erneut übertragen.
-
-#ib(4)#Daten ohne Eroeffnung#ie(4)#
- Es werden Telegramme mit einer #ib#Stromnummer#ie# empfangen, zu der
- vorher kein OPEN-Telegramm empfangen wurde. In diesem Fall
- wird die Gegenstation aufgefordert, die #ib#Ãœbertragung#ie# von vorn zu
- beginnen. Diese Meldung kann auch kommen, wenn das Netz neu
- gestartet wurde.
-
-#ib(4)#wdh open#ie(4)#
- Die Übertragung wird mit dem #ib#OPEN#ie#-Telegramm von vorn begon­
- nen. Passiert auf Aufforderung durch die Gegenstation oder wenn
- das erste OPEN-Telegramm nicht quittiert wurde.
-
-#ib(4)##ib#buffers flushed#ie##ie(4)#
- Alle bereits eingelesenen, aber noch nicht bearbeiteten Zeichen
- wurden gelöscht (der #ib#Eingabepuffer#ie# wurde komplett gelöscht). Verur­
- sacht durch schwere Störungen (#ib#Zeichenverluste#ie# oder -verfäl­
- schungen).
-#page#
-#ib(4)#blockin abbruch#ie(4)#
- Es wurden nicht alle Zeichen eines Telegramms innerhalb eines
- bestimmten Zeitraums angeliefert.
-
-#ib(4)#Header inkorrekt eingelesen#ie(4)#
- Es wurde ein Fehler in dem Teil des Netztelegramms gefunden, der
- nicht zum EUMEL-Netz gehört.
-
-#ib(4)#Strom falsch in Quittung#ie(4)#:
- In der #ib#Quittung#ie# wurde eine nicht zulässige #ib#Stromnummer#ie# festge­
- stellt. Zulässig sind Stromnummern zwischen 1 und 20.
-
-#ib(4)#Neustart#ie(4)#
- Die Gegenstation hat die #ib#Verbindung#ie# von vorne begonnen.
-
-#ib(4)#Falsche Seitennummer#ie(4)#
- Die #ib#Seitennummer#ie# in dem empfangenen Telegramm ist falsch.
- Einige Telegramme werden wiederholt.
-
-#ib(4)#Absteigende Seitennummern#ie(4)#
- Die Seitennummer in dem empfangenen Telegramm ist kleiner als
- die Seitennummer im vorigen #ib#Telegramm#ie#. Es müssen einige Tele­
- gramme wiederholt werden.
-
-
-Die folgenden Meldungen beschreiben Situationen, die nicht durch #ib#Zeichenverluste#ie#
-entstehen, mit denen die #ib#Netzsoftware#ie# selbst fertig wird:
-
-
-#ib(4)#Sendung von Gegenstelle gelöscht#ie(4)#
- Die Verbindung wurde von der Gegenstelle abgebrochen.
-
-#ib(4)#Empfangseintrag freigegeben#ie(4)#
- Die Verbindung wurde von der empfangenden #ib#Station#ie# gelöscht, weil
- seit dem Eintreffen des letzten Telegramms zuviel Zeit vergangen ist
- (#ib#Timeout#ie#).
-
-#ib(4)#Irrläufer#ie(4)#
- Eine #ib#Intertaskkommunikation#ie# innerhalb der eigenen Station wurde
- fälschlicherweise über den #on("b")##ib#Collector#ie##off("b")# abgewickelt. Dieser Vorgang
- wird abgebrochen.
-#page#
-#ib(4)#Call-Löschung vorgemerkt#ie(4)#
- Sobald der Call abgewickelt ist, wird diese Verbindung gelöscht.
- Beispielsweise führt ein vom Benutzer abgebrochenes #on("b")##ib#name#ie##off("b")# zu
- dieser Meldung.
-
-#ib(4)#Call gelöscht#ie(4)#
- Die #ib#Verbindung#ie# wurde auf Anforderung durch den Auftraggeber
- gelöscht.
-
-#ib(4)#Quellrechner#ie(4)#
- Als #ib#Quellrechnernummer#ie# wurde ein unzulässiger Wert festgestellt.
- Zulässig sind Zahlen zwischen 1 und 127.
-
-#ib(4)#Nicht zustellbar#ie(4)#
- Innerhalb eines bestimmten Zeitraums war die #ib#Zieltask#ie# nicht emp­
- fangsbereit. Die Verbindung wird abgebrochen.
-
-Bei diesen Meldungen sollten die #ib#Routenanweisungen#ie# überprüft werden:
-
-#ib(4)#Verbotene Route bei Quittung#ie(4)#
- Die #ib#Quittung#ie# kommt auf einer nicht erlaubten #ib#Route#ie# an. Dies kann
- bei #ib#Vermaschung#ie# passieren, oder aber, wenn eine Station versucht,
- sich für eine andere Station auszugeben.
-
-#ib(4)#Verbotene Route#ie(4)#
- Die danach bezeichnete Station versucht, auf einer anderen Route
- mit diesem Rechner zu kommunizieren, als auf der Route, die für
- diesen Rechner in der Datei #on("b")##ib#netz#ie##off("b")# festgelegt wurde.
-
- Abhilfe:
- #ib#Routentabellen#ie# der beiden (oder, falls die Meldung auf einer
- #ib#Knotenstation#ie# erscheint, auf allen beteiligten) Stationen abgleichen.
-
-#ib(4)#Weiterleitung nicht möglich#ie(4)#
- Die #ib#Routeninformationen#ie# auf dem #ib#Knotenrechner#ie#, wo diese Meldung
- erscheint, und der sendenden #ib#Station#ie# stimmen nicht überein. Die
- angegebene Station ist von dieser Station aus nicht erreichbar.
-
- Abhilfe:
- #ib#Routentabellen#ie# der Stationen überprüfen.
-
-#ib(4)#Fremdzugriff#ie(4)#
- Eine #ib#gesperrt#ie#e Station hat versucht, auf diesen Rechner mit #ib#Sende­
- codes#ie# > 6 zuzugreifen.
-
-
-Folgende Meldungen betreffen '#ib#harte Fehler#ie#'. Diese Fehler werden von der Netzsoft­
-ware nicht abgefangen. In jedem Fall muß das Netz nach einer solchen #ib#Fehler­
-meldung#ie# neu gestartet werden.
-
-#ib(4)#++++++#ie(4)#
- Meldungen dieser Form sind 'harte' Fehler. Der aufgetretene Fehler
- wird mit angegeben. Das Netz muß neu gestartet werden, da die
- Task, in welcher der Fehler aufgetreten ist, gelöscht wird.
-
-#ib(4)#Verbindungsengpaß#ie(4)#
- Es sind mehr Verbindungen festgestellt worden, als zulässig sind.
- Nach dieser Meldung wurde der entsprechende Netport gelöscht.
-
-
-Literaturverzeichnis
-
-
-#goalpage("A.2")#
-
-#clear pos#
-#lpos(1.0)##lpos(2.5)#
-#table#
-[1] EUMEL-Systemhandbuch, Teil 5, Intertaskkommunikation
- GMD St. Augustin, 1986
-[2] EUMEL-Systemhandbuch, Teil 2, Hardware und ihre Steuerung
-[3] EUMEL-Systemhandbuch, Teil 8, Spooler
-[4] EUMEL-Netz Installationsanweisung
- GMD St. Augustin, 1987
-[5] EUMEL-Systemhandbuch, Teil 4, Blockorientierte Ein/Ausgabe
-[6] EUMEL-Quellcode, Packet #on("b")#tasks#off("b")#
- GMD St. Augustin, 1986
-[7] EUMEL-Portierungshandbuch 8086, Version 8
- GMD St. Augustin, 1987
-
-#table end#
-
-
diff --git a/doc/net/netzhandbuch.anhang b/doc/net/netzhandbuch.anhang
deleted file mode 100644
index 17d1ece..0000000
--- a/doc/net/netzhandbuch.anhang
+++ /dev/null
@@ -1,58 +0,0 @@
-#pagenr ("%", 51)##setcount##block##pageblock##count per page#
-#headeven#
-#center#EUMEL Netzbeschreibung
-#center#____________________________________________________________
-
-#end#
-#headodd#
-#center#Anhang
-#center#____________________________________________________________
-
-#end#
-#bottomeven#
-#center#____________________________________________________________
-Netz - % #right#GMD
-#end#
-#bottomodd#
-#center#____________________________________________________________
-GMD #right#Netz - %
-#end#
-#clear pos##lpos(0.0)##rpos(11.0)##fillchar(".")#
-Anhang: Netz-Fehlermeldungen
-
-#table#
-++++++ 50
-Absteigende Seitennummern 48
-blockin abbruch 48
-Blocknummer falsch 47
-buffers flushed 47
-Call gelöscht 49
-Call-Löschung vorgemerkt 49
-Collectortask fehlt 8, 18
-Daten ohne Eroeffnung 47
-Empfangseintrag freigegeben 48
-etwas rueckgespult 47
-Falsche Seitennummer 48
-Fremdzugriff 50
-Header inkorrekt eingelesen 48
-Irrläufer 48
-kein Zugriff auf Station 14
-Neustart 48
-Nicht zustellbar 49
-Quellrechner 49
-Sendung von Gegenstelle gelöscht 48
-Sequenzfehler 47
-Sequenzreset 47
-skipped 46
-Station x antwortet nicht 8, 11, 16
-Station x gibt es nicht 9, 11, 13
-Strom falsch in Quittung 48
-Task "..." gibt es nicht 8
-Verbindungsengpaß 50
-Verbotene Route 49
-Verbotene Route bei Quittung 49
-wdh data 47
-wdh open 47
-Weiterleitung nicht möglich 49
-#table end#
-
diff --git a/doc/net/netzhandbuch.index b/doc/net/netzhandbuch.index
deleted file mode 100644
index 01d8a0f..0000000
--- a/doc/net/netzhandbuch.index
+++ /dev/null
@@ -1,259 +0,0 @@
-#pagenr ("%", 52)##setcount (1)##block##pageblock##count per page#
-#headeven#
-#center#EUMEL Netzbeschreibung
-#center#____________________________________________________________
-
-#end#
-#headodd#
-#center#Anhang
-#center#____________________________________________________________
-
-#end#
-#bottomeven#
-#center#____________________________________________________________
-Netz - % #right#GMD
-#end#
-#bottomodd#
-#center#____________________________________________________________
-GMD #right#Netz - %
-#end#
-#clear pos##lpos(0.0)##rpos(11.0)##fillchar(".")#
-Anhang: Index
-
-#table#
-/ 8, 9, 24
-Absenderadresse 39
-Absenderstation 28, 32
-Adresse 29, 37, 39, 41, 42
-aktiviere netz 14, 15, 18
-basic net 41, 43
-Baud 6, 18, 25
-blockin 23, 36, 40, 42
-blockout 23, 36, 40
-Broad- oder Multicasts 38
-buffers flushed 47
-CASE 37
-CLOSE 27
-collected destination 22, 24
-Collector 22, 24, 32, 48
-Collectortask 8, 18, 22
-configurate 6
-continue 7, 21
-CRC-Code 26
-DATA 27, 29, 30
-data length 23, 36, 41, 45
-data length via node 23, 36, 41, 42, 45
-Datei 2, 5, 7, 12, 13, 14, 18, 20, 24, 31, 37, 41, 44, 46
-Datenbox 2, 6, 33
-Datenraum 13, 15, 21, 23, 24, 27, 28, 29, 31, 36, 40, 43
-Datenraumseite 23, 46, 47
-decode packet length 42, 43
-define collector 22, 24
-definere netz 15
-DEFINES 37
-define station 5, 22
-definiere netz 14
-Dreher 16
-Durchsatz 3
-Eingabeprozeduren 21
-Eingabepuffer 47
-Empfangspuffer 15
-Empfangsströme 13, 15
-endquelle 28
-endziel 28
-erase 13, 19
-erlaube 14
-Ethernet 33, 34, 36, 37, 42
-EUMEL0 21, 22, 24
-EUMEL-Datenboxen-Netz 33
-EUMEL-Netz-Software 35
-exists 11
-Fehler 8, 16, 17, 18
-Fehlerbehandlung 31, 36, 42
-Fehlerfälle 8
-Fehlerfall 11, 40
-Fehlermeldung 13, 15, 20, 26, 39, 45, 46, 50
-Fehlersituationen 12
-Fehlersuche 16
-Fenstertechnik 31
-fetch 10, 18
-flush buffers 36, 42
-Flußkontrolle 7, 15, 27, 39
-free global manager 10, 19, 31
-Füllzeichen 37, 39, 42, 43
-gesperrt 13, 14, 45, 50
-global manager 19, 31
-harte Fehler 50
-HDLC 31
-Header 43
-Höhere Ebenen 31
-inchar 21
-incharety 23
-Installation 2
-Installationsanleitung 2
-Intertaskkommunikation 48
-I/O Control 36
-I/O-Kanal 33
-Kanal 3, 6, 7, 12, 14, 15, 20, 21, 23, 24, 34, 37, 40, 41
-Kanalnummer 14
-Kanaltask 45
-Knoten 3, 4, 17, 20, 23, 36, 42
-Knotenkonzept 3, 34
-Knotenrechner 34, 36, 49
-Knotenstation 13, 14, 20, 49
-Kommunikation 17
-Kommunikationindirekte 23
-konfigurieren 6
-Länge 29, 41, 42
-Längenangabe 26
-list 10, 12, 17, 44
-listoption 12, 14, 15
-Löschversuche 13
-Manager 10, 19
-Masseschluß 16
-max mode 43
-mode text 41
-Nachbarn 4, 28
-Nachbarstation 24, 28
-name 11, 24, 49
-net 7, 12, 13
-net addess 41
-net hardware interface 34, 40
-net install 7
-net list 12, 15
-net manager 41
-net mode 41, 43
-net port 7, 8, 12, 13, 18, 45, 46
-net timer 14
-netz 7, 14, 15, 20, 37, 41, 49
-Netzbox 3, 6, 20, 33, 38
-Netzdefinition 14
-Netzebene 26
-Netzempfangstask 30
-Netzhardware 2, 17, 21, 24, 33, 34, 36, 41, 43
-Netz-Hardware-Interface 34
-Netzinstallation 17
-Netzkanal 13, 14, 42
-Netzknoten 3
-Netzkonfiguration 7, 20
-Netzmodus 34, 37, 39, 41, 43
-Netzprotokoll 42
-Netzsoftware 2, 3, 18, 20, 34, 36, 38, 42, 48
-Netzstrang 4, 17, 23
-Netztask 15, 16, 21, 24
-Netztelegramm 34
-Netztreiber 38
-Netzübertragungen 12
-Netzversion 2, 45
-next packet start 36, 42
-niltext 11, 36
-Nutzdaten 23
-Nutzdatenlänge 17, 23, 29, 36, 41, 42, 45
-Nutzinformation 29
-nutzlaenge 29
-OPEN 27, 28, 30, 47
-Paket 23, 34, 37, 38, 39, 42, 43
-Pakete, Aufbau der 34
-Partner 46
-Paßwort 19
-Pin-Belegung 6
-port intern 13, 15, 24
-Printerserver 20
-Protokoll 6, 13, 24, 39
-Protokollebenen 25
-Prüfsummen 18
-Quelle 23, 26, 28
-Quellrechnernummer 49
-Quellstationsnummer 20
-quelltask 21, 24, 28
-Querarchivierungen 10
-QUIT 27, 28, 30
-Quittung 30, 31, 47, 48, 49
-Rechnerkopplung 3
-Rendezvouskonzept 21, 31
-report 8, 12, 18, 39, 40, 41, 45, 46
-reserve 10
-RESET 17
-reset box 43
-Route 13, 15, 17, 20, 49
-routen 14
-Routenanweisungen 49
-routen aufbauen 13, 14, 15
-Routeninformationen 20, 49
-Routentabelle 9, 13
-Routentabellen 24, 49
-router 13
-RS422 25
-RTS/CTS 6, 25, 39
-Rückmeldeparameter 21
-run 13
-save 10, 19
-Schnittstelle 3, 15, 18, 20, 25, 33, 37, 38, 39
-SDLC 25, 26
-seite 28, 29, 40
-Seiten 27
-Seitengrenze 23
-Seitennummer 47, 48
-SELECT 34, 37, 43
-send 21, 22, 24, 27, 28, 30, 32
-Sendecode 24
-Sendecodes 50
-Sendeströme 13, 46
-Sendungskonzept 2
-sequenz 28, 29, 46
-Sequenzfehler 47
-Sequenznummer 46, 47
-Sequenzreset 47
-set net mode 41
-SHard 38, 43
-Sicherheitskonzept 19
-Sicherheitsprobleme 19
-skipped 46
-sperre 14
-Spoolmanager 5
-Sprungleiste 43
-Sprungleisten 34, 37
-start 5, 13, 16, 18, 41
-starte kanal 14, 15
-station 2, 5, 8, 10, 12, 13, 16, 19, 20, 22, 24, 26, 31, 32, 36, 41, 45, 48, 49
-Stationen, sicherheitsrelevante 20
-Stationsadresse 38
-Stationsnummer 5, 10, 16, 22, 24, 26, 32, 37, 41, 46
-Stationsnummer maximale 14
-Strang 3, 17, 20, 36, 41
-Stream I/O 23, 38
-strom 28, 30, 46
-Stromnummer 13, 28, 30, 45, 46, 47, 48
-STX 26, 36, 42
-Task-Id 5, 22, 24, 28, 30
-Telegramm 20, 23, 26, 27, 28, 31, 36, 37, 40, 42, 43, 46, 47, 48
-Telegrammanfang 42
-Telegrammformat 26
-Telegrammfreigabe 36
-Textdatei 31
-Timeout 31, 36, 48
-transmit header 36, 42, 43
-transmit trailer 36, 43
-Treiber 33
-Ãœbertragung 26, 30, 46, 47
-Ãœbertragungsfehler 42
-Ãœbertragungsgeschwindigkeit 34, 38
-Ãœbertragungsweg 23
-V24 3, 4, 15, 17, 18, 20, 25, 33, 34, 38
-Verbindung 3, 6, 16, 18, 27, 28, 34, 48, 49
-Vermaschung 4, 49
-Vermittlungsebene 24, 30
-Vorspann 36, 43
-wait 19, 21, 24, 27, 32
-Worker 5
-Zeichen 36, 38, 40, 42, 46
-Zeichenverluste 46, 47, 48
-Zeitüberwachung 26, 29
-ziel 28
-Zieladresse 38
-Zielstation 4, 8, 24, 28, 30, 36, 45
-Zieltask 21, 22, 24, 28, 32, 49
-Zustand 46
-Zwischenstation 45
-#table end#
-
diff --git a/doc/PORT-X86 b/doc/porting-8086/8/doc/Port.8086
index 007ca28..a709a2a 100644
--- a/doc/PORT-X86
+++ b/doc/porting-8086/8/doc/Port.8086
@@ -5,7 +5,7 @@
#type("triumb36")#
#free(4.0)#
EUMEL
- Portierungshand-
+ Portierungshand­
buch
8086 / 8088
#type("triumb18")#
@@ -23,7 +23,7 @@
#type("triumb12")#Inhalt
#a#
-Teil 1: Einführung #topage("ein")#
+Teil 1: Einführung #topage("ein")#
#free(0.3)#
Zweck dieses Handbuchs #topage("zweck")#
Referenzliteratur #topage("reflit")#
@@ -51,7 +51,7 @@ Teil 3: SHard-Interface Spezifikation #topage("shardifc")#
Hauptspeicher #topage("haupt")#
Speicherfehler #topage("memerr")#
4. Zeitgeber #topage("zeit")#
- 5. Kanäle #topage("channel")#
+ 5. Kanäle #topage("channel")#
5.1 Stream-IO #topage("stream")#
Terminals #topage("term")#
Drucker, Plotter #topage("druck")#
@@ -61,11 +61,11 @@ Teil 3: SHard-Interface Spezifikation #topage("shardifc")#
Block-IO zur MS-DOS-Partition #topage("bmsdosp")#
5.3 IO-Steuerung #topage("iocontrol")#
Einstellung serieller Schnittstellen #topage("v24")#
- Flußkontrolle #topage("fluss")#
+ Flußkontrolle #topage("fluss")#
Kalender #topage("kalender")#
6. SHard-Interface Version #topage("shdver")#
7. ID-Konstanten #topage("ID")#
- 8. Zusätzliche Leistungen #topage("shdelan")#
+ 8. Zusätzliche Leistungen #topage("shdelan")#
9. Spezialroutinen #topage("ke")#
Teil 4: Tips zur Portierung #topage("tips")#
@@ -80,8 +80,8 @@ Anhang A: EUMEL-Debugger "Info" #topage("info")#
Info-Kommandos #topage("cmdinf")#
Einige Systemadressen #topage("sysaddr")#
Leitblock #topage("pcb")#
-
-#cc("Teil 1: ","Einführung")#
+#page#
+#cc("Teil 1: ","Einführung")#
#goalpage("ein")#
@@ -89,11 +89,11 @@ Anhang A: EUMEL-Debugger "Info" #topage("info")#
#goalpage("zweck")#
Dieses Portierungshandbuch wendet sich an diejenigen, die das EUMEL-System auf einem
-neuen Rechnertyp implementieren wollen. Es ist Teil einer Serie von Portierungshandbüchern
-für verschiedene Prozessortypen. Dieses bezieht sich auf Rechner mit 8086/ 8088-Prozes-
+neuen Rechnertyp implementieren wollen. Es ist Teil einer Serie von Portierungshandbüchern
+für verschiedene Prozessortypen. Dieses bezieht sich auf Rechner mit 8086/ 8088-Prozes­
soren.
-Zum Betrieb eines EUMEL-Systems wird dieses Handbuch nicht benötigt!
+Zum Betrieb eines EUMEL-Systems wird dieses Handbuch nicht benötigt!
@@ -115,71 +115,71 @@ Zum Betrieb eines EUMEL-Systems wird dieses Handbuch nicht benötigt!
#b("Minimale Hardwarevoraussetzungen")#
#goalpage("hardw")#
-Um das EUMEL-System effizient einsetzen zu können, sollte die Hardware mindestens
-folgenden Kriterien genügen:
+Um das EUMEL-System effizient einsetzen zu können, sollte die Hardware mindestens
+folgenden Kriterien genügen:
#ib#CPU#ie# Die 8086-CPU sollte mit mindestens 2.5 MHz (8088: 4.0 MHz)
- arbeiten. Falls die Buszugriffe durch einen CRTC o.ä. ver-
+ arbeiten. Falls die Buszugriffe durch einen CRTC o.ä. ver­
langsamt werden, sollte die echte 8086/ 8088-Leistung
durchschnittlich mindestens einem ungebremsten 2.5 MHz (4.0
MHz) System entsprechen.
Seltene Verlangsamungen (z.B. nur bei I/O-Operationen)
- spielen bei diesen Überlegungen keine Rolle.
+ spielen bei diesen Ãœberlegungen keine Rolle.
- RAM Das System sollte über mindestens 80 K Byte #ib#Hauptspeicher#ie#
- verfügen, besser sind 128 K als Anfangsausrüstung.
+ RAM Das System sollte über mindestens 80 K Byte #ib#Hauptspeicher#ie#
+ verfügen, besser sind 128 K als Anfangsausrüstung.
#ib#Hintergrund#ie# Als Hintergrundmedium sind #ib#Floppy#ie#, #ib#Harddisk#ie# und RAM bzw.
ROM denkbar.
- Kapazität: > 300 K, besser > 400 K (Single-User)
+ Kapazität: > 300 K, besser > 400 K (Single-User)
> 750 K, besser > 1000 K (Multi-User)
Zugriff: < 500 ms (Single-User)
< 200 ms (Multi-User) *)
#foot#
#f#
-*) Hier ist die durchschnittliche Zugriffszeit auf einen 512 Byte großen Block gemeint. Für Platten und Floppies kann man
-sie als Summe der Positionierzeit über die halbe Platte und der Zeit einer halben Umdrehung berechnen.#a##end#
+*) Hier ist die durchschnittliche Zugriffszeit auf einen 512 Byte großen Block gemeint. Für Platten und Floppies kann man
+sie als Summe der Positionierzeit über die halbe Platte und der Zeit einer halben Umdrehung berechnen.#a##end#
- #ib#Archiv#ie# Als Archivgerät wird meistens eine Floppy eingesetzt. Aber
- auch Band oder Kassettenrecorder sind denkbar. Die Anfor-
- derungen an Kapazität und Geschwindigkeit sind anwen-
+ #ib#Archiv#ie# Als Archivgerät wird meistens eine Floppy eingesetzt. Aber
+ auch Band oder Kassettenrecorder sind denkbar. Die Anfor­
+ derungen an Kapazität und Geschwindigkeit sind anwen­
dungsspezifisch.
#ib#Bildschirm#ie# Angestrebt werden sollte ein Bildschirm mit 24 Zeilen mit je 80
- Zeichen (oder größer). Kleinere Bildschirme sind anschließbar,
- aber mit 40 Zeichen pro Zeile läßt sich nicht mehr komfortabel
+ Zeichen (oder größer). Kleinere Bildschirme sind anschließbar,
+ aber mit 40 Zeichen pro Zeile läßt sich nicht mehr komfortabel
arbeiten.
- Rollup und freie Cursorpositionierung sind notwendige Vor-
- aussetzungen, invers-video ist erwünscht, aber nicht not-
- wendig. Weiterhin werden 'Löschen bis Zeilenende' und 'Lö-
- schen bis Schirmende' benötigt. Lokale Editierfunktionen sind
- überflüssig.
-
- #ib#Tastatur#ie# An Steuertasten sollten mindestens ESC und die vier Cur-
- sortasten vorhanden sein. Dabei ist es günstig, wenn die
+ Rollup und freie Cursorpositionierung sind notwendige Vor­
+ aussetzungen, invers-video ist erwünscht, aber nicht not­
+ wendig. Weiterhin werden 'Löschen bis Zeilenende' und 'Lö­
+ schen bis Schirmende' benötigt. Lokale Editierfunktionen sind
+ überflüssig.
+
+ #ib#Tastatur#ie# An Steuertasten sollten mindestens ESC und die vier Cur­
+ sortasten vorhanden sein. Dabei ist es günstig, wenn die
Cursortasten ergonomisch als Block bzw. Kreuz angeordnet
- sind. EUMEL benötigt weitere Steuertasten für HOP, RUBIN,
- RUBOUT und MARK. Dafür können beliebige Tasten der
- Tastatur gewählt werden.
+ sind. EUMEL benötigt weitere Steuertasten für HOP, RUBIN,
+ RUBOUT und MARK. Dafür können beliebige Tasten der
+ Tastatur gewählt werden.
#b("Systemdurchsatz")#
#goalpage("durchsatz")#
-Da das EUMEL-System auf dem Prinzip des Demand Paging aufbaut, hängt der System-
+Da das EUMEL-System auf dem Prinzip des Demand Paging aufbaut, hängt der System­
durchsatz von
- CPU Leistung
- - Speichergröße (RAM)
+ - Speichergröße (RAM)
- Geschwindigkeit beim Hintergrundzugriff (Floppy, Harddisk)
ab. Mit zunehmender Benutzerzahl steigen in der Regel die Anforderungen an das Paging
-(Hintergrund-Zugriff) schneller als an die CPU. In diesem Bereich kann man die System-
-leistung dann durch mehr Speicher und/oder eine schnellere Platte in größerem Umfang
-steigern. Dabei läßt sich eine langsame Platte teilweise durch mehr RAM und umgekehrt
+(Hintergrund-Zugriff) schneller als an die CPU. In diesem Bereich kann man die System­
+leistung dann durch mehr Speicher und/oder eine schnellere Platte in größerem Umfang
+steigern. Dabei läßt sich eine langsame Platte teilweise durch mehr RAM und umgekehrt
wenig RAM durch eine schnelle Platte ausgleichen.
@@ -191,39 +191,39 @@ Das EUMEL-System besteht aus mehreren Schichten:
- EUMEL 2: Standardpakete, Editor, ...
+ EUMEL  2: Standardpakete, Editor, ...
- EUMEL 1: ELAN Compiler
+ EUMEL  1: ELAN Compiler
- EUMEL 0: Basismaschine
+ EUMEL  0: Basismaschine
- EUMEL -1: SHard
+ EUMEL -1: SHard
H a r d w a r e
-Dieses #ib#Schichtenmodell#ie# ist nach oben offen und kann deshalb um beliebig viele (höhere)
+Dieses #ib#Schichtenmodell#ie# ist nach oben offen und kann deshalb um beliebig viele (höhere)
Schichten erweitert werden.
-EUMEL > 0 Die Standardsoftware der Schichten > 0 ist in der Sprache ELAN geschrie-
- ben (siehe "EUMEL Quellcode"). Dementsprechend sind alle Schichten ober-
- halb der EUMEL-0-Maschine prozessor- und rechnerunabhängig, d.h.
+EUMEL > 0 Die Standardsoftware der Schichten > 0 ist in der Sprache ELAN geschrie­
+ ben (siehe "EUMEL Quellcode"). Dementsprechend sind alle Schichten ober­
+ halb der EUMEL-0-Maschine prozessor- und rechnerunabhängig, d.h.
Anpassungen an einen neuen Rechnertyp sind nicht erforderlich.
-#ib#EUMEL 0#ie# Die sogenannte "EUMEL-0-Maschine" enthält alle Basisoperationen und
- hängt davon ab, welchen Prozessortyp der Rechner als CPU verwendet. Sie
- existiert für verschiedene Prozessortypen. Hier wird nur auf den Typ 8086/
+#ib#EUMEL 0#ie# Die sogenannte "EUMEL-0-Maschine" enthält alle Basisoperationen und
+ hängt davon ab, welchen Prozessortyp der Rechner als CPU verwendet. Sie
+ existiert für verschiedene Prozessortypen. Hier wird nur auf den Typ 8086/
8088 Bezug genommen. Bei der Portierung auf einen 8086/8088-Rechner
- wird die 8086/8088-EUMEL-0-Maschine ohne Anpassungen (!) übernom-
+ wird die 8086/8088-EUMEL-0-Maschine ohne Anpassungen (!) übernom­
men.
EUMEL -1 Diese Schicht stellt das Interface zwischen der EUMEL-0-Maschine und der
- eigentlichen Hardware (vom Prozessor abgesehen) dar. Insbesondere umfaßt
- sie alle Routinen zur Ansteuerung peripherer Geräte (Gerätetreiber).
+ eigentlichen Hardware (vom Prozessor abgesehen) dar. Insbesondere umfaßt
+ sie alle Routinen zur Ansteuerung peripherer Geräte (Gerätetreiber).
Diese Schicht wird "SHard" genannt ("S"oftware-"Hard"ware Interface).
Der SHard ist der einzige Teil des Systems, der bei der Portierung auf einen 8086/8088-
-Rechner angepaßt bzw. neu geschrieben werden muß. Deshalb besteht der größte Teil dieses
+Rechner angepaßt bzw. neu geschrieben werden muß. Deshalb besteht der größte Teil dieses
Handbuchs aus der Spezifikation des 8086/8088-SHards.
@@ -231,30 +231,30 @@ Handbuchs aus der Spezifikation des 8086/8088-SHards.
#b("Anlieferung des 8086/8088-EUMEL-Systems")#
#goalpage("anlief")#
-Der Implementierer erhält die EUMEL-Software auf Disketten. Dabei stehen folgende
+Der Implementierer erhält die EUMEL-Software auf Disketten. Dabei stehen folgende
Standardformate zur Wahl:
- 8", 1D, 77 Spuren, 16 Sektoren (#0...#15) ¾ 512 Byte
+ 8", 1D, 77 Spuren, 16 Sektoren (\#0...\#15) � 512 Byte
- 5", 2D, 40 Spuren, 9 Sektoren (#1...#9) ¾ 512 Byte *)
+ 5", 2D, 40 Spuren, 9 Sektoren (\#1...\#9) � 512 Byte *)
#foot#
#f#
*) 48 tpi#a##end#
-Die Diskettenlieferung enthält
+Die Diskettenlieferung enthält
- Single-User Hintergrund
- Multi-User Hintergrund
- Standardarchive
- Archive mit weiterer Anwendersoftware
-Dabei enthält der Hintergrund auch die EUMEL-0-Software (oft auch als "Urlader" be-
+Dabei enthält der Hintergrund auch die EUMEL-0-Software (oft auch als "Urlader" be­
zeichnet).
#on("i")#Bitte gehen Sie vorsichtig mit diesen Mutterdisketten um. Verwenden Sie sie nur als Quelle
beim Kopieren. Sie sollten nur auf Kopien davon arbeiten!#off("i")#
-
+#page#
#cc("Teil 2: ","Allgemeine Strukturen")#
#goalpage("allgem")#
@@ -262,15 +262,15 @@ beim Kopieren. Sie sollten nur auf Kopien davon arbeiten!#off("i")#
#b("Hintergrund")#
#goalpage("hg")#
-Der Hintergrund ist in 512 Bytes große Blöcke unterteilt. Sie werden durch Blocknummern (0,
-1, 2, ...) adressiert. Die physische Ablage der Blöcke auf dem Hintergrundmedium bleibt dem
-SHard überlassen. Er kann sie z.B. linear oder versetzt anordnen. Man sollte darauf achten,
-daß Positionierungen auf logisch "nahe" Blöcke möglichst schnell gehen sollten. Deshalb ist
-in der Regel zylinderorientierte Anordnung der oberflächenorientierten vorzuziehen.
+Der Hintergrund ist in 512 Bytes große Blöcke unterteilt. Sie werden durch Blocknummern (0,
+1, 2, ...) adressiert. Die physische Ablage der Blöcke auf dem Hintergrundmedium bleibt dem
+SHard überlassen. Er kann sie z.B. linear oder versetzt anordnen. Man sollte darauf achten,
+daß Positionierungen auf logisch "nahe" Blöcke möglichst schnell gehen sollten. Deshalb ist
+in der Regel zylinderorientierte Anordnung der oberflächenorientierten vorzuziehen.
-Falls auf dem Hintergrundgerät spezielle Blöcke z.B. für Boot und SHard freigehalten werden
-sollen, muß das bei der Abbildung der Hintergrundblocknummern auf die Sektoren der Floppy
-bzw. der Harddisk berücksichtigt werden.
+Falls auf dem Hintergrundgerät spezielle Blöcke z.B. für Boot und SHard freigehalten werden
+sollen, muß das bei der Abbildung der Hintergrundblocknummern auf die Sektoren der Floppy
+bzw. der Harddisk berücksichtigt werden.
Aufbau des Hintergrundes:
@@ -285,17 +285,17 @@ Aufbau des #ib#Systemetikett#ie#s (#ib#Block 0#ie#):
Byte Wert/Aufgabe
- 0...5 "EUMEL-"; Kennzeichen für EUMEL-Hintergrund.
- 6...11 Versionsnummer in druckbaren Zeichen. Sie stellt sicher, daß Urlader und
+ 0...5 "EUMEL-"; Kennzeichen für EUMEL-Hintergrund.
+ 6...11 Versionsnummer in druckbaren Zeichen. Sie stellt sicher, daß Urlader und
Hintergrund kompatibel sind.
12 FFh ; zur Zeit ohne Bedeutung
- 13 enthält Wert 0 , wenn System im Shutupzustand ist.
- 14..15 Systemlaufzähler (14=low, 15=high). Wird bei jedem Systemstart um 1
- erhöht.
+ 13 enthält Wert 0 , wenn System im Shutupzustand ist.
+ 14..15 Systemlaufzähler (14=low, 15=high). Wird bei jedem Systemstart um 1
+ erhöht.
16..35 Reserviert; zur Zeit ohne Bedeutung
- 36..37 Aus historischen Gründen für interne Zwecke belegt.
- 38 .. 69 Hier kann eine Installationsnummer geführt werden.
- 70 .. 79 Info-Paßwort
+ 36..37 Aus historischen Gründen für interne Zwecke belegt.
+ 38 .. 69 Hier kann eine Installationsnummer geführt werden.
+ 70 .. 79 Info-Paßwort
80...255 Reserviert.
256..511 Kann von SHard beliebig verwendet werden.
@@ -304,12 +304,12 @@ Aufbau des #ib#Systemetikett#ie#s (#ib#Block 0#ie#):
#b("Archiv")#
#goalpage("arch")#
-Wie der Hintergrund sind die Archive in 512 Bytes große Blöcke unterteilt. Bisher gibt es
+Wie der Hintergrund sind die Archive in 512 Bytes große Blöcke unterteilt. Bisher gibt es
folgende #dx("Standardformate")#:
- 8", 1D, 77 Spuren, 16 Sektoren (#0...#15) ¾ 512 Byte
- 8", 2D, 77 Spuren, 16 Sektoren (#0...#15) ¾ 512 Byte
+ 8", 1D, 77 Spuren, 16 Sektoren (\#0...\#15) � 512 Byte
+ 8", 2D, 77 Spuren, 16 Sektoren (\#0...\#15) � 512 Byte
Block Seite Spur Sektor
@@ -320,7 +320,7 @@ folgende #dx("Standardformate")#:
n n DIV (77*16) n MOD (77*16) DIV 16 n MOD 16
- 5", 2D, 40 Spuren, 9 Sektoren (#1...#9) ¾ 512 Byte
+ 5", 2D, 40 Spuren, 9 Sektoren (\#1...\#9) � 512 Byte
Block Seite Spur Sektor
@@ -331,7 +331,7 @@ folgende #dx("Standardformate")#:
n n DIV (40*9) n MOD (40*9) DIV 9 n MOD 9 + 1
- 5", 2D, 80 Spuren, 9 Sektoren (#1...#9) ¾ 512 Byte
+ 5", 2D, 80 Spuren, 9 Sektoren (\#1...\#9) � 512 Byte
Block Seite Spur Sektor
@@ -342,7 +342,7 @@ folgende #dx("Standardformate")#:
n n DIV (80*9) n MOD (80*9) DIV 9 n MOD 9 + 1
- 5", HD, 80 Spuren, 15 Sektoren (#1...#15) ¾ 512 Byte
+ 5", HD, 80 Spuren, 15 Sektoren (\#1...\#15) � 512 Byte
Block Seite Spur Sektor
@@ -353,17 +353,17 @@ folgende #dx("Standardformate")#:
n n DIV (80*15) n MOD (80*15) DIV 15 n MOD 15 + 1
-Selbstverständlich können auch andere #ib#Archivformate#ie# implementiert werden, falls das aus
-Hardwaregründen notwendig ist oder sich dadurch wesentliche Verbesserungen (z.B. in der
-Kapazität) ergeben.
+Selbstverständlich können auch andere #ib#Archivformate#ie# implementiert werden, falls das aus
+Hardwaregründen notwendig ist oder sich dadurch wesentliche Verbesserungen (z.B. in der
+Kapazität) ergeben.
-Wenn irgend möglich sollte aber mindestens eines der oben aufgeführten Standardformate
-unterstützt werden - evtl. als zusätzliches Format -, um den Austausch zwischen verschie-
+Wenn irgend möglich sollte aber mindestens eines der oben aufgeführten Standardformate
+unterstützt werden - evtl. als zusätzliches Format -, um den Austausch zwischen verschie­
denen Rechnertypen zu vereinfachen.
-#on("i")#Hinweis: Um den Datenaustausch zwischen verschiedenen Rechnertypen zu vereinfa-
- chen, sollten möglichst alle der hardwaremäßig möglichen Standardformate (min-
- destens lesend) unterstützt werden. Dabei sollte SHard sich automatisch auf das
+#on("i")#Hinweis: Um den Datenaustausch zwischen verschiedenen Rechnertypen zu vereinfa­
+ chen, sollten möglichst alle der hardwaremäßig möglichen Standardformate (min­
+ destens lesend) unterstützt werden. Dabei sollte SHard sich automatisch auf das
Format der jeweils eingelegten Floppy einstellen:#off("i")#
@@ -379,7 +379,7 @@ denen Rechnertypen zu vereinfachen.
#f#
*) Bei der Behandlung von 40-Spur-Disketten auf 80-Spur-Laufwerken gelten meistens folgende Regeln:
a) Lesen funktioniert sicher.
- b) Schreiben ist unsicher, funktioniert aber häufig.
+ b) Schreiben ist unsicher, funktioniert aber häufig.
c) Formatieren funktioniert fast nie.
#a#
#end#
@@ -390,18 +390,18 @@ denen Rechnertypen zu vereinfachen.
#goalpage("speicher")#
Der #ib#Speicher#ie# wird EUMEL-0 vom SHard in maximal vier Speicherbereichen (M0...M3)
-zugewiesen. M0 muß immer vorhanden sein, M1, M2 und M3 nur in speziellen Betriebsarten:
+zugewiesen. M0 muß immer vorhanden sein, M1, M2 und M3 nur in speziellen Betriebsarten:
#dx("M0")# #on("b")#allgemeines #ib#RAM#ie(1,", allgemeines")##off("b")#
- Dieser Bereich muß immer vorhanden sein. Bei den meisten Rechnern liegt der
+ Dieser Bereich muß immer vorhanden sein. Bei den meisten Rechnern liegt der
Urlader nicht in einem ROM, sondern wird von SHard in das RAM geladen. Das
- geschieht dann an den Anfang von M0. Der Rest wird für Tabellen und als Pa-
- gingbereich benutzt. M0 umfaßt deshalb meistens allen verfügbaren Speicher, bis
- auf den Platz für SHard, Boot-ROM und Bildwiederholspeicher.
+ geschieht dann an den Anfang von M0. Der Rest wird für Tabellen und als Pa­
+ gingbereich benutzt. M0 umfaßt deshalb meistens allen verfügbaren Speicher, bis
+ auf den Platz für SHard, Boot-ROM und Bildwiederholspeicher.
#dx("M1")# #on("b")#Urlader-#ib#ROM#ie(1,", Urlader")##off("b")#
Gibt es nur bei Rechnern, die den Urlader in einem ROM haben. (M0 wird dann
- nur für Tabellen und als Pagingspeicher eingesetzt.)
+ nur für Tabellen und als Pagingspeicher eingesetzt.)
#dx("M2")# #on("b")#Hintergrund-#ib#ROM#ie(1,", Hintergrund")##off("b")#
Gibt es nur bei Rechnern, die nicht Floppy oder Festplatte sondern ROM und
@@ -411,36 +411,36 @@ zugewiesen. M0 muß immer vorhanden sein, M1, M2 und M3 nur in speziellen Betrieb
Gibt es nur bei Rechnern, die nicht Floppy oder Festplatte sondern ROM und
RAM oder RAM allein als Hintergrundspeicherverwenden.
-Damit sind drei verschiedene Betriebsarten des EUMEL-Systems möglich:
+Damit sind drei verschiedene Betriebsarten des EUMEL-Systems möglich:
#dx("Normalbetrieb")#: M0 (> 80 K)
- Hintergrundgerät (Festplatte oder Floppy)
- Archivgerät (Floppy)
+ Hintergrundgerät (Festplatte oder Floppy)
+ Archivgerät (Floppy)
Im Normalbetrieb befindet sich der Hintergrund auf einer Festplatte oder Floppy.
- RAM wird für den Urlader und zum Paging eingesetzt. Alle mittleren und grö-
- ßeren Systeme verwenden den Normalbetrieb.
+ RAM wird für den Urlader und zum Paging eingesetzt. Alle mittleren und grö­
+ ßeren Systeme verwenden den Normalbetrieb.
#dx("Minibetrieb")#: M0 (> 80 K)
M3 (mindestens 300 K)
- Archivgerät (Floppy)
+ Archivgerät (Floppy)
Im Minibetrieb wird RAM als Hintergrundspeicher eingesetzt. Dieser wird beim
- Einschalten über das Archivgerät geladen und beim Abschalten ('shutup') wieder
- zurückgeschrieben.
+ Einschalten über das Archivgerät geladen und beim Abschalten ('shutup') wieder
+ zurückgeschrieben.
#dx("ROM-Betrieb")#: M0 (> 24 K)
M1 (> 45 K)
M2 (> 170 K)
M3 (> 60 K)
- Archivgerät (Kassettenrecorder oder Floppy)
+ Archivgerät (Kassettenrecorder oder Floppy)
Im ROM-Betrieb stehen Urlader und Standardteil des Hintergrundes im ROM.
- Der übrige Hintergrund befindet sich im RAM.
+ Der übrige Hintergrund befindet sich im RAM.
-
+#page#
#cc("Teil 3: SHard ","Interface Spezifikation")#
#goalpage("shardifc")#
@@ -453,13 +453,13 @@ Damit sind drei verschiedene Betriebsarten des EUMEL-Systems möglich:
#goalpage("not")#
Im folgenden wird zwischen #dx("0-Routinen")#, die dem SHard vom EUMEL-0-System zur
-Verfügung gestellt werden, und #dx("SHard-Routinen")# unterschieden, die der SHard implemen-
-tieren muß. Damit dieser Unterschied bei der Spezifikation deutlich wird, werden 0-Routinen
-folgendermaßen aufgeführt:
+Verfügung gestellt werden, und #dx("SHard-Routinen")# unterschieden, die der SHard implemen­
+tieren muß. Damit dieser Unterschied bei der Spezifikation deutlich wird, werden 0-Routinen
+folgendermaßen aufgeführt:
name (0-Routine)
-Zusätzlich werden 0-Routinen grundsätzlich klein und SHard-Routinen groß geschrieben.
+Zusätzlich werden 0-Routinen grundsätzlich klein und SHard-Routinen groß geschrieben.
8086/8088-Befehle werden wie in "iAPX 86,88 Users Manual" (intel, 1981) notiert:
@@ -476,8 +476,8 @@ Hexadezimale Zahlen werden durch ein nachgestelltes 'h' gekennzeichnet:
#b("Link-Leisten")#
#goalpage("leist")#
-Die Verbindung zwischen SHard und Urlader (EUMEL-0) erfolgt über zwei Tabellen. In der
-"0-Leiste" stellt EUMEL-0 dem SHard verschiedene 0-Routinen zur Verfügung. Diese
+Die Verbindung zwischen SHard und Urlader (EUMEL-0) erfolgt über zwei Tabellen. In der
+"0-Leiste" stellt EUMEL-0 dem SHard verschiedene 0-Routinen zur Verfügung. Diese
Leiste beginnt an der Adresse M0:0 (im Normal- oder Minimodus) bzw. M1:0 (im ROM-
Modus):
@@ -487,7 +487,7 @@ Modus):
db 10 dup (?)
10h eumel0blocks dw
12h hgver dw
- 14h cputype dw 3 ; für 8086 oder kompatible CPU
+ 14h cputype dw 3 ; für 8086 oder kompatible CPU
16h urver dw
18h dw
1Ah shdvermin dw
@@ -502,13 +502,13 @@ Modus):
38h shutup dd
3Ch info dd
-Hinweis: Die Segmentteile der 'dd'-Addressen in dieser Link-Leiste sind natürlich unde-
- finiert. Deshalb muß SHard diese auf M0 bzw. M1 setzen. Dazu ist es mindestens
+Hinweis: Die Segmentteile der 'dd'-Addressen in dieser Link-Leiste sind natürlich unde­
+ finiert. Deshalb muß SHard diese auf M0 bzw. M1 setzen. Dazu ist es mindestens
beim ROM-Urlader erforderlich, die 0-Leiste in einen von SHard verwalteten
RAM-Bereich zu kopieren.
-Für die Gegenrichtung muß SHard der 0-Maschine die "SHard-Leiste" zur Verfügung stel-
+Für die Gegenrichtung muß SHard der 0-Maschine die "SHard-Leiste" zur Verfügung stel­
len:
Adresse
@@ -539,7 +539,7 @@ len:
Dabei ist als 'MxSTART' eine Paragraphenadresse (d.h. Adresse DIV 16) und entsprechend
-als 'MxSIZE' die Länge des Bereichs als Bytelänge DIV 16 anzugeben.
+als 'MxSIZE' die Länge des Bereichs als Bytelänge DIV 16 anzugeben.
@@ -553,33 +553,33 @@ In der Regel sind sowohl 0-Routinen als auch SHard-Routinen durch 'call' aufzuru
Ausnahmen von dieser Regel sind im folgenden stets besonders vermerkt.
-Generelle Link-Bedingung (für SHard- und 0-Routinen) ist:
+Generelle Link-Bedingung (für SHard- und 0-Routinen) ist:
- Alle Register - bis auf die jeweils spezifizierten Ausgangsparameter und das F-Re-
- gister *) - bleiben unverändert.
+ Alle Register - bis auf die jeweils spezifizierten Ausgangsparameter und das F-Re­
+ gister *) - bleiben unverändert.
#foot#
#f#
-*) Flags sind i.a. nach dem Aufruf einer Routine undefiniert. Ausnahmen sind natürlich die Flags, die als Ausgangspara-
-meter in manchen Fällen definiert sind.#a##end#
+*) Flags sind i.a. nach dem Aufruf einer Routine undefiniert. Ausnahmen sind natürlich die Flags, die als Ausgangspara­
+meter in manchen Fällen definiert sind.#a##end#
-Jede SHard-Routine muß also alle Register (bis auf F), die sie verändert und die keine
+Jede SHard-Routine muß also alle Register (bis auf F), die sie verändert und die keine
Ausgangsparameter sind, retten und wiederherstellen. Im Gegenzug braucht SHard beim
Aufruf von 0-Routinen selbst keine Register zu retten.
-Das schließt auch die Segmentregister mit ein. Um SHard-eigene Daten über DS zu adres-
-sieren, muß SHard also DS sichern, neu laden und zum Schluß wiederherstellen. Entspre-
-chendes gilt für ES. SS darf nicht verändert werden.
+Das schließt auch die Segmentregister mit ein. Um SHard-eigene Daten über DS zu adres­
+sieren, muß SHard also DS sichern, neu laden und zum Schluß wiederherstellen. Entspre­
+chendes gilt für ES. SS darf nicht verändert werden.
#b("Interrupts")#
#goalpage("intr")#
Zwei externe Ereignisse (Zeitgeber und Eingabe, siehe S.#topage("zeit")# und S.#topage("inp")#) werden von
-EUMEL-0 behandelt. Die entsprechenden Interrupts muß SHard per 'call' an 0-Routinen
+EUMEL-0 behandelt. Die entsprechenden Interrupts muß SHard per 'call' an 0-Routinen
weiterleiten.
-Die Register (bis auf AX und F) werden von den aufzurufenden 0-Routinen selbst gesi-
+Die Register (bis auf AX und F) werden von den aufzurufenden 0-Routinen selbst gesi­
chert. Auch die Segmentregister DS und ES werden von EUMEL-0 geladen. (CS wird
-automatisch durch den "far call" gesetzt, SS darf sowieso nicht verändert werden.) Die
-normale Interrupt-Sequenz im SHard sieht dann folgendermaßen aus:
+automatisch durch den "far call" gesetzt, SS darf sowieso nicht verändert werden.) Die
+normale Interrupt-Sequenz im SHard sieht dann folgendermaßen aus:
intadr: push ax
mov al,<parameter>
@@ -593,20 +593,20 @@ normale Interrupt-Sequenz im SHard sieht dann folgendermaßen aus:
#bb("1. System ","laden")#
#goalpage("laden")#
-SHard muß die EUMEL-0-Software vor dem eigentlichen Start an den Anfang der Spei-
+SHard muß die EUMEL-0-Software vor dem eigentlichen Start an den Anfang der Spei­
cherregion M0 laden. EUMEL-0 befindet sich normalerweise auf dem Hintergrund von Block
-10 ab. Der erste Block (10) enthält am Anfang die 0-Leiste. Dort steht an der Stelle 10h die
-Größe 'eumel0blocks'. Sie gibt an, wieviel Blöcke konsekutiv geladen werden müssen. Hat
-sie beispielsweise den Wert 80, müssen die Blöcke 10 bis 89 geladen werden.
+10 ab. Der erste Block (10) enthält am Anfang die 0-Leiste. Dort steht an der Stelle 10h die
+Größe 'eumel0blocks'. Sie gibt an, wieviel Blöcke konsekutiv geladen werden müssen. Hat
+sie beispielsweise den Wert 80, müssen die Blöcke 10 bis 89 geladen werden.
- Achtung: Zu diesem Zeitpunkt kann SHard die oben aufgeführten 0-Routinen na-
- türlich noch nicht benutzen. Insbesondere dürfen die Laderoutinen nicht
+ Achtung: Zu diesem Zeitpunkt kann SHard die oben aufgeführten 0-Routinen na­
+ türlich noch nicht benutzen. Insbesondere dürfen die Laderoutinen nicht
'warte' aufrufen. Das wird hier besonders betont, weil der Hintergrundzugriff
beim eigentlichen Systemlauf in der Regel 'warte' verwenden wird.
- Hinweis: Der erste Block der EUMEL-0-Software (Block 10) enthält in den ersten
- fünf Bytes den Text "EUMEL", um eine Identifikation durch den SHard-
- Lader zu ermöglichen.
+ Hinweis: Der erste Block der EUMEL-0-Software (Block 10) enthält in den ersten
+ fünf Bytes den Text "EUMEL", um eine Identifikation durch den SHard-
+ Lader zu ermöglichen.
Es wird empfohlen, nach folgendem Verfahren zu laden:
@@ -617,22 +617,22 @@ Es wird empfohlen, nach folgendem Verfahren zu laden:
ELSE laden unmoeglich
FI .
-So kann man auch bei einem frisch formatierten Hintergrundmedium einen neuen Hinter-
+So kann man auch bei einem frisch formatierten Hintergrundmedium einen neuen Hinter­
grund (mit EUMEL-0-Urlader) einspielen, indem man ein Hintergrundarchiv vor dem
-Systemstart in das Archivgerät legt. Dann wird EUMEL-0 von dort geladen, so daß man den
-Hintergrund dann wie im Systemhandbuch beschrieben vom Archiv auf das Hintergrundme-
+Systemstart in das Archivgerät legt. Dann wird EUMEL-0 von dort geladen, so daß man den
+Hintergrund dann wie im Systemhandbuch beschrieben vom Archiv auf das Hintergrundme­
dium kopieren kann.*)
#foot#
#f#
-*) Kopiervorgänge (Archiv -> Hintergrund) werden vom EUMEL-0-Urlader erledigt, so daß SHard keine derartigen
-Routinen enthalten muß.#a##end#
+*) Kopiervorgänge (Archiv -> Hintergrund) werden vom EUMEL-0-Urlader erledigt, so daß SHard keine derartigen
+Routinen enthalten muß.#a##end#
#bb("2. System","start und -ende")#
#goalpage("start")#
-SHard muß alle für den Rechner notwendigen (Hardware-) Initialisierungen durchführen und
+SHard muß alle für den Rechner notwendigen (Hardware-) Initialisierungen durchführen und
erst danach die EUMEL-0-Maschine starten ('systemstart').
#dx("systemstart")# (0-Routine)
@@ -644,50 +644,50 @@ erst danach die EUMEL-0-Maschine starten ('systemstart').
Zweck: Die EUMEL-0-Maschine wird gestartet. Alle notwendigen
Hardwareinitialisierungen (z.B. der Peripheriebausteine)
- müssen vorher schon geschehen sein.
+ müssen vorher schon geschehen sein.
Hinweis: Der Stackpointer und die Segmentregister brauchen nicht
definiert zu sein, da beim Ansprung alle Interrupts maskiert
- sein sollten und somit keine Interrupts auftreten können.
- EUMEL-0 lädt beim Start CS, SS, SP, DS, ES und läßt In-
+ sein sollten und somit keine Interrupts auftreten können.
+ EUMEL-0 lädt beim Start CS, SS, SP, DS, ES und läßt In­
terrupts zu (STI). Falls jedoch in dieser Zeit ein "Non Maskable
- Interrupt" auftreten kann, muß SHard SS und SP "vorläufig"
+ Interrupt" auftreten kann, muß SHard SS und SP "vorläufig"
laden.
- MODE: Über das MODE-Wort in der SHard-Leiste können Optionen
+ MODE: Über das MODE-Wort in der SHard-Leiste können Optionen
gesetzt werden:
- Bit 0 = 0 EUMEL-0 ist auf dem Hintergrund abge-
+ Bit 0 = 0 EUMEL-0 ist auf dem Hintergrund abge­
speichert. Der entsprechende Bereich bleibt
- geschützt. (Standard)
+ geschützt. (Standard)
- Bit 0 = 1 EUMEL-0 befindet sich nicht auf dem Hin-
+ Bit 0 = 1 EUMEL-0 befindet sich nicht auf dem Hin­
tergrund. Der entsprechende Bereich steht zur
- freien Verfügung für andere EUMEL-Daten.
+ freien Verfügung für andere EUMEL-Daten.
(Da die EUMEL-0-Software nur beim
Systemstart geladen wird (read only!), kann es
- bei Geräten mit kleinem Hintergrund inter-
- essant sein, diese Blöcke auf dem Hinter-
- grund anderweitig zu nutzen. Das Systemla-
+ bei Geräten mit kleinem Hintergrund inter­
+ essant sein, diese Blöcke auf dem Hinter­
+ grund anderweitig zu nutzen. Das Systemla­
den kann dann z.B. mit Hilfe einer speziellen
- Urladediskette vom Archivgerät aus erfolgen.)
+ Urladediskette vom Archivgerät aus erfolgen.)
- Bit 8 = 0 Beim Systemstart wird der Speicher überprüft.
+ Bit 8 = 0 Beim Systemstart wird der Speicher überprüft.
(Standard)
Bit 8 = 1 Der Speichertest beim Systemstart unterbleibt.
- Man sollte nur bei Rechnern, die beim Ein-
- schalten schon eigene Speichertests durch-
- führen, auf den Speichertest des EUMEL
+ Man sollte nur bei Rechnern, die beim Ein­
+ schalten schon eigene Speichertests durch­
+ führen, auf den Speichertest des EUMEL
verzichten.
Bit 9 = 0 Beim Systemstart wird die Vortest-Tapete
ausgegeben und man kann durch Eingabe
- eines Zeichens die Vortestmenüs aktivieren (s.
+ eines Zeichens die Vortestmenüs aktivieren (s.
Systemhandbuch). (Standard)
- Bit 9 = 1 Die Vortest-tapete wird unterdrückt. Es gibt
- auch keine Möglichkeit, die Vortestfunktionen
+ Bit 9 = 1 Die Vortest-tapete wird unterdrückt. Es gibt
+ auch keine Möglichkeit, die Vortestfunktionen
aufzurufen. Der Speichertest unterbleibt
ebenfalls.
@@ -698,12 +698,12 @@ erst danach die EUMEL-0-Maschine starten ('systemstart').
Parameter: -
Zweck: Hiermit wird SHard das Ende eines Systemlaufs mitgeteilt.
- Somit können evtl. notwendige Abschlußbehandlungen durch-
- geführt werden. SHard kann mit 'ret' zu EUMEL-0 zurück-
- kehren, muß aber nicht. Diese Routine kann z.B. dazu benutzt
+ Somit können evtl. notwendige Abschlußbehandlungen durch­
+ geführt werden. SHard kann mit 'ret' zu EUMEL-0 zurück­
+ kehren, muß aber nicht. Diese Routine kann z.B. dazu benutzt
werden, die Hardware auszuschalten oder in ein umgebendes
- System zurückzukehren (EUMEL als Subsystem). In den mei-
- sten Fällen wird die Routine leer implementiert werden, d.h.
+ System zurückzukehren (EUMEL als Subsystem). In den mei­
+ sten Fällen wird die Routine leer implementiert werden, d.h.
nur aus 'ret' bestehen.
@@ -714,14 +714,14 @@ erst danach die EUMEL-0-Maschine starten ('systemstart').
#b("Hauptspeicher")#
#goalpage("haupt")#
-Der Hauptspeicher umfaßt die Teile des 8086/8088-Speichers, die EUMEL-0 verwalten
-darf, nämlich die Bereiche M0, M1, M2 und M3 (siehe S.#topage("speicher")#). M1, M2 und M3 sind dabei nur
-bei speziellen Betriebsarten nötig. Jeder der vier Bereiche wird in der SHard-Leiste durch
-die Anfagsadresse MxSTART und seine Länge MxSIZE beschrieben:
+Der Hauptspeicher umfaßt die Teile des 8086/8088-Speichers, die EUMEL-0 verwalten
+darf, nämlich die Bereiche M0, M1, M2 und M3 (siehe S.#topage("speicher")#). M1, M2 und M3 sind dabei nur
+bei speziellen Betriebsarten nötig. Jeder der vier Bereiche wird in der SHard-Leiste durch
+die Anfagsadresse MxSTART und seine Länge MxSIZE beschrieben:
MxSTART Anfang des Bereichs als Paragraphenadresse (Byteadresse DIV
16)
- MxSIZE Größe des Bereichs in Paragraphen (Bytegröße DIV 16)
+ MxSIZE Größe des Bereichs in Paragraphen (Bytegröße DIV 16)
Nicht vorhandenen Bereiche werden durch MxSIZE = MxSTART = 0 gekennzeichnet.
@@ -732,22 +732,22 @@ Nicht vorhandenen Bereiche werden durch MxSIZE = MxSTART = 0 gekennzeichnet.
#b("Speicherfehler")#
#goalpage("memerr")#
-Falls die Hardware Speicherfehler aufgrund von Paritybits, ECC oder ähnlichem feststellen
-und an SHard melden kann, sollte das zur Erhöhung der Systemsicherheit genutzt werden.
+Falls die Hardware Speicherfehler aufgrund von Paritybits, ECC oder ähnlichem feststellen
+und an SHard melden kann, sollte das zur Erhöhung der Systemsicherheit genutzt werden.
-Wenn SHard (z.B. über Interrupt) einen Speicherfehler mitgeteilt bekommt, sollte er wenn
-möglich eine entsprechende Meldung ausgeben und das System brutal anhalten:
+Wenn SHard (z.B. über Interrupt) einen Speicherfehler mitgeteilt bekommt, sollte er wenn
+möglich eine entsprechende Meldung ausgeben und das System brutal anhalten:
- rien ne vas plus: jmp rien ne vas plus
+ rien ne vas plus: jmp rien ne vas plus
-Wenn Speicherfehler mit Sicherheit bemerkt werden, verhindert diese Reaktion, daß die
-Fehler auf dem Hintergrund festgeschrieben werden und evtl. später zu Systemfehlern füh-
+Wenn Speicherfehler mit Sicherheit bemerkt werden, verhindert diese Reaktion, daß die
+Fehler auf dem Hintergrund festgeschrieben werden und evtl. später zu Systemfehlern füh­
ren.
Der Anwender kann dann durch Hardware-Reset auf den letzten Fixpunkt des EUMEL-
-Systems zurücksetzen. So verliert er zwar evtl. die letzten Minuten seiner Arbeit, behält aber
-auf alle Fälle ein konsistentes System.
+Systems zurücksetzen. So verliert er zwar evtl. die letzten Minuten seiner Arbeit, behält aber
+auf alle Fälle ein konsistentes System.
@@ -755,56 +755,56 @@ auf alle Fälle ein konsistentes System.
#bb("4. ","Zeitgeber")#
#goalpage("zeit")#
-SHard muß einen Zeitgeberinterrupt erzeugen, der ca. 10 bis 100 mal pro Sekunde auftritt.
+SHard muß einen Zeitgeberinterrupt erzeugen, der ca. 10 bis 100 mal pro Sekunde auftritt.
Dabei ist die 0-Routine 'timerinterrupt' aufzurufen. Ohne diesen Interrupt wird die Uhr nicht
-geführt, und die Zeitscheibenlogik für das Timesharing fällt aus.
+geführt, und die Zeitscheibenlogik für das Timesharing fällt aus.
#dx("timerinterrupt")# (0-Routine)
Eingang: AL seit letztem Zeitgeberinterrupt vergangene Zeit (in ms)
- Zweck: Wird von EUMEL-0 für interne Uhren und für das Schedu-
+ Zweck: Wird von EUMEL-0 für interne Uhren und für das Schedu­
ling (Zeitscheibenlogik) verwendet. Es werden keine hohen
- Genauigkeitsanforderungen an die Zeitangaben bei #on("i")#einzel-
- nen#off("i")# Interrupts gestellt. Um EUMEL-0 eine genaue Real-
- zeituhr zu ermöglichen, sollte die so erzeugte Zeitangabe #on("i")#im
- Mittel#off("i")# aber möglichst genau sein, d.h. die Summe der in-
- nerhalb einer Minute so übergebenen Werte sollte zwischen
+ Genauigkeitsanforderungen an die Zeitangaben bei #on("i")#einzel­
+ nen#off("i")# Interrupts gestellt. Um EUMEL-0 eine genaue Real­
+ zeituhr zu ermöglichen, sollte die so erzeugte Zeitangabe #on("i")#im
+ Mittel#off("i")# aber möglichst genau sein, d.h. die Summe der in­
+ nerhalb einer Minute so übergebenen Werte sollte zwischen
59995 und 60005 liegen.
-#bb("5. ","Kanäle")#
+#bb("5. ","Kanäle")#
#goalpage("channel")#
Einiges zum Kanalkonzept:
-Das System kennt die Kanäle 0..32.
+Das System kennt die Kanäle 0..32.
Kanal 0 ist der Systemhintergrund.
- Die Kanäle 1..15 sind für Stream-IO (Terminals, Drucker, ...) vorgesehen.
+ Die Kanäle 1..15 sind für Stream-IO (Terminals, Drucker, ...) vorgesehen.
Kanal 31 ist der Standard-Archivkanal.
Kanal 32 ist der Parameterkanal.
-Die Kanäle 2.. 30 können installationsabhängig verfügbar sein oder auch nicht. Deren Funk-
+Die Kanäle 2.. 30 können installationsabhängig verfügbar sein oder auch nicht. Deren Funk­
tion ist dann Absprachesache zwischen Installation und SHard.
-Kanäle können über Block-IO (BLOCKOUT, BLOCKIN) oder Stream-IO (OUTPUT,..)
-angesprochen werden. Das System erfährt über IOCONTROL, welche Betriebsart des Kanals
+Kanäle können über Block-IO (BLOCKOUT, BLOCKIN) oder Stream-IO (OUTPUT,..)
+angesprochen werden. Das System erfährt über IOCONTROL, welche Betriebsart des Kanals
sinnvoll ist.
-#on("i")##on("b")#Achtung: Alle Kanaloperationen müssen grundsätzlich für alle Kanäle (0...32) aufgerufen
- werden können. Dabei können Operationen auf nicht vorhandenen Kanälen und
- unsinnige Operationen (z.B. Stream-IO auf Kanal 0) leer implementiert wer-
- den.#off("b")# (Dafür werden im folgenden bei jeder SHard-Routine Vorschläge gemacht.)#off("i")#
+#on("i")##on("b")#Achtung: Alle Kanaloperationen müssen grundsätzlich für alle Kanäle (0...32) aufgerufen
+ werden können. Dabei können Operationen auf nicht vorhandenen Kanälen und
+ unsinnige Operationen (z.B. Stream-IO auf Kanal 0) leer implementiert wer­
+ den.#off("b")# (Dafür werden im folgenden bei jeder SHard-Routine Vorschläge gemacht.)#off("i")#
#bb("5.1 ","Stream-IO")#
#goalpage("stream")#
-Über Stream-IO wickelt das System die übliche zeichenorientierte Ein-/Ausgabe auf Ter-
-minals, Druckern, Plottern usw. ab. Stream-IO wird nur für die Kanäle 1...15 gemacht.
+Über Stream-IO wickelt das System die übliche zeichenorientierte Ein-/Ausgabe auf Ter­
+minals, Druckern, Plottern usw. ab. Stream-IO wird nur für die Kanäle 1...15 gemacht.
#dx("inputinterrupt")# (0-Routine)#goalpage("inp")#
@@ -818,20 +818,20 @@ minals, Druckern, Plottern usw. ab. Stream-IO wird nur für die Kanäle 1...15 gem
Bit 1 = 1 Es wurde ein BREAK erkannt (bei
V24). Dieses Ereignis kann nicht
durch ein Sonderzeichen gemeldet
- werden, da bei einer 8-bit-Über-
+ werden, da bei einer 8-bit-Über­
tragung schon alle Zeichen vergeben
- sind. Daher wird BREAK hier aufge-
+ sind. Daher wird BREAK hier aufge­
nommen, obwohl es im eigentlichen
- Sinne kein Fehler sein muß.
- Bit 2 = 1 Das übergebene Zeichen ist verfälscht
- (z.B. Parität falsch).
+ Sinne kein Fehler sein muß.
+ Bit 2 = 1 Das übergebene Zeichen ist verfälscht
+ (z.B. Parität falsch).
Ausgang: AL Zahl der noch freien Bytes im Eingabepuffer von
- EUMEL-0. Die Angabe gilt für den Puffer dieses
- Kanals nach Eintrag des übergebenen Zeichens.
+ EUMEL-0. Die Angabe gilt für den Puffer dieses
+ Kanals nach Eintrag des übergebenen Zeichens.
- Zweck: SHard muß EUMEL-0 durch Aufruf dieser Routine mitteilen,
- daß eine Eingabe vorliegt.
+ Zweck: SHard muß EUMEL-0 durch Aufruf dieser Routine mitteilen,
+ daß eine Eingabe vorliegt.
Hinweise: EUMEL-0 puffert die Zeichen. Falls 0 geliefert wird, ist der
Puffer voll und EUMEL-0 ignoriert weitere Eingaben, bis
@@ -841,17 +841,17 @@ minals, Druckern, Plottern usw. ab. Stream-IO wird nur für die Kanäle 1...15 gem
Bei Kanalnummern <1 oder >15 wird der Aufruf von
EUMEL-0 ignoriert.
- Falls die Hardware keine Inputinterrupts zur Verfügung stellt,
- sollte ein Timer benutzt werden, um alle möglichen Input-
- quellen regelmäßig abzufragen. Dabei muß man allerdings den
- goldenen Mittelweg zwischen zu häufiger (Systemdurchsatz
- sinkt) und zu seltener Abfrage (Zeichen gehen verloren) such-
- en. Man sollte dabei nicht nur an die menschliche Tippge-
- schwindigkeit sondern auch an die höchste Baudrate denken,
- die man für Rechnerkopplungen noch unterstützen will. *)
-
- Falls SHard Flußkontrolle für den Kanal
- ausüben soll, muß er die Rückmeldung in AL
+ Falls die Hardware keine Inputinterrupts zur Verfügung stellt,
+ sollte ein Timer benutzt werden, um alle möglichen Input­
+ quellen regelmäßig abzufragen. Dabei muß man allerdings den
+ goldenen Mittelweg zwischen zu häufiger (Systemdurchsatz
+ sinkt) und zu seltener Abfrage (Zeichen gehen verloren) such­
+ en. Man sollte dabei nicht nur an die menschliche Tippge­
+ schwindigkeit sondern auch an die höchste Baudrate denken,
+ die man für Rechnerkopplungen noch unterstützen will. *)
+
+ Falls SHard Flußkontrolle für den Kanal
+ ausüben soll, muß er die Rückmeldung in AL
auswerten. Dabei ist mit einem geeigneten
Schwellwert zu arbeiten, da in der Regel die
sendende Gegenstelle einer Sendeunterbrechung
@@ -859,15 +859,15 @@ minals, Druckern, Plottern usw. ab. Stream-IO wird nur für die Kanäle 1...15 gem
#foot#
#f#
-*) Eine weitere Möglichkeit, auf manchen Kanälen ohne Interrupts auszukommen, wird bei der IOCONTROL-Funktion
+*) Eine weitere Möglichkeit, auf manchen Kanälen ohne Interrupts auszukommen, wird bei der IOCONTROL-Funktion
"weiter" beschrieben (siehe S.#topage("weiter")#).#a##end#
Achtung: #on("i")#Keinesfalls darf 'inputinterrupt' rekursiv aufgerufen werden.
Normalerweise wird das automatisch verhindert, wenn man den
- zugehörigen Hardwareinterrupt erst nach der 0-Routine
- wieder freigibt. Falls das nicht möglich ist und unter bestimm-
- ten Umständen das nächste Zeichen abgeholt werden muß,
- bevor die 0-Routine beendet ist, muß SHard einen eigenen
+ zugehörigen Hardwareinterrupt erst nach der 0-Routine
+ wieder freigibt. Falls das nicht möglich ist und unter bestimm­
+ ten Umständen das nächste Zeichen abgeholt werden muß,
+ bevor die 0-Routine beendet ist, muß SHard einen eigenen
Puffer implementieren:#off("i")#
hardwareinterrupt:
@@ -878,7 +878,7 @@ minals, Druckern, Plottern usw. ab. Stream-IO wird nur für die Kanäle 1...15 gem
gib hardware interrupt frei ;
input interrupt ;
disable interrupt ;
- WHILE shard puffer enthält noch
+ WHILE shard puffer enthält noch
zeichen REP
nimm zeichen aus shard puffer ;
enable interrupt ;
@@ -896,49 +896,49 @@ minals, Druckern, Plottern usw. ab. Stream-IO wird nur für die Kanäle 1...15 gem
Eingang: AL Kanalnummer (1...15)
CX Anzahl auszugebender Zeichen
DS:BX Adresse der Zeichenkette
- Ausgang: CX Anzahl der übernommenen Zeichen
- C-Flag gesetzt <=> alle Zeichen übernommen
-
- Zweck: Ausgabe einer Zeichenkette. Diese ist (möglichst ganz) zwi-
- schenzupuffern, denn die Ausführung von OUTPUT sollte kein
- Warten auf IO enthalten. Der Ausgabepuffer muß mindestens
- 50, besser 100 Zeichen fassen können. Durch eine Interrupt-
- logik oder etwas Äquivalentes ist sicherzustellen, daß dieser
+ Ausgang: CX Anzahl der übernommenen Zeichen
+ C-Flag gesetzt <=> alle Zeichen übernommen
+
+ Zweck: Ausgabe einer Zeichenkette. Diese ist (möglichst ganz) zwi­
+ schenzupuffern, denn die Ausführung von OUTPUT sollte kein
+ Warten auf IO enthalten. Der Ausgabepuffer muß mindestens
+ 50, besser 100 Zeichen fassen können. Durch eine Interrupt­
+ logik oder etwas Äquivalentes ist sicherzustellen, daß dieser
Puffer parallel zur normalen Verarbeitung ausgegeben wird.
- Wenn die auszugebende Zeichenkette nicht vollständig in den
- Puffer paßt, sollten trotzdem so viele Zeichen wie möglich
- übernommen werden. Im weiteren Verlauf ruft EUMEL-0 dann
+ Wenn die auszugebende Zeichenkette nicht vollständig in den
+ Puffer paßt, sollten trotzdem so viele Zeichen wie möglich
+ übernommen werden. Im weiteren Verlauf ruft EUMEL-0 dann
wieder OUTPUT mit dem Rest der Zeichenkette auf.
Hinweis: OUTPUT kann mit CX=0 aufgerufen werden. Auch diese leere
- Operation muß mit gesetztem C-Flag quittiert werden.
+ Operation muß mit gesetztem C-Flag quittiert werden.
Achtung: #on("i")#Keinesfalls darf innerhalb von OUTPUT die 0-Routine 'warte'
aufgerufen werden.#off("i")#
Vorschlag: Falls der Kanal nicht existiert bzw. OUTPUT darauf unsinnig
- ist, sollte vorgegaukelt werden, alle Zeichen seien ausgege-
- ben (CX unverändert und C-Flag gesetzt).
+ ist, sollte vorgegaukelt werden, alle Zeichen seien ausgege­
+ ben (CX unverändert und C-Flag gesetzt).
#b("Terminals")#
#goalpage("term")#
-"Normale" #ib#Terminal#ie(1,", normales")#s können ohne weitere Unterstützung des SHards angeschlossen wer-
+"Normale" #ib#Terminal#ie(1,", normales")#s können ohne weitere Unterstützung des SHards angeschlossen wer­
den. Die zur Anpassung an den EUMEL-Zeichensatz *) notwendigen #ib#Umcodierungen#ie#
-werden von den höheren Ebenen aus eingestellt. Da diese Umsetztabellen vom SHard
-unabhängig sind, stehen automatisch alle so angepaßten Terminaltypen allen EUMEL-
-Anwendern zur Verfügung!
+werden von den höheren Ebenen aus eingestellt. Da diese Umsetztabellen vom SHard
+unabhängig sind, stehen automatisch alle so angepaßten Terminaltypen allen EUMEL-
+Anwendern zur Verfügung!
#foot#
#f#
*) Siehe "EUMEL Benutzerhandbuch, Teil 3: Editor, 5. Zeichencode"#a##end#
-Für den Anschluß eines #on("b")##on("i")#integrierten #ib#Terminal#ie(1,", integriertes")#s#off("i")##off("b")#, in dessen Bildwiederholspeicher direkt gear-
-beitet wird, kann man häufig den Terminaltyp 'psi' verwenden (siehe auch "Exoten").
+Für den Anschluß eines #on("b")##on("i")#integrierten #ib#Terminal#ie(1,", integriertes")#s#off("i")##off("b")#, in dessen Bildwiederholspeicher direkt gear­
+beitet wird, kann man häufig den Terminaltyp 'psi' verwenden (siehe auch "Exoten").
-Näheres zu Terminaltypen und -anschlüssen findet man im "EUMEL Systemhandbuch" unter
-den Stichwörtern #on("i")#Konfiguration#off("i")# und #on("i")#Konfigurierung#off("i")#.
+Näheres zu Terminaltypen und -anschlüssen findet man im "EUMEL Systemhandbuch" unter
+den Stichwörtern #on("i")#Konfiguration#off("i")# und #on("i")#Konfigurierung#off("i")#.
@@ -946,19 +946,19 @@ den Stichwörtern #on("i")#Konfiguration#off("i")# und #on("i")#Konfigurierung#of
#goalpage("druck")#
#ib#Drucker#ie# und Plotter werden vom EUMEL-System wie Terminals angesehen. Da in der Regel
-der Rechner aber schneller Zeichen senden als der Drucker drucken kann, müssen solche
-Geräte in der Regel mit Flußkontrolle angeschlossen werden (siehe S.#topage("fluss")#).
+der Rechner aber schneller Zeichen senden als der Drucker drucken kann, müssen solche
+Geräte in der Regel mit Flußkontrolle angeschlossen werden (siehe S.#topage("fluss")#).
-Wenn Drucker oder Plotter über eine Parallelschnittstelle angeschlossen werden, kann man
-auf diesem Kanal möglicherweise auf einen Ausgabepuffer verzichten. Voraussetzung ist
-dabei, daß
+Wenn Drucker oder Plotter über eine Parallelschnittstelle angeschlossen werden, kann man
+auf diesem Kanal möglicherweise auf einen Ausgabepuffer verzichten. Voraussetzung ist
+dabei, daß
a) der Drucker einen eigenen Puffer hat und
- b) der Puffer "schnell" gefüllt werden kann (< 0.1 ms/Zeichen).
+ b) der Puffer "schnell" gefüllt werden kann (< 0.1 ms/Zeichen).
Dann kann man auf den bei der SHard-Routine OUTPUT geforderten Puffer verzichten und
-die Zeichenkette direkt über die Parallelschnittstelle an den Drucker übergeben. Wenn der
-Drucker 'Puffer voll' signalisiert, sollte die Zeichenübernahme bei OUTPUT abgebrochen
+die Zeichenkette direkt über die Parallelschnittstelle an den Drucker übergeben. Wenn der
+Drucker 'Puffer voll' signalisiert, sollte die Zeichenübernahme bei OUTPUT abgebrochen
werden. *) #on("i")#Auf keinen Fall darf CPU-intensiv auf Freiwerden des Puffers gewartet werden!#off("i")#
#foot#
#f#
@@ -969,23 +969,23 @@ werden. *) #on("i")#Auf keinen Fall darf CPU-intensiv auf Freiwerden des Puffers
#b("Exoten")#
#goalpage("exot")#
-Exotische #ib#Terminal#ie(1," exotisches")#s (im Sinne dieser Beschreibung) sind solche, für die eine Umsetztabelle
-im System (siehe Konfiguratorbeschreibung) nicht ausreicht bzw. nicht nötig ist (Beispiele:
-Terminals, in deren Bildwiederholspeicher direkt gearbeitet wird; Terminals, die soweit pro-
-grammierbar sind, daß sie den EUMEL-Zeichencode können).
+Exotische #ib#Terminal#ie(1," exotisches")#s (im Sinne dieser Beschreibung) sind solche, für die eine Umsetztabelle
+im System (siehe Konfiguratorbeschreibung) nicht ausreicht bzw. nicht nötig ist (Beispiele:
+Terminals, in deren Bildwiederholspeicher direkt gearbeitet wird; Terminals, die soweit pro­
+grammierbar sind, daß sie den EUMEL-Zeichencode können).
-Für solche Terminals muß in der Konfiguration der Terminaltyp '#ib#psi#ie#' eingestellt werden.
+Für solche Terminals muß in der Konfiguration der Terminaltyp '#ib#psi#ie#' eingestellt werden.
Dieser wirkt ohne Umcodierungen, d.h. die EUMEL-Codes (siehe Benutzerhandbuch 1.7
Seite 106) werden direkt dem SHard zugestellt (wie bei 'transparent'), jedoch mit folgenden
Besonderheiten:
-Eingabeseitig werden zusätzlich folgende Codezuordnungen getroffen:
+Eingabeseitig werden zusätzlich folgende Codezuordnungen getroffen:
Code Funktion
7 SV (Aktivierung: 'gib supervisor kommando:')
17 STOP (Ausgabe auf diesen Kanal wird gestoppt)
- 23 WEITER (Ausgabe läuft wieder weiter)
+ 23 WEITER (Ausgabe läuft wieder weiter)
4 INFO (System geht in Debugger, falls Debugoption)
@@ -993,27 +993,27 @@ Eingabeseitig werden zusätzlich folgende Codezuordnungen getroffen:
#bb("5.2 ","Block-IO")#
#goalpage("block")#
-Über Block-IO wickelt das System die Zugriffe zum Pagingmedium und zum Archiv ab.
-Ferner ist daran gedacht, auch auf V.24-Schnittstellen Block-IO z.B. für Rechnerkopp-
-lung zuzulassen. Die Kanalnummer in Reg. AL unterscheidet diese Fälle. Außer beim Paging
+Ãœber Block-IO wickelt das System die Zugriffe zum Pagingmedium und zum Archiv ab.
+Ferner ist daran gedacht, auch auf V.24-Schnittstellen Block-IO z.B. für Rechnerkopp­
+lung zuzulassen. Die Kanalnummer in Reg. AL unterscheidet diese Fälle. Außer beim Paging
(AL=0) wird ein Block-IO durch die ELAN-Prozeduren 'blockin' und blockout' induziert.
-Bei Block-IO wird immer ein 512 Byte großer Hauptspeicherbereich mit übergeben. Dieser
-kann (im Gegensatz zu OUTPUT) direkt benutzt werden, d.h. es muß keine Umpufferung
+Bei Block-IO wird immer ein 512 Byte großer Hauptspeicherbereich mit übergeben. Dieser
+kann (im Gegensatz zu OUTPUT) direkt benutzt werden, d.h. es muß keine Umpufferung
erfolgen.
-Dieser Hauptspeicherbereich darf nur bei BLOCKIN verändert werden.
+Dieser Hauptspeicherbereich darf nur bei BLOCKIN verändert werden.
-SHard darf (anders als bei OUTPUT) erst dann zur Aufrufstelle zurückgeben, wenn die ver-
-langte Operation abgeschlossen ist. Treten während der Operation Wartezeiten auf, so muß
+SHard darf (anders als bei OUTPUT) erst dann zur Aufrufstelle zurückgeben, wenn die ver­
+langte Operation abgeschlossen ist. Treten während der Operation Wartezeiten auf, so muß
SHard die 0-Routine 'warte' aufrufen, damit das System andere Prozesse weiterlaufen
lassen kann.
-EUMEL-0 definiert bestimmte Funktionen für Hintergrund (Kanal 0) und Archiv (Kanal 31).
-Operationen auf anderen Kanälen kann SHard nach Belieben implementieren und deren
-Leistung seinen Installationen über ELAN-Pakete zur Verfügung stellen. Das System vergibt
-auch in Zukunft für den Parameter in Register CX nur positive Werte (Bit 7 von CH = 0).
-Der SHard kann selbst negative Codes einführen.
+EUMEL-0 definiert bestimmte Funktionen für Hintergrund (Kanal 0) und Archiv (Kanal 31).
+Operationen auf anderen Kanälen kann SHard nach Belieben implementieren und deren
+Leistung seinen Installationen über ELAN-Pakete zur Verfügung stellen. Das System vergibt
+auch in Zukunft für den Parameter in Register CX nur positive Werte (Bit 7 von CH = 0).
+Der SHard kann selbst negative Codes einführen.
#d("BLOCKIN")#
@@ -1022,18 +1022,18 @@ Der SHard kann selbst negative Codes einführen.
CX Parameter 1
DX Parameter 2
DS:BX Adresse des Hauptspeicherbereichs
- Ausgang: AL undefiniert (darf also verändert werden)
- CX Rückmeldecode
- DS:BX darf verändert werden
+ Ausgang: AL undefiniert (darf also verändert werden)
+ CX Rückmeldecode
+ DS:BX darf verändert werden
Der Inhalt des Hauptspeicherbereichs (<DS:BX>... <DS:
- BX> +511) darf verändert sein.
+ BX> +511) darf verändert sein.
- Zweck: "Einlesen" von Blöcken. Die genaue Wirkung hängt vom
+ Zweck: "Einlesen" von Blöcken. Die genaue Wirkung hängt vom
Parameter und dem Kanal ab.
Vorschlag: Falls der Kanal nicht existiert bzw. BLOCKIN darauf unsinnig
- ist, sollte die Rückmeldung -1 in CX geliefert werden.
+ ist, sollte die Rückmeldung -1 in CX geliefert werden.
#d("BLOCKOUT")#
@@ -1042,18 +1042,18 @@ Der SHard kann selbst negative Codes einführen.
CX Parameter 1
DX Parameter 2
DS:BX Adresse des Hauptspeicherbereichs
- Ausgang: AL undefiniert (darf also verändert werden)
- CX Rückmeldecode
- DS:BX darf verändert werden
+ Ausgang: AL undefiniert (darf also verändert werden)
+ CX Rückmeldecode
+ DS:BX darf verändert werden
- Der Inhalt des Hauptspeicherbereichs darf #on("i")#nicht#off("i")# verändert
+ Der Inhalt des Hauptspeicherbereichs darf #on("i")#nicht#off("i")# verändert
werden!
- Zweck: "Ausgeben" von Blöcken. Die genaue Wirkung hängt vom
+ Zweck: "Ausgeben" von Blöcken. Die genaue Wirkung hängt vom
Parameter und dem Kanal ab.
- Vorschlag: Falls der Kanal nicht existiert bzw. BLOCKOUT darauf un-
- sinnig ist, sollte die Rückmeldung -1 in CX geliefert wer-
+ Vorschlag: Falls der Kanal nicht existiert bzw. BLOCKOUT darauf un­
+ sinnig ist, sollte die Rückmeldung -1 in CX geliefert wer­
den.
@@ -1061,18 +1061,18 @@ Der SHard kann selbst negative Codes einführen.
Ausgang: Alle Register undefiniert!
- Zweck: Diese Routine ist bei 'blockin' oder 'blockout' dann aufzu-
+ Zweck: Diese Routine ist bei 'blockin' oder 'blockout' dann aufzu­
rufen, wenn SHard im Augenblick nichts zu tun hat. Durch den
- Aufruf von 'warte' erhalten andere Systemteile die Möglichkeit,
+ Aufruf von 'warte' erhalten andere Systemteile die Möglichkeit,
weiter zu arbeiten. Ein 'warte' kann bis zu ca. 1/4 Sekunde
Zeit aufnehmen. 'warte' darf nicht in Interruptroutinen und
- Stream-IO verwendet werden! 'warte' zerstört alle Register,
- bis auf die Segmentregister CS und SS! SHard muß davon
- ausgehen, daß 'warte' seinerseits andere SHard-Kompo-
+ Stream-IO verwendet werden! 'warte' zerstört alle Register,
+ bis auf die Segmentregister CS und SS! SHard muß davon
+ ausgehen, daß 'warte' seinerseits andere SHard-Kompo­
nenten aufruft.
-Die Verwendung der 0-Routine 'warte' soll hier an einigen Beispielen verdeutlicht wer-
+Die Verwendung der 0-Routine 'warte' soll hier an einigen Beispielen verdeutlicht wer­
den:
@@ -1143,54 +1143,54 @@ Eingangsparametern versorgt:
Der Hauptspeicherbereich (<DS:BX>... <DS:BX>+511) ist
auf den angegebenen Block zu schreiben.
-Als Rückmeldungen sind zu liefern:#goalpage("errcod")#
+Als Rückmeldungen sind zu liefern:#goalpage("errcod")#
- 0 Operation korrekt ausgeführt.
- 1 Manuell behebbarer Fehler (z.B. Laufwerktür offen)
+ 0 Operation korrekt ausgeführt.
+ 1 Manuell behebbarer Fehler (z.B. Laufwerktür offen)
2 Permanenter Fehler (z.B. Daten nicht lesbar)
3 Versorgungsfehler (zu hohe Blocknummer)
-Zusätzlich zu der Rückmeldung muß bei CX <> 0 in DS:BX die Adresse eines Fehlerstrings
-(Längenbyte + Fehlertext) geliefert werden. *)
+Zusätzlich zu der Rückmeldung muß bei CX <> 0 in DS:BX die Adresse eines Fehlerstrings
+(Längenbyte + Fehlertext) geliefert werden. *)
#foot#
#f#
-*) Diese Zusatzrückmeldung ist nur für die BLOCKIN/OUT Aufrufe auf Kanal 0/31 von Bedeutung. Sie wird nur von
+*) Diese Zusatzrückmeldung ist nur für die BLOCKIN/OUT Aufrufe auf Kanal 0/31 von Bedeutung. Sie wird nur von
EUMEL-0 beim Paging und im Hardwaretest ausgewertet.#a##end#
-#dx("Fehlerwiederholungen")#: Das EUMEL-System führt von sich aus Fehlerwiederholungen
+#dx("Fehlerwiederholungen")#: Das EUMEL-System führt von sich aus Fehlerwiederholungen
beim Hintergrund- und beim Archivzugriff durch. SHard sollte
deshalb im Fehlerfall die Operation nicht selbst wiederholen,
- sondern einen Lese/ Schreibfehler zurückmelden. So werden
+ sondern einen Lese/ Schreibfehler zurückmelden. So werden
dem EUMEL-System auch Soft-Errors gemeldet. In manchen
- Fällen soll vor einem erneuten Lese- oder Schreibversuch der
- Arm auf Spur 0 positioniert werden o.ä. Um das zu erreichen,
- sollte SHard diese "Reparaturaktion" direkt im Anschluß an den
- fehlerhaften Versuch durchführen.
+ Fällen soll vor einem erneuten Lese- oder Schreibversuch der
+ Arm auf Spur 0 positioniert werden o.ä. Um das zu erreichen,
+ sollte SHard diese "Reparaturaktion" direkt im Anschluß an den
+ fehlerhaften Versuch durchführen.
-#dx("Kontrollesen")#: Falls Kontrollesen (nach jedem Schreibzugriff) notwendig ist, muß
- das allerdings vom SHard durchgeführt werden. In der Regel
- reicht es dazu, den geschriebenen Block "ohne Datentrans-
- port" zu lesen, so daß nur CRC überprüft wird.
+#dx("Kontrollesen")#: Falls Kontrollesen (nach jedem Schreibzugriff) notwendig ist, muß
+ das allerdings vom SHard durchgeführt werden. In der Regel
+ reicht es dazu, den geschriebenen Block "ohne Datentrans­
+ port" zu lesen, so daß nur CRC überprüft wird.
-Will SHard weitere Archivlaufwerke zur Verfügung stellen, so kann er dafür Kanalnummern
+Will SHard weitere Archivlaufwerke zur Verfügung stellen, so kann er dafür Kanalnummern
(30,29..) vergeben. Auf ELAN-Ebene kann die archivierende Task durch 'continue (x)' das
Laufwerk 'x' ansteuern.
Hinweis: Das System versucht Hintergrund und Archiv parallel zu betreiben, d.h. wenn
- SHard bei der Hintergrundbehandlung das UP 'warte' aufruft, kann 'warte' sei-
+ SHard bei der Hintergrundbehandlung das UP 'warte' aufruft, kann 'warte' sei­
nerseits die Archivbehandlung des SHards aufrufen. Wenn beides z.B. denselben
- Floppykontroller benutzt, muß SHard sicherstellen, daß das gut geht (z.B. durch
+ Floppykontroller benutzt, muß SHard sicherstellen, daß das gut geht (z.B. durch
Semaphoren).
Sollen auch #on("b")#Disketten nach #ib#DIN 66 239#ie##off("b")# auf dem Archivkanal gelesen und geschrieben
-werden können, müssen auf Kanal 31 zusätzlich Blöcke mit 'deleted data mark' gelesen und
-geschrieben werden können. Dafür kann BLOCKIN (beim Lesen einer Diskette) als weitere
-Rückmeldung liefern:
+werden können, müssen auf Kanal 31 zusätzlich Blöcke mit 'deleted data mark' gelesen und
+geschrieben werden können. Dafür kann BLOCKIN (beim Lesen einer Diskette) als weitere
+Rückmeldung liefern:
4 'Deleted data mark' gelesen.
-Ausgabeseitig wird ein entsprechendes BLOCKOUT benötigt:
+Ausgabeseitig wird ein entsprechendes BLOCKOUT benötigt:
#on("b")#BLOCKOUT#off("b")# AL 31
CH 40h
@@ -1202,19 +1202,19 @@ Ausgabeseitig wird ein entsprechendes BLOCKOUT benötigt:
mit der Kennung 'deleted data mark' auf den angegebenen
Block zu schreiben.
-Anmerkung: Diese Funktion muß nur implementiert werden, wenn Disketten nach DIN 66 239
- beschrieben können werden sollen.
+Anmerkung: Diese Funktion muß nur implementiert werden, wenn Disketten nach DIN 66 239
+ beschrieben können werden sollen.
#b("Block-IO zur MS-DOS-Partition")#
#goalpage("bmsdosp")#
-Auf EUMEL-Rechnern, die mit einer Festplatte ausgerüstet sind, kann man einen Teil der
-Platte als MS-DOS-Partition und einen anderen als EUMEL-Partition reservieren. Für den
-Datenaustausch auf Dateiebene existiert EUMEL-Software, die über den Kanal 29 auf die
-MS-DOS-Partition zugreift. Falls SHard dieses unterstützen will, muß er entsprechende
-BLOCKIN/OUT-Operationen zur Verfügung stellen. Diese entsprechen den Operationen auf
+Auf EUMEL-Rechnern, die mit einer Festplatte ausgerüstet sind, kann man einen Teil der
+Platte als MS-DOS-Partition und einen anderen als EUMEL-Partition reservieren. Für den
+Datenaustausch auf Dateiebene existiert EUMEL-Software, die über den Kanal 29 auf die
+MS-DOS-Partition zugreift. Falls SHard dieses unterstützen will, muß er entsprechende
+BLOCKIN/OUT-Operationen zur Verfügung stellen. Diese entsprechen den Operationen auf
Kanal 0:
#on("b")#BLOCKIN#off("b")# AL 29
@@ -1225,9 +1225,9 @@ Kanal 0:
Der angegebene 512-Byte-Block ist in den Hauptspeicher
ab <DS:BX> einzulesen. Hier bezieht sich die Blocknummer
- auf die MS-DOS-Partition. Dabei muß Block 0 derjenige
- sein, der den Urladesektor der MS-DOS-Partition enthält.
- (Hier steht der Bios-Parameterblock.) Die weiteren Blöcke
+ auf die MS-DOS-Partition. Dabei muß Block 0 derjenige
+ sein, der den Urladesektor der MS-DOS-Partition enthält.
+ (Hier steht der Bios-Parameterblock.) Die weiteren Blöcke
werden genauso wie in der von MS-DOS verwendeten
Numerierung relativ zu diesem Urladesektor adressiert.
@@ -1238,32 +1238,32 @@ Kanal 0:
DS:BX Hauptspeicheradresse
Der Hauptspeicherbereich (<DS:BX>... <DS:BX>+511) ist
- auf den angegebenen Block zu schreiben. Für die Blocknu-
+ auf den angegebenen Block zu schreiben. Für die Blocknu­
merierung gilt das oben beschreibenen.
-Als Rückmeldungen sind zu liefern:
+Als Rückmeldungen sind zu liefern:
- 0 Operation korrekt ausgeführt.
- 1 Manuell behebbarer Fehler (z.B. Laufwerktür offen)
+ 0 Operation korrekt ausgeführt.
+ 1 Manuell behebbarer Fehler (z.B. Laufwerktür offen)
2 Permanenter Fehler (z.B. Daten nicht lesbar)
3 Versorgungsfehler (zu hohe Blocknummer)
- Wichtig: Wird ein Block angesprochen, der nicht zur MS-DOS-Parti-
- tion gehört, so muß 'Versorgungsfehler' (3) gemeldet werden.
+ Wichtig: Wird ein Block angesprochen, der nicht zur MS-DOS-Parti­
+ tion gehört, so muß 'Versorgungsfehler' (3) gemeldet werden.
-Anmerkung: Diese Funktionen müssen nur implementiert werden, wenn Datenaustausch
- mit MS-DOS-Partitionen auf Plattenmaschinen unterstützt werden soll.
+Anmerkung: Diese Funktionen müssen nur implementiert werden, wenn Datenaustausch
+ mit MS-DOS-Partitionen auf Plattenmaschinen unterstützt werden soll.
#bb("5.3 ","IO-Steuerung")#
#goalpage("iocontrol")#
-Die IO-Steuerung erlaubt Steuerung und Zustandsabfragen der Kanäle. IO-Steuerung wird
-(außer bei Kanal 0) auch durch 'control' in ELAN induziert.
+Die IO-Steuerung erlaubt Steuerung und Zustandsabfragen der Kanäle. IO-Steuerung wird
+(außer bei Kanal 0) auch durch 'control' in ELAN induziert.
Der Funktionscode in CX unterliegt denselben Konventionen wie bei Block-IO, d.h. das
-System verwendet nur positive Codes. Der SHard-Schreiber kann auch negative Codes für
+System verwendet nur positive Codes. Der SHard-Schreiber kann auch negative Codes für
Sonderzwecke vorsehen.
@@ -1273,14 +1273,14 @@ Sonderzwecke vorsehen.
CX Funktionscode 1
DX Funktionscode 2
BX Funktionscode 3
- Ausgang: CX Rückmeldung
- AL darf verändert werden, in einigen Fällen zusätzliche
- Rückmeldung
- C-Flag (in einigen Fällen zusätzliche Meldung)
+ Ausgang: CX Rückmeldung
+ AL darf verändert werden, in einigen Fällen zusätzliche
+ Rückmeldung
+ C-Flag (in einigen Fällen zusätzliche Meldung)
- Zweck: abhängig von 'Funktionscode 1' (s.u.)
+ Zweck: abhängig von 'Funktionscode 1' (s.u.)
-Das System verlangt folgende Informations- und Steuerleistungen über IOCONTROL:
+Das System verlangt folgende Informations- und Steuerleistungen über IOCONTROL:
#d("IOCONTROL ""typ""")#
@@ -1288,19 +1288,19 @@ Das System verlangt folgende Informations- und Steuerleistungen über IOCONTROL:
CX 1
Ausgang: CX Kanaltyp
- Zweck: Informiert EUMEL-0, welche IO für den angegebenen Kanal
- sinnvoll ist. Die Rückmeldung in CX wird bitweise interpre-
+ Zweck: Informiert EUMEL-0, welche IO für den angegebenen Kanal
+ sinnvoll ist. Die Rückmeldung in CX wird bitweise interpre­
tiert:
Bit 0 gesetzt <=> 'inputinterrupt' kann kommen.
Bit 1 gesetzt <=> OUTPUT ist sinnvoll.
Bit 2 gesetzt <=> BLOCKIN ist sinnvoll.
Bit 3 gesetzt <=> BLOCKOUT ist sinnvol.
- Bit 4 gesetzt <=> IOCONTROL "format" ist sinn-
+ Bit 4 gesetzt <=> IOCONTROL "format" ist sinn­
voll.
- Hinweis: #on("i")#Trotz dieser Informationsmöglichkeit wird nicht garantiert, daß
- nur sinnvolle Operationen für den Kanal aufgerufen werden.#off("i")#
+ Hinweis: #on("i")#Trotz dieser Informationsmöglichkeit wird nicht garantiert, daß
+ nur sinnvolle Operationen für den Kanal aufgerufen werden.#off("i")#
#d("IOCONTROL ""frout""")#
@@ -1308,31 +1308,31 @@ Das System verlangt folgende Informations- und Steuerleistungen über IOCONTROL:
Eingang: AL Kanalnummer (1...15)
CX 2
- Ausgang: CX Anzahl Zeichen, die nächster OUTPUT übernimmt
+ Ausgang: CX Anzahl Zeichen, die nächster OUTPUT übernimmt
C-Flag gesetzt <=> Puffer leer
- Zweck: Liefert Information über die Belegung des Puffers. Diese
+ Zweck: Liefert Information über die Belegung des Puffers. Diese
Information wird von EUMEL-0 zum Scheduling benutzt.
- Achtung: #on("i")#Wenn EUMEL-0 längere Zeit kein OUTPUT gemacht hat,
- muß irgendwann CX > 49 gemeldet werden.#off("i")#
+ Achtung: #on("i")#Wenn EUMEL-0 längere Zeit kein OUTPUT gemacht hat,
+ muß irgendwann CX > 49 gemeldet werden.#off("i")#
- Hinweis: Unter Berücksichtigung des oben Gesagten darf "gelogen"
- werden. Man kann z.B. immer 50 in CX zurückmelden, muß
+ Hinweis: Unter Berücksichtigung des oben Gesagten darf "gelogen"
+ werden. Man kann z.B. immer 50 in CX zurückmelden, muß
dann aber schlechtere Nutzung der CPU bei Multi-User-
Systemen in Kauf nehmen.
Falls auf dem angegebenen Kanal ein Drucker mit eigenem
- Puffer über Parallelschnittstelle angeschlossen ist (siehe S.#topage("druck")#
+ Puffer über Parallelschnittstelle angeschlossen ist (siehe S.#topage("druck")#
) und man auf einen SHard-internen Puffer verzichtet hat,
- sollte bei 'Druckerpuffer voll' 0 in CX und 'NC' zurückge-
- meldet werden. Wenn aber Zeichen übernommen werden
- können, sollte 50 in CX und 'C-Flag gesetzt' gemeldet wer-
+ sollte bei 'Druckerpuffer voll' 0 in CX und 'NC' zurückge­
+ meldet werden. Wenn aber Zeichen übernommen werden
+ können, sollte 50 in CX und 'C-Flag gesetzt' gemeldet wer­
den.
- Vorschlag: Falls der Kanal nicht existiert oder nicht für Stream-IO zur
- Verfügung steht, sollten 200 in CX und C-Flag gesetzt zu-
- rückgemeldet werden.
+ Vorschlag: Falls der Kanal nicht existiert oder nicht für Stream-IO zur
+ Verfügung steht, sollten 200 in CX und C-Flag gesetzt zu­
+ rückgemeldet werden.
#d("IOCONTROL ""weiter""")#
@@ -1342,20 +1342,20 @@ Das System verlangt folgende Informations- und Steuerleistungen über IOCONTROL:
CX 4
Ausgang: -
- Zweck: Das System ruft "weiter" für den in AL angegebenen Kanal
+ Zweck: Das System ruft "weiter" für den in AL angegebenen Kanal
auf, wenn es wieder Eingabezeichen puffern kann. (siehe
- auch: Flußkontrolle S.#topage("fluss")#)
+ auch: Flußkontrolle S.#topage("fluss")#)
Hinweis: "weiter" wird von EUMEL-0 auch immer dann aufgerufen,
- wenn ein Prozeß auf dem angegebenen Kanal auf Eingabe
- wartet und keine Zeichen mehr gepuffert sind. Wenn der be-
+ wenn ein Prozeß auf dem angegebenen Kanal auf Eingabe
+ wartet und keine Zeichen mehr gepuffert sind. Wenn der be­
troffene Kanal von sich aus keine Interrupts erzeugt, kann
SHard dies benutzen, um durch Aufruf von 'inputinterrupt' ein
Eingabezeichen zuzustellen.
- #on("i")#Diese Betriebsart sollte nicht für normale Terminalkanäle
+ #on("i")#Diese Betriebsart sollte nicht für normale Terminalkanäle
eingesetzt werden. Denn dann wird die SV-Taste nur an
- EUMEL-0 zugestellt, wenn ein Prozeß auf diesem Kanal auf
- Eingabe wartet. Somit sind in dieser Betriebsart CPU-inten-
+ EUMEL-0 zugestellt, wenn ein Prozeß auf diesem Kanal auf
+ Eingabe wartet. Somit sind in dieser Betriebsart CPU-inten­
sive Endlosschleifen nicht normal abbrechbar!#off("i")#
@@ -1363,22 +1363,22 @@ Das System verlangt folgende Informations- und Steuerleistungen über IOCONTROL:
Eingang: AL Kanalnummer (0...31)
CX 5
- DX Schlüssel
- Ausgang: CX Anzahl Blöcke MOD 65536
- AL Anzahl Blöcke DIV 65536
+ DX Schlüssel
+ Ausgang: CX Anzahl Blöcke MOD 65536
+ AL Anzahl Blöcke DIV 65536
- Zweck: EUMEL-0 ruft 'size' auf, um die Anzahl Blöcke zu erfahren,
- die ein Block-IO-Kanal verkraften kann (Größe von Hin-
+ Zweck: EUMEL-0 ruft 'size' auf, um die Anzahl Blöcke zu erfahren,
+ die ein Block-IO-Kanal verkraften kann (Größe von Hin­
tergrund und Archiven). Bei Archivlaufwerken, die mehrere
- Formate bearbeiten können, dient dieser Aufruf auch zum
- Einstellen des Formats für die folgenden blockin/blockout-
- Operationen anhand des Schlüssels.
+ Formate bearbeiten können, dient dieser Aufruf auch zum
+ Einstellen des Formats für die folgenden blockin/blockout-
+ Operationen anhand des Schlüssels.
- Schlüssel: 0 Wenn möglich 'erkennend', sonst 'standard'. Im ersten
+ Schlüssel: 0 Wenn möglich 'erkennend', sonst 'standard'. Im ersten
Fall erkennt SHard das Format der eingelegten Diskette
und stellt dieses ein.
- Die weiteren Schlüssel sind stets definierend. Dabei gibt es die
+ Die weiteren Schlüssel sind stets definierend. Dabei gibt es die
EUMEL-Standardformate:
1 5" 2D-40, Sektor 1..9, 512 Bytes
@@ -1387,7 +1387,7 @@ Das System verlangt folgende Informations- und Steuerleistungen über IOCONTROL:
10 8" 1D-77, Sektor 0..15, 512 Bytes
11 8" 2D-77, Sektor 0..15, 512 Bytes
- Zusätzlich kann man sämtliche Spezialformate angeben:
+ Zusätzlich kann man sämtliche Spezialformate angeben:
8192 * laufwerkstyp 1: 8"
2: 5"
@@ -1409,30 +1409,30 @@ Das System verlangt folgende Informations- und Steuerleistungen über IOCONTROL:
1: 256
2: 512
- + 32 * erster sektor 0: #0
- 1: #1
+ + 32 * erster sektor 0: \#0
+ 1: \#1
+ sektoren pro spur 0 ... 31
So bezeichnet '8762' das Format 8" 1S-77 Sektor 1..26 a
128 Bytes.
- Anmerkung: SHard sollte alle physisch möglichen EUMEL-Standard-
- formate unterstützen. Von den Spezialformaten sollten die für
- den Datenaustausch wichtigen Formate berücksichtigt werden.
- Die EUMEL-Standardformate (1,2,3,10,11) sollten auch über
+ Anmerkung: SHard sollte alle physisch möglichen EUMEL-Standard­
+ formate unterstützen. Von den Spezialformaten sollten die für
+ den Datenaustausch wichtigen Formate berücksichtigt werden.
+ Die EUMEL-Standardformate (1,2,3,10,11) sollten auch über
die entsprechenden analytischen Codes erreicht werden. (Z.B.
bezeichnen 1 und 21929 dasselbe Format.) Die Numerierung
- der Blöcke ist in jedem Fall seitenorientiert, d.h. entsprechend
+ der Blöcke ist in jedem Fall seitenorientiert, d.h. entsprechend
den Standardformaten (siehe S.#topage("arch")#).
- Hinweis: Bei Archiven wird 'size' aufgerufen, nachdem der Archivträ-
+ Hinweis: Bei Archiven wird 'size' aufgerufen, nachdem der Archivträ­
ger eingelegt wurde. D.h. SHard hat die Gelegenheit, die
- Größe anhand des eingelegten Archivträgers zu bestimmen
+ Größe anhand des eingelegten Archivträgers zu bestimmen
(z.B. ob single- oder doublesided).
Vorschlag: Diese Funktion sollte auf nicht vorhandenen und den
- Stream-IO-Kanälen 0 liefern. Sie muß aber mindestens auf
+ Stream-IO-Kanälen 0 liefern. Sie muß aber mindestens auf
Kanal 0 (Hintergrund) und Kanal 31 (Archiv) "echte" Werte
liefern.
@@ -1444,17 +1444,17 @@ Das System verlangt folgende Informations- und Steuerleistungen über IOCONTROL:
Eingang: AL Kanalnummer (0...31)
CX 7
- DX Schlüssel
+ DX Schlüssel
Ausgang: CX Fehlercode wie bei Archiv-BLOCKOUT (siehe S.#topage("errcod")#)
Zweck: Dient zum Formatieren einen Mediums. Diese Funktion kann
- für jeden Kanal leer implementiert sein ('ret'). Sie sollte aber
+ für jeden Kanal leer implementiert sein ('ret'). Sie sollte aber
"formatierend" (z.B. auf Kanal 31) arbeiten, falls auf diesem
Kanal die "typ"-Abfrage "Formatieren sinnvoll" liefert. Falls
- (bei Diskettenlaufwerken) mehrere Formate möglich sind,
- bestimmt der Schlüssel das gewünschte Format.
+ (bei Diskettenlaufwerken) mehrere Formate möglich sind,
+ bestimmt der Schlüssel das gewünschte Format.
- Schlüssel: wie bei IOCONTROL "size"
+ Schlüssel: wie bei IOCONTROL "size"
Achtung: #on("i")#Ausnahmsweise darf bei dieser IOCONTROL-Funktion die
0-Routine 'warte' aufgerufen werden.#off("i")#
@@ -1464,34 +1464,34 @@ Das System verlangt folgende Informations- und Steuerleistungen über IOCONTROL:
#b("Konfigurierung serieller Schnittstellen")#
#goalpage("v24")#
-Bei Kanälen, die hardwaremäßig auf #ib#serielle Schnittstellen#ie# (#ib#V.24#ie#) zurückgeführt werden, sind
-in der Regel die Größen
+Bei Kanälen, die hardwaremäßig auf #ib#serielle Schnittstellen#ie# (#ib#V.24#ie#) zurückgeführt werden, sind
+in der Regel die Größen
- #ib#Baudrate#ie# (..., 2400, 4800, 9600, ...)
- - #ib#Zeichenlänge#ie# (7 Bits, 8 Bits)
- - #ib#Parität#ie# (keine, gerade, ungerade)
+ - #ib#Zeichenlänge#ie# (7 Bits, 8 Bits)
+ - #ib#Parität#ie# (keine, gerade, ungerade)
-einstellbar. Dafür muß SHard die IOCONTROL-Funktionen "baud" und "bits" zur Verfü-
+einstellbar. Dafür muß SHard die IOCONTROL-Funktionen "baud" und "bits" zur Verfü­
gung stellen. Diese werden in zwei Modi benutzt:
a) #on("b")#einstellend#off("b")#
- Läuft der aufrufende EUMEL-Prozeß auf dem privilegierten Steuerkanal (AL = 32),
- wird der als Parameter mit übergebene #on("i")#adressierte Kanal#off("i")# auf die geforderten Werte
- eingestellt, sofern das möglich ist.
+ Läuft der aufrufende EUMEL-Prozeß auf dem privilegierten Steuerkanal (AL = 32),
+ wird der als Parameter mit übergebene #on("i")#adressierte Kanal#off("i")# auf die geforderten Werte
+ eingestellt, sofern das möglich ist.
b) #on("b")#abfragend#off("b")#
- Läuft der aufrufende EUMEL-Prozeß nicht auf Kanal 32 (AL <> 32), wird le-
- diglich abgefragt, ob der #on("i")#adressierte Kanal#off("i")# auf die übergebenen Werte eingestellt
- werden könnte.
+ Läuft der aufrufende EUMEL-Prozeß nicht auf Kanal 32 (AL <> 32), wird le­
+ diglich abgefragt, ob der #on("i")#adressierte Kanal#off("i")# auf die übergebenen Werte eingestellt
+ werden könnte.
-Aufgrund des zweiten Modus können die höheren EUMEL-Ebenen dem Anwender bei der
+Aufgrund des zweiten Modus können die höheren EUMEL-Ebenen dem Anwender bei der
Konfigurierung mitteilen, welche Werte sich auf dem jeweiligen Kanal einstellen lassen. Das
nutzt z.B. das Standard-Konfigurationsprogramm aus.
-Hinweis: Bei einigen Kanälen (z.B. bei einem integrierten Terminal oder einer Parallel-
- schnittstelle) sind Baudrateneinstellungen sinnlos. Bei anderen können sie nur
- hardwaremäßig vorgenommen werden (Jumper, Dip Switches). In allen diesen
- Fällen muß SHard bei allen Einstellungen 'unmöglich' melden. (Standardmäßig
+Hinweis: Bei einigen Kanälen (z.B. bei einem integrierten Terminal oder einer Parallel­
+ schnittstelle) sind Baudrateneinstellungen sinnlos. Bei anderen können sie nur
+ hardwaremäßig vorgenommen werden (Jumper, Dip Switches). In allen diesen
+ Fällen muß SHard bei allen Einstellungen 'unmöglich' melden. (Standardmäßig
wird der Anwender bei der Einstellung seiner Konfiguration dann auch nicht
danach gefragt.)
@@ -1501,17 +1501,17 @@ Hinweis: Bei einigen Kanälen (z.B. bei einem integrierten Terminal oder einer P
Eingang: AL eigener Kanal (1...15 / 32)
CX 8
DX adressierter Kanal
- BX Schlüssel
- Ausgang: CX Rückmeldung (0 = ok, 1 = nicht möglich)
+ BX Schlüssel
+ Ausgang: CX Rückmeldung (0 = ok, 1 = nicht möglich)
- Zweck: Wird diese Routine auf dem Steuerkanal (AL=32) aufgeru-
- fen, wird die angegebene Baudrate für den durch Register DX
- adressierten Kanal eingestellt, falls das möglich ist.
- Wird diese Routine auf einem anderen Kanal als 32 aufge-
+ Zweck: Wird diese Routine auf dem Steuerkanal (AL=32) aufgeru­
+ fen, wird die angegebene Baudrate für den durch Register DX
+ adressierten Kanal eingestellt, falls das möglich ist.
+ Wird diese Routine auf einem anderen Kanal als 32 aufge­
rufen, informiert sie den Aufrufer lediglich, ob eine derartige
- Einstellung des adressierten Kanals möglich wäre.
+ Einstellung des adressierten Kanals möglich wäre.
- Schlüssel: 1 50 Baud
+ Schlüssel: 1 50 Baud
2 75 Baud
3 110 Baud
4 134.5 Baud
@@ -1528,13 +1528,13 @@ Hinweis: Bei einigen Kanälen (z.B. bei einem integrierten Terminal oder einer P
15 19200 Baud
16 38400 Baud
- Anmerkung: In der Regel werden nicht alle Baudraten vom SHard unter-
- stützt werden. Bei V.24 Schnittstellen sollten aber minde-
- stens 2400, 4800 und 9600 Baud zur Verfügung stehen,
+ Anmerkung: In der Regel werden nicht alle Baudraten vom SHard unter­
+ stützt werden. Bei V.24 Schnittstellen sollten aber minde­
+ stens 2400, 4800 und 9600 Baud zur Verfügung stehen,
besser auch 300, 600, 1200 und 19200 Baud.
Hinweis: Falls SHard-spezifisch weitere Baudraten implementiert
- werden sollen, darf SHard hierfür negative Schlüsselwerte
+ werden sollen, darf SHard hierfür negative Schlüsselwerte
(Register BX) vergeben.
@@ -1543,85 +1543,85 @@ Hinweis: Bei einigen Kanälen (z.B. bei einem integrierten Terminal oder einer P
Eingang: AL eigener Kanal (1...15 / 32)
CX 9
DX adressierter Kanal
- BX Schlüssel
- Ausgang: CX Rückmeldung (0 = ok, 1 = nicht möglich)
-
- Zweck: Wird diese Routine auf dem Steuerkanal (AL=32) aufgeru-
- fen, wird die angegebene Zeichenlänge (Bits pro Zeichen) und
- Parität für den durch Register DX adressierten Kanal einge-
- stellt, falls das möglich ist.
- Wird diese Routine auf einem anderen Kanal als 32 aufge-
+ BX Schlüssel
+ Ausgang: CX Rückmeldung (0 = ok, 1 = nicht möglich)
+
+ Zweck: Wird diese Routine auf dem Steuerkanal (AL=32) aufgeru­
+ fen, wird die angegebene Zeichenlänge (Bits pro Zeichen) und
+ Parität für den durch Register DX adressierten Kanal einge­
+ stellt, falls das möglich ist.
+ Wird diese Routine auf einem anderen Kanal als 32 aufge­
rufen, informiert sie den Aufrufer lediglich, ob eine derartige
- Einstellung des adressierten Kanals möglich wäre.
+ Einstellung des adressierten Kanals möglich wäre.
- Schlüssel: stop * 32 + par * 8 + (bit - 1)
+ Schlüssel: stop * 32 + par * 8 + (bit - 1)
stop: 0 1 Stopbit
1 1.5 Stopbits
2 2 Stopbits
- par: 0 keine Parität
- 1 ungerade Parität
- 2 gerade Parität
+ par: 0 keine Parität
+ 1 ungerade Parität
+ 2 gerade Parität
bit: 1...8 Bits pro Zeichen
Anmerkung: In der Regel werden nicht alle Kombinationen vom SHard
- unterstützt werden. Bei V.24 Schnittstellen sollten aber mög-
- lichst 1 Stopbit, 7 und 8 Bits pro Zeichen und alle drei Pari-
- tätseinstellungen zur Verfügung stehen.
+ unterstützt werden. Bei V.24 Schnittstellen sollten aber mög­
+ lichst 1 Stopbit, 7 und 8 Bits pro Zeichen und alle drei Pari­
+ tätseinstellungen zur Verfügung stehen.
Hinweis: Falls SHard-spezifisch weitere Einstellungen implementiert
- werden sollen, darf SHard hierfür negative Schlüsselwerte
+ werden sollen, darf SHard hierfür negative Schlüsselwerte
(Register BX) vergeben.
-#b("Flußkontrolle")#
+#b("Flußkontrolle")#
#goalpage("fluss")#
-Die stromorientierten Kanäle (1...15) werden nicht nur zum Anschluß schneller Geräte (wie
-Terminals) verwendet, sondern auch, um langsame Geräte (wie Drucker) anzuschließen, die
-die Daten u.U. nicht so schnell übernehmen können, wie sie der Rechner schickt. Dabei ist
-auf eine geeignete Flußkontrolle zu achten (nicht schneller senden, als der Andere emp-
+Die stromorientierten Kanäle (1...15) werden nicht nur zum Anschluß schneller Geräte (wie
+Terminals) verwendet, sondern auch, um langsame Geräte (wie Drucker) anzuschließen, die
+die Daten u.U. nicht so schnell übernehmen können, wie sie der Rechner schickt. Dabei ist
+auf eine geeignete Flußkontrolle zu achten (nicht schneller senden, als der Andere emp­
fangen kann). Dieses Problem stellt sich auch bei einer Rechner-Rechner-Kopplung. Hier
-ist in der Regel sogar zweiseitige Flußkontrolle notwendig.
+ist in der Regel sogar zweiseitige Flußkontrolle notwendig.
-Als Flußkontrolle ist die #ib#REQUEST TO SEND/CLEAR TO SEND#ie# Logik der V.24-Schnitt-
-stelle oder das #ib#XON/XOFF#ie#-Protokoll zu verwenden. Das letztere kann auch bei Parallel-
+Als Flußkontrolle ist die #ib#REQUEST TO SEND/CLEAR TO SEND#ie# Logik der V.24-Schnitt­
+stelle oder das #ib#XON/XOFF#ie#-Protokoll zu verwenden. Das letztere kann auch bei Parallel­
schnittstellen eingesetzt werden.
-Zur eingabeseitigen Flußkontrollsteuerung kann SHard die Rückmeldung der 0-Routine
+Zur eingabeseitigen Flußkontrollsteuerung kann SHard die Rückmeldung der 0-Routine
'inputinterrupt' (siehe S.#topage("inp")#), die "stop" signalisieren kann, und die IOCONTROL-Funktion
"weiter" (siehe S.#topage("weiter")#)verwenden:
-Allerspätestens bei der 'inputinterrupt'-Rückmeldung AL=0 muß SHard
+Allerspätestens bei der 'inputinterrupt'-Rückmeldung AL=0 muß SHard
auf der V.24-Schnittstelle das Signal 'REQUEST TO SEND' wegnehmen bzw. XON senden
(oder
-weiter einlaufenden Input selbst zwischenpuffern). Dadurch wird bei den meisten Fremd-
+weiter einlaufenden Input selbst zwischenpuffern). Dadurch wird bei den meisten Fremd­
rechnern ein weiteres Senden unterbrochen, sofern (im ersten Fall) das Signal 'REQUEST
TO SEND' dort mit dem V.24-Eingang 'CLEAR TO SEND' verbunden ist. Wird von
EUMEL-0 "weiter" aufgerufen, so kann auf dem ensprechenden Kanal wieder empfangen
-werden (RTS setzen bzw. XON senden). In der Regel wird SHard schon reagieren müssen,
-bevor der EUMEL-Puffer gänzlich gefüllt ist, da die Sendehardware nicht schnell genug
-reagieren kann bzw. da noch sich noch Zeichen in Hardwarepuffern befinden können.
+werden (RTS setzen bzw. XON senden). In der Regel wird SHard schon reagieren müssen,
+bevor der EUMEL-Puffer gänzlich gefüllt ist, da die Sendehardware nicht schnell genug
+reagieren kann bzw. da noch sich noch Zeichen in Hardwarepuffern befinden können.
-Für die ausgabeseitige Flußkontrolle muß rechnerseitig ebenfalls das Signal 'CLEAR TO
-SEND' bzw. der Empfang von XOFF/XON berücksichtigt werden. Wenn an der Schnittstelle
+Für die ausgabeseitige Flußkontrolle muß rechnerseitig ebenfalls das Signal 'CLEAR TO
+SEND' bzw. der Empfang von XOFF/XON berücksichtigt werden. Wenn an der Schnittstelle
das 'CLEAR TO SEND' weggenommen wird, darf SHard keinen weiteren Output auf dieser
-Schnittstelle machen, bis 'CLEAR TO SEND' wieder anliegt. Entsprechend muß der Empfang
+Schnittstelle machen, bis 'CLEAR TO SEND' wieder anliegt. Entsprechend muß der Empfang
von XOFF die Ausagbe anhalten und XON sie wieder starten.
Bemerkung: Die meisten Systeme enthalten die CTS-Funktion schon in ihrer Hardware, so
- daß im SHard dafür keine Vorkehrungen getroffen werden müssen.
+ daß im SHard dafür keine Vorkehrungen getroffen werden müssen.
-Zur Einstellung der gewünschten Flußkontrolle eines Kanals dient die IOCONTROL-Funk-
-tion "flow". Ähnlich wie "baud" und "bits" wirkt auch "flow" nur auf Kanal 32 #on("i")#einstellend#off("i")# und
-auf allen anderen Kanälen lediglich #on("i")#abfragend#off("i")#.
+Zur Einstellung der gewünschten Flußkontrolle eines Kanals dient die IOCONTROL-Funk­
+tion "flow". Ähnlich wie "baud" und "bits" wirkt auch "flow" nur auf Kanal 32 #on("i")#einstellend#off("i")# und
+auf allen anderen Kanälen lediglich #on("i")#abfragend#off("i")#.
#d("IOCONTROL ""flow""")#
@@ -1630,14 +1630,14 @@ auf allen anderen Kanälen lediglich #on("i")#abfragend#off("i")#.
CX 6
DX adressierter Kanal
BX Modus
- Ausgang: CX Rückmeldung (0 = ok, 1 = nicht möglich)
+ Ausgang: CX Rückmeldung (0 = ok, 1 = nicht möglich)
- Zweck: Wird diese Routine auf dem Steuerkanal (AL=32) aufgeru-
- fen, muß sie den gewünschten Flußkontrollmodus für den
+ Zweck: Wird diese Routine auf dem Steuerkanal (AL=32) aufgeru­
+ fen, muß sie den gewünschten Flußkontrollmodus für den
adressierten Kanal einstellen.
Dabei sind folgende Modi festgelegt:
- BX= 0 Keine Flußkontrolle
+ BX= 0 Keine Flußkontrolle
BX= 1 XON/XOFF (in beide Richtungen)
BX= 2 RTS/CTS (in beide Richtungen)
BX= 5 XON/XOFF (nur ausgabeseitig)
@@ -1646,32 +1646,32 @@ auf allen anderen Kanälen lediglich #on("i")#abfragend#off("i")#.
BX=10 RTS/CTS (nur eingabeseitig)
SHard wird hierdurch informiert, wie er auf "Puffer voll" und
- "weiter" reagieren soll. Wenn keine Flußkontrolle gewünscht
- wird (BX=0), muß SHard "stop" und "weiter" ignorieren; bei
- BX=1 oder BX=9 muß bei "stop" XOFF und bei "weiter" XON
- geschickt werden; bei BX=2 oder BX=10 muß bei "stop" das
+ "weiter" reagieren soll. Wenn keine Flußkontrolle gewünscht
+ wird (BX=0), muß SHard "stop" und "weiter" ignorieren; bei
+ BX=1 oder BX=9 muß bei "stop" XOFF und bei "weiter" XON
+ geschickt werden; bei BX=2 oder BX=10 muß bei "stop" das
Signal RTS auf low und bei "weiter" wieder auf high gesetzt
werden. Mit
"stop" ist hierbei das Unterschreiten des
- Schwellwertes bei der Rückmeldung von
+ Schwellwertes bei der Rückmeldung von
"inputinterrupt" gemeint.
- Bei BX=1 oder BX=5 müssen empfangene XON/XOFF-Zei-
- chen, bei BX=2 oder BX=6 das Signal CTS beachtet wer-
+ Bei BX=1 oder BX=5 müssen empfangene XON/XOFF-Zei­
+ chen, bei BX=2 oder BX=6 das Signal CTS beachtet wer­
den.
- Wird diese Routine auf einem anderen Kanal als 32 aufge-
+ Wird diese Routine auf einem anderen Kanal als 32 aufge­
rufen, informiert sie den Aufrufer lediglich, ob der geforderte
- Flußkontrollmodus auf dem adressierten Kanal einstellbar
- wäre.
+ Flußkontrollmodus auf dem adressierten Kanal einstellbar
+ wäre.
- Hinweis: Falls SHard-spezifisch weitere Flußkontrollmodi implemen-
- tiert werden sollen, darf SHard hierfür negative Moduswerte
+ Hinweis: Falls SHard-spezifisch weitere Flußkontrollmodi implemen­
+ tiert werden sollen, darf SHard hierfür negative Moduswerte
(Register BX) vergeben.
"weiter" wird von EUMEL-0 sehr oft aufgerufen. Es
ist daher nicht sinnvoll, jedesmal XON zu senden, da dies die Gegenstelle
- damit überfluten würde. SHard muß sich
+ damit überfluten würde. SHard muß sich
merken, ob der Kanal im XOFF-Zustand ist und
nur dann bei "weiter" ein XON senden.
@@ -1679,24 +1679,24 @@ auf allen anderen Kanälen lediglich #on("i")#abfragend#off("i")#.
#b("Kalender")#
#goalpage("kalender")#
-Die Datums- und Uhrzeitabfrage ist bei Rechnern mit eingebauter Uhr unnötig. EUMEL holt
+Die Datums- und Uhrzeitabfrage ist bei Rechnern mit eingebauter Uhr unnötig. EUMEL holt
sich Datum und Uhrzeit dann von SHard.
#d("IOCONTROL ""calendar""")#
Eingang: CX 10
DX (1=Minute, 2=Stunde, 3=Tag, 4=Monat, 5=Jahr)
- gewünscht
- Ausgang: CX Rückmeldung
+ gewünscht
+ Ausgang: CX Rückmeldung
Zweck: Erfragen von Datum und Uhrzeit. Falls keine Uhr vorhanden
- ist, muß bei jedem Aufruf -1 zurückgemeldet werden, bei
- eingebauter Uhr jeweils das Gewünschte (Minute: 0..59,
+ ist, muß bei jedem Aufruf -1 zurückgemeldet werden, bei
+ eingebauter Uhr jeweils das Gewünschte (Minute: 0..59,
Stunde: 0..23, Tag: 1..7, Monat: 1..12, Jahr: 0..99). Die
- Rückmeldung muß als BCD-Zahl erfolgen.
+ Rückmeldung muß als BCD-Zahl erfolgen.
Hinweis: Die Uhr darf zwischen zwei Aufrufen umspringen. Die daraus
- resultierende Probleme werden auf höheren Ebenen abge-
+ resultierende Probleme werden auf höheren Ebenen abge­
handelt.
@@ -1705,59 +1705,59 @@ sich Datum und Uhrzeit dann von SHard.
#bb("6. SHard-","Interface Version")#
#goalpage("shdver")#
-Die #ib#Versionsnummer#ie# der Interface-Spezifikation, auf der SHard aufbaut, muß als 2-By-
-te-Konstante #ib#SHDVER#ie# in der SHard-Leiste stehen. Für das hier beschriebene Interface
-muß sie den Wert 8 haben.
+Die #ib#Versionsnummer#ie# der Interface-Spezifikation, auf der SHard aufbaut, muß als 2-By­
+te-Konstante #ib#SHDVER#ie# in der SHard-Leiste stehen. Für das hier beschriebene Interface
+muß sie den Wert 8 haben.
-So sind spätere Erweiterungen des SHard-Interfaces möglich, ohne daß alle SHard-Mo-
-duln geändert werden müssen.
+So sind spätere Erweiterungen des SHard-Interfaces möglich, ohne daß alle SHard-Mo­
+duln geändert werden müssen.
#bb("7. ","ID-Konstanten")#
#goalpage("ID")#
-SHard muß direkt hinter SHDVER vier 2-Byte-Konstanten ablegen. Diese können von den
-höheren Ebenen durch die ELAN-Prozedur
+SHard muß direkt hinter SHDVER vier 2-Byte-Konstanten ablegen. Diese können von den
+höheren Ebenen durch die ELAN-Prozedur
INT PROC #ib#id#ie# (INT CONST no)
-abgefragt werden. Dabei werden id(0) bis id(3) von EUMEL-0 geliefert, während SHard in
-der Leiste die Werte für id(4) bis id(7) zur Verfügung stellen muß:
+abgefragt werden. Dabei werden id(0) bis id(3) von EUMEL-0 geliefert, während SHard in
+der Leiste die Werte für id(4) bis id(7) zur Verfügung stellen muß:
ID4 #ib#Lizenznummer#ie# des SHards *)
#foot#
#f#
-*) Dieser Wert muß mit der Nummer des Lizenzvertrags zwischen Implementierer und GMD übereinstimmen!#a##end#
+*) Dieser Wert muß mit der Nummer des Lizenzvertrags zwischen Implementierer und GMD übereinstimmen!#a##end#
ID5 #ib#Installationsnummer#ie# des EUMEL-Anwenders **)
#foot#
#f#
**) Diese Nummer vergibt der Lizenznehmer an die von ihm belieferten Anwender.#a##end#
- ID6 zur freien Verfügung
+ ID6 zur freien Verfügung
- ID7 zur freien Verfügung
+ ID7 zur freien Verfügung
-#bb("8. ","Zusätzliche Leistungen")#
+#bb("8. ","Zusätzliche Leistungen")#
#goalpage("shdelan")#
-Will der SHard-Implementierer zusätzliche Leistungen anbieten, die mit den Standardope-
-rationen nicht möglich sind, kann er weitere Codes für BLOCKIN, BLOCKOUT und
-IOCONTROL zur Verfügung stellen. Um Überdeckungen mit Codes zu vermeiden, die von
-EUMEL-0 intern verwendet oder erst später eingeführt werden, darf SHard für zusätzli-
+Will der SHard-Implementierer zusätzliche Leistungen anbieten, die mit den Standardope­
+rationen nicht möglich sind, kann er weitere Codes für BLOCKIN, BLOCKOUT und
+IOCONTROL zur Verfügung stellen. Um Überdeckungen mit Codes zu vermeiden, die von
+EUMEL-0 intern verwendet oder erst später eingeführt werden, darf SHard für zusätzli­
che Leistungen nur negative Werte als 'Funktionscode 1' verwenden.
Zum Ansprechen der neuen Leistungen stehen die ELAN-Prozeduren #on("i")#'#ib# blockout#ie#', '#ib#blockin#ie#'#off("i")#
-und #on("i")#'#ib#control#ie#'#off("i")# zur Verfügung.
+und #on("i")#'#ib#control#ie#'#off("i")# zur Verfügung.
-Ferner steht dem SHard ein Parameterkanal (32) zur Verfügung. Funktionen, die (im Mul-
-ti-User) nicht jeder Task zur Verfügung stehen dürfen, müssen über diesen Kanal 32 abge-
-wickelt werden und dürfen nur dort wirken.
+Ferner steht dem SHard ein Parameterkanal (32) zur Verfügung. Funktionen, die (im Mul­
+ti-User) nicht jeder Task zur Verfügung stehen dürfen, müssen über diesen Kanal 32 abge­
+wickelt werden und dürfen nur dort wirken.
PROC blockout (ROW 256 INT CONST para, (* --> DS:BX *)
@@ -1775,22 +1775,22 @@ wickelt werden und dürfen nur dort wirken.
funktion3, (* --> BX *)
INT VAR antwort) (* <-- CX *)
-Hinweis: Der SHard darf für 'funktion 1' (CX) zusätzlich zu den hier beschriebenen Stan-
+Hinweis: Der SHard darf für 'funktion 1' (CX) zusätzlich zu den hier beschriebenen Stan­
dardcodes nur negative Codes vereinbaren.
Beispiel:
- Gibt eine Task, die durch 'continue (x)' an Kanal 'x' hängt, den Befehl
+ Gibt eine Task, die durch 'continue (x)' an Kanal 'x' hängt, den Befehl
control (-7,1200,13,antwort),
- so wird IOCONTROL mit (AL='x', CX=-7, BX=13, DX=1200) aufgerufen. Verläßt
- SHard 'control' mit CX = 1, so enthält 'antwort' anschließend eine 1.
+ so wird IOCONTROL mit (AL='x', CX=-7, BX=13, DX=1200) aufgerufen. Verläßt
+ SHard 'control' mit CX = 1, so enthält 'antwort' anschließend eine 1.
-Hinweis: Um die zusätzlichen Leistungen dem Anwender einfach (und abgesichert) zur
- Verfügung zu stellen, sollte man sie in ein ELAN-Paket einbetten und dieses
+Hinweis: Um die zusätzlichen Leistungen dem Anwender einfach (und abgesichert) zur
+ Verfügung zu stellen, sollte man sie in ein ELAN-Paket einbetten und dieses
ebenfalls an die Anwender ausliefern.
Beispiel: PACKET zusatz DEFINES fanfare, ... :
@@ -1816,7 +1816,7 @@ Hinweis: Um die zusätzlichen Leistungen dem Anwender einfach (und abgesichert)
#bb("9. ","Spezialroutinen")#
#goalpage("ke")#
-Als Testhilfe und zur Fehlerdiagnose kann SHard in seine Routinen Kontrollereignisse ein-
+Als Testhilfe und zur Fehlerdiagnose kann SHard in seine Routinen Kontrollereignisse ein­
bauen. Das geschieht durch Aufruf der 0-Routine 'info'. Dieser EUMEL-Debugger wird im
Anhang A (siehe S.#topage("info")#) beschreiben.
@@ -1828,38 +1828,38 @@ Anhang A (siehe S.#topage("info")#) beschreiben.
weiter:
Zweck: Info wird aufgerufen. Dabei wird 'text' zur Identifikation des
- Kontrollereignisses ausgegeben. Der übergebene Text darf
+ Kontrollereignisses ausgegeben. Der übergebene Text darf
nicht mit 0h beginnen.
- Hinweis: Bei Systemen "ohne Info" (nur solche dürfen an Anwender
+ Hinweis: Bei Systemen "ohne Info" (nur solche dürfen an Anwender
ausgeliefert werden) wird nur der Info-Text ausgegeben und
EUMEL-0 angehalten.
- Achtung: Da der Info selbst die hier beschriebenen Stream-IO-Routi-
- nen benutzt, darf man ihn von diesen Routinen aus (inputin-
+ Achtung: Da der Info selbst die hier beschriebenen Stream-IO-Routi­
+ nen benutzt, darf man ihn von diesen Routinen aus (inputin­
terrupt, OUTPUT, IOCONTROL "frout", IOCONTROL "weiter")
- nicht aufrufen. Wenn die Ein-/Ausgabe auf Terminal 1 inter-
- ruptgetrieben läuft, dürfen die Interrupts beim Info-Aufruf
- natürlich nicht gesperrt sein.
+ nicht aufrufen. Wenn die Ein-/Ausgabe auf Terminal 1 inter­
+ ruptgetrieben läuft, dürfen die Interrupts beim Info-Aufruf
+ natürlich nicht gesperrt sein.
-Falls SHard für bestimmte Aktionen, die selten durchgeführt werden (z.B. Formatieren), viel
-Speicher benötigt, kann er diesen dynamisch anfordern und später wieder freigeben.
+Falls SHard für bestimmte Aktionen, die selten durchgeführt werden (z.B. Formatieren), viel
+Speicher benötigt, kann er diesen dynamisch anfordern und später wieder freigeben.
#dx("grab")# (0-Routine)
Eingang: BX Anfangsadresse des zu reservierenden Bereichs im
- Datensegment von EUMEL-0, muß auf 512 Byte
+ Datensegment von EUMEL-0, muß auf 512 Byte
ausgerichtet sein.
- CX Länge des zu reservierenden Bereichs in 512-Byte-
+ CX Länge des zu reservierenden Bereichs in 512-Byte-
Kacheln
- Ausgang: CX Rückmeldecode
+ Ausgang: CX Rückmeldecode
- Zweck: Wenn möglich wird der zu verlangte Bereich von EUMEL-0
- "leergekämpft" und SHard zur Verfügung gestellt.
- Rückmeldecode: 0 ok, Speicher steht zur Verfügung
- 1 grundsätzlich nicht möglich
- 2 augenblicklich nicht möglich
+ Zweck: Wenn möglich wird der zu verlangte Bereich von EUMEL-0
+ "leergekämpft" und SHard zur Verfügung gestellt.
+ Rückmeldecode: 0 ok, Speicher steht zur Verfügung
+ 1 grundsätzlich nicht möglich
+ 2 augenblicklich nicht möglich
Achtung: Der Aufruf von 'grab' wird in der Regel 'warte' und Block-IO
auf Kanal 0 induzieren.
@@ -1870,31 +1870,31 @@ Speicher benötigt, kann er diesen dynamisch anfordern und später wieder freigebe
#dx("free")# (0-Routine)
- Eingang: BX Anfangsadresse des freizugebenden Bereichs im Da-
- tensegment von EUMEL-0, muß auf 512 Byte ausge-
+ Eingang: BX Anfangsadresse des freizugebenden Bereichs im Da­
+ tensegment von EUMEL-0, muß auf 512 Byte ausge­
richtet sein.
- CX Länge des zu freizugebenden Bereichs als 'Bytes DIV
+ CX Länge des zu freizugebenden Bereichs als 'Bytes DIV
512'
- Zweck: Der entsprechende Bereich muß vorher mit 'grab' beschafft
+ Zweck: Der entsprechende Bereich muß vorher mit 'grab' beschafft
worden sein. Hiermit wird er wieder EUMEL-0 zur freien
- Verfügung gestellt.
+ Verfügung gestellt.
-Für spezielle Fehlersituationen steht die 0-Routine 'shutup' zur Verfügung. Damit kann
+Für spezielle Fehlersituationen steht die 0-Routine 'shutup' zur Verfügung. Damit kann
SHard z.B. bei Netzausfall ein kontrolliertes Systemende erzwingen. Das ist allerdings nur
-sinnvoll, wenn durch Batteriepufferung oder Ähnliches sichergestellt ist, daß noch genügend
-Zeit bleibt, um alle Seiten auf den Hintergrund zurückzuschreiben.
+sinnvoll, wenn durch Batteriepufferung oder Ähnliches sichergestellt ist, daß noch genügend
+Zeit bleibt, um alle Seiten auf den Hintergrund zurückzuschreiben.
#dx("shutup")# (0-Routine)
- Zweck: Erzwingt Rückschreiben aller Seiten und Systemende, d.h.
+ Zweck: Erzwingt Rückschreiben aller Seiten und Systemende, d.h.
entspricht der ELAN-Prozedur 'shutup'.
Achtung: Der Aufruf von 'shutup' wird in der Regel 'warte' und
- Block-IO auf Kanal 0 induzieren, abschließend wird 'sysend'
+ Block-IO auf Kanal 0 induzieren, abschließend wird 'sysend'
aufgerufen.
-
+#page#
#cc("Teil 4: ","Tips zur Portierung")#
#goalpage("tips")#
@@ -1903,24 +1903,24 @@ Zeit bleibt, um alle Seiten auf den Hintergrund zurückzuschreiben.
#goalpage("0ver")#
-Es wird empfohlen, zuerst eine "0-Version" des SHard zu entwickeln, die möglichst einfach
-aufgebaut und nicht auf Effizienz und vollständige Ausnutzung der Betriebsmittel ausge-
+Es wird empfohlen, zuerst eine "0-Version" des SHard zu entwickeln, die möglichst einfach
+aufgebaut und nicht auf Effizienz und vollständige Ausnutzung der Betriebsmittel ausge­
richtet sein sollte. Damit kann man rasch praktische Erfahrung gewinnen, die dann den
-Entwurf und die Implementation des eigentlichen SHard erleichtert. Die 0-Version soll-
+Entwurf und die Implementation des eigentlichen SHard erleichtert. Die 0-Version soll­
te
- - nur die Kanäle 0 (Hintergrund), 1 (Terminal) und 31 (Archiv) behandeln,
+ - nur die Kanäle 0 (Hintergrund), 1 (Terminal) und 31 (Archiv) behandeln,
- - keine Baudraten-, Zeichenlängen-, Paritäts- und Flußkontrolleinstellungen un-
- terstützen (immer 'nicht möglich' melden),
+ - keine Baudraten-, Zeichenlängen-, Paritäts- und Flußkontrolleinstellungen un­
+ terstützen (immer 'nicht möglich' melden),
- - vorhandene (ROM-) Routinen möglichst nutzen, ohne sich um Unschönes wie "busy
- wait" beim Floppy- bzw. Plattenzugriff zu grämen.
+ - vorhandene (ROM-) Routinen möglichst nutzen, ohne sich um Unschönes wie "busy
+ wait" beim Floppy- bzw. Plattenzugriff zu grämen.
Mit dieser 0-Version sollte man dann versuchen, EUMEL zu starten. Da der Hintergrund
-beim ersten Mal noch leer ist, muß man das Hintergrund-Archiv (Archivfloppy mit
-EUMEL-0 und höheren Ebenen) in das Archivlaufwerk einlegen und von dort laden. Der
-Vortest sollte sich direkt nach dem Start folgendermaßen auf Terminal 1 melden:
+beim ersten Mal noch leer ist, muß man das Hintergrund-Archiv (Archivfloppy mit
+EUMEL-0 und höheren Ebenen) in das Archivlaufwerk einlegen und von dort laden. Der
+Vortest sollte sich direkt nach dem Start folgendermaßen auf Terminal 1 melden:
E U M E L - Vortest
@@ -1931,39 +1931,39 @@ Vortest sollte sich direkt nach dem Start folgendermaßen auf Terminal 1 melden:
Speichertest: ************
-Man sollte während der ****-Ausgabe des Speichertests irgendein Zeichen eingeben. Das
-EUMEL-System muß dann in das ausführliche Start-Menü überwechseln. (Andernfalls
+Man sollte während der ****-Ausgabe des Speichertests irgendein Zeichen eingeben. Das
+EUMEL-System muß dann in das ausführliche Start-Menü überwechseln. (Andernfalls
funktioniert die Eingabe nicht richtig!)
-Als nächstes sollte man versuchen, den Hintergrund vom Archiv aus zu laden. (Diese Mög-
-lichkeit wird im Start-Menü angeboten.) Nach dem Ende dieser Operation wird der
-EUMEL-Lauf automatisch beendet. Jetzt kann man das HG-Archiv aus dem Archivlauf-
-werk entfernen und das System neu starten. Dann sollte EUMEL-0 vom Hintergrund gela-
+Als nächstes sollte man versuchen, den Hintergrund vom Archiv aus zu laden. (Diese Mög­
+lichkeit wird im Start-Menü angeboten.) Nach dem Ende dieser Operation wird der
+EUMEL-Lauf automatisch beendet. Jetzt kann man das HG-Archiv aus dem Archivlauf­
+werk entfernen und das System neu starten. Dann sollte EUMEL-0 vom Hintergrund gela­
den werden.
-Bei Problemen kann der "Info" (siehe S.#topage("info")#) hilfreich sein. Voraussetzung für seine Ver-
-wendung ist aber, daß die Terminal Ein-/Ausgabe schon funktioniert.
+Bei Problemen kann der "Info" (siehe S.#topage("info")#) hilfreich sein. Voraussetzung für seine Ver­
+wendung ist aber, daß die Terminal Ein-/Ausgabe schon funktioniert.
Beim Start des EUMEL-Systems kann (wie im Systemhandbuch beschrieben) durch den
Konfigurationsdialog der Terminaltyp von Kanal 1 eingestellt werden. Falls das verwendete
-Terminal in dieser Liste nicht aufgeführt wird und auch keinem der aufgeführten (in Bezug
+Terminal in dieser Liste nicht aufgeführt wird und auch keinem der aufgeführten (in Bezug
auf die Steuercodes) gleicht, kann man z.B.
- - den neuen Terminaltyp an einem anderen EUMEL-Rechner verfügbar machen
+ - den neuen Terminaltyp an einem anderen EUMEL-Rechner verfügbar machen
(Umsetztabellen definieren) und per Archiv zum neuen Rechner tragen,
- - die notwendigen Umcodierungen per SHard durchführen.
+ - die notwendigen Umcodierungen per SHard durchführen.
Diese Problematik entsteht bei Rechnern mit integriertem Terminal in der Regel nicht, weil
-Steuerzeichen dort sowieso algorithmisch interpretiert werden müssen. In diesem Fall wird
-man direkt die EUMEL-Codes als Grundlage wählen, so daß keine Umsetzungen erfor-
+Steuerzeichen dort sowieso algorithmisch interpretiert werden müssen. In diesem Fall wird
+man direkt die EUMEL-Codes als Grundlage wählen, so daß keine Umsetzungen erfor­
derlich sind.
Bei einer provisorischen Anpassung kann man auf Invers-Video ohne weiteres verzichten.
Im Gegensatz zu der 0-Version sollte man bei der eigentlichen SHard-Implementierung
-darauf achten, die Möglichkeiten der Hardware effizient zu nutzen. Der Testverlauf entspricht
+darauf achten, die Möglichkeiten der Hardware effizient zu nutzen. Der Testverlauf entspricht
dann wieder im wesentlichen dem oben beschriebenen Vorgang.
@@ -1972,15 +1972,15 @@ dann wieder im wesentlichen dem oben beschriebenen Vorgang.
#goalpage("fehler")#
- a) SHard-Routinen zerstören Registerinhalte bzw. sichern sie beim Interrupt nicht
- vollständig. Hierbei sollte man auch an die Segmentregister denken.
+ a) SHard-Routinen zerstören Registerinhalte bzw. sichern sie beim Interrupt nicht
+ vollständig. Hierbei sollte man auch an die Segmentregister denken.
- b) 'call' bzw. 'ret' verändern den Stackpointer.
+ b) 'call' bzw. 'ret' verändern den Stackpointer.
- c) Fehler bei der Interruptbehandlung führen zu Blockaden ("hängende Interrupts").
+ c) Fehler bei der Interruptbehandlung führen zu Blockaden ("hängende Interrupts").
- d) Cursorpositionierung außerhalb des Bildschirms bei einem internen Terminal
- (Bildwiederholspeicher im Rechner) wird nicht abgefangen. Das führt dann zu
+ d) Cursorpositionierung außerhalb des Bildschirms bei einem internen Terminal
+ (Bildwiederholspeicher im Rechner) wird nicht abgefangen. Das führt dann zu
wildem Schreiben in den Hauptspeicher.
e) 'warte' wird unerlaubt aufgerufen. ('warte' darf nur von BLOCKIN, BLOCKOUT,
@@ -1988,41 +1988,41 @@ dann wieder im wesentlichen dem oben beschriebenen Vorgang.
kann man 'warte' noch nicht beim Systemladen aufrufen!)
f) OUTPUT-Verhaspler oder -Blockaden entstehen durch Fehlsynchronisation
- zwischen dem Füllen des Ausgabepuffers durch die Routine OUTPUT und der
+ zwischen dem Füllen des Ausgabepuffers durch die Routine OUTPUT und der
Interruptroutine, die den Puffer leert und ausgibt.
g) IOCONTROL "frout" meldet in gewissen Situationen nie "mindestens 50 Zeichen
- im Puffer frei" und "Puffer leer". Das kann schon im Vortest zu Output-Blok-
- kaden führen.
+ im Puffer frei" und "Puffer leer". Das kann schon im Vortest zu Output-Blok­
+ kaden führen.
- h) Obwohl "frout" einen Wert größer als x meldet, nimmt "output" nicht alle x Zei-
+ h) Obwohl "frout" einen Wert größer als x meldet, nimmt "output" nicht alle x Zei­
chen an.
i) IOCONTROL "size" meldet falsche Werte.
j) IOCONTROL verkraftet keine beliebigen (auch unsinnige) Werte.
- k) BLOCKIN bzw. BLOCKOUT geben die Kontrolle an das System zurück, bevor alle
- Daten übertragen sind. (Sofort nach der Rückgabe geht EUMEL-0 davon aus,
- daß der Puffer frei ist und anderweitig benutzt werden kann!)
+ k) BLOCKIN bzw. BLOCKOUT geben die Kontrolle an das System zurück, bevor alle
+ Daten übertragen sind. (Sofort nach der Rückgabe geht EUMEL-0 davon aus,
+ daß der Puffer frei ist und anderweitig benutzt werden kann!)
- l) Fälschlicherweise wird davon ausgegangen, daß DS oder ES konstant bleiben.
+ l) Fälschlicherweise wird davon ausgegangen, daß DS oder ES konstant bleiben.
- m) Die Stepping-Rate eines Festplattencontrollers wird falsch eingestellt, bezie-
+ m) Die Stepping-Rate eines Festplattencontrollers wird falsch eingestellt, bezie­
hungsweise die Platte wird nicht im 'buffered step mode' betrieben, obwohl
beschleunigend positionieren kann. Dadurch werden die Zugriffszeiten auf dem
- Hintergrund unnötig verlangsamt. Man bedenke, daß man so einen Fehler leicht
- übersieht, weil sich das System nicht fehlerhaft, sondern nur langsamer verhält.
- Außerdem macht sich die Verlangsamung erst bemerkbar, wenn größere Teile des
+ Hintergrund unnötig verlangsamt. Man bedenke, daß man so einen Fehler leicht
+ übersieht, weil sich das System nicht fehlerhaft, sondern nur langsamer verhält.
+ Außerdem macht sich die Verlangsamung erst bemerkbar, wenn größere Teile des
Hintergrundes benutzt werden.
n) Bei schnellem Zeichenempfang treten "Dreher" auf. Das deutet meistens auf
- einen rekursiven Aufruf der 0-Routine 'inputinterrupt' hin. Dabei überholt dann
+ einen rekursiven Aufruf der 0-Routine 'inputinterrupt' hin. Dabei überholt dann
das zweite Zeichen das erste.
- o) Bei schnellem Zeichenempfang, speziell bei gleichzeitiger Ausgabe, gehen Ein-
- gabezeichen verloren oder werden verfälscht. In der Regel ist das auf Timing-
- probleme bei der Interruptbehandlung zurückzuführen. Interrupts gehen verloren
+ o) Bei schnellem Zeichenempfang, speziell bei gleichzeitiger Ausgabe, gehen Ein­
+ gabezeichen verloren oder werden verfälscht. In der Regel ist das auf Timing­
+ probleme bei der Interruptbehandlung zurückzuführen. Interrupts gehen verloren
bzw. die Zeichen werden nicht schnell genug abgeholt.
@@ -2031,23 +2031,23 @@ dann wieder im wesentlichen dem oben beschriebenen Vorgang.
#goalpage("eff")#
a) Bei #on("i")##on("b")#V.24- und Parallelschnittstellen#off("i")##off("b")# ist schlechter Durchsatz in der Regel auf
- Fehlverhalten von "frout" zurückzuführen. Auch kostet es in Multi-User-
- Systemen sehr viel, wenn OUTPUT immer nur ein Zeichen übernimmt. (Dann läuft
- der ganze Apparat der EUMEL-0-Maschine für jedes Zeichen wieder an.)
+ Fehlverhalten von "frout" zurückzuführen. Auch kostet es in Multi-User-
+ Systemen sehr viel, wenn OUTPUT immer nur ein Zeichen übernimmt. (Dann läuft
+ der ganze Apparat der EUMEL-0-Maschine für jedes Zeichen wieder an.)
- Besonders bei der Parallelschnittstelle achte man darauf, daß nicht durch ung-
- lückliches Timing häufig Blockaden auftreten. So kann zu kurzes 'busy wait' auf
- Freiwerden der Parallelschnittstelle dazu führen, daß jedes zweite Zeichen abge-
- lehnt wird, so daß OUTPUT faktisch zeichenweise arbeitet. Andererseits darf
- natürlich 'busy wait' auch nicht auf Millisekunden ausgedehnt werden.
+ Besonders bei der Parallelschnittstelle achte man darauf, daß nicht durch ung­
+ lückliches Timing häufig Blockaden auftreten. So kann zu kurzes 'busy wait' auf
+ Freiwerden der Parallelschnittstelle dazu führen, daß jedes zweite Zeichen abge­
+ lehnt wird, so daß OUTPUT faktisch zeichenweise arbeitet. Andererseits darf
+ natürlich 'busy wait' auch nicht auf Millisekunden ausgedehnt werden.
b) Wenn #on("i")##on("b")#Floppies ohne DMA#off("i")##off("b")# angeschlossen werden, kann man bei Single-User-
Systemen ohne weiteres 'busy wait' einsetzen, um nach dem Seek-Vorgang auf
- den Block zu warten. Im Multi-User sollte das aber wenn irgend möglich um-
+ den Block zu warten. Im Multi-User sollte das aber wenn irgend möglich um­
gangen werden, da eine halbe Umdrehung immerhin ca. 100 ms kostet.
- Falls nur ein Endeinterrupt nach jeder Floppyoperation zur Verfügung steht, kann
- folgendes Verfahren günstig sein:
+ Falls nur ein Endeinterrupt nach jeder Floppyoperation zur Verfügung steht, kann
+ folgendes Verfahren günstig sein:
seek befehl an controller ;
warten auf endeinterrupt ;
@@ -2058,10 +2058,10 @@ dann wieder im wesentlichen dem oben beschriebenen Vorgang.
Die Dummyoperation auf den Sektor vor dem adressierten dient dabei nur dazu,
ohne CPU-Belastung einen Zeitpunkt zu finden, wo man dem eigentlichen
- Sektor möglichst nahe ist. Die Zeit, in der die CPU benötigt wird, sinkt damit auf
+ Sektor möglichst nahe ist. Die Zeit, in der die CPU benötigt wird, sinkt damit auf
ca. 25 ms. Die Implementation dieses Algorithmus' ist aber nicht ganz einfach, da
- die 0-Routine 'warte' wegen der verlangten kurzen Reaktionszeiten nicht ver-
- wendet werden kann. Alle 'warte auf ...' müssen also durch Interrupts realisiert
+ die 0-Routine 'warte' wegen der verlangten kurzen Reaktionszeiten nicht ver­
+ wendet werden kann. Alle 'warte auf ...' müssen also durch Interrupts realisiert
werden:
setze interrupt auf lesen davor ;
@@ -2083,12 +2083,12 @@ dann wieder im wesentlichen dem oben beschriebenen Vorgang.
UNTIL alles uebertragen ENDREP ;
melde komplette operation beendet .
- Hinweis: Solche Systeme sind über V.24 nicht netzfähig, da sie Eingabezeichen
+ Hinweis: Solche Systeme sind über V.24 nicht netzfähig, da sie Eingabezeichen
verlieren werden.
- c) Bei der Ansteuerung von #on("i")##on("b")#Harddisks#off("b")##off("i")# sollte man darauf achten, daß die 0-Rou-
- tine 'warte' nicht öfter als notwendig aufgerufen wird. Sonst wird das Paging
+ c) Bei der Ansteuerung von #on("i")##on("b")#Harddisks#off("b")##off("i")# sollte man darauf achten, daß die 0-Rou­
+ tine 'warte' nicht öfter als notwendig aufgerufen wird. Sonst wird das Paging
zugunsten der CPU-intensiven Prozesse zu stark verlangsamt. Z.B. kann man
bei vielen Plattencontrollern auf eine eigene Seek-Phase verzichten:
@@ -2102,44 +2102,44 @@ dann wieder im wesentlichen dem oben beschriebenen Vorgang.
UNTIL fertig PER
Hier braucht die linke Fassung immer mindestens ein 'warte' mehr als die rechte.
- Bei starker CPU Belastung wird sie deshalb bis zu 100 ms länger für das Einlesen
- eines Blocks benötigen.
-
- Eine ähnliche Situation kann auftreten, wenn die Platte in 256-Byte-Sektoren
- unterteilt ist, so daß zu jedem EUMEL-Block zwei Sektoren gehören. Wenn
- möglich sollte dann zwischen diesen beiden Sektoren kein 'warte' aufgerufen
- werden. Andererseits darf natürlich auch nicht längere Zeit CPU-intensiv gewar-
- tet werden. Evtl. lohnt es sich in solchem Fall, mit der Sektorverschränkung zu
+ Bei starker CPU Belastung wird sie deshalb bis zu 100 ms länger für das Einlesen
+ eines Blocks benötigen.
+
+ Eine ähnliche Situation kann auftreten, wenn die Platte in 256-Byte-Sektoren
+ unterteilt ist, so daß zu jedem EUMEL-Block zwei Sektoren gehören. Wenn
+ möglich sollte dann zwischen diesen beiden Sektoren kein 'warte' aufgerufen
+ werden. Andererseits darf natürlich auch nicht längere Zeit CPU-intensiv gewar­
+ tet werden. Evtl. lohnt es sich in solchem Fall, mit der Sektorverschränkung zu
experimentieren.
-
+#page#
#cc("Anhang A: EUMEL-","Debugger ""Info""")#
#goalpage("info")#
-Für interne Testzwecke gibt es den "Info". Systeme "mit Info" und "ohne Info" unterschei-
-den sich nur im EUMEL-0-Teil (Urlader). Der SHard-Implementierer erhält zum Test
-Hintergründe "mit Info" und zur Auslieferung solche "ohne Info". Infofähige Systeme dürfen
+Für interne Testzwecke gibt es den "Info". Systeme "mit Info" und "ohne Info" unterschei­
+den sich nur im EUMEL-0-Teil (Urlader). Der SHard-Implementierer erhält zum Test
+Hintergründe "mit Info" und zur Auslieferung solche "ohne Info". Infofähige Systeme dürfen
nur von den SHard-Implementierern verwendet werden.
- #on("i")##on("b")#Achtung: Infofähige Systeme dürfen auf keinen Fall an Anwender ausgeliefert werden,
- da vermittels Info alle Systemsicherungs- und Datenschutzmaßnahmen un-
- terlaufen werden können.#off("i")##off("b")# *)
+ #on("i")##on("b")#Achtung: Infofähige Systeme dürfen auf keinen Fall an Anwender ausgeliefert werden,
+ da vermittels Info alle Systemsicherungs- und Datenschutzmaßnahmen un­
+ terlaufen werden können.#off("i")##off("b")# *)
#foot#
#f#
-*) Ausnahmen von dieser Regel bedürfen der expliziten Zustimmung der EUMEL-Systemgruppe (GMD bzw. HRZ Bie-
-lefeld) und des jeweiligen Anwenders. Solche System müssen immer durch spezielle Schlüsselworte abgesichert werden.#a##end#
+*) Ausnahmen von dieser Regel bedürfen der expliziten Zustimmung der EUMEL-Systemgruppe (GMD bzw. HRZ Bie­
+lefeld) und des jeweiligen Anwenders. Solche System müssen immer durch spezielle Schlüsselworte abgesichert werden.#a##end#
#b("Aufruf des Info")#
#goalpage("aufrinf")#
-Zum Aufruf des Infos gibt es drei Möglichkeiten:
+Zum Aufruf des Infos gibt es drei Möglichkeiten:
- a) Beim Start des EUMEL-Systems geht man durch Eingabe eines beliebigen Zei-
- chens während des Vortests in den ausführlichen Start-Dialog. Durch Eingabe von
- 'I' gelangt man dann in den Info-Modus. #on("i")#(Diese Möglichkeit wird in dem Startmenü
- nicht aufgeführt.)#off("i")#
+ a) Beim Start des EUMEL-Systems geht man durch Eingabe eines beliebigen Zei­
+ chens während des Vortests in den ausführlichen Start-Dialog. Durch Eingabe von
+ 'I' gelangt man dann in den Info-Modus. #on("i")#(Diese Möglichkeit wird in dem Startmenü
+ nicht aufgeführt.)#off("i")#
b) Man kann den Info durch die ELAN-Prozedur 'ke' aufrufen. D.h. wenn das System
gestartet wurde und sich eine Task am Terminal mit "gib kommando" gemeldet hat,
@@ -2149,26 +2149,26 @@ Zum Aufruf des Infos gibt es drei Möglichkeiten:
durch die Tastenfolge 'i *info*' (*info* meist = CTL d, zur Tastendefinition siehe
"Systemhandbuch, Konfigurierung") in den Info-Modus.
-Alle diese Möglichkeiten funktionieren nur bei infofähigen Systemen.
+Alle diese Möglichkeiten funktionieren nur bei infofähigen Systemen.
-Bei schweren Systemfehlern, die eine Weitermeldung an die höheren Ebenen des
-EUMEL-Systems unmöglich machen, wird soweit möglich ebenfalls der Info aufgerufen. Bei
+Bei schweren Systemfehlern, die eine Weitermeldung an die höheren Ebenen des
+EUMEL-Systems unmöglich machen, wird soweit möglich ebenfalls der Info aufgerufen. Bei
Systemen "ohne Info" wird lediglich eine Meldung auf Kanal 1 ausgegeben und das System
angehalten.
-Bevor das System Infokommandos annimmt, muß mit dem Kommando 'P' ein Paßwort
+Bevor das System Infokommandos annimmt, muß mit dem Kommando 'P' ein Paßwort
eingegeben werden. Lediglich dieses Kommando und das Kommando 'g' werden immer
-angenommen. Das Paßwort kann mit dem Kommando 'yP' eingestellt werden.
+angenommen. Das Paßwort kann mit dem Kommando 'yP' eingestellt werden.
#b("Info-Format")#
#goalpage("forminf")#
-Der Info ist bildschirmorientiert. Beim Aufruf des Infos und nach den meisten Info-Kom-
+Der Info ist bildschirmorientiert. Beim Aufruf des Infos und nach den meisten Info-Kom­
mandos werden die drei obersten Zeilen wie folgt aufgebaut: *)
#foot#
#f#
*) Bildschirmgetreues Verhalten kann der Info allerdings erst nach der Konfigurierung des Kanals zeigen. Vorher (d.h.
-insbesondere beim Aufruf aus dem Vortest heraus) werden Cursorpositionierungen in der Regel nicht korrekt durchgeführt. #a##end#
+insbesondere beim Aufruf aus dem Vortest heraus) werden Cursorpositionierungen in der Regel nicht korrekt durchgeführt. #a##end#
#limit(14.0)#
XYY TEXT
@@ -2179,13 +2179,13 @@ xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
wobei
- X den Miniprozeß bezeichnet, der den Übergang in den Info veranlaßt hat (A=Archiv,
- E=Elan, L=Lader, M=Müllabfuhr),
+ X den Miniprozeß bezeichnet, der den Übergang in den Info veranlaßt hat (A=Archiv,
+ E=Elan, L=Lader, M=Müllabfuhr),
- YY den Maxiprozeß (Task) bezeichnet, der gerade durch den Elan-Prozessor bear-
+ YY den Maxiprozeß (Task) bezeichnet, der gerade durch den Elan-Prozessor bear­
beitet wird (YY ist die hexadezimale Tasknummer),
- TEXT den Grund für den Info-Modus anzeigt,
+ TEXT den Grund für den Info-Modus anzeigt,
Die zweite und dritte Zeile zeigen die Inhalte der 8086/8088-Register an. In der untersten
Zeile erscheint die Eingabeaufforderung 'info:'.
@@ -2194,7 +2194,7 @@ Zeile erscheint die Eingabeaufforderung 'info:'.
#b("Info-Kommandos")#
#goalpage("cmdinf")#
-Info-Kommandos können in der 'info:'-Zeile mit dem Format
+Info-Kommandos können in der 'info:'-Zeile mit dem Format
[<zahl>]<buchstabe>
@@ -2202,19 +2202,19 @@ gegeben werden oder, wenn der Cursor sich im Dump befindet, mit dem Format
<buchstabe>
-wobei dann für <zahl> die der Cursorposition entsprechende Dumpadresse (modulo 2**16)
+wobei dann für <zahl> die der Cursorposition entsprechende Dumpadresse (modulo 2**16)
gesetzt wird (siehe '*cup*').
<zahl> ist immer in Hexaform einzugeben.
-'g' Der Info-Modus wird wieder verlassen. Dies ist allerdings bei harten Fehlern ge-
+'g' Der Info-Modus wird wieder verlassen. Dies ist allerdings bei harten Fehlern ge­
sperrt.
'z' Der Leitblock des angezeigten Maxiprozesses wird dargestellt, falls <zahl> = 0 ist,
- sonst der Leitblock der Task mit der Nummer <zahl>. (Nur im ELAN-Miniprozeß).
+ sonst der Leitblock der Task mit der Nummer <zahl>. (Nur im ELAN-Miniprozeß).
-'q' Die Task mit der Nummer <zahl> wird nach dem nächsten 'g'-Kommando in den
- Info überführt. Dies ist nötig, wenn man sich die Datenräume dieser Task anschauen
+'q' Die Task mit der Nummer <zahl> wird nach dem nächsten 'g'-Kommando in den
+ Info überführt. Dies ist nötig, wenn man sich die Datenräume dieser Task anschauen
will ('s').
's' Dumps werden auf den Datenraum <zahl> eingestellt. (s:=<zahl>)
@@ -2225,7 +2225,7 @@ gesetzt wird (siehe '*cup*').
2 ES-relativ
3 SS-relativ
-'l' Dumps werden auf die Länge <zahl> eingestellt. Desungeachtet kann man einen
+'l' Dumps werden auf die Länge <zahl> eingestellt. Desungeachtet kann man einen
versehentlich zu langen Dump durch eine beliebige Eingabe abbrechen. Dann wird
allerdings '*cup*' gesperrt (siehe unten).
@@ -2239,8 +2239,8 @@ gesetzt wird (siehe '*cup*').
'k' Block <zahl> laden und per Dump anzeigen. Es erfolgt dabei eine Umstellung auf
den Realdatenraum (s=1).
-'P' Paßworteingabe: P<text>*return*
- Erst nach diesem Kommando sind die übrigen Kommandos ausführbar.
+'P' Paßworteingabe: P<text>*return*
+ Erst nach diesem Kommando sind die übrigen Kommandos ausführbar.
'x' Suchen nach Bytekette:
@@ -2250,8 +2250,8 @@ gesetzt wird (siehe '*cup*').
Es wird nach 'text' bzw. Hexafolge 'xx xx ...' bzw. nach der durch das letzte 'x'-
Kommando eingestellten Bytekette gesucht.
- Das Kommando ist durch *return* abzuschließen.
- Die Suche beginnt ab Position 'p' und ist auf die Länge <zahl> Seiten (512
+ Das Kommando ist durch *return* abzuschließen.
+ Die Suche beginnt ab Position 'p' und ist auf die Länge <zahl> Seiten (512
Byte-Einheiten) begrenzt (0=unendlich).
Eine beliebige Eingabe bricht die Suche vorzeitig ab.
@@ -2259,124 +2259,124 @@ gesetzt wird (siehe '*cup*').
Es wird der eingestellte Dump ausgegeben (siehe 's','l','p','w'). Bei wmodus (siehe
'p', 'w') werden Wortadressen ausgegeben.
-'o' Wie '*return*', jedoch wird zuvor p := p+l gesetzt (zum Weiterblättern).
+'o' Wie '*return*', jedoch wird zuvor p := p+l gesetzt (zum Weiterblättern).
'r' Freigabe der anderen Miniprozesse.
- Zunächst werden bei Übergang in den Info alle Miniprozesse gesperrt, um eine Ver-
- fälschung der Fehlersituation zu vermeiden. Bei manchen Kommandos an den Info
- müssen aber andere Miniprozesse u.U. aktiv werden (z.B. beim 'k' der Lader). Wenn
+ Zunächst werden bei Übergang in den Info alle Miniprozesse gesperrt, um eine Ver­
+ fälschung der Fehlersituation zu vermeiden. Bei manchen Kommandos an den Info
+ müssen aber andere Miniprozesse u.U. aktiv werden (z.B. beim 'k' der Lader). Wenn
dies erforderlich ist, meldet der Info:
- 'paging erforderlich'. Man kann dann 'r' geben und das letzte Infokommando wie-
+ 'paging erforderlich'. Man kann dann 'r' geben und das letzte Infokommando wie­
derholen, oder mit anderen Kommandos fortfahren, falls man den Fehlerzustand noch
so beibehalten will.
-'y' Zweitfunktion ausführen.
+'y' Zweitfunktion ausführen.
--> 'yP<text>*return*'
- Neues Paßwort einstellen (max. 9 Zeichen). Dieses wird bei 'shutup' (erst
+ Neues Paßwort einstellen (max. 9 Zeichen). Dieses wird bei 'shutup' (erst
dann!) in Block 0 eingetragen.
--> 'yt' Block <zahl> von Archiv lesen. Dient zum Test des Archivs.
Es wird eine Kachel freigemacht und der Block mit der Nummer <zahl>
eingelesen. Der Inhalt wird sofort angezeigt (wie Kommando 'k').
---> 'yb' Breakpoint an die Adresse <zahl> setzen. Es wird ein INT3 (für Aufruf von
+--> 'yb' Breakpoint an die Adresse <zahl> setzen. Es wird ein INT3 (für Aufruf von
Info) abgesetzt. Info verwaltet gleichzeitig bis zu 10 gesetzte Breakpoints. Die
- Breakpointnummer kann man aus der nach jedem Setzen (und Löschen)
- angezeigten Breakpoint-Tabelle entnehmen. Breakpoints sind nur im Real-
+ Breakpointnummer kann man aus der nach jedem Setzen (und Löschen)
+ angezeigten Breakpoint-Tabelle entnehmen. Breakpoints sind nur im Real­
speicher sinnvoll. Ein Aufruf meldet sich mit TEXT= 'break z--xxxx:yyyy' (z
= Breakpointnummer, xxxx = CS, yyyy = PC beim Aufruf des Breakpoints).
Wird Info mit 'g' verlassen, so stellt er zuvor die alten 8086/8088-Befehle
- wieder her und führt sie an ihrem originalen Ort aus. Direkt danach wird der
+ wieder her und führt sie an ihrem originalen Ort aus. Direkt danach wird der
Breakpoint wieder hergestellt.
---> 'yc' Löscht den Breakpoint an der Adresse <zahl> und stellt die ursprüngli-
- chen Befehle wieder her. In der Breakpoint-Tabelle muß ein Breakpoint an
+--> 'yc' Löscht den Breakpoint an der Adresse <zahl> und stellt die ursprüngli­
+ chen Befehle wieder her. In der Breakpoint-Tabelle muß ein Breakpoint an
dieser Adresse vermerkt sein.
---> 'yw' Zu anderen Miniprozeß wechseln. Nur sinnvoll, wenn ein anderer Mini unter
- 'vor info' aufgeführt ist.
+--> 'yw' Zu anderen Miniprozeß wechseln. Nur sinnvoll, wenn ein anderer Mini unter
+ 'vor info' aufgeführt ist.
--> 'yl' Lernmodus ein (wie beim Editor).
--> 'ye' Ende Lernmodus.
---> 'ya' Ausführen. Die zwischen 'yl' und 'ye' eingegebenen Zeichen werden dem Info
- so vorgesetzt, als kämen sie von der Tastatur.
+--> 'ya' Ausführen. Die zwischen 'yl' und 'ye' eingegebenen Zeichen werden dem Info
+ so vorgesetzt, als kämen sie von der Tastatur.
- Achtung: Rekursion ('ya' im Lernmodus) wird nicht abgefangen. Das Ge-
+ Achtung: Rekursion ('ya' im Lernmodus) wird nicht abgefangen. Das Ge­
lernte wird nach jedem Kommando, das die ersten drei Zeilen
wiederaufbaut (z.B. *return*), in der Zeile vier angezeigt, wobei
- für Steuerzeichen eine Ersatzdarstellung erscheint (%x mit
- x=code (code (zeichen) +code ("A")), also z.B. %M für *re-
+ für Steuerzeichen eine Ersatzdarstellung erscheint (%x mit
+ x=code (code (zeichen) +code ("A")), also z.B. %M für *re­
turn*).
--> 'y *return*'
- Wie *return*, jedoch wird der Dump auch beim Ausführen (ya) ausgegeben.
- (Ein gelerntes *return* führt im Ausführmodus nicht zum Dump).
+ Wie *return*, jedoch wird der Dump auch beim Ausführen (ya) ausgegeben.
+ (Ein gelerntes *return* führt im Ausführmodus nicht zum Dump).
-'*cup*' *) (Cursor up). Umschaltung in den Modus zum Ändern in Dumps.
+'*cup*' *) (Cursor up). Umschaltung in den Modus zum Ändern in Dumps.
#foot#
#f#
-*) Falls der Kanal noch nicht konfiguriert ist, muß man natürlich eine Taste betätigen, die den EUMEL-Code für Cursor
-Up erzeugt. In der Regel ist das CTL c. Falls das Terminal ohne Konfigurierung keine Cursorpositionierungen durchführt, ist
+*) Falls der Kanal noch nicht konfiguriert ist, muß man natürlich eine Taste betätigen, die den EUMEL-Code für Cursor
+Up erzeugt. In der Regel ist das CTL c. Falls das Terminal ohne Konfigurierung keine Cursorpositionierungen durchführt, ist
dieser Modus nicht sehr gut benutzbar.#a##end#
- Der Cursor fährt in den Dump und kann mit den Cursortasten dort bewegt
+ Der Cursor fährt in den Dump und kann mit den Cursortasten dort bewegt
werden. Wird eine Hexazahl jetzt eingegeben, so wird diese als Inhalt des
Bytes eingetragen, auf dem der Cursor gerade steht. Dies funktioniert auch
- auf beliebigen Datenräumen. Info beantragt dann bei der Speicherverwal-
- tung einen Schreibzugriff für die entsprechende Datenraumseite, so daß
- Änderungen mit der Copy-on-Write-Logik erfolgen, also nur taskspezi-
- fisch sind (durch 'q' eingestellt). Für diese Task sind die Änderungen aller-
+ auf beliebigen Datenräumen. Info beantragt dann bei der Speicherverwal­
+ tung einen Schreibzugriff für die entsprechende Datenraumseite, so daß
+ Änderungen mit der Copy-on-Write-Logik erfolgen, also nur taskspezi­
+ fisch sind (durch 'q' eingestellt). Für diese Task sind die Änderungen aller­
dings dann permanent, da sie auch auf den Hintergrund wirken.
- Hinweis: Dumpt man mit 'k' einen Block und ändert dann darin, so sind
- diese Änderungen u.U. nur temporär, da der Info kein Rückschrei-
- ben des Blockes veranlaßt.
+ Hinweis: Dumpt man mit 'k' einen Block und ändert dann darin, so sind
+ diese Änderungen u.U. nur temporär, da der Info kein Rückschrei­
+ ben des Blockes veranlaßt.
- Achtung: Jede Eingabe, die kein Positionierzeichen und kein gültiges Zahl-
+ Achtung: Jede Eingabe, die kein Positionierzeichen und kein gültiges Zahl­
zeichen ist, beendet diesen Modus. Das neue Zeichen wird als
- Info-Kommando aufgefaßt, wobei <zahl> auf die aktuelle
+ Info-Kommando aufgefaßt, wobei <zahl> auf die aktuelle
Adresse gesetzt wird.
- (Für 'yc' / 'yb' sinnvoll: Man setzt den Cursor auf die Stelle, an der
- ein Break ausgelöst werden soll und gibt 'yc'/'yb').
- Somit wird dieser Änderungsmodus üblicherweise durch *return*
+ (Für 'yc' / 'yb' sinnvoll: Man setzt den Cursor auf die Stelle, an der
+ ein Break ausgelöst werden soll und gibt 'yc'/'yb').
+ Somit wird dieser Änderungsmodus üblicherweise durch *return*
beendet.
#b("Einige Systemadressen")#
#goalpage("sysaddr")#
-Der Info nützt nur wenig, wenn man nicht weiß, was man sich anschauen soll. Wesentliche
-Angaben über die Systemstruktur enthält das 'Brikett' (interne Systemdokumentation für
-Projekt Mikros der GMD). Da diese etwas allgemeiner gehalten ist, geht sie nicht auf imple-
-mentationsabhängige Konstanten ein. Diese sind hier aufgeführt.
+Der Info nützt nur wenig, wenn man nicht weiß, was man sich anschauen soll. Wesentliche
+Angaben über die Systemstruktur enthält das 'Brikett' (interne Systemdokumentation für
+Projekt Mikros der GMD). Da diese etwas allgemeiner gehalten ist, geht sie nicht auf imple­
+mentationsabhängige Konstanten ein. Diese sind hier aufgeführt.
-Ab 1s100h liegt die 'ktab'. Sie enthält Informationen, welche Blöcke an welcher Stelle des
+Ab 1s100h liegt die 'ktab'. Sie enthält Informationen, welche Blöcke an welcher Stelle des
Arbeitsspeicher liegen: In der Kachel mit der Adresse 512*i befindet sich der Inhalt des
-Blockes, dessen Nummer in ktab+i, ktab+100h+i steht. Ferner enthält die Tabelle, zu
-welchem Datenraum (drid) und welcher Seite des Datenraums der Inhalt gehört. (Nur rele-
-vant, wenn die Prozeßnummer <> 255 ist).
+Blockes, dessen Nummer in ktab+i, ktab+100h+i steht. Ferner enthält die Tabelle, zu
+welchem Datenraum (drid) und welcher Seite des Datenraums der Inhalt gehört. (Nur rele­
+vant, wenn die Prozeßnummer <> 255 ist).
Steuerbits: 2**0 : Inhalt wird gerade transportiert (zum HG oder Archiv).
2**1 : Inhalt ist identisch mit Inhalt auf HG. Wird beim Schreiben auf die
- Kachel (per Software) zurückgesetzt.
+ Kachel (per Software) zurückgesetzt.
2**2 : Schreiberlaubnis (siehe Brikett).
- 2**3 : Inhalt wurde kürzlich benutzt. Solche Kacheln werden 'weniger stark'
- verdrängt.
+ 2**3 : Inhalt wurde kürzlich benutzt. Solche Kacheln werden 'weniger stark'
+ verdrängt.
ktab frei niederwertige Blocknummer
+80h frei frei Steuerbits
- +100h frei höherwertige Blocknummer
+ +100h frei höherwertige Blocknummer
- +180h frei frei Prozeßnummer
+ +180h frei frei Prozeßnummer
- +200h frei frei drid (prozeßspezifisch)
+ +200h frei frei drid (prozeßspezifisch)
- +280h frei frei Seitennummer (höherw.)
+ +280h frei frei Seitennummer (höherw.)
+300h frei frei Seitennummer (niederw.)
@@ -2385,48 +2385,48 @@ Steuerbits: 2**0 : Inhalt wird gerade transportiert (zum HG oder Archiv).
-- Beginn der Anforderungen
-Der 'Beginn echter Kacheln' hängt von der Größe der 8086/8088-Teile ('urlader') ab (i.A.
-30h < i < 40h).
+Der 'Beginn echter Kacheln' hängt von der Größe der 8086/8088-Teile ('urlader') ab (i.A.
+30h < i < 40h).
-'Beginn der Anforderungen' liegt bei i=2. Es handelt sich um Blocknummern von zu laden-
-den Blöcken. Ist der höherwertige Teil der Blocknummer gleich FDh, so ist dies keine Anfor-
+'Beginn der Anforderungen' liegt bei i=2. Es handelt sich um Blocknummern von zu laden­
+den Blöcken. Ist der höherwertige Teil der Blocknummer gleich FDh, so ist dies keine Anfor­
derung.
-Blocknummern > FF00h stehen für Blöcke mit dem Inhalt 512 FFh's und werden nie auf
+Blocknummern > FF00h stehen für Blöcke mit dem Inhalt 512 FFh's und werden nie auf
dem Hintergrundmedium gespeichert.
-1sA00h enthält den DR-Eintrag des drdr (siehe Brikett).
+1sA00h enthält den DR-Eintrag des drdr (siehe Brikett).
-'musta': Das System fordert Checkpoints und Müllabfuhren über die Zelle 'musta' an. Diese
+'musta': Das System fordert Checkpoints und Müllabfuhren über die Zelle 'musta' an. Diese
findet man mit dem Info durch
xc musta
- (hierfür ist der Text 'musta:' vor der Zelle abgesetzt).
+ (hierfür ist der Text 'musta:' vor der Zelle abgesetzt).
- Die Zelle selbst enthält
+ Die Zelle selbst enthält
- FFh : Keine Müllabfuhr oder Checkpoint
- 01h : Müllabfuhr
+ FFh : Keine Müllabfuhr oder Checkpoint
+ 01h : Müllabfuhr
02h : Checkpoint
03h : beides
04h : Systemendecheckpoint
0Bh : System auf Archiv schreiben ('save system')
- F0h : Müllabfuhr und Checkpoint sind geperrt (nur durch Setzen im Info
- möglich)
+ F0h : Müllabfuhr und Checkpoint sind geperrt (nur durch Setzen im Info
+ möglich)
- Durch Einsetzen der Werte mit dem Info kann die entsprechende Operation ver-
- anlaßt werden. Beim Einsetzen darf der Info nicht im 'r'-Zustand (siehe Eingabe
- 'r') stehen; zum Ausführen der Operation muß 'r' (man bleibt im Info) oder 'g' (Info
+ Durch Einsetzen der Werte mit dem Info kann die entsprechende Operation ver­
+ anlaßt werden. Beim Einsetzen darf der Info nicht im 'r'-Zustand (siehe Eingabe
+ 'r') stehen; zum Ausführen der Operation muß 'r' (man bleibt im Info) oder 'g' (Info
verlassen) gegeben werden.
1s480h-4FFh:
- enthält die Aktivierungstabelle. Ist (480h+i)=01h, so ist die Task i aktiv. Hin-
- weis: 4FFh enthält immer 01h, ohne daß dieser Zelle eine Task zugeordnet ist.
+ enthält die Aktivierungstabelle. Ist (480h+i)=01h, so ist die Task i aktiv. Hin­
+ weis: 4FFh enthält immer 01h, ohne daß dieser Zelle eine Task zugeordnet ist.
#b("Leitblock")#
@@ -2436,11 +2436,11 @@ Mit dem 'z'-Kommando wird der Leitblock einer Task dargestellt. Es werden Hexapa
gefolgt von einer Bezeichnung, ausgegeben. In der folgenden Beschreibung werden die
Hexapaare durch a,b,c dargestellt.
- a b c icount Der virtuelle Befehlszähler der Task steht auf (cMOD4)*
+ a b c icount Der virtuelle Befehlszähler der Task steht auf (cMOD4)*
10000h+b*100h+a = <ic> im Datenraum 4 dieser Task.
Durch die Eingabefolge:
4s<ic>w*return*
- kann man sich den Code, der ausgeführt werden soll, ansehen.
+ kann man sich den Code, der ausgeführt werden soll, ansehen.
Bit 2**7 von c zeigt den Fehlerzustand an.
Bit 2**6 von c zeigt 'disable stop' (siehe Benutzerhandbuch)
@@ -2453,10 +2453,10 @@ Hexapaare durch a,b,c dargestellt.
a b hptop Der Arbeitsheap geht von 30000h (Byteadr.) bis (aMOD16)*
10000h+b* 100h+(aDIV16)*10h (Byteadr!).
- a b channel Die Task hängt an Kanal 100h*b+a (Terminalnummer). 0 =
+ a b channel Die Task hängt an Kanal 100h*b+a (Terminalnummer). 0 =
kein Terminal angekoppelt.
- a b taskid Die Tasknummer der betrachteten Task ist a. (b ist die Ver-
+ a b taskid Die Tasknummer der betrachteten Task ist a. (b ist die Ver­
sionsnummer zum Abdichten von 'send'/ 'wait').
Um den Code, auf den der 'icount' zeigt, zu interpretieren, ziehe man das Brikett zu Rate.
@@ -2467,8 +2467,9 @@ Hinweis: Wenn der Info einen internen Fehler anzeigt, und auch bei 'ke', ist der
'g' erzwingen. (Der Info stellt wegen 'r' dem Interpreter einen Restart zu, der dann
beim 'g' den Leitblock aktualisiert und den Befehl erneut aufsetzt). Tritt dabei der
Fehler nicht wieder auf, handelte es sich um einen transienten Fehler (z.B. der
- Codeblock war noch im Einlesen und ist jetzt voll da). So etwas kann z.B. passie-
- ren, wenn der SHard den Abschluß einer Leseoperation zu früh meldet.
+ Codeblock war noch im Einlesen und ist jetzt voll da). So etwas kann z.B. passie­
+ ren, wenn der SHard den Abschluß einer Leseoperation zu früh meldet.
+
diff --git a/doc/porting-8086/8/source-disk b/doc/porting-8086/8/source-disk
new file mode 100644
index 0000000..8aeb5a2
--- /dev/null
+++ b/doc/porting-8086/8/source-disk
@@ -0,0 +1 @@
+porting/portdoc-x86-8.img
diff --git a/doc/porting-mc68k/1985.11.26/doc/Port.68000 b/doc/porting-mc68k/1985.11.26/doc/Port.68000
new file mode 100644
index 0000000..0ca6840
--- /dev/null
+++ b/doc/porting-mc68k/1985.11.26/doc/Port.68000
@@ -0,0 +1,2173 @@
+#type ("trium8")##limit (12.0)#
+#start(2.0,1.5)#
+#type("triumb36")#
+#free(4.0)#
+ EUMEL
+ Portierungs­
+ handbuch
+ MC68000
+#type("triumb18")#
+#free(1.5)#
+ Stand 26.11.85
+#page(1)#
+#type ("trium8")##limit (12.0)#
+#block#
+#pagelength(18.4)#
+#head#
+#center#- % -
+
+
+#end#
+#type("triumb12")#Inhalt#a#
+
+
+
+Teil 1: Einführung #topage("ein")#
+#free(0.3)#
+ Zweck dieses Handbuchs #topage("zweck")#
+ Referenzliteratur #topage("reflit")#
+ Minimale Hardwarevoraussetzungen #topage("hardw")#
+ Systemdurchsatz #topage("durchsatz")#
+ Softwarekomponenten des EUMEL-Systems #topage("kompo")#
+ Anlieferung des MC68000-EUMEL-Systems #topage("anlief")#
+
+Teil 2: Allgemeine Strukturen #topage("allgem")#
+#free(0.3)#
+ Hintergrund #topage("hg")#
+ Archiv #topage("arch")#
+ Hauptspeicher #topage("speicher")#
+
+Teil 3: SHard-Interface Spezifikation #topage("shardifc")#
+#free(0.3)#
+ 0. Vorbemerkungen #topage("vor")#
+ Zur Notation #topage("not")#
+ Link-Leisten #topage("leist")#
+ Allgemeine Link-Bedingungen #topage("link")#
+ Interrupts #topage("intr")#
+ 1. System laden #topage("laden")#
+ 2. Systemstart und -ende #topage("start")#
+ 3. Speicherverwaltung #topage("spver")#
+ Hauptspeicher #topage("haupt")#
+ Speicherfehler #topage("memerr")#
+ 4. Zeitgeber #topage("zeit")#
+ 5. Kanäle #topage("channel")#
+ 5.1 Stream-IO #topage("stream")#
+ Terminals #topage("term")#
+ Drucker, Plotter #topage("druck")#
+ Exoten #topage("exot")#
+ 5.2 Block-IO #topage("block")#
+ Block-IO bei Hintergrund und Archiv #topage("bhgarch")#
+ 5.3 I/O-Steuerung #topage("iocontrol")#
+ Konfigurierung serieller Schnittstellen #topage("v24")#
+ Flußkontrolle #topage("fluss")#
+ Kalender #topage("kalender")#
+ 6. SHard-Interface Version #topage("shdver")#
+ 7. ID-Konstanten #topage("ID")#
+ 8. Zusätzliche Leistungen #topage("shdelan")#
+ 9. Spezialroutinen #topage("ke")#
+
+Teil 4: Tips zur Portierung #topage("tips")#
+#free(0.3)#
+ Nullversion des SHards #topage("0ver")#
+ Typische Fehler #topage("fehler")#
+ Effizienzprobleme #topage("eff")#
+
+Anhang A: EUMEL-Debugger "Info" #topage("info")#
+#free(0.3)#
+ Aufruf des Infos #topage("aufrinf")#
+ Info-Format #topage("forminf")#
+ Info-Kommandos #topage("cmdinf")#
+ Einige Systemadressen #topage("sysaddr")#
+ Leitblock #topage("pcb")#
+
+Anhang B: Einige EUMEL-Begriffe #topage("glossar")#
+#page#
+#cc("Teil 1: ","Einführung")##goalpage("ein")#
+
+
+#b("Zweck dieses Handbuchs")##goalpage("zweck")#
+
+Dieses Portierungshandbuch wendet sich an diejenigen, die das EUMEL-System auf
+einem neuen Rechnertyp implementieren wollen. Es ist Teil einer Serie von Portierungs­
+handbüchern für verschiedene Prozessortypen. Dieses bezieht sich auf Rechner mit
+MC68000-Prozessoren.
+
+Zum Betrieb eines EUMEL-Systems wird dieses Handbuch nicht benötigt!
+
+
+
+#b("Referenzliteratur")##goalpage("reflit")#
+
+
+ "EUMEL Benutzerhandbuch"
+
+ "EUMEL Systemhandbuch"
+
+ "EUMEL Quellcode der insertierten ELAN-Pakete"
+
+ "MC68000 16-bit microprocessor - Users Manual"
+ Motorola, 1982
+
+ "68000 Assembler Reference"
+ XENIX Group, Microsoft Corp., 1982
+
+ "Anhang zu '68000 Assembler Reference'"
+ TA Nürnberg, 1984
+
+
+Siehe auch die Vorbemerkungen zur Notation in Teil 3 (S. #topage("not")#), sowie die Begriffserklä­
+rungen im Anhang B (S. #topage("glossar")#).
+
+
+#b("Minimale Hardwarevoraussetzungen")##goalpage("hardw")#
+
+Um das EUMEL-System effizient einsetzen zu können, sollte die Hardware mindestens
+folgenden Kriterien genügen:
+
+ #ib#CPU#ie# Die MC68000-CPU sollte mit mindestens 8.0 MHz arbeiten. Falls die
+ Buszugriffe durch einen CRTC o.ä. verlangsamt werden, sollte die
+ echte MC68000-Leistung durchschnittlich mindestens einem unge­
+ bremsten 8.0 MHz System entsprechen.
+ Seltene Verlangsamungen (z.B. nur bei I/O-Operationen) spielen bei
+ diesen Ãœberlegungen keine Rolle.
+
+ RAM Das System sollte über mindestens 256 KByte #ib#Hauptspeicher#ie# verfü­
+ gen.
+
+ #ib#Hintergrund#ie# Als Hintergrundmedium sind #ib#Diskette#ie#, #ib#Platte#ie# und RAM bzw. ROM
+ denkbar.
+
+ Kapazität:
+ > 300 K, besser > 400 K (Single-User)
+ > 750 K, besser > 1000 K (Multi-User)
+
+ Zugriff: *)
+#foot#
+#f#*) Hier ist die durchschnittliche Zugriffszeit auf einen 512 Byte großen Block gemeint. Für Platten und Disketten kann
+man sie als Summe der Positionierzeit über die halbe Anzahl der Spuren und der Zeit einer halben Umdrehung be­
+rechnen.
+#a#
+#end#
+ < 500 ms (Single-User)
+ < 200 ms (Multi-User)
+
+ #ib#Archiv#ie# Als Archiv wird meistens eine Diskette eingesetzt. Aber auch Band
+ oder Kassette sind denkbar. Die Anforderungen an Kapazität und
+ Geschwindigkeit sind anwendungsspezifisch.
+
+ #ib#Bildschirm#ie# Angestrebt werden sollte ein Bildschirm mit 24 Zeilen zu je 80 Zeichen
+ (oder größer). Kleinere Bildschirme sind anschließbar, aber mit 40 Zei­
+ chen pro Zeile läßt sich nicht mehr komfortabel arbeiten.
+ Rollup und freie Cursorpositionierung sind notwendige Voraussetzun­
+ gen, invers-video ist erwünscht, aber nicht notwendig. Weiterhin
+ werden die Funktionen 'Löschen bis Zeilenende' und 'Löschen bis
+ Schirmende' benötigt.
+
+ #ib#Tastatur#ie# An Steuertasten sollten mindestens ESC und die vier Cursortasten
+ vorhanden sein. Dabei ist es günstig, wenn die Cursortasten ergono­
+ misch als Block bzw. Kreuz angeordnet sind. EUMEL benötigt weitere
+ Steuertasten für HOP, RUBIN, RUBOUT und MARK. Dafür können
+ beliebige, anderweitig nicht benötigte Tasten der Tastatur gewählt
+ werden.
+
+
+
+#b("Systemdurchsatz")##goalpage("durchsatz")#
+
+Da das EUMEL-System auf dem Prinzip des Demand Paging aufbaut, hängt der System­
+durchsatz von
+
+ - CPU Leistung
+ - Speichergröße (RAM)
+ - Geschwindigkeit beim Hintergrundzugriff (Diskette, Platte)
+
+ab. Mit zunehmender Benutzerzahl steigen in der Regel die Anforderungen an das Paging
+(Hintergrund-Zugriff) schneller als an die CPU. In diesem Bereich kann man die System­
+leistung dann durch mehr Speicher und/oder eine schnellere Platte in größerem Umfang
+steigern. Dabei läßt sich eine langsame Platte teilweise durch mehr RAM und umgekehrt
+wenig RAM durch eine schnelle Platte ausgleichen.
+
+
+
+#b("Softwarekomponenten des EUMEL-Systems")##goalpage("kompo")#
+
+Das EUMEL-System besteht aus mehreren Schichten:
+
+
+ EUMEL  2: Standardpakete, Editor, ...
+
+ EUMEL  1: ELAN Compiler
+
+ EUMEL  0: Systemkern (EUMEL-0-Maschine, EUMEL-0)
+
+ EUMEL -1: SHard
+
+ H a r d w a r e
+
+
+Dieses #ib#Schichtenmodell#ie# ist nach oben offen und kann deshalb um beliebig viele (höhere)
+Schichten erweitert werden.
+
+EUMEL > 0 Die Standardsoftware der Schichten > 0 ist in der Sprache ELAN ge­
+ schrieben (siehe "EUMEL Quellcode"). Dementsprechend sind alle Schich­
+ ten oberhalb der EUMEL-0-Maschine prozessor- und rechnerunabhän­
+ gig, d.h. Anpassungen an einen neuen Rechnertyp sind nicht erforderlich.
+
+EUMEL   0 Die sogenannte "EUMEL-0-Maschine" enthält alle Basisoperationen und
+ hängt davon ab, welchen Prozessortyp der Rechner als CPU verwendet. Sie
+ existiert für verschiedene Prozessortypen. Hier wird nur auf den Typ
+ MC68000 Bezug genommen. Bei der Portierung auf einen MC68000-
+ Rechner wird die MC68000-EUMEL-0-Maschine ohne Anpassungen (!)
+ übernommen.
+
+EUMEL  -1 Diese Schicht stellt das Interface zwischen der EUMEL-0-Maschine und
+ der eigentlichen Hardware (vom Prozessor abgesehen) dar. Insbesondere
+ umfaßt sie alle Routinen zur Ansteuerung peripherer Geräte (Gerätetreiber).
+ Diese Schicht wird "SHard" genannt ("S"oftware-"Hard"ware Interface).
+
+Der SHard ist der einzige Teil des Systems, der bei der Portierung auf einen MC68000-
+Rechner angepaßt bzw. neu geschrieben werden muß. Deshalb besteht der größte Teil
+dieses Handbuchs aus der Spezifikation des MC68000-SHards.
+
+
+
+#b("Anlieferung des MC68000-EUMEL-Systems")##goalpage("anlief")#
+
+Der Implementierer erhält die EUMEL-Software auf Disketten. Dabei stehen folgende
+Standardformate zur Wahl:
+
+ Diskette 200 (8"), 1D, 77 Spuren, 16 Sektoren (\#0...\#15) zu 512 Byte
+
+ Diskette 130 (5.25"), 2D, 40 Spuren, 9 Sektoren (\#1...\#9) zu 512 Byte *)
+#foot#
+#f#*) 48 tpi
+#a#
+#end#
+
+
+Die Diskettenlieferung **) enthält
+#foot#
+#f#**) Zu Inhalt und Zweck der angelieferten Disketten siehe EUMEL Systemhandbuch, Teil 1: System einrichten.
+#a#
+#end#
+
+ - Single-User Hintergrund
+ - Multi-User Hintergrund
+ - Standardarchive
+ - ggfs. Archive mit weiterer Anwendersoftware (installationsspezifisch)
+
+Dabei enthält der Hintergrund auch die EUMEL-0-Maschine (oft auch als "Urlader"
+bezeichnet).
+
+#on("i")#Bitte gehen Sie vorsichtig mit diesen Mutterdisketten um. Verwenden Sie sie nur als
+Quelle beim Kopieren. Sie sollten nur auf Kopien davon arbeiten!#off("i")#
+#page#
+#cc("Teil 2: ","Allgemeine Strukturen")##goalpage("allgem")#
+
+
+#b("Hintergrund")##goalpage("hg")#
+
+Der Hintergrund ist in 512 Bytes große Blöcke unterteilt. Sie werden durch Blocknummern
+(0, 1, 2, ...) adressiert. Die physische Ablage der Blöcke auf dem Hintergrundmedium
+bleibt dem SHard überlassen. Er kann sie z.B. linear oder versetzt anordnen. Man sollte
+darauf achten, daß Positionierungen auf logisch "nahe" Blöcke möglichst schnell gehen
+sollten. Deshalb ist in der Regel zylinderorientierte Anordnung der oberflächenorientierten
+vorzuziehen.
+
+Falls auf dem Hintergrundmedium spezielle Blöcke z.B. für Bootstrap und SHard freige­
+halten werden sollen, muß das bei der Abbildung der Hintergrundblocknummern auf die
+Sektoren der Diskette bzw. der Platte berücksichtigt werden.
+
+Aufbau des Hintergrundes:
+
+ Block 0 Systemetikett
+
+ Block 10...10+k-1 EUMEL-0-Maschine (z.Zt. ist k=200; dieser Wert ist nur
+ für EUMEL-0 von Bedeutung)
+
+ Block 1...9, 10+k ... Paging-Bereich
+
+
+Aufbau des #ib#Systemetikett#ie#s (#ib#Block 0#ie#):
+
+ Byte Wert/Aufgabe
+
+ 0...5 "EUMEL-"; Kennzeichen für EUMEL-Hintergrund.
+ 6...11 Versionsnummer in druckbaren Zeichen. Sie stellt sicher, daß System-
+ kern und Hintergrund kompatibel sind.
+ 12 zur Zeit ohne Bedeutung
+ 13 enthält Wert 0 , wenn System im Shutupzustand ist.
+ 14..15 Systemlaufzähler (14=low, 15=high). Wird bei jedem Systemstart um 1
+ erhöht.
+ 16..35 Reserviert; zur Zeit ohne Bedeutung
+ 36..37 Aus historischen Gründen für interne Zwecke belegt.
+ 38..69 Hier kann eine Installationsnummer geführt werden.
+ 70..79 Info-Paßwort
+ 80 =0 Normalzustand
+ =1 Kompresslauf erforderlich (System frisch von Archiv geladen)
+ 81...255 Reserviert.
+ 256..511 Kann von SHard beliebig verwendet werden.
+
+
+
+#b("Archiv")##goalpage("arch")#
+
+Wie der Hintergrund, sind die Archive in 512 Bytes große Blöcke unterteilt *). Bisher gibt
+es folgende #d("Standardformate")#:
+#foot#
+#f#*) Der genaue Aufbau der Archivblöcke ist weder für den SHard-Implementierer, noch für den Benutzer von Be­
+deutung. SHard hantiert nur mit Blöcken aufgrund von Blocknummern, unabhängig vom Inhalt der Blöcke. Der Benut­
+zer "sieht" nur Datenräume bzw. Dateien, unabhängig von ihrem Format auf dem Archiv.
+#a#
+#end#
+
+
+ Diskette 200 (8"), 1D, 77 Spuren, 16 Sektoren (\#0...\#15) zu 512 Byte
+ Diskette 200 (8"), 2D, 77 Spuren, 16 Sektoren (\#0...\#15) zu 512 Byte
+
+ Block Seite Spur Sektor
+
+ 0 0 0 0
+ 16 0 1 0
+ 77*16 1 0 0
+
+ n n DIV (77*16) n MOD (77*16) DIV 16 n MOD 16
+
+
+ Diskette 130 (5.25"), 2D, 40 Spuren, 9 Sektoren (\#1...\#9) zu 512 Byte
+
+ Block Seite Spur Sektor
+
+ 0 0 0 1
+ 9 0 1 1
+ 40*9 1 0 1
+
+ n n DIV (40*9) n MOD (40*9) DIV 9 n MOD 9 + 1
+
+
+ Diskette 130 (5.25"), 2D, 80 Spuren, 9 Sektoren (\#1...\#9) zu 512 Byte
+
+ Block Seite Spur Sektor
+
+ 0 0 0 1
+ 9 0 1 1
+ 80*9 1 0 1
+
+ n n DIV (80*9) n MOD (80*9) DIV 9 n MOD 9 + 1
+
+
+ Diskette 130 (5.25"), HD, 80 Spuren, 15 Sektoren (\#1...\#15) zu 512 Byte
+
+ Block Seite Spur Sektor
+
+ 0 0 0 1
+ 15 0 1 1
+ 80*15 1 0 1
+
+ n n DIV (80*15) n MOD (80*15) DIV 15 n MOD 15 + 1
+
+
+Selbstverständlich können auch andere #ib#Archivformate#ie# implementiert werden, falls das aus
+Hardwaregründen notwendig ist oder sich dadurch wesentliche Verbesserungen (z.B. in
+der Kapazität) ergeben.
+
+Wenn irgend möglich sollte aber mindestens eines der oben aufgeführten Standardformate
+unterstützt werden - evtl. als zusätzliches Format -, um den Austausch zwischen ver­
+schiedenen Rechnertypen zu vereinfachen.
+
+#on("i")#Hinweis: Um den Datenaustausch zwischen verschiedenen Rechnertypen zu vereinfa­
+ chen, sollten möglichst alle hardwaremäßig möglichen Standardformate (min­
+ destens lesend) unterstützt werden. Dabei sollte SHard sich automatisch auf
+ das Format der jeweils eingelegten Diskette einstellen:#off("i")#
+
+
+ Laufwerkstyp Diskettentyp(en)
+
+ 8" 1D 8" 1D
+ 8" 2D 8" 2D, 1D
+
+ 5" 2D-40 5" 2D-40
+ 5" 2D-80 5" 2D-80, 2D-40 *)
+ 5" HD-80 5" HD-80, 2D-80, 2D-40 *)
+
+#foot#
+#f#*) Bei der Behandlung von 40-Spur-Disketten auf 80-Spur-Laufwerken gelten meistens folgende Regeln:
+ a) Lesen funktioniert sicher.
+ b) Schreiben ist unsicher, funktioniert aber häufig.
+ c) Formatieren funktioniert fast nie.
+#a#
+#end#
+
+
+
+#b("Hauptspeicher")##goalpage("speicher")#
+
+Der #ib#Speicher#ie# wird EUMEL-0 vom SHard in maximal vier Speicherbereichen (M0...M3)
+zugewiesen. Die Anfangsadresse eines solchen Bereiches muß ein Vielfaches von 512B
+sein. M0 muß immer vorhanden sein, M1, M2 und M3 nur in speziellen Betriebsarten:
+
+ #d("M0")# #on("b")#allgemeines #ib#RAM#ie(1,", allgemeines")##off("b")#
+ Dieser Bereich muß immer vorhanden sein. Bei den meisten Rechnern liegt der
+ Systemkern nicht in einem ROM, sondern wird von SHard in das RAM geladen.
+ Das geschieht dann an den Anfang von M0. Der Rest wird für Tabellen und als
+ Pagingbereich benutzt. M0 umfaßt deshalb meistens allen verfügbaren Spei­
+ cher, bis auf den Platz für SHard, Boot-ROM und Bildwiederholspeicher. **)
+#foot#
+#f#**) Der im Tabellenspeicher liegende 'ktab' ist für die Verwaltung von max. 2048 Kacheln (=1MB) ausgelegt. Der
+Speicherbedarf des Systemkerns liegt bei 80KB, für Tabellen werden 40KB benötigt. Dies sollte man bei der Angabe
+von M0SIZE berücksichtigen.
+#a#
+#end#
+
+ #d("M1")# #on("b")#Systemkern-#ib#ROM#ie(1,", Systemkern")##off("b")#
+ Gibt es nur bei Rechnern, die den Systemkern in einem ROM haben. (M0 wird
+ dann nur für Tabellen und als Pagingspeicher eingesetzt.)
+
+ #d("M2")# #on("b")#Hintergrund-#ib#ROM#ie(1,",Hintergrund")##off("b")#
+ Gibt es nur bei Rechnern, die nicht Diskette oder Platte sondern ROM und
+ RAM als Hintergrundspeicher verwenden.
+
+ #d("M3")# #on("b")#Hintergrund-#ib#RAM#ie(1,",Hintergrund")##off("b")#
+ Gibt es nur bei Rechnern, die nicht Diskette oder Platte sondern ROM und
+ RAM oder RAM allein als Hintergrundspeicher verwenden.
+
+Damit sind drei verschiedene Betriebsarten des EUMEL-Systems möglich:
+
+ #d("Normalbetrieb")#: M0 (> 256 KB)
+ Hintergrundgerät (Platte oder Diskette)
+ Archivgerät (Diskette)
+
+ Im Normalbetrieb befindet sich der Hintergrund auf einer Platte oder Diskette
+ RAM wird für den Systemkern und zum Paging eingesetzt. Alle mittleren und
+ größeren Systeme verwenden den Normalbetrieb.
+
+
+ #d("Minibetrieb")#: M0 (> 256 KB)
+ M3 (mindestens 300 KB)
+ Archivgerät (Diskette)
+
+ Im Minibetrieb wird RAM als Hintergrundspeicher eingesetzt. Dieser wird beim
+ Einschalten über das Archivgerät geladen und beim Abschalten ('shutup')
+ wieder zurückgeschrieben.
+
+
+ #d("ROM-Betrieb")#: M0 (>40 KB)
+ M1 (>60 KB)
+ M2 (>170 KB)
+ M3 (>60 KB)
+ Archivgerät (Kassettenrecorder oder Diskettenlaufwerk)
+
+ Im ROM-Betrieb stehen Systemkern und Standardteil des Hintergrundes im
+ ROM. Der übrige Hintergrund befindet sich im RAM. *)
+#foot#
+#f#*) Für ROM-Betrieb benötigt man eine Spezialversion des Systemkerns.
+#a#
+#end#
+
+#page#
+#cc("Teil 3: SHard ","Interface Spezifikation")##goalpage("shardifc")#
+
+
+#bb("0. ","Vorbemerkungen")##goalpage("vor")#
+
+
+#b("Zur Notation")##goalpage("not")#
+
+Im folgenden wird zwischen #d("0-Routinen")#, die dem SHard vom EUMEL-0-System zur
+Verfügung gestellt werden, und
+#d("SHard-Routinen")# unterschieden, die der SHard implementieren muß. Damit dieser Unter­
+schied bei der Spezifikation deutlich wird, werden 0-Routinen folgendermaßen aufgeführt:
+
+ name (0-Routine)
+
+Zusätzlich werden 0-Routinen grundsätzlich klein und SHard-Routinen groß geschrie­
+ben.
+
+MC68000-Befehle werden wie im "Anhang zu '68000 Assembler Reference'", (TA, 1984)
+notiert:
+
+ moveq \#27,d0
+ addw d3,d1
+
+
+Hexadezimale Zahlen werden durch ein vorangestelltes '/' gekennzeichnet:
+
+ /12 = 18
+ /1f = 31
+ /ffff = 65535
+
+
+Achtung: Die Ãœbergabe von Integer-Parametern zwischen SHard und EUMEL-0 erfolgt
+ grundsätzlich in den niederwertigen 16 Bits des jeweils angegebenen Daten­
+ registers.
+
+#b("Link-Leisten")##goalpage("leist")#
+
+Die Verbindung zwischen SHard und EUMEL-0 erfolgt über zwei Tabellen. In der
+"0-Leiste" stellt EUMEL-0 dem SHard verschiedene 0-Routinen zur Verfügung. Diese
+Leiste beginnt an der Adresse M0 (im Normal- oder Minimodus) bzw. M1 (im ROM-
+Modus):
+
+ Adresse Assemblerbefehl
+
+ M0 + 0 eumel0id: .ascii "EUMEL jj-mm-tt  " !Kennung mit Datum
+ +16 eumel0blocks: .word ... !Anzahl EUMEL0-Bloecke auf HG
+ +18 hgver: .word 173 !HG-Versionsnummer
+ +20 cputype: .word 4 !MC68000 oder kompat. CPU
+ +22 eumel0ver: .word mmmtt !EUMEL0-Version (mmm=1 --> Jan.84)
+ +24 shdvermin: .word 8 !Minimum bzw. Maximum fuer die
+ +26 shdvermax: .word 8 ! SHard-Versionsnummer
+ +28 systemstart: jmp ... !Ab hier stehen Sprungbefehle zu
+ +34 inputinterrupt: jmp ... ! den entsprechenden 0-Routinen
+ +40 timerinterrupt: jmp ...
+ +46 warte: jmp ...
+ +52 shutup: jmp ...
+ +58 info: jmp ...
+
+
+Für die Gegenrichtung muß SHard der 0-Maschine die "SHard-Leiste" zur Verfügung
+stellen:
+
+ Adresse Assemblerbefehl
+
+SHDID+ 0 SHDID: .ascii "SHARD jj-mm-tt  " !Kennung mit Datum
+ +16 SHDVER: .word 8 !Versionsnummer d. SHard-Schnittstelle
+ +18 MODE: .word !Modusbits:
+ BITEUDEL = 0 ! EUMEL-0-Bloecke auf HG freigeben
+ BITNORMAL = 1 ! Normalbetrieb
+ BITMINI = 2 ! Minibetrieb
+ BITROM = 3 ! ROM-Betrieb
+ +20 ID4: .word !ID-Konstanten (s.S. #topage("ID")#)
+ +22 ID5: .word ! dito
+ +24 ID6: .word ! dito
+ +26 ID7: .word ! dito
+ +28 OUTCHAR: jmp !Ab hier stehen Sprungbefehle in die
+ +34 OUTPUT: jmp ! entsprechenden SHard-Routinen
+ +40 BLOCKIN: jmp
+ +46 BLOCKOUT: jmp
+ +52 IOCONTROL: jmp
+ +58 SYSEND: jmp
+ +64 SYSABORT: jmp
+ +70 M0START: .long !Startadr bzw.
+ +74 M0SIZE: .long ! Länge (in Bytes) des Bereiches M0
+ +78 M1START: .long ! dito f. M1
+ +82 M1SIZE: .long
+ +86 M2START: .long ! dito f. M2
+ +90 M2SIZE: .long
+ +94 M3START: .long ! dito f. M3
+ +98 M3SIZE: .long
+
+
+
+#b("Allgemeine Link-Bedingungen")##goalpage("link")#
+
+In der Regel sind sowohl 0-Routinen als auch SHard-Routinen durch 'jbsr' aufzurufen:
+
+ jbsr <routine>
+
+Ausnahmen von dieser Regel sind im folgenden stets besonders vermerkt.
+
+Generelle Link-Bedingung (für SHard- und 0-Routinen) ist:
+
+ Alle Register - bis auf die jeweils spezifizierten Ausgangsparameter und die 'condi­
+ tion code'-Flags im Status Register *) - bleiben unverändert.
+#foot#
+#f#*) Condition-Code-Flags sind i.a. nach dem Aufruf einer Routine undefiniert. Ausnahmen sind natürlich die Flags,
+die als Ausgangsparameter in manchen Fällen definiert sind.
+#a#
+#end#
+
+Jede SHard-Routine muß also alle Register, die sie verändert und die keine Ausgangs­
+parameter sind, retten und wiederherstellen. Im Gegenzug braucht SHard beim Aufruf von
+0-Routinen selbst keine Register zu retten.
+
+
+
+#b("Interrupts")##goalpage("intr")#
+
+Zwei externe Ereignisse (Zeitgeber und Eingabe, siehe S.#topage("zeit")# und S.#topage("inp")#) werden von
+EUMEL-0 behandelt. Die entsprechenden Interrupts muß SHard per 'jbsr' an 0-Routinen
+weiterleiten.
+Die Register (bis auf die Parameterregister) werden von den aufzurufenden 0-Routinen
+selbst gesichert. Die normale Interrupt-Sequenz im SHard sieht dann folgendermaßen
+aus:
+
+ intadr:  movl d0,(sp)-
+ movw <parameter>,d0
+ jbsr <routine>
+ andw \#/fcff,sr ! interrupt level freigeben
+ movl (sp)+,d0
+ rti
+
+Achtung: SHard muß die Interrupt-Routinen im 'disable-int'-Modus anspringen, d.h. im
+ Status Register muß der korrekte Interrupt-Level gesetzt sein. (MC68000 setzt
+ beim Interrupt schon automatisch die Interrupt-Level-Flags.)
+
+
+
+
+
+#bb("1. System ","laden")##goalpage("laden")#
+
+SHard muß die EUMEL-0-Software vor dem eigentlichen Start an den Anfang des Spei­
+cherbereiches M0 laden. EUMEL-0 befindet sich auf dem Hintergrund von Block 10 ab.
+Der erste Block von EUMEL-0 enthält am Anfang die 0-Leiste. Dort steht an der
+Byteadresse 16 die Größe 'eumel0blocks'. Sie gibt an, wieviel Blöcke konsekutiv geladen
+werden müssen. Hat sie beispielsweise den Wert 80, müssen die Blöcke 10 bis 89 gela­
+den werden.
+
+ Achtung: Zu diesem Zeitpunkt kann SHard die oben aufgeführten 0-Routinen natür­
+ lich noch nicht benutzen. Insbesondere dürfen die Laderoutinen nicht
+ 'warte' aufrufen. Das wird hier besonders betont, weil der Hintergrundzugriff
+ beim eigentlichen Systemlauf in der Regel 'warte' verwenden wird.
+
+ Hinweis: Der erste Block von EUMEL-0 enthält in den ersten fünf Bytes den Text
+ "EUMEL", um eine Identifikation durch den SHard-Lader zu ermöglichen.
+
+Es wird empfohlen, nach folgendem Verfahren zu laden:
+
+ IF archivgeraet enthaelt diskette AND eumel 0 auf archiv
+ THEN lade eumel 0 vom archiv
+ ELIF eumel 0 auf hintergrund
+ THEN lade eumel 0 vom hintergrund
+ ELSE laden unmoeglich
+ FI .
+
+So kann man auch bei einem frisch formatierten Hintergrundmedium einen neuen Hinter­
+grund (mit EUMEL-0) einspielen, indem man ein Hintergrundarchiv vor dem Systemstart
+in das Archivgerät legt. Dann wird EUMEL-0 von dort geladen, so daß man den Hinter­
+grund dann wie im Systemhandbuch beschrieben vom Archiv auf das Hintergrundmedium
+kopieren kann.*)
+#foot#
+#f#*) Kopiervorgänge (Archiv -> Hintergrund) werden von EUMEL-0 erledigt, so daß SHard keine derartigen Routinen
+enthalten muß.
+#a#
+#end#
+
+
+
+
+#bb("2. System","start und -ende")##goalpage("start")#
+
+SHard muß alle für den Rechner notwendigen (Hardware-) Initialisierungen durchführen
+und erst danach die EUMEL-0-Maschine starten ('systemstart').
+
+ #d("systemstart")# (0-Routine)
+
+ Eingang: a0 = Adresse der SHard-Leiste
+
+ Aufruf: jmp systemstart
+
+ Zweck: Die EUMEL-0-Maschine wird gestartet. Alle notwendigen Hard­
+ wareinitialisierungen (z.B. der Peripheriebausteine) müssen vorher
+ schon geschehen sein.
+
+ Hinweis: SHard muß den Stackpointer (a7) "vorläufig" definieren (etwa 100
+ Langworte reichen dafür aus), da beim Sprung in EUMEL-0 Inter­
+ rupts auftreten können.
+
+
+
+ #d("SYSEND")#
+
+ Parameter: -
+
+ Zweck: Hiermit wird SHard das Ende eines Systemlaufs mitgeteilt. Somit
+ können evtl. notwendige Abschlußbehandlungen durchgeführt
+ werden. SHard kann mit 'rts' zu EUMEL-0 zurückkehren, muß
+ aber nicht. Diese Routine kann z.B. dazu benutzt werden, die
+ Hardware auszuschalten oder in ein umgebendes System zurück­
+ zukehren (EUMEL als Subsystem). In den meisten Fällen wird die
+ Routine leer implementiert werden, d.h. nur aus 'rts' bestehen.
+
+
+
+
+#bb("3. ","Speicherverwaltung")##goalpage("spver")#
+
+
+#b("Hauptspeicher")##goalpage("haupt")#
+
+Der Hauptspeicher umfaßt die Teile des MC68000-Speichers, die EUMEL-0 verwalten
+darf.
+
+
+
+#b("Speicherfehler")##goalpage("memerr")#
+
+Falls die Hardware Speicherfehler aufgrund von Paritybits, ECC oder ähnlichem feststellen
+und an SHard melden kann, sollte das zur Erhöhung der Systemsicherheit genutzt wer­
+den.
+
+Wenn SHard (z.B. über Interrupt) einen Speicherfehler mitgeteilt bekommt, sollte er, wenn
+möglich, eine entsprechende Meldung ausgeben und das System anhalten:
+
+ basta: jra basta
+
+
+Wenn Speicherfehler mit Sicherheit bemerkt werden, verhindert diese Reaktion, daß die
+Fehler auf dem Hintergrund festgeschrieben werden und evtl. später zu Systemfehlern
+führen.
+
+Der Anwender kann dann durch Hardware-Reset auf den letzten Fixpunkt des EUMEL-
+Systems zurücksetzen. So verliert er zwar evtl. die letzten Minuten seiner Arbeit, behält
+aber auf alle Fälle ein konsistentes System.
+
+
+
+
+#bb("4. ","Zeitgeber")##goalpage("zeit")#
+
+SHard muß einen Zeitgeberinterrupt erzeugen, der ca. 10 bis 100 mal pro Sekunde auftritt.
+Dabei ist die 0-Routine 'timerinterrupt' aufzurufen. Ohne diesen Interrupt wird die Uhr
+nicht geführt, und die Zeitscheibenlogik für das Timesharing fällt aus.
+
+ #d("timerinterrupt")# (0-Routine)
+
+ Eingang: d0 = seit letztem Zeitgeberinterrupt vergangene Zeit (in ms)
+
+ Zweck: Wird von EUMEL-0 für interne Uhren und für das Scheduling
+ (Zeitscheibenlogik) verwendet. Es werden keine hohen Genauig­
+ keitsanforderungen an die Zeitangaben bei #on("i")#einzelnen#off("i")# Interrupts
+ gestellt. Um EUMEL-0 eine genaue Realzeituhr zu ermöglichen,
+ sollte die so erzeugte Zeitangabe #on("i")#im Mittel#off("i")# aber möglichst genau
+ sein, d.h. die Summe der innerhalb einer Minute so übergebenen
+ Werte sollte zwischen 59995 und 60005 liegen.
+
+
+
+
+#bb("5. ","Kanäle")##goalpage("channel")#
+
+Einiges zum Kanalkonzept:
+
+Das System kennt die Kanäle 0..32.
+
+ Kanal 0 ist der Systemhintergrund.
+ Kanäle 1..15 sind für Stream-IO (Terminals, Drucker, ...) vorgesehen.
+ Kanal 31 ist der Standard-Archivkanal.
+ Kanal 32 ist der Parameterkanal.
+
+Die Kanäle 2..30 können installationsabhängig verfügbar sein oder auch nicht. Deren
+Funktion ist dann Absprachesache zwischen Installation und SHard.
+
+Kanäle können über Block-IO (BLOCKOUT, BLOCKIN) oder Stream-IO (OUTPUT,..)
+angesprochen werden. Das System erfährt über IOCONTROL, welche Betriebsart des
+Kanals sinnvoll ist.
+
+#on("i")##on("b")#Achtung: Alle Kanaloperationen müssen grundsätzlich für alle Kanäle (0...32) aufgerufen
+ werden können. Dabei können Operationen auf nicht vorhandenen Kanälen und
+ unsinnige Operationen (z.B. Stream-IO auf Kanal 0) leer implementiert werden.#off("b")#
+ (Dafür werden im folgenden bei jeder SHard-Routine Vorschläge gemacht.)#off("i")#
+
+
+
+#bb("5.1 ","Stream-IO")##goalpage("stream")#
+
+Über Stream-IO wickelt das System die übliche zeichenorientierte Ein-/Ausgabe auf Ter­
+minals, Druckern, Plottern usw. ab. Stream-IO wird nur für die Kanäle 1...15 gemacht.
+
+ #d("inputinterrupt")# (0-Routine)#goalpage("inp")#
+
+ Aufruf: movl kanalnummer,(sp)- !1...15
+ movl zeichen,(sp)- !rechtsbündig
+ jbsr inputinterrupt
+ lea 8(sp),sp !restore stackpointer
+
+ Zweck: SHard muß EUMEL-0 durch Aufruf dieser Routine mitteilen, daß
+ eine Eingabe vorliegt.
+
+ Hinweise: EUMEL-0 puffert die Zeichen. EUMEL-0 signalisiert den Zustand
+ "Puffer voll" durch IOCONTROL "stop" und ignoriert weitere
+ Eingaben, bis wieder Platz im Puffer vorhanden ist. (siehe
+ IOCONTROL "stop" und "weiter", S.#topage("weiter")#)
+
+ Bei Kanalnummern <1 oder >15 wird der Aufruf von EUMEL-0
+ ignoriert.
+
+ Falls die Hardware keine Inputinterrupts zur Verfügung stellt, sollte
+ ein Timer benutzt werden, um alle möglichen Inputquellen regel­
+ mäßig abzufragen. Dabei muß man allerdings den goldenen Mittel­
+ weg zwischen zu häufiger (Systemdurchsatz sinkt) und zu seltener
+ Abfrage (Zeichen gehen verloren) suchen. Man sollte dabei nicht
+ nur an die menschliche Tippgeschwindigkeit sondern auch an die
+ höchste Baudrate denken, die man für Rechnerkopplungen noch
+ unterstützen will. *)
+
+#foot#
+#f#*) Eine weitere Möglichkeit, auf manchen Kanälen ohne Interrupts auszukommen, wird bei der IOCONTROL-Funk­
+tion "weiter" beschrieben (siehe S.#topage("weiter")#).
+#a#
+#end#
+
+Achtung: #on("i")#Keinesfalls darf 'inputinterrupt' rekursiv aufgerufen werden. Nor­
+ malerweise wird das automatisch verhindert, wenn man den
+ zugehörigen Hardwareinterrupt erst nach der 0-Routine wieder
+ freigibt. Falls das nicht möglich ist und unter bestimmten Umstän­
+ den das nächste Zeichen abgeholt werden muß, bevor die
+ 0-Routine beendet ist, muß SHard einen eigenen Puffer imple­
+ mentieren:#off("i")#
+
+ hardwareinterrupt:
+ IF input interrupt aktiv
+ THEN trage zeichen in shard puffer ein;
+ gib hardware interrupt frei
+ ELSE input interrupt aktiv := true;
+ gib hardware interrupt frei;
+ input interrupt;
+ disable interrupt;
+ WHILE shard puffer enthaelt noch zeichen
+ REP nimm zeichen aus shard puffer;
+ enable interrupt;
+ input interrupt;
+ disable interrupt
+ PER;
+ input interrupt := false;
+ enable interrupt
+ FI.
+
+
+ #d("OUTPUT")#
+
+ Eingang: d0 = Kanalnummer (1...15)
+ d2 = Anzahl auszugebender Zeichen
+ a0 = Adresse der Zeichenkette
+ Ausgang: d2 = Anzahl der übernommenen Zeichen
+
+ Zweck: Ausgabe einer Zeichenkette. Diese ist (möglichst ganz) zwischen­
+ zupuffern, denn die Ausführung von OUTPUT sollte kein Warten
+ auf IO enthalten. Der Ausgabepuffer muß mindestens 50 Zeichen
+ fassen können. Durch eine Interruptlogik oder etwas Äquivalentes
+ ist sicherzustellen, daß dieser Puffer parallel zur normalen Verar­
+ beitung ausgegeben wird. Wenn die auszugebende Zeichenkette
+ nicht vollständig in den Puffer paßt, sollten trotzdem so viele
+ Zeichen wie möglich übernommen werden. Im weiteren Verlauf ruft
+ EUMEL-0 dann wieder OUTPUT mit dem Rest der Zeichenkette
+ auf.
+
+
+ Achtung: #on("i")#Keinesfalls darf innerhalb von OUTPUT die 0-Routine 'warte' auf­
+ gerufen werden.#off("i")#
+
+ Vorschlag: Falls der Kanal nicht existiert bzw. OUTPUT darauf unsinnig ist,
+ sollte vorgegaukelt werden, alle Zeichen seien ausgegeben (d2
+ unverändert).
+
+
+
+ #d("OUTCHAR")#
+
+ Eingang: d0 = Kanalnummer (1...15)
+ d1 = auszugebendes Zeichen
+
+ Zweck: Ausgabe eines Zeichens.
+
+ Hinweis: Ob das Zeichen übernommen wird, kann vorher durch einen Aufruf
+ IOCONTROL "frout" erfragt werden, s. S. #topage("frout")#.
+
+
+
+#b("Terminals")##goalpage("term")#
+
+"Normale" #ib#Terminal#ie(1,", normales")#s können ohne weitere Unterstützung des SHards angeschlossen
+werden. Die zur Anpassung an den EUMEL-Zeichensatz *) notwendigen #ib#Umcodierungen#ie#
+werden von den höheren Ebenen aus eingestellt. Da diese Umsetztabellen vom SHard
+unabhängig sind, stehen automatisch alle so angepaßten Terminaltypen allen EUMEL-
+Anwendern zur Verfügung!
+#foot#
+#f#*) Siehe "EUMEL Benutzerhandbuch, Teil 3: Editor, 5. Zeichencode"
+#a#
+#end#
+
+Für den Anschluß eines #on("b")##on("i")#integrierten #ib#Terminal#ie(1,", integriertes")#s#off("i")##off("b")#, in dessen Bildwiederholspeicher direkt
+gearbeitet wird, kann man häufig den Terminaltyp 'psi' verwenden (siehe auch "Exoten").
+
+Näheres zu Terminaltypen und -anschlüssen findet man im "EUMEL Systemhandbuch"
+unter den Stichwörtern #on("i")#Konfiguration#off("i")# und #on("i")#Konfigurierung#off("i")#.
+
+
+
+#bb("Drucker, ","Plotter")##goalpage("druck")#
+
+#ib#Drucker#ie# und Plotter werden vom EUMEL-System wie Terminals angesehen. Da in der
+Regel der Rechner aber schneller Zeichen senden als der Drucker drucken kann, müssen
+solche Geräte in der Regel mit Flußkontrolle angeschlossen werden (siehe S.#topage("fluss")#).
+
+Wenn Drucker oder Plotter über eine Parallelschnittstelle angeschlossen werden, kann man
+auf diesem Kanal möglicherweise auf einen Ausgabepuffer verzichten. Voraussetzung ist
+dabei, daß
+
+ a) der Drucker einen eigenen Puffer hat und
+ b) der Puffer "schnell" gefüllt werden kann (<0.1 ms je Zeichen).
+
+Dann kann man auf den bei der SHard-Routine OUTPUT geforderten Puffer verzichten
+und die Zeichenkette direkt über die Parallelschnittstelle an den Drucker übergeben. Wenn
+der Drucker 'Puffer voll' signalisiert, sollte die Zeichenübernahme bei OUTPUT abgebro­
+chen werden. **) #on("i")#Auf keinen Fall darf CPU-intensiv auf Freiwerden des Puffers gewartet
+werden!#off("i")#
+#foot#
+#f#**) siehe auch IOCONTROL "frout", S.#topage("frout")#
+#a#
+#end#
+
+
+
+#b("Exoten")##goalpage("exot")#
+
+Exotische #ib#Terminal#ie(1," exotisches")#s (im Sinne dieser Beschreibung) sind solche, für die eine Umsetz­
+tabelle im System (siehe Konfiguratorbeschreibung) nicht ausreicht bzw. nicht nötig ist
+(Beispiele: Terminals, in deren Bildwiederholspeicher direkt gearbeitet wird; Terminals, die
+soweit programmierbar sind, daß sie den EUMEL-Zeichencode können).
+
+Für solche Terminals muß in der Konfiguration der Terminaltyp '#ib#psi#ie#' eingestellt werden.
+Dieser wirkt ohne Umcodierungen, d.h. die EUMEL-Codes (siehe Benutzerhandbuch 1.7
+Seite 106) werden direkt dem SHard zugestellt (wie bei 'transparent'), jedoch mit folgenden
+Besonderheiten:
+
+Eingabeseitig werden zusätzlich folgende Codezuordnungen getroffen:
+
+ Code Funktion
+
+ 7 SV (Aktivierung: 'gib supervisor kommando:')
+ 17 STOP (Ausgabe auf diesen Kanal wird gestoppt)
+ 23 WEITER (Ausgabe läuft wieder weiter)
+ 4 INFO (System geht in Debugger, falls Debugoption)
+
+
+
+#bb("5.2 ","Block-IO")##goalpage("block")#
+
+Ãœber Block-IO wickelt das System die Zugriffe zum Hintergrund und zum Archiv ab.
+Ferner ist daran gedacht, auch auf V.24-Schnittstellen Block-IO z.B. für Rechnerkopp­
+lung zuzulassen. Die Kanalnummer in Reg. d0 unterscheidet diese Fälle. Außer beim
+Paging (d0=0) wird ein Block-IO durch die ELAN-Prozeduren 'blockin' und blockout'
+induziert.
+
+Bei Block-IO wird immer ein 512 Byte großer Hauptspeicherbereich mit übergeben.
+Dieser kann (im Gegensatz zu OUTPUT) direkt benutzt werden, d.h. es muß keine Um­
+pufferung erfolgen.
+
+Dieser Hauptspeicherbereich darf nur bei BLOCKIN verändert werden.
+
+SHard darf (anders als bei OUTPUT) erst dann zur Aufrufstelle zurückgeben, wenn die
+verlangte Operation abgeschlossen ist. Treten während der Operation Wartezeiten auf, so
+muß SHard die 0-Routine 'warte' aufrufen, damit das System andere Prozesse weiter­
+laufen lassen kann.
+
+EUMEL-0 definiert bestimmte Funktionen für Hintergrund (Kanal 0) und Archiv (Kanal 31).
+Operationen auf anderen Kanälen kann SHard nach Belieben implementieren und deren
+Leistung seinen Installationen über ELAN-Pakete zur Verfügung stellen. Das System
+vergibt auch in Zukunft für den #ib##on("i")#Funktionscode#ie##off("i")# in Register d1 nur positive Werte (Bit 15
+von d1 = 0). Der SHard kann selbst negative Codes einführen.
+
+
+ #d("BLOCKIN")#
+
+ Eingang: d0 = Kanalnummer (0...32)
+ d1 = Funktionscode 1
+ d2 = Funktionscode 2
+ a0 = Adresse des Hauptspeicherbereichs
+ Ausgang: d0 = undefiniert (darf also verändert werden)
+ d1 = Rückmeldecode
+ a0 = darf verändert werden
+
+ Der Inhalt des Hauptspeicherbereichs (<a0>... <a0>+511) darf
+ verändert sein.
+
+ Zweck: "Einlesen" von Blöcken. Die genaue Wirkung hängt vom Funk­
+ tionscode und dem Kanal ab.
+
+ Vorschlag: Falls der Kanal nicht existiert bzw. BLOCKIN darauf unsinnig ist,
+ sollte die Rückmeldung -1 in d1 geliefert werden.
+
+
+ #d("BLOCKOUT")#
+
+ Eingang: d0 = Kanalnummer (0...32)
+ d1 = Funktionscode 1
+ d2 = Funktionscode 2
+ a0 = Adresse des Hauptspeicherbereichs
+ Ausgang: d0 = undefiniert (darf also verändert werden)
+ d1 = Rückmeldecode
+ a0 = darf verändert werden
+
+ Der Inhalt des Hauptspeicherbereichs darf #on("i")#nicht#off("i")# verändert werden!
+
+ Zweck: "Ausgeben" von Blöcken. Die genaue Wirkung hängt vom Funk­
+ tionscode und dem Kanal ab.
+
+ Vorschlag: Falls der Kanal nicht existiert bzw. BLOCKOUT darauf unsinnig ist,
+ sollte die Rückmeldung -1 in d1 geliefert werden.
+
+
+ #d("warte")# (0-Routine)
+
+ Ausgang: Alle Register undefiniert!
+
+ Zweck: Diese Routine ist bei 'blockin' oder 'blockout' dann aufzurufen,
+ wenn SHard im Augenblick nichts zu tun hat. Durch den Aufruf von
+ 'warte' erhalten andere Systemteile die Möglichkeit, weiter zu ar­
+ beiten. Ein 'warte' kann bis zu ca. 1/4 Sekunde Zeit aufnehmen.
+ 'warte' darf nicht in Interruptroutinen und Stream-IO verwendet
+ werden! 'warte' zerstört alle Register! SHard muß davon ausgehen,
+ daß 'warte' seinerseits andere SHard-Komponenten aufruft.
+
+
+Die Verwendung der 0-Routine 'warte' soll hier an einigen Beispielen verdeutlicht wer­
+den:
+
+
+ blockout auf platte :
+ WHILE platte noch nicht frei REP
+ warte
+ ENDREP ;
+ uebertrage schreibbefehl an controller ;
+ uebertrage daten an controller .
+
+ blockin von platte :
+ WHILE platte noch nicht frei REP
+ warte
+ ENDREP ;
+ uebertrage lesebefehl an controller ;
+ WHILE daten noch nicht gelesen REP
+ warte
+ ENDREP ;
+ hole daten vom controller .
+
+
+ blockout auf floppy :
+ seekbefehl an controller ;
+ WHILE seek noch nicht fertig REP
+ warte
+ ENDREP ;
+ setze dma auf schreiben block zur floppy ;
+ schreibbefehl an controller ;
+ WHILE schreiben noch nicht fertig REP
+ warte
+ ENDREP .
+
+ blockin von floppy :
+ seekbefehl an controller ;
+ WHILE seek noch nicht fertig REP
+ warte
+ ENDREP ;
+ setze dma auf lesen block von floppy ;
+ lesebefehl an controller ;
+ WHILE lesen noch nicht fertig REP
+ warte
+ ENDREP .
+
+
+
+#b("Block-IO bei Hintergrund und Archiv")##goalpage("bhgarch")#
+
+#ib#Hintergrund#ie# (Kanal 0) und #ib#Archiv#ie# (Kanal 31) unterscheiden sich in den Link-Bedingungen
+nur in der Kanalnummer. Die Aufrufe von BLOCKIN und BLOCKOUT werden mit folgenden
+Eingangsparametern versorgt:
+
+ #on("b")#BLOCKIN#off("b")# d0 = 0 bzw. 31
+ d1 = 0
+ d2 = Blocknummer
+ a0 = Hauptspeicheradresse
+
+ Der angegebene 512-Byte-Block ist in den Hauptspeicher ab
+ <a0> einzulesen.
+
+ #on("b")#BLOCKOUT#off("b")# d0 = 0 bzw. 31
+ d1 = 0
+ d2 = Blocknummer
+ a0 = Hauptspeicheradresse
+
+ Der Hauptspeicherbereich (<a0>... <a0>+511) ist auf den
+ angegebenen Block zu schreiben.
+
+Als Rückmeldungen sind zu liefern:#goalpage("errcod")#
+
+ 0 Operation korrekt ausgeführt.
+ 1 Manuell behebbarer Fehler (z.B. Laufwerktür offen)
+ 2 Permanenter Fehler (z.B. Daten nicht lesbar)
+ 3 Versorgungsfehler (zu hohe Blocknummer)
+
+
+#d("Fehlerwiederholung")#: Das EUMEL-System führt von sich aus Fehlerwiederholungen beim
+ Hintergrund- und beim Archivzugriff durch. SHard sollte deshalb
+ im Fehlerfall die Operation nicht selbst wiederholen, sondern einen
+ Lese/ Schreibfehler zurückmelden. So werden dem EUMEL-Sy­
+ stem auch Soft-Errors gemeldet. In manchen Fällen soll vor
+ einem erneuten Lese- oder Schreibversuch der Arm auf Spur 0
+ positioniert werden o.ä. Um das zu erreichen, sollte SHard diese
+ "Reparaturaktion" direkt im Anschluß an den fehlerhaften Versuch
+ durchführen.
+
+#d("Kontrollesen")#: Falls Kontrollesen (nach jedem Schreibzugriff) notwendig ist, muß das
+ allerdings vom SHard durchgeführt werden. In der Regel reicht es
+ dazu, den geschriebenen Block "ohne Datentransport" zu lesen,
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+System verwendet nur positive Codes. Der SHard-Schreiber kann auch negative Codes
+für Sonderzwecke vorsehen.
+
+
+ #d("IOCONTROL")#
+
+ Eingang: d0 = Kanalnummer (0...32)
+ d1 = Funktionscode 1
+ d2 = Funktionscode 2
+ d3 = Funktionscode 3
+ Ausgang: d1 = Rückmeldung
+
+ Zweck: abhängig von 'Funktionscode 1' (s.u.)
+
+Das System verlangt folgende Informations- und Steuerleistungen über IOCONTROL:
+
+
+ #d("IOCONTROL ""typ""")#
+
+ Eingang: d0 = Kanalnummer (0...31)
+ d1 = 1
+ Ausgang: d1 = Kanaltyp
+
+ Zweck: Informiert EUMEL-0, welche IO für den angegebenen Kanal
+ sinnvoll ist. Die Rückmeldung in d1 wird bitweise interpretiert:
+
+ Bit 0 gesetzt  <=> 'inputinterrupt' kann kommen.
+ Bit 1 gesetzt  <=> OUTPUT ist sinnvoll.
+ Bit 2 gesetzt  <=> BLOCKIN ist sinnvoll.
+ Bit 3 gesetzt  <=> BLOCKOUT ist sinnvoll.
+ Bit 4 gesetzt  <=> IOCONTROL "format" ist sinnvoll.
+
+ Hinweis: #on("i")#Trotz dieser Informationsmöglichkeit wird nicht garantiert, daß nur
+ sinnvolle Operationen für den Kanal aufgerufen werden.#off("i")#
+
+
+ #d("IOCONTROL ""frout""")##goalpage("frout")#
+
+ Eingang: d0 = Kanalnummer (1...15)
+ d1 = 2
+ Ausgang: d1 = Anzahl Zeichen, die nächster OUTPUT übernimmt, bzw.
+ Anzahl der OUTCHAR-Aufrufe, deren Zeichen übernommen
+ wird.
+
+ Zweck: Liefert Information über die Belegung des Puffers. Diese Informa­
+ tion wird von EUMEL-0 zum Scheduling benutzt.
+
+ Achtung: #on("i")#Wenn EUMEL-0 längere Zeit kein OUTPUT gemacht hat, muß
+ irgendwann d1 > 49 gemeldet werden.#off("i")#
+
+ Hinweis: Unter Berücksichtigung des oben Gesagten darf "gelogen" werden.
+ Man kann z.B. immer 50 in d1 zurückmelden, muß dann aber
+ schlechtere Nutzung der CPU bei Multi-User-Systemen in Kauf
+ nehmen.
+
+ Falls auf dem angegebenen Kanal ein Drucker mit eigenem Puffer
+ über Parallelschnittstelle angeschlossen ist (siehe S.#topage("druck")# ) und man
+ auf einen SHard-internen Puffer verzichtet hat, sollte bei 'Druk­
+ kerpuffer voll' 0 in d1 zurückgemeldet werden. Wenn aber Zeichen
+ übernommen werden können, sollte 50 in d1 gemeldet werden
+
+ Vorschlag: Falls der Kanal nicht existiert oder nicht für Stream-IO zur Verfü­
+ gung steht, sollten 200 in d1 zurückgemeldet werden.
+
+
+ #d("IOCONTROL ""weiter""")##goalpage("weiter")#
+
+ Eingang: d0 = Kanalnummer (1...15)
+ d1 = 4
+ Ausgang: -
+
+ Zweck: Das System ruft "weiter" für den in d0 angegebenen Kanal auf,
+ wenn es wieder Eingabezeichen puffern kann. (siehe auch: Fluß­
+ kontrolle S.#topage("fluss")#)
+
+ Hinweis: "weiter" wird von EUMEL-0 auch immer dann aufgerufen, wenn
+ ein Prozeß auf dem angegebenen Kanal auf Eingabe wartet und
+ keine Zeichen mehr gepuffert sind. Wenn der betroffene Kanal von
+ sich aus keine Interrupts erzeugt, kann SHard diesen Aufruf dazu
+ benutzen, den Kanal auf mögliche Eingabe abzufragen und ggfs.
+ das Eingabezeichen durch Aufruf von 'inputinterrupt' EUMEL-0
+ zuzustellen.
+ #on("i")#Diese Betriebsart sollte nicht für normale Terminalkanäle eingesetzt
+ werden, weil sie die SV-Taste nur dann an EUMEL-0 zustellt,
+ wenn ein Prozeß auf diesem Kanal auf Eingabe wartet. Dadurch
+ wären aber CPU-intensive Endlosschleifen nicht normal abbrech­
+ bar! #off("i")#
+
+
+ #d("IOCONTROL ""size""")#
+
+ Eingang: d0 = Kanalnummer (0...31)
+ d1 = 5
+ d2 = Schlüssel
+ Ausgang: d1 = Anzahl Blöcke
+
+ Zweck: EUMEL-0 ruft 'size' auf, um die Anzahl Blöcke zu erfahren, die
+ ein Block-IO-Kanal verkraften kann (Größe von Hintergrund und
+ Archiven). Bei Archivlaufwerken, die meherere Formate bearbeiten
+ können, dient dieser Aufruf auch zum Einstellen des Formats für
+ die folgenden blockin/blockout-Operationen anhand des Schlüs­
+ sels.
+
+ Schlüssel: 0 Wenn möglich 'erkennend', sonst 'standard'. Im ersten Fall
+ erkennt SHard das Format der eingelegten Diskette und stellt
+ dieses ein.
+
+ Die weiteren Schlüssel sind stets definierend:
+
+ 1 5.25" 2D-40, Sektor 1..9, 512 Bytes
+ 2 5.25" 2D-80, Sektor 1..9, 512 Bytes
+ 3 5.25" HD-80, Sektor 1..15, 512 Bytes
+ 4 5.25" 1D-80, Sektor 1..9, 512 Bytes
+ 10 8" 1D-77, Sektor 0..15, 512 Bytes
+ 11 8" 2D-77, Sektor 0..15, 512 Bytes
+ 12 8" 1S-77, Sektor 1..26, 128 Bytes
+ 13 8" 1D-77, Sektor 1..26, 256 Bytes
+ 14 8" 2D-77, Sektor 1..16, 256 Bytes
+
+ Hinweis: Bei Archiven wird 'size' aufgerufen, nachdem der Archivträger ein­
+ gelegt wurde. D.h. SHard hat die Gelegenheit, die Größe anhand
+ des eingelegten Archivträgers zu bestimmen (z.B. ob single- oder
+ doublesided).
+
+ Vorschlag: Diese Funktion sollte auf nicht vorhandenen und den Stream-IO-
+ Kanälen 0 liefern. Sie muß aber mindestens auf Kanal 0 (Hinter­
+ grund) und Kanal 31 (Archiv) "echte" Werte liefern.
+
+ Achtung: #on("i")#Ausnahmsweise darf bei dieser IOCONTROL-Funktion die
+ 0-Routine 'warte' aufgerufen werden.#off("i")#
+
+
+ #d("IOCONTROL ""format""")#
+
+ Eingang: d0 = Kanalnummer (0...31)
+ d1 = 7
+ d2 = Schlüssel
+ Ausgang: d1 = Fehlercode wie bei Archiv-BLOCKOUT (siehe S.#topage("errcod")#)
+
+ Zweck: Dient zum Formatieren eines Mediums. Diese Funktion kann für
+ jeden Kanal leer implementiert sein ('rts'). Sie sollte aber "forma­
+ tierend" (z.B. auf Kanal 31) arbeiten, falls auf diesem Kanal die
+ "typ"-Abfrage "Formatieren sinnvoll" liefert. Falls (bei Disketten­
+ laufwerken) mehrere Formate möglich sind, bestimmt der Schlüssel
+ das gewünschte Format.
+
+ Schlüssel: 0 Standardformat dieses Rechners
+ 1 5.25" 2D-40, Sektor 1..9, 512 Bytes
+ 2 5.25" 2D-80, Sektor 1..9, 512 Bytes
+ 3 5.25" HD-80, Sektor 1..15, 512 Bytes
+ 4 5.25" 1D-80, Sektor 1..9, 512 Bytes
+ 10 8" 1D-77, Sektor 0..15, 512 Bytes
+ 11 8" 2D-77, Sektor 0..15, 512 Bytes
+ 12 8" 1S-77, Sektor 1..26, 128 Bytes
+ 13 8" 1D-77, Sektor 1..26, 256 Bytes
+ 14 8" 2D-77, Sektor 1..16, 256 Bytes
+
+ Hinweis: Falls für das Formatieren ein großer Speicherbereich benötigt wird,
+ sollte das Formatieren von Disketten besser in einem Boot-Dialog
+ vor dem Start von EUMEL-0 angeboten werden. Denn sonst
+ müßte der Pagingbereich unnötig eingeschränkt werden.
+ Man kann das Formatieren #on("i")#einer Spur#off("i")# CPU-intensiv implementie­
+ ren (d.h. ohne DMA im Interrupts-Disabled-Modus), wenn man in
+ Kauf nimmt, daß alle anderen Tasks des EUMEL-Systems in
+ dieser Zeit "stehen". Dann sollte man aber nach jeder Spur
+ mehrmals die 0-Routine 'warte' aufrufen.
+
+ Achtung: #on("i")#Ausnahmsweise darf bei dieser IOCONTROL-Funktion die
+ 0-Routine 'warte' aufgerufen werden.#off("i")#
+
+
+
+#b("Konfigurierung serieller Schnittstellen")##goalpage("v24")#
+
+Bei Kanälen, die hardwaremäßig auf #ib#serielle Schnittstellen#ie# (#ib# V.24#ie#) zurückgeführt werden,
+sind in der Regel die Größen
+
+ - #ib#Baudrate#ie# (..., 2400, 4800, 9600, ...)
+ - #ib#Zeichenlänge#ie# (7 Bits, 8 Bits)
+ - #ib#Parität#ie# (keine, gerade, ungerade)
+
+einstellbar. Dafür muß SHard die IOCONTROL-Funktionen "baud" und "bits" zur Verfü­
+gung stellen. Diese werden in zwei Modi benutzt:
+
+ a) #on("b")#einstellend#off("b")#
+ Läuft der aufrufende EUMEL-Prozeß auf dem privilegierten Steuerkanal (d0 = 32),
+ wird der als Parameter mit übergebene #on("i")#adressierte Kanal#off("i")# auf die geforderten Werte
+ eingestellt, sofern das möglich ist.
+
+ b) #on("b")#abfragend#off("b")#
+ Läuft der aufrufende EUMEL-Prozeß nicht auf Kanal 32 (d0 <> 32), wird lediglich
+ abgefragt, ob der #on("i")#adressierte Kanal#off("i")# auf die übergebenen Werte eingestellt werden
+ könnte.
+
+Aufgrund des zweiten Modus können die höheren EUMEL-Ebenen dem Anwender bei der
+Konfigurierung mitteilen, welche Werte sich auf dem jeweiligen Kanal einstellen lassen. Das
+nutzt z.B. das Standard-Konfigurationsprogramm aus.
+
+Hinweis: Bei einigen Kanälen (z.B. bei einem integrierten Terminal oder einer Parallel­
+ schnittstelle) sind Baudrateneinstellungen sinnlos. Bei anderen können sie nur
+ hardwaremäßig vorgenommen werden (Jumper, Dip Switches). In allen diesen
+ Fällen muß SHard bei allen Einstellungen 'unmöglich' melden. (Standardmäßig
+ wird der Anwender bei der Einstellung seiner Konfiguration dann auch nicht
+ danach gefragt.)
+
+
+ #d("IOCONTROL ""baud""")#
+
+ Eingang: d0 = eigener Kanal (1...15 / 32)
+ d1 = 8
+ d2 = 0
+ d3 = Schlüssel * 256 + adressierter Kanal
+ Ausgang: d1 = Rückmeldung (0 = ok, 1 = nicht möglich)
+
+ Zweck: Wird diese Routine auf dem Steuerkanal (d0=32) aufgerufen, wird
+ die angegebene Baudrate für den durch Register d3(0..7) adres­
+ sierten Kanal eingestellt, falls das möglich ist. Wird diese Routine
+ auf einem anderen Kanal als 32 aufgerufen, informiert sie den
+ Aufrufer lediglich, ob eine derartige Einstellung des adressierten
+ Kanals möglich wäre.
+
+ Schlüssel: 1 50 Baud
+ 2 75 Baud
+ 3 110 Baud
+ 4 134.5 Baud
+ 5 150 Baud
+ 6 300 Baud
+ 7 600 Baud
+ 8 1200 Baud
+ 9 1800 Baud
+ 10 2400 Baud
+ 11 3600 Baud
+ 12 4800 Baud
+ 13 7200 Baud
+ 14 9600 Baud
+ 15 19200 Baud
+ 16 38400 Baud
+
+ Anmerkung: In der Regel werden nicht alle Baudraten vom SHard unterstützt
+ werden. Bei V.24 Schnittstellen sollten aber mindestens 2400,
+ 4800 und 9600 Baud zur Verfügung stehen, besser auch 300, 600,
+ 1200 und 19200 Baud.
+
+ Hinweis: Falls SHard-spezifisch weitere Baudraten implementiert werden
+ sollen, darf SHard hierfür negative Schlüsselwerte in d3(8..15) ver­
+ geben.
+
+
+ #d("IOCONTROL ""bits""")#
+
+ Eingang: d0 = eigener Kanal (1...15 / 32)
+ d1 = 9
+ d2 = 0
+ d3 = Schlüssel * 256 + adressierter Kanal
+ Ausgang: d1 = Rückmeldung (0 = ok, 1 = nicht möglich)
+
+ Zweck: Wird diese Routine auf dem Steuerkanal (d0=32) aufgerufen, wird
+ die angegebene Zeichenlänge (Bits pro Zeichen) und Parität für
+ den durch Register d3(0..7) adressierten Kanal eingestellt, falls das
+ möglich ist.
+ Wird diese Routine auf einem anderen Kanal als 32 aufgerufen,
+ informiert sie den Aufrufer lediglich, ob eine derartige Einstellung
+ des adressierten Kanals möglich wäre.
+
+
+ Schlüssel: stop * 32 + par * 8 + (bit - 1)
+
+ stop: 0 1 Stopbit
+ 1 1.5 Stopbits
+ 2 2 Stopbits
+
+ par: 0 keine Parität
+ 1 ungerade Parität
+ 2 gerade Parität
+
+ bit: 1...8 Bits pro Zeichen
+
+
+ Anmerkung: In der Regel werden nicht alle Kombinationen vom SHard unter­
+ stützt werden. Bei V.24 Schnittstellen sollten aber möglichst 1
+ Stopbit, 7 und 8 Bits pro Zeichen und alle drei Paritätseinstellun­
+ gen zur Verfügung stehen.
+
+ Hinweis: Falls SHard-spezifisch weitere Einstellungen implementiert werden
+ sollen, darf SHard hierfür negative Schlüsselwerte in d3(8..15) ver­
+ geben.
+
+
+
+#b("Flußkontrolle")##goalpage("fluss")#
+
+Die stromorientierten Kanäle (1...15) werden nicht nur zum Anschluß schneller Geräte (wie
+Terminals) verwendet, sondern auch, um langsame Geräte (wie Drucker) anzuschließen, die
+die Daten u.U. nicht so schnell übernehmen können, wie sie der Rechner schickt. Dabei
+ist auf eine geeignete Flußkontrolle zu achten (nicht schneller senden, als der Andere
+empfangen kann). Dieses Problem stellt sich auch bei einer Rechner-Rechner-Kopplung.
+Hier ist in der Regel sogar zweiseitige Flußkontrolle notwendig.
+
+Als Flußkontrolle ist die #ib#REQUEST TO SEND/CLEAR TO SEND#ie# Logik der V.24-Schnitt­
+stelle oder das #ib#XON/XOFF#ie#-Protokoll zu verwenden. Das Letztere kann auch bei Parallel­
+schnittstellen eingesetzt werden.
+
+Zur eingabeseitigen Flußkontrollsteuerung kann SHard die IOCONTROL-Funktionen
+"stop" und "weiter" (siehe S.#topage("weiter")#) verwenden:
+
+Nach "stop" muß SHard weiter einlaufenden Input selbst zwischenpuffern oder auf der
+V.24-Schnittstelle das Signal 'REQUEST TO SEND' wegnehmen bzw. XON senden.
+Dadurch wird bei den meisten Fremdrechnern ein weiteres Senden unterbrochen, sofern
+(im ersten Fall) das Signal 'REQUEST TO SEND' dort mit dem V.24-Eingang 'CLEAR TO
+SEND' verbunden ist. Wird von EUMEL-0 "weiter" aufgerufen, so kann auf dem ent­
+sprechenden Kanal wieder empfangen werden (RTS setzen bzw. XON senden).
+
+Für die ausgabeseitige Flußkontrolle muß rechnerseitig ebenfalls das Signal 'CLEAR TO
+SEND' bzw. der Empfang von XOFF berücksichtigt werden. Wenn an der Schnittstelle das
+'CLEAR TO SEND' weggenommen wird, darf SHard keinen weiteren Output auf dieser
+Schnittstelle machen, bis 'CLEAR TO SEND' wieder anliegt. Entsprechend muß der
+Empfang von XOFF die Ausgabe anhalten und XON sie wieder starten.
+
+Bemerkung: Die meisten Systeme enthalten diese CTS-Funktion schon in ihrer Hard­
+ ware, so daß im SHard dafür keine Vorkehrungen getroffen werden müs­
+ sen.
+
+
+Zur Einstellung der gewünschten Flußkontrolle eines Kanals dient die IOCONTROL-
+Funktion "flow". Ähnlich wie "baud" und "bits" wirkt auch "flow" nur auf Kanal 32 #on("i")#ein­
+stellend#off("i")# und auf allen anderen Kanälen lediglich #on("i")#abfragend#off("i")#.
+
+
+ #d("IOCONTROL ""flow""")#
+
+ Eingang: d0 = eigener Kanal (1...15 / 32)
+ d1 = 6
+ d2 = 0
+ d3 = Modus * 256 + adressierter Kanal
+ Ausgang: d1 = Rückmeldung (0 = ok, 1 = nicht möglich)
+
+ Zweck: Wird diese Routine auf dem Steuerkanal (d0=32) aufgerufen, muß
+ sie den gewünschten Flußkontrollmodus für den adressierten Kanal
+ einstellen.
+ Dabei sind folgende Modi festgelegt:
+
+ Modus = 0 Keine Flußkontrolle
+ Modus = 1 XON/XOFF (in beiden Richtungen)
+ Modus = 2 RTS/CTS (in beiden Richtungen)
+ Modus = 5 XON/XOFF (nur ausgabeseitig)
+ Modus = 6 RTS/CTS (nur ausgabeseitig)
+ Modus = 9 XON/XOFF (nur eingabeseitig)
+ Modus = 10 RTS/CTS (nur eingabeseitig)
+
+ SHard wird hierdurch informiert, wie er auf "stop" und "weiter"
+ reagieren soll. Wenn keine Flußkontrolle gewünscht wird
+ (Modus=0), muß SHard "stop" und "weiter" ignorieren; bei
+ Modus=1 oder Modus=9 muß bei "stop" XOFF und bei "weiter"
+ XON geschickt werden; bei Modus=2 oder Modus=10 muß bei
+ "stop" das Signal RTS auf low und bei "weiter" wieder auf high
+ gesetzt werden. Mit "stop" ist hierbei das Unterschreiten des
+ Schwellwertes bei der Rückmeldung von
+ "inputinterrupt" gemeint.
+
+ Bei Modus=1 oder Modus=5 müssen empfangene XON/XOFF­
+ -Zeichen, bei Modus=2 oder Modus=6 das Signal CTS beachtet
+ werden.
+
+ Wird diese Routine auf einem anderen Kanal als 32 aufgerufen,
+ informiert sie den Aufrufer lediglich, ob der geforderte Flußkontroll­
+ modus auf dem adressierten Kanal einstellbar wäre.
+
+ Hinweis: Falls SHard-spezifisch weitere Flußkontrollmodi implementiert
+ werden sollen, darf SHard hierfür negative Moduswerte in d3(8..15)
+ vergeben.
+
+ "weiter" wird von EUMEL-0 sehr oft aufgerufen. Es
+ ist daher nicht sinnvoll, jedesmal XON zu senden, da dies die Gegenstelle
+ damit überfluten würde. SHard muß sich
+ merken, ob der Kanal im XOFF-Zustand ist und
+ nur dann bei "weiter" ein XON senden.
+
+#b("Kalender")##goalpage("kalender")#
+
+Die Datums- und Uhrzeitabfrage ist bei Rechnern mit eingebauter Uhr unnötig. EUMEL
+holt sich Datum und Uhrzeit dann von SHard.
+
+ #d("IOCONTROL ""calendar""")#
+
+ Eingang: d1 = 10
+ d2 = gewünschte Einheit (1=Minute, 2=Stunde, 3=Tag,
+ 4=Monat, 5=Jahr)
+ Ausgang: d1 = Rückmeldung
+
+ Zweck: Erfragen von Datum und Uhrzeit. Falls keine Uhr vorhanden ist,
+ muß bei jedem Aufruf -1 zurückgemeldet werden, bei eingebauter
+ Uhr jeweils das Gewünschte (Minute: 0..59, Stunde: 0..23, Tag:
+ 1..31, Monat: 1..12, Jahr: 0..99).
+
+ Hinweis: Die Uhr darf zwischen zwei Aufrufen umspringen. Die daraus re­
+ sultierenden Probleme werden auf höheren Ebenen abgehandelt.
+
+
+
+#bb("6. SHard-","Interface Version")##goalpage("shdver")#
+
+Die #ib#Versionsnummer#ie# der Interface-Spezifikation, auf der SHard aufbaut, muß als
+2-Byte-Konstante #ib#SHDVER#ie# in der SHard-Leiste stehen. Für das hier beschriebene
+Interface muß sie den Wert 8 haben.
+
+So sind spätere Erweiterungen des SHard-Interfaces möglich, ohne daß alle SHard-
+Moduln geändert werden müssen.
+
+
+
+
+#bb("7. ","ID-Konstanten")##goalpage("ID")#
+
+SHard muß in der Leiste vier 2-Byte-Konstanten ablegen. Diese können von den höhe­
+ren Ebenen durch die ELAN-Prozedur
+
+ INT PROC #ib#id#ie# (INT CONST no)
+
+abgefragt werden. Dabei werden id(0) bis id(3) von EUMEL-0 geliefert, während SHard in
+der Leiste die Werte für id(4) bis id(7) zur Verfügung stellen muß:
+
+ ID4 #ib#Lizenznummer#ie# des SHards *)
+#foot#
+#f#*) Dieser Wert muß mit der Nummer des Lizenzvertrags zwischen Implementierer und GMD übereinstimmen!
+#a#
+#end#
+
+ ID5 #ib#Installationsnummer#ie# des EUMEL-Anwenders **)
+#foot#
+#f#**) Diese Nummer vergibt der Lizenznehmer an die von ihm belieferten Anwender.
+#a#
+#end#
+
+ ID6 zur freien Verfügung
+
+ ID7 zur freien Verfügung
+
+
+
+
+#bb("8. ","Zusätzliche Leistungen")##goalpage("shdelan")#
+
+Will der SHard-Implementierer zusätzliche Leistungen anbieten, die mit den Standardope­
+rationen nicht möglich sind, kann er weitere Codes für BLOCKIN, BLOCKOUT und
+IOCONTROL zur Verfügung stellen. Um Überdeckungen mit Codes zu vermeiden, die von
+EUMEL-0 intern verwendet oder erst später eingeführt werden, darf SHard für zusätzliche
+Leistungen nur negative Werte als 'Funktionscode 1' verwenden.
+
+
+Zum Ansprechen der neuen Leistungen stehen die ELAN-Prozeduren #on("i")#'#ib#blockout#ie#', '#ib#blockin#ie#'#off("i")#
+und #on("i")#'#ib#control#ie#'#off("i")# zur Verfügung.
+
+Ferner steht dem SHard ein Parameterkanal (32) zur Verfügung. Funktionen, die (im Multi­
+-User) nicht jeder Task zur Verfügung stehen dürfen, müssen über diesen Kanal 32
+abgewickelt werden und dürfen nur dort wirken.
+
+
+ PROC blockout (ROW 256 INT CONST para, (* --> a0 *)
+ INT CONST funktion1, (* --> d1 *)
+ funktion2, (* --> d2 *)
+ INT VAR antwort) (* <-- d1 *)
+
+ PROC blockin (ROW 256 INT VAR para, (* --> a0 *)
+ INT CONST funktion1, (* --> d1 *)
+ funktion2, (* --> d2 *)
+ INT VAR antwort) (* <-- d1 *)
+
+ PROC control (INT CONST funktion1, (* --> d1 *)
+ funktion2, (* --> d2 *)
+ funktion3, (* --> d3 *)
+ INT VAR antwort) (* <-- d1 *)
+
+Hinweis: Der SHard darf für 'funktion 1' (d1) zusätzlich zu den hier beschriebenen
+ Standardcodes nur negative Codes vereinbaren.
+
+
+Beispiel: Gibt eine Task, die durch 'continue (x)' an Kanal 'x' hängt, den Befehl
+
+ control (-7,1200,13,antwort),
+
+ so wird IOCONTROL mit (d0='x', d1=-7, d2=1200, d3=13) aufgerufen.
+ Verläßt SHard 'control' mit d1 = 1, so enthält 'antwort' anschließend eine 1.
+
+
+Hinweis: Um die zusätzlichen Leistungen dem Anwender einfach (und abgesichert) zur
+ Verfügung zu stellen, sollte man sie in ein ELAN-Paket einbetten und dieses
+ ebenfalls an die Anwender ausliefern.
+
+ Beispiel: PACKET zusatz DEFINES fanfare, ... :
+
+ PROC fanfare (INT CONST tonhoehe, dauer):
+
+ IF dauer < 0
+ THEN errorstop ("negative dauer")
+ ELIF tonhoehe < 16
+ THEN errorstop ("infraschall")
+ ELIF tonhoehe > 20000
+ THEN errorstop ("ultraschall")
+ ELSE control (-37, 20000 DIV tonhoehe,
+ dauer)
+ FI
+
+ ENDPROC fanfare ;
+
+ . . .
+
+
+
+
+#bb("9. ","Spezialroutinen")##goalpage("ke")#
+
+Als Testhilfe und zur Fehlerdiagnose kann SHard in seine Routinen Kontrollereignisse ein­
+bauen. Das geschieht durch Aufruf der 0-Routine 'info'. Dieser EUMEL-Debugger wird
+im Anhang A (siehe S.#topage("info")#) beschreiben.
+
+
+ #d("info")# (0-Routine)
+
+ Aufruf: movl \#infomsg,(sp)-
+ jbsr info
+ lea 4(sp),sp ! restore stackpointer
+ .
+ .
+ infomsg: .asciz "text"
+
+ Zweck: Info wird aufgerufen. Dabei wird 'text' zur Identifikation des Kon­
+ trollereignisses ausgegeben. #on("i")#Hinter dem übergebenen Text muß
+ ein Byte /00 stehen (durch '.asciz' sichergestellt)!#off("i")#
+
+ Hinweis: Bei Systemen "ohne Info" (nur solche dürfen an Anwender aus­
+ geliefert werden) wird nur der Info-Text ausgegeben und
+ EUMEL-0 angehalten.
+
+ Achtung: Da der Info selbst die hier beschriebenen Stream-IO-Routinen
+ benutzt, darf man ihn von diesen Routinen aus (inputinterrupt,
+ OUTPUT, OUTCHAR, IOCONTROL "frout", IOCONTROL "stop",
+ IOCONTROL "weiter") nicht aufrufen. Wenn die Ein-/Ausgabe auf
+ Terminal 1 interruptgetrieben läuft, dürfen die Interrupts beim Info­
+ -Aufruf natürlich nicht gesperrt sein.
+
+#page#
+#cc("Teil 4: ","Tips zur Portierung")##goalpage("tips")#
+
+
+#b("Nullversion des SHards")##goalpage("0ver")#
+
+
+Es wird empfohlen, zuerst eine "Nullversion" des SHard zu entwickeln, die möglichst
+einfach aufgebaut und nicht auf Effizienz und vollständige Ausnutzung der Betriebsmittel
+ausgerichtet sein sollte. Damit kann man rasch praktische Erfahrung gewinnen, die dann
+den Entwurf und die Implementation des eigentlichen SHard erleichtert. Die Nullversion
+sollte
+
+ - nur die Kanäle 0 (Hintergrund), 1 (Terminal) und 31 (Archiv) behandeln,
+
+ - keine Baudraten-, Zeichenlängen-, Paritäts- und Flußkontrolleinstellungen un­
+ terstützen (immer 'nicht möglich' melden),
+
+ - vorhandene (ROM-) Routinen möglichst nutzen, ohne sich um Unschönes wie
+ "busy wait" beim Disketten- bzw. Plattenzugriff zu grämen.
+
+Mit dieser Nullversion sollte man dann versuchen, EUMEL zu starten. Da der Hintergrund
+ keitsanforderungen an die Zeitangaben bei #on("i")#einzelnen#off("i")# Interrupts
+höheren Ebenen) in das Archivlaufwerk einlegen und von dort laden. Der Vortest sollte
+sich direkt nach dem Start folgendermaßen auf Terminal 1 melden:
+
+ E U M E L - Vortest
+
+ Terminals: 1,
+ RAM-Groesse (gesamt): ... KB
+ Pufferbereich: ... KB
+ Hintergrund-Speicher: ... KB
+
+ Speichertest: ************
+
+Man sollte während der ****-Ausgabe des Speichertests irgendein Zeichen eingeben.
+Das EUMEL-System muß dann in das ausführliche Start-Menü überwechseln. (Andern­
+falls funktioniert die Eingabe nicht richtig!)
+
+Als nächstes sollte man versuchen, den Hintergrund vom Archiv aus zu laden. (Diese
+Möglichkeit wird im Start-Menü angeboten.) Nach dem Ende dieser Operation wird der
+EUMEL-Lauf automatisch beendet. Jetzt kann man das HG-Archiv aus dem Archivlauf­
+werk entfernen und das System neu starten. Dann sollte EUMEL-0 vom Hintergrund
+geladen werden.
+
+Bei Problemen kann der "Info" (siehe S.#topage("info")#) hilfreich sein. Voraussetzung für seine
+Verwendung ist aber, daß die Terminal-Ein-/Ausgabe schon funktioniert.
+
+Beim Start des EUMEL-Systems kann (wie im Systemhandbuch beschrieben) durch den
+Konfigurationsdialog der Terminaltyp von Kanal 1 eingestellt werden. Falls das verwendete
+Terminal in dieser Liste nicht aufgeführt wird und auch keinem der aufgeführten (in Bezug
+auf die Steuercodes) gleicht, kann man z.B.
+
+ - den neuen Terminaltyp an einem anderen EUMEL-Rechner verfügbar machen
+ (Umsetztabellen definieren) und per Archiv zum neuen Rechner tragen,
+
+ - die notwendigen Umcodierungen per SHard durchführen.
+
+Diese Problematik entsteht bei Rechnern mit integriertem Terminal in der Regel nicht, weil
+Steuerzeichen dort sowieso algorithmisch interpretiert werden müssen. In diesem Fall wird
+man direkt die EUMEL-Codes als Grundlage wählen, so daß keine Umsetzungen erfor­
+derlich sind.
+
+Bei einer provisorischen Anpassung kann man auf Invers-Video ohne weiteres verzich­
+ten.
+
+
+Im Gegensatz zu der Nullversion sollte man bei der eigentlichen SHard-Implementierung
+darauf achten, die Möglichkeiten der Hardware effizient zu nutzen. Der Testverlauf ent­
+spricht dann wieder im wesentlichen dem oben beschriebenen Vorgang.
+
+
+
+#b("Typische Fehler")##goalpage("fehler")#
+
+
+ a) SHard-Routinen zerstören Registerinhalte bzw. sichern sie beim Interrupt nicht
+ vollständig.
+
+ b) 'jbsr' bzw. 'rts' verändern den Stackpointer.
+
+ c) Fehler bei der Interruptbehandlung führen zu Blockaden ("hängende Inter­
+ rupts").
+
+ d) Cursorpositionierung außerhalb des Bildschirms bei einem internen Terminal
+ (Bildwiederholspeicher im Rechner) wird nicht abgefangen. Das führt dann zu
+ wildem Schreiben in den Hauptspeicher.
+
+ e) 'warte' wird unerlaubt aufgerufen. ('warte' darf nur von BLOCKIN, BLOCKOUT,
+ IOCONTROL "size" und IOCONTROL "format" aus aufgerufen werden. Ferner
+ kann man 'warte' noch nicht beim Systemladen aufrufen!)
+
+ f) OUTPUT-Verhaspler oder -Blockaden entstehen durch Fehlsynchronisation
+ zwischen dem Füllen des Ausgabepuffers durch die Routine OUTPUT und der
+ Interruptroutine, die den Puffer leert und ausgibt.
+
+ g) IOCONTROL "frout" meldet in gewissen Situationen nie "mindestens 50 Zeichen
+ im Puffer frei" und "Puffer leer". Das kann schon im Vortest zu Output-Blok­
+ kaden führen.
+
+ h) Obwohl "frout" einen Wert größer als x meldet, nimmt "output" nicht alle x
+ Zeichen an.
+
+ i) IOCONTROL "size" meldet falsche Werte.
+
+ j) IOCONTROL verkraftet keine beliebigen (auch unsinnige) Werte.
+
+ k) BLOCKIN bzw. BLOCKOUT geben die Kontrolle an das System zurück, bevor
+ alle Daten übertragen sind. (Sofort nach der Rückgabe geht EUMEL-0 davon
+ aus, daß der Puffer frei ist und anderweitig benutzt werden kann!)
+
+ l) Die Stepping-Rate eines Plattencontrollers wird falsch eingestellt, beziehungs­
+ weise die Platte wird nicht im 'buffered step mode' betrieben, obwohl sie be­
+ schleunigend positionieren kann. Dadurch werden die Zugriffszeiten auf dem
+ Hintergrund unnötig verlangsamt. Man bedenke, daß man so einen Fehler leicht
+ übersieht, weil sich das System nicht fehlerhaft, sondern nur langsamer verhält.
+ Außerdem macht sich die Verlangsamung erst bemerkbar, wenn größere Teile
+ des Hintergrundes benutzt werden.
+
+ m) Bei schnellem Zeichenempfang treten "Dreher" auf. Das deutet meistens auf
+ einen rekursiven Aufruf der 0-Routine 'inputinterrupt' hin. Dabei überholt dann
+ das zweite Zeichen das erste.
+
+ n) Bei schnellem Zeichenempfang, speziell bei gleichzeitiger Ausgabe, gehen
+ Eingabezeichen verloren oder werden verfälscht. In der Regel ist das auf
+ Timingprobleme bei der Interruptbehandlung zurückzuführen. Interrupts gehen
+ verloren bzw. die Zeichen werden nicht schnell genug abgeholt.
+
+
+
+
+#b("Effizienzprobleme")##goalpage("eff")#
+
+ a) Bei #on("i")##on("b")#V.24- und Parallelschnittstellen#off("i")##off("b")# ist schlechter Durchsatz in der Regel auf
+ Fehlverhalten von "frout" zurückzuführen. Auch kostet es in Multi-User-
+ Systemen sehr viel, wenn OUTPUT immer nur ein Zeichen übernimmt. (Dann
+ läuft der ganze Apparat der EUMEL-0-Maschine für jedes Zeichen wieder an.)
+
+ Besonders bei der Parallelschnittstelle achte man darauf, daß nicht durch un­
+ glückliches Timing häufig Blockaden auftreten. So kann zu kurzes 'busy wait' auf
+ Freiwerden der Parallelschnittstelle dazu führen, daß jedes zweite Zeichen abge­
+ lehnt wird, so daß OUTPUT faktisch zeichenweise arbeitet. Andererseits darf na­
+ türlich 'busy wait' auch nicht auf Millisekunden ausgedehnt werden.
+
+
+ b) Wenn #on("i")##on("b")#Disketten ohne DMA#off("i")##off("b")# angeschlossen werden, kann man bei Single-
+ User-Systemen ohne weiteres 'busy wait' einsetzen, um nach dem Seek-
+ Vorgang auf den Block zu warten. Im Multi-User sollte das aber wenn irgend
+ möglich umgangen werden, da eine halbe Umdrehung immerhin ca. 100 ms
+ kostet.
+ Falls nur ein Endeinterrupt nach jeder Diskettenoperation zur Verfügung steht,
+ kann folgendes Verfahren günstig sein:
+
+ seek befehl an controller ;
+ warten auf endeinterrupt ;
+ lesebefehl ohne datentransport auf sektor davor ;
+ warten auf endeinterrupt ;
+ lese oder schreib befehl auf adressierten sektor ;
+ cpu intensives warten und datentransport .
+
+ Die Dummyoperation auf den Sektor vor dem adressierten dient dabei nur dazu,
+ ohne CPU-Belastung einen Zeitpunkt zu finden, wo man dem eigentlichen
+ Sektor möglichst nahe ist. Die Zeit, in der die CPU benötigt wird, sinkt damit auf
+ ca. 25 ms. Die Implementation dieses Algorithmus' ist aber nicht ganz einfach,
+ da die 0-Routine 'warte' wegen der verlangten kurzen Reaktionszeiten nicht
+ verwendet werden kann. Alle 'warte auf ...' müssen also durch Interrupts reali­
+ siert werden:
+
+ setze interrupt auf lesen davor ;
+ stosse seek an ;
+ REP
+ warte
+ UNTIL komplette operation beendet ENDREP .
+
+ lesen davor :
+ setze interrupt auf eigentliche operation ;
+ stosse lesen davor an .
+
+ eigentliche operation :
+ ignoriere fehler beim datentransport ;
+ stosse lesen oder schreiben an ;
+ REP
+ REP UNTIL bereit ENDREP ;
+ uebertrage ein byte
+ UNTIL alles uebertragen ENDREP ;
+ melde komplette operation beendet .
+
+
+ c) Bei der Ansteuerung von #on("i")##on("b")#Platten#off("b")##off("i")# sollte man darauf achten, daß die 0-Routi­
+ ne 'warte' nicht öfter als notwendig aufgerufen wird. Sonst wird das Paging
+ zugunsten der CPU-intensiven Prozesse zu stark verlangsamt. Z.B. kann man
+ bei vielen Plattencontrollern auf eine eigene Seek-Phase verzichten:
+
+ beginne seek ; beginne seek und lesen ;
+ REP REP
+ warte warte
+ UNTIL fertig PER ; UNTIL fertig PER
+ beginne lesen ;
+ REP
+ warte
+ UNTIL fertig PER
+
+ Hier braucht die linke Fassung immer mindestens ein 'warte' mehr als die
+ rechte. Bei starker CPU Belastung wird sie deshalb bis zu 100 ms länger für das
+ Einlesen eines Blocks benötigen.
+
+ Eine ähnliche Situation kann auftreten, wenn die Platte in 256-Byte-Sektoren
+ unterteilt ist, so daß zu jedem EUMEL-Block zwei Sektoren gehören. Wenn
+ möglich sollte dann zwischen diesen beiden Sektoren kein 'warte' aufgerufen
+ werden. Andererseits darf natürlich auch nicht längere Zeit CPU-intensiv ge­
+ wartet werden. Evtl. lohnt es sich in solchem Fall, mit der Sektorverschränkung
+ zu experimentieren.
+
+#page#
+#cc("Anhang A: EUMEL-","Debugger ""Info""")##goalpage("info")#
+
+
+Für interne Testzwecke gibt es den "Info". Systeme "mit Info" und "ohne Info" unter­
+scheiden sich nur im EUMEL-0-Teil (Systemkern). Der SHard-Implementierer erhält
+zum Test Hintergründe "mit Info" und zur Auslieferung solche "ohne Info". Infofähige
+Systeme dürfen nur von den SHard-Implementierern verwendet werden.
+
+ #on("i")##on("b")#Achtung: Infofähige Systeme dürfen auf keinen Fall an Anwender ausgeliefert werden,
+ da vermittels Info alle Systemsicherungs- und Datenschutzmaßnahmen un­
+ terlaufen werden können.#off("i")##off("b")# *)
+#foot#
+#f#*) Ausnahmen von dieser Regel bedürfen der expliziten Zustimmung der EUMEL-Systemgruppe (GMD bzw. HRZ
+Bielefeld) und des jeweiligen Anwenders. Solche System müssen immer durch spezielle Schlüsselworte abgesichert
+werden.
+#a#
+#end#
+
+
+
+#b("Aufruf des Info")##goalpage("aufrinf")#
+
+Zum Aufruf des Infos gibt es drei Möglichkeiten:
+
+ a) Beim Start des EUMEL-Systems geht man durch Eingabe eines beliebigen Zei­
+ chens während des Vortests in den ausführlichen Start-Dialog. Durch Eingabe
+ von 'I' gelangt man dann in den Info-Modus. #on("i")#(Diese Möglichkeit wird in dem
+ Startmenü nicht aufgeführt.)#off("i")#
+
+ b) Man kann den Info durch die ELAN-Prozedur 'ke' aufrufen. D.h. wenn das
+ System gestartet wurde und sich eine Task am Terminal mit "gib kommando"
+ gemeldet hat, kann man durch 'ke *return*' in den Info-Modus gelangen.
+
+ c) Wenn sich am Terminal keine Task befindet, die auf Eingabe wartet, gelangt man
+ durch die Tastenfolge 'i *info*' (*info* meist = CTL d, zur Tastendefinition siehe
+ "Systemhandbuch, Konfigurierung") in den Info-Modus.
+
+Alle diese Möglichkeiten funktionieren nur bei infofähigen Systemen.
+
+Bei schweren Systemfehlern, die eine Weitermeldung an die höheren Ebenen des
+EUMEL-Systems unmöglich machen, wird soweit möglich ebenfalls der Info aufgerufen.
+Bei Systemen "ohne Info" wird lediglich eine Meldung auf Kanal 1 ausgegeben und das
+System angehalten.
+
+
+
+#b("Info-Format")##goalpage("forminf")#
+
+Der Info ist bildschirmorientiert. Beim Aufruf des Infos und nach den meisten Info-Kom­
+mandos werden die zwei obersten Zeilen wie folgt aufgebaut: *)
+#foot#
+#f#*) Bildschirmgetreues Verhalten kann der Info allerdings erst nach der Konfigurierung des Kanals zeigen. Vorher (d.h.
+insbesondere beim Aufruf aus dem Vortest heraus) werden Cursorpositionierungen in der Regel nicht korrekt durchge­
+führt.
+#a#
+#end#
+
+Mini: nnnn text eeee
+Maxi: xxxx
+
+
+wobei
+
+ #on("b")#nnnn#off("b")# den Miniprozeß bezeichnet, der den Übergang in den Info veranlaßt hat: INTER
+ (Interpreter), LADER, MUELL (Müllabfuhr) oder ARCHIV,
+
+ #on("b")#xxxx#off("b")# den Maxiprozeß (Task) bezeichnet, der gerade durch den Elan-Prozessor
+ bearbeitet wird (xxxx ist code (tasknummer + code ("0"))),
+
+ #on("b")#text#off("b")# den Grund für den Info-Modus anzeigt und
+
+ #on("b")#eeee#off("b")# eine interne, nur den EUMEL-0-Entwickler interessierende Fehlernummer
+ ist.
+
+In der untersten Zeile erscheint (hinter der Angabe des evtl. angezeigten Datenraumes, der
+Adresse und der Länge) die Eingabeaufforderung 'info:'.
+
+
+
+#b("Info-Kommandos")##goalpage("cmdinf")#
+
+Info-Kommandos können in der 'info:'-Zeile mit dem Format
+
+ [<zahl>]<buchstabe>
+
+gegeben werden oder, wenn der Cursor sich im Dump befindet, mit dem Format
+
+ <buchstabe>
+
+wobei dann für <zahl> die der Cursorposition entsprechende Dumpadresse (modulo
+2**16) gesetzt wird (siehe '*cup*').
+
+<zahl> ist immer in Hexaform einzugeben.
+
+'g' Der Info-Modus wird wieder verlassen. Dies ist allerdings bei harten Fehlern ge
+ sperrt.
+
+'z' Der Leitblock des angezeigten Maxiprozesses wird dargestellt. (Nur im Miniprozeß
+ INTER.)
+
+'s' Dumps werden auf den Datenraum <zahl> eingestellt (s:=<zahl>). Auch der
+ Realspeicher kann hiermit in verschiedenen Modi eingestellt werden:
+
+ 1s Programmspeicher (absolute Adressen)
+ ffs Tabellenspeicher (relativ zum Tabellenanfang)
+
+'l' Dumps werden auf die Länge <zahl> eingestellt. Desungeachtet kann man einen
+ versehentlich zu langen Dump durch eine beliebige Eingabe abbrechen. Dann wird
+ allerdings '*cup*' gesperrt (siehe unten).
+
+'p' Dumps werden auf die Byteadresse <zahl> eingestellt (p:= <zahl>; wmodus:=
+ FALSE).
+
+'w' Dumps werden auf die Wortadresse <zahl> eingestellt. Die vor jeder Dumpzeile
+ ausgegebene Adresse ist dann auch eine Wortadresse. Ein Wort = 2 Bytes
+ (p:=2*<zahl>; wmodus:=TRUE).
+
+'k' Block <zahl> laden und per Dump anzeigen. Es erfolgt dabei eine Umstellung auf
+ den Realdatenraum (s:=/ff).
+
+'x' Suchen nach Bytekette:
+
+--> xctext
+--> xhxx xx ...
+--> x
+
+ Es wird nach 'text' bzw. Hexafolge 'xx xx ...' bzw. nach der durch das letzte
+ 'x'-Kommando eingestellten Bytekette gesucht.
+ Das Kommando ist durch *return* abzuschließen.
+ Die Suche beginnt ab Position 'p' und ist auf die Länge <zahl> Seiten (512
+ Byte-Einheiten) begrenzt (0=unendlich).
+ Eine beliebige Eingabe bricht die Suche vorzeitig ab.
+
+'*return*'
+ Es wird der eingestellte Dump ausgegeben (siehe 's', 'l', 'p', 'w'). Bei wmodus
+ (siehe 'p', 'w') werden Wortadressen ausgegeben.
+
+'o' Wie '*return*', jedoch wird zuvor p := p+l gesetzt (zum Weiterblättern).
+
+
+'*cup*' *) (Cursor up). Umschaltung in den Modus zum Ändern in Dumps.
+#foot#
+#f#*) Falls der Kanal noch nicht konfiguriert ist, muß man natürlich eine Taste betätigen, die den EUMEL-Code für
+Cursor Up erzeugt. In der Regel ist das CTL c. Falls das Terminal ohne Konfigurierung keine Cursorpositionierungen
+durchführt, ist dieser Modus nicht sehr gut benutzbar.
+#a#
+#end#
+ Der Cursor fährt in den Dump und kann mit den Cursortasten dort bewegt werden.
+ Wird eine Hexazahl jetzt eingegeben, so wird diese als Inhalt des Bytes eingetra­
+ gen, auf dem der Cursor gerade steht. Dies funktioniert auch auf beliebigen Da­
+ tenräumen. Info beantragt dann bei der Speicherverwaltung einen Schreibzugriff für
+ die entsprechende Datenraumseite, so daß Änderungen mit der Copy-on-
+ Write-Logik erfolgen, also nur taskspezifisch sind. Für diese Task sind die Ände­
+ rungen allerdings dann permanent, da sie auch auf den Hintergrund wirken.
+
+ Hinweis: Dumpt man mit 'k' einen Block und ändert dann darin, so sind diese
+ Änderungen u.U. nur temporär, da der Info kein Rückschreiben des
+ Blockes veranlaßt.
+
+ Achtung: Jede Eingabe, die kein Positionierzeichen und kein gültiges Zahlzeichen
+ ist, beendet diesen Modus. Das neue Zeichen wird als Info-Komman­
+ do aufgefaßt, wobei <zahl> auf die aktuelle Adresse gesetzt wird.
+ Somit wird dieser Änderungsmodus üblicherweise durch *return* been­
+ det.
+
+
+
+#b("Einige Systemadressen")##goalpage("sysaddr")#
+
+Der Info nützt nur wenig, wenn man nicht weiß, was man sich anschauen soll. Wesentliche
+Angaben über die Systemstruktur enthält das 'Brikett' (interne Systemdokumentation für
+Projekt Mikros der GMD). Da diese etwas allgemeiner gehalten ist, geht sie nicht auf
+implementationsabhängige Konstanten ein. Diese sind hier aufgeführt.
+
+Der Tabellenspeicher der EUMEL-0-Maschine wird relativ zu M0START angelegt. Im Info
+kann der Tabellenspeicher durch die Datenraumangabe ffs adressiert werden, z.B. wird
+durch das Kommando ffs1000p der Anfang der 'ktab' gezeigt.
+
+Ab /1000 liegt die 'ktab'. Sie enthält Informationen, welche Blöcke an welcher Stelle des
+Arbeitsspeichers liegen: In der Kachel mit der Adresse /a000+/200*i befindet sich der
+Inhalt des Blockes, dessen Nummer in <ktab+2*i> steht. Ferner enthält die Tabelle, zu
+welchem Datenraum (drid) und welcher Seite des Datenraums der Inhalt gehört. (Nur
+relevant, wenn die Prozeßnummer <> /ff ist).
+
+ ktab:
+
+ /1000 Blocknummern (je 2 Bytes)
+ /2000 Prozeßnummern (je 1 Byte)
+ /2800 drid's (prozeßspezifisch, je 1 Byte)
+ /3000 Seitennummern (je 2 Bytes)
+ /4000 Steuerbits (je 1 Byte):
+
+ 2**0: Inhalt wird gerade transportiert (zum HG oder Archiv).
+ 2**1: Inhalt ist identisch mit Inhalt auf HG. Wird beim Schreiben auf die
+ Kachel (per Software) zurückgesetzt.
+ 2**2: Schreiberlaubnis (siehe Brikett).
+ 2**3: Inhalt wurde kürzlich benutzt. Solche Kacheln werden 'weniger
+ stark' verdrängt.
+
+
+
+/5d50 enthält den 'Laderpool'. Es handelt sich um Blocknummern von zu ladenden
+ Blöcken. Ist der höherwertige Teil der Blocknummer gleich /fd, so ist dies keine
+ Anforderung.
+
+ Blocknummern > /ff00 stehen für Blöcke mit dem Inhalt 512mal /ff und werden
+ nie auf dem Hintergrundmedium gespeichert.
+
+
+
+/0 enthält den DR-Eintrag des drdr (siehe Brikett).
+
+
+
+
+/5c00.../5cff:
+ enthält die Aktivierungstabelle. Ist (/5c00+i)=/01, so ist die Task i aktiv. Hin­
+ weis: /5cff enthält immer /01, ohne daß dieser Zelle eine Task zugeordnet ist.
+
+
+
+#b("Leitblock")##goalpage("pcb")#
+
+Mit dem 'z'-Kommando wird der Leitblock einer Task dargestellt. Die einzelnen Einträge,
+die voneinander durch je 2 Blanks getrennt sind, haben die Form
+ Bezeichnung=Wert
+wobei Wert in hexadezimaler Form angegeben ist. In der folgenden Beschreibung steht x,
+y und z für irgendeine Hexadezimalziffer.
+
+ ic=0xxxxx Der virtuelle Befehlszähler der Task zeigt auf /xxxxx im Datenraum 4
+ dieser Task. Durch die Eingabefolge:
+ 4s<xxxxx>w*return*
+ kann man sich den Code, der ausgeführt werden soll, ansehen.
+
+ flags=xxyy Bit /80 von yy zeigt den Fehlerzustand an.
+ Bit /40 von yy zeigt 'disable stop' (siehe Benutzerhandbuch) an.
+ Bit /10 von yy zeigt vorzeichenlose Arithmetik an (Compilierung).
+
+ lbas=xxxx Die lokale Basis steht auf /1xxxx im Datenraum 4 (Wortadresse).
+
+ pbas=xx Die Paketbasis steht auf /xx00 im Datenraum 4 (Wortadresse).
+
+ hptop=xyz3 Der Arbeitsheap geht von /30000 (Byteadresse!) bis /3xyz0 (Byte­
+ adresse!).
+
+ chan=xx Die Task hängt an Kanal /xx (Terminalnummer).
+ 0 <==> kein Terminal angekoppelt.
+
+ task=xxyy,zzzz Die Tasknummer der betrachteten Task ist /yy. /xx ist die Stations­
+ nummer im EUMEL-Netz, /zzzz ist die Versionsnummer zum
+ Abdichten von 'send'/ 'wait'.
+
+Um den Code, auf den der 'ic' zeigt, zu interpretieren, ziehe man das Brikett zu Rate.
+#page#
+#cc("Anhang B: Einige ","EUMEL-Begriffe")##goalpage("glossar")#
+
+
+#on("bold")#Archiv:#off("bold")#
+
+ Medium (z.B. Diskette, Band, Kassette) zur Speicherung von Datenräumen (Pro­
+ grammen, Daten und Dateien) einer oder mehrerer Tasks außerhalb eines
+ EUMEL-Systems zum Zwecke der Aufbewahrung oder des Datenaustauschs.
+
+ Auch ein ganzer EUMEL-Hintergrund kann (durch 'save system') auf Archiv (z.B. auf
+ eine oder mehrere Disketten) geschrieben werden. Ein solches "Hintergrundarchiv"
+ kann dann zur Erzeugung eines EUMEL-Hintergrundes (im Vortest) dienen.
+
+
+#on("bold")#Archivsystem:#off("bold")#
+
+ Programmsystem zur Übertragung von Datenräumen zwischen Archiv und Hinter­
+ grund.
+
+
+#on("bold")#EUMEL-0 (EUMEL-0-Maschine, Systemkern):#off("bold")#
+
+ Softwareschicht, aufbauend auf die hardwareabhängige Schicht SHard. EUMEL-0 ist
+ nur vom Prozessor, nicht aber von der jeweiligen Rechnerkonfiguration abhängig. Die
+ durch EUMEL-0 definierte Schnittstelle zu höheren (in ELAN implementierten)
+ Schichten ist auf allen EUMEL-Systemen identisch. EUMEL-0 wird auf dem
+ EUMEL-Hintergrundarchiv angeliefert.
+
+
+#on("bold")#Hintergrund (EUMEL-Hintergrund, HG):#off("bold")#
+
+ 1. Medium (z.B. Platte, Diskette, RAM) zur Speicherung von Datenräumen (Pro­
+ grammen, Daten und Dateien) aller Tasks eines EUMEL-Systems;
+ 2. Die Gesamtheit der auf diesem Medium gespeicherten Information.
+
+ Die Bezeichnung "Hintergrund" ist im Zusammenhang mit dem Konzept des im
+ EUMEL realisierten Virtuellen Speichers zu sehen. Der Datentransfer zwischen Hin­
+ tergrund und Arbeitsspeicher (RAM) erfolgt ohne Zutun oder Wissen des EUMEL-
+ Benutzers bzw. der Task, der die Daten gehören.
+
diff --git a/doc/porting-mc68k/1985.11.26/source-disk b/doc/porting-mc68k/1985.11.26/source-disk
new file mode 100644
index 0000000..bf86ccf
--- /dev/null
+++ b/doc/porting-mc68k/1985.11.26/source-disk
@@ -0,0 +1 @@
+porting/portdoc-m68k_eumel-netz-1985-11-26.img
diff --git a/doc/porting-z80/8/doc/Port.Z80 b/doc/porting-z80/8/doc/Port.Z80
new file mode 100644
index 0000000..ed3c80a
--- /dev/null
+++ b/doc/porting-z80/8/doc/Port.Z80
@@ -0,0 +1,2484 @@
+#type ("trium8")##limit (12.0)#
+#pagelength(19.5)#
+#start(1.5,1.5)#
+#type("triumb36")#
+#free(4.0)#
+ EUMEL
+ Portierungshandbuch
+ Z 80
+#type("triumb18")#
+#free(1.5)#
+ Version 8 #page(1)#
+#type ("trium8")##limit (12.0)#
+#block#
+#pagelength(19.5)#
+#head#
+#center#- % -
+
+
+#end#
+#type("triumb14")#Inhalt#a#
+
+Teil 1: Einführung #topage("ein")#
+#free(0.3)#
+ Zweck dieses Handbuchs #topage("zweck")#
+ Referenzliteratur #topage("reflit")#
+ Minimale Hardwarevoraussetzungen #topage("hardw")#
+ Systemdurchsatz #topage("durchsatz")#
+ Softwarekomponenten des EUMEL-Systems #topage("kompo")#
+ Anlieferung des Z80-EUMEL-Systems #topage("anlief")#
+
+Teil 2: Allgemeine Strukturen #topage("allgem")#
+#free(0.3)#
+ Hintergrund #topage("hg")#
+ Archiv #topage("arch")#
+ Hauptspeicher #topage("speicher")#
+
+Teil 3: SHard-Interface Spezifikation #topage("shardifc")#
+#free(0.3)#
+ 0. Vorbemerkungen #topage("vor")#
+ Zur Notation #topage("not")#
+ Link-Leisten #topage("leist")#
+ Allgemeine Link-Bedingungen #topage("link")#
+ Interrupts #topage("intr")#
+ 1. System laden #topage("laden")#
+ 2. Systemstart und -ende #topage("start")#
+ 3. Speicherverwaltung #topage("spver")#
+ Hauptspeicher #topage("haupt")#
+ Schattenspeicher #topage("schatt")#
+ Blocktransfer im Speicher #topage("ldir")#
+ Speicherfehler #topage("memerr")#
+ 4. Zeitgeber #topage("zeit")#
+ 5. Kanäle #topage("channel")#
+ 5.1 Stream-IO #topage("stream")#
+ Terminals #topage("term")#
+ Drucker, Plotter #topage("druck")#
+ Exoten #topage("exot")#
+ 5.2 Block-IO #topage("block")#
+ Block-IO bei Hintergrund und Archiv #topage("bhgarch")#
+ 5.3 IO-Steuerung #topage("iocontrol")#
+ Einstellung serieller Schnittstellen #topage("v24")#
+ Flußkontrolle #topage("fluss")#
+ Kalender #topage("kalender")#
+ 6. SHard-Interface Version #topage("shdver")#
+ 7. ID-Konstanten #topage("ID")#
+ 8. Zusätzliche Leistungen #topage("shdelan")#
+ 9. Spezialroutinen #topage("ke")#
+
+Teil 4: Tips zur Portierung #topage("tips")#
+ 0-Version des SHards #topage("0ver")#
+ Effizienzprobleme #topage("eff")#
+ Typische Fehler #topage("fehler")#
+
+Anhang A: EUMEL-Debugger "Info" #topage("info")#
+#free(0.3)#
+ Aufruf des Infos #topage("aufrinf")#
+ Info-Format #topage("forminf")#
+ Info-Kommandos #topage("cmdinf")#
+ Einige Systemadressen #topage("sysaddr")#
+ Leitblock #topage("pcb")#
+#page#
+#cc("Teil 1: ","Einführung")#
+#goalpage("ein")#
+
+
+#b("Zweck dieses Handbuchs")#
+#goalpage("zweck")#
+
+Dieses Portierungshandbuch wendet sich an diejenigen, die das EUMEL-System auf einem
+neuen Rechnertyp implementieren wollen. Es ist Teil einer Serie von Portierungshandbüchern
+für verschiedene Prozessortypen. Dieses bezieht sich auf Rechner mit Z80-Prozessoren.
+
+Zum Betrieb eines EUMEL-Systems wird dieses Handbuch nicht benötigt!
+
+
+
+#b("Referenzliteratur")#
+#goalpage("reflit")#
+
+
+ "EUMEL Benutzerhandbuch"
+
+ "EUMEL Systemhandbuch"
+
+ "EUMEL Quellcode der insertieren ELAN-Pakete"
+
+ "Z80-Assembly Language Programming Manual"
+ Zilog, 1977
+
+
+
+#b("Minimale Hardwarevoraussetzungen")#
+#goalpage("hardw")#
+
+Um das EUMEL-System effizient einsetzen zu können, sollte die Hardware mindestens
+folgenden Kriterien genügen:
+
+ #ib#CPU#ie# Die Z80-CPU sollte mit mindestens 2.5 MHz arbeiten. Falls
+ die Buszugriffe durch einen CRTC o.ä. verlangsamt werden,
+ sollte die echte Z80-Leistung durchschnittlich mindestens
+ einem ungebremsten 2.5 MHz System entsprechen.
+ Seltene Verlangsamungen (z.B. nur bei I/O-Operationen)
+ spielen bei diesen Ãœberlegungen keine Rolle.
+
+ RAM Das System sollte über mindestens 64 K Byte #ib#Hauptspeicher#ie#
+ verfügen, besser sind 128 K als Anfangsausrüstung.
+
+ #ib#Hintergrund#ie# Als Hintergrundmedium sind #ib#Floppy#ie#, #ib#Harddisk#ie# und RAM bzw.
+ ROM denkbar.
+
+ Kapazität: > 300 K, besser > 400 K (Single-User)
+ > 750 K, besser > 1000 K (Multi-User)
+
+ Zugriff: < 500 ms (Single-User)
+ < 200 ms (Multi-User) *)
+#foot#
+#f#*) Hier ist die durchschnittliche Zugriffszeit auf einen 512 Byte großen Block gemeint. Für Platten und Floppies kann man
+sie als Summe der Positionierzeit über die halbe Platte und der Zeit einer halben Umdrehung berechnen.#a#
+#end#
+
+ #ib#Archiv#ie# Als Archivgerät wird meistens eine Floppy eingesetzt. Aber
+ auch Band oder Kassettenrecorder sind denkbar. Die An­
+ forderungen an Kapazität und Geschwindigkeit sind anwen­
+ dungsspezifisch.
+
+ #ib#Bildschirm#ie# Angestrebt werden sollte ein Bildschirm mit 24 Zeilen mit je
+ 80 Zeichen (oder größer). Kleinere Bildschirme sind anschließ­
+ bar, aber mit 40 Zeichen pro Zeile läßt sich nicht mehr kom­
+ fortabel arbeiten.
+ Rollup und freie Cursorpositionierung sind notwendige Vor­
+ aussetzungen, invers-video ist erwünscht, aber nicht not­
+ wendig. Weiterhin werden 'Löschen bis Zeilenende' und
+ 'Löschen bis Schirmende' benötigt. Lokale Editierfunktionen
+ sind überflüssig.
+
+ #ib#Tastatur#ie# An Steuertasten sollten mindestens ESC und die vier Cursor­
+ tasten vorhanden sein. Dabei ist es günstig, wenn die Cursor­
+ tasten ergonomisch als Block bzw. Kreuz angeordnet sind.
+ EUMEL benötigt weitere Steuertasten für HOP, RUBIN,
+ RUBOUT und MARK. Dafür können beliebige Tasten der
+ Tastatur gewählt werden.
+
+
+
+#b("Systemdurchsatz")#
+#goalpage("durchsatz")#
+
+Da das EUMEL-System auf dem Prinzip des Demand Paging aufbaut, hängt der System­
+durchsatz von
+
+ - CPU Leistung
+ - Speichergröße (RAM)
+ - Geschwindigkeit beim Hintergrundzugriff (Floppy, Harddisk)
+
+ab. Mit zunehmender Benutzerzahl steigen in der Regel die Anforderungen an das Paging
+(Hintergrund-Zugriff) schneller als an die CPU. In diesem Bereich kann man die System­
+leistung dann durch mehr Speicher und/oder eine schnellere Platte in größerem Umfang
+steigern. Dabei läßt sich eine langsame Platte teilweise durch mehr RAM und umgekehrt
+wenig RAM durch eine schnelle Platte ausgleichen.
+
+
+
+#b("Softwarekomponenten des EUMEL-Systems")#
+#goalpage("kompo")#
+
+Das EUMEL-System besteht aus mehreren Schichten:
+
+
+
+ EUMEL  2: Standardpakete, Editor, ...
+
+ EUMEL  1: ELAN Compiler
+
+ EUMEL  0: Basismaschine
+
+ EUMEL -1: SHard
+
+ H a r d w a r e
+
+
+Dieses #ib#Schichtenmodell#ie# ist nach oben offen und kann deshalb um beliebig viele (höhere)
+Schichten erweitert werden.
+
+EUMEL > 0 Die Standardsoftware der Schichten > 0 ist in der Sprache ELAN geschrie­
+ ben (siehe "EUMEL Quellcode"). Dementsprechend sind alle Schichten ober­
+ halb der EUMEL-0-Maschine prozessor- und rechnerunabhängig, d.h.
+ Anpassungen an einen neuen Rechnertyp sind nicht erforderlich.
+
+#ib#EUMEL 0#ie# Die sogenannte "EUMEL-0-Maschine" enthält alle Basisoperationen und
+ hängt davon ab, welchen Prozessortyp der Rechner als CPU verwendet. Sie
+ existiert für verschiedene Prozessortypen. Hier wird nur auf den Typ Z80
+ Bezug genommen. Bei der Portierung auf einen Z80-Rechner wird die
+ Z80-EUMEL-0-Maschine ohne Anpassungen (!) übernommen.
+
+EUMEL -1 Diese Schicht stellt das Interface zwischen der EUMEL-0-Maschine und der
+ eigentlichen Hardware (vom Prozessor abgesehen) dar. Insbesondere umfaßt
+ sie alle Routinen zur Ansteuerung peripherer Geräte (Gerätetreiber).
+ Diese Schicht wird "SHard" genannt ("S"oftware-"Hard"ware Interface).
+
+Der SHard ist der einzige Teil des Systems, der bei der Portierung auf einen Z80-Rech­
+ner angepaßt bzw. neu geschrieben werden muß. Deshalb besteht der größte Teil dieses
+Handbuchs aus der Spezifikation des Z80-SHards.
+
+
+
+#b("Anlieferung des Z80-EUMEL-Systems")#
+#goalpage("anlief")#
+
+Der Implementierer erhält die EUMEL-Software auf Disketten. Dabei stehen folgende Stan­
+dardformate zur Wahl:
+
+ 8", 1D, 77 Spuren, 16 Sektoren (\#0...\#15) � 512 Byte
+
+ 8", 2D, 77 Spuren, 16 Sektoren (\#0...\#15) � 512 Byte
+
+ 5", 2D, 40 Spuren, 9 Sektoren (\#1...\#9) � 512 Byte *)
+#foot#
+#f#*) 48 tpi#a#
+#end#
+
+
+Die Diskettenlieferung enthält
+
+ - Single-User Hintergrund
+ - Multi-User Hintergrund
+ - Standardarchive
+ - Archive mit weiterer Anwendersoftware
+
+Dabei enthält der Hintergrund auch die EUMEL-0-Software (oft auch als "Urlader" be­
+zeichnet).
+
+#on("i")#Bitte gehen Sie vorsichtig mit diesen Mutterdisketten um. Verwenden Sie sie nur als Quelle
+beim Kopieren. Sie sollten nur auf Kopien davon arbeiten!#off("i")#
+#page#
+#cc("Teil 2: ","Allgemeine Strukturen")#
+#goalpage("allgem")#
+
+
+#b("Hintergrund")#
+#goalpage("hg")#
+
+Der Hintergrund ist in 512 Bytes große Blöcke unterteilt. Sie werden durch Blocknummern (0,
+1, 2, ...) adressiert. Die physische Ablage der Blöcke auf dem Hintergrundmedium bleibt dem
+SHard überlassen. Er kann sie z.B. linear oder versetzt anordnen. Man sollte darauf achten,
+daß Positionierungen auf logisch "nahe" Blöcke möglichst schnell gehen sollten. Deshalb ist
+in der Regel zylinderorientierte Anordnung der oberflächenorientierten vorzuziehen.
+
+Falls auf dem Hintergrundgerät spezielle Blöcke z.B. für Boot und SHard freigehalten werden
+sollen, muß das bei der Abbildung der Hintergrundblocknummern auf die Sektoren der Floppy
+bzw. der Harddisk berücksichtigt werden.
+
+Aufbau des Hintergrundes:
+
+ Block 0 Systemetikett
+
+ Block 10...10+k-1 EUMEL-0-Software (Urlader)
+
+ Block 1...9, 10+k ... Paging-Bereich
+
+
+Aufbau des #ib#Systemetikett#ie#s (#ib#Block 0#ie#):
+
+ Byte Wert/Aufgabe
+
+ 0...5 "EUMEL-"; Kennzeichen für EUMEL-Hintergrund.
+ 6...11 Versionsnummer in druckbaren Zeichen. Sie stellt sicher, daß Urlader und
+ Hintergrund kompatibel sind.
+ 12 FFh ; zur Zeit ohne Bedeutung
+ 13 enthält Wert 0 , wenn System im Shutupzustand ist.
+ 14..15 Systemlaufzähler (14=low, 15=high). Wird bei jedem Systemstart um 1
+ erhöht.
+ 16..35 Reserviert; zur Zeit ohne Bedeutung
+ 36..37 Aus historischen Gründen für interne Zwecke belegt.
+ 38 .. 69 Hier kann eine Installationsnummer geführt werden.
+ 70 .. 79 Info-Paßwort
+ 80 =0 Normalzustand
+ =1 Kompresslauf erforderlich (System frisch von Archiv geladen)
+ 81...255 Reserviert.
+ 256..511 Kann von SHard beliebig verwendet werden.
+
+
+
+#b("Archiv")#
+#goalpage("arch")#
+
+Wie der Hintergrund sind die Archive in 512 Bytes große Blöcke unterteilt. Bisher gibt es
+folgende #dx("Standardformate")#:
+
+
+ 8", 1D, 77 Spuren, 16 Sektoren (\#0...\#15) � 512 Byte
+ 8", 2D, 77 Spuren, 16 Sektoren (\#0...\#15) � 512 Byte
+
+ Block Seite Spur Sektor
+
+ 0 0 0 0
+ 16 0 1 0
+ 77*16 1 0 0
+
+ n n DIV (77*16) n MOD (77*16) DIV 16 n MOD 16
+
+
+ 5", 2D, 40 Spuren, 9 Sektoren (\#1...\#9) � 512 Byte
+
+ Block Seite Spur Sektor
+
+ 0 0 0 1
+ 9 0 1 1
+ 40*9 1 0 1
+
+ n n DIV (40*9) n MOD (40*9) DIV 9 n MOD 9 + 1
+
+
+ 5", 2D, 80 Spuren, 9 Sektoren (\#1...\#9) � 512 Byte
+
+ Block Seite Spur Sektor
+
+ 0 0 0 1
+ 9 0 1 1
+ 80*9 1 0 1
+
+ n n DIV (80*9) n MOD (80*9) DIV 9 n MOD 9 + 1
+
+
+ 5", HD, 80 Spuren, 15 Sektoren (\#1...\#15) � 512 Byte
+
+ Block Seite Spur Sektor
+
+ 0 0 0 1
+ 15 0 1 1
+ 80*15 1 0 1
+
+ n n DIV (80*15) n MOD (80*15) DIV 15 n MOD 15 + 1
+
+
+Selbstverständlich können auch andere #ib#Archivformate#ie# implementiert werden, falls das aus
+Hardwaregründen notwendig ist oder sich dadurch wesentliche Verbesserungen (z.B. in der
+Kapazität) ergeben.
+
+Wenn irgend möglich sollte aber mindestens eines der oben aufgeführten Standardformate
+unterstützt werden - evtl. als zusätzliches Format -, um den Austausch zwischen verschie­
+denen Rechnertypen zu vereinfachen.
+
+#on("i")#Hinweis: Um den Datenaustausch zwischen verschiedenen Rechnertypen zu vereinfachen,
+ sollten möglichst alle der hardwaremäßig möglichen Standardformate (mindestens
+ lesend) unterstützt werden. Dabei sollte SHard sich automatisch auf das Format
+ der jeweils eingelegten Floppy einstellen:#off("i")#
+
+
+ Laufwerkstyp Diskettentyp(en)
+
+ 8" 1D 8" 1D
+ 8" 2D 8" 2D, 1D
+
+ 5" 2D-40 5" 2D-40
+ 5" 2D-80 5" 2D-80, 2D-40 *)
+ 5" HD-80 5" HD-80, 2D-80, 2D-40 *)
+#foot#
+#f#*) Bei der Behandlung von 40-Spur-Disketten auf 80-Spur-Laufwerken gelten meistens folgende Regeln:
+ a) Lesen funktioniert sicher.
+ b) Schreiben ist unsicher, funktioniert aber häufig.
+ c) Formatieren funktioniert fast nie.
+#a#
+#end#
+
+
+
+#b("Hauptspeicher")#
+#goalpage("speicher")#
+
+Die 64 K des direkt vom Z80 adressierbaren #ib#Speicher#ie#s sind folgendermaßen aufgeteilt:
+
+ FFFFh #corner1("-5.0")#
+ Platz für SHard
+ yyyyh #box3("T","3","75.0")#
+ #corner1("-5.0")#
+ Pagingbereich
+
+ xxxxh #box3("T","3","75.0")#
+ #corner1("-5.0")#
+ EUMEL 0
+
+ 1400h #box3("T","3","75.0")#
+ #corner1("-5.0")#
+ Platz für SHard
+ 0000h #box3("T","3","75.0")#
+
+Möglichst große Teile des SHards (am besten alle) sollten im unteren Adreßbereich (bis
+13FFh) liegen, damit dem Paging viel Speicher zur Verfügung steht.
+
+Der nicht direkt (aber durch Banking oder DMA) erreichbare Teil des #ib#RAM#ie#s wird Schatten­
+speicher (siehe S.#topage("schatt")#) genannt.
+
+
+Hinweis: Falls ein Teil des Hauptspeicher-Adreßraums fest (d.h. auch nach dem Boot­
+ loading nicht ausblendbar) durch ROM belegt ist, muß dieses in einem der beiden
+ SHard-Bereichen liegen.
+
+#page#
+#cc("Teil 3: SHard ","Interface Spezifikation")#
+#goalpage("shardifc")#
+
+
+#bb("0. ","Vorbemerkungen")#
+#goalpage("vor")#
+
+
+#b("Zur Notation")#
+#goalpage("not")#
+
+Im folgenden wird zwischen #dx("0-Routinen")#, die dem SHard vom EUMEL-0-System zur
+Verfügung gestellt werden, und #dx("SHard-Routinen")# unterschieden, die der SHard implementie­
+ren muß. Damit dieser Unterschied bei der Spezifikation deutlich wird, werden 0-Routinen
+folgendermaßen aufgeführt:
+
+ name (0-Routine)
+
+Zusätzlich werden 0-Routinen grundsätzlich klein und SHard-Routinen groß geschrieben.
+
+Z80-Befehle werden wie in "Z80-Assembly Language Programming Manual" (Zilog, 1977)
+notiert:
+
+ ld a,27
+ add a,l
+
+Hexadezimale Zahlen werden durch ein nachgestelltes 'h' gekennzeichnet:
+
+ 12h = 18
+ 1Fh = 31
+ FFFFh = 65535
+
+
+#b("Link-Leisten")#
+#goalpage("leist")#
+
+Die Verbindung zwischen SHard und Urlader (EUMEL-0) erfolgt über zwei Tabellen. In der
+"0-Leiste" stellt EUMEL-0 dem SHard verschiedene 0-Routinen zur Verfügung. Diese
+Leiste beginnt an der Adresse 1400h:
+
+ 1400h defm 'EUMEL '
+ 1410h defw eumel0blocks
+ 1412h defw hgversion
+ 1414h defw 1 ; Kennzeichen für Z80-Urlader
+ 1416h defw urladerversion
+ 1418h defw 0 ; reserviert
+ 141ah defw ; kleinste unterstützte SHardversion
+ 141ch defw ; größte ...
+ 141eh jp systemstart
+ jp inputinterrupt
+ jp timerinterrupt
+ jp warte
+ jp grab
+ jp free
+ jp shutup
+ jp info
+
+Diese Leiste wird vom Urlader nach dem Systemstart überschrieben. Der SHard muß daher,
+bevor er nach systemstart springt, die für ihn relevanten Teile (mindestens die Sprungbefehle)
+in einen eigenen Bereich kopieren:
+
+ #ib#eusystemstart#ie#: jp 0
+ #ib#euinputinterrupt#ie#: jp 0
+ #ib#eutimerinterrupt#ie#: jp 0
+ #ib#euwarte#ie#: jp 0
+ #ib#eugrab#ie#: jp 0
+ #ib#eufree#ie#: jp 0
+ #ib#eushutup#ie#: jp 0
+ #ib#euinfo#ie# jp 0
+
+So kann SHard die entsprechenden 0-Routinen vermittels der obigen Vereinbarungen aufru­
+fen:
+
+ jp eusystemstart
+ ...
+ call euwarte
+
+Für die Gegenrichtung muß SHard der 0-Maschine die "SHard-Leiste" zur Verfügung
+stellen, deren Adresse beim Sprung nach 'systemstart' in HL stehen muß. Die 0-Maschine
+kopiert diese Leiste. SHard darf daher anschliessend den Bereich anderweitig (z.B.
+EA-Puffer) verwenden:
+
+
+ #ib#SHDID#ie#: defm 'SHARD ' ; 16 Byte
+ #ib#SHDVER#ie#: defw 8
+ #ib#MODE#ie#: defw
+ #ib#ID4#ie#: defw
+ #ib#ID5#ie#: defw
+ #ib#ID6#ie#: defw
+ #ib#ID7#ie#: defw
+ defw
+ defw
+ #ib#OUTPUT#ie#: jp shout
+ #ib#BLOCKIN#ie#: jp shbin
+ #ib#BLOCKOUT#ie#: jp shbout
+ #ib#IOCONTROL#ie#: jp shiocnt
+ #ib#SYSEND#ie#: jp shend
+ #ib#SCHINF#ie#: jp shsinf
+ #ib#SCHACC#ie#: jp shsacc
+ defw
+ #ib#LIMIT#ie#: defw
+
+
+#b("Allgemeine Link-Bedingungen")#
+#goalpage("link")#
+
+In der Regel sind sowohl 0-Routinen als auch SHard-Routinen durch 'call' aufzurufen:
+
+ call <routine>
+
+Ausnahmen von dieser Regel sind im folgenden stets besonders vermerkt.
+
+Generelle Link-Bedingung (für SHard- und 0-Routinen) ist:
+
+ Alle Register - bis auf die jeweils spezifizierten Ausgangsparameter und das F-Regi­
+ ster *) - bleiben unverändert.
+#foot#
+#f#*) Flags sind i.a. nach dem Aufruf einer Routine undefiniert. Ausnahmen sind natürlich die Flags, die als Ausgangs­
+parameter in manchen Fällen definiert sind.#a#
+#end#
+
+Jede SHard-Routine muß also alle Register (bis auf F), die sie verändert und die keine
+Ausgangsparameter sind, retten und wiederherstellen. Im Gegenzug braucht SHard beim
+Aufruf von 0-Routinen selbst keine Register zu retten.
+
+
+#b("Interrupts")#
+#goalpage("intr")#
+
+Zwei externe Ereignisse (Zeitgeber und Eingabe, siehe S.#topage("zeit")# und S.#topage("inp")#) werden von
+EUMEL-0 behandelt. Die entsprechenden Interrupts muß SHard per 'call' an 0-Routinen
+weiterleiten. Außerhalb des Moduls SHard wird der 'reti'-Befehl nicht verwendet, damit der
+SHard die Kontrolle über die Interruptlevel behält. Die Register (bis auf die Eingangsparame­
+ter) werden von den aufzurufenden 0-Routinen selbst gesichert. Die normale Interrupt-
+Sequenz im SHard sieht dann folgendermaßen aus:
+
+ intadr: push af
+ ld a,<parameter>
+ call <routine>
+ pop af
+ reti
+
+Achtung: SHard muß die Interrupt-Routinen im 'disable-int'-Modus anspringen. Dies ist
+ normalerweise schon durch die Hardware gegeben.
+
+Die 0-Routinen geben von sich aus den 'ei'-Befehl. Dies erfolgt im allgemeinen sehr
+frühzeitig (innerhalb der ersten 30 Befehle), um einen interruptgetriebenen Floppytreiber
+zulassen zu können.
+
+
+
+
+#bb("1. System ","laden")#
+#goalpage("laden")#
+
+SHard muß die EUMEL-0-Software vor dem eigentlichen Start laden. EUMEL-0 befindet
+sich normalerweise auf dem Hintergrund. Es müssen von Block 10 an eumel-0-blocks
+(siehe 0-Leiste) Blöcke in den Speicher von der Adresse 1400h an aufsteigend geladen
+werden.
+
+ Achtung: Zu diesem Zeitpunkt kann SHard die oben aufgeführten 0-Routinen natür­
+ lich noch nicht benutzen. Insbesondere dürfen die Laderoutinen nicht 'warte'
+ aufrufen. Das wird hier besonders betont, weil der Hintergrundzugriff beim
+ eigentlichen Systemlauf in der Regel 'warte' verwenden wird.
+
+ Hinweis: Der erste Block der EUMEL-0-Software (Block 10) enthält in den ersten
+ fünf Bytes den Text "EUMEL", um eine Identifikation durch den SHard-
+ Lader zu ermöglichen.
+
+Es wird empfohlen, nach folgendem Verfahren zu laden:
+
+ IF archivgeraet enthaelt diskette AND eumel 0 auf archiv
+ THEN lade eumel 0 vom archiv
+ ELIF eumel 0 auf hintergrund
+ THEN lade eumel 0 vom hintergrund
+ ELSE laden unmoeglich
+ FI .
+
+So kann man auch bei einem frisch formatierten Hintergrundmedium einen neuen Hinter­
+grund (mit EUMEL-0-Urlader) einspielen, indem man ein Hintergrundarchiv vor dem
+Systemstart in das Archivgerät legt. Dann wird EUMEL-0 von dort geladen, so daß man den
+Hintergrund dann wie im Systemhandbuch beschrieben vom Archiv auf das Hintergrund­
+medium kopieren kann.*)
+#foot#
+#f#*) Kopiervorgänge (Archiv -> Hintergrund) werden vom EUMEL-0-Urlader erledigt, so daß SHard keine derartigen
+Routinen enthalten muß.#a#
+#end#
+
+
+
+#bb("2. System","start und -ende")#
+#goalpage("start")#
+
+SHard muß alle für den Rechner notwendigen (Hardware-) Initialisierungen durchführen und
+erst danach die EUMEL-0-Maschine starten ('systemstart').
+
+ #dx("systemstart")# (0-Routine)
+
+ Eingang: HL = Adresse der SHard-Leiste
+ Interrupts disabled
+
+ Aufruf: jp systemstart
+
+ Zweck: Die EUMEL-0-Maschine wird gestartet. Alle notwendigen
+ Hardwareinitialisierungen (Interrupt Modus des Z80 und Ini­
+ tialisierungen der Peripheriebausteine) müssen vorher schon
+ geschehen sein.
+
+ Hinweis: Der Stackpointer braucht nicht definiert zu sein, da beim
+ Ansprung DI-Zustand herrschen sollte und somit keine
+ Interrupts auftreten können. EUMEL-0 lädt beim Start das
+ SP-Register und läßt Interrupts zu (EI). Falls jedoch in dieser
+ Zeit ein "Non Maskable Interrupt" auftreten kann, muß SHard
+ SP "vorläufig" laden.
+
+ MODE: Über das MODE-Wort in der SHard-Leiste können Op­
+ tionen gesetzt werden:
+
+ Bit 0 = 0 EUMEL-0 ist auf dem Hintergrund abge­
+ speichert. Der entsprechende Bereich bleibt
+ geschützt. (Standard)
+
+ Bit 0 = 1 EUMEL-0 befindet sich nicht auf dem Hin­
+ tergrund. Der entsprechende Bereich steht
+ zur freien Verfügung für andere EUMEL-
+ Daten.
+ (Da die EUMEL-0-Software nur beim
+ Systemstart geladen wird (read only!), kann
+ es bei Geräten mit kleinem Hintergrund
+ interessant sein, diese Blöcke auf dem
+ Hintergrund anderweitig zu nutzen. Das
+ Systemladen kann dann z.B. mit Hilfe einer
+ speziellen Urladediskette vom Archivgerät
+ aus erfolgen.)
+
+ Bit 8 = 0 Beim Systemstart wird der Speicher über­
+ prüft. (Standard)
+
+ Bit 8 = 1 Der Speichertest beim Systemstart unter­
+ bleibt. Man sollte nur bei Rechnern, die
+ beim Einschalten schon eigene Speicher­
+ tests durchführen, auf den Speichertest des
+ EUMEL verzichten.
+
+ Bit 9 = 0 Beim Systemstart wird die Vortest-Tapete
+ ausgegeben und man kann durch Eingabe
+ eines Zeichens die Vortestmenüs aktivieren
+ (s. Systemhandbuch). (Standard)
+
+ Bit 9 = 1 Die Vortest-tapete wird unterdrückt. Es gibt
+ auch keine Möglichkeit, die Vortestfunk­
+ tionen aufzurufen. Der Speichertest unter­
+ bleibt ebenfalls.
+
+
+ #dx("SYSEND")#
+
+ Parameter: -
+
+ Zweck: Hiermit wird SHard das Ende eines Systemlaufs mitgeteilt.
+ Somit können evtl. notwendige Abschlußbehandlungen durch­
+ geführt werden. SHard kann mit 'ret' zu EUMEL-0 zurück­
+ kehren, muß aber nicht. Diese Routine kann z.B. dazu benutzt
+ werden, die Hardware auszuschalten oder in ein umgebendes
+ System zurückzukehren (EUMEL als Subsystem). In den
+ meisten Fällen wird die Routine leer implementiert werden,
+ d.h. nur aus 'ret' bestehen.
+
+
+#bb("3. ","Speicherverwaltung")#
+#goalpage("spver")#
+
+
+#b("Hauptspeicher")#
+#goalpage("haupt")#
+
+Der Hauptspeicher (#ib#RAM#ie#) umfaßt die direkt adressierbaren 64 K des Z80. Da die Anfangs­
+adresse des für EUMEL-0 und Paging verfügbaren Bereichs fest ist (1400h), muß SHard nur
+über die Obergrenze des verfügbaren Bereichs informieren.
+
+ #dx("LIMIT")#
+
+ Ãœber das LIMIT-Wort in der SHard-Leiste kann sich SHard
+ noch Bereiche vor dem Speicherende (z.B. für CP/M BIOS)
+ freihalten. Auf jeden Fall muß CFFFh <= LIMIT gewährleistet
+ sein, d.h. der Bereich bis CFFFh gehört zum Pagingbereich.
+ Im Normalfall wird FFFFh geliefert werden.
+
+
+
+#b("Schattenspeicher")#
+#goalpage("schatt")#
+
+Das EUMEL-System ist in der Lage, trotz der durch die 16-Bit Adressen gegebenen Ein­
+schränkung auf 64 kB, weiteren Speicher anzuschließen. Dieser wird Schattenspeicher
+genannt.
+
+Der Schattenspeicher (#ib#RAM#ie#) sollte so angeschlossen sein, daß über ein nicht zu großes #ib##on("italic")#
+Fenster#ie##off("italic")# des normalen Adressraumes ( < 4 kB) auf diesen zugegriffen werden kann. Welcher
+Bereich des Schattenspeichers dabei gemeint ist, wird durch die SHard-Routine SCHACC
+mitgeteilt (s.u.). Diese Art des Zugriffs wird Fenstermodus genannt. Das Restsystem nutzt das
+Fenster echt (d.h. ohne den Inhalt in andere Bereiche des normalen Adressraumes zu trans­
+portieren).
+
+Ist ein so kleines Fenster in der Hardware nicht vorgesehen (z.B. 48 kB Bänke bzw. nur
+DMA-Zugriff), so kann auch solcher Schattenspeicher benutzt werden (Transportmodus).
+Wichtig ist dabei, daß EUMEL-0 die oben erwähnten echten Fensterzugriffe unterläßt.
+(Simulation im Transportmodus wäre erheblich zu teuer.) Daher muß EUMEL-0 wissen, in
+welchem Modus der Schattenspeicher ansprechbar ist (SCHINF).
+
+Hinweis: Wenn möglich sollte der Fenstermodus implementiert werden, da er im Multi-
+ User-Betrieb (ab ca. 3 Teilnehmern) deutliche Effizienzvorteile bietet.
+
+
+Das Schattenspeicherinterface gibt es in 2 Modi:
+
+ - Fenstermodus (Bit 2**15 von BC gesetzt bei SCHINF)
+ - Transportmodus (Bit 2**14 von BC gesetzt bei SCHINF)
+
+
+#d("Fenstermodus")#
+
+ #dx("SCHINF")# (im Fenstermodus)
+
+ Ausgang: BC 2**15 + Schattenspeichergröße (in K)
+
+ Zweck: EUMEL-0 kann so die Größe des Schattenspeichers und den
+ gewünschten Modus (hier: Fenstermodus) erfragen. Falls kein
+ Schattenspeicher vorhanden ist, muß 0 als Größe geliefert
+ werden. Das Resultat von SCHINF darf sich innerhalb eines
+ Systemlaufs nicht ändern.
+
+
+ #dx("SCHACC")# (im Fenstermodus)
+
+ Eingang: HL Nummer der 1/2K-Seite, die in das Fenster zu schal­
+ ten ist.
+ Ausgang: HL Anfangsadresse (im Normaladreßraum) des aktuellen
+ Fensters
+
+ Zweck: Dient zum Zugriff auf den Schattenspeicher über das Fen­
+ ster. Man beachte, daß mehrere Fenster möglich sind, aber
+ alle im Adreßbereich des SHards liegen müssen! Die Num­
+ mern der 1/2K-Seiten des Schattenspeichers liegen immer
+ im Bereich von 0 bis 2n-1, wobei n die von SCHINF geliefer­
+ te Größe des Schattenspeichers ist. Daraus folgt, daß
+ SCHACC nicht aufgerufen wird, falls kein Schattenspeicher
+ vorhanden ist.
+
+#d("Transportmodus")#
+
+ #dx("SCHINF")# (im Transportmodus)
+
+ Ausgang: BC 2**14 + Schattenspeichergröße (in K)
+
+ Zweck: EUMEL-0 kann so die Größe des Schattenspeichers und den
+ gewünschten Modus (hier: Transportmodus) erfragen. Falls
+ kein Schattenspeicher vorhanden ist, muß 0 als Größe gelie­
+ fert werden. Das Resultat von SCHINF darf sich innerhalb
+ eines Systemlaufs nicht ändern.
+
+
+ #dx("SCHACC")# (im Transportmodus)
+
+ Eingang: A = 1 Transport in den Schattenspeicher
+ A = 2 Transport aus dem Schattenspeicher
+ DE Nummer der 1/2K Seite im Schattenspeicher
+ HL Adresse im normalen Hauptspeicherbereich
+
+ Zweck: Es werden jeweils 512 Bytes aus dem Normal- in den
+ Schattenspeicher (A=1) bzw. aus dem Schattenspeicher in
+ den normalen Hauptspeicher (A=2) kopiert.
+ Die Nummern der 1/2K-Seiten des Schattenspeichers liegen
+ immer im Bereich von 0 bis 2n-1, wobei n die von SCHINF
+ gelieferte Größe des Schattenspeichers ist. Daraus folgt, daß
+ SCHACC nicht aufgerufen wird, falls kein Schattenspeicher
+ vorhanden ist.
+
+ Eingang: A = 3
+ E Index (immer geradzahlig: 0,2,4,...254)
+ Ausgang: BC Bereichslänge DIV 3
+ HL Bereichsadresse
+
+ Zweck: Für den angegebenen Index ist die Adresse eines Haupt­
+ speicherbereichs und 1/3 der Länge dieses Bereichs zu­
+ rückzumelden (Anzahl Einträge � 3 Bytes) Es sind also 128
+ solcher Bereiche zur Verfügung zu stellen. Bei n K Schat­
+ tenspeicher sollte jeder Bereich größer als 6*n/128 Bytes sein.
+ Alle Bereiche müssen gleich groß sein.
+
+ Beispiel: Bei bis zu 256 K sollten 16-Byte-Bereiche
+ benutzt werden:
+
+ shacc3: ld l,e
+ ld h,0
+ add hl,hl
+ add hl,hl
+ add hl,hl
+ ld bc,schtab
+ add hl,bc ; <e> DIV 2 * 16 + schtab
+ ld bc,5 ; 16 DIV 3
+ ret
+
+ schtab: defs 128*16
+
+
+
+
+#b("Blocktransfer im Speicher")#
+#goalpage("ldir")#
+
+
+
+#b("Speicherfehler")#
+#goalpage("memerr")#
+
+Falls die Hardware Speicherfehler aufgrund von Paritybits, ECC oder ähnlichem feststellen
+und an SHard melden kann, sollte das zur Erhöhung der Systemsicherheit genutzt werden.
+
+Wenn SHard (z.B. über Interrupt) einen Speicherfehler mitgeteilt bekommt, sollte er wenn
+möglich eine entsprechende Meldung ausgeben und das System brutal anhalten:
+
+ rien#ub# #ue#ne#ub# #ue#vas#ub# #ue#plus: jr rien#ub# #ue#ne#ub# #ue#vas#ub# #ue#plus
+
+
+Wenn Speicherfehler mit Sicherheit bemerkt werden, verhindert diese Reaktion, daß die
+Fehler auf dem Hintergrund festgeschrieben werden und evtl. später zu Systemfehlern führen.
+
+Der Anwender kann dann durch Hardware-Reset auf den letzten Fixpunkt des EUMEL-
+Systems zurücksetzen. So verliert er zwar evtl. die letzten Minuten seiner Arbeit, behält aber
+auf alle Fälle ein konsistentes System.
+
+
+
+
+#bb("4. ","Zeitgeber")#
+#goalpage("zeit")#
+
+SHard muß einen Zeitgeberinterrupt erzeugen, der ca. 10 bis 100 mal pro Sekunde auftritt.
+Dabei ist die 0-Routine 'timerinterrupt' aufzurufen. Ohne diesen Interrupt wird die Uhr nicht
+geführt, und die Zeitscheibenlogik für das Timesharing fällt aus.
+
+ #dx("timerinterrupt")# (0-Routine)
+
+ Eingang: A seit letztem Zeitgeberinterrupt vergangene Zeit (in ms)
+
+ Zweck: Wird von EUMEL-0 für interne Uhren und für das Schedu­
+ ling (Zeitscheibenlogik) verwendet. Es werden keine hohen
+ Genauigkeitsanforderungen an die Zeitangaben bei #on("i")#einzel­
+ nen#off("i")# Interrupts gestellt. Um EUMEL-0 eine genaue Real­
+ zeituhr zu ermöglichen, sollte die so erzeugte Zeitangabe #on("i")#im
+ Mittel#off("i")# aber möglichst genau sein, d.h. die Summe der inner­
+ halb einer Minute so übergebenen Werte sollte zwischen
+ 59995 und 60005 liegen.
+
+
+
+#bb("5. ","Kanäle")#
+#goalpage("channel")#
+
+Einiges zum Kanalkonzept:
+
+Das System kennt die Kanäle 0..32.
+
+ Kanal 0 ist der Systemhintergrund.
+ Die Kanäle 1..15 sind für Stream-IO (Terminals, Drucker, ...) vorgesehen.
+ Kanal 31 ist der Standard-Archivkanal.
+ Kanal 32 ist der Parameterkanal.
+
+Die Kanäle 2.. 30 können installationsabhängig verfügbar sein oder auch nicht. Deren Funk­
+tion ist dann Absprachesache zwischen Installation und SHard.
+
+Kanäle können über Block-IO (BLOCKOUT, BLOCKIN) oder Stream-IO (OUTPUT,..) ange­
+sprochen werden. Das System erfährt über IOCONTROL, welche Betriebsart des Kanals
+sinnvoll ist.
+
+#on("i")##on("b")#Achtung: Alle Kanaloperationen müssen grundsätzlich für alle Kanäle (0...32) aufgerufen
+ werden können. Dabei können Operationen auf nicht vorhandenen Kanälen und
+ unsinnige Operationen (z.B. Stream-IO auf Kanal 0) leer implementiert wer­
+ den.#off("b")# (Dafür werden im folgenden bei jeder SHard-Routine Vorschläge gemacht.)#off("i")#
+
+
+
+#bb("5.1 ","Stream-IO")#
+#goalpage("stream")#
+
+Über Stream-IO wickelt das System die übliche zeichenorientierte Ein-/Ausgabe auf Termi­
+nals, Druckern, Plottern usw. ab. Stream-IO wird nur für die Kanäle 1...15 gemacht.
+
+ #dx("inputinterrupt")# (0-Routine)#goalpage("inp")#
+
+ Eingang: A Kanalnummer (1...15)
+ B eingegebenes Zeichen
+ C Fehlerbits:
+ Bit 0 = 1 Mindestens ein Zeichen ging
+ verloren.
+ Bit 1 = 1 Es wurde der BREAK-Zustand
+ (bei V24) erkannt.
+ Bit 2 = 1 Das Zeichen ist u.U. falsch
+ (Paritätsfehler).
+
+ Ausgang: A Anzahl Zeichen, die noch übernommen werden kön­
+ nen.
+
+ Zweck: SHard muß EUMEL-0 durch Aufruf dieser Routine mitteilen,
+ daß eine Eingabe vorliegt.
+
+ Hinweise: EUMEL-0 puffert die Zeichen. Siehe auch IOCONTROL:
+ "weiter".
+
+ Bei Kanalnummern <1 oder >15 wird der Aufruf von
+ EUMEL-0 ignoriert.
+
+ Falls die Hardware keine Inputinterrupts zur Verfügung stellt,
+ sollte ein Timer benutzt werden, um alle möglichen Input­
+ quellen regelmäßig abzufragen. Dabei muß man allerdings den
+ goldenen Mittelweg zwischen zu häufiger (Systemdurchsatz
+ sinkt) und zu seltener Abfrage (Zeichen gehen verloren)
+ suchen. Man sollte dabei nicht nur an die menschliche Tipp­
+ geschwindigkeit sondern auch an die höchste Baudrate
+ denken, die man für Rechnerkopplungen noch unterstützen
+ will. *)
+#foot#
+#f#*) Eine weitere Möglichkeit, auf manchen Kanälen ohne Interrupts auszukommen, wird bei der IOCONTROL-Funktion
+"weiter" beschrieben (siehe S.#topage("weiter")#).#a#
+#end#
+
+ Falls SHard Flußkontrolle für den Kanal ausüben soll, muß er
+ die Rückmeldung in A auswerten. Dabei ist mit einem geeig­
+ neten Schwellwert zu arbeiten, da in der Regel die sendende
+ Gegenstelle einer Sendeunterbrechung nicht sofort Folge
+ leistet.
+
+ Achtung: #on("i")#Keinesfalls darf 'inputinterrupt' rekursiv aufgerufen werden.
+ Normalerweise wird das automatisch verhindert, wenn man
+ den zugehörigen Hardwareinterrupt erst nach der 0-Routine
+ wieder freigibt. Falls das nicht möglich ist und unter bestimm­
+ ten Umständen das nächste Zeichen abgeholt werden muß,
+ bevor die 0-Routine beendet ist, muß SHard einen eigenen
+ Puffer implementieren:#off("i")#
+
+ hardwareinterrupt:
+ IF input interrupt aktiv
+ THEN trage zeichen in shard puffer ein ;
+ gib hardware interrupt frei
+ ELSE input interrupt aktiv := true ;
+ gib hardware interrupt frei ;
+ input interrupt ;
+ disable interrupt ;
+ WHILE shard puffer enthaelt noch zeichen REP
+ nimm zeichen aus shard puffer ;
+ enable interrupt ;
+ input interrupt ;
+ disable interrupt
+ PER ;
+ input interrupt := false ;
+ enable interrupt
+ FI .
+
+
+ #d("OUTPUT")#
+
+ Eingang: A Kanalnummer (1...15)
+ BC Anzahl auszugebender Zeichen
+ HL Adresse der Zeichenkette
+ Ausgang: BC Anzahl der übernommenen Zeichen
+ C-Flag gesetzt <=> alle Zeichen übernommen
+
+ Zweck: Ausgabe einer Zeichenkette. Diese ist (möglichst ganz) zwi­
+ schenzupuffern, denn die Ausführung von OUTPUT sollte kein
+ Warten auf IO enthalten. Der Ausgabepuffer muß mindestens
+ 50, besser 100 Zeichen fassen können. Durch eine Inter­
+ ruptlogik oder etwas Äquivalentes ist sicherzustellen, daß
+ dieser Puffer parallel zur normalen Verarbeitung ausgegeben
+ wird. Wenn die auszugebende Zeichenkette nicht vollstän­
+ dig in den Puffer paßt, sollten trotzdem so viele Zeichen wie
+ möglich übernommen werden. Im weiteren Verlauf ruft
+ EUMEL-0 dann wieder OUTPUT mit dem Rest der Zei­
+ chenkette auf.
+
+ Hinweis: OUTPUT kann mit BC=0 aufgerufen werden. Auch diese
+ leere Operation muß mit gesetztem C-Flag quittiert wer­
+ den.
+
+ Achtung: #on("i")#Keinesfalls darf innerhalb von OUTPUT die 0-Routine 'warte'
+ aufgerufen werden.#off("i")#
+
+ Vorschlag: Falls der Kanal nicht existiert bzw. OUTPUT darauf unsinnig
+ ist, sollte vorgegaukelt werden, alle Zeichen seien ausge­
+ geben (BC unverändert und C-Flag gesetzt).
+
+
+
+#b("Terminals")#
+#goalpage("term")#
+
+"Normale" #ib#Terminal#ie(1,", normales")#s können ohne weitere Unterstützung des SHards angeschlossen wer­
+den. Die zur Anpassung an den EUMEL-Zeichensatz *) notwendigen #ib#Umcodierungen#ie# werden
+von den höheren Ebenen aus eingestellt. Da diese Umsetztabellen vom SHard unabhängig
+sind, stehen automatisch alle so angepaßten Terminaltypen allen EUMEL-Anwendern zur
+Verfügung!
+#foot#
+#f#*) Siehe "EUMEL Benutzerhandbuch"#a#
+#end#
+
+Für den Anschluß eines #on("b")##on("i")#integrierten #ib#Terminal#ie(1,", integriertes")#s#off("i")##off("b")#, in dessen Bildwiederholspeicher direkt gear­
+beitet wird, kann man häufig den Terminaltyp 'psi' verwenden (siehe auch "Exoten").
+
+Näheres zu Terminaltypen und -anschlüssen findet man im "EUMEL Systemhandbuch"
+unter den Stichwörtern #on("i")#Konfiguration#off("i")# und #on("i")#Konfigurierung#off("i")#.
+
+
+
+#bb("Drucker, ","Plotter")#
+#goalpage("druck")#
+
+#ib#Drucker#ie# und Plotter werden vom EUMEL-System wie Terminals angesehen. Da in der Regel
+der Rechner aber schneller Zeichen senden als der Drucker drucken kann, müssen solche
+Geräte in der Regel mit Flußkontrolle angeschlossen werden (siehe S.#topage("fluss")#).
+
+Wenn Drucker oder Plotter über eine Parallelschnittstelle angeschlossen werden, kann man
+auf diesem Kanal möglicherweise auf einen Ausgabepuffer verzichten. Voraussetzung ist
+dabei, daß
+
+ a) der Drucker einen eigenen Puffer hat und
+ b) der Puffer "schnell" gefüllt werden kann (< 0.1 ms/Zeichen).
+
+Dann kann man auf den bei der SHard-Routine OUTPUT geforderten Puffer verzichten und
+die Zeichenkette direkt über die Parallelschnittstelle an den Drucker übergeben. Wenn der
+Drucker 'Puffer voll' signalisiert, sollte die Zeichenübernahme bei OUTPUT abgebrochen
+werden. *) #on("i")#Auf keinen Fall darf CPU-intensiv auf Freiwerden des Puffers gewartet werden!#off("i")#
+#foot#
+#f#*) siehe auch IOCONTROL "frout", S.#topage("frout")##a#
+#end#
+
+
+
+#b("Exoten")#
+#goalpage("exot")#
+
+Exotische #ib#Terminal#ie(1," exotisches")#s (im Sinne dieser Beschreibung) sind solche, für die eine Umsetztabelle
+im System (siehe Konfiguratorbeschreibung) nicht ausreicht bzw. nicht nötig ist (Beispiele:
+Terminals, in deren Bildwiederholspeicher direkt gearbeitet wird; Terminals, die soweit
+programmierbar sind, daß sie den EUMEL-Zeichencode können).
+
+Für solche Terminals muß in der Konfiguration der Terminaltyp '#ib#psi#ie#' eingestellt werden. Dieser
+wirkt ohne Umcodierungen, d.h. die EUMEL-Codes (siehe Benutzerhandbuch) werden direkt
+dem SHard zugestellt (wie bei 'transparent'), jedoch mit folgenden Besonderheiten:
+
+Eingabeseitig werden zusätzlich folgende Codezuordnungen getroffen:
+
+ Code Funktion
+
+ 7 SV (Aktivierung: 'gib supervisor kommando:')
+ 17 STOP (Ausgabe auf diesen Kanal wird gestoppt)
+ 23 WEITER (Ausgabe läuft wieder weiter)
+ 4 INFO (System geht in Debugger, falls Debugoption)
+
+
+
+#bb("5.2 ","Block-IO")#
+#goalpage("block")#
+
+Ãœber Block-IO wickelt das System die Zugriffe zum Pagingmedium und zum Archiv ab.
+Ferner ist daran gedacht, auch auf V.24-Schnittstellen Block-IO z.B. für Rechnerkopplung
+zuzulassen. Die Kanalnummer in Reg. A unterscheidet diese Fälle. Außer beim Paging (A=0)
+wird ein Block-IO durch die ELAN-Prozeduren 'blockin' und blockout' induziert.
+
+Bei Block-IO wird immer ein 512 Byte großer Hauptspeicherbereich mit übergeben. Dieser
+kann (im Gegensatz zu OUTPUT) direkt benutzt werden, d.h. es muß keine Umpufferung
+erfolgen.
+
+Dieser Hauptspeicherbereich darf nur bei BLOCKIN verändert werden.
+
+SHard darf (anders als bei OUTPUT) erst dann zur Aufrufstelle zurückgeben, wenn die
+verlangte Operation abgeschlossen ist. Treten während der Operation Wartezeiten auf, so muß
+SHard die 0-Routine 'warte' aufrufen, damit das System andere Prozesse weiterlaufen
+lassen kann.
+
+EUMEL-0 definiert bestimmte Funktionen für Hintergrund (Kanal 0) und Archiv (Kanal 31).
+Operationen auf anderen Kanälen kann SHard nach Belieben implementieren und deren
+Leistung seinen Installationen über ELAN-Pakete zur Verfügung stellen. Das System vergibt
+auch in Zukunft für den #ib##on("italic")#Funktionscode#ie##off("italic")# in Register BC nur positive Werte (Bit 7 von B = 0).
+Der SHard kann selbst negative Codes einführen.
+
+
+ #d("BLOCKIN")#
+
+ Eingang: A Kanalnummer (0...32)
+ BC Funktionscode 1
+ DE Funktionscode 2
+ HL Adresse des Hauptspeicherbereichs
+ Ausgang: A undefiniert (darf also verändert werden)
+ BC Rückmeldecode
+ HL darf verändert werden
+
+ Der Inhalt des Hauptspeicherbereichs (<HL>... <HL>
+ +511) darf verändert sein.
+
+ Zweck: "Einlesen" von Blöcken. Die genaue Wirkung hängt vom
+ Funktionscode und dem Kanal ab.
+
+ Vorschlag: Falls der Kanal nicht existiert bzw. BLOCKIN darauf unsinnig
+ ist, sollte die Rückmeldung -1 in BC geliefert werden.
+
+
+ #d("BLOCKOUT")#
+
+ Eingang: A Kanalnummer (0...32)
+ BC Funktionscode 1
+ DE Funktionscode 2
+ HL Adresse des Hauptspeicherbereichs
+ Ausgang: A undefiniert (darf also verändert werden)
+ BC Rückmeldecode
+ HL darf verändert werden
+
+ Der Inhalt des Hauptspeicherbereichs darf #on("i")#nicht#off("i")# verändert
+ werden!
+
+ Zweck: "Ausgeben" von Blöcken. Die genaue Wirkung hängt vom
+ Funktionscode und dem Kanal ab.
+
+ Vorschlag: Falls der Kanal nicht existiert bzw. BLOCKOUT darauf un­
+ sinnig ist, sollte die Rückmeldung -1 in BC geliefert wer­
+ den.
+
+
+ #dx("warte")# (0-Routine)
+
+ Ausgang: Alle Register undefiniert!
+
+ Zweck: Diese Routine ist bei 'blockin' oder 'blockout' dann aufzu­
+ rufen, wenn SHard im Augenblick nichts zu tun hat. Durch
+ den Aufruf von 'warte' erhalten andere Systemteile die
+ Möglichkeit, weiterzuarbeiten. Ein 'warte' kann bis zu ca. 1/4
+ Sekunde Zeit aufnehmen. 'warte' darf nicht in Interrupt­
+ routinen und Stream-IO verwendet werden! 'warte' zerstört
+ alle Register! SHard muß davon ausgehen, daß 'warte' sei­
+ nerseits andere SHard-Komponenten aufruft.
+
+
+Die Verwendung der 0-Routine 'warte' soll hier an einigen Beispielen verdeutlicht werden:
+
+
+ blockout auf platte :
+ WHILE platte noch nicht frei REP
+ warte
+ ENDREP ;
+ uebertrage schreibbefehl an controller ;
+ uebertrage daten an controller .
+
+ blockin von platte :
+ WHILE platte noch nicht frei REP
+ warte
+ ENDREP ;
+ uebertrage lesebefehl an controller ;
+ WHILE daten noch nicht gelesen REP
+ warte
+ ENDREP ;
+ hole daten vom controller .
+
+
+ blockout auf floppy :
+ seekbefehl an controller ;
+ WHILE seek noch nicht fertig REP
+ warte
+ ENDREP ;
+ setze dma auf schreiben block zur floppy ;
+ schreibbefehl an controller ;
+ WHILE schreiben noch nicht fertig REP
+ warte
+ ENDREP .
+
+ blockin von floppy :
+ seekbefehl an controller ;
+ WHILE seek noch nicht fertig REP
+ warte
+ ENDREP ;
+ setze dma auf lesen block von floppy ;
+ lesebefehl an controller ;
+ WHILE lesen noch nicht fertig REP
+ warte
+ ENDREP .
+
+
+
+#b("Block-IO bei Hintergrund und Archiv")#
+#goalpage("bhgarch")#
+
+#ib#Hintergrund#ie# (Kanal 0) und #ib#Archiv#ie# (Kanal 31) unterscheiden sich in den Link-Bedingungen nur
+in der Kanalnummer. Die Aufrufe von BLOCKIN und BLOCKOUT werden mit folgenden
+Eingangsparametern versorgt:
+
+ #on("b")#BLOCKIN#off("b")# A 0 bzw. 31
+ B 0
+ C Blocknummer DIV 65536
+ DE Blocknummer MOD 65536
+ HL Hauptspeicheradresse
+
+ Der angegebene 512-Byte-Block ist in den Hauptspeicher
+ ab <HL> einzulesen.
+
+ #on("b")#BLOCKOUT#off("b")# A 0 bzw. 31
+ B 0
+ C Blocknummer DIV 65536
+ DE Blocknummer MOD 65536
+ HL Hauptspeicheradresse
+
+ Der Hauptspeicherbereich (<HL>...<HL>+511) ist auf den
+ angegebenen Block zu schreiben.
+
+Als Rückmeldungen sind zu liefern:#goalpage("errcod")#
+
+ 0 Operation korrekt ausgeführt.
+ 1 Manuell behebbarer Fehler (z.B. Laufwerktür offen)
+ 2 Permanenter Fehler (z.B. Daten nicht lesbar)
+ 3 Versorgungsfehler (zu hohe Blocknummer)
+
+Zusätzlich zu der Rückmeldung muß bei BC <> 0 in HL die Adresse eines Fehlerstrings
+(Längenbyte + Fehlertext) geliefert werden. *)
+#foot#
+#f#*) Diese Zusatzrückmeldung ist nur für die BLOCKIN/OUT Aufrufe auf Kanal 0/31 von Bedeutung. Sie wird nur von
+EUMEL-0 beim Paging und im Hardwaretest ausgewertet.#a#
+#end#
+
+#dx("Fehlerwiederholungen")#: Das EUMEL-System führt von sich aus Fehlerwiederho­
+ lungen beim Hintergrund- und beim Archivzugriff
+ durch. SHard sollte deshalb im Fehlerfall die Opera­
+ tion nicht selbst wiederholen, sondern einen Lese/
+ Schreibfehler zurückmelden. So werden dem
+ EUMEL-System auch Soft-Errors gemeldet. In
+ manchen Fällen soll vor einem erneuten Lese- oder
+ Schreibversuch der Arm auf Spur 0 positioniert
+ werden o.ä. Um das zu erreichen, sollte SHard diese
+ "Reparaturaktion" direkt im Anschluß an den fehler­
+ haften Versuch durchführen.
+
+#dx("Kontrollesen")#: Falls Kontrollesen (nach jedem Schreibzugriff) notwendig ist,
+ muß das allerdings vom SHard durchgeführt werden.
+ In der Regel reicht es dazu, den geschriebenen
+ Block "ohne Datentransport" zu lesen, so daß nur
+ CRC überprüft wird.
+
+Will SHard weitere Archivlaufwerke zur Verfügung stellen, so kann er dafür Kanalnummern
+(30,29..) vergeben. Auf ELAN-Ebene kann die archivierende Task durch 'continue (x)' das
+Laufwerk 'x' ansteuern.
+
+Hinweis: Das System versucht Hintergrund und Archiv parallel zu betreiben, d.h. wenn
+ SHard bei der Hintergrundbehandlung das UP 'warte' aufruft, kann 'warte' seiner­
+ seits die Archivbehandlung des SHards aufrufen. Wenn beides z.B. denselben
+ Floppykontroller benutzt, muß SHard sicherstellen, daß das gut geht (z.B. durch
+ Semaphoren).
+
+
+
+
+#bb("5.3 ","IO-Steuerung")#
+#goalpage("iocontrol")#
+
+Die IO-Steuerung erlaubt Steuerung und Zustandsabfragen der Kanäle. IO-Steuerung wird
+(außer bei Kanal 0) auch durch 'control' in ELAN induziert.
+
+Der Funktionscode in BC unterliegt denselben Konventionen wie bei Block-IO, d.h. das
+System verwendet nur positive Codes. Der SHard-Schreiber kann auch negative Codes für
+Sonderzwecke vorsehen.
+
+
+ #d("IOCONTROL")#
+
+ Eingang: A Kanalnummer (0...32)
+ BC Funktionscode 1
+ DE Funktionscode 2
+ HL Funktionscode 3
+ Ausgang: BC Rückmeldung
+ A darf verändert werden, in einigen Fällen zusätzliche
+ Rückmeldung
+ C-Flag (in einigen Fällen zusätzliche Meldung)
+
+ Zweck: abhängig von 'Funktionscode 1' (s.u.)
+
+Das System verlangt folgende Informations- und Steuerleistungen über IOCONTROL:
+
+ #d("IOCONTROL ""typ""")#
+
+ Eingang: A Kanalnummer (0...31)
+ BC 1
+ Ausgang: BC Kanaltyp
+
+ Zweck: Informiert EUMEL-0, welche IO für den angegebenen Kanal
+ sinnvoll ist. Die Rückmeldung in BC wird bitweise interpre­
+ tiert:
+
+ Bit 0 gesetzt <=> 'inputinterrupt' kann kommen.
+ Bit 1 gesetzt <=> OUTPUT ist sinnvoll.
+ Bit 2 gesetzt <=> BLOCKIN ist sinnvoll.
+ Bit 3 gesetzt <=> BLOCKOUT ist sinnvol.
+ Bit 4 gesetzt <=> IOCONTROL "format" ist sinn­
+ voll.
+
+ Hinweis: #on("i")#Trotz dieser Informationsmöglichkeit wird nicht garantiert, daß
+ nur sinnvolle Operationen für den Kanal aufgerufen werden.#off("i")#
+
+
+ #dx("IOCONTROL ""frout""")##goalpage("frout")#
+
+ Eingang: A Kanalnummer (1...15)
+ BC 2
+ Ausgang: BC Anzahl Zeichen, die nächster OUTPUT übernimmt
+ C-Flag gesetzt <=> Puffer leer
+
+ Zweck: Liefert Information über die Belegung des Puffers. Diese
+ Information wird von EUMEL-0 zum Scheduling benutzt.
+
+ Achtung: #on("i")#Wenn EUMEL-0 längere Zeit kein OUTPUT gemacht hat,
+ muß irgendwann BC > 49 gemeldet werden.#off("i")#
+
+ Hinweis: Unter Berücksichtigung des oben Gesagten darf "gelogen"
+ werden. Man kann z.B. immer 50 in BC zurückmelden, muß
+ dann aber schlechtere Nutzung der CPU bei Multi-User-
+ Systemen in Kauf nehmen.
+
+ Falls auf dem angegebenen Kanal ein Drucker mit eigenem
+ Puffer über Parallelschnittstelle angeschlossen ist (siehe
+ S.#topage("druck")#) und man auf einen SHard-internen Puffer verzichtet hat,
+ sollte bei 'Druckerpuffer voll' 0 in BC und 'NC' zurückge­
+ meldet werden. Wenn aber Zeichen übernommen werden
+ können, sollte 50 in BC und 'C-Flag gesetzt' gemeldet
+ werden.
+
+ Vorschlag: Falls der Kanal nicht existiert oder nicht für Stream-IO zur
+ Verfügung steht, sollten 200 in BC und C-Flag gesetzt
+ zurückgemeldet werden.
+
+
+
+
+ #dx("IOCONTROL ""weiter""")##goalpage("weiter")#
+
+ Eingang: A Kanalnummer (1...15)
+ BC 4
+ Ausgang: -
+
+ Zweck: Das System ruft "weiter" für den in A angegebenen Kanal
+ auf, wenn es wieder Eingabezeichen puffern kann.
+
+ Hinweis: "weiter" wird von EUMEL-0 auch immer dann aufgerufen,
+ wenn ein Prozeß auf dem angegebenen Kanal auf Eingabe
+ wartet und keine Zeichen mehr gepuffert sind. Wenn der
+ betroffene Kanal von sich aus keine Interrupts erzeugt, kann
+ SHard dies benutzen, um durch Aufruf von 'inputinterrupt' ein
+ Eingabezeichen zuzustellen.
+ #on("i")#Diese Betriebsart sollte nicht für normale Terminalkanäle
+ eingesetzt werden. Denn dann wird die SV-Taste nur an
+ EUMEL-0 zugestellt, wenn ein Prozeß auf diesem Kanal auf
+ Eingabe wartet. Somit sind in dieser Betriebsart CPU-inten­
+ sive Endlosschleifen nicht normal abbrechbar!#off("i")#
+
+
+ #d("IOCONTROL ""size""")#
+
+ Eingang: AL Kanalnummer (0...31)
+ CX 5
+ DX Schlüssel
+ Ausgang: CX Anzahl Blöcke MOD 65536
+ AL Anzahl Blöcke DIV 65536
+
+ Zweck: EUMEL-0 ruft 'size' auf, um die Anzahl Blöcke zu erfahren,
+ die ein Block-IO-Kanal verkraften kann (Größe von Hin­
+ tergrund und Archiven). Bei Archivlaufwerken, die mehrere
+ Formate bearbeiten können, dient dieser Aufruf auch zum
+ Einstellen des Formats für die folgenden blockin/blockout-
+ Operationen anhand des Schlüssels.
+
+ Schlüssel: 0 Wenn möglich 'erkennend', sonst 'standard'. Im ersten
+ Fall erkennt SHard das Format der eingelegten Disket­
+ te und stellt dieses ein.
+
+ Die weiteren Schlüssel sind stets definierend. Dabei gibt es
+ die EUMEL-Standardformate:
+
+ 1 5" 2D-40, Sektor 1..9, 512 Bytes
+ 2 5" 2D-80, Sektor 1..9, 512 Bytes
+ 3 5" HD-80, Sektor 1..15, 512 Bytes
+ 10 8" 1D-77, Sektor 0..15, 512 Bytes
+ 11 8" 2D-77, Sektor 0..15, 512 Bytes
+
+ Zusätzlich kann man sämtliche Spezialformate angeben:
+
+ 8192 * laufwerkstyp 1: 8"
+ 2: 5"
+ 3: 3"
+
+ + 4096 * seiten 0: einseitig
+ 1: doppelseitig
+
+ + 1024 * dichte 0: single
+ 1: double
+ 2: high
+
+ + 256 * spuren 0: 35
+ 1: 40
+ 2: 77
+ 3: 80
+
+ + 64 * sektorbytes 0: 128
+ 1: 256
+ 2: 512
+
+ + 32 * erster sektor 0: \#0
+ 1: \#1
+
+ + sektoren pro spur 0 ... 31
+
+ So bezeichnet '8762' das Format 8" 1S-77 Sektor 1..26 a
+ 128 Bytes.
+
+ Anmerkung: SHard sollte alle physisch möglichen EUMEL-Standard­
+ formate unterstützen. Von den Spezialformaten sollten die für
+ den Datenaustausch wichtigen Formate berücksichtigt werden.
+ Die EUMEL-Standardformate (1,2,3,10,11) sollten auch über
+ die entsprechenden analytischen Codes erreicht werden. (Z.B.
+ bezeichnen 1 und 21929 dasselbe Format.) Die Numerierung
+ der Blöcke ist in jedem Fall seitenorientiert, d.h. entsprechend
+ den Standardformaten (siehe S.#topage("arch")#).
+
+ Hinweis: Bei Archiven wird 'size' aufgerufen, nachdem der Archivträ­
+ ger eingelegt wurde. D.h. SHard hat die Gelegenheit, die
+ Größe anhand des eingelegten Archivträgers zu bestimmen
+ (z.B. ob single- oder doublesided).
+
+ Vorschlag: Diese Funktion sollte auf nicht vorhandenen und den
+ Stream-IO-Kanälen 0 liefern. Sie muß aber mindestens auf
+ Kanal 0 (Hintergrund) und Kanal 31 (Archiv) "echte" Werte
+ liefern.
+
+ Achtung: #on("i")#Ausnahmsweise darf bei dieser IOCONTROL-Funktion die
+ 0-Routine 'warte' aufgerufen werden.#off("i")#
+
+
+ #d("IOCONTROL ""format""")#
+
+ Eingang: A Kanalnummer (0...31)
+ BC 7
+ Ausgang: BC Fehlercode wie bei Archiv-BLOCKOUT (siehe S.#topage("errcod")#)
+
+ Zweck: Dient zum Formatieren eines Mediums. Diese Funktion kann
+ für jeden Kanal leer implementiert sein ('ret'). Sie sollte aber
+ "formatierend" (z.B. auf Kanal 31) arbeiten, falls auf diesem
+ Kanal die "typ"-Abfrage "Formatieren sinnvoll" liefert. Falls
+ (bei Diskettenlaufwerken) mehrere Formate möglich sind,
+ bestimmt der Schlüssel das gewünschte Format.
+
+ Schlüssel: wie bei IOCONTROL "size"
+
+ Hinweis: Falls für das Formatieren ein großer Speicherbereich benö­
+ tigt wird, sollte das Formatieren von Disketten besser in
+ einem Boot-Dialog vor dem Start von EUMEL-0 angebo­
+ ten werden. Denn sonst müßte der Pagingbereich unnötig
+ eingeschränkt werden.
+ Man kann das Formatieren einer Spur CPU-intensiv im­
+ plementieren (d.h. ohne DMA im DI-Modus), wenn man in
+ Kauf nimmt, daß alle anderen Tasks des EUMEL-Systems in
+ dieser Zeit "stehen". Dann sollte man aber nach jeder Spur
+ mehrmals die 0-Routine 'warte' aufrufen.
+
+ Achtung: #on("i")#Ausnahmsweise darf bei dieser IOCONTROL-Funktion die
+ 0-Routine 'warte' aufgerufen werden.#off("i")#
+
+
+
+#b("Konfigurierung serieller Schnittstellen")#
+#goalpage("v24")#
+
+Bei Kanälen, die hardwaremäßig auf #ib#serielle Schnittstellen#ie# (#ib#V.24#ie#) zurückgeführt werden, sind
+in der Regel die Größen
+
+ - #ib#Baudrate#ie# (..., 2400, 4800, 9600, ...)
+ - #ib#Zeichenlänge#ie# (7 Bits, 8 Bits)
+ - #ib#Parität#ie# (keine, gerade, ungerade)
+
+einstellbar. Dafür muß SHard die IOCONTROL-Funktionen "baud" und "bits" zur Verfü­
+gung stellen. Diese werden in zwei Modi benutzt:
+
+ a) #on("b")#einstellend#off("b")#
+ Läuft der aufrufende EUMEL-Prozeß auf dem privilegierten Steuerkanal (A = 32),
+ wird der als Parameter mit übergebene #on("i")#adressierte Kanal#off("i")# auf die geforderten Werte
+ eingestellt, sofern das möglich ist.
+
+ b) #on("b")#abfragend#off("b")#
+ Läuft der aufrufende EUMEL-Prozeß nicht auf Kanal 32 (A <> 32), wird lediglich
+ abgefragt, ob der #on("i")#adressierte Kanal#off("i")# auf die übergebenen Werte eingestellt werden
+ könnte.
+
+Aufgrund des zweiten Modus können die höheren EUMEL-Ebenen dem Anwender bei der
+Konfigurierung mitteilen, welche Werte sich auf dem jeweiligen Kanal einstellen lassen. Das
+nutzt z.B. das Standard-Konfigurationsprogramm aus.
+
+Hinweis: Bei einigen Kanälen (z.B. bei einem integrierten Terminal oder einer Parallel­
+ schnittstelle) sind Baudrateneinstellungen sinnlos. Bei anderen können sie nur
+ hardwaremäßig vorgenommen werden (Jumper, Dip Switches). In allen diesen
+ Fällen muß SHard bei allen Einstellungen 'unmöglich' melden. (Standardmäßig
+ wird der Anwender bei der Einstellung seiner Konfiguration dann auch nicht
+ danach gefragt.)
+
+
+ #d("IOCONTROL ""baud""")#
+
+ Eingang: A eigener Kanal (1...15 / 32)
+ BC 8
+ DE adressierter Kanal
+ HL Schlüssel
+ Ausgang: BC Rückmeldung (0 = ok, 1 = nicht möglich)
+
+ Zweck: Wird diese Routine auf dem Steuerkanal (A=32) aufgerufen,
+ wird die angegebene Baudrate für den durch Register DE
+ adressierten Kanal eingestellt, falls das möglich ist.
+ Wird diese Routine auf einem anderen Kanal als 32 aufge­
+ rufen, informiert sie den Aufrufer lediglich, ob eine derartige
+ Einstellung des adressierten Kanals möglich wäre.
+
+ Schlüssel: 1 50 Baud
+ 2 75 Baud
+ 3 110 Baud
+ 4 134.5 Baud
+ 5 150 Baud
+ 6 300 Baud
+ 7 600 Baud
+ 8 1200 Baud
+ 9 1800 Baud
+ 10 2400 Baud
+ 11 3600 Baud
+ 12 4800 Baud
+ 13 7200 Baud
+ 14 9600 Baud
+ 15 19200 Baud
+ 16 38400 Baud
+
+ Anmerkung: In der Regel werden nicht alle Baudraten vom SHard un­
+ terstützt werden. Bei V.24 Schnittstellen sollten aber min­
+ destens 2400, 4800 und 9600 Baud zur Verfügung stehen,
+ besser auch 300, 600, 1200 und 19200 Baud.
+
+ Hinweis: Falls SHard-spezifisch weitere Baudraten implementiert
+ werden sollen, darf SHard hierfür negative Schlüsselwerte
+ (Register HL) vergeben.
+
+
+ #d("IOCONTROL ""bits""")#
+
+ Eingang: A eigener Kanal (1...15 / 32)
+ BC 9
+ DE adressierter Kanal
+ HL Schlüssel
+ Ausgang: BC Rückmeldung (0 = ok, 1 = nicht möglich)
+
+ Zweck: Wird diese Routine auf dem Steuerkanal (A=32) aufgerufen,
+ wird die angegebene Zeichenlänge (Bits pro Zeichen) und
+ Parität für den durch Register DE adressierten Kanal einge­
+ stellt, falls das möglich ist.
+ Wird diese Routine auf einem anderen Kanal als 32 aufge­
+ rufen, informiert sie den Aufrufer lediglich, ob eine derartige
+ Einstellung des adressierten Kanals möglich wäre.
+
+
+ Schlüssel: stop * 32 + par * 8 + (bit - 1)
+
+ stop: 0 1 Stopbit
+ 1 1.5 Stopbits
+ 2 2 Stopbits
+
+ par: 0 keine Parität
+ 1 ungerade Parität
+ 2 gerade Parität
+
+ bit: 1...8 Bits pro Zeichen
+
+
+ Anmerkung: In der Regel werden nicht alle Kombinationen vom SHard
+ unterstützt werden. Bei V.24 Schnittstellen sollten aber
+ möglichst 1 Stopbit, 7 und 8 Bits pro Zeichen und alle drei
+ Paritätseinstellungen zur Verfügung stehen.
+
+ Hinweis: Falls SHard-spezifisch weitere Einstellungen implementiert
+ werden sollen, darf SHard hierfür negative Schlüsselwerte
+ (Register HL) vergeben.
+
+
+
+
+#b("Flußkontrolle")#
+#goalpage("fluss")#
+
+Die stromorientierten Kanäle (1...15) werden nicht nur zum Anschluß schneller Geräte (wie
+Terminals) verwendet, sondern auch, um langsame Geräte (wie Drucker) anzuschließen, die
+die Daten u.U. nicht so schnell übernehmen können, wie sie der Rechner schickt. Dabei ist
+auf eine geeignete Flußkontrolle zu achten (nicht schneller senden, als der Andere emp­
+fangen kann). Dieses Problem stellt sich auch bei einer Rechner-Rechner-Kopplung. Hier
+ist in der Regel sogar zweiseitige Flußkontrolle notwendig.
+
+Als Flußkontrolle ist die #ib#REQUEST TO SEND/CLEAR TO SEND#ie# Logik der V.24-Schnitt­
+stelle oder das #ib#XON/XOFF#ie#-Protokoll zu verwenden. Das letztere kann auch bei Parallel­
+schnittstellen eingesetzt werden.
+
+Zur eingabeseitigen Flußkontrollsteuerung kann SHard die Rückmeldung der 0-Routine
+'inputinterrupt' (siehe S.#topage("inp")#) und die IOCONTROL-Funktion "weiter" (siehe S.#topage("weiter")#) verwen­
+den:
+
+Unterschreitet die Rückmeldung einen von SHard zu bestimmenden Schwellwert, muß SHard
+auf der V.24-Schnittstelle das Signal 'REQUEST TO SEND' wegnehmen bzw. XOFF senden.
+Dadurch wird bei den meisten Fremdrechnern ein weiteres Senden unterbrochen, sofern (im
+ersten Fall) das Signal 'REQUEST TO SEND' dort mit dem V.24-Eingang 'CLEAR TO
+SEND' verbunden ist. Wird von EUMEL-0 "weiter" aufgerufen, so kann auf dem enspre­
+chenden Kanal wieder empfangen werden (RTS setzen bzw. XON senden).
+
+Für die ausgabeseitige Flußkontrolle muß rechnerseitig ebenfalls das Signal 'CLEAR TO
+SEND' bzw. der Empfang von XOFF/XON berücksichtigt werden. Wenn an der Schnittstelle
+das 'CLEAR TO SEND' weggenommen wird, darf SHard keinen weiteren Output auf dieser
+Schnittstelle machen, bis 'CLEAR TO SEND' wieder anliegt. Entsprechend muß der Empfang
+von XOFF die Ausagbe anhalten und XON sie wieder starten.
+
+Bemerkung: Die meisten Systeme enthalten die CTS-Funktion schon in ihrer Hardware,
+ so daß im SHard dafür keine Vorkehrungen getroffen werden müssen.
+
+
+Zur Einstellung der gewünschten Flußkontrolle eines Kanals dient die IOCONTROL-Funk­
+tion "flow". Ähnlich wie "baud" und "bits" wirkt auch "flow" nur auf Kanal 32 #on("i")#einstellend#off("i")#
+und auf allen anderen Kanälen lediglich #on("i")#abfragend#off("i")#.
+
+
+ #d("IOCONTROL ""flow""")#
+
+ Eingang: A eigener Kanal (1...15 / 32)
+ BC 6
+ DE adressierter Kanal
+ HL Modus
+ Ausgang: BC Rückmeldung (0 = ok, 1 = nicht möglich)
+
+ Zweck: Wird diese Routine auf dem Steuerkanal (A=32) aufgeru­
+ fen, muß sie den gewünschten Flußkontrollmodus für den
+ adressierten Kanal einstellen.
+ Dabei sind folgende Modi festgelegt:
+
+ HL= 0 Keine Flußkontrolle
+ HL= 1 XON/XOFF (in beide Richtungen)
+ HL= 2 RTS/CTS (in beide Richtungen)
+ HL= 5 XON/XOFF (nur ausgabeseitig)
+ HL= 6 RTS/CTS (nur ausgabeseitig)
+ HL= 9 XON/XOFF (nur eingabesetig)
+ HL=10 RTS/CTS (nur eingabeseitig)
+
+ Wenn keine Flußkontrolle gewünscht wird (HL=0), muß SHard
+ "weiter" ignorieren; bei HL=1 oder HL=9 muß bei "stop"
+ XOFF und bei "weiter", sofern zuletzt XOFF geschickt wurde,
+ XON geschickt werden; bei HL=2 oder HL=10 muß bei
+ "stop" das Signal RTS auf low und bei "weiter" wieder auf
+ high gesetzt werden. Mit "stop" ist hierbei das Unterschreiten
+ des Schwellwertes bei der Rückmeldung von "inputinterrupt"
+ gemeint.
+ Bei HL=1 oder HL=5 müssen empfangene XON/XOFF-Zei­
+ chen, bei HL=2 oder HL=6 das Signal CTS beachtet wer­
+ den.
+
+ Wird diese Routine auf einem anderen Kanal als 32 aufge­
+ rufen, informiert sie den Aufrufer lediglich, ob der geforderte
+ Flußkontrollmodus auf dem adressierten Kanal einstellbar
+ wäre.
+
+ Hinweis: Falls SHard-spezifisch weitere Flußkontrollmodi implemen­
+ tiert werden sollen, darf SHard hierfür negative Moduswerte
+ (Register HL) vergeben.
+
+ "weiter" wird von EUMEL-0 sehr oft aufgerufen. Es ist daher
+ nicht sinnvoll, jedesmal XON zu senden, da dies die Gegen­
+ stelle damit überfluten würde. SHard muß sich merken, ob der
+ Kanal im XOFF-Zustand ist und nur dann bei "weiter" ein
+ XON senden.
+
+#b("Kalender")#
+#goalpage("kalender")#
+
+Die Datums- und Uhrzeitabfrage ist bei Rechnern mit eingebauter Uhr unnötig. EUMEL holt
+sich Datum und Uhrzeit dann von SHard.
+
+ #d("IOCONTROL ""calendar""")#
+
+ Eingang: CX 10
+ DX (1=Minute, 2=Stunde, 3=Tag, 4=Monat, 5=Jahr)
+ gewünscht
+ Ausgang: CX Rückmeldung
+
+ Zweck: Erfragen von Datum und Uhrzeit. Falls keine Uhr vorhanden
+ ist, muß bei jedem Aufruf -1 zurückgemeldet werden, bei
+ eingebauter Uhr jeweils das Gewünschte (Minute: 0..59,
+ Stunde: 0..23, Tag: 1..7, Monat: 1..12, Jahr: 0..99). Die Rück­
+ meldung muß als BCD-Zahl erfolgen.
+
+ Hinweis: Die Uhr darf zwischen zwei Aufrufen umspringen. Die daraus
+ resultierende Probleme werden auf höheren Ebenen abgehan­
+ delt.
+
+
+
+
+#bb("6. SHard-","Interface Version")#
+#goalpage("shdver")#
+
+Die #ib#Versionsnummer#ie# der Interface-Spezifikation, auf der SHard aufbaut, muß als 1-Byte-
+Konstante #ib#SHDVER#ie# in der SHard-Leiste stehen. Für das hier beschriebene Interface muß sie
+den Wert 8 haben.
+
+So sind spätere Erweiterungen des SHard-Interfaces möglich, ohne daß alle SHard-
+Moduln geändert werden müssen.
+
+
+
+#bb("7. ","ID-Konstanten")#
+#goalpage("ID")#
+
+SHard muß direkt hinter SHDVER vier 2-Byte-Konstanten ablegen. Diese können von den
+höheren Ebenen durch die ELAN-Prozedur
+
+ INT PROC #ib#id#ie# (INT CONST no)
+
+abgefragt werden. Dabei werden id(0) bis id(3) von EUMEL-0 geliefert, während SHard in der
+Leiste die Werte für id(4) bis id(7) zur Verfügung stellen muß:
+
+ ID4 #ib#Lizenznummer#ie# des SHards *)
+#foot#
+#f#*) Dieser Wert muß mit der Nummer des Lizenzvertrags zwischen Implementierer und GMD übereinstimmen!#a#
+#end#
+
+ ID5 #ib#Installationsnummer#ie# des EUMEL-Anwenders **)
+#foot#
+#f#**) Diese Nummer vergibt der Lizenznehmer an die von ihm belieferten Anwender.#a#
+#end#
+
+ ID6 zur freien Verfügung
+
+ ID7 zur freien Verfügung
+
+
+
+
+#bb("8. ","Zusätzliche Leistungen")#
+#goalpage("shdelan")#
+
+Will der SHard-Implementierer zusätzliche Leistungen anbieten, die mit den Standardopera­
+tionen nicht möglich sind, kann er weitere Codes für BLOCKIN, BLOCKOUT und
+IOCONTROL zur Verfügung stellen. Um Überdeckungen mit Codes zu vermeiden, die von
+EUMEL-0 intern verwendet oder erst später eingeführt werden, darf SHard für zusätzliche
+Leistungen nur negative Werte als 'Funktionscode 1' verwenden.
+
+
+Zum Ansprechen der neuen Leistungen stehen die ELAN-Prozeduren #on("i")#'#ib#blockout#ie#', '#ib#blockin#ie#'#off("i")#
+und #on("i")#'#ib#control#ie#'#off("i")# zur Verfügung.
+
+Ferner steht dem SHard ein Parameterkanal (32) zur Verfügung. Funktionen, die (im Multi-
+User) nicht jeder Task zur Verfügung stehen dürfen, müssen über diesen Kanal 32 abge­
+wickelt werden und dürfen nur dort wirken.
+
+
+ PROC blockout (ROW 256 INT CONST para, (* --> HL *)
+ INT CONST funktion1, (* --> BC *)
+ funktion2, (* --> DE *)
+ INT VAR antwort) (* <-- BC *)
+
+ PROC blockin (ROW 256 INT VAR para, (* --> HL *)
+ INT CONST funktion1, (* --> BC *)
+ funktion2, (* --> DE *)
+ INT VAR antwort) (* <-- BC *)
+
+ PROC control (INT CONST funktion1, (* --> BC *)
+ funktion2, (* --> DE *)
+ funktion3, (* --> HL *)
+ INT VAR antwort) (* <-- BC *)
+
+Hinweis: Der SHard darf für 'funktion 1' (BC) zusätzlich zu den hier beschriebenen Stan­
+ dardcodes nur negative Codes vereinbaren.
+
+
+Beispiel:
+
+ Gibt eine Task, die durch 'continue (x)' an Kanal 'x' hängt, den Befehl
+
+ control (-7,1200,13,antwort),
+
+ so wird IOCONTROL mit (A='x', BC=-7, HL=13, DE=1200) aufgerufen. Verläßt
+ SHard 'control' mit BC = 1, so enthält 'antwort' anschließend eine 1.
+
+
+Hinweis: Um die zusätzlichen Leistungen dem Anwender einfach (und abgesichert) zur
+ Verfügung zu stellen, sollte man sie in ein ELAN-Paket einbetten und dieses
+ ebenfalls an die Anwender ausliefern.
+
+ Beispiel: PACKET zusatz DEFINES fanfare, ... :
+
+ PROC fanfare (INT CONST tonhoehe, dauer) :
+
+ IF dauer < 0
+ THEN errorstop ("negative dauer")
+ ELIF tonhoehe < 16
+ THEN errorstop ("infraschall")
+ ELIF tonhoehe > 20000
+ THEN errorstop ("ultraschall")
+ ELSE control (-37, 20000 DIV tonhoehe, dauer)
+ FI
+
+ ENDPROC fanfare ;
+
+ . . .
+
+
+
+
+#bb("9. ","Spezialroutinen")#
+#goalpage("ke")#
+
+Als Testhilfe und zur Fehlerdiagnose kann SHard in seine Routinen Kontrollereignisse einbau­
+en. Das geschieht durch Aufruf der 0-Routine 'info'. Dieser EUMEL-Debugger wird im
+Anhang A (siehe S.#topage("info")#) beschreiben.
+
+ #dx("info")# (0-Routine)
+
+ Aufruf: call info
+ jr weiter
+ defm ' text'
+ weiter:
+
+ Zweck: Info wird aufgerufen. Dabei wird 'text' zur Identifikation des
+ Kontrollereignisses ausgegeben. #on("i")#Der übergebene Text muß
+ mit einem Blank beginnen!#off("i")#
+
+ Hinweis: Bei Systemen "ohne Info" (nur solche dürfen an Anwender
+ ausgeliefert werden) wird nur der Info-Text ausgegeben und
+ EUMEL-0 angehalten.
+
+ Achtung: Da der Info selbst die hier beschriebenen Stream-IO-Rou­
+ tinen benutzt, darf man ihn von diesen Routinen aus (input­
+ interrupt, OUTPUT, IOCONTROL "frout", IOCONTROL
+ "weiter") nicht aufrufen. Wenn die Ein-/Ausgabe auf Termi­
+ nal 1 interruptgetrieben läuft, dürfen die Interrupts beim
+ Info-Aufruf natürlich nicht gesperrt sein.
+
+
+Falls SHard für bestimmte Aktionen, die selten durchgeführt werden (z.B. Formatieren), viel
+Speicher benötigt, kann er diesen dynamisch anfordern und später wieder freigeben.
+
+ #dx("grab")# (0-Routine)
+
+ Eingang: HL Anfangsadresse des zu reservierenden Bereichs im
+ Datensegment von EUMEL-0, muß auf 512 Byte
+ ausgerichtet sein.
+ BC Länge des zu reservierenden Bereichs in 512-Byte-
+ Kacheln
+ Ausgang: BC Rückmeldecode
+
+ Zweck: Wenn möglich wird der zu verlangte Bereich von EUMEL-0
+ "leergekämpft" und SHard zur Verfügung gestellt.
+ Rückmeldecode: 0 ok, Speicher steht zur Verfügung
+ 1 augenblicklich nicht möglich
+ 3 grundsätzlich nicht möglich
+
+ Achtung: Der Aufruf von 'grab' wird in der Regel 'warte' und Block-IO
+ auf Kanal 0 induzieren.
+
+ Hinweis: Es wird empfohlen, Speicher ab A000h anzufordern, da diese
+ Adresse stets im frei einplanbaren Paging-Bereich liegt.
+
+
+ #dx("free")# (0-Routine)
+
+ Eingang: HL Anfangsadresse des freizugebenden Bereichs im
+ Datensegment von EUMEL-0, muß auf 512 Byte
+ ausgerichtet sein.
+ BC Länge des zu freizugebenden Bereichs in 512-Byte-
+ Kacheln
+
+ Zweck: Der entsprechende Bereich muß vorher mit 'grab' beschafft
+ worden sein. Hiermit wird er wieder EUMEL-0 zur freien
+ Verfügung gestellt.
+
+
+Für spezielle Fehlersituationen steht die 0-Routine 'shutup' zur Verfügung. Damit kann
+SHard z.B. bei Netzausfall ein kontrolliertes Systemende erzwingen. Das ist allerdings nur
+sinnvoll, wenn durch Batteriepufferung oder Ähnliches sichergestellt ist, daß noch genügend
+Zeit bleibt, um alle Seiten auf den Hintergrund zurückzuschreiben.
+
+ #dx("shutup")# (0-Routine)
+
+ Zweck: Erzwingt Rückschreiben aller Seiten und Systemende, d.h.
+ entspricht der ELAN-Prozedur 'shutup'.
+
+ Achtung: Der Aufruf von 'shutup' wird in der Regel 'warte' und Block-
+ IO auf Kanal 0 induzieren.
+#page#
+#cc("Teil 4: ","Tips zur Portierung")#
+#goalpage("tips")#
+
+
+#b("0-Version des SHards")#
+#goalpage("0ver")#
+
+
+Es wird empfohlen, zuerst eine "0-Version" des SHard zu entwickeln, die möglichst einfach
+aufgebaut und nicht auf Effizienz und vollständige Ausnutzung der Betriebsmittel ausge­
+richtet sein sollte. Damit kann man rasch praktische Erfahrung gewinnen, die dann den
+Entwurf und die Implementation des eigentlichen SHard erleichtert. Die 0-Version sollte
+
+ - keinen Schattenspeicher kennen (SCHINF meldet 0),
+
+ - nur die Kanäle 0 (Hintergrund), 1 (Terminal) und 31 (Archiv) behandeln,
+
+ - keine Baudraten-, Zeichenlängen-, Paritäts- und Flußkontrolleinstellungen unter­
+ stützen (immer 'nicht möglich' melden),
+
+ - vorhandene (ROM-) Routinen möglichst nutzen, ohne sich um Unschönes wie
+ "busy wait" beim Floppy- bzw. Plattenzugriff zu grämen.
+
+Mit dieser 0-Version sollte man dann versuchen, EUMEL zu starten. Da der Hintergrund
+beim ersten Mal noch leer ist, muß man das HG-Archiv (Archivfloppy mit EUMEL-0 und
+höheren Ebenen) in das Archivlaufwerk einlegen und von dort laden. Der Vortest sollte sich
+direkt nach dem Start folgendermaßen auf Terminal 1 melden:
+
+ E U M E L - Vortest
+
+ Terminals: 1,
+ RAM-Groesse (gesamt): 64 kB
+ Pufferbereich: ? kB
+ Hintergrund-Speicher: ? kB
+
+ Speichertest: ************
+
+Man sollte während der ****-Ausgabe des Speichertests irgendein Zeichen eingeben. Das
+EUMEL-System muß dann in das ausführliche Start-Menü überwechseln. (Andernfalls
+funktioniert die Eingabe nicht richtig!)
+
+Als nächstes sollte man versuchen, den Hintergrund vom Archiv aus zu laden. (Diese Mög­
+lichkeit wird im Start-Menü angeboten.) Nach dem Ende dieser Operation wird der
+EUMEL-Lauf automatisch beendet. Jetzt kann man das HG-Archiv aus dem Archivlauf­
+werk entfernen und das System neu starten. Dann sollte EUMEL-0 vom Hintergrund geladen
+werden.
+
+Bei Problemen kann der "Info" (siehe S.#topage("info")#) hilfreich sein. Voraussetzung für seine Ver­
+wendung ist aber, daß die Terminal Ein-/Ausgabe schon funktioniert.
+
+Beim Start des EUMEL-Systems kann (wie im Systemhandbuch beschrieben) durch den
+Konfigurationsdialog der Terminaltyp von Kanal 1 eingestellt werden. Falls das verwendete
+Terminal in dieser Liste nicht aufgeführt wird und auch keinem der aufgeführten (in Bezug auf
+die Steuercodes) gleicht, kann man z.B.
+
+ - den neuen Terminaltyp an einem anderen EUMEL-Rechner verfügbar machen
+ (Umsetztabellen definieren) und per Archiv zum neuen Rechner tragen,
+
+ - die notwendigen Umcodierungen per SHard durchführen.
+
+Diese Problematik entsteht bei Rechnern mit integriertem Terminal in der Regel nicht, weil
+Steuerzeichen dort sowieso algorithmisch interpretiert werden müssen. In diesem Fall wird
+man direkt die EUMEL-Codes als Grundlage wählen, so daß keine Umsetzungen erfor­
+derlich sind.
+
+Bei einer provisorischen Anpassung kann man auf Invers-Video ohne weiteres verzichten.
+
+
+Im Gegensatz zu der 0-Version sollte man bei der eigentlichen SHard-Implementierung
+darauf achten, die Möglichkeiten der Hardware effizient zu nutzen. Der Testverlauf entspricht
+dann wieder im wesentlichen dem oben beschriebenen Vorgang.
+
+
+
+#b("Typische Fehler")#
+#goalpage("fehler")#
+
+
+ a) SHard-Routinen zerstören Registerinhalte bzw. sichern sie beim Interrupt nicht
+ vollständig. Hierbei sollte man auch an den zweiten Registersatz des Z80-Pro­
+ zessors und an die Register IX und IY denken.
+
+ b) 'call' bzw. 'ret' verändern den Stackpointer.
+
+ c) Fehler bei der Interruptbehandlung führen zu Blockaden ("hängende Interrupts").
+
+ d) Cursorpositionierung außerhalb des Bildschirms bei einem internen Terminal
+ (Bildwiederholspeicher im Rechner) wird nicht abgefangen. Das führt dann zu
+ wildem Schreiben in den Hauptspeicher.
+
+ e) 'warte' wird unerlaubt aufgerufen. ('warte' darf nur von BLOCKIN, BLOCKOUT,
+ IOCONTROL "size" und IOCONTROL "format" aus aufgerufen werden. Ferner
+ kann man 'warte' noch nicht beim Systemladen aufrufen!)
+
+ f) OUTPUT-Verhaspler oder -Blockaden entstehen durch Fehlsynchronisation
+ zwischen dem Füllen des Ausgabepuffers durch die Routine OUTPUT und der
+ Interruptroutine, die den Puffer leert und ausgibt.
+
+ g) IOCONTROL "frout" meldet in gewissen Situationen nie "mindestens 50 Zei­
+ chen im Puffer frei" und "Puffer leer". Das kann schon im Vortest zu Output-
+ Blockaden führen.
+
+ h) Obwohl "frout" einen Wert größer als x meldet, nimmt "output" nicht alle x
+ Zeichen an.
+
+ i) IOCONTROL "size" meldet falsche Werte.
+
+ j) IOCONTROL verkraftet keine beliebigen (auch unsinnige) Werte.
+
+ k) BLOCKIN bzw. BLOCKOUT geben die Kontrolle an das System zurück, bevor alle
+ Daten übertragen sind. (Sofort nach der Rückgabe geht EUMEL-0 davon aus,
+ daß der Puffer frei ist und anderweitig benutzt werden kann!)
+
+ l) Einem SIO-Baustein wird nach Ausgabe des letzten Zeichens oder nach Ände­
+ rung des externen Status nicht mitgeteilt, daß keine Interrupts mehr erzeugt
+ werden sollen. (SIOs wiederholen Interrupts so lange, bis man es ihnen explizit
+ verbietet!)
+
+ m) Die Stepping-Rate eines Festplattencontrollers wird falsch eingestellt, bezie­
+ hungsweise die Platte wird nicht im 'buffered step mode' betrieben, obwohl sie
+ beschleunigend positionieren kann. Dadurch werden die Zugriffszeiten auf dem
+ Hintergrund unnötig verlangsamt. Man bedenke, daß man so einen Fehler leicht
+ übersieht, weil sich das System nicht fehlerhaft, sondern nur langsamer verhält.
+ Außerdem macht sich die Verlangsamung erst bemerkbar, wenn größere Teile des
+ Hintergrundes benutzt werden.
+
+ n) Bei schnellem Zeichenempfang treten "Dreher" auf. Das deutet meistens auf
+ einen rekursiven Aufruf der 0-Routine 'inputinterrupt' hin. Dabei überholt dann
+ das zweite Zeichen das erste.
+
+ o) Bei schnellem Zeichenempfang, speziell bei gleichzeitiger Ausgabe, gehen Einga­
+ bezeichen verloren oder werden verfälscht. In der Regel ist das auf Timingpro­
+ bleme bei der Interruptbehandlung zurückzuführen. Interrupts gehen verloren bzw.
+ die Zeichen werden nicht schnell genug abgeholt.
+
+
+#b("Effizienzprobleme")#
+#goalpage("eff")#
+
+ a) Bei #on("i")##on("b")#V.24- und Parallelschnittstellen#off("i")##off("b")# ist schlechter Durchsatz in der Regel auf
+ Fehlverhalten von "frout" zurückzuführen. Auch kostet es in Multi-User-Sy­
+ stemen sehr viel, wenn OUTPUT immer nur ein Zeichen übernimmt. (Dann läuft
+ der ganze Apparat der EUMEL-0-Maschine für jedes Zeichen wieder an.)
+
+ Besonders bei der Parallelschnittstelle achte man darauf, daß nicht durch un­
+ glückliches Timing häufig Blockaden auftreten. So kann zu kurzes 'busy wait' auf
+ Freiwerden der Parallelschnittstelle dazu führen, daß jedes zweite Zeichen
+ abgelehnt wird, so daß OUTPUT faktisch zeichenweise arbeitet. Andererseits darf
+ natürlich 'busy wait' auch nicht auf Millisekunden ausgedehnt werden.
+
+
+ b) Wenn #on("i")##on("b")#Floppies ohne DMA#off("i")##off("b")# angeschlossen werden, kann man bei Single-
+ User-Systemen ohne weiteres 'busy wait' einsetzen, um nach dem Seek-
+ Vorgang auf den Block zu warten. Im Multi-User sollte das aber wenn irgend
+ möglich umgangen werden, da eine halbe Umdrehung immerhin ca. 100 ms
+ kostet.
+ Falls nur ein Endeinterrupt nach jeder Floppyoperation zur Verfügung steht, kann
+ folgendes Verfahren günstig sein:
+
+ seek befehl an controller ;
+ warten auf endeinterrupt ;
+ lesebefehl ohne datentransport auf sektor davor ;
+ warten auf endeinterrupt ;
+ lese oder schreib befehl auf adressierten sektor ;
+ cpu intensives warten und datentransport .
+
+ Die Dummyoperation auf den Sektor vor dem adressierten dient dabei nur dazu,
+ ohne CPU-Belastung einen Zeitpunkt zu finden, wo man dem eigentlichen Sektor
+ möglichst nahe ist. Die Zeit, in der die CPU benötigt wird, sinkt damit auf ca. 25
+ ms. Die Implementation dieses Algorithmus' ist aber nicht ganz einfach, da die
+ 0-Routine 'warte' wegen der verlangten kurzen Reaktionszeiten nicht verwendet
+ werden kann. Alle 'warte auf ...' müssen also durch Interrupts realisiert werden:
+
+ setze interrupt auf lesen davor ;
+ stosse seek an ;
+ REP
+ warte
+ UNTIL komplette operation beendet ENDREP .
+
+ lesen davor :
+ setze interrupt auf eigentliche operation ;
+ stosse lesen davor an .
+
+ eigentliche operation :
+ ignoriere fehler beim datentransport ;
+ stosse lesen oder schreiben an ;
+ REP
+ REP UNTIL bereit ENDREP ;
+ uebertrage ein byte
+ UNTIL alles uebertragen ENDREP ;
+ melde komplette operation beendet .
+
+
+ c) Bei der Ansteuerung von #on("i")##on("b")#Harddisks#off("b")##off("i")# sollte man darauf achten, daß die 0-Rou­
+ tine 'warte' nicht öfter als notwendig aufgerufen wird. Sonst wird das Paging zu­
+ gunsten der CPU-intensiven Prozesse zu stark verlangsamt. Z.B. kann man bei
+ vielen Plattencontrollern auf eine eigene Seek-Phase verzichten:
+
+ beginne seek ; beginne seek und lesen ;
+ REP REP
+ warte warte
+ UNTIL fertig PER ; UNTIL fertig PER
+ beginne lesen ;
+ REP
+ warte
+ UNTIL fertig PER
+
+ Hier braucht die linke Fassung immer mindestens ein 'warte' mehr als die rechte.
+ Bei starker CPU Belastung wird sie deshalb bis zu 100 ms länger für das Einle­
+ sen eines Blocks benötigen.
+
+ Eine ähnliche Situation kann auftreten, wenn die Platte in 256-Byte-Sektoren
+ unterteilt ist, so daß zu jedem EUMEL-Block zwei Sektoren gehören. Wenn
+ möglich sollte dann zwischen diesen beiden Sektoren kein 'warte' aufgerufen
+ werden. Andererseits darf natürlich auch nicht längere Zeit CPU-intensiv gewar­
+ tet werden. Evtl. lohnt es sich in solchem Fall, mit der Sektorverschränkung zu
+ experimentieren.
+
+#page#
+#cc("Anhang A: EUMEL-","Debugger ""Info""")#
+#goalpage("info")#
+
+
+Für interne Testzwecke gibt es den "Info". Systeme "mit Info" und "ohne Info" unterschei­
+den sich nur im EUMEL-0-Teil (Urlader). Der SHard-Implementierer erhält zum Test
+Hintergründe "mit Info" und zur Auslieferung solche "ohne Info". Infofähige Systeme dürfen
+nur von den SHard-Implementierern verwendet werden.
+
+ #on("i")##on("b")#Achtung: Infofähige Systeme dürfen auf keinen Fall an Anwender ausgeliefert wer­
+ den, da vermittels Info alle Systemsicherungs- und Datenschutzmaßnah­
+ men unterlaufen werden können.#off("i")##off("b")# *)
+#foot#
+#f#*) Ausnahmen von dieser Regel bedürfen der expliziten Zustimmung der EUMEL-Systemgruppe (GMD bzw. HRZ
+Bielefeld) und des jeweiligen Anwenders. Solche System müssen immer durch spezielle Schlüsselworte abgesichert werden.#a#
+#end#
+
+
+#b("Aufruf des Info")#
+#goalpage("aufrinf")#
+
+Zum Aufruf des Infos gibt es drei Möglichkeiten:
+
+ a) Beim Start des EUMEL-Systems geht man durch Eingabe eines beliebigen Zei­
+ chens während des Vortests in den ausführlichen Start-Dialog. Durch Eingabe von
+ 'I' gelangt man dann in den Info-Modus. #on("i")#(Diese Möglichkeit wird in dem Start­
+ menü nicht aufgeführt.)#off("i")#
+
+ b) Man kann den Info durch die ELAN-Prozedur 'ke' aufrufen. D.h. wenn das System
+ gestartet wurde und sich eine Task am Terminal mit "gib kommando" gemeldet
+ hat, kann man durch 'ke *return*' in den Info-Modus gelangen.
+
+ c) Wenn sich am Terminal keine Task befindet, die auf Eingabe wartet, gelangt man
+ durch die Tastenfolge 'i *info*' (*info* meist = CTL d, zur Tastendefinition siehe
+ "Systemhandbuch, Konfigurierung") in den Info-Modus.
+
+Alle diese Möglichkeiten funktionieren nur bei infofähigen Systemen.
+
+Bei schweren Systemfehlern, die eine Weitermeldung an die höheren Ebenen des EUMEL-
+Systems unmöglich machen, wird soweit möglich ebenfalls der Info aufgerufen. Bei Systemen
+"ohne Info" wird lediglich eine Meldung auf Kanal 1 ausgegeben und das System angehalten.
+
+Bevor das System Infokommandos annimmt, muß mit dem Kommando 'P' ein Paßwort einge­
+geben werden. Lediglich dieses Kommando und das Kommando 'g' werden immer angenom­
+men. Das Paßwort kann mit dem Kommando 'yP' oder mit der ELAN-Prozedur "info
+password" eingestellt werden.
+
+#b("Info-Format")#
+#goalpage("forminf")#
+
+Der Info ist bildschirmorientiert. Beim Aufruf des Infos und nach den meisten Info-Kom­
+mandos werden die drei obersten Zeilen wie folgt aufgebaut: *)
+#foot#
+#f#*) Bildschirmgetreues Verhalten kann der Info allerdings erst nach der Konfigurierung des Kanals zeigen. Vorher (d.h.
+insbesondere beim Aufruf aus dem Vortest heraus) werden Cursorpositionierungen in der Regel nicht korrekt durchgeführt.#a#
+
+#end#
+
+#limit(14.0)#
+XY TEXT
+F A C B E D L H F A C B E D L H IX SP IY PC
+xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
+#limit(12.0)#
+
+wobei
+
+ X den Miniprozeß bezeichnet, der den Übergang in den Info veranlaßt hat (A=Archiv,
+ E=Elan, L=Lader, M=Müllabfuhr),
+
+ Y den Maxiprozeß (Task) bezeichnet, der gerade durch den Elan-Prozessor bear­
+ beitet wird (Y ist code (tasknummer + code ("0"))),
+
+ TEXT den Grund für den Info-Modus anzeigt,
+
+Die zweite und dritte Zeile zeigen die Inhalte der Z80-Register an (beide Registersätze).
+In der untersten Zeile erscheint die Eingabeaufforderung 'info:'.
+
+
+#b("Info-Kommandos")#
+#goalpage("cmdinf")#
+
+Info-Kommandos können in der 'info:'-Zeile mit dem Format
+
+ [<zahl>]<buchstabe>
+
+gegeben werden oder, wenn der Cursor sich im Dump befindet, mit dem Format
+
+ <buchstabe>
+
+wobei dann für <zahl> die der Cursorposition entsprechende Dumpadresse (modulo 2**16)
+gesetzt wird (siehe '*cup*').
+
+<zahl> ist immer in Hexaform einzugeben.
+
+'g' Der Info-Modus wird wieder verlassen. Dies ist allerdings bei harten Fehlern ge­
+ sperrt.
+
+'z' Der Leitblock des angezeigten Maxiprozesses wird dargestellt, falls <zahl> = 0 ist,
+ sonst der Leitblock der Task mit der Nummer <zahl>. (Nur im ELAN-Miniprozeß).
+
+'q' Die Task mit der Nummer <zahl> wird nach dem nächsten 'g'-Kommando in den
+ Info überführt. Dies ist nötig, wenn man sich die Datenräume dieser Task anschauen
+ will ('s').
+
+'s' Dumps werden auf den Datenraum <zahl> eingestellt. Ist <zahl>=FF, so wird der
+ Realspeicher eingestellt. (s:=<zahl>)
+
+'l' Dumps werden auf die Länge <zahl> eingestellt. Desungeachtet kann man einen
+ versehentlich zu langen Dump durch eine beliebige Eingabe abbrechen. Dann wird
+ allerdings '*cup*' gesperrt (siehe unten).
+
+'p' Dumps werden auf die Byteadresse <zahl> eingestellt (p:=<zahl>; wmodus:=
+ FALSE).
+
+'w' Dumps werden auf die Wortadresse <zahl> eingestellt. Die vor jeder Dumpzeile
+ ausgegebene Adresse ist dann auch eine Wortadresse. Ein Wort = 2 Bytes. (p:=2*
+ <zahl>; wmodus:=TRUE)
+
+'k' Block <zahl> laden und per Dump anzeigen. Es erfolgt dabei eine Umstellung auf
+ den Realdatenraum (s=FF).
+
+'P' Paßworteingabe: P<text>*return*
+ Erst nach diesem Kommando sind die übrigen Kommandos ausführbar.
+
+'x' Suchen nach Bytekette:
+
+--> xc text
+--> xh xx xx ...
+--> x
+
+ Es wird nach 'text' bzw. Hexafolge 'xx xx ...' bzw. nach der durch das letzte
+ 'x'-Kommando eingestellten Bytekette gesucht.
+ Das Kommando ist durch *return* abzuschließen.
+ Die Suche beginnt ab Position 'p' und ist auf die Länge <zahl> Seiten (512 Byte-
+ Einheiten) begrenzt (0=unendlich).
+ Eine beliebige Eingabe bricht die Suche vorzeitig ab.
+
+'*return*'
+ Es wird der eingestellte Dump ausgegeben (siehe 's','l','p','w'). Bei wmodus (siehe
+ 'p', 'w') werden Wortadressen ausgegeben.
+
+'o' Wie '*return*', jedoch wird zuvor p := p+l gesetzt (zum Weiterblättern).
+
+'r' Freigabe der anderen Miniprozesse.
+
+ Zunächst werden bei Übergang in den Info alle Miniprozesse gesperrt, um eine
+ Verfälschung der Fehlersituation zu vermeiden. Bei manchen Kommandos an den Info
+ müssen aber andere Miniprozesse u.U. aktiv werden (z.B. beim 'k' der Lader). Wenn
+ dies erforderlich ist, meldet der Info:
+ 'paging erforderlich'. Man kann dann 'r' geben und das letzte Infokommando wieder­
+ holen, oder mit anderen Kommandos fortfahren, falls man den Fehlerzustand noch so
+ beibehalten will.
+
+'y' Zweitfunktion ausführen.
+
+--> 'yP<text>*return*'
+ Neues Paßwort einstellen (max. 9 Zeichen). Dieses bleibt auch nach 'shutup'
+ gültig.
+
+--> 'yt' Block <zahl> von Archiv lesen. Dient zum Test des Archivs.
+ Es wird eine Kachel freigemacht und der Block mit der Nummer <zahl>
+ eingelesen. Der Inhalt wird sofort angezeigt (wie Kommando 'k').
+
+--> 'yb' Breakpoint an die Adresse <zahl> setzen. Es wird ein Aufruf an den Info
+ abgesetzt. Nur im Realspeicher sinnvoll. Dieser Aufruf meldet sich mit
+ TEXT= 'test'. Wird er mit 'g' verlassen, so stellt Info zuvor die alten
+ Z80-Befehle wieder her und führt sie an ihrem originalen Ort aus.
+
+--> 'yc' wie 'yb', jedoch werden die originalen Z80-Befehle an einem anderen Ort
+ (im Info) ausgeführt. Sie dürfen daher z.B. keinen Relativsprung enthalten
+ und keine 'push'/'pop'-Befehle. Dafür bleibt dieser Breakpoint auch nach
+ dem zugehörigen 'g' im Code erhalten. Dieser Breakpoint meldet sich mit
+ TEXT='test 2'. 'yc' darf nicht gegeben werden, wenn der Info im 'test 2'
+ steht (Umhängen verboten).
+
+ #on("i")#Achtung: Die Verwendung von 'yb' und 'yc' ist sehr kritisch durchzuführen.
+ Zu beachten ist, daß der in den Code eingesetzte Sprung (Z80 jp)
+ 3 Byte belegt.#off("i")#
+
+
+--> 'yl' Lernmodus ein (wie beim Editor).
+
+--> 'ye' Ende Lernmodus.
+
+--> 'ya' Ausführen. Die zwischen 'yl' und 'ye' eingegebenen Zeichen werden dem
+ Info so vorgesetzt, als kämen sie von der Tastatur.
+
+ Achtung: Rekursion ('ya' im Lernmodus) wird nicht abgefangen. Das Gelern­
+ te wird nach jedem Kommando, das die ersten drei Zeilen
+ wiederaufbaut (z.B. *return*), in der Zeile vier angezeigt, wobei
+ für Steuerzeichen eine Ersatzdarstellung erscheint (%x mit
+ x=code (code (zeichen) +code ("A")), also z.B. %M für
+ *return*).
+
+--> 'y *return*'
+ Wie *return*, jedoch wird der Dump auch beim Ausführen (ya) ausgege­
+ ben. (Ein gelerntes *return* führt im Ausführmodus nicht zum Dump).
+
+'*cup*' *) (Cursor up). Umschaltung in den Modus zum Ändern in Dumps.
+#foot#
+#f#*) Falls der Kanal noch nicht konfiguriert ist, muß man natürlich eine Taste betätigen, die den EUMEL-Code für Cursor
+Up erzeugt. In der Regel ist das CTL c. Falls das Terminal ohne Konfigurierung keine Cursorpositionierungen durchführt, ist
+dieser Modus nicht sehr gut benutzbar.#a#
+#end#
+ Der Cursor fährt in den Dump und kann mit den Cursortasten dort bewegt
+ werden. Wird eine Hexazahl jetzt eingegeben, so wird diese als Inhalt des
+ Bytes eingetragen, auf dem der Cursor gerade steht. Dies funktioniert auch
+ auf beliebigen Datenräumen. Info beantragt dann bei der Speicherverwal­
+ tung einen Schreibzugriff für die entsprechende Datenraumseite, so daß
+ Änderungen mit der Copy-on-Write-Logik erfolgen, also nur taskspezi­
+ fisch sind (durch 'q' eingestellt). Für diese Task sind die Änderungen al­
+ lerdings dann permanent, da sie auch auf den Hintergrund wirken.
+
+ Hinweis: Dumpt man mit 'k' einen Block und ändert dann darin, so sind
+ diese Änderungen u.U. nur temporär, da der Info kein Rückschrei­
+ ben des Blockes veranlaßt.
+
+ Achtung: Jede Eingabe, die kein Positionierzeichen und kein gültiges
+ Zahlzeichen ist, beendet diesen Modus. Das neue Zeichen wird als
+ Info-Kommando aufgefaßt, wobei <zahl> auf die aktuelle Adres­
+ se gesetzt wird.
+ (Für 'yc' / 'yb' sinnvoll: Man setzt den Cursor auf die Stelle, an
+ der ein Break ausgelöst werden soll und gibt 'yc'/'yb').
+ Somit wird dieser Änderungsmodus üblicherweise durch *return*
+ beendet.
+
+#b("Einige Systemadressen")#
+#goalpage("sysaddr")#
+
+Der Info nützt nur wenig, wenn man nicht weiß, was man sich anschauen soll. Wesentliche
+Angaben über die Systemstruktur enthält das 'Brikett' (interne Systemdokumentation für
+Projekt Mikros der GMD). Da diese etwas allgemeiner gehalten ist, geht sie nicht auf imple­
+mentationsabhängige Konstanten ein. Diese sind hier aufgeführt.
+
+Ab 1500h liegt die 'ktab'. Sie enthält Informationen, welche Blöcke an welcher Stelle des
+Arbeitsspeicher liegen: In der Kachel mit der Adresse 512*i befindet sich der Inhalt des
+Blockes, dessen Nummer in ktab+i, ktab+100h+i steht. Ferner enthält die Tabelle, zu
+welchem Datenraum (drid) und welcher Seite des Datenraums der Inhalt gehört. (Nur rele­
+vant, wenn die Prozeßnummer <> 255 ist).
+
+Steuerbits: 2**0 : Inhalt wird gerade transportiert (zum HG oder Archiv).
+ 2**1 : Inhalt ist identisch mit Inhalt auf HG. Wird beim Schreiben auf die
+ Kachel (per Software) zurückgesetzt.
+ 2**2 : Schreiberlaubnis (siehe Brikett).
+ 2**3 : Inhalt wurde kürzlich benutzt. Solche Kacheln werden 'weniger
+ stark' verdrängt.
+
+
+ ktab frei niederwertige Blocknummer
+
+ +80h frei frei Steuerbits
+
+ +100h frei höherwertige Blocknummer
+
+ +180h frei frei Prozeßnummer
+
+ +200h frei frei drid (prozeßspezifisch)
+
+ +280h frei frei Seitennummer (höherw.)
+
+ +300h frei frei Seitennummer (niederw.)
+
+ ^ ^
+ <-- unbenutzt --> ! +-- Beginn echter Kacheln
+ +-- Beginn der Anforderungen
+
+
+Der 'Beginn echter Kacheln' hängt von der Größe der Z80-Teile ('urlader') ab (i.A.
+30h < i < 40h).
+
+'Beginn der Anforderungen' liegt bei i=1Fh. Es handelt sich um Blocknummern von zu
+ladenden Blöcken. Ist der höherwertige Teil der Blocknummer gleich FDh, so ist dies keine
+Anforderung.
+
+Blocknummern > FF00h stehen für Blöcke mit dem Inhalt 512 FFh's und werden nie auf dem
+Hintergrundmedium gespeichert.
+
+
+
+1E2Bh enthält den DR-Eintrag des drdr (siehe Brikett).
+
+
+'musta': Das System fordert Checkpoints und Müllabfuhren über die Zelle 'musta' an. Diese
+ findet man mit dem Info durch
+
+ xc musta
+
+ (hierfür ist der Text 'musta' vor der Zelle abgesetzt).
+
+ Die Zelle selbst enthält
+
+ FFh : Keine Müllabfuhr oder Checkpoint
+ 01h : Müllabfuhr
+ 02h : Checkpoint
+ 03h : beides
+ 04h : Systemendecheckpoint
+ 0Bh : System auf Archiv schreiben ('save system')
+ F0h : Müllabfuhr und Checkpoint sind geperrt (nur durch Setzen im Info
+ möglich)
+
+ Durch Einsetzen der Werte mit dem Info kann die entsprechende Operation veran­
+ laßt werden. Beim Einsetzen darf der Info nicht im 'r'-Zustand (siehe Eingabe 'r')
+ stehen; zum Ausführen der Operation muß 'r' (man bleibt im Info) oder 'g' (Info
+ verlassen) gegeben werden.
+
+
+1880h-18FFh:
+ enthält die Aktivierungstabelle. Ist (1880h+i)=01h, so ist die Task i aktiv. Hin­
+ weis: 18FFh enthält immer 01h, ohne daß dieser Zelle eine Task zugeordnet ist.
+
+
+#b("Leitblock")#
+#goalpage("pcb")#
+
+Mit dem 'z'-Kommando wird der Leitblock einer Task dargestellt. Es werden Hexapaare,
+gefolgt von einer Bezeichnung, ausgegeben. In der folgenden Beschreibung werden die
+Hexapaare durch a,b,c dargestellt.
+
+ a b c icount Der virtuelle Befehlszähler der Task steht auf (cMOD4)*
+ 10000h+b*100h+a = <ic> im Datenraum 4 dieser Task.
+ Durch die Eingabefolge:
+ 4s<ic>w*return*
+ kann man sich den Code, der ausgeführt werden soll, anse­
+ hen.
+
+ Bit 2**7 von c zeigt den Fehlerzustand an.
+ Bit 2**6 von c zeigt 'disable stop' (siehe Benutzerhandbuch)
+ an.
+ Bit 2**4 zeigt vorzeichenlose Arithmetik an (Compilierung).
+
+ a b lbas Die lokale Basis steht auf 10000h+b*100h+c = <lb> im
+ Datenraum 4 (Wortadresse).
+
+ a b hptop Der Arbeitsheap geht von 30000h (Byteadr.) bis (aMOD16)*
+ 10000h+b*100h+(aDIV16)*10h (Byteadr!).
+
+ a b channel Die Task hängt an Kanal 100h*b+a (Terminalnummer). 0 =
+ kein Terminal angekoppelt.
+
+ a b taskid Die Tasknummer der betrachteten Task ist a. (b ist die
+ Versionsnummer zum Abdichten von 'send'/ 'wait').
+
+Um den Code, auf den der 'icount' zeigt, zu interpretieren, ziehe man das Brikett zu Rate.
+
+
+Hinweis: Wenn der Info einen internen Fehler anzeigt, und auch bei 'ke', ist der durch 'z'
+ angezeigte Leitblock u.U. nicht aktualisiert. Man kann dies durch die Eingaben 'r',
+ 'g' erzwingen. (Der Info stellt wegen 'r' dem Interpreter einen Restart zu, der dann
+ beim 'g' den Leitblock aktualisiert und den Befehl erneut aufsetzt). Tritt dabei der
+ Fehler nicht wieder auf, handelte es sich um einen transienten Fehler (z.B. der
+ Codeblock war noch im Einlesen und ist jetzt voll da). So etwas kann z.B. passie­
+ ren, wenn der SHard den Abschluß einer Leseoperation zu früh meldet.
+
diff --git a/doc/porting-z80/8/source-disk b/doc/porting-z80/8/source-disk
new file mode 100644
index 0000000..ff072f3
--- /dev/null
+++ b/doc/porting-z80/8/source-disk
@@ -0,0 +1 @@
+porting/portdoc-z80-8.img
diff --git a/doc/programming/programmierhandbuch.1 b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.1
index 24f2b03..24f2b03 100644
--- a/doc/programming/programmierhandbuch.1
+++ b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.1
diff --git a/doc/programming/programmierhandbuch.2a b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.2a
index a204091..a204091 100644
--- a/doc/programming/programmierhandbuch.2a
+++ b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.2a
diff --git a/doc/programming/programmierhandbuch.2b b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.2b
index c2103ba..c2103ba 100644
--- a/doc/programming/programmierhandbuch.2b
+++ b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.2b
diff --git a/doc/programming/programmierhandbuch.3 b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.3
index eade335..eade335 100644
--- a/doc/programming/programmierhandbuch.3
+++ b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.3
diff --git a/doc/programming/programmierhandbuch.4 b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.4
index 650d945..650d945 100644
--- a/doc/programming/programmierhandbuch.4
+++ b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.4
diff --git a/doc/programming/programmierhandbuch.5 b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.5
index a921572..a921572 100644
--- a/doc/programming/programmierhandbuch.5
+++ b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.5
diff --git a/doc/programming/programmierhandbuch.5b b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.5b
index d91bcc9..d91bcc9 100644
--- a/doc/programming/programmierhandbuch.5b
+++ b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.5b
diff --git a/doc/programming/programmierhandbuch.6 b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.6
index ce11f6f..ce11f6f 100644
--- a/doc/programming/programmierhandbuch.6
+++ b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.6
diff --git a/doc/programming/programmierhandbuch.index b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.index
index f3f4ede..f3f4ede 100644
--- a/doc/programming/programmierhandbuch.index
+++ b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.index
diff --git a/doc/programming/programmierhandbuch.inhalt b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.inhalt
index 45b3f1f..45b3f1f 100644
--- a/doc/programming/programmierhandbuch.inhalt
+++ b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.inhalt
diff --git a/doc/programming/programmierhandbuch.titel b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.titel
index 79b09b0..79b09b0 100644
--- a/doc/programming/programmierhandbuch.titel
+++ b/doc/programmer-manual/1.8.7/doc/programmierhandbuch.titel
diff --git a/doc/programmer-manual/1.8.7/source-disk b/doc/programmer-manual/1.8.7/source-disk
new file mode 100644
index 0000000..13e2021
--- /dev/null
+++ b/doc/programmer-manual/1.8.7/source-disk
@@ -0,0 +1 @@
+grundpaket/10_handbuecher.2.img
diff --git a/doc/prolog/prolog handbuch b/doc/prolog/prolog handbuch
deleted file mode 100644
index ea7c6a5..0000000
--- a/doc/prolog/prolog handbuch
+++ /dev/null
@@ -1,581 +0,0 @@
-____________________________________________________________________________
-
-
-#on("b")##on ("u")#
-#center#Betriebssystem E U M E L
-#off ("u")#
-
-
-#center#Prolog
-
-
-
-
-#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#
-
-Dr.P.Heyderhoff 12.03.1987
-GMD.F2.G2
-
-
-
-
-
-
- E L A N - P R O L O G
- _____________________
-
- (Die Fachsprache der künstlichen Intelligenz)
-
-#on("u")#Benutzungsanleitung und technische Beschreibung#off("u")#
-
-
-Elan-Prolog ist eine Computersprache der fünften Generation, die für
-die Praxis der Programmierung und die Lehre in Informatik eine neue
-Dimension erschließt. Für den professionellen Programmierer eröffnet sie
-neue Möglichkeiten, mächtige Anwendungen, wie Expertensysteme und andere
-neuartige Systeme der Wissensverarbeitung zu entwickeln.
-
-Elan-Prolog unterscheidet sich grundsätzlich von üblichen konventionellen
-Programmiersprachen. In Sprachen wie Elan und Pascal muß der Programmierer
-genau angeben, wie ein gewünschtes Ergebnis errechnet werden soll. Um was es
-sich dabei handelt, steht bestenfalls dann in der Dokumentation. Ganz anders
-ist es in Prolog. PROLOG steht für PROgrammieren in LOgik und basiert auf
-dem Prädikaten-Kalkül, der bekanntesten Form der formalen Logik. Also in
-Prolog schreibt der Programmierer hin, worin das Problem besteht. Er bedient
-sich dabei dieser formalen Logik. Prolog versucht dann eine Lösung zu
-finden. Der Lösungsweg ist dabei im Programm nicht vorgeschrieben. Das
-entlastet den Programmierer, und er kann seine ganze Kraft auf die logische
-Beschreibung des Problems konzentrieren.
-
-Elan-Prolog ist ein interpretatives System, das voll kompatibel ist mit dem
-Edinburgh Standard Prolog und in in komfortabler Weise in das Betriebssystem
-Eumel eingebettet ist.
-
-Eigenschaftes von Elan-Prolog:
-
-- Syntax gemäß dem Edinburgh Standard Prolog nach Clocksin-Mellish
-
-- Interpretierendes System mit inkrementellem Einpass-Compiler
-
-- Interaktiver Mehrfenster-Texteditor des Eumelsystems
-
-- Zugriff auf Elan-Prozeduren als Prolog-Regeln
-
-- Geschwindigkeit ca. 100 LIPS auf IBM/PC-XT
-
-- optionale dynamische Ablaufverfolgung
-
-- Erklärungskomponente
-
-- Eingabe und Ausgabe von Prolog-Ausdrücken und Klartext
-
-- Programmiert und dokumentiert in ELAN (über 2000 Zeilen)
-
-- daher besonders für den Informatik-Unterricht geeignet
-#page#
-#on("u")#Beschränkungen des Elan-Prolog:#off("u")#
-
-Folgende Beschränkungen gelten für die Implementierung von Elan-Prolog im
-Eumel-Systems:
-
-- Maximal 16000 Fakten und Regeln
-
-- Maximal 16000 Terme zur Konstruktion von Ausdrücken, Listen und Regeln
-
-- Maximal 800 Variablenbindungen
-
-- Maximal 800 Einträge im Beweisbaum
-
-- Maximal 4000 Bezeichner für Atome und Variablen
-
-- Maximal 16000 Buchstaben für alle Bezeichner zusammen
-
-
-Wie sieht ein Prolog-Programm aus?
-
-Ein Prolog-Programm besteht aus
-
- - Fakten über Objekte und ihre Beziehungen
-
- - Regeln über Objekte und ihre Beziehungen
-
-und besonders wichtig:
-
- - Der Benutzer kann Prolog über die Fakten und Regeln ausfragen.
-
-Fakten aus einer Wissensbasis, nämlich dem Prolog-Programm, sind z.B.:
-
- enthaelt (wisky, aethanol).
-
-Das wird gelesen als: "Wisky enthält Aethanol.". Grundzüge der sehr
-einfachen Syntax lassen sich hieran erklären. Ein Faktum wird geschrieben
-wie in diesem Beispiel:
-
- - Erst kommt der Name der Relation, geschrieben wie ein Elan-Name in
- kleinen Buchstaben.
-
- - Dann folgt in runden Klammern und durch Kommata getrennt eine Liste
- von Objektnamen.
-
- - Zum Schluß steht ein Punkt.
-
-Regeln sind Problembeschreibungen in der Form von logischen Ausdrücken der
-symbolischen Logik, wie z.B. die folgende Regel:
-
- bewirkt (A, B, kopfschmerz) :- enthaelt (A, aethanol),
- enthaelt (B, aspirin ).
-
-Das wird gelesen als: "Wenn man eine Droge A, die Aethanol enthält,
-und eine Droge B, die Aspirin enthält gleichzeitig einnimmt, dann bewirkt
-das Kopfschmerzen." Wie man sieht werden logische Variablen mit großen
-Buchstaben (wie Elan-Operatoren) geschrieben. Das Zeichen ":-" steht für das
-logische Wenn, und das Komma(",") für die logische Konjunktion. Die logische
-Disjunktion wird durch Semikolon(";") ausgedrückt.
-#page#
-Neben der hiermit vorgestellten Prefix-Schreibweise für Relationen gibt es in
-ELAN-Prolog auch noch eine Infix-Schreibweise für zweistellige Relationen.
-Hierbei werden die Relationen als Infix-Operatoren in großen
-Buchstaben geschrieben (wie in ELAN) und zwischen die beiden Operanden
-gesetzt. Als Operatoren sind auch die in Elan üblichen Operatoren
-
- ( +, -, *, /, MOD, =, <, >, <=, >=, <> )
-zulässig.
-
-In Infixausdrücken (wie z.B. 2+3*4) gelten die bekannten Vorrangregeln. Auch
-Klammern sind zulässig. Selbstdefinierte Operatoren haben niedrigste
-Priorität.
-
-Obiges Beispiel in Infix-Schreibweise:
-
- wisky ENTHAELT aethanol.
-
- bewirkt (A, B, kopfschmerz) :- A ENTHAELT aethanol,
- B ENTHAELT aspirin.
-
-
-Objekte in Prolog können Atome oder Listen sein. Für Atome gibt es zwei
-Schreibweisen:
-
- - genau so wie Elan-Bezeichner, also bestehend aus kleinen Buchstaben
- und Blanks. Dabei werden die Blanks eliminiert.
-
- - genauso wie Elan-Texte, nämlich in Gänsefüßchen eingeschlossen.
-
-Für Listen von Objekten gibt es wiederrum zwei Schreibweisen, wie folgende
-zwei unterschiedlichen Notationen des gleichen Beispiels zeigen:
-
- - [ das, ist, [ zum, beispiel ], eine, liste ]
-
- - [ das, ist, [ zum | [ beispiel | [] ] ], eine, liste ]
-
-Im zweiten Fall ist die als drittes Element in der Gesamtlisten enthaltene
-Teilliste mit dem Konstruktor "|" und der leeren Liste "[]" zusammengesetzt.
-Die Grundoperationen, die aus der Programmiersprache LISP bekannt sind,
-können als Prolog-Fakten unmittelbar wie folgt definiert werden:
-
- eq (X, X).
- head ([X|Y], X).
- tail ([X|Y], Y).
- cons (X, Y, [X|Y]).
-#page#
-#on("u")#Standard - Operatoren von Elan-Prolog:#off("u")#
-
-Im System sind nur ganz wenige Standardoperatoren eingebaut. Es sind die
-folgenden Fakten:
-
- - ! . der CUT-Operator schaltet des Backtracking ab.
-
- - bye. beendet die prolog Anwendung.
-
- - listing. zeigt alle insertierten Regeln.
-
- - listing (X). zeigt alle insertierten Regeln über X.
-
- - call (X). X wird ausgeführt.
-
- - write (X). das an X gebundenen Prolog-Objekts wird ausgegeben,
- writeq (X). und wenn nicht eindeutig, gequotet,
- put (X). das Zeichen, dessen ASCII-Code X ist wird ausgegeben,
- name (X,[Y]). unifiziert das Atom X mit der Liste seiner Buchstaben.
-
- - read (X). ein Objekt wird gelesen und an die Variable gebunden.
- get0 (X). das nächste Zeichen wird gelesen,
- get (X). das nächste druckbare Zeichen wird gelesen,
-
- - X = Y . Die an X und Y gebundenen Objekte sind gleich,
- X <> Y . sie sind ungleich,
- X <= Y . sie sind kleiner oder gleich,
- X == Y . sie sind wörtlich gleich,
- X =.. [F|A] . X ist der Term mit Funktor F und Argumentliste A.
-
- - X + Y . sie sollen addiert,
- X - Y . subtrahiert,
- X * Y . multipliziert,
- X / Y . dividiert,
- X MOD Y . der Divisionsrest soll ermittelt werden,
- die Auswertung geschieht durch den 'is'-Operators.
-
- - X IS EXPR . Das Ergebnis des arithmetischen Ausdrucks EXPR wird
- gebildet und mit X unifiziert.
-
- - incr (X). der arithmetische Wert von X wird um eins erhöht.
-
- - assertz ([X]). insertiert die Regel X am Ende einfügend.
- asserta ([Χ]). insertiert die Regel X am Anfang einfügend.
- retract ([X]). entfernt die Regel X wieder.
- clause (X,[Y]). holt die Regel Y mit dem Kopf X aus der Knowledgebase.
-
- - functor (X,Y,Z) Y ist der Funktor von X und Z ist seine Arität.
- arg (X,Y,Z). Z ist das x-te Argument der Funktion Y.
-
- - elan (X). Ausführung der insertierten ELAN-Prozedur X
- elan (X,Y). Ausführung von X mit dem TEXT-CONST-Parameter Y
-
- - elan(trace,on). schaltet den dynamischen Ablaufverfolger ein und
- elan(trace,off) schaltet ihn wieder ab.
-
- - elan(consult,X) lädt das Prologprogramm aus der Datei namens X hinzu.
- elan(reconsult,X) ersetzt das Prologprogramm aus der Datei X.
- elan(abolish,X) entfernt alle Regeln mit dem Namen X.
-#page#
-#on("u")#Das Dialogverhalten von Elan-Prolog:#off("u")#
-
-Elan-Prolog wird, sobald es in das Eumel-System insertiert ist, als Prozedur
-mit dem Namen "prolog" und einem optionalen TEXT-Parameter aufgerufen. Der
-Textparameter enthält den Namen einer Datei, die ein Prolog-Programm enthält,
-das geladen werden soll. Fehlt der Parameter, wird, wie üblich, die zuletzt
-bearbeitete Datei genommen. Im Prolog-Dialog können später weitere
-Prolog-Programme mit der Prozedur namens "consult" hinzugeladen werden.
-
-Also
-einfachster Aufruf: prolog ("")
-
-Antwort: ?-
-Beispiel-Eingabe: 3 = 3
-Antwort: yes
- ?-
-Eingabe: 4 = -5
-Antwort: no
- ?-
-
-Besondere Dialogkommandos:
-
- ?-
-Eingabe: ?
-Antwort z.B.: 13.5 SEC
- ?-
-Eingabe: listing
-Antwort: { zeigt alle aktuell verfügbaren Regeln }
- ?-
-Eingabe: {ESCAPE} q
-Ausgabe: gib kommando:
-
-Eingabe: prolog again
-Ausgabe: ?-
-Eingabe: [sum, permute] {in eckigen Klammern!}
- { konsultiert diese beiden Dateien }
-Antwort z.B.: 25 rules inserted.
- ?-
-Eingabe: [-sum, -permute]
- { löscht und rekonsultiert aus diesen Dateien }
-Antwort z.B.: 25 rules inserted.
-
-Eingabe: {ESCAPE} {ESCAPE}
-Antwort: gib kommado:
-Elan-Eingabe z.B.: show ("standard")
- { zeigt die Datei dieses Namens }
- ?-
-
-Auf diese Weise können bequem Eumel-Kommandos gegeben werden. Die
-Umschaltung vom Prolog- zum Eumelmonitor-Betrieb erfolgt durch die Tasten
-{ESCAPE},{ESCAPE} und {RETURN}. Wie üblich ist das zuletzt verwendete
-Kommando auch im Prolog-Dialog mit dem Escapekommando "{ESCAPE} k"
-wiederzubekommen. Das Kommando "{ESCAPE} q" beendet den Dialog.
-#page#
-#on("u")#Ausprobieren der Prolog-Programmbeispiele:#off("u")#
-
-Zum Ausprobieren sind die Prologbeispiele "eq", "permute" und "mann"
-beigefügt.
-
-Beispiel: ?-
-Eingabe: [permute] {in eckigen Klammern!}
-Antwort: 5 rules inserted.
- ?-
-Eingabe: marquise(X)
-Antwort: beautiful marquise your beautiful eyes make me die of love
-Eingabe: {Semicolon}
-Antwort: your beautiful eyes beautiful marquise make me die of love
- { usw }
-Eingabe: {Return}
-Antwort: ?-
-
-Jede #on("u")#Eingabe von Semicolon#off("u")# liefert als Antwort die nächste Permutation. Wenn
-eine andere Taste gedrückt wird, bricht die Ausgabe weiterer Ergebnisse ab.
-
-#on("u")#Eingabe von Fragezeichen#off("u")# liefert neben der Angabe der benötigten
-Rechenzeit eine Erklärung der letzten Antwort durch Ausgabe aller zu dieser
-Antwort führenden Schlußfolgerungen. Dabei wird der Beweisbaum in Form einer
-Einrückstruktur dargestellt. Die Einrückung stellt die Erklärungstiefe dar.
-
-
-#on("u")#Benutzung von Prolog von Elan-Programmen aus#off("u")#
-
-Wenn man Prolog als Unterprogramm von Elan aus aufrufen will, geht man
-folgendermaßen vor:
-
-1. Laden einer Wissensbasis,
- die in einer Datei namens <knowledgebase> z.B."permute" bereitsteht:
-
- push ("bye"13"");
- prolog ("permute");
-
-
-2. Abfragen an diese Wissensbasis:
-
- TEXT VAR query, answer;
- query:= "marquise (X)";
- IF prolog ( query, answer)
- THEN put (answer)
- ELSE put ("NO")
- FI;
-
-In diesem Anwendungsbeispiel liefert die Ausgabeanweisung 'put (answer)':
-
- beautiful marquise your beatiful eyes make me die of love
-
-#page#
-#on("u")#Literatur:#off("u")#
-
-
-1.) W.F.Clocksin, C.S.Mellish:
- Programming in Prolog
- Springer 1984
-
-2.) M.H.van Emden:
- An interpreting algorithm for prolog programs
- in Implementations of Prolog, Ellis Herwood Ltd, 1984
-
-3.) Alain Colmerauer:
- Prolog in 10 Figures
- Communications of the ACM December 1985
-
-4.) J. Cohen:
- Describing Prolog by its Interpretation and Compilation
- Communications of the ACM December 1985
-
-5.) Alain Colmerauer:
- Les system q ou un formalisme pour alalyser et synthetiser des phrases
- sur ordinateur.
- Intern.Rep. 43, Departement d'informatique. Universite de Montreal
- Sept. 1970
-#page#
-(*************************************************************************)
-(* *)
-(* Elan-Prolog *)
-(* *)
-(* Programm-Beispiele: *)
-(* *)
-(****************** standard (nach Clocksin-Mellish) ********************)
-
-abolish (X) :- elan (abolish, X).
-append ([], X, X) :- !.
-append ([X|Y], Z, [X|W]) :- append (Y, Z, W).
-atom (X) :- functor (X, Y, 0).
-atomic (X) :- atom (X); integer (X).
-consult (X) :- elan (consult, X).
-end :- bye.
-fail :- [].
-findall (X, Y, Z) :- tell ("$$"), write ("("), findall (X,Y);
- write (")"), told, see ("$$"), read (Z),
- seen, elan (forget, "$$").
-findall (X, Y) :- call (Y), writeq (X), write (","), [].
-integer (X) :- functor (X, Y, -1).
-listing (X).
-member (X, [X|Z]).
-member (X, [Y|Z]) :- member (X, Z).
-nl :- elan (line).
-non var (X) :- var (X), !, []; .
-not (X) :- call (X), !, []; .
-notrace :- elan (trace, off).
-reconsult (X) :- elan (reconsult, X).
-repeat.
-repeat :- repeat.
-see (X) :- elan (sysin, X).
-seen :- elan (sysin, "").
-tab (X) :- tab(X,1).
-tab (X,Y) :- Y<=X, !, put (32), incr(Y), tab(X,Y);.
-tell (X) :- elan (sysout, X).
-told :- elan (sysout, "").
-trace :- elan (trace, on).
-true.
-< (X, Y) :- <= (X, Y), <> (X, Y).
-> (X, Y) :- <= (Y, X).
->= (X, Y) :- < (Y, X).
-#page#
-(**************************** sum ***********************************)
-
-suc (0, 1). suc (1, 2). suc (2, 3). suc (3, 4). suc (4, 5).
-suc (5, 6). suc (6, 7). suc (7, 8). suc (8, 9).
-sum (0, X, X).
-sum (X, Y, Z):- suc (V, X), sum (V, Y, W), suc (W, Z).
-plus (X, [0,0], X):- !.
-plus (X, Y, Z):- plus one (V, Y), plus (X, V, W), !, plus one (W, Z).
-plus one ([X, Y], [V, W]):- suc (Y, W), X = V, !;
- Y = 9, suc (X, V), W = 0.
-treereverse (X,Y):- rev (X,Y), !; rev (Y,X), !.
-rev ([], []).
-rev ([X|Y], Z):- X <> [H|T], rev (Y, W), !, append (W, [X], Z);
- rev (X, V), rev (Y, W), !, append (W, [V], Z).
-
-(**************************** permute ************************************)
-
-permute ([], []).
-permute ([E|X], Z):-
- permute (X, Y), insert (E, Y, Z).
-insert (E, X, [E|X]).
-insert (E, [F|X], [F|Y]):-
- insert (E, X, Y).
-marquise(RESULT):-
- permute (["beautiful marquise",
- "your beautiful eyes",
- "make me",
- "die",
- "of love"
- ],
- RESULT).
-
-(**************************** puzzle ************************************)
-
- {Solution: 9,5,6,7,0,8,2}
-puzzle:- repeat, permute ((9,8,7,6,5,2,0), SENDMORY),
- write (SENDMORY),
- puzzle (SENDMORY, SEND, MORE, MONEY),
- elan (line),
- write (SEND), write (+),
- write (MORE), write (=),
- write (MONEY).
-
-puzzle([S,E,N,D,O,R,Y], SEND, MORE, MONEY):-
- SEND IS ((S * 10 + E) * 10 + N) * 10 + D,
- MORE IS ((10 + O) * 10 + R) * 10 + E,
- MONEY IS (((10 + O) * 10 + N) * 10 + E) * 10 + Y,
- MONEY IS SEND + MORE.
-
-permute ([], []).
-permute ([E|X], Z):- permute (X, Y), insert (E, Y, Z).
-
-insert (E, X, [E|X]).
-insert (E, [F|X], [F|Y]):- insert (E, X, Y).
-
-repeat.
-repeat:- repeat.
-#page#
-(**************************** prieks ***********************************)
-
-ist priek (bo priek).
-ist priek (ki priek).
-ist priek (bla priek).
-
-WER GNASELT WEN :- population (B),
- member ([WEN, WER, _], B),
- bedingungen (B).
-
-WER KNAUDERT WEN:- population (B),
- member ([WER, _, WEN], B),
- bedingungen (B).
-
-population (B):- sind prieks (U, V, W),
- sind knauderarten (R, S, T),
- B = [ [drausla puemfe, U, R],
- [glessla puemfe, V, S],
- [hapla puemfe, W, T] ].
-
-sind prieks (X,Y,Z):- ist priek (G),
- ist priek (H), H<>G,
- ist priek (I), I<>G, I<>H, !,
- permute ([G,H,I], [X,Y,Z]).
-
-sind knauderarten (X,Y,Z):- ist knauderart (G),
- ist knauderart (H), H<>G,
- ist knauderart (I), I<>G, I<>H, !,
- permute ([G,H,I],[X,Y,Z]).
-
-ist knauderart (an).
-ist knauderart (ab).
-ist knauderart (ueber).
-
-bedingungen (B):- not member ([hapla puemfe,ki priek,_],B) ,
- not member ([hapla puemfe,_,ueber],B) ,
- not member ([drausla puemfe,bo priek,_],B) ,
- not member ([_,bo priek,ab],B) ,
- noch ne bedingung (B) ,
- weitere bedingungen (B) , !.
-
-weitere bedingungen (B):- not member([_,ki priek,ueber],B),
- not member([_,bo priek,ueber],B)
- ;
- member([drausla puemfe,_,an],B).
-
-noch ne bedingung (B):- not member ([drausla puemfe,ki priek,_],B)
- ;
- not member ([glessla puemfe,_,ueber],B).
-
-permute ([], []).
-permute (X, [Y|Z]):- delete (Y ,X, E), permute (E, Z).
-delete (X, [X|Z], Z).
-delete (X, [Y|Z], [Y|E]):- delete (X, Z, E).
-member (X, [X|Z]).
-member (X, [Y|Z]):- member (X, Z).
-not member (X, []).
-not member (X, [Y|Z]):- X <> Y, not member (X,Z).
-#page#
-(**************************** calc ************************************)
-
-{ CALC evaluates arithmetic expressions with store }
-
-calc:- eval ([], RS), write (result store), write (RS), nl.
-
-eval (SI, SO):-
- read (CALC), nonvar (CALC), eval member (CALC, SI, SO).
-
-eval member (CALC, SI, SO):-
- member (CALC, [stop,end,bye,eof]), SO=SI;
- eval (CALC,I,SI,ST), write (I), eval (ST,SO);
- write (error in), write (CALC), nl, eval (SI, SO).
-
-eval (I, I, S, S):- integer (I).
-eval (N, I, S, S):- atom (N), eval atom (N, I, S).
-
-eval atom (N, I, S):-
- member (N=I, S);
- write ("error: Cell"), write (N),
- write("not found in store. 0 substituted."), nl, I=0.
-
-eval ( L+R,I,SI,SO):- eval (L,J,SI,ST), eval (R,K,ST,SO), I IS J+K.
-eval ( L-R,I,SI,SO):- eval (L,J,SI,ST), eval (R,K,ST,SO), I IS J-K.
-eval ( L*R,I,SI,SO):- eval (L,J,SI,ST), eval (R,K,ST,SO), I IS J*K.
-eval ( L/R,I,SI,SO):- eval (L,J,SI,ST), eval (R,K,ST,SO), I IS J/K.
-
-eval (N=O, I, SI, SO):-
- atom (N), eval (O,I,SI,ST), eval repl (N,I,ST,SO).
-
-eval repl (N, I, [], [=(N,I)]).
-eval repl (N, I, [=(N,_)|S], [=(N,I)|S]).
-eval repl (N, I, [=(M,J)|SI], [=(M,J)|SO]):- eval repl (N, I, SI, SO).
-
diff --git a/doc/prozess/Anhang Prozess b/doc/prozess/Anhang Prozess
deleted file mode 100644
index 8415268..0000000
--- a/doc/prozess/Anhang Prozess
+++ /dev/null
@@ -1,92 +0,0 @@
-limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (1)#
-#headodd#
-#center#gs-Prozess#right#%
-
-#end#
-#headeven#
-%#center#gs-Prozess
-
-#end#
-#center#1
-
-#center##on("b")#Anhang#off("b")#
-
-#center##on("b")#Bezugsquellenverzeichnis#off("b")#
-
-
- - AKTRONIK
- Elektronik-Großhandel
- A. Kaup
- Teichstraße 9
- 4401 Saerbeck
- Tel.: 02574/8008 - 8009
-
-
-
- - BICOS Computer GmbH
- Werkering 6
- Postfach 1229
- 4800 Bielefeld 1
- Tel.: 0521/34011
-
-
-
- - lattasoft
- Eva Latta-Weber
- Software-  und
- Hardware-Systeme
- Brehmstraße 7
- 4800 Bielefeld 1
- Tel.: 0521/38919
-
-
-
- - Landesinstitut für Schule
- und Weiterbildung
- Paradieser Weg 64
- 4770 Soest
- Tel.: 02921/683-1
-
-#page#
-#on("b")#Anhang#off("b")#
-
-#on("b")#Verzeichnis der Abbildungen#off("b")#
-
-Abb. 1: MUFI geöffnet
-Abb. 2: Mögliche DIP-Schalter-Stellung beim MUFI
-Abb. 3: Einbau des MUFIs in den Terminalkanal
-Abb. 4: RS232-Adapter geöffnet
-Abb. 5: Mögliche Jumperposition beim RS232-Adapter
-Abb. 6: Auswahl der Interface-Anpassung
-Abb. 7: Anschluß Leuchtdiodenanzeige -Kombikarte
-Abb. 8: Pinbelegung auf der E/A-Karte
-Abb. 9: Eingangsbildschirm ls-Prozess
-Abb.10: Menubildschirm zum Oberbegriff 'Interface'
-Abb.11: Information bei unkonfiguriertem System
-Abb.12: Auswahl der Steckplatzart
-Abb.13: Compact-Box: Belegung der Kanäle
-Abb.14: Auswahl einer Interfacekarte
-Abb.15: Kanalbelegung D/A-Karte (Einzelsteckplatz)
-Abb.16: A/D-Karte: Angabe der Schalterstellung
-Abb.17: A/D-Karte: Kanalbel./Spannungsber.(Bspl.)
-Abb.18: Ausgabetest - Einblendung
-Abb.19: Eingabetest - Einblendung
-Abb.20: Beispiellochkarte
-Abb.21: Aufbau eines Drehpotentiometers
-Abb.22: Eingangsbildschirm ls-Prozess
-Abb.23: Befehlsübersicht
-Abb.24: Auswahl Ausgabebefehle
-Abb.25: Auswahl Eingabebefehle
-Abb.26: Auswahl Testbefehle
-Abb.27: Auswahl 'Weitere Befehle'
-Abb.28: Menubildschirm zum Oberbegriff 'Interface'
-Abb.29: Menubildschirm zum Oberbegriff 'Programm'
-Abb.30: Informationsauswahl zum EUMEL-Editor
-Abb.31: Menubildschirm zum Oberbegriff 'Archiv'
-Abb.32: Auswahl der Archiv-Formate
-Abb.33: Auswahl der Zieltask
-
-
-
diff --git a/doc/prozess/Inhalt Prozess b/doc/prozess/Inhalt Prozess
deleted file mode 100644
index ab9616a..0000000
--- a/doc/prozess/Inhalt Prozess
+++ /dev/null
@@ -1,84 +0,0 @@
-limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (1)#
-#headodd#
-#center#gs-Prozess#right#%
-
-#end#
-#headeven#
-%#center#gs-Prozess
-
-#end#
-#center#1
-
-#center##on("b")#Inhaltsverzeichnis#off("b")#
-
-1 Was kann gs-Prozess
-
-2 Allgemeines zur Prozeßdatenverarbeitung
-2.1 Welche Hardware-Lösungen gibt es zur Zeit ?
-2.2 Die besonderen Probleme unter EUMEL
-2.3 Die Wahl des Interface-Systems
-
-3 Installation des Interface-Systems
-3.1 Das MUFI der Firma BICOS als Adapter
-3.1.1 Einstellung der DIP-Schalter am MUFI
-3.1.2 Einbau des MUFIs in den Terminalkanal
-3.1.3 Das MUFI an separater serieller Schnittstelle
-3.2 Der RS232-Adapter der Firma AKTRONIK
-3.3 Verbindung Adapter - Interface-System
-3.4 Bereitstellung des Interface-Systems
-
-4 Installation von gs-Prozess
-4.1 Voraussetzungen
-4.2 Lieferumfang
-4.3 Installation
-4.4 Anmerkungen zur Erstinstallation
-
-5 Konfiguration von gs-Prozess
-5.1 Kontrolle der Konfigurationen/Anschlüsse
-5.2 Vorbereitungen für den Ein-/Ausgabetest
-5.2.1 Anschluß einer Leuchtdiodenanzeige an die Kombikarte
-5.2.2 Anschluß des Codekartenlesers (Drahtstück)
-5.3 Konfiguration von gs-Prozess
-5.3.1 Auswahl der Steckplatzart/Interfacekarte
-5.3.2 Bedeutung der Kanalnummern
-5.4 Aus- und Eingabetest
-5.5 Mögliche Fehlerfälle
-
-6 Arbeiten mit gs-Prozess
-6.1 Kleine Beispiele zur digitalen Ausgabe
-6.1.1 Möglichkeit eines Programmabbruchs
-6.1.2 Die "sonstigen" Befehle
-6.1.3 Schreibweise für Bitmuster/Bitsymbole
-6.1.4 Befehle für die digitale Ausgabe
-6.1.5 Befehle für die analoge Ausgabe
-6.2 Kleine Beispiele zur digitalen Eingabe
-6.2.1 Befehle für die digitale Eingabe
-6.2.2 Eingabetests
-6.2.3 Befehle für die analoge Eingabe
-6.3 Hinweise auf Aufgabenmaterial
-
-7 Beschreibung der Menufunktionen
-7.1 Kurzhinweise zur Bedienung der Menus
-7.2 Menufunktionen zum Oberbegriff 'Info'
-7.3 Menufunktionen zum Oberbegriff 'Interface'
-7.4 Menufunktionen zum Oberbegriff 'Programm'
-7.5 Menufunktionen zum Oberbegriff 'Archiv'
-
-8 Detailbeschreibung der Basisbefehle und Tests
-
-9 Hinweise für den Systembetreuer/    Programmierer
-9.1 Vergabe der Kanäle/Organisation des Tasksystems
-9.2 Informationsprozeduren
-9.3 Neufestlegung des Interfacekanals
-9.4 Fixieren der Konfiguration
-9.5 Mögliche Fehlerfälle
-9.6 Weitere Möglichkeiten
-
-Anhang: Bezugsquellenverzeichnis
- Verzeichnis der Abbildungen
-
-
-
-
diff --git a/doc/prozess/gs-Prozess handbuch.impressum b/doc/prozess/gs-Prozess handbuch.impressum
deleted file mode 100644
index ca22b10..0000000
--- a/doc/prozess/gs-Prozess handbuch.impressum
+++ /dev/null
@@ -1,104 +0,0 @@
-____________________________________________________________________________
-
-
-#on("b")##on ("u")#
-#center#Betriebssystem E U M E L
-#off ("u")#
-
-
-#center#gs-Prozess
-
-
-
-
-#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#
-
-#free (4.0)##on("b")#
-#center#gs-Prozess
-
-
-#center#Benutzerhandbuch
-
-
-#center#Version 1.0
-
-
-#off("b")##center#copyright
-#center#Eva Latta-Weber
-#center#Software- und Hardware-Systeme, 1988
-#center#ERGOS GmbH, 1990
-#page#
-#block#
-#center#____________________________________________________________________________
-
-
-Copyright:  ERGOS GmbH   März 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.
-
-
-#center#____________________________________________________________________________
-
-Es kann keine Gewähr übernommen werden, daß das Programm für eine
-bestimmte Anwendung geeignet ist. Die Verantwortung dafür liegt beim
-Anwender.
-
-Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrektheit und
-Vollständigkeit der Angaben kann keine Gewähr übernommen werden. Das
-Handbuch kann jederzeit ohne Ankündigung geändert werden.
-
-Texterstellung :  Dieser Text wurde mit der ERGOS-L3 Textverarbeitung
- erstellt und aufbereitet und auf einem Kyocera Laser­
- drucker gedruckt.
-
-
-
-
-#center#___________________________________________________________________________
-
-
-
-Ergonomic Office Software GmbH
-
-Bergstr. 7 Telefon: (02241) 63075
-5200 Siegburg Teletex: 2627-2241413=ERGOS
- Telefax: (02241) 63078
-
-
-#center#____________________________________________________________________________
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/doc/prozess/gs-Prozess-2 b/doc/prozess/gs-Prozess-2
deleted file mode 100644
index 376143e..0000000
--- a/doc/prozess/gs-Prozess-2
+++ /dev/null
@@ -1,255 +0,0 @@
-limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (1)#
-#headodd#
-#center#gs-Prozess#right#%
-
-#end#
-#headeven#
-%#center#gs-Prozess
-
-#end#
-#center#1
-
-#on("b")#2  Allgemeines zur Prozeßdatenverarbeitung#off("b")#
-
-In diesem Kapitel erfahren Sie, warum unter EUMEL/ELAN die Prozeßdatenver­
-arbeitung bisher kaum Berücksichtigung gefunden hat und welche Probleme zu
-überwinden waren. Es wird aufgezeigt, warum unter EUMEL/ELAN nicht jedes Inter­
-facesystem verwendet werden kann; außerdem werden die Gründe für die Wahl eines
-bestimmten Interfacesystems genannt.
-
-
-#on("b")#2.1  Welche Hardware-Lösungen gibt es zur Zeit ?#off("b")#
-
-Wie schon in Kapitel 1 erwähnt, ist zum Messen, Steuern und Regeln mit dem
-Computer ein Hardware-Interface notwendig, über das der "Kontakt zur Außenwelt"
-hergestellt wird.
-
-
-#on("b")#
- Computer <--------> Interface <--------> Modell
-#off("b")#
-
-
-Interfaces (zu deutsch etwas mißverständlich: Schnittstellen) verbinden innerhalb
-eines Systems Teilsysteme und einzelne Funktionseinheiten miteinander. Dabei
-werden z.B. #on("b")#Hardware-Schnittstellen#off("b")# (Um diese geht es vornehmlich in diesem
-Kapitel), #on("b")#Hardware-Software-Schnittstellen#off("b")# (Nach Festlegung, welche Funktionen
-eines Rechnersystems von der Hardware und welche von der Software übernommen
-werden, erfolgt hierüber die Verknüpfung der beiden Komponenten), #on("b")#Software-
-Schnittstellen#off("b")# (zwischen Programmoduln), #on("b")#Mensch-Maschine-Schnittstellen#off("b")#
-(Benutzerschnittstellen - wie z.B. #on("b")#gs-DIALOG#off("b")#) unterschieden.
-
-Wenn wir im folgenden von 'Interface' reden, ist damit immer eine 'Hardware-
-Schnittstelle' gemeint.
-
-Über ein solches Interface (eine Hardware-Schnittstelle) können an den Computer
-externe Geräte/Modelle angeschlossen werden, die vom Computer aus gesteuert
-werden. Dabei setzt das Interface die vergleichsweise schwachen Signale des
-Computers in Ströme und Spannungen um, mit denen z.B. eine Lampe oder ein
-Motor betrieben werden kann. Umgekehrt senden externe Geräte/Modelle über das
-Interface Signale an den Computer, die von ihm ausgewertet werden. So müssen z.B.
-Widerstandsveränderungen eines Temperaturfühlers oder die Stellung eines Schalters
-in eine vom Computer erfaßbare Form umgewandelt werden.
-
-Inzwischen bieten verschiedene Hersteller (FISCHER, LEGO, AKTRONIK, PHYWE,
-etc.) und Lehrmittelverlage (METZLER, CVK, etc.) eine Reihe von Lösungen an.
-Leider sind die meisten Lösungen auf ganz spezielle Computertypen zugeschnitten
-und somit nicht an anderen Computertypen verwendbar - außerdem unterscheiden
-sich die verschiedenen Lösungen z.T. ganz erheblich im Leistungsumfang.
-
-Einzellösungen, insbesondere an den gängigen Homecomputern, gibt es schon seit
-langem. Voraussetzung ist zumeist, daß der Computer über einen speziellen
-Anschluß ('Userport' oder 'Joystick-Eingang') verfügt. Oder es werden Platinen
-geliefert, die in spezielle Steckplätze (Slots) einzustecken sind, wo sie vom Computer
-aus angesprochen werden können.
-
-Bei all diesen Lösungen konnten wir 'EUMELaner' nur neidvoll zuschauen. Der
-Vorteil, den wir sonst so zu schätzen wissen, ein einheitliches Betriebssystem auf ganz
-unterschiedlicher Hardware zur Verfügung zu haben, wird hier zum Nachteil. Eine
-einheitliche Lösung schien zu Anfang völlig aussichtslos zu sein.
-
-
-#on("b")#2.2  Die besonderen Probleme unter EUMEL#off("b")#
-
-Das Betriebssystem EUMEL gestattet es nicht, beliebig auf Hardwarekomponenten des
-Rechners zuzugreifen - und das aus gutem Grund, denn sonst wäre ein reibungsloser
-Multi-User-Betrieb nicht gewährleistet. Man kann aber den Zugriff auf neue Hard­
-warekomponenten im EUMEL-System etablieren. Allerdings ist das etwas aufwendiger
-als in anderen Systemen, denn das sogenannte 'Shard', die 'Software-Hardware-
-Schnittstelle', muß angepaßt werden.
-
-Unsere ersten "Gehversuche" mit der Prozeßdatenverarbeitung unter EUMEL haben
-so angefangen. Es ist aber leicht einzusehen, daß dieser Weg nicht sinnvoll ist. Denn
-dann müßten alle EUMEL-Shards (es gibt ja für jeden Rechnertyp mindestens eines)
-entsprechend geändert werden, ggf. müßten für verschiedene Lösungen verschiedene
-Versionen entwickelt werden - eine Aufgabe, die niemand bereit wäre zu überneh­
-men.
-
-
-#on("b")#2.3  Die Wahl des Interface-Systems#off("b")#
-
-Unser Ziel war klar: Wir wollten ein gängiges, käuflich zu erwerbendes Hardware-
-Interface möglichst universell an Computern verschiedener Hersteller unter dem
-Betriebssystem EUMEL ansprechen können.
-
-Nach Sichtung der angebotenen Systeme kamen nur drei in die engere Wahl: das
-LEGO-Interface, das FISCHER-Technik-Interface und das AKTRONIK-Interface (Soft­
-ware-kompatibel dazu ist das PHYWE-Interface).
-
-Bei der Auswahl hielten wir es für sinnvoll, die Empfehlung des Landesinstituts für
-Schule und Weiterbildung in Soest zu berücksichtigen, in der folgende Anforderungen
-an Interfaces formuliert sind:
-
- - 8 digitale Eingänge
- - 8 digitale Ausgänge
- - optional: analoge Ein- und Ausgabe.
-
-Allen gestellten Anforderungen wird nur das AKTRONIK-Interface gerecht. Das System
-ist modular aufgebaut, je nach Anforderungen kann mit verschiedenen Steckkarten
-gearbeitet werden. Es gibt eine "Kompaktlösung", bei der die wichtigsten Funktionen
-bereitgestellt werden (8 digitale Eingänge, 8 digitale Ausgänge, 2 analoge Eingänge).
-Darüber hinaus kann auch noch mit dem sog. 'Modul-Bus' gearbeitet werden, bei
-dem gleichzeitig mehrere Steckkarten angesprochen werden können. Mit ent­
-sprechender Steckkarte ist auch die analoge Ausgabe möglich.
-
-Die beiden anderen Interfaces erfüllen die oben genannten Anforderungen nicht: Das
-LEGO-Interface verfügt über nur 6 digitale Ausgänge und 2 digitale Eingänge; analoge
-Ein- und Ausgabe ist gar nicht möglich.
-
-Das FISCHER-Technik-Inteface verfügt über 8 digitale Ausgänge und 8 digitale Ein­
-gänge. Das Interface verfügt auch über einen analogen Eingang - allerdings nicht
-über einen Analog-Digital-Wandler-Baustein! Das bedeutet, daß der angeschlossene
-Rechner die Auswertung der eingehenden Daten übernehmen muß - ein zeit­
-kritischer Prozeß, der in einem Multi-User-System nicht garantiert werden kann. Die
-analoge Ausgabe ist grundsätzlich nicht möglich, das System ist in sich abgeschlossen
-und kann sich ändernden Anforderungen ebensowenig angepaßt werden wie das
-LEGO-Interface.
-
-
-Wir entschieden uns also dafür, die weitere Entwicklung auf der Basis des
-AKTRONIK-Interfaces zu betreiben. Es galt jedoch noch, dieses Interface mit dem
-Computer zu verbinden - und das möglichst universell: möglichst unabhängig von der
-verwendeten Computerhardware.
-
-Dieses Ziel ist nur dann zu erreichen, wenn man die 'Standardschittstellen' des
-Computers berücksichtigt, die unter EUMEL problemlos ansprechbar sind: die
-parallelen (Centronics) und seriellen (V24) Schnittstellen. Diese 'Standardschnitt­
-stellen' sind zwar nicht für den direkten Anschluß der Modelle/Interfaces geeignet,
-über einen "Adapter" aber ist ein Anschluß möglich.
-
-Die Entscheidung fiel schnell gegen eine Verwendung der parallelen (Centronics)
-Schnittstelle. Die meisten Computer verfügen nur über eine dieser Schnittstellen, die
-zumeist auch schon durch den Drucker belegt ist. Außerdem handelt es sich dabei in
-der Regel um eine unidirektionale Schnittstelle - d.h. die Daten können vom
-Computer zum Endgerät (z.B. Drucker) gelangen, nicht aber vom Endgerät zum
-Computer. Somit wären zwar Steuerungsvorgänge, nicht aber Meß- und Regelungs­
-vorgänge über die Schnittstelle möglich.
-
-Einige Hersteller nutzen die Datenleitungen, über die z.B. der Drucker dem Rechner
-mitteilt, daß der interne Speicher voll bzw. das Papier zuende ist. Über diese Leitung
-werden Daten seriell übertragen und vom Rechner ausgewertet. Unter EUMEL
-scheidet diese Lösung aber aus, denn um hier eine sichere Auswertung zu gewähr­
-leisten, müßten Maschinenspracheprogramme eingebunden werden; das ist aber
-unter EUMEL nicht möglich.
-
-Damit war festgelegt, daß die weitere Entwicklung auf der Basis des AKTRONIK-Inter­
-faces über die serielle Schnittstelle erfolgen sollte. Wie schon erwähnt, ist das Inter­
-face auf keinen Fall direkt an die serielle Schnittstelle anschließbar. Wie der Name
-schon sagt, werden die Daten bei einer seriellen Schnittstelle seriell übertragen - um
-Prozeßdatenverarbeitung zu betreiben, müssen die Daten aber parallel vorliegen.
-
-Notwendig ist also ein "Adapter", der einen Seriell-Parallel-/Parallel-Seriell-Wandler
-beinhaltet, so daß die Verbindung zwischen Computer und Interface hergestellt
-werden kann.
-
-Inzwischen sind uns hier zwei (käuflich zu erwerbende) Lösungen bekannt - der
-"RS232-Adapter" der Firma AKTRONIK und das "MUFI" (Multifunktionales Interface)
-der Firma BICOS:
-
-Das MUFI ist sicherlich der universeller verwendbare "Adapter" (leider aber auch die
-kostspieligere Lösung). Einerseits kann es ebenso wie der "RS232-Adapter" an eine
-separate serielle Schnittstelle angeschlossen werden, andererseits verfügt es über
-einen zweiten - den eigentlich interessanten Betriebsmodus: Es kann nämlich auch
-in den Terminalkanal eingebaut werden.
-
-Die Idee, die dahintersteckt, ist folgende: Das MUFI verfügt (neben der eigentlich
-wichtigen bidirektionalen parallelen Schnittstelle) über einen (seriellen) Eingang und
-einen (seriellen) Ausgang. So kann das MUFI einfach in eine Leitung zwischen
-Computer und Terminal eingebaut werden. In ausgeschaltetem Zustand hat es
-keinen Einfluß auf den Datenaustausch zwischen Rechner und Terminal - als ob es
-gar nicht vorhanden wäre. In eingeschaltetem Zustand dagegen "horcht es den
-Datenfluß zwischen Rechner und Terminal ab". Auf eine vereinbarte Parole
-(Zeichenkombination) hin, "weiß es", daß die folgenden Daten nicht für das
-Terminal, sondern eben für sich bestimmt sind. Diese, und nur diese Daten werden
-aus dem Datenstrom vom MUFI "herausgefischt" und intern sachgerecht weiterver­
-arbeitet. Alle anderen Daten werden unbeeinflußt an das Terminal weitergeleitet,
-damit ja nicht der reibungslose Betrieb gestört wird. Natürlich ist das MUFI ebenso in
-der Lage, die gerade extern anliegenden Daten zu ermitteln und in den Datenstrom
-zum Computer "einzuschleusen".
-
-Um diese Aufgaben bewältigen zu können, wurde das MUFI mit einem eigenen,
-schnellen Mikroprozessor ausgestattet, der in der Lage ist, den Datenfluß zu
-bewältigen. Zudem wurde versucht, das MUFI mit soviel Intelligenz (Firmware)
-auszustatten, daß alle zeitkritischen Prozesse bei der Ansteuerung des Interface-
-Systems vom MUFI selbst erledigt und die Daten vom MUFI so aufbereitet werden,
-daß sie möglichst einfach weitergegeben und verarbeitet werden können.
-
-Durch die Beschränkung der Baud-Rate auf maximal 19200 ist die Verarbeitungs­
-geschwindigkeit allerdings auch beschränkt. Die rechnerisch maximale Ausgabetakt­
-rate von 320 Hz bei 19200 Baud und 160 Hz bei 9600 Baud wird von #on("b")#gs-Prozess#off("b")# auf
-einem 80386-Rechner im Alleinbetrieb tatsächlich erreicht. Natürlich bedeuten
-mehrere gleichzeitig betriebene MUFIs an einem Rechner Geschwindigkeitseinbußen.
-Ebenso sinkt die Ausgabetaktrate bei Prozessoren mit geringerem Durchsatz (8088:
-maximal 120 Hz). Für die Anwendungen in der Schule sind diese Geschwindigkeiten
-aber hinreichend.
-
-Die Vorteile des MUFI für diejenigen, die EUMEL im Multi-User-Betrieb nutzen, liegen
-dennoch klar auf der Hand:
-
- - Es werden keine weiteren seriellen Schnittstellen benötigt. (Die vorhandenen
- sind sowieso schon weitgehend belegt. Gegebenenfalls würden zusätzliche
- Kosten verursacht.)
-
- - Es sind keine weiteren Kabelverlegungen zwischen Rechner und Arbeitsplatz
- notwendig, trotzdem befindet sich das MUFI direkt am Bildschirmarbeits­
- platz.
-
- - Das beim Anschluß an eine separate Schnittstelle notwendige, zeitauf­
- wendige Ansteuern des Interface-Kanals entfällt.
-
-
-Arbeiten Sie an einem Einzelplatz-System (z.B. IBM-kompatibler Rechner nur mit
-Monitor) so ist ein Betrieb des MUFIs im Terminal-Kanal nicht möglich. Hier bleibt
-nur der Betrieb des Interface-Systems an einer separaten seriellen Schnittstelle.
-Sinnvoll ist aber auch ein solcher Betrieb, wenn (zunächst) nur die Hardware für
-einen Arbeitsplatz zur Verfügung steht. Das Interface kann dann nämlich von meh­
-reren Tasks abwechselnd angesprochen werden.
-
-Beim Anschluß an eine separate serielle Schnittstelle sind die Leistungen des MUFIs
-und des RS232-Adapters gleichwertig. Da das abwechselnde Ansprechen einer
-seriellen Schnittstelle und der Tastatur/des Monitors unter EUMEL relativ zeitauf­
-wendig ist, sind hier keine hohe Ausgabegeschwindigkeiten zu erwarten: bei einem
-8088-Rechner ca. 40 Hz, bei Prozessoren mit höherem Durchsatz eben entsprechend
-mehr. Dennoch ist das für die meisten Anwendungen in der Schule schnell genug.
-
-Für Spezialanwendungen ist auch die direkte Ansprache der Schnittstelle möglich.
-Hierbei sind Ausgabetaktraten von 960 Hz bei 19200 Baud bzw. 480 Hz bei 9600
-Baud möglich. Für die schulische Praxis (in der Sekundarstufe I) ist diese "direkte
-Ansprache" aber ungeeignet, da weitergehende Programmierkenntnisse erforderlich
-sind. Zudem kann bei Programmierfehlern "die Task am Kanal hängenbleiben".
-Genaueres dazu sehen Sie bitte im Kapitel 'Hinweise für den Systembetreuer/
-Programmierer'.
-
-Die Hardware-Konstellation stellt sich im Überblick also folgendermaßen dar:
-#on("b")#
-
- Computer <---> Adapter <---> Interface <---> Modell
-
- (mit se- ('MUFI' (AKTRONIK)
- rieller oder
- Schnitt- 'RS232-
- stelle) Adapter')
-#off("b")#
-
diff --git a/doc/prozess/gs-Prozess-3 b/doc/prozess/gs-Prozess-3
deleted file mode 100644
index 3fae1bd..0000000
--- a/doc/prozess/gs-Prozess-3
+++ /dev/null
@@ -1,346 +0,0 @@
-limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (1)#
-#headodd#
-#center#gs-Prozess#right#%
-
-#end#
-#headeven#
-%#center#gs-Prozess
-
-#end#
-#center#1
-
-#on("b")#3  Installation des Interface-Systems#off("b")#
-
-In diesem Kapitel erfahren Sie, wie Sie Ihr Interface-System an den Rechner an­
-schließen und welche Einstellungen noch vorzunehmen sind. Für Details und weiter­
-gehende Informationen sehen Sie bitte in den Handbüchern / Begleitmaterialien der
-Firmen BICOS bzw. AKTRONIK nach.
-
-Am Ende des Kapitels 2 haben wir festgestellt, daß das Interface-System über einen
-Adapter mit dem Computer verbunden werden muß. An das Interface-System lassen
-sich dann entsprechende Modelle anschließen:
-
-#on("b")# Computer <----> Adapter <----> Interface <----> Modell
-
- (mit se- ('MUFI' (AKTRONIK)
- rieller oder
- Schnitt- 'RS232-
- stelle) Adapter') #off("b")#
-
-Wir möchten Ihnen zuerst erklären, wie Sie den jeweiligen Adapter mit dem
-Computer verbinden und welche Einstellungen am Adapter vorzunehmen sind. An­
-schließend beschreiben wir, wie Sie das Interface-System an den Adapter anschlie­
-ßen.
-
-Wie schon in Kapitel 2 erwähnt, können Sie zwischen zwei Adaptern wählen - dem
-MUFI der Firma BICOS und dem RS232-Adapter der Firma AKTRONIK. Letztge­
-nannter kann nur an einer separaten seriellen Schnittstelle betrieben werden,
-während das MUFI zusätzlich auch in den Terminalkanal eingebaut werden kann.
-
-
-#on("b")#3.1  Das MUFI der Firma BICOS als Adapter#off("b")#
-
-Für den Betrieb in einem Terminalkanal sollte das MUFI über eine sog. "Schnitt­
-stellen-Automatik" verfügen, die verhindert, daß das MUFI in ausgeschaltetem
-Zustand oder mit abgezogenem Netzstecker den Datenfluß zwischen Rechner und
-Terminal unterbricht. Diese sehr sinnvolle Automatik wird von BICOS #on("b")#nicht
-standardmäßig#off("b")# eingebaut. Sie sollten bei eventuellen Bestellungen darauf achten.
-Bevor Sie das MUFI in den Terminalkanal einbauen oder an eine separate serielle
-Schnittstelle anschließen, ist noch die Einstellung der DIP-Schalter zu kontrollieren
-bzw. eine Neueinstellung vorzunehmen.
-
-
-#on("b")#3.1.1  Einstellung der DIP-Schalter am MUFI#off("b")#
-
-Versichern Sie sich, daß das MUFI noch nicht an das Netz angeschlossen ist. Öffnen
-Sie dann das Gehäuse, indem Sie die vier Schrauben an der Unterseite des MUFIs
-(direkt neben den Füßen) lösen. Heben Sie nun #on("b")##on("b")#vorsichtig#off("b")##off("b")# den hellen Deckel des
-Gehäuses ab. Aber Achtung! Der Deckel bleibt über Kabel mit dem Fußteil ver­
-bunden! Legen Sie vorsichtig den Deckel neben das MUFI, so daß die Kabelver­
-bindungen nicht belastet werden.
-
- +---------------------------------------------------+
- | +-------+ +------------+ |
- | | | | | +---------+ |
- | +-------+ | | | DIP- | |
- | +-------+ | | | Schalter| |
-Rück- | | | | | +---------+ | Vorder-
-seite | +-------+ | | +--------------+ | seite
- | +-------+ | SCN68000 | | | |
- | | | | | +--------------+ |
- | +-------+ | | |
- | +-------+ | | |
- | | | | | |
- | +-------+ +------------+ |
- +---------------------------------------------------+
-
-
-
-#center#Abb.1: MUFI geöffnet
-
-
-Im Inneren des Fußteiles fällt Ihnen sofort der größte CHIP auf, der u.a. die
-Bezeichnung 'SCN68000' trägt. Drehen Sie das MUFI so vor sich, daß an der linken
-Seite dieses Chips die vier gleichen, mittelgroßen Chips zu liegen kommen. Dann
-sehen Sie rechts vom großen Chip, ganz hinten im Gehäuse eine kleine Plastikbox
-mit DIP-Schaltern, die die folgende Aufschrift trägt:
-
-#on("b")#
- O N
- 1 2 3 4
-#off("b")#
-
-Den durchsichtigen Deckel dieser kleinen Plastikbox müssen Sie nun öffnen, um die
-Stellung der DIP-Schalter einsehen zu können. Dazu verwenden Sie am besten einen
-Kugelschreiber oder einen kleinen Schraubendreher. Heben Sie damit den Deckel an
-der rechten Seite leicht an, dann läßt sich der Deckel nach links herüberlegen. Weist
-ein Schalter nach hinten (in dieser Lage des MUFIs von Ihrem Körper weg), so hat er
-die Stellung 'ON', weist er nach vorn (zu Ihrem Körper hin), so hat er die Stellung
-'OFF'.
-
-
-Beispiel:
-
- +---------------------------------------+
- | +-----+ +-----+ +-----+ +-----+ |
- | |+++++| | | | | | | |
- | |+++++| | | | | | | | ON
- | |+++++| | | | | | | |
- | |+++++| | | | | | | |
- | | | | | | | | | |
- | | | | | | | | | |
- | | | | | | | | | |
- | | | |+++++| |+++++| |+++++| |
- | | | |+++++| |+++++| |+++++| |
- | | | |+++++| |+++++| |+++++| | OFF
- | | | |+++++| |+++++| |+++++| |
- | +-----+ +-----+ +-----+ +-----+ |
- +---------------------------------------+
-
- 1 2 3 4
-
-#center#Abb.2:  Mögliche DIP-Schalter-Stellung beim MUFI
-
-
-Dabei haben die DIP-Schalter folgende Bedeutung:
-
-#on("b")#
- 1 ON : Modulbusbetrieb
- OFF : Parallelportbetrieb
-
- 2 ON : RTS/CTS Hardware Handshake
- OFF : XON-/XOFF-Protokoll
-
- 3 ON : 9600 Baud
- OFF : 19200 Baud
-
- 4 ON : Even Parity
- OFF : No Parity
-
-#off("b")#
-Wenn Sie das MUFI im Terminalkanal betreiben wollen, müssen Sie je nachdem, wie
-Sie Ihr Terminal konfiguriert haben, die entsprechende Einstellung vornehmen.
-
-Betreiben Sie das Terminal mit einer Ãœbertragungsrate von 19200 Baud, so sollten
-Sie unbedingt mit XON/XOFF-Protokoll arbeiten - es sei denn, das Terminal unter­
-stützt RTS/CTS! In jedem Falle muß der DIP-Schalter 1 in die Stellung ON gebracht
-werden (der Betrieb des Interface-Systems der Firma AKTRONIK wird hier "Modul­
-busbetrieb" genannt).
-
-Wenn Sie das MUFI an einer separaten seriellen Schnittstelle betreiben wollen, #on("b")#muß#off("b")#
-der Datenaustausch mit dem RTS/CTS-Protokoll abgewickelt werden. Versichern Sie
-sich, daß Ihr Kabel darauf ausgelegt ist!
-
-Nach dieser Einstellung der DIP-Schalter ist das MUFI betriebsbereit. Schrauben Sie
-bitte den Gehäusedeckel mit den vier Schrauben wieder fest.
-
-
-#on("b")#3.1.2  Einbau des MUFIs in den Terminalkanal#off("b")#
-
-Um das MUFI in den Terminalkanal einbauen zu können, müssen Sie zunächst die
-Zuleitung vom Rechner zum Terminal am Terminal lösen. Auf der Rückseite des
-MUFIs befinden sich zwei Stecker, die mit V24/1 und V24/2 bezeichnet sind. Ver­
-inden Sie nun das Kabel, was ursprünglich vom Computer zum Terminal führte, mit
-dem MUFI, indem Sie es an den mit V24/2 gekennzeichneten Stecker anstecken. Sie
-benötigen jetzt noch ein weiteres (kurzes) V24-Kabel, um das MUFI mit dem
-Terminal zu verbinden. Es wird einerseits auf den mit V24/1 gekennzeichneten
-Stecker am MUFI aufgesteckt; das andere Ende wird mit dem Terminal in gleicher
-Weise verbunden, wie das ursprüngliche Kabel zwischen Rechner und Terminal.
-
-
- +--------------------------+
- | +----------------------+ |
- | | V24/1 V24/2 | |
- | | | | | |
- | +----|-----------|-----+ |
- +------|-----------|-------+
- | |
- | |
- ZUM <-----+ +-----> ZUM
- TERMINAL COMPUTER
-
-
-#center#Abb.3: Einbau des MUFIs in den Terminalkanal
-
-
-Beachten Sie bitte, daß die V24-Schnittstellen des MUFIs auf 8 Datenbits und 1 Stop­
-bit fest eingestellt sind - ggf. müssen Sie Ihre Terminalkonfiguration hieran anpassen.
-Kontrollieren Sie aber in jedem Falle, ob die Konfiguration mit diesen Daten überein­
-stimmt!
-
-Koppeln Sie dazu die Task 'configurator' an Ihr Terminal (mit 'continue
-("configurator") <RETURN>') und geben Sie dann das Kommando 'configurate
-<RETURN>'. Für alle vorhandenen Kanäle werden Sie nun nacheinander gefragt,
-ob Sie eine Konfiguration vornehmen wollen. Bei den "interessanten Kanälen" ant­
-worten Sie mit 'ja' (<j>).
-
-Wollen Sie sich nur die aktuelle Konfiguration ansehen, so beantworten Sie alle dann
-gestellten Fragen zum Kanal mit 'ja' (<j>), dann bleibt die aktuelle Einstellung
-erhalten. Der Konfigurationsdialog ist im EUMEL-Systemhandbuch auf den Seiten 6 -
-8 detailliert beschrieben.
-
-Die Verschaltung der V24-Kabel ist in der Bedienungsanweisung zum MUFI erläutert,
-ggf. können Sie entsprechende Kabel von der Firma BICOS beziehen.
-
-Wenn alle Kabelverbindungen gesteckt sind, sollten Sie auf alle Fälle erst einmal #on("b")#bei
-ausgeschaltetem MUFI#off("b")# prüfen, ob das Terminal sich noch bedienen läßt. Wenn das
-Terminal keine Reaktion mehr zeigt, obwohl es vorher (ohne MUFI) reibungslos
-funktioniert hat, dann haben Sie entweder ein MUFI ohne "Schnittstellen-Automatik"
-vor sich (vergl. Sie dazu Kap. 3.1), oder an den Kabelverbindungen stimmt irgend­
-etwas nicht. In diesem Falle sollten Sie noch einmal alle Anschlüsse und eventuell
-auch die interne Verschaltung der Kabel überprüfen.
-
-
-#on("b")#3.1.3  Das MUFI an separater serieller Schnittstelle#off("b")#
-
-Wenn Sie das MUFI als Endgerät an einer separaten seriellen Schnittstelle betreiben,
-dann stecken Sie das vom Computer kommende Kabel auf den mit V24/2
-bezeichneten Stecker an der Rückseite des MUFIs. Damit ein einwandfreier Betrieb
-gewährleistet ist, sollten Sie einen sog. "Kurzschlußstecker" auf die dann freie
-25polige D-Subminiatur-Buchse (V24/1) am MUFI aufstecken. Haben Sie eine solche
-nicht zur Hand, können Sie zwei kleine Brücken einsetzen: Nehmen Sie dazu zwei
-kleine Drahtstücke und verbinden Sie einmal Pin (Öffnung) 2 mit Pin 3 und außer­
-dem Pin 4 mit Pin 5.
-
-In der Task 'configurator' muß der Kanal, an dem das MUFI angeschlossen ist, auf
-'transparent, 8 Bit, 1 Stopbit, RTS/CTS-Protokoll' eingestellt werden, weiterhin je nach
-MUFI-DIP-Schalter-Stellung auf '9600' bzw. '19200 Baud' und 'no parity' bzw. 'even
-parity'.
-
-
-#on("b")#3.2  Der RS232-Adapter der Firma AKTRONIK#off("b")#
-
-Bevor Sie den Adapter an die serielle Schnittstelle anschließen, ist noch die einge­
-stellte Baudrate zu überprüfen bzw. eine Neueinstellung vorzunehmen.
-
-Öffnen Sie das Gehäuse des Adapters, indem Sie die vier Schrauben an der Unterseite
-lösen. Drehen Sie den Adapter so vor sich, daß die 25polige D-Subminiatur-Buchse
-von Ihrem Körper wegzeigt. Vorn rechts sind dann zwei parallele 8polige Pfosten­
-steckerleisten sichtbar.
-
-#center#25-pol. D-Subminiatur-Stecker
-
- +---------------+
- | |
- +---+ +---+
- | +------+ |
- | | | |
- | | | |
- | | | |
- | | | |
- | +------+ |
- | +------+ |
- | | | +-------+ |
- | +------+ | | |
- | +------+ +-------+ |
- | | | +-------+ |
- | +------+ | <-|---------Jumper-Leiste
- | +-------+ |
- +---+ +---+
- | Baudrate |
- +---------------+
-
-
-#center#Abb.4:  RS232-Adapter geöffnet
-
-
-Auf einem Paar steckt ein 'Jumper', mit dem die Baudrate eingestellt wird.
-Gegebenenfalls ist dieser Jumper umzustecken. Anschließend schrauben Sie das
-Gehäuse mit den vier entfernten Schrauben wieder zu.
-
- +---------+
- | o o | 300
- | o o | 600
- | o o | 1200
- | o o | 2400
- | o o | 4800
- | o o | 9600
- Jumper ---> | o o | 19200
- | o o | 38400
- +---------+
- Baudrate
-
-
-#center#Abb.5:  Mögliche Jumperposition beim RS232-Adapter
-
-
-Nun muß noch in der Task 'configurator' der entsprechende Kanal konfiguriert
-werden. Koppeln Sie dazu die Task 'configurator' an Ihr Terminal (mit 'continue
-("configurator") <RETURN>') und geben Sie dann das Kommando 'configurate
-<RETURN>'. Für alle vorhandenen Kanäle werden Sie nun nacheinander gefragt,
-ob Sie eine Konfiguration vornehmen wollen. Beim vorgesehenen Kanal antworten Sie
-mit 'ja' (<j>).
-
-Wollen Sie sich nur die aktuelle Konfiguration ansehen, so beantworten Sie alle dann
-gestellten Fragen zum Kanal mit 'ja' (<j>), dann bleibt die aktuelle Einstellung
-erhalten. Der Konfigurationsdialog ist im EUMEL-Systemhandbuch auf den Seiten 6 -
-8 detailliert beschrieben.
-
-Folgende Konfigurationsmerkmale müssen eingestellt werden:
-
- transparent, 8 Bit, 2 Stopbit, no Parity, #on("b")#kein#off("b")# Protokoll
-
-Die Baudrate ist entsprechend der Jumper-Stellung einzustellen.
-
-Am Adapter ist ein Kabel mit 25poligem D-Subminiatur-Stecker bereits fest montiert.
-Sollte der Stecker nicht an Ihren Rechner passen, so müßten Sie ein entsprechendes
-Adapterkabel basteln oder kaufen.
-
-
-
-#on("b")#3.3  Verbindung Adapter - Interface-System#off("b")#
-
-Nachdem Sie nun den Adapter (MUFI oder RS232-Adapter) an den Rechner ange­
-schlossen haben, müssen Sie noch die Verbindung zum Interface-System herstellen.
-Dabei ist es gleichgültig, ob Sie eine Compact-Box, einen Einzelsteckplatz oder einen
-Mehrfachsteckplatz benutzen, denn alle diese Geräte verfügen über den gleichen
-Anschlußstecker. Den RS232-Adapter können Sie direkt an das Interface-System
-anschließen, denn er verfügt bereits über einen entsprechenden Stecker.
-
-Für das MUFI benötigen Sie ein Anschlußkabel, das auf der einen Seite einen
-36poligen Centronics-Stecker und auf der anderen Seite einen 25poligen D-Sub­
-miniatur-Stecker besitzt (von der Firma BICOS zu beziehen).
-
-
-#on("b")#3.4  Bereitstellung des Interface-Systems#off("b")#
-
-Sofern Sie eine Compact-Box angeschlossen haben, brauchen Sie nur noch das mitge­
-lieferte Netzteil mit der Compact-Box und dem Netz zu verbinden und die ent­
-sprechende Spannung laut beiliegender Bedienungsanweisung der Fa. AKTRONIK
-einzustellen.
-
-Wenn Sie mit einem Einzelsteckplatz oder einem Mehrfachsteckplatz arbeiten,
-müssen Sie zunächst noch eine Interface-Karte einstecken. Für einen anschließenden
-Test des Systems (sehen Sie dazu Kapitel 5) empfiehlt es sich, eine Kombikarte oder
-eine E/A-Karte zu verwenden. Nach dem Einstecken der Interface-Karte ist der Steck­
-platz noch mit dem Netzstecker an das Stromnetz anzuschließen, um eine
-Spannungsversorgung zu gewährleisten.
-
-
-
-
-
-
-
diff --git a/doc/prozess/gs-Prozess-4 b/doc/prozess/gs-Prozess-4
deleted file mode 100644
index e106df1..0000000
--- a/doc/prozess/gs-Prozess-4
+++ /dev/null
@@ -1,173 +0,0 @@
-limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (1)#
-#headodd#
-#center#gs-Prozess#right#%
-
-#end#
-#headeven#
-%#center#gs-Prozess
-
-#end#
-#center#1
-
-#on("b")#4  Installation von gs-Prozess#off("b")#
-
-
-Bevor Sie #on("b")#gs-Prozess#off("b")# auf Ihrem Computer benutzen können, müssen Sie das
-Programm zunächst installieren. Wenn #on("b")#gs-Prozess#off("b")# auf Ihrem System schon zur
-Verfügung steht, können Sie dieses Kapitel ruhig überspringen.
-
-
-
-#on("b")#4.1  Voraussetzungen#off("b")#
-
-
-Um #on("b")#gs-Prozess#off("b")# auf Ihrem Computer betreiben zu können, muß das EUMEL-
-Betriebssystem installiert sein. #on("b")#gs-Prozess#off("b")# setzt die Multi-User-Version voraus und ist
-lauffähig ab Version 1.8.x. #on("b")#gs-Prozess#off("b")# setzt weiterhin voraus, daß auf Ihrem
-Computer bereits das Programm #on("b")#gs-DIALOG#off("b")# (Version 1.1) installiert ist.
-
-
-
-#on("b")#4.2  Lieferumfang#off("b")#
-
-
-#on("b")#gs-Prozess#off("b")# wird auf einer Diskette geliefert, die alle notwendigen Programme ent­
-hält (die Installation von #on("b")#gs-DIALOG#off("b")# wird dabei vorausgesetzt!). Um den Inhalt der
-Diskette feststellen zu können, starten Sie Ihr System und bringen es dazu, daß 'gib
-kommando:' erscheint. Dann legen Sie die Diskette ein und geben das Kommando:
-
-
-#on("b")##center#archive("gs-Prozess");list(archive);release(archive) <RETURN>#off("b")#
-#page#
-Anschließend erscheint eine Übersicht der auf dem Archiv vorhandenen Programme.
-Folgende Programme sollten sich in der Ãœbersicht befinden:
-
-
- "gs-Prozess 1 für MUFI im Terminalkanal"
- "gs-Prozess 1 für MUFI als Endgerät"
- "gs-Prozess 1 für AKTRONIK Adapter"
- "gs-Prozess 2"
- "gs-Prozess 3"
- "gs-Prozess 4"
- "gs-Prozess 5"
- "gs-MENUKARTE:Prozess"
- "gs-Prozess/gen"
-
-
-Eventuell können noch weitere Namen auf der Diskette vorhanden sein. Wenn Sie den
-Inhalt der Diskette kontrolliert haben und diese Programme auf der Diskette vor­
-handen sind, können Sie #on("b")#gs-Prozess#off("b")# installieren.
-
-Sollten Sie statt der Übersicht eine Fehlermeldung erhalten, überprüfen Sie bitte, ob
-die Diskette das richtige Format besitzt oder ob Ihr Diskettenlaufwerk Probleme
-macht. Sollten dagegen Programme fehlen, so reklamieren Sie die Diskette.
-
-
-#on("b")#4.3  Installation#off("b")#
-
-#on("b")#gs-Prozess#off("b")# muß in einer Task installiert werden, in der bereits das Programm
-#on("b")#gs-DIALOG#off("b")# zur Verfügung steht. Alle Söhne und Enkel der neuen Task können
-anschließend mit #on("b")#gs-Prozess#off("b")# arbeiten. Richten Sie also eine Task als Sohn der Task
-ein, in der auf Ihrem Computer bereits #on("b")#gs-DIALOG#off("b")# installiert ist. Wir nehmen hier
-an, daß #on("b")#gs-DIALOG#off("b")# in der Task 'MENU' installiert ist und die neue Task den Namen
-'PDV' erhalten soll. (Sie können für die Task auch einen beliebigen anderen Namen
-wählen):
-
-#on("b")#
- <SV> (Supervisor - Taste)
-
- --> gib supervisor kommando:
-
- begin ("PDV","MENU") <RETURN>
-
- --> gib kommando:
-
-
-#off("b")#
-(Arbeiten mehrere Personen mit dem Computer, dann ist es sinnvoll, diese Task vor
-unbefugtem Zugriff durch ein Passwort zu schützen. Wie das gemacht wird, können
-Sie in Ihrem EUMEL-Benutzerhandbuch erfahren.)
-
-
-Legen Sie dann die Archivdiskette ein, auf der sich #on("b")#gs-Prozess#off("b")# befindet, und geben
-Sie das folgende Kommando:
-
-
-#on("b")#
- archive("gs-Prozess") <RETURN>
-
- fetch("gs-Prozess/gen",archive) <RETURN>
-
- run <RETURN>
-
-#off("b")#
-
-Sie haben damit das Generatorprogramm gestartet. Bevor die Generierung allerdings
-ausgeführt werden kann, müssen Sie dem System noch Angaben über den ver­
-wendeten Adapter machen. Die zur Verfügung stehenden Anpassungen werden Ihnen
-zur Auswahl angeboten:
- +--------------------------------------------------------+
- | Auswahl der Interface-Anpassung |
- | Bitte gewünschte Anpassung ankreuzen! |
- |--------------------------------------------------------|
- | Auswahl  e i n e r  Datei durch Ankreuzen |
- |--------------------------------------------------------|
- |==> > gs-Prozess 1 für MUFI im Terminalkanal |
- | > gs-Prozess 1 für MUFI als Endgerät |
- | > gs-Prozess 1 für AKTRONIC-Adapter |
- | |
- +--------------------------------------------------------|
- | Info: <?> Fertig: <ESC><q> Abbrechen: <ESC><h> |
- +--------------------------------------------------------+
-#center#Abb.6:  Auswahl der Interface-Anpassung
-
-
-Bringen Sie den Pfeil mit den Pfeiltasten vor die gewünschte Anpassung und drücken
-Sie die <RETURN>-Taste.
-
-Haben Sie als Anpassung "gs-Prozess für AKTRONIK Adapter" oder "gs-Prozess für
-MUFI als Endgerät" gewählt, so erscheint als nächstes die Aufforderung:
-
-#center##on("b")#'Gib Interface-Kanal:'#off("b")#
-
-Geben Sie hier die Kanalnummer der seriellen Schnittstelle ein, an der der Adapter
-betrieben werden soll.
-
-Die Installation wird automatisch durchgeführt. Lassen Sie während des gesamten
-Vorgangs die Archivdiskette eingelegt. Die Generierung ist beendet, wenn der
-EUMEL-Eingangsbildschirm erscheint. Die Task, in der die Generierung stattfin­
-det, wird automatisch zur Managertask, das heißt, daß Söhne von ihr eingerichtet
-werden können.
-
-
-#on("b")#4.4  Anmerkungen zur Erstinstallation#off("b")#
-
-Mit der Installation der Software ist das Gesamtsystem allerdings noch nicht betriebs­
-bereit. Dazu fehlen #on("b")#gs-Prozess#off("b")# noch einige Informationen. Bisher ist #on("b")#gs-Prozess#off("b")#
-nämlich nur bekannt, welchen Adapter Sie verwenden und ob Sie ihn im Terminal­
-kanal oder an einer separaten Schnittstelle betreiben wollen.
-
-Um das angeschlossene Interface-System sachgerecht ansteuern zu können, benötigt
-#on("b")#gs-Prozess#off("b")# aber noch Informationen über die Hardware-Konstellation. Diese Mit­
-teilungen, die noch gemacht werden müssen, nennen wir "Konfiguration von
-#on("b")#gs-Prozess#off("b")#". Wie diese Konfiguration vorgenommen wird und wie Sie anschließend
-Ihr Interface-System testen, ist im Kapitel 5 detailliert beschrieben.
-
-#on("b")#gs-Prozess#off("b")# bietet Ihnen eine Reihe von Möglichkeiten, die vorhandene Hardware
-möglichst effektiv zu nutzen. So ist es möglich, wenn Sie Ihre(n) Adapter an
-separater/separaten Schnittstelle(n) betreiben, von verschiedenen Tasks aus auf
-einen Adapter zuzugreifen. Gerade in der Anschaffungsphase, wenn noch nicht
-genügend Hardware zur Verfügung steht, ist das eine sinnvolle/preiswerte Möglich­
-keit, von verschiedenen Arbeitsplätzen aus Prozeßdatenverarbeitung zu betreiben.
-
-Zu diesem Zeitpunkt würde es aber zu weit führen, hierzu Details zu erläutern.
-Beschreibungen dieser Möglichkeiten finden Sie im Kapitel "Hinweise für den
-Systembetreuer/ Programmierer".
-
-#on("b")#
-Sie sollten sich zunächst darauf beschränken, ein Interface-System "zum
-Laufen zu bringen". Verfahren Sie dazu bitte genau, wie im Kapitel 5
-beschrieben.#off("b")#
-
diff --git a/doc/prozess/gs-prozess-1 b/doc/prozess/gs-prozess-1
deleted file mode 100644
index f6a3696..0000000
--- a/doc/prozess/gs-prozess-1
+++ /dev/null
@@ -1,99 +0,0 @@
-limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (1)#
-#headodd#
-#center#gs-Prozess#right#%
-
-#end#
-#headeven#
-%#center#gs-Prozess
-
-#end#
-#center#1
-
-#on("b")#1  Was kann gs-Prozess#off("b")#
-
-#on("b")#gs-Prozess#off("b")# ist ein Programmsystem unter dem Betriebssystem EUMEL, mit dem ein
-Anwendungsbereich erschlossen werden kann, der bisher in der Schule zumeist sehr
-stiefmütterlich behandelt wurde: die Prozeßdatenverarbeitung - das Messen, Steuern
-und Regeln mit dem Computer.
-
-Es wird dadurch möglich, externe Modelle/Geräte (z.B. eine Ampelanlage) zu steuern
-oder von externen Meßfühlern (z.B. einem Temperaturfühler) oder Eingabeeinheiten
-(z.B. einem Lochkartenleser) Daten aufzunehmen. Durch die Kombination der
-beiden Vorgänge können sogar komplexe geregelte Systeme in Modellen nachgebildet
-werden.
-
-Eigentlich ist eine solch stiefmütterliche Behandlung dieses Anwendungsbereiches
-von Computern in der Schule gar nicht einzusehen, denn in der Forschung, im
-Dienstleistungsbereich, im privaten Bereich und vor allem in der Produktion gibt es
-eine Vielzahl von Anwendungen, z.B.:
-
- Meßdatenerfassung und -auswertung bei Experimenten, Wetterbeobachtung,
- seismologische Untersuchungen, ..., Ampelsteuerungen, Verkehrsleitsysteme, ...,
- Scannerkassen, Scheckkartenleser, Geldautomaten, ..., Waschmaschinen,
- Heizungsanlagen, Modelleisenbahnen, ..., CNC-Maschinen, Universalhand­
- habungsautomaten (Roboter),...
-
-In den meisten Fällen werden Computer eingesetzt, die speziell für diesen
-Anwendungsbereich entwickelt wurden. Insbesondere an die Verarbeitungsge­
-schwindigkeit solcher Systeme werden sehr hohe Anforderungen gestellt. Solche
-Systeme sind für die schulische Verwendung viel zu teuer. Zumeist sind auch die in
-der Realität ablaufenden Vorgänge so komplex, daß sie als Ganzes gar nicht im
-Unterricht nachgebildet werden können.
-
-Das aber kann auch nicht Ziel einer Auseinandersetzung mit diesem Anwendungs­
-bereich in der Schule sein. Hier gilt es, unter didaktisch-methodischen Gesichts­
-punkten, Grundprinzipen der Prozeßdatenverarbeitung zu vermitteln und beispiel­
-hafte Anwendungen an Modellen zu erarbeiten und zu erproben. In einem zeitge­
-mäßen Informatikunterricht darf dieser wichtige Anwendungsbereich von Computern
-nicht ausgespart bleiben.
-
-Bisher scheiterte das Messen, Steuern und Regeln mit dem Computer in der Schule
-meistens daran, daß es keine standardisierten Software- und Hardware-Systeme und
-auch keine geeigneten Modelle gab. Das aber hat sich inzwischen geändert.
-Verschiedene Hersteller bieten Interface-Systeme und Modelle an, die gut verwendet
-werden können.
-
-Auch #on("b")#gs-Prozess#off("b")# greift auf ein solches Interface-System zu, das aus mehreren
-Einzelkomponenten besteht (mehr dazu in den folgenden Kapiteln). Das sind Geräte,
-über die der Computer "Kontakt" mit den 'Endgeräten' (z.B. Modellen) aufnimmt:
-Hier werden Ausgaben des Computers in "elektrische Impulse" umgesetzt, mit denen
-Modelle angesprochen werden können (z.B. Lämpchen ein- und ausgeschaltet,
-Motoren zu Drehungen nach links oder rechts veranlaßt werden können). Ein­
-gehende "Impulse" werden in "computerangemessene Form" umgewandelt und an
-den Computer weitergegeben.
-
-Der Aufwand, der betrieben werden muß, um ein Interfacesystem sachgerecht anzu­
-steuern, ist erheblich. Es kostet einige Mühe und vor allem viel Zeit, um alle Details
-des Interfacesystems und seiner Programmierung kennenzulernen, und es gehört
-eine gehörige Portion Erfahrung und vor allem viel Geduld dazu, um Fehlfunktionen
-zu analysieren und letztlich zu beheben. Das alles ist einem Anwender, dem es z.B.
-darum geht, ein bestimmtes Modell anzusteuern, nicht zumutbar.
-
-Hier schafft nun #on("b")#gs-Prozess#off("b")# Abhilfe! #on("b")#gs-Prozess#off("b")# ist eingebettet in die komfortable
-Benutzerschnittstelle #on("b")#gs-DIALOG#off("b")#, so daß der Einarbeitungsaufwand in das
-Programmsystem gering und eine einfache Bedienung des Systems gewährleistet ist.
-
-Ähnlich wie bei #on("b")#gs-Herbert und Robbi#off("b")# wird eine komplette Programmier­
-umgebung zur Verfügung gestellt, die alle Funtionen enthält (Informationen,
-Konfiguration des Systems, Erstellung und Ausführung von Programmen, Archiv­
-handling), die bei der Arbeit von Bedeutung sein können - natürlich jetzt auf das
-Messen, Steuern und Regeln bezogen. Durch diese Programmierumgebung wird
-selbst dem Computerneuling ermöglicht, einen einfachen, eingängigen Zugang zu
-diesem Anwendungsbereich zu finden.
-
-#on("b")#gs-Prozess#off("b")# stellt einen Basisbefehlssatz (Eingabe-, Ausgabebefehle und Tests) zur
-Verfügung, mit dessen Hilfe Lösungsalgorithmen aus diesem Anwendungsbereich
-angemessen formuliert werden können. Dabei kann sich der Anwender ganz auf sein
-Problem konzentrieren, da er sich um die spezifische Ansteuerung des Interfaces
-nicht zu kümmern braucht - das erledigt #on("b")#gs-Prozess#off("b")#.
-
-Der Basisbefehlssatz besteht aus nur wenigen Befehlen, um das Erlernen und den
-Umgang damit möglichst einfach zu gestalten. Andererseits ist der Befehlssatz so
-umfangreich und universell, daß alle schulisch relevanten Problemstellungen aus
-diesem Anwendungsbereich angemessen bearbeitet werden können.
-
-
-
-
diff --git a/doc/prozess/gs-prozess-5 b/doc/prozess/gs-prozess-5
deleted file mode 100644
index 5c44f29..0000000
--- a/doc/prozess/gs-prozess-5
+++ /dev/null
@@ -1,819 +0,0 @@
-limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (1)#
-#headodd#
-#center#gs-Prozess#right#%
-
-#end#
-#headeven#
-%#center#gs-Prozess
-
-#end#
-#center#1
-
-#on("b")#5  Konfiguration von gs-Prozess#off("b")#
-#on("b")#    Test des Interface-Systems#off("b")#
-
-In diesem Kapitel erfahren Sie, wie Sie #on("b")#gs-Prozess#off("b")# entsprechend der angeschlossenen
-Hardware konfigurieren müssen. Anschließend zeigen wir Ihnen, wie Sie Ihr Inter­
-face-System testen können.
-
-Wir gehen hier davon aus, daß die Hardware-Voraussetzungen erfüllt, das Interface-
-System über einen Adapter (MUFI / RS232-Adapter) angeschlossen und #on("b")#gs-Prozess#off("b")#
-auf dem Rechner installiert sind.
-
-
-#on("b")#5.1  Kontrolle der Konfigurationen/Anschlüsse#off("b")#
-
-Bevor Sie mit der Arbeit beginnen, überzeugen Sie sich unbedingt (noch einmal)
-davon, daß die Konfigurationen und die Steckverbindungen den Vorgaben ent­
-sprechen:
-
-- #on("b")#MUFI im Terminalkanal:#off("b")#
-
- Sind die beiden Kabel zum Rechner und zum Terminal an der Rückseite des
- MUFIs korrekt aufgesteckt (sehen Sie Abb.3)? Haben Sie die notwendigen
- Konfigurationen vorgenommen (Task 'configurator', MUFI-DIP-Schalter, Ter­
- minal)? Ist das Netzkabel des MUFIs mit dem Stromnetz verbunden? Ist das
- Verbindungskabel zwischen MUFI und Interface-System an der Vorderseite des
- MUFIs und am Interface-System (Compact-Box, Einzel- oder Mehrfachsteck­
- platz) aufgesteckt?
-#page#
-- #on("b")#MUFI als Endgerät:#off("b")#
-
- Ist das vom Computer kommende Kabel auf den mit V24/2 gekennzeichneten
- Stecker aufgesteckt? Haben Sie auf den freien Stecker (V24/1) einen "Kurz­
- schlußstecker" aufgesteckt? Haben Sie ein Kabel verwendet, über welches das
- RTS/CTS-Protokoll abgewickelt werden kann? Haben Sie den Kanal, an dem das
- MUFI betrieben wird, den Anweisungen in Kapitel 3.1.3 entsprechend kon­
- figuriert? Sind die DIP-Schalter im MUFI entsprechend eingestellt? Ist das
- Netzkabel des MUFIs mit dem Stromnetz verbunden? Ist das Verbindungskabel
- zwischen MUFI und Interface-System an der Vorderseite des MUFIs und am
- Interface-System (Compact-Box, Einzel- oder Mehrfachsteckplatz) aufgesteckt?
-
-
-- #on("b")#RS232-Adapter:#off("b")#
-
- Ist das Schnittstellen-Kabel korrekt am Computer angeschlossen? Haben Sie den
- Kanal, an dem der RS232-Adapter betrieben wird, den Anweisungen in Kapitel
- 3.2 entsprechend konfiguriert? Ist der Jumper im RS232-Adapter korrekt aufge­
- steckt? Ist der RS232-Adapter an das Interface-System (Compact-Box, Einzel-
- oder Mehrfachsteckplatz) angesteckt? Ist der 3polige Platinenstecker des
- Adapters in die 12V-Spannungsversorgungs-Buchse des Interface-Systems
- eingesteckt?
-
-
-- #on("b")#Compact-Box#off("b")#
-
- Ist die Compact-Box an das zugehörige Netzgerät angeschlossen? Ist der Stecker
- wirklich richtig herum eingesteckt? Ist das Netzteil mit dem Stromnetz ver­
- bunden?
-
-- #on("b")#Einzelsteckplatz#off("b")#
-
- Ist eine Kombi-Karte oder eine E/A-Karte eingesteckt? Ist das Netzkabel des
- Steckplatz-Netzgerätes mit dem Stromnetz verbunden?
-#page#
-- #on("b")#Mehrfachsteckplatz#off("b")#
-
- Ist ein passendes Netzteil an den Mehrfachsteckplatz angeschlossen? Ist das
- zugehörige Netzkabel mit dem Stromnetz verbunden? Ist eine Kombi- oder
- E/A-Karte in einen Steckplatz eingesteckt?
-
-
-#on("b")#5.2  Vorbereitungen für den Ein-/Ausgabetest#off("b")#
-
-Für den Ausgabetest sollte eine 8elementige Leuchtdiodenanzeige zur Verfügung
-stehen, um am Interface-System die Ausgaben kontrollieren zu können. Sofern Sie
-mit der Compact-Box arbeiten oder eine E/A-Karte verwenden, brauchen Sie sich
-darum nicht weiter zu kümmern, denn in diese Systeme ist eine Leuchtdioden­
-anzeige integriert. Wenn Sie dagegen mit einer Kombikarte arbeiten, muß eine
-gesonderte Anzeige (kann leicht selbst gebaut werden oder ist fertig zu kaufen bei der
-Fa. AKTRONIK) angeschlossen werden.
-
-Für den Eingabetest reicht ein kleines Drahtstück, an dem zwei kleine Lötschuhe
-angelötet sind - schön wäre es, wenn ein Codekarten-Leser zur Verfügung stünde.
-
-
-#on("b")#5.2.1  Anschluß einer Leuchtdiodenanzeige an die Kombikarte#off("b")#
-
-Stecken Sie den 8poligen Platinenstecker, der an der Leuchtdiodenanzeige befestigt
-ist, auf die mit "AUSG." gekennzeichnte Buchse der Kombikarte. Den Lötschuh des
-einzelnen Drahtes an der Leuchtdiodenanzeige stecken Sie auf den Masse-Lötstift
-direkt neben der "Ausgangs-Buchse" der Kombikarte (sehen Sie Abb. 7). Da die
-Leuchtdiodenanzeige mit Spannung versorgt werden muß, müssen jetzt noch zwei
-Kabel - wie in der Abb. 7 dargestellt (Kabel 1 und Kabel 2) - aufgesteckt werden.
-#page#
-
-
-
- +---------------------------------------------------------------+
- | 4-7 o----------+ |
- | +-+-----------+-+ | |
- | | | O | | GMD o | |
- | | | | | | Kabel 1 |
- | | | | | | |
- | v | | O | | | |
- | | | | | | |
- | E| | | | | |
- | | | O | | | |
- | +-+-------------+ ___________| |
- | o -----------| |
- | Ausg. | |
- | +---------------+ O 0 | |
- | | +-----------+ | 1 O | |
- ---+---|-|---| | | O 2 | |
- ---+---|-|---| | | 3 O | |
- ---+---|-|---| | | O 4 | |
- ---|---|-|---| | | 5 O | |
- ---|---|-|---| | | O 6 | |
- ---|---|-|---| | | 7 O | |
- | | +-----------+ | | |
- | +---------------+ | |
-<-----------------o | Kabel 2 |
- Zur Leuchtdiodenanzeige | |
- | +---------------+ | |
- | | O | O 0 | |
- | | O | 1 O | |
- | | O | O 2 | |
- | | O | 3 O | |
- | | O | O 4 | |
- | | O | 5 O | |
- | | O | O 6 | |
- | | O | 7 O | |
- | +---------------+ | |
- | GMD o o +5V | |
- | | | |
- | +----------------------------+ |
- | |
- | +---------------+ |
- | | O | + O |
- | | O | O E2 |
- | | O | GMD O |
- | +---------------+ |
- | |
- | +---------------+ |
- | | O | + O |
- | | O | O E2 |
- | | O | GMD O |
- | +---------------+ |
- | o o o o o o o o o o |
- | | | | | | | | | | | |
- | +-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+ |
- | | | |
- +----------+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+----------+
- | | | | | | | | | | | | | | | | | | | | |
- | | | | | | | | | | | | | | | | | | | | |
-
-#center#Abb.7:  Anschluß Leuchtdiodenanzeige - Kombikarte
-
-#on("b")#ACHTUNG!#off("b")# Bei dieser Spannungversorgung auf der Kombikarte (+5V) darf #on("b")#auf
-keinen Fall#off("b")# eine größere Last (z.B. Motor oder auch nur eine Glühbirne) ange­
-schlossen werden, da dadurch die Interfacekarte bzw. das Netzteil im Einzelsteck­
-platz beschädigt werden könnte.
-#page#
-Möchten Sie eine größere Last anschließen, so benötigen Sie ein stabilisiertes Netzteil
-mit "ordentlich geglättetem" Gleichstrom. Die Masse (Minuspol) des Netztteils be­
-festigen Sie an dem Lötschuh (oder der davorliegenden Klemme), der zwischen den
-beiden Lötstiften liegt, an denen in der Abb.7 das Kabel 1 befestigt ist. Den Pluspol
-des Netzteiles verbinden Sie mit mit einem der Lötstifte (bzw. an der davorliegenden
-Klemme), auf dem jetzt das Kabel 1 befestigt ist. Damit alle 8 Ausgänge mit Span­
-nung versorgt werden, müssen Sie auch hier ebenfalls eine Brücke zum zweiten
-Lötschuh (oder der Klemme davor), an dem in der Zeichnung Kabel 1 befestigt ist,
-anbringen.
-
-Da die Compact-Box ohnehin durch das Netzteil versorgt wird, kann es hier nicht zu
-Komplikationen kommen. Wollen Sie eine größere Last an die E/A-Karte anschließen,
-so benötigen Sie z.B. eine Relais-Box.
-
-
-
-#on("b")#5.2.2  Anschluß des Codekartenlesers (Drahtstück)#off("b")#
-
-Stecken Sie den 8poligen Platinenstecker, der am Codekartenleser befestigt ist, auf
-die Eingangsbuchse an Ihrem Interface-System. Dann muß noch der 3polige
-Platinenstecker, der ebenfalls am Codekartenleser befestigt ist, an die 12V-Span­
-nungsversorgungs-Buchse an Ihrem Interface-System aufgesteckt werden.
-
-haben Sie keinen Codekartenleser zur Hand, so reicht für den Eingabetest auch ein
-kleines Kabelstück aus, an dessen Enden jeweils ein Lötschuh angelötet sein sollte.
-Stecken Sie den einen Lötschuh auf einen +5V-Lötstift Ihres Interface-Systems. Das
-andere Ende des Kabels wird zunächst noch nicht befestigt.
-
-Auf der Kombikarte sind die +5V-Lötstifte beschriftet und damit leicht zu finden. Wo
-Sie einen +5V-Lötstift auf der E/A-Karte finden, können Sie der folgenden Abbildung
-entnehmen:
-#page#
- Leuchtdiodenanzeige
- |
- +---------------------------------------+------------+
- | +---------------+ | |
- | | O | O 0 V |
-Digital- | | O | 1 O o o o o o o o o |
-Ausgang | | O | O 2 |
- | | O | 3 O |
- | | O | O 4 |
- | | O | 5 O |
- | | O | O 6 |
- | | O | 7 O |
- | +---------------+ |
- | +---------------+ |
- | | O | O 0 |
-Digital- | | O | 1 O |
-Eingang | | O | O 2 |
- | | O | 3 O |
- | | O | O 4 |
- | | O | 5 O |
- | | O | O 6 |
- | | O | 7 O |
- | +---------------+ |
- | +---------------+ |
- | | O | O 0 |
-Versorgungs- | | O | 1 O |
-und | | O | O 2 |
-Steuer- | | O | 3 O |
-leitung | | O | O 4 |
- | | O | 5 O |
- | | O---5V------O 6 |
- | | O | 7 O |
- | +-------|-------+ | |
- | | | |
- | +---------------+ |
- | | |
- | GMD |
- | |
- | o o o o o o o o o o |
- | | | | | | | | | | | |
- | +-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+-o-+ |
- | | | |
- +----+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+---+
- | | | | | | | | | | | | | | | | | | | | |
- | | | | | | | | | | | | | | | | | | | | |
-
-
-#center#Abb.8:  Pinbelegung auf der E/A-Karte
-
-
-#on("b")#5.3  Konfiguration von gs-Prozess#off("b")#
-
-Normalerweise kann in jeder Task, in der #on("b")#gs-Prozess#off("b")# zur Verfügung steht, die
-Konfiguration vorgenommen werden (beachten Sie aber bitte die Bemerkungen im
-Kapitel "Hinweise für den Systembetreuer/Programmierer").
-
-Richten Sie eine Sohntask der Task ein, in der #on("b")#gs-Prozess#off("b")# installiert ist - in unserem
-Fall soll das die Task 'PDV' sein. Die Sohntask soll den Namen 'pdvtest' erhalten:
-#page#
-#on("b")#
- <SV> (Supervisor - Taste)
-#off("b")#
- --> gib supervisor kommando:
-#on("b")#
- begin ("pdvtest","PDV") <RETURN>
-#off("b")#
- --> gib kommando:
-#on("b")#
- pdv <RETURN>
-#off("b")#
-
-Daraufhin erscheint der in Abb.9 dargestellte Menubildschirm. Ãœber die Menupunkte
-im dann sichtbaren Pull-Down-Menu können Sie diverse Informationen zu
-#on("b")#gs-Prozess#off("b")# abrufen, auf die wir hier allerdings nicht weiter eingehen wollen. Statt­
-dessen drücken Sie bitte die 'Pfeiltaste rechts'. Sie gelangen so zum Menu unter dem
-Oberbegriff "Interface" (Abb. 10).
-
-
-+---------------------------------------------------------------------+
-| PDV:  Info Interface Programm Archiv |
-|-------+------------------------+------------------------------------+
-| | u  Übersicht Befehle | |
-| | --------------------- | |
-| | a  Ausgabebefehle | |
-| | e  Eingabebefehle | |
-| | t  Testbefehle | |
-| | w  Weitere Befehle | |
-| | --------------------- | |
-| | b  Bitmuster | |
-| | s  Symbole/Zeichen | |
-| | d  Digital-/Analogwerte| |
-| +------------------------+ |
-| |
-| +----------------------------------------+ |
-| | gs-Prozess | |
-| | Version 1.0 | |
-| | | |
-| | Copyright Ρ 1988 bei Eva Latta-Weber, | |
-| | Bielefeld | |
-| +----------------------------------------+ |
-+---------------------------------------------------------------------+
-|Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>|
-+---------------------------------------------------------------------+
-
-
- Abb.9:  Eingangsbildschirm #on("b")#gs-Prozess#off("b")#
-#page#
-
-+-----------------------------------------------------------------------+
-| PDV:  Info Interface Programm Archiv |
-+-------+-------------------+-------------------------------------------+
-| | i  Informationen | |
-| | ---------------- | |
-| | k  Konfigurieren | |
-| | ---------------- | |
-| | a  Ausgabetest | |
-| | e  Eingabetest | |
-| +-------------------+ |
-| |
-| |
-| |
-+---------------------------------------------------------------------- +
-| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> |
-+-----------------------------------------------------------------------+
-
- #center#Abb.10:  Menubildschirm zum Oberbegriff 'Interface'
-
-
-Ãœber den ersten Menupunkt ("Informationen") kann die aktuelle Konfiguration des
-Interfaces erfragt werden. Wenn Sie diesen Menupunkt aktivieren und es ist weder in
-dieser Task noch in einer übergeordneten Task eine Konfiguration vorgenommen
-worden, erhalten Sie die folgende Warnung:
-
- +----------------------------------------+
- | Interface ist noch nicht konfiguriert! |
- +----------------------------------------+
-#center#Abb.11:  Information bei unkonfiguriertem System
-
-
-Ist schon eine Konfiguration, z.B. in der Vatertask vorgenommen worden, so wird
-Ihnen die aktuellen Einstellung angezeigt (s.u.).
-#page#
-#on("b")#5.3.1  Auswahl der Steckplatzart/Interfacekarte#off("b")#
-
-Da Sie in jedem Falle eine Konfiguration von #on("b")#gs-Prozess#off("b")# vornehmen sollen,
-aktivieren Sie jetzt bitte den Menupunkt "Konfigurieren". Daraufhin erscheint die
-folgende Auswahl:
- +-----------------------------+
- | Auswahl der Steckplatzart |
- | |
- | c Compactbox |
- | e Einzelsteckplatz |
- | m Mehrfachsteckplatz |
- | |
- | Compact   Einzel   Mehrfach |
- +-----------------------------+
-
-#center#Abb.12:  Auswahl der Steckplatzart
-
-
-Haben Sie eine Compact-Box angeschlossen, so ist die Konfiguration schnell erledigt:
-Sie tippen die Taste <c>. Daraufhin wird die komplette Konfiguration ausgeführt
-und die Einstellung eingeblendet.
- +------------------------------------+
- | Eingestellt: Compactbox |
- | |
- | Belegung der Kanäle: |
- | |
- | Kanal 1:   Analogeingang 1 (E1) |
- | |
- | Kanal 2:   Analogeingang 2 (E2) |
- | |
- | Kanal 3:   Digitaleingang |
- | |
- | Kanal 4:   Digitalausgang |
- +------------------------------------+
-
-#center#Abb.13:  Compact-Box: Belegung der Kanäle
-#page#
-Die Anzeige verschwindet, wenn Sie eine beliebige Taste tippen.
-
-Anders dagegen, wenn Sie zuvor dem System mitgeteilt haben, daß ein Einzelsteck­
-platz bzw. ein Mehrfachsteckplatz angeschlossen ist. In diesem Fall müssen Sie
-#on("b")#gs-Prozess#off("b")# noch mitteilen, welche Steckkarten Sie verwenden. Dazu wird Ihnen die
-folgende Auswahl angeboten:
-
- +----------------------------------+
- | Angabe der Interfacekarte: |
- | |
- | k  Kombikarte |
- | e  E/A - Karte |
- | d  D/A - Wandler - Karte |
- | a  A/D - Wandler - Karte |
- | 0  Keine Steckkarte |
- | |
- | Kombi  E/A  D/A  A/D  Keine |
- +----------------------------------+
-
-
-#center#Abb.14:  Auswahl einer Interfacekarte
-
-
-Wenn Sie eine Kombikarte, eine E/A-Karte oder eine D/A-Wandler-Karte verwenden,
-ist durch die jeweilige Angabe der Einstellvorgang abgeschlossen. #on("b")#gs-Prozess#off("b")# teilt
-Ihnen daraufhin - ähnlich wie bei der Compact-Box - jeweils die Belegung der Kanäle
-mit. Bei Nutzung der D/A-Wandler-Karte wird zusätzlich der gültige Spannungs­
-bereich angezeigt.
-#page#
-
- +------------------------------------------------------+
- | Einzelsteckplatz mit D/A - Karte: |
- | |
- | Belegung der Kanäle: |
- | |
- | Die Karte stellt einen Analogausgang zur Verfügung, |
- | der auf zwei Arten angesprochen werden kann:        |
- | |
- | Kanal 1:    Spannungsbereich  -5 V  -  +5 V |
- | |
- | Kanal 2:    Spannungsbereich   0 V  -  +5 V |
- | |
- +------------------------------------------------------+
-
-#center#Abb.15:  Kanalbelegung D/A-Karte (Einzelsteckplatz)
-
-
-Haben Sie dagegen eine A/D-Wandler-Karte angegeben, so erfragt #on("b")#gs-Prozess#off("b")# noch
-die Schalterstellung der DIP-Schalter auf der A/D-Wandler-Karte. Über diese Schalter­
-stellung kann der Spannungsbereich der Analogeingänge festgelegt werden. Das
-erfolgt nach folgendem Prinzip:
-
-Das Spannungsintervall wird jeweils über 3 Schalter festgelegt. Für den Eingang 1
-stehen die Schalter 1, 2 und 3 zur Verfügung, für denn Eingang 2 die Schalter 4, 5
-und 6. Im folgenden werden wir die Einstellung für den Eingang 1 aufzeigen - für den
-Eingang 2 ist mit den drei genannten Schaltern synonym zu verfahren.
-
-Steht Schalter 1 in der Position 'ON', so ist ein Spannungsintervall von 0V - 25V einge­
-stellt (Fall 1) - unabhängig von der Stellung der anderen beiden Schalter. Innerhalb
-eines Schaltertripletts "dominiert" nämlich ein Schalter mit kleinerer Nummer über
-den/die mit größerer Nummer. Ist Schalter 1 in Stellung 'OFF' und Schalter 2 in
-Stellung 'ON', so ist ein Spannungsbereich von 0V - 2,5V eingestellt (Fall 2). Sind die
-beiden ersten Schalter in der Position 'OFF' und nur der Schalter 3 in der Position
-'ON', so ist ein Spannungsintervall von 0V - 0,25V eingestellt (Fall 3).
-#page#
-Eine besondere Bedeutung kommt noch den Schaltern 7 und 8 zu, denn sie beein­
-flussen noch die eben genannten Intervalle. Dabei ist überraschenderweise der
-Schalter 7 für den Eingang 2 und der Schalter 8 für den Eingang 1 zuständig. Die drei
-oben genannten Fälle gelten nämlich nur, wenn Schalter 8 in der Position 'OFF' steht.
-In der Position 'ON' werden die durch das Schaltertriplett eingestellten Spannungs­
-intervalle dagegen symmmetrisch um 0V angelegt: im Fall 1 also der Bereich von
--12,5V - +12,5V, im Fall 2 von -1,25V - +1,25V und im Fall 3 von -0,125V -
-+0,125V.
- +----------------------------------------------------+
- | Angabe der Schalterstellungen auf der A/D - Karte: |
- | |
- | Bitte die aktuelle Schalterstellung eintragen: |
- | |
- | Es bedeutet: 1 - Schalterstellung "on" |
- | 0 - Schalterstellung "off" |
- | |
- | Nummer: 12345678 |
- | |
- | Eingabe: 10010010 |
- +----------------------------------------------------+
-#center#Abb.16:  A/D-Karte: Angabe der Schalterstellung
-
-
-Der Spannungsbereich wird von #on("b")#gs-Prozess#off("b")# aus der Schalterstellung automatisch
-ermittelt und neben den festgelegten Kanalnummer angezeigt. Die obige Schalter­
-stellung führt somit zu folgender Meldung:
-
- +----------------------------------------------------------------+
- | Einzelsteckplatz mit A/D - Karte: |
- | |
- | Zwei analoge Einträge stehen zur Vefügung: |
- | |
- | Kanal 1: (E1) Spannungsbereich 0.000 V  -  +25.000 V |
- | |
- | Kanal 2: (E2) Spannungsbereich -12.500 V  -  +12.500 V |
- | |
- +----------------------------------------------------------------+
-#center#Abb.17:  A/D-Karte: Kanalbel./Spannungsber.(Bspl.)
-#page#
-Während Sie bei Verwendung eines Einzelsteckplatzes nur einmal nach all diesen
-Angaben gefragt werden, erfolgt die Abfrage bei einem Mehrfachsteckplatz viermal
-hintereinander. Haben Sie einen Steckplatz nicht belegt, so tippen Sie bei der Angabe
-der Interfacekarte die Taste <0> (keine Steckkarte).
-
-
-#on("b")#5.3.2  Bedeutung der Kanalnummern#off("b")#
-
-Nachdem Sie #on("b")#gs-Prozess#off("b")# die Angaben zur Konfiguration (Steckplatzart/Interface­
-kartenart) mitgeteilt haben, teilt Ihnen das System jeweils die Kanalnummern mit.
-Diese Nummern sollten Sie sich merken, denn wenn Sie mit dem von #on("b")#gs-Prozess#off("b")# zur
-Verfügung gestellten Befehlen programmieren wollen, müssen Sie jeweils diese
-Kanalnummern angeben. Fordern Sie von einem Kanal eine Aktion, die nicht ausge­
-führt werden kann/nicht sinnvoll ist, so kann Ihnen dadurch eine Fehlermeldung
-zugestellt werden.
-
-Auf der Compact-Box bzw. der Kombikarte an einem Einzelsteckplatz ist die
-Numerierung identisch: die beiden Analogeingänge haben die Kanalnummern 1 und
-2, der Digitaleingang hat die Nummer 3 und der Digitalausgang die Nummer 4.
-
-Die E/A-Karte verfügt nur über je einen digitalen Eingang und digitalen Ausgang, die
-über die Kanäle 1 und 2 angesprochen werden können. Damit nun aber auch
-Programme, die für die Compact-Box bzw. eine Kombikarte geschrieben sind, auch
-auf der E/A-Karte laufen, können diese beiden Kanäle auch unter der Kanalnummer
-3 (Eingang) bzw. 4 (Ausgang) angesprochen werden. Natürlich ist ein solches
-Programm nur dann auf der E/A-Karte lauffähig, wenn keine Analogeingänge ange­
-sprochen werden, denn die sind ja auf der E/A-Karte gar nicht vorhanden!
-
-Die Kanalnummern auf einem Mehrfachsteckplatz werden nach folgendem System
-vergeben: Die Kanalnummern sind immer zweistellig. Ãœber die erste Ziffer wird der
-Steckplatz (1 - 4) identifiziert, über die zweite Ziffer der eigentliche Kanal auf der
-Steckkarte. Steckt also z.B. in Steckplatz 3 eine Kombikarte (4 mögliche Kanäle) und
-möchten Sie hier den Digitalausgang (Kanal 4) ansprechen, so muß als Kanal die
-Nummer 34 angegeben werden.
-#page#
-Aber auch hier gibt es eine zusätzliche Vereinbarung: Der erste Steckplatz eines
-Mehrfachsteckplatzes kann (zusätzlich) wie ein Einzelsteckplatz angesprochen
-werden. Bei Belegung des ersten Steckplatzes mit einer Kombikarte, können Sie die
-Karte also über die Kanalnummern 11, 12, 13 und 14 ansprechen und zusätzlich
-über die Nummern 1, 2, 3 und 4. Der Sinn der dahintersteckt ist Ihnen sicher sofort
-klar geworden: Dadurch kann ein Programm, das z.B. für die Compact-Box ge­
-schrieben wurde, ohne Änderung übernommen werden, wenn eine Kombikarte auf
-Steckplatz 1 des Mehrfachsteckplatzes steckt etc..
-
-
-#on("b")#5.4  Aus- und Eingabetest#off("b")#
-
-Nun wird es spannend, denn Sie sollen jetzt testen, ob Sie mit Ihrem Interface-System
-arbeiten können. Sofern Sie mit dem MUFI als Adapter arbeiten, schalten Sie das
-MUFI mit dem Schalter an der Vorderseite ein.
-
-Wenn Sie das MUFI im Terminalkanal betreiben, kann das Einschalten dazu führen,
-daß eine unsinnige Zeichenkette auf dem Bildschirm erscheint. Diese Zeichen
-werden durch den "Einschaltknack" verursacht und haben eigentlich nichts zu
-bedeuten. Allerdings läßt sich die Ausgabe auch nicht verhindern. Die Zeichen ver­
-schwinden bei der nächsten Menubedienung.
-
-Wenn Sie alle Hinweise in Kapitel 5.1 beachtet haben, müßte spätestens jetzt das
-Interface-System betriebsbereit sein - gleichgültig, welchen Adapter und welche
-Interface-Komponenten Sie verwenden.
-
-Aktivieren Sie nun den Menupunkt 'Ausgabetest', indem Sie z.B. die Taste <a>
-tippen. Wenn Sie eine Compact-Box angeschlossen haben, müßte die folgende Ein­
-blendung in Ihrem Menubildschirm erscheinen:
-#page#
- +-------------------------------------------------------------+
- | Ausgabetest |
- | |
- | Ausgabe an Kanal 4 (= Digitalausgang der Compact-Box) |
- |-------------------------------------------------------------|
- | |
- | |
- | |
- | Ausgabewert: 129 |
- | |
- |-------------------------------------------------------------|
- | Bitte einen Wert zwischen 0 und 255 eingeben! |
- | |
- +-------------------------------------------------------------+
-#center#Abb.18:  Ausgabetest - Einblendung
-
-
-Eine nahezu identische Einblendung erhalten Sie, wenn Sie einen Einzelsteckplatz
-mit Kombi- oder E/A-Karte angeschlossen haben.
-
-Da beim Ausgabetest nur die Ausgänge einer Karte angesprochen werden, ist ein
-Ausgabetest an einer A/D-Wandler-Karte nicht möglich! An einer D/A-Wandler-Karte
-kann zwar prinzipiell ein Ausgabetest erfolgen - ist aber nicht sinnvoll, da die zur
-Kontrolle notwendige Leuchtdiodenanzeige hier nicht angeschlossen werden kann.
-
-Wenn Sie einen Mehrfachsteckplatz angeschlossen haben, werden Sie zuvor noch
-gefragt, welchen Steckplatz Sie testen wollen. Bitte beachten Sie hier das im vorigen
-Abschnitt Gesagte. Ansonsten ist auch hier die anschließende Einblendung nahezu
-identisch.
-
-Zum Testen geben Sie jetzt einige Werte zwischen 0 und 255 ein. Nach jeder Eingabe
-tippen Sie bitte die <RETURN>-Taste. Bei Eingabe der '0' müßten alle Leucht­
-dioden dunkel sein. Bei '1' dürfte nur die letzte Leuchtdiode (rechts) aufleuchten,
-bei 128 nur die erste (links); bei 255 müßten alle 8 Leuchtdioden der Anzeige auf­
-leuchten.
-#page#
-Sollten wider Erwarten Fehler aufgetreten sein, lesen Sie bitte im Kapitel 5.5 nach.
-Wenn alles wie beschrieben funktioniert hat, gehen Sie gleich zum Eingabetest über.
-Verlassen Sie dazu den Ausgabetest durch die Tastenfolge <ESC><q> und
-aktivieren Sie anschließend den Menupunkt 'Eingabetest' indem Sie z.B. die Taste
-<e> tippen.
-
-Außer bei der E/A-Karte im Einzelsteckplatz werden Sie hier zusätzlich nach der
-Nummer des Kanals gefragt, über den der Einlesetest erfolgen soll. Das liegt daran,
-daß sich auf den meisten Interfacesystemen mehrere Eingänge befinden. Beim
-Einzelsteckplatz werden die Auswahlmöglichkeiten vorgegeben; beim Mehrfachsteck­
-platz erfolgt eine freie Eingabe der Kanalnummern.
-
-Wenn Sie eine Compact-Box angeschlossen haben, müßte die folgende Einblendung
-in Ihrem Menubildschirm erscheinen:
-
- +-------------------------------------------------------------+
- | Eingabetest |
- | |
- | Eingabe von Kanal 3 (= Digitaleingang der Compact-Box) |
- | |
- |-------------------------------------------------------------|
- | |
- | |
- | Eingelesener Wert: 129 |
- |-------------------------------------------------------------|
- | |
- +-------------------------------------------------------------+
-
-#center#Abb.19:  Eingabetest - Einblendung
-
-
-Wenn Sie den Codekartenleser am Digitaleingang angeschlossen haben und alles
-korrekt funktioniert, müßte als eingelesener Wert die Zahl 255 erscheinen. Legen Sie
-eine Lochkarte ein oder legen Sie einen Finger zwischen Beleuchtung und Licht­
-sensoren. Daraufhin müßte sich die Anzeige auf dem Bildschirm ändern. Nun
-können Sie versuchen, durch Abdecken der Sensoren die bei der Ausgabe schon
-angesprochenen Testwerte zu erhalten.
-#page#
-Wenn Sie über keinen Codekartenleser verfügen, so benutzen Sie jetzt bitte das kleine
-Kabelstück, das Sie auf den +5V-Lötschuh aufgesteckt haben und dessen anderes
-Ende bisher noch nirgendwo aufgesteckt ist. Berühren Sie nun mit diesem freien
-Ende die Stifte, die im 8poligen Eingangs-Platinenstecker sichbar sind. Wird kein Pin
-berührt, müßte auf dem Bildschirm der Wert '0' erscheinen. Berühren Sie einen der
-Pins an der Seite, müßte der Wert '1', berühren Sie den an der anderen Seite, müßte
-der Wert '128' erscheinen. Wenn Sie also nacheinander die Pins berühren, müßten
-die Zahlenwerte 1, 2, 4, 8, 16, 32, 64, 128 erscheinen.
-
-Wenn sowohl Ausgabe- als auch Eingabetest korrekt abgewickelt werden konnten,
-brauchen Sie das Kapitel 5.5 nicht zu lesen, denn das beschäftigt sich nur mit
-Fehlern, die bisher aufgetreten sein könnten. Den Eingabetest verlassen Sie bitte
-durch die Tastenfolge <ESC><q>.
-
-
-#on("b")#5.5  Mögliche Fehlerfälle#off("b")#
-
-#on("b")#
-- Das MUFI wurde in den Terminalkanal eingebaut. Selbst beim vom Netz
- getrennten MUFI ist kein Terminalbetrieb möglich:
-#off("b")#
-
- --> Das neu eingefügte Kabel ist unzureichend oder falsch verdrahtet. Bitte
- Hinweise im MUFI-Handbuch lesen bzw. Informationen von BICOS ein­
- holen.
-
-
-#on("b")#
-- Das MUFI wurde in den Terminalkanal eingebaut. Beim Einschalten des
- MUFIs erscheinen unsinnige Zeichenketten auf dem Bildschirm bzw. das
- Einschalten hat noch schwerwiegendere Folgen: #off("b")#
-
- --> Der "Einschaltknack" des MUFI "schlägt auf andere Systemkomponenten
- durch". Sofern nur Zeichen auf dem Bildscchirm erscheinen, ist das weit­
- gehend unproblematisch - kann auch nicht beseitigt werden. Ansonsten
- erst das MUFI, dann das Terminal bzw. den Rechner einschalten. Ggf.
- Rücksprache mit BICOS.
-#page#
-#on("b")#
-- Das MUFI wurde in den Terminalkanal eingebaut. Bei ausgeschaltetem
- MUFI ist ein einwandfreier Terminalbetrieb möglich, bei einge­
- schaltetem MUFI reagiert das Terminal nicht mehr:
-#off("b")#
-
- --> MUFI- und Terminalkonfiguration passen nicht zueinander (Baudrate,
- Protokoll, Anzahl der Stopbits). Einstellungen am Terminal, in der Task
- 'configurator' und die DIP-Schalter-Stellung im MUFI kontrollieren; ggf.
- Neueinstellung.
-
- --> MUFI defekt - Rücksprache mit BICOS.
-
-
-#on("b")#
-- Beim Austest erscheint die Einblendung "Interface ist noch nicht
- konfiguriert!":
-#off("b")#
-
- --> #on("b")#gs-Prozess#off("b")# wurde noch nicht konfiguriert. Unter dem Oberbegriff 'Inter­
- face' den Menupunkt 'Konfigurieren' aktivieren und den Ausführungen in
- Kapitel 5.3 folgend die Konfiguration vornehmen.
-
- --> Bei Betrieb des Interface Systems an separater serieller Schnittstelle werden
- unbenannte Sohntasks eingerichtet (unter der eigenen Task bzw. unter
- einer "zentralen Abwicklungstask"). Diese unbenannte Sohntask wurde
- irrtümlich gelöscht. Abhilfe: Neukonfiguration vornehmen. #on("b")#*)#off("b")#
-
- --> Bei Betrieb des Interface-Systems an separater serieller Schnittstelle und
- "zentraler Abwicklungstask" wurde in der "zentralen Abwicklungs-Task"
- eine Neukonfiguration von #on("b")#gs-Prozess#off("b")# vorgenommen. Die dabei ent­
- standene unbenannte Sohntask wird von den "alten" Sohntasks nicht mehr
- erkannt. Abhilfe: Alle Sohntasks, die auf die "zentrale Abwicklungstask"
- zugreifen, löschen und neu einrichten. #on("b")#*)#off("b")#
-#page#
-#on("b")#
-- Es erscheint die Fehlermeldung "Interface meldet sich nicht!":
-#off("b")#
-
- --> Der angeschlossene Adapter ist ohne Spannungsversorgung. Netzstecker
- des Adapters überprüfen. Beim MUFI den Schalter an der Vorderseite in
- Stellung 'Ein' bringen. Beim RS232-Adapter den 3poligen Platinenstecker
- in die 12V-Spannungsversorgungsbuchse am Interface-System einstecken.
-
- --> Es wurde bei der Installation von #on("b")#gs-Prozess#off("b")# eine falsche Interface-
- Kanal-Nummer angegeben. Die Kanalnummer kann mit 'put(interface­
- kanal) <RETURN>' erfragt werden. Kanalnummer überprüfen. Ggf. neue
- Kanalnummer angeben. Dafür steht die Prozedur 'PROC interfacekanal
- (INT CONST nummer)' zur Verfügung.
-
- --> Speziell beim MUFI: Das MUFI wurde zwischenzeitlich (versehentlich)
- ausgeschaltet oder es kam zu einem "ungeregeltem Bedienungsabbruch"
- z.B. durch Drücken der SV-Taste im laufenden Betrieb. Die interne Ein­
- stellung des MUFIs ist verändert. Abhilfe: Menupunkt verlassen, MUFI
- ausschalten, einige Sekunden warten, MUFI anschalten, Menupunkt neu
- anwählen.
-
-
-#on("b")#
-- Es erscheint die Fehlermeldung "Interface-Kanal ist belegt!:
-#off("b")#
-
- --> Das Interface-System ist an einer separaten seriellen Schnittstelle ange­
- schlossen. Am Kanal wurden schon andere Geräte betrieben, die nicht
- ordentlich abgemeldet wurden. Mit 'taskinfo (2) <RETURN>' kann die
- Belegung der Kanäle eingesehen werden. Ggf. erst ein Terminal an den
- Kanal anschließen (Kanal umkonfigurieren!) und dort 'break
- <RETURN>' geben. Oder von einer privilegierten Task aus die ange­
- koppelte Task "abschießen".
-
- --> Das Interface-System ist an einer separaten seriellen Schnittstelle ange­
- schlossen. Eine andere Task greift bereits auf das Interface-System am
- eingestellten Kanal zu. Benutzer bitten, den Kanal freizugeben. #on("b")#*)#off("b")#
-#page#
-#on("b")#
-- Es erscheint die Fehlermeldung "Interface-Task ist besetzt!":
-#off("b")#
-
- --> Das Interface-System ist an einer separaten seriellen Schnittstelle ange­
- schlossen. Die Kommunikation erfolgt über eine "zentrale Abwicklungs­
- task". Auf diese Task greift zur Zeit ein anderer Benutzer zu. Mit dem
- anderen Benutzer verständigen und warten, bis die Task freigegeben wird.
- #on("b")#*)#off("b")#
-
-
-#on("b")#
-- Es erschient die Fehlermeldung "An Kanal ... ist keine Digitaleingabe
- (Digiatalausgabe, Analogeingabe, Analogausgabe) möglich!":
-#off("b")#
-
- --> Laut Konfiguration ist die gewünschte Leistung am angegebenen Kanal auf
- der angeschlossenen Interfacekarte nicht möglich. Kanal neu konfigurieren
- oder anderen Kanal ansprechen bzw. Interface-Karte wechseln und neu
- konfigurieren.
-
-
-#on("b")#
-- Es erschient die Fehlermeldung "Kanalnummer ... ist unzulässig!":
-#off("b")#
-
- --> Es wurde eine - bezogen auf das angeschlossene Interface-System - un­
- sinnige Kanalnummer angegeben. Diese Fehlermeldung erscheint in jedem
- Falle, wenn die Kanalnummer kleiner als 1 oder größer als 49 ist! Abhilfe:
- korrekte Kanalnummer angeben.
-
-
-#on("b")#
-- Es erschient die Fehlermeldung "Interface kann nicht geöffnet werden!":
-#off("b")#
-
- --> Interessanter Fehler! Bitte alle Details der Fehlersituation notieren und an
- ERGOS einsenden!
-#page#
-#on("b")#
-- Beim Austest erscheint zwar keine Fehlermeldung, aber die Leucht­
- diodenanzeige zeigt auf verschiedene Ausgabewerte keine Reaktion
- (bleibt dunkel oder unsinnige fixe Anzeige):
-#off("b")#
-
- --> Die angeschlossene Leuchtdiodenanzeige ist nicht korrekt angeschlossen.
- Platinenstecker (Digitalausgang) überprüfen; Massekabel überprüfen; die
- beiden Überbrückungskabel (Abb.7) überprüfen.
-
- --> Steckplatz/Compact-Box wird nicht mit Spannung versorgt. Netzkabel/An­
- schluß zum Netzteil überprüfen.
-
- --> Verbindungskabel Adapter - Interface-System nicht richtig aufgesteckt oder
- intern falsch verdrahtet.
-
-
-#on("b")#
-- Beim Austest erscheinen verschiedene Ausgabemuster an den Leucht­
- dioden, die Muster sind aber nicht korrekt:
-#off("b")#
-
- --> Kabel vom Adapter zum Interface ist falsch verdrahtet.
-
- --> Kabel in der Leuchtdiodenanzeige (Selbstbau ?) sind falsch verdrahtet.
-
-
-#on("b")#*)#off("b")# Die hier genannten Fehlermeldungen sind bei der oben beschriebenen Erst­
- installation (noch) nicht möglich. Sie können erst auftreten, wenn weiter­
- gehende Installationen erfolgt sind (z.B. Installation einer "zentralen Abwick­
- lungs-Task" etc.). Zum Verständnis lesen Sie bitte das Kapitel "Hinweise für den
- Systembetreuer/Programmierer".
-
-
-
-
-
-
-
-
diff --git a/doc/prozess/gs-prozess-6 b/doc/prozess/gs-prozess-6
deleted file mode 100644
index a3835cd..0000000
--- a/doc/prozess/gs-prozess-6
+++ /dev/null
@@ -1,641 +0,0 @@
-limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (1)#
-#headodd#
-#center#gs-Prozess#right#%
-
-#end#
-#headeven#
-%#center#gs-Prozess
-
-#end#
-#center#1
-
-#on("b")#6  Arbeiten mit gs-Prozess#off("b")#
-
-In diesem Kapitel werden wir Ihnen die Basisbefehle von #on("b")#gs-Prozess#off("b")# vorstellen und
-erläutern, was die einzelnen Befehle bewirken. Dabei werden wir an einfachen
-Beispielen aufzeigen, wie Sie mit #on("b")#gs-Prozess#off("b")# arbeiten können.
-
-Wir gehen hier davon aus, daß die Hardware-Voraussetzungen erfüllt, das Interface-
-System angeschlossen und die Software (#on("b")#gs-Prozess#off("b")#) auf dem Rechner installiert
-sind. Sie sollten #on("b")#gs-Prozess#off("b")# bereits konfiguriert und einen Ein- und Ausgabetest
-durchgeführt haben.
-
-In unserer Beschreibung gehen wir weiterhin davon aus, daß als Interface-System
-eine Compact-Box verwendet wird. Alle hier beschriebenen Beispiele gelten ganz
-genauso für einen Einzelsteckplatz mit Kombikarte (hier müssen Sie nur zusätzlich
-eine Leuchtdiodenanzeige anschließen - aber Sie wissen ja schon, wie das gemacht
-wird.) Bei anderen Hardware-Konfigurationen ist darauf zu achten, daß ggf. andere
-Kanalnummern anzugeben sind.
-
-Die Compact-Box verfügt - genau wie die Kombikarte - über zwei analoge Eingänge
-(Kanal 1 und Kanal 2), über einen digitalen Eingang (Kanal 3) sowie über einen
-digitalen Ausgang (Kanal 4). Wie Sie schon bei der Konfiguration von #on("b")#gs-Prozess#off("b")#
-gesehen haben, haben Sie keinen Einfluß auf die Numerierung der Kanäle - die wird
-vom #on("b")#gs-Prozess#off("b")# vorgegeben. Diese Kanalnummer müssen Sie kennen, wenn Sie das
-System ansprechen (programmieren) wollen (ggf. können Sie die Kanalnummern
-durch Aktivieren des Menupunktes 'Information' unter dem Oberbegriff 'Interface'
-erfragen).
-
-
-#on("b")#6.1  Kleine Beispiele zur digitalen Ausgabe#off("b")#
-
-Bei diesem Einführungsbeispiel wollen wir uns zunächst ausschließlich auf die
-digitale Ausgabe beschränken. Wenn Sie die Compact-Box (oder eine E/A-Karte)
-angeschlossen haben, benötigen Sie hierzu keine zusätzliche Hardware, ansonsten
-schließen Sie bitte an Ihren digitalen Ausgang eine 8-elementige Leuchtdiodenanzeige
-an.
-#page#
-Sie haben sicher schon an einer Autobahnbaustelle ein sogenanntes "Lauflicht"
-gesehen. Es erscheint, als ob ein Licht über die aufgestellten Barken hinwegläuft.
-Dadurch soll auf die Baustellenein- bzw. -ausfahrt hingewiesen werden. Dieser Effekt
-wird dadurch erreicht, daß die Lampen, die an den Barken angebracht sind, nach­
-einander ein- und auch wieder ausgeschaltet werden.
-
-Wir wollen jetzt auf unserer 8-elementigen Leuchtdiodenanzeige ein solches Lauflicht
-nachbilden. Dabei soll das "Licht von rechts nach links über die Anzeige wandern".
-
-Um das Programm zu schreiben, aktivieren Sie im #on("b")#gs-Prozess#off("b")#-Menu unter dem
-Oberbegriff "Programm" den Menupunkt "Neu erstellen". Sie werden dann nach
-einem Namen gefragt, den Sie der Programmdatei geben wollen. Tragen Sie hier
-einen beliebigen Namen ein, und tippen Sie anschließend die <RETURN>-Taste.
-Notieren Sie dann das folgende ELAN-Programm:
-
-#on("b")#
- initialisiere interface;
- REP
- lauflichtdurchgang;
- warte (2.0)
- UNTIL abbruch gewuenscht PER.
-
- lauflichtdurchgang:
- bitmuster ausgeben (4, "OOOOOOOI");
- bitmuster ausgeben (4, "OOOOOOIO");
- bitmuster ausgeben (4, "OOOOOIOO");
- bitmuster ausgeben (4, "OOOOIOOO");
- bitmuster ausgeben (4, "OOOIOOOO");
- bitmuster ausgeben (4, "OOIOOOOO");
- bitmuster ausgeben (4, "OIOOOOOO");
- bitmuster ausgeben (4, "IOOOOOOO")
-#off("b")#
-
-
-Wenn Sie das Programm fertiggeschrieben haben, verlassen Sie die Datei durch die
-Tastenfolge <ESC><q>. Sie gelangen wieder zum Menu und aktivieren jetzt den
-Menupunkt "Starten". Daraufhin wird das Programm übersetzt und ausgeführt.
-#page#
-#on("b")#6.1.1  Möglichkeit eines Programmabbruchs#off("b")#
-
-Wir hoffen natürlich, daß das Programm genau die Ausgabe an der Leuchtdioden­
-anzeige erzeugt, die Sie erwartet haben.
-
-Als Ausgangsbedingung der Schleife haben wir den Testbefehl 'abbruch gewuenscht'
-verwendet. Dieser Befehl wird von #on("b")#gs-Prozess#off("b")# zur Verfügung gestellt. Durch den
-Testbefehl wird überprüft, ab zwischenzeitlich die Tastenkombination <ESC><q>
-eingegeben wurde. Ist das bei unserem Programm der Fall, so wird die Schleife
-('regulär') beendet.
-
-Aber bitte etwas Geduld: Das Programm wird nicht sofort nach Eingabe der Tasten­
-folge "abgebrochen". Hat nämlich gerade ein neuer 'lauflichtdurchgang' begonnen,
-so wird das Refinement natürlich erst vollständig abgearbeitet. Erst dann wird
-geprüft, ob die Tastenfolge zwischenzeitlich eingegeben wurde.
-
-Sollten Sie einmal in einer Situation sein, in der Sie ein Programm tatsächlich
-abbrechen müssen, so ist das (in den meisten Fällen) über die Tastenfolge
-<ESC><h> möglich. Diese Tastenkombination sollten Sie sich für "Notfälle"
-merken. Vielleicht probieren Sie sie gleich an unserem Beispiel aus.
-
-
-#on("b")#6.1.2  Die "sonstigen" Befehle#off("b")#
-
-Gehen wir zunächst auf die beiden Befehle 'initialisiere interface' und 'warte' sowie
-auf den Testbefehl 'abbruch gewuenscht ein:
-
-#on("b")#
-PROC initialisiere interface
-#off("b")#
-
- Jedes Programm zur Prozeßdatenverarbeitung, das auf das Interface-System
- zugreift, sollte mit diesem Befehl beginnen. Durch diesen Befehl wird das System
- in einen definierten Anfangszustand versetzt; systeminterne Variablen werden
- initialisiert, so daß vom Programm aus darauf zugegriffen werden kann.
-#page#
-#on("b")#
-PROC warte (REAL CONST wert)
-PROC warte (INT CONST wert)
-#off("b")#
-
- Der Befehl 'warte' ähnelt dem Ihnen sicher bekannten Befehl 'pause'. Allerdings
- wird hier als Parameter (INT oder REAL) die Wartezeit in Sekunden angegeben -
- bei 'pause' dagegen die Anzahl der Zehntelsekunden. Der eigentliche Unterschied
- besteht aber darin, daß 'warte' im Gegensatz zu 'pause' ein "Nothalt" - d.h. die
- Tastenkombination <ESC><h>, die wir im vorigen Kapitel beschrieben haben
- - registriert. Aus diesem Grunde sollte in Prozeßdatenverarbeitungsprogrammen
- mit 'warte' statt mit 'pause' gearbeitet werden.
-
-
-#on("b")#
-BOOL PROC abbruch gewuenscht
-#off("b")#
-
- Die Prozedur liefert den Wert 'TRUE', wenn zwischenzeitlich die Tasten­
- kombination <ESC><q> eingegeben wurde, sonst den Wert 'FALSE'.
-
-
-#on("b")#6.1.3  Schreibweise für Bitmuster/Bitsymbole#off("b")#
-
-Beim Befehl 'bitmuster ausgeben', wird eine Zeichenkette, die aus 8 Zeichen besteht,
-übergeben - das sog. Bitmsuster. In unserem Falle kommen hier nur die Zeichen 'I'
-und 'O' vor. Ihnen ist sicher die Bedeutung sofort klar gewesen:
-
- 'I' bedeutet, daß an der entsprechenden Position ein High-Pegel (5V) angelegt
- werden soll; 'O' bedeutet, daß an der entsprechenden Position ein Low-
- Pegel (0V) angelegt werden soll.
-
-So werden über den ersten Befehl im Refinement 'lauflichtdurchgang' alle Leucht­
-dioden ausgeschaltet, nur die Leuchtdiode ganz rechts wird angeschaltet. Ãœber den
-zweiten Befehl wird diese wieder ausgeschaltet und dafür aber die zweite von rechts
-eingeschaltet usw.
-#page#
-Neben den Zeichen 'I' und 'O' dürfen auch die Zeichen 'X' und 'T' in der über­
-gebenen Zeichenkette auftauchen. Um die Bedeutung zu verstehen, muß man
-wissen, daß #on("b")#gs-Prozess#off("b")# den jeweils letzten Zustand des digitalen Ausgangs speichert
-(durch 'initialisiere interface' werden alle Ausgänge auf 'O' gesetzt).
-
- 'X' bedeutet, daß an der entsprechenden Position der zuletzt dagewesene
- Zustand erhalten bleibt, d.h. durch diese Ausgabe nicht beeinflußt wird.
-
- 'T' bedeutet, daß an der entsprechenden Position der zuletzt dagewesene
- Zustand "umgekehrt" wird. Lag zuletzt ein Low-Pegel (O) an, so wird
- daraus ein High-Pegel (I) und umgekehrt.
-
-Sie können sich nun sicher sofort erklären, was das folgende Programm bewirkt:
-
-
-#on("b")#
- initialisiere interface;
- bitmuster ausgeben (4, "OIOIOIOI");
- REP
- bitmuster ausgeben (4, "TTTTTTTT");
- warte (1)
- UNTIL abbruch gewuenscht PER
-#off("b")#
-
-
-Durch den ersten Befehl 'bitmuster ausgeben' wird jede zweite Leuchtdiode ange­
-schaltet, die anderen werden ausgeschaltet. Durch den zweiten Befehl in der Schleife
-wird nun jeweils jeder Zustand in "das Gegenteil umgekehrt", so daß ein Blinklicht
-entsteht, bei dem abwechselnd einmal die einen vier, dann die anderen vier Leucht­
-dioden aufleuchten - und das jeweils für eine Sekunde.
-
-
-#on("b")#6.1.4  Befehle für die digitale Ausgabe#off("b")#
-
-Einen Befehl, mit dem der digitale Ausgang des Interfaces angesprochen werden
-kann, haben Sie schon in Kapitel 6.1 kennengelernt:
-#page#
-#on("b")#
-PROC bitmuster ausgeben (INT CONST kanal,
- TEXT CONST zeichenkette)
-#off("b")#
-
-Über den ersten Parameter wird der Kanal angegeben, über den der digitale Ausgang
-angesprochen werden kann; bei uns ist das der Kanal 4 auf der Compact-Box. Ãœber
-den zweiten Parameter wird das sogenannte Bitmuster übergeben; ein Text, der aus
-genau 8 Zeichen besteht. Dabei dürfen die Zeichen "I, O, X und T verwendet werden
-(sehen Sie dazu auch Kapitel 6.1.3).
-
-#on("b")#gs-Prozess#off("b")# stellt noch zwei weitere Befehle für die digitale Ausgabe zur Verfügung.
-Um die Wirkungsweise der Befehle zu verdeutlichen, hier das erste Beispiel (das
-Lauflicht) in einer zweiten Version:
-
-#on("b")#
- initialisiere interface;
- REP
- lauflichtdurchgang;
- warte (2.0)
- UNTIL abbruch gewuenscht PER.
-
- lauflichtdurchgang:
- INT VAR zeiger;
- FOR zeiger FROM 0 UPTO 7 REP
- schalte aktuelle leichtdiode an;
- schalte vorgaenger aus
- PER.
-
- schalte aktuelle leuchtdiode an:
- bitsymbol ausgeben (4, zeiger, "I").
-
- schalte vorgaenger aus:
- IF zeiger = 0
- THEN bitsymbol ausgeben (4, 7, "O")
- ELSE bitsymbol ausgeben (4, zeiger - 1, "O")
- FI.
-#off("b")#
-
-#on("b")#
-PROC bitsymbol ausgeben (INT CONST kanal, bitnummer,
- TEXT CONST zeichen)
-#off("b")#
-#page#
-Während durch den Befehl 'bitmuster ausgeben' auf alle 8 Ausgänge gleichzeitig
-Einfluß genommen werden kann, wird mit dem Befehl 'bitsymbol ausgeben' gezielt
-nur genau einer der 8 Ausgänge, d.h. eines der 8 Bits manipuliert. Welcher Ausgang /
-welches Bit manipuliert werden soll, wird über den zweiten Parameter festgelegt: hier
-kann einer der Werte 0...7 angegeben werden (Beachten Sie die Numerierung der
-Ausgänge (!)).
-
-Als dritter Parameter wird ein Text übergeben, der aus genau einem Zeichen
-bestehen muß. Ebenso wie beim Befehl 'bitmuster ausgeben' sind hier die Zeichen I,
-O, X und T zulässig. Sie haben hier auch die gleiche Bedeutung.
-
-Mit dem dritten Ausgabebefehl für den digitalen Ausgang können wir das Beispiel
-noch in einer dritten Version notieren:
-
-#on("b")#
- initialisiere interface;
- REP
- lauflichtdurchgang;
- warte (2.0)
- UNTIL abbruch gewuenscht PER.
-
- lauflichtdurchgang:
- INT VAR wert :: 1;
- REP
- dezimalwert ausgeben (4, wert);
- wert := 2 * wert
- UNTIL wert > 128 PER.
-#off("b")#
-
-#on("b")#
-PROC dezimalwert ausgeben (INT CONST kanal, wert)
-#off("b")#
-
-'wert' kann Werte zwischen 0 und 255 annehmen. Das zugehörige Bitmuster wird
-dann am angegebenen Kanal ausgegeben. Anhand dieses Befehls wird Ihnen sicher
-auch klar, warum gerade die oben beschriebene Numerierung der Bits gewählt
-wurde.
-#page#
-#on("b")#6.1.5  Befehle für die analoge Ausgabe#off("b")#
-
-Neben der 'digitalen' Ausgabe ist auch eine 'analoge' Ausgabe möglich. Allerdings
-wollen wir die Beschreibung der Befehle an dieser Stelle sehr kurz halten, denn eine
-"analoge" Ausgabe ist nur möglich, wenn Sie eine D/A-Karte besitzen.
-
-Auf der D/A-Karte steht nur ein physikalischer Ausgabekanal zur Verfügung, der von
-#on("b")#gs-Prozess#off("b")# jedoch über zwei Kanalnummern angesprochen werden kann.
-
-Über den Ausgabekanal 1 können Spannungswerte zwischen -5V und +5V aus­
-gegeben werden, über den Ausgabekanal 2 Spannungswerte zwischen 0V und +5V.
-
-Dafür stellt #on("b")#gs-Prozess#off("b")# zwei Befehle bereit:
-
-#on("b")#
-PROC spannungswert ausgeben (INT CONST kanal,
- REAL CONST wert)
-#off("b")#
-
-'wert' kann, in Abhängigkeit vom angegebenen Kanal, Werte zwischen -5.0 und +5.0
-(bei Kanal 1) bzw. 0.0 und +5.0 (bei Kanal 2) annehmen. Bei dem Versuch, Werte
-außerhalb dieser Grenzen anzugeben, erhalten Sie die Fehlermeldung "Der
-Spannungswert ... ist nicht zulässig!".
-
-
-#on("b")#
-PROC wert an analogausgang ausgeben (INT CONST kanal, wert)
-#off("b")#
-
-Für 'wert' kann eine Zahl zwischen 0 und 255 angegeben werden. Dabei wird 0 auf
-den kleinstmöglichen Spannungswert am jeweilgen Kanal (bei Kanal 1 also auf -5V,
-bei Kanal 2 auf 0V) und 255 auf den größtmöglichen Spannungswert am jeweilgen
-Kanal (bei beiden Kanälen auf +5V) abgebildet. Das Intervall zwischen kleinst- und
-größtmöglichem Spannungswert wird in 255 gleichgroße Teilintervalle eingeteilt. Es
-wird nun die Spannung ausgegeben, die der Intervallnummer entspricht.
-Anmerkung: Dieser Befehl hat nur einen "geringen praktischen Nutzwert"; er dient
- vornehmlich dazu, den Wandlungsprozeß zu verdeutlichen.
-#page#
-#on("b")#6.2  Kleine Beispiele zur digitalen Eingabe#off("b")#
-
-Für die im folgenden beschriebenen kleinen Beispiele benötigen Sie einen Code­
-kartenleser und einige Codekarten (können auch von der Fa. AKTRONIK bezogen
-werden). Der Anschluß des Codekartenlesers an Ihr Interface-System ist denkbar
-einfach. Stecken Sie den 8poligen Platinenstecker des Codekartenlesers in die Buchse
-des Digitaleinganges der Steckkarte bzw. der Compact-Box und den 3poligen
-Platinenstecker in die passende Spannungsversorgungsbuchse (12V) am Steckplatz
-bzw. auf der Compact-Box - fertig! Bei eingeschalteter Betriebsspannung müßte nun
-der Codekartenleser beleuchtet sein.
-
-Auf den Lochkarten sind bis zu 8 Löcher eingestanzt. Dabei können bestimmte
-Löcher (Bits) für die Erfassung definierter Merkmale verwendet werden. Dazu kann
-eine Karte in bestimmte Bereiche aufgeteilt werden.
-
-In unserem kleinen Beispiel stellen wir uns vor, daß eine (Modell-)Sparkasse zwei
-Filialen hat. Sie hat an Ihre "Kunden" Codekarten verteilt. Die Filialen sind durch
-Farben gekennzeichnet. Die oberen (höchstwertigen) zwei Bits der Karte sollen diese
-Farbe kodiert enthalten, damit auch der "Sparkassen-Computer" die Farbe schnell
-ermitteln kann. Die Karte soll folgenden Aufbau haben:
-
- +---------------------------------+
- | O o o O o o O |
- | | |
- | Farbbits| Kundennummer |
- | | |
- | | |
- | | |
- | |
- +---------------------------------+
-
-
-#center#Abb.20 Beispiellochkarte
-#page#
-Bit 7 sei für rote, Bit 6 für grüne Farbe gesetzt, d.h. gelocht. Wie wollen jetzt ein
-Programm erstellen, das auf Eingabe einer Karte deren Farbe und den durch die
-ersten 6 Bits bestimmten Wert (Kundennummer) ausgibt:
-
-#on("b")#
- initialisiere interface;
- REP
- erfasse lochkarte
- UNTIL abbruch gewuenscht PER.
-
- erfasse lochkarte:
- warte bis karte im leser;
- gib farbe aus;
- gib kundennummer aus;
- warte bis keine karte im leser.
-
- warte bis karte im leser:
- put ("Bitte eine Codekarte einlegen!"); line;
- WHILE NOT alles abgedunkelt REP
- tue nichts
- END REP;
- WHILE alles abgedunkelt REP
- tue nichts
- END REP;
- warte (1).
-
- warte bis keine karte im leser:
- put ("Bitte die Karte entnehmen!");
- REP
- tue nichts
- UNTIL alles beleuchtet PER.
-
- alles abgedunkelt:
- bitmuster (3) = "OOOOOOOO".
-
- alles beleuchtet:
- bitmuster (3) = "IIIIIIII".
-
- gib farbe aus:
- IF bitsymbol (3, 7) = "I"
- THEN put ("rote Karte"); line
- ELSE put ("grüne Karte");line
- FI;
-#page#
- gib kundennummer aus:
- INT VAR kundennummer :: 0, bitnummer;
- FOR bitnummer FROM 0 UPTO 5 REP
- registriere gesetztes bit
- PER;
- put ("Kundennummer:"); put (kundennummer): line.
-
- registriere gesetztes bit:
- IF bit ist gesetzt (3, bitnummer)
- THEN kundennummer INCR (2 ** bitnummer)
- FI.
-
-
-#off("b")#
- (Hinweis: Es handelt sich hier um ein Beispielprogramm, an dem diverse
- Befehle erläutert werden sollen - die Programmierung ist nicht
- optimal! Im Refinement 'warte bis karte im leser' ist es z.B.
- günstiger, solange einzulesen, bis der eingelesene Wert "stabil" ist.
- Auch das Refinement 'registriere gesetztes bit' würde man so nicht
- programmieren, sondern nach einem Einlesevorgang (Bitmuster)
- über Textoperationen aus dem Bitmuster die 'kundennummer'
- ermitteln...).
-
-Bevor wir Ihnen die Funktionsweise der von #on("b")#gs-Prozess#off("b")# bereitgestellten Prozeduren
-im Detail erläutern, möchten wir Ihnen noch ein paar kurze Erläuterungen zum
-obigen Programm geben.
-
-Besondere Aufmerksamkeit sollten Sie den Refinements 'warte bis karte im leser' und
-'warte bis keine karte im leser' schenken. Im erstgenannten Refinement ist sicherzu­
-stellen, daß das Einschieben der Karte (erst muß alles abgedunkelt werden - dann
-müssen einige Positionen beleuchtet sein) registriert wird. Um Fehlauswertungen der
-Karte zu vermeiden (z.B. beim Verkanten einer Karte) wird zur Sicherheit vor der
-Auswertung eine Sekunde gewartet. Am Ende des Lesevorgangs soll sichergestellt
-werden, daß die Karte auch entnommen worden ist (alle Positionen wieder beleuchtet
-sind).
-#page#
-Wir prüfen im Refinement 'gib farbe aus' nur das 7. Bit (sehen Sie die Erklärung zu
-'bitsymbol'). Ist das Bit gesetzt (die Karte hier gelocht), so identifizieren wir die Farbe
-Rot, sonst Grün. Natürlich ist es möglich, mit 2 "Farbbits" vier Farben zu ver­
-schlüsseln: z.B. Rot, wenn nur Bit 7 gesetzt ist; Grün, wenn nur Bit 6 gesetzt ist; Blau,
-wenn Bit 7 und Bit 6 gesetzt sind; Gelb, wenn weder Bit 7 noch Bit 6 gesetzt sind.
-Dadurch wird der Auswertalgorithmus aber etwas aufwendiger. Vielleicht probieren
-Sie es nacher einmal.
-
-Die Prozedur 'tue nichts' wird schon von #on("b")#gs-Prozess#off("b")# bereitgestellt. Es wird keine
-Aktion ausgeführt - jedoch überprüft, ob zwischenzeitlich die Tastenfolge
-<ESC><h> ("Notbremse") eingegeben wurde. Es empfiehlt sich, diese Prozedur
-gerade in Schleifenrümpfen einzusetzten, damit die Möglichkeit besteht, bei einer
-"Endlosschleife" einen Abbruch herbeizuführen (sonst "hängt" die Task ggf. am
-Interfacekanal)!
-
-
-#on("b")#6.2.1  Befehle für die digitale Eingabe#off("b")#
-
-In Kapitel 6.1.4 haben Sie die Befehle für die digitale Ausgabe kennengelernt, die
-Ihnen #on("b")#gs-Prozess#off("b")# zur Verfügung stellt. Zu jedem dieser drei Befehle gibt es das
-"Gegenstück" auch als Eingabebefehl. Alle Eingabebefehle sind als werteliefernde
-Prozeduren (Funktionen) ausgelegt.
-
-In den Refinements 'alles abgedunkelt' und 'alles beleuchtet' benutzen wir den
-Befehl:
-
-#on("b")#
-TEXT PROC bitmuster (INT CONST kanal)
-#off("b")#
-
-Über den Parameter wird der Kanal angegeben, über den der digitale Eingang ange­
-sprochen werden kann; bei uns ist das der Kanal 3 auf der Compact-Box. Die
-Prozedur liefert einen Text, der aus acht Zeichen besteht. Dabei können nur die
-Zeichen "I und "O" auftreten (sehen Sie dazu auch Kapitel 6.1.3).
-#page#
-Die beiden gerade genannten Refinements hätten aber auch so notiert werden
-können:
-
-#on("b")#
- alles abgedunkelt:
- dezimalwert (3) = 0.
-
- alles beleuchtet:
- dezimalwert (3) = 255.
-#off("b")#
-
-#on("b")#
-INT PROC dezimalwert (INT CONST kanal)
-#off("b")#
-
-Über den Parameter wird der Kanal angegeben, über den der digitale Eingang ange­
-sprochen werden kann; bei uns ist das wieder der Kanal 3 auf der Compact-Box. Die
-Prozedur liefert einen Integer-Wert zwischen 0 und 255 (sehen Sie dazu auch unter
-'dezimalwert ausgeben' im Kapitel 6.1.4).
-
-Den dritten Eingabebefehl für den Digitaleingang, den #on("b")#gs-Prozess#off("b")# bereitstellt, finden
-Sie im Refinement 'gib farbe aus':
-
-#on("b")#
-TEXT PROC bitsymbol (INT CONST kanal, bitnummer)
-#off("b")#
-
-Wie schon bei den anderen beiden Eingabebefehlen wird hier über den ersten
-Parameter der Eingabekanal festgelegt; bei uns auf der Compact-Box ist das wieder
-der Kanal 3. Ãœber den zweiten Parameter wird die Nummer des Bits angegeben,
-dessen Wert ermittelt werden soll. Ist das betreffende Bit gesetzt, so liefert die
-Prozedur das Zeichen "I", sonst das Zeichen "O" (sehen Sie dazu auch das Kapitel
-6.1.3 'Schreibweise für Bitmuster/Bitsymbole').
-
-
-#on("b")#6.2.2  Eingabetests#off("b")#
-
-Neben diesen drei Eingabebefehlen stellt #on("b")#gs-Prozess#off("b")# noch zwei Testbefehle zur
-Verfügung, die man häufig gut verwenden kann. Auf einen greifen wir schon im
-Refinement 'registriere gesetztes bit' zurück:
-#page#
-#on("b")#
-BOOL PROC bit ist gesetzt (INT CONST kanal, bitnummer)
-#off("b")#
-
-Die Parameter sind die gleichen wie beim Befehl 'bitsymbol'. Zunächst liest die
-Prozedur die aktuelle Einstellung am angegebenen Digitaleingang ('kanal') ein und
-untersucht dann das Bit mit der angegebenen Bitnummer (0, ..., 7). Die Prozedur
-liefert den Wert 'TRUE', wenn das Bit mit der entsprechenden Bitnummer gesetzt ist
-(die Prozedur bitsymbol' mit gleichen Parametern also den Wert "I" liefern würde),
-sonst 'FALSE' (die Prozedur bitsymbol' mit gleichen Parametern also den Wert "O"
-liefern würde).
-
-Den zweiten Testbefehl haben wir im obigen Programm noch nicht verwendet. Wir
-könnten damit aber auch die Refinements 'alles abgedunkelt' und 'alles beleuchtet'
-folgendermaßen notieren:
-
-#on("b")#
- alles abgedunkelt:
- bitmuster gleich (3, "OOOOOOOO").
-
- alles beleuchtet:
- bitmuster gleich (3, "IIIIIIII").
-#off("b")#
-
-
-#on("b")#
-BOOL PROC bitmuster gleich (INT CONST kanal,
- TEXT CONST vorgabe)
-#off("b")#
-
-Wie bereits zuvor wird über den ersten Parameter der Kanal angegeben, über den der
-Digitaleingang angesprochen werden kann. Zunächst liest die Prozedur am ange­
-gebenen Kanal die aktuelle Einstellung ein und vergleicht es mit der 'vorgabe'. Der
-eigentliche Vorteil der Prozedur liegt darin, daß bei der Beschreibung der 'vorgabe'
-neben den Zeichen "I" und "O" auch das Zeichen "X" verwendet werden darf. z.B.
-"IOXXXXX". Entspricht das eingelesene Bitmuster der 'vorgabe', so liefert die Prozedur
-den Wert 'TRUE', sonst den Wert 'FALSE'. In gerade genannten Beispiel liefert die
-Prozedur also immer dann 'TRUE', wenn eine Karte mit der Markierung für Rot
-eingeschoben wurde - gleichgültig, welche Kundennummer eingestanzt ist.
-#page#
-#on("b")#6.2.3  Befehle für die analoge Eingabe#off("b")#
-
-Die analoge Eingabe möchten wir Ihnen an einem ganz einfachen Beispiel vor Augen
-führen. Sie brauchen dazu nur ein ganz normales Drehpotentiometer (ca. 5kOhm),
-das Sie in jedem Elektronik-Fachgeschäft für wenig Geld erhalten können. Ein
-solches Drehpotentiometer verfügt über drei Anschlüsse. Wenn man sich den inneren
-Aufbau vor Augen führt, ist die Belegung der drei Anschlüsse auch recht einsichtig.
-
-
- siehe Physikbuch!!
-
-
-
-#on("b")##center#Abb.21 Aufbau eines Drehpotentiometers#off("b")#
-
-Löten Sie ggf. auf die drei Anschlüsse je einen Lötschuh, um eine einfache Steckver­
-bindung zur Kombikarte/Compact-Box herstellen zu können. Wichtig ist vor allem,
-daß der mittlere Anschluß am Drehpotentiometer auf den mittleren Stecksockel am
-Analogeingang auf der Kombikarte/Compact-Box aufgesteckt wird. Die beiden
-anderen Anschlüsse können können Sie beliebig auf die beiden dann noch freien
-Lötstifte (+ und �) des gleichen Analogeingangs aufstecken.
-
-Starten Sie dann das folgende Programm:
-
-#on("b")#
- initialisiere interface;
- page;
- REP
- notiere potentiometerwert
- UNTIL abbruch gewuenscht PER.
-
- notiere potentiometerwert:
- put (wert von analogeingang (1));
- line.
-#off("b")#
-#page#
-Nach dem Start des Programms müßten auf dem Bildschirm untereinander immer
-wieder die gleiche Zahl (ein Wert zwischen 0 und 255) auftauchen. Wenn Sie dann
-am Potentiometer drehen, müßten sich auch die Werte auf dem Bildschirm ändern.
-
-Sie hätten das Refinement 'notiere potentiometerwert' auch folgendermaßen notieren
-können:
-
-#on("b")#
- notiere potentiometerwert:
- put (spannungswert (1));
- line.
-#off("b")#
-
-Statt Wert zwischen 0 und 255 zu erhalten, müßten Sie jetzt Werte zwischen 0.0 und
-5.0 erhalten.
-
-
-#on("b")#
-REAL PROC spannungswert (INT CONST kanal)
-#off("b")#
-
-Über den Parameter wird der Kanal angegeben, über den der analoge Eingang ange­
-sprochen werden kann; bei uns ist das der Kanal 1 (oder 2) auf der Kombikarte/
-Compact-Box. Auf der Kombikarte/Compact-Box können nur Spannungswerte
-zwischen 0.0V und 5.0V eingelesen werden. Auf der A/D-Karte kann der Bereich für
-die einzulesenden Sapnnungwerte durch die Schalterstellung auf der Karte eingestellt
-werden (Sehen Sie dazu auch Kapitel 5.3.1).
-
-
-#on("b")#
-REAL PROC wert von analogeingang (INT CONST kanal)
-#off("b")#
-
-Über den Parameter wird der Kanal angegeben, über den der analoge Eingang ange­
-sprochen werden kann; bei uns ist das der Kanal 1 (oder 2) auf der Kombikarte/
-Compact-Box. Geliefert werden Werte zwischen 0 und 255.
-
-Tatsächlich wird aber ein Spannungswert vom Analogeingang eingelesen. Dieser
-Spannungswert wird vom Analog-Digital-Wandler auf der Karte nach folgendem
-Verfahren gewandelt:
-#page#
-Dem größtmöglichen Spannungswert an diesem Eingang wird der Wert 255, dem
-kleinstmöglichen der Wert 0 zugeordnet. Das Intervall zwischen dem kleinst- und
-größtmöglichen Spannungswert wird in 255 gleichgroße Teilintervalle eingeteilt. Es
-wird nun die Nummer des Intervalls geliefert, in das die eingelesene Spannung fällt.
-Kleinst- und größtmögliche Spannungswerte sind abhängig von der aktuellen Steck­
-karte, Interface-Konfiguration).
-
-
-#on("b")#6.3  Hinweise auf Aufgabenmaterial#off("b")#
-
-Eine Fülle von Beispielanwendungen sind beschrieben in:
-
- Landesinstitut für Schule und Weiterbildung (Hrsg.), Materialien zur Lehrerfort­
- bildung in Nordrhein-Westfalen, Heft 2, Neue Technologien - Informations­
- technologische Inhalte im Wahlpflichtunterricht der Klassen 9/10, 2. über­
- arbeitete Auflage 1987
-
diff --git a/doc/prozess/gs-prozess-7 b/doc/prozess/gs-prozess-7
deleted file mode 100644
index db3b9d1..0000000
--- a/doc/prozess/gs-prozess-7
+++ /dev/null
@@ -1,1121 +0,0 @@
-limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (1)#
-#headodd#
-#center#gs-Prozess#right#%
-
-#end#
-#headeven#
-%#center#gs-Prozess
-
-#end#
-#center#1
-
-#on("b")#7  Beschreibung der Menufunktionen#off("b")#
-
-Nach Aufruf meldet sich #on("b")#gs-Prozess#off("b")# zunächst mit dem #on("b")#gs-DIALOG#off("b")#-Emblem. Kurze
-Zeit später erscheint das folgende Menu auf dem Bildschirm:
-
-+---------------------------------------------------------------------+
-| PDV:  Info Interface Programm Archiv |
-|-------+------------------------+------------------------------------+
-| | u  Übersicht Befehle | |
-| | --------------------- | |
-| | a  Ausgabebefehle | |
-| | e  Eingabebefehle | |
-| | t  Testbefehle | |
-| | w  Weitere Befehle | |
-| | --------------------- | |
-| | b  Bitmuster | |
-| | s  Symbole/Zeichen | |
-| | d  Digital-/Analogwerte| |
-| +------------------------+ |
-| |
-| +----------------------------------------+ |
-| | gs-Prozess | |
-| | Version 1.0 | |
-| | | |
-| | Copyright Ρ 1988 bei Eva Latta-Weber, | |
-| | Bielefeld | |
-| +----------------------------------------+ |
-+---------------------------------------------------------------------+
-|Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>|
-+---------------------------------------------------------------------+
-
-#center#Abb.22:  Eingangsbildschirm #on("b")#gs-Prozess#off("b")#
-
-
-Bevor wir Ihnen die Bedeutung der einzelnen Menupunkte erklären, geben wir erst
-noch einige grundsätzliche Hinweise zur Bedienung des Menusystems für diejenigen
-Leser, die im Umgang mit Menus unter #on("b")#gs-DIALOG#off("b")# nicht geübt sind.
-#page#
-#on("b")#7.1  Kurzhinweise zur Bedienung der Menus#off("b")#
-
-Die Bedienung des Menus ist sehr einfach. Eine ausführliche Beschreibung dazu
-finden Sie in den Unterlagen zum Programmsystem #on("b")#gs-DIALOG#off("b")#. An dieser Stelle
-sollen nur die wesentlichen Bedienungsvorgänge beschrieben werden.
-
-- Mit der Tastenfolge <ESC><?> können Sie sich Informationen zur Bedienung
- des Menusystems in das Menu einblenden lassen.
-
-- Mit den Pfeiltasten <rechts> und <links> können Sie zwischen den "Ober­
- begriffen" in der Kopfzeile wählen. Der aktuelle Oberbegriff ist jeweils invers
- dargestellt. Das ausgeklappte 'Pull-Down-Menu' bezieht sich auf diesen invers
- dargestellten Oberbegriff.
-
-- Mit den Pfeiltasten <hoch> und <runter> können Sie zwischen den Menu­
- funktionen wählen, die Ihnen im aktuellen Pull-Down-Menu zur Auswahl ange­
- boten werden. Die aktuell angewählte Menufunktion wird jeweils invers darge­
- stellt. Die Trennlinien, die in einigen Pull-Down-Menus sichtbar sind, dienen nur
- der optischen Untergliederung; sie können nicht angewählt werden und werden
- deshalb automatisch übersprungen. Die einzelnen Menupunkte sind "zyklisch
- miteinander verknüpft", das heißt, man gelangt vom untersten Menupunkt
- wieder zum obersten und umgekehrt. Menupunkte, vor denen ein Minuszeichen
- steht ('-'), sind (zur Zeit) nicht aktivierbar; auch sie können nicht angewählt
- werden und werden einfach übersprungen.
-
-- Durch Tippen der Fragezeichentaste (<?>) können Sie sich jeweils zur
- aktuellen Menufunktion (invers im Pull-Down-Menu) Informationen in das
- Menu einblenden lassen.
-
-- Um eine Menufunktion ausführen zu lassen, bewegen Sie sich mit den Pfeiltasten
- auf die gewünschte Menufunktion im aktuellen Pull-Down-Menu und tippen
- dann die <RETURN>-Taste. Steht vor dem gewünschten Menupunkt ein
-#page#
- einzelner Buchstabe oder eine Ziffer, so kann durch Tippen der entsprechenden
- Taste diese Menufunktion dadurch direkt aufgerufen werden. Sobald eine Menu­
- funktion aufgerufen worden ist, erscheint davor ein Stern ('*'). Daraus können
- Sie entnehmen, daß das System bereits den Auftrag ausführt.
-
-- An verschiedenen Stellen werden Fragen an Sie gerichtet, die Sie mit 'ja' oder
- 'nein' beantworten müssen. Tippen Sie dazu entsprechend der Entscheidung die
- Taste <j> (für 'ja') bzw. <n> (für 'nein').
-
-- Werden Ihnen vom Menu aus Dateinamen zur Auswahl angeboten, so können Sie
- den auf dem Bildschirm sichtbaren Pfeil vor den gewünschten Namen
- positionieren. Mit den Tasten <x> oder <RETURN> können Sie den Namen
- ankreuzen. Ist die Auswahl mehrerer Dateinamen möglich, so können Sie den
- Vorgang wiederholen. Mit den Tasten <o> oder <RUBOUT> können Sie auch
- ein Kreuz vor einem Namen wieder löschen. Daneben gibt es noch einige Ta­
- stenfunktionen, die für die Bedienung recht hilfreich sein können. Tippen Sie
- während der Auswahl die Fragezeichentaste (<?>), so werden Ihnen alle
- Bedienungsmöglichkeiten auf dem Bildschirm angezeigt. Eine Auswahl, in der
- mehrere Dateien angekreuzt werden dürfen, wird durch die Tastenfolge
- <ESC><q> verlassen. Anschließend wird die eingestellte Operation mit den
- angekreuzten Dateien ausgeführt. Sind Sie versehentlich in eine solche Auswahl
- gelangt, so können Sie den Vorgang durch die Tastenkombination <ESC><h>
- abbrechen.
-
-- An einigen Stellen werden Sie aufgefordert, eine Eingabe zu machen (z.B. einen
- Dateinamen einzugeben). Wird Ihnen hier ein Vorschlag gemacht, den Sie
- akzeptieren, so brauchen Sie zur Bestätigung nur die <RETURN>-Taste zu
- tippen. Gefällt Ihnen der Vorschlag nicht oder wird Ihnen kein Vorschlag ge­
- macht, so machen Sie bitte die gewünschte Eingabe. Zum Schreiben stehen
- Ihnen alle aus dem Editor bekannten Funktionen zur Verfügung. Mit der Taste
- <RUBOUT> können Sie Buchstaben löschen, mit <RUBIN> einfügen. Die
-#page#
- Eingabe wird durch Tippen der <RETURN>-Taste abgeschlossen. Ist der von
- Ihnen gewünschte Name schon in Ihrer Task vorhanden und steht in der Fußzeile
- der Hinweis 'Zeigen: <ESC><z>', dann können Sie sich auch alle vor­
- handenen Namen zur Auswahl anbieten lassen und durch Ankreuzen den beab­
- sichtigten Namen auswählen.
-
-- Ihnen können auch mehrere Alternativen angeboten werden, zwischen denen Sie
- wählen müssen. In der untersten Zeile eines solchen Kastens, in denen Ihnen die
- Alternativen auf dem Bildschirm eingeblendet werden, sind die Möglichkeiten
- aufgeführt, die darüber beschrieben sind. Mit den Pfeiltasten können sie die
- Markierung auf die gewünschte Alternative positionieren und dann durch die
- <RETURN>-Taste zur Ausführung bringen. (Manchmal ist das auch durch
- Tippen der den Alternativen vorangestellten Buchstaben oder Ziffern möglich).
-
-- Durch die Tastenfolge <ESC><q> kann das Menu insgesamt verlassen
- werden. Damit das nicht versehentlich geschieht, wird jeweils die Frage gestellt,
- ob Sie das Menu tatsächlich verlassen wollen. Diese Frage beantworten Sie bitte je
- nach Wunsch mit 'ja' oder 'nein' durch Tippen der Tasten <j> bzw. <n>.
-
-
-#on("b")#7.2  Menufunktionen zum Oberbegriff 'Info'#off("b")#
-
-Das auf dem Bildschirm sichtbare Pull-Down-Menu ist oben abgebildet.
-
-#on("b")#u   Übersicht Befehle#off("b")#
-
-Mit dieser Funktion können Sie sich eine Übersicht der Befehle, die Ihnen
-#on("b")#gs-Prozess#off("b")# zur Verfügung stellt, in den aktuellen Bildschirm einblenden lassen:
-#page#
-#free(2.0)#
- +------------------------------------------------------------+
- | Ausgabebefehle: Eingabebefehle: |
- | |
- | dezimalwert ausgeben dezimalwert |
- | bitmuster ausgeben bitmuster |
- | bitsymbol ausgeben bitsymbol |
- | spannungswert ausgeben spannungswert |
- | wert an analogausgang ausgeben wert von analogeingang |
- | |
- | |
- | Testbefehle: Weitere Befehle: |
- | |
- | bitmuster gleich initialisiere interface |
- | bit ist gesetzt warte |
- | |
- +------------------------------------------------------------+
-#center#Abb.23:  Befehlsübersicht
-
- Es werden 'Eingabebefehle', 'Ausgabebefehle' und 'Testbefehle' unterschieden.
- Darüberhinaus werden 'Weitere Befehle' angegeben. Eine ausführliche
- Beschreibung der einzelnen Befehle ist unter den gleichnamigen Menupunkten
- abrufbar.
-
-
-#on("b")#a   Ausgabebefehle#off("b")#
-
- Mit dieser Funktion können Sie sich die zur Verfügung stehenden Ausgabe­
- befehle detailliert erläutern lassen. Zuerst gelangen Sie in eine Auswahl, von
- der aus zu jedem einzelnen Ausgabebefehl eine Informationstafel abgerufen
- werden kann:
-#page#
-#free(2.0)#
- +-------------------------------------+
- | Ausgabebefehle: |
- | |
- | 1  dezimalwert ausgeben |
- | |
- | 2  bitmuster ausgeben |
- | 3  bitsymbol ausgeben |
- | |
- | 4  spannungswert ausgeben |
- | 5  wert an analogausgang ausgeben |
- | |
- | z  Zurück in das Menu |
- | |
- | 1   2   3   4   5   z |
- +-------------------------------------+
-
-#center#Abb.24:  Auswahl Ausgabebefehle
-
- Auf jeder Informationstafel ist ein kleines Beispiel zur Verwendung des Befehls
- angegeben, das auch erläutert wird. Anschließend wird ausführlich auf die
- Parameter der Befehle eingegangen (Datentyp, Wertebereich, etc.). Aus den
- einzelnen Informationstafeln gelangen Sie immer wieder zur Auswahl zurück.
- Wird die Auswahl selbst verlassen, gelangen Sie zurück ins Ausgangsmenu.
-
-
-#on("b")#e   Eingabebefehle#off("b")#
-
- Mit dieser Funktion können Sie sich die zur Verfügung stehenden Eingabe­
- befehle detailliert erläutern lassen. Zuerst gelangen Sie in eine Auswahl, von
- der aus zu jedem einzelnen Eingabebefehl eine Informationstafel abgerufen
- werden kann:
-#page#
-#free(1.0)#
- +------------------------------+
- | Eingabebefehle: |
- | |
- | 1  dezimalwert |
- | |
- | 2  bitmuster |
- | 3  bitsymbol |
- | |
- | 4  spannungswert |
- | 5  wert von analogeingang |
- | |
- | z  Zurück in das Menu |
- | |
- | 1   2   3   4   5   z |
- +------------------------------+
-
-
-#center#Abb.25:  Auswahl Eingabebefehle
-
- Auf jeder Informationstafel ist ein kleines Beispiel zur Verwendung des Befehls
- angegeben, das auch erläutert wird. Anschließend wird ausführlich auf die
- Parameter der Befehle (Datentyp, Wertebereich, etc.) und die Werte, die
- geliefert werden, eingegangen.
-
- Aus den einzelnen Informationstafeln gelangen Sie immer wieder zur Auswahl
- zurück. Wird die Auswahl selbst verlassen, gelangen Sie zurück ins Ausgangs­
- menu.
-
-
-#on("b")#t   Testbefehle#off("b")#
-
- Mit dieser Funktion können Sie sich die zur Verfügung stehenden Testbefehle
- detailliert erläutern lassen. Zuerst gelangen Sie in eine Auswahl, von der aus zu
- jedem einzelnen Testbefehl eine Informationstafel abgerufen werden kann:
-#page#
- +------------------------+
- | Testbefehle: |
- | |
- | 1  bitmuster gleich |
- | 2  bit ist gesetzt |
- | |
- | z  Zurück in das Menu |
- | |
- | 1   2   z |
- +------------------------+
-
-#center#Abb.26:  Auswahl Testbefehle
-
- Auf jeder Informationstafel ist ein kleines Beispiel zur Verwendung des Befehls
- angegeben, das auch erläutert wird. Anschließend wird ausführlich auf die
- Parameter der Befehle (Datentyp, Wertebereich, etc.) und die Werte, die ge­
- liefert werden, eingegangen.
- Aus den einzelnen Informationstafeln gelangen Sie immer wieder zur Auswahl
- zurück. Wird die Auswahl selbst verlassen, gelangen Sie zurück ins Ausgangs­
- menu.
-
-
-#on("b")#w   Weitere Befehle#off("b")#
-
- Hier werden noch weitere zur Verfügung stehende Befehle erläutert, die für die
- Programmierung ganz hilfreich sind. Zuerst gelangen Sie in eine Auswahl, von
- der aus zu jedem Befehl eine Informationstafel abgerufen werden kann:
-
-
- +----------------------------+
- | Weitere Befehle: |
- | |
- | 1  initialisiere interface |
- | 2  warte |
- | |
- | z  Zurück in das Menu |
- | |
- | 1   2   z |
- +----------------------------+
-
-#center#Abb.27:  Auswahl 'Weitere Befehle'
-#page#
- Aus den einzelnen Informationstafeln gelangen Sie immer wieder zur Auswahl
- zurück. Wird die Auswahl selbst verlassen, gelangen Sie zurück ins Ausgangs­
- menu.
-
-
-#on("b")#b   Bitmuster#off("b")#
-
- Nach Aufruf dieser Funktion wird der Aufbau der Bitmuster erläutert, die als
- Parameter übergeben oder auch von Prozeduren geliefert werden.
-
- Insbesondere wird auf die Numerierung der einzelnen Bits eingegangen.
-
-
-#on("b")#s   Symbole/Zeichen#off("b")#
-
- Nach Aufruf der Funktion werden die Zeichen erläutert, die bei der Be­
- schreibung von Bitmustern und Bitsymbolen Verwendung finden.
-
-
-#on("b")#d   Digital-/Analogwerte#off("b")#
-
- Bei den beiden Befehlen 'wert an analogausgang ausgeben' und 'wert von
- analogeingang', wird ein Wert zwischen 0 und 255 als Parameter übergeben
- bzw. von der Prozedur geliefert. Am Analogausgang wird aber eine Spannung
- ausgegeben bzw. eingelesen. Hier wird erläutert, wie die Spannungswerte
- innerhalb der Prozeduren gewandelt werden.
-
-
-#on("b")#7.3  Menufunktionen zum Oberbegriff 'Interface'#off("b")#
-
-Ãœber die Menufunktionen unter diesem Oberbegriff nehmen Sie die Konfiguration
-von #on("b")#gs-Prozess#off("b")# vor. Ebenso ist von hier aus ein Test des Interface-Systems möglich.
-#page#
-
-+-----------------------------------------------------------------------+
-| PDV:  Info Interface Programm Archiv |
-+-------+-------------------+-------------------------------------------+
-| | i  Informationen | |
-| | ---------------- | |
-| | k  Konfigurieren | |
-| | ---------------- | |
-| | a  Ausgabetest | |
-| | e  Eingabetest | |
-| +-------------------+ |
-| |
-| |
-| |
-+---------------------------------------------------------------------- +
-| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> |
-+-----------------------------------------------------------------------+
-
-#center#Abb.28:  Menubildschirm zum Oberbegriff 'Interface'
-
-
-#on("b")#i   Informationen#off("b")#
-
- Mit dieser Menufunktion können Sie sich zu jedem Zeitpunkt die aktuell
- eingestellte Konfiguration von #on("b")#gs-Prozess#off("b")# anzeigen lassen. Sie können er­
- sehen, welches Interface-System eingestellt ist, wie die Kanäle belegt und
- numeriert sind (sehen Sie das Beispiel in Abb.13).
-
- Ist eine Compact-Box oder ein Einzelsteckplatz eingestellt, erhalten Sie die
- Informationen direkt eingeblendet. Ist dagegen ein Mehrfachsteckplatz einge­
- stellt, gelangen Sie in eine Auswahl. Von hier aus können Sie Informationen zu
- jedem einzelnen Steckplatz getrennt abrufen.
-
- Fehlerfälle:
- - Wurde #on("b")#gs-Prozess#off("b")# bisher noch nicht konfiguriert, so erhalten Sie eine
- Warnung (sehen Sie Abb.11). In diesem Falle ist zunächst eine Konfigura­
- tion von #on("b")#gs-Prozess#off("b")# vorzunehmen (sehen Sie die Beschreibung zur
- nächsten Menufunktion).
-#page#
-#on("b")#k   Konfigurieren#off("b")#
-
- Mit dieser Menufunktion können Sie #on("b")#gs-Prozess#off("b")# auf das aktuell angeschlos­
- sene Interface-System einstellen. Dazu haben Sie verschiedene Angaben zu
- machen.
-
- Zunächst wird Ihnen eine Auswahl der Steckplatzart angeboten (sehen Sie
- dazu Abb.12). Hier können Sie zur Zeit zwischen Compact-Box, Einzelsteck­
- platz und Mehrfachsteckplatz wählen.
-
- Ist eine Compact-Box angeschlossen, ist mit der hier gemachten Angabe die
- Konfiguration abgeschlossen; die aktuelle Kanalbelegung wird Ihnen dann nur
- noch zur Information eingeblendet.
-
- Bei Einzel- und Mehrfachsteckplatz haben Sie noch anzugeben, welche Inter­
- facekarte eingesteckt ist. Beim Einzelsteckplatz ist diese Angabe nur einmal zu
- machen, beim Mehrfachsteckplatz halt mehrfach. Hierzu wird Ihnen aber
- ebenfalls eine Auswahl angeboten (sehen Sie Abb.14). Nach jeder vorge­
- nommenen Einstellung wird Ihnen zur Information die Kanalbelegung mitge­
- teilt. Sofern Sie eine A/D-Karte verwenden, wird noch die Schalterstellung auf
- der Karte erfragt, denn daraus kann #on("b")#gs-Prozess#off("b")# die eingestellte Eingangsem­
- pfindlichkeit ermitteln.
-
-
-#on("b")#a   Ausgabetest#off("b")#
-
- Mit dieser Menufunktion können Sie auf einfache Weise testen, ob Ihr Inter­
- face-System korrekte Ausgaben erzeugt. Nach Aktivieren der Menufunktion
- erhalten Sie die Möglichkeit, Ausgabewerte einzutragen (sehen Sie Abb.18).
- Jede Eintragung ist durch <RETURN> abzuschließen.
-
- Für den Ausgabetest sollte eine Leuchtdiodenanzeige zur Verfügung stehen, um
- die Ausgaben am Interface kontrollieren zu können. Für detailliertere Informa­
- tionen lesen Sie bitte unbedingt Kapitel 5.
-#page#
- Fehlerfälle:
- - Interface meldet sich nicht!
- Abhilfe: Überprüfen, ob der Adapter ordnungsgemäß angeschlossen
- und eingeschlatet ist (sehen Sie Kapitel 5). Wenn ein MUFI
- verwendet wird, MUFI aus- und nach kurzer Pause wieder
- einschalten. Noch einmal den Ausgabetest versuchen.
- - Interface-Kanal belegt!
- (Kann nur beim Betrieb von MUFI als Endgerät oder bei RS232-Adapter
- auftreten!)
- Abhilfe: Feststellen, welche Task an den Interface-Kanal gekoppelt ist
- ('taskinfo (2) <RETURN>') und diese dann abmelden
- ('break' oder 'end'). Die Nummer des Interfacekanals kann
- mit dem Kommando 'put (interfacekanal) <RETURN>'
- erfragt werden.
- - Sehen Sie bitte die detaillierte Fehlerliste in Kapitel 5.5.
-
-
-#on("b")#e   Eingabetest#off("b")#
-
- Mit dieser Menufunktion können Sie auf einfache Weise testen, ob über Ihr
- Interface-System korrekte Eingaben möglich sind. Nach Aktivieren der Menu­
- funktion erhalten Sie die Möglichkeit, am Interface angelegte Eingabewerte
- abzulesen (sehen Sie Abb.19).
-
- Für den Eingabetest sollte ein Codekartenleser oder zumindest ein kurzer
- Draht zur Verfügung stehen. Für detailliertere Informationen lesen Sie bitte
- unbedingt Kapitel 5.
-
- Fehlerfälle:
- - Interface meldet sich nicht!
- Abhilfe: Überprüfen, ob der Adapter ordnungsgemäß angeschlossen
- und eingeschlatet ist (sehen Sie Kapitel 5). Wenn ein MUFI
- verwendet wird, MUFI aus- und nach kurzer Pause wieder
- einschalten. Noch einmal den Ausgabetest versuchen.
-#page#
- - Interface-Kanal belegt!
- (Kann nur beim Betrieb von MUFI als Endgerät oder bei RS232-Adapter
- auftreten!)
- Abhilfe: Feststellen, welche Task an den Interface-Kanal gekoppelt ist
- ('taskinfo (2) <RETURN>') und diese dann abmelden
- ('break' oder 'end'). Die Nummer des Interfacekanals kann
- mit dem Kommando 'put (interfacekanal) <RETURN>'
- erfragt werden.
- - Sehen Sie bitte die detaillierte Fehlerliste in Kapitel 5.5.
-
-
-#on("b")#7.4  Menufunktionen zum Oberbegriff 'Programm'#off("b")#
-
-
-+-------------------------------------------------------------------------+
-| PDV:  Info Interface Programm Archiv |
-|---------------------+---------------------+-----------------------------|
-| | n  Neu erstellen | |
-| | a  Ansehen/Ändern | |
-| | | |
-| | s  Starten | |
-| | w  Wiederholen | |
-| | | |
-| | v  Verzeichnis | |
-| | | |
-| | l  Löschen | |
-| | d  Drucken | |
-| | | |
-| | k  Kopieren | |
-| | u  Umbenennen | |
-| +---------------------+ |
-|-------------------------------------------------------------------------|
-| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> |
-+-------------------------------------------------------------------------+
-
-#center#Abb.29:  Menubildschirm zum Oberbegriff 'Programm'
-#page#
-#on("b")#n   Neu erstellen#off("b")#
-
- Mit dieser Funktion können Sie eine neue Programmdatei anlegen und be­
- schreiben.
-
- Sie werden zunächst nach einem Namen für die #on("b")#neue#off("b")# Programmdatei gefragt.
- Geben Sie einen beliebigen Namen (#on("b")#ohne Anführungszeichen (!)#off("b")#) ein und
- schließen Sie die Eingabe durch <RETURN> ab. Daraufhin wird Ihnen auf
- dem Bildschirm eine neue Datei zum beschreiben angeboten.
-
- Sollte schon eine Programmdatei mit diesem Namen in der Task vorhanden
- sein, so werden Sie darauf aufmerksam gemacht.
-
- Sie können sich während des Schreibens die wichtigsten Tastenfunktionen des
- Editors einblenden lassen. Tippen Sie dazu die Tastenfolge <ESC><?>. Es
- erscheint dann das folgende Angebot aus dem Sie auswählen können:
-
-
- +------------------------------------------------+
- | Der EUMEL - Editor |
- | |
- | b ... Beschreibung desEditors |
- | w ... Wichtige Tasten |
- | p ... Positionieren der Schreibmarke |
- | k ... Korrigieren im Text (Einfügen/Löschen) |
- | m ... Markierte Textpassagen bearbeiten |
- | l ... Lernen im Editor |
- | a ... Anweisungen im Editor (Kommandodialog) |
- | |
- | z ... Zurück in den Schreibmodus |
- | |
- | b   w   p   k   m   l   a   z |
- | |
- +------------------------------------------------+
-
-#center#Abb.30:  Informationsauswahl zum EUMEL-Editor
-#page#
- Fehlerfälle:
- - Eine Datei mit dem vorgeschlagenen Namen existiert schon.
-
-
-#on("b")#a   Ansehen/Ändern#off("b")#
-
- Mit dieser Funktion können Sie sich Dateien, die schon in Ihrer Task
- existieren, ansehen oder auch verändern.
-
- Sie werden zunächst gefragt, ob Sie #on("b")#die zuletzt bearbeitete Programmdatei#off("b")#
- ansehen bzw. verändern möchten (sofern Sie schon vorher mit #on("b")#gs-Prozess#off("b")# in
- der Task gearbeitet haben).
-
- Bejahen Sie diese Frage, dann wird Ihnen diese Programmdatei zur Be­
- arbeitung angeboten. Verneinen Sie die Frage dagegen, so gelangen Sie in die
- 'Auswahl' (d.h es werden Ihnen alle Programmdateien in der Task zur Auswahl
- angeboten). Nachdem Sie einen der Namen angekreuzt haben, wird Ihnen die
- ausgewählte Programmdatei zur Bearbeitung auf dem Bildschirm angebo­
- ten.
-
- Fehlerfälle:
- - In der Task existiert noch keine Programmdatei.
-
-
-#on("b")#s   Starten#off("b")#
-
- Mit dieser Menufunktion können Sie eine Programmdatei übersetzen und
- ausführen lassen.
-
- Sie werden zunächst gefragt, ob #on("b")#das zuletzt bearbeitete Programm#off("b")# ausgeführt
- werden soll. Bejahen Sie die Frage, so wird dieses Programm gestartet; ver­
- neinen Sie die Frage dagegen, so gelangen Sie in die 'Auswahl'. Nach An­
- kreuzen des gewünschten Programmnamens wird das ausgewählte Programm
- ausgeführt.
-#page#
- Sind im Programm noch Fehler enthalten, so werden das Programm und die
- Fehlermeldungen gleichzeitig auf dem Bildschirm dargestellt (Paralleleditor)
- und zur Korrektur angeboten. Für die Programmkorrektur stehen ebenfalls alle
- Editorfunktionen zur Verfügung.
-
- Sollte Ihnen beim Programmieren ein Fehler unterlaufen sein (z.B. eine
- Endlosschleife), so kann mit der Tastenfolge <ESC><h> der Programmlauf
- abgebrochen werden ("Notbremse").
-
-
-#on("b")##on("b")#w   Wiederholen#off("b")#
-
- Mit dieser Funktion können Sie den Ablauf des zuletzt ausgeführten
- Programms wiederholen, ohne daß das Programm neu übersetzt wird.
-
- Beachten Sie aber bitte, daß Veränderungen am Programmtext, die seit dem
- letzten Prtogrammlauf vorgenommen wurden, #on("b")#nicht#off("b")# berücksichtigt werden;
- dazu muß das Programm erneut mit der Menufunktion 's Starten' übersetzt
- werden.
-
- Ist die Wiederholung eines Programmlaufs nicht möglich, so erfolgt ein Hin­
- weis darauf.
-
-
-#on("b")#v   Verzeichnis#off("b")#
-
- Mit dieser Funktion können Sie sich einen Überblick über die in Ihrer Task
- vorhandenen Programmdateien verschaffen.
-
- Nach Aufruf dieser Funktion wird eine Liste der Programmdateien auf dem
- Bildschirm ausgegeben, die sich in Ihrer Task befinden. Da die Liste selbst
- eine Datei ist, kann Sie mit der Tastenkombination <ESC><q> verlassen
- werden - hierauf wird auch in der Kopfzeile der Datei hingewiesen. Falls nicht
- alle Namen auf den Bildschirm passen, können Sie das Fenster mit
- <HOP><runter> und <HOP><hoch> verschieben.
-#page#
-#on("b")#l   Löschen#off("b")#
-
- Mit dieser Funktion können Sie Programmdateien, die Sie nicht mehr
- benötigen, die unnötig Platz belegen, löschen. Aber Vorsicht! Die Programm­
- dateien verschwinden durch diese Funktion unwiederbringlich!
-
- Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in
- Ihrer Task befinden, zur Auswahl angeboten. Hier können Sie die gewünschten
- Namen ankreuzen. Die Auswahl wird dann durch die Tastenfolge
- <ESC><q> verlassen.
-
- Für jede einzelne Programmdatei wird noch einmal zur Sicherheit gefragt, ob
- sie auch tatsächlich gelöscht werden soll. Zur Bestätigung tippen Sie bitte die
- Taste <j> ('ja') - zur Verhinderung <n> ('nein').
-
- Fehlerfälle:
- - In der Task exsitiert noch keine Programmdatei.
-
-
-#on("b")#d   Drucken#off("b")#
-
- Mit dieser Funktion können Sie Programmdateien über einen angeschlossenen
- Drucker ausgeben lassen.
-
- Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in
- Ihrer Task befinden, zur Auswahl angeboten. Hier können Sie die gewünschten
- Namen ankreuzen. Die Auswahl wird dann durch die Tastenfolge
- <ESC><q> verlassen.
-
- Die angekreuzten Programmdateien werden anschließend zum Drucker ge­
- schickt. Der Vorgang wird auf dem Bildschirm protokolliert.
-#page#
- Fehlerfälle:
- - In der Task existiert noch keine Programmdatei.
- - Der Drucker ist nicht funktionsbereit.
- - Der Drucker wird nicht über die Task 'PRINTER' betrieben.
- - Auf Ihrem System werden die Druckkosten abgerechnet. Sie müssen sich
- mit einer Codenummer identifizieren.
-
-
-#on("b")#k   Kopieren#off("b")#
-
- Mit dieser Funktion können Sie sich eine Kopie einer bereits in der Task
- vorhandenen Programmdatei anlegen. Das ist z.B. dann sinnvoll, wenn Sie sich
- einen bestimmten 'Stand' aufbewahren wollen oder wenn Sie ein Programm
- schreiben wollen, das einem bereits vorhandenen ähnelt.
-
- Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in
- Ihrer Task befinden, zur Auswahl angeboten. Nach Ankreuzen eines Namens
- wird die Auswahl automatisch verlassen.
-
- Anschließend wird der angekreuzte Name angezeigt und der Name für die
- Kopie erfragt. Es muß ein Name eingetragen werden, der in dieser Task noch
- nicht für eine Programmdatei vergeben wurde; ansonsten erfolgt ein Hinweis
- darauf und es wird nicht kopiert!
-
- Da man aber oft für die Kopie einen ähnlichen Namen wie für das Original
- wählt, wird der 'alte' Name vorgeschlagen. Aus genannten Gründen muß er
- aber verändert werden. Sie können diesen Namen mit den üblichen Editier­
- funktionen verändern oder mit <HOP><RUBOUT> löschen und ganz neu
- eingeben. Sie sparen aber eine Menge Tipparbeit, wenn Sie einen langen
- Namen nur an einer Stelle ändern wollen.
-
- Fehlerfälle:
- - Eine Programmdatei mit dem gewünschten Namen existiert bereits in der
- Task.
-#page#
-#on("b")#u   Umbenennen#off("b")#
-
- Mit dieser Funktion können Sie einer bereits vorhandenen Programmdatei
- einen neuen Namen geben.
-
- Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in
- Ihrer Task befinden, zur Auswahl angeboten. Nach Ankreuzen eines Namens
- wird die Auswahl automatisch verlassen.
-
- Anschließend wird dieser Name angezeigt und der zukünftige Name für die
- Programmdatei erfragt. Es muß ein Name eingetragen werden, der in dieser
- Task noch nicht für eine Programmdatei vergeben wurde - ansonsten erfolgt
- ein Hinweis darauf und die Programmdatei wird nicht umbenannt!
-
- Da man aber oft den 'neuen' Namen in Anlehnung an den 'alten' Namen
- wählt, wird der 'alte' Name vorgeschlagen. Aus genannten Gründen muß er
- aber verändert werden. Sie können diesen Namen mit den üblichen Editier­
- funktionen verändern oder mit <HOP><RUBOUT> löschen und ganz neu
- eingeben. Sie sparen aber eine Menge Tipparbeit, wenn Sie einen langen
- Namen nur an einer Stelle ändern wollen.
-
- Fehlerfälle:
- - Eine Programmdatei mit dem gewünschten Namen existiert bereits in der
- Task.
-#page#
-#on("b")#7.5  Menufunktionen zum Oberbegriff 'Archiv'#off("b")#
-
-
-+-----------------------------------------------------------------------+
-| PDV:  Info Interface Programm Archiv |
-|------------------+------------------------+---------------------------|
-| | r  Reservieren | |
-| | -  Neue Diskette | |
-| | | |
-| | -  Schreiben | |
-| | -  Checken | |
-| | -  Kombination | |
-| | -  Holen/Lesen | |
-| | -  Löschen | |
-| | | |
-| | -  Verzeichnis | |
-| | -  Drucken | |
-| | | +---------------------+ |
-| | i  Initialisieren | | Dateiaustausch mit:| |
-| | z  Zieltask einstellen | | Archiv | |
-| +------------------------+ | Archivname: | |
-| | __________ | |
-| +---------------------+ |
-|-----------------------------------------------------------------------|
-| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> |
-+-----------------------------------------------------------------------+
-
-#center#Abb.31:  Menubildschirm zum Oberbegriff 'Archiv'
-
-
-In diesem Kapitel werden alle die Menufunktionen beschrieben, die Ihnen unter dem
-Oberbegriff 'Archiv' im Menu angeboten werden. Mit den Funktionen in diesem Menu
-können Sie aber nicht nur Dateien auf dem Archiv behandeln, sondern auch in
-anderen Tasks im Multi-User-System oder über das EUMEL-Netz sogar auf anderen
-Rechnern!
-
-Wenn Sie dieses Pull-Down-Menu gerade aufgeschlagen haben, sind nicht alle Funk­
-tionen aktivierbar! Um weitere Funktionen zu aktivieren, muß erst einer der aktivier­
-baren Menupunkte gewählt werden.
-#page#
-#on("b")#r   Reservieren#off("b")# (des Archivlaufwerks)
-
- Im EUMEL-Multi-User-System haben normalerweise mehrere Personen das
- Zugriffsrecht auf das Archivlaufwerk. Allerdings muß der Zugriff so geregelt
- werden, daß sich die Beteiligten dabei nicht gegenseitig "in die Quere
- kommen". Ein Zugriff auf das Archivlaufwerk erfordert zunächst eine An­
- meldung. Ist diese Anmeldung erfolgt, kann von den anderen Beteiligten so
- lange nicht mehr auf das Laufwerk zugegriffen werden, bis es wieder freige­
- geben worden ist.
-
- Diese Anmeldung des Archivlaufwerkes erfolgt über die Menufunktion 'r Reser­
- vieren'. Greift bereits eine andere Task auf das Laufwerk zu, so erhalten Sie
- darüber einen Hinweis auf dem Bildschirm. Ansonsten wird an Sie die Frage
- gestellt, ob die Diskette eingelegt und das Laufwerk geschlossen ist.
-
- Erst zu diesem Zeitpunkt ist sichergestellt, daß Sie den alleinigen Zugriff auf
- das Laufwerk haben. Deshalb sollten Sie, wenn Sie mit mehreren Personen am
- Computer arbeiten, erst zum Zeitpunkt der Fragestellung die Diskette ins
- Laufwerk einlegen.
-
- Nachdem Sie die Diskette eingelegt und die Frage bejaht haben, ermittelt das
- System selbständig den Namen der eingelegten Diskette, zeigt den Namen auf
- dem Bildschirm (im kleinen Kasten unten) an und aktiviert die anderen
- Menupunkte des Pull-Down-Menus.
-
- Beim Verlassen des Pull-Down-Menus, wenn eine andere Zieltask eingestellt
- wird oder wenn das Menu gänzlich verlassen wird, wird die Reservierung
- automatisch aufgehoben!
-#page#
- Fehlerfälle:
- - Das Laufwerk ist von einer anderen Task belegt.
- - Die Diskette ist falsch eingelegt oder das Laufwerk ist nicht richtig ge­
- schlossen.
- - Die Diskette ist nicht formatiert bzw. initialisiert.
- - Die Diskette kann nicht gelesen werden (keine EUMEL-Diskette, Diskette
- hat ein falsches Format, Diskette ist verschmutzt...).
-
-
-#on("b")#n   Neue Diskette#off("b")# (anmelden)
-
- Der Dateiaustausch mit einer Diskette ist nur dann möglich, wenn der im
- System eingestellte Diskettenname (auf dem Bildschirm im kleinen Kasten
- unten sichtbar) mit dem tatsächlichen Namen der Diskette übereinstimmt.
- Nach einem Diskettenwechsel ist das aber in der Regel nicht mehr der Fall.
- Greift man dann auf die neu eingelegte Diskette zu, so erscheint die Fehlermel­
- dung: 'Falscher Archivname! Bitte neue Diskette anmelden!'.
-
- Das Anmelden einer neuen Diskette - ohne einen neuen Reservierungsvorgang
- - wird durch diese Menufunktion ermöglicht. Nach Aktivieren dieses Menu­
- punktes wird der Name der eingelegten Diskette ermittelt, im System eingestellt
- und auf dem Bildschirm angezeigt.
-
- Im Gegensatz zur Menufunktion 'r Reservieren' greift das System ohne Anfrage
- an den Benutzer auf das Archivlaufwerk zu (die Reservierung bleibt ja
- bestehen). Ist das Archivlaufwerk reserviert, so ist die Neuanmeldung einer
- Diskette über diese Menufunktion weniger zeitaufwendig.
-
- Fehlerfälle:
- - wie unter 'r Reservieren'.
-#page#
-#on("b")#s   Schreiben#off("b")# (Kopieren)
-
- Alle Dateien der eigenen Task werden zur Auswahl angeboten. Wenn Sie die
- Auswahl durch die Tastenfolge <ESC><q> verlassen, überprüft das System
- zunächst, ob die Dateien in der eingestellten Zieltask schon vorhanden sind. Ist
- das der Fall, wird erfragt, ob die dort vorhandenen Dateien überschrieben, d.h.
- gelöscht werden dürfen (s.u.). Anschließend werden alle angekreuzten Dateien
- in der Reihenfolge, in der Sie sie angekreuzt haben, in die eingestellte Zieltask
- kopiert. Der Vorgang wird auf dem Bildschirm protokolliert. Die Original­
- dateien in der eigenen Task bleiben dabei erhalten.
-
- Wenn in der Zieltask schon eine Datei existiert, die den gleichen Namen hat
- wie eine Datei, die Sie dorthin kopieren möchten, so wird angefragt, ob die
- vorher schon existierende Datei überschrieben (gelöscht!) werden soll. Bejahen
- Sie diese Frage, so wird die bereits in der Zieltask existierende Datei (un­
- wiederbringlich) gelöscht und die gewünschte Datei dorthin transportiert. Ein
- Überschreiben aus Versehen ist nicht möglich, wenn Sie die an Sie gestellte
- Frage sorgfältig beantworten.
-
- Verneinen Sie die Frage, so wird die Datei auch nicht hinübertransportiert! Sie
- können die Datei aber umbenennen (Menufunktion 'u Umbenennen' unter
- den Oberbegriffen 'Landschaft'/Arbeitsfeld' bzw. 'Programm') und an­
- schließend mit anderem Namen hinüberschreiben.
-
- Beachten Sie, daß beim Überschreiben einer Datei auf einer Archivdiskette der
- Speicherplatz der alten (überschriebenen) Version im allgemeinen nicht
- wiederverwendet werden kann. In einem solchen Fall könnte die Diskette voll
- geschrieben werden, obwohl eigentlich genügend Platz vorhanden wäre. Zur
- Optimierung wird deshalb zuerst überprüft, ob die angekreuzten Dateien
- schon in der Zieltask vorhanden sind und löscht diese, wenn Sie Ihr Einver­
- ständnis geben. Erst anschließend werden die Dateien insgesamt kopiert.
-#page#
- Normalerweise ist als Zieltask das Archivlaufwerk der eigenen Station einge­
- stellt. Mit der Menufunktion 'z Zieltask einstellen' kann diese Einstellung aber
- verändert werden.
-
- Fehlerfälle:
- - Die Diskette ist falsch eingelegt oder beschädigt.
- - Die Diskette kann nicht beschrieben werden (Schreibfehler).
- - Die Diskette ist voll.
- - Sehen Sie auch unter 'r Reservieren'
- 'z Zieltask einstellen'.
-
-
-#on("b")#c   Checken#off("b")#
-
- Diese Menufunktion kann nur ausgeführt werden, wenn der Dateiaustausch
- mit einem Archiv(manager) erfolgt - ansonsten ist diese Menufunktion auch
- nicht aktivierbar. Die Menufunktion dient dazu, auf Diskette geschriebene
- Dateien auf Lesefehler hin zu prüfen. Es empfiehlt sich, diese Prüfroutine auf
- neu auf die Diskette geschriebene Dateien anzuwenden. Sehen Sie dazu auch
- 'k Kombination'.
-
- Alle Dateien der eingestellten Zieltask (Archiv) werden zur Auswahl angeboten.
- Wenn Sie die Auswahl durch die Tastenfolge <ESC><q> verlassen, werden
- alle angekreuzten Dateien in der Reihenfolge, in der Sie sie angekreuzt haben,
- "gecheckt", d.h. auf Lesefehler hin überprüft. Der Vorgang wird auf dem Bild­
- schirm protokolliert.
-
- Fehlerfälle:
- - Lesefehler auf dem Archiv.
- - Sehen Sie auch unter 'r Reservieren'.
-
-#page#
-#on("b")#k   Kombination#off("b")#
-
- Diese Menufunktion ist eine Kombination aus den beiden Menufunktionen 's
- Schreiben' und 'c Checken' (Sehen Sie weitere Informationen auch dort!).
-
- Alle Dateien der eigenen Task werden zur Auswahl angeboten. Wenn Sie die
- Auswahl durch die Tastenfolge <ESC><q> verlassen, werden alle ange­
- kreuzten Dateien in der Reihenfolge, in der Sie sie angekreuzt haben, in die
- eingestellte Zieltask kopiert (gegebenenfalls müssen bereits vorhandene
- Dateien gleichen Namens in der Zieltask gelöscht werden). Anschließend
- werden alle Dateien, die gerade geschrieben wurden, gecheckt, d.h. auf Lese­
- fehler hin untersucht. Beide Vorgänge werden auf dem Bildschirm
- protokolliert.
-
- Da die 'Check' - Operation nur bei Archivmanagern zulässig ist, ist diese Menu­
- funktionen ebenfalls nur bei Archivmanagern aktivierbar. Zur Erläuterung
- sehen Sie bitte auch unter 'z Zieltask einstellen'.
-
-
-#on("b")#h   Holen/Lesen#off("b")#
-
- Die Menufunktion dient dazu, Dateien, die bereits auf einer Archivdiskette oder
- in einer anderen Task existieren, in die eigene Task zu kopieren.
-
- Alle Dateien der eingestellten Zieltask werden zur Auswahl angeboten. An­
- schließend werden Kopien der angekreuzten Dateien in der Reihenfolge des
- Ankreuzens in die eigene Task geholt. Das Original in der Zieltask bleibt dabei
- unverändert! Der Vorgang wird auf dem Bildschirm protokolliert.
-
- Sind in der eigenen Task schon Dateien mit gleichem Namen vorhanden, so
- wird gefragt, ob die 'alten' Dateien überschrieben (gelöscht) werden dürfen.
- Nur wenn Sie zustimmen, werden die in Ihrer Task existierenden Dateien
- (unwiederbringlich!) gelöscht und Kopien der gleichnamigen Dateien aus der
- Zieltask angefertigt.
-#page#
- Stimmen Sie dem Löschvorgang nicht zu, dann bleiben die bisherigen Dateien
- in Ihrer Task erhalten - die Dateien aus der Zieltask werden dann aber auch
- nicht in Ihre Task kopiert! Um dennoch die Kopien zu erhalten, können Sie die
- namensgleichen Dateien in Ihrer Task umbenennen und dann erst die Dateien
- aus der anderen Task anfordern.
-
- Normalerweise werden die Dateien vom Archiv der eigenen Station geholt. Mit
- dem Menupunkt 'z Zieltask einstellen' kann diese Einstellung verändert
- werden.
-
- Fehlerfälle:
- - Lesefehler auf dem Archiv.
- - Sehen Sie auch unter 'r Reservieren'
- 's Schreiben'
- 'z Zieltask einstellen'.
-
-
-#on("b")#l   Löschen#off("b")#
-
- Die Menufunktion dient dazu, Dateien in der Zieltask (unwiederbringlich!) zu
- löschen. Dazu werden alle Dateien der eingestellten Zieltask zur Auswahl ange­
- boten. Anschließend werden die angekreuzten Dateien in der Reihenfolge ihres
- Ankreuzens gelöscht. Zur Sicherheit muß noch einmal für jede einzelne Datei
- bestätigt werden, daß sie auch tatsächlich gelöscht werden soll.
-
- Beachten Sie, daß beim Löschen einer Datei auf einer Archivdiskette der
- Speicherplatz im allgemeinen nicht wieder verwendet werden kann. In einem
- solchen Fall könnte die Diskette voll geschrieben werden, obwohl eigentlich
- genügend Platz vorhanden wäre. Diese Probleme treten bei anderen Tasks, die
- keine Archivmanager sind, nicht auf, da deren Speicherplatz intelligenter
- verwaltet wird.
-#page#
- Normalerweise ist als Zieltask das Archiv der eigenen Station eingestellt. Mit
- dem Menupunkt 'z Zieltask einstellen' kann diese Einstellung verändert
- werden.
-
- Fehlerfälle:
- - Sehen Sie auch unter 'r Reservieren'
- 's Schreiben'
- 'z Zieltask einstellen'.
-
-
-#on("b")#v   Verzeichnis#off("b")#
-
- Mit dieser Menufunktion können Sie sich einen Überblick über die in der
- Zieltask (z.B. auf dem Archiv) vorhandenen Dateien verschaffen.
-
- Nach Aufruf der Funktion wird eine Liste der Dateien auf dem Bildschirm
- ausgegeben, die sich in der Zieltask (z.B. auf dem Archiv) befinden. Ist die
- Zieltask ein Archiv(manager), so wird auch angezeigt, wieviel Platz auf der
- Diskette belegt ist. Da die Liste selbst eine Datei ist, kann sie mit der Tasten­
- kombination <ESC><q> verlassen werden. Falls nicht alle Dateinamen auf
- den Bildschirm passen, können Sie das Fenster mit <HOP><hoch> und
- <HOP><runter> verschieben.
-
- Fehlerfälle:
- - Sehen Sie unter 'z Zieltask einstellen'.
-
-
-#on("b")#d   Drucken#off("b")#
-
- Das Verzeichnis der Dateien in der Zieltask, das man mit der Menufunktion 'v
- Verzeichnis' auf dem Bildschirm angezeigt bekommt, kann mit dieser Menu­
- funktion ausgedruckt werden.
-#page#
- Zur Sicherheit wird angefragt, ob wirklich ein solches Dateiverzeichnis der
- Zieltask gedruckt werden soll. Bejaht man die Frage, so wird ein Dateiver­
- zeichnis erstellt und zum Drucker geschickt.
-
- Fehlerfälle:
- - Der Drucker ist nicht funktionsbereit.
- - Der Drucker wird nicht über die Task 'PRINTER' betrieben.
- - Auf Ihrem System werden die Druckkosten abgerechnet. Sie müssen sich
- mit einer Codenummer identifizieren.
-
-
-#on("b")#i  Initialisieren#off("b")#
-
- Diese Menufunktion gestattet es, frische Disketten zu formatieren, zu
- initialisieren bzw. beschriebene Disketten vollständig zu löschen und ggf. dabei
- umzubenennen. Bei Aufruf dieser Menufunktion wird - sofern noch nicht
- geschehen - das Archivlaufwerk automatisch reserviert.
-
- Wenn Sie eine fabrikneue Diskette aus der Verpackung nehmen, müssen Sie
- diese zunächst #on("b")#formatieren#off("b")#. Dabei wird die Diskette auf ein festgelegtes
- physikalisches Format eingestellt. Ohne daß diese Operation vorausgegangen
- ist, kann eine Diskette weder beschrieben noch gelesen werden.
-
- Prinzipiell braucht eine Diskette nur ein einziges Mal formatiert zu werden. Sie
- können Sie jedoch jederzeit wieder formatieren - z.B. wenn Sie Disketten ha­
- ben, von denen Sie nicht genau wissen, für welche Zwecke sie zuvor verwendet
- wurden.
-
- Wenn Sie diese Menufunktion aktivieren, werden Sie so zunächst gefragt, ob Sie
- die Diskette auch formatieren wollen. Bejahen Sie die Frage, so werden Ihnen
- mehrere Formate zur Auswahl angeboten:
-#page#
- +----------------------------------+
- | Formatieren einer Diskette |
- | |
- | Dies sind die möglichen Formate: |
- | |
- | 1 .... 40 Spur - 360 KB |
- | 2 .... 80 Spur - 720 KB |
- | 3 .... 5 1/4" - 1,2 MB |
- | 4 .... 3 1/2" - 1,4 MB |
- | s .... Standard - Format |
- | |
- | |
- | 1   2   3   4   s |
- +----------------------------------+
-
-#center#Abb.32:  Auswahl der Archiv-Formate
-
- Erkundigen Sie sich bei Ihrem Händler, welches Format Sie bei Ihrem Rechner
- und den von Ihnen verwendeten Disketten einstellen müssen. Manche Rechner
- unterstützen diese Operation innerhalb des EUMEL-Systems auch gar nicht,
- das Formatieren muß dann irgendwie anders außerhalb des EUMEL-Systems
- geschehen.
-
- Wenn Sie die Formatierung abgeschlossen oder auch übersprungen haben,
- beginnt die eigentliche Initialisierung der Diskette. Dabei wird als erstes der
- Archivname auf die Diskette geschrieben. Alle alten Daten, die sich ggf. auf der
- Diskette befinden, werden bei diesem Vorgang unwiederbringlich (!) gelöscht.
-
- Zur Sicherheit überprüft das System in jedem Falle, ob es sich um eine EUMEL
- - Diskette handelt, und erfragt Ihr Einverständnis, ob die Diskette wirklich
- initialisiert werden soll. Geben Sie hierzu Ihr Einverständnis, dann wird noch
- der (neue) Archivname erfragt. Hatte die Diskette schon einen Namen, dann
- wird dieser zum Ãœberschreiben angeboten. Wollen Sie den alten Archivnamen
- beibehalten, so brauchen Sie nur die <RETURN>-Taste zu tippen, ansonsten
- können Sie den Namen auch zuvor verändern oder einen ganz neuen Namen
- hinschreiben. Anhand des ausgegebenen Namens können Sie auch über­
- prüfen, ob Sie die richtige Diskette eingelegt haben.
-#page#
- Das Initialisieren funktioniert natürlich nur, wenn Sie als Zieltask einen
- Archivmanager eingestellt haben - ansonsten ist diese Menufunktion gesperrt
- (nicht aktivierbar!).
-
- Fehlerfälle:
- - Formatieren ist nicht auf dem System möglich.
- - Sehen Sie auch unter 'r Reservieren'
- 'z Zieltask einstellen'.
-
-
-#on("b")#z   Zieltask einstellen#off("b")#
-
- Mit dieser Menufunktion können Sie festlegen, mit welcher Zieltask Sie
- kommunizieren, d.h. z.B. Dateien austauschen möchten. Normalerweise ist hier
- das Archiv am eigenen Rechner eingestellt. Das wird auch nach Aufklappen des
- Pull-Down-Menus im Kasten unten angezeigt.
-
- Diese Menufunktion kann im Unterricht z.B. dazu genutzt werden, um fertig­
- gestellte Hausaufgaben in eine bestimmte Task zu schicken (Vatertask) oder um
- von dort z.B. vorgefertigte Landschaften oder/und Programme abzuholen.
-
- Sie können aber auch eine andere Task einstellen (z.B. die Vatertask oder die
- Task 'PUBLIC'), um mit diesen Dateien auszutauschen oder um sich auch nur
- einen Überblick über die dort vorhandenen Dateien zu verschaffen. Wenn Sie
- mit Ihrem Rechner in ein EUMEL-Netz integriert sind, können Sie auch auf
- Tasks anderer Rechner zugreifen oder auch Disketten von Laufwerken anderer
- Rechner einlesen (z.B. wenn Sie Disketten anderer Formate haben, die von
- Ihrem Rechner nicht gelesen werden können).
-
- Dabei werden zwei Anforderungen an die Zieltask gestellt: Sie muß existieren
- und bereit für den Dateiaustausch sein, d.h es muß eine Managertask sein, auf
- die Sie Zugriff haben. Versuchen Sie auf andere Tasks zuzugreifen, so erhalten
- Sie entsprechende (Fehler-)Meldungen.
-#page#
- Zu beachten ist noch, daß es im EUMEL-System verschiedene Arten von
- Managertasks gibt - Archivmanager und normale Dateimanager. Der Unter­
- schied besteht darin, daß ein Archivmanager vom Benutzer vor dem Zugriff
- reserviert werden muß - anschließend hat nur dieser Benutzer (bis zur Aufgabe
- der Reservierung) ein Zugriffsrecht auf den Manager. Normale Dateimanager
- können dagegen von mehreren Benutzern in beliebiger Reihenfolge ange­
- sprochen werden.
-
- Ein Archivmanager kann auch auf bestimmte Diskettenformate spezialisert sein
- (z.B. auf das Lesen von DOS-Disketten). Manche Rechner haben auch mehrere
- Archivmanager für verschiedene Laufwerke etc. Durch Einstellen unterschied­
- licher Archivmanager können Sie dann auf verschiedenen Laufwerken
- archivieren.
-
- Nach Aktivieren dieses Menupunktes werden Ihnen die folgenden Alternativen
- angeboten:
-
-
- +-----------------------------------------+
- | Dateiaustausch gewünscht mit: |
- | |
- | a ...   Archiv (Eigene Station) |
- | |
- | v ...   Vatertask |
- | |
- | p ...   'PUBLIC' (Eigene Station) |
- | |
- | s ...   Sonstige Task |
- | |
- | Archiv   Vatertask   PUBLIC   Sonstige |
- +-----------------------------------------+
-
-#center#Abb.33:  Auswahl der Zieltask
-
- Da der Dateiaustausch mit dem Standardarchiv der eigenen Station (Task:
- 'ARCHIVE'), mit der Vatertask und der Task 'PUBLIC' recht häufig in Anspruch
- genommen wird, sind diese drei Optionen unter den Alternativen direkt ange­
-#page#
- geben. Entscheiden Sie sich für eine dieser drei Tasks, so nimmt das System
- alle notwendigen Einstellungen vor. Möchten Sie dagegen in Kontakt mit einer
- anderen Task treten, so wählen Sie die Alternative 's ... Sonstige Task'. In
- diesem Falle haben Sie noch 3 Angaben zu machen:
-
- - Zunächst werden Sie nach dem Namen der Zieltask gefragt. Geben Sie den
- Namen der Zieltask - ohne Anführungsstriche (!) - ein und schließen Sie
- die Eingabe mit der <RETURN>-Taste ab. (Den ausgegebenen Namen der
- z.Z. eingestellten Task können Sie dabei verändern bzw. überschreiben.)
-
- - Dann wird die Nummer der Station im EUMEL-Netz erfragt, auf der sich
- die Zieltask befindet. Die Nummer Ihrer Station wird als Vorschlag ausge­
- geben. Wollen Sie mit einer Task auf Ihrem Rechner kommunizieren, so
- brauchen Sie diesen Vorschlag nur durch Drücken der <RETURN>-Taste
- bestätigen - ansonsten tragen Sie zuvor die entsprechende Stationsnummer
- ein. Ist Ihr Rechner nicht in ein EUMEL-Netz integriert, so wird die
- Stationsnummer 0 (Null) ausgegeben. Bitte bestätigen Sie diese Stations­
- nummer durch Tippen der <RETURN>-Taste.
-
- - Zum Abschluß müssen Sie noch angeben, ob die eingestellte Zieltask ein
- Archivmanager ist oder nicht.
-
- Das System versucht dann den Kontakt herzustellen. Je nachdem, welche
- Einstellung Sie vorgenommen haben, sind bestimmte Funktionen innerhalb
- des Menus nicht aktivierbar. Das System läßt nur die Funktionen zu, die
- aufgrund Ihrer Einstellungen zulässig sind.
-
- Im Kasten unten auf dem Bildschirm wird jeweils angezeigt, welche Zieltask
- eingestellt ist. Erscheint in diesem Kasten auch ein Hinweis auf den Archiv­
- namen, so haben Sie einen Archivmanager eingestellt. Ist dagegen vor dem
- Namen der Zieltask noch eine Zahl und ein Schrägstrich angegeben, so haben
- Sie eine Zieltask auf einem anderen Rechner eingestellt.
-#page#
- Bedenken Sie, daß Operationen mit Tasks auf anderen Stationen länger an­
- dauern können - werden Sie nicht ungeduldig!
-
- Sie können die Einstellung der Zieltask jederzeit wieder verändern!
-
- Fehlerfälle:
- - Die eingestellte Zieltask existiert nicht.
- - Die eingestellte Zieltask existiert zwar, ist aber nicht empfangsbereit, d.h.
- ein Zugriff von Ihrer Task aus ist nicht möglich!
- - Das Netz ist nicht funktionsbereit (Collector-Task fehlt).
- - Die Kommunikation war nicht erfolgreich.
- - Die gewünschte Operation kann mit der eingestellten Zieltask nicht ausge­
- führt werden (Zieltask ist z.B. gar kein Archivmanager - Sie aber ver­
- suchen, das Laufwerk zu reservieren).
-
diff --git a/doc/prozess/gs-prozess-8 b/doc/prozess/gs-prozess-8
deleted file mode 100644
index c36ccc9..0000000
--- a/doc/prozess/gs-prozess-8
+++ /dev/null
@@ -1,377 +0,0 @@
-limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (1)#
-#headodd#
-#center#gs-Prozess#right#%
-
-#end#
-#headeven#
-%#center#gs-Prozess
-
-#end#
-#center#1
-
-#on("b")#8  Detailbeschreibung der Basisbefehle und Tests#off("b")#
-
-
-#on("b")#
-BOOL PROC abbruch gewuenscht
-#off("b")#
-
- - erfragt, ob inzwischen durch einen Basisbefehl die Tastenfolge <ESC><q>
- im Eingabestrom registriert worden ist. Ist das der Fall, liefert die Prozedur
- den Wert 'TRUE', sonst 'FALSE'.
-
-
-#on("b")#
-BOOL PROC bit ist gesetzt (INT CONST kanal, bitnummer)
-#off("b")#
-
- - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
- Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
- "Programm-Abbruch durch <ESC><h>!".
- - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
- - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
- 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "Kanalnummer ... ist unzulässig!".
- - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Ein­
- gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "An Kanal ... ist keine Digital-Eingabe möglich!".
- - untersucht, ob die angegebene Bitnummer zulässig ist (0 #on("b")#<#off("b")# 'bitnummer' #on("b")#<#off("b")#
- 7). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehlermeldung "Bit­
- nummer ... ist nicht zulässig!".
- - liest den aktuell anliegenden Wert am angegebenen Kanal.
- - liefert den Wert 'TRUE', wenn in der binären Darstellung das Bit mit der
- angegebenen Bitnummer gesetzt ist ("I"), sonst den Wert 'FALSE'.
-
-#on("b")#
-TEXT PROC bitmuster (INT CONST kanal)
-#off("b")#
-
- - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
- Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
- "Programm-Abbruch durch <ESC><h>!".
-#page#
- - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
- - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
- 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "Kanalnummer ... ist unzulässig!".
- - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Ein­
- gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "An Kanal ... ist keine Digital-Eingabe möglich!".
- - liest den aktuell anliegenden Wert am angegebenen Kanal ein und wandelt
- ihn in die binäre Darstellung.
- - liefert einen Text der Länge 8, bestehend aus den Zeichen "I" und/oder "O".
-
-
-#on("b")#
-PROC bitmuster ausgeben (INT CONST kanal,
- TEXT CONST bitmuster)
-#off("b")#
-
- - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
- Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
- "Programm-Abbruch durch <ESC><h>!".
- - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
- - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
- 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "Kanalnummer ... ist unzulässig!".
- - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Aus­
- gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "An Kanal ... ist keine Digital-Ausgabe möglich!".
- - untersucht die übergebene Zeichenkette (bitmuster) auf korrekte Länge (8
- Zeichen). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehlermeldung
- "Das Bitmuster ... hat eine unzulässige Länge!".
- - überprüft die in der übergebenen Zeichenkette (bitmuster) vorkommenden
- Symbole auf ihre Zulässigkeit ("I", "O", "X", "T"). Taucht ein unzulässiges
- Symbol auf, erfolgt ein Abbruch mit der Fehlermeldung "... ist ein unzu­
- lässiges Bitsymbol in ...!".
-#page#
- - aus dem am angegebenen Kanal zuletzt ausgegeben Wert und der über­
- gebenen Zeichenkette (bitmuster) wird der auszugebende Dezimalwert er­
- mittelt. Dieser Dezimalwert wird am angegebenen Kanal ausgegeben. Dabei
- bedeuten "I", daß das betreffende Bit gesetzt wird,  "O", daß das betreffende
- Bit nicht gesetzt wird,  "X", daß das betreffende Bit gegenüber der zuvor
- erfolgten Ausgabe am gleichen Kanal nicht verändert wird und   "T", daß das
- betreffende Bit gegenüber der zuvor erfolgten Ausgabe am gleichen Kanal
- invertiert wird.
-
-
-#on("b")#
-BOOL PROC bitmuster gleich (INT CONST kanal,
- TEXT CONST vergleichsmuster)
-#off("b")#
-
- - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
- Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
- "Programm-Abbruch durch <ESC><h>!".
- - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
- - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
- 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "Kanalnummer ... ist unzulässig!".
- - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Ein­
- gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "An Kanal ... ist keine Digital-Eingabe möglich!".
- - untersucht die übergebene Zeichenkette (bitmuster) auf korrekte Länge (8
- Zeichen). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehlermeldung
- "Das Bitmuster ... hat eine unzulässige Länge!".
- - überprüft die im 'vergleichsmuster' vorkommenden Symbole auf ihre Zu­
- lässigkeit ("I", "O", "X"). Taucht ein unzulässiges Symbol auf, erfolgt ein
- Abbruch mit der Fehlermeldung "... ist ein unzulässiges Bitsymbol in ...!".
- - liest den aktuell anliegenden Wert am angegebenen Kanal ein und wandelt
- ihn in die binäre Darstellung.
- - überprüft, ob das eingelesene Bitmuster zum 'vergleichsmuster' "paßt". Ist
- das der Fall, wird der Wert 'TRUE' geliefert, sonst der Wert 'FALSE'.
-#page#
-#on("b")#
-TEXT PROC bitsymbol (INT CONST kanal, bitnummer)
-#off("b")#
-
- - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
- Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
- "Programm-Abbruch durch <ESC><h>!".
- - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
- - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
- 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "Kanalnummer ... ist unzulässig!".
- - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Ein­
- gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "An Kanal ... ist keine Digital-Eingabe möglich!".
- - untersucht, ob die angegebene Bitnummer zulässig ist (0 #on("b")#<#off("b")# 'bitnummer' #on("b")#<#off("b")#
- 7). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehlermeldung "Bit­
- nummer ... ist nicht zulässig!".
- - liest den aktuell anliegenden Wert am angegebenen Kanal ein und wandelt
- ihn in die binäre Darstellung.
- - liefert einen Text der Länge 1, nämlich "I" oder "O".
-
-
-#on("b")#
-PROC bitsymbol ausgeben (INT CONST kanalnummer, bitnummer,
- TEXT CONST bitsymbol)
-#off("b")#
-
- - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
- Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
- "Programm-Abbruch durch <ESC><h>!".
- - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
- - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
- 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "Kanalnummer ... ist unzulässig!".
- - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Aus­
- gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "An Kanal ... ist keine Digital-Ausgabe möglich!".
-#page#
- - untersucht, ob die angegebene Bitnummer zulässig ist (0 #on("b")#<#off("b")# 'bitnummer' #on("b")#<#off("b")#
- 7). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehlermeldung "Bit­
- nummer ... ist nicht zulässig!".
- - überprüft das übergebene Bitsymbol auf Zulässigkeit ("I", "O", "X", "T").
- Taucht ein unzulässiges Symbol auf oder besteht das Bitsymbol aus mehr als
- einem Zeichen, erfolgt ein Abbruch mit der Fehlermeldung "... ist ein unzu­
- lässiges Bitsymbol!".
- - ermittelt aus dem am angegebenen Kanal zuletzt ausgegeben Wert und der
- übergebenen Bitnummer/dem übergebenen Bitsymbol den auszugebende
- Dezimalwert. Dieser Dezimalwert wird am angegebenen Kanal ausgegeben.
- Dabei bedeuten "I", daß das betreffende Bit gesetzt wird,  "O", daß das be­
- treffende Bit nicht gesetzt wird,  "X", daß das betreffende Bit gegenüber der
- zuvor erfolgten Ausgabe am gleichen Kanal nicht verändert wird und  "T", daß
- das betreffende Bit gegenüber der zuvor erfolgten Ausgabe am gleichen Kanal
- invertiert wird.
-
-
-#on("b")#
-INT PROC dezimalwert (INT CONST kanal)
-#off("b")#
-
- - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
- Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
- "Programm-Abbruch durch <ESC><h>!".
- - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
- - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
- 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "Kanalnummer ... ist unzulässig!".
- - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Ein­
- gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "An Kanal ... ist keine Digital-Eingabe möglich!".
- - liest den aktuell anliegenden Wert am angegebenen Kanal ein.
- - liefert einen INT-Wert mit  0 #on("b")#<#off("b")# 'wert' #on("b")#<#off("b")# 255.
-#page#
-#on("b")#
-PROC dezimalwert ausgeben (INT CONST kanal, wert)
-#off("b")#
-
- - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
- Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
- "Programm-Abbruch durch <ESC><h>!".
- - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
- - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
- 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "Kanalnummer ... ist unzulässig!".
- - untersucht, ob am angegebenen Kanal laut Konfiguration eine digitale Aus­
- gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "An Kanal ... ist keine Digital-Ausgabe möglich!".
- - ermittelt den auszugebenden Wert durch die Rechnung
-#on("b")#
-#center#ausgabe = wert MOD 256,
-#off("b")#
- und gibt diesen am angegebenen Kanal aus.
-
-
-#on("b")#
-PROC initialisiere interface
-#off("b")#
-
- - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
- Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
- "Programm-Abbruch durch <ESC><h>!".
- - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
- - untersucht, ob das Programm korrekt (mit 'run pdv') gestartet wurde. Ist das
- nicht der Fall, erfolgt ein Abbruch mit der Fehlermeldung "PDV-Programme
- müssen mit 'run pdv' gestartet werden!". Dieser Fehler kann nicht auftreten,
- wenn die Programme vom #on("b")#gs-Prozess#off("b")#-Menu gestartet werden!
- - An jeden Digitalausgang des angeschlossenen Interface-Systems wird der Wert
- '0', an jeden Analogausgang eine "Nullspannung" angelegt (d.h. alles wird
- "ausgeschaltet"). Die internen Variablen werden dabei initialisiert.
-#page#
-#on("b")#
-PROC spannungswert (INT CONST kanal)
-#off("b")#
-
- - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
- Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
- "Programm-Abbruch durch <ESC><h>!".
- - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
- - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
- 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "Kanalnummer ... ist unzulässig!".
- - untersucht, ob am angegebenen Kanal laut Konfiguration eine analoge Ein­
- gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "An Kanal ... ist keine Analog-Eingabe möglich!".
- - ermittelt die laut Konfiguration aktuelle Obergrenze (u max) und Untergrenze
- (u min) des Spannungsbereiches am angegebenen Analogeingang.
- - liest den aktuell anliegenden Wert (0 #on("b")#<#off("b")# 'wert' #on("b")#<#off("b")# 255) am angegebenen
- Kanal ein und wandelt ihn nach folgender Rechnung:
-
-#on("b")#
- real(wert) * (u max - u min)
- lieferwert = ---------------------------- + u min
- 255.0
-
-#off("b")#
- - liefert einen REAL-Wert mit  u min #on("b")#<#off("b")# 'lieferwert' #on("b")#<#off("b")# u max, gerundet auf drei
- Nachkommastellen.
-
-
-#on("b")#
-PROC spannungswert ausgeben (INT CONST kanal,
- REAL CONST spannung)
-#off("b")#
-
- - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
- Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
- "Programm-Abbruch durch <ESC><h>!".
- - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
- - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
- 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "Kanalnummer ... ist unzulässig!".
-#page#
- - untersucht, ob am angegebenen Kanal laut Konfiguration eine analoge Aus­
- gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "An Kanal ... ist keine Analog-Ausgabe möglich!".
- - ermittelt die laut Konfiguration aktuelle Obergrenze (u max) und Untergrenze
- (u min) des Spannungsbereiches am angegebenen Analogausgang und prüft,
- ob  u min #on("b")#<#off("b")# 'spannung' #on("b")#<#off("b")# u max. Ist das nicht der Fall, erfolgt ein Abbruch
- mit der Fehlermeldung 'Der Spannungswert ... ist nicht zulässig!".
- - wandelt die angegebene 'spannung' nach der Rechnung:
-
-#on("b")#
- (wert - u min) * 255.0
- ausgabewert = int ( ---------------------- + 0.5 )
- u max - u min
-
-#off("b")#
- - gibt den ermittelten 'ausgabewert' am angegebenen Kanal aus.
-
-
-#on("b")#
-REAL PROC temperatur (REAL CONST spannungswert)
-#off("b")#
-
- - errechnet aus dem Spannungswert, der vom Temperaturfühler eingelesen
- wurde, der Thermometerkonstanten und der Minimaltemperatur die
- Temperatur in �C.
- - liefert einen REAL-Wert (die Temperatur in �C).
- So nur anwendbar auf den Temperaturfühler der Fa. AKTRONIK!
-
-
-#on("b")#
-PROC tue nichts
-#off("b")#
-
- - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
- Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
- "Programm-Abbruch durch <ESC><h>!".
- - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
-#page#
-#on("b")#
-PROC warte (INT CONST sekunden)
-#off("b")#
-
- - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
- Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
- "Programm-Abbruch durch <ESC><h>!".
- - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
- - wirkt sonst wie 'pause (sekunden * 10)'.
-
-
-#on("b")#
-PROC warte (REAL CONST sekunden)
-#off("b")#
-
- - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
- Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
- "Programm-Abbruch durch <ESC><h>!".
- - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
- - wirkt sonst wie 'pause (int (sekunden * 10.0 + 0.5))'.
-
-
-#on("b")#
-PROC wert an analogausgang ausgeben (INT CONST kanal, wert)
-#off("b")#
-
- - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
- Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
- "Programm-Abbruch durch <ESC><h>!".
- - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
- - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
- 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "Kanalnummer ... ist unzulässig!".
- - untersucht, ob am angegebenen Kanal laut Konfiguration eine analoge Aus­
- gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "An Kanal ... ist keine Analog-Ausgabe möglich!".
- - ermittelt den auszugebenden Wert durch die Rechnung
-
-#on("b")#
-#center#ausgabe = wert MOD 256,
-
-#off("b")#
- und gibt diesen Wert am angegebenen Kanal aus. Die am Analogausgang
- auszugebende Spannung wird vom D/A-Wandler des Interface-Systems er­
- mittelt.
-#page#
-#on("b")#
-INT PROC wert von analogeingang (INT CONST kanal)
-#off("b")#
-
- - untersucht, ob inzwischen die Tastenfolge <ESC><h> eingegeben wurde.
- Ist das der Fall, dann erfolgt ein Abbruch mit der Fehlermeldung
- "Programm-Abbruch durch <ESC><h>!".
- - registriert, ob inzwischen die Tastenfolge <ESC><q> eingegeben wurde.
- - untersucht, ob die angegebene Kanalnummer grundsätzlich zulässig ist (1 #on("b")#<#off("b")#
- 'kanal' #on("b")#<#off("b")# 49). Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "Kanalnummer ... ist unzulässig!".
- - untersucht, ob am angegebenen Kanal laut Konfiguration eine analoge Ein­
- gabe möglich ist. Ist das nicht der Fall, erfolgt ein Abbruch mit der Fehler­
- meldung "An Kanal ... ist keine Analog-Eingabe möglich!".
- - liefert den vom A/D-Wandler des Interface-Systems gelieferten Wert mit 0 #on("b")#<#off("b")#
- 'lieferwert' #on("b")#<#off("b")# 255.
-
diff --git a/doc/prozess/gs-prozess-9 b/doc/prozess/gs-prozess-9
deleted file mode 100644
index 6551b01..0000000
--- a/doc/prozess/gs-prozess-9
+++ /dev/null
@@ -1,477 +0,0 @@
-limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (1)#
-#headodd#
-#center#gs-Prozess#right#%
-
-#end#
-#headeven#
-%#center#gs-Prozess
-
-#end#
-#center#1
-
-#on("b")#9  Hinweise für den Systembetreuer/   Programmierer#off("b")#
-
-Sie haben wahrscheinlich bisher - ausschließlich zu Testzwecken - mit nur einem
-Interface-System gearbeitet. In diesem Kapitel möchten wir Ihnen Vorschläge
-machen, wie Sie Ihr Tasksystem organisieren können, um möglichst effektiv und
-störungsfrei mit der vorhandenen Hardware zu arbeiten.
-
-Neben den Möglichkeiten der Organisation des Systems werden wir Ihnen zeigen, wie
-Sie eine einmal vorgenommene Konfiguration/Organisation "fixieren", d.h. schützen
-können.
-
-Im letzten Teil dieses Kapitels werden wir für den #on("b")#routinierten(!) Programmierer#off("b")#,
-Möglichkeiten aufzeigen, wie man, unter weitgehender Umgehung von #on("b")#gs-Prozess#off("b")#,
-Programme für spezielle Anwendungen entwickeln kann. Schon an dieser Stelle sei
-ausdrücklich gesagt, daß dabei alle "Sicherheiten", die #on("b")#gs-Prozess#off("b")# normalerweise
-bietet, nicht (mehr) vorhanden sind.
-
-
-#on("b")#9.1  Vergabe der Kanäle/Organisation des Tasksystems#off("b")#
-
-Zur optimalen Organisation Ihres Systems sollten Sie wissen, in welcher Task die
-Konfiguration sinnvollerweise vorzunehmen ist. Da die Aspekte sehr vielfältig sind,
-werden wir verschiedene Situationen beschreiben. Lesen Sie die Ausführungen zu der
-Situation, die der Ihren am ehesten entspricht.
-
-
-#on("b")#
-1) Es stehen mehrere MUFIs als Adapter zur Verfügung. Alle MUFIs sollen
- im Terminalkanal betrieben werden. Die Arbeitsplätze sind alle mit
- dem gleichen Interfacesystem ausgestattet.
-#off("b")#
-#page#
- Sie sind hervorragend ausgestattet. Die Organisation und Konfiguration des
- Systems ist sehr einfach:
-
- Es ist sinnvoll, die Konfiguration von #on("b")#gs-Prozess#off("b")# in der Task vorzunehmen, in
- der Sie #on("b")#gs-Prozess#off("b")# installiert haben. Das hat den Vorteil, daß alle Sohntasks,
- die sich anschließend anmelden, diese Konfiguration "erben".
-
- Bei dieser Ausstattung ist es sinnvoll die Konfiguration zu "fixieren", um irrtüm­
- lichen oder "böswilligen" Umkonfigurationen vorzubeugen. Sehen Sie dazu
- Kapitel 9.4.
-
-
-#on("b")#
-2) Es stehen mehrere MUFIs als Adapter zur Verfügung. Alle MUFIs sollen
- im Terminalkanal betrieben werden. Die Arbeitsplätze sind aber mit
- verschiedenen Interface-Systemen ausgestattet.
-#off("b")#
-
- Wenn die Bestückung der einzelnen Arbeitsplätze ständig wechselt, ist es nicht
- sinnvoll, eine generelle Konfiguration vorzugeben. Teilen Sie jedem Anwender
- mit, daß er selbst für die Konfiguration seines Systems zuständig ist. Er sollte bei
- jedem Neuankoppeln seiner Task zumindest die Konfiguration überprüfen und
- ggf. den Vorgaben entsprechend eine Anpassung vornehmen. Es ist nicht sinn­
- voll, die jeweilige Konfiguration zu fixieren.
-
- Wenn Sie zwar unterschiedliche Interface-Systeme verwenden, aber die Inter­
- face-Systeme einzelnen MUFIs eindeutig zuordnen können, lohnt es sich schon,
- eine Konfiguration des Systems vorzugeben.
-
- Richten Sie zu diesem Zwecke so viele Tasks ein, wie Sie unterschiedliche
- Interface-Systeme zur Verfügung haben, und ordnen Sie jedem Interface-System
- eindeutig je eine Task zu. Die Namen der Tasks sollten Sie so wählen, daß sofort
- ersichtlich ist, welchem Interface-System sie zugeordnet ist.
-
- Nehmen Sie in jeder Task eine Konfiguration von #on("b")#gs-Prozess#off("b")# entsprechend
- dem zugeordneten Interface-System vor.
-#page#
- Auch hier ist es sinnvoll, die vorgenommenen Konfigurationen zu "fixieren", um
- irrtümlichen oder "böswilligen" Umkonfigurationen vorzubeugen. Sehen Sie
- dazu Kapitel 9.4.
-
- Die Anwender sollten sich später jeweils als Sohntask der Task anmelden, die
- sich dem an ihrem Arbeitsplatz vorhandenen Interface-System eindeutig zu­
- ordnen läßt.
-
-
-#on("b")#
-3) Es steht nur ein MUFI als Adapter zur Verfügung. Das MUFI soll im
- Terminalkanal betrieben werden.
-#off("b")#
-
- Je nachdem, ob Sie eine feste Hardware am MUFI betreiben oder nicht, sollten
- Sie sich an den beiden zuvor beschriebenen Fällen orientieren.
-
-
-#on("b")#
-4) Es steht nur ein RS232-Adapter oder ein MUFI, das als Endgerät an
- einer separaten Schnittstelle betrieben werden soll, zur Verfügung. Es
- soll nur von einem Arbeitsplatz/einer Task aus mit dem angeschlos­
- senen Interface-System gearbeitet werden.
-#off("b")#
-
- Nehmen Sie die Installation/Konfiguration wie unter 5) beschrieben vor.
- Arbeiten Sie nur in der Task, in der Sie die Konfiguration vorgenommen haben.
-
-
-#on("b")#
-5) Es steht nur ein Adapter zur Verfügung. Sie wollen aber die Möglichkeit
- schaffen, daß von verschiedenen Tasks abwechselnd darauf zugegriffen
- werden kann.
-#off("b")#
-
- Es ist gleichgültig, ob Sie ein MUFI oder einen RS232-Adapter verwenden - sie
- sollten den Adapter an einer separaten seriellen Schnittstelle betreiben.
-#page#
- Auch wenn Sie ein MUFI besitzen, kann es vorteilhaft sein, das MUFI nicht im
- Terminalkanal, sondern an einer separaten Schnittstelle zu betreiben:
-
- Beim Betrieb im Terminalkanal kann nämlich nur die Task mit dem MUFI
- kommunizieren, die an das Terminal gekoppelt ist, in dessen Zuleitung das
- MUFI eingebaut ist. Das wird hier zum Nachteil, denn wenn eine andere Task
- auf das Interface-System zugreifen möchte, muß erst die alte Task abgekoppelt
- und die neue an das Terminal mit dem MUFI angekoppelt werden.
-
- Der Betrieb an einer separaten Schnittstelle bietet hier wahrscheinlich viel­
- fältigere Möglichkeiten, wenngleich Sie dadurch auch Geschwindigkeitsein­
- bußen hinnehmen müssen.
-
- #on("b")#gs-Prozess#off("b")# bietet Ihnen bei Betrieb eines Adapters an einer separaten seriellen
- Schnittstelle nämlich die Möglichkeit, abwechselnd von verschiedenen Tasks auf
- den Adapter und das angeschlossene Interface-System zugreifen zu können.
-
- Teilen Sie bei der Installation (automatischen Generierung) von #on("b")#gs-Prozess#off("b")#
- dem System gleich mit, daß Sie Ihren Adapter (ob nun MUFI oder
- RS232-Adapter) an einer separaten seriellen Schnittstelle betreiben wollen.
- Schon bei dieser Installation werden Sie nach der Kanalnummer gefragt.
-
- Wir gehen hier davon aus, daß Sie immer mit dem gleichen Interface-System an
- diesem Adapter arbeiten werden. In diesem Falle empfiehlt es sich, gleich in der
- Task, in der Sie die Installation vorgenommen haben, auch die Konfiguration
- von #on("b")#gs-Prozess#off("b")# vorzunehmen und die Konfiguration zu "fixieren". Durch die
- Konfiguration in dieser Task, "erben" alle Sohntasks, die anschließend ange­
- meldet werden, diese Konfiguration.
-
- Wenn Sie sich mit 'taskinfo <RETURN>' einen Katalog ausgeben lassen,
- werden Sie feststellen, daß eine weitere Task als unbenannter Sohn ("-") Ihrer
- Task eingerichtet worden ist. Sie haben nämlich Ihre Task zu einer "zentralen
- Abwicklungstask" gemacht - genauer gesagt die unbenannte Sohntask.
-#page#
- Wenn Sie aus Ihrer Task, in der Sie die Konfiguration vorgenommen haben, mit
- dem Interface-System kommunizieren, erfolgt der Zugriff über diese unbe­
- nannte Sohntask!
-
- Sie schaffen dadurch aber zusätzlich die Möglichkeit, daß mehrere Sohntasks -
- natürlich abwechselnd - über diese "zentrale Abwicklungstask" mit dem Inter­
- face-System kommunizieren. Selbstverständlich setzt der Zugriff auf das Inter­
- face-System eine Absprache zwischen den Beteiligten voraus!
-
-
- Gerade in der Aufbauphase, wenn erst wenige Geräte zur Verfügung stehen, ist
- das eine Möglichkeit, von verschiedenen Arbeitsplätzen aus mit nur einem Adap­
- ter/Interface-System Prozeßdatenverarbeitung zu betreiben.
-
-
-#on("b")#
-6) Sie wollen mehrere Adapter an separaten seriellen Schnittstellen
- betreiben.
-#off("b")#
-
- In diesem Falle ist es sinnvoll - bevor Sie eine Konfiguration vornehmen - gleich
- nach der Installation von #on("b")#gs-Prozess#off("b")# für jeden einzelnen Adapter eine Sohntask
- unter der Task einzurichten, in der #on("b")#gs-Prozess#off("b")# installiert ist. Jede dieser Sohn­
- tasks koppeln Sie mit einem festen Kanal, an dem ein Adapter/Interface-System
- angeschlossen ist.
-
- Sie brauchen dazu #on("b")#gs-Prozess#off("b")# nicht mehrfach zu installieren; wir haben für
- diesen Fall vorgesorgt. Für die Kopplung der Tasks an die einzelnen Kanäle steht
- die Prozedur 'PROC interfacekanal (INT CONST kanalnummer)' zur Verfügung.
- Geben Sie also in einer Task z.B. das Kommando 'interfacekanal (5)
- <RETURN>', so wird von dieser Task aus das Interface-System am Kanal 5
- angesprochen.
-
- Über die Prozedur 'INT PROC interfacekanal' können Sie sich in jeder Task
- informieren, über welchen Kanal die Kommunikation mit dem Interface-System
- abgewickelt wird: z.B. mit 'put (interfacekanal) <RETURN>'.
-#page#
- Ihnen ist sicher klar, daß es auch hier sinnvoll ist, den Namen der jeweiligen
- Task so zu wählen, daß daraus sofort der betreffende Interfacekanal ablesbar
- ist.
-
- In jeder so an einen Kanal gekoppelten Task sollten Sie die Konfiguration von
- #on("b")#gs-Prozess#off("b")# vornehmen und ggf. "fixieren". Jede solche Task richtet auto­
- matisch eine unbenannte Sohntask ("-") ein, die sich wie eine "zentrale Ab­
- wicklungstask" verhält. Wenn Sie also aus Ihrer Task oder aus neu einge­
- richteten Sohntasks mit dem Interface-System kommunizieren, so erfolgt das
- über die "zentrale Abwicklungstask".
-
-
-#on("b")#9.2  Informationsprozeduren#off("b")#
-
-Zur Information stehen dem Systembetreuer drei wichtige Prozeduren zur Verfügung:
-
-#on("b")#
-TEXT PROC adapterart
-#off("b")#
-
-Hiermit können Sie in Erfahrung bringen, welche Interfaceanpassung z.Z. in der
-aktuellen Task insertiert ist: MUFI im Terminalkanal, MUFI als Endgerät oder
-AKTRONIK-Adapter (RS232-Adapter).
-
-
-#on("b")#
-INT PROC interfacekanal
-#off("b")#
-
-Hiermit können Sie in Erfahrung bringen, über welchen Kanal z.Z. mit dem Inter­
-face-System aus der Task kommuniziert wird. Die Prozedur steht allerdings nur dann
-zur Verfügung, wenn das Interface-System an einer separaten Schnittstelle betrieben
-wird - sonst erscheint der Hinweis 'FEHLER: unbekanntes Kommando'.
-
-Es gibt noch einen Befehl, mit dem Sie sich über den Zustand des Interface-Systems
-informieren können:
-#page#
-#on("b")#
-PROC oeffne interface (INT VAR testwert)
-#off("b")#
-
-Die Prozedur versucht, die aktuelle Betriebsart einzustellen. Anschließend erhalten
-Sie eine 'Erfolgsauskunft'. Dabei bedeuten:
-
- 0 - alles okay
- -1 - Interface ist noch nicht konfiguriert
- -2 - Interface-Task ist besetzt
- -3 - Interfacekanal ist belegt
- -4 - Interface meldet sich nicht
- -5 - Interface kann nicht geöffnet werden
-
-Ist der Adapter an einer separaten Schnittstelle angeschlossen, so arbeitet der Befehl
-über die "zentrale Abwicklungstask". Als Antwort können alle genannten Codes auftre­
-ten; beim MUFI im Terminalkanal allerdings nur die Codes 0, -1 und -4. Die oben
-genannten Fehlermeldungen sind detailliert in Kapitel 5.5 erläutert.
-
-Sie sollten anschließend #on("b")#unbedingt#off("b")# das Kommando 'schliesse interface' geben: Eine
-eventuell durch 'oeffne interface' vollzogene Betriebsartumstellung wird dadurch
-rückgängig gemacht.
-
-
-
-#on("b")#9.3  Neufestlegung des Interfacekanals#off("b")#
-
-Wenn Sie mit MUFI(s) im Terminalkanal arbeiten, spielen Kanalnummern für das
-Ansprechen des/der MUFIs keine Rolle. Das jeweilige MUFI kann in diesem Falle
-nämlich immer nur von der Task aus angesprochen werden, die an das Terminal
-gekoppelt ist, in dessen Zuleitung das MUFI eingebaut wurde.
-
-Wenn Sie Adapter (MUFI oder RS232-Adapter) an separaten seriellen Schnittstellen
-betreiben, so legen Sie schon bei der Installation von #on("b")#gs-Prozess#off("b")# den Kanal fest,
-über den die Task mit dem Interface-System kommuniziert. Wie wir schon oben be­
-schrieben haben, können Sie den Interface-Kanal mit der Prozedur 'PROC interface­
-kanal (INT CONST kanalnummer)' neu festlegen. Beachten Sie dabei aber bitte
-folgendes:
-#page#
-Wenn Sie in einer Task #on("b")#gs-Prozess#off("b")# konfigurieren und zuvor entschieden haben, daß
-der Adapter an einer separaten Schnittstelle betrieben wird, so wird automatisch eine
-unbenannte Sohntask ("-") eingerichtet. Diese Sohntask wird zur "zentralen Abwick­
-lungstask". Wenn Sie nun aus der Task, in der Sie die Konfiguration vorgenommen
-haben, oder aus einer Sohntask dieser Task, die anschließend eingerichtet wird, mit
-dem Interface-System kommunizieren, so erfolgt diese Kommunikation über diese
-unbenannte Sohntask. Daher wählten wir die Bezeichnung "zentrale Abwicklungs­
-task".
-
-Da die "zentrale Abwicklungstask" den "Zustand der Vatertask" in dem Augenblick
-erbt, in dem Sie eingerichtet wird, würde eine später erfolgende Neufestlegung des
-Interfacekanals nicht von Ihr registriert und damit auch nicht wirksam.
-
-#on("b")#Es ist unbedingt notwendig#off("b")#, in der Task, in der Sie eine Neufestlegung des Interface-
-Kanals vornehmen, #on("b")#gs-Prozess#off("b")# auch neu zu konfigurieren! Bei der Neukonfiguration
-wird nämlich die unbenannte Sohntask gelöscht und neu eingerichtet.
-
-(Das hier beschriebene Phänomen ist Ihnen wahrscheinlich schon aus der
-PRINTER-Task bekannt).
-
-Hinsichtlich der Sicherheit des Systems hat dieses Vorgehen aber einen Vorteil: wenn
-in den "zugänglichen Sohntask", die über eine "zentrale Abwicklungstask" mit dem
-Interface-System kommunizieren eine Neueinstellung des Interface-Kanals vorge­
-nommen wird, so bleibt diese unwirksam (solange in der Sohntask nicht umkonfigu­
-riert wird - was sich aber verhindern läßt! Sehen Sie dazu das folgende Kapitel!).
-
-
-#on("b")#9.4  Fixieren der Konfiguration#off("b")#
-
-Prinzipiell kann in jeder Task, in der #on("b")#gs-Prozess#off("b")# zur Verfügung steht, die Konfigura­
-tion (von #on("b")#gs-Prozess#off("b")#) vorgenommen werden. Gerade von unerfahrenen Anwendern
-könnte aber irrtümlich eine Umkonfiguration vorgenommen werden. Aber nicht nur
-das: auch erfahrene Anwender könnten "böswillig" die Konfiguration verändern. Aus
-diesem Grunde ist es ggf. sinnvoll, eine vorgenommene Konfiguration zu fixieren
-(schützen).
-#page#
-Dazu steht die Prozedur 'PROC pdv konfiguration zugelassen (BOOL CONST ent­
-scheidung)' zur Verfügung. Mit dem Kommando 'pdv konfiguration zugelassen
-(FALSE) <RETURN>' sperren Sie in der aktuellen Task und in allen Sohntasks, die
-sich #on("b")#anschließend#off("b")# unter dieser Task anmelden, den Menupunkt 'k Konfigurieren'
-unter dem Oberbegriff 'Interface'.
-
-Sofern nötig, können Sie diese Sperre mit dem Kommando 'pdv konfiguration zuge­
-lassen (TRUE) <RETURN>' wieder aufheben, #on("b")#allerdings nur in der Task, in der Sie
-auch die Sperre gesetzt haben#off("b")#, denn #on("b")#gs-Prozess#off("b")# merkt sich diesen Tasknamen!
-Wenn Sie also ein Password auf diese Task legen, und damit anderen den Zugang
-verwehren, kann auch eine "böswilligie Umkonfiguration" verhindert werden.
-
-
-#on("b")#9.5  Mögliche Fehlerfälle#off("b")#
-
-Wenn Fehlermeldungen auftreten, so finden Sie Fehlerbeschreibungen und Möglich­
-keiten zur Abhilfe im Kapitel 5.5 beschrieben. Auf einen Fehlerzustand möchten wir
-Sie hier noch besonders hinweisen:
-
-#on("b")#Interfacekanal ist belegt!#off("b")#
-
- Über den angegebenen Kanal greift schon eine andere Task auf das angeschlos­
- sene Interface-System zu. Vielleicht wurde der betreffende Kanal auch zuvor für
- andere Zwecke verwendet - anschließend hat der Benutzer den Kanal nicht
- ordentlich freigegeben. Geben Sie in der 'gib kommmando'-Ebene den Befehl
- 'taskinfo (2) <RETURN>'. In der Spalte mit der Überschrift 'CHAN' müßte jetzt
- irgendwo die Kanalnummer auftauchen. Steht die Kanalnummer bei einem Sohn
- der Task 'SUPERVISOR', so liegt der letztgenannte Fall vor, sonst der erstge­
- nannte.
-
- Abhilfe: Schließen Sie Ihr Interface-System an einen anderen Kanal an oder
- bitten Sie den betreffenden Anwender, den Kanal freizugeben.
- Ist das nicht möglich, so kann aus einer Systemtask das Kommando
- 'end (canal (kanalnummer))' <RETURN>' gegeben werden. Statt
- 'kanalnummer' ist natürlich die tatsächliche Nummer (z.B. '4')
- anzugeben.
-#page#
-#on("b")#9.6  Weitere Möglichkeiten#off("b")#
-
-Ihnen ist sicher aufgefallen, daß wir uns bemüht haben, einen sinnvollen Kompro­
-miß zwischen Sicherheit in der Handhabung und Geschwindigkeit des Systems zu
-finden. In Zweifelsfällen haben wir uns eher zugunsten der Sicherheit entschieden.
-
-Sicher werden Sie inzwischen bemerkt haben, daß die Kommunikation mit einem
-Adapter (MUFI oder RS232-Adapter) an einer separaten seriellen Schnittstelle recht
-zeitaufwendig ist.
-
-Prinzipiell standen uns bei der Konzeption zwei Möglichkeiten zur Verfügung: Ent­
-weder wir gestalten jeden Basisbefehl so, daß wir uns zu Beginn der Ausführung
-jeweils direkt an den betreffenden Kanal ankoppeln und am Ende der Ausführung
-des Befehls wieder abkoppeln - oder wir richten eine "zentrale Abwicklungstask" ein
-und nutzen die Intertaskkommunikation des EUMELs. Wir haben uns nach diversen
-Tests für die zweite Variante entschieden: Einmal zeigte sich, daß dieses Verfahren
-weit weniger zeitaufwendig ist als das ständige An- und Abkoppeln an den Interface-
-Kanal. Zum anderen konnten wir so die Möglichkeit schaffen, über diese "zentrale
-Abwicklungstask" den abwechselnden, koordinierten Zugriff mehrerer Tasks auf ein
-Interface-System zu realiseren.
-
-Wenn Sie nun aber spezielle Anwendungen schreiben wollen, für die die Geschwin­
-digkeit beim Ansprechen des Interface-Systems an einer separaten Schnittstelle nicht
-ausreicht, so möchten wir Ihnen hier noch eine Möglichkeit aufzeigen, dieses
-Problem zu bewältigen.
-
-Auch an dieser Stelle sei noch einmal ausdrücklich darauf hingewiesen, daß Sie bei
-dieser Programmiermöglichkeit auf alle Sicherheiten, die Ihnen #on("b")#gs-Prozess#off("b")# bietet,
-verzichten müssen. Deshalb sollten Sie diesen Weg nur beschreiten, wenn Sie ein
-hinlängliches Maß an Programmierroutine besitzen! Die zur Verfügung stehenden
-Befehle und die Besonderheiten möchten wir Ihnen an einem kleinen Beispiel­
-programm aufzeigen:
-#page#
-#on("b")#
- LET ausgabekanal = 4,
- eingabekanal = 3;
-
- INT VAR test, eingabewert;
- INT VAR terminalkanal :: channel (myself);
- schliesse interface;
- continue (interfacekanal);
- oeffne interface direkt (test);
- IF test < 0
- THEN continue (terminalkanal);
- errorstop ("Funktionsfehler Interface-System")
- FI;
- initialisiere interface direkt;
- eigentliches programm;
- schliesse interface direkt;
- continue (terminalkanal).
-
- eigentliches programm:
- direkt ausgeben (ausgabekanal, 3);
- eingabewert := direkteingabe (eingabekanal).
-#off("b")#
-
-Wenn Sie ein solches Programm geschrieben haben, starten Sie es bitte mit dem
-Befehl 'run pdv' oder aus dem Menusystem heraus mit der Menufunktion 's Starten'.
-(Bei 'run' kann der Befehl 'schliesse interface' gestrichen werden!).
-
-Für die eigentliche Programmierung des Interface-Systems stehen Ihnen nur zwei
-Befehle zur Verfügung:
-
-#on("b")#
-PROC direkt ausgeben (INT CONST kanal, wert)
-#off("b")#
-
- - ermittelt den auszugebenden Wert durch die Rechnung
-
-#on("b")##center#ausgabe = wert MOD 256#off("b")#
-
- und gibt diesen am Ausgabekanal aus.
-
- Der Befehl ähnelt dem Befehl 'dezimalwert ausgeben' - hat aber im Gegensatz
- dazu keinerlei "Fehlerfänger": so werden Sie z.B. nicht darauf aufmerksam
- gemacht, wenn der angegebene Kanal gar kein Ausgang ist, etc.)
-#page#
-#on("b")#
-INT PROC direkteingabe (INT CONST kanal)
-#off("b")#
-
- - liest den aktuell anliegenden Wert am angegebenen Kanal ein.
- - liefert einen INT-Wert mit 0 � 'wert' � 255.
-
- Der Befehl ähnelt dem Befehl 'dezimalwert' - hat aber im Gegensatz dazu
- ebenfalls keinerlei "Fehlerfänger"!
-
-
-Das obige Programm beginnt mit dem Befehl 'schliesse interface'. Sicher kommt es
-Ihnen sonderbar vor, daß zu Beginn des Programms das Interface geschlossen wird,
-wo wir es doch eigentlich "öffnen" müßten. Ihnen wird die Funktion aber sofort klar,
-wenn Sie sich die Situation vor Augen führen:
-
-Als Sie #on("b")#gs-Prozess#off("b")# in Ihrer Task konfiguriert haben, und festlegten, daß der Adapter
-an einer separaten Schnittstelle "hängt", richtete #on("b")#gs-Prozess#off("b")# automatisch eine
-unbenannte Sohntask ("-") als "zentrale Abwicklungstask" ein, die durch das
-Kommando 'run pdv' bzw. durch die Menufunktion 's Starten' an den Interfacekanal
-gekoppelt wird. Der Befehl 'schliesse interface' koppelt die Task "-" wieder vom Inter­
-face-Kanal ab, so daß Sie direkt darauf zugreifen können. Außerdem werden die
-internen Einstellungen im Adapter wieder in Ausgangsstellung gebracht.
-
-Mit der Prozedur 'PROC oeffne interface direkt (INT VAR testwert)' sprechen Sie das
-Interface neu an. Dabei wird ein angeschlossener Adapter automatisch auf Betriebs­
-bereitschaft getestet und dann auf den Betrieb an einer separaten seriellen Schnitt­
-stelle umgestellt (nur beim MUFI).
-
-Über 'testwert' erhalten Sie eine Rückmeldung. Dabei haben die gelieferten 'test­
-werte' folgende Bedeutung:
-
- 0 - Interface betriebsbereit
- -4 - Interface #on("b")#nicht#off("b")# betriebsbereit
- (Interface meldet sich nicht)
-#page#
-Der Befehl 'initialisiere interface direkt' wirkt ähnlich wie der schon oben be­
-schriebene Befehl 'initialisiere interface', jedoch #on("b")#nicht#off("b")# über den "Umweg zentrale
-Abwicklungstask" - sondern halt 'direkt' am Interface-Kanal. Einzige Aufgabe hier:
-Alle Ausgabe-Kanäle auf Wert '0' bzw. Nullspannung setzen.
-
-Durch das abschließende 'schliesse interface direkt' bringen Sie ein angeschlossenes
-MUFI wieder in die "Ausgangsstellung".
-
-Beachten Sie bei der Programmierung bitte unbedingt, daß Sie ständig zwischen dem
-Kanal, an dem Sie arbeiten (Terminal) und dem Interfacekanal hin- und herschalten
-(müssen), wenn Ein- oder Ausgaben auf dem Terminal erfolgen sollen. Die direkte
-Programmierung lohnt sich demnach nur, wenn aufeinanderfolgende Aktionen am
-Interfacekanal durchgeführt werden (z.B. Schrittmotorsteuerungen etc.).
-
-Treten Programmfehler auf, während Sie an den Interfacekanal gekoppelt sind,
-haben Sie keine Chance, von Ihrem Terminalkanal aus auf das Interface zuzugreifen
-- denn das "hängt am Interfacekanal" (z.B. bei "Programmabsturz" oder Endlos­
-schleife).
-
-Bei Ihrer Programmierung sollten Sie diesem Fall vorbeugen (disable stop - enable
-stop). Ansonsten müßten Sie aus einer Systemtask den Kanal "abschießen". Geben
-Sie dazu in einer Systemtask z.B. das Kommando 'end (canal (5)) <RETURN>',
-wenn das Interface-System über den Kanal 5 angesprochen wird.
-
diff --git a/doc/system/systemhandbuch.1 b/doc/system-manual/1.8.7/doc/systemhandbuch.1
index a8f53bb..a8f53bb 100644
--- a/doc/system/systemhandbuch.1
+++ b/doc/system-manual/1.8.7/doc/systemhandbuch.1
diff --git a/doc/system/systemhandbuch.2 b/doc/system-manual/1.8.7/doc/systemhandbuch.2
index c4772f0..c4772f0 100644
--- a/doc/system/systemhandbuch.2
+++ b/doc/system-manual/1.8.7/doc/systemhandbuch.2
diff --git a/doc/system/systemhandbuch.3 b/doc/system-manual/1.8.7/doc/systemhandbuch.3
index 3c0a482..3c0a482 100644
--- a/doc/system/systemhandbuch.3
+++ b/doc/system-manual/1.8.7/doc/systemhandbuch.3
diff --git a/doc/system/systemhandbuch.4 b/doc/system-manual/1.8.7/doc/systemhandbuch.4
index e511eb5..e511eb5 100644
--- a/doc/system/systemhandbuch.4
+++ b/doc/system-manual/1.8.7/doc/systemhandbuch.4
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
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil1 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil1
new file mode 100644
index 0000000..cdeca13
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil1
@@ -0,0 +1,924 @@
+ EUMEL-Benutzerhandbuch
+
+ TEIL 1: Einführung
+
+Vorwort
+
+Lieber EUMEL-Nutzer!
+
+Ihnen liegt hier das EUMEL-Benutzerhandbuch zur Public-Domain-Version 1.7.3
+vor. Es gliedert sich in mehrere Teile. Der erste Teil des Benutzerhandbuchs
+soll dem zukünftigen Benutzer den "Einstieg" in das EUMEL-System erleichtern.
+Dazu werden die wichtigsten Eigenschaften des EUMEL-Systems vorgestellt.
+Danach zeigen wir eine Beispielsitzung. Anschließend werden einige
+prinzipielle Konzepte des EUMEL-Systems vermittelt. Den Abschluß bildet ein
+kleines EUMEL-Wörterbuch.
+
+Die übrigen Teile des EUMEL-Benutzerhandbuchs dokumentieren jeweils ein oder
+mehrere abgeschlossene Einheiten des Systems. Ein EUMEL-Nutzer braucht so nur
+die ihn interessierenden Teile zu lesen. Ein Programmierer z.B. sollte
+
+ Einführung, Supervisor/Monitor, Editor, ELAN-Compiler und Dateien
+
+durcharbeiten. Für Programmierer, die noch keine Erfahrung mit ELAN besitzen,
+ist der Teil "Erste Hilfe" gedacht. Weiterhin werden die Teile über Dateien
+und Standardpakete oft benötigt. Ein Nutzer, der vorwiegend an der Textbe-
+und verarbeitung interessiert ist, braucht dagegen nur
+
+ Einführung, Supervisor/Monitor, Dateien, Editor und Textkosmetik.
+
+Der OPERATOR/Spooler-Teil ist nur für diejenigen Programmierer gedacht, die
+ein EUMEL-System betreuen. Weitere Informationen finden System-Programmierer
+im System-Handbuch bzw. in der Veröffentlichung des Quellcodes.
+
+
+1. Eigenschaften des EUMEL-Betriebssystems
+
+Das EUMEL-Betriebssystem (Extendable multi User Microprocessor ELANsystem)
+ist ein Betriebssystem, das z.Z. für den Einsatz auf Mikroprozessoren vorge-
+sehen ist. Es weist u.a. folgende Eigenschaften auf:
+
+- Das EUMEL-System ist ein "Time sharing"-Betriebssystem, d.h. mehrere Be-
+ nutzer können gleichzeitig an einem Rechensystem arbeiten (z.B. Programme
+ übersetzen, bearbetten (rechnen) oder erstellen (edieren)). Dabei wird die
+ verfügbare Rechen- und Speicherkapazität zwischen den Benutzer-Prozessen
+ dynamisch aufgeteilt.
+
+- Jeder Benutzer richtet (mindestens) eine Task ein, in der er sich Programme
+ und/oder Dateien halten kann, auf die andere Nutzer nicht zugreifen können.
+ Tasks können von einem Terminal "abgekoppelt" und trotzdem - sofern aus-
+ reichend freie Rechnerkapazität zur Verfügung steht - als Batch-Auftrag im
+ Hintergrund weiter bearbeitet werden.
+
+- Das EUMEL-Betriebssystem ist so konzipiert, daß der Sicherheit des Systems
+ besondere Beachtung geschenkt wurde. Zu diesem Zweck werden in bestimmten
+ zeitlichen Abständen sogenannte Restart-Punkte auf dem externen Speicher-
+ medium gesichert. In diesen Sicherungen wird der augenblickliche System-
+ Zustand konserviert, so daß bei Netzausfall oder eventuellen System-Zu-
+ sammenbrüchen der Betrieb übergangslos wieder aufgenommen werden kann, mit
+ der Ausnahme des Verlustes der Daten, die nach dem letzten Restart-Punkt
+ aufliefen.
+
+- "Tasks" und/oder Dateien können vor dem unbefugten Zugriff durch "Pass-
+ words" geschützt werden. Ein weitergehender Schutz wird durch die Möglich-
+ keit von Password-Algorithmen vom EUMEL-System angeboten, so daß den Be-
+ langen des Datenschutzes Rechnung getragen werden kann.
+
+- Das EUMEL-Betriebssystem ist leicht erweiterbar. Da der Kern des Betriebs-
+ systems in ELAN geschrieben ist, können Anwender selbst leicht Erweiterun-
+ gen bzw. lokale Modifikationen in das System ein- bzw. anfügen. Dabei kön-
+ nen bestimmte Erweiterungen nur bestimmten Benutzern oder Benutzergruppen
+ zur Verfügung gestellt werden. Da die Programmiersprache ELAN selbst er-
+ weiterbar ist, ist es möglich, verschiedenen Anwendern oder -gruppen unter-
+ schiedliche Erweiterungen der Sprache anzubieten.
+
+- In dem EUMEL-Betriebssystem ist eine implizite Dateihierarchie realisiert.
+ Dies wird erreicht, indem den Tasks Dateien zugeordnet werden. Man kann
+ Dateien im Taskbaum von "Vater-Tasks" holen oder zu ihnen schicken. Lokale
+ Dateien werden mit dem Beenden einer Task automatisch gelöscht, während
+ Dateien, die längerfristig gehalten werden sollen, bei längerlebenden Tasks
+ gehalten werden müssen.
+
+- Die Kommandosprache ("job control language") des EUMEL-Systems entspricht
+ der ELAN-Syntax (Prozeduraufrufe). Das befreit den Anwender von der
+ Schwierigkeit, zwei verschiedenartige Sprachen zu erlernen. Darüber hinaus
+ können eine oder mehrere Anweisungen der Kommandosprache in ELAN-Programmen
+ enthalten sein. Z.B. ist es möglich, Kommandos vom Editor ausführen zu
+ lassen oder den Editor von einem Programm aus aufzurufen.
+
+- Die Dienstprogramme des EUMEL-Systems, wie z.B. der EUMEL-Editor, sind
+ geräteunabhängig und meist erweiterbar konzipiert. Zudem sind sie auch in
+ ELAN formuliert, so daß Änderungen und Korrekturen leicht vorgenommen
+ werden können.
+
+- Das EUMEL-System verwaltet seinen Hauptspeicher nach dem "demand-paging"-
+ Prinzip. Daten und/oder Programme werden daher in Seiten von 512 Bytes
+ aufgeteilt. Nur diejenigen Seiten, die zu einem Zeitpunkt wirklich benötigt
+ werden, befinden sich im Speicher. Dadurch kann sich das EUMEL-System auf
+ wechselnde Speicherplatz-Anforderungen optimal einstellen.
+
+- Für alle Programme wird reentranter Code erzeugt. Somit können mehrere
+ Benutzer Code gleichzeitig benutzen ("sharable code"), wobei der Code nur
+ einmal vorhanden sein muß. Dies ist insbesondere für Dienstprogramme wie
+ z.B. Compiler, Editor usw. wichtig.
+
+- Dateien können ebenfalls (wie Programme) von mehreren Benutzern gemeinsam
+ verwendet werden, ohne daß mehrere Kopien davon hergestellt werden müssen
+ Das System sorgt mit seinen Paging-Fähigkeiten automatisch für das "sharen"
+ von Dateien. Erfolgt jedoch ein Schreibzugriff, so wird nur für den
+ schreibenden Benutzer eine Kopie angelegt.
+
+- Das EUMEL-System bietet gute Textbe- und -verarbeitungsmöglichkeiten.
+ Grundlage dafür ist der bildschirmorientierte Editor (eine Entwicklung der
+ GMD). Der Editor erlaubt auch ein "multi window editing" und die Ausführung
+ von beliebigen Kommandos. Zusätzlich gibt es eine Reihe von Programmen zur
+ "Textkosmetik", die es erlauben, Texte zeilen- und seitenweise zu forma-
+ tieren. Dabei ist es möglich, unterschiedliche Schriftarten zu verwenden.
+
+
+2. Eine kleine Beispielsitzung mit EUMEL
+
+Zum ersten Kennenlernen wird hier ein Beispiel einer EUMEL-Sitzung darge-
+stellt. Diese Vorlage kann man am Rechner "nachspielen". Da die Reaktion des
+Systems hier auf dem Papier nur unvollkommen wiedergegeben werden kann, ist
+diese Beispielsitzung durch "trockenes" Lesen (ohne Rechner) sicherlich etwas
+schwieriger zu verstehen als durch Nachspielen.
+
+Alle Ausgaben des EUMEL werden mit
+
+---->
+
+gekennzeichnet, alle Benutzereingaben haben
+
+<----
+
+als Kennzeichen. Spezielle Tasten werden groß geschrieben, z.B.
+
+ RETURN
+
+als Bezeichnung für die RETURN-Taste.
+
+
+Anfang
+
+Im Multi-User-System können gleichzeitig mehrere Benutzer aktiv sein. Dabei
+braucht jeder ein eigenes "Zimmer" im "EUMEL-Haus", in dem er arbeiten kann,
+ohne andere zu stören. Diese "Zimmer" heißen hier "Tasks" und haben Namen.
+Zu Beginn muß der Benutzer sich an seinem Bildschirm eine Task erzeugen. Dazu
+muß er das Betriebssystem aktivieren:
+
+<---- SV
+
+EUMEL meldet sich: EUMEL Version 1.7.3/M
+
+----> gib supervisor kommando:
+
+Dann muß der Benutzer sich einen Tasknamen ausdenken (z.B. "ottokar") und
+ein Kommando zum Einrichten einer neuen Task geben:
+
+<---- begin ("ottokar") RETURN
+
+Daraufhin wird eine neue Task erzeugt, sie meldet sich:
+
+----> gib kommando:
+
+Jetzt kann die eigentliche Sitzung beginnen.
+
+
+Programm erstellen
+
+Wir schreiben ein kleines Programm zur Primzahlberechnung:
+
+<---- edit ("prim") RETURN
+
+----> neue datei einrichten (j/n) ?
+
+<---- j
+
+Es soll eine neue Datei mit dem Namen 'prim' eingerichtet werden, daher ant-
+worten wir mit 'j'. Die Datei ist zu Anfang leer. Der Editor zeigt nur die
+Überschrift, der restliche Bildschirm ist leer. Wir können jetzt unser Pro-
+gramm eingeben:
+
+ INT VAR zahl := 3 ;
+ WHILE zahl <= 1000 REP
+ drucke falls primzahl ;
+ zahl INCR 2
+ PER .
+
+ drucke falls primzahl :
+ INT VAR teiler := 3 ;
+ WHILE teiler * teiler <= zahl REP
+ IF teiler gefunden
+ THEN LEAVE drucke falls primzahl
+ FI ;
+ teiler INCR 2
+ PER ;
+ put (zahl) ;
+ line .
+
+ teiler gefunden :
+ zahl MOD teiler = 0 .
+
+Bei der Eingabe des Programms können wir auch die Funktionstasten benutzen.
+Die genauen Funktionen sind in den folgenden Teilen des Benutzerhandbuchs
+erklärt. Für den Anfang gilt aber: Probieren geht über Studieren!
+
+Wir verlassen den Editor:
+
+<---- ESC q
+
+----> gib kommando:
+
+
+Programm übersetzen und ausführen
+
+<---- run RETURN
+
+----> ("prim")
+
+Der Dateiname ('prim') wird automatisch ergänzt und das Programm wird vom
+ELAN-Compiler übersetzt. Dabei erscheinen die Nummern der gerade übersetzten
+Zeilen in der linken unteren Bildecke. Wenn keine Fehler gefunden wurden,
+wird das Programm anschließend ausgeführt. Dann sollten die Primzahlen von
+3 bis 1000 erscheinen.
+
+
+Ein fehlerhaftes Programm korrigieren
+
+Falls der ELAN-Compiler Fehler findet, wird das Programm nicht ausgeführt.
+Das System geht automatisch in den Editor, der jetzt zwei Dateien "parallel"
+auf dem Bildschirm zeigt. Die obere enthält die Fehlermeldungen, die untere
+das ELAN-Programm, so daß Korrekturen leicht möglich sind. Dabei kann man gut
+folgende Editor-Funktionen benutzen (ausprobieren!):
+
+ ESC ESC n RETURN positioniert auf Zeile n
+
+ HOP UNTEN
+ zum Blättern
+ HOP OBEN
+
+ ESC w wechselt zur jeweils anderen Datei (z.B. um in der
+ Fehlermeldungsdatei weiterzublättern)
+
+Nach Verlassen des Editors (ESC q) kann das Programm wieder gestartet werden.
+
+
+Ändern des Programms
+
+<---- edit RETURN
+
+----> ("prim")
+
+Auch hier wird der Dateiname zum Kommando 'edit' automatisch ergänzt. Jetzt
+kann das Programm mit den üblichen Editor-Möglichkeiten verändert werden.
+Vorschläge:
+
+ - Man ändere den Bereich (Vorsicht: maxint ist 32767).
+ - Man teste die Teiler bis zur Zahl selbst hoch.
+ - Man benutze REALs anstelle von INTs.
+ - Man suche Zwillinge.
+
+An Editor-Möglichkeiten könnte man ausprobieren:
+
+ RUBOUT löscht ein Zeichen.
+
+ RUBIN schaltet den Einfügezustand ein. Das nächste RUBIN
+ schaltet ihn wieder ab.
+
+ HOP UNTEN zum Anfang des Bildschirms oder "blättern nach oben".
+
+ HOP OBEN zum Ende des Bildschirms oder "blättern nach unten".
+
+ HOP RUBOUT am Zeilenanfang löscht die ganze Zeile.
+
+ HOP RUBIN schaltet "Zeilen einfügen" ein. Das nächste HOP RUBIN
+ schaltet es wieder aus.
+
+
+Datei löschen
+
+<---- forget RETURN
+
+----> ("prim")
+
+----> löschen (j/n) ?
+
+<---- j
+
+----> gib kommando:
+
+
+Ende einer Sitzung
+
+<---- end RETURN
+
+----> task loeschen (j/n) ?
+
+<---- j
+
+----> EUMEL Version 1.7.3 / M
+
+
+
+3. Einige Eigenschaften des EUMEL-Systems
+
+In diesem Abschnitt werden wir einige Eigenschaften des EUMEL-Systems
+schildern, die zum korrekten Arbeiten mit dem System wichtig sind. Um das
+Verständnis zu erleichtern, verwenden wir für einige System-Eigenschaften
+Modelle, die das Verhalten des Systems an typischen Merkmalen widerspiegeln
+spiegeln sollen, die aber - wie bei allen Modellen - kein exaktes Abbild
+darstellen.
+
+
+Tasks, Supervisor und Monitor
+
+Zuerst versuchen wir zu erklären, wie sich ein Benutzer im EUMEL-System
+anmeldet und den Mechanismus, wie man bestimmte Leistungen vom System
+anfordert (Einige Ideen dieses ersten Abschnittes gehen auf W. Ambros,
+Rhein-Sieg Gymnasium, St. Augustin, zurück).
+
+Stellen wir uns das EUMEL-System als ein riesiges Verwaltungsgebäude vor,
+wie es in unseren Städten in den letzten Jahren überall gebaut wurde. Ein
+Verwaltungsangestellter beginnt frohgemut seinen ersten Arbeitstag. Da das
+Gebäude so riesig ist, kann er sein Zimmer nicht finden. Aber er ist pfiffig:
+er fragt einfach den freundlichen Pförtner, der ihn in sein Zimmer führt.
+
+So ist es im EUMEL-System:
+Wenn man eine Arbeit neu beginnen will, muß man sich beim Supervisor (das ist
+der Pförtner in unserem Modell) anmelden. Dazu muß man erstmal den Supervisor
+"wecken" (wie mit einer Klingel): wir drücken die Supervisor-Taste (im
+folgenden mit SV abgekürzt). Der Supervisor meldet sich dann mit
+
+ gib supervisor kommando :
+
+Nun kann man eine Task anmelden. Das ist ein Zimmer im EUMEL-System, in dem
+man arbeiten kann, ohne von den anderen Benutzern gestört zu werden. Ist die
+Task noch nicht vorhanden, wird sie eingerichtet. Dann leitet uns der Super-
+visor in die angegebene Task.
+
+Der Verwaltungsangestellte ist nun vom Pförtner zu seinem Büro geleitet
+worden. Dort empfängt ihn der Bürovorsteher: "Was möchten Sie arbeiten?"
+Unser Angestellter kann nun (z.B.) sagen, daß er etwas schreiben möchte. Der
+Bürovorsteher führt ihn in einen speziellen Schreibraum, in dem einige
+spezielle Einrichtungen und Geräte für komfortables Schreiben stehen.
+
+So sieht es im EUMEL-System aus:
+Nachdem man eine neue Task eingerichtet hat oder eine bereits vorhandene
+fortsetzen will, gelangt man zum Monitor (das ist unser Bürovorsteher), der
+sich mit
+
+ gib kommando :
+
+meldet. Nun kann man verschiedene Arbeiten verrichten, wie z.B. den Editor
+rufen, um einen Text oder ein Programm zu schreiben:
+
+ edit ("meine datei")
+
+In diesem Schreibzimmer kann unser Angestellter irgendetwas schreiben, z.B.
+ein Programm, einen Liebesbrief, ein Testament oder ganz etwas anderes. Hat
+er eine Frage oder will er eine besondere Leistung, dann kann unser Ange-
+stellter den Bürovorsteher aus dem Schreibzimmer rufen. Hat er seine Schreib-
+arbeit beendet, geht er aus dem Zimmer und trifft dort wiederum auf den auf-
+merksamen Vorsteher. Ihm kann er nun sagen, daß er das Schriftstück (z.B.)
+drucken oder von einem Dolmetscher übersetzen lassen will.
+
+Im EUMEL-System:
+Im Editor schreibt man Texte oder Programme. Während man im Editor ist, kann
+man besondere Leistungen durch Kommandos anfordern, ohne den Editor zu ver-
+lassen, z.B. in einer anderen Datei nachschauen oder einen Teiltext in dem
+geschriebenen Schriftstück suchen. Nachdem die Arbeit beendet ist, verläßt
+man den Editor (ESC q) und gelangt wiederum in den Monitor. Hier kann man
+das Schriftstück drucken oder - im Falle eines Programms - übersetzen lassen:
+
+ print ("meine datei")
+ run ("meine datei")
+
+Hat das Programm einen Fehler, eröffnet uns der Monitor ein Fenster auf die
+Datei und zeigt uns gleichzeitig die Fehlermeldungen, so daß wir bequem
+korrigieren können.
+
+Nachdem unser Angestellter mit seinen Arbeiten fertig ist, kann er dem Vor-
+steher (Monitor) sagen:
+
+ Ich kündige! (will nicht mehr weiterarbeiten) ('end')
+ Bis Morgen! (will später weiterarbeiten) ('break')
+
+Merke: Der Supervisor des EUMEL-Systems regelt die Einrichtung, Zugang und
+ Löschung von Tasks. In einer Task kann ein Benutzer arbeiten, ohne
+ von anderen gestört zu werden. Spezielle Tasks sind für allgemeine
+ Aufgaben vorgesehen, wie z.B. das Drucken und Sichern von Dateien.
+ Durch den Monitor kann man Kommandos innerhalb einer Task geben.
+
+
+Demand Paging
+
+Nun versuchen wir einen zentralen Begriff des EUMEL-Systems zu erklären, das
+"demand paging". Diese Eigenschaft moderner Rechensysteme sorgt dafür, daß
+bei (normalerweise immer) beschränkten Speicherkapazitäten eines Rechners
+Programme bearbeitbar sind, die in ihrer Gesamtgröße nicht in den Speicher
+des Rechners passen würden.
+
+Nehmen wir wieder den Angestellten, der nun in einem Zimmer (Task) auf einem
+Tisch das EUMEL-Benutzerhandbuch durcharbeiten will. Stellen wir uns weiter
+vor, daß er das Benutzerhandbuch nicht rein "sequentiell" lesen will, sondern
+daß er fortwährend "blättern" muß. Eigentlich muß unser Angestellter mehrere
+Seiten des Benutzerhandbuchs gleichzeitig lesen. Deshalb kommt er auf die
+listige Idee, die Seiten, die er dringend benötigt, zu photokopieren und auf
+seinem Tisch nebeneinander auszubreiten, damit er nicht mehr blättern muß.
+Leider ist sein Tisch zu klein, um alle photokopierten Seiten darauf auszu-
+breiten. Durch die Sparbemühungen der Regierung ist es auch aussichtslos,
+sich um einen größeren Tisch zu bemühen. Aber im Titel für Verbrauchsmaterial
+ist genügend Geld vorhanden, so daß Papier für den Photokopierer angeschafft
+werden kann. Außerdem geht das Photokopieren sehr schnell, weil er den Photo-
+kopierer direkt neben seinen Tisch aufbaut. Darum photokopiert er nur die-
+jenigen Seiten, die er gerade benötigt und legt diese auf seinen Tisch.
+Braucht er eine neue Seite aus dem Buch und hat diese auf dem Schreibtisch
+keinen Platz mehr, so muß er eine auf dem Tisch liegende Seite entfernen.
+Geschickt wählt sich unser Angestellter eine Seite aus, von der er annimmt,
+daß er diese nicht so schnell wieder benötigt.
+
+Was macht er nun mit der "alten" Seite? Er könnte die kopierte Seite einfach
+in das Benutzerhandbuch einordnen. Aber dazu müßte er erstmal in dem Benut-
+zerhandbuch suchen, was ihm zuviel Mühe macht. Deshalb wirft er diese Seite
+einfach weg, denn er kann sie ja jederzeit wieder aus dem Handbuch kopieren.
+
+Gerade will er eine Seite wegwerfen, da fällt ihm auf, daß er das "Wegwerf"-
+Verfahren vielleicht nicht immer anwenden sollte. Seine Notizen, die er sich
+auf einigen Seiten gemacht hat, würden ja mit weggeworfen und damit ver-
+nichtet. Deshalb wirft er Seiten mit Notizen nicht weg, sondern tauscht diese
+Seiten mit den ursprünglichen Seiten im Benutzerhandbuch aus.
+
+Fassen wir zusammen:
+Jemand arbeitet ein Buch "durch". Er kopiert sich diejenigen Seiten, die er
+jeweils benötigt. Da sein Tisch zu klein ist, um alle Seiten gleichzeitig
+auszulegen, kann er immer nur einen Ausschnitt aus dem Buch bearbeiten, was
+aber ausreicht. Braucht er eine neue Seite, so muß er eine auf dem Tisch
+liegende Seite "verdrängen". Hat er diese Seite nicht verändert, also mit
+Notizen versehen, so kann er sie einfach wegwerfen. "Veränderte" Seiten
+ersetzt er im Buch und bewahrt sie somit auf.
+
+Ähnliches erfolgt auch im EUMEL-System:
+Der Zentralspeicher (der Tisch in unserem Modell) des Rechners ist meist ge-
+genüber dem Massenspeicher, der im EUMEL-System auch als "Hintergrund" be-
+zeichnet wird (Floppy oder Magnetplatte; in unserem Modell das Buch) zu
+klein, als daß alle Informationen gleichzeitig hineinpassen würden. Darum
+werden alle Informationen in sogenannte Seiten ("pages") unterteilt, die
+jeweils 512 Byte (ein Byte entspricht einem Zeichen) groß sind. Wird eine
+Information benötigt, so wird die betreffende Seite in den Speicher geholt
+(daher auch der Begriff "demand paging", etwa: Seitenaustausch auf An-
+forderung). Das geht so lange gut bis der gesamte Platz im Zentralspeicher
+des Rechners belegt ist. Soll nun eine neue Seite vom Massenspeicher geholt
+werden, weil die darin enthaltenen Informationen gebraucht werden, muß eine
+Seite im Zentralspeicher ersetzt werden (Fachwort: die Seite muß "verdrängt"
+werden). Sie kann überschrieben werden (in unserem Modell wurde sie "wegge-
+worfen"), wenn keine Veränderungen vorgenommen wurden, d.h. keine Schreibzu-
+griffe, sondern nur Lesezugriffe auf die Seite erfolgten. Wurde die Seite
+verändert, so muß sie auf den Hintergrund zurückkopiert werden und dort die
+ursprüngliche Seite ersetzen.
+
+
+Merke: Die Vorteile eines "demand paging" Systems sind nun offensichtlich:
+ Es ist möglich, bei weitem größere Informationsmengen (Daten und/oder
+ Programme) zu bearbeiten als diejenige, die eigentlich in den vor-
+ handenen Speicher passen würde, weil tatsächlich immer nur ein Aus-
+ schnitt der gesamten Informationsmenge zu einem Zeitpunkt bearbeitet
+ werden muß. Bei traditionellen Systemen ist dagegen die maximale Größe
+ von Programmen und Daten durch die physikalische Größe des Zentral-
+ speichers beschränkt.
+
+
+Sharing
+
+Sharing bezeichnet die gemeinsame Nutzung von Seiten ("pages") durch mehr
+als einen Benutzer.
+
+Zurück zu unserem Angestellten: Dieser ist inzwischen fleißiger geworden und
+hat das gleiche Verfahren auf mehrere Bücher ausgedehnt, d.h. er kopiert sich
+diejenigen Seiten aus den Büchern, die er gerade benötigt. Bei der Ver-
+drängung einer Seite behält er sein altes (nicht sehr umweltfreundliches)
+Verfahren bei: nur die veränderten Seiten ersetzen die Original-Seiten in den
+Büchern (werden zurückgelegt), die anderen (nicht veränderten) weggeworfen.
+
+Aber auch andere Angestellte seines Büros haben ihn beobachtet, beneiden ihn
+um seine "geschickte" Arbeitstechnik und wollen mitarbeiten. Leider steht
+ihnen gemeinsam nur der eine Tisch zur Verfügung, der zudem in der Zwischen-
+zeit auch nicht größer geworden ist, weil die Sparmaßnahmen der Regierung
+noch immer anhalten. Darum müssen sie sich nun den einzigen Tisch teilen, auf
+dem sie ihre kopierten Seiten auslegen können.
+
+Im Laufe der Arbeit ergibt es sich, daß sie unterschiedliche Seiten der
+Bücher durcharbeiten müssen, weil sie verschieden schnell arbeiten, aber auch
+andere Arbeitsgebiete haben.
+
+Durch die unterschiedliche Arbeitsgeschwindigkeit ergibt es sich, daß ein
+Angestellter z.B. zu einem Zeitpunkt sich intensiv nur mit einer Seite be-
+schäftigt, ein anderer aber mehrere Seiten quasi gleichzeitig braucht. Aber
+oft brauchen mehrere Angestellte mehrere Seiten, so daß der verfügbare Platz
+auf dem Tisch bald etwas zu eng wird. Natürlich "funktioniert" unser Ver-
+fahren immer noch, aber es ist doch etwas langsam geworden, weil unsere
+Angestellten mehr mit dem Austausch von Seiten beschäftigt sind, als daß sie
+noch zu dem Verarbeiten der gelesenen Informationen kommen. Sie überlegen
+also, wie das Verfahren zu verbessern ist und kommen auf folgenden Trick:
+kopierte Seiten, die zwei oder mehr Angestellte zur gleichen Zeit bearbeiten
+wollen, brauchen nur einmal auf dem Tisch zu liegen (schließlich sind unsere
+Angestellten gewöhnt, in Gruppen zu arbeiten). Diese Rationalisierungs-Idee
+ist ja offensichtlich, denn schließlich benutzen die Angestellten die Bücher
+auch gemeinsam. Aber Vorsicht: wenn einer der Angestellten, die gemeinsam
+eine Seite bearbeiten, sich etwas auf dieser Seite notieren will, darf nicht
+die gemeinsam auf dem Tisch liegende Seite verwendet werden. In diesem Fall
+ist es notwendig, vorher eine erneute Kopie zu machen, weil andere Ange-
+stellte seine Notizen nicht unbedingt mitlesen sollen, also die unveränderte
+Seite brauchen.
+
+Und das findet im Rechner statt:
+Das "demand paging" Verfahren funktioniert natürlich nicht nur mit einer
+Datei und einem Programm, sondern auch mit mehreren Dateien und Programmen,
+von denen nur diejenigen Seiten in den Zentralspeicher geholt werden, die zu
+einem Zeitpunkt in den Rechner passen. Aber erst mit mehreren Benutzern des
+EUMEL-Systems entfaltet das "demand paging" Verfahren seine volle Mächtig-
+keit, denn alle Benutzer können Programme und/oder Dateien verarbeiten, die
+in der Gesamtheit nicht in den Speicher passen würden. Dabei wird eine Eigen-
+schaft des EUMEL-Systems gut genutzt: Alle Programme des EUMEL-Systems (und
+übrigens alle Programme, die der ELAN-Compiler übersetzt hat) sind reentrant,
+d.h. können von mehreren Benutzern gleichzeitig gelesen werden, aber brauchen
+nur einmal im Zentralspeicher vorhanden zu sein. Zwei oder mehr Benutzer
+können also eine oder mehrere Seiten gemeinsam verwenden (Fachausdruck:
+"sharen"), sowohl im Zentralspeicher wie auch im Massenspeicher ("Hinter-
+grund"). Dies gilt nicht nur für Programme, sondern auch für Daten. Erst
+wenn ein Benutzer eine Veränderung vornimmt, also schreibend auf die Seite
+zugreift, wird diese Seite (nur für diesen Benutzer!) kopiert (EUMEL-Fachaus-
+druck: "copy on write"). Alle anderen Benutzer arbeiten mit der unveränderten
+Seite weiter. Der große Vorteil dieses Verfahrens: eine redundante
+Speicherung von Daten und Programmen wird vermieden.
+
+Es passiert nun oft, daß ein Benutzer zu einem Zeitpunkt relativ wenig Seiten
+benötigt: sei es, daß er Daten mit Hilfe des Editors eingibt oder nachdenkt,
+sei es, daß ein Programm wenig Daten verwendet und selbst sehr kurz ist. Mit
+anderen Worten: die Anzahl der benötigten Seiten zu einem Zeitpunkt (Fachaus-
+druck: "working set") für diesen Benutzer ist klein. Dann ist es möglich, daß
+andere Benutzer zu diesem Zeitpunkt mehr Seiten im Zentralspeicher des Rech-
+ners haben. Deren "working set" ist also groß.
+
+Merke: Damit wird ein weiterer Vorteil des "demand paging" Verfahrens klar:
+ Ein "demand paging" System stellt sich automatisch und dynamisch auf
+ die Anforderungen von Benutzern ein, indem denjenigen Benutzern mehr
+ Speicher zugeteilt wird, die mehr benötigen und umgekehrt. Aber auch
+ ein Nachteil wird sichtbar: Benötigen alle Benutzer des Systems viel
+ Zentralspeicher, dann kann es zu folgender Situation kommen: Benutzer
+ A benötigt eine neue Seite. Das System verdrängt für diesen Zweck eine
+ Seite, die Benutzer B gehört. Nachdem Benutzer B an die Reihe kommt,
+ benötigt er diese Seite wieder. Das System verdrängt eine Seite des
+ Benutzers A u.s.f.. Eine solche Situation, in der "pages" ständig in
+ den Speicher kopiert und aus dem Speicher bei einer Seitenverdrängung
+ auf den Hintergrund geschrieben werden muß (und somit kaum gerechnet
+ wird), wird als "thrashing" bezeichnet. "thrashing" oder mit anderen
+ Worten: sehr geringer Verbrauch an Rechenzeit bei gleichzeitig er-
+ höhtem "paging"-Aufwand ist ein Anzeichen für zu hohe Anforderungen
+ an das System (Ausweg: Erweiterung des Hauptspeichers oder Be-
+ schleunigung des Hintergrundmediums (Platte statt Floppy) oder
+ Reduktion der Anforderungen).
+
+
+Datenräume
+
+Datenräume sind die Grundlage für Dateien im EUMEL-System.
+
+Zurück zu unseren Angestellten:
+Nachdem die Verbesserung vorgenommen wurde, daß sich zwei oder mehr Ange-
+stellte eine Seite auf dem Tisch "teilen", tritt sofort ein neues Problem
+auf. Es kann nun nämlich passieren, daß zwei Angestellte eine Original-Seite
+verändern und beide in dem gleichen Buch ersetzt werden müssen. Es befinden
+sich somit noch mindestens zwei andere mit Notizen versehene Seiten mit
+gleicher Seitennummer in einem Buch. Zu allem Unglück wurde die Original-
+Seite ersetzt, so daß andere Angestellte nur die mit Notizen versehene Seiten
+erhalten können. Was ist zu tun? Das Verfahren sollte doch beibehalten
+werden, denn schließlich ist eine totale Abkehr von Arbeitsvorgängen für
+Verwaltungsangestellte nicht denkbar.
+
+Als erste Idee kommt ihnen in den Sinn, einfach alle Bücher für alle Ange-
+stellten zu photokopieren. Dann kann es ja nicht zu einer solchen Kollision
+kommen, daß zwei oder mehr Angestellte eine Seite in einem Buch ersetzen
+wollen, weil jeder Angestellte seine eigene Kopie besitzt. Um die ver-
+schiedenen Kopien eines Buches auseinander zu halten, wird von den Ange-
+stellten verlangt, ihre Buch-Kopie mit einem sinnvollen Namen zu versehen.
+Dies Verfahren funktioniert auch eine Weile, bis ein strebsamer Angestellter
+einen Verbesserungsvorschlag macht, der prompt mit DM 5,- honoriert wird:
+wie bereits mit den Seiten auf dem Tisch geschehen, ist es ja nicht not-
+wendig, die Bücher zu photokopieren, sondern nur die mit Notizen versehenen
+in einen Ordner, der entsprechend einer Buch-Kopie angelegt wird, einzu-
+ordnen. Alle anderen, nicht veränderten Seiten können noch immer gemeinsam
+benutzt werden.
+
+Und so funktioniert es nun:
+Bei Arbeitsbeginn finden die Angestellten einen Buchbestand vor. Um mit einem
+Buch arbeiten zu können, muß ein Angestellter einen Ordner für dieses Buch
+anlegen, in den die ggf. veränderten Seiten eingeordnet werden. Zu diesem
+Zweck muß jeder Ordner einen sinnvollen Namen erhalten, damit die Angestell-
+ten ihre Ordner auch wiederfinden. Am Anfang müssen die Angestellten Seiten
+der Original-Bücher kopieren. Wird eine solche Seite mit Notizen versehen,
+also verändert, muß sie bei einer Verdrängung in den entsprechenden Ordner
+eingefügt werden. Muß ein Angestellter eine neue Seite kopieren, so schaut
+er erst in seinem Ordner nach, ob sich die entsprechende Seite dort befindet.
+Damit wird garantiert, daß jeder Angestellte auch immer seine, mit Notizen
+versehene Seiten erhält. Befindet sich eine gesuchte Seite nicht in dem
+Ordner (am Arbeitsbeginn ist ein Ordner natürlich immer leer), so kopiert er
+sich eine Seite aus dem entsprechenden Original-Buch.
+
+In der Zwischenzeit passiert folgendes im Rechner:
+Eine Sammlung von Daten und/oder Programmen wird im EUMEL-System ein "Daten-
+raum" ("dataspace") genannt. Erhält ein Datenraum einen Namen, so wird
+dieser Datenraum eine Datei ("file") genannt. Angenommen, es existiert im
+System eine Datei mit dem Namen 'Mist', die ein Angestellter mit dem Namen
+'Krümel Monster' erstellt hat. Ein anderer Benutzer mit dem Namen 'Grobi'
+will mit dieser Datei arbeiten. Grobi kopiert sich also diese Datei und gibt
+ihr den Namen 'Grobis Mist'. Durch diese Kopier-Operation wird ein neuer
+Datenraum angelegt, der aber anfänglich nur Verweise auf den Datenraum ent-
+hält, der sich unter dem Namen 'Mist' verbirgt. Der Datenraum bzw. die
+Seiten, die in Datei 'Mist' enthalten sind, werden also "geshared", d.h. von
+mehreren Benutzern gemeinsam verwendet (in unserem Beispiel von Grobi und
+Krümel Monster). Es erfolgt also eine logische Kopie, aber keine physika-
+lische!
+
+Will der Angestellte Grobi nun eine Seite der Datei 'Grobis Mist' verwenden,
+so erhält er natürlich die entsprechende Seite aus der Datei 'Mist'. Ver-
+ändert der Angestellte Grobi nun eine Seite, so wird diese veränderte Seite
+in dem Datenraum vermerkt, der unter dem Namen 'Grobis Mist' ansprechbar ist.
+Davon merkt der Benutzer 'Krümel Monster' natürlich nichts, denn er arbeitet
+mit den Seiten seines Datenraums weiter, die unverändert geblieben sind. Aber
+auch Grobi merkt nichts davon, daß Seiten soweit wie möglich gemeinsam be-
+nutzt werden.
+
+Merke: Durch das Konzept der Datenräume und Dateien (die nichts anderes sind
+ als benannte Datenräume), ist es möglich, auch Daten von verschiedenen
+ Programmen her gemeinsam zu benutzen und somit eine redundante
+ Speicherung überflüssig zu machen. Programme sind ebenfalls in Daten-
+ räumen gespeichert, so daß einer gemeinsamen Benutzung von z.B.
+ Systemprogrammen durch mehrere Nutzer nichts im Wege steht.
+
+
+
+Fixpunkte
+
+In gewissen Zeitabständen wird der gesamte Systemzustand eines EUMEL-Systems
+gespeichert ("Fixpunkt"). Bei eventuell auftretenden Störungen kann dadurch
+immer bei dem letzten Fixpunkt mit der Verarbeitung fortgefahren werden.
+
+Zurück zu unseren Angestellten, die typischerweise dieses komische System
+weiter benutzen: Es passiert zum ersten Mal ein entsetzliches Unglück:
+während im Sommer mehrere Fenster geöffnet wurden, betritt der "reitende"
+Bürobote das Zimmer und alle Seiten werden von den Tischen und aus allen
+offenen Ordnern herabgeweht. Da unsere Angestellten - wie man sich leicht
+vorstellen kann - etwas vergeßlich sind, können sie nicht mehr rekon-
+struieren, welche Seiten auf den Tischen und welche sich in den Büchern bzw.
+Ordnern befanden. Die Arbeit von mehreren Monaten ist somit verloren!
+
+Deshalb werden Sicherheitsmaßnahmen getroffen:
+In regelmäßigen Zeitabständen müssen alle Angestellten ihre Arbeit unter-
+brechen. Dann wird von einem - extra dazu abgestellten - Angestellten Listen
+angelegt, in denen die Seiten auf dem Tisch, den Ordnern und den Büchern
+vermerkt wird. Im Falle eines erneuten Unglücks braucht man also nur die
+letzte dieser Listen zu konsultieren, um eine gesicherte Arbeitssituation
+herzustellen. Allerdings ist in einem solchen Fall diejenige Arbeit verloren,
+die in der Zwischenzeit seit der Erstellung der letzten Liste geleistet
+wurde. Aber das wird ja gerne in Kauf genommen, weil überhaupt weitergemacht
+werden kann und nicht die gesamte Arbeit verloren ist.
+
+Merke: In gewissen (einstellbaren, typisch: 15 Minuten) Zeitabständen wird
+ vom EUMEL-System der gesamte Zustand des Systems gesichert. Diese
+ Sicherung wird "Fixpunkt" genannt. Dazu ist es notwendig, daß die
+ Verarbeitung der Programme kurz (z.Z. 0.2 Sek.) unterbrochen wird,
+ was sich jedoch meist nicht besonders störend auswirkt. Damit ist es
+ aber sichergestellt, daß bei einem Stromausfall, Hardware- oder Soft-
+ warestörungen immer zu einem Zeitpunkt in der Verarbeitung "aufge-
+ setzt" werden kann, bei dem nur diejenigen Daten verloren sind, die
+ seit dem letzten "Fixpunkt" aufliefen.
+
+
+
+Archiv
+
+Ein weiteres Sicherungsmittel im EUMEL-System ist das Archiv, mit welchem
+man Dateien (also Daten und/oder Programme) extern zum EUMEL-System
+speichern kann.
+
+Verlassen wir nun lieber unsere Angestellten. Dieses Modell würden wir sonst
+übermäßig strapazieren. Wenden wir uns vielmehr einem weiteren Sicherungs-
+mittel des EUMEL-Systems zu, dem EUMEL-Archiv. Mit Hilfe des EUMEL-Archivs
+ist es möglich, Dateien auf Floppies zu schreiben und somit außerhalb des
+EUMEL-Systems aufzubewahren. Es ist nun möglich, mehrere Dateien auf einer
+Floppy zu speichern. Bloß wie funktioniert das?
+
+Ein gutes Modell des EUMEL-Archivs stellt ein Tonband oder eine Musikkassette
+dar. Auf diesen werden die Musikstücke (unsere Dateien) nacheinander (Fach-
+ausdruck: "sequentiell") aufgezeichnet, d.h. neue Musikstücke (Dateien)
+können immer nur angefügt werden. Ist das Tonband oder die Kassette voll
+beschrieben, so schaltet das Gerät meist automatisch ab. Im EUMEL-System
+gibt's in solchen Fällen eine Fehlermeldung.
+
+Unterschiedlich zu einem Tonband ist jedoch, daß im EUMEL-System die Namen
+der Dateien mit abgespeichert werden und diese Dateien - durch die Angabe
+des Dateinamens - gezielt vom Archiv gelesen werden können. Bei einem Ton-
+band oder einer Kassette muß man sich erst alle Musikstücke anhören, bis
+das Musikstück erreicht ist, welches benötigt wird. Dieses "sequentielle"
+Überlesen nicht benötigter Dateien erledigt das EUMEL-System "automatisch".
+
+Im EUMEL-System gibt es nun nicht nur die Möglichkeit, eine Datei auf ein
+Archiv zu schreiben oder von einem Archiv zu lesen, sondern auch mehrere Da-
+teien mit einem Kommando zu lesen oder zu schreiben. Zusätzlich ist es mög-
+lich, ein Archiv zu löschen (und dann ggf. neu zu beschreiben), wenn die
+"archivierten" Dateien nicht mehr benötigt werden.
+
+Nun passiert es oft, daß eine bereits archivierte Datei verändert wird und
+nochmals auf das Archiv geschrieben werden soll. Aber durch eine Veränderung
+der Datei hat diese gerade ihren Platzbedarf verändert. Somit könnte die
+Datei - sofern sie sich vergrössert hat - eine nachfolgende Datei auf dem
+Archiv u.U. teilweise überschreiben. Deshalb wurde im EUMEL-Archiv folgende
+Vereinbarung getroffen: Wird eine Datei nochmals auf ein Archiv geschrieben,
+so wird die Datei, die sich bereits auf dem Archiv befindet, als "ungültig"
+gekennzeichnet und die neue Version an das Ende angefügt. Nur wenn die alte
+Datei die letzte auf dem Archiv ist, wird sie von der neuen Version über-
+schrieben.
+
+Merke: Durch dieses Verfahren kann es zu einer kuriosen Situation kommen:
+ zwei Dateien werden abwechselnd auf ein Archiv in mehreren Versionen
+ geschrieben. Obwohl beide Dateien zusammengenommen bei weitem nicht
+ das Archiv auffüllen würden, kommt es zum Überlauf. In einem solchen
+ Fall muß man das Archiv löschen (wobei vorher die Dateien ggf. in das
+ System geholt werden müssen) und beide Dateien erneut auf das Archiv
+ schreiben.
+
+
+
+4. Kleines #ib#EUMEL-Wörterbuch
+
+In diesem Wörterbuch werden einige der Begriffe, die häufig in diesem Be-
+nutzer-Handbuch verwendet werden, erläutert. Bezüge auf weitere Begriffe,
+die in diesem Wörterbuch stehen, werden mit den Zeichen ">" und "<" ge-
+klammert.
+
+Anweisung: Direktive an die Textkosmetik, welche direkt in einen Text
+ geschrieben wird. Eine Anweisung muß in "\#" eingefaßt
+ werden. Beachte den Unterschied zu einem Kommando.
+
+Archiv: Ein Programmsystem, um Dateien des EUMEL-Systems auf
+ Floppys außerhalb des Systems zu speichern oder von dort
+ wieder in das EUMEL-System zu holen. Als Archiv wird auch
+ noch ein Speichermedium bezeichnet (in der Regel eine
+ Diskette).
+
+Benutzer-Task: Im Gegensatz zu einer >System-Task< ist eine Benutzer-Task
+ eine Task, die von einem Benutzer erzeugt worder ist. Sie
+ ist entweder an ein Terminal gekoppelt oder kann unab-
+ hängig von einem Terminal im Hintergrund bearbeitet werden.
+
+BOUND: Attribut von Variablen, das bei einer Deklaration vor die
+ Typangabe gesetzt wird. Dient zur Aufprägung eines Daten-
+ typs auf einen Datenraum.
+
+DATASPACE: Eine Datei ohne Namen.
+
+Datenraum: Siehe >DATASPACE<.
+
+Editor: Programm zur Eingabe und Veränderung von Texten, Daten und
+ Programmen.
+
+ELAN: Programmiersprache des EUMEL-Systems ("ELementary
+ LANguage").
+
+ELAN-Compiler: Ein Programm, welches ein korrektes ELAN-Programm in ein
+ äquivalentes, ablauffähiges Programm (im >EUMEL0-Code<)
+ übersetzt.
+
+EUMEL0-Code: Maschinensprache des EUMEL-Systems.
+
+EUMEL-Drucker: Programm zur Ansteuerung von (unterschiedlichen) Druckern.
+ Der EUMEL-Drucker wird durch Kommandos gesteuert und er-
+ laubt es, unterschiedliche Drucker mit verschiedenartigen
+ Leistungen immer gleich anzusprechen.
+
+EUMEL-Standard: Objekte (also Datentypen, Prozeduren und/oder Operatoren),
+ die durch Pakete realisiert werden und standardmässig in
+ jedem EUMEL-System verfügbar sind.
+
+Fixpunkt: Speicherung des aktuellen Systemzustandes in regelmäßigen
+ Abständen. Bei Hardware- oder Softwarestörungen kann immer
+ bei der letzten Fixpunkt-Sicherung aufgesetzt werden.
+
+Hintergrund-Task: Eine >Task<, die nicht an ein Terminal angekoppelt ist
+ (d.h. einem Benutzer nicht direkt zugänglich), aber trotz-
+ dem vom System bearbeitet wird oder im Wartezustand ist
+ (warten auf einen Auftrag oder eine Ein/Ausgabe-Operation).
+
+Kommando: Ein ELAN-Programm, welches in der Regel aus einem
+ Prozeduraufruf besteht. Ein Kommando kann vom >Monitor<
+ oder Editor gegeben werden. Kommandos können ebenfalls in
+ Programmen verwandt werden.
+
+Lokale Dateien: Dateien einer Benutzer-Task.
+
+Manager: Eine >Task<, die auf Aufträge wartet. Beispiele sind die
+ Spool-Task bzw. Datei-Manager. Letzterer wird für die
+ Haltung längerfristig benötigter Dateien gebraucht.
+
+Monitor: Der Monitor steuert die Kommunikation zwischen einem
+ Benutzer am Terminal und dem EUMEL-Betriebssystem, nachdem
+ der Benutzer sich mit Hilfe des >Supervisors< eine Task
+ erschaffen hat. Die Monitor-Kommandos beziehen sich immer
+ auf die angekoppelte Benutzer-Task.
+
+paging: Benötigte Informationen werden in Einheiten ("pages") in
+ den Zentralspeicher des Rechners geladen. Somit ist es
+ möglich, bei weitem größere Informationsmengen zu ver-
+ arbeiten, als auf einmal in den Speicher des Rechners
+ passen.
+
+OPERATOR: >Task<, mit der das EUMEL-System u.a. gestartet, "abge-
+ schaltet" und gesichert werden kann.
+
+Scanner: Programm, um aus einem Text lexikalische Elemente ("Le-
+ xeme") herauszublenden. In dem im >EUMEL-Standard<
+ implementierten Scanner werden Lexeme nach der ELAN-Syntax
+ erkannt, redundante Leerzeichen (nicht in Texten) sowie
+ Kommentare überlesen.
+
+Sendungs-Vermittlung: Steuerung der Ãœbermittlung von Informationen zwischen
+ verschiedenen >Tasks<.
+
+sharing: >Datenräume< und/oder >pages< können von mehreren Benutzern
+ gleichzeitig benutzt werden. Erst bei einer Schreibopera-
+ tion eines Benutzers wird nur für diesen Nutzer eine Kopie
+ der Daten angelegt. ("copy on write").
+
+Spooler: Systemprogramm des EUMEL-Systems, welches Druckaufträge
+ zwischenspeichert, so daß unmittelbar weiter gearbeitet
+ werden kann.
+
+Supervisor: Kern des EUMEL-Betriebssystems auf der ELAN-Ebene zum Ver-
+ walten von Tasks.
+
+Supervisor-Kommando: Kommando zur Steuerung (An-/Abkoppeln, Erzeugen,
+ Benutzung) einer >Benutzer-Task<.
+
+System-Task: Eine >Task<, die für Aufrechterhaltung, Betrieb und Steu-
+ erung des EUMEL-Systems benötigt und nicht von einem
+ Benutzer erzeugt wird, sondern "immer" im >Taskbaum<
+ vorhanden ist.
+
+Task: Eigenständiger Prozeß (Auftrag) im EUMEL-System.
+
+Taskbaum: Eine baumförmige Anordnung von >Tasks<, in die jede Task
+ des EUMEL-Systems eingefügt wird. Dabei hat jede Task
+ - mit Ausnahme des >Urvaters< - eine >Vater-Task<, und
+ kann weitere Tasks erzeugen ("Söhne").
+
+Textkosmetik: Programme des EUMEL-Systems, die die Gestaltung eines
+ Textes erlauben.
+
+Urvater: Wurzel des >Task-Baums< mit dem Namen 'UR'.
+
+Vater-Dateien: Dateien einer >Vater-Task<.
+
+Vater-Task: Eine >Task<, die einer Task in direkt aufsteigender Linie
+ im >Taskbaum< übergeordnet ist. Es wird dabei zwischen
+ einer "unmittelbaren" (die direkt übergeordnete Vater-Task)
+ und "mittelbaren" Vater-Tasks (Vater-Tasks, die über die
+ unmittelbare Vater-Task erreichbar sind) unterschieden.
+
+
+
+5. ELAN-Literatur
+
+Bittner, M., Jäckel, J., Jähnichen, S.:
+ ELAN - Beispielsammlung.
+ Institut für angewandte Informatik,
+ Fachbereich 20, TU Berlin,
+ Berlin, 1979
+
+Hahn, R.:
+ Höhere Programmiersprachen im Vergleich.
+ Akademische Verlagsgesellschaft,
+ Wiesbaden, 1981
+
+Hahn, R., Nienaber, B.:
+ Probleme lösen mit dem Computer.
+ Teil 1: Einführung in die algorithmische Problemlösung.
+ Teil 2: Werkzeuge und Methoden.
+ Neuer Verlag Bernhard Bruscha,
+ Tübingen, 1978
+
+Hahn, R., Stock, P.:
+ ELAN - Handbuch.
+ Akademische Verlagsgesellschaft,
+ Wiesbaden, 1979
+
+Hommel, G., Jäckel, J., Jähnichen, S., Kleine, K., Koch, W., Koster, K.:
+ ELAN - Sprachbeschreibung.
+ Akademische Verlagsgesellschaft,
+ Wiesbaden, 1979
+
+Hommel, G., Jähnichen, S., Koch, W.:
+ SLAN - Eine erweiterbare Sprache zur Unterstützung der strukturierten
+ und modularen Programmierung.
+ 4. GI Fachtagung Programmiersprachen in Erlangen,
+ Springer Verlag, 1976
+
+Hommel, G., Jähnichen, S., Koster, C.H.A.:
+ Methodisches Programmieren.
+ De Gruyter, Berlin, 1983
+
+Klingen, L., Liedtke, J:
+ Programmieren mit ELAN
+ Teubner, Stuttgart, 1983
+
+Liedtke, J.:
+ EUMEL - Ein ELAN-System für Mikroprozessoren.
+ GMD-Spiegel,
+ Bonn, 1979
+
+Voila, H.T.:
+ A new computer routine for the generation of publishable data from
+ nothing.
+ Computer Quickies 48, 117 (1984)
+
+
diff --git a/doc/graphic/Altes Handbuch - Teil 10 - Graphik b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil10
index 36fa31e..0f3b656 100644
--- a/doc/graphic/Altes Handbuch - Teil 10 - Graphik
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil10
@@ -1,263 +1,217 @@
-#type ("trium10")##limit (13.5)#
-#block##start(2.5,2.5)##pagelength(21.0)##pagenr("%",418)##setcount(22)#
-#headeven#
-% EUMEL-Benutzerhandbuch
-
-
-
-#end#
-#headodd#
- TEIL 10: Graphik %
-
-
-
-#end#
-#type("triumb14")#
-#ib(9)##center#TEIL 10: Graphik#ie(9)#
-#type("trium10")#
-#free(2.0)#
-#on("bold")##ib(9)##type("triumb14")#1. Ãœbersicht#ie(9)#
-#type("trium10")#
-
- #limit(12.0)##on("italics")#Dieser Teil des Benutzer-Handbuchs beschreibt die Graphik-
- Möglichkeiten des EUMEL-Systems. Die Graphik-Pakete ge­
- hören nicht zum EUMEL-Standard, sondern sind Anwender­
- pakete, die im Quellcode ausgeliefert und von jeder Installation
- in das System aufgenommen werden können. Unter Umständen
- müssen Programme erstellt werden, die die Anpassungen für
- spezielle graphische Geräte einer Installation vornehmen.
-#limit(13.5)##off("italics")#
-
-Das Graphik-System ermöglicht es, durch ELAN-Programme geräteunab­
-hängige Informationen für Zeichnungen ("#ib#Graphiken#ie#") zu erstellen. Die Graphik
-erzeugenden Programme brauchen dabei keine gerätespezifischen Größen sowie
-gerätespezifischen Unterprogramme zu enthalten. Sie befassen sich somit
-ausschließlich mit der Erzeugung der problemorientierten Information für die
-Konstruktion einer Zeichnung. Nach der geräteunabhängigen Erzeugung einer
-Graphik kann diese auf unterschiedlichen Geräten ausgegeben werden (z.B. erst
-auf einem Terminal zur Kontrolle und dann auf einem Plotter).
-
-Die EUMEL-Graphik umfaßt zwei- und dreidimensionale Graphik. Dabei
-entspricht die Y-Achse bei der zweidimensionalen Graphik der Z-Achse (Höhe)
-bei der dreidimensionalen Graphik. Im dreidimensionalen Fall sind perspektivi­
-sche, orthografische und schiefwinklige Projektionen mit beliebigen Betrach­
+ EUMEL-Benutzerhandbuch
+
+ TEIL 10: Graphik
+
+1. Ãœbersicht
+
+Dieser Teil des Benutzer-Handbuchs beschreibt die Graphik-Möglichkeiten des
+EUMEL-Systems. Die Graphik-Pakete gehören nicht zum EUMEL-Standard, sondern
+sind Anwenderpakete, die im Quellcode ausgeliefert und von jeder Instal-
+ation in das System aufgenommen werden können. Unter Umständen müssen
+Programme erstellt werden, die die Anpassungen für spezielle graphische
+Geräte einer Installation vornehmen.
+
+Das Graphik-System ermöglicht es, durch ELAN-Programme geräteunabhängige
+Informationen für Zeichnungen ("Graphiken") zu erstellen. Die Graphik
+erzeugenden Programme brauchen dabei keine gerätespezifischen Größen sowie
+gerätespezifischen Unterprogramme zu enthalten. Sie befassen sich somit
+ausschließlich mit der Erzeugung der problemorientierten Information für die
+Konstruktion einer Zeichnung. Nach der geräteunabhängigen Erzeugung einer
+Graphik kann diese auf unterschiedlichen Geräten ausgegeben werden (z.B.
+erst auf einem Terminal zur Kontrolle und dann auf einem Plotter).
+
+Die EUMEL-Graphik umfaßt zwei- und dreidimensionale Graphik. Dabei ent-
+spricht die Y-Achse bei der zweidimensionalen Graphik der Z-Achse (Höhe) bei
+der dreidimensionalen Graphik. Im dreidimensionalen Fall sind perspektivi-
+sche, orthografische und schiefwinklige Projektionen mit beliebigen Betrach-
tungswinkeln möglich.
-Bei der EUMEL-Graphik wird streng zwischen Erzeugung und Manipulation von
-Graphiken (Bildern) auf der einen und Darstellung der erzeugten Bilder auf der
-anderen Seite unterschieden. Für die Erzeugung und Manipulation der Graphi­
-ken existiert der Typ PICTURE, für die Darstellung der Bilder gibt es den Typ
-PICFILE. Dabei müssen Ausschnitt, Maßstab, Betrachtungswinkel und Pro­
-jektionsart erst bei der Darstellung festgelegt werden. Diese Konstruktion des
-Graphik-Systems hat folgende Vorteile:
-
-a) Programme, die Graphik-Informationen erzeugen, sind geräteunabhängig.
- Das bedeutet, daß Programmierer sich ausschließlich mit einem logischen
- Problem zu befassen brauchen und nicht mit gerätespezifischen Besonder­
+Bei der EUMEL-Graphik wird streng zwischen Erzeugung und Manipulation von
+Graphiken (Bildern) auf der einen und Darstellung der erzeugten Bilder auf
+der anderen Seite unterschieden. Für die Erzeugung und Manipulation der
+Graphiken existiert der Typ PICTURE, für die Darstellung der Bilder gibt es
+den Typ PICFILE. Dabei müssen Ausschnitt, Maßstab, Betrachtungswinkel und
+Projektionsart erst bei der Darstellung festgelegt werden. Diese Kon-
+struktion des Graphik-Systems hat folgende Vorteile:
+
+a) Programme, die Graphik-Informationen erzeugen, sind geräteunabhängig.
+ Das bedeutet, daß Programmierer sich ausschließlich mit einem logischen
+ Problem zu befassen brauchen und nicht mit gerätespezifischen Besonder-
heiten.
-b) Graphiken können auf mehreren unterschiedlich gearteten Geräten mehrmals
- dargestellt werden, ohne daß das erzeugende Programm geändert oder neu
- gestartet werden muß. Z.B. kann ein Programmierer eine Graphik erst auf
- dem Terminal auf Richtigkeit und Größenverhältnisse überprüfen, bevor er die
- Zeichnung auf einem Plotter zeichnen läßt.
+b) Graphiken können auf mehreren unterschiedlich gearteten Geräten mehrmals
+ dargestellt werden, ohne daß das erzeugende Programm geändert oder neu
+ gestartet werden muß. Z.B. kann ein Programmierer eine Graphik erst auf
+ dem Terminal auf Richtigkeit und Größenverhältnisse überprüfen, bevor er
+ die Zeichnung auf einem Plotter zeichnen läßt.
-c) Graphiken können leicht geändert (z.B. vergrößert oder in eine Richtung
- gestreckt) werden, ohne daß das erzeugende Programm erneut durchlaufen
- werden muß. Zudem können Graphiken aneinander oder übereinander gelegt
+c) Graphiken können leicht geändert (z.B. vergrößert oder in eine Richtung
+ gestreckt) werden, ohne daß das erzeugende Programm erneut durchlaufen
+ werden muß. Zudem können Graphiken aneinander oder übereinander gelegt
werden.
-d) Graphiken mit unterschiedlichen Farben, Strichen usw. können leicht erzeugt
- werden.
+d) Graphiken mit unterschiedlichen Farben, Strichen usw. können leicht er-
+ zeugt werden.
-e) Der Anschluß von neuen Graphik-Geräten durch Benutzer ist leicht möglich,
+e) Der Anschluß von neuen Graphik-Geräten durch Benutzer ist leicht möglich,
ohne daß die Graphik erzeugenden Programme modifiziert werden müssen.
f) Plotter können wie Drucker an einen SPOOLER gehängt werden.
g) Bilder können als PICFILEs gespeichert und versandt werden.
-#free(2.0)#
-#ib(9)##type("triumb14")#Erzeugung von Bildern#ie(9)#
-#type("trium10")#
+
+
+
+Erzeugung von Bildern
Bilder entstehen in Objekten vom Datentyp
-#type("modern12")#
PICTURE
-#type("trium10")#
Diese müssen mit der Prozedur
-#type("modern12")#
nilpicture
-#type("trium10")#
-initialisiert werden. Sie enthalten dann ein leeres Bild, dessen Dimension noch
-nicht festgelegt ist. Die Dimension eines PICTUREs wird mit dem ersten
-Schreibzugriff ('move' oder 'draw') festgelegt. Ein PICTURE kann immer nur
-entweder zwei- oder dreidimensional sein. Außerdem kann einem PICTURE mit
+initialisiert werden. Sie enthalten dann ein leeres Bild, dessen Dimension
+noch nicht festgelegt ist. Die Dimension eines PICTUREs wird mit dem ersten
+Schreibzugriff ('move' oder 'draw') festgelegt. Ein PICTURE kann immer nur
+entweder zwei- oder dreidimensional sein. Außerdem kann einem PICTURE mit
der Prozedur
-#type("modern12")#
pen
-#type("trium10")#
genau ein virtueller Stift zugeordnet oder der aktuelle Stift erfragt werden.
-Die Erzeugung eines Bildes basiert auf dem Modell eines Plotters. Der (virtuelle)
-Zeichenstift kann mit
+Die Erzeugung eines Bildes basiert auf dem Modell eines Plotters. Der (vir-
+tuelle) Zeichenstift kann mit
-#type("modern12")#
move
-#type("trium10")#
-ohne zu zeichnen an beliebige Stellen gefahren werden (reine Positionierung).
+ohne zu zeichnen an beliebige Stellen gefahren werden (reine Positionierung).
Mit
-#type("modern12")#
draw
-#type("trium10")#
-wird der Stift veranlaßt, eine Linie von der aktuellen zur angegebenen Zielposi­
-tion zu zeichnen. 'move' löst also Bewegungen mit gehobenem, 'draw' solche mit
-gesenktem Stift aus. Um auch 'relatives' Zeichnen zu ermöglichen, existiert die
-Prozedur
+wird der Stift veranlaßt, eine Linie von der aktuellen zur angegebenen Ziel-
+position zu zeichnen. 'move' löst also Bewegungen mit gehobenem, 'draw'
+solche mit gesenktem Stift aus. Um auch 'relatives' Zeichnen zu ermöglichen,
+existiert die Prozedur
-#type("modern12")#
where
-#type("trium10")#
die die aktuelle Stiftposition liefert.
-#free(2.0)#
-#ib(9)##type("triumb14")#Manipulation von Bildern#ie(9)#
-#type("trium10")#
+
+
+
+Manipulation von Bildern
Erstellte Bilder können als Ganzes manipuliert werden. Die Prozeduren
-#type("modern12")#
translate (* verschieben *)
stretch (* strecken bzw. stauchen *)
rotate (* drehen *)
reflect (* spiegeln *)
-#type("trium10")#
-verändern jeweils das ganze Bild. Es ist aber auch möglich, mehrere Bilder
+verändern jeweils das ganze Bild. Es ist aber auch möglich, mehrere Bilder
zusammenzufügen. Mit
-#type("modern12")#
CAT
-#type("trium10")#
-kann ein weiteres Bild angefügt werden. Dabei müssen allerdings beide
-PICTURE die gleiche Dimension haben. In solchen als ganzes manipulierten
+kann ein weiteres Bild angefügt werden. Dabei müssen allerdings beide
+PICTURE die gleiche Dimension haben. In solchen als ganzes manipulierten
Bildern kann man ohne Einschränkung mit 'draw' und 'move' weiterzeichnen.
-#free(2.0)#
-#ib(9)##type("triumb14")#Darstellung#ie(9)#
-#type("trium10")#
+
+
+
+Darstellung
Für die Darstellung der erzeugten Bilder existiert der Typ
-#type("modern12")#
PICFILE
-#type("trium10")#
Dieser besteht aus max. 128 PICTUREs, die mit den Prozeduren
-#type("modern12")#
put
get
-#type("trium10")#
-eingegeben bzw. ausgegeben werden können. PICFILE wird durch Datenräume
-realisiert, deshalb erfolgt die Assoziation an einen benannten Datenraum ähnlich
-wie beim FILE. Dafür wird die Prozedur
+eingegeben bzw. ausgegeben werden können. PICFILE wird durch Datenräume
+realisiert, deshalb erfolgt die Assoziation an einen benannten Datenraum
+ähnlich wie beim FILE. Dafür wird die Prozedur
-#type("modern12")#
picture file
-#type("trium10")#
-verwandt. Ein neuer PICFILE enthält genau ein leeres PICTURE. Die Darstellung
-der PICFILEs auf Zeichengeräten erfolgt mit der Prozedur
+verwandt. Ein neuer PICFILE enthält genau ein leeres PICTURE. Die Darstel-
+lung der PICFILEs auf Zeichengeräten erfolgt mit der Prozedur
-#type("modern12")#
plot
-#type("trium10")#
-
-Da die Graphiken aber in "Weltkoordinaten" erzeugt werden und die spätere
-Darstellung vollkommen unbeachtet bleibt, müssen gewisse Darstellungspara­
-meter für die Zeichnung gesetzt werden. Diese Parameter werden im PICFILE
-abgelegt und gelten jeweils für den gesamten PICFILE. Dadurch ist es möglich,
-einen PICFILE mit spezifizierter Darstellungsart über einen SPOOLER an einen
-Plotter zu senden oder die bei der letzten Betrachtung gewählte Darstellung mit
-in dem PICFILE gespeichert zu halten. Für die Darstellung können den virtuellen
-Stiften mit der Prozedur
-
-#type("modern12")#
+
+Da die Graphiken aber in "Weltkoordinaten" erzeugt werden und die spätere
+Darstellung vollkommen unbeachtet bleibt, müssen gewisse Darstellungspara-
+meter für die Zeichnung gesetzt werden. Diese Parameter werden im PICFILE
+abgelegt und gelten jeweils für den gesamten PICFILE. Dadurch ist es möglich,
+einen PICFILE mit spezifizierter Darstellungsart über einen SPOOLER an einen
+Plotter zu senden oder die bei der letzten Betrachtung gewählte Darstellung
+mit in dem PICFILE gespeichert zu halten. Für die Darstellung können den
+virtuellen Stiften mit der Prozedur
+
select pen
-#type("trium10")#
-reale Stifte zugeordnet werden. Voreingestellt ist für alle virtuellen Stifte:
-Standardfarbe, Standardstärke, durchgängige Linie.
+reale Stifte zugeordnet werden. Voreingestellt ist für alle virtuellen
+Stifte: Standardfarbe, Standardstärke, durchgängige Linie.
-Indem man einigen virtuellen Stiften den leeren Stift als realen Stift zuordnet,
-kann man einzelne PICTUREs ausblenden. Sowohl bei der Darstellung von
-zwei- als auch dreidimensionaler Graphik kann die gewählte Zeichenfläche auf
-dem Endgerät mit der Prozedur
+Indem man einigen virtuellen Stiften den leeren Stift als realen Stift zu-
+ordnet, kann man einzelne PICTUREs ausblenden. Sowohl bei der Darstellung
+von zwei- als auch dreidimensionaler Graphik kann die gewählte Zeichenfläche
+auf dem Endgerät mit der Prozedur
-#type("modern12")#
viewport
-#type("trium10")#
-festgelegt werden. Voreingestellt ist das Quadrat mit der größtmöglichen Seiten­
-länge, d.h. der kürzeren Seite der hardwaremäßigen Zeichenfläche.
-#free(2.0)#
-#ib(9)##type("triumb14")#Darstellung zweidimensionaler Graphik#ie(9)#
-#type("trium10")#
+festgelegt werden. Voreingestellt ist das Quadrat mit der größtmöglichen
+Seitenlänge, d.h. der kürzeren Seite der hardwaremäßigen Zeichenfläche.
+
+
-Bei der Darstellung zweidimensionaler Bilder muß der zu zeichnende Ausschnitt
+Darstellung zweidimensionaler Graphik
+
+Bei der Darstellung zweidimensionaler Bilder muß der zu zeichnende Ausschnitt
(das 'Fenster') angegeben werden. Mit der Prozedur
-#type("modern12")#
window
-#type("trium10")#
-
-wird durch Angabe der minimalen und maximalen X- bzw. Y-Koordinaten ein
-Fenster definiert. Da das so definierte Fenster auf die ganze (mit 'viewport'
-definierbare) Zeichenfläche abgebildet wird, ist der Abbildungsmaßstab durch das
-Zusammenspiel von 'viewport' und 'window' bestimmt. Da bei 'viewport' stan­
-dardmäßig das maximale Zeichenquadrat voreingestellt ist, wird in diesem Fall
-durch gleiche X- und Y-Fenstergröße eine winkeltreue Darstellung erreicht.
-#free(2.0)#
-#ib(9)##type("triumb14")#Darstellung dreidimensionaler Graphik#ie(9)#
-#type("trium10")#
+
+wird durch Angabe der minimalen und maximalen X- bzw. Y-Koordinaten ein
+Fenster definiert. Da das so definierte Fenster auf die ganze (mit 'viewport'
+definierbare) Zeichenfläche abgebildet wird, ist der Abbildungsmaßstab durch
+das Zusammenspiel von 'viewport' und 'window' bestimmt. Da bei 'viewport'
+standardmäßig das maximale Zeichenquadrat voreingestellt ist, wird in diesem
+Fall durch gleiche X- und Y-Fenstergröße eine winkeltreue Darstellung er-
+reicht.
+
+
+
+Darstellung dreidimensionaler Graphik
Im dreidimensionalen Fall wird das Fenster ebenfalls mit
-#type("modern12")#
window
-#type("trium10")#
-definiert, wobei dann allerdings auch der Bereich der dritten Dimension
-(Z-Koordinaten) zu berücksichtigen ist. Da die dreidimensionale Graphik auf
-eine zweidimensionale Fläche projiziert wird, können aber noch weitere Darstel­
-lungsparameter angegeben werden. Der Betrachtungswinkel wird mit Hilfe der
-Prozedur
+definiert, wobei dann allerdings auch der Bereich der dritten Dimension
+(Z-Koordinaten) zu berücksichtigen ist. Da die dreidimensionale Graphik auf
+eine zweidimensionale Fläche projiziert wird, können aber noch weitere Dar-
+stellungsparameter angegeben werden. Der Betrachtungswinkel wird mit Hilfe
+der Prozedur
-#type("modern12")#
view
-#type("trium10")#
angegeben. Zur Spezifikation der gewünschten Projektionsart gibt es
-#type("modern12")#
orthographic (* orthographische Projektion *)
perspective (* perspektivische Projektion,
der Fluchtpunkt ist frei wählbar *)
oblique (* schiefwinklige Projektion *)
-#type("trium10")#
-#free(2.0)#
-#ib(9)##type("triumb14")#Beispiel (Sinuskurve)#ie(9)#
-#type("modern12")#
+
+
+
+Beispiel (Sinuskurve)
funktion zeichnen;
bild darstellen .
@@ -275,10 +229,10 @@ bild darstellen :
window (p, -pi, pi, -1.0, 1.0);
put (p, pic);
plot (p) .
-#type("trium10")#
-#free(2.0)#
-#ib(9)##type("triumb14")#Beispiel (Würfel)#ie(9)#
-#type("modern12")#
+
+
+
+Beispiel (Würfel)
wuerfel zeichen;
wuerfel darstellen.
@@ -297,8 +251,7 @@ zeichne vorderseite :
draw (vorderseite, 0.0, 0.0, 0.0).
zeichne rueckseite :
- PICTURE VAR rueckseite :: translate
- (vorderseite, 0.0, 1.0, 0.0).
+ PICTURE VAR rueckseite :: translate (vorderseite, 0.0, 1.0, 0.0).
zeichne verbindungskanten :
PICTURE VAR verbindungskanten :: nilpicture;
@@ -323,52 +276,50 @@ wuerfel darstellen :
view (p, 0.0, 40.0, 20.0);
orthographic (p);
plot (p).
-#type("trium10")#
-#free(2.0)#
-#ib(9)##type("triumb14")#Beschreibung der Graphik-Prozeduren#ie(9)#
-#type("trium10")#
- #limit(12.0)##on("italics")#Zweidimensionale PICTUREs brauchen weniger Speicherplatz
- als dreidimensionale. Daher werden in einigen Fehlermeldun­
- gen unterschiedliche Größen angegeben.
-#limit(13.5)##off("italics")#
+
+
+Beschreibung der Graphik-Prozeduren
+
+Zweidimensionale PICTUREs brauchen weniger Speicherplatz als dreidimensio-
+nale. Daher werden in einigen Fehlermeldungen unterschiedliche Größen ange-
+geben.
:=
OP := (PICTURE VAR dest, PICTURE CONST source)
Zweck: Zuweisung
OP := (PICFILE VAR dest, DATASPACE CONST source)
- Zweck: Assoziiert die PICFILE Variable 'dest' mit der DATASPACE CONST
+ Zweck: Assoziiert die PICFILE Variable 'dest' mit der DATASPACE CONST
'source' und initialisiert die PICFILE Variable sofern nötig.
Fehlerfall:
* dataspace is no PICFILE
Der anzukoppelnde Datenraum hat einen falschen Typ.
-#ib#CAT#ie#
+CAT
OP CAT (PICTURE VAR dest, PICTURE CONST source)
Zweck: Aneinanderfügen von zwei PICTURE's.
Fehlerfälle:
* OP CAT: left dimension <> right dimension
Es können nur PICTUREs mit gleicher Dimension angefügt werden.
* OP CAT: Picture overflow
- Die beiden PICTURE überschreiten die maximale Größe eines
- Pictures.
+ Die beiden PICTURE überschreiten die maximale Größe eines Pictures.
-#ib#act picture#ie#
+act picture
PICTURE PROC act picture (PICFILE VAR p)
- Zweck: Liefert das PICTURE des PICFILEs 'p', auf das mit 'backward' o.ä.
+ Zweck: Liefert das PICTURE des PICFILEs 'p', auf das mit 'backward' o.ä.
positioniert wurde.
-#ib#backward#ie#
+backward
PROC backward (PICFILE VAR p)
Zweck: Positioniert den PICFILE 'p' um ein PICTURE zurück.
Fehlerfall:
* backward at begin of file
Es wurde versucht vor den Anfang des PICFILEs zu positionieren.
-#ib#draw#ie#
+draw
PROC draw (PICTURE VAR pic, REAL CONST x, y)
- Zweck: Die Prozedur zeichnet in dem (zweidimensionalen) Bild 'pic' eine
+ Zweck: Die Prozedur zeichnet in dem (zweidimensionalen) Bild 'pic' eine
Linie von der aktuellen Position zur Position (x, y).
Fehlerfälle:
* picture overflow
@@ -377,7 +328,7 @@ wuerfel darstellen :
Ein PICTURE kann nur entweder zwei- oder dreidimensional sein.
PROC draw (PICTURE VAR pic, REAL CONST x, y, z)
- Zweck: Die Prozedur zeichnet in dem (dreidimensionalen) Bild 'pic' eine
+ Zweck: Die Prozedur zeichnet in dem (dreidimensionalen) Bild 'pic' eine
gerade Linie von der aktuellen Position zur Position (x, y, z).
Fehlerfälle:
* picture overflow
@@ -386,28 +337,28 @@ wuerfel darstellen :
Ein PICTURE kann nur entweder zwei- oder dreidimensional sein.
PROC draw (PICTURE VAR pic, TEXT CONST text)
- Zweck: Der angegebene Text wird in das Bild 'pic' eingetragen. Der Anfang
- ist dabei die aktuelle Stiftposition. Diese wird nicht verändert.
+ Zweck: Der angegebene Text wird in das Bild 'pic' eingetragen. Der An-
+ fang ist dabei die aktuelle Stiftposition. Diese wird nicht ver-
+ ändert.
Fehlerfall:
* picture overflow
Der Text paßt nicht mehr in das PICTURE.
- PROC draw (PICTURE VAR pic, TEXT CONST text,
- REAL CONST angle, height)
- Zweck: Der angegebene Text wird unter dem Winkel 'angle' gegenüber der
- Waagerechten und in der Größe 'height' in das PICTURE 'pic'
- eingetragen. Der Anfang ist dabei die aktuelle Stiftposition. Diese
- wird nicht verändert.
+ PROC draw (PICTURE VAR pic, TEXT CONST text, REAL CONST angle, height)
+ Zweck: Der angegebene Text wird unter dem Winkel 'angle' gegenüber der
+ Waagerechten und in der Größe 'height' in das PICTURE 'pic'
+ eingetragen. Der Anfang ist dabei die aktuelle Stiftposition.
+ Diese wird nicht verändert.
Fehlerfall:
* picture overflow
Der Text paßt nicht mehr in das PICTURE.
PROC draw (PICFILE VAR pic, REAL CONST x, y)
- Zweck: Die Prozedur zeichnet in dem aktuellen (zweidimensionalen)
- PICTURE des PICFILEs 'p' eine gerade Linie. Der (virtuelle) Stift wird
- von der aktuellen Position zur Position (x, y) gefahren. Falls das
- aktuelle PICTURE zu voll ist, wird automatisch auf das nächste
- umgeschaltet.
+ Zweck: Die Prozedur zeichnet in dem aktuellen (zweidimensionalen)
+ PICTURE des PICFILEs 'p' eine gerade Linie. Der (virtuelle) Stift
+ wird von der aktuellen Position zur Position (x, y) gefahren.
+ Falls das aktuelle PICTURE zu voll ist, wird automatisch auf das
+ nächste umgeschaltet.
Fehlerfälle:
* picfile overflow
Das letzte PICTURE ist voll (z. Zeit max. 128 PICTURE)
@@ -423,39 +374,37 @@ wuerfel darstellen :
Das aktuelle PICTURE ist zweidimensional.
PROC draw (PICTFILE VAR pic, TEXT CONST text)
- Zweck: Der angegebene Text wird in das aktuelle PICTURE des PICFILEs 'p'
- eingetragen. Falls das aktuelle PICTURE zu voll ist, wird automatisch
- auf das nächste umgeschaltet. Der Anfang ist dabei die aktuelle
- Stiftposition. Diese wird nicht verändert.
+ Zweck: Der angegebene Text wird in das aktuelle PICTURE des PICFILEs 'p'
+ eingetragen. Falls das aktuelle PICTURE zu voll ist, wird auto-
+ matisch auf das nächste umgeschaltet. Der Anfang ist dabei die
+ aktuelle Stiftposition. Diese wird nicht verändert.
Fehlerfall:
* picfile overflow
Das letzte PICTURE ist voll (z. Zeit max. 128)
- PROC draw (PICFILE VAR pic, TEXT CONST text,
- REAL CONST angle, height)
- Zweck: Der angegebene Text wird unter dem Winkel 'angle' gegenüber der
- Waagerechten und in der Größe 'height' in das aktuelle PICTURE
- des PICFILES 'p' eingetragen. Falls das aktuelle PICTURE zu voll ist,
- wird automatisch auf das nächste umgeschaltet. Der Anfang ist
+ PROC draw (PICFILE VAR pic, TEXT CONST text, REAL CONST angle, height)
+ Zweck: Der angegebene Text wird unter dem Winkel 'angle' gegenüber der
+ Waagerechten und in der Größe 'height' in das aktuelle PICTURE
+ des PICFILES 'p' eingetragen. Falls das aktuelle PICTURE zu voll
+ ist, wird automatisch auf das nächste umgeschaltet. Der Anfang ist
dabei die aktuelle Stiftposition. Diese wird nicht verändert.
Fehlerfall:
* picfile overflow
Das letzte PICTURE ist voll (z. Zeit max. 128)
-#ib#eof#ie#
+eof
BOOL PROC eof (PICFILE CONST p)
- Zweck: Liefert 'TRUE' wenn hinter das Ende des PICFILEs positioniert
+ Zweck: Liefert 'TRUE' wenn hinter das Ende des PICFILEs positioniert
wurde.
-#ib#extrema#ie#
- PROC extrema (PICTURE CONST p,
- REAL VAR x min, x max, y min, y max)
- Zweck: Die Prozedur liefert die größten und kleinsten X- und Y-Koordi­
- naten des PICTUREs 'p'. Diese werden in die Parameter 'x min', 'x
- max', 'y min' und 'y max' eingetragen.
+extrema
+ PROC extrema (PICTURE CONST p, REAL VAR x min, x max, y min, y max)
+ Zweck: Die Prozedur liefert die größten und kleinsten X- und Y-Koordi-
+ naten des PICTUREs 'p'. Diese werden in die Parameter 'x min',
+ 'x max', 'y min' und 'y max' eingetragen.
PROC extrema (PICTURE CONST p,
- REAL VAR x min, x max, y min, y max, z min, z max)
+ REAL VAR x min, x max, y min, y max, z min, z max)
Zweck: s.o.
PROC extrema (PICFILE VAR p, REAL VAR x min, x max, y min, y max)
@@ -465,22 +414,22 @@ wuerfel darstellen :
REAL VAR x min, x max, y min, y max, z min, z max)
Zweck: s.o.
-#ib#forward#ie#
+forward
PROC forward (PICFILE VAR p)
Zweck: Positioniert den PICFILE um ein PICTURE weiter.
Fehlerfall:
* picfile overflow
Es sollte hinter das Ende des PICFILEs positioniert werden.
-#ib#get#ie#
+get
PROC get (PICFILE VAR p, PICTURE VAR pic)
- Zweck: Liest ein PICTURE aus einem PICFILE und positioniert auf das
+ Zweck: Liest ein PICTURE aus einem PICFILE und positioniert auf das
Nächste.
Fehlerfall:
* input after end of picfile
Es sollte nach dem Ende des Picfiles gelesen werden.
-#ib#move#ie#
+move
PROC move (PICTURE VAR pic, REAL CONST x, y)
Zweck: Der (virtuelle) Stift wird zur Position (x, y) gefahren.
Fehlerfälle:
@@ -498,134 +447,134 @@ wuerfel darstellen :
Ein PICTURE kann nur entweder zwei- oder dreidimensional sein.
PROC move (PICFILE VAR p, REAL CONST x, y)
- Zweck: Der (virtuelle) Stift wird zur Position (x, y) gefahren. Falls das aktuelle
- PICTURE des PICFILEs 'p' zu voll ist, wird automatisch auf das
- nächste umgeschaltet.
+ Zweck: Der (virtuelle) Stift wird zur Position (x, y) gefahren. Falls
+ das aktuelle PICTURE des PICFILEs 'p' zu voll ist, wird auto-
+ matisch auf das nächste umgeschaltet.
Fehlerfall:
* picfile overflow
Das letzte PICTURE ist voll (z. Zeit max. 128 PICTUREs)
PROC move (PICFILE VAR p, REAL CONST x, y, z)
- Zweck: Der (virtuelle) Stift wird zur Position (x, y, z) gefahren. Falls das
- aktuelle PICTURE des PICFILEs 'p' zu voll ist, wird automatisch auf
- das nächste umgeschaltet.
+ Zweck: Der (virtuelle) Stift wird zur Position (x, y, z) gefahren. Falls
+ das aktuelle PICTURE des PICFILEs 'p' zu voll ist, wird auto-
+ matisch auf das nächste umgeschaltet.
Fehlerfall:
* picfile overflow
Das letzte PICTURE ist voll (z. Zeit max. 128 PICTUREs)
-#ib#nilpicture#ie#
+nilpicture
PICTURE PROC nilpicture
Zweck: Die Prozedure liefert ein leeres PICTURE zur Initialisierung.
-#ib#oblique#ie#
+oblique
PROC oblique (PICFILE VAR p, REAL CONST a, b)
- Zweck: Bei dem (dreidimensionalen!) Bild 'p' wird 'schiefwinklig' als
- gewünschte Projektionsart eingestellt. Dabei ist (a, b) der Punkt in
- der X-Y-Ebene, auf den der Einheitsvector in Z-Richtung
+ Zweck: Bei dem (dreidimensionalen!) Bild 'p' wird 'schiefwinklig' als
+ gewünschte Projektionsart eingestellt. Dabei ist (a, b) der Punkt
+ in der X-Y-Ebene, auf den der Einheitsvector in Z-Richtung
abgebildet werden soll.
-#ib#orthographic#ie#
+orthographic
PROC orthographic (PICFILE VAR p)
- Zweck: Bei dem (dreidimensionalen!) Bild 'p' wird "orthografisch" als Pro­
- jektionsart eingestellt. Bei der orthografischen Projektion wird ein
- dreidimensionaler Körper mit parallelen Strahlen senkrecht auf die
- Projektionsebene abgebildet.
+ Zweck: Bei dem (dreidimensionalen!) Bild 'p' wird "orthografisch" als
+ Projektionsart eingestellt. Bei der orthografischen Projektion
+ wird ein dreidimensionaler Körper mit parallelen Strahlen senk-
+ recht auf die Projektionsebene abgebildet.
-#ib#pen#ie#
+pen
INT PROC pen (PICTURE CONST pic)
Zweck: Liefert die Nummer des 'virtuellen Stifts'.
PICTURE PROC pen (PICTURE CONST pic, INT CONST pen)
- Zweck: Liefert ein PICTURE mit dem Inhalt 'pic' und dem 'virtuellen Stift' mit
- der Nummer 'pen'. Möglich sind die Nummern 1 - 16.
+ Zweck: Liefert ein PICTURE mit dem Inhalt 'pic' und dem 'virtuellen
+ Stift' mit der Nummer 'pen'. Möglich sind die Nummern 1 - 16.
Fehlerfälle:
* PROC pen: pen [No] < 1
Der gewünschte Stift ist kleiner als 1.
* PROC pen: pen [No] > 16
Der gewünschte Stift ist größer als 16.
-#ib#perspective#ie#
+perspective
PROC perspective (PICFILE VAR p, REAL CONST cx, cy, cz)
- Zweck: Bei den dreidimensionalen PICTUREs des PICFILE's 'p' wird
- "perspektivisch" als gewünschte Projektionsart eingestellt. Der Punkt
- (cx, cy, cz) ist der Fluchtpunkt der Projektion, d.h. alle Parallelen zur
- Blickrichtung schneiden sich in diesem Punkt.
+ Zweck: Bei den dreidimensionalen PICTUREs des PICFILE's 'p' wird
+ "perspektivisch" als gewünschte Projektionsart eingestellt. Der
+ Punkt (cx, cy, cz) ist der Fluchtpunkt der Projektion, d.h. alle
+ Parallelen zur Blickrichtung schneiden sich in diesem Punkt.
-#ib#pic no#ie#
+pic no
INT PROC pic no (PICFILE CONST p)
Zweck: Liefert die Nummer des aktuellen PICTUREs.
-#ib#picture file#ie#
+picture file
DATASPACE PROC picture file (TEXT CONST name)
- Zweck: Die Prozedur dient zur Assoziation eines benannten Datenraumes mit
- einem PICFILE (s. Operator ':=').
+ Zweck: Die Prozedur dient zur Assoziation eines benannten Datenraumes
+ mit einem PICFILE (s. Operator ':=').
-#ib#plot#ie#
+plot
PROC plot (TEXT CONST name)
- Zweck: Der PICFILE mit dem Namen 'name' wird entspechend der angege­
- benen Darstellungsart gezeichnet. Diese Parameter ('perspective',
- 'orthographic', 'oblique', 'view', 'window' etc.) müssen vorher
+ Zweck: Der PICFILE mit dem Namen 'name' wird entspechend der angege-
+ benen Darstellungsart gezeichnet. Diese Parameter ('perspective',
+ 'orthographic', 'oblique', 'view', 'window' etc.) müssen vorher
eingestellt werden.
Fehlerfall:
* FILE does not exist
Es existiert kein PICFILE mit dem Namen 'name'
PROC plot (PICFILE VAR p)
- Zweck: Der PICFILE 'p' wird entspechend der angegebenen Darstellungsart
+ Zweck: Der PICFILE 'p' wird entspechend der angegebenen Darstellungsart
gezeichnet. Diese Parameter müssen vorher eingestellt werden.
- #on("bold")#Zweidimensional:
-#off("bold")#
+
+ Zweidimensional:
+
obligat: 'window' (zweidimensional)
optional: 'view' (zweidimensional)
'select pen'
'viewport'
- #on("bold")#Dreidimensional:
-#off("bold")#
+ Dreidimensional:
+
obligat: 'window' (dreidimensional)
optional: 'view' (dreidimensional)
'orthographic', 'perspective', 'oblique'
'viewport'
'select pen'
-#ib#put#ie#
+put
PROC put (PICFILE VAR p, PICTURE CONST pic)
- Zweck: Schreibt ein PICTURE in einen PICFILE und positioniert um eins
+ Zweck: Schreibt ein PICTURE in einen PICFILE und positioniert um eins
vor.
Fehlerfall:
* picfile overflow
Der PICFILE ist voll. (z. Z. max. 128 PICTURE)
-#ib#reset#ie#
+reset
PROC reset (PICFILE VAR p)
Zweck: Positioniert auf den Anfang eines Picfiles.
-#ib#rotate#ie#
+rotate
PICTURE PROC rotate (PICTURE CONST pic, REAL CONST alpha)
- Zweck: Das PICTURE 'pic' wird um den Punkt (0, 0) um den Winkel 'alpha'
+ Zweck: Das PICTURE 'pic' wird um den Punkt (0, 0) um den Winkel 'alpha'
(im Gradmaß) im mathematisch positiven Sinn gedreht.
- PICTURE PROC rotate (PICTURE CONST pic,
- REAL CONST alpha, beta, gamma)
- Zweck: Das dreidimensionale PICTURE 'pic' wird um den Winkel 'alpha',
- 'beta' oder 'gamma' im mathematisch positiven Sinn gedreht. Der
- Winkel 'alpha' dreht um die X-Achse, der Winkel 'beta' um die
- Y-Achse und 'gamma' um die Z-Achse. Es darf dabei nur jeweils
- ein Winkel von 0.0 verschieden sein. Alle Winkel werden im
+ PICTURE PROC rotate (PICTURE CONST pic, REAL CONST alpha, beta, gamma)
+ Zweck: Das dreidimensionale PICTURE 'pic' wird um den Winkel 'alpha',
+ 'beta' oder 'gamma' im mathematisch positiven Sinn gedreht. Der
+ Winkel 'alpha' dreht um die X-Achse, der Winkel 'beta' um die
+ Y-Achse und 'gamma' um die Z-Achse. Es darf dabei nur jeweils
+ ein Winkel von 0.0 verschieden sein. Alle Winkel werden im
Gradmaß angegeben.
-#ib#select pen#ie#
+select pen
PROC select pen (PICFILE VAR p,
- INT CONST pen, colour, thickness, linetype)
- Zweck: Für die Darstellung des Bildes 'p' soll dem "virtuellen Stift" 'pen' ein
- realer Stift zugeordnet werden, der möglichst die Farbe 'colour' und
- die Dicke 'thickness' hat und dabei Linien mit dem Typ 'line type'
- zeichnet. Es wird die beste Annäherung für das Ausgabegerät für
- diese Parameter genommen. Dabei gelten folgende Vereinbarun­
- gen:
-
- Farbe: negative Farben setzten den Hintergrund, positive Farben
+ INT CONST pen, colour, thickness, linetype)
+ Zweck: Für die Darstellung des Bildes 'p' soll dem "virtuellen Stift"
+ 'pen' ein realer Stift zugeordnet werden, der möglichst die Farbe
+ 'colour' und die Dicke 'thickness' hat und dabei Linien mit dem
+ Typ 'line type' zeichnet. Es wird die beste Annäherung für das
+ Ausgabegerät für diese Parameter genommen. Dabei gelten folgende
+ Vereinbarungen:
+
+ Farbe: negative Farben setzten den Hintergrund, positive Farben
zeichnen im Vordergrund.
0 Löschstift (falls vorhanden)
@@ -648,32 +597,32 @@ wuerfel darstellen :
4 lang gestrichelte Linie
5 Strichpunktlinie
- Die hier aufgeführten Möglichkeiten müssen nicht an allen grafischen
- Endgeräten vorhanden sein. Der geräteabhängige Graphik-Treiber
- wählt jeweils die für ihn bestmögliche Annäherung.
+ Die hier aufgeführten Möglichkeiten müssen nicht an allen
+ grafischen Endgeräten vorhanden sein. Der geräteabhängige
+ Graphik-Treiber wählt jeweils die für ihn bestmögliche Annäherung.
Fehlerfälle:
* pen < 1
* pen > 16
-#ib#size#ie#
+size
INT PROC size (PICFILE CONST p)
Zweck: Liefert die aktuelle Größe eines PICFILEs in Bytes.
-#ib#stretch#ie#
+stretch
PICTURE PROC stretch (PICTURE CONST pic, REAL CONST xc, yc)
- Zweck: Das PICTURE 'pic' wird in X-Richtung um den Faktor 'xc', in
- Y-Richtung um den Faktor 'yc' gestreckt (bzw. gestaucht). Dabei
+ Zweck: Das PICTURE 'pic' wird in X-Richtung um den Faktor 'xc', in
+ Y-Richtung um den Faktor 'yc' gestreckt (bzw. gestaucht). Dabei
bewirkt der Faktor
c > 1 eine Streckung
0 < c < 1 eine Stauchung
c < 0 zusätzlich eine Achsenspiegelung
PICTURE PROC stretch (PICTURE CONST pic, REAL CONST xc, yc, zc)
- Zweck: Das dreidimensionale PICTURE 'pic' wird entsprechend den
+ Zweck: Das dreidimensionale PICTURE 'pic' wird entsprechend den
angegeben Faktoren 'xc', 'yc' und 'zc' gestreckt. Wirkung s.o.
-#ib#translate#ie#
+translate
PICTURE PROC translate (PICTURE CONST pic, REAL CONST dx, dy)
Zweck: Das PICTURE 'pic' wird um 'dx' und 'dy' verschoben.
Fehlerfall:
@@ -686,78 +635,76 @@ wuerfel darstellen :
* picture is twodimensional
Das PICTURE 'pic' ist zweidimensional
-#ib#two dimensional#ie#
+two dimensional
PROC two dimensional (PICFILE VAR p)
Zweck: Setzt als Projektionsart zweidimensional.
-#ib#view#ie#
+view
PROC view (PICFILE VAR p, REAL CONST alpha, phi, theta)
- Zweck: Dreidimensionale Bilder werden häufig nicht direkt von vorne
- dargestellt, sondern für die Betrachtung gedreht. Mit der Prozedur
- 'view' kann diese Betrachtungsrichtung durch die Polarwinkel 'phi'
- und 'theta' angegeben werden. Mit dem Winkel 'alpha' kann dann
- das Bild um den Mittelpunkt der Zeichenfläche gedreht werden.
- Dadurch kann ein Bild auch auf einem Terminal hochkant gestellt
- werden. Voreingestellt ist 'phi = 0, theta = 0 und alpha = 0', d.h.
- direkt von oben.
-
- Im Gegensatz zu 'rotate' hat 'view' keine Wirkung auf das eigentli­
- che Bild (PICFILE), sondern nur auf die gewählte Darstellung. So
- addieren sich zwar aufeinanderfolgende "Rotationen", 'view' aber
- geht immer von der Nullstellung aus. Auch kann das Bild durch eine
- "Rotation" ganz oder teilweise aus oder in das Darstellungsfenster
- ('window') gedreht werden. Bei 'view' verändern sich die Koordina­
- ten der Punkte nicht, d.h. das Fenster wird mitgedreht.
-
-#ib#viewport#ie#
+ Zweck: Dreidimensionale Bilder werden häufig nicht direkt von vorne
+ dargestellt, sondern für die Betrachtung gedreht. Mit der Prozedur
+ 'view' kann diese Betrachtungsrichtung durch die Polarwinkel 'phi'
+ und 'theta' angegeben werden. Mit dem Winkel 'alpha' kann dann
+ das Bild um den Mittelpunkt der Zeichenfläche gedreht werden.
+ Dadurch kann ein Bild auch auf einem Terminal hochkant gestellt
+ werden. Voreingestellt ist 'phi = 0, theta = 0 und alpha = 0',
+ d.h. direkt von oben.
+
+ Im Gegensatz zu 'rotate' hat 'view' keine Wirkung auf das eigent-
+ liche Bild (PICFILE), sondern nur auf die gewählte Darstellung.
+ So addieren sich zwar aufeinanderfolgende "Rotationen", 'view'
+ aber geht immer von der Nullstellung aus. Auch kann das Bild
+ durch eine "Rotation" ganz oder teilweise aus oder in das Dar-
+ stellungsfenster ('window') gedreht werden. Bei 'view' verändern
+ sich die Koordinaten der Punkte nicht, d.h. das Fenster wird mit-
+ gedreht.
+
+viewport
PROC viewport (PICFILE VAR p,
- REAL CONST hormin, hormax, vertmin, vertmax)
- Zweck: Die Zeichenfläche auf dem Endgerät, auf dem das Bild dargestellt
- werden soll, wird spezifiziert. Dabei wird sowohl die Größe als auch
- die relative Lage der Zeichenfläche definiert. Der linke untere
- Eckpunkt der physikalischen Zeichenfläche des Gerätes hat die
- Koordinaten (0.0, 0.0). Die definierte Zeichenfläche erstreckt sich
-
-#type("modern12")#
+ REAL CONST hormin, hormax, vertmin, vertmax)
+ Zweck: Die Zeichenfläche auf dem Endgerät, auf dem das Bild dargestellt
+ werden soll, wird spezifiziert. Dabei wird sowohl die Größe als
+ auch die relative Lage der Zeichenfläche definiert. Der linke
+ untere Eckpunkt der physikalischen Zeichenfläche des Gerätes hat
+ die Koordinaten (0.0, 0.0). Die definierte Zeichenfläche erstreckt
+ sich
+
'hormin' - 'hormax' in der Horizontalen,
'vertmin' - 'vertmax' in der Vertikalen.
-#type("trium10")#
- So liegt der linke untere Eckpunkt dann bei (hormin, vertmin), der
+ So liegt der linke untere Eckpunkt dann bei (hormin, vertmin), der
rechte obere bei (hormax, vertmax).
- Damit sowohl geräteunabhängige als auch maßstabsgerechte
- Zeichnungen möglich sind, können die Koordinaten in zwei Arten
+ Damit sowohl geräteunabhängige als auch maßstabsgerechte
+ Zeichnungen möglich sind, können die Koordinaten in zwei Arten
spezifiziert werden :
a) Gerätekoordinaten
- Die Koordinaten können Werte von 0.0 bis 2.0 annehmen. Dabei
- hat die kürzere Seite der physikalischen Zeichenfläche defini­
+ Die Koordinaten können Werte von 0.0 bis 2.0 annehmen. Dabei
+ hat die kürzere Seite der physikalischen Zeichenfläche defini-
tionsgemäß die Länge 1.0.
b) absolute Koordinaten
- Die Werte werden in cm angegeben. Für die Maximalwerte sind
+ Die Werte werden in cm angegeben. Für die Maximalwerte sind
nur Werte größer als 2.0 möglich.
Voreingestellt ist
-#type("modern12")#
viewport (0.0, 1.0, 0.0, 1.0),
-#type("trium10")#
- d.h. das größtmöglichste Quadrat, beginnend in der linken unteren
- Ecke der physikalischen Zeichenfläche. In vielen Fällen wird diese
- Einstellung ausreichen, so daß der Anwender kein eigenes 'viewport'
- definieren muß.
+ d.h. das größtmöglichste Quadrat, beginnend in der linken unteren
+ Ecke der physikalischen Zeichenfläche. In vielen Fällen wird
+ diese Einstellung ausreichen, so daß der Anwender kein eigenes
+ 'viewport' definieren muß.
- Der Abbildungsmaßstab wird durch das Zusammenspiel von 'view­
- port' und 'window' festgelegt (siehe dort). Dabei ist insbesondere
- darauf zu achten, daß winkeltreue Darstellungen nur bei gleichem
- X- und Y-Maßstab möglich sind. Da man oft quadratische Fenster
- ('window') verwendet, wurde als Standardfall auch ein quadratisches
- 'viewport' gewählt.
+ Der Abbildungsmaßstab wird durch das Zusammenspiel von 'viewport'
+ und 'window' festgelegt (siehe dort). Dabei ist insbesondere
+ darauf zu achten, daß winkeltreue Darstellungen nur bei gleichem
+ X- und Y-Maßstab möglich sind. Da man oft quadratische Fenster
+ ('window') verwendet, wurde als Standardfall auch ein quadrati-
+ sches 'viewport' gewählt.
-#ib#where#ie#
+where
PROC where (PICTURE CONST pic, REAL VAR x, y)
Zweck: Die aktuelle Stiftposition wird in 'x' und 'y' eingetragen.
Fehlerfall:
@@ -770,20 +717,19 @@ wuerfel darstellen :
* picture is twodimensional
Das PICTURE 'pic' ist zweidimensional
-#ib#window#ie#
+window
PROC window (PICFILE VAR p, REAL CONST x min, x max, y min, y max)
- Zweck: Für die Darstellung eines zweidimensionalen Bildes wird das
- darzustellende Fenster definiert. Alle Bildpunkte, deren X-Koordi­
- naten im Intervall [x min, x max] und deren Y-Koordinaten im
- Intervall [y min, y max] liegen, gehören zum definierten Fenster.
- Vektoren, die über dieses Fenster hinausgehen, werden abge­
- schnitten. Dieses Fenster wird auf die spezifizierte Zeichenfläche
- abgebildet. (Das ist standardmäßig das größtmögliche Quadrat auf
- dem ausgewählten Gerät).
+ Zweck: Für die Darstellung eines zweidimensionalen Bildes wird das
+ darzustellende Fenster definiert. Alle Bildpunkte, deren X-Ko-
+ ordinaten im Intervall [x min, x max] und deren Y-Koordinaten im
+ Intervall [y min, y max] liegen, gehören zum definierten Fenster.
+ Vektoren, die über dieses Fenster hinausgehen, werden abge-
+ schnitten. Dieses Fenster wird auf die spezifizierte Zeichen-
+ fläche abgebildet. (Das ist standardmäßig das größtmögliche
+ Quadrat auf dem ausgewählten Gerät).
Der Darstellungsmaßstab ergibt sich als
-#type("modern12")#
x max - x min
-----------------------------------------
horizontale Seitenlänge der Zeichenfläche
@@ -791,41 +737,35 @@ wuerfel darstellen :
y max - y min
-----------------------------------------
vertikale Seitenlänge der Zeichenfläche
-#type("trium10")#
- Für eine winkeltreue Darstellung müssen X- und Y-Maßstab
- gleich sein! Einfach können winkeltreue Darstellung erreicht
- werden, wenn das Fenster eine quadratische Form hat. Die
- Zeichenfläche ('viewport') ist dementsprechend als Quadrat vorein­
- gestellt.
+ Für eine winkeltreue Darstellung müssen X- und Y-Maßstab
+ gleich sein! Einfach können winkeltreue Darstellung erreicht
+ werden, wenn das Fenster eine quadratische Form hat. Die
+ Zeichenfläche ('viewport') ist dementsprechend als Quadrat vor-
+ eingestellt.
PROC window (PICFILE VAR p,
REAL CONST x min, x max, y min, y max, z min, z max)
- Zweck: Für die Darstellung eines dreidimensionalen Bildes wird das darzu­
+ Zweck: Für die Darstellung eines dreidimensionalen Bildes wird das darzu-
stellende Fenster definiert. Alle Bildpunkte, deren X-Koordinaten im
- Intervall [x min, x max] und deren Y-Koordinaten im Intervall [y min,
- y max] und deren Z-Koordinaten im Intervall [z min, z max] liegen,
- gehören zum definierten Fenster. Dieses dreidimensionale Fenster
- (Quader) wird entsprechend der eingestellten Projektionsart (ortho­
- grafisch, perspektivisch oder schiefwinklig) und den Betrachtungs­
- winkeln (s. 'view') auf die spezifizierte Zeichenfläche abgebildet. (Das
- ist standardmäßig das größtmögliche Quadrat auf dem ausgewählten
- Gerät.) Linien, die außerhalb dieses Quadrates liegen, werden
- abgeschnitten.
-
- Anders als im zweidimensionalen Fall ist das Problem der Maßstäbe
- nicht mehr nur durch das Zusammenspiel von 'window' und 'view­
- port' zu beschreiben. Hier spielen auch Projektionsart und Dar­
- stellungswinkel eine Rolle. Falls alle Darstellungswinkel den Wert 0.0
- haben, gilt das für den zweidimensionalen Fall gesagte für die Ebene
- (y = 0.0) entsprechend.
-
-#ib#write is possible#ie#
+ Intervall [x min, x max] und deren Y-Koordinaten im Intervall
+ [y min, y max] und deren Z-Koordinaten im Intervall [z min, z max]
+ liegen, gehören zum definierten Fenster. Dieses dreidimensionale
+ Fenster (Quader) wird entsprechend der eingestellten Projektions-
+ art (orthografisch, perspektivisch oder schiefwinklig) und den
+ Betrachtungswinkeln (s. 'view') auf die spezifizierte Zeichen-
+ fläche abgebildet. (Das ist standardmäßig das größtmögliche
+ Quadrat auf dem ausgewählten Gerät.) Linien, die außerhalb dieses
+ Quadrates liegen, werden abgeschnitten.
+
+ Anders als im zweidimensionalen Fall ist das Problem der Maßstäbe
+ nicht mehr nur durch das Zusammenspiel von 'window' und 'view-
+ port' zu beschreiben. Hier spielen auch Projektionsart und Dar-
+ stellungswinkel eine Rolle. Falls alle Darstellungswinkel den
+ Wert 0.0 haben, gilt das für den zweidimensionalen Fall gesagte
+ für die Ebene (y = 0.0) entsprechend.
+
+write is possible
BOOL PROC write is possible (PICTURE CONST pic, INT CONST space)
Zweck: Liefert 'TRUE', falls 'space' Bytes Platz in 'pic' vorhanden ist.
-
-
-
-
-
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil11 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil11
new file mode 100644
index 0000000..cae9c50
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil11
@@ -0,0 +1,1072 @@
+ EUMEL-Benutzerhandbuch
+
+ TEIL 11: Utilities
+
+
+In diesem Teil werden einige Dienstprogramme aufgeführt. Diese Programme
+sind bei speziellen Anwendungen nützlich.
+
+
+
+1. Scanner
+
+Der Scanner zerlegt einen TEXT in Symbole bzw. "Tokens" entsprechend der
+ELAN-Sprachdefinition.
+
+Der Scanner kann benutzt werden, um festzustellen, welche Art von Symbolen
+in einem TEXT enthalten sind. Die Repräsentation der Symbole müssen dabei
+der ELAN-Syntax entsprechen. Folgende #ib#Symbole#ie# kann der Scanner
+erkennen:
+
+ - "tags", d.h. Namen,
+ - "bolds", d.h. Schlüsselworte,
+ - "number", d.h. INT oder REAL Zahlen,
+ - Operatoren,
+ - "delimiter", d.h. Begrenzer wie z.B. ";",
+ - und das Ende des Scan-Textes.
+
+
+Der Scanner überliest Kommentare und Leerzeichen zwischen den Symbolen.
+Der (erste) zu verarbeitende Text muß mit der Prozedur
+
+ scan
+
+in den Scanner "hineingesteckt" werden. Mit der Prozedur
+
+ next symbol
+
+wird das jeweils nächste Symbol des TEXTes geholt. Am Ende wird "end of scan"
+und als Symbol 'niltext' geliefert. Falls innerhalb eines TEXT-Denoters oder
+eines Kommentars "end of scan" auftritt, wird "within text" bzw. "within
+comment" gemeldet. Der Scan-Prozeß kann dann mit dem nächsten zu scannenden
+TEXT (der nächsten Zeile) fortgesetzt werden. Dafür wird nicht die Prozedur
+'scan', sondern
+
+ continue scan
+
+verwandt. Sie setzt im letzten Scan-Zustand (z.B. Kommentar oder TEXT-
+Denoter) wieder auf, so daß auch Folgen von TEXTen (Zeilen) wie z.B. Dateien
+leicht gescannt werden können.
+
+Mit den Prozeduren
+
+ scan (* meldet eine Datei zum scannen an *)
+ next symbol (* holt die Symbole *)
+
+kann man auch eine Datei nach ELAN-Symbolen untersuchen. Beispiel:
+
+ FILE VAR f :: ...
+ ...
+ scan (f); (* beginnt das Scanning in der nächsten Zeile *)
+ TEXT VAR symbol;
+ INT VAR type;
+ REP
+ next symbol (f, symbol, type);
+ verarbeite symbol
+ UNTIL type >= 7 END REP.
+
+Merke: Mit dem Scanner kann man einen ELAN-Text analysieren.
+
+
+
+Scanner-Kommandos
+
+continue scan
+ PROC continue scan (TEXT CONST scan text)
+ Zweck: Das Scanning soll mit 'scan text' fortgesetzt werden. Falls der
+ Scan-Vorgang beim vorigen 'scan text' innerhalb eines TEXT-
+ Denoters oder eines Kommentars abgebrochen wurde, wird er jetzt
+ entsprechend mit dem nächsten 'next symbol' fortgesetzt. Der
+ erste Teil-Scan einer Folge muß aber stets mit 'scan' einge-
+ leitet werden!
+
+next symbol
+ PROC next symbol (TEXT VAR symbol, INT VAR type)
+ Zweck: Holt das nächste Symbol. In "symbol" steht der TEXT des Symbols,
+ so z.B. die Ziffern eines INT-Denoters. Bei TEXT-Denotern
+ werden die führenden und abschließenden Anführungsstriche ab-
+ geschnitten. Leerzeichen oder Kommentare spielen in "tags" oder
+ "numbers" keine Rolle. Zwischen Symbolen spielen Leerzeichen
+ oder Kommentare keine Rolle. In "type" steht eine Kennzeichung
+ für den Typ des Symbols:
+
+ tag = 1 ,
+ bold = 2 ,
+ number = 3 ,
+ text = 4 ,
+ operator = 5 ,
+ delimiter = 6 ,
+ end of file = 7 ,
+ within comment = 8 ,
+ within text = 9 .
+
+ Wird Scan-Ende innerhalb eines Kommentars gefunden, so wird
+ 'niltext' und 'within comment' geliefert. Wird Scan-Ende inner-
+ halb eines TEXT-Denoters gefunden, so wird der schon analysierte
+ Teil des Denoters und 'within text' geliefert.
+
+ PROC next symbol (TEXT VAR symbol)
+ Zweck: s.o. Es wird aber nur der Text des Symbols (ohne Typ) geliefert.
+
+ PROC next symbol (FILE VAR f, TEXT CONST symbol)
+ Zweck: arbeitet wie obige Prozeduren, jedoch auf einen FILE.
+
+ PROC next symbol (FILE VAR f, TEXT CONST symbol, INT VAR type)
+ Zweck: arbeitet wie obige Prozeduren, jedoch auf einen FILE.
+
+scan
+ PROC scan (TEXT CONST scan text)
+ Zweck: Meldet einen 'scan text' für den Scanner zur Verarbeitung an.
+ Die Prozedur 'scan' muß vor dem ersten Aufruf von 'next symbol'
+ gegeben werden. Im Gegensatz zu 'continue scan' normiert 'scan'
+ den inneren Zustand des Scanners, d.h. vorherige Scan-Vorgänge
+ haben keinen Einfluß mehr auf das Scanning.
+
+ PROC scan (FILE VAR f)
+ Zweck: Wie obige Prozedur, jedoch auf einen FILE. Die zu scannende Zeile
+ ist die nächste Zeile im FILE 'f' ('scan' macht zuerst ein 'get-
+ line').
+
+
+
+2. Inspector
+
+Der Inspector stellt ein Hilfsmittel bei der Programmentwicklung dar.
+
+Der Inspector informiert über alle
+
+ - insertierten Prozeduren / Operatoren mit dem gleichen Namen
+ - Prozeduren / Operatoren / Typen, die ein Paket definiert
+ - bisher insertierten Pakete
+ - insertierten Prozeduren / Operatoren / Typen.
+
+Mit dem Aufruf von
+
+ help ("name")
+
+wird eine Liste aller Prozeduren / Operatoren, die 'name' heißen, auf dem
+Bildschirm ausgegeben. Die Liste ist paketweise sortiert unter Angabe des
+Paketnamens. Die Ausgabe erfolgt mit der Angabe der Parametertypen. Gibt es
+kein Objekt mit dem angegebenen Namen, so erscheint die Ausgabe
+
+ unbekannt: name
+
+Das Kommando
+
+ bulletin ("paket name")
+
+informiert über alle Objekte, die in der DEFINES-Liste des Pakets mit dem
+Namen "paket name" stehen. Die Ausgabe erfolgt wie beim list-Kommando.
+
+Eine gesamte Liste aller bisher insertierten Prozeduren/Operatoren/Typen
+erhält man mit dem Kommando
+
+ bulletin
+
+Bei diesen Funktionen ist (noch) zu beachten, daß Typen immer dem textmäßig
+vorhergehendem Paket zugeordnet werden. Der Grund hierfür liegt in der
+Behandlung abstrakter Datentypen im ELAN-Compiler. Eine Korrektur ist für
+spätere Auslieferungen geplant.
+
+Mit
+
+ packets
+
+werden die Namen aller bisher insertierten Pakete "gelistet".
+
+Merke: Mit 'help' kann man sich über verfügbare Prozeduren/Operatoren in-
+formieren.
+
+
+
+Inspector-Kommandos
+
+help
+ PROC help (TEXT CONST name)
+ Zweck: Listen aller Prozeduren / Operatoren mit dem Namen "name". Die
+ Ausgabe erfolgt direkt auf den Bildschirm.
+
+bulletin
+ PROC bulletin (TEXT CONST paket name)
+ Zweck: Listen aller in der DEFINES-Liste des Pakets mit dem Namen
+ "paket name".
+
+ PROC bulletin
+ Zweck: Es wird eine Liste aller bisher insertierter Objekte erstellt.
+ Diese Liste ist paketweise sortiert.
+
+packets
+ PROC packets
+ Zweck: Auflisten der Namen aller bisher insertierten Pakete.
+
+
+
+3. Lexikographische Vergleiche
+
+Die üblichen Operatoren für TEXTe arbeiten mit dem der Reihenfolge des EUMEL-
+Zeichencodes. Hier wird beschrieben, wie man lexikographische Vergleiche
+nach DIN erhält.
+
+Für TEXT-Vergleiche nach DIN 5007 gibt es die Operatoren
+
+ LEXEQUAL
+ LEXGREATER
+ LEXGREATEREQUAL
+
+Diese Operatoren vergleichen zwei TEXTE nach DIN 5007 mit folgenden
+Bedingungen:
+
+- Die Reihenfolge enspricht 'ABC...Z', wobei große und kleine Buchstaben
+ gleich behandelt werden.
+
+- Weitere Entsprechungen:
+ ö = oe, ä = ae, ü = ue
+ Ö = Oe, Ü = Ue, Ä = Ae,
+ Ä = ä, Ü = ü, Ö = ö,
+ ß = ss
+ Dadurch ist z.B.
+
+ "muß" LEXGREATER "Muster" --> FALSE
+ "Goethe" LEXEQUAL "Göthe" --> TRUE
+
+- Alle Sonderzeichen (außer " " und "-") werden ignoriert.
+
+- Ein Leerzeichen und ein Bindestrich zwischen Worten werden gleich behan-
+ delt. Beispiel:
+
+ "EUMEL System" LEXEQUAL "EUMEL-System" --> TRUE
+
+Anmerkung: Diese drei Operatoren sind - sofern die oben erwähnten Zeichen in
+den Operanden vorkommen - langsamer als die "normalen" TEXT-Vergleiche
+(=, >, <, usw.). Das liegt daran, daß die Operanden in solchen Fällen
+umgewandelt werden.
+
+
+
+Lexikographische Operatoren
+
+LEXEQUAL
+ BOOL OP LEXEQUAL (TEXT CONST l, r)
+ Zweck: Lexikographischer Vergleich von 'l' und 'r' auf Gleichheit.
+
+LEXGREATER
+ BOOL OP LEXGREATER (TEXT CONST l, r)
+ Zweck: Lexikographischer Vergleich von 'l' und 'r' auf "Grösser".
+
+LEXGREATEREQUAL
+ BOOL OP LEXGREATEREQUAL (TEXT CONST l, r)
+ Zweck: Lexikographischer Vergleich von 'l' und 'r' auf "Grösser Gleich".
+
+
+
+4. Der 'reporter'
+
+Das Programm 'reporter' dient zur Fehlersuche und/oder Lokalisierung von
+besonders häufig durchlaufenen Programmteilen. Zu diesem Zweck werden in ein
+Programm Prozeduraufrufe eingefügt, die veranlassen, daß bestimmte Informa-
+tionen (normalerweise Ablaufinformationen) in eine Datei (die TRACE-Datei)
+geschrieben werden.
+
+'reporter' ermöglicht
+
+a) Ablaufinformationen ("trace");
+b) Häufigkeitszählung ("frequency count");
+c) Programmunterbrechung bei Nichterfüllung einer Bedingung ("assertion").
+
+
+
+Installation von 'reporter'
+
+Das Programm befindet sich in der Datei 'reporter' und kann wie üblich in-
+sertiert werden. Jedoch muß es mit 'check off' übersetzt werden, damit keine
+Zeilennummern für 'reporter' generiert werden. Dies ist notwendig, damit die
+Zeilennummern des zu testenden Programms nicht mit den Zeilennummern des
+Programms 'reporter' verwechselt werden können. Beispiel:
+
+ check off; insert ("reporter"); check on
+
+
+
+Vorbereitungen
+
+Mit dem Kommando
+
+ generate reports ("testdatei")
+
+werden die oben erwähnten Prozeduraufrufe ('report') in das zu testende
+Programm, welches in der Datei 'testdatei' steht, geschrieben. Die Prozedur-
+aufrufe werden nach jedem Prozedur-, Operator- oder Refinement-Kopf
+eingefügt und erhalten den entsprechenden Namen als Parameter. Diese
+Prozeduraufrufe werden gekennzeichnet, damit sie von der Prozedur
+
+ eliminate reports ("testdatei")
+
+automatisch wieder entfernt werden können. Beispiel (für die eingefügten
+Prozeduraufrufe):
+
+ ...
+ PROC beispiel (INT CONST mist):
+ ##report ("beispiel");##
+ ...
+
+
+
+Automatische Ablaufinformationen
+
+Ist ein Programm mit 'generate reports' mit 'report'-Aufrufen versehen
+worden, kann es wie gewohnt übersetzt werden. Wird das Programm vom ELAN-
+Compiler korrekt übersetzt und dann gestartet, wird bei jedem Antreffen
+eines 'report'-Aufrufs der Parameter (Name der Prozedur, Operator oder
+Refinement) in eine Datei, die TRACE-Datei geschrieben. Die TRACE-Datei wird
+beim Programmlauf automatisch von 'reporter' unter dem Namen 'TRACE' einge-
+richtet.
+
+Mit Hilfe dieser Datei kann der Programmablauf verfolgt werden. Es ist damit
+auch möglich festzustellen, wo eine "Endlos-Rekursion" auftritt. Die Ablauf-
+informationen bestehen nur aus den Namen der angetroffenen Prozeduren und
+Refinements. Trotzdem können die Anzahl der Informationen sehr umfangreich
+werden. Deshalb gibt es die Möglichkeit, die Erzeugung der Ablaufinforma-
+tionen ab- bzw. wieder anzuschalten. Dazu gibt es die Möglichkeit, in das zu
+testende Programm die Prozeduren
+
+ report on
+ report off
+
+einzufügen und das zu testende Programm mit diesen Prozeduraufrufen (erneut)
+zu übersetzen.
+
+
+
+Benutzereigene Ablaufinformationen
+
+Zusätzlich zu den von 'generate reports' eingefügten 'report'-Aufrufen kann
+ein Benutzer eigene Aufrufe an geeigneten Stellen in ein Programm schreiben.
+Dafür werden weitere 'report'-Prozeduren zur Verfügung gestellt, die als
+ersten Parameter ein TEXT-Objekt (meist Name des Objekts oder der Ausdruck
+selbst) und als zweiten ein INT/REAL/TEXT/ BOOL-Objekt (der zu überprüfende
+Wert oder Ausdruck) enthalten. Beispiel:
+
+ ...
+ PROC beispiel (INT CONST mist):
+ ##report ("beispiel");## (* automatisch eingefuegte *)
+ INT VAR mist :: ...; ...
+ ##report ("mist:", mist);## (* vom Benutzer per Hand eingefuegt *)
+ ...
+
+Folgende 'report'-Routinen stehen zur Verfügung, damit man sie "von Hand" in
+ein zu testendes Programm einfügen kann:
+
+ PROC report on
+ PROC report off
+ PROC report (TEXT CONST message)
+ PROC report (TEXT CONST message, INT CONST value)
+ PROC report (TEXT CONST message, REAL CONST value)
+ PROC report (TEXT CONST message, TEXT CONST value)
+ PROC report (TEXT CONST message, BOOL CONST value)
+
+Wichtig: Hier - wie bei allen anderen "von Hand eingefügten" Aufrufen -
+sollte ein Nutzer sich an die Konvention halten, diese in "##" einzuklammern.
+Mit 'eliminate reports' werden diese Einfügungen automatisch entfernt.
+Sollen diese Aufrufe aber immer im Programm erhalten bleiben (jedoch nicht
+wirksam sein), sollten sie
+
+a) vor 'generate reports'-Aufruf mit jeweils '###' eingefaßt werden.
+ Beispiel:
+ ### report ("...") ###
+ So steht das 'report'-Statement in einem Kommentar. 'generate reports'
+ wandelt '###' --> '####' um, so daß ein solches Statement wirksam wird.
+ 'eliminate reports' wandelt ein '####' --> '###' zurück.
+
+b) nach 'generate reports' in '####' eingefaßt werden.
+
+
+
+Häufigkeitszählung
+
+Eine Häufigkeitszählung erhält man, in dem man in das zu testende Programm
+die Aufrufe
+
+ count on
+ count off
+
+einfügt. Ist die Häufigkeitszählung eingeschaltet, merkt sich 'reporter' die
+Anzahl der Durchläufe für jede Prozedur bzw. Refinement. Mit der Prozedur
+
+ generate counts ("zu testende datei")
+
+werden die vermerkten Häufigkeiten in das zu testende Programm direkt einge-
+fügt. Die Häufigkeiten werden wie oben beschrieben gekennzeichnet, so daß sie
+mit 'eliminate reports' entfernt werden können.
+
+
+
+Assertions
+
+Zusätzlich zu den oben erwähnten Möglichkeiten bietet 'reporter' noch die
+Prozedur
+
+ assert
+
+an. Diese Prozedur kann von einem Programmierer an einer Stelle in das zu
+testende Programm eingefügt werden, an der bestimmte Bedingungen erfüllt sein
+müssen. Die Prozedur 'assert' steht in zwei Formen zur Verfügung:
+
+ PROC assert (BOOL CONST zusicherung)
+ PROC assert (TEXT CONST message, BOOL CONST zusicherung)
+
+Ist der Wert von 'zusicherung' nicht TRUE, wird der Programmlauf abgebrochen.
+
+
+
+'reporter'-Kommandos
+
+count on
+ PROC count on
+ Zweck: Schaltet die Häufigkeitszählung ein.
+
+count off
+ PROC count off
+ Zweck: Schaltet die Häufigkeitszählung aus.
+
+eliminate reports
+ PROC eliminate reports (TEXT CONST datei)
+ Zweck: Entfernt gekennzeichnete 'report'-Aufrufe aus der Datei 'datei'.
+
+generate reports
+ PROC generate reports (TEXT CONST datei)
+ Zweck: Fügt 'report'-Aufrufe in die Datei 'datei' ein und kennzeichnet
+ diese mit '##'.
+
+report on
+ PROC report on
+ Zweck: Schaltet die Ablaufinformationen in die Datei 'TRACE' ein.
+
+report off
+ PROC report off
+ Zweck: Schaltet die Ablaufinformationen wieder aus.
+
+generate counts
+ PROC generate counts (TEXT CONST datei)
+ Zweck: Bringt die Häufigkeitszählung (wie oft eine Prozedur oder Refine-
+ ment durchlaufen wurde) in die Programmdatei 'datei'. Mit
+ 'eliminate reports' werden diese wieder automatisch entfernt.
+
+assert
+ PROC assert (TEXT CONST message, BOOL CONST value)
+ Zweck: Schreibt 'message' und den Wert von 'value' in die TRACE-Datei.
+ Ist 'value' FALSE, wird angefragt, ob das Programm fortgesetzt
+ werden soll.
+
+
+
+5. Referencer
+
+Das Programm 'referencer' erstellt aus einem (syntaktisch korrektem) ELAN-
+Programm eine Liste, in der jedes Auftreten eines Objekts mit der betref-
+fenden Zeilennummer verzeichnet ist.
+
+ 'referencer' wird durch
+
+ referencer ("ref datei", "referenz liste")
+
+aufgerufen, wobei die Datei 'referenz liste' nicht existieren darf.
+'referenz liste' enthält nach Ablauf des Programms die gewünschte Liste, die
+sogenannte Referenzliste.
+
+Achtung: 'referencer' arbeitet ausschließlich mit Namen und verarbeitet nur
+wenige syntaktische Konstrukte. Darum ist es nur erlaubt, ein PACKET auf
+einmal von 'referencer' verarbeiten zu lassen. Verarbeitet man mehrere
+PACKETs auf einmal, kann es geschehen, daß gleichnamige Objekte in unter-
+schiedlichen Paketen zu Warnungen (vergl. die unten beschriebenen Überprü-
+fungen) führen.
+
+In der Referenzliste sind
+
+- alle Objekte mit ihrem Namen (in der Reihenfolge ihres Auftretens im
+ Programm)
+
+- alle Zeilennummern, in der das Objekt angesprochen wird
+
+- die Zeilennummern, in der das Objekt deklariert wurde ('L' für ein lokales
+ und 'G' für ein globales Objekt, 'R' für ein Refinement)
+
+verzeichnet.
+
+Die Referenzliste kann u.a. dazu dienen, zu kontrollieren, ob und wie (bzw.
+wo) ein Objekt angesprochen wird. Dies lohnt sich selbstverständlich nur bei
+etwas umfangreicheren Programmen (bei "Mini"-Programmen kann man dies sofort
+sehen).
+
+Bei der Erstellung der Referenzliste nimmt das Programm 'referencer' gleich-
+zeitig einige Überprüfungen vor, die helfen können, ein Programm zu ver-
+bessern:
+
+1. Warnung bei mehrzeiligen Kommentaren.
+
+2. Ãœberdeckungsfehler. Wird ein Objekt global (auf PACKET-Ebene) und noch-
+ mals lokal in einer Prozedur deklariert, ist das globale Objekt nicht mehr
+ ansprechbar. Überdeckungen sind nach der gültigen Sprachdefinition z.Zt.
+ noch erlaubt, werden aber bei einer Revision des Sprachstandards verboten
+ sein.
+
+3. Mehrmaliges Einsetzen von Refinements. Wird ein Refinement mehrmals einge-
+ setzt (das ist völlig legal), sollte man überlegen, ob sich dieses Refine-
+ ment nicht zu einer Prozedur umgestalten läßt.
+
+4. Nicht angewandte Refinements. Wird ein Refinement zwar deklariert, aber
+ nicht "aufgerufen", erfolgt eine Warnung.
+
+5. Nicht angesprochene Daten-Objekte. Werden Daten-Objekte zwar deklariert,
+ aber im folgenden nicht angesprochen, wird eine Warnung ausgegeben.
+ Hinweis: Alle Objekte, die nur wenig angesprochen werden, also nur wenige
+ Zeilennummern in der Referenzliste besitzen, sind verdächtig (Ausnahmen:
+ importierte Prozeduren, LET-Objekte u.a.m.).
+
+
+
+'referencer'-Kommandos
+
+referencer
+ PROC referencer (TEXT CONST check file, dump file)
+ Zweck: Überprüft 'check file'. In 'dump file' steht nach Abschluß die
+ Referenzliste.
+
+
+
+6. Notizen (Notizbuch, Fehlerprotokoll)
+
+Das Notizbuch erlaubt es u.a., Fehlermeldungen zwischenzeitig zu speichern
+und am Ende einer Verarbeitung die Fehlermeldungen zusammen mit dem bear-
+beiteten Text im Paralleleditor anzuzeigen.
+
+Das Notizbuch wird eingesetzt, wenn Texte bearbeitet werden, die gewissen
+Regeln entsprechen müssen (Beispiele: ELAN-Compiler, Textkosmetik usw.). In
+solchen Fällen ist es nützlich, die Fehlermeldungen zwischenzeitig zu
+speichern und erst am Ende einer Verarbeitung gesammelt dem Benutzer zusam-
+men mit dem Quelltext anzuzeigen. Diese Aufgaben übernimmt das Notizbuch.
+Mit der Prozedur
+
+ note
+
+kann eine Meldung im Notizbuch gespeichert werden. Mit
+
+ note line
+
+wird der Beginn einer neuen Zeile im Notizbuch signalisiert. Das bedeutet,
+daß ein Programmierer für alle Zeilenvorschübe in der Fehlermeldungsdatei mit
+dieser Prozedur zu sorgen hat.
+
+Mit der Informationsprozedur
+
+ anything noted
+
+kann man am Ende einer Verarbeitung abfragen, ob Fehlermeldungen gespeichert
+wurden. Ist das der Fall, kann man den Paralleleditor aufrufen:
+
+ note edit
+
+In der oberen Hälfte werden die Fehlermeldungen dargestellt, in der unteren
+den zu bearbeitenden Text. Beispiel:
+
+ PROC verarbeite (TEXT CONST datei):
+ FILE VAR f :: sequential file (input, datei);
+ verarbeitung;
+ ende behandlung.
+
+ verarbeitung:
+ ...
+ note (fehlermeldung);
+ note line.
+
+ ende behandlung:
+ IF anything noted
+ THEN note edit (f)
+ FI
+ END PROC verarbeite
+
+
+
+Notizbuch-Kommandos
+
+anything noted
+ BOOL PROC anything noted
+ Zweck: Informationsprozedur, ob etwas in das Notizbuch geschrieben wurde.
+
+note edit
+ PROC note edit
+ Zweck Bewirkt das Anzeigen des Notizbuchs auf vollem Bildschirm.
+
+ PROC note edit (FILE VAR f)
+ Zweck: Anzeigen des Notizbuchs und der Datei 'f' durch den Parallel-
+ editor.
+
+note file
+ FILE PROC note file
+ Zweck: Assoziierungsprozedur. Liefert das Notizbuch.
+
+note line
+ PROC note line
+ Zweck: Zeilenvorschub im Notizbuch.
+
+note
+ PROC note (TEXT CONST meldung)
+ Zweck: Schreibt 'meldung' in das Notizbuch.
+
+ PROC note (INT CONST zahl)
+ Zweck: Schreibt 'zahl' als TEXT in das Notizbuch (analog 'put').
+
+
+
+7. Sortier-Programme
+
+Es stehen zwei verschiedene Sortier-Programme zur Verfügung: 'sort'
+(Sortierung nach ASCII-Reihenfolge) und 'lex sort' (Sortierung nach
+deutschem Alphabet).
+
+Das Kommando
+
+ sort ("datei")
+
+sortiert 'datei' zeilenweise. Beispiel:
+
+ Eingabe-Datei:
+ Berta ist eine Frau.
+ Adam ist ein Mann.
+ ...
+ Sortierte Datei:
+ Adam ist ein Mann.
+ Berta ist eine Frau.
+ ...
+
+Dabei werden die Zeilen-Anfänge solange zeichenweise miteinander verglichen,
+bis ein Unterschied auftritt und dann ggf. umgeordnet. Werden zwei ungleich
+lange Zeilen (Anzahl Zeichen/Zeile) miteinander verglichen, dann kann man
+sich die kürzere Zeile mit Leerzeichen auf die Länge der längeren Zeile
+verlängert denken.
+
+Die Reihenfolge, in der die Zeilen sortiert werden, erfolgt nach dem ASCII-
+Zeichensatz in aufsteigender Reihenfolge (vergl. TEIL 3; EUMEL-Zeichencode):
+
+ Leerzeichen
+ einige Sonderzeichen
+ Ziffern
+ einige Sonderzeichen
+ Große Buchstaben
+ einige Sonderzeichen
+ kleine Buchstaben
+ einige Sonderzeichen
+ Umlaute und ß
+
+Das bedeutet, daß z.B. folgendermaßen sortiert wird:
+
+ Adam
+ Ball
+ Zuruf
+ aber das ist ein Satz
+ niemals
+ Ãœberlauf
+
+Um zu erreichen, daß große und kleine Buchstaben gleichwertig behandelt
+werden, kann man das Kommando
+
+ lex sort ("datei")
+
+geben. In diesem Fall würde die sortierte Datei folgendermaßen aussehen:
+
+ aber das ist ein Satz
+ Adam
+ Ball
+ niemals
+ Ãœberlauf
+ Zuruf
+
+Man beachte, daß der Umlaut 'Ü' wie 'Ue' behandelt wird (für die restlichen
+Umlaute gilt eine analoge Behandlung; ebenso wird 'ß' wie 'ss' behandelt).
+Weiterhin werden alle Sonderzeichen bei der Sortierreihenfolge ignoriert.
+
+
+
+Sortier-Kommandos
+
+sort
+ PROC sort (TEXT CONST datei)
+ Zweck: Die Prozedur 'sort' sortiert die Datei 'datei' zeilenweise. Die
+ Sortierung erfolgt nach der Ordnung, die der EUMEL-Zeichencode
+ vorschreibt. Beispielsweise werden Zeilen ("Sätze"), die mit
+ Ziffern beginnen, vor Sätzen, die mit Buchstaben anfangen, ein-
+ geordnet. Sätze, die mit großen Buchstaben beginnen, werden vor
+ Sätzen mit kleinen Buchstaben einsortiert. Weiterhin werden die
+ Umlaute und das "ß" nach allen anderen Buchstaben eingeordnet.
+
+ PROC sort (TEXT CONST datei, INT CONST anfang)
+ Zweck: Sortiert eine Datei wie obige Prozedur, jedoch wird bei der
+ Sortierung nicht der Anfang eines Satzes beachtet, sondern die
+ Position 'anfang'.
+
+lex sort
+ PROC lex sort (TEXT CONST datei)
+ Zweck: Wie 'sort', jedoch nach (deutscher) lexikographischer Reihen-
+ folge nach DIN 5007. Bei den Vergleichen werden die Operatoren
+ LEXEQUAL, LEXGREATER, LEXGREATEREQUAL (vergl. TEIL 11 des
+ Benutzerhandbuchs) verwandt. Anmerkung: 'lex sort' ist um
+ einiges langsamer als 'sort'.
+
+ PROC lex sort (TEXT CONST datei, INT CONST anfang)
+ Zweck: Wie 'lex sort', jedoch wird bei der Sortierung bei 'anfang'
+ jeder Zeile begonnen.
+
+
+
+8. Rechnen im Editor: TeCal
+
+Das Programm TeCal (Abkürzung für "Text Calculator") ermöglicht das einfache
+Rechnen im EUMEL-Editor.
+
+Das Programm TeCal ermöglicht einfache Rechnungen (ähnlich wie mit einem
+Taschenrechner) unter der Benutzung des Editors. Gleichzeitig stehen dem
+Benutzer aber alle Fähigkeiten des Editors zur Verfügung. TeCal ermöglicht
+Rechnungen auf einfache Weise zu erstellen oder Tabellenspalten zu berechnen.
+
+TeCal wird aus dem Editor heraus durch 'ESC t' oder durch das Editor-
+Kommando
+
+ tecal
+
+aktiviert. (Anmerkung: TeCal ist nicht standardmäßig insertiert). Dadurch
+wird in der untersten Zeile des Bildschirms eine Informationszeile aufgebaut,
+in der die (Zwischen-) Ergebnisse einer Rechnung zur Kontrolle festgehalten
+werden.
+
+Merke: TeCal ermöglicht einfache Rechnungen im EUMEL-Editor.
+
+
+
+Ein einfaches Beispiel
+
+Angenommen, Prokurist Meier der Firma 'Software Experts' muß eine Rechnung
+schreiben. Er schreibt u.a.:
+
+ ...
+ Wir berechnen Ihnen
+
+ 1 Manual 'Software Auswahl leicht gemacht' 112.30 DM
+ 1 Manual 'Ohne Fehler programmieren' 300.-
+
+ Summe
+
+Nun kann er die TeCal-Funktionen durch
+
+ ESC t
+
+zuschalten. (Natürlich kann TeCal auch schon während des Schreibens einge-
+schaltet sein, das Editorfenster ist dann nur um eine Zeile (nämlich die
+TeCal-Informationszeile) kürzer. Zuerst löscht Prokurist Meier eventuell
+vorhandene Zwischenergebnisse von TeCal (TeCal vergißt eine angefangene
+Rechnung durch Abschalten nicht!) mit
+
+ ESC C
+
+Das funktioniert wie eine CLEAR-Taste bei einem Taschenrechner, löscht also
+ggf. vorhandene Werte. In der Informationszeile (die letzte Zeile des Bild-
+schirms) erscheint darum als Wert '0.0'.
+
+Nun "fährt" er mit dem Cursor auf den ersten Wert ('112.30'). Dabei ist es
+belanglos, welche Ziffer er "trifft". Dann betätigt er
+
+ ESC L
+
+(für Lesen). Damit erscheint dieser Wert in der Informationszeile. Durch
+'ESC L' wird versucht, einen Wert von der Stelle aus der Datei zu lesen, die
+durch den Cursor angezeigt wird. (Gelingt dies nicht, erfolgt in der
+obersten Zeile eine Fehlermeldung). Dann betätigt er
+
+ ESC +
+
+weil er ja die zwei Werte addieren will. Das Zwischenergebnis in der TeCal-
+Informationszeile bleibt dadurch unverändert. Jetzt fährt er auf den zweiten
+Wert und betätigt erneut 'ESC L'. Nun erscheint der zweite Wert in der An-
+zeige. Um das Ergebnis der Rechnung zu erfahren, betätigt er
+
+ ESC =
+
+Die Summe der zwei Zahlen erscheint nun in der Informationszeile. Nun fährt
+er mit dem Cursor auf die Stelle, an der die Summe stehen soll und betätigt
+hier
+
+ ESC S
+
+(für Schreiben). Damit erscheint die eben errechnete Summe (412.30) an dieser
+Stelle der Datei.
+
+Man bedient TeCal also wie einen Taschenrechner. Man muß allerdings, um die
+Rechentasten zu bedienen, ESC zuvor drücken. Dies ist notwendig, um die
+"normalen" Tasten von den TeCal-Tasten zu unterscheiden.
+
+Merke: Mit einigen einfachen Tastendrücken können Berechnungen vorgenommen
+werden. 'ESC L' liest einen Wert von der aktuellen Cursor-Position, 'ESC S'
+schreibt den angezeigten TeCal-Wert an die aktuelle Cursor-Position. 'ESC C'
+löscht alle Werte im TeCal-Rechner.
+
+
+
+Einige weitere einfache Rechenoperationen
+
+In diesem Abschnitt werden weitere einfache Operationen von TeCal be-
+schrieben.
+
+Natürlich kann man mit TeCal nicht nur Addieren. Die folgenden Operationen
+laufen analog 'ESC +':
+
+ ESC - (Subtrahieren)
+ ESC * (Multiplizieren)
+ ESC / (Dividieren)
+
+Beispiel:
+
+ ...
+ Wir berechnen Ihnen
+
+ Artikelbezeichnung Anzahl Einzelpreis Summe
+
+ Schraube, verdreht 27 1.05 28.35
+
+ Gesamt 28.35
+
+Dazu drückt Prokurist Meier folgende Tasten:
+
+ Cursor auf Taste TeCal-Anzeige
+
+ 27 ESC C 0.00
+ unverändert ESC L 27.00
+ unverändert ESC * 27.00
+ 1.05 ESC L 1.05
+ unverändert ESC = 28.35
+ unter Summe ESC S 28.35
+ in Gesamtzeile ESC S 28.35
+
+Wie wir sehen, kann Prokurist Meier jederzeit seine Eingaben kontrollieren
+mit Hilfe der TeCal-Informationszeile.
+
+Anmerkung:
+
+'ESC S' schreibt den aktuellen Wert wie der Dezimal-Tabulator des Editors
+(vergleiche Kapitel Editor). Die Stelle, an der der Cursor steht, wird beim
+Schreiben die letzte Stelle vor dem Dezimalpunkt. Ziffern vor dem Dezimal-
+punkt werden also nach links, Ziffern nach dem Dezimalpunkt nach rechts ge-
+schrieben.
+
+Merke: ESC mit den Tasten '-', '+', '*' und '/' haben die gewohnte Wirkung.
+
+
+
+Die Verwendung von Klammern
+
+TeCal erlaubt bei Rechnungen die Eingabe von Klammern.
+
+Beispiel (wir haben hier die Taste ESC fortgelassen):
+
+ 2 * (3 + 5) = 16.00
+
+Merke: Klammern können bei Rechnungen beliebig verwendet werden.
+
+
+
+Der Prozent-Operator
+
+Angenommen, wir wollen 14 Prozent von 200 DM errechnen. Dann können wir wie
+gewohnt verfahren (für bessere Lesbarkeit zeigen wir hier für 'ESC L' den
+jeweiligen Wert):
+
+ 200 ESC % ESC =
+
+Der Prozent-Operator berechnet immer einen eingestellten Prozentsatz von dem
+gerade angezeigten Zwischenergebnis. Der eingestellte Prozentsatz wird in der
+Informationszeile angezeigt. Er läßt sich mit Hilfe des Kommandos
+
+ prozentsatz ('prozentzahl')
+
+verändern.
+
+Was müssen wir machen, um die 14 Prozent von 200 auf den Wert von 200 zu
+addieren? Ganz einfach:
+
+ 200 ESC + ESC % ESC =
+
+Wie wir solche Tastensequenzen einfacher erledigen können, zeigen wir in
+einem späteren Abschnitt.
+
+Merke: Der Prozent-Operator berechnet immer den eingestellten Prozentanteil
+vom angezeigten Wert.
+
+
+
+Spaltenweise summieren
+
+Da es beim Schreiben von Rechnungen o.ä. häufig vorkommt, daß eine ganze
+Zahlenkolonne addiert werden soll, besitzt TeCal eine Sonderfunktion, die es
+dem Benutzer erspart, mit dem Cursor auf jeden einzelnen Wert zu fahren und
+'ESC L' sowie 'ESC +' zu drücken. Durch
+
+ ESC V
+
+addiert TeCal zu der Zahl, auf der der Cursor steht alle, die in gerader
+Linie darüberstehen, solange bis eine Zeile gefunden wird, in der Text oder
+andere Zeichen stehen, die nicht zu einer Zahl gehören. Leerzeichen führen
+also nicht zum Abbruch der Rechnung. Nehmen wir an, Prokurist Meier hätte
+seine Rechnung soweit fertig :
+
+ ...
+ Wir berechnen Ihnen
+
+ Artikelbezeichnung Anzahl Einzelpreis Summe
+
+ Schraube, verdreht 27 1.05 28.35
+ Nagel, m. Kopf 33 0.50 16.50
+ Hammer, Spezialausführung m.
+ Eichenholzgriff 1 44.70 44.70
+ --------
+
+Um nun die Gesamtsumme zu berechnen fährt er einfach mit dem Cursor auf die
+unterste Zahl (44.70) und betätigt ESC V. In der Anzeige steht direkt die
+Gesamtsumme, die dann mit ESC S unter dem Strich eingetragen werden kann.
+
+Merke: Zahlenkolonnen können mit ESC V summiert werden.
+
+
+
+Direkte Eingabe
+
+Es kann ein Wert direkt in die Berechnung eingehen, ohne daß er vorher in
+der Datei stehen muß.
+
+Durch das Betätigen von
+
+ ESC E
+
+erscheint 'gib wert :' in der TeCal-Informationszeile. Nun kann ein Wert
+(wie im Editor) eingegeben werden, zugelassen ist auch ein ganzer Ausdruck
+wie z.B.
+
+ (3.00 DM + 5.00 DM) * 365 Tage - 2,00 DM * 12 Monate
+
+Dabei sind auch Buchstaben erlaubt, die aber überlesen werden. Betätigt man
+RETURN, wird der Ausdruck ausgewertet und der Wert in die Anzeige über-
+nommen. Für das oben gezeigte Beispiel steht die Anzeige also anschließend
+auf 2896. Auf diese Weise kann man auch einfach Zwischenrechnungen machen,
+ohne daß die verwendeten Zahlen irgendwo in der Datei stehen. Das Ergebnis
+kann man dann weiter verrechnen, als wäre es mit ESC L aus der Datei gelesen
+worden. Natürlich kann man es auch direkt mit ESC S in die Datei schreiben.
+
+Merke: Mit ESC E wird ein Wert direkt in TeCal aufgenommen. Durch Eingabe
+eines ganzen Rechenausdrucks lassen sich leicht auch Rechnungen durchführen,
+ohne daß die Zahlen in einer Datei stehen.
+
+
+
+TeCal und Lernen im Editor
+
+Bei sich wiederholenden Rechnungen ist es sinnvoll, Rechenoperationen "zu
+lernen" und auf eine Taste zu legen.
+
+Angenommen, Prokurist Meier hat häufig Rechnungen zu schreiben und muß des
+öfteren die Mehrwertsteuer und Bruttopreis unter die jeweiligen Nettopreise
+schreiben. Zu diesem Zweck kann er die "Lern"-Einrichtung des Editors
+benutzen (vergl. EUMEL-Benutzerhandbuch: Editor). Beim Lernen "merkt" sich
+der Editor jeden Tastendruck (also auch TeCal-Operationen). Die gelernten
+Tasten kann man anschließend mit einem Tastendruck abrufen. Meier kann die
+Operationen wie folgt vom Editor lernen lassen:
+
+Er fährt mit dem Cursor zuerst auf den Nettopreis, von der die Mehrwertsteuer
+errechnet werden soll. Dann betätigt er ESC HOP (es erscheint LEARN in der
+Kopfzeile des Editors). Dann schreibt er die TeCal-Operationen wie oben
+gezeigt (in diesem Falle also ESC L ESC + ESC % ; dann steht der Mehrwert-
+steuerbetrag in der Anzeige. Er fährt also mit dem Cursor eine Zeile tiefer
+und betätigt ESC S, dann geht er noch eine Zeile tiefer und gibt ESC = und
+wiederum ESC S um den Bruttobetrag zu berechnen und zu schreiben. Mit dem
+abschließenden ESC HOP und einer weiteren Taste (sagen wir mal 'm' als
+Abkürzung für Mehrwert) beendet er das Lernen. Nun kann er jederzeit die
+Mehrwertsteuer und Bruttobetrag unter einen gegebenen Nettobetrag schreiben,
+indem er ESC m betätigt.
+
+Praktischer Tip:
+
+Tabulator-Bewegungen kann man ebenfalls lernen. So ist es z.B. möglich, die
+Berechnung von Spalten- oder Reihensummen zu erlernen, indem man mit
+TAB jeweils zu dem nächsten Wert springt.
+
+Merke: Es können beliebige Rechnungen erlernt und auf eine Taste gelegt
+werden. Die gelernten Rechnungen können mit Hilfe einer Taste abgerufen
+werden.
+
+
+
+Benutzung des Merkregisters
+
+Mit
+
+ ESC M
+
+(für Merken) kann man ein gerade angezeigtes (Zwischen-) Ergebnis im
+Speicher aufbewahren, um es später an anderer Stelle wieder in die Rechnung
+einzubeziehen. Das geschieht, in dem man dann statt eine Zahl mit ESC L
+einzulesen
+
+ ESC K
+
+(für Konstante) eingibt. Dadurch wird die Zahl aus dem Merkregister wieder
+in die Anzeige übertragen, so daß man damit weiterrechnen kann.
+
+Merke: Man kann Zahlen mit ESC M abspeichern und mit ESC K wiederholen.
+
+
+
+Auskunft über TeCal-Funktionen
+
+Wenn Sie beim Arbeiten mit TeCal noch nicht so sicher sind oder eine Funktion
+benutzen möchten, die Sie sonst nur selten verwenden und deren genaue
+Wirkung sie vielleicht wieder vergessen haben, so hilft Ihnen
+
+ ESC ?
+
+weiter. Nach betätigen dieser Tasten meldet sich die TeCal Auskunft mit
+Funktionstaste drücken oder <?>. Dann geben Sie das Funktionssymbol ein, das
+Sie erklärt bekommen möchten. Geben Sie z.B. ein C ein, wenn Sie die Wirkung
+von ESC C wissen möchten. Daraufhin wird ein Text gezeigt, in dem die
+entsprechende Auskunft steht. In diesem Text können Sie sich wie im Editor
+bewegen. Wenn Sie den Text gelesen haben, können Sie das Fenster wieder mit
+ESC Q verlassen. Dadurch wird der alte Zustand vor der Auskunftsfunktion
+wiederhergestellt. Durch
+
+ ESC ? ?
+
+erklärt sich die Auskunft selbst. Sie bekommen dort unter anderem die Liste
+aller TeCal-Funktionen gezeigt.
+
+Merke: Mit ESC ? erhält man Auskünfte über TeCal-Funktionen.
+
+
+
+Einstellen von Nachkommastellen
+
+Durch das Kommando
+
+ kommastellen ('zahl')
+
+wird die Anzahl der angezeigten Nachkommastellen (0-9) eingestellt. Genau so
+viele Nachkommastellen werden auch bei ESC S oder ESC T geschrieben (intern
+wird aber jeweils mit höchster Genauigkeit gerechnet). Mit
+
+ ESC R
+
+kann man ein angezeigtes Zwischenergebnis auch intern auf die angezeigte Zahl
+von Nachkommastellen runden. Beispiel:
+
+ ESC ( 1 ESC / 3 ESC ) ESC * 2 ESC=
+
+führt zur Anzeige von 0.67 (bei zwei eingestellten Nachkommastellen). Gibt
+man jetzt (aber nach ESC ) noch ESC R ein, so wird das Zwischenergebnis von
+1/3 auf 0.33 gerundet, so daß das Endergebnis 0.66 beträgt.
+
+Merke: Im Kommandomodus kann man durch das Kommando 'kommastellen' die An-
+zahl der Nachkommastellen einstellen.
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil12 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil12
new file mode 100644
index 0000000..ba5d0c6
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil12
@@ -0,0 +1,234 @@
+ EUMEL-Benutzerhandbuch
+
+ TEIL 12: SPOOLER / OPERATOR
+
+1. Spooler-Ãœbersicht
+
+Ein "Spooler" ist eine Warteschlange von Datenräumen#ie# (Dateien) vor einem
+"Worker":
+
+ +------------+ +------------+
+ -----> | | | |
+ -----> | spooler | ------------> | worker |
+ -----> | | | |
+ +------------+ +------------+
+
+Der Spooler puffert Dateien, die von beliebigen Tasks geschickt werden kön-
+nen, in seiner Warteschlange und gibt sie der Reihe nach dem Worker zur
+eigentlichen Verarbeitung. Ein typischer Einsatzfall (aber nicht der einzige)
+für ein solches System ist der EUMEL-Drucker in Multi-User-Systemen. Unab-
+hängig davon, ob der Drucker gerade aktiv ist und wieviele Dateien noch auf
+den Ausdruck warten, kann man seine Datei dem Druckspooler schicken und
+sofort danach weiterarbeiten.
+
+Da jeder Spooler und auch jeder Worker eine eigene Task ist, können Spooler
+nur im Multi-User-Systemen eingesetzt werden.
+
+Im folgenden wird nur die anwenderseitige Schnittstelle eines Spoolers be-
+schrieben.
+
+Merke: Ein Spooler puffert Dateien für einen Worker.
+
+
+
+2. Die Benutzung eines Spoolers
+
+Jeder Spooler im System ist eine eigene Task und hat dementsprechend einen
+Tasknamen, über den er angesprochen werden kann. So heißt der Druckspooler
+beispielsweise " PRINTER".
+
+Jede Task kann jedem Spooler durch Aufruf von 'save' eine Datei schicken.
+Beispiel:
+
+ save ("datei name", task ("spooler name"))
+
+(Vergl. auch TEIL 7). In der Regel ist ein SPOOLER für (mindestens) einen
+Drucker in einem EUMEL-System vorhanden. Dieser kann über den internen
+Task-Bezeichner 'print' angesprochen werden. Beispiel:
+
+ save ("datei name", printer)
+
+Eine so übergebene Datei kann man durch
+
+ erase ("datei name", printer)
+
+aus der Warteschlange löschen. (Natürlich nur solange sie sich noch in dieser
+Warteschlange befindet). Dabei kann man nur auf solche Dateien zugreifen, die
+aus der eigenen Task stammen. Durch Aufruf von
+
+ list (printer)
+
+wird die aktuelle Warteschlange des angegebenen Spoolers auf dem Terminal
+angezeigt, so daß man sich über die Anzahl der Dateien und die Position der
+eigenen Dateien im Spooler informieren kann.
+
+Aufbauend auf diesen allgemeinen Kommandos können weitere für spezielle
+Spooler programmiert werden. So gibt es für den Spooler 'printer' die Proze-
+duren
+
+ print und print ("datei name")
+
+die im wesentlichen auf
+
+ save ("datei name", printer)
+
+zurückgeführt werden.
+
+Merke: Einem SPOOLER kann man eine (oder mehrere) Dateien mit 'save'
+schicken. Mit 'list' kann man sich über die Dateien im SPOOLER informieren.
+Einem Drucker-SPOOLER übergibt man mit 'print' eine Datei.
+
+
+
+3. Privilegierte Spooler-Kommandos
+
+Gewisse Kommandos können einer #ib#Spooler-Task#ie# direkt im Dialog (ähn-
+lich wie im 'maintenance'-Zustand eines globalen Datei-Managers) gegeben
+werden. Dazu muß der Spooler mit 'continue' an ein Terminal geholt werden.
+Ist der SPOOLER durch ein Paßwort, so sind diese privilegierten Kommandos
+nicht für jeden Benutzer zugänglich.
+
+break
+ PROC break
+ Zweck: Beendet den Dialogzustand des Spoolers. Der Spooler koppelt sich
+ vom Terminal ab und geht in seinen normalen Verarbeitungsmodus
+ über.
+
+first
+ PROC first
+ Zweck: Vorziehen einer Datei in der Warteschlange auf den ersten Platz.
+ Alle Dateien von der zweiten an werden im Dialog zum Vorziehen
+ angeboten.
+
+start
+ PROC start
+ Zweck: Die (vorher gestoppte) Worker-Task wird neu kreiert und ge-
+ startet.
+
+stop
+ PROC stop
+ Zweck: Die Worker-Task wird abgebrochen und gelöscht. Damit wird auch
+ ein von ihr belegetes Terminal wieder frei.
+
+
+Hinweis: Die Kommandos 'start/stop' sind gut dazu geeignet, die Verarbeitung
+ einer Datei durch einen Worker (z.B. Druckoutput) abzubrechen, bei
+ Hardwareeingriffen zu stoppen oder Worker (wie z.B. Drucker) nur
+ zeitweise zu betreiben.
+
+Hinweis: Wenn der Worker mit Verzögerung abgebrochen werden soll, kann man
+ den Spooler an ein Terminal holen und dann so lange mit der Eingabe
+ von 'stop' warten, bis der Worker mit der gerade bearbeiteten Datei
+ fertig ist. Der Spooler kann in dieser Zeit nicht von anderen Tasks
+ oder dem Worker angesprochen werden.
+
+
+
+4. Der OPERATOR
+
+Im folgenden Abschnitt wird die standardmäßig implementierte Task OPERATOR
+erläutert. Erweiterungsmöglichkeiten sind im Systemhandbuch beschrieben. Dem
+OPERATOR stehen gewisse privilegierte Kommandos zur Verfügung. Diese Kom-
+mandos (System abschalten, fremde Tasks löschen u.a) werden vom "normalen"
+Benutzer des Multi-User-Systems nicht benötigt. Sie sind nur für den
+"Operateur" interessant. Es empfiehlt sich, OPERATOR mit einem Paßwort zu
+versehen, damit die priviligierten Kommandos nicht jedem Benutzer zur Ver-
+fügung stehen.
+
+
+
+Einschalten des EUMEL-Systems
+
+Wie ein EUMEL-System eingeschaltet wird, kann hier nicht beschrieben werden,
+weil dies abhängig von speziellen Rechnern ist (Lage des Ein/Aus-Schalters
+u.a.m.). Üblicherweise liefern die Hersteller für diesen Zweck bei der Aus-
+lieferung Anweisungen mit.
+
+Nach Einschalten des Rechnersystems befindet man sich in der Task OPERATOR.
+Diese Task dient zum kontrollierten Ein- und Ausschalten des EUMEL-Systems.
+Nach dem Einschalten wird man automatisch von der Task OPERATOR nach dem
+aktuellen Datum und der Uhrzeit gefragt. Nach Eingabe dieser Werte erfolgt
+
+ gib kommando :
+
+Der Benutzer befindet sich also in der Monitor-Ebene (vergl. dazu auch
+TEIL 2). Um die Task OPERATOR vom Terminal abzukoppeln, gibt man
+
+ break
+
+Nach Betätigen der SV-Taste erscheint dann
+
+ gib supervisor kommando :
+
+Nun kann man mit 'begin' oder 'continue' eine neue Task einrichten oder mit
+einer alten Task in der Arbeit fortfahren.
+
+Merke: Nach dem Einschalten gibt man das Datum und die Uhrzeit an.
+ Dann koppelt man die Task OPERATOR mit 'break' ab.
+
+
+
+EUMEL-System ausschalten
+
+Nachdem die Arbeiten in der Benutzer-Task beendet wurden, koppelt man die
+Task mit
+
+ break
+
+vom Terminal ab oder beendet die Task mit
+
+ end
+
+Achtung: Bei 'end' werden alle Dateien der Task gelöscht.
+
+Nach Betätigen der SV-Taste kann nun ein Supervisor-Kommando gegeben
+werden. Um das EUMEL-System kontrolliert auszuschalten, muß man die Task
+OPERATOR wieder an das Terminal holen. Das erfolgt mit
+
+ continue ("OPERATOR")
+
+Die OPERATOR-Task meldet sich mit
+
+ gib kommando :
+
+Nun kann man das Kommando
+
+ shutup
+
+geben, welches das System kontrolliert abschließt. 'shutup' garantiert, daß
+alle Dateien auf dem Hintergrund des EUMEL-Systems gesichert werden. Wird
+das EUMEL-System ohne 'shutup' ausgeschaltet (z.B. indem der Rechner einfach
+ausgeschaltet wird), können die Informationen, die seit dem letzten Fixpunkt
+(üblicherweise 15 Minuten) aufgelaufen sind, verloren sein.
+
+Merke: In der Task OPERATOR wird mit dem Kommando 'shutup' das EUMEL-System
+kontrolliert abgeschaltet.
+
+
+
+Übersicht über die #ib#OPERATOR-Kommandos
+
+end
+ PROC end (TASK CONST task)
+ Zweck: Löschen der Task 'task'. Hierbei findet keine Paßwortüberprüfung
+ statt. Darum sollte die Task OPERATOR auch mit einem Paßwort
+ versehen sein, weil man vom OPERATOR jede Task löschen kann.
+ Beispiel:
+
+ end (task ("hugo")) (* oder: *)
+ end (/"hugo")
+
+set date
+ PROC set date
+ Zweck: Einstellen des Datums und der Uhrzeit. Das Erfragen der Werte
+ erfolgt interaktiv.
+
+shutup
+ PROC shutup
+ Zweck: Kontrolliertes Herunterfahren des gesamten Systems. Alle Tasks
+ bleiben mit ihren Daten erhalten. Beim Start des Systems meldet
+ sich die OPERATOR-Task wieder auf dem gleichen Terminal. Das
+ Kommando sollte deshalb möglichst nur am Terminal 0 gegeben
+ werden. Nach dem Start sollte der OPERATOR mit 'break' vom
+ Terminal abgekoppelt werden.
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil2 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil2
new file mode 100644
index 0000000..c70ddfc
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil2
@@ -0,0 +1,628 @@
+ EUMEL-Benutzerhandbuch
+
+ TEIL 2: Supervisor/Monitor
+
+
+1. Task-Organisation
+
+In diesem Kapitel wird die Task-Verwaltung und der Task-Baum beschrieben.
+
+Alle Tasks des EUMEL-Systems werden in einen Task-Baum eingebunden. Das be-
+deutet, daß die Task eines Benutzers automatisch einen "Vater" besitzt, aber
+auch neue Tasks ("Söhne") erzeugen kann. In einem EUMEL-System gibt es in
+der Regel zwei spezielle Tasks (#ib#UR#ie# und #ib#SUPERVISOR#ie#). Alle
+anderen Tasks sind Söhne oder Enkel dieser Tasks. Zum Beispiel:
+
+Die mit großen Buchstaben geschriebenen Tasknamen sind "System"-Tasks; die
+mit kleinen Buchstaben geschriebenen Tasknamen sind Benutzer-Tasks (dies
+ist nicht zwingend, sondern Konvention).
+
+- SUPERVISOR: Übernimmt das Einrichten bzw. Löschen von Tasks.
+
+- OPERATOR: Übernimmt u.a. die Aufgaben für das Ein- bzw. Ausschalten des
+ EUMEL-Systems.
+
+- ARCHIVE: Ãœbernimmt die Auslagerung von Dateien auf Archive.
+
+- UR: Ist der "Urvater" des EUMEL-Systems, enthält u.a. den
+ ELAN-Compiler.
+
+- PUBLIC: Enthält Dateien, die längerfristig gehalten werden müssen und
+ die alle Benutzer des Systems benötigen.
+
+
+Der Task-Baum hat folgende Bedeutung:
+
+Eine Task, die sich "unter" einer anderen befindet, ist ein "Sohn" dieser
+"Vater"-Task. Beispielsweise ist die Task PUBLIC ein Sohn von UR (und UR ist
+somit Vater von PUBLIC).
+
+Die für eine Task zur Verfügung stehenden Datentypen und Operationen (d.h.
+die Objekte, die aus insertierten ELAN-Paketen herausgereicht werden), sind
+durch die direkte aufsteigende Linie im Task-Baum vorgegeben. Die in "Vater-
+Tasks" insertierten und über die Schnittstelle herausgereichten Objekte
+stehen in den "Söhnen" automatisch zur Verfügung. Beispielsweise stehen einer
+Sohn-Task von 'user 1' alle insertierten Objekte aus der 'user 1'-Task zur
+Verfügung (zusätzlich zu denen, die in UR und PUBLIC insertiert wurden).
+Somit ist leicht möglich, unterschiedliche Sprachmengen des ELAN-Compilers
+zur Verfügung zu stellen. Vergl. dazu auch das Kapitel über den ELAN-
+Compiler.
+Ähnliches gilt bei Dateien. So ist es erlaubt, Dateien zu direkten Vätern und
+Söhnen im Taskbaum zu transportieren, aber nicht unmittelbar in "parallele"
+Tasks. Man kann somit in der 'user 1'-Task Dateien von UR oder PUBLIC be-
+ziehen, aber nicht von 'user 2' (da diese Task eine "parallele" Task ist).
+Soll das trotzdem geschehen, so muß eine Datei erst von 'user 1' zu PUBLIC
+geschickt werden und dann von 'user 2' dort abgeholt werden. Genaueres über
+solche Operationen findet man im Benutzerhandbuch über die Datenräume.
+
+Einige Tasks sind speziell dafür eingerichtet, Dateien für mehrere Nutzer
+aufzubewahren. So sind UR und PUBLIC Tasks, die Dateien verwalten, die
+längerfristig gehalten werden sollen. Solche Tasks werden "Manager"-Tasks
+genannt.
+
+
+2. Supervisor und Tasks
+
+Eine Task ist für einen Benutzer ein "eigener Rechner", in der er Programme
+bearbeiten lassen und/oder Daten aufbewahren kann, ohne von anderen Nutzern,
+die gleichzeitig im System arbeiten, gestört zu werden. Der Supervisor er-
+möglicht u.a. die Einrichtung, Weiterbearbeitung und Beendigung einer Task.
+
+
+Ãœberblick
+
+Eine Task ist im EUMEL-System ein selbständiger Prozeß. Zu jedem Program-
+mierer an einem Terminal gehört eine damit verbundene Task. Für den Benutzer
+ist diese Task sozusagen ein "eigener Rechner". In einem EUMEL-System sind
+zur gleichen Zeit noch weitere Tasks vorhanden, so z.B. zum Start und Ab-
+schalten des Systems (OPERATOR), zur Druckersteuerung (SPOOLER), zur Ver-
+waltung längerfristig benötigter Dateien u.a.m..
+
+Der Supervisor ist auf der ELAN-Ebene des EUMEL-Systems der Betriebssystem-
+kern. Seine Aufgabe ist im wesentlichen die Task-Verwaltung, nämlich die Er-
+richtung und das Löschen von Tasks. Im einfachsten Fall kommt ein Benutzer
+des EUMEL-Systems mit dem Supervisor also nur bei den Supervisor-Kommandos
+in Kontakt, die den Beginn und das Ende einer Task steuern.
+
+Jede Task wird in einen "Taskbaum" eingeordnet. Jede Benutzer-Task ist
+"Sohn" einer bereits vorhandenen "Vater"-Task und "erbt" von dieser vorüber-
+setzte Programme. Man kann Dateien zu einer Vater-Task schicken oder von
+dieser empfangen.
+
+
+Eine neue Task beginnen
+
+Mit dem Supervisor-Kommando 'begin' kann eine neue Task eingerichtet werden.
+
+Soll eine neue Arbeit im EUMEL-System begonnen werden, muß eine neue Task
+eingerichtet werden. Dazu muß das Supervisor-Kommando 'begin' gegeben
+werden. Jedes Supervisor-Kommando muß durch die Betätigung der SV-Taste
+eingeleitet werden. Dadurch meldet sich das EUMEL-System mit
+
+ gib supervisor kommando :
+
+Jetzt kann eines der Supervisor-Kommandos gegeben werden. In unserem Fall
+wollen wir mit dem 'begin'-Kommando eine neue Task einrichten. Beispiel:
+
+ begin ("rainer")
+
+errichtet eine neue Task in dem EUMEL-System mit dem Namen 'rainer'. Die
+Task meldet sich mit
+
+ gib kommando :
+
+Nun kann ein beliebiges Monitor-Kommando gegeben werden.
+
+Wird eine Task in der geschilderten Weise eingerichtet, ist diese Task im
+Taskbaum automatisch ein "Sohn" der Task 'PUBLIC'. 'PUBLIC' ist in der Lage,
+Dateien von der neuen Sohn-Task zu empfangen ('save'-Kommando) oder man kann
+Dateien von 'PUBLIC' in die Sohn-Task holen ('fetch'-Kommando). Solche Tasks,
+die Dateien verwalten können, werden 'manager' genannt.
+
+Merke: Nach dem Betätigen der SV-Taste meldet sich der Supervisor.
+ Mit dem 'begin'-Kommando wird eine neue Task eingerichtet.
+
+
+
+Eine Task ab- und ankoppeln
+
+Mit dem 'break'- und 'continue'-Kommandos können die Arbeiten in einer Task
+unterbrochen und später wieder aufgenommen werden.
+
+Soll die Arbeit in einer Task unterbrochen werden, so kann man das (Monitor-)
+Kommando
+
+ break
+
+geben, welches die Task vom Benutzer-Terminal abkoppelt. Die Task wird dann
+vom System als "Hintergrund-Task" geführt, bleibt also weiterhin bestehen.
+Mit dem Supervisor-Kommando
+
+ continue ("meine task")
+
+kann eine solche "abgekoppelte" Task wieder an ein Terminal angekoppelt und
+die unterbrochenen Arbeiten weitergeführt werden.
+
+Mit 'break' wird eine Task unterbrochen, während durch das 'continue'-Kom-
+mando die Arbeiten fortgesetzt werden können.
+
+
+
+Eine Task beenden
+
+Mit dem 'end'-Kommando wird eine Task beendet und gelöscht.
+
+Sind die Arbeiten in einer Task beendet, so sollte sie aus dem System ent-
+fernt werden. Dies erfolgt mit dem Kommando
+
+ end
+
+Nach einer Rückfrage des Systems wird die Task gelöscht. Beachte, daß mit dem
+Löschen der Task auch alle in ihr befindlichen Dateien gelöscht werden.
+
+Merke: Mit dem 'end'-Kommando wird eine Task beendet und alle in ihr befind-
+lichen Daten werden gelöscht.
+
+
+
+Eine Task als Sohn einer Task einrichten
+
+Mit dem 'begin'-Kommando ist es auch möglich, eine Task als Sohn einer be-
+stimmten Task einzurichten. Damit die Vater-Task auch Dateien der einzu-
+richtenden Sohn-Task verwalten kann, muß man sie vorher zu einer 'manager'-
+Task machen.
+
+In der Regel richtet man seine Task als Sohn von PUBLIC ein. Das erfolgt
+automatisch, sofern man im 'begin'-Kommando nichts anderes als den neuen
+Tasknamen angibt. Manchmal ergibt sich aber die Notwendigkeit, eine Task als
+Sohn einer bestimmten Task einzurichten. Gründe können dafür u.a. sein:
+
+- Man will eine eigene Datei-Hierarchie über mehrere Tasks einrichten.
+
+- Man will ein Programmsystem anderen Benutzern zur Verfügung stellen.
+
+Damit eine Task als Vater für andere, noch einzurichtende Task arbeiten kann,
+muß man sie zuerst zu einer 'manager'-Task machen. Das erfolgt mit dem
+Kommando
+
+ global manager
+
+Dies Kommando muß in der Task gegeben werden, die eine Vater-Task werden
+soll. Damit wird die Task befähigt, Söhne einzurichten und Dateien, die von
+einem (oder mehreren) Söhnen geschickt werden, zu verwalten.
+
+Durch das 'global manager'-Kommando wird implizit ein 'break'-Kommando ge-
+geben, so daß der Benutzer in der Supervisor-Ebene landet. Koppelt man nun
+zu irgendeinem Zeitpunkt diese (zunächst potentielle) Vater-Task wieder an
+('continue'-Kommando), meldet sich die Task nicht wie gewohnt mit 'gib
+kommando :', sondern mit
+
+ maintenance :
+
+um anzudeuten, daß es sich um eine 'manager'-Task handelt.
+
+Um eine Sohn-Task "unterhalb" der 'manager'-Task einzurichten, gibt man das
+'begin'-Kommando, wobei man die Vater-Task mit angibt. Beispiel:
+
+ begin ("rainer", "vatername")
+
+richtet eine neue Task 'rainer' ein, die als Sohn der Vater-Task 'vatername'
+in den Taskbaum eingeordnet wird.
+
+Merke: Das Kommando 'global manager' macht eine Task zu einer 'manager'-Task.
+Mit dem 'begin'-Kommando kann man auch eine Task als Sohn einer bestimmten
+Task einrichten.
+
+
+
+Ein laufendes Programm unterbrechen
+
+Mit dem Betätigen der SV-Taste und dem Supervisor-Kommando 'halt' kann ein
+Programm abgebrochen werden.
+
+Soll ein Programm, welches gerade ausgeführt wird, vorzeitig abgebrochen
+werden, so betätigt man die SV-Taste und gibt das Supervisor-Kommando
+
+ halt
+
+Anschließend kann man wieder ein Monitor-Kommando geben, weil man durch das
+'halt'-Kommando automatisch wieder in seine Task gelangt.
+
+Merke: Mit dem 'halt'-Kommando wird ein Programm abgebrochen.
+
+
+
+Eine Task mit Paßwort schützen
+
+Man kann eine Task durch ein Paßwort vor unberechtigtem Zugriff schützen.
+
+Das Kommando
+
+ task password
+
+welches nur im Monitor gegeben werden kann, sorgt dafür, daß eine Task fort-
+an nur wieder mit einem 'continue'-Kommando 'betreten' werden kann, wenn man
+vorher das richtige Paßwort angibt. Beispiel:
+
+ task passwort ("mein geburtstag")
+
+Versucht nun ein Benutzer, die mit dem Paßwort geschützte Task mit dem
+'continue'-Kommando an sein Terminal anzukoppeln, wird er zunächst nach dem
+'Paßwort' gefragt. Nur unter Angabe des Paßwortes wird die Task angekoppelt. #count("1")#)
+
+Man sollte Paßwörter möglichst behalten! Durch Paßwörter geschützte Tasks
+kann niemand - außer durch die Angabe des korrekten Paßworts - die Task
+wieder ankoppeln. Hat man das Paßwort vergessen, kann man nur noch die Task
+löschen.
+
+Damit ist gewährleistet, daß kein unberechtigter Benutzer an die Dateien und
+Programme der Task gelangen kann. Es gibt jedoch noch zwei Situationen, die
+einen unberechtigten Zugang zu Dateien erlauben:
+
+a) Dateien in die Vater-Task schicken:
+ Transportiert man Dateien in die Vater-Task ('save'-Kommando, vergl. auch
+ Teil 7: Datei-Verwaltung), können Benutzer auf diese Dateien zugreifen
+ (sofern sie Zugang zu dieser Task haben). Dies kann man verhindern, in dem
+ man ein Datei-Paßwort angibt (siehe Teil 7 für die Beschreibung dieser
+ Paßworte). Man beachte, daß das Paßwort für Dateien und das oben be-
+ schriebene Paßwort für Tasks nichts miteinander zu tun haben.
+
+b) Dateien werden in eine Sohn-Task geholt:
+ Ist die Task als Vater-Task eingerichtet (Kommando 'global manager') dann
+ ist es möglich, von der Sohn-Task Dateien ('fetch'-Kommando) aus der
+ Vater-Task zu holen, die mit einem Paßwort geschützt ist. Darum muß man
+ verhindern, daß Unberechtigte Söhne einer mit Paßwort geschützten Task
+ einrichten können. Das kann man mit dem Kommando
+
+ begin password ("geheim")
+
+ Wird dieses Kommando gegeben, wird man bei dem Versuch, eine Sohn-Task
+ einzurichten, nach einem Paßwort gefragt. Beachte, daß das 'begin-
+ password' nichts mit dem Task-Paßwort und Datei-Paßwort zu tun hat.
+
+Merke: Mit dem 'task password'-Kommando wird eine Task durch ein Paßwort
+geschützt.
+
+
+
+Informations-Kommandos
+
+(Die Informations-Kommandos können auch vom Monitor aus gegeben werden).
+
+Mit der Informationsprozedur
+
+ task status
+
+können Sie sich über den Zustand einer Task informieren. Beispiele:
+
+ task status (* informiert über die eigene Task *)
+ task status (father) (* informiert über die Vater-Task *)
+
+'task status' informiert u.a. über die verbrauchte CPU-Zeit der Task, den
+belegten Speicherplatz (man beachte, daß Dateien mit Vater-Tasks oder Sohn-
+Tasks werden), den Kanal, an dem die Task angekoppelt ist und dem Zustand
+der Task (vergl. auch 'task info').
+
+Mit der Prozedur
+
+ task info
+
+können Sie eine Übersicht über alle in dem System befindlichen Tasks er-
+halten.
+Mit dem Kommando
+
+ storage info
+
+kann man erfahren, wieviel Speicherplatz auf dem EUMEL-Hintergrund (noch)
+zur Verfügung steht.
+
+Durch einige Kommandos, die man nur vom Monitor aus geben kann, kann man
+sich den Namen von Tasks liefern lassen. Die Kommandos
+
+ myself
+ father
+
+liefern den (internen) Task-Namen. Mit dem Kommando
+
+ name
+
+bekommt man den internen Tasknamen in einen Text gewandelt. Beispiel:
+
+ put (name (myself))
+ put (name (father))
+
+Mit dem Kommando
+
+ rename myself
+
+kann der Task-Name der Benutzer-Task geändert werden.
+
+Merke: Durch die Informations-Kommandos 'storage info' und 'task info' kann
+man erfahren, wieviel Speicherplatz und welche Tasks in dem EUMEL-System
+sind. Mit den Kommandos 'myself' und 'father' kann man mehrere Dateien auf
+einmal manipulieren (vergl. Teil 7).
+
+
+
+Übersicht über Supervisor- und Task-Kommandos
+
+In diesem Abschnitt werden alle Supervisor- und Task-Kommandos in der ELAN-
+Notation dargestellt.
+
+Die Supervisor-Kommandos entsprechen - wie alle anderen Kommandos im EUMEL-
+System - der ELAN-Syntax (Kommando-Namen werden klein geschrieben, Parameter
+in Klammern, mehrere Parameter durch Kommata getrennt, TEXT-Parameter in
+Anführungstrichen usw.). Dabei ist jedoch zu beachten, daß diese Kommandos
+zum Teil nur im Supervisor-Zustand (vorheriges Betätigen der SV-Taste) ge-
+geben werden können. Die Kommandos 'break', 'end', 'storage info' und
+'task info' können auch im Monitor gegeben werden.
+Folgende Supervisor-Kommandos stehen zur Verfügung:
+
+begin
+ PROC begin (TEXT CONST task name)
+ Zweck: Richtet eine neue Task als Sohn von PUBLIC ein.
+
+ PROC begin (TEXT CONST task name, father task name)
+ Zweck: Richtet eine neue Task als Sohn der 'father task name'-Task ein.
+
+begin password
+ PROC begin password (TEXT CONST geheim)
+ Zweck: Verhindert das unberechtigte Einrichten einer Sohn-Task.
+
+break
+ PROC break
+ Zweck: Die zum Terminal aktuell zugeordnete Task wird abgekoppelt. Sie
+ wird damit zu einer Hintergrund-Task, d.h. sie wird entweder bis
+ zu ihrem Ende oder bis zur nächsten angeforderten Terminal-Ein-/
+ Ausgabe oder bis zum nächsten 'continue'- Kommando weiter be-
+ arbeitet.
+
+continue
+ PROC continue (TEXT CONST task name)
+ Zweck: Eine im Hintergrund laufende Task wird an das Terminal des
+ Benutzers angekoppelt.
+
+end
+ PROC end
+ Zweck: Die zum Terminal aktuell gehörende Task wird abgebrochen und
+ gelöscht. Das Kommando ist im Monitor verfügbar.
+
+father
+ TASK PROC father
+ Zweck: Liefert den internen Tasknamen.
+
+global manager
+ PROC global manager
+ Zweck: Macht eine Task zur 'manager'-Task. Erst nach Aufruf dieser
+ Prozedur sind Sohn-Tasks möglich.
+
+halt
+ PROC halt
+ Zweck: Das laufende Programm der dem Terminal aktuell zugeordneten Task
+ wird abgebrochen. Im Gegensatz zum 'end'-Kommando wird nur das
+ laufende Programm abgebrochen, aber die Task wird nicht gelöscht.
+ Genauer:
+ Es wird der Fehler 'halt from terminal' induziert. Normalerweise
+ wird das Programm dadurch wie durch jeden anderen Fehler abge-
+ brochen. Genaueres findet man im Systemhandbuch unter Fehler-
+ behandlung.
+
+name
+ TEXT PROC name (TASK CONST interner name)
+ Zweck: Wandelt den internen Task-Namen in einen TEXT.
+
+rename myself
+ PROC rename myself (TEXT CONST neuer name)
+ Zweck: Umbenennen einer Benutzer-Task.
+
+myself
+ TASK PROC myself
+ Zweck: Liefert den internen Task-Namen der Benutzer-Task.
+
+storage info
+ PROC storage info
+ Zweck: Informationsprozedur über den verfügbaren Hintergrund-Speicher.
+
+task info
+ PROC task info
+ Zweck: Informiert über alle Tasknamen im System unter gleichzeitiger An-
+ gabe der Vater/Sohn-Beziehungen (Angabe durch Einrückungen).
+
+ PROC task info (INT CONST art)
+ Zweck: Informiert über alle Tasks im System. Mit 'art' kann man die Art
+ der Zusatz-Information auswählen. Für 'art' sind zur Zeit
+ folgende Werte zugelassen:
+
+ 1: entspricht 'task info' ohne Parameter, d.h. gibt nur die
+ Tasknamen unter angabe der Vater/Sohn-Beziehungen aus.
+
+ 2: gibt die Tasknamen aus. Zusätzlich erhalten Sie Informationen
+ über die verbrauchte CPU-Zeit der Task, die Priorität, den
+ Kanal, an dem die Task angekoppelt ist und den eigentlichen
+ Taskstatus. Hierbei bedeuten:
+
+ 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, 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.
+
+ 3: wie 2, aber zusätzlich wird der belegte Speicher angezeigt.
+ (Achtung: Prozedur ist aufwendig!). Beachten Sie, daß Dateien
+ mit Väter/Söhnen "geshared" werden. Beispiel:
+ Mit 'begin ("sohn", "vater")' wird eine neue Task eingerichtet.
+ Für 'sohn' wird in diesem Zustand der gleiche belegte Speicher
+ angezeigt wie für 'vater'. Erst wenn (Datei-)Operationen in
+ der Sohn- oder Vater-Task vorgenommen werden, wird ein unter-
+ schiedlicher Speicherplatz angezeigt.
+
+task status
+ PROC task status
+ Zweck: Informationsprozedur über den Zustand der eigenen Task.
+ Informiert u.a. über
+ - Name der Task, Datum und Uhrzeit;
+ - verbrauchte CPU-Zeit;
+ - belegten Speicherplatz;
+ - Kanal, an den die Task angekoppelt ist;
+ - Zustand der Task (rechnend u.a.m.);
+ - Priorität.
+
+ PROC task status (TASK CONST t)
+ Zweck: Wie obige Prozedur, aber über die Task mit dem internen Task-
+ namen 't'. Beispiel: task status (father)
+
+task password
+ PROC password (TEXT CONST geheim)
+ Zweck: Einstellen eines Paßworts für eine Task im Monitor. Das Kommando
+ 'task password' ist ein Monitor-Kommando. Ist eine Task mit einem
+ Paßwort geschützt, so wird durch den Supervisor nach dem
+ 'continue'-Kommando das Paßwort angefragt. Nur nach Eingabe des
+ richtigen Paßworts gelangt man in die gewünschte Task. Das Paß-
+ wort kann durch nochmaligen Aufruf von 'task password' geändert
+ werden, z.B., wenn es in regelmäßigen Abständen geändert werden
+ muß, um personenbezogene Daten zu schützen.
+
+ Es gibt keine Möglichkeit, ein einmal eingestelltes Paßwort in
+ Erfahrung zu bringen. Sollte das Paßwort vergessen werden, kann
+ somit die Task nur noch gelöscht werden.
+
+ Wird als Paßwort ein '-'-Zeichen eingegeben, so wird verhindert,
+ daß die betreffende Task jemals wieder mit dem 'continue'-Kom-
+ mando angekoppelt werden kann. Dies ist z.B. für Manager-Tasks
+ sinnvoll.
+
+
+
+3. Der Monitor
+
+Der EUMEL-Monitor führt den Dialog mit dem Benutzer innerhalb einer Task. In
+diesem Kapitel werden nur die Ausführung der Kommandos und die Kommando-
+Arten beschrieben, während die einzelnen Kommandos selbst in den jeweiligen
+Kapiteln des Benutzerhandbuchs erläutert werden.
+
+Der Monitor ermöglicht es, Leistungen im Dialog mit Hilfe von Kommandos
+(ELAN-Prozeduraufrufen) vom EUMEL-Betriebssystem anzufordern. Nach dem
+Beginn einer Sitzung meldet sich der Monitor mit
+
+ gib kommando :
+
+Danach kann der Benutzer Monitor-Kommandos geben. Erfolgt dabei ein Schreib-
+fehler, so kann er (wie beim Editor) innerhalb der Zeile positionieren, über-
+schreiben, löschen, einfügen u.a.m.. Die Ausführung des/der Kommandos wird
+mit der Taste RETURN ausgelöst. Nach Abschluß einer Kommando-Ausführung er-
+scheint wieder obige Meldung. Die Tastenfolge ESC k stellt das zuletzt gege-
+bene Kommando wieder dar.
+
+Monitor-Kommandos müssen gemäß der ELAN-Syntax geschrieben werden (Kommando-
+Namen werden klein geschrieben, Parameter in Klammern, mehrere Parameter
+durch Kommata getrennt, TEXT-Parameter in Anführungstrichen usw.). Beispiele:
+
+ edit ("meine datei")
+ copy ("meine datei", "Duplikat")
+
+Bei den meisten Kommandos mit einem TEXT-Parameter kann der Parameter fort-
+gelassen werden. Der Monitor versorgt das Kommando immer mit dem zuletzt an-
+gegebenen Parameter und zeigt dies auch auf dem Bildschirm des Benutzers an.
+Beispiel:
+
+ edit ("Datei vom 17.4.")
+
+schreibt der Nutzer nun z.B.
+
+ run
+
+und betätigt RETURN, dann ergänzt der Monitor das Kommando:
+
+ run ("Datei vom 17.4.")
+
+Monitor-Kommandos sind einzeilige ELAN-Programme, die dem ELAN-Compiler zur
+Übersetzung und anschließender Ausführung zugeleitet werden. Darum können
+die Monitor-Kommandos auch von Programmen aus verwendet werden. Falsch ge-
+schriebene oder nicht vorhandene Kommandos werden vom ELAN-Compiler mit ent-
+sprechender Fehlermeldung abgewiesen. Oft benutzte Kommandos werden aus
+Effizienzgründen vom Monitor selbst interpretiert und ausgeführt. Durch die
+automatische Überleitung von Kommandos zum ELAN-Compiler ist es möglich
+
+a) einzeilige ELAN-Programme direkt in der Monitor-Ebene ausführen zu
+ lassen, d.h. ohne das Programm in eine Datei zu schreiben. Beispiel:
+
+ put (sin (0.5))
+
+b) mehrere Kommandos (ELAN-Anweisungen), durch ";" getrennt, auf einmal zu
+ schreiben. Beispiele:
+
+ edit ("datei"); lineform ("datei"); print ("datei")
+ INT VAR i; FOR i FROM 1 UPTO90 REP print ("x") ENDREP
+
+c) eine Erweiterung des Kommando-Vorrats jederzeit vorzunehmen, indem man
+ die gewünschte Prozedur (in einem PACKET "verpackt") 'insertiert'.
+
+Im folgenden werden die am häufigsten benutzten Kommandos aufgeführt.
+Genauere Informationen über die einzelnen Kommandos findet man in den
+entsprechenden Kapiteln des Benutzerhandbuchs.
+
+Informations-Kommandos
+
+ storage info Belegter externer Speicher
+ task info Zeigt die im System befindlichen Tasks
+ task status Zustände der im System befindlichen Tasks
+
+
+Verbindung zum Supervisor
+
+ end Task und die in ihr befindlichen Dateien
+ löschen
+ break Task abkoppeln
+ task password ("geheim") Paßwort einstellen
+
+
+Editor-Kommandos
+
+ edit ("datei") Datei editieren
+ edit ("datei1", "datei2") Parallel-Editor
+
+
+Compiler-Kommandos
+
+ run ("datei") Übersetzen und ausführen eines ELAN-Programms
+ run again Letztes übersetztes Programm nochmal aus-
+ führen
+ insert ("datei") Ãœbersetztes Programm eintragen
+
+
+Datei-Kommandos
+
+ copy ("datei", "duplikat") Datei kopieren
+ rename ("alt", "neu") Datei umbenennen
+ reorganize ("datei") Datei "reorganisieren"
+ fetch ("datei") Datei von Vater-Task holen
+ save ("datei") Datei zur Vater-Task schicken
+ erase ("datei") Datei in Vater-Task löschen
+ forget ("datei") Datei in Benutzer-Task löschen
+ list Dateien der Benutzer-Task anzeigen
+
+
+Archiv-Kommandos
+
+ archive ("name") Archiv mit einem Namen reservieren
+ release (archive) Archiv freigeben
+ clear (archive) Löscht ein Archiv
+ list (archive) Dateien des Archivs anzeigen
+ save all (archive) Archiviert alle Dateien einer Task
+ fetch all (archive) Holt alle Dateien eines Archivs in eine Task
+ save ("datei", archive) Datei archivieren
+ fetch ("datei", archive) Datei vom Archiv holen
+
+
+Textkosmetik und Drucker
+
+ lineform ("datei") Zeilenweises Formatieren
+ pageform ("datei") Seitenweises Formatieren
+ index ("datei") Stichwort- und Inhaltsverzeichnis
+ print ("datei.p") Drucken
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil3 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil3
new file mode 100644
index 0000000..eaf1ed6
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil3
@@ -0,0 +1,2097 @@
+ EUMEL-Benutzerhandbuch
+
+ TEIL 3: Editor
+
+Vorwort
+
+Der EUMEL-Editor ist ein Programm zur Bearbeitung von Texten. Er bietet
+vielfältige Möglichkeiten, um Autoren oder Programmierer bei dem Erstellen,
+Korrigieren und Gestalten von Manuskripten oder Programmen zu unterstützen.
+Die größte Hilfe beim Schreiben besteht (durch die Speicherfähigkeit von
+Computern) aus dem Zugriff auf einmal geschriebene Informationen. Im Gegen-
+satz zu einer Schreibmaschine können durch den EUMEL-Editor (beliebig oft)
+Einfügungen vorgenommen, Texte korrigiert, gelöscht und umgeordnet werden.
+Somit ist das Schreiben von Texten mittels des EUMEL-Systems besonders dann
+vorteilhaft und zeitsparend, wenn Texte häufig geändert werden oder wenn
+sie in einer besonders schönen Form gedruckt werden sollen (sofern ein ent-
+sprechender Drucker zur Verfügung steht). Weiterhin bietet der Editor Hilfen
+zum Schreiben an, wie z.B. automatischen Wortumbruch am Zeilenende, eine
+Einrückungsautomatik, "Lernen" von Texten u.a.m.. Zusätzlich kann der Editor
+in seinen Fähigkeiten erweitert und somit für spezielle Schreibarbeiten an-
+gepaßt werden. Bei der Entwicklung des Editors wurde besonderer Wert auf
+einfache Bedienung gelegt: innerhalb von wenigen Minuten kann schon ge-
+schrieben werden und auf dem Bildschirm sieht man direkt, was mit dem Text
+passiert. Das Schreiben und die Korrektur werden durch einige wenige, aber
+leistungsstarke Funktionstasten unterstützt.
+
+Anfänger sollten zumindest das erste Kapitel lesen, bevor mit dem Schreiben
+begonnen wird. Dort wird geschildert, wie auf einfache Weise Texte ge-
+schrieben und geändert werden können. Die beschriebenen Tätigkeiten sollte
+man an einem kleinen Probetext erst einmal ausprobieren. Lesen und an-
+schließendes Ausprobieren eines der hier beschriebenen Vorgänge beschleunigt
+stark das Erlernen der Funktionen des Editors.
+
+Weitere Fähigkeiten des Editors werden in den folgenden Kapiteln erläutert.
+Diese Kapitel sollte man lesen, wenn die ersten Texte geschrieben worden
+sind. Die dort erklärten Möglichkeiten des Editors kann man dann bei Bedarf
+nachlesen, erlernen und einsetzen. Im letzten Kapitel werden Programmierern
+Hinweise gegeben, wie sie die Benutzerschnittstelle des Editors an indivi-
+duelle Bedürfnisse anpassen können.
+
+Einige Gestaltungsmöglichkeiten für Texte kann man nicht auf dem Terminal
+"sehen", wie z.B. Proportionalschriften, Fettdruck usw.. Solche Leistungen
+können durch Anweisungen an die Textkosmetik-Programme und den EUMEL-Drucker
+angefordert werden. Diese Anweisungen müssen in den Text eingefügt werden.
+Dazu sollte das Kapitel über die Textkosmetik gelesen werden.
+
+is nämlich alles ohne Radiergummi-Abbildung !!!
+
+
+
+1. Einführung in die Benutzung des Editors
+
+In diesem Kapitel beschreiben wir das Tastenfeld eines EUMEL-Terminals, weil
+es hier einige Tasten gibt, die auf einer Schreibmaschine nicht vorhanden
+sind. Anschließend erklären wir, wie der Editor ein- und ausgeschaltet wird,
+wie Texte geschrieben und auf einfache Weise korrigiert werden können. Eine
+kurze Erklärung des Tabulators beendet die Einführung.
+
+
+
+Das Tastenfeld
+
+In diesem Abschnitt wird das Tastenfeld eines EUMEL-Terminals erklärt. Es
+wird erläutert, wo sich die Tasten befinden und wie man Umlaute schreibt.
+
+Das Tastenfeld eines EUMEL-Terminals entspricht weitgehend dem einer
+Schreibmaschine. Wir finden also die Buchstaben a-z und die Ziffern 0-9 auf
+Tasten. Mit der SHIFT-Taste und gleichzeitigem Drücken einer anderen Taste
+können die großen Buchstaben und eine Reihe von speziellen anderen Zeichen,
+die Sonderzeichen genannt werden, geschrieben werden. Die "Zwischenraum-
+taste" oder Leertaste erzeugt immer ein Leerzeichen.
+
+Nun gibt es in der Praxis zwei unterschiedliche Tastaturen. Zum einen
+existiert die EDV-Tastatur, die zum Schreiben von Programmen benutzt wird.
+Sie erkennt man daran, daß keine Umlaute (ä, ü, ö) und kein ß auf den Tasten
+eingraviert sind. Dafür gibt es Tasten für eckige und geschweifte Klammern.
+Sollen auf einer solchen Tastatur die Umlaute geschrieben werden, muß man
+sich eines Tricks bedienen: mit der Taste ESC und nachfolgendem Betätigen
+einer anderen Taste erhalten wir den entsprechenden Umlaut.
+Diese Tasten sind standardmäßig vorbelegt, können aber von Benutzern und in
+Anwenderprogrammen geändert werden.
+
+ ESC a bringt ä, ESC A bringt Ä
+ ESC u bringt ü, ESC U bringt Ü
+ ESC o bringt ö, ESC O bringt Ö und
+ ESC s bringt ß.
+
+In der Regel kann man die Umlaute auf dem Bildschirm eines solchen EDV-
+Terminals nicht sehen, sondern sie erscheinen als a, u, usw.. Beim Druck
+eines Textes werden sie aber richtig dargestellt.
+
+Die andere Tastatur entspricht in der Tastenbelegung weitgehend einer deut-
+schen Schreibmaschine und besitzt Tasten für die Umlaute und ß. Sollen vor-
+wiegend deutsche Texte geschrieben werden, empfiehlt es sich, solch ein
+Terminal zu verwenden.
+
+Neben diesen "einfachen" Tasten gibt es noch einige wenige Tasten, die zur
+Bedienung des Editors (aber auch anderer Programme) notwendig sind. Wo die
+Tasten auf Ihrem Gerät liegen, hängt von dem jeweiligen Gerätetyp ab. Die
+Wirkung der Tasten erklären wir in den anschließenden Abschnitten.
+Es kann sein, daß die Tasten nicht richtig beschriftet sind. Dann sollten Sie
+den Betreuer ihrer Installation bitten, diese zu beschriften. Zusätzlich zu
+den hier beschriebenen können sich noch weitere Tasten auf ihrem Terminal
+befinden, die aber keine besondere Bedeutung für den Editor haben.
+
+Taste Bedeutung
+-----------------------------------------------------------------------------
+SHIFT Umschalttaste.
+ Für Großbuchstaben statt Kleinbuchstaben und Sonderzeichen
+ statt Ziffern.
+
+RETURN Beginn einer neuen Zeile (Absatz).
+ Die RETURN-Taste ist oft mit einem geknicktem Pfeil nach
+ links gekennzeichnet. Im Kommandomodus (also bei "gib
+ kommando :") wird ein gegebenes Kommando ausgeführt.
+
+LINKS Tasten für die Positionierung.
+RECHTS
+OBEN
+UNTEN
+ Positionierung der Schreibmarke (Cursor) in die jeweilige
+ Richtung (auf den Tasten oft auch durch Pfeile dargestellt).
+
+HOP "Verstärkertaste": Wirkt als Vorschalttaste.
+
+RUBOUT Löschtaste.
+
+RUBIN Ein- bzw. Ausschalten des Einfügezustandes.
+
+TAB Tabulatortaste.
+
+MARK Ein- bzw. Ausschalten der Markierung.
+
+ESC Kommandotaste.
+
+Merke: Das Tastenfeld eines EUMEL-Terminals ist in der Regel wie das einer
+Schreibmaschine und kann ebenso bedient werden. Umlaute müssen bei EDV-
+Tastaturen mit Hilfe der Taste ESC geschrieben werden. Einige Spezialtasten
+werden benutzt, um die Textbearbeitung des Editors zu steuern.
+
+Weitere Kommandotasten:
+ SV Supervisor-Taste im Mehrbenutzer-Betrieb ("multi-user").
+ Diese Taste bewirkt den Aufruf des Supervisors und ist keine
+ spezielle Editor-Taste.
+ STOP Anhalten eines Programms.
+ Wird die Taste aus Versehen betätigt (erkennbar daran, daß
+ der Editor nicht "reagiert"), muß WEITER betätigt werden.
+ WEITER Programm soll weiterlaufen.
+
+
+
+Speicherung von Texten
+
+In diesem Abschnitt wird der Begriff "Datei" erklärt und erläutert, wie
+unterschiedliche Texte auseinandergehalten werden können.
+
+Das EUMEL-System speichert einmal geschriebene Texte, bis sie vom Benutzer
+gelöscht werden. In der Regel wird nicht nur ein (langer) Text oder ein Pro-
+grammtext geschrieben, sondern mehrere und unterschiedliche. Um diese aus-
+einanderhalten zu können, versehen wir sie jeweils mit einem Namen, der frei
+gewählt werden kann. Beispiele für Namen:
+
+ "Brief vom 1.8.83"
+ "1. Kapitel meines Buches"
+
+Eine Sammlung von Zeichen (also im Normalfall unsere geschriebenen Texte),
+die mit einem Namen versehen worden ist, nennt man eine 'Datei' ('file'). Der
+Editor erstellt also eine Datei, wenn wir einen Text schreiben. Eine Datei
+kann bis zu 4 000 Zeilen fassen, wobei eine Zeile bis zu 32 000 Zeichen lang
+sein darf.
+
+Mit Hilfe des (Datei-) Namens kann man den Text (immer) wieder ansprechen,
+solange, bis die Datei gelöscht wird. Bei der Bearbeitung einer Datei durch
+den Editor wirkt sich jede Änderung des Textes auf dem Bildschirm sofort bis
+in die gespeicherte Datei aus. Eine Datei kann durch Kommandos verarbeitet
+werden. Eine Auswahl (Vergl. dazu die Beschreibung des Monitors):
+
+edit (Datei bearbeiten), rename (Datei umbenennen), copy (Duplizieren der
+Datei), to archive (Archivieren), lineform bzw. autoform (Zeilen
+formatieren), pageform (Seiten formatieren), print (Drucken) usw.
+
+Merke: Ein Text wird im EUMEL-System in einer Datei gehalten. Eine Datei
+faßt bis zu 4000 Zeilen Text. Eine Datei kann über den Dateinamen ange-
+sprochen werden, der frei gewählt werden kann.
+
+
+
+Ein- und Ausschalten des Editors
+
+Hier beschreiben wir, wie der Editor ein- und ausgeschaltet wird und wie
+der Editor eine Datei einrichtet. Zusätzlich wird das Ausschalten des auto-
+matischen Wortumbruchs erklärt.
+
+Wenn auf dem Bildschirm die Aufforderung
+
+ gib kommando :
+
+erscheint, befindet man sich in der Monitor-Ebene. Durch
+
+ edit ("dateiname")
+
+kann der EUMEL-Editor eingeschaltet (programmtechnisch: "aufgerufen")
+werden. Ist die Datei noch nicht vorhanden, d.h. kein Text unter dem ange-
+gebenen Namen im System gespeichert, folgt eine Anfrage, ob eine neue Datei
+eingerichtet werden soll. Dies dient zur Kontrolle von Schreibfehlern, die
+besonders bei ähnlichen Dateinamen auftreten. Man kann dann das Einrichten
+der Datei ablehnen, den Dateinamen verbessern und das Kommando erneut geben.
+
+Der Editor zeigt jetzt in der obersten Zeile des Bildschirms die Titelzeile,
+die den Dateinamen und die Zeilennummer enthält, die gerade bearbeitet wird.
+Im Fall einer bereits beschriebenen Datei zeigt der Editor das zuletzt bear-
+beitete Textstück. Bei einer neuen Datei ist der Bildschirm unterhalb der
+Titelzeile leer. Dieser Teil dient als "Schreibfläche". Der Cursor, so nennt
+man die blinkende Schreibmarke, steht dann direkt unter der Titelzeile. Er
+zeigt immer die aktuelle Schreibposition an. Jetzt kann sofort mit dem
+Schreiben begonnen werden, ganz wie mit einer normalen Schreibmaschine.
+
+Beenden der Schreibarbeit und Ausschalten des Editors erfolgt durch Drücken
+der beiden Tasten
+
+ ESC q
+
+nacheinander. Man befindet sich wieder in der alten Kommando-Ebene.
+
+Es ist aber auch möglich, während der Schreibarbeit (also bei eingeschalte-
+tem Editor) durch zweimaliges Drücken von ESC in die (Editor) Kommando-
+Ebene zu gelangen. Nach Abarbeitung des Kommandos gelangt man wieder in den
+normalen Schreibzustand.
+
+Der Editor ist auf das Schreiben von "normalen" Texten eingestellt. Bei
+"normalen" Texten soll ein Wort, welches über das Ende einer Zeile gehen
+würde, automatisch in die nächste Zeile gebracht werden. Dies wird
+"Wortumbruch" genannt.
+
+Ist kein Wortumbruch erwünscht, so gibt man das Kommando
+
+ word wrap (false)
+
+In diesem Fall schreibt der Editor bis zum Zeilenende und springt dann auto-
+matisch (u.U. mitten im Wort) auf die nächste Zeile. Der Wortumbruch kann
+durch
+
+ word wrap (true)
+
+wieder eingeschaltet werden.
+
+Merke: Der Editor wird durch das Kommando 'edit ("name")' aufgerufen und
+und wird durch ESC q wieder verlassen. Der Cursor zeigt die aktuelle
+Schreibposition an. Der Editor ist auf automatischen Wortumbruch eingestellt.
+
+
+
+Schreiben eines Textes
+
+In diesem Abschnitt wird erklärt, wie ein Text geschrieben wird und was es
+mit Absätzen auf sich hat.
+
+Nach dieser etwas langen Vorrede können wir endlich losschreiben. Wird ein
+Zeichen geschrieben, rückt der Cursor automatisch nach rechts auf die
+nächste Schreibstelle. Durch den automatischen Wortumbruch werden ange-
+fangene Worte, die über ein Zeilenende hinausgehen würden, ohne Silbentren-
+nung in die nächste Zeile gebracht.
+Nehmen Sie bitte keine Silbentrennung "per Hand" vor (wie in dieser An-
+leitung).Eingebrachte Trennstriche gelten als Bindestrich und bleiben somit
+auch bei Umformatierungen erhalten, was unerwünscht ist. Für diese mühevolle
+Aufgabe gibt es in der Textkosmetik ein Programm!
+
+Die RETURN-Taste (bei einer Schreibmaschine bedeutet sie "Wagenrücklauf")
+braucht also nur noch betätigt zu werden, wenn eine Zeile vorzeitig beendet
+werden soll: also bei einem Absatz oder einer Leerzeile. Der Cursor wird da-
+bei an den Anfang der nächsten Zeile positioniert. Gleichzeitig erscheint in
+der vorherigen Zeile am rechten Rand des Bildschirms eine Markierung, die
+anzeigt, daß hier ein Absatz gemacht wurde.
+
+Diese Absatzkennzeichnung ist wichtig: Sie bedeutet u.a. eine "Grenze" für
+die Textkosmetik-Programme beim (optimalen) Auffüllen von Zeilen. Für den
+Drucker bedeutet ein Absatz, keinen rechten Randausgleich (druckertechnisch:
+"Blocksatz") in dieser Zeile vorzunehmen.
+Die Absatzkennzeichnung besteht aus einem Leerzeichen in der Datei ("blank";
+im Unterschied zur Schreibmaschine ist das Leerzeichen in der EDV auch ein
+Zeichen und wird gespeichert). Absatzkennzeichen können gelöscht oder auch
+hinzugefügt werden (wie das gemacht wird, erfahren Sie in den nächsten Ab-
+schnitten). Ist der Wortumbruch ausgeschaltet, erscheint keine Absatzkenn-
+zeichnung beim Betätigen der RETURN-Taste.
+
+Darum ist das Betätigen der RETURN-Taste bei Tabellenzeilen und Programm-
+texten besonders wichtig, denn hier soll ja jede Zeile separat bleiben.
+
+Ein Bildschirm faßt (neben der Titelzeile) üblicherweise 23 Zeilen, die mit
+Text beschrieben werden können. Ist die letzte Zeile voll und muß eine neue
+Zeile begonnen werden, "rutscht" der Bildschirminhalt automatisch um eine
+Zeile nach oben. Damit ist Platz für eine Leerzeile, die nun ebenfalls be-
+schrieben werden kann usw.. Keine Angst: die so verschwundenen Zeilen sind
+natürlich nicht "weg". Da ein Bildschirm immer nur eine beschränkte Anzahl
+von Zeilen hat, kann der Editor nur einen Ausschnitt aus der Datei zeigen.
+In unserem Fall, wo wir zunächst nur am Ende der Datei schreiben, werden
+also immer die letzten Zeilen der Datei angezeigt.
+
+Merke: Ist der Wortumbruch eingeschaltet, wird ein angefangenes Wort, das
+über das Zeilenende gehen würden, an den Anfang der neuen Zeile gebracht.
+Die RETURN-Taste wird nur bei Absätzen, Tabellenzeilen oder Leerzeilen be-
+tätigt. In diesem Fall erscheint eine Absatzkennzeichnung am rechten Rand
+des Bildschirms. Ist der Bildschirm vollgeschrieben, werden beim fort-
+laufenden Schreiben alle Zeilen um eine Zeile nach oben gerückt.
+
+
+
+Einrückungen
+
+Hier wird die Einrückungsautomatik erklärt.
+
+Soll ein Text eingerückt werden (wie in den obigen "Merke"-Zeilen) oder bei
+Aufzählungen, so wird die in der ersten Zeile geschriebene Einrückung auto-
+matisch in den folgenden Zeilen beibehalten, bis sie durch die Posi-
+tionierungstasten wieder aufgehoben wird. Es gibt also kein Einrückkommando.
+Wie der rechte Rand (also die Zeilenbreite) eingestellt wird, erklären wir
+später.
+Dies kann für die gesamte Datei (und somit für den gesamten Text) durch ein
+ein Kommando erfolgen, mit welchem man den Editor auf diese Zeilenbreite
+einstellt. Um den rechten Rand nur für einige Zeilen zu verändern (wie z.B.
+bei unseren "Merke"-Zeilen) kann ein 'limit'-Kommando der Textkosmetik
+verwandt werden.
+
+Merke: Einrückungen werden automatisch beibehalten.
+
+
+
+Einfaches Positionieren und das Editor-Fenster
+
+Um Korrekturen (Überschreiben, Löschen oder Einfügen) vorzunehmen, muß der
+Cursor, der die aktuelle Schreibposition anzeigt, bewegt werden können. Bei
+längeren Texten ist es möglich, den Cursor auch auf Zeilen zu positionieren,
+die sich (noch nicht) auf dem Bildschirm befinden. Somit zeigt der Editor
+nicht nur immer das Ende einer Datei, sondern einen beliebigen Ausschnitt,
+der auf dem Bildschirm im sogenannten Fenster sichtbar ist.
+
+Ist eine Korrektur notwendig, muß der Cursor (blinkende Schreibmarke) auf die
+Stelle positioniert werden, an der die Korrektur vorgenommen werden soll.
+Dazu verwenden wir die Positionierungstasten LINKS, RECHTS, OBEN und UNTEN.
+LINKS und RECHTS bewegen den Cursor innerhalb einer Zeile. Stößt man mit
+RECHTS an das Ende einer Zeile, wird der Cursor an den Anfang der nachfol-
+genden Zeile bewegt. (Positionierungen jenseits des linken Randes sind nicht
+möglich).
+
+Ein Zeilenwechsel kann einfacher mit den Tasten OBEN und UNTEN vorgenommen
+werden. Die Taste OBEN bewegt den Cursor eine Zeile nach oben, die Taste
+UNTEN entsprechend eine Zeile tiefer.
+
+Was passiert nun, wenn der untere oder der obere Rand des Bildschirms er-
+reicht wird und es wird darüber hinaus positioniert? In diesem Fall wird der
+Text zeilenweise nach oben oder nach unten verschoben und es erscheint die
+gewünschte Zeile, wobei andere am anderen Rand "verschwinden". Wir sehen
+also, daß wir mit den Positionierungstasten den Bildschirm als Fenster über
+die Datei hinweggleiten lassen können (Fachausdrücke: "roll up" oder "roll
+down"). Den Text selbst können wir uns auf einem langen Band geschrieben
+vorstellen. Die Zeilennummer, in der der Cursor steht, wird stets in der
+Titelzeile angezeigt.
+
+Innerhalb einer Zeile ist es etwas anders: Positionieren wir bei einer Zeile,
+die breiter als der Bildschirm ist, nach rechts, wird das Fenster nur für
+diese Zeile verschoben (Fachausdruck: "scrolling").
+
+Merke: Mit Hilfe der vier Positionierungstasten kann man den Cursor auf dem
+Bildschirm bewegen. Außerdem ist es möglich, das Fenster mittels der
+Positionierungstasten über den Text zu bewegen.
+
+
+
+Einfache Korrekturen: Zeichen überschreiben, löschen und einfügen
+
+In diesem Abschnitt wird erklärt, wie einfache Korrekturen durch Über-
+schreiben von Zeichen, Löschen von Zeichen und Einfügen von Zeichen vorge-
+nommen werden können.
+
+Es können Korrekturen gleich beim Schreiben vorgenommen werden, indem die
+zuletzt geschriebenen Zeichen mit der RUBOUT-Taste gelöscht werden. Häufig
+merkt man aber Schreibfehler erst etwas später, so daß man diese Fehler nicht
+so leicht korrigieren kann. Für solche Zwecke muß man den Cursor an die Text-
+stelle bewegen, an dem korrigiert werden soll. Wie man das macht, haben wir
+im letzten Abschnitt geschildert.
+
+Die einfachste Möglichkeit der Korrektur ist das Überschreiben. Soll z.B. ein
+Zeichen durch ein anderes ersetzt werden, so positioniert man den Cursor
+genau über dieses und tippt das richtige Zeichen ein.Das kann natürlich auch
+mit mehreren Zeichen nacheinander erfolgen.
+
+Will man ein Zeichen löschen, so positioniert man auch hier den Cursor auf
+dieses Zeichen und betätigt die Taste RUBOUT. Das Zeichen verschwindet und
+die Restzeile rückt heran. Sollen mehrere Zeichen gelöscht werden, muß die
+RUBOUT-Taste entsprechend oft gedrückt werden.
+
+Steht der Cursor hinter dem letzten Zeichen der Zeile, wird immer das letzte
+Zeichen der Zeile gelöscht. Man kann also mit dieser Eigenschaft eine Zeile
+"von hinten wegradieren".
+
+Fehlende Zeichen kann man genauso einfach einfügen. Man bringt den Cursor
+auf das Zeichen, vor das eingefügt werden soll. Dann drückt man die Taste
+RUBIN. Der Editor gelangt in den Einfüge-Zustand, was in der Titelzeile durch
+RUBIN angezeigt wird. Er fügt alle Zeichen ein, die jetzt getippt werden (an-
+statt zu überschreiben). Der Teil der Zeile rechts vom Cursor rückt jeweils
+um entsprechend viele Stellen nach rechts.
+
+Wichtig ist, daß im RUBIN-Zustand der Editor genauso funktioniert wie im
+Normal-Zustand (natürlich mit der Ausnahme, daß eingefügt statt überschrieben
+wird).
+
+Ein neuerliches Betätigen der RUBIN-Taste beendet den Einfüge-Zustand. Die
+RUBIN-Taste wirkt also wie ein Schalter, der den Einfüge-Zustand ein- und
+ausschaltet. Allerdings kann man nur so viele Zeichen in eine Zeile einfügen,
+bis das letzte Wort der Zeile an das Zeilenende stößt. Das angefangene Wort
+wird am Anfang der folgenden Zeile eingefügt, sofern dort noch Platz ist und
+es nicht offensichtlich ein Absatzende kennzeichnet. Andernfalls wird auto-
+matisch eine neue Zeile für das angefangene Wort eingefügt.
+
+Im eingeschalteten RUBIN-Zustand können keine Zeichen verloren gehen. Viele
+Benutzer lassen darum den RUBIN-Zustand immer eingeschaltet, um sich vor dem
+unbeabsichtigten Überschreiben von Texten zu schützen. Es wird korrigiert,
+indem man die Verbesserung einfügt und den alten Text löscht.
+
+Merke: Mit Hilfe der Positionierungstasten LINKS, RECHTS, OBEN und UNTEN
+kann eine Stelle in der Datei ausgewählt werden, an der eine Korrektur vor-
+genommen werden soll. Die einfachste Korrektur ist das Ãœberschreiben von
+fehlerhaften Zeichen. Zeichen löschen erfolgt mit der Taste RUBOUT. Mit
+RUBIN kann der Einfüge-Zustand ein- und ausgeschaltet werden. Im Einfüge-Zu-
+stand wird nicht überschrieben, sondern es wird vor der Cursor-Position das
+getippte Zeichen eingefügt.
+
+
+
+Springen, Zeilen einfügen/löschen mittels HOP-Taste
+
+Bewegungen des Cursors sind mit den Positionierungstasten bei größeren "Ab-
+ständen" etwas mühsam, ebenso bei umfangreichen Löschungen und Einfügungen.
+Die "Verstärkertaste" HOP ermöglicht es, diese Operationen auf einfache
+Weise zu beschleunigen. Mit der HOP-Taste kann man das Fenster über der
+Datei nicht nur zeilenweise, sondern auch um jeweils eine Fensterlänge ver-
+schieben. Das nennt man Blättern.
+
+Wird die HOP-Taste vor einer anderen der schon erklärten Funktionstasten
+gedrückt, verstärkt sie deren Wirkung. Die HOP-Taste ist eine "Präfix"-Taste:
+sie wird vor (und nicht gleichzeitig, wie z.B. die Umschalttaste SHIFT) einer
+anderen Taste gedrückt. Zuerst das springende Positionieren:
+Weitere wichtige Anwendungen der HOP-Taste beschreiben wir in den nächsten
+Abschnitten.
+
+HOP RECHTS Sprung an das rechte Zeilenende.
+ Falls die Zeile länger als das Fenster breit ist, wird seitlich
+ geblättert.
+
+HOP LINKS Sprung an den Zeilenanfang (ggf. seitlich blätternd).
+
+HOP OBEN Sprung auf die erste Zeile des Bildschirms.
+ Nochmaliges Betätigen dieser Tastenkombination positioniert den
+ Cursor (und damit das Fenster in der Datei) um ein Fenster
+ zurück.
+
+HOP UNTEN Sprung auf die letzte Zeile des Bildschirms.
+ Das Blättern erfolgt analog HOP OBEN.
+
+HOP RETURN Macht die aktuelle Zeile zur ersten des Fensters.
+ Die Zeile, in der sich der Cursor befindet, wird die erste
+ Zeile des Fensters.
+
+Die HOP-Taste in Verbindung mit RUBIN und RUBOUT wird zum "verstärkten"
+Löschen und Einfügen verwandt:
+
+HOP RUBIN Einfügen von Textpassagen:
+ Ab der aktuellen Position des Cursors verschwindet der rest-
+ liche Text. Es kann wie bei der anfänglichen Texteingabe fort-
+ gefahren werden. Die Anzeige REST in der Titelzeile erinnert
+ daran, daß noch ein Resttext existiert. Dieser erscheint nach
+ einem neuerlichen Betätigen der beiden Tasten HOP RUBIN wieder
+ auf dem Bildschirm (die Anzeige REST verschwindet dann wieder).
+
+HOP RUBOUT Löscht Zeile ab Cursor-Position bis Zeilenende:
+ Löscht die Zeile rechts vom Cursor. Steht der Cursor am Zeilen-
+ anfang, wird dementsprechend die ganze Zeile gelöscht und die
+ Lücke durch Nachrücken der Folgezeilen geschlossen.
+
+Merke: Die HOP-Taste dient in Verbindung mit den Positionierungstasten zum
+"Springen" oder zum "Blättern" innerhalb der Datei. Vor der Taste RUBOUT ge-
+drückt, bewirkt sie die Löschung von Zeilen. Mit HOP RUBIN kann man längere
+Texte in einen Text einfügen.
+
+
+
+Der Tabulator
+
+Eine weitere wichtige Positionierungshilfe ist die TAB-Taste. Sie wird zum
+Schreiben von Tabellen benötigt. Wie bei einer Schreibmaschine können Ta-
+bulatormarken gesetzt bzw. gelöscht werden.
+
+Der Tabulator hat eine wichtige Funktion für das schnelle Positionieren, auch
+wenn keine Marken eingestellt wurden. Voreingestellte Tabulatormarken sind
+nämlich der Textanfang einer Zeile (Einrückung; falls vorhanden) und die
+Stelle direkt hinter dem letzten Zeichen der Zeile. Betätigt man also die
+Taste TAB, dann springt der Cursor an die nächste dieser voreingestellten
+Positionen. So kann man schnell an den Anfang oder das Ende einer Zeile mit
+dem Cursor gelangen (und z.B. am Zeilenende Zeichen "von hinten" löschen
+oder dort weiterschreiben).
+
+Nun zum Setzen des Tabulators: Er wird gesetzt, indem man den Cursor auf die
+Zeilenposition bringt, in der die Marke plaziert werden soll. Hier betätigt
+man nun HOP TAB. Die Tabulatorsetzung kann man in der Titelzeile an einer
+Markierung ("Dach"-Zeichen) sehen (falls sie im Fensterbereich ist und die
+aktuelle Zeile nicht seitlich verschoben ist). Betätigt man nun an irgend-
+einer Position innerhalb einer Zeile die TAB-Taste, wird der Cursor auf die
+Position der nächsten Tabulatormarkierung (die sich rechts vom Cursor be-
+findet) oder eine der voreingestellten Positionen bewegt.
+
+Gesetzte Tabulatormarken können gelöscht werden, indem man mit der TAB-
+Taste die Position der Tabulatormarke einstellt und dann HOP TAB betätigt.
+Die Marke ist dann gelöscht (das Dach verschwindet in der Titelzeile).
+
+Tabulatormarkierungen hinterlassen keine Spuren in der Datei, sondern dienen
+nur als Positionierungshilfen.
+
+Werden Tabulatormarken gesetzt (HOP TAB), gelten die voreingestellten Tabu-
+latormarken (Anfang und Ende einer Zeile) nicht mehr. Dies ist z.B. bei dem
+Schreiben von Tabellen notwendig. Andererseits möchte man beim Schreiben von
+"normalen" Text wieder die voreingestellten Tabulatormarken bedienen können.
+Mit den Tasten
+
+ ESC TAB
+
+kann man die gesetzten Tabulatormarken (erkenntlich an dem "Dach"-Zeichen in
+der Kopfzeile) verschwinden lassen. Dann gelten wieder die voreingestellten
+Marken. Erneutes ESC TAB stellt die gesetzten Tabulatormarken wieder her
+usw.
+
+Merke: Das Einstellen und Löschen von Tabulatormarken erfolgt mit HOP TAB;
+das Positionieren auf diese mit TAB. Voreingestellte Tabulatormarken sind
+Zeilenanfang und -ende. ESC TAB wirkt wie ein Umschalter zwischen voreinge-
+stellten und gesetzten Tabulatormarken.
+
+
+
+2. Beschreibung weiterer Funktionen
+
+In diesem Kapitel werden weitere Funktionen des Editors beschrieben, die bei
+dem Erstellen von Texten und Korrekturen sinnvoll einsetzbar sind. Die
+Kenntnis der hier beschriebenen Funktionen sind für erste Arbeiten nicht
+notwendig (dafür reicht das erste Kapitel). Man sollte aber dieses Kapitel
+zumindest überfliegen, damit bei Bedarf die zusätzlichen Möglichkeiten des
+Editors erlernt und angewandt werden können.
+
+
+
+Zeilen aufbrechen und Rückumbruch
+
+Um grössere Textpassagen einzufügen, betätigt man HOP RUBIN nacheinander.
+Diese Tastenfolge kann benutzt werden, um eine Zeile zu spalten (Zeile auf-
+zubrechen). HOP RUBOUT am Ende einer Zeile macht einen Rückumbruch.
+
+Wie bereits beschrieben, bewirkt HOP RUBIN in einer Zeile, daß der Zeilenrest
+rechts vom Cursor und alle Zeilen unterhalb der aktuellen Zeile scheinbar
+verschwinden. REST in der Titelzeile erinnert daran, daß ein Teil der Datei
+nicht sichtbar ist.
+
+Wird unmittelbar nach HOP RUBIN wiederum HOP RUBIN betätigt, wird der vor-
+herige Zeilenrest als eigenständige Zeile dargestellt. Es ist damit eine Auf-
+spaltung einer Zeile in zwei Zeilen vollzogen.
+
+Der umgekehrte Fall, nämlich zwei Zeilen zu einer zusammenzufassen (sog.
+Rückumbruch), ist durch HOP RUBOUT hinter dem letzten Zeichen einer Zeile
+möglich. (Hinter das letzte Zeichen einer Zeile kann einfach mit dem
+Tabulator positioniert werden).
+
+Das Aufbrechen einer Zeile und der Rückumbruch zusammen angewandt stellen
+also den ursprünglichen Zustand wieder her. Beispiel: Mit HOP RUBIN bricht
+man eine Zeile auf (der Rest der Zeile und nachfolgende Zeilen verschwinden
+vom Bildschirm). Erneutes HOP RUBIN stellt den rechten Zeilenteil auf der
+nächsten Zeile und die nachfolgenden Zeilen auf dem Bildschirm wieder dar. Da
+der Cursor sich noch immer am rechten Rand der aufgebrochenen Zeile befindet,
+kann man mit HOP RUBOUT den ursprünglichen rechten Zeilenteil wieder re-
+kombinieren.
+
+Merke: Zweimaliges HOP RUBIN spaltet eine Zeile auf; HOP RUBOUT hinter dem
+Ende einer Zeile fügt die nachfolgende Zeile an die aktuelle an (Rück-
+umbruch).
+
+
+
+Zahlentabellen schreiben: Dezimaltabulator
+
+Beim Schreiben von Zahlentabellen sollen die Zahlen oft rechtsbündig im Text
+erscheinen. Dazu bietet der Editor den Dezimaltabulator an.
+
+Für jede Zahlenkolonne wird die gewünschte Position der Einerstelle (also der
+letzten Stelle) mit Hilfe eines Tabulators eingestellt. Mit TAB wird der
+Cursor zur jeweils nächsten Tabulatormarke vorgerückt. Werden nun Ziffern
+geschrieben, so schreibt man nicht - wie gewohnt - nach rechts, sondern die
+Ziffern werden nach links eingerückt. Etwas genauer: Beim Drücken einer
+Zifferntaste wird, solange links vor der Zahl noch ein Blank, eine Zahl, "+",
+"-" oder ein Punkt sichtbar ist, diese gelöscht und die hierdurch neu ent-
+standene Ziffernfolge rechtsbündig an der Tabulatorposition geschrieben.
+Zahlenkolonnen können so leicht und rechtsbündig geschrieben werden.
+Wird eine Proportionalschrift (Schrift, bei der die Zeichen unterschiedliche
+Breiten haben) verwandt, sollte man zwischen den einzelnen Zahlenkolonnen
+mindestens zwei Leerzeichen schreiben. Andernfalls bekommt man - auf Grund
+der unterschiedlicher Zeichenbreiten - keine rechtsbündigen Kolonnen ge-
+druckt.
+
+ 12 12345,78
+ 1 0,23
+ 12345 1234,00
+
+Merke: Ziffern werden bei Einsatz des Tabulators automatisch rechtsbündig ab
+der Tabulatormarke geschrieben.
+
+Es gibt somit vier nützliche Automatiken: neben dem automatischen Dezimal-
+tabulator der Wortumbruch, die Einrückautomatik und die Zeileneinfügeauto-
+matik beim einfügenden Schreiben.
+
+
+
+Den Editor lernen lassen
+
+Beliebige Folgen von Tastenbetätigungen können gelernt und Tasten zugeordnet
+werden. Das ist sinnvoll, wenn wiederholt immer die gleichen Tastenbe-
+tätigungen ausgeführt werden müssen, wie z.B. in Tabellenzeilen etwas ein-
+fügen oder wenn des öfteren gleiche Texte geschrieben werden müssen, wie
+z.B. ein Absender, Grußformeln usw.
+
+Der Lernmodus wird durch Betätigen der Tasten ESC HOP eingeschaltet (es
+erscheint LEARN als Kontrolle in der Titelzeile). Alle Tastenanschläge (auch
+Tastenanschläge wie RETURN: man kann also auch mehrere Zeilen lernen lassen)
+werden jetzt gelernt bis zum expliziten Ausschalten des Lernmodus.
+
+Das Beenden oder Ausschalten des Lernmodus erfolgt durch Drücken der drei
+Tasten ESC HOP 'taste'. Dabei wird die gelernte Tastenanschlagsfolge, auch
+Lernsequenz genannt, der Taste 'taste' zugeordnet.
+
+Durch späteres Betätigen der Tastenfolge ESC 'taste' kann der gelernte Text
+an jeder Stelle der Datei geschrieben werden. Beispiel: Ein "Schreiberling"
+hat jeden Tag 27 mal die Worte 'Hochschulrechenzentrum der Universität
+Bielefeld' zu tippen. Er läßt diese Worte den Editor lernen mit
+
+ ESC HOP Hochschulrechenzentrum der Universität Bielefeld
+ ESC HOP b
+
+Die Worte liegen jetzt auf der Taste 'b'. Wird 'b' gedrückt, erscheint ein
+'b' auf dem Bildschirm. Mit ESC 'b' erscheinen die obigen Worte. ESC ist
+also notwendig, um das normale 'b' von der Lernsequenz zu unterscheiden.
+
+Bei einigen Terminaltypen gibt es Tasten, die vom EUMEL-System nicht benutzt
+werden. Bei diesen kann man ESC beim Aufruf der Lernsequenz weglassen.
+
+Welche Tasten dürfen zum Lernen belegt werden? Alle Tasten, außer
+
+- vom System benutzte Tasten, wie SV, CTRL;
+- vom Editor (je nach Anwendung) vorbelegte Tasten, wie die Tasten q oder
+ ESC und HOP;
+- durch Programmierung (siehe dieses Kapitel) fest belegte Tasten.
+
+Praktische Tips: Man sollte die Tastatur nicht mit Lernsequenzen überlasten,
+weil man sich viele Tasten nicht merken kann. Besser ist es, einige wenige
+Tasten fest zu belegen und andere für momentane Aufgaben einzusetzen.
+
+Der Einsatz von Lernsequenzen ist besonders sinnvoll zum Schreiben von An-
+weisungen für die Textkosmetik. Anweisungen wie z.B. 'unterstreichen ein-
+schalten', Schrifttyp-Anweisung usw. werden zweckmäßigerweise auf Tasten
+gelegt.
+
+Hat man sich einmal beim Lernen verschrieben, so ist das nicht weiter
+schlimm: es kann ohne Bedenken korrigiert werden (z.B. mit der Taste RUBOUT).
+Solche Tastenanschläge werden dann allerdings auch gelernt, was man aber
+beim Einsetzen der Lernsequenz kaum sieht.
+
+Merke: Tastenanschläge werden mit ESC HOP gelernt und mit ESC HOP 'taste'
+auf eine Taste gelegt. Mit ESC 'taste' kann die Lernsequenz jederzeit abge-
+rufen werden.
+
+
+
+Mehrere Zeilen auf einmal verarbeiten: Markieren
+
+Oft ergibt sich die Notwendigkeit, mehrere Zeilen oder ganze Textpassagen zu
+löschen oder zu verschieben. Hierbei hilft die Taste MARK, mit der man Texte
+markieren (also kennzeichnen) kann. Die so markierten Texte können dann auf
+verschiedene Weisen als Ganzes verarbeitet werden.
+
+Durch Drücken der Taste MARK wird die Markierung eingeschaltet und - bei
+erneuter Betätigung - wieder ausgeschaltet. Der Anfang der Markierung wird
+"festgehalten" und man kann nun das Markierende durch die Positionierungs-
+tasten und die HOP-Taste in Richtung auf das Dateiende verschieben, wobei
+die dazwischen liegenden Zeichen markiert (in der Regel "video-invertiert"
+dargestellt) werden. Ein so markierter Text kann mit ESC RUBOUT gelöscht
+werden. Markieren und löschen mit ESC RUBOUT ist eine bequeme und sichere
+Löschmethode, da man genau sieht, was gelöscht wird.
+
+Der gelöschte Abschnitt ist aber nicht vollständig gelöscht, sondern er kann
+an anderer (oder an der gleichen) Stelle im Text durch ESC RUBIN wieder ein-
+efügt werden. Dies gilt aber nur für den zuletzt gelöschten Text. Auf diese
+Art kann ein Textabschnitt beliebiger Länge an eine andere Stelle des Textes
+sicher, schnell und bequem verschoben werden. Zusätzlich ist das nachträg-
+liche Korrigieren von fehlerhaften Löschungen leicht möglich, weil der Text
+wieder mit ESC RUBIN leicht reproduziert werden kann.
+
+Mit eingeschalteter Markierung kann auch geschrieben werden. Das markierende
+Schreiben ist eine besonders vorsichtige Art der Texterstellung, denn der
+Texteinschub bleibt erst durch Ausschalten der Markierung (MARK) wirklich
+bestehen. Er kann wieder gelöscht werden (ESC RUBOUT) und an eine andere
+Stelle gebracht werden (ESC RUBIN). Beim markierenden Schreiben wirkt
+RUBOUT immer auf das zuletzt geschriebene Zeichen.
+
+Die Markierung kann auch dazu verwendet werden, auf markierte Textabschnitte
+eigene Benutzerprogramme anzuwenden.
+
+Merke: Die Markierung schaltet man durch die Taste MARK ein und aus. Ein
+markierter Abschnitt kann gelöscht werden (ESC RUBOUT) und an einer anderen
+Stelle wieder eingefügt werden (ESC RUBIN). Mit eingeschalteter Markierung
+kann auch geschrieben werden. Die Markierung dient ebenfalls als Parameter
+für Textverarbeitungsprogramme.
+
+
+
+Zwei einfache Kommandos
+
+Einige Operationen kann man nur mühselig mit den bis jetzt beschriebenen
+Tasten durchführen. Z.B. ist es sehr zeitaufwendig, eine bestimmte Text-
+stelle zu finden. Andere Operationen sind mit den im vorigen Kapitel be-
+schriebenen Tasten überhaupt nicht möglich, wie etwa die Zeilenbreite ein-
+zustellen oder Programme aufzurufen, die die zu editierende Datei ver-
+arbeiten. Solche Operationen werden durch Kommandos ermöglicht, die man vom
+Editor aus geben kann.
+
+Durch zweimaliges Betätigen von ESC erfolgt die Aufforderung
+
+ gib kommando :
+
+Es erscheint auf dem Bildschirm eine Kommandozeile, in der der Benutzer
+Kommandos (d.h. ELAN-Programme) schreiben kann. Durch Betätigen der Taste
+RETURN wird das Kommando ausgeführt. Beispiel:
+
+ ESC ESC (* es erscheint 'gib kommando :' *)
+ "diese Zeichen"
+ RETURN
+
+Durch die Angabe eines TEXTes in Anführungstrichen wird nach dem einge-
+schlossenen TEXT 'diese Zeichen' ab der aktuellen Cursor-Position gesucht.
+Wird 'diese Zeichen' gefunden, bleibt der Cursor auf dem gesuchten Text
+stehen. Andernfalls steht der Cursor hinter dem Ende der letzten Zeile der
+Datei. Weiteres Beispiel:
+
+ ESC ESC
+ 127
+ RETURN
+
+Durch dieses Kommando wird auf die 127. Zeile positioniert.
+
+Diese beiden häufig benötigten Kommandos haben eine Sonderstellung und
+werden speziell behandelt, weil sie nicht der allgemeinen ELAN-Syntax ent-
+sprechen. Darum dürfen sie auch nicht in Verbindung mit anderen Kommandos
+verwendet werden (siehe nächsten Abschnitt). Alle anderen Kommandos, die wir
+in den nächsten Abschnitten beschreiben, entsprechen der ELAN-Syntax und
+sind somit allgemeine Kommandos.
+
+Merke: Kommandos nach man nach zweimaligen Betätigen der ESC-Taste schreiben.
+Mit RETURN wird die Ausführung des Kommandos ausgelöst. Durch Angabe eines
+TEXTes wird ab der aktuellen Cursor-Position nach diesem TEXT gesucht. Durch
+die Angabe einer ganzen Zahl (INT) wird auf die entsprechende Zeilennummer
+in der Datei positioniert.
+
+
+
+Beliebige Kommandos
+
+Beliebige Kommandos (siehe Monitor-Beschreibung) und ELAN-Programme sind
+zulässig.
+
+Die Kommandozeile kann wie eine "normale" Textzeile editiert werden (Posi-
+tionieren, Überschreiben, Einfügen, Löschen und Markieren). Erzeugt ein
+Programm eine Ausgabe oder rufen fehlerhafte Kommandos Fehlermeldungen
+hervor, werden diese in der ersten Zeile des Bildschirms angezeigt. Danach
+ist man wieder im Editor und kann wie gewohnt arbeiten.
+
+Die oben beschriebenen zwei Spezial-Kommandos kann man nicht mit anderen
+Kommandos zusammen verbinden (mit ';'). Deshalb gibt es für sie auch eine
+ELAN-Form, die es erlaubt, sie mit anderen Kommandos zusammen zu verwenden:
+
+a) TEXT suchen ab der aktuellen Cursor-Position (D ist eine Abkürzung für
+ 'DOWN'):
+
+ "diese Zeichen" (* Spezial-Version *)
+ D "diese Zeichen" (* Allgemeine Version *)
+
+b) Auf eine Zeile Positionieren (T ist eine Abkürzung für TO LINE):
+
+ 127 (* Spezial-Version *)
+ T 127 (* Allgemeine Version *)
+
+Es können mehrere Kommandos in der Kommandozeile angegeben werden. Die ein-
+zelnen Kommandos müssen in diesem Fall mit ';' voneinander getrennt werden.
+Beispiel:
+
+ ESC ESC
+ T 1; D "noch Zeichen" RETURN
+
+Diese zwei Kommandos werden nacheinander ausgeführt. Zuerst wird auf die
+erste Zeile positioniert und dann (von der ersten Zeile) nach 'noch Zeichen'
+gesucht. Damit ist es möglich, die Datei nicht nur von der aktuellen Zeile zu
+durchsuchen, sondern die gesamte Datei. Soll nicht in Richtung auf das Datei-
+ende, sondern in Richtung auf den Dateianfang (also nach "oben") gesucht
+werden, kann man das U-Kommando (Abkürzung für UP) verwenden:
+
+ ESC ESC
+ U "noch'n Text" RETURN
+
+Ein weiteres Kommando ist das C-Kommando (Abkürzung für 'CHANGE'), mit
+welchem man einen TEXT sucht und diesen dann ersetzen kann. Beispiel:
+
+ ESC ESC
+ "alte Zeichen" C "neue Zeichen" RETURN
+
+Es wird ab der aktuellen Cursor-Position nach 'alte Zeichen' gesucht. Wird
+der TEXT gefunden, wird er durch 'neue Zeichen' ersetzt. Der Cursor befindet
+sich in diesem Fall nach dem ersetzten TEXT. Wird 'alte Zeichen' dagegen
+nicht in der Datei gefunden, befindet sich der Cursor (wie beim erfolglosen
+Suchen mit D) am Ende der letzten Zeile der Datei.
+
+Wie alle andern Kommandos kann auch das C-Kommando mit anderen Kommandos
+verbunden werden. Beispiel:
+
+ ESC ESC
+ T 500; "Schreibfelher" C "Schreibfehler" RETURN
+
+Hier wird ab der 500. Zeile der Datei nach 'Schreibfelher' gesucht und ggf.
+ersetzt. Soll ein TEXT nicht nur einmal, sondern bei jedem Auftreten ersetzt
+werden, benutzt man das CA-Kommando (Abkürzung für CHANGEALL):
+
+ ESC ESC
+ "dieser alte Text" CA "dieser neue Text" RETURN
+
+Dadurch wird 'dieser alte Text' bei jedem Auftreten ab der aktuellen Cursor-
+Position durch 'dieser neue Text' ersetzt.
+
+Merke: Mehrere Kommandos werden mit ';' verbunden.
+
+
+
+Kommandos auf Tasten legen
+
+Oft benutzte Kommandos können auf Tasten gelegt werden. Damit ist es möglich,
+den Editor auf spezielle Bedürfnisse eines Benutzers zu modifizieren.
+
+Anstatt der Taste RETURN beim Abschluß können oft benutzte Kommandos mit der
+Drei-Tastenfolge ESC ! 'taste' auf eine Taste gelegt werden. Beispiel:
+
+ ESC ESC (* es erscheint die Kommandozeile *)
+ D "Schreibfehler"
+ ESC ! s (* das Kommando 'DOWN "Schreibfehler"' ist
+ nun auf die Taste 's' gelegt *)
+
+Wird nun die Taste 's' gedrückt, erscheint das Zeichen 's' auf dem Bildschirm.
+Mit ESC s wird das D-Kommando ausgeführt. Natürlich können auch komplizier-
+tere ziertere Kommandos auf Tasten gelegt werden.
+
+Einige Tasten sind bereits mit Kommandos belegt (man kann sie aber ver-
+ändern). Will man ein Kommando, welches auf eine Taste gelegt wurde, ver-
+ändern oder löschen, drückt man im Kommandodialog (!) die Drei-Tastenfolge
+ESC ? 'taste'. Beispiel:
+
+ ESC ESC (* in den Kommandodialog gehen *)
+ ESC ? s (* es erscheint nun: 'D "Schreibfehler"' *)
+
+Dieses Kommando kann nun z.B. verändert und ausgeführt (durch RETURN) oder
+wiederum auf die gleiche oder eine andere Taste gelegt werden (durch
+ESC ! 'taste').
+
+Die Ausführung eines Kommandos kann meist mit ESC abgebrochen werden,
+z.B. wenn ein Suchkommando unerwünscht weit reicht.
+
+Merke: Kommandos können auf Tasten gelegt werden (wie beim Lernen). Das
+letzte Kommando kann durch ESC f wiederholt werden.
+
+
+
+Die wichtigsten Kommandos zur Textverarbeitung
+
+Einige Kommandos sind speziell für die Textverarbeitung im Editor program-
+miert. Die wichtigsten werden hier vorgestellt.
+
+Kommando Bedeutung
+-----------------------------------------------------------------------------
+"text" Text suchen:
+D "text" Der zu suchende Text muß in Anführungszeichen geschrieben
+ werden (damit werden auch Leerzeichen innerhalb des ge-
+ suchten Textes wichtig). Es wird ab der Stelle in der
+ Datei in Richtung auf das Dateiende hin gesucht (also
+ "nach unten"), an der sich der Cursor befindet. Wird der
+ Text gefunden, positioniert der Editor den Cursor direkt
+ dahinter. Beispiel:
+
+ D "Autor"
+
+ sucht nach dem ersten Auftreten von 'Autor'. Beachte, daß
+ bei der Suche nach Zeichen, die man nicht direkt mit der
+ Tastatur schreiben kann, der Codewert angegeben werden
+ muß (vergl. dazu die EUMEL-Codetabelle). Beispiel:
+
+ DOWN ""217"" (* sucht ein ä *)
+ DOWN "Diesen Text mu"251" man finden"
+
+ (Ein Codewert innerhalb eines Textes muß in " einge-
+ schlossen werden).
+ Wird nur ein Text gesucht, kann man auch nur diesen
+ angeben. Beispiel:
+
+ "diesen fehler"
+
+D nummer (Relatives) Positionieren in Richtung auf das Dateiende.
+ Beispiel:
+
+ D 75
+
+ positioniert um 75 Zeilen in Richtung auf das Dateiende.
+
+U "text" Analog D, aber in Richtung auf den Dateianfang ("nach
+ oben").
+
+U nummer Analog D, aber in Richtung auf den Dateianfang.
+
+nummer Absolutes Positionieren:
+T nummer Durch Angabe einer Zahl, wird auf die entsprechende
+ Zeile der Datei positioniert. Beispiel:
+
+ T 317
+ 317
+
+ Ist die Datei bereits vor der Zeile '317' zu Ende, wird
+ auf die letzte Zeile der Datei positioniert.
+
+"alt" C "neu" Suchen und Ersetzen eines Textes: Sucht nach dem Text
+ 'alt'. Falls vorhanden, wird 'alt' durch 'neu' ersetzt.
+ Beispiel:
+
+ "einfach" C "leicht"
+
+ ersetzt 'einfach' durch 'leicht'.
+
+"alt" CA "neu" Suchen aller 'alt' ab der aktuellen Position bis zum
+ Dateiende und ersetzen durch 'neu'.
+
+type ("text") Schreiben eines 'text' durch ein Kommando. Das type-Kom-
+ mando wird häufig benutzt, um Zeichen zu schreiben, die
+ nicht auf der Tastatur zu finden sind. In diesem Fall muß
+ der Codewert des Zeichens angegeben werden (jeweils in
+ doppelten "). Beispiel (vergl. auch EUMEL-Codetabelle):
+
+ type (""251"")
+
+ schreibt ein ß an die aktuelle Position der Zeile.
+
+Merke: Durch das D- bzw. U-Kommando kann ein Text in der Datei gesucht
+werden. Mit C kann ein Text gesucht und ersetzt werden. "alt" CA "neu" er-
+setzt alle 'alt' durch 'neu'. 'type' schreibt ein Zeichen (oder einen Text).
+Durch T kann auf eine bestimmte Zeile der Datei positioniert werden.
+
+
+
+Texte aus anderen Dateien einfügen oder in andere Dateien schreiben
+
+Manchmal ist es notwendig, einen Text in eine andere Datei zu schreiben
+(z.B. wenn man diesen Text noch einmal verwenden will) oder einen Text einer
+anderen Datei in den zu bearbeitenden Text einzufügen. Die GET- und PUT-
+Kommandos bieten die Möglichkeit, Texte zwischen Dateien auszutauschen
+(vergl. auch Paralleleditor).
+
+Das Kommando GET 'dateiname' holt den Text der Datei "dateiname" an die
+aktuelle Schreibposition. Beispiel:
+
+ GET "absender"
+
+holt den Text 'absender'. Wenn also des öfteren Briefe geschrieben werden,
+braucht man sich den Absender nur einmalig in die Datei 'absender' zu schrei-
+ben und kann diesen mit dem Kommando GET (was man auf eine Taste legen kann)
+u.U. mehrmals an verschiedenen Stellen in die Datei einfügen.
+
+Das Kommando PUT (abgekürzt: P) schreibt einen vorher markierten Text in
+eine Datei. Beispiel:
+
+ PUT "Tabelle"
+
+schreibt einen markierten Text in die Datei 'Tabelle'. 'Tabelle' wird ggf.
+eingerichtet. Ist die Datei 'Tabelle' bereits vorhanden, so wird erfragt, ob
+die Datei gelöscht werden kann, um den markierten Text aufzunehmen (über-
+schreiben). Andernfalls wird der markierte Text an den bereits vorhandenen
+Text in 'Tabelle' angefügt. Es ist somit durch mehrmaliges markieren und dem
+PUT-Kommando möglich, Texte aus einer Datei aufzusammeln und in eine neue
+Datei zu geben.
+
+Merke: Die GET- und PUT-Kommandos schreiben bzw. holen Texte aus Dateien.
+
+
+
+Breitere Zeilen bearbeiten
+
+Der Editor ist auf eine Zeilenbreite von 77 Zeichen eingestellt. Oft ist es
+notwendig, mit einer anderen Zeilenbreite zu schreiben, welches man mit dem
+LIMIT-Kommando einstellen kann. Aber auch die Positionierung innerhalb einer
+Zeile wird dadurch etwas anders, weil bei breiteren Zeilen als die Bild-
+schirmbreite die Zeile nicht auf einmal auf den Bildschirm paßt. In diesem
+Fall wird gerollt.
+
+Eine andere Zeilenbreite stellt man durch 'limit' ein. Beachte, daß die somit
+eingestellte Zeilenbreite für die gesamte Datei gilt. Beispiel:
+(Soll eine veränderte Zeilenbreite nur für einen Abschnitt gelten, muß man
+eine Textkosmetik-Anweisung einfügen, welches erst nach Anwendung von
+'lineform' wirkt.)
+
+ limit (180)
+
+Nun kann man wie gewohnt schreiben. Allerdings wird die aktuelle Zeile, in
+der man sich befindet, nicht wie gewohnt am Bildschirmende umgebrochen,
+sondern erst an der Spalte 180 (sofern sie nicht vorher durch die RETURN-
+Taste beendigt wird). Wird über das rechte Bildschirmende hinaus geschrieben,
+bleibt die Cursor-Position am Ende des Bildschirms erhalten, aber die Zeile
+wird beim weiteren Schreiben nach links verschoben, "rollt" also nach links
+(der Anfang der Zeile verschwindet scheinbar nach links).
+
+Mit der Positionierung verhält es sich ähnlich. Wird über den rechten Bild-
+schirmrand mit RECHTS positioniert, wird die Zeile ebenfalls gerollt. HOP
+RECHTS dagegen bewirkt ein Blättern nur innerhalb dieser Zeile nach rechts.
+Analog verläuft es bei verschobener Zeile, wenn nach links (LINKS bzw. HOP
+LINKS) positioniert wird.
+
+Beim Schreiben von Tabellen kann es sinnvoll sein, das Fenster vorübergehend
+auf eine andere Anfangsposition (als 1) einzustellen. Das kann mit dem
+'margin'-Kommando erfolgen. Beispiel:
+
+ margin (50)
+
+Das Fenster des Editors zeigt nun einen Ausschnitt aus der Datei, beginnend
+ab Spalte 50. In der Titelzeile wird "M50" angezeigt.
+
+Merke: Eine veränderte Zeilenbreite wird mit dem limit-Kommando eingestellt.
+Wird über den Bildschirmrand positioniert, wird die Zeile gerollt. Mit dem
+'margin'-Kommando kann spaltenmäßig ein Anfangspunkt des Fensters einge-
+stellt werden.
+
+
+
+Paralleles Editieren (Fenstereditor)
+
+Oft ist notwendig, mit mehreren Dateien gleichzeitig zu arbeiten, z.B. wenn
+aus einer Datei etwas in eine andere kopiert werden muß, wenn Fehler durch
+die Textkosmetik-Programme oder einen Compiler gefunden werden oder wenn man
+kurz etwas in einer andern Datei nachschauen will. Zu diesem Zweck bietet der
+Editor die Möglichkeit, zwei (oder mehr) Dateien zur gleichen Zeit zu be-
+arbeiten.
+
+Um ein neues Editor-Fenster einzuschachteln, betätigt man im Editor
+
+ ESC e
+
+Dies eröffnet ein Fenster auf eine andere Datei, deren Name interaktiv er-
+fragt wird. Die obere linke Ecke des Fensters befindet sich an der aktuellen
+Cursor-Position. Dabei darf sich der Cursor nicht zu sehr am rechten oder
+unteren Rand befinden (weil das Fenster sonst zu klein würde). In diesem
+"Fenster" auf eine andere Datei kann man genauso arbeiten, wie im "normalen"
+Editor. ESC q verläßt den aktuellen Fenstereditor (und alle darin einge-
+schachtelten Fenster).
+
+Mit der Tastenfolge
+
+ ESC w
+
+kann man von einem Fenster in das benachbarte wechseln (zyklisch). Insbeson-
+dere kann ein markierter Teil einer Datei mit dem Kommando
+
+ ESC p (* oder: PUT "" *)
+
+in eine temporäre Datei geschrieben und nach ESC w mit
+
+ ESC g (* oder: GET "" *)
+
+in die andere Datei eingefügt werden.
+
+Betätigt man ESC e ungefähr in der Mitte des Bildschirms, hat man das Fenster
+auf die neue Datei in der unteren Hälfte des Bildschirms und die "alte" Datei
+in der oberen Bildschirmhälfte. Dies nennt man "Paralleleditor", weil zwei
+Dateien zur gleichen Zeit editiert werden können. Der Paralleleditor wird
+auch von anderen Programmen benutzt, wie z.B. dem ELAN-Compiler, um Fehler-
+meldungen bequem anzuzeigen.
+
+Das Notizbuch schlägt man mit
+
+ ESC n
+
+auf. In diesem Notizbuch werden Informationen durch die Prozedur
+
+ note
+
+geschrieben.
+
+Merke: Der Fenstereditor wird durch ESC e aufgerufen und mit ESC q verlassen.
+Mit ESC w kann zwischen Dateien umgeschaltet werden. In jeder Datei stehen
+die gleichen Funktionen wie im "einfachen" Editor zur Verfügung. Man kann
+markierte Texte mit PUT bzw. GET von einer Datei in die andere bringen
+(Kopieren).
+
+
+
+Arbeiten mit dem Zeileneditor
+
+Der Zeileneditor erlaubt ein Editieren einer Eingabe mit allen Editor-
+Funktionen.
+
+Der Zeileneditor (auch "Feldeditor" genannt) wird über die Prozedur
+
+ editget
+
+aufgerufen. Durch diese Prozedur kann eine Zeile vom Terminal wie im Editor
+eingegeben werden, d.h. es können u.a. Einfügungen bzw. Löschungen in der
+Zeile vorgenommen werden. 'editget' dient darum als Grundlage für alle 'get'-
+Prozeduren. Beispiel:
+
+ TEXT VAR eingabe :: "";
+ put ("Bitte geben Sie einen Wert ein:");
+ editget (eingabe);
+ line
+
+'editget' kann aber auch einen Wert ausgeben, den ein Benutzer ggf.
+verändern kann. Beispiel:
+
+ TEXT VAR eingabe :: "trium10");
+ put ("Bitte Schrifttyp angeben:");
+ editget (eingabe);
+ line
+
+Hier kann ein Benutzer den TEXT 'trium10' verändern oder nur RETURN betäti-
+gen.
+
+Es gibt noch weitere Versionen von 'editget', bei denen man die Zeilenbreite,
+reservierte Tasten u.a.m. angeben kann.
+
+Merke: 'editget' ist der Zeileneditor.
+
+
+
+3. Vorbelegung von Tasten
+
+Wie schon beschrieben, können Lernsequenzen und Kommandos (d.h. ELAN-
+Programme) Tasten zugeordnet werden. Da einige Funktionen häufig benötigt
+werden, sind diese standardmäßig bestimmten Tasten zugeordnet.
+
+
+
+Kommandodialog
+
+ESC ESC Kommandodialog einschalten.
+
+ESC ! taste Im Kommandodialog: geschriebenes Kommando auf Taste legen.
+
+ESC ? taste Im Kommandodialog: Auf 'taste' gelegtes Kommando anzeigen zum
+ Editieren.
+
+ESC k Im Kommandodialog: Das zuletzt editierte ELAN-Programm an-
+ zeigen.
+
+
+
+Lernen
+
+ESC HOP Lernen einschalten.
+
+ESC HOP taste Lernsequenz auf 'taste' legen.
+
+
+
+Operationen auf Markierungen
+
+ESC RUBOUT Markiertes "vorsichtig" löschen.
+
+ESC RUBIN Vorsichtig Gelöschtes einfügen.
+
+ESC p Markiertes in die Scratch-Datei kopieren (PUT ""), an
+ schließend löschen (kann mit ESC g an anderer Stelle re-
+ produziert werden).
+
+ESC d Duplizieren: Markiertes in die Scratch-Datei kopieren
+ (PUT ""), anschließend die Markierung abschalten. (Kann mit
+ ESC g beliebig oft reproduziert werden).
+
+ESC g MIT ESC p gelöschtes oder mit ESC d dupliziertes an aktuelle
+ Cursor-Stelle schreiben, d.h. Scratch-Datei an aktueller
+ Stelle einfügen (GET "").
+
+
+
+Weitere Operationen
+
+ESC q Verlassen des Editors.
+
+ESC e Fenstereditor einschalten.
+
+ESC n Notizbuch "aufschlagen".
+
+ESC w Dateiwechsel beim Fenstereditor.
+
+ESC f Nochmalige Ausführung des letzten Kommandos
+
+ESC b Das Fenster wird auf den linken Rand der aktuellen (ggf.
+ verschobenen) Zeile gesetzt.
+
+ESC RECHTS Zum nächsten Wortanfang.
+
+ESC LINKS Zum vorigen Wortanfang.
+
+ESC 1 Zum Anfang der Datei.
+
+ESC 9 Zum Ende der Datei.
+
+
+
+Zeichen schreiben
+
+ESC a Schreibt ein ä.
+ESC A Schreibt ein Ä.
+ESC o Schreibt ein ö.
+ESC O Schreibt ein Ö.
+ESC u Schreibt ein ü.
+ESC U Schreibt ein Ü.
+ESC s Schreibt ein ß.
+ESC ( Schreibt eine [.
+ESC ) Schreibt eine ].
+ESC < Schreibt eine {.
+ESC > Schreibt eine }.
+ESC \# Schreibt ein \#, was auch gedruckt werden kann.
+ESC blank Schreibt ein (geschütztes) Leerzeichen.
+
+
+
+4. Komplexere Kommandos (ELAN-Programme)
+
+In diesem Kapitel finden Sie (neben den bereits in den vorherigen Kapiteln
+beschriebenen) eine Übersicht über die vorgefertigten Kommandos. Weitere
+können leicht vom Benutzer und Programmierer selbst erstellt werden.
+
+
+
+Wiederholungen schreiben
+
+In der Programmiersprache ELAN gibt es ein Sprachmittel, um Anweisungen
+wiederholen zu lassen. Dieses Sprachmittel nennt man Wiederholungsanweisung
+oder Schleife. Durch dieses Sprachmittel ist es leicht möglich, eine oder
+mehrere Kommandos mehrmals ausführen zu lassen.
+
+Eine Wiederholung, meist Schleife genannt, wird durch die Worte REP (steht
+für 'REPEAT', was soviel wie 'wiederhole' heißt) und PER (die Umkehrung von
+REP) oder END REP gebildet. Alle Anweisungen, die zwischen diesen Worten
+stehen, werden wiederholt ausgeführt (bis das Ende der Datei erreicht ist).
+Damit kann man einen Text in der gesamten Datei ändern. (In den folgenden
+Beispielen schreiben wir die Kommandozeile der besseren Ãœbersichtlichkeit
+halber in mehreren Zeilen). Beispiel:
+
+ T 1;
+ WHILE NOT eof REP
+ "alter text" C "neuer text"
+ PER
+
+Durch die erste Anweisung wird zur ersten Zeile der Datei positioniert. Dann
+steht im Programm eine sogenannte "abweisende Schleife", die durch 'WHILE
+bedingung' eingeleitet wird (die Schleife wird solange ausgeführt, bis die
+Bedingung nicht mehr erfüllt ist). Die Bedingung besteht hier aus einer Ab-
+frage auf das Dateiende der bearbeiteten Datei ('eof'). Nach Eintritt in die
+Schleife wird nach 'alter text' gesucht. Falls gefunden, wird er durch
+'neuer text' ersetzt. Das Suchen und ersetzen wird solange durchgeführt, bis
+das Dateiende erreicht wird. Falls 'alter text' nicht gefunden wird, steht
+man auf dem letzten Zeichen der letzten Zeile der Datei (wie bei einer er-
+folglosen wiederholten letzten Suche), so daß die nächste WHILE-Überprüfung
+die Schleife abbricht.
+
+Die meisten der oben beschriebenen Kommandos gibt es nicht nur als Operato-
+ren, sondern auch als Prozeduren. Beispiele:
+
+ T 1 ==> toline (1)
+ D "text" ==> down ("text")
+ U "text" ==> up ("text")
+ D 17 ==> down (17)
+ U 18 ==> up (18)
+ "alt" C "neu" ==> change to ("alt", "neu")
+ "alt" CA "neu" ==> change all ("alt", "neu")
+
+Man kann also das obige Beispiel auch folgendermaßen programmieren:
+
+ toline (1);
+ WHILE NOT eof REP
+ change to ("alter text", "neuer text")
+ PER
+
+Durch dieses zusammengesetzte Editor-Kommando können also ein oder mehrere
+Worte in der gesamten Datei auf einfache Weise geändert werden.
+Natürlich kann man das obige Beispiel einfacher schreiben:
+
+ toline (1); change all ("alter text", "neuer text")
+
+Was muß man nun programmieren, um eine Ersetzung nur einmal pro Zeile vor-
+zunehmen? Erinnern wir uns: nach einer Ersetzung steht der Cursor hinter dem
+ersetzten Text. Somit finden wir bei der erneuten Suche unter Umständen den
+Text nochmals in der aktuellen Zeile. Wenn wir nach einer Ersetzung aber um
+eine Zeile vorwärts positionieren (mit 'down (1)'), kann dies nicht ge-
+schehen. Leider wird durch die Vorwärts-Positionierung die Position des
+Cursors nicht verändert. Somit kann die erneute Suche einen Text in der
+nächsten Zeile verpassen. Man muß also neben der Vorwärts-Positionierung um
+eine Zeile zusätzlich auch noch an den Anfang der Zeile gehen. Für die
+Positionierung innerhalb einer Zeile gibt es die Prozedur
+
+ col (17) (* Positioniert auf die 17. Spalte
+ der aktuellen Zeile *)
+
+Damit können wir nun eine einmalige Ersetzung in einer Zeile programmieren:
+
+ toline (1);
+ WHILE NOT eof REP
+ col (1);
+ change to ("alter text", "neuer text");
+ down (1);
+ PER
+
+Es wird erst auf die erste Zeile, erste Spalte positioniert. Dann wird 'alter
+text' gesucht und ggf. durch 'neuer text' ersetzt. Danach wird eine Zeile
+vorwärts positioniert, wiederum auf Spalte 1. Dadurch ist gewährleistet, daß
+eine Ersetzung nur einmal pro Zeile vorgenommen wird und immer von der
+ersten Spalte einer Zeile aus gesucht wird. Dies geschieht solange, bis das
+Ende der Datei erreicht ist.
+
+Manchmal ergibt sich die Notwendigkeit, in Tabellen in jeder Zeile noch Leer-
+spalten einzufügen oder zu entfernen. Auch dies kann mit der Schleife leicht
+erledigt werden:
+
+ toline (1);
+ WHILE NOT eof REP
+ col (48);
+ "" C " ";
+ down (1)
+ PER
+
+Hier werden in jeder Zeile an der Spalte 48 drei Leerzeichen eingefügt. In
+diesem Fall suchen wir ab der Spaltenposition 48 einen sogenannten "Niltext"
+("leerer Text"). Dieser Text wird natürlich immer gefunden. Aber man muß
+hier aufpassen, denn der gesuchte Text sollte in dieser Zeile vorhanden sein,
+sonst wird in einer der nächsten Zeilen ein TEXT ersetzt, der nicht unbe-
+dingt an der Spaltenposition 48 steht!
+
+Wie bereits angemerkt, sollten in den zu verändernden Zeilen an der Position
+48 ein Leerzeichen stehen, sonst wird das C-Kommando fehlerhaft bei dem
+nächsten TEXT ausgeführt. Das kann man verhindern, indem man folgendes
+programmiert:
+
+ toline (1);
+ WHILE NOT eof REP
+ down (" "); (* sucht das naechste Blank ab Spalte 48 *)
+ IF col = 48
+ THEN change to (" ", " ");
+ FI
+ END REP
+
+Die Prozedur 'col' (ohne Parameter) liefert die aktuelle Spaltenposition
+innerhalb einer Zeile.
+
+Manchmal soll eine Änderung nur in einem bestimmten Bereich vorgenommen
+werden. Dazu gibt es die Prozedur 'line no', mit der man die aktuelle Zeilen-
+nummer erfragen kann. Beispiel:
+
+ toline (50);
+ WHILE NOT eof REP
+ aenderungen
+ UNTIL line no = 100 END REP
+
+In diesem Beispiel werden 'aenderungen' im Zeilenbereich 50 - 100 vorgenom-
+men. 'line no' liefert die aktuelle Zeilennummer des FILEs, welches gerade
+vom Editor bearbeitet wird.
+
+Weitere Beispiele:
+
+ (* suchen in Spalte 17: *)
+ REP
+ down ("muster")
+ UNTIL eof OR col = 17 END REP
+
+ (* in Spalte 1 ersetzen: *)
+ REP
+ down ("alt");
+ IF col = 1
+ THEN "alt" C "neu"
+ FI
+ UNTIL eof END REP
+
+Merke: Eine Wiederholung REP ... PER führt die in ihr enthaltenen An-
+weisungen wiederholt aus. Eine Abfrage auf das Dateiende der bearbeiteten
+Datei ist durch 'eof' möglich.
+
+
+
+Das Notizbuch
+
+Im Notizbuch kann man sich Notizen über den Ablauf von Kommandos machen.
+
+Die Prozedur
+
+ note
+
+schreibt einen INT- oder TEXT-Parameter in eine Zwischendatei. Diese Datei
+kann man sich mit
+
+ ESC n
+
+anschauen. Beispiel:
+
+ (* ersetzen und notieren: *)
+ REP
+ "alt" C "neu";
+ note (line no) (* Zeilennummer der Ersetzung notieren *)
+ UNTIL eof END REP
+
+Merke: Die Prozedur 'note' schreibt in das Notizbuch. Mit ESC n kann man
+sich das Notizbuch anschauen.
+
+
+
+Neue Editor-Kommandos bereitstellen
+
+Sollen neue Editor-Kommandos bereitgestellt werden, muß man dem Editor ggf.
+mitteilen, ob und wie das Fenster auf die Datei auf dem Bildschirm neu ge-
+schrieben werden muß.
+
+Neue Editor-Kommandos kann man allen Benutzern bereitstellen, in dem ein
+Programm geschrieben wird. Beispiel:
+
+ PROC datum schreiben:
+ type (datum).
+
+ datum:
+ date (clock (1)). (* Siehe auch TEIL 8: Standardpakete *)
+ END PROC datum schreiben
+
+Diese Prozedur (oder mehrere) muß noch in ein PACKET "gekleidet" und dann
+insertiert werden. Dann steht 'datum schreiben' allen Benutzern dieser Task
+oder dessen Sohn-Task zur Verfügung (siehe dazu auch TEIL 5: ELAN-Compiler).
+
+Bei etwas komplizierteren Prozeduren sollte man dem Editor mitteilen, ob und
+wie er das Fenster auf die Datei auf dem Bildschirm neu schreiben muß.
+Normalerweise schreibt der Editor nach einem Kommando den gesamten Bild-
+schirm neu. Dies kann man verhindern, indem man die Prozedur
+
+ nichts neu
+
+aufruft. Sie teilt dem Editor mit, daß das Fenster nicht neu geschrieben
+werden muß. Weitere Prozeduren teilen dem Editor mit, daß Teile des Fensters
+neu geschrieben werden müssen:
+
+ satznr neu (* Zeilennummer links oben *)
+ ueberschrift neu
+ zeile neu
+ abschnitt neu
+ bild neu
+
+Dabei kann man die Prozeduren in beliebiger Reihenfolge aufrufen, wobei
+jeweils immer die größte Änderung dominiert. Beispiel:
+
+ nichts neu;
+ ...
+ zeile neu;
+ ...
+ bild neu;
+ ...
+ ueberschrift neu
+ ...
+
+'bild neu' dominiert über 'zeile neu',
+'zeile neu' dominiert über 'ueberschrift neu';
+'ueberschrift neu' dominiert über 'nichts neu'.
+
+Im obigen Beispiel 'datum schreiben' würde es also ausreichen, am Anfang der
+Prozedur 'nichts neu' und am Ende 'zeile neu' aufzurufen, damit nur die
+aktuelle Zeile neu geschrieben wird.
+
+Manchmal ist es notwendig, dem Benutzer bei einer Kommandoverarbeitung neue
+Zustände direkt anzuzeigen. Dafür gibt es die Prozeduren
+
+ satznr zeigen
+ ueberschrift zeigen
+ bild zeigen
+
+Beispiel:
+
+ satznr zeigen (line no)
+
+zeigt bei einer Kommandoverarbeitung die aktuelle Zeilenummer.
+
+Merke: Normalerweise baut der Editor nach einer Kommandoausführung das
+Fenster auf dem Bildschirm neu auf. Mit 'nichts neu' kann das verhindert
+werden. Weitere Prozeduren teilen dem Editor mit, welche Fensterteile neu
+geschrieben werden müssen. Das Schreiben von Fensterteilen kann auch direkt
+ausgelöst werden.
+
+
+
+Die ELAN-Notation
+
+Kommandos werden in ELAN-Notation beschrieben. Dabei bedeuten:
+
+OP Operator.
+ Der Name des Operators muß mit grossen Buchstaben vor oder
+ zwischen die Operanden geschrieben werden. Beispiele:
+ OP C (TEXT CONST muster, pattern)
+ --> "alt" C "neu"
+
+PROC Prozedur.
+ Der Name der Prozedur muß klein geschrieben werden. Die
+ Parameter werden in Klammern angefügt. Beispiele:
+ PROC getchar (TEXT VAR zeichen)
+ --> getchar (character)
+ PROC edit (TEXT CONST datei,
+ INT CONST x, y, xsize, ysize)
+ --> edit ("meine datei", 1, 1, 79, 24)
+
+INT Ganze Zahl ('Integer').
+ Der Wert ist eine ganze Zahl (ohne Dezimalpunkt!).
+
+BOOL Wahrheitswert ('Boolean').
+ Hat zwei Werte: TRUE ('Wahr') und FALSE ('Falsch').
+
+TEXT Text.
+ Muß in Anführungszeichen geschrieben werden. Soll das
+ '"'-Zeichen in einem Text vorkommen, muß es doppelt
+ geschrieben werden.
+
+VAR Veränderbarer Wert.
+ Wert kann von der Prozedur oder dem Operator verändert
+ werden.
+
+CONST Unveränderbarer Wert.
+ Wert kann von der Prozedur oder dem Operator nicht ver-
+ ändert werden.
+
+
+
+Kommando-Ãœbersicht
+
+In dieser Ãœbersicht werden Editor-Kommandos, die in der Regel nur in Pro-
+grammen verwendet werden, mit (P) gekennzeichnet. "Nicht-Programmierer"
+brauchen also nur die nicht gekennzeichneten Kommandos zu lesen. Alle hier
+aufgeführten Kommandos arbeiten auf die vom Editor bearbeitete Datei
+('editfile'). Einige der Prozeduren stehen auch zur allgemeinen Dateiver-
+arbeitung zur Verfügung (siehe TEIL 7), allerdings dann mit einem zusätz-
+lichen FILE-Parameter.
+
+abschnitt neu (P)
+ PROC abschnitt neu (INT CONST von zeile, bis zeile)
+ Zweck: Mitteilung an den Editor, daß der entsprechende Abschnitt
+ auf dem Bildschirm neu geschrieben werden muß.
+
+at (P)
+ BOOL PROC at (TEXT CONST muster)
+ Zweck: Feststellen, ob der Editor auf 'muster' steht. Die Cursor-
+ Position wird dabei nicht verändert.
+
+bild neu (P)
+ PROC bild neu
+ Zweck: Mitteilung an den Editor, daß das Bild nach Kommandover-
+ arbeitung neu geschrieben werden muß.
+
+bild zeigen
+ PROC bild zeigen
+ Zweck: Mitteilung an den Editor, daß das Bild sofort neu geschrieben
+ werden muß.
+
+C
+ OP C (TEXT CONST muster, pattern)
+ Zweck: Wie D "muster" mit anschließender Ersetzung desselben durch
+ 'pattern'.
+
+change to (P)
+ PROC change to (TEXT CONST muster, pattern)
+ Zweck: Analog C.
+
+ PROC change to (TEXT CONST muster, pattern, INT CONST number)
+ Zweck: Analog C, aber nur 'number' Zeilen weit.
+
+CA
+ OP CA (TEXT CONST source, destination)
+ Zweck: Arbeitet ab der aktuellen Position wie
+
+ WHILE NOT eof REP
+ "source" C "destination"
+ END REP
+
+change all (P)
+ PROC change all (TEXT CONST source, destination)
+ Zweck: Analog CA.
+
+col (P)
+ PROC col (INT CONST pos)
+ Zweck: Positioniert auf die Spalte 'pos' der aktuellen Zeile.
+ Beispiel:
+
+ col (37)
+
+ positioniert auf die 37. Spalte der aktuellen Zeile.
+
+ INT PROC col
+ Zweck: Liefert die aktuelle Position des Cursors innerhalb einer Zeile.
+
+D
+ OP D (INT CONST n)
+ Zweck: Positioniert das Fenster n Zeilen vorwärts in Richtung auf das
+ Dateiende.
+
+ OP D (TEXT CONST muster)
+ Zweck: Sucht 'muster' vorwärts in Richtung auf das Dateiende. Die Suche
+ beginnt direkt hinter der aktuellen Cursor-Position. Wird 'muster'
+ nicht gefunden, steht der Cursor hinter dem letzten Zeichen der
+ Datei. Wird 'muster' gefunden, steht der Cursor direkt auf dem
+ ersten Zeichen von 'muster'.
+
+down (P)
+ PROC down (INT CONST n)
+ Zweck: Analog D.
+
+ PROC down (TEXT CONST muster)
+ Zweck: Analog D.
+
+ PROC down (TEXT CONST muster, INT CONST n)
+ Zweck: Analog D, jedoch geht die Suche nur 'n' Zeilen.
+
+downety (P)
+ PROC downety (TEXT CONST muster)
+ Zweck: Im Gegensatz zu 'down' beginnt die Suche mit dem aktuellen Zeiche
+ n, d.h. der Aufruf führt zu einer leeren Leistung, wenn der Cursor schon
+ auf 'muster' steht. Deshalb bei der Programmierung vorsichtig verwenden.
+
+ PROC downety (TEXT CONST muster, INT CONST n)
+ Zweck: Analog 'downety', jedoch geht die Suche nur 'n' Zeilen und
+ beginnt bei der aktuellen Cursor-Position (siehe oben).
+
+editfile (P)
+ FILE PROC editfile
+ Zweck: Liefert die aktuell editierte Datei.
+
+eof
+ BOOL PROC eof
+ Zweck: Abfrage auf das Dateiende der zu bearbeitenden Datei.
+
+GET
+ OP GET (TEXT CONST dateiname)
+ Zweck: Kopiert den Inhalt der Datei mit dem angegebenen Namen vor die
+ aktuelle Cursor-Position. Ist die Quelldatei kopiert, wird nur
+ der markierte Teil kopiert.
+
+ OP G (TEXT CONST dateiname)
+ Zweck: Wie GET.
+
+len (P)
+ INT PROC len
+ Zweck: Liefert die Länge der aktuellen Zeile.
+
+limit
+ OP limit (INT CONST limit)
+ Zweck: Setzt die rechte Schreibgrenze auf 'limit'. Beispiel:
+
+ limit (120)
+
+ stellt den Editor auf eine Zeilenlänge von 120 Zeichen.
+
+ INT PROC limit
+ Zweck: Liefert die eingestellte Zeilenbreite.
+
+line no (P)
+ INT PROC line no
+ Zweck: Liefert die aktuelle Zeilennummer der editierten Datei.
+
+margin
+ PROC margin (INT CONST anfang)
+ Zweck: Alle Zeilen erscheinen erst ab Spalte 'anfang' im Sichtfenster.
+ Beispiel:
+
+ margin (50)
+
+ legt das Fenster ab Spalte 50 fest.
+
+ INT PROC margin
+ Zweck: Liefert den eingestellten linken Rand.
+
+mark (P)
+ PROC mark (BOOL CONST an)
+ (Zweck: Schaltet die Markierung an der aktuellen Stelle ein bzw. aus.
+ Beispiel:
+
+ mark (true) (* schaltet Markierung an *)
+ mark (false) (* schaltet Markierung aus *)
+
+ BOOL PROC mark
+ Zweck: Liefert TRUE, sofern die Markierung eingeschaltet ist.
+
+nichts neu (P)
+ PROC nichts neu
+ Zweck: Mitteilung an den Editor, daß nach Kommandoverarbeitung das Bild
+ nicht neu geschrieben werden muß.
+
+note (P)
+ PROC note (INT CONST wert)
+ Zweck: Schreibt 'wert' in das Notizbuch.
+
+ PROC note (TEXT CONST message)
+ Zweck: Schreibt 'message' in das Notizbuch.
+
+pattern found (P)
+ BOOL PROC pattern found
+ Zweck: Gibt an, ob der letzte Suchprozeß erfolgreich war.
+
+PUT
+ OP PUT (TEXT CONST dateiname)
+ Zweck: Richtet eine Datei mit dem angegebenen Namen ein, kopiert den
+ markierten Textabschnitt in diese.
+
+ OP P (TEXT CONST dateiname)
+ Zweck: Wie PUT.
+
+satznr neu (P)
+ PROC satznr zeigen
+ Zweck: Mitteilung an den Editor, daß nach Kommandoverarbeitung die
+ Zeilennummer rechts oben neu geschrieben werden muß.
+
+satznr zeigen (P)
+ PROC satznr zeigen (INT CONST nr)
+ Zweck: Mitteilung an den Editor, die Zeilennummer 'nr' sofort neu zu
+ schreiben.
+
+T
+ OP T (INT CONST n)
+ Zweck: Positioniert auf die Zeile 'n'.
+
+toline (P)
+ PROC toline (INT CONST n)
+ Zweck: Analog T.
+
+type (P)
+ PROC type (TEXT CONST t)
+ Zweck: Trägt 't' in den Eingabestrom ('f kommando') des Editors ein.
+ Beispiel:
+
+ type (text (sqrt (2.0)))
+
+ fügt an die aktuelle Cursor-Position den Wert 1.41... ein.
+ Beispiel:
+
+ INT VAR i;
+ FOR i FROM 1 UPTO 10 REP
+ type (text (i) + " ")
+ END REP
+ (* Ausgabe: 1 2 3 4 5 6 7 8 9 10 *)
+
+U
+ OP U (INT CONST n)
+ Zweck: Positioniert das Fenster n Zeilen rückwärts in Richtung auf den
+ Dateianfang.
+
+ OP U (TEXT CONST muster)
+ Zweck: Sucht 'muster' rückwärts in Richtung auf den Dateianfang. Die
+ Suche beginnt links neben der aktuellen Cursor-Position. Vergl. D
+
+ueberschrift neu (P)
+ PROC ueberschrift neu
+ Zweck: Mitteilung an den Editor, daß nach Kommandoverarbeitung die
+ Ãœberschriftszeile neu zu schreiben ist.
+
+ueberschrift zeigen (P)
+ PROC ueberschrift zeigen
+ Zweck: Mitteilung an den Editor, daß sofort die Überschriftszeile neu
+ zu schreiben ist.
+
+up (P)
+ PROC up (INT CONST n)
+ Zweck: Analog U.
+
+ PROC up (TEXT CONST muster)
+ Zweck: Analog U.
+
+ PROC up (TEXT CONST muster, INT CONST n)
+ Zweck: Analog U, aber nur 'n' Zeilen weit.
+
+uppety (P)
+ PROC uppety (TEXT CONST muster)
+ Zweck: Im Gegensatz zu 'up' beginnt die Suche direkt auf der aktuellen
+ Cursor-Position. Vergl. 'down'.
+
+ PROC uppety (TEXT CONST muster, INT CONST n)
+ Zweck: Analog 'uppety', aber nur 'n' Zeilen weit.
+
+word (P)
+ TEXT PROC word
+ Zweck: Liefert das Wort von der aktuellen Position bis zum nächsten
+ Blank bzw. Zeilenende. Die Cursor-Position wird nicht verändert.
+
+ TEXT PROC word (TEXT CONST muster)
+ Zweck: Liefert das Wort von der aktuellen Position bis zum nächsten Auf-
+ treten von 'muster' (ausschließlich) bzw. Zeilenende. Die Cursor-
+ Position wird nicht verändert.
+
+ TEXT PROC word (INT CONST laenge)
+ Zweck: Liefert das Wort von der aktuellen Position in der angegebenen
+ 'laenge' bzw. bis zum Zeilenende. Die Cursor-Position wird nicht
+ verändert.
+
+word wrap
+ PROC word wrap (BOOL CONST an)
+ Zweck: Schaltet den automatischen Wortumbruch an (voreingestellt) bzw.
+ aus. Beispiel:
+
+ word wrap (true) (* angeschaltet *)
+ word wrap (false) (* ausgeschaltet *)
+
+zeile neu (P)
+ PROC zeile neu
+ Zweck: Mitteilung an den Editor, daß nach Kommandoverarbeitung die
+ aktuelle Zeile neu zu schreiben ist.
+
+
+
+5. EUMEL-Zeichensatz
+
+Das EUMEL-System definiert einen Zeichensatz, der gewährleistet, daß Zeichen
+auf allen Maschinen überall gleich codiert werden. Dadurch ist es z.B. mög-
+lich, Dateien und Programme ohne Konvertierungen zwischen EUMEL-Systemen
+unterschiedlicher Hersteller zu übertragen. Der EUMEL-Zeichensatz beruht auf
+dem ASCII-Zeichensatz (DIN 66 003) mit Erweiterungen.
+
+
+
+Darstellbare Zeichen
+
+Die genaue Darstellung der einzelnen Zeichen hängt vom Endgerät ab. Die hier
+aufgeführten Zeichen sind i.A. auf allen Geräten vorhanden. Ein erweiterter
+Zeichensatz (mit mathematischen, diakritischen und griechischen Zeichen) ist
+nur auf Spezialgeräten verfügbar und wird deshalb hier nicht angegeben.
+
+Beispiele zum Lesen der Tabelle:
+
+ code (" ") -> 32
+ code ("m") -> 109
+
+ |3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
+-+-------------------------------------------------------------------
+0| ( 2 < F P Z d n x k
+ |
+1| ) 3 = G Q [ e o y - ß
+ |
+2|SP * 4 > H R \\ f p z \#
+ |
+3|! + 5 ? I S ] g q { SP
+ |
+4|" , 6 § J T ^ h r | Ä
+ |
+5|\# - 7 A K U _ i s } Ö
+ |
+6|$ . 8 B L V ` j t ~ Ü
+ |
+7|% / 9 C M W a k u ä
+ |
+8|& 0 : D N X b l v ö
+ |
+9|' 1 ; E O Y c m w ü
+
+Anmerkungen:
+1) SP bedeutet Leerzeichen ("blank").
+2) Die Zeichen 'k', '-' und 'SP' mit den Codes 220, 221, 223 werden für die
+ Zwecke der Textkosmetik benötigt (Trenn 'k' bei der Umwandlung von 'ck' in
+ 'kk'; Trennzeichen; geschütztes Leerzeichen).
+3) Das Zeichen '\#' (Code 222) ist druckbar, während das Zeichen '\#' (Code 35)
+ nicht druckbar ist (Einleitungszeichen für Anweisungen der Textkosmetik
+ und Drucker).
+4) Das Zeichen SP (Code 223) wird zur besseren Identifizierung als Unter-
+streichungsstrich auf dem Terminal dargestellt. Im einem Ausdruck erscheint
+es als ein Leerzeichen.
+
+
+
+Steuerzeichen und -tasten
+
+Das EUMEL-System definiert neben den darstellbaren Zeichen auch Steuer-
+zeichen, die entsprechend der angeschlossenen Geräte ggf. jeweils umcodiert
+werden.
+
+Das EUMEL-System definiert (Ausgabe-) Steuerzeichen mit ihren (ausgabesei-
+tigen) Wirkungen. Diese Steuerzeichen sind geräteunabhängig und werden vom
+EUMEL-System automatisch für die jeweiligen Geräte passend umcodiert. Bei
+Standard-Geräteschnittstellen ist die Wirkung anderer Steuerzeichen nicht
+definiert. Für den Anschluß von Druckern, für Datenfernübertragung u.ä.
+können sogenannte "Transparent"-Schnittstellen verwandt werden. Bei diesen
+Schnittstellen ist die Wirkung aller Steuerzeichen undefiniert (vom ange-
+schlossenen Gerät abhängig); es wird aber garantiert, daß alle Zeichen ohne
+Code-Umsetzung direkt ausgegeben werden.
+
+
+
+Ausgabesteuerzeichen
+
+Wert | Bezeichnung | Wirkung
+------+--------------+-----------------------------------------
+ 0 | NUL | keine Wirkung, Füllzeichen
+ 1 | HOME | Cursor auf linke obere Ecke des Bildschirms
+ 2 | RECHTS | Cursor eine Stelle nach rechts
+ 3 | OBEN | Cursor eine Zeile nach oben
+ 4 | CL EOP | Löschen von Cursor-Position bis Bildschirmende
+ 5 | CL EOL | Löschen von Cursor-Position bis Zeilenende
+ 6 | CPOS | Cursor positionieren, nächstes Ausgabezeichen be-
+ | | stimmt die y-Position (0 <= code (y) <= 23), darauf-
+ | | folgendes Ausgabezeichen die x-Position
+ | | (0 <= code (x) <= 78).
+ 7 | BELL | akustisches Signal
+ 8 | LINKS | Cursor eine Stelle nach links
+10 | UNTEN | Cursor eine Zeile nach unten bzw. 'roll up', falls
+ | | der Cursor schon in der letzten Zeile stand
+13 | RETURN | Cursor an den Anfang der aktuellen Zeile
+14 | ENDMARK | Ende des zu markierenden Bereichs
+15 | BEGINMARK | Anfang des zu markierenden Bereichs
+
+
+
+Eingabe-Steuertasten
+
+Für die Eingabeseite sind im EUMEL ebenfalls Steuertasten definiert. Diese
+Tasten sollten am angeschlossenen Gerät vorhanden sein oder bereitgestellt
+werden (z.B. durch Überkleben von Tasten) oder müssen mit Hilfe der
+CONTROL-Taste simuliert werden. Das EUMEL-System führt entsprechend der
+folgenden Tabelle evtl. notwendige Umcodierungen der Eingabe durch. Weitere
+vorhandene Spezialtasten erzeugen gerätespezifische Codes. Bei der "Transpa-
+rent"-Schnittstelle werden - symmetrisch zur Ausgabeseite - alle hereinkom-
+menden Zeichen ohne Code-Umsetzung weitergereicht.
+
+Wert | Bezeichnung
+------+------------
+ 1 | HOP
+ 2 | RECHTS
+ 3 | OBEN
+ 8 | LINKS
+ 9 | TAB
+10 | UNTEN
+11 | RUBIN
+12 | RUBOUT
+13 | RETURN
+16 | MARK
+27 | ESC
+
+
+
+6. Der Editor als Unterprogramm
+
+Um eine Anpassung der Benutzerschnittstelle an spezielle Bedürfnisse vor-
+nehmen zu können, werden einige noch nicht erläuterte ELAN-Prozeduren zur
+Verfügung gestellt. Mit diesen kann für jede Anwendung ein Spezialprogramm
+zur Verfügung gestellt werden, das den Editor als Unterprogramm aufruft. Für
+den "normalen" Editor-Benutzer ist dieses Kapitel somit nicht weiter von
+Interesse.
+
+
+
+Tastenverwaltung
+
+kommando auf taste legen
+ PROC kommando auf taste legen (TEXT CONST taste, elan programm)
+ Zweck: Belegt die Taste 'taste' mit dem ELAN-Programm 'elan programm'.
+ Beispiel:
+
+ kommando auf taste legen
+ ("v", "edit (""meine datei"")")
+
+ belegt die Taste 'v' mit der 'edit'-Prozedur.
+
+kommando auf taste
+ TEXT PROC kommando auf taste (TEXT CONST taste)
+ Zweck: Liefert den Quelltext des auf die Taste 'taste' gelegten ELAN-Pro-
+ gramms oder niltext, wenn diese nicht entsprechend belegt ist.
+
+lernsequenz auf taste legen
+ PROC lernsequenz auf taste legen (TEXT CONST taste, lernsequenz)
+ Zweck: Belegt die Taste 'taste' mit den Zeichen 'lernsequenz'. Beispiel:
+
+ lernsequenz auf taste legen ("a", ""217"")
+
+ belegt die Taste 'a' mit dem 'ä'.
+
+lernsequenz auf taste
+ TEXT PROC lernsequenz auf taste (TEXT CONST taste)
+ Zweck: Liefert die auf 'taste' gelegte Tastenanschlagsfolge
+ oder niltext, wenn diese nicht entsprechend belegt ist.
+
+taste enthaelt kommando
+ BOOL PROC taste enthaelt kommando (TEXT CONST taste)
+ Zweck: Liefert TRUE, wenn 'taste' mit einem ELAN-Programm belegt ist.
+
+std tastenbelegung
+ PROC std tastenbelegung
+ Zweck: Belegt die Tasten mit der Standardbelegung.
+
+
+
+Aufruf des Editors, Zeilen- und Fenstereditors
+
+edit
+ PROC edit
+ Zweck: a) Im Monitor:
+ Ruft den Editor mit den zuletzt verwandten Dateinamen auf.
+ b) Im Editor:
+ Der Dateiname wird erfragt.
+ Für jedes 'edit' gilt:
+ Wurde der 'edit' zum ersten mal aufgerufen, nimmt das Fenster
+ den gesamten Bildschirm ein. Bei erneuten 'edit'-Aufruf wird
+ ein Fenster nach rechts unten ab aktuellen Cursor-Punkt eröffnet.
+
+ PROC edit (TEXT CONST datei)
+ Zweck: Ruft den Editor mit 'datei' auf.
+
+ PROC edit (TEXT CONST datei, x, y, xsize, ysize)
+ Zweck: Wie obiger 'edit'-Aufruf, jedoch kann das Fenster, in der 'datei'
+ editierbar ist, gesetzt werden. Die Parameter definieren ein
+ Editor-Fenster mit der linken oberen Ecke auf den Bildschirmkoor-
+ dinaten 'x' und 'y' und einer Zeilenbreite 'xsize' und 'ysize'
+ Zeilen. Wird der Editor mit 'edit ("datei")' aufgerufen, wird
+ implizit 'edit ("datei", 1, 1, 79, 24)' aufgerufen.
+
+ PROC edit (FILE VAR f)
+ Zweck: Vergl. obige 'edit'-Prozedur.
+
+ PROC edit (THESAURUS CONST t)
+ Zweck: Editieren aller in dem Thesaurus 't' enthaltenen Dateien nachein-
+ ander. Beispiel:
+
+ edit (ALL myself)
+
+ PROC edit (FILE VAR f, INT CONST x, y, xsize, ysize)
+ Zweck: Vergl. obige 'edit'-Prozedur.
+
+editget
+ PROC editget (TEXT VAR editsatz)
+ Zweck: Eingabe mit Editiermöglichkeit von 'editsatz' vom Terminal an der
+ aktuellen Bildschirmposition. 'editsatz' wird ausgegeben. Die
+ Eingabe wird mit RETURN beendet. Im Gegensatz zu 'get' ist hier
+ auch eine leere Eingabe (RETURN) erlaubt.
+
+ PROC editget (TEXT VAR editsatz, INT CONST editlimit, editlaenge,
+ TEXT CONST sep, res, TEXT VAR exit char)
+ Zweck: Wie oben. Dabei bedeuten:
+
+ editsatz: TEXT, der zum Editieren ausgegeben wird.
+ editlimit: Einstellung des 'limit's der Zeile (max. Anzahl von Zeichen).
+ Bei obiger 'editget'-Prozedur wird 'editlimit' mit
+ 'maxtextlength' aufgerufen.
+ editlaenge: Breite des Zeilenfensters, bevor gerollt wird (bei leerer
+ Zeile ist dies 77).
+ sep: Zeichen, bei denen die Eingabe (zusätzlich zu RETURN)
+ beendet werden soll.
+ res: Angabe von reservierten Tasten. Wird einer dieser Tasten mit
+ ESC betätigt, wird die Eingabe beendet. In
+ exit char: steht dann ESC und das Zeichen, mit dem der Editor verlassen
+ wurde.
+
+ PROC editget (TEXT VAR editsatz, INT CONST editlimit,
+ TEXT VAR exit char)
+ Zweck: Siehe oben.
+
+ PROC editget (TEXT VAR editsatz, TEXT CONST sep, res,
+ TEXT VAR exit char)
+ Zweck: Siehe oben.
+
+show
+ PROC show (FILE VAR f)
+ Zweck: Zeigt eine Datei 'f' auf dem Bildschirm. Wie beim Editor kann mit
+ Hilfe der Positionierungstasten UNTEN bzw. OBEN oder HOP UNTEN bzw.
+ HOP OBEN oder HOP RETURN "geblättert" werden. Die Datei 'f' muß
+ deshalb mit der Verarbeitungsart 'modify' assoziiert worden sein.
+ Soll die Prozedur 'show' verlassen werden, müssen - wie beim Editor
+ - die zwei Tasten ESC und q betätigt werden. Die Datei kann nicht
+ schreibend verändert werden.
+
+ PROC show (TEXT CONST filename)
+ Zweck: Wie obige Prozedur.
+
+
+
+Zeichen verarbeiten
+
+getchar
+ PROC getchar (TEXT VAR zeichen)
+ Zweck: Holt das nächste Eingabezeichen von der Tastatur.
+
+is incharety
+ BOOL PROC is incharety (TEXT CONST zeichen)
+ Zweck: Ist das nächste Eingabezeichen der Tastatur 'zeichen', liefert
+ 'is incharety' TRUE. In diesem Fall wird 'zeichen' von der Eingabe
+ verschluckt. Ist das nächste Zeichen von der Tastatur nicht 'zei-
+ chen', liefert 'is incharety' FALSE. Die Eingabe bleibt unver-
+ ändert.
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil4 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil4
new file mode 100644
index 0000000..ecca7e6
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil4
@@ -0,0 +1,2306 @@
+ EUMEL-Benutzerhandbuch
+
+ TEIL 4: Textkosmetik und Druck
+
+TEIL 4: Textkosmetik und Druck
+
+
+Vorwort
+
+Die Textkosmetik-Programme des EUMEL-Systems bieten eine einfach zu er-
+lernende und zu bedienende Möglichkeit, Texte für den endgültigen Druck zu
+gestalten (Programmtechnisch: #ib#formatieren#ie#). Die Textkosmetik ermög-
+licht zusätzlich, Texte in einer Art und Weise zu manipulieren, die auf
+preiswerten Terminals zur Zeit nicht darstellbar ist, wie z.B. verschieden-
+artige Schriften. "Nebenbei" erledigt die Textkosmetik aufwendige Routine-
+arbeiten, wie z.B. Seitennumerierung und die Plazierung von Fußnoten.
+
+Die Textkosmetik-Programme bearbeiten Dateien, die durch den EUMEL-Editor
+erstellt wurden. Darum sollte man sich zuerst mit dem EUMEL-Editor vertraut
+machen.
+
+Für die meisten Aufgaben ist kein Benutzereingriff erforderlich, darum sind
+die Programme so konstruiert, daß sie durch in den Text eingefügte Anweisun-
+gen gesteuert werden. Einige Arbeiten erfordern den Benutzereingriff, wie
+z.B. die Kontrolle von Silbentrennungen bei fremdsprachigen Texten und die
+Plazierungen von Seitenenden. Diese Arbeiten werden auf einfache Weise
+interaktiv vorgenommen. Die Form der Anweisung ist für die Textkosmetik und
+den EUMEL-Drucker gleich und entspricht der ELAN-Syntax. Man beachte den
+Unterschied zwischen einem Kommando und einer Text-Anweisung: während ein
+Kommando direkt ausgeführt wird, wird eine im Text eingebettete Text-Anwei-
+sung (im weiteren kurz "#ib#Anweisung#ie#" genannt) erst nach dem Aufruf von
+Textkosmetik-und Drucker-Programmen wirksam.
+
+Die Wirkungsweise der Textkosmetik-Anweisungen ist leicht zu erlernen und
+kann vor allen Dingen stufenweise erfolgen. Deshalb ein guter Rat für An-
+fänger: Lesen Sie diesen Teil des Benutzer-Handbuchs erst oberflächlich, so
+daß Sie ungefähr Bescheid wissen, welche Möglichkeiten die Textkosmetik-Pro-
+gramme bieten. Dann können Sie diejenigen Teile der Textkosmetik auswählen
+und bei Bedarf anwenden, die sie für Ihre spezielle Anwendung benötigen.
+
+Zum Schluß noch eine Warnung: Die Regeln, Konventionen und Wirkungsweisen
+des EUMEL-Systems und der Textkosmetik-Programme muß ein Nutzer beherrschen,
+will er das System gut nutzen. Der Lernaufwand erfordert etwas Zeit und Mühe,
+der aber bei der Benutzung einer jeden Maschine erforderlich ist. Soll nur
+ein kurzer Brief geschrieben werden, ist man mit einer Schreibmaschine
+besser bedient. Beherrscht man dagegen die Benutzung des EUMEL-Systems
+einigermaßen, so kann auch die Erstellung eines kurzen Briefes schneller
+erfolgen als auf einer Schreibmaschine.
+
+
+
+1. Einführung in die Benutzung der Textkosmetik
+
+In diesem Kapitel wird eine Übersicht über die verfügbaren Programme der
+Textkosmetik gegeben.
+
+
+
+Schreiben, Gestalten und Drucken von Texten
+
+Im EUMEL-System unterscheiden wir zwischen drei Stufen einer Textbehandlung:
+Erstellung, Gestaltung und Druck. Die Trennung in verschiedene Arbeitsstufen
+hat den Vorteil, daß man sich zu einem Zeitpunkt nur auf einen Arbeits-
+schritt konzentrieren muß.
+
+
+a) Texterstellung bzw. Textbearbeitung
+
+Das Schreiben von Texten wird mit Hilfe des Editors erledigt. In dieser Stufe
+der Texterstellung kann ein Benutzer sich ausschließlich auf das Schreiben
+und die inhaltliche Korrektheit seines Textes konzentrieren. Wird ein Text
+ohne Anweisungen gedruckt, dann erscheint er so, wie er mit dem Editor ge-
+schrieben wurde. Bei der Erstellung des Textes können bereits Textkosmetik-
+Anweisungen in den Text eingefügt werden.
+
+Texte sollten im 'Fließtext'-Modus erstellt werden, d.h. Worte, die über
+Zeilengrenzen gehen würden, werden ohne Silbentrennung vom Editor in die
+nächste Zeile gebracht.
+
+
+b) Textkosmetik bzw. Textgestaltung
+
+Nachdem ein Text geschrieben wurde, kann man ihn mit Textkosmetik-Programmen
+gestalten, ohne ihn inhaltlich zu verändern. Dies kann auch vor oder nach
+eventuellen Korrekturen erfolgen. Die Textkosmetik bietet zur Zeit drei
+Programme an, die je nach Bedarf eingesetzt werden können:
+
+I) 'autoform/lineform' formatiert einen Text zeilenweise und vollzieht
+ eine Silbentrennung. Weiterhin erlaubt 'autoform/lineform' die Verwen-
+ dung unterschiedlicher Schrifttypen und Schrifthöhen.
+
+II) 'pageform' gestattet die Formatierung eines Textes in Seiten (drucktech-
+ nisch: "Paginieren"). Es ist mit 'pageform' u.a. möglich, die Seiten-
+ einteilung zu bestimmen, eine Seite in Spalten zu formatiern ("Zeitungs-
+ format"), Zeilen am Anfang bzw. Ende jeder Seite einfügen zu lassen,
+ eine Seitennummerierung zu erhalten und Fußnoten zu gestalten.
+
+III) 'index' erlaubt die Erstellung von Stichwort- und Inhaltsverzeichnissen.
+
+
+c) Drucken
+
+Zu jedem Zeitpunkt der Textbehandlung kann gedruckt werden. Um Drucker mit
+unterschiedlichen Eigenschaften betreiben zu können, wurde der (Fachausdruck:
+"virtuelle") EUMEL-Drucker als Schnittstelle zwischen dem EUMEL-System und
+(echten) Druckern geschaffen. Der EUMEL-Drucker beachtet die gleichen An-
+weisungen wie die Textkosmetik-Programme und noch einige zusätzliche, die
+nur für die Druckaufbereitung notwendig sind. Spezielle Druckleistungen, wie
+z.B. verschiedenartige Schrifttypen, können nur auf besonderen Druckern er-
+zeugt werden. Verfügt ein Drucker nicht über eine bestimmte Hardware-Eigen-
+schaft, wird die vom Benutzer geforderte Leistung ignoriert. Somit ist es
+möglich, Probedrucke für Korrekturen auch auf preiswerten Druckern herzu-
+stellen.
+
+Merke: Der EUMEL-Editor übernimmt die Texterstellung; 'lineform' formatiert
+zeilenweise; 'pageform' formatiert seitenweise; 'index' erstellt Stich- und
+Inhaltsverzeichnisse; der EUMEL-Drucker ist eine Software-Anpassung an
+unterschiedliche Ausgabe-Geräte.
+
+
+
+Anweisungen für die Textkosmetik und den Drucker
+
+In diesem Abschnitt wird beschrieben, wie Anweisungen für die Textkosmetik-
+Programme in einen Text eingefügt werden.
+
+Die Ausführung von 'lineform', 'pageform', 'index' und EUMEL-Drucker wird
+mit Hilfe von Anweisungen gesteuert, die man in den Text an geeigneter
+Stelle einfügt. Anweisungen haben die Form
+
+ #kommando#
+
+Beachte, daß jede Anweisung von #-Zeichen eingeschlossen sein muß, damit
+die Anweisung vom eigentlichen Text unterschieden werden kann. Beispiele:
+
+ #page# (* aber auch z.B.: # page # *)
+ #free (3.0)#
+ #type ("elitedeutsch")#
+
+Das "#"-Zeichen darf nur für Anweisungen verwandt werden, also sonst nicht
+im Text vorkommen. (Wird das "#"-Zeichen benötigt, muß das Zeichen mit ESC #
+geschrieben werden. Vergl. auch die Tastenbelegung in der Editor-Beschrei-
+bung).
+
+Die von '#'-Zeichen eingeschlossenen Anweisungen sind so konstruiert, daß
+sie - wie alle anderen Kommandos im EUMEL-System auch - der ELAN-Syntax
+entsprechen (u.a. müssen sie klein geschrieben werden; Parameter in runden
+Klammern; mehrere Parameter werden durch Kommata getrennt; TEXT-Parameter
+in Anführungsstrichen; REAL-Parameter mit Dezimalpunkt usw.). Leerzeichen
+spielen (außer in TEXT-Parametern) keine Rolle und können zur besseren Les-
+barkeit beliebig verwandt werden.
+
+Man beachte den Unterschied zwischen einer Anweisung und einem Kommando:
+während es nur eine beschränkte Anzahl von Anweisungen gibt, die nur von den
+Textkosmetik-Programmen ausgeführt werden (also sonst nicht in Programmen
+oder Monitor benutzt werden können), kann ein Benutzer ein Kommando in der
+Regel in einem Programm, im Editor oder im Monitor verwenden. Hinzu kommt,
+daß neben dem vom EUMEL-System zur Verfügung gestellten Kommandos in der
+Regel noch installationsspezifische und/oder benutzereigene Kommandos gibt.
+
+Anweisungen dürfen im allgemeinen überall auf einer Zeile stehen (wie z.B.
+in der nächsten Zeile). #on("underline")#Ausnahmen#off("underline")# werden
+bei der Beschreibung der Anweisungen speziell erwähnt. Alle Anweisungen
+werden zum frühest möglichen Zeitpunkt ausgeführt, haben also u.U. bereits
+Auswirkungen auf die Zeile, in der sie stehen.
+
+Die Zeichen, aus denen eine Anweisung besteht, werden bei der Formatierung
+einer Zeile oder Seite nicht mitgezählt und vom EUMEL-Drucker nicht gedruckt.
+Eine Zeile, die nur aus Anweisungen besteht, wird ebenso behandelt.
+
+Merke: Anweisungen steuern die Verarbeitung der Textkosmetik-Programme. Sie
+müssen in '#'-Zeichen eingeschlossen sein und dürfen in der Regel überall
+auf einer Zeile stehen. Sie werden an der Stelle ausgeführt, an der sie
+stehen.
+
+
+
+Aufruf der Textkosmetik-Programme
+
+In diesem Abschnitt wird beschrieben, wie die Textkosmetik-Programme
+aktiviert werden.
+
+Die Textkosmetik-Programme werden durch Kommandos aktiviert (d.h. in der
+'gib kommando:'-Ebene). Die Aktivierung (Fachausdruck: "Aufruf") erfolgt -
+ebenso wie beim Editor - durch den Namen des Programms und die Angabe
+der Datei. Beispiele:
+
+ autoform ("meine datei")
+ lineform ("text1");
+ pageform ("1. Kapitel")
+ index ("Buch.p")
+
+Das Programm 'pageform' erzeugt aus der Eingabedatei eine Druckdatei, die
+entsprechend umgeformt wird (Fußnoten werden an die richtige Stelle plaziert,
+Seitenummern eingesetzt u.a.m.). Diese Druckdatei bekommt den Namen der
+angegebenen Eingabedatei mit dem Zusatz '.p'. Beispiel: 'pageform ("text")'
+erzeugt eine Datei 'text.p'. Es ist auch erlaubt, 'pageform' durch die Angabe
+eines zweiten Parameters mitzuteilen, wie die Druckdatei heißen soll:
+
+ pageform ("mein text", "erste Druckdatei")
+
+Ähnlich verhält es sich mit dem Programm 'index', welches bis zu 9 Stichwort-
+bzw. Inhaltsverzeichnisse erstellen kann. Da in den Verzeichnissen die
+Seitennummern aufgeführt werden, kann 'index' nur Druckdateien bearbeiten.
+Beispiel:
+
+ index ("handbuch.p")
+
+Das Programm 'index' erstellt die angeforderten Verzeichnisse in Dateien,
+die mit dem Zusatz '.i<nummer>' gekennzeichnet werden. Beispiele (für den
+obigen Aufruf):
+
+ 'Handbuch.i1', 'Handbuch.i2'
+
+usw..
+
+Merke: Die Textkosmetik-Programme werden durch Kommandos aufgerufen mit der
+Angabe der Dateinamen als Parameter.
+
+
+
+Vorzeitiger Abbruch und Fehlermeldungen
+
+Alle Textkosmetik-Programme können vorzeitig vom Benutzer abgebrochen werden.
+Eventuelle Fehlermeldungen werden durch den Paralleleditor angezeigt.
+
+Durch die Taste SV und das Supervisor-Kommando 'halt' können die Textkosme-
+tik-Programme jederzeit vorzeitig abgebrochen werden. Die Eingabedatei steht
+dann unverändert zur Verfügung. Ein vorzeitiger Abbruch kann notwendig sein,
+wenn ein Programm mit einer falschen Datei aufgerufen wurde oder zu viele
+Fehler gemeldet wurden.
+
+Alle Textkosmetik-Programme melden Fehler, wenn eine oder mehrere Anweisun-
+gen falsch benutzt werden. Die Fehlermeldungen werden auf dem Bildschirm
+angezeigt. Bei Beendigung eines Programms wird - falls Fehler entdeckt
+wurden - die Fehlermeldungen im oberen Fenster des Paralleleditors angezeigt,
+während im unteren Fenster die Eingabedatei zur Korrektur angeboten wird.
+
+Merke: Vorzeitiger Abbruch eines Programms durch SV und 'halt'. (Die Eingabe-
+datei steht unverändert zur Verfügung.) Fehlermeldungen werden im Parallel-
+editor angezeigt.
+
+
+
+2. Zeilenweises formatieren: 'autoform/lineform'
+
+Die Programme 'autoform' oder 'lineform' formatieren einen Text zeilenweise
+(ggf. mit Silbentrennung), unter Berücksichtigung von Schrifttyp und Zeilen-
+breite.
+
+
+
+Eine Datei formatieren: 'autoform/lineform'-Kommando
+
+Die Programme 'lineform/autoform' werden unter Angabe der Datei aufgerufen.
+Beispiel:
+
+ lineform ("meine datei")
+ autoform ("Brief vom 24.12.")
+
+
+
+Unterschied von 'autoform' und 'lineform'
+
+Zur Zeilenformatierung werden zwei Programme angeboten, die sich nur in der
+Art der Behandlung von Silbentrennungen unterscheiden:
+
+a) autoform:
+ Zeilenformatierung mit automatischer Silbentrennung. 'autoform' sollte
+ nur bei deutschen Texten eingesetzt werden, weil die Silbentrennung bei
+ fremdsprachigen Texten nach anderen Regeln erfolgen muß.
+
+b) lineform:
+ Zeilenformatierung mit Silbentrennung "per Hand", wobei (nach deutschen
+ Trennregeln) ein sinnvoller Trennvorschlag gemacht wird. Die Trennstelle
+ kann interaktiv soweit verschoben werden, wie das zu trennende Wort noch
+ auf die Zeile paßt.
+
+Merke: 'autoform' nimmt eine automatische Silbentrennung vor, während
+'lineform' die #ib#Silbentrennung "per Hand"#ie# erlaubt.
+
+
+
+Übersicht über 'autoform'/'lineform'
+
+'autoform'/'lineform' formatieren eine Datei zeilenweise. Dabei werden
+Zeilen möglichst vollständig aufgefüllt.
+
+'autoform'/'lineform' haben im wesentlichen vier Aufgaben:
+
+a) Auffüllen von Zeilen:
+ 'autoform'/'lineform' können besonders gut nach Korrekturen eingesetzt
+ werden, bei denen - nach Einfügungen oder Löschungen - nicht vollstän-
+ dige oder zu lange Zeilen in der Datei stehen bleiben können.
+
+b) Erstellen von Zeilen mit unterschiedlichen Schrifttypen:
+ Werden in einer Datei mehrere Schriftarten ('type'-Anweisung) verwandt,
+ berechnen 'autoform'/'lineform' nach der eingestellten Zeilenbreite die
+ Anzahl Zeichen, die auf eine Zeile passen.
+
+c) Erstellen von unterschiedlichen Zeilenlängen:
+ Manchmal ist es notwendig, die Breite von Zeilen zu verändern ('limit'-
+ Anweisung). Dies wird von 'autoform'/'lineform' berücksichtigt.
+
+d) Silbentrennung:
+ Automatische ('autoform') und interaktive Silbentrennung ('lineform').
+ Sofern notwendig, werden Silbentrennungen rückgängig gemacht.
+
+'autoform'/'lineform' beachten nur wenige Anweisungen:
+
+Anweisung Zweck
+
+ limit Zeilenbreite einstellen
+ off Schrifttyp-Modifikation ausstellen
+ on Schrifttyp-Modifikation einstellen
+ type Schrifttyp einstellen
+
+
+'autoform'/'lineform' akzeptieren als Eingabe eine Datei und verändern diese.
+Dafür wird eine (interne) Zwischendatei benötigt. Deshalb ist darauf zu
+achten, daß noch ausreichend Platz auf dem System ist, der jedoch nur
+zwischenzeitig für den Formatierungsschritt benötigt wird.
+
+'autoform'/'lineform' fragen nach ihrem Aufruf an, auf welche Zeilenbreiten
+und mit welchem Schrifttyp die Datei formatiert werden soll. Diese Informa-
+ionen werden von 'autoform'/'lineform' in Form von 'limit'- und 'type'-An-
+weisungen in der Datei vermerkt, so daß die Anfragen bei weiteren Datei-
+Bearbeitungen entfallen.
+
+Bei Zeilen, die länger als die angegebene Zeilenbreite sind, werden die-
+jenigen Worte, die über die Zeilenbreite hinausgehen, in die nächste Zeile
+umgebrochen. Kürzere Zeilen werden aus der nachfolgenden Zeile bis zur
+Zeilenbreite aufgefüllt. Worte werden jedoch nicht über Absatzgrenzen hinweg
+verschoben. Deshalb ist vor Anwendung von 'lineform' darauf zu achten, daß
+Absätze richtig markiert wurden. Fehlende Markierungen sollte man nachträg-
+lich einfügen (RETURN am Ende einer Zeile), andernfalls werden Zeilen über
+Absatzgrenzen zusammen gezogen. Dies gilt insbesondere für Tabellenzeilen.
+
+Einrückungen (Leerzeichen am Anfang einer Zeile) werden von 'autoform'/'line-
+form' ebenfalls bei der Formatierung von Zeilen eingehalten.
+Dabei behandelt die Prozedur 'autoform'/'lineform' Einrückungen in einem
+speziellen Fall nicht so, wie ein Benutzer es erwarten würde. Bei ein-
+zeiligen Absätzen wird - falls die Zeile länger als das eingestellte Limit
+ist und der "überschüssige" Teil in eine neue Zeile umgebrochen werden muß
+- die Einrückung der aktuellen Zeile beibehalten. Das ist meist das
+"richtige" Verhalten, während es bei Aufzählungen falsch ist, weil die
+zweite Zeile einer Aufzählung oft eingerückt wird. Beispiel:
+
+ - Diese Zeile war zu lang und wurde unter
+ das "-"-Zeichen umgebrochen.
+
+Man sollte daher - nach Verarbeitungsende - die Datei nach solchen Fällen
+durchsuchen.
+
+Merke: 'autoform'/'lineform' vervollständigen zu kurze Zeilen oder brechen
+zu lange Zeilen um. Dabei werden Absätze beachtet.
+
+
+
+Interaktive Silbentrennung mit 'lineform'
+
+'lineform' trennt Silben interaktiv. 'lineform' sollte deshalb für fremd-
+sprachige Texte angewandt werden.
+
+Paßt ein Wort nicht mehr ganz auf eine Zeile, dann wird dieses Wort inter-
+aktiv zur Trennung angeboten. Die Umgebung dieses Wortes wird zur Er-
+leichterung des Trennvorgangs mit angezeigt. Das Trennzeichen erscheint an
+einer sinnvollen Stelle im zu trennenden Wort. Beispiel:
+
+ Text vor dem Trennwort; das
+ Trenn-wort steht mit nachfolgendem Text in dieser Zeile
+
+Der Benutzer hat die Möglichkeit, das Trennzeichen mit Hilfe der Positionie-
+rungstasten innerhalb des "Trennbereichs" (das ist der markierte Bereich, der
+noch auf die Zeile passen würde), zu verschieben. An der gewünschten Trenn-
+position (der Wortteil, der noch auf die Zeile kommen soll, steht links vom
+Trennstrich) kann die RETURN-Taste betätigt werden. RETURN zeigt dem Pro-
+gramm 'lineform' an, daß an dieser Stelle die Trennung erfolgen soll. 'line-
+form' fügt an den ersten Teil des Wortes das "-"-Zeichen an und schreibt den
+abgetrennten Wortteil in die nächste Zeile.
+Hinweis: Das Trennzeichen "-" hat einen anderen Code als der "normale"
+Bindestrich (vergl. dazu die Codetabelle), da Trennungen ggf. bei erneuten
+Änderungen wieder rückgängig gemacht werden müssen.
+
+Es stehen folgende Operationen bei der interaktiven Trennung zur Verfügung:
+
+ Taste Bedeutung
+
+ RETURN Trennen.
+ LINKS Trennstelle um ein Zeichen nach links verschieben.
+ RECHTS Trennstelle um ein Zeichen nach rechts verschieben.
+ HOP LINKS Trennstelle vor das Wort setzen (das Wort wird an dieser
+ Position nicht getrennt).
+ HOP RECHTS Trennstelle in die ursprüngliche Position setzen.
+ BLANK Trennzeichen wird von "-" auf " " umgeschaltet.
+ Dies kann verwandt werden, um Worte, die nicht zusammen
+ geschrieben werden sollen, beim Trennvorgang in zwei
+ Worte aufzuspalten.
+ - Schaltet das Trennzeichen von Leerzeichen (" ") wieder auf
+ den Trennstrich ("-") um.
+
+Zwei Sonderbedingungen sind bei der interaktiven Trennung noch zu beachten:
+
+ - Bei Worten mit Bindestrich wird die Trennstelle hinter dem Bindestrich als
+ Leerzeichen angezeigt. Die Trennstelle vor dem Bindestrich wird bei
+ weiterem Positionieren nach links übersprungen. Das verhindert, daß Worte
+ mit führendem Bindestrich im Text erscheinen.
+
+ - Bei einer Trennposition zwischen den Zeichen "ck" wird das Zeichen "c" in
+ ein "k" umgewandelt. Beispiel:
+
+ Druk-ker
+Hinweis: Das umgewandelte "k" hat einen anderen Code als das "normale"
+"k" (vergl. dazu die Codetabelle). Das ist notwendig, um bei späteren
+Änderungen solche Trennungen wieder rückgängig machen zu können.
+
+Sofern für die Zeilenformatierung notwendig, macht die Prozedur 'lineform'
+bereits erfolgte Trennungen rückgängig (das Trennzeichen wird entfernt und
+die Wortteile wieder zusammengefügt), wenn sich das getrennte Wort nicht mehr
+am Zeilenende (etwa durch Korrekturen oder Veränderungen der Zeilenbreite)
+befinden sollte.
+
+Merke: 'lineform' bietet Worte zur Silbentrennung an. Die "Trennstelle" kann
+durch den Nutzer verschoben werden.
+
+
+
+Automatische Silbentrennung mit 'autoform'
+
+'autoform' arbeitet wie 'lineform', nur werden die Silbentrennungen auto-
+matisch vorgenommen.
+
+Ist eine Silbentrennung bei der Formatierung notwendig, übernimmt 'autoform'
+diese automatisch und gibt diese zur Kontrolle auf dem Bildschirm aus. Die
+automatische Silbentrennung arbeitet mit einer hohen Trenngüte; allerdings
+nur für deutsche Texte. Trotzdem kann es vorkommen, daß einige Trennungen
+(insbesondere bei Fremdworten) falsch vorgenommen werden. In diesem Fall
+muß man diese nachträglich mit dem Editor korrigieren. Dabei sollte man das
+oben erwähnte Trennzeichen verwenden (ESC -).
+
+
+Wenige oder viele Silbentrennungen: Trennpunkt einstellen
+
+Viele Silbentrennungen in einem Text erschweren das Lesen. Würde man nun
+keine Silbentrennungen vornehmen, wird der rechte Rand stark "ausgefranst"
+oder beim Blocksatz ("rechter Randausgleich") müssen viele Zwischenräume
+zwischen den Worten eingefügt werden. Durch das Kommando
+
+ hyphenation width (prozentuale angabe)
+
+kann der Trennpunkt, ab dem die Silbentrennung einsetzen soll, eingestellt
+werden. Die Angabe erfolgt in Prozenten der Zeilenbreite. Beispielsweise
+stellt 'hyphenation width (5)' den Trennpunkt auf 5% der Zeilenbreite ein
+(Voreingestellt ist 7). Bei einer Angabe von 20 werden sehr wenige Worte zur
+Silbentrennung angeboten, während bei einer Angabe von '3' ungefähr jede
+dritte Zeile eine Silbentrennung versucht wird. Die Einstellung des Trenn-
+punktes bestimmt also, ab wann ein Wort zur Silbentrennung untersucht wird.
+Andererseits bestimmt die Einstellung auch, wieviel Zwischenraum zwischen
+Worten eingefügt werden muß, um einen rechten Randausgleich zu erzielen.
+
+Merke: 'hyphenation width' bestimmt, an welchem Punkt Worte zur Silbentren-
+nung angeboten werden.
+
+
+Mit unterschiedlichen Schriften schreiben: 'type'
+
+Unterschiedliche Schrifttypen#ie# werden mit der 'type'-Anweisung ange-
+fordert.
+
+Es ist möglich, mit 'lineform' verschiedenartige Schrifttypen (kurz Typen
+genannt) verarbeiten zu lassen. Jeder Typ hat - neben dem speziellen Aus-
+sehen der Zeichen - die Eigenschaft, daß jedes Zeichen eine bestimmte Breite
+und Höhe hat.
+
+Es gibt zwei Arten von Schriften: bei äquidistanten Schriften sind alle
+Zeichen gleich breit (wie bei einer "normalen" Schreibmaschine). Proportio-
+nalschrift findet man in gedruckten Büchern. Hier haben unterschiedliche
+Zeichen auch unterschiedliche Breiten. Die Zeichen ".", "i", "!" sind z.B.
+schmaler als die Zeichen "w", "o", "m" usw.
+
+Mit der Anweisung
+
+ type ("schriftname")
+
+kann auf einen anderen Schrifttyp umgeschaltet werden (auch mehrmals inner-
+halb einer Zeile). Dieser Typ gilt solange, bis wieder ein neue 'type'-An-
+weisung gegeben wird. Beispiel:
+
+ \#type("basker12")\#Jetzt schreiben wir in einer Schrift. Und jetzt
+ schalten wir um auf\#type ("modern12")\# noch eine andere Schrift.
+
+Welche Schriftarten zur Verfügung stehen, hängt natürlich von dem verfügbaren
+Drucker ab. Sie können die Schrifttypen bei Ihrer EUMEL-Installation er-
+fragen.
+Schrifttypen können modifiziert gedruckt werden (vergl. dazu den nächsten Ab-
+schnitt). Durch die Angabe einer 'type'-Anweisung werden alle Modifikationen
+ausgeschaltet.
+
+Merke: Eine 'type'-Anweisung gibt einen gewünschten Schrifttyp an.
+
+
+
+Kursiv, fett, unterstrichen, revers drucken: 'on/off'
+
+Mit der 'on'- und 'off'-Anweisung ist es möglich, einen Schrifttyp zu modi-f
+izieren. Die Schrift wird zwar nicht gewechselt, aber verändert gedruckt.
+Zur Zeit ist unterstrichen, fett, kursiv und der Druck von weiß auf schwarz
+möglich (abhängig vom eingesetzten Drucker).
+
+Die 'on'/'off'-Anweisung wirkt wie ein Schalter, der die gewünschte Schrift-
+typ-Modifikation ein- bzw. ausschaltet. Beispiel:
+
+... Das EUMEL-System ermöglicht es,
+\#on("italic")\#kursiv\#off("italic")\#
+und
+\#on("underline")\#unterstrichen\#off("underline")\#
+und
+\#on("bold")\#fett\#off("bold")\#
+und
+\#on("revers")\#revers\#off("revers")\#
+zu schreiben.
+
+Die Anweisung 'on' schaltet die Modifikation ein, 'off' schaltet sie aus.
+Folgende Modifikationen sind z.Zt. implementiert:
+
+ bold (Fettdruck)
+ italic (Kursivdruck)
+ underline (Unterstreichung)
+ revers (Weiß auf Schwarz)
+
+Dabei ist folgendes zu beachten:
+
+a) Ein 'type'-Anweisung schaltet eine Modifikation immer aus.
+
+b) Eine Modifikation sollte nicht über einen Absatz gehen ('lineform' er-
+ zeugt eine Warnung). Somit ist es gewährleistet, daß das Ausschalten
+ einer Modifikation nicht vergessen wird.
+
+c) Nicht alle Drucker können die hier angegebenen Modifikationen auch
+ drucken. Bitte erkundigen Sie sich bei Ihrer Installation.
+
+d) Welche Modifikationen gleichzeitig eingeschaltet werden können, ist
+ ebenfalls druckerabhängig.
+
+Merke: Die Anweisungen 'on' und 'off' schalten eine Modifikation an- und aus.
+
+
+
+Gesperrt schreiben
+
+Wird ein Wort g e s p e r r t geschrieben, muß natürlich verhindert werden,
+daß dieses Wort beim Formatieren getrennt wird. Andere Worte, wie z.B. in
+Formeln, sollten ebenfalls zusammen auf eine Zeile geschrieben werden (z.B.
+'sin (x)').
+
+Dies kann man erreichen, indem man nicht das Leerzeichen zwischen die Zeichen
+schreibt, denn das Leerzeichen bedeutet für 'autoform'/'lineform' immer das
+Ende eines Wortes. Man nimmt stattdessen ESC blank. ESC blank erscheint auf
+dem Bildschirm zur besseren Identifizierung als Unterstreichungsstrich (oder
+invers:  ) Beim Drucken wird jedoch wieder ein Leerzeichen produziert.
+Beispiel:
+
+ g_e_s_p_e_r_r_t (auf dem Terminal)
+ g e s p e r r t (auf Papier)
+
+Wir nennen dieses Leerzeichen auch "geschütztes Leerzeichen".
+
+Merke: G e s p e r r t wird mit dem geschützten Leerzeichen geschrieben.
+
+
+
+Tabellen und Aufzählungen schreiben
+
+Aufzählungen und Tabellen werden automatisch richtig formatiert und gedruckt,
+wenn man sich an einige einfache Regeln hält.
+
+Verwendet man eine Proportionalschrift beim Tabellenschreiben, so sind die
+Spalten in der Regel unterschiedlich breit, selbst wenn eine gleiche Anzahl
+Zeichen in jeder Spalte geschrieben wird. Dies kann man durch das Schreiben
+von einem "Doppelblank" vermeiden. Beispiel:
+
+ nnnnn | zweite Spalte
+ mmmmm | steht nicht untereinander
+
+aber mit Doppelblank:
+
+ nnnn | zweite Spalte
+ mmmm | stehen jetzt untereinander
+
+Das Doppelblank dient 'lineform/autoform' und dem Drucker als Zeichen, daß
+die Positionen speziell berechnet ('lineform') und beim Druck berücksichtigt
+werden müssen. In seltenen Fällen (insbesondere beim Einsatz von Schriftypen,
+die in der Größe stark voneinander abweichen) kann es vorkommen, daß diese
+Tabellenautomatik nicht funktioniert und Spalten übereinander gedruckt
+werden. In solchen Fällen muß man die Anzahl der trennenden Doppelblanks
+erhöhen.
+
+Praktischer Tip:
+Beachte, daß für das Funktionieren der "Tabellenautomatik" bei proportionalen
+Schriften es erforderlich ist, das jede Tabellenzeile eine Absatzzeile ist.
+Man sollte diese Zeilen vor dem Druck daraufhin überprüfen oder durch 'line-
+form/autoform' die Datei bearbeiten lassen. Sollte durch die zeilenweise
+Formatierung einmal zwei Zeilen zusammengezogen sein (wegen fehlender Absatz-
+kennzeichnung), kann man diese leicht mit dem Editor wieder "auseinander-
+brechen" (zweimaliges HOP RUBIN).
+
+Ähnliches gilt bei Aufzählungen. Beispiel:
+
+ 1) Das ist die erste Aufzählung.
+ Dieser Satz wird bündig gedruckt.
+ 2) Hier auch.
+
+Auch in solchen Fällen wird der gedruckte Text in der Regel richtig einge-
+rückt. Die Aufzählungsautomatik wirkt nur nach einem Absatz und bei Propor-
+tionalschriften. Die Regeln sind etwas kompliziert, so daß sie hier nicht
+einzeln aufgeführt werden (siehe S. #topage("block")# unter dem Kommando
+'block'). Trifft man auf einen der seltenen Fälle, wo die Einrückungsautoma-
+tik nicht funktioniert, kann man immer das Doppelblank der Tabellenautomatik
+verwenden.
+
+Merke: Die Tabellen- und die Aufzählungsautomatik sorgen dafür, daß Tabellen-
+spalten und Aufzählungen bündig gedruckt werden.
+
+
+
+Zeilenbreite einstellen: 'limit'
+
+Mit der 'limit'-Anweisung kann die Zeilenbreite eingestellt werden.
+
+Die 'limit'-Anweisung gibt (in cm) an, wie breit die Zeile sein soll. Be-
+achte, daß die Angabe der Zeilenbreite nichts mit dem LIMIT-Kommando des
+Editors zu tun hat. Dieses gibt an, wieviel Zeichen einer äquidistanten
+Schrift beim Schreiben auf eine Bildschirmzeile passen sollen.
+
+Die Zeilenbreite wird zusammen mit dem Schrifttyp beim erstmaligen Aufruf von
+'autoform'/'lineform' interaktiv erfragt und als 'limit'-Anweisung (zusammen
+mit der 'type'-Anweisung) in die erste Zeile der Datei eingetragen. Es kann
+in einer Datei mehrmals verändert werden. Die Zeilenbreite gilt immer ab der
+Zeile, in der die 'limit'-Anweisung steht. Beispiel:
+
+ \#limit(10.0)\#Mit der 'limit'-Anwei­
+ sung kann man Paragraphen in einem
+ anderen Format leicht gestalten.
+ Die rechte Schreibgrenze wird durch
+ die 'limit'-Anweisung eingestellt,
+ während der linke Rand durch eine
+ entsprechende Einrückung gestaltet
+ wird. \#limit(13.5)\#
+
+Man beachte, daß als Parameter in der 'limit'-Anweisung eine Zahl mit Dezi-
+malpunkt angegeben werden muß.
+
+Die folgende Tabelle gibt sinnvolle 'limit'-Einstellungen für die am
+häufigsten verwandten Papiergrößen an:
+
+
+ Format 'limit' Verbleibender
+ (Zeilenbreite) Rand
+
+ DIN A4 16.0 cm je 2.65 cm
+
+ DIN A5 12.0 cm je 1.42 cm
+
+ DIN A4 quer 25.0 cm je 2.35 cm
+
+Merke: Die 'limit'-Anweisung stellt die Zeilenbreite in cm ein, während das
+'LIMIT'-Kommando des Editors die Zeilenbreite in Anzahl Zeichen angibt.
+
+
+
+3. Seitenweises formatieren: 'pageform'
+
+'pageform' formatiert eine Datei seitenweise, wobei Routinearbeiten, wie
+etwa die Plazierung von Fußnoten, Seitennummerierung usw. ebenfalls von
+'pageform' erledigt werden.
+
+
+
+Eine Datei in Seiten teilen: 'pageform'-Kommando
+
+Das Programm 'pageform' wird mit dem Kommando
+
+ pageform ("Buch")
+
+aufgerufen. 'pageform' erzeugt aus der Eingabedatei (hier: 'Buch') eine
+Druckdatei, deren Name durch ein angehängtes '.p' gebildet wird (in unserem
+Beispiel: 'Buch.p').
+
+
+Übersicht über die Arbeitsweise von 'pageform'
+
+'pageform' erzeugt aus einer Eingabedatei eine Druckdatei, wobei z.B. Fuß-
+noten und Seitennummern an den richtigen Stellen eingefügt werden.
+
+'pageform' akzeptiert als Eingabe eine Datei und produziert eine neue Datei,
+die "Druckdatei". Die Druckdatei besteht aus der Eingabedatei mit ggf. neu
+eingefügten Zeilen. Die eingesetzten Zeilen stammen aus 'head'-, 'bottom'
+oder 'footnote'-Anweisungen. Dadurch erhöht sich die Zeilenanzahl der Datei
+(bis zu 15%).
+
+Durch 'pageform' ist es möglich, am Anfang und am Ende jeder Seite Zeilen
+einfügen zu lassen. Solche Textzeilen aus Kopf- bzw. Fußbereichen sowie
+Zeilen aus Fußnoten werden in der Druckdatei in jede Seite an entsprechender
+Stelle eingefügt.
+
+Es ist möglich, in Kopf- oder Fußzeilen Seitennummern aufzunehmen. Diese Sei-
+tennummern werden von 'pageform' bei Seitenwechseln automatisch erhöht und
+an eine vom Benutzer gekennzeichnete Stelle eingesetzt. Fußnoten können auch
+durch Nummern gekennzeichnet werden. Querverweise sind ebenfalls möglich.
+
+'pageform' berechnet die Anzahl von Zeilen, die auf eine Seite passen sollen,
+aus den Angaben für die Seitenlänge, eingestellten Zeilenvorschub und even-
+tuelle Kopf-, Fuß- und Fußnotenzeilen. Bei der Berechnung wird von der je-
+weiligen Schrifthöhe des eingestellten Schriftyps ('type'-Anweisung) ausge-
+gangen. Dann zeigt 'pageform' das errechnete Seitenende auf dem Bildschirm
+an. Das Seitenende kann interaktiv verschoben werden, um es an eine ge-
+wünschte Stellen zu plazieren oder es können Leerzeilen eingefügt/gelöscht
+werden, um Seiten gleich lang zu machen. Zusätzlich ist es auch möglich,
+Seiten in Spalten ("Zeitungsdruck") aufzuteilen und diese interaktiv zu
+formatieren.
+
+ Anweisungs-Ãœbersicht
+
+ bottom Fußzeilen *)
+ bottomeven " *)
+ bottomodd " *)
+ columns Spaltenformatieren
+ columnsend Spalten ausschalten
+ count Zähler erhöhen und einsetzen
+ end Beendet 'head', 'bottom' und *)
+ 'foot'-Bereiche
+ foot Fußnote *)
+ free Zeilen freilassen *)
+ goalpage Seitenverweis (Ziel)
+ head Kopfzeilen *)
+ headeven " *)
+ headodd " *)
+ linefeed Zeilenabstand *)
+ page Neue Seite anfangen *)
+ pagelength Seitenlänge setzen
+ pagenr Seitennummer bzw. -zeichen
+ setcount Zähler setzen
+ topage Seitenverweis (Ursprung)
+ value Wert des Zählers einsetzen
+
+*) Diese Anweisungen dürfen nur allein oder als letztes auf einer Zeile stehen.
+
+
+Merke: 'pageform' erlaubt nicht nur eine Seitenformatierung, sondern auch
+Spaltenformatierung, Fußnoten-Plazierung, Kopf- und/oder Fußzeilen, Seiten-
+numerierung und Querverweise. 'pageform' erzeugt eine neue Datei, die
+"Druckdatei" mit dem Namen der Eingabedatei, an den ".p" angefügt wird.
+
+
+
+Seitenende interaktiv verschieben#ie# mit 'pageform'
+
+In diesem Abschnitt wird beschrieben, welche interaktiven Möglichkeiten
+'pageform' bietet, um Seiten zu gestalten.
+
+Auf dem Bildschirm wird das von 'pageform' errechnete jeweilige Seitenende
+unter Angabe der aktuellen Seitennummer angezeigt. Das Seitenende erscheint
+ungefähr in der Mitte des Bildschirmes und wird durch eine von 'pageform' ge-
+kennzeichnete Zeile markiert, die auch - nach erfolgter Seitenformatierung -
+in der Druckdatei zu sehen ist. (Der EUMEL-Drucker druckt diese Zeile nicht.)
+Beispiel:
+
+\#page\#\#--------------------- Ende Seite 1 ---\#
+
+Ãœber der Markierung erscheinen die letzten Zeilen der bereits verarbeiteten
+Seite, darunter Zeilen der nächsten Seite. Es ist nun mit Hilfe der Positio-
+nierungstasten möglich, die Markierung und damit das Seitenende nach "oben
+zu verschieben". Somit kann vermieden werden, daß logisch zusammengehörender
+Text auseinandergerissen wird und z.B. "Waisenkinder" entstehen (letzte
+Zeile eines Abschnittes kommt noch auf die neue Seite).
+
+Bei der interaktiven Seitenformatierung kann die Markierung nicht über das
+errechnete Ende einer Seite nach "unten" oder über das vorherige, bereits
+verarbeitete Seitenende nach "oben" verschoben werden. Die Markierung kann
+auch nicht in einen Fußnotenbereich plaziert werden, weil Fußnoten sinn-
+vollerweise nicht geteilt werden sollten.
+
+Entstehen Leerzeilen bei der Seitenformatierung am Anfang einer Seite (z.B.
+durch Plazierung des Seitenendes zwischen zwei Absätzen), so werden diese
+von 'pageform' automatisch aus der Druckdatei entfernt. Will man Leerzeilen
+am Anfang einer Seite#ie#, dann sollte das 'free' in Verbindung mit der
+'page'-Anweisung verwandt werden.
+
+Zusätzlich ist es möglich, Leerzeilen in eine Seite der Druckdatei einzu-
+fügen und/oder beliebige Zeilen zu löschen (vergl. b)).
+
+Folgende Operationen stehen bei der interaktiven Seitenformatierung zur
+Verfügung:
+
+a) Seitenende verschieben:
+
+'pageform' berechnet das "rechnerische" Seitenende und zeigt dieses auf dem
+Bildschirm durch die Markierung an. Die Markierung kann interaktiv verschoben
+werden:
+
+ Taste Bedeutung
+
+ RETURN Seitenende an diese Stelle plazieren.
+ OBEN Seitenende eine Zeile nach oben verschieben.
+ UNTEN Seitenende eine Zeile nach unten verschieben
+ (wenn vorher nach "oben" verschoben).
+ HOP OBEN Seitenende um einen Bildschirm nach oben verschieben.
+ HOP UNTEN Seitenende um einen Bildschirm nach unten verschieben.
+
+b) Leerzeilen einfügen und/oder Zeilen löschen
+
+Ergeben die Berechnungen von 'pageform', daß der bearbeitete Text nicht
+richtig auf der Seite plaziert ist, können in die Seite (der Druckdatei!)
+Leerzeilen eingefügt und/ oder Zeilen gelöscht werden. Dies kann beispiels-
+weise sinnvoll sein, wenn durch die Löschung einer Zeile ein Absatz noch auf
+die Seite passen würde oder durch die Einfügung von Leerzeilen ein Absatz
+auf der letzten Zeile der Seite endet. Oft ist es auch sinnvoll, daß alle
+Seiten gleich lang sind. In diesem Fall sollten vor Kapiteln und Absätzen
+Leerzeilen eingefügt oder gelöscht werden.
+
+Um Leerzeilen einzufügen und/oder Zeilen zu löschen, muß die Markierung (wie
+unter a) beschrieben) an die Stelle plaziert werden, an der die Änderung
+vorgenommen werden soll. Abschließend berechnet 'pageform' die Seite erneut.
+
+ Taste Bedeutung
+
+ HOP RUBIN Leerzeilen einfügen.
+ Anstatt der Markierung können durch (u.U. mehrmaliges)
+ RETURN Leerzeilen eingefügt werden. HOP RUBIN beendet
+ den Vorgang (wie Zeileneinfügen im Editor).
+
+ HOP RUBOUT Zeile löschen.
+ Die Zeile unmittelbar oberhalb der Markierung wird
+ gelöscht.
+
+'page'-Anweisung bestätigen/löschen
+
+Wird von der Prozedur 'pageform' eine 'page'-Anweisung angetroffen, so wird
+das so gewünschte Seitenende auf dem Bildschirm des Benutzers angezeigt. Die
+'page'-Anweisung kann entweder bestätigt oder gelöscht werden.
+
+ Taste Bedeutung
+
+ RETURN Seitenende bestätigen.
+
+ RUBOUT 'page'-Anweisung ignorieren. Die Prozedur 'pageform'
+ bearbeitet in diesem Fall die Datei weiter, als ob
+ keine 'page'-Anweisung angetroffen wurde.
+
+Merke: Ein Seitenende wird von 'pageform' auf dem Bildschirm angezeigt. Dies
+kann man mit den Positionierungstasten verschieben. Es können in die Seite
+Leerzeilen eingefügt oder Zeilen gelöscht werden. Eine 'page'-Anweisung kann
+man bestätigen oder löschen.
+
+
+
+Seitenlänge einstellen: 'pagelength'
+
+'pageform' ist auf eine Seitenlänge von 25.0 cm eingestellt (entspricht
+einem DINA4-Schreibfeld). Ist eine andere Seitenlänge erwünscht, muß die
+'pagelength'-Anweisung in den Text eingefügt werden.
+
+Beispiel:
+
+ \#pagelength (20.0)\#
+
+stellt die Seitenlänge auf 20 cm ein. Man beachte, daß der Dezimalpunkt bei
+der Seitenlänge mit angegeben werden muß.
+
+Die folgende Tabelle gibt die Seitenlänge für die am häufigsten gewählten
+Papiergrößen an:
+
+ Format Seitenlänge oberer und
+ (in cm) unterer Rand
+
+ DIN A4 25.0 je 2.35 cm
+
+ DIN A5 18.0 je 2.15 cm
+
+ DIN A4 quer 18.0 je 2.15 cm
+
+Merke: Mit der 'pagelength'-Anweisung kann die Seitenlänge (in cm) einge-
+tellt werden.
+
+
+
+Zeilenabstand einstellen: 'linefeed'
+
+Die 'linefeed'-Anweisung stellt einen Zeilenvorschub relativ zu der Schrift-
+höhe des eingestellten Schrifttyps ein.
+
+'pageform' berechnet die Anzahl Zeilen/Seite immer in Abhängigkeit vom einge-
+stellten Schrifttyp. Hat man z.B. eine Schrift gewählt, die doppelt so hoch
+wie z.B. eine Schreibmaschinenschrift ist, bekommt man auch entsprechend
+weniger Zeilen auf eine Seite. Um diesen Berechnungsvorgang braucht sich ein
+Nutzer in der Regel nicht zu kümmern.
+
+Anders verhält es sich, wenn ein anderer Zeilenvorschub als der "normale"
+Abstand zwischen Zeilen vorgenommen werden soll. In diesem Fall muß man wis-
+sen, daß die "Höhe" einer Zeile sich aus der Schrifttypgröße errechnet plus
+(ca.) 10%, welches den Abstand zwischen den Zeilen darstellt.
+
+Soll nun ein anderer Abstand eingestellt werden, wird die 'linefeed'-An-
+weisung eingesetzt. Der Parameter gibt an, um wieviel eine Zeilenhöhe erhöht
+oder verringert werden soll. Beispiel:
+
+ \#linefeed (2.0)\#
+
+Nach Antreffen dieser Anweisung wird die Zeilenhöhe durch 2 * eingestellte
+Schrifttypgröße errechnet. Es wird also der Zeilenabstand zwischen den Zeilen
+entsprechend vergrößert, da die Schriftgröße gleich bleibt. Dies entspricht
+dem zweizeiligen Schreiben bei einer Schreibmaschine (wenn man davon absieht,
+daß hier auch unterschiedliche Schrifthöhen berücksichtigt werden). Ein
+1 1/2 zeiliges Schreiben wäre mit
+
+ \#linefeed (1.5)\#
+
+einzustellen.
+
+ \#linefeed (0.5)\#
+
+stellt die Zeilenhöhe = 1/2 * eingestellte Schrifthöhe ein, so daß die Zeilen
+teilweise ineinander gedruckt werden. Bei 'linefeed (0.0)' werden Zeilen
+übereinander gedruckt (druckerabhängig).
+
+Man beachte, daß die Angabe in der 'linefeed'-Anweisung relativ erfolgt. Bei
+allen anderen Anweisungen der Textkosmetik werden Angabe in Zentimeter ver-
+langt. Die 'linefeed'-Anweisung bildet somit eine Ausnahme (von der Regel).
+
+Merke: Wieviel Zeilen auf eine Seite passen, ist von den Höhen der einge-
+stellten Schrifttypen abhängig. Diese Berechnung erfolgt automatisch durch
+'pageform'. Die 'linefeed'-Anweisung stellt einen Zeilenvorschub relativ zum
+eingestellten Schrifttyp ein.
+
+
+
+Platz freihalten: 'free'
+
+Mit der 'free'-Anweisung kann man einen zusammenhängenden Teil auf einer
+Seite freihalten.
+
+Die 'free'-Anweisung wird an solchen Stellen im Text eingesetzt, an denen -
+nach dem Druck - Zeichnungen, Tabellen und ähnliches eingeklebt werden sol-
+len. Es wird der in der 'free'-Anweisung angebene Platz freigehalten. Bei-
+spiel:
+
+\#free (2.0)\#
+hält zwei Zentimeter frei. Paßt der angeforderte Platz nicht mehr auf die
+Seite, so wird der angeforderte Platz auf der nächsten Seite reserviert
+('pageform' plaziert das Seitenende vor die 'free'-Anweisung).
+
+Merke: Die 'free'-Anweisung hält einen Platz auf dem Papier frei (Angabe in
+cm).
+
+
+
+Neue Seite beginnen: 'page'
+
+An einigen Stellen im Text, z.B. zu Beginn eines neuen Kapitels, soll unbe-
+ingt eine neue Seite angefangen werden.
+
+Dies erreicht - wie bereits erwähnt - man mit der 'page'-Anweisung. 'page-
+form' meldet im diesem Fall, nach wieviel cm auf der Seite die Anweisung an-
+getroffen wurde. Man kann nun mit RETURN das Seitenende bestätigen, oder die
+Anweisung (in der Druckdatei) löschen. Im letzteren Fall berechnet 'page-
+form' die Seite neu (als ob die 'page'-Anweisung nicht dagewesen wäre).
+
+Gleichzeitig ist es möglich, mit Hilfe der 'page'-Anweisungs eine neue Sei-
+tennummer#ie# für die neue Seite einzustellen (vergl. die nächsten Ab-
+chnitte).
+
+Merke: Die 'page'-Anweisung bewirkt eine neue Seite und muß beim Formatieren
+bestätigt werden.
+
+
+
+Kopf- und Fußzeilen: 'head/bottom'
+
+Mit den 'head'- und #ib#'bottom'-Anweisung#ie#en ist es möglich, Zeilen am
+Anfang und Ende jeder Seite einfügen zu lassen.
+
+Zeilen am Anfang ("Kopfzeilen") und Ende ("Fußzeilen") jeder Seite werden
+nur einmal geschrieben und mit Anweisungen gekennzeichnet. Diese Zeilen fügt
+'pageform' dann an den entsprechenden Stellen ein. Beispiel:
+
+\#head\#
+ Unser EUMEL-Benutzerhandbuch
+
+\#end\#
+
+Diese zwei Zeilen (also die zwischen den 'head'- und 'end'-Anweisungen ein-
+geschlossenen Zeilen) werden unverändert von 'pageform' an den Anfang jeder
+Seite in die Druckdatei plaziert. Man beachte, daß zweckmäßigerweise (minde-
+stens) eine Leerzeile nach einer solchen Kopfzeile in den 'head'-Bereich ein-
+gefügt werden sollte, um die Kopfzeile von dem eigentlichen Text der Seite zu
+trennen.
+
+Entsprechendes gilt für Fußzeilen, die zwischen 'bottom' und 'end' einge-
+chlossen werden müssen:
+
+\#bottom\#
+ Autor: I. Listig
+\#end\#
+
+Praktischer Tip: Man füge nach einer Schriftzeile mindestens eine Leerzeile
+ein (in einem 'head') bzw. vor der Schriftzeile (in einem 'bottom'), um den
+eigentlichen Text von den Kopf- bzw. Fußzeilen abzuheben.
+
+'pageform' zählt die Seiten, beginnend mit der Seitennummer '1'. (Wie man
+Seitennummern in die Kopf- und Fußzeilen bekommt, verraten wir im nächsten
+Abschnitt). Es ist nun möglich, getrennte Kopf- und Fußzeilen für gerade und
+ungerade Seiten zu gestalten (wie in diesem Benutzerhandbuch). Dies erfolgt
+mit den Anweisungen 'headeven' und 'headodd' für Seiten mit geraden und un-
+geraden Seitennummern; ('bottomeven' und 'bottomodd' dito).
+
+Diese Anweisungen müssen ebenfalls jeweils mit einer 'end'-Anweisung be-
+endet werden.
+
+Es ist möglich, Kopf- und Fußzeilen mehrmals innerhalb einer Datei zu
+wechseln, um unterschiedliche Beschriftungen zu erhalten (z.B. kapitelweise).
+Dies ist jedoch nur sinnvoll, wenn dies auf einer neuen Seite erfolgt, also
+unmittelbar nach einer 'page'-Anweisung in den Text eingefügt wird. Beispiel:
+
+ \#page\#
+ \#head\#
+ Neuer Seiten Kopf
+
+ \#end\#
+
+"Fußzeilen" sollen überall gleiches Aussehen haben, unabhängig davon, welche
+Anweisungen im restlichen Text gegeben werden. Darum werden die bei der De-
+finition einer Fußzeile aktuellen Werte für
+
+ limit
+ type
+ linefeed
+
+bei dem Einsetzen der Zeilen berücksichtigt. Es ist somit erlaubt, einen
+anderen Schrifttyp (z.B. als der restliche Text) für Fußzeilen zu verwenden,
+indem die 'type'-Anweisung innerhalb des 'bottom'-Bereiches gegeben wird.
+Beachte, daß nach 'head'-, 'bottom' und auch 'foot'-Bereiche die o.a. Kom-
+mandos nicht automatisch zurückgestellt werden. Darum sollte vor der 'end'-
+Anweisung wieder auf den im übrigen Text verwandten Schrifttyp zurückge-
+stellt werden. Gleiches gilt für die 'limit'- und 'linefeed'-Anweisung.
+Beispiel:
+
+ \#bottom\#
+ \#type ("besonders schoen")\#
+ Autor: I. Listig
+
+ (Schriftyp zurückstellen): \#type ("normal")\# \#end\#
+
+Merke: Kopf- und Fußzeilen können durch die Anweisungen 'head' bzw. 'bottom'
+oder 'headeven', 'headodd' bzw. 'bottomeven', 'bottomodd' definiert werden.
+Die Zeilen müssen jeweils durch die 'end'-Anweisung beendet werden.
+
+
+
+Seiten numerieren
+
+In den Kopf- und Fußzeilen steht das '%'-Zeichen für die aktuelle Seiten-
+nummer.
+
+Erscheint das '%'-Zeichen innerhalb eines Kopf- oder Fußbereiches, wird von
+'pageform' beim Einsetzen dieser Zeilen auf jeder Seite die aktuelle Seiten-
+nummer#ie# eingesetzt (sind mehrere '%'-Zeichen vorhanden, wird die Seiten-
+nummer mehrmals eingesetzt). Beispiel:
+
+\#head\#
+ Seite: - % -
+
+\#end\#
+
+Durch einen Fußbereich kann man die Seitennummern auch am Ende einer Seite
+haben. Man beachte, daß sich bei mehrstelligen Seitennummern durch das Ein-
+setzen die Zeilenlänge vergrößert.
+
+Manchmal ist es notwendig und sinnvoll, einen Text in mehreren Dateien zu
+halten. Bei einer Folgedatei muß die Seitennummer dann neu gesetzt werden.
+Das erfolgt mit der 'page'-Anweisung. Beispiel:
+
+\#page (4)\#
+
+vollzieht eine neue Seite. Die Seitennummer der neuen Seite ist '4'.
+
+Bei einigen Spezialanwendungen benötigt man mehr als eine Seitennummer.
+Beispielsweise soll ein Text nicht nur absolut, sondern auch jede Seite in
+jedem Kapitel separat durchgezählt werden. Eine andere Anwendung ist die
+Benennung einer Folgeseite, wie in diesem Beispiel:
+
+\#page (4711)\#
+\#head\#
+ Mein Buch Seite: %
+
+\#end\#
+\#pagenr ("$", 4712)\#
+\#bottom\#
+
+ Nächste Seite: $
+\#end\#
+
+Durch die 'pagenr'-Anweisung gibt man ein neues "Seitenzeichen" (hier: '$')
+und den Anfangwert für diese Seitennummer (hier: '4712'), der ebenfalls wie
+das '%'-Seitenzeichen von 'pageform' bei jeder neuen Seite um '1' erhöht und
+ggf. in die Kopf- und Fußzeilen eingesetzt wird. Es sind zwei zusätzliche
+Seitenzeichen (neben dem '%') möglich.
+
+Merke: In den Kopf- und Fußzeilen wird ein '%'-Zeichen von 'pageform' durch
+die aktuelle Seitennummer ersetzt. Die Seitennummer kann durch das 'page'-
+Anweisung neu gesetzt werden.
+
+
+
+Fußnoten schreiben: 'foot'
+
+Fußnoten werden direkt im Text durch die Anweisungen 'foot' und 'end' ge-
+kennzeichnet. Die Fußnoten plaziert 'pageform' an das Ende einer Seite.
+
+Fußnoten werden vom Benutzer direkt in den Text geschrieben, am besten nach
+einem Absatz. Die Fußnote wird von 'pageform' an das Ende einer Seite, ggf.
+vor Fußzeilen plaziert. Für die Kennzeichnung von Fußnoten und die ent-
+sprechende Markierung im Text ist der Benutzer selbst zuständig. Allerdings
+wird von 'pageform' bei dem Einsetzen einer Fußnote am Ende einer Seite
+Unterstreichungsstriche vor die Fußnoten eingefügt, damit Fußnoten vom
+"normalen" Text abgehoben werden.
+
+\#foot\#
+*) Das ist die erste Anmerkung auf dieser Seite.
+\#end\#
+
+Mehrere Fußnoten innerhalb einer Seite werden von 'pageform' in der Reihen-
+folge ihres Auftretens gesammelt und am Ende der Seite plaziert. Für eine
+entsprechende Trennung der Fußnoten voneinander (z.B. durch Leerzeilen) hat
+der Benutzer selbst zu sorgen.
+
+Man sollte eine Fußnote unmittelbar hinter den Absatz schreiben, in der die
+Markierung für die Fußnote erscheint, denn u.U. paßt die Fußnote nicht mehr
+auf die aktuelle Seite und muß somit von 'pageform' auf die nächste Seite
+gebracht werden. 'pageform' geht davon aus, daß die Kennzeichnung der Fuß-
+note in der Zeile unmittelbar vor der Fußnote steht und bringt diese Zeile
+ebenfalls auf die neue Seite.
+
+Merke: Fußnoten werden direkt hinter einem Absatz in den Text mittels der
+Anweisungen 'foot' und 'end' geschrieben, die 'pageform' an das Ende der
+Seite einfügt. Die Kennzeichnung der Fußnoten hat der Benutzer selbst vorzu-
+nehmen oder man kann sie mit Hilfe von 'count'- und 'value'-Anweisungen
+durchnumerieren (siehe nächsten Abschnitt).
+
+
+
+Fußnoten numerieren: Zählen lassen
+
+Bei vielen Fußnoten in einem Text ist es nicht möglich, die Fußnoten beim
+Schreiben des Textes entsprechend zu beschriften. Für diesen Fall und um auf
+die Fußnote im Text nochmals Bezug nehmen zu können, bietet 'pageform' die
+Möglichkeit an, die Fußnoten zu numerieren.
+
+Durch die 'count'-Anweisung wird 'pageform' veranlaßt, einen internen Zähler
+(beginnend bei dem Wert 0) zu erhöhen und diesen Wert anstatt der 'count'-
+Anweisungen in den Text einzusetzen. Beispiel:
+
+\#count\#
+
+setzt den Wert 1 anstatt der Anweisung ein (Anmerkung: trifft 'lineform' auf
+eine 'count'-Anweisung, so wird die Zeile berechnet, als ob drei Ziffern
+anstatt der Anweisung ständen). Jede weitere 'count'-Anweisung erhöht den
+internen Zähler und der Zählerwert wird wiederum eingesetzt:
+
+\#count\#
+
+setzt den Wert 2 ein usw. Dadurch ist es möglich, beliebige Textteile
+(Kapitel, mathematische Sätze u.a.m.) fortlaufend zu numerieren, ohne auf
+die Numerierung beim Schreiben und Ändern des Textes zu achten.
+
+Mit der 'value'-Anweisung kann man den letzten erreichten count-Wert noch-
+mals einsetzen. Das ist insbesondere für Fußnoten sinnvoll einsetzbar.
+Beispiel:
+
+ Bla Bla Bla (\#count\#)
+ \#foot\#
+ Eine Fußnote
+ \#end\#
+ ...
+
+Das Resultat würde folgendermaßen aussehen:
+
+ Bla Bla Bla (3)
+ ....
+
+ _____
+ (3) Eine Fußnote
+
+Man beachte, daß in diesem Fall die 'value'-Anweisung der 'count'-Anweisung
+folgen muß, ohne das eine weitere 'count'-Anweisung dazwischen steht. Das
+liegt - wie bereits erwähnt - daran, daß die 'value'-Anweisung immer den
+letzten 'count' Wert einsetzt.
+
+Das kann man umgehen, indem die 'count'- und 'value'-Anweisungen mit einem
+TEXT-Parameter versehen werden, der als Kennzeichnung dient. Beispiel:
+
+ \#count ("Merk1")\#
+
+arbeitet ebenso wie 'count' ohne Parameter (setzt also hier den Wert 4 ein),
+aber zusätzlich vermerkt 'pageform' den aktuellen Zählerwert neben dem Kenn-
+zeichen. Nun ist es mit der 'value'-Anweisung möglich, den vermerkten Zähler-
+wert durch Angabe des Kennzeichens an beliebigen Stellen im Text zu reprodu-
+zieren (auch wenn der interne Zähler weitergezählt wurde). Beispiel:
+
+ \#count\#\#count\#
+ \#value("Merk1")\#
+
+Die ersten zwei 'count'-Anweisungen produzieren - wie beschrieben - die
+Werte 5 bzw. 6. Die 'value'-Anweisung dagegen setzt den vermerkten Wert 4
+ein.
+
+Dies ist insbesondere sinnvoll, wenn man im Text auf eine Fußnote verweisen
+will. Beispiel:
+
+ Bla Bla. Siehe auch Anmerkung (\#value ("Waldschrat")\#). Bla
+ ...
+ ...
+ Bla Bla Bla (\#count ("Waldschrat")\#)
+ \#foot\#
+ (\#value ("Waldschrat")\#) Waldschrate kommen in vier Farben vor:
+ Rot, schwarz, grün und blau/gelb.
+ \#end\#
+
+Manchmal ist es notwendig (ebenso wie bei der Seitennummer), den internen
+Zähler neu zu setzen. Beispiel:
+
+ \#setcount (13)\#\#count ("aha!")\#
+
+produziert den Wert 13.
+
+Merke: Die 'count'-Anweisung setzt einen internen Zähler in die Druckdatei
+ein. Durch die #ib#'value'-Anweisung#ie# werden gespeicherte Werte einge-
+setzt, was man bei Fußnoten ausnutzen kann.
+
+
+
+Querverweise mit 'topage'/'goalpage'
+
+Mit den Anweisungen 'topage' und 'goalpage' sind Querverweise möglich, die
+von 'pageform' in die Druckdatei eingefügt werden.
+
+Mit Hilfe von Querverweisen soll auf andere Stellen im Text verwiesen werden,
+was nur bei längeren Texten üblich ist. Um dem Leser die mühselige Suche
+nach der Textstelle zu ersparen, gibt man in der Regel die Seitennummer an.
+Leider steht die Seitennummer vor der Fertigstellung des Textes meist noch
+nicht fest. Auch in diesem Fall kann 'pageform' helfen. Die 'topage'- An-
+weisung verweist auf eine andere Seite im Text, an der sich eine Anweisung
+'goalpage' befinden muß. Anstatt der Anweisung 'topage' wird die Seitennum-
+mer der Seite eingesetzt, auf der sich 'goalpage' befindet. Damit jedes
+'topage' auch (sein) entsprechendes 'goalpage' findet, wird bei beiden An-
+weisungen ein TEXT-Parameter angegeben. Beispiel:
+
+ Man schreibt: ... siehe auch auf Seite \#topage("verweis1")\#
+ ...
+ Auf einer anderen Seite befindet sich \#goalpage("verweis1")\#
+
+Nach 'Seite' wird die entsprechende Seitennummer eingesetzt.
+
+Es ist möglich, mehrmals auf die gleiche (Ziel-) Seite zu verweisen, man muß
+nur darauf achten, daß immer das gleiche Merkmal (TEXT-Parameter) verwandt
+wird.
+
+Merke: Mit den 'topage'- und 'goalpage'-Anweisungen sind Seitenquerverweise
+möglich. Für 'topage' wird die Seitennummer eingesetzt, auf der 'goalpage'
+steht.
+
+
+
+Formatierung von Spalten: 'columns'
+
+Mit der 'columns'-Anweisung ist es möglich, einen Text in Spalten zu forma-
+tieren ("Zeitungsdruck").
+
+Durch die Angabe der 'columns'-Anweisung wird 'pageform' aufgefordert, den
+Text in Spalten zu formatieren. Die Spaltenbreite muß der Benutzer mit der
+'limit'-Anweisung einstellen. Beispiel:
+
+ \#limit (18.0)\#
+ ...
+ \#columns (2, 2.0)\#\#limit (8.0)\#
+ ...
+
+Anfangs schreibt der Benutzer mit einer Zeilenbreite von 18 cm. Dann fordert
+er mit der 'columns'-Anweisung zweispaltigen Druck an (zwischen den Spalten
+soll 2 cm Abstand sein). Somit muß die 'limit'-Anweisung auf 8 cm einge-
+stellt werden.
+
+Die interaktive Spaltenformatierung wird von 'pageform' wie gewohnt vorgenom-
+men. Auf dem Bildschirm erscheint nun das Spaltenende, wobei die Nummer der
+Spalte angezeigt wird. Fußnoten werden spaltenweise eingeordnet und müssen
+somit die gleiche Zeilenbreite haben, wie die restlichen Spalten.
+
+'pageform' erzeugt in der Druckdatei die Spalten hintereinander. Das folgende
+Beispiel zeigt einen Ausschnitt aus der Druckdatei mit Kopf- und Fußzeilen
+bei einem zweispaltigen Druck:
+
+ head-Zeilen
+ xx
+ xx
+ xx
+ bottom-Zeilen
+ \#page\#\#------- Ende Seite 1 Spalte 1 ----\#
+ xx
+ xx
+ xx
+ \#page\#\#------- Ende Seite 1 Spalte 2 ----\#
+
+Die zweite Spalte erscheint also ohne Kopf- und Fußzeilen, die jedoch bei der
+Berechnung berücksichtigt werden. Man beachte, daß die Kopf- und Fußzeilen
+über die Spalten gehen können. Dies erreicht man durch geeignete 'limit'-
+Anweisungen in den genannten Bereichen. Hochwertige Drucker plazieren die
+zweite Spalte im Druckbild neben die erste. Bei preiswerteren Druckern muß
+man die Spalten nebeneinander kleben.
+
+Es ist zwar prinzipiell möglich, die Spalten in der Druckdatei nebeneinander
+zu schreiben. Jedoch hätte das Druckerprogramm Schwierigkeiten, diese neben-
+einander zu drucken, ohne daß z.B. ein Schrifttypwechsel in einer Spalte
+Auswirkungen auf eine Benachbarte hat. Praktischer Tip: Bei Druckern mit
+"Traktorführung" kann man erst alle ersten Spalten drucken, dann das Papier
+"von Hand" zurückdrehen und die zweiten Spalten drucken usw.
+
+Alle Anweisungen funktionieren beim spaltenweisen Formatieren wie üblich. Die
+'free'-Anweisung z.B. hält entsprechenden Platz in einer Spalte frei. Eine
+Ausnahme bildet die 'page'-Anweisung. Sie vollzieht hier ein Spaltenende. Die
+'page'-Anweisung mit einem Parameter (welcher die Seitennummer der nächsten
+Seite angibt), vollzieht dagegen ein Seitenende.
+
+Die 'columns end'-Anweisung beendet die spaltenweise Formatierung. Es ist
+zweckmäßig, unmittelbar vor der 'columns'- und hinter der 'columns end'-
+Anweisung eine 'page'-Anweisung zu schreiben.
+
+Überschriften (bzw. Textblöcke) über mehrere Spalten hinweg sind nur in der
+ersten Seite direkt hinter der 'columns'-Anweisung möglich. Beispiel:
+
+ \#page\#
+ \#limit (18.0)\#
+ HEAD
+ Breite Ãœberschrift
+ \#columns (2, ...)\#\#limit (8.0)\#
+ XX
+ XX
+ XX
+ Bottom
+ \#page\#\#------- Ende Seite 1 Spalte 1 ----\#
+ XX
+ XX
+ XX
+ \#page\#\#------- Ende Seite 1 Spalte 2 ----\#
+
+Die Zeilen für die zweispaltige Überschrift werden berücksichtigt. Dies gilt
+jedoch nur unmittelbar hinter der 'columns'-Anweisung. Will man diesen Effekt
+nochmals haben, beendet man mit 'columns end', schreibt die 'page'-Anweisung,
+die breite Ãœberschrift und schaltet die 'columns'-Anweisung wieder ein usw.
+
+Merke: Die Anweisungen 'columns'- und 'columns end' bewirken ein spalten-
+weises Formatieren des Textes durch 'pageform'. Die Spaltenbreite ('limit'-
+Anweisung) hat der Benutzer selbst einzustellen.
+
+
+
+4. Stichwortverzeichnisse erstellen: 'index'-Kommando
+
+Das Programm 'index' kann Stichwort- und Inhaltsverzeichnisse erstellen.
+Stichwortverzeichnisse#ie# können sortiert werden. Mehrere Stichwortver-
+zeichnisse können durch 'index merge' zusammengeführt werden.
+
+
+
+Übersicht über die Arbeitsweise von 'index'
+
+Durch den Aufruf von
+
+ index ("datei.p")
+
+werden durch Indexanweisungen gekennzeichnete Worte in Dateien, den soge-
+nannten Indexdateien, gespeichert.
+
+Anweisung Zweck
+
+ ib Anfang Index
+ (folgende Worte werden bis zur 'ie'-Anweisung in den
+ Index übernommen)
+ ie Ende eines Index
+
+Solche Verzeichnisse von Worten werden im EUMEL-System allgemein als Index
+bezeichnet. Nachdem eine oder mehrere Indexdateien aus einer Druckdatei
+erstellt sind, werden die Indexdateien auf Anfrage alphabetisch sortiert.
+Bei einem Inhaltsverzeichnis sollte man die Sortierung natürlich ablehnen.
+
+Nach der Sortierung werden gleiche Einträge automatisch zusammengefaßt und
+die entsprechenden Seitennummern nacheinander aufgeführt.
+
+Praktischer Tip: Will man nur eine Sortierung, aber keine Zusammenfassung
+von Einträgen, dann lehnt man die Sortieranfrage ab. Anschließend kann man
+die Indexdatei mit 'lex sort ("indexdatei namen")' sortieren. Hierbei
+bleiben gleiche Einträge erhalten.
+
+Das Programm
+
+ index merge ("index.i1", "index.i2")
+
+erlaubt es, zwei durch 'index' erzeugte Verzeichnisse zusammenzuführen.
+'index' kann ebenfalls benutzt werden, um ein Inhaltsverzeichnis und/oder
+ein Verzeichnis aller Abbildungen zu erstellen oder Literaturhinweise zu
+überprüfen.
+
+Die Worte, die durch 'index' in einen Index übernommen werden sollen, müssen
+in der Eingabedatei (der Druckdatei aus 'pageform') für 'index' durch An-
+weisungen gekennzeichnet werden. Die Form der Anweisungen entspricht der
+ELAN-Syntax (analog den Anweisungen für 'lineform', 'pageform' und EUMEL-
+Drucker). Solche #ib(1,"ff")#Indexanweisungen#ie# werden von den anderen
+Textbe- und -verarbeitungs Programmen ('lineform', 'pageform', EUMEL-
+Drucker) ignoriert. Man kann also bei dem Schreiben mit dem Editor gleich
+festlegen, welche Worte in einen Index aufgenommen werden sollen.
+
+
+
+Worte kennzeichnen: 'ib'/'ie'
+
+Da in einem Index - neben dem eigentlichen Worteintrag - die Seitennummer
+enthalten sein soll, arbeitet das Programm 'index' nur mit einer Druckdatei,
+d.h. einer Ausgabedatei von 'pageform'. Die Indexworte werden in Indexda-
+teien gesammelt. Die Indexdateien erhalten den Namen der zu bearbeitenden
+Datei, an den ".i" und die Nummer des Index angefügt wird. Beispiel:
+
+ ... Hier wird eine Eigenschaft des \#ib(1)\#EUMEL-Systems\#ie(1)\# beschrieben.
+
+(Die durch die Anweisungen 'ib' und 'ie' gekennzeichneten Worte werden mit
+der dazugehörigen Seitennummer in die erste Indexdatei geschrieben.)
+
+Die Einträge in einer Indexdatei werden von den Seitennummern durch min-
+destens drei Punkte getrennt.
+
+Werden diese nicht gewünscht, kann man sie leicht mit dem Editor entfernen.
+Beachte, daß man nur bei einer äquidistanten Schrift ein rechtsbündiges
+Verzeichnis erhalten kann.
+
+Es gibt die Möglichkeit, bis zu neun unterschiedliche Indexdateien zu er-
+stellen, z.B. durch
+
+ \#ib (1)\# und \#ie (1)\#
+
+gekennzeichnete Worte gehen in die Indexdatei mit der Nummer 1, durch
+
+ \#ib (9)\# und \#ie (9)\#
+
+gekennzeichnete Worte gehen in die Indexdatei mit der Nummer 9. Als Erleich-
+terung für diejenigen, die nur einen Index erstellen müssen, dürfen die 'ib'-
+und 'ie'-Anweisungen ohne Parameter benutzt werden, welches gleichbedeutend
+ist mit 'ib(1)' und 'ie(1)'.
+
+Die durch 'ib'- und 'ie'-Anweisungen gekennzeichneten Worte können auch über
+Zeilengrenzen (mit Silbentrennungen) gehen. Beispiel:
+
+ .... \#ib\#schöne Index-An-
+ weisungen\#ie\# ...
+
+'index' zieht getrennte Worte zusammen (hier: 'schöne Index-Anweisungen').
+Will man einige Worte in verschiedenen Indexdateien haben, darf man die 'ib'-
+und 'ie'-Anweisungen auch "schachteln". Dies kann man besonders bei Kapitel-
+überschriften nutzen. Beispiel (vergl. auch die Überschrift dieses Ab-
+schnitts):
+
+ \#ib(9)\#Worte kennzeichnen: '\#ib\#ib\#ie\#'/'\#ib\#ie\#ie\#'\#ie(9)\#
+
+In diesem Beispiel wird das Inhaltsverzeichnis in die Indexdatei '9' ge-
+bracht, während der "allgemeine" Index in der Indexdatei '1' gesammelt wird.
+
+
+
+Nebeneinträge erzeugen
+
+Es ist möglich, an die Seitennummer eines Eintrags einen beliebigen Text
+anfügen zu lassen. Beispiele:
+
+ EUMEL-System ... 27ff.
+ Monitor ........ 13(Def.)
+ EUMEL-Editor ... 2(Kap.4)
+
+Dies wird durch die generische Form der 'ib'-Anweisung ermöglicht:
+
+ ... der \#ib(1,"(Kap.4)")\#EUMEL-Editor\#ie\# ist gut geeignet,
+ Texte zu erstellen ...
+
+(erzeugt den letzten obigen Eintrag).
+
+An einen Eintrag kann ein weiterer TEXT angefügt werden, um etwa Unterein-
+träge zu bilden:
+
+ EUMEL-System .............. 27
+ EUMEL-System, kapitales ... 28
+ EUMEL-System, schönes ..... 29
+
+Das wird ebenfalls durch eine andere Form der 'ie'-Anweisung ermöglicht:
+
+ ... ist das \#ib\#EUMEL-System\#ie(1,", schönes")\# wirklich ein
+ schönes System ...
+
+(erzeugt den letzten obigen Eintrag).
+
+Nach der Erstellung einer Indexdatei können - nach interaktiver Anfrage - die
+Einträge sortiert werden. Die Sortierung erfolgt alphabetisch nach DIN 5007,
+Abschnitt 1 und 3.2 (Umlaute werden "richtig" eingeordnet).
+
+Wie bereits erwähnt, kann 'index' vielseitig eingesetzt werden:
+
+a) Erstellung von Stichwortverzeichnissen:
+ Wie bereits beschrieben.
+
+b) Erstellung von Inhaltsverzeichnissen:
+ Kapitelüberschriften mit eigenen Indexanweisungen klammern und durch
+ 'index' wie beschrieben verarbeiten. Beispiel:
+
+ \#ib(8)\#9.1.3 Das abenteuerliche Leben von Micky Maus unter
+ besonderer Berücksichtigung seiner Geburtsstadt Entenhausen\#ie(8)\#
+
+ Dann ist man sicher, daß das Inhaltsverzeichnis bezüglich Seitennummern
+ und Kapitelüberschriften korrekt ist.
+
+c) Erstellung von Abbildungsverzeichnissen:
+ Abbildungsüber- bzw. -unterschriften wie Inhaltsverzeichnisse verarbeiten.
+
+d) Überprüfung von Literaturhinweisen auf Vollständigkeit:
+ Man klammert alle Literaturhinweise mit extra Indexanweisungen (Beispiel:
+ \#ib(9)\#/Meier82/\#ie(9)\#) und überprüft dann mit Hilfe dieser Indexdatei
+ die Literaturverweise. Dann ist man sicher, daß alle Literaturverweise im
+ Text auch in der Literaturaufstellung stehen.
+
+
+
+Indexdateien zusammenführen: 'index merge'
+
+Durch das Programm 'index merge' kann eine Indexdatei in eine zweite "einge-
+mischt" werden. Es ist somit möglich, einen Index zu erstellen, der sich über
+mehrere Dateien erstreckt, indem man 'index' die Druckdateien dieser Dateien
+bearbeiten läßt und anschließend die entstandenen Indexdateien mit 'index
+merge ' zusammenfaßt. Indexdateien können ggf. mit dem Editor bzw. 'lineform'
+und/ oder 'pageform' bearbeitet und anschließend gedruckt werden. Beispiel:
+
+ index merge ("1.kapitel.i1", "2.kapitel.i1")
+
+Hier wird die Indexdatei des '1.kapitel' in die Indexdatei des '2.kapitel'
+eingeordnet und auf Wunsch sortiert.
+
+Beachte, daß 'index' und 'index merge' Kommandos und keine Anweisungen sind.
+
+Merke: 'index' verarbeitet eine Druckdatei (Zusatz: ".p") und erzeugt eine
+oder mehrere Indexdateien (Zusatz: ".i<nummer>"). Die in einen Index zu
+übernehmenden Worte müssen im Text durch die 'ib'- und 'ie'-Anweisungen
+eingefaßt sein.
+
+
+
+5. Drucken: 'print'
+
+Der EUMEL-Drucker, der mit dem Kommando 'print' angesprochen wird, ist eine
+Software-Schnittstelle zu einem angeschlossenem Drucker. In diesem Kapitel
+wird erklärt, wie man mit dem EUMEL-Drucker eine Datei druckt und welche
+speziellen Anweisungen den Drucker steuern.
+
+Jeder Drucker erbringt "hardwaremäßig" unterschiedliche Leistungen (z.B.
+Randausgleich, Unterstreichung). Diese Leistungen werden durch Eingabe
+spezieller Zeichenfolgen veranlaßt, die zwar genormt sind, aber von den Druk-
+kerherstellern nicht eingehalten werden oder unterschiedlich interpretiert
+werden.
+
+Um vom EUMEL-System unterschiedliche Drucker auf gleiche Weise ansprechen
+zu können, wurde eine Software-Schnittstelle geschaffen, die EUMEL-Drucker
+genannt wird. Der EUMEL-Drucker akzeptiert eine Datei und veranlaßt, daß
+diese in geeigneter Weise gedruckt wird. Weiterhin beachtet der EUMEL-
+Drucker die Anweisungen der Textkosmetik. Die Form der Anweisungen der
+Textkosmetik und des EUMEL-Druckers sind gleich.
+
+
+
+Eine Datei drucken: 'print'-Kommando
+
+Mit dem Kommando
+
+ print
+
+kann dem EUMEL-Drucker eine Datei zum Drucken übergeben werden. Beispiel:
+
+ print ("Drucker Beschreibung")
+
+In der Regel ist im EUMEL-System (Multi-User) ein "Spooler" installiert, so
+daß sofort mit der Arbeit fortgefahren werden kann. Der EUMEL-Drucker ar-
+beitet in diesem Fall parallel zu anderen Arbeiten des Nutzers.
+
+
+
+Anweisungen für den EUMEL-Drucker
+
+Ein Text (eine Datei) kann vom Drucker auch ohne Anweisungen gedruckt
+werden, etwa für Probedrucke. Für diesen Fall hat der Drucker vernünftige
+Voreinstellungen. Für einen "normalen" Text braucht ein Benutzer keine spe-
+ziellen Druckeranweisungen in den zu druckenden Text einzufügen, denn die
+Anweisungen für die Textkosmetik reichen zur Druckersteuerung aus. Nur wenn
+besondere Leistungen verlangt werden, wie z.B. Blocksatz oder den gedruckten
+Text an eine bestimmte Stelle zu plazieren, sind Druckeranweisungen notwen-
+dig.
+
+Werden vom Drucker Leistungen verlangt, die hardwaremäßig nicht vorhanden
+sind, so sorgt der EUMEL-Drucker dafür, daß eine möglichst äquivalente
+Leistung erbracht wird. Wird beispielsweise ein nicht vorhandener Schrifttyp
+angefordert, wird mit dem Standard-Schrifttyp der jeweiligen Installation
+gedruckt.
+
+Damit ist es möglich, einen Text auf einem Drucker zu drucken, der den ge-
+forderten Typ nicht kennt und der eigentlich für einen anderen Drucker
+bestimmt ist.
+
+Wie bereits erwähnt, beachtet der EUMEL-Drucker die gleichen Anweisungen wie
+die Textkosmetik-Programme. Eine 'type'-Anweisung beispielsweise, welches
+einen bestimmten Schrifttyp anfordert, wird also auch vom EUMEL-Drucker als
+Befehlsfolge an den angeschlossenen Hardware-Drucker übergeben (sofern der
+Schrifttyp auf dem Drucker realisierbar ist). Wie die Anweisungen ge-
+schrieben werden müssen, wird in der Beschreibung der Textkosmetik ge-
+schildert.
+
+Anweisungen werden nicht gedruckt. Besteht eine Zeile nur aus Anweisungen,
+so wird diese Zeile vom EUMEL-Drucker nicht gedruckt. Im Gegensatz zu den
+Programmen der Textkosmetik werden unbekannte oder fehlerhafte Anweisungen
+vom EUMEL-Drucker ohne Fehlermeldung "verschluckt". Alle Anweisungen werden
+zum frühest möglichen Zeitpunkt ausgeführt, haben also u.U. bereits Aus-
+wirkungen auf die Zeile, in der sie stehen.
+
+Einige Anweisungen sind speziell nur für den EUMEL-Drucker vorhanden.
+Diese werden in diesem Kapitel erklärt bzw. werden in der Anweisungs-Über-
+sicht mit aufgeführt.
+
+Neben den "normalen" Anweisungen, die nur in "\#"-Zeichen eingeschlossen
+werden, gibt es noch zwei andere Formen:
+
+a) Kommentar-Anweisungen:
+ Werden in "\#-" und "\#"-Zeichen eingeschlossen. Solche Anweisungen
+ werden ignoriert. Beispiel:
+
+ \#---- Ende der Seite 1 ---\#
+
+b) Spezielle Druckeranweisungen:
+ Werden in "\#/" und "\#"-Zeichen eingefaßt. Die von diesen Anweisungs-
+ Zeichen eingeschlossenen Druckerbefehlen werden unverändert (ohne die
+ "\#/" und "\#"-Zeichen) an den Drucker weitergereicht. Beispiel:
+
+ \#/C05\# (* C05 geht an den Drucker *)
+
+ Solche Anweisungen werden manchmal benötigt, um spezielle Druckereigen-
+ schaften auszunutzen, die schwer oder garnicht im EUMEL-Drucker reali-
+ sierbar sind.
+
+Anmerkung: Diese Anweisungen werden, wie die normalen Anweisungen auch, bei
+der Berechnung einer Zeile nicht berücksichtigt und nicht gedruckt.
+
+Merke: Der EUMEL-Drucker übernimmt die Anpassung an spezielle Hardware-
+Drucker. Er beachtet die gleichen Anweisungen wie die Textkosmetik-Programme.
+Zusätzlich gibt es noch einige wenige spezielle Druckeranweisungen.
+
+
+
+Blocksatz drucken: 'block'
+
+Die Anweisung 'block' bewirkt einen Blocksatz beim Druck.
+
+Fügt man in den Text (meist am Anfang einer Datei) die Anweisung
+
+ \#block\#
+
+ein, druckt der Drucker ab dieser Stelle alle Zeilen, die nicht mit einem
+Absatzkennzeichen versehen sind, im Blocksatz. Dies heißt, daß durch Ver-
+größern der Wortabstände alle Zeilen an der gleichen Position enden (rechter
+Randausgleich). Preiswerte Drucker können dies nur durch Einfügen ganzer
+Leerzeichen zwischen den Worten vornehmen, was sich oft beim Lesen störend
+bemerkbar macht. Bei qualitativ hochwertigen Druckern wird dagegen der
+Blocksatz durch Einfügen kleinerer Abstände zwischen den Worten oder sogar
+zwischen den Zeichen erreicht.
+
+Merke: Die Anweisung 'block' bewirkt den Blocksatz beim Druck.
+
+
+Schreibfeld verschieben: 'start'
+
+Durch die Anweisung 'start' ist es möglich, das Schreibfeld beim Druck auf
+dem Papier an eine andere Stelle zu plazieren.
+
+Der EUMEL-Drucker plaziert das Schreibfeld auf einem Drucker automatisch der-
+art, daß ein genügender Rand verbleibt. Diese Voreinstellung ist natürlich
+abhängig vom Drucker und der Installation. Mit der 'start'-Anweisung kann
+die automatische Einstellung verändert werden. Beispiel:
+
+ \#start (1.0, 2.0)\#
+
+legt die linke, obere Ecke des Schreibfeldes fest (vom linken Rand 1 cm, vom
+oberen Rand 2 cm).
+
+Merke: Die 'start'-Anweisung legt den linken oberen Rand des Schreibfeldes
+fest.
+
+
+
+Zentrieren
+
+Mit dem '#ib#center#ie#'-Kommando kann man eine Zeile in der Mitte der Zeile
+drucken lassen.
+
+Das 'center'-Kommando zentriert die Schrift einer Zeile. Beispiel:
+
+\#center\#Diese Zeile ist zentriert
+
+Dies Kommando ist nur bei Proportionalschriften sinnvoll einzusetzen, da man
+bei einer äquidistanten Schrift man direkt auf dem Bildschirm sehen kann,
+wie der Text auf einer Zeile plaziert ist.
+
+Merke: 'center' zentriert eine Zeile beim Drucken.
+
+
+
+6. Textkosmetik-Makros
+
+Makros dienen als Abkürzung für immer wiederkehrende Textteile und/oder
+Kommandos.
+
+Textkosmetik-Makros kommen zum Einsatz bei
+
+- immer wiederkehrenden Textteilen;
+
+- immer wiederkehrenden Anweisungssequenzen;
+
+- bei der Erstellung von Manuskripten, deren endgültige Form man anfänglich
+ noch nicht weiß oder die man noch ändern will.
+
+Die Definition von einem oder mehreren Makros wird mit dem Editor vorgenom-
+men. Diese Makro-Datei wird dann geladen. Von diesem Augenblick an "kennen"
+'lineform'/'autoform' und 'pageform' die Makros (d.h. die Textzeilen und/
+oder Anweisungen, die sich unter dem dem Makronamen "verbergen").
+
+'lineform'/'autoform' beachten die Anweisungen, die in den Makros enthalten
+sind. Man beachte, daß die Anweisungen und Textzeilen, die in den Makros ent-
+halten sind, nicht in der Datei erscheinen. Erst 'pageform' setzt diese in
+die Druckdatei ein.
+
+
+Ein Beispiel
+
+Hier wird ein einfaches Beispiel für einen Briefkopf gezeigt.
+
+Angenommen, die Firma 'Meier' schreibt mit dem EUMEL-System ihre Geschäfts-
+briefe. Sie hat einen Drucker zur Verfügung, mit dem man auch die Briefköpfe
+erstellen kann. Für den Briefkopf schreibt die Junior-Chefin ein Makro'kopf'
+in eine Datei 'macro definitionen':
+
+ \#*kopf\#
+ \#type("fett und gross")\# Firma Meier
+ \#type("fett")\# Gemischtwaren in kleinen Mengen
+ \#type("klein")\# Straße
+ Stadt
+ \#type ("normal")\#
+ \#*macro end\#
+
+Der Name des Makros ist 'kopf'. Man beachte, daß eine Makro-Definition mit
+dem Namen des Makros beginnen müssen. Der Makroname muß mit einem '*'
+gekennzeichnet werden, um ihn von "normalen" Text-Anweisungen unterscheiden
+zu können. Jedes Makro wird mit einer 'macro end'-Anweisung beendet
+(es dürfen mehrere Makros hintereinander in die Datei geschrieben werden).
+
+Nun muß die Junior-Chefin das so definierte Makro 'laden':
+
+ load macros ("macro defintionen")
+
+Zur Kontrolle kann sie sich die "geladenen" Makros in einen Datei ausgeben
+lassen:
+
+ list macros ("kontroll datei")
+
+Nun kann die Junior-Chefin ihrem Sekretär sagen, daß er von jetzt ab ein
+neues Kommando zur Verfügung hat, welches einen Briefkopf in jeden Brief
+drucken kann (mit dem Namen 'kopf'). Der Sekretär schreibt also nun
+folgenden Brief:
+
+\#kopf\#
+
+Sehr geehrte Frau ....
+usw.
+
+Nachdem er mit 'lineform' den Brief zeilenweise formatiert hat, kontrolliert
+er die formatierte Datei. Hier hat sich noch nichts verändert, die neue An-
+weisung 'kopf' steht unverändert in der Datei. ('lineform' beachtet zwar
+alle Anweisungen und Textzeilen eines Makros, setzt diese jedoch nicht in
+die Datei ein).
+
+Nun formatiert der Sekretär die Datei, welche den Brief enthält, mit 'page-
+form'. In der Druckdatei ist nun die Anweisung 'kopf' verschwunden, dafür
+stehen aber nun die Zeilen des Makrorumpfes ('pageform' setzt die Zeilen des
+Makros in die Druckdatei ein):
+
+ \#type("fett und gross")\# Firma Meier
+ \#type("fett")\# Gemischtwaren in kleinen Mengen
+ \#type("klein")\# Straße
+ Stadt
+ \#type ("normal")\#
+
+
+ Sehr geehrte Frau ...
+ usw.
+
+Merke: Makros sind bei der Verwendung von wenigen Text- und/oder Anweisungs-
+folgen nützlich, die immer in der gleichen Form benötigt werden.
+
+
+Ein Beispiel mit Makro-Parametern
+
+Unsere Junior-Chefin fällt nun auf, daß sie ihr Makro noch etwas verbessern
+kann. Sie will noch das Datum mit in den Briefkopf aufnehmen. Somit editiert
+sie ihre Makro-Datei folgendermaßen (man beachte die '$'-Zeichen):
+
+ \#*kopf ($1)\#
+ \#type("fett und gross")\# Firma Meier
+ \#type("fett")\# Gemischtwaren in kleinen Mengen
+ \#type("klein")\# Straße
+ Stadtname
+ \#type ("normal")\#
+
+ Stadtname, den $1
+ \#*macro end\#
+
+Damit hat sie dem 'kopf'-Makro einem Parameter gegeben ('$1'; die Parameter
+werden numeriert. Ein zweiter Parameter würde '$2' heißen usw.).
+
+Der Sekretär muß nun die Anweisung 'kopf' mit dem jeweiligen Datum in einen
+Brief schreiben:
+
+ \#kopf ("9.1.1984")\#
+
+'pageform' setzt nun das angegebene Datum direkt hinter 'Stadtname, den' in
+den Briefkopf ein (in der Druckdatei). Beachte, daß nur TEXT-Denoter als
+aktuelle Parameter eines Makros erlaubt sind.
+
+Merke: Durch die Makro-Parameter ist es also möglich, immer wiederkehrende
+Textteile in Schriftstücke einsetzen zu lassen, die sich nur in Kleinigkei-
+ten unterscheiden.
+
+
+Ein Beispiel für Manuskripte
+
+Hier wird gezeigt, wie man mit Makros Anweisungen formulieren kann, die aus-
+sagen, um was es sich bei einem Text handelt und nicht, wie es behandelt
+werden soll.
+
+Bei Manuskripten für Artikel, Bücher und Manuals weiß ein Autor oft vorher
+nicht, in welchem Format das Manuskript gedruckt werden wird. Zu diesem
+Zweck ist es ebenfalls nützlich, die Makros zu verwenden. Beispiel:
+
+ \#*kapitel anfang ($1)\#
+ \#free (2.0)\#
+ \#type ("gross und fett")\#\#ib (9)\#$1\#ie (9)\#\#type ("normal")\#
+
+ \#*macro end\#
+
+In diesem Beispiel wird ein Makro für den Anfang eines Kapitels definiert.
+Zwischen zwei Kapiteln soll hier zwei cm Zwischenraum bleiben, die Kapitel-
+Überschrift (als Parameter) wird in einer grösseren Schrift gedruckt. Zu-
+sätzlich wird die Überschrift in den 9. Index aufgenommen für ein Inhalts-
+verzeichnis. Nach der Ãœberschrift wird eine Leerzeile eingeschoben, bevor
+der "richtige" Text anfängt.
+
+Ein(e) Anwender(in) dieses Makros schreibt also z.B. folgende Anweisung:
+
+ \#kapitel anfang ("Ein Beispiel fuer Manuskripte")\#
+
+(Beachte, daß die Kapitel-Überschrift nicht länger als eine Textzeile sein
+darf. Das liegt daran, das 'lineform'/'autoform' zwar die Zeile bearbeitet,
+aber nicht in den Text einsetzt. 'pageform' setzt also die unveränderte
+- nicht aufgebrochene Textzeile - ein).
+
+Man kann nun Makros für die meisten Textstrukturen definieren. Schreibkräfte
+brauchen dann in der Regel die meisten der Text-Anweisungen nicht zu kennen,
+sondern nur noch eine Anzahl von einfachen Makro-Anweisungen.
+
+Die Makro-Definitionen können jederzeit geändert werden, um wechselnden
+Bedürfnissen angepaßt zu werden (z.B. wenn ein Verlag ein bestimmtes
+Schreibformat verbindlich vorschreibt). In diesem Fall brauchen nicht alle
+Text-Dateien geändert zu werden, sondern nur die Makro-Definitionen.
+
+Ein weiterer Vorteil einer solchen Vorgehensweise ist, daß die Makro-Anwei-
+sungen in diesem Fall angeben, was eine bestimmte Text-Struktur ist, und
+nicht, wie die Struktur behandelt werden soll.
+
+Anmerkung:
+In eine Makro-Definition sollte man ggf. 'limit'-, 'type'- und 'linefeed'-
+Angaben einsetzen, um die Makros unabhängig von der Aufrufstelle zu machen.
+Ggf. sollte man die Datei vorher mit 'lineform' bearbeiten, um Trennungen
+vorzunehmen.
+
+Merke: Makros dienen zur flexiblen Behandlung von Text-Strukturen, indem
+Makros definiert werden, die angeben, um was es sich dabei handelt.
+
+
+
+Beschreibung der Makro-Kommandos
+
+Mit dem Kommando
+
+ load macros ("macro datei")
+
+kann eine Datei, in denen die Makro-Definitionen enthalten sind, in den
+Makro-Speicher des Textsystems geladen werden. Ist dies fehlerfrei erfolgt,
+kann man 'lineform'/'autoform' Dateien übergeben, die die definierten Makro-
+Anweisungen "kennen" und befolgen. 'pageform' setzt bei Antreffen einer
+Makro-Anweisung den Makrorumpf in die Ausgabe-Datei ein.
+
+Die Definition eines Makros erfolgt mit dem Makronamen, der von Anweisungs-
+zeichen eingeschlossen ist. Um Makro-Anweisungen von "normalen" Textkosmetik-
+Anweisungen zu unterscheiden, müssen diese nach dem ersten Anweisungszeichen
+mit einem '*' gekennzeichnet werden. Beispiel:
+
+ \#*macro eins\#
+ Makrorumpf mit "normalen" Kommandos, wie z.B.
+ \#type ("x")\#
+ \#*macro end\#
+
+Der Aufruf eines Makros, welcher z.B. in einer von 'lineform' zu bearbeiten-
+den Datei steht, unterscheidet sich nicht von einer "normalen" Textanweisung.
+Beispiel:
+
+ ... \#macro eins\# ...
+
+Hat das Makro Parameter (bei der Definition mit '$'-Zeichen durchnumeriert),
+müssen beim Aufruf TEXT-Parameter eingesetzt werden (also in Anführungs-
+strichen). Beispiel:
+
+ \#*macro zwei ($1)\#
+ ... $1 ...
+ \#*macro end\#
+
+ (* Aufruf: *)
+
+ \#macro zwei ("ein einzusetzender Text")\#
+
+Anmerkung:
+Bei Makros gibt es keine generischen Anweisungen. Makros, die gleiche Namen
+haben, aber sich durch die Anzahl der Parameter unterscheiden, sind also
+nicht erlaubt.
+
+Beachten Sie ferner, daß Makro-Texte so verwendet werden, wie diese mit
+'load macros' geladen werden. Beispiel:
+
+ \#*a\#
+ \#on("underline")\#
+ \#*macro end\#
+
+ \#*b\#
+ \#off("underline")\#
+ \#*macro end\#
+
+Betätigt man in der Makro-Datei nach jeder Zeile die RETURN-Taste (Absatz),
+dann erhält man bei folgender Verwendung Fehlermeldungen von 'lineform':
+
+ ... \#a\#zu unterstreichender Text\#b\# ...
+
+weil hier Mitten im Satz Absätze erscheinen und 'lineform' bei jedem Absatz
+prüft, ob noch Modifikationen "offen" sind. In solchen Anwendungen sollte
+man also Makros ohne Absätze speichern.
+
+
+
+7. Anweisungs-Ãœbersicht
+
+* block
+ Zweck: Blocksatz (rechter Randausgleich). Der Text einer Zeile wird durch
+ Vergrößern der Wortlücken auf die Zeilenlänge, die durch das
+ 'limit'-Kommando eingestellt ist, verlängert. Es gelten folgende
+ Bedingungen:
+ a) Leerzeichen werden nicht verbreitert bei
+ - Zeilen mit Absatzzeichen;
+ - Mehrfache Leerzeichen;
+ - führende Leerzeichen (Einrückung);
+ - ein Leerzeichen hinter dem ersten Wort einer Zeile, wenn es auf
+ die Zeichen "]", ")", ".", "-", ":" endet.
+ b) Einrückungen werden äquidistant berechnet (Anzahl Zeichen *
+ Breite eines "Standard-Blanks"). Dies gilt nur für Proportional-
+ schriften und vor einer Absatzzeile. Es gilt als Einrückung:
+ - "Spiegelstrich" (Bindestrich und Leerzeichen am Anfang der
+ Zeile);
+ - Doppelpunkt als Ende des ersten Wortes (Position < 20);
+ - Schliessende Klammer oder Punkt als Ende des ersten Wortes,
+ wenn eine Ziffer davor steht (Position < 7);
+ c) Tabellen werden auch äquidistant berechnet. Dies gilt ebenfalls
+ nur für Proportionalschriften und vor einer Absatzzeile. Es gilt
+ als Teil einer Tabelle:
+ - Position des letzten Mehrfachblank.
+
+* bottom
+ Zweck: Erzeugen von "Fußzeilen" am Ende jeder Seite in der Druckdatei für
+ Untertitel und Seitennummern. Die Textzeilen zwischen den Anwei-
+ sungen 'bottom' und 'end' werden von 'pageform' am Ende jeder Seite
+ eingesetzt.
+
+* bottom even
+ Zweck: Definition von Fußzeilen für Seiten mit geraden Seitennummern. Es
+ gilt das unter 'bottom' gesagte.
+
+* bottom odd
+ Zweck: Definition von Fußzeilen für Seiten mit ungeraden Seitennummern. Es
+ gilt das bei 'bottom' gesagte.
+
+* center
+ Zweck: Zentrieren einer Zeile (Absatzzeile).
+
+* columns (INT CONST anzahl, REAL CONST luecke)
+ Zweck: Einschalten der Spaltenformatierung.
+
+* columnsend
+ Zweck: Ausschalten der Spaltenformatierung.
+
+* count
+ Zweck: Erhöhung eines internen Zählers und Einsetzen des Wertes anstatt
+ der Anweisung in die Druckdatei.
+
+* count (TEXT CONST merkmal)
+ Zweck: Wie obiges 'count', jedoch wird der Wert des Zählers vermerkt, so
+ daß er mit 'value' wieder erfragt werden kann.
+
+* end
+ Zweck: Beendet die Defintion von 'head', 'bottom' oder Fußnotenbereichen.
+
+* foot
+ Zweck: Definieren von Fußnoten. Es werden die aktuellen Werte von 'limit',
+ 'linefeed' und 'type' für die Fußnote verwendet (vergl. 'bottom'-
+ Anweisung).
+
+* free (REAL CONST freier platz)
+ Zweck: Es werden 'freier platz' cm freigehalten.
+
+* goalpage (TEXT CONST merkmal)
+ Zweck: (Ziel-) Verweis für Seitenquerverweise in Verbindung mit der Anwei-
+ sung 'topage'. 'merkmal' muß mit dem Parameter des entsprechenden
+ 'topage' übereinstimmen.
+
+* head
+ Zweck: Definieren von Kopfzeilen, die von 'pageform' am Anfang jeder Seite
+ eingefügt werden. Es gilt das unter 'bottom' gesagte.
+
+* head even
+ Zweck: Definieren von Kopfzeilen für Seiten mit geraden Seitennummern. Es
+ gilt das unter 'bottom' gesagte.
+
+* head odd
+ Zweck: Definieren von Kopfzeilen für Seiten mit ungeraden Seitennummern.
+ Es gilt das unter 'bottom' gesagte.
+
+* ib
+ Zweck: Arbeitet wie 'ib (1)', man darf aber den Parameter weglassen.
+
+* ib (INT CONST index nummer)
+ Zweck: Indexanfang einer oder mehrerer Indexworte bis zur entsprechenden
+ 'ie'-Anweisung. Die Worte zwischen 'ib' und 'ie' werden in die
+ Indexdatei geschrieben. 'index nummer' gibt die Indexdatei an.
+
+* ib (INT CONST index nummer, TEXT CONST seitennummer zusatz)
+ Zweck: Indexanfang mit Zusatztext für die Seitennummer. Das oben gesagte
+ gilt entsprechend. 'seitennummer zusatz' wird unmittelbar hinter
+ die Seitennummer angefügt. 'seitennummer zusatz' muß in jeder 'ib'-
+ Anweisung neu gesetzt werden.
+
+* ie
+ Zweck: Arbeitet wie 'ie (1)', man darf aber den Parameter weglassen.
+
+* ie (INT CONST index nummer)
+ Zweck: Abschluß eines Index. Ein Index darf nicht über Absatz- und Seiten-
+ grenzen gehen. Ein Index über mehr als zwei Zeilen ist ebenfalls
+ aus Sicherheitsgründen (vergessene Abschlußanweisung) nicht erlaubt.
+
+* ie (INT CONST index nummer, TEXT CONST index zusatz)
+ Zweck: Es wird 'index zusatz' an die durch die Index-Anweisungen einge-
+ faßten Worte angefügt. Beispiel:
+
+ \#ib (1)\#EUMEL-System\#ie(1, ", kapitales")\# ist
+ schön.
+
+ Erscheint als 'EUMEL-System, kapitales ... 4' in der Indexdatei.
+ Diese Anweisung dient also dazu, auch Sub-Indizes zu ermöglichen.
+
+* limit (REAL CONST wert)
+ Zweck: Einstellen einer neuen Zeilenbreite in cm. Die Zeilenbreite gilt
+ solange, bis sie durch ein erneute 'limit'-Anweisung verändert wird.
+
+* linefeed (REAL CONST wert)
+ Zweck: Einstellen eines neuen Zeilenvorschubs in Abhängigkeit vom einge-
+ stellten Schrifttyp.
+
+* material (TEXT CONST mat)
+ Zweck: Angabe von installationsspezifischen Merkmalen für den Drucker.
+
+* off (TEXT CONST modification)
+ Zweck: Abschalten einer Modifikation.
+
+* on (TEXT CONST modification)
+ Zweck: Einschalten einer Modifikation. Folgende Modifikationen sind zur
+ Zeit möglich:
+ bold (Fettdruck)
+ italic (Kursivdruck)
+ underline (Unterstreichung)
+ revers (Weiß auf Schwarz)
+
+* page
+ Zweck: Anfang einer neuen Seite. 'page' muß als letztes auf einer Zeile
+ stehen.
+
+* page (INT CONST nr)
+ Zweck: Anfang einer neuen Seite mit 'nr' Seitennummer.
+
+* page length (REAL CONST cm)
+ Zweck: Einstellen der Seitenlänge in cm.
+
+* page nr (TEXT CONST seitennr zeichen, start)
+ Zweck: Einstellen eines neuen Seitennr-Zeichens und Anfangwerts bzw.
+ setzen der Seitennummer des bereits vorhandenen Seitenzeichens
+ ("%"). Neben dem vorhandenen "%"-Zeichen können zwei zusätzliche
+ (beliebige, aber von den "\#"-Zeichen unterschiedliche) Seiten-
+ zeichen definiert werden.
+
+* papersize (REAL CONST width, length)
+ Zweck: Angabe der Papiergröße des Druckers in cm.
+
+* print (INT CONST von, bis)
+ Zweck: Teilausdruck einer Datei. Der Drucker verarbeitet die Datei, bis er
+ an die Seite 'von' angelangt ist. Dann druckt er die Seiten bis
+ einschließlich 'bis'. Beachte, daß der EUMEL-Drucker die Seiten
+ immer ab 1 durchzählt (und eine eventuelle Seitennumerierung nicht
+ beachtet).
+
+* start (REAL CONST x, y)
+ Zweck: Legt den linken, oberen Eckpunkt des Schreibfeldes fest. Die
+ Angaben erfolgen in cm.
+
+* topage (TEXT CONST merkmal)
+ Zweck: Verweis auf eine Seite mit der Anweisung 'goalpage' und dem
+ gleichen 'merkmal'. Für 'topage' wird die Seitennummer von
+ 'goalpage' eingesetzt.
+
+* type (TEXT CONST schrifttyp name)
+ Zweck: Einstellen eines anderen Schrifttyps. Die verfügbaren Schriftarten
+ und deren Namen sind installationsspezifisch und deshalb hier nicht
+ beschrieben.
+
+* value
+ Zweck: Einsetzen des letzten 'count' Wertes.
+
+* value (TEXT CONST merkmal)
+ Zweck: Erfragen des mit 'count' gespeicherten Zählerwertes für 'merkmal'
+ und Einsetzen dieses Wertes durch 'pageform' in die Druckdatei.
+
+
+
+7. Kommando-Ãœbersicht
+
+autoform
+ PROC autoform
+ Zweck: Aufruf von 'autoform' unter Verwendung des letzten eingestellten
+ Dateinamens.
+
+ PROC autoform (TEXT CONST datei)
+ Zweck: 'lineform' mit automatischer Silbentrennung. Nur die vorgenomme-
+ nen Trennungen werden auf dem Bildschirm angezeigt.
+
+ PROC autoform (FILE VAR f, TEXT CONST type name, REAL CONST width)
+ Zweck: Wie oben, jedoch auf einer Datei.
+
+index
+ PROC index (TEXT CONST eingabe datei)
+ Zweck: Erstellen von Indexdateien aus einer Druckdatei wie beschrieben.
+ Eine Indexdatei erhält den Namen der zu bearbeitenden Datei mit
+ dem Zusatz ".i" und der entsprechenden Indexnummer. Hat das
+ Programm 'index' die Druckdatei bearbeitet, werden die in die
+ Indexdatei geschriebenen Einträge alphabetisch sortiert (nach
+ Anfrage). Gleiche Einträge werden zusammengezogen: ein gleich-
+ lautender Eintrag wird entfernt, seine Seitennummer wird jedoch
+ an den bereits vorhandenen mit einem Komma aggefügt.
+
+ Die Sortierung entspricht DIN 5007:
+ - Die Sortierreihenfolge enspricht 'ABC...Z', wobei große und
+ kleine Buchstaben gleich behandelt werden.
+ - Weitere Entsprechungen:
+ ö = oe, ä = ae, ü = ue
+ Ö = Oe, Ü = Ue, Ä = Ae, Ä = ä, Ü = ü, Ö = ö, ß = ss
+ Dadurch wird z.B. 'muß' vor 'Muster' einsortiert und 'Goethe'
+ ist gleich 'Göthe'.
+ - Alle Sonderzeichen (außer " " und "-") werden ignoriert.
+ - Ein Leerzeichen und ein Bindestrich zwischen Worten werden
+ gleich behandelt. Beispiel:
+
+ 'EUMEL System' und 'EUMEL-System' sind also gleich.
+
+ Es sind z.Z. max. neun unterschiedliche Indexdateien vorgesehen.
+ Der Name einer Indexdatei ergibt sich aus dem Namen der zu bear-
+ beitenden Druckdatei, wobei '.p' durch '.i' mit der entsprechen-
+ den Ziffer ersetzt wird. Beispiel (für Indizes mit
+ 'index nummer' = 1, z.B. \#ib\# ... \#ie\#):
+
+ skript.p --> skript.i1
+
+index merge
+ PROC index merge (TEXT CONST von, hinzu)
+ Zweck: Einmischen der Indizes der Indexdatei 'von' in die Indexdatei
+ 'hinzu'. Beide Indexdateien müssen vorhanden sein. Dabei wird
+ 'von' vor dem ersten Satz von 'hinzu' eingefügt und anschließend
+ ggf. sortiert.
+
+list macros
+ PROC list macros (TEXT CONST datei)
+ Zweck: Ausgabe der "geladenen" Makros in die Datei 'datei'. 'datei' darf
+ vorher nicht existieren, wird also von 'list macros' eingerichtet.
+ Die "geladenen" Makros bleiben unberührt. Man kann die mit 'list
+ macros' in die Datei 'datei' geschriebenen Makro-Definitionen ggf.
+ verändern und erneut mit 'load macros' laden.
+ Fehlerfall:
+ * file already exists
+ Ausgabe-Datei 'datei' ist bereits vorhanden.
+
+lineform
+ PROC lineform
+ Zweck: Der zuletzt verwandte Dateiname wird benutzt. Beispiel:
+
+ edit ("test")
+ ...
+ lineform (* wird zu 'lineform ("test") *)
+
+ PROC lineform (TEXT CONST dateiname)
+ Zweck: Formatieren einer Datei zeilenweise.
+
+ PROC lineform (FILE VAR f, TEXT CONST type name, REAL CONST width)
+ Zweck: Aufruf von 'lineform' von einem Programm.
+
+load macros
+ PROC load macros (TEXT CONST datei)
+ Zweck: Lädt Makro-Definitionen in den Makro-Speicher des Textsystems. Die
+ Definitionen müssen in der Datei 'datei' enthalten sein (mit dem
+ Editor erstellen). Es können mehrere Definitionen in der Datei ent-
+ halten sein. Um den Makro-Speicher zu leeren, übergibt man eine
+ leere 'datei'.
+
+ Eine Makro-Definition besteht aus einem
+ - Makro-Kopf:
+ Muß alleine auf einer Zeile stehen. Der Makro-Kopf fängt mit
+ '\#*'-Zeichen an und wird mit '\#' beendet. Beispiel: \#*ein macro\#
+ Der Name eines Macros muß (wie alle andern Anweisungen auch)
+ mit kleinen Buchstaben geschrieben werden. Leerzeichen spielen
+ keine Rolle.
+ Eventuelle Parameter müssen in Klammern (bei mehreren durch
+ Kommata getrennt) und mit einem $-Zeichen numeriert werden.
+ Beispiel:
+ \#*macro1 ($1)\#
+ \#*macro 2 ($1, $2)\#
+
+ - Makro-Rumpf:
+ Besteht aus beliebig vielen Text-Zeilen, die Kommandos enthalten
+ können. Parameter (also das $-Zeichen mit anschließender Nummer)
+ werden bei Aufruf eines Makros ersetzt. In einem Makro-Rumpf
+ darf keine Makro-Anweisung erscheinen, die noch nicht definiert
+ wurde (sog. "Vorwärts-Referenzen").
+
+ - Makro-Ende:
+ besteht aus der Anweisung
+ \#*macro end\#
+ und muß wie der Makro-Kopf alleine auf einer Zeile stehen.
+
+ Fehlerfälle:
+ * file does not exists
+ Die Eingabe-Datei 'datei' ist nicht vorhanden.
+ * macro store overflow (number lines)
+ Es passen zur Zeit nicht mehr als 1 000 Zeilen in den Makro-Speicher.
+ * macro store overflow (number macros)
+ Es passen zur Zeit nicht mehr als 100 Makro-Defintionen in den
+ Makro-Speicher.
+
+pageform
+ PROC pageform
+ Zweck: Wie beschrieben, jedoch ohne Parameter. Die zuletzt benutzte
+ Datei wird bearbeitet. Für die Druckdatei wird dieser Dateiname,
+ an den ".p" angehängt wird, eingesetzt. Beispiel:
+
+ edit ("test")
+ ...
+ pageform (* wird zu 'pageform ("test", "test.p")'
+ ergaenzt *)
+
+ PROC pageform (TEXT CONST dateiname)
+ Zweck: Wie beschrieben, wobei der Parameter für die Druckdatei ergänzt
+ wird (an 'dateiname' wird '.p' angehängt). Beispiel:
+
+ pageform ("test")
+ (* wird zu 'pageform ("test", "test.p")' ergaenzt *)
+
+ PROC pageform (TEXT CONST dateiname, druckdatei)
+ Zweck: Wie oben.
+
+print
+ PROC print (TEXT CONST datei)
+ Zweck: Druck der Datei 'datei' unter Berücksichtigung von Anweisungen.
+
+
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil5 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil5
new file mode 100644
index 0000000..d59b147
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil5
@@ -0,0 +1,667 @@
+ EUMEL-Benutzerhandbuch
+
+
+ TEIL 5: ELAN-Compiler
+
+
+Der ELAN-Compiler im EUMEL-System
+
+In diesem Kapitel wird die Benutzung des ELAN-Compilers im EUMEL-System be-
+schrieben. Es enthält Angaben, welche Einschränkungen bzw. Erweiterungen
+gegenüber dem Sprachstandard existieren. Eine Einführung in die Programmier-
+sprache ELAN wird hier nicht gegeben.
+
+
+
+1. Einführung
+
+Der im EUMEL-System eingesetzte ELAN-Compiler wurde von J. Liedtke und
+U. Bartling am HRZ Bielefeld in den Jahren 1975/76 erstellt und in den
+folgenden Jahren erweitert und der Sprachbeschreibung angepaßt. Der gleiche
+ELAN-Compiler wird auch auf verschiedenen Großrechnern (TR440, IBM, SIEMENS)
+eingesetzt.
+
+Den ELAN-Compiler kann man sich als aus zwei Teilen bestehend vorstellen.
+Einmal gibt es den "eigentlichen" ELAN-Compiler, der ein ELAN-Programm in
+eine Maschinensprache (im EUMEL-System der sogenannte EUMEL0-Code) übersetzt.
+Zum anderen verwaltet der ELAN-Compiler übersetzte Moduln (in ELAN Packets
+genannt).
+
+In einem Packet können Prozeduren, Datentypen und/oder Operatoren definiert
+werden. Ist ein solches Packet vorübersetzt (im EUMEL-System wird dieser
+Vorgang 'insertieren' genannt), stehen diese Objekte zur Benutzung zur Ver-
+fügung. Durch Packets kann man somit die Sprache ELAN erweitern.
+
+Weitere Informationen über die Programmiersprache ELAN finden Sie in den
+folgenden Büchern:
+
+Hommel / Jähnichen / Koster:
+Methodisches Programmieren
+W. de Gruyter, Berlin, 1983
+
+Klingen / Liedtke:
+Programmieren mit ELAN
+Teubner, Stuttgart, 1983
+
+In der Regel sind in einem EUMEL-System die Standard-Packets bereits in-
+sertiert (Ausnahmen: Datentypen #ib#VECTOR#ie# und #ib#MATRIX#ie#). Zusätz-
+lich sind weitere Packets vorübersetzt, die Kommandos zur Verfügung stellen.
+Welche weiteren Packets insertiert werden, kann jede EUMEL-Installation und
+jeder Nutzer entscheiden. Somit kann man sein System auf spezielle
+Anwendungen zuschneiden.
+
+
+
+2. Ãœbersetzen mit dem ELAN-Compiler
+
+In diesem Abschnitt wird erklärt, wie Programme mit dem ELAN-Compiler über-
+setzt oder vorübersetzt werden können.
+
+
+
+Einfaches Ãœbersetzen: 'run'-Kommando
+
+Mit dem 'run'-Kommando kann ein ELAN-Programm übersetzt und ausgeführt
+werden.
+
+Das 'run'-Kommando (vergl. auch die Kommandos in der Beschreibung des
+Monitors) übersetzt ein in einer Datei befindliches ELAN-Programm. Beispiel:
+
+ run ("mein programm")
+
+übersetzt das ELAN-Programm, welches in der Datei 'mein programm' enthalten
+ist. (Wie man ELAN-Programme schreibt, ist u.a. im Editor-Kapitel beschrie-
+ben).
+
+Der Fortschritt der Ãœbersetzung wird durch laufende Nummern auf dem Bild-
+schirm des Benutzers angezeigt, die die gerade verarbeiteten Zeilennummern
+anzeigen. Da der ELAN-Compiler ein Zwei-Paß Compiler ist, werden alle
+Zeilen (mindestens) zweimal überprüft.
+
+Ist das Programm syntaktisch korrekt, d.h. hat der ELAN-Compiler keine
+Fehler gefunden, wird eine Ende-Meldung abgesetzt, die den Speicherumfang
+des übersetzten Programms enthält. Die Ende-Meldung entfällt, wenn die Task
+an kein Terminal angekoppelt ist.
+
+Nach der Ende-Meldung wird das Programm unmittelbar ausgeführt (ein Binder
+ist im EUMEL-System nicht notwendig).
+
+Merke: Das Kommando 'run' übersetzt ein in einer Datei befindliches Programm
+und führt fehlerfreie Programme aus.
+
+
+
+Korrektur von Fehlern
+
+In diesem Abschnitt wird beschrieben, wie (syntaktische bzw. semantische)
+Fehler korrigiert werden können.
+
+Entdeckt der ELAN-Compiler Fehler, so meldet er sie dem Benutzer unter An-
+Angabe der Zeilennummer. Die zwei Pässe des Compilers sind so konstruiert,
+daß sie unterschiedliche Fehler entdecken. Ist bereits im ersten Paß ein
+Fehler entdeckt worden, wird der zweite Paß nicht gestartet. Somit kann es
+vorkommen, daß man glaubt, alle Fehler beseitigt zu haben und dann werden
+wieder (andere) Fehler durch den zweiten Paß gemeldet ...
+
+Fehlermeldungen und Quelldatei werden nach Abschluß der Übersetzung durch
+den Paralleleditor angezeigt. Vergl. dazu auch die Beschreibung des Editors.
+
+Merke: Eventuelle Fehler und das zu korrigierende Programm werden durch den
+Paralleleditor angezeigt. So kann man das fehlerhafte Programm bequem ver-
+ändern.
+
+
+Nochmalige Ausführung eines Programms: 'run again'
+
+Mit 'run again' kann das zuletzt fehlerfrei übersetzte Programm nochmals
+ausgeführt werden.
+
+Ist ein Programm fehlerfrei übersetzt worden, so kann man es mit dem Komman-
+do 'run again' (beispielsweise mit anderen Eingabedaten) nochmals ausführen.
+
+Merke: Das Kommando 'run again' führt das zuletzt übersetzte Programm noch-
+mals aus.
+
+
+
+Ãœbersetzen von Kommandos
+
+Auch Kommandos werden in der Regel vom ELAN-Compiler übersetzt.
+
+Der ELAN-Compiler wird nicht nur für Programme eingesetzt, sondern auch als
+Übersetzer für die EUMEL-Kommandosprache (in anderen Systemen "job control
+language", abgekürzt JCL genannt) und für Kommandos, die man im Editor geben
+kann. Jedes Kommando der EUMEL-Kommandosprache ist ein kleines ELAN-Programm,
+welches in der Regel aus einem Prozeduraufruf besteht. Einige häufig be-
+nutzte Kommandos werden der Effizienz halber über einen Kommando-Interpreter
+abgewickelt. Beispiel:
+
+ edit ("mein erstes Programm")
+
+Natürlich ist es möglich, mehrere Kommandos oder ein richtiges, einzeiliges
+Programm als Kommando zu verwenden. Beispiele:
+
+ put (17 * 4)
+
+ INT VAR i; FOR i FROM 1 UPTO 100 REP put ("i") PER
+
+ edit ("datei"); lineform ("datei"); print ("datei")
+
+ INT VAR i; FOR i FROM 1 UPTO 10 REP print ("d") END REP
+
+Mit vorübersetzten Prozeduren (siehe auch das Kommando 'insert') ist es
+möglich, eine eigene Kommandosprache zusammenzustellen.
+
+Merke: Der ELAN-Compiler wird auch für die Übersetzung und Ausführung von
+Kommandos benutzt.
+
+
+
+Vorübersetzen: 'insert'
+
+Das Kommando 'insert' übersetzt ein in einer Datei befindliches ELAN-Pro-
+gramm und trägt dieses in den Tabellenspeicher des Compilers ein.
+
+Mit dem Kommando 'insert' kann ein ELAN-Programm (d.h. ein Packet oder eine
+Packetfolge) in den Tabellenspeicher (eine Art "Compilerdatenbank") des
+ELAN-Compilers eingetragen werden. Die in den Packets enthaltenen Objekte
+stehen nach Abschluß der Übersetzung zur Verfügung. Beispiel:
+
+Die Datei 'mein druck' enthalte folgendes Programm:
+
+ PACKET mein druck DEFINES drucke:
+
+ PROC drucke (TEXT CONST datei):
+ edit (datei);
+ lineform (datei);
+ pageform (datei);
+ print (datei)
+ END PROC drucke;
+
+ END PACKET drucke;
+
+Mit dem Kommando
+
+ insert ("mein druck")
+
+wird das Packet 'drucke' in die Tabellen des ELAN-Compilers aufgenommen.
+Nun kann (als Kommando oder in einem Programm) der Prozeduraufruf 'drucke'
+verwandt werden.
+
+Man beachte, daß der Nutzer beim Einrichten seiner Task alle insertierten Ob-
+jekte der Vater-Task erhält. Insertiert der Benutzer in seiner Task weitere
+Packets, so sind diese nur ihm verfügbar (oder ggf. seinen Sohn-Tasks). Es
+ist somit möglich, Tasks mit unterschiedlichem Sprachumfang einzurichten.
+
+Einmal insertierte Packets können nicht mehr aus den Compilertabellen ent-
+fernt werden. Man kann also nur die Task löschen (bitte vorher alle Dateien
+archivieren oder bei der Vater-Task aufheben (siehe Kommando: 'save')).
+
+Das Kommando 'insert' arbeitet auch mit einem Thesaurus (vergl. dazu auch
+den Teil über Dateien). Beispiel:
+
+ insert (ALL myself)
+
+insertiert alle Dateien der Benutzer-Task in Reihenfolge.
+
+Merke: Das Kommando 'insert' übersetzt die in einer Datei enthaltene Packet-
+folge und trägt diese in die Tabellen des Compilers ein.
+
+
+
+Programme von einem Programm übersetzen lassen
+
+Manchmal ist es notwendig, daß ein Programm den ELAN-Compiler zur Über-
+setzung und Ausführung eines Programms aufrufen muß.
+
+Natürlich kann man auch die Kommandos 'run' oder 'insert' von einem Programm
+aus aufrufen. Leider müssen die zu übersetzenden Programme in einer Datei
+enthalten sein. Will man jedoch nur eine Anweisung übersetzen und ausführen
+lassen und nicht den "Umweg" über eine Datei gehen (wie z.B. die Kommandos
+im Monitor oder Editor), so kann man die Prozedur '#ib#do#ie#' verwenden.
+Beispiel:
+
+ ...
+ get (eingabe);
+ do (eingabe);
+ ...
+
+Findet der ELAN-Compiler bei der Ãœbersetzung eines Textes der Prozedur 'do'
+einen Fehler, so wird dieser Fehler über 'errorstop' gemeldet (vergl. dazu
+auch das Kapitel über die Fehlerbehandlung im System-Handbuch) und die Über-
+setzung bei der ersten Fehlermeldung abgebrochen. In diesem Fall kann ein
+Nutzer den Fehler durch eine #ib#Fängerebene#ie# leicht selbst behandeln.
+
+Merke: Die Prozedur 'do' übersetzt (kleinere) ELAN-Programme von einem Pro-
+gramm aus.
+
+
+
+Kommandos zur Steuerung des ELAN-Compilers
+
+In diesem Abschnitt beschreiben wir die Kommandos für die Steuerung des
+ELAN-Compilers#ie#. Ebenso wie die Kommandos zur Ãœbersetzung eines Programms
+müssen die Kommandos zur Steuerung des Compilers vom Monitor gegeben werden.
+
+Mit dem Kommando
+
+ prot ("datei name")
+
+wird das Listing des ELAN-Compilers eingeschaltet und in die angegebene
+Datei ausgegeben. Mit
+
+ prot off
+
+wird es wieder ausgeschaltet. 'prot off' ist voreingestellt.
+
+Normalerweise werden Zeilennummern des Quellprogramms im übersetzten Pro-
+gramm mitgeführt, so daß bei einem Fehler zusätzlich zur Fehlermeldung auch
+die Nummer der Zeile ausgegeben werden kann, in der der Fehler aufgetreten
+ist. Mit dem Kommando
+
+ check off
+
+kann die Generierung von Zeilenummern für das Objektprogramm abgeschaltet
+werden. Durch die Angabe dieses Kommandos wird weniger Code für das
+Programm erzeugt. Mit
+
+ check on
+
+wird die Generierung von Zeilennummern durch den Compiler wieder einge-
+schaltet. 'check on' ist voreingestellt. Mit der Prozedur
+
+ check
+
+die ein boolesches Resultat liefert, kann in einem Programm abgefragt werden,
+ob der 'check'-Zustand ein- oder ausgeschaltet ist. Beispiel:
+
+ IF check THEN check off FI
+
+Merke: Die Kommandos 'check on' bzw. 'check off' schalten das Einfügen von
+Zeilennummern in den erzeugten Code ein bzw. aus.
+
+
+
+3. Abweichungen gegenüber dem Sprachstandard
+
+Der im HRZ Bielefeld entwickelte ELAN-Compiler weist einige Abweichungen
+gegenüber dem Sprachstandard auf, wie er in der Sprachbeschreibung formu-
+liert ist. Es existieren einige Einschränkungen, die einen Programmierer
+jedoch nicht weiter behindern. Die Spracherweiterungen wurden meist speziell
+für das EUMEL-System geschaffen. Weitere Abweichungen gegenüber dem aktuellen
+Sprachstandard, die aber in der nächsten Sprachbeschreibung enthalten sein
+werden, sind in einem weiteren Abschnitt aufgeführt.
+
+
+
+Einschränkungen gegenüber dem Sprachstandard
+
+ * Das "row display" wurde nicht implementiert. Der Grund dafür liegt in
+ dem unverhältnismäßig hohen Aufwand, dieses Sprachmittel bei der gegen-
+ wärtigen Compiler-Struktur zu implementieren. Abhilfe: Man verwende den
+ Konstruktor. Beispiel:
+
+ ROW 5 INT VAR vektor;
+ vektor := [1, 2, 3, 4, 5]; (* nicht möglich *)
+ vektor := ROW 5 INT :(1, 2, 3, 4, 5); (* Ersatz: Konstruktor *)
+
+ * Einige alternative Darstellungen von Symbolen können nicht verwendet
+ werden. Diese sind:
+
+ "&"-Zeichen für "AND",
+ "/="-Zeichen für "<>",
+ "%"- und "//"-Zeichen für "DIV".
+
+ * Eine Typ-Definition muß einer Deklaration immer textuell vorangehen.
+ Beispiel:
+
+ TYPE QUADRAT = ... (* erlaubt *)
+ QUADRAT VAR rundes quadrat;
+ ...
+ PUNKT VAR meiner; (* verboten *)
+ TYPE PUNKT = ...
+
+ Es ist jedoch erlaubt, einen Typ in einer Typ-Definition zu verwenden,
+ der textuell erst später definiert wird. Beispiel:
+
+ TYPE PERSON = STRUCT (TEXT name, vorname, ADRESSE wohnort);
+ TYPE ADRESSE = ...
+
+ Diese Einschränkung ("defined before applied") gilt nur für Typen,
+ nicht für Datenobjekte u.ä.. Selbstverständlich ist
+
+ otto := 0;
+ INT VAR otto;
+ ...
+
+ erlaubt (aber kein besonders schöner Programmierstil)!
+
+ * Die Operatoren AND und OR können nicht redefiniert werden, sofern einer
+ ihrer Operanden vom Typ BOOL ist.
+
+
+
+Implementationsbedingte Einschränkungen
+
+ * Es sind bis zu 32 000 Zeichen in einem TEXT zugelassen. Hat ein TEXT
+ bis 13 Zeichen, so wird er vollständig auf dem Stack untergebracht.
+ TEXTe mit mehr als 13 Zeichen werden auf dem Heap gespeichert. Die
+ Benutzung des Heaps bedeutet unter Umständen eine Verlangsamung eines
+ Programms. Darum ist
+
+max text length = 32 000
+
+ * Die Anzahl der Zeichen in einem TEXT-Denoter (Angabe eines TEXTes in
+ einem Programm) ist auf 254 Zeichen beschränkt.
+
+ * INT-Werte werden in sechzehn Bit dargestellt (einschließlich Vor-
+ zeichen). Das bedeutet, daß
+
+ maxint = 32 767
+ minint = - 32 768
+
+ ist.
+
+ * REAL-Werte werden intern mit einer Mantisse von 13 Stellen abgespei-
+ chert, von denen die ersten sieben Stellen bei der Ausgabe dargestellt
+ werden. Das bedeutet, daß
+
+ maxreal = 9.999999999999e126
+
+ ist.
+
+ * Die lexikographische Reihenfolge von Zeichen entspricht dem ASCII-Code
+ (vergl. dazu die Code-Tabelle).
+
+ * Weiterhin sieht der ASCII-Code noch eine Anzahl von Steuerzeichen vor,
+ die jedoch von Herstellern leider nicht immer gleich interpretiert
+ werden. Diese Zeichen sind im EUMEL-System teilweise normiert und
+ können verwandt werden. Die verfügbaren Steuerzeichen sind ebenfalls im
+ EUMEL-Taschenbuch aufgeführt.
+
+ * Die Initialisierung von Paketen (genauer: die Initialisierung von
+ Datenobjekten, die in vorübersetzten PACKETs außerhalb von Prozeduren
+ deklariert wurden) wird nur einmal, während der Übersetzung, durchge-
+ führt. Werden mehrere Pakete hintereinander (aus einer Datei) übersetzt,
+ dürfen die Prozeduren 'run', 'run again', 'insert' und 'do', die wieder
+ den ELAN-Compiler aufrufen, nur bei der Ausführung des letzten Packets
+ verwandt werden, weil der ELAN-Compiler nicht rekursiv benutzbar ist.
+
+
+
+Erweiterungen gegenüber dem Standard
+
+ * Einem Datenobjekt, das an einen #ib#Datenraum#ie# gebunden werden soll,
+ wird bei der Deklaration das Schlüsselwort #ib#BOUND#ie# vorangestellt.
+ Damit wird dem ELAN-Compiler mitgeteilt, daß er für ein solches Objekt
+ keinen Speicherplatz reservieren muß. Die Assoziation mit einem Daten-
+ raum erfolgt bei der Deklaration mit Hilfe der Initialisierung.
+ Beispiel:
+
+ BOUND INT VAR objekt :: old ("hugo");
+ (* eine bereits errichtete Datei wird unter dem Namen "hugo" benutzt.
+ "objekt" ist jetzt an die Datei mit dem Namen "hugo" "gebunden" *)
+
+
+
+Vorweggenommene Implementation des nächsten Standards
+
+In diesem Abschnitt sind Erweiterungen/Einschränkungen des ELAN-Compilers
+hinsichtlich der aktuellen ELAN-Sprachbeschreibung aufgeführt, die in der
+nächsten Sprachbeschreibung mit aufgenommen werden.
+
+ * ASCII-Zeichen, die nicht unmittelbar dargestellt werden können, können
+ in TEXT-Denotern angegeben werden, sofern sie in Anführungszeichen
+ eingeschlossen werden. Beispiele:
+
+ ""13""
+
+ ist ein TEXT-Denoter, der nur CR (carriage return) enthält.
+
+ "Jetzt erfolgt ein Zeilenwechsel "13""10""
+
+ Hier wird nach der Ausgabe des Textes ein "Wagenrücklauf" ('CR',
+ Code = 13) und einen Zeilenvorschub ('LF', Code = 10) erzeugt.
+
+ ""1""4""
+
+ positioniert in die linke obere Ecke eines Bildschirms (Code = 1) und
+ löscht den Bildschirm (Code = 4).
+
+ * Im aktuellen Standard wurde die #ib#Reihenfolge der Auswertung von
+ Operanden#ie# nicht definiert. Nunmehr wird zusätzlich nicht garantiert,
+ daß alle Operanden ausgewertet werden, wenn dies nicht notwendig ist.
+ Beispiel:
+
+ IF f (x) > 0 AND x <> 0 THEN ... FI
+
+ Hier muß beispielsweise 'f (x)' nicht ausgewertet werden, wenn 'x = 0'
+ ist.
+
+ * Die booleschen Operatoren CAND und COR stehen zusätzlich zur Verfügung.
+ Wirkung:
+
+ a CAND b :<==> IF a THEN b ELSE FALSE FI
+
+ a COR b :<==> IF a THEN TRUE ELSE b FI
+
+ Beispiel:
+
+ IF element vorhanden
+ THEN verarbeite element
+ FI.
+
+ element vorhanden:
+ index > 0 CAND liste (index) > 0.
+
+ * Prozeduren als Parameter. Beispiel:
+
+ (* Deklaration: *)
+ PROC draw (REAL PROC (REAL CONST) funktion,
+ REAL CONST von, bis, delta)
+ (* Aufruf: *)
+ draw (REAL PROC (REAL CONST) sin, -pi, pi, 0.1)
+
+ Die obige Form von Prozedur-Parametern wird als "Langform" bezeichnet.
+ Die Langform muß verwandt werden, wenn generische aktuelle Parameter
+ benutzt werden. Eine "Kurzform" reicht aus, wenn der aktuelle Prozedur-
+ Parameter keine generischen Prozedur ist, d.h. eindeutig über den
+ Prozedurnamen (und nicht noch über die Datentypen seiner Parameter)
+ identifiziert werden kann. Die Kurzform unterscheidet sich von der
+ Langform nur beim Aufruf, bei dem eventuelle Resultate und die Daten-
+ typen der Parameter nicht mit angegeben werden müssen. Beispiel:
+
+ (* Aufruf obiger Prozedur bei nichtgenerischer aktueller Prozedur
+ 'sin' *)
+ draw (PROC sin, -pi, pi, 0.1)
+
+ * In Paketen sind auch außerhalb von Prozeduren Refinements zugelassen.
+ In solchen "Paket-Refinements" dürfen nur Paket-Objekte angesprochen
+ werden. Insbesondere ist es erlaubt, auch im letzten Paket ('main
+ packet') neben Prozeduren auch Refinements in beliebiger Reihenfolge zu
+ benutzen. Beispiel:
+
+ PROC kommando erkennung:
+ ...
+ END PROC kommando erkennung;
+
+ PROC kommando ausführung:
+ ...
+ END PROC kommando ausführung;
+
+ datei assoziieren;
+ saetze lesen und bearbeiten;
+ ende behandlung.
+
+ datei assoziieren:
+ FILE VAR f :: sequential file ...;
+ ...
+ saetze lesen und bearbeiten:
+ ...
+ ende behandlung:
+ put ("Ende der Bearbeitung").
+
+ Dies ist die Schreibweise, die wir empfehlen. Will man aber Refinements
+ auch zwischen Prozeduren deklarieren, wird es etwas komplizierter.
+ Beispiel:
+
+ PROC a:
+ END PROC a;
+ ref; (* Refinement Aufruf *)
+ PROC b:
+ END PROC b;
+ (* Achtung: Semikolon, Punkt vor dem Refinement *)
+ .ref: . ; (* Punkt, Semikolon nach dem Refinement *)
+ PROC c:
+ END PROC c
+
+ Paket-Refinements dürfen auch von Prozeduren benutzt werden, allerdings
+ sind dann auch die Sichtbarkeitsregeln zu beachten. D.h. die Paket-
+ Refinements, die in Prozeduren verwandt werden, dürfen dann auch nur
+ Paket-Objekte ansprechen. Die Aufnahme eines Refinements in das Inter-
+ face ist verboten.
+
+
+
+4. Interne Fehlermeldungen des Compilers
+
+Interne Fehlermeldungen des Compilers#ie# erfolgen, wenn der ELAN-Ãœbersetzer
+an implementationsbedingte Einschränkungen stößt.
+
+ Interne Fehlermeldungen erfolgen in der Form:
+
+ COMPILER ERROR: <zahl>
+
+wobei <zahl> folgende Werte annehmen kann:
+
+<zahl> Bedeutung und eventuelle Abhilfe:
+
+ 101 name table overflow:
+ Die Anzahl der Namen im Programm ist zu groß oder es wurden die
+ Anführungstriche eines TEXT-Denoters vergessen. Keine Abhilfe.
+
+ 102 symbol table overflow:
+ Die Anzahl der deklarierten Objekte ist zu groß.
+ Abhilfe: Programm in Pakete unterteilen.
+
+ 103 intermediate string overflow:
+ Abhilfe: Programm in Pakete unterteilen.
+
+ 104 permanent table overflow
+ Zu viele Pakete insertiert.
+ Abhilfe: Keine (neue Task beginnen).
+
+ 106 packet address overflow:
+ Insgesamt zu viele Adressen in Paketen ( > 64K ), d.h. ein Daten-
+ objekt ist zu groß.
+ Keine Abhilfe.
+
+ 107 local data overflow:
+ Ein Datenobjekt in einer Prozedur ist zu groß ( > 32K ).
+ Abhilfe:
+ Datenobjekt in mehrere unterteilen.
+
+ 204 compiler stack overflow:
+ Keine Abhilfe.
+
+ 301 too many modules:
+ Zu viele Pakete, Prozeduren und Operatoren ( > 2048 ).
+ Keine Abhilfe.
+
+ 303 applied table overflow:
+ siehe 304
+
+ 304 too many labels:
+ In dem gerade übersetzten Modul (Prozedur, Operator oder Paket-
+ rumpf) werden vom Compiler zu viele Marken benötigt (mehr als
+ 2000). Marken werden z.B. für die Codegenerierung von Auswahl
+ (IF ...) und Wiederholung (REP ...) gebraucht. Insbesondere bei
+ SELECT-Anweisungen werden 'casemax - casemin + 2' Marken
+ benötigt, wobei 'casemax' der INT-Wert des maximalen, 'casemin'
+ der des minimalen CASE-Wertes ist. Dieser Fehler ist somit fast
+ immer auf zu viele und/oder zu weit gespannte SELECT-Anweisungen
+ zurückzuführen.
+ Abhilfe: SELECT-Anweisungen über mehrere Prozeduren verteilen oder
+ Spannweiten verringern.
+
+ 305 code overflow:
+ Der insgesamt erzeugte Code ist zu umfangreich ( > 256K ).
+ Keine Abhilfe.
+
+ 306 packet data overflow:
+ Insgesamt zu viele Datenobjekte in den Paketen ( > 128K ).
+ Keine Abhilfe.
+
+ 307 local data overflow:
+ Zu viele (lokale) Datenobjekte in einer Prozedur ( > 32K ).
+ Abhilfe: Prozedur in mehrere unterteilen, so daß die Datenobjekte
+ sich über mehrere Prozeduren verteilen.
+
+ 308 module code overflow:
+ Ein Modul (Prozedur, Operator oder Paket-Initialisierungsteil) ist
+ zu groß ( > 7.5 KB Code).
+ Abhilfe: In mehrere Prozeduren oder Pakete zerlegen.
+
+Anmerkung: Fehlermeldungen, die hier nicht aufgeführt sind, weisen in der
+Regel auf ein fehlerhaftes Arbeiten des ELAN-Compilers hin. In diesem Fall
+bitten wir um die Einsendung des Programms (Listing, Quelldatei auf Diskette
+bei umfangreichen Programmen) und entsprechender Fehlermeldung.
+
+
+
+5. Übersicht über die Compiler-Kommandos
+
+check
+ BOOL PROC check
+ Zweck: Informationsprozedur.
+
+ PROC check on
+ Zweck: Einschalten der Generierung von Zeilennummern durch den
+ ELAN-Compiler. Voreingestellt ist 'check on'.
+
+ PROC check off
+ Zweck: Ausschalten der Generierung von Zeilennummern durch den
+ ELAN-Compiler.
+
+do
+ PROC do (TEXT CONST program)
+ Zweck: Übersetzen und Ausführen von 'program' von einem Programm aus.
+
+insert
+ PROC insert
+ Zweck: Insertieren eines oder mehrerer PACKETs. Der Programmtext muß sich
+ in einer Datei befinden. Der Dateiname ist der zuletzt benutzte
+ Dateiname.
+
+ PROC insert (TEXT CONST dateiname)
+ Zweck: Wie oben. Der Programmtext wird aus der Datei mit dem Namen
+ 'dateiname' geholt.
+
+ PROC insert (THESAURUS CONST t)
+ Zweck: Insertieren aller PACKETs, die in den Dateien des Thesaurus 't'
+ enthalten sind.
+
+prot
+ BOOL PROC prot
+ Zweck: Informationsprozedur, ob 'prot' eingeschaltet ist.
+
+ PROC prot (TEXT CONST dateiname)
+ Zweck: Einschalten des Compilerlistings auf dem Bildschirm. Das Listing
+ wird gleichzeitig in die Datei 'dateiname' geschrieben.
+
+prot off
+ PROC prot off
+ Zweck: Ausschalten des Listings.
+
+run
+ PROC run
+ Zweck: Übersetzen und Ausführen eines ELAN-Programms. Der Programmtext
+ muß sich in einer Datei befinden. Der Dateiname ist der zuletzt
+ benutzte Dateiname.
+
+ PROC run (TEXT CONST dateiname)
+ Zweck: Wie oben. Der Programmtext wird aus der Datei mit dem Namen
+ 'dateiname' geholt.
+
+
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil6a b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil6a
new file mode 100644
index 0000000..1ee80ec
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil6a
@@ -0,0 +1,1590 @@
+ EUMEL-Benutzerhandbuch
+
+
+ TEIL 6: Erste Hilfe in ELAN
+
+
+Vorwort
+
+Dieser Teil des EUMEL-Handbuchs ist keine "Einführung in die Programmierung
+mit ELAN", sondern ist als Begleitmaterial für einen ELAN-Kurs gedacht.
+Zudem beschreibt das Skript nicht die vollständige Sprache; dafür ist die
+Sprachbeschreibung und das Handbuch vorgesehen. Folgende ELAN-Bücher sind
+z.Zt. erhältlich:
+
+Klingen / Liedtke:
+Programmieren mit ELAN
+Teubner, Stuttgart, 1982
+
+Jähnichen u.a.:
+Systematisches Programmieren mit ELAN
+W. de Gruyter, 1982
+
+Wir haben in dieses Skript auch einige Aufgaben mit aufgenommen, die An-
+fänger auf jeden Fall lösen sollten. Die Aufgaben dienen aber nur dazu, das
+erlernte Wissen über ELAN zu überprüfen und sind keine eigentlichen Program-
+mieraufgaben, die es im begleitenden Kurs geben sollte. Es gibt zwei Arten
+von Aufgaben:
+
+a) HSG (Hätten Sie's gewußt?): Aufgaben, die das bis dahin Gelernte über-
+ prüfen sollen.
+b) TSW (Trau', Schau', wem!): Aufgaben mit Programmen, die Fehler enthalten
+ können. Alle Programme dieses Skripts sind übrigens von der Art TSW.
+
+Es ist auch sinnvoll und notwendig, möglichst viele Programme dieses Skripts
+direkt auf dem Terminal zu probieren und zu verändern. Auf diese Weise wird
+ein Anfänger auch mit den Fehlermeldungen des ELAN-Compilers vertraut.
+
+
+
+Das erste Programm
+
+Gleich am Anfang einer Programmierlaufbahn haben Anfänger eine schwierige
+Hürde zu nehmen: das erste Programm "zum Laufen" zu bringen. Das wird einem
+Anfänger meist nicht leicht gemacht: schließlich hat er mit dem Betriebs-
+system eines Computers zu kämpfen. Ein #ib#Betriebssystem#ie# sorgt u.a. für
+die Steuerung so unterschiedlicher Peripheriegeräte wie Drucker, Lochkarten-
+leser, Magnetplatten und -bänder usw. Zusätzlich hat es dafür Sorge zu
+tragen, daß Informationen sicher gespeichert werden und nicht unbeabsichtigt
+verändert werden können. Letztendlich hat ein Betriebsystem die Aufgabe, die
+Aufträge von Benutzern ("jobs") - und das können mehrere auf einmal sein -
+sicher und effizient bearbeiten zu lassen. Um mit einem Betriebsystem
+"sprechen" zu können, ist meist eine eigene Sprache vorhanden, die Kommando-
+sprache ("job control language", abgekürzt: JCL).
+
+Eine Kommandosprache kann - auf Grund der vielfältigen Aufgaben, die mit
+ihrer Hilfe formuliert werden müssen - mehr oder weniger kompliziert sein.
+Zusätzlich sind Kommandosprachen sehr unterschiedlich: aus leicht einsichti-
+gen Gründen wollen sich Hersteller nicht auf eine Kommandosprache einigen.
+Deshalb können wir die Anweisungen in einer speziellen Kommandosprache hier
+nicht angeben; man erfragt diese am besten. Auf jeden Fall muß etwas getan
+werden, um ein Programm auf einem Rechner "zum Laufen" zu bringen.
+
+Wie bereits erwähnt, beschränken wir uns hier auf die eigentlichen Programme.
+Um den Mechanismus mit den Anweisungen an das Betriebsystem von Anfang
+an kennen zu lernen, denken wir uns ein sehr einfaches Programm aus, das wir
+bearbeiten lassen wollen.
+
+Programm 1:
+
+ put ("Hallo: mein erstes Programm")
+
+Dieses Programm muß nun dem Rechner zur Bearbeitung übergeben werden.
+Auch hier treffen wir auf Unterschiede bei den verschiedenen Rechensystemen:
+bei einigen Rechnern muß ein solches Programm (mit Anweisungen der
+Kommandosprache) auf Lochkarten übertragen werden, bei anderen dagegen
+tippt man das Programm direkt an einem Sichtgerät ("Terminal") ein. Die
+Ausgabe erfolgt dann über einen Schnelldrucker oder auch über das Sichtgerät.
+Um von Geräten bestimmter Installationen zu abstrahieren, nennen wir im
+folgenden das Eingabemedium #ib#Eingabegerät#ie# und das Gerät, auf dem die
+Resultate erscheinen, dementsprechend Ausgabegerät.
+
+Aufgabe (TSW):
+
+ Versuchen Sie, Programm 1 auf dem Rechner Ihrer Installation zu "rechnen".
+Ãœbungsziel: Umgang mit dem Betriebsystem
+
+
+Das Ergebnis unseres ersten Programms ist nun das Erscheinen des Textes:
+'Hallo: mein erstes Programm'. Was ist hier passiert? Da ein Rechner ein
+ELAN-Programm meist nicht direkt ausführen kann, muß es in eine Form
+gebracht werden, die der Rechner "versteht". Diese Form ist wiederum eine
+(sehr andersartige und - für Menschen - nicht leicht verständliche) Sprache,
+die Maschinensprache. Man muß also ein ELAN-Programm übersetzen. Dies wird
+von einem Programm (und nicht etwa einer festverdrahteten Schaltung) vorge-
+nommen, einem Übersetzer. Eine bestimmte Art von Übersetzer heißt Compiler;
+er übersetzt ein Programm als Ganzes (im Gegensatz zu einem Interpreter, der
+nur einzelne Anweisungen übersetzt und anschließend ausführt). Darum sind
+bei ELAN-Programmen, die meist durch Compiler übersetzt ("kompiliert")
+werden, zwei Phasen zu unterscheiden:
+
+a) Ãœbersetzungsphase:
+
+ In dieser Phase wird ein ELAN-Programm (man spricht von Quellprogramm
+ bzw. "source program") in ein äquivalentes Maschinenprogramm (Objektpro-
+ gramm) transformiert. Dabei überprüft der Übersetzer das Quellprogramm
+ auf eventuelle Fehler (Anweisungen, die nicht der ELAN-Sprachbeschreibung
+ entsprechen). Bei solchen Fehlern, die ein Compiler entdecken kann,
+ spricht man von syntaktischen Fehlern oder von Fehlern zur Ãœbersetzungs-
+ zeit.
+
+b) Bearbeitungsphase:
+
+ In dieser Phase ("run time") wird das übersetzte (Maschinen-) Programm
+ abgearbeitet. Auch hier können Fehler auftreten (z.B. wenn auf einen Wert
+ vom Programm zugegriffen wird, der noch gar nicht berechnet wurde).
+ Solche Fehler nennt man Laufzeitfehler.
+
+Haben wir das erste Programm so geschrieben, wie oben angegeben, dürften
+keine Fehler entdeckt werden und das Programm wird (hoffentlich korrekt, d.h.
+mit den geforderten Ergebnissen) beendet. Was für ein Programm haben wir nun
+geschrieben bzw. was haben wir vom Rechner verlangt?
+
+Das Wort 'put' bezeichnet eine Prozedur. Eine Prozedur ist ein Algorithmus
+(hier mit Parametern): eine bestimmte Sammlung von Anweisungen und unter
+Umständen Daten. Eine solche Prozedur können wir in einem Programm unter
+einem Namen (nämlich 'put') ansprechen und ausführen lassen. Man spricht
+dann von dem Aufruf einer Prozedur, wenn ein Prozedurname geschrieben wird.
+Von einer Prozedur brauchen wir nur zu wissen, was die Prozedur macht, aber
+gottseidank nicht, wie sie es macht.
+
+Eine Prozedur wie 'put' ist vorgefertigt und einfach benutzbar, wobei wir
+später sehen werden, wie man solche Prozeduren selber schreiben kann. Die
+Prozedur 'put' hat einen Parameter, nämlich den in Klammern geschriebenen
+Text, der auf dem Ausgabegerät ausgegeben werden soll. Wir können eine
+solche Prozedur auch mit anderen Parametern versehen und mehrmals aufrufen:
+
+Programm 2:
+
+ put ("Programm:");
+ put (2)
+
+Mit dem zweiten Programm ist es uns gelungen, ein Programm mit zwei Anwei-
+sungen zu schreiben (dabei ist der Parameter bei dem ersten Aufruf der
+'put'-Prozedur ein Text, beim zweiten Parameter eine ganze Zahl).
+
+ELAN ist eine formatfreie Sprache, d.h. Anweisungen können so auf eine Zeile
+verteilt werden, wie es uns gefällt und zweckmäßig erscheint.
+
+Programm 3:
+
+ put ("mein"); put (3); put (".Programm")
+
+Man kann also eine oder mehrere Anweisungen auf eine Zeile schreiben oder
+eine Anweisung über mehrere Zeilen. Das setzt jedoch voraus, daß die Anwei-
+sungen voneinander getrennt werden (schließlich muß der Übersetzer erkennen
+können, wo eine Anweisung anfängt und aufhört). Das ist besonders notwendig,
+weil man in Namen in ELAN beliebig Leerzeichen zur besseren Lesbarkeit
+verwenden kann.
+
+
+Programm 4:
+
+ p u t ( "aha");
+ put ("aha")
+
+Beide Anweisungen bewirken also das Gleiche.
+
+Die Trennung von Anweisungen erfolgt in ELAN durch das Trennsymbol
+Semikolon. Es bedeutet soviel wie: "führe die nächste Anweisung aus". Aus
+diesem Grund darf hinter der letzten Anweisung eines Programms kein Semiko-
+lon geschrieben werden (es folgt ja auch keine Anweisung mehr).
+
+Der Aufruf einer Prozedur (wie z.B. 'put') verlangt von unserem Rechner im-
+mer eine Leistung. Wollen wir aber in einem Programm eine Bemerkung schrei-
+ben (z.B. um uns etwas zu merken), dann können wir einen Kommentar schrei-
+ben, der vom Übersetzer überlesen und somit keinen Einfluß auf die Aus-
+führung eines Programms hat. Ein Kommentar in ELAN wird durch die Zeichen
+(* und *) eingeschlossen und darf über mehrere Zeilen gehen. Kommentare sind
+in ELAN aber nur in wenigen Fällen notwendig, weil wir Programme durch
+andere Mittel gut lesbar machen können.
+
+
+
+Ziel der Programmierung
+
+Was wollen wir eigentlich mit dem Programmieren von Computern erreichen?
+Häufig wiederkehrende und somit oft langweilige Tätigkeiten oder solche, die
+besonders schnell erledigt werden müssen, sollen von dem "Werkzeug Computer
+erledigt werden. Gehaltsberechnungen, Unterstützung beim Schreiben von
+Texten, Katalogsysteme für Bibliotheken, Steuerung von Walzstraßen usw. sind
+typische Aufgaben für Computer.
+
+Bei der Programmierung wird also versucht, Objekte (wie z.B. Geld bei einer
+Gehaltsberechnung) und Prozesse (wie z.B. die Simulation von Wirtschaftsab-
+läufen) der realen Welt mit Hilfe von Programmen in einem Computer nachzu-
+bilden und nach bestimmten Vorstellungen so zu verändern, daß man "brauch-
+bare" Ergebnisse erlangt. In einem Programm sind Befehle an einen Rechner
+für eine solche Abbildung enthalten. Die Befehle in einem Programm werden
+Anweisungen genannt. Ein Programmierer muß also folgendes tun:
+
+1. Abbilden von Objekten und Prozessen der realen Welt in ein Programm.
+ Dabei müssen die Bedingungen der Aufgabe beachtet werden. Was das Pro-
+ gramm Programm leisten soll, wird darum in einer Spezifikation festgelegt.
+
+2. Einbringen des Programms in einen Rechner und Bearbeitung desselben. Die
+ Formulierung von Anweisungen in einem Programm erfolgt in einer bestimmten
+ Sprache, nämlich einer Programmiersprache.
+
+3. Interpretation der Ergebnisse.
+
+
+
+Das Konzept des Datentyps
+
+Befassen wir uns vorerst nur mit Objekten. Sicherlich gibt es sehr viele Ob-
+jekte in unserer Welt. Einige von ihnen haben aber gleiche Eigenschaften:
+
+- Fahrzeuge (Autos, Mofas, Dreiräder) bringen uns von Ort A nach Ort B.
+
+- Geld (Münzen, Geldscheine, Murmeln, Franc, DM) erlaubt es, etwas zu kaufen.
+
+- Schreibgeräte (Bleistift, Kugelschreiber, Schreibmaschine) sind die Werk-
+ zeuge von Leuten, die etwas zu schreiben haben.
+
+- ...
+
+Es ist also möglich, einige Objekte der realen Welt in Klassen zusammenzu-
+fassen. Eine solche Zusammenfassung kann hinsichtlich gleicher Eigenschaften
+bzw. gleicher Operationen, die für solche Objekte zugelassen sind, erfolgen.
+Eine Klasse von Objekten mit gleichen Eigenschaften wird in Programmier-
+sprachen Datentyp genannt. Dabei hat ein Datentyp immer einen Namen, der die
+Klasse von Objekten sinnvoll kennzeichnet. Als ein Datenobjekt wird ein
+Exemplar eines Datentyps (also ein spez. Objekt einer Klasse) bezeichnet.
+
+Datentypen sind in ELAN ein zentrales Konzept. Jedes der in einem ELAN-
+Programm verwandten Datenobjekte hat einen Datentyp; somit kann man Daten-
+typen auch als Eigenschaften von Datenobjekten ansehen. Für jeden Datentyp
+sind nur spezielle Operationen sinnvoll. Z.B. sind für einen Datentyp
+"UBoot" die Operationen "erstellen", "tauchen", "auftauchen", "versenken"
+und "lieber nicht verwenden" sinnvoll, aber nicht die Operation "+" wie bei
+ganzen Zahlen. Man kann nun Übersetzern die Aufgabe überlassen zu überprüfen,
+ob stets die richtige Operation auf einen Datentyp angewandt wird.
+
+Aufgabe (HSG):
+
+ Was ist ein Datentyp? Welche Funktion erfüllen Datentypen?
+Ãœbungsziel: Datentyp-Konzept
+
+Einige Datentypen spielen bei der Programmierung eine besondere Rolle, weil
+sie häufig benötigt werden. In ELAN sind das die Datentypen für
+
+- ganze Zahlen. Dieser Datentyp wird INT (für "integer") genannt.
+
+- reelle Zahlen (REAL).
+
+- Zeichen und Zeichenfolgen (TEXT).
+
+- Wahrheitswerte (BOOL).
+
+Diese Typen werden in ELAN elementare Datentypen genannt. Für effiziente
+Rechnungen mit elementaren Datentypen gibt es in den meisten Rechnern
+spezielle Schaltungen, so daß die Hervorhebung und besondere Rolle, die
+sie in Programmiersprachen spielen, gerechtfertigt ist. Zudem hat man
+Werte-Darstellungen innerhalb von Programmen für die elementaren Datentypen
+vorgesehen, was wir im nächsten Abschnitt erklären wollen.
+
+Im weiteren Teil dieses Skripts werden wir uns zunächst auf die Behandlung
+der elementaren Datentypen beschränken. Das bedeutet für den Programmierer,
+daß er alle Objekte der realen Welt mit Hilfe der elementaren Datentypen in
+den Computer abbilden muß. Das kann manchmal sehr schwierig sein (wie bilden
+wir z.B. Personen oder UBoote mit den elementaren Datentypen ab?). Später
+werden wir dann Möglichkeiten kennenlernen, neue - problemgerechte -
+Datentypen in ELAN zu formulieren.
+
+
+
+Denoter (Werte-Repräsentationen) elementarer Datentypen
+
+Wenn wir mit Objekten elementarer Datentypen arbeiten, müssen wir die
+Möglichkeit haben, Werte in ein Programm zu schreiben. Leider kann man einen
+Wert "an sich" in einem Programm nicht direkt angeben. Schreiben wir z.B.
+4711, dann meinen wir zwar einen INT-Wert, haben aber die Ziffern 4, 7, 1 und
+1 geschrieben. Der eigentliche Wert wird in unserem Kopf oder - für unsere
+Zwecke - in einem Rechner gebildet.
+
+Die Werte-Darstellungen oder Werte-Repräsentationen, die in ELAN "Denoter"
+genannt werden, sind für jeden Datentyp unterschiedlich. Wie bereits erwähnt,
+haben alle Datenobjekte in ELAN (also auch Denoter) nur einen - vom Über­
+setzer feststellbaren - Datentyp. Aus der Form eines Denoters ist also der
+Datentyp erkennbar:
+
+- INT-Denoter:
+ Bestehen aus einer Aneinanderreihung von Ziffern. Beispiele:
+
+ 17, 007, 32767, 0
+
+ Führende Nullen spielen bei der Bildung des Wertes keine Rolle (sie werden
+ vom ELAN-Compiler überlesen). Negative INT-Denoter gibt es nicht (wie
+ negative Werte-Darstellungen in einem Programm geschrieben werden, lernen
+ wir bei den Ausdrücken).
+
+- REAL-Denoter:
+ Hier gibt es zwei Formen. Die erste besteht aus zwei INT-Denotern, die
+ durch einen Dezimalpunkt getrennt werden. Beispiele:
+
+ 0.314159, 17.28
+
+ Der Dezimalpunkt wird analog der deutschen Schreibweise als Komma
+ verwendet. Negative REAL-Denoter gibt es wiederum nicht.
+
+ Eine zweite Form wird kurioserweise als "wissenschaftliche Notation" be-
+ zeichnet. Sie findet dann Verwendung, wenn sehr große oder Zahlen, die
+ nahe bei Null liegen, dargestellt werden müssen. Beispiele:
+
+ 3.0 e5, 3.0e-5
+
+ Der (INT-) Denoter hinter dem Buchstaben e gibt an, wie viele Stellen der
+ Dezimalpunkt nach rechts (positive Werte) oder nach links zu verschieben
+ ist. Dieser Wert wird Exponent, der Teil vor dem Buchstaben e Mantisse
+ genannt.
+
+- TEXT-Denoter:
+ TEXT-Denoter werden in Anführungszeichen eingeschlossen. Beispiele:
+
+ "Das ist ein TEXT-Denoter"
+ "Jetzt ein Text-Denoter ohne ein Zeichen: ein leerer Text"
+ ""
+
+ Beachte, daß das Leerzeichen ebenfalls ein Zeichen ist. Soll ein An-
+ führungszeichen in einem TEXT erscheinen (also gerade das Zeichen, welches
+ einen TEXT-Denoter beendet), so muß es doppelt geschrieben werden:
+
+ "Ein TEXT mit dem ""-Zeichen"
+ "Ein TEXT-Denoter nur mit dem ""-Zeichen:"
+ """"
+
+ Manchmal sollen Zeichen in einem TEXT-Denoter enthalten sein, die auf dem
+ Eingabegerät nicht zur Verfügung stehen. In diesem Fall kann der Code-
+ Wert des Zeichens angegeben werden:
+
+ ""32""
+
+ bedeutet z.B. das (ASCII-) Leerzeichen. Der Code-Wert eines Zeichens er-
+ gibt sich aus einer Code-Tabelle (installationsspezifisch), in der jedem
+ Zeichen eine ganze Zahl zugeordnet ist.
+
+- BOOL-Denoter:
+ Es gibt nur zwei BOOL-Denoter: TRUE (für "wahr") und FALSE (für "falsch").
+
+Nun wird auch klar, was für Parameter wir in den obigen Programmen verwandt
+haben. Es waren natürlich TEXT- bzw. INT-Denoter.
+
+
+Aufgabe (TSW):
+
+ Welche der folgenden Denotationen ist falsch?
+
+ a) 1. e) 1 . 0 i) 007
+ b) -1 f) "" j) "Ein "Getuem" stellt sich vor"
+ c) """ g) """"
+ d) "das ist ein text" h) TRUE k) 1.0 e 37
+
+Ãœbungsziel: Lernen von Denotationen
+
+
+
+ELAN-Datenobjekte
+
+Wie bereits erwähnt, wollen wir mit Hilfe von Programmen Datenobjekte so
+verändern, daß wir erwünschte Ergebnisse erhalten. Meist wird zu dieser Ver-
+änderung von Datenobjekten "Rechnen" gesagt, obwohl - wie wir gleich sehen
+werden - nicht nur numerische Objekte manipuliert werden. Die Veränderung
+der Datenobjekte findet zur "Laufzeit" (nicht zur Ãœbersetzungszeit) im
+Rechner statt. Die Darstellung eines Werts in einem Rechner zur Laufzeit
+eines Programms wird #ib#Repräsentation#ie# genannt. Wenn es eindeutig ist,
+daß es sich nur um die Repräsentation im Rechner handelt, sprechen wir kurz
+von Werten.
+Da also ein Datenobjekt wechselnde Werte annehmen kann, brauchen wir eine
+Möglichkeit, es in einem Programm anzusprechen, egal welchen Wert das Objekt
+zu einem Zeitpunkt beinhaltet. Zu diesem Zweck können wir einem Datenobjekt
+einen Namen geben (wie z.B. einen Personennamen, hinter dem sich eine wirk­
+liche Person "verbirgt"). Wenn wir also den Namen des Datenobjekts in ein
+Programm schreiben, dann meinen wir (meist) den Wert des Datenobjekts, den
+es zu diesem Zeitpunkt besitzt.
+
+Nun sollen die zu behandelnden Datenobjekte ja auch neue Werte erhalten. In
+diesem Fall müssen wir die Speicherstelle finden, in die der neue Wert ge-
+bracht werden soll. Für diesen Zweck benutzen wir ebenfalls den Namen, zu-
+sätzlich zu der Angabe einer Operation, durch die das Objekt einen neuen
+Wert erhalten soll. Diese Operation (Wert "schreiben") nennen wir Zuweisung.
+Der Zuweisungs-Befehl wird ':=' geschrieben. Beispiel:
+
+ a := 5
+
+Bedeutet, daß das Datenobjekt mit dem Namen 'a' den Wert '5' erhält.
+
+Von manchen Datenobjekten wissen wir, daß wir ihnen nur einmal einen Wert
+geben wollen. Sie sollen also nicht verändert werden. Oder wir wissen, daß
+in einem Programmbereich ein Datenobjekt nicht verändert werden soll. Um ein
+unbeabsichtigtes Verändern zu verhindern, wird in ELAN dem Namen eines
+Datenobjekts ein zusätzlicher Schutz mitgegeben: das Zugriffsrecht oder
+Accessrecht. Es besteht aus der Angabe der Worte VAR (für Lesen und Ver-
+ändern) oder CONST (für ausschließliches Lesen).
+
+
+
+Die Deklaration (Vereinbarung) von Datenobjekten
+
+Wollen wir ein Datenobjekt in einem Programm verwenden, so müssen wir dem
+Ãœbersetzer mitteilen, welchen Datentyp und welches Accessrecht das Objekt
+haben soll. Das dient u.a. dazu, nicht vereinbarte Namen (z.B. verschriebene)
+vom Ãœbersetzer entdecken zu lassen. Weiterhin ist aus dem bei der Deklaration
+angegebenen Datentyp zu entnehmen, wieviel Speicherplatz für das Objekt zur
+Laufzeit zu reservieren ist. Beispiel:
+
+INT VAR mein datenobjekt
+
+Zuerst wird der Datentyp, dann das Accessrecht und schließlich der Name des
+Datenobjekts angegeben. Wie werden nun Namen in ELAN formuliert?
+
+Das erste Zeichen eines Namens muß immer ein kleiner Buchstabe sein. Danach
+dürfen beliebig viele kleine Buchstaben, aber auch Ziffern folgen. Zur bes-
+seren Lesbarkeit können (wie bei den obigen Prozedurnamen) Leerzeichen in
+einem Namen erscheinen, die aber nicht zum Namen zählen. Beispiele:
+
+ name1
+ n a m e 1
+ x27
+ gehalts konto
+ das ist ein langer name
+
+Verschiedene Datenobjekte mit gleichem Datentyp und Accessrecht dürfen in
+einer Deklaration angegeben werden (durch Kommata trennen). Mehrere Dekla-
+rationen werden - genauso wie Anweisungen - durch das Trennsymbol
+voneinander getrennt. Beispiele:
+
+ INT VAR mein wert, dein wert, unser wert;
+ BOOL VAR listen ende;
+ TEXT VAR zeile, wort
+
+
+
+Die Initialisierung von Datenobjekten
+
+Um mit den so vereinbarten Datenobjekten arbeiten zu können, muß man ihnen
+eine Wert geben. Hat ein Datenobjekt noch keinen Wert erhalten, so sagt man,
+sein Wert sei undefiniert. Das versehentliche Arbeiten mit undefinierten
+Werten ist eine beliebte Fehlerquelle. Deshalb wird von Programmierern
+streng darauf geachtet, diese Fehlerquelle zu vermeiden. Eine Wertgebung an
+ein Datenobjekt kann (muß aber nicht) bereits bei der Deklaration erfolgen,
+was man in ELAN Initialisierung nennt. Beispiele:
+
+ INT CONST gewuenschtes gehalt :: 12 000;
+ TEXT VAR zeile :: "";
+ REAL CONST pi :: 3.14159;
+ BOOL VAR bereits sortiert :: TRUE
+
+Allerdings: für mit CONST vereinbarte Datenobjekte ist die Initialisierung
+die einzige Möglichkeit, ihnen einen Wert zu geben.
+
+Die Initialisierung erfolgt mit Hilfe des '::'-Symbols. Anschließend folgt
+der Wert, den das Datenobjekt erhalten soll. (In den Beispielen haben wir
+nur Denoter geschrieben. Es sind aber auch allgemeinere Ausdrücke erlaubt.).
+Es ist nun möglich, mit der oben erwähnten 'put'-Prozedur auch den Wert von
+Datenobjekten ausgeben zu lassen.
+
+
+Programm 5:
+
+ INT VAR nummer :: 5;
+ TEXT CONST bemerkung :: ".Programm";
+ put (nummer);
+ put (bemerkung)
+
+Beachte dabei, daß bei der Aufführung eines Namens in diesem Fall immer der
+Wert des Datenobjekts gemeint ist. Auch die 'put'-Prozedur druckt nicht etwa
+den Namen des Datenobjekts oder die Adresse der Speicherstelle, sondern
+ebenfalls den Wert.
+
+
+Aufgabe (HSG):
+
+ Welche Aufgabe erfüllen Deklarationen? Was heißt: "Eine Variable hat
+ einen undefinierten Wert"? Was ist eine Initialisierung? Was ist ein
+ CONST-Datenobjekt? Warum müssen CONST-Datenobjekte initialisiert
+ werden?
+Übungsziel: Verständnis von Deklarationen und Accessrecht
+
+
+
+Schlüsselworte
+
+Einige Worte haben in ELAN eine feste Bedeutung und können somit nicht -
+wie etwa Namen - frei gewählt werden. Solche Worte werden bei den meisten
+ELAN-Übersetzern mit großen Buchstaben geschrieben, wie z.B. VAR, CONST,
+INT oder REAL u.a.m. Wie wir später sehen werden, besteht die Möglichkeit,
+neue Schlüsselworte einzuführen. Halten wir vorläufig fest, daß feste
+Bestandteile der Sprache (wie z.B. CONST oder VAR) und Datentypen (wie INT
+oder REAL) Schlüsselworte sind, also mit großen Buchstaben geschrieben
+werden.
+
+
+
+Ausdrücke
+
+Nun wäre es natürlich schlecht, wenn Programmierer nicht mehr machen könnten,
+als Werte ausgeben. Als erste Stufe von etwas komplexeren "Rechnungen"
+dürfen Ausdrücke gebildet werden. Ausdrücke sind eine Zusammenstellung von
+Datenobjekten (Denoter, VAR- oder CONST-Objekte) und Operatoren. Schauen wir
+uns dazu erst ein Programm an:
+
+
+Programm 6:
+
+ INT CONST wert 1 :: 1,
+ wert 2 :: 2,
+ wert 3 :: 3;
+
+ put (wert1 + wert2);
+ put (wert2 - wert1);
+ put (wert2 * wert3);
+ put (wert3 DIV wert2);
+ put (wert2 ** wert3)
+
+In diesem Programm werden drei Datenobjekte initialisiert. Anschließend
+werden jeweils die Werte von zwei Objekten addiert (Operatorzeichen: '+'),
+subtrahiert ('-'), multipliziert ('*'), dividiert (ganzzahlige Division ohne
+Rest: 'DIV') und potenziert ('**'). Dies sind Operatoren, die zwei Operanden
+haben: man nennt sie dyadische Operatoren. Die monadischen Operatoren da-
+gegen haben nur einen Operanden. Beispiel:
+
+ put ( - wert1)
+
+Operatoren in ELAN werden - wie wir an den obigen Beispielen sehen - durch
+ein oder zwei spezielle Zeichen oder durch große Buchstaben (in den Fällen,
+in denen kein "vernünftiges" Zeichen mehr zur Verfügung steht) als Schlüssel-
+wort dargestellt.
+
+Als Operanden (also die Datenobjekte, auf die ein Operator "wirken" soll)
+eines Operators darf ein VAR- oder CONST-Datenobjekt, aber auch ein Denoter
+verwendet werden. Das Resultat eines Operators (also das Ergebnis einer
+Berechnung) ist bei den obigen Ausdrücken wieder vom Datentyp INT mit dem
+Accessrecht CONST. Darum ist es erlaubt, solch einen Ausdruck wiederum als
+Operanden zu verwenden. Praktisch bedeutet dies, daß wir mehrere Operatoren
+und Datenobjekte zusammen in einem Ausdruck haben dürfen.
+
+
+Programm 7:
+
+ INT CONST wert 1 :: 1,
+ wert 2 :: 2,
+ wert 3 :: 3;
+
+ put (wert2 + 3 - wert2 * wert3);
+ put (- wert2 * wert3)
+
+Nun haben wir eine Schwierigkeit: Der Ausdruck in der ersten 'put'-Anweisung
+ist mehrdeutig, d.h. kann - je nach Reihenfolge der Auswertung - unter-
+schiedliche Ergebnisse als Resultat liefern. Beispiel:
+
+ a) (wert2 + 3 = 5) - (wert2 * wert3 = 6) = -1
+ b) ((wert2 + 3 = 5) - wert2 = 3) * 3 = 9
+
+Es kommt also auf die Reihenfolge der Auswertung von Operatoren an. Diese
+kann man durch die Angabe von Klammern steuern. Beispiel:
+
+ (a + b) * (a + b)
+
+Es wird jeweils erst 'a + b' ausgewertet und dann erst die Multiplikation
+durchgeführt. In ELAN ist es erlaubt, beliebig viel Klammernpaare zu ver-
+wenden (Regel: die innerste Klammer wird zuerst ausgeführt). Es ist sogar
+zulässig, Klammern zu verwenden, wo keine notwendig sind, denn überflüssige
+Klammernpaare werden überlesen. Beispiel:
+
+ ((a - b)) * 3 * ((c + d) * (c - d))
+
+Somit können wir beliebig komplizierte Ausdrücke formulieren. (Was man aber
+vermeiden sollte, weil sie leicht zu Fehlern führen. Stattdessen kann man
+einen komplizierten Ausdrücke in mehrere (einfachere) zerlegen.)
+
+Um solche Ausdrücke einfacher zu behandeln und sie so ähnlich schreiben zu
+können, wie man es in der Mathematik gewohnt ist, wird in Programmiersprachen
+die Reihenfolge der Auswertung von Operatoren festgelegt. In ELAN wurden
+neun Ebenen, Prioritäten genannt, festgelegt:
+
+
+Priorität Operatoren
+
+ 9 alle monadischen Operatoren
+ 8 **
+ 7 *, /, DIV, MOD
+ 6 +, -
+ 5 =, <>, <, <=, >, >=
+ 4 AND
+ 3 OR
+ 2 alle übrigen, nicht in dieser Tabelle aufgeführten
+ dyadischen Operatoren
+ 1 :=
+
+
+(Die bis jetzt noch nicht erwähnten Operatoren in der Tabelle werden wir in
+den weiteren Abschnitten besprechen.)
+
+Operatoren mit der höchsten Priorität werden zuerst ausgeführt, dann die mit
+der nächst höheren Priorität usw. Operatoren mit gleicher Priorität werden
+von links nach rechts ausgeführt. Dadurch ergibt sich die gewohnte Abarbei-
+tungsfolge wie beim Rechnen. Beispiel:
+
+ -2 + 3 * 2 ** 3
+
+ a) -2
+ b) 2 ** 3
+ c) 3 * (2 ** 3)
+ d) ((-2)) + (3 * (2 ** 3))
+
+Wie bereits erwähnt, ist es immer erlaubt, Klammern zu setzen. Ist man sich
+also über die genaue Abarbeitungsfolge nicht im Klaren, so kann man Klammern
+verwenden.
+
+
+Aufgabe (HSG):
+
+ Welche INT-Werte ergeben sich?
+
+ a) 14 DIV 4 e) -14 DIV -4
+ b) + 14 DIV 4 f) 2 * 3 DIV 2 ** 2 * 4
+ c) -14 DIV 4 g) 2 ** 3 ** 4
+ d) 14 DIV -4 h) 3 + 4 * 2 + 3
+
+Übungsziel: Arithmetische Ausdrücke
+
+
+Aufgabe (HSG):
+
+ Bilden Sie für folgende mathematische Formeln entsprechende ELAN-
+ Ausdrücke:
+
+ a b a+b
+ a) - c d) a g) - ---
+ b c
+
+
+ a+b b a c
+ b) --- e) -a h) - * -
+ c+d b d
+
+
+ a+b -b c
+ c) --- e f) a i) (a*b)
+ c+d
+
+Übungsziel: Arithmetische Ausdrücke formulieren
+
+
+
+Generische Operatoren und Prozeduren
+
+Bis jetzt wurden nur Ausdrücke mit INT-Operanden verwendet. Wie sieht es
+jetzt mit REALs aus?
+
+
+Programm 8:
+
+ put (1.0 + 2.0);
+ put (2.0 - 1.0);
+ put (2.0 * 3.0);
+ put (3.0 / 2.0);
+ put (2.0 ** 3.0)
+
+Man beachte die Unterschiede zum Programm 7: Wir müssen nun REAL-Denoter
+verwenden (mit INT-Denotern zu arbeiten wäre ein Fehler). Der Divisions-
+Operator hat sich nun von 'DIV' zu '/' gewandelt. Die Ergebnisse sind nun
+nicht INT-, sondern REAL-Werte. Für die Reihenfolge der Auswertung der
+Operatoren sowie die Verwendung von Klammern gilt das für INT-Ausdrücke
+gesagte.
+
+Wir haben den '+'-Operator in zwei verschiedenen Formen gesehen: in Programm
+7 mit Operanden vom Datentyp INT, ein INT-Resultat liefernd, und in Programm
+8 das gleiche mit REALs. Es liegen also zwei verschiedene Operatoren vor,
+die aber den gleichen Namen (Zeichen: '+') haben.
+
+In ELAN ist es somit möglich, unterschiedlichen Operatoren (aber auch Proze-
+duren) gleiche Namen zu geben. Solche Operatoren werden generische Opera-
+toren genannt. Ein ELAN-Compiler wählt den richtigen Operator aufgrund der
+Datentypen der Operanden aus. Oft werden die verfügbaren Operatoren wie folgt
+dokumentiert:
+
+ INT OP + (INT CONST links, rechts)
+
+Diese Form nennt man einen "Operator-Kopf". Sie wird in ELAN-Programmen bei
+der Definition von Operatoren benötigt. Dabei steht OP für "OPERATOR". Die
+Angabe des Datentyps davor gibt den Datentyp des Resultats des Operators an.
+Zwischen 'OP' und der öffnenden Klammer steht der Name des Operators (hier:
+'+'). In den Klammern werden die Datentypen und das Accessrecht der
+Operanden angegeben. CONST bedeutet hier: der Operand darf vom Operator
+nicht verändert werden, während bei VAR (was normalerweise ja nicht sein
+sollte!) ein Operand bei der Abarbeitung eines Operators verändert werden
+kann.
+
+Damit wir solche Definitionen besser beherrschen, geben wir noch weitere
+Beispiele an:
+
+ INT OP - (INT CONST operand)
+ REAL OP / (INT CONST l, r)
+
+Bei dem ersten Operator handelt es sich um den monadischen Operator '-' für
+INT-Operanden (z.B.: 'INT VAR a :: 1; put (-a)'), während es sich bei dem
+zweiten Operator um eine Divisions-Operator handelt, der jedoch ein REAL-
+Resultat liefert (z.B.: 'put (3 / 2)' liefert 1.5). Der MOD-Operator liefert
+den Rest einer Division:
+
+ INT OP MOD (INT CONST l, r)
+ REAL OP MOD (REAL CONST l, r)
+
+Die Beschreibung von generischen Prozeduren verläuft analog. Beispiele:
+
+ PROC put (INT CONST wert)
+ PROC put (REAL CONST wert)
+
+Hier wird das Wort 'OP' durch 'PROC' (für 'PROCEDURE') ersetzt. Die Angaben
+in Klammern bezeichnen nun nicht Operanden, sondern Parameter.
+
+Über die verfügbaren Operatoren und Prozeduren für INT- und REAL-Datenob-
+jekte kann man sich im ELAN-Handbuch oder im EUMEL-Benutzerhandbuch infor-
+mieren. Einige - aber nicht alle - der Operatoren und Prozeduren (auch für
+andere Datentypen) werden wir erklären, wenn wir sie in Programmen benötigen.
+
+
+
+Die Zuweisung
+
+Ein spezieller Operator ist die Zuweisung (Zeichen: ':='). Dieser Operator
+hat immer die geringste Priorität, wird also immer als letzter eines Aus-
+drucks ausgeführt. Die Zuweisung wird verwendet, um einer Variablen einen
+neuen Wert zu geben. Beispiel:
+
+ a := b
+
+Hier wird der Wert von 'b' der Variablen 'a' zugewiesen. Der vorher vor-
+handene Wert von 'a' geht dabei verloren. Man sagt auch, der Wert wird über-
+schrieben. Auf der rechten Seite (also als rechter Operand) des ':='
+Operators darf auch ein Ausdruck stehen. Beispiel:
+
+ a := b + c
+
+Hier wird das Resultat von 'b + c' an die Variable 'a' zugewiesen. Man be-
+achte dabei die Prioritäten der Operatoren '+' (Priorität 6) und ':=' (Pri-
+orität 1): die Addition wird vor der Zuweisung ausgeführt. Die Auswertung
+von Zuweisungen mit Ausdrücken muß immer so verlaufen, da die Zuweisung
+stets die niedrigste Priorität aller Operatoren hat.
+
+Schauen wir uns zum besseren Verständnis die Definitionen des (natürlich
+auch generischen) Operators ':=' an:
+
+ OP := (INT VAR ziel, INT CONST quelle)
+ OP := (REAL VAR ziel, REAL CONST quelle)
+ OP := (TEXT VAR ziel, TEXT CONST quelle)
+ OP := (BOOL VAR ziel, BOOL CONST quelle)
+
+Der Operator ':=' liefert also kein Resultat (man sagt auch, er liefert
+keinen Wert) und verlangt als linken Operanden ein VAR-Datenobjekt (an den
+der Wert der rechten Seite zugewiesen werden soll). Der Wert des linken
+Operanden wird also verändert. Für den rechten Operanden ist durch CONST
+sichergestellt, daß er nur gelesen wird.
+
+Oft kommt es vor, daß ein Objekt auf der linken und rechten Seite des Zuwei-
+sungsoperators erscheint, z.B. wenn ein Wert erhöht werden soll. Beispiele:
+
+ a := a + 1;
+ a := a + 17
+
+Hier wird der "alte", aktuelle Wert von 'a' genommen, um '1' erhöht und dem
+Objekt 'a' zugewiesen. Man beachte, daß hier in einer Anweisung ein Datenob-
+jekt unterschiedliche Werte zu unterschiedlichen Zeitpunkten haben kann.
+
+In solchen Fällen darf man den Operator INCR verwenden:
+
+ a INCR 1;
+ a INCR 17
+
+Analoges gilt für den Operator DECR, bei dem ein Wert von einer Variable
+subtrahiert wird. Also:
+
+ OP INCR (INT VAR ziel, INT CONST dazu)
+ OP INCR (REAL VAR ziel, REAL CONST dazu)
+
+ OP DECR (INT VAR ziel, INT CONST abzug)
+ OP DECR (REAL VAR ziel, REAL CONST abzug)
+
+Schauen wir uns folgendes Programm an, bei dem zwei Werte vertauscht werden:
+
+
+Programm 9:
+
+ INT VAR a, b, x;
+
+ get (a);
+ get (b);
+ x := a;
+ a := b;
+ b := x;
+ put (a);
+ put (b)
+
+Wie wir an diesem Beispiel sehen, existieren nicht nur 'put'-Prozeduren,
+sondern auch 'get'-Prozeduren, die einen Wert vom Eingabemedium einlesen.
+Es gibt folgende 'get'- Prozeduren (die 'put'-Prozeduren führen wir der
+Vollständigkeit halber auch mit auf):
+
+ PROC get (INT VAR wert)
+ PROC get (REAL VAR wert)
+ PROC get (TEXT VAR wert)
+
+ PROC put (INT CONST wert)
+ PROC put (REAL CONST wert)
+ PROC put (TEXT CONST wert)
+
+
+Aufgabe (HSG):
+
+ Was versteht man unter Generizität?
+ Übungsziel: Generizitäts-Begriff
+
+
+
+Refinements
+
+Bevor wir die Operationen für TEXTe und BOOLs besprechen, wollen wir eine
+weitere wichtige Eigenschaft von ELAN diskutieren, nämlich die Namensgebung.
+Namen für Datenobjekte haben wir bereits kennengelernt. In ELAN ist es eben-
+falls möglich, Namen für Ausdrücke oder eine bzw. mehrere Anweisungen zu
+vergeben.
+
+
+Programm 10:
+
+ INT VAR a, b, x;
+ einlesen von a und b;
+ vertauschen von a und b;
+ vertauschte werte ausgeben.
+
+ einlesen von a und b:
+ get (a);
+ get (b).
+
+ vertauschen von a und b:
+ x := a;
+ a := b;
+ b := x.
+
+ vertauschte werte ausgeben:
+ put (a);
+ put (b).
+
+Dies ist das gleiche Programm wie das 9. Beispielprogramm. Für den Namen
+'einlesen von a und b' werden die Anweisungen 'get (a); get (b)' vom
+ELAN-Ãœbersetzer eingesetzt. Man kann also die ersten vier Zeilen des
+Programms als eigentliches Programm ansehen, wobei die Namen durch die
+betreffenden Anweisungen ersetzt werden. Eine solche Konstruktion wird in
+ELAN Refinement genannt. Was wird dadurch erreicht?
+
+Durch die sinnvolle Verwendung von Refinements wird ein Programm im Programm
+und nicht in einer separaten Beschreibung dokumentiert. Weiterhin kann ein
+Programm "von oben nach unten" ("top down") entwickelt werden: wir haben das
+obige - zugegeben einfache - Beispielprogramm in drei Teile zerlegt und
+diese durch Namen beschrieben. Bei der Beschreibung von Aktionen durch Namen
+sagen wir, was wir machen wollen und nicht wie, denn wir brauchen uns auf
+dieser Stufe der Programmentwicklung um die Realisierung der Refinements
+(noch) keine Sorgen zu machen. Das erfolgt erst, wenn wir genauer definieren
+müssen, wie das Refinement programmiert werden muß. Dabei können wir
+wiederum Refinements verwenden usw., bis wir auf eine Ebene "herunterge-
+stiegen" sind, bei dem eine (jetzt: Teil-) Problemlösung sehr einfach ist
+und wir sie direkt hinschreiben können. Wir beschäftigen uns also an jedem
+Punkt der Problemlösung nur mit einem Teilaspekt des gesamten Problems.
+Zudem sieht man - wenn die Refinements einigermaßen vernünftig verwendet
+werden - dem Programm an, wie die Problemlösung entstanden ist.
+
+Die Verwendung von Refinements hat also eine Anzahl von Vorteilen. Schauen
+wir uns deshalb an, wie die Refinements formal verwandt werden müssen. Das
+"Hauptprogramm" wird durch einen Punkt abgeschlossen, falls ein Refinement
+folgt. Ein Refinement besteht aus der Nennung des Refinement-Namens, der
+von einem Doppelpunkt gefolgt sein muß. In einem Refinement kann eine
+Anweisung oder mehrere - durch Semikolon getrennt - stehen. Das Refinement
+wird durch einen Punkt abgeschlossen.
+
+Refinements können auch dort verwendet werden, wo ein Wert erwartet wird,
+z.B. in einem Ausdruck oder einer 'put'-Anweisung. In diesem Fall muß das
+Refinement natürlich einen Wert liefern. Wie macht man das? Eine Möglichkeit
+ist, daß im Refinement ein Ausdruck geschrieben wird, der einen Wert als
+Resultat liefert.
+
+
+Programm 11:
+
+ INT VAR a :: 1, b :: 2, c :: 3;
+ put (resultat).
+
+ resultat:
+ (a * b + c) ** 3.
+
+Eine Zuweisung liefert - wie bereits erwähnt - kein Resultat. Es ist auch
+erlaubt, ein Refinement mit mehreren Anweisungen zu schreiben, das einen Wert
+liefert. Allgemeine Regel: die letzte Anweisung eines Refinements bestimmt,
+ob ein Refinement einen Wert liefert - und wenn ja, von welchen Datentyp.
+
+
+
+BOOLesche Operationen
+
+Für BOOLesche Datenobjekte gibt es einige Operatoren:
+
+ BOOL OP AND (BOOL CONST links, rechts)
+ BOOL OP OR (BOOL CONST links, rechts)
+ BOOL OP NOT (BOOL CONST operand)
+
+Der Operator AND liefert als Resultat die logische "und"-Verknüpfung (nur
+wenn beide Operanden den Wert TRUE haben ist das Resultat TRUE, sonst FALSE),
+OR ist das logische "oder" (nur wenn beide Operanden FALSE liefern, ist das
+Resultat FALSE, sonst TRUE) und die logische Negation NOT (als Resultat wird
+das "Gegenteil" geliefert).
+
+Ebenfalls wichtig sind die Vergleichs-Operatoren, die zwar keine BOOLeschen
+Operanden erwarten, aber ein BOOLesches Resultat liefern:
+
+ BOOL OP = (INT CONST links, rechts)
+ BOOL OP <> (INT CONST links, rechts)
+ BOOL OP < (INT CONST links, rechts)
+ BOOL OP <= (INT CONST links, rechts)
+ BOOL OP > (INT CONST links, rechts)
+ BOOL OP >= (INT CONST links, rechts)
+
+Diese Operatoren: = (gleich), <> (ungleich), < (kleiner), <= (kleiner
+gleich), > (größer), >= (größer gleich) gibt es auch noch für Operanden vom
+Datentyp REAL und TEXT. Da die Vergleichs-Operatoren ein BOOLesches Resultat
+liefern, kann man sie in BOOLeschen Ausdrücken verwenden. Zu beachten ist
+dabei die Priorität der Operatoren: die Vergleiche werden immer vor den
+Operatoren AND bzw. OR ausgeführt.
+
+
+Programm 12:
+
+ BOOL CONST kaufen;
+ kaufen := will ich AND NOT zu teuer.
+
+ will ich:
+ TEXT VAR produktname;
+ get (produktname);
+ produktname = "muesli" OR produktname = "vollkornbrot".
+
+ zu teuer:
+ INT VAR preis;
+ get (preis);
+ preis > 20.
+
+
+
+Aufgabe (HSG):
+
+ Welche BOOL-Werte ergeben sich?
+
+ a) TRUE AND FALSE e) TRUE AND TRUE OR TRUE
+ b) TRUE OR FALSE f) 10 < 3 AND 17 > 4
+ c) TRUE AND NOT FALSE g) 17 + 4 = 21 OR TRUE
+ d) NOT TRUE AND FALSE h) TRUE AND FALSE OR TRUE
+
+ Übungsziel: Boolesche Ausdrücke
+
+
+
+Abfragen
+
+BOOLesche Ausdrücke werden in einer speziellen Anweisung verwandt, der
+Abfrage:
+
+
+Programm 13:
+
+ INT VAR a, b;
+ get (a); get (b);
+ IF a > b
+ THEN vertausche a und b
+ END IF;
+ put (a); put (b).
+
+ vertausche a und b:
+ INT CONST x :: a;
+ a := b;
+ b := x.
+
+Das Refinement im THEN-Teil der bedingten Anweisung wird nur durchgeführt,
+wenn der BOOLesche Ausdruck ('a > b') den Wert TRUE liefert. Liefert er den
+Wert FALSE, wird die Anweisung, die der bedingten Anweisung folgt (nach END
+IF), ausgeführt. Programm 13 kann etwas anders geschrieben werden:
+
+
+Programm 14:
+
+ INT VAR a, b;
+ get (a); get (b);
+ IF a > b
+ THEN put (a);
+ put (b)
+ ELSE put (b);
+ put (a)
+ END IF.
+
+Der THEN-Teil wird wiederum ausgeführt, wenn die BOOLesche Bedingung
+erfüllt ist. Liefert sie dagegen FALSE, wird der ELSE-Teil ausgeführt.
+
+Die bedingte Anweisung gibt uns also die Möglichkeit, abhängig von einer
+Bedingung eine oder mehrere Anweisungen ausführen zu lassen. Dabei können
+im THEN- bzw. ELSE-Teil wiederum bedingte Anweisungen enthalten sein usw.
+Solche geschachtelten bedingten Anweisungen sollte man jedoch vermeiden,
+weil sie leicht zu Fehlern führen können (statt dessen durch Refinements
+realisieren). Man beachte auch die Einrückungen, die man machen sollte, um
+die "Zweige" besonders kenntlich zu machen.
+
+
+Aufgabe (HSG):
+
+ a) In welcher Reihenfolge werden Operatoren ausgewertet?
+ b) Reihenfolge der Auswertung von: a + b + c
+ c) INT VAR a, b, c;
+ ...
+ IF NOT a = 0 AND b = 0 THEN...
+ ergibt einen syntaktischen Fehler. Welchen?
+ d) Wie wird der BOOLesche Ausdruck ausgewertet?
+ INT VAR a :: 0, b :: 4;
+ ...
+ IF a = 0 AND b DIV a > 0
+ e) Warum ist
+ BOOL VAR ende :: TRUE;
+ ...
+ IF ende = TRUE
+ THEN...
+ Unsinn?
+
+ Übungsziel: Reihenfolge der Auswertung von Ausdrücken
+
+Bei Abfrageketten kann das ELIF-Konstrukt eingesetzt werden. (ELIF ist eine
+Zusammenziehung der Worte ELSE und IF). Anstatt
+
+ ...
+ IF bedingung1
+ THEN aktion1
+ ELSE IF bedingung2
+ THEN aktion2
+ ELSE aktion3
+ END IF
+ END IF;
+ ...
+
+kann man besser
+
+ ...
+ IF bedingung1
+ THEN aktion1
+ ELIF bedingung2
+ THEN aktion2
+ ELSE aktion3 END IF;
+ ...
+
+schreiben.
+
+Die bedingte Anweisung kann auch einen Wert liefern. In diesem Fall muß der
+ELSE-Teil vorhanden sein und jeder Zweig den gleichen Datentyp liefern
+(jeweils die letzte Anweisung muß einen Wert liefern).
+
+
+Aufgabe (HSG):
+
+ Was berechnen folgende (Teil-) Programme?
+
+ a) INT VAR a;
+ get (a);
+ put (wert).
+
+ wert:
+ IF a < 0
+ THEN -a
+ ELSE a
+ END IF.
+
+ b) INT VAR brutto, netto;
+ get (brutto);
+ berechne gehalt;
+ put ("mein gehalt:");
+ put (netto).
+
+ berechne gehalt:
+ IF jahresverdienst > 30 000 (* zu wenig? *)
+ THEN sonderabgabe
+ END IF;
+ netto := brutto - brutto DIV 100 * 20.
+
+ jahresverdienst:
+ brutto * 12.
+
+ sonderabgabe:
+ brutto := brutto - brutto DIV 100 * 30
+
+ c) INT VAR x;
+ ...
+ put (signum).
+
+ signum:
+ IF x > 0
+ THEN 1
+ ELSE kleiner gleich
+ END IF.
+
+ kleiner gleich:
+ IF x = 0
+ THEN 0
+ ELSE -1
+ END IF.
+
+
+
+TEXTe
+
+TEXT-Denoter haben wir bereits kennengelernt. Im folgenden Programm stellen
+wir die Wirkung einiger TEXT-Operationen vor.
+
+
+Programm 15:
+
+ TEXT VAR a, b, c;
+ a := "ELAN";
+ b := "-Programm";
+ c := a + b;
+ put (c)
+
+Der Operator
+
+ TEXT OP + (TEXT CONST links, rechts)
+
+liefert als Ergebnis einen TEXT, bei dem an den linken der rechte Operand
+angefügt wurde (Fachausdruck: "Konkatenation"). Weitere Operatoren:
+
+ TEXT OP CAT (TEXT VAR ziel, TEXT CONST dazu)
+ TEXT OP * (INT CONST i, TEXT CONST a)
+ TEXT OP SUB (TEXT CONST t, INT CONST pos)
+
+Der Operator CAT fügt an einen TEXT einen zweiten an ('a CAT b' wirkt wie
+'a := a + b'). Mit dem '*'-Operator kann man einen TEXT vervielfältigen
+(Beispiel: 17 * "--"), während man mit SUB ein Zeichen aus einem TEXT her-
+ausholen kann (Beispiel: "ELAN" SUB 3 liefert "A").
+
+Die meisten TEXT-Operationen sind als Prozeduren realisiert, weil mehr als
+zwei Operanden benötigt werden. Die Wirkung einiger Operationen geben wir in
+kurzen Kommentaren an:
+
+ TEXT PROC subtext (TEXT CONST t, INT CONST von)
+ (* rechter Teiltext von 't' von der Position 'von' bis Ende *)
+
+ TEXT PROC subtext (TEXT CONST t, INT CONST von, bis)
+ (* Teiltext von 't' von der Position 'von' bis 'bis' *)
+
+ PROC change (TEXT VAR t, TEXT CONST old, new)
+ (* Ersetzung von 'old' in 'new' im TEXT 't' *)
+
+ INT PROC length (TEXT CONST t)
+ (* Anzahl Zeichen von 't' *)
+
+ INT PROC pos (TEXT CONST t, muster)
+ (* Die Position des ersten Auftretens von 'muster' in 't' *)
+
+Die Vergleichs-Operatoren für TEXTe arbeiten bei dem Vergleich nach der
+alphabetischen Reihenfolge ('"a" < "b"' liefert TRUE). Dabei definiert ELAN
+nur die Reihenfolge innerhalb der kleinen und großen Buchstaben und Ziffern.
+Das Leerzeichen ("#ib#blank#ie#") ist jedoch stets das "kleinste" Zeichen.
+Wie diese "Zeichenblöcke" und die restlichen Zeichen angeordnet sind, wurde
+nicht spezifiziert. Ob '"a" < "Z"' TRUE oder FALSE liefert, wurde also nicht
+festgelegt und ist somit rechnerspezifisch. Anmerkung: Im EUMEL-Betriebs-
+system wird der ASCII-Zeichencode, DIN 66 003 mit Erweiterungen verwandt.
+Die folgenden Vergleiche sind alle TRUE:
+
+ "otto" = "otto"
+ "a" < "z"
+ "Adam" < "Eva"
+ "hallo" < "hallu"
+ "hallo" < "hallo "
+ length ("ha") = 2
+ subtext ("ELAN-Programmierung", 14) = "ierung"
+
+
+Aufgabe (HSG):
+
+ Gib die Realisierung von folgenden vorgegebenen Prozeduren und Opera-
+ toren an:
+ a) TEXT PROC subtext (TEXT CONST t, INT CONST von) durch
+ TEXT PROC subtext (TEXT CONST t, INT CONST von, bis)
+ b) OP CAT (TEXT VAR a, TEXT CONST b) durch ':=' und '+'
+ c) TEXT OP SUB (TEXT CONST t, INT CONST p) durch 'subtext'
+
+ Ãœbungsziel: Lernen einiger vorgegebener TEXT-Operationen
+
+
+
+Die Wiederholungs-Anweisung
+
+Wiederholungs-Anweisungen ermöglichen es uns, Anweisungen wiederholt - meist
+in Abhängigkeit von einer Bedingung - ausführen zu lassen. Darum wird die
+Wiederholungs-Anweisung oft auch #ib#Schleife#ie# genannt, die in ihr ent-
+haltenen Anweisungen #ib#Schleifenrumpf#ie#. Die Schleife von ELAN baut auf
+einem Basis-Konstrukt auf:
+
+ REP
+ anweisungen
+ END REP
+
+Diese Anweisungsfolge realisiert eine sogenannte "Endlosschleife", weil nicht
+spezifiziert wird, wann die Schleife beendet werden soll.
+
+Bei der abweisenden Schleife wird die Abbruchbedingung an den Anfang der
+Schleife geschrieben:
+
+ WHILE boolesche bedingung REP
+ anweisungen
+ END REP
+
+Bei jedem erneuten Durchlauf durch die Schleife wird überprüft, ob der
+BOOLesche Ausdruck den Wert TRUE liefert. Ist das nicht der Fall, wird mit
+der nächsten, auf die Schleife folgenden Anweisung mit der Bearbeitung fort-
+gefahren. Die Schleife wird abweisende Schleife genannt, weil der Schleifen-
+rumpf nicht ausgeführt wird, wenn die Bedingung vor Eintritt in die Schleife
+bereits FALSE liefert.
+
+Anders verhält es bei der nicht abweisenden Schleife:
+
+ REP
+ anweisungen
+ UNTIL boolesche Bedingung END REP
+
+Hier wird der Schleifenrumpf auf jeden Fall einmal bearbeitet. Am Ende des
+Rumpfes wird die BOOLesche Bedingung abgefragt. Liefert diese den Wert FALSE,
+wird die Schleife erneut abgearbeitet. Liefert die Bedingung den Wert TRUE,
+wird die Schleife abgebrochen und mit der ersten Anweisung hinter der
+Schleife in der Bearbeitung fortgefahren.
+
+Bei beiden Arten der Wiederholungs-Anweisung ist es wichtig, daß Elemente
+der BOOLeschen Bedingung in der Schleife verändert werden, damit das
+Programm terminieren kann, d.h. die Schleife abgebrochen wird.
+
+Eine Endlos-Schleife wird bei der Zählschleife meist nicht vorkommen:
+
+ FOR i FROM anfangswert UPTO endwert REP
+ anweisungen
+ END REP
+
+Zählschleifen werden eingesetzt, wenn die genaue Anzahl der Schleifendurch-
+läufe bekannt ist. Hier wird eine Laufvariable verwendet (in unserem Bei-
+spiel 'i': sie muß mit INT VAR deklariert werden), die die INT-Werte von
+'anfangswert' bis 'endwert' in Schritten von '1' durchläuft. Diese Schleife
+zählt "aufwärts". Wird anstatt UPTO das Schlüsselwort DOWNTO verwendet, wird
+mit Schritten von -1 "abwärts" gezählt. Beispiel:
+
+ FOR i FROM endwert DOWNTO anfangswert REP
+ ...
+
+Für ein Beispielprogramm stellen wir uns die Aufgabe, aus TEXTen das Auf-
+treten des Buchstabens "e" herauszufinden. Die TEXTe sollen vom Eingabe-
+medium solange eingelesen werden, bis wir den TEXT "00" eingeben.
+
+
+Programm 16:
+
+ INT VAR anzahl e :: 0;
+ TEXT VAR wort;
+ REP
+ get (wort);
+ zaehle e im wort
+ UNTIL wort = "00" END REP;
+ put (anzahl e).
+
+ zaehle e im wort:
+ INT VAR i;
+ FOR i FROM 1 UPTO length (wort) REP
+ IF das i te zeichen ist e
+ THEN anzahl e INCR 1
+ END IF
+ END REP.
+
+ das i te zeichen ist e:
+ (wort SUB i) = "e".
+
+
+Aufgabe (HSG):
+
+ Die Klammern in dem letzten Refinement sind notwendig. Warum?
+
+Bevor wir ein Programm einem Rechner zur Bearbeitung übergeben, sollten wir
+uns davon überzeugen, daß das Programm wirklich das leistet, was es soll.
+Eine der wichtigsten Bedingungen ist die Terminierung eines Programms, d.h.
+das Programm darf nicht in eine Endlosschleife geraten. Unser Beispielpro-
+gramm terminiert, wenn beide Schleifen terminieren: die obere Schleife
+terminiert durch das Endekriterium, während die zweite Schleife automatisch
+durch die Zählschleife begrenzt wird. Das Programm wird also auf jeden Fall
+beendet (kann in keine Endlosschleife geraten), falls das Endekriterium ein-
+gegeben wird.
+Interessant sind dabei immer "Grenzfälle", wie z.B. die Eingabe eines
+"leeren Textes", sehr lange TEXTe usw.
+
+
+Aufgabe (HSG):
+
+ Welche Fehler befinden sich in den folgenden Programmteilen?
+ a) INT VAR i;
+ FOR i FROM 1 UPTO i REP
+ tue irgendwas
+ END REP
+
+ b) BOOL CONST noch werte :: TRUE;
+ INT VAR i;
+ WHILE noch werte REP
+ get (i);
+ ...
+ IF i = O
+ THEN noch werte := FALSE
+ END IF
+ END REP
+
+ c) INT VAR anz berechnungen :: 1;
+ REP
+ lies eingabe wert;
+ berechnung;
+ drucke ausgabewert
+ UNTIL anz berechnungen > 10 END REP.
+
+ d) INT VAR anz berechnungen;
+ WHILE anz berechnungen <= 10 REP
+ lies eingabewert;
+ berechnung;
+ drucke ausgabewert;
+ anz berechnungen INCR 1
+ END REP.
+
+ e) INT VAR n := 1, summe;
+ summe der ersten 100 zahlen.
+
+ summe der ersten 100 zahlen:
+ WHILE n < 100 REP
+ summe := summe + n;
+ n INCR 1
+ END REP.
+ (* Achtung: 2 Fehler! (Vorwarnen ist feige) *)
+
+ f) INT VAR n := 1;
+ REP
+ INT VAR summe := 0;
+ summe := summe + n;
+ n INCR 1
+ UNTIL n = 100 END REP
+ (* Achtung: 2 Fehler! *)
+
+ Ãœbungsziel: Arbeiten mit Schleifen
+
+
+Das Programm 16 können wir etwas besser formulieren. Dazu wollen wir uns
+aber eine etwas andere Aufgabe stellen: wie viele Leerzeichen sind in einem
+Text? Zur Lösung dieser Aufgabe sollten wir den Text nicht wortweise ein-
+lesen, sondern zeilenweise. Dazu verwenden wir die Prozedur
+
+ PROC get (TEXT VAR t, INT CONST max length)
+
+die einen TEXT 't' mit maximal 'max length' Zeichen einliest. Auf dem
+EUMEL-System gibt es dafür auch die Prozedur 'getline'.
+
+
+Programm 17:
+
+ INT VAR anzahl blanks :: 0;
+ REP
+ lies zeile ein;
+ zaehle blanks
+ UNTIL zeile hat endekriterium END REP.
+
+ lies zeile ein:
+ TEXT VAR zeile;
+ get (zeile, 80).
+
+ zaehle blanks:
+ INT VAR von :: 1;
+ WHILE zeile hat ab von ein blank REP
+ anzahl blanks INCR 1;
+ von auf blank position setzen
+ END REP.
+
+ zeile hat ab von ein blank:
+ pos (zeile, " ", von) > 0.
+
+ von auf blank position setzen:
+ von := pos (zeile, " ", von).
+
+ zeile hat endekriterium:
+ pos (zeile, "00") > 0.
+
+
+Aufgabe (TSW):
+
+ Das Programm 17 enthält (mindestens) zwei Fehler. Finden Sie diese bitte
+ heraus.
+
+ Ãœbungsziel: Finden von Programmierfehlern.
+
+
+Aufgabe (HSG):
+
+ a) Welche Werte liefern folgende Ausdrücke für die Textvariable
+ TEXT VAR t :: "Das ist mein Text"
+ a1) pos (t, "ist")
+ a2) pos (t, "ist", 5)
+ a3) length (t)
+ a4) subtext (t, 14)
+ a5) subtext (t, 14, 17)
+
+ b) Welche Werte liefern folgende Ausdrücke für die Textkonstanten
+ TEXT CONST text :: "ELAN-Programm",
+ alphabet :: "abcde...xyz"
+ b1) 3 * text
+ b2) length ("mein" + text + 3 * "ha")
+ b3) 3 * "ha" < text
+ b4) pos (text, alphabet SUB 1)
+ b5) pos (text, subtext (alphabet, 7, 7))
+
+ c) Schreibe in anderer Form:
+ c1) subtext (text, 7, 7)
+ c2) change (text, "alt", "neu")
+ c3) INT VAR laenge :: length (text);
+ IF subtext (text, laenge, laenge) =...
+ c4) IF NOT (text = "aha")
+ THEN aktion 1
+ ELSE aktion 2
+ END IF
+
+ Übungsziel: TEXT-Ausdrücke und Prozeduren
+
+
+
+Die Repräsentation von Datentypen
+
+Wie bereits erwähnt, sind Datentypen Klassen von Objekten der realen Umwelt.
+Die Objekte eines Datentyps müssen in den Speicher eines Rechners abgebildet
+werden. Die Darstellung eines Objekts im Rechner wird Repräsentation genannt.
+Aus organisatorischen Gründen versucht man, immer feste, gleich große Ein-
+heiten für die Objekte eines Datentyps zu verwenden. Durch die Begrenzung auf
+feste Speicherplatzeinheiten ist der Wertebereich beschränkt. Diese Grenzen
+hat man beim Programmieren zu beachten.
+
+Beim Datentyp BOOL spielt die Repräsentation nur insoweit eine Rolle, daß
+man die zwei möglichen Werte mehr oder weniger speicheraufwendig realisieren
+kann. Eine Einschränkung des Wertebereichs gibt es nicht.
+
+Bei INTs ist jedoch eine Einschränkung des Wertebereichs gegeben. Für die
+Repräsentation von INTs sind Einheiten von 16, 32 Bit u.a.m. gebräuchlich.
+Es existiert die Möglichkeit, den größten INT-Wert mit Hilfe von
+
+ maxint
+
+zu erfragen. Z.B. ist 'maxint' für EUMEL-Systeme z.Zt. 32 767. Der kleinste
+INT-Wert ist oft nicht ' - maxint' (im EUMEL-System kann er unter 'minint'
+angesprochen werden). Ãœbersteigt ein Wert 'maxint', gibt es eine Fehler-
+meldung 'overflow', im andern Fall 'underflow'.
+
+REALs sind noch schwieriger. Durch die endliche Darstellung der Mantisse
+treten "Lücken" zwischen zwei benachbarten REALs auf. Deshalb ist bei Ver-
+wendung von REALs immer mit Repräsentationsfehlern zu rechnen. Dieses Thema
+der "Rundungsfehler" wollen wir hier jedoch nicht weiter vertiefen. Auf
+jeden Fall gibt es aber auch einen größten REAL-Wert
+
+ maxreal
+
+Bei TEXTen gibt es zwei Repräsentations-Schwierigkeiten. Einerseits werden
+TEXTe durch "irgendeinen" Code im Rechner repräsentiert, der z.B. bei Ver-
+gleichen verwendet wird. ELAN-Compiler auf Rechenanlagen mit unterschied-
+lichen Zeichencodes können daher unterschiedliche Ergebnisse liefern.
+Andererseits ist in ELAN nicht definiert, wie viele Zeichen maximal in einen
+TEXT passen, was ebenfalls vom Rechner bzw. von einem ELAN-Compiler abhängt.
+Auf dem EUMEL-System kann die maximale Anzahl Zeichen eines TEXTs durch
+'maxtext length' erfragt werden. Sie ist z.Z. '32 000'.
+
+
+
+Ein- und Ausgabe
+
+Wie Datenobjekte - auf einfache Weise - auf einem Ausgabemedium ausgegeben
+werden können, haben wir bereits geschildert (Prozedur 'put'). Die Ausgabe
+erfolgt solange auf einer Zeile, bis ein auszugebender Wert nicht mehr auf
+eine Zeile paßt. In diesem Fall wird die Ausgabe in die nächste Zeile pla-
+ziert. Zwischen den einzelnen Werten auf einer Zeile wird jeweils ein Blank
+Zwischenraum gelassen, um die Ausgaben voneinander zu trennen. Mit folgenden
+Prozeduren kann man die Ausgabe flexibel gestalten:
+
+ PROC line (* bewirkt einen Zeilenvorschub *)
+
+ PROC line (INT CONST anzahl) (* bewirkt 'anzahl' Zeilenvorschübe *)
+
+ PROC page (* bewirkt einen Seitenvorschub auf
+ einem Drucker oder löscht den Bild-
+ schirm und positioniert in die linke
+ obere Ecke *)
+
+ PROC putline (TEXT CONST zeile) (* gibt 'zeile' auf dem Bildschirm aus
+ und positioniert auf die nächste
+ neue Zeile *)
+
+ PROC cursor (INT CONST reihe, spalte) (* Positioniert die Schreibmarke
+ auf dem Bildschirm in die an-
+ gegebene Position *)
+
+Die Prozedur 'get' holt Eingaben vom Eingabemedium. Ein Element der Eingabe
+wird dabei durch ein Blank vom nächsten getrennt. Einige weitere Eingabe-
+Prozeduren:
+
+ PROC get (TEXT VAR t, TEXT CONST delimiter) (* die nächste Eingabe wird
+ nicht von einem Blank
+ begrenzt, sondern durch
+ 'delimiter' *)
+
+ TEXT PROC get (* dient zum Initialisieren *)
+
+ PROC inchar (TEXT VAR zeichen) (* wartet solange, bis ein Zeichen vom
+ Bildschirm eingegeben wird *)
+
+ TEXT PROC incharety (* Versucht ein Zeichen vom Bildschirm
+ zu lesen. Ist kein Zeichen vor-
+ handen, wird "" geliefert *)
+
+ PROC editget (TEXT VAR line) (* Bei der Eingabe kann 'line' editiert
+ werden *)
+
+ PROC get cursor (INT VAR zeile, spalte) (* Informationsprozedur, wo die
+ Schreibmarke aktuell steht *)
+
+
+
+Konvertierungen
+
+Manchmal ist es notwendig, eine Datentyp-Wandlung für ein Objekt vorzunehmen.
+Die Wandlungen von einem INT- bzw. einen REAL-Wert in einen TEXT und umge-
+kehrt sind relativ unkritisch:
+
+ TEXT PROC text (INT CONST value)
+ TEXT PROC text (REAL CONST value)
+ INT PROC int (TEXT CONST number)
+ REAL PROC real (TEXT CONST number)
+
+Aber bei der folgenden Prozedur 'int' gehen im allgemeinen Fall Informationen
+verloren (es wird abgeschnitten):
+
+ INT PROC int (REAL CONST value)
+ REAL PROC real (INT CONST value)
+
+Zusätzlich steht eine Informationsprozedur 'last conversion ok' zur Ver-
+fügung, die den Wert TRUE liefert, falls die letzte Konversion fehlerfrei
+war:
+
+ BOOL PROC last conversion ok
+
+Solche Abfragen sind notwendig, weil die Konversionsroutinen bei falschen
+Parameterwerten (z.B. 'int (maxreal)') nicht mit einer Fehlermeldung ab-
+brechen. Als Beispiel zeigen wir ein Programm zum Einlesen von Werten, von
+denen man nicht weiß, ob sie INT oder REAL sind. Darum kann auch nicht die
+'get'-Prozedur für INT oder REAL verwandt werden:
+
+
+Programm 18:
+
+ TEXT VAR eingabe element;
+ REP
+ get (eingabe element);
+ wert nach intwert oder realwert bringen;
+ berechnung
+ UNTIL ende ENDREP.
+
+ wert nach intwert oder realwert bringen:
+ IF pos (eingabe element, ".") > 0
+ THEN REAL VAR realwert :: real (eingabe element)
+ ELSE INT VAR intwert :: int (eingabe element)
+ END IF;
+ IF NOT last conversion ok
+ THEN put ("Fehler bei Konvertierung:" + eingabe element);
+ line
+ END IF.
+
+ berechnung:
+ ...
+
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil6b b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil6b
new file mode 100644
index 0000000..7fdaf39
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil6b
@@ -0,0 +1,1425 @@
+ EUMEL-Benutzerhandbuch
+
+
+ TEIL 6: Erste Hilfe in ELAN
+
+Prozeduren
+
+Prozeduren werden verwendet, wenn
+
+- Anweisungen und Datenobjekte unter einem Namen zusammengefaßt werden
+ sollen ("Abstraktion").
+
+- gleiche Anweisungen von mehreren Stellen eines Programms verwandt werden
+ sollen (Codereduktion) u.U. mit verschieden Datenobjekten (Parameter);
+
+- wenn Datenobjekte nur kurzfristig benötigt werden (dynamische Speicherver-
+ waltung) und diese nicht von dem gesamten Programm angesprochen werden
+ sollen (lokale, globale Datenobjekte);
+
+Im folgenden Programm stellen wir ein Fragment vor, in dem zwei Werte ver-
+tauscht werden. In der einen (linken) Lösung wird ein Refinement, in der
+anderen eine Prozedur verwandt.
+
+Programm 19:
+
+ ... PROC vertausche a und b:
+ IF a > b INT CONST x :: a;
+ THEN vertausche a und b a := b;
+ END IF; b := x
+ ... END PROC vertausche a und b;
+ vertausche a und b; ...
+ ... IF a > b
+ THEN vertausche a und b
+ vertausche a und b: END IF;
+ INT CONST x :: a; ...
+ a := b; vertausche a und b;
+ b := x. ...
+
+Beim ersten Hinsehen leisten beide Programme das Gleiche. Es gibt jedoch
+drei wichtige Unterschiede:
+
+1) Das Refinement 'vertausche a und b' wird zweimal (vom ELAN-Compiler)
+ eingesetzt, d.h. der Code ist zweimal vorhanden. Die Prozedur dagegen ist
+ vom Code nur einmal vorhanden, wird aber zweimal - durch das Aufführen
+ des Prozedurnamens - aufgerufen.
+
+2) Die Variable 'x' ist in der linken Programmversion während des gesamten
+ Ablauf des Programms vorhanden. Solche Datenobjekte nennt man statische
+ Datenobjekte oder auch (aus Gründen, die erst etwas später offensichtlich
+ werden) Paket-Objekte. Das Datenobjekt 'x' der rechten Version dagegen
+ ist nur während der Bearbeitung der Prozedur vorhanden. Solche Daten-
+ objekte, die nur kurzfristig Speicher belegen, werden dynamische Daten-
+ objekte genannt.
+
+ Prozeduren sind also ein Mittel, um die Speicherbelegung zu beeinflussen,
+ was besonders bei großen Datenobjekten notwendig ist.
+
+3) 'x' kann in der linken Programmversion - obwohl sie in einem Refinement
+ deklariert wurde - von jeder Stelle des Programms angesprochen werden.
+ Solche Datenobjekte werden globale Datenobjekte genannt. Das Datenobjekt
+ 'x' der Prozedur dagegen kann nur innerhalb der Prozedur angesprochen
+ werden, sie ist also ein lokales Datenobjekt hinsichtlich der Prozedur.
+ Innerhalb der Prozedur dürfen globale Datenobjekte (also Objekte, die
+ außerhalb von Prozeduren deklariert wurden) angesprochen werden.
+
+ Eine Prozedur in ELAN bildet im Gegensatz zu Refinements einen eigenen
+ Gültigkeitsbereich hinsichtlich Datenobjekten und Refinements, die inner-
+ halb der Prozedur deklariert werden. Prozeduren sind somit ein Mittel, um
+ die in ihr deklarierten Datenobjekte hinsichtlich der Ansprechbarkeit
+ nach Außen "abzuschotten".
+
+Prozeduren wie die in Programm 19 werden mit dem Schlüsselwort PROC, dem
+Namen der Prozedur und einem Doppelpunkt eingeleitet. Dies nennt man den
+Prozedurkopf. Der Prozedurkopf entspricht den Definitionen, die wir bereits
+in vorigen Abschnitten dieses Skripts gegeben haben. Nach dem Prozedurkopf
+folgt der Prozedurrumpf, der Datenobjekt-Deklarationen, Anweisungen und
+Refinements enthalten kann. Abgeschlossen wird die Prozedur durch END PROC
+und dem Prozedurnamen.
+
+
+Aufgabe (HSG):
+
+ a) Erkläre den Unterschied zwischen einer Prozedur und einem Refinement.
+ b) Was sind globale bzw. lokale Datenobjekte?
+Übungsziel: Begriffe, die mit Prozeduren zusammenhängen
+
+
+Aufgabe (TSW):
+
+ Gegeben sei folgendes Programmfragment:
+ INT VAR a, b;
+ ... (*1*)
+ PROC x:
+ INT VAR x1;
+ ... (*2*)
+ END PROC x;
+ TEXT VAR t;
+ PROC y:
+ REAL VAR y1
+ ... (*3*)
+ END PROC y;
+ ... (*4*)
+
+ 1.) Welche Objekte (einschließlich Prozeduren) sind an den Punkten
+ (*1*) :
+ (*2*) :
+ (*3*) :
+ (*4*) :
+ ansprechbar?
+
+ 2.) Welche Datenobjekte sind in der Prozedur 'y'
+ global:
+ lokal:
+Ãœbungsziel: Globale und lokale Objekte
+
+
+Prozeduren mit Parametern erlauben es, gleiche Anweisungen mit unterschied-
+lichen Datenobjekten auszuführen:
+
+
+Programm 20:
+
+ PROC vertausche (INT VAR a, b):
+ INT VAR x :: a;
+ a := b;
+ b := x
+ END PROC vertausche;
+
+ INT VAR eins :: 1,
+ zwei :: 2,
+ drei :: 3;
+ vertausche (eins, zwei);
+ vertausche (zwei, drei);
+ vertausche (eins, zwei);
+ put (eins); put (zwei); put (drei)
+
+Die Datenobjekte 'a' und 'b' der Prozedur 'vertausche' werden formale Para-
+meter genannt. Sie stehen als Platzhalter für die bei einem Prozeduraufruf
+einzusetzenden aktuellen Parameter (in unserem Beispiel die Datenobjekte
+'eins', 'zwei' und 'drei').
+
+
+Aufgabe (HSG):
+
+ Welche Werte werden in dem Programm 20 ausgedruckt?
+Ãœbungsziel: Arbeiten mit Prozeduren und Parameter-Mechanismus.
+
+
+Parameter werden im Prozedurkopf nach dem Prozedurnamen in Klammern mit
+Datentyp und Accessrecht angegeben. Dabei bedeutet CONST, daß auf den
+Parameter nur lesend zugegriffen wird, während auf einen VAR-Parameter auch
+z.B. eine Zuweisung angewandt werden kann. CONST-Parameter sind also
+Eingabe-Parameter, während VAR-Parameter Ein-/Ausgabe-Parameter realisieren.
+
+Bei den aktuellen Parametern ist folgendes zu beachten:
+
+a) Wird ein VAR-Parameter in der Definition der Prozedur vorgeschrieben (wie
+ z.B. im Programm 20), darf kein Ausdruck als aktueller Parameter "überge-
+ ben" werden, weil an einen Ausdruck nichts zugewiesen werden kann.
+ Gegenbeispiel:
+
+ vertausche ( eins * zwei, drei)
+
+ Ausdrücke haben - wie bereits erwähnt - das Accessrecht CONST.
+
+b) Wird ein CONST-Parameter verlangt, dann darf in diesem Fall ein Ausdruck
+ als aktueller Parameter geschrieben werden. Aber auch ein VAR-Datenobjekt
+ darf angegeben werden. In diesem Fall wird eine Wandlung des Accessrechts
+ (CONSTing) vorgenommen: der aktuelle Parameter erhält sozusagen für die
+ Zeit der Abarbeitung der Prozedur das Accessrecht CONST.
+
+Es ist auch möglich, Prozeduren als Parameter zu definieren, worauf wir aber
+hier nicht eingehen wollen.
+
+Eine Werte liefernde Prozedur erhält man, wenn der Prozedurrumpf einen Wert
+liefert, d.h. die letzte ausführbare Anweisung des Prozedurrumpfes muß einen
+Wert liefern (analog Werte liefernde Refinements) und der zu liefernde
+Datentyp vor den Prozedurkopf geschrieben wird.
+
+
+Programm 21:
+
+ INT PROC max (INT CONST a, b):
+ IF a > b
+ THEN a
+ ELSE b
+ END IF
+ END PROC max;
+
+ put (max (3, 4))
+
+(In unserem Beispiel liefert die IF-Anweisung einen Wert. Das erfolgt da-
+durch, daß beide Zweige der Anweisung einen Wert liefern.)
+
+
+
+Neudefinierte Operatoren
+
+Neue, zusätzliche Operatoren können in ELAN wie Prozeduren definiert werden.
+Es ist nur notwendig, bei der Definition das Wort PROC gegen OP zu vertau-
+schen. Es sind aber auch nur 1 oder 2 Parameter bei Operatoren erlaubt.
+
+
+Programm 22a:
+
+ TEXT OP * (INT CONST mal, TEXT CONST t):
+ INT VAR zaehler :: mal;
+ TEXT VAR ergebnis :: "";
+ WHILE zaehler > 0 REP
+ ergebnis := ergebnis + t;
+ zaehler := zaehler - 1
+ END REP;
+ ergebnis
+ END OP *;
+
+Dieser Operator vervielfältigt TEXTe ( 2 * "ha" liefert "haha"). Der Name
+des Operators ist '*'. Man kann als Operatornamen die vorhandenen, bereits
+benutzten Sonderzeichen verwenden. In diesem Fall bekommt der neudefinierte
+Operator die gleiche Priorität wie der bereits vorhandene oder ein Schlüssel-
+wort.
+
+Der "Aufruf" eines Operators unterscheidet sich von einer Prozedur durch die
+infix-Schreibweise. Im übrigen gilt das für Prozeduren Gesagte.
+
+
+
+Optimierungen
+
+Optimierungen werden vorgenommen, wenn man mit den Laufzeiten bzw. Speicher-
+bedarf eines Programms nicht zufrieden ist. Kleinere, lokale Optimierungen
+sind meist nicht sinnvoll und notwendig und bringen mehr Fehler, als Ver-
+besserungen:
+
+
+Programm 22b:
+
+ TEXT OP * (INT CONST mal, TEXT CONST t):
+ INT VAR i;
+ TEXT VAR ergebnis :: "";
+ FOR i FROM 1 UPTO mal REP
+ ergebnis CAT t
+ END REP;
+ ergebnis
+ END OP *;
+
+Wir haben hier die WHILE-Schleife durch eine Zählschleife und 'ergebnis :=
+ergebnis + t' durch 'ergebnis CAT t' ersetzt. Dies ist nur eine minimale
+Optimierung (wenn sie überhaupt etwas einbringt). Leider sind solche
+"Optimierungen" sehr häufig anzutreffen. Besser ist es, eine Lösung zu
+finden, die algorithmisch oder von den Datenstrukturen her prinzipiell
+besser ist. Wir haben dies für das Programm 22 getan. Lösungsidee: jeweilige
+Verdopplung eines Zwischentextes ("Russische Multiplikation").
+
+
+Programm 22c:
+
+ TEXT OP * (INT CONST mal, TEXT CONST t):
+ INT VAR zaehler :: mal;
+ TEXT VAR einer :: "",
+ dopplung :: t;
+ IF fehlerhafter aufruf
+ THEN LEAVE * WITH ""
+ ELSE verdopplung
+ END IF;
+ dopplung + einer.
+
+ fehlerhafter aufruf:
+ zaehler < 1.
+
+ verdopplung:
+ WHILE zaehler > 1 REP
+ IF zaehler ist ungerade
+ THEN einer CAT t
+ END IF;
+ dopplung CAT dopplung;
+ zaehler := zaehler DIV 2
+ END REP.
+
+ zaehler ist ungerade:
+ zaehler MOD 2 = 1.
+
+ END OP *;
+
+
+In diesem Programm wurde eine Anweisung verwendet (LEAVE), die wir im
+folgenden Abschnitt erklären wollen.
+
+
+
+Das LEAVE-Konstrukt
+
+Das LEAVE-Konstrukt wird verwendet, um eine benannte Anweisung (Refinement,
+Prozedur oder Operator) vorzeitig zu verlassen. Es ist auch möglich, mehr-
+fach geschachtelte Refinements zu verlassen. Durch eine (optionale)
+WITH-Angabe kann auch ein wertelieferndes Refinement verlassen werden.
+
+
+
+Reihungen
+
+Wir haben bis jetzt bereits zusammengesetzte algorithmische Objekte kennen-
+gelernt, die man unter einem Namen als Ganzes ansprechen kann (Prozeduren).
+Die gleiche Möglichkeit gibt es auch bei Datenobjekten, wobei wir gleich-
+artige oder ungleichartige Objekte zu einem Objekt zusammenfassen können.
+Zuerst zu der Zusammenfassung gleichartiger Datenobjekte, die in ELAN eine
+Reihung (ROW) genannt wird. Die einzelnen Objekte einer Reihung werden
+Elemente genannt. Beispiel (Deklaration einer Reihung von 10 INT-Elementen):
+
+ ROW 10 INT VAR feld
+
+Die Angabe hinter dem Schlüsselwort ROW muß ein INT-Denoter sein (oder
+durch ein LET definierter Name). Dabei ist ROW 10 INT ein (neuer, von den
+elementaren unterschiedlicher) Datentyp, für den keine Operationen definiert
+sind, außer der Zuweisung. Das Accessrecht (VAR in unserem Beispiel) und der
+Name ('feld') gilt - wie bei den elementaren Datentypen - für diesen neuen
+Datentyp, also für alle 10 Elemente.
+
+Warum gibt es keine Operationen außer der Zuweisung? Das wird uns sehr
+schnell einsichtig, wenn wir uns vorstellen, daß es ja sehr viele Datentypen
+(zusätzlich zu den elementaren) gibt, weil Reihungen von jedem Datentyp
+gebildet werden können:
+
+ ROW 1 INT ROW 1 REAL
+ ROW 2 INT ROW 2 REAL
+ : :
+ ROW maxint INT ROW maxint REAL
+
+ ROW 1 TEXT ROW 1 BOOL
+ ROW 2 TEXT ROW 2 BOOL
+ : :
+ ROW maxint TEXT ROW maxint BOOL
+
+Für die elementaren INT-, REAL-, BOOL- und TEXT-Datentypen sind
+unterschiedliche Operationen definiert. Man müßte nun für jeden dieser
+zusammengesetzten Datentypen z.B. auch 'get'- und 'put'-Prozeduren
+schreiben, was allein vom Schreibaufwand sehr aufwendig wäre. Das ist der
+Grund dafür, daß es keine vorgegebene Operationen auf zusammengesetzte
+Datentypen gibt.
+
+Zugegebenermaßen könnte man mit solchen Datentypen, die nur über eine Opera-
+tion verfügen (Zuweisung), nicht sehr viel anfangen, wenn es nicht eine wei-
+tere vorgegebene Operation gäbe, die #ib#Subskription#ie#. Sie erlaubt es,
+auf die Elemente einer Reihung zuzugreifen und den Datentyp der Elemente
+"aufzudecken". Beispiel:
+
+ feld [3]
+
+bezieht sich auf das dritte Element der Reihung 'feld' und hat den Datentyp
+INT. Für INT-Objekte haben wir aber einige Operationen, mit denen wir
+arbeiten können. Beispiele:
+
+ feld [3] := 7;
+ feld [4] := feld [3] + 4;
+ ...
+
+Eine Subskription "schält" also vom Datentyp ein ROW ab und liefert ein
+Element der Reihung. Die Angabe der Nummer des Elements in der Reihung nennt
+man Subskript (in unserem Fall '3'). Der Subskript wird in ELAN in eckigen
+Klammern angegeben, um eine bessere Unterscheidung zu den runden Klammern in
+Ausdrücken zu erreichen. Ein subskribiertes ROW-Datenobjekt kann also über-
+all da verwendet werden, wo ein entsprechender Datentyp benötigt wird (Aus-
+nahme: Schleifenvariable). Als Beispiel zeigen wir zwei Prozeduren, die eine
+Reihung einlesen bzw. ausgeben:
+
+
+Programm 23:
+
+ PROC get (ROW 10 INT VAR feld):
+ INT VAR i;
+ FOR i FROM 1 UPTO 10 REP
+ put (i); put ("tes Element bitte:");
+ get (feld [i]);
+ line
+ END REP
+ END PROC get;
+
+ PROC put (ROW 10 INT CONST feld):
+ INT VAR i;
+ FOR i FROM 1 UPTO 10 REP
+ put (i); put ("tes Element ist:");
+ put (feld [i]);
+ line
+ END REP
+ END PROC put
+
+
+Wie bereits erwähnt, ist es erlaubt, Reihungen überall dort zu verwenden, wo
+auch die elementaren Datentypen verwandt werden können, also auch als
+Parameter. Zudem haben wir die generischen Eigenschaften von Prozeduren in
+ELAN bei der Benennung der Prozeduren benutzt.
+
+Diese beiden Prozeduren benutzen wir gleich im nächsten Programm, welches
+10 Werte einliest und die Summe berechnet:
+
+
+Programm 24:
+
+ ROW 10 INT VAR werte;
+ lies werte ein;
+ summiere sie;
+ drucke die summe und einzelwerte.
+
+ lies werte ein:
+ get (werte).
+
+ summiere sie:
+ INT VAR summe :: 0, i;
+ FOR i FROM 1 UPTO 10 REP
+ summe INCR werte [i]
+ END REP.
+
+ drucke die summe und einzelwerte:
+ put (werte);
+ line;
+ put ("Summe:"); put (summe).
+
+
+Aufgabe (HSG):
+
+ Wie kann man vermeiden, daß 'summe > maxint' ("overflow"-Bedingung)
+ wird?
+
+
+Oft benötigt man die Werte einer Reihung sortiert. Das Programm 25 zeigt
+einen (sehr dummen und ineffizienten) Sortieralgorithmus:
+
+
+Programm 25:
+
+ ROW 10 INT VAR wert;
+ lies die werte ein;
+ sortiere in eine zweite liste;
+ drucke die zweite liste.
+
+ lies die werte ein:
+ get (wert).
+
+ sortiere in eine zweite liste:
+ INT VAR i;
+ FOR i FROM 1 UPTO 10 REP
+ suche kleinstes element aus der werte liste;
+ bringe dieses in die zweite liste;
+ entferne es aus der werte liste
+ END REP.
+
+ suche kleinstes element aus der werte liste:
+ INT VAR kleinstes element :: maxint, position kleinstes element :: 0, k;
+ FOR k FROM 1 UPTO 10 REP
+ IF wert [k] < kleinstes element
+ THEN kleinstes element := wert [k];
+ position kleinstes element := k
+ END IF
+ END REP.
+
+ bringe dieses in die zweite liste:
+ ROW 10 INT VAR liste2;
+ liste2 [i] := kleinstes element.
+
+ entferne es aus der werte liste:
+ wert [position kleinstes element] := maxint.
+
+ drucke die zweite liste:
+ put (liste2).
+
+Anmerkung: Bei diesem einfachen Sortieralgorithmus (der übrigens "lineare
+Auswahl" heißt), wurde der Wert 'maxint' als zulässiger Wert ausgeschlossen.
+Der Algorithmus ist ziemlich der schlechteste, den wir uns ausdenken können.
+Einmal braucht er den doppelten Speicherplatz für die zu sortierende Liste,
+andererseits sind für N Werte N*N Durchläufe durch die Liste notwendig (man
+sagt, der Algorithmus ist von der Ordnung N Quadrat).
+
+Da es möglich ist, von jedem Datentyp eine Reihung zu bilden, kann man
+natürlich auch von einer Reihung eine Reihung bilden:
+
+ ROW 5 ROW 10 INT VAR matrix
+
+Für eine "doppelte" Reihung gilt das für "einfache" Reihungen gesagte.
+Wiederum existieren keine Operationen für dieses Datenobjekt (außer der
+Zuweisung), jedoch ist es durch Subskription möglich, auf die Elemente zuzu-
+greifen:
+
+ matrix [3]
+
+liefert ein Datenobjekt mit dem Datentyp ROW 10 INT, für den wir bereits in
+Programm 23 die Prozeduren 'get' und 'put' geschrieben haben, die wir
+verwenden können:
+
+ get (matrix [4])
+
+Subskribieren wir jedoch 'matrix' nochmals, so erhalten wir ein INT:
+
+ matrix [2] [8]
+
+(jede Subskription "schält" von Außen ein ROW vom Datentyp ab).
+
+
+Aufgabe (HSG):
+
+ a) Geben Sie Datentyp, Accessrecht und Name der folgenden Datenobjekte
+ an:
+ ROW 17 INT CONST alpha;
+ ROW 3 ROW 4 TEXT VAR matrix;
+ ...
+ beta [3] := 7;
+ gamma [4] := gamma [5]
+
+ b) Was führt zu Fehlern? Wenn ja, warum?
+ ROW 17 INT VAR alpha;
+ ROW 3 ROW 4 TEXT VAR beta, gamma;
+ ROW 4 ROW 3 TEXT CONST delta;
+ INT VAR x :: 7;
+ ROW x BOOL VAR y;
+ get (alpha);
+ get (beta [7]);
+ FOR x FROM 1 UPTO 3 REP
+ get (beta [x])
+ END REP;
+ beta := delta;
+ delta [1] [2] := "mist";
+ beta := gamma;
+ beta [3] := gamma [3];
+ get (beta [1] [1]);
+ gamma [1] [5] := beta [1] [1] + "ELAN"
+ x := alpha [3];
+ x := 20;
+ alpha [x] := alpha [3] + 7
+Ãœbungsziel: Umgang mit Reihungen
+
+
+
+Strukturen
+
+Strukturen sind Datenverbunde wie Reihungen, aber die Komponenten können
+ungleichartige Datentypen haben. Die Komponenten von Strukturen heißen
+Felder (bei Reihungen: Elemente) und der Zugriff auf ein Feld Selektion
+(Reihungen: Subskription). Eine Struktur ist - genauso wie bei Reihungen -
+ein eigener Datentyp, der in einer Deklaration angegeben werden muß.
+Beispiel:
+
+ STRUCT (TEXT name, INT alter) VAR ich
+
+Wiederum existieren keine Operationen auf Strukturen außer der Zuweisung und
+der Selektion, die es erlaubt, Komponenten aus einer Struktur herauszulösen:
+
+ ich . name
+ ich . alter
+
+Die erste Selektion liefert einen TEXT-, die zweite ein INT-Datenobjekt. Mit
+diesen (selektierten) Datenobjekten kann - wie gewohnt - gearbeitet werden
+(Ausnahme: nicht als Schleifenvariable).
+
+Zum Datentyp einer Struktur gehören auch die Feldnamen:
+
+ STRUCT (TEXT produkt name, INT artikel nr) VAR erzeugnis
+
+ist ein anderer Datentyp als im ersten Beispiel dieses Abschnitts. Für
+Strukturen - genauso wie bei Reihungen - kann man sich neue Operationen
+definieren. Im folgenden Programm definieren wir für eine Struktur, die
+Personen beschreibt, die Operationen 'put', 'get' und den dyadischen
+Operator HEIRATET. Anschließend werden drei Paare verHEIRATET.
+
+
+Programm 26a:
+
+ PROC get (STRUCT (TEXT name, vorname, INT alter) VAR p):
+ put ("bitte Nachname:"); get ( p.name);
+ put ("bitte Vorname:"); get ( p.vorname);
+ put ("bitte Alter:"); get ( p.alter);
+ line
+ END PROC get;
+
+ PROC put (STRUCT (TEXT name, vorname, INT alter) CONST p):
+ put (p.vorname); put (p.name);
+ put ("ist");
+ put (p.alter);
+ put ("Jahre alt");
+ line
+ END PROC put;
+
+ OP HEIRATET
+ (STRUCT (TEXT name, vorname, INT alter) VAR w,
+ STRUCT (TEXT name, vorname, INT alter) CONST m):
+ w.name := m.name
+ END OP HEIRATET;
+
+ ROW 3 STRUCT (TEXT name, vorname, INT alter) VAR frau, mann;
+
+ personendaten einlesen;
+ heiraten lassen;
+ paardaten ausgeben.
+
+ personendaten einlesen:
+ INT VAR i;
+ FOR i FROM 1 UPTO 3 REP
+ get (frau [i]);
+ get (mann [i])
+ END REP.
+
+ heiraten lassen:
+ FOR i FROM 1 UPTO 3 REP
+ frau [i] HEIRATET mann [i]
+ END REP.
+
+ paardaten ausgeben:
+ FOR i FROM 1 UPTO 3 REP
+ put (frau [i]);
+ put ("hat geheiratet:"); line;
+ put (mann [i]); line
+ END REP.
+
+Reihungen und Strukturen dürfen miteinander kombiniert werden, d.h. es darf
+eine Reihung in einer Struktur erscheinen oder es darf eine Reihung von einer
+Struktur vorgenommen werden. Selektion und Subskription sind in diesen Fällen
+in der Reihenfolge vorzunehmen, wie die Datentypen aufgebaut wurden (von
+außen nach innen).
+
+
+Aufgabe (HSG):
+
+ In ELAN heissen
+ a1) Datenverbunde gleichartiger Komponenten:
+ a2) Datenverbunde ungleichartiger Komponenten:
+ b1) die Komponenten eines ROWs:
+ b2) die Komponenten eines STRUCTs:
+ c1) die Zugriffe auf die Komponenten eines ROWs:
+ c2) die Zugriffe auf die Komponenten eines STRUCTs:
+Ãœbungsziel: Begriffe von ROWs und STRUCTs kennenlernen
+
+
+
+LET-Konstrukt
+
+Wie wir in Programm 26 gesehen haben, ist die Verwendung von Strukturen
+oder auch Reihungen manchmal schreibaufwendig. Mit dem LET-Konstrukt darf
+man Datentypen (und Denotern) einen Namen geben. Dieser Name steht als
+Abkürzung und verringert so die Schreibarbeit. Zusätzlich wird durch die
+Namensgebung die Lesbarkeit des Programms erhöht. Beispiel:
+
+
+Programm 26b:
+
+ LET PERSON = STRUCT (TEXT name, vorname, INT alter);
+
+ PROC get (PERSON VAR p):
+ put ("bitte Nachname:"); get ( p.name);
+ put ("bitte Vorname:"); get ( p.vorname);
+ put ("bitte Alter:"); get ( p.alter);
+ line
+ END PROC get;
+
+ PROC put (PERSON CONST p):
+ put (p.vorname); put (p.name); put ("ist");
+ put (p.alter); put ("Jahre alt"); line
+ END PROC put;
+
+ OP HEIRATET (PERSON VAR f, PERSON CONST m):
+ f.name := m.name
+ END OP HEIRATET;
+
+ ROW 3 PERSON VAR mann, frau;
+ ...
+
+Überall wo der abzukürzende Datentyp verwandt werden kann, kann PERSON
+benutzt werden. Wohlgemerkt: PERSON ist kein neuer Datentyp, sondern nur ein
+Name, der für STRUCT (....) steht. Der Zugriff auf die Komponenten des
+abgekürzten Datentyps bleibt erhalten (was bei abstrakten Datentypen, die wir
+etwas später erklären, nicht mehr der Fall ist).
+
+Neben der Funktion der Abkürzung von Datentypen kann das LET-Konstrukt
+auch für die Namensgebung für die Denoter verwandt werden. Beispiele:
+
+ LET pi = 3.14159;
+ LET blank = " ";
+ LET anzahl = 27
+
+Der Einsatz von LET-Namen für INT-Denoter macht es möglich, Programme
+leicht zu ändern:
+
+
+Programm 26c:
+
+ LET anzahl paare = 3;
+ ROW anzahl paare PERSON VAR frau, mann;
+
+ personendaten einlesen;
+ heiraten lassen;
+ paardaten ausgeben.
+
+ personendaten einlesen:
+ INT VAR i;
+ FOR i FROM 1 UPTO anzahl paare REP
+ get (frau [i]);
+ get (mann [i])
+ END REP.
+ ...
+
+Ebenso wie die Abkürzung von Datentypen (LET PERSON = STRUCT (...)) wird
+im obigen Beispiel für den Namen 'anzahl paare' bei jedem Auftreten der
+Denoter '3' vom ELAN-Compiler eingesetzt. Um nun (z.B.) 27 Paare "heiraten"
+zu lassen, brauchen wir nur die LET-Anweisung in '27' zu verändern...
+(Scheidungen erfordern etwas mehr Aufwand).
+
+
+Aufgabe (HSG):
+
+ Was ist falsch?
+ LET anz = 5,
+ max = 5*5,
+ MAT = ROW anz ROW anz TEXT;
+
+ PROC get (MAT CONST m):
+ FOR i FROM 1 UPTO max REP
+ get (m [i])
+ END REP
+ END PROC get;
+
+ MAT VAR x,y;
+ get (x);
+ x := y + 1
+
+
+Aufgabe (HSG):
+
+ Schreibe ein Programm, das mit den Deklarationen
+ LET anz = 5,
+ VEC = ROW anz INT,
+ MAT = ROW anz VEC;
+ folgende Prozeduren realisiert:
+ PROC get (VEC VAR v)
+ PROC get (MAT VAR m)
+ PROC put (VEC CONST v)
+ PROC put (MAT CONST m)
+ INT PROC reihensumme (VEC CONST v)
+Ãœbungsziel: Reihungen als Parameter
+
+
+
+Denoter für Datenverbunde: Konstruktoren
+
+Denoter für die elementaren Datentypen haben wir kennengelernt. Oft ergibt
+sich auch die Notwendigkeit (z.B. bei Initialisierungen), Datenverbunde in
+einem Programm Werte zu geben. Das kann durch normale Zuweisungen erfolgen.
+Beispiel:
+
+ LET PERSON = STRUCT (TEXT name, vorname, INT alter);
+
+ PERSON VAR mann;
+
+ mann.name := "meier";
+ mann.vorname := "egon";
+ mann.alter := 27
+
+Aber man möchte auch Denoter für Datenverbunde z.B. in Ausdrücken verwenden,
+was durch die Konstruktoren ermöglicht wird. Beispiel:
+
+ LET PERSON = STRUCT (TEXT name, vorname, INT alter);
+
+ PERSON VAR mann, frau;
+
+ frau := PERSON : ( "niemeyer", "einfalt", 65);
+ frau HEIRATET PERSON : ( "meier", "egon", 27)
+
+Ein Konstruktor ist also ein Mechanismus, um ein Datenobjekt eines Datenver-
+bundes in einem Programm zu notieren. Ein Konstruktor besteht aus der Angabe
+des Datentyps (der auch durch einen LET-Namen abgekürzt sein darf), einem
+Doppelpunkt und den in Klammern eingefaßten Komponenten (hier Denoter).
+Besteht eine der Komponenten wiederum aus einem Datenverbund, muß inner-
+halb des Konstruktors wiederum ein Konstruktor eingesetzt werden usw. Kon-
+struktoren sind natürlich für Reihungen auch möglich:
+
+ ROW 7 INT VAR feld;
+ feld := ROW 7 INT : ( 1, 2, 3, 4, 5, 6, 7);
+
+
+Aufgabe (HSG):
+
+ Geben Sie Datentyp, Accessrecht und Name der folgenden Datenobjekte an:
+ STRUCT (INT alter, TEXT name) VAR mensch;
+ STRUCT (INT jahrgang, ROW 2 TEXT lage) CONST wein;
+ ROW 100 STRUCT (PERSON p, NUMMER n) VAR betriebsangehoeriger;
+ STRUCT (INT anz terminals, STRUCT (TEXT systemname, INT version) art)
+ CONST betriebsystem;
+ mensch := ...;
+ betriebsangehoeriger [2] := ...;
+ betriebsangehoeriger [2]. n := NUMMER: (...);
+ betriebsystem.art.systemname := "EUMEL";
+ wein.lage := ROW 2 TEXT: ("Loire", "Frankreich");
+ wein.lage [1] := "Kroever Nacktarsch";
+Ãœbungsziel: Umgang mit Strukturen.
+
+
+
+Rekursive Prozeduren und Operatoren
+
+Alle Prozeduren und Operatoren dürfen in ELAN rekursiv sein.
+
+
+Programm 27:
+
+ INT PROC fakultaet (INT CONST n):
+ IF n > 0
+ THEN fakultaet (n-1) * n
+ ELSE 1
+ END IF
+ END PROC fakultaet
+
+Dieses Beispiel ist aber (leider) kein gutes Beispiel für eine Rekursion,
+denn das Programm kann leicht in eine iterative Version umgewandelt werden:
+
+
+Programm 28:
+
+ INT PROC fakultaet (INT CONST n):
+ INT VAR prod :: 1, i;
+ FOR i FROM 2 UPTO n REP
+ prod := prod * i
+ END REP;
+ prod
+ END PROC fakultaet
+
+Die Umwandlung von einem rekursiven Programm in ein iteratives ist übrigens
+immer möglich, jedoch oft nicht so einfach wie in diesem Fall. Beispiel
+(Ackermann-Funktion):
+
+
+Programm 29:
+
+ INT PROC acker (INT CONST m, n):
+ IF m = 0
+ THEN n + 1
+ ELIF n = 0
+ THEN acker (m-1, 0)
+ ELSE acker (m - 1, acker (m, n - 1))
+ ENDIF
+ END PROC acker
+
+
+Aufgabe (HSG):
+
+ a) Beschreibe die Unterschiede zwischen Iteration und Rekursion. Worauf
+ muß man bei Rekursionen achten?
+ b) Wie groß ist der Wert von 'acker (2, 2)'? Hilfreicher Tip: stelle
+ dabei eine Tabelle auf!
+ c) Zudem enthält die Programmierung der Ackermann-Funktion (mindestens)
+ einen Fehler. Welchen?
+Ãœbungsziel: Umgang mit Rekursion
+
+
+Das eigentliche Einsatzgebiet von rekursiven Algorithmen liegt aber bei den
+'backtrack'-Verfahren. Diese werden eingesetzt, wenn eine exakte algorithmi-
+sche Lösung nicht bekannt ist oder nicht gefunden werden kann und man ver-
+schiedene Versuche machen muß, um zu einem Ziel (oder Lösung) zu gelangen.
+
+Als Beispielprogramm zeigen wir das Spiel "Maus sucht Käse". In einem Laby-
+rinth (realisiert durch eine Reihung von einer Reihung), das mit Hindernis-
+sen bestückt ist, wurde ein Käse versteckt. Eine sehr dumme Maus sucht
+systematisch die umliegenden Felder (in allen vier Himmelsrichtungen) nach
+dem Käse ab. Ist sie auf einem neuen Feld und ist das Feld frei, sucht sie
+erneut. Felder, auf denen sie bereits war, werden von ihr markiert. Da die
+Maus sehr kurzsichtig ist und nicht richtig riechen kann, bemerkt sie den
+Käse erst, wenn sie sozusagen mit allen vier Pfoten in ihm gelandet ist
+(analog bei Hindernissen, die nicht überklettert werden können). Damit die
+Maus nicht aus dem Labyrinth entfliehen kann, wird der Rand als Hindernis
+angesehen.
+
+
+(Teil-) Programm 30:
+
+ PROC suche weg (INT CONST x, y):
+ IF labyrinth [x] [y] = kaese
+ THEN kaese gefunden
+ ELIF labyrinth [x] [y] = frei
+ THEN suche weiter
+ END IF.
+
+ suche weiter:
+ labyrinth [x] [y] := markiert;
+ INT VAR richtung;
+ FOR richtung FROM osten UPTO sueden REP
+ versuche diese richtung
+ END REP;
+ labyrinth [x] [y] := frei.
+
+ versuche diese richtung:
+ IF richtung = osten
+ THEN suche weg (x + 1, y)
+ ELIF richtung = norden
+ THEN suche weg (x, y + 1)
+ ...
+
+
+
+Dateien
+
+Dateien werden benötigt, wenn
+
+- Daten über die Abarbeitungszeit eines Programms aufbewahrt werden sollen;
+- der Zeitpunkt oder Ort der Datenerfassung nicht mit dem Zeitpunkt oder Ort
+ der Datenverarbeitung übereinstimmt;
+- die gesamte Datenmenge nicht auf einmal in den Zentralspeicher eines
+ Rechners paßt;
+- die Anzahl und/oder Art der Daten nicht von vornherein bekannt sind.
+
+Eine Datei ("file") ist eine Zusammenfassung von Daten, die auf Massenspei-
+chern aufbewahrt wird. Dateien sind in bestimmten Informationsmengen, den
+Sätzen ("records") organisiert.
+
+In ELAN gibt es zwei Arten von Dateien:
+
+a) FILE: sequentielle Dateien. Die Sätze können nur sequentiell gelesen bzw.
+ geschrieben werden. Eine Positionierung ist nur zum nächsten Satz möglich.
+b) DIRFILE: indexsequentielle Dateien. Die Positionierung erfolgt direkt mit
+ Hilfe eines Schlüssels ("key") oder Index, kann aber auch sequentiell
+ vorgenommen werden.
+
+ Wichtig:
+ DIRFILEs sind auf dem EUMEL-System nicht implementiert! Deswegen wird
+ auf diesen Dateityp hier nicht weiter eingegangen.
+
+Dateien werden normalerweise von dem #ib#Betriebsystem#ie# eines Rechners
+aufbewahrt und verwaltet. Somit ist eine Verbindung von einem ELAN-Programm,
+in dem eine Datei unter einem Namen - wie jedes andere Datenobjekt auch -
+angesprochen werden soll, und dem Betriebsystem notwendig. Dies erfolgt durch
+sogenannte Assoziierungsprozeduren. Beispiele:
+
+ FILE VAR meine datei :: sequential file (output, "xyz");
+ FILE CONST eine andere datei :: sequential file (input, "abc")
+
+Die Assoziierungsprozedur heißt 'sequential file' für FILEs. Der erste
+Parameter einer Assoziierungsprozedur gibt immer die sogenannte Betriebs-
+richtung ("TRANSPUTDIRECTION") an. Es gibt folgende Betriebsrichtungen:
+
+ input nur Lesen der Datei
+ output nur Schreiben der Datei
+
+ Anmerkung:
+ Im EUMEL-System gibt es noch die Betriebsrichtung 'modify', die es er-
+ laubt, beliebig zu positionieren, Sätze zu löschen und/oder einzufügen
+ usw. Dafür gibt es keine DIRFILEs. Siehe dazu auch das Kapitel über
+ Dateien in diesem Benutzerhandbuch.
+
+Der zweite Parameter einer Assoziierungsprozedur gibt an, unter welchem
+Namen die Datei in dem Betriebsystem bekannt ist. Mit Hilfe dieses Namens
+wird die Datei an das Datenobjekt gekoppelt, das bei der FILE-Deklaration im
+Programm erzeugt wurde.
+
+Welche Operationen sind nun für Dateien zugelassen? Wir beschreiben die
+wichtigsten für die beiden Dateiarten und Betriebsrichtungen getrennt:
+
+a) FILE mit 'input' (nur lesen):
+
+ PROC getline (FILE CONST f, TEXT VAR zeile)
+ PROC get (FILE CONST f, TEXT VAR t)
+ PROC get (FILE CONST f, REAL VAR r)
+ PROC get (FILE CONST f, INT VAR i)
+ BOOL PROC eof (FILE CONST f)
+ (* Abfrageprozedur auf das Ende eines FILEs (letzter Satz) *)
+
+ Als Beispiel zeigen wir ein Programm, welches eine Datei liest und auf
+ dem Ausgabemedium ausgibt.
+
+
+ Programm 31:
+
+ FILE CONST f :: sequential file (input, "datei1");
+ TEXT VAR satz;
+ WHILE NOT eof (f) REP
+ getline (f, satz);
+ put (satz); line
+ END REP.
+
+b) FILE mit 'output' (nur schreiben):
+
+ PROC putline (FILE VAR f, TEXT CONST zeile)
+ PROC put (FILE VAR f, TEXT CONST t)
+ PROC put (FILE VAR f, REAL CONST r)
+ PROC put (FILE VAR f, INT CONST i)
+ PROC line (FILE VAR f, INT CONST zeilenzahl)
+
+
+Aufgabe (HSG):
+
+ a) Das Arbeiten mit Dateien ist manchmal notwendig, weil ...
+ b) Wenn man mit Dateien in ELAN arbeitet, sind Assoziierungsprozeduren
+ notwendig.
+ b1) Wie heißen diese?
+ b2) Was gibt man in diesen an?
+ c) Welche Betriebsrichtungen gibt es bei FILES und was bewirken sie?
+Ãœbungsziel: Datei-Begriffe
+
+
+Aufgabe (TSW):
+
+ Welche Fehler befinden sich in den folgenden Programmfragmenten?
+ a) FILE VAR f :: sequential file (input, "MIST");
+ TEXT VAR zeile;
+ REP
+ getline (f, zeile);
+ ...
+ UNTIL eof (f) END REP
+
+ b) FILE VAR f :: sequential file (output, "NOCHMAL");
+ TEXT VAR zeile;
+ REP
+ getline (f, zeile);
+ put (zeile)
+ UNTIL eof (f) END REP
+
+ c) FILE VAR f :: sequential file (input, "VERDAMMT"),
+ g :: sequential file (input, "DAEMLICH");
+ TEXT VAR zeile;
+ kopiere g in f.
+
+ kopiere g in f:
+ FOR i FROM 1 UPTO 100 REP
+ getline (g, zeile);
+ putline (f, zeile)
+ UNTIL eof (g) END REP.
+Ãœbungsziel: Arbeiten mit Dateien
+
+
+
+Programmstruktur 1
+
+Bis jetzt haben wir noch nicht vollständig erklärt, wie ein ELAN-Programm
+formal als Ganzes aufgebaut sein muß, d.h. wie und in welcher Reihenfolge
+die Anweisungen, Refinements, Prozeduren und Deklarationen geschrieben
+werden müssen.
+
+Ein ELAN-Programm kann aus mehreren Moduln (Bausteinen) aufgebaut sein,
+die in ELAN PACKETs genannt werden. Das letzte PACKET wird "main packet"
+genannt, weil in diesem das eigentliche Benutzerprogramm (Hauptprogramm)
+enthalten ist. In diesem Abschnitt wollen wir uns nur mit dem Aufbau eines
+solchen PACKETs beschäftigen. Wir werden dabei nicht alle Möglichkeiten
+besprechen, sondern nur die wichtigsten Anwendungen beschreiben, mit einer
+Empfehlung, in welcher Reihenfolge die Elemente geschrieben werden sollten.
+
+Ein "main packet" kann aus folgenden Elementen bestehen:
+
+a) Deklarationen und Anweisungen. Diese müssen nicht in einer bestimmten
+ Reihenfolge im Programm erscheinen, sondern es ist möglich, erst in dem
+ Augenblick zu deklarieren, wenn z.B. eine neue Variable benötigt wird. Es
+ ist jedoch gute Programmierpraxis, die meisten Deklarationen an den
+ Anfang eines Programms (außer z.B. Datenobjekte, die nur lokal oder
+ kurzfristig benötigt werden, wie Hilfsvariablen oder Laufvariablen) zu
+ plazieren.
+
+ <Deklarationen> ;
+ <Anweisungen>
+
+b) Deklarationen, Refinements und Anweisungen. In diesem Fall ist es notwen-
+ dig, die Refinements hintereinander zu plazieren. Refinement-Aufrufe
+ und/oder Anweisungen sollten textuell vorher erscheinen. Die Refinements
+ werden durch einen Punkt von den Aufrufen getrennt:
+
+ <Deklarationen> ;
+ <Refinement-Aufrufe und/oder Anweisungen> .
+ <Refinements>
+
+ Innerhalb der Refinements sind Anweisungen und/oder Deklarationen möglich.
+
+c) Deklarationen, Prozeduren und Anweisungen. Werden Prozeduren vereinbart,
+ sollte man sie nach den Deklarationen plazieren. Danach sollten die
+ Anweisungen folgen:
+
+ <Deklarationen> ;
+ <Prozeduren> ;
+ <Anweisungen>
+
+ Mehrere (parallele) Prozeduren werden durch ";" voneinander getrennt. In
+ diesem Fall sind die Datenobjekte aus den Deklarationen außerhalb von
+ Prozeduren statisch, d.h. während der gesamten Laufzeit des Programm
+ vorhanden. Solche Datenobjekte werden auch PACKET-Daten genannt.Im
+ Gegensatz dazu sind die Datenobjekte aus Deklarationen in Prozeduren
+ dynamische Datenobjekte, die nur während der Bearbeitungszeit der
+ Prozedur existieren. Innerhalb einer Prozedur dürfen wiederum Refinements
+ verwendet werden. Ein Prozedur-Rumpf hat also den formalen Aufbau wie
+ unter a) oder b) geschildert.
+
+ Die Refinements und Datenobjekte, die innerhalb einer Prozedur deklariert
+ wurden, sind lokal zu dieser Prozedur, d.h. können von außerhalb nicht
+ angesprochen werden.
+
+d) Deklarationen, Prozeduren, Anweisungen und PACKET-Refinements.
+ Zusätzlich zu der Möglichkeit c) ist es erlaubt, neben den Anweisungen
+ außerhalb einer Prozedur auch Refinements zu verwenden:
+
+ <Deklarationen> ;
+ <Prozeduren> ;
+ <Anweisungen> .
+ <Refinements>
+
+ Diese Refinements können nun in Anweisungen außerhalb der Prozeduren
+ benutzt werden oder auch durch die Prozeduren (im letzteren Fall spricht
+ man analog zu globalen PACKET-Daten auch von PACKET-Refinements oder
+ globalen Refinements). In PACKET-Refinements dürfen natürlich keine
+ Datenobjekte verwandt werden, die lokal zu einer Prozedur sind.
+
+
+
+Moduln (PACKETs)
+
+PACKETs sind in ELAN eine Zusammenfassung von Datenobjekten, Prozeduren/
+Operatoren und Datentypen. Man kann sich ein PACKET als ein 'main packet'
+mit Zusätzen vorstellen. PACKETs können separat übersetzt werden, so
+daß der "Zusammenbau" eines umfangreichen Programms aus mehreren PACKETs
+möglich ist.
+
+Elemente eines PACKETs (Prozeduren/Operatoren, Datentypen) können außerhalb
+des PACKETs nur angesprochen werden, wenn sie in der Schnittstelle des
+PACKETs, die auch "interface" genannt wird, aufgeführt wird. Mit anderen
+Worten: es können alle Elemente eines PACKETs von außen nicht angesprochen
+werden, sofern sie nicht über die Schnittstelle "nach außen gereicht" wird.
+Damit wird gewährleistet, daß mehrere Programmierer an einem gemeinsamen
+Projekt arbeiten können und daß eine gemeinsame Benutzung (oder Störung) von
+Programmteilen nur über die in den Schnittstellen von PACKETs aufgeführten
+Objekte erfolgen kann.
+
+Im Gegensatz zu einer Prozedur kann ein PACKET nicht aufgerufen werden (nur
+die Elemente der Schnittstelle können benutzt werden). Beispiel:
+
+
+Programm 32:
+
+ PACKET fuer eine prozedur DEFINES swap:
+
+ PROC swap (INT VAR a, b):
+ INT CONST x :: a;
+ b := a;
+ a := x
+ END PROC swap
+
+ END PACKET fuer eine prozedur
+
+Dies ist ein PACKET, das eine Tausch-Prozedur für INT-Datenobjekte bereit-
+stellt. Das PACKET kann übersetzt werden und dem ELAN-Compiler bekannt
+gemacht werden (EUMEL: "insertieren"). Ist das geschehen, kann man 'swap'
+wie alle anderen Prozeduren (z.B. 'put', 'get') in einem Programm verwenden.
+Tatsächlich werden die meisten Prozeduren und Operatoren (aber auch einige
+Datentypen), die in ELAN zur Verfügung stehen, nicht durch den ELAN-Compiler
+realisiert, sondern durch solche PACKETs. Um solche Objekte einigermaßen
+zu standardisieren, wurde in der ELAN-Sprachbeschreibung festgelegt, welche
+Datentypen, Prozeduren und Operatoren in jedem ELAN-System vorhanden
+sein müssen. Solche PACKETs werden Standard-Pakete genannt. Jeder Installa-
+tion - aber auch jedem Benutzer - steht es jedoch frei, zu den Standard-
+Paketen zusätzliche PACKETs mit in den Compiler aufzunehmen und damit den
+ELAN-Sprachumfang zu erweitern.
+
+Ein ELAN-PACKET beginnt mit dem PACKET-Schlüsselwort. Danach folgt der Name
+des PACKETs (der am Ende des PACKETs hinter END PACKET wieder erscheinen
+muß), gefolgt von der DEFINES-Liste. In dieser Schnittstelle werden die Ob-
+jekte angegeben, die nachfolgenden PACKETs zur Verfügung gestellt werden
+sollen.
+
+In der Schnittstelle werden Prozeduren/Operatoren nur mit ihrem Namen ange-
+geben. Weiterhin können Datentypen und mit CONST vereinbarte Datenobjekte
+in der Schnittstelle aufgeführt werden, aber keine VAR-Datenobjekte, weil
+diese sonst über PACKET-Grenzen hinweg verändert werden könnten.
+
+Im obigen Programm 32 haben wir ein PACKET in der Funktion als spracher-
+weiterndes Instrument gezeigt. Im folgenden Beispiel zeigen wir ein Programm,
+in dem das PACKET-Konzept verwandt wird, um Datenobjekte vor unbefugten
+Zugriff zu schützen.
+
+
+Programm 33:
+
+ PACKET stack handling DEFINES push, pop, init stack:
+
+ LET max = 1000;
+ ROW max INT VAR stack;
+ INT VAR stack pointer;
+
+ PROC init stack:
+ stack pointer := 0
+ END PROC init stack;
+
+ PROC push (INT CONST dazu wert):
+ stack pointer INCR 1;
+ IF stack pointer > max
+ THEN errorstop ("stack overflow")
+ ELSE stack [stack pointer] := dazu wert
+ END IF
+ END PROC push;
+
+ PROC pop (INT VAR von wert):
+ IF stack pointer = 0
+ THEN errorstop ("stack empty")
+ ELSE von wert := stack [stack pointer];
+ stack pointer DECR 1
+ END IF
+ END PROC pop
+
+ END PACKET stack handling;
+
+Nun kann man den Stack über die Prozeduren 'init stack', 'push' und 'pop'
+benutzen (in einem 'main packet').
+
+
+Programm 34:
+
+ init stack;
+ werte einlesen und pushen;
+ werte poppen und ausgeben.
+
+ werte einlesen und pushen:
+ INT VAR anzahl :: 0, wert;
+ REP
+ get (wert);
+ push (wert);
+ anzahl INCR 1
+ UNTIL ende kriterium END REP.
+
+ werte poppen und ausgeben:
+ INT VAR i;
+ FOR i FROM 1 UPTO anzahl REP
+ pop (wert);
+ put (wert)
+ END REP.
+
+Die Datenobjekte 'stack' und 'stack pointer' haben nur Gültigkeit innerhalb
+des PACKETs 'stack handling'. Anweisungen wie z.B.
+
+ put (stack [3]);
+ stack [27] := 5
+
+außerhalb des PACKETs 'stack handling' sind also verboten und werden vom
+ELAN-Compiler entdeckt.
+
+Ein PACKET bietet also auch einen gewissen Schutz vor fehlerhafter Verwen-
+dung von Programmen und Datenobjekten. Wichtig ist weiterhin, daß die Reali-
+sierung des Stacks ohne weiteres geändert werden kann, ohne daß Benutzer-
+programme im 'main packet' geändert werden müssen, sofern die Schnittstelle
+nicht verändert wird. Beispielsweise kann man sich entschließen, den Stack
+nicht durch eine Reihung, sondern durch eine gekettete Liste zu realisieren.
+Davon bleibt ein Benutzerprogramm unberührt.
+
+Die letzte Funktion von PACKETs ist die Realisierung von abstrakten Daten-
+typen. Dazu müssen wir uns aber zuvor die Möglichkeiten anschauen, neue
+Datentypen zu definieren.
+
+
+
+Die Definition neuer Datentypen
+
+Im Gegensatz zur LET-Vereinbarung, bei der lediglich ein neuer Name für
+einen bereits vorhandenen Datentyp eingeführt wurde und bei der somit auch
+keine neuen Operationen definiert werden müssen (weil die Operationen für
+den abzukürzenden Datentyp verwandt werden können), wird durch eine TYPE-
+Vereinbarung ein gänzlich neuer Datentyp eingeführt. Im Gegensatz zu
+Strukturen und Reihungen stehen für solche Datentypen noch nicht einmal die
+Zuweisung zur Verfügung. Beispiel:
+
+ TYPE PERSON = STRUCT (TEXT name, vorname, INT alter)
+
+Ein solcher Datentyp kann wie auch alle anderen Datentypen verwandt werden
+(Deklarationen, Parameter, Werte liefernde Prozeduren, als Komponenten in
+Reihungen und Strukturen usw.).
+
+Der neudefinierte Datentyp wird abstrakter Datentyp genannt. Er kann mit
+Hilfe eines PACKETs (vergl. nächsten Abschnitt) anderen Programmteilen zur
+Verfügung gestellt werden. Die rechte Seite der TYPE-Vereinbarung wird
+"konkreter Typ", "Realisierung des Datentyps" oder Feinstruktur genannt.
+
+Um neue Operatoren und/oder Prozeduren für einen abstrakten Datentyp zu
+schreiben, ist es möglich, auf die Komponenten des Datentyps (also auf die
+Feinstruktur) mit Hilfe des Konkretisierers zuzugreifen. Der Konkretisierer
+arbeitet ähnlich wie die Subskription oder Selektion: er ermöglicht eine
+typmäßige Umbetrachtung vom abstrakten Typ zum Datentyp der Feinstruktur.
+Beispiel:
+
+ TYPE MONAT = INT;
+
+ PROC put (MONAT CONST m):
+ put ( CONCR (m))
+ END PROC put;
+
+Der Konkretisierer ist bei Feinstrukturen notwendig, die von elementarem
+Datentyp sind. Besteht dagegen die Feinstruktur aus Reihungen oder Struk-
+turen, dann wird durch eine Selektion oder Subskription eine implizite Kon-
+kretisierung vorgenommen. Beispiel:
+
+ TYPE LISTE = ROW 100 INT;
+
+ LISTE VAR personal nummer;
+ ...
+ personal nummer [3] := ...
+ (* das gleiche wie *)
+ CONCR (personal nummer) [3] := ...
+
+Denoter für neudefinierte Datentypen werden mit Hilfe des Konstruktors
+gebildet:
+
+ TYPE GEHALT = INT;
+
+ GEHALT VAR meins :: GEHALT : (1 000 000);
+
+Besteht die Feinstruktur aus einem Datenverbund, muß der Konstruktor u.U.
+mehrfach geschachtelt angewandt werden:
+
+ TYPE KOMPLEX = ROW 2 REAL;
+
+ KOMPLEX CONST x :: KOMPLEX : ( ROW 2 REAL : ( 1.0, 2.0));
+
+
+
+Abstrakte Datentypen
+
+Auf die Feinstruktur über den Konkretisierer eines neudefinierten Datentyps
+darf nur in dem PACKET zugegriffen werden, in dem der Datentyp definiert
+wurde. Der Konstruktor kann ebenfalls nur in dem typdefinierenden PACKET
+verwandt werden.
+
+Wird der Datentyp über die Schnittstelle des PACKETs anderen Programmteilen
+zur Benutzung zur Verfügung gestellt, so müssen Operatoren und/oder Proze-
+duren für den Datentyp ebenfalls "herausgereicht" werden. Da dann der neude-
+finierte Datentyp genauso wie alle anderen Datentypen verwandt werden kann,
+aber die Komponenten nicht zugänglich sind, spricht man von abstrakten
+Datentypen.
+
+Welche Operationen sollten für einen abstrakten Datentyp zur Verfügung
+stehen? Obwohl das vom Einzelfall abhängt, werden meistens folgende
+Operationen und Prozeduren definiert:
+
+- 'get'- und 'put'-Prozeduren.
+- Zuweisung (auch für die Initialisierung notwendig).
+- Denotierungs-Prozedur (weil kein Konstruktor für den abstrakten Datentyp
+ außerhalb des definierenden PACKETs zur Verfügung steht)
+
+
+Programm 35:
+
+ PACKET widerstaende DEFINES WIDERSTAND, REIHE, PARALLEL, :=, get, put:
+
+ TYPE WIDERSTAND = INT;
+
+ OP := (WIDERSTAND VAR l, WIDERSTAND CONST r):
+ CONCR (l) := CONCR (r)
+ END OP :=;
+
+ PROC get (WIDERSTAND VAR w):
+ INT VAR i;
+ get (i);
+ w := WIDERSTAND : (i)
+ END PROC get;
+
+ PROC put (WIDERSTAND CONST w):
+ put (CONCR (w))
+ END PROC put;
+
+ WIDERSTAND OP REIHE (WIDERSTAND CONST l, r):
+ WIDERSTAND : ( CONCR (l) + CONCR (r))
+ END OP REIHE;
+
+ WIDERSTAND OP PARALLEL (WIDERSTAND CONST l, r):
+ WIDERSTAND :
+ ((CONCR (l) * CONCR (r)) DIV (CONCR (l) + CONCR (r)))
+ END OP PARALLEL
+
+ END PACKET widerstaende
+
+Dieses Programm realisiert den Datentyp WIDERSTAND und mit den Operationen
+eine Fachsprache, mit dem man nun leicht WIDERSTANDs-Netzwerke berechnen
+kann, wie z.B. folgendes:
+
+
+ +--- R4 ---+
+ | |
+ +--- R1 ---+ +--- R5 ---+
+ | | | |
+ ---+ +--- R3 ---+ +---
+ | | | |
+ +--- R2 ---+ +--- R6 ---+
+ | |
+ +--- R7 ---+
+
+Zur Berechnung des Gesamtwiderstandes kann nun folgendes Programm
+geschrieben werden:
+
+ ROW 7 WIDERSTAND VAR r;
+ widerstaende einlesen;
+ gesamtwiderstand berechnen;
+ ergebnis ausgeben.
+
+ widerstaende einlesen:
+ INT VAR i;
+ FOR i FROM 1 UPTO 7 REP
+ put ("bitte widerstand R"); put (i); put (":");
+ get (r [i]);
+ END REP.
+
+ gesamtwiderstand berechnen:
+ WIDERSTAND CONST rgesamt :: (r [1] PARALLEL r [2]) REIHE
+ r [3] REIHE (r [4] PARALLEL r [5] PARALLEL r [6]
+ PARALLEL r [7]).
+
+ ergebnis ausgeben:
+ line;
+ put (rgesamt).
+
+
+Aufgabe (HSG):
+
+ Was ist ein Modul? Was ist ein Interface? Was ist der Unterschied
+ zwischen einem PACKET und einer Prozedur?
+ Die Realisierung von WIDERSTAND durch INTs ist nicht in allen Fällen
+ befriedigend. Warum? (Beachte besonders die Realisierung des OP
+ PARALLEL).
+ Wenn man bei der Typ-Vereinbarung von WIDERSTAND INT gegen REAL
+ austauschen würde, wo müßte man noch Änderungen vornehmen? Sind
+ insbesondere Änderungen im Benutzer-Programm (hier im 'main packet')
+ notwendig?
+Ãœbungsziel: PACKET-Begriff
+
+
+
+Programmstruktur 2
+
+Nun können wir auch erklären, wie ein ELAN-Programm mit mehreren PACKETs
+aussieht. Ein Programm besteht aus einer Folge von PACKETs, dem ein 'main
+packet' folgt. Es ist auch möglich, PACKETs vorübersetzen zu lassen, so daß
+es für einen Nutzer so aussieht, als ob er nur ein 'main packet' übersetzen
+läßt. Tatsächlich sind zumindest die Standard-Packets vorübersetzt vorhanden.
+
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil7 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil7
new file mode 100644
index 0000000..1aadc5f
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil7
@@ -0,0 +1,2469 @@
+ EUMEL-Benutzerhandbuch
+
+ TEIL 7: Dateien, Datei-Verwaltung und Datenräume
+
+1. Ãœbersicht
+
+Dateien dienen zur Aufnahme von Informationen, die auch über die Bearbei-
+tungszeit eines Programms erhalten bleiben (können). Dateien werden als
+Objekte in einer Task gehalten. Sie bleiben solange erhalten, bis sie expli-
+zit gelöscht ('forget'-Kommando) oder die Task beendet wird ('end'-Kommando).
+
+Dateien kann man an andere Tasks schicken ('save'-Kommando) oder von anderen
+Tasks holen ('fetch'-Kommando). Mit diesen (hier vorgestellten) Kommandos
+ist der Transport von Dateien jedoch nur in direkter Linie des Task-Baums
+möglich, also an einen "Vater" oder einen "Sohn". Damit ist automatisch eine
+Datei-Hierarchie im EUMEL-System realisiert.
+
+Alle Datei-Arten des EUMEL-Systems basieren auf Datenräumen. Ein Datenraum
+ist ein Speicherplatz, der 1 MByte Daten speichern kann und vom EUMEL-System
+verwaltet wird. Datenräume können gelöscht, kopiert usw. werden. Mit Hilfe
+Mit Hilfe von Datenräumen werden alle Datei-Arten des EUMEL-Systems reali-
+siert, indem einem Datenraum eine Struktur (Datentyp) aufgeprägt wird. Da-
+durch wird es Benutzern des EUMEL-Systems ermöglicht, auf einfache Weise
+neben den bereits vorhandenen Datei-Arten (FILEs für die Speicherung von
+Texten, PICFILEs für die Speicherung von Bildinformationen, u.a.m.)
+spezielle Dateien zu konstruieren.
+
+Die wichtigste Datei-Art, mit der ein Benutzer in Berührung kommt, ist die
+sequentielle Datei, genannt FILE. Ein FILE kann nur TEXTe aufnehmen und hat
+z.Zt. ein Fassungsvermögen von 4000 Zeilen (Sätze). Insgesamt darf ein FILE
+1 MByte aufnehmen. Eine Datei-Zeile (Satz) kann bis zu 32 000 Zeichen auf-
+nehmen.
+
+FILEs können in einer von drei Betriebsrichtungen bearbeitet werden:
+- "input": nur Lesen.
+- "output": nur Schreiben.
+- "modify": Lesen/Schreiben und zusätzlich beliebiges Positionieren, Ein-
+ fügen und Löschen von Sätzen.
+
+'input'-Dateien sind also Eingabedateien, 'output'- sind Ausgabedateien und
+'modify'-Dateien kann man verändern. Insbesondere die 'modify'-Dateien eig-
+nen sich, um andere Datei-Arten leicht zu realisieren (z.B. indexsequentiel-
+le Dateien).
+
+Eine Datei kann auf einen bestimmten Zeilenbereich eingeschränkt werden. Ein
+solches Segment kann selbst wie eine Datei von einem Programm behandelt
+werden.
+
+
+
+2. Datei-Kommandos
+
+Dateien werden in der Regel in einer Benutzer-Task gehalten. Die Kommandos
+für die Behandlung von Dateien in einer Benutzer-Task werden hier vorge-
+stellt. Dann wird erklärt, wie Dateien zu einer übergeordneten Task ge-
+schickt oder geholt werden können.
+
+
+
+Datei-Kommandos für Benutzer-Tasks
+
+Im Monitor-Dialog kann man Dateien kopieren, löschen und einen anderen Namen
+geben.
+
+Mit dem Kommando
+
+ edit ("dateiname")
+
+wird eine Text-Datei im Monitor-Dialog (implizit) eingerichtet, wenn es sich
+um einen noch nicht vorhandenen 'dateiname' handelt (vergl. auch die Editor-
+Beschreibung).
+
+Welche Dateien in der Benutzer-Task vorhanden sind, kann mit dem Kommando
+
+ list
+
+erfragt werden. 'list' zeigt auf dem Bildschirm die Dateinamen der Benutzer-
+Task. Vor jedem Namen steht ein Datum, welches anzeigt, an welchem Tag die
+Datei zuletzt von einem Programm bearbeitet wurde. Ein 'a' hinter dem Datum
+kennzeichnet Dateien, die nach einer Archivierung nicht bearbeitet wurden.
+
+Ein Duplizieren einer Datei kann mit
+
+ copy ("alte datei", "neue datei")
+
+erreicht werden, wobei eine Kopie von 'alter datei' angelegt wird, die den
+Namen 'neue datei' erhält. Man beachte, daß es sich um eine logische (und
+vorerst um keine physikalische) Kopie handelt. Erst bei Schreibzugriffen
+werden Seiten " entshared" ("copy-on-write"). Ein Umbenennen einer Datei
+kann mit
+
+ rename ("alter datei name", "neuer datei name")
+
+erfolgen. Mit
+
+ forget ("dateiname")
+
+kann eine Datei gelöscht werden.
+
+Wurde in einer Datei editiert, kann durch Löschen oder Einfügen von Zeilen
+der interne Verwaltungsaufwand hoch werden, so daß Positionierungen nicht
+mehr effizient vor sich gehen. Mit dem Kommando
+
+ reorganize ("dateiname")
+
+wird die Datei so organisiert, als wenn sie neu erstellt wäre (gilt nur für
+Text-Dateien). Sie braucht dann in der Regel auch etwas weniger Speicher-
+platz.
+
+
+Merke: Das Kommando 'rename' gibt einer Datei einen anderen Namen, 'copy'
+dupliziert eine Datei. Mit 'list' kann man sich anzeigen lassen, welche
+Dateien in der Task vorhanden sind.
+
+
+
+Datei-Kommandos für Vater-Tasks
+
+Man kann Dateien von einer Vater-Task holen oder an eine Vater-Task schicken,
+um sie dort längerfristig zu speichern. Auch wenn die Benutzer-Task gelöscht
+wird, bleiben alle Dateien, die bei einer Vater-Task gespeichert (also
+"gerettet") sind, erhalten. Andere Sohn-Tasks können sich Dateien bei einer
+Vater-Task abholen.
+
+Auf Dateien einer Benutzer-Task können andere Nutzer aus anderen Tasks in
+der Regel nicht zugreifen. Manchmal ist es jedoch notwendig, daß mehrere
+Nutzer Dateien gemeinsam benutzen oder eine Datei eine Task "überleben" soll.
+In solchen Fällen muß man Dateien bei einem Vater aufbewahren.
+
+Mit der Prozedur
+
+ global manager
+
+kann die Benutzer-Task zu einem Datei-Manager gemacht werden. Erst nach
+Aufruf dieser Prozedur können Söhne dieser Task eingerichtet werden.
+
+Von einer Benutzer-Task kann eine Datei mit
+
+ save ("Buch 1")
+
+der direkten Vater-Task übergeben werden, wobei 'buch 1' in der Benutzer-
+Task erhalten bleibt. 'save' wirkt also wie ein Transport einer Kopie der
+angegebenen Datei in die Vater-Task. Achtung: ist eine Datei 'Buch 1' in der
+Vater-Task bereits vorhanden, wird diese ohne Warnung überschrieben.
+
+Analog zu der 'forget'-Prozedur für Dateien einer Benutzer-Task können
+Dateien einer unmittelbaren Vater-Task mit
+
+ erase ("datei name")
+
+gelöscht werden. Soll eine Datei von einer Vater-Task in eine Benutzer-Task
+geholt werden, so benutzt man die Prozedur
+
+ fetch ("datei")
+
+Nach Aufruf dieser Prozedur wird eine Kopie der angegebenen Datei in der
+Benutzer-Task angelegt. Ist bereits eine Datei 'datei' in der Benutzer-Task
+vorhanden, so erfolgt eine Fehlermeldung.
+
+Mit 'save', 'fetch' und 'erase' ist es möglich, daß zwei oder mehr Benutzer
+eine Datei alternierend bearbeiten. In diesem Fall müssen sich die Benutzer
+als Söhne einer gemeinsamen Vater-Task einrichten und die Datei mit 'fetch'
+jeweils in die Benutzer-Task holen. Um zu verhindern, daß ein anderer Be-
+nutzer zur gleichen Zeit mit der Datei arbeitet, wird sie jeweils mit 'erase'
+bei der Vater-Task gelöscht. Nach Beendigung der Arbeiten muß die Datei dann
+wieder mit 'save' in die Vater-Task transportiert werden. Dann steht sie
+wieder anderen Benutzern zur Verarbeitung zur Verfügung. Beispiel:
+
+ fetch ("datei"); erase ("datei"); (* Datei vom Vater holen und dort
+ loeschen *)
+ edit ("datei"); (* Datei bearbeiten *)
+ save ("datei"); (* Datei zur Vater-Task bringen *)
+ forget ("datei") (* Datei in Benutzer-Task
+ loeschen *)
+
+Mit den Prozeduren
+
+ save all
+ fetch all
+
+kann man alle Dateien einer Benutzer-Task in die direkte Vater-Task schicken
+oder von dort holen.
+
+Merke:
+ * * * * * * * * * *
+ * *
+ * <-+ * Vater-Task
+ * | | *
+ * * * | * * | * * *
+ | |
+ fetch save
+ | |
+ * * * | * * | * * *
+ * | | *
+ * ->edit| * Benutzer-Task
+ * *
+ * * * * * * * * * *
+
+
+
+Ansprechen von anderen Tasks
+
+Sollen Dateien in andere als die direkte Vater-Task transportiert oder von
+anderen Tasks geholt werden, muß man den internen Task-Bezeichner angeben.
+
+Es gibt einige Prozeduren, mit denen man den internen Task-Bezeichner einer
+Task bekommt. Solch eine Prozedur ist
+
+ father
+
+Prozeduren, mit denen man Dateien transportieren kann, liegen auch in einer
+Version vor, bei denen man den internen Task-Bezeichner angeben kann.
+Beispiel:
+
+ save ("datei", father) (* wie: save ("datei") *)
+ erase ("datei", father) (* wie: erase ("datei") *)
+ fetch ("datei", father) (* wie: fetch ("datei") *)
+
+Weitere Prozeduren, die einen internen Task-Bezeichner liefern, sind:
+
+ myself
+ printer
+ public
+ archive
+
+Anmerkung: Zur Prozedur 'archive' siehe auch das nächste Kapitel; zu 'print'
+siehe auch SPOOLER. Dadurch kann man Dateien auch zu anderen als der
+Vater-Task transportieren, holen oder löschen. Beispiele:
+
+ erase ("datei", public) (* Loescht 'datei' in Task 'PUBLIC' *)
+ fetch ("datei", public) (* Holt 'datei' aus der Task "PUBLIC" *)
+ save ("datei", public) (* Kopiert 'datei' in die Task 'PUBLIC' *)
+ save ("datei", printer) (* Uebergibt 'datei' dem Spooler und
+ druckt die Datei *)
+ list (father) (* Listet Dateien der Vater-Task *)
+
+Bei komplizierten "Verwandschafts-Verhältnisse" von Tasks ist es einfacher,
+eine Task mit Hilfe des Task-Namens anzusprechen. Das erfolgt mit Hilfe der
+Prozedur 'task'. Beispiel:
+
+ save ("datei", task ("hugo"))
+
+'task' liefert den internen Task-Bezeichner von 'hugo'. Die Umkehr-Prozedur
+zu 'task' ist 'name':
+
+ put (name (myself))
+
+schreibt den Namen der Task, in der man sich gerade befindet, auf den Bild-
+schirm.
+
+Durch die Prozedur 'father', die einen internen Task-Bezeichner als
+Parameter erwartet, kann man an die Vater-Task einer Task gelangen.
+Beispiel:
+
+ save ("datei", father (father))
+
+Hier wird die Datei 'datei' an die Vater-Task der Vater-Task geschickt (also
+zur "Großvater-Task").
+
+Mit dem Operator /
+
+kann man aus einem Tasknamen den internen Tasknamen erhalten. '/' kann über-
+all dort eingesetzt werden, wo ein interner Taskname verlangt wird. Beispiel:
+
+ task status (/"meine task")
+
+
+Merke: Mit den internen Task-Bezeichner kann man mit anderen Tasks als der
+Vater-Task kommunizieren.
+
+
+
+Kommandos für mehrere Dateien
+
+Durch die vom EUMEL-System bereitgestellten Task-Variablen und Datei-Ver-
+zeichnisse (Thesaurus, Plural: Thesauren) ist es möglich, mehrere Dateien
+mit einem Kommando zu behandeln.
+
+Sollen alle Dateien einer Task zu einer anderen transportiert werden (mit
+'save') oder alle Dateien geholt werden, kann man 'save all' und 'fetch all'
+auch mit einem internen Task-Bezeichner versehen. Beispiele:
+
+ save all (public)
+ fetch all (public)
+
+Damit werden alle Dateien der Benutzer-Task zu der Task 'PUBLIC' geschickt
+oder von dort geholt.
+
+Die internen Tasknamen wie z.B. 'myself', 'father', 'public' usw. werden
+auch bei dem Einsatz eines Thesaurus benutzt. Was ist ein "Thesaurus"?
+
+Das EUMEL-System hält sich die Dateinamen einer Task des Taskbaums in einer
+internen Liste. Die Namens-Liste wird Thesaurus (laut Duden: ein
+"systematisch geordnetes Verzeichnis") genannt.
+
+Der Operator ALL liefert den Thesaurus einer Task. Beispiel:
+
+ ALL father
+ ALL myself
+
+liefert jeweils den Thesaurus der Vater- oder der eigenen Task. Solche
+Thesauren kann man als Parameter der meisten der oben erwähnten Kommandos
+verwenden:
+
+ save (ALL myself) (* kopiert alle Dateien in die Vater-Task;
+ arbeitet wie 'save all' *)
+ forget (ALL myself) (* loescht alle Dateien der Benutzer-Task *)
+ fetch (ALL father) (* holt alle Dateien der Vater-Task;
+ arbeitet wie 'fetch all' *)
+
+Der Operator SOME dagegen bietet einen Thesaurus vorher zum Editieren an,
+um Dateinamen zu streichen (HOP RUBOUT). Beispiele:
+
+ fetch (SOME father) (* holt die nicht gestrichenen Dateien *)
+ save (SOME myself) (* kopiert die nicht gestrichenen Dateien *)
+ forget (SOME myself) (* loescht die nicht gestrichenen Dateien *)
+
+Es ist auch möglich, aus den Thesauren mehrerer Tasks einen neuen Thesaurus
+zu bilden:
+
+ - (* Differenzmenge *)
+ / (* Schnittmenge *)
+ + (* Vereinigungsmenge *)
+
+Beispiel:
+
+ fetch (ALL father - ALL myself)
+
+holt alle Dateien der Vater-Task, die nicht bereits in der Benutzer-Task
+sind.
+
+
+Merke: Mit den Operatoren 'ALL' und 'SOME' kann man mehrere Dateien mit
+einem Kommando behandeln.
+
+
+
+Datei-Schutz durch Paßworte und Verschlüsselung
+
+Dateien können vor unbefugtem Zugriff mit Hilfe von Paßworten und/oder der
+Verschlüsselung der Informationen geschützt werden.
+
+
+
+Paßworte
+
+Paßworte für Dateien dienen zur Verhinderung von unbefugtem Zugriff auf
+Dateien, die bei einer Vater-Task gespeichert werden. (Die Dateien der
+Benutzer-Task können durch ein Task-Paßwort geschützt werden). Dabei sollte
+man bedenken, daß Paßworte bekannt werden können.
+
+Der Paßwort-Schutz ist im EUMEL-System etwas sicherer als in anderen
+Betriebssystemen, weil Paßworte nur selten angegeben werden müssen und
+daher nicht so leicht bekannt werden können (z.B. durch "über die Schulter
+schauen"). Die Kommandozeile wird zudem bei der Angabe eines Paßworts nach
+dem Betätigen der RETURN-Taste gelöscht.
+
+Paßworte werden nur im Verkehr mit Vater-Tasks eingesetzt. Lokale Benutzer-
+Dateien brauchen nicht gesondert gesichert zu werden, da man ein Paßwort
+auf die Benutzer-Task legen kann oder die zu sichernden Dateien aus dem
+System nehmen kann. Ein Paßwort kann mit der Prozedur
+
+ enter password ("schreibpasswort / lesepasswort")
+
+angegeben oder ein bereits eingestelltes Paßwort kann mit dieser Prozedur
+überschrieben werden. Voreingestellt ist kein Paßwort. Nachdem ein Benutzer
+die 'enter password'-Prozedur angegeben hat, wird jeder Datei-Verkehr mit
+einer Vater-Task mit Hilfe dieses Paßworts überprüft. Unzulässige Zugriffe
+durch Benutzer anderer Tasks auf Dateien einer Vater-Task werden abgewiesen.
+
+Ein Paßwort hat eine eigene Syntax. Es besteht aus zwei Teilen, die leer
+sein können und die durch ein "/"-Zeichen voneinander getrennt sind. Der
+erste Teil ist das Schreib-Paßwort, der zweite das Lese-Paßwort. Wird kein
+Lese-Paßwort angegeben, gilt das Schreib-Paßwort auch für das Lesen. Ist
+also kein "/"-Zeichen im Paßwort-String vorhanden, so wird das Schreib-
+Paßwort sozusagen gedoppelt. Beispiele:
+
+ enter password ("") (* kein Paßwort *)
+ enter password ("hugo") (* 'hugo' gilt fuer das Schreiben und
+ Lesen *)
+ enter password ("egon/meier") (* 'egon' fuers Schreiben, 'meier' fuers
+ Lesen *)
+
+Zusätzlich kann das "-"-Zeichen in dem Teil des Paßworts angegeben werden,
+für den ein Zugriff nicht erlaubt sein soll. Beispiel:
+
+ enter password ("-/nurlesen") (* Schreibzugriff nicht erlaubt,
+ Lese-Passwort ist 'nurlesen' *)
+
+Das Lese-Paßwort gilt für die Prozedur
+
+ fetch
+
+während das Schreib-Paßwort für die Prozeduren
+
+ save
+ erase
+
+gilt. Sofern die betreffende Datei durch ein Paßwort geschützt ist, ist
+folgendes zu beachten:
+
+a) fetch:
+ Will ein Benutzer mit der Prozedur 'fetch' eine Datei in seine Benutzer-
+ Task holen, so wird sein aktuell eingestelltes Paßwort (nur Lese-Teil)
+ und das Paßwort der Datei überprüft. Stimmen diese nicht überein, so wird
+ der 'fetch'-Zugriff auf eine Datei der Vater-Task abgewiesen.
+
+b) save:
+ Bei einem Transport in eine Vater-Task mit Hilfe der Prozedur 'save' sind
+ zwei Fälle zu unterscheiden:
+
+ - Datei ist in der Vater-Task noch nicht vorhanden: Diese Datei wird
+ in der Vater-Task mit dem aktuellen Paßwort des Benutzers einge-
+ tragen.
+
+ - Datei ist in der Vater-Task bereits vorhanden und soll durch die
+ neue Datei ersetzt werden: Es wird überprüft, ob das aktuelle
+ Schreib-Paßwort des Benutzers mit dem der gleichnamigen Datei in der
+ Vater-Task übereinstimmt. Ist dies nicht der Fall, wird die Datei
+ nicht in der Vater-Task eingetragen.
+
+c) erase:
+ Soll eine Datei der Vater-Task gelöscht werden, wird überprüft, ob das
+ aktuelle Schreib-Paßwort mit dem der zu löschenden Datei in der Vater-
+ Task übereinstimmt. Ist dies nicht der Fall, wird die Lösch-Operation
+ abgewiesen.
+
+
+Merke: Dateien können bei der Sicherung in einer Vater-Task vor unbefugtem
+Zugriff durch Paßworte geschützt werden.
+
+
+
+Dateien verschlüsseln
+
+Zusätzlich zu einem Paßwort kann man eine Datei vor unbefugtem Zugriff
+schützen, indem sie verschlüsselt wird.
+
+Mit den Prozeduren
+
+ crypt
+ decrypt
+
+kann eine Datei ver- oder entschlüsselt werden (Datenschutz für einzelne
+Dateien). Dabei ist es möglich, eine Datei mehrfach zu verschlüsseln (man
+muß die Verschlüsselung dann allerdings auch mehrfach rückgängig machen).
+Beispiel:
+
+ crypt ("datei", "schluessel")
+
+verschlüsselt 'datei' mit 'schluessel'. Die Entschlüsselung erfolgt, indem
+man die Prozedur 'decrypt' auf 'datei' anwendet und den gleichen Schlüssel
+zur Entschlüsselung benutzt. Beispiel:
+
+ decrypt ("datei", "schluessel")
+
+Den Text des Schlüssels (hier: 'schluessel') sollte man sich also unbedingt
+merken, sonst kann die Datei nicht mehr entschluesselt werden.
+
+Merke: Dateien werden durch 'crypt' und 'decrypt' ver- und entschlüsselt.
+
+
+
+3. Das Archiv
+
+Dateien werden im EUMEL-System auf Systemträgern gespeichert. Mit dem Archiv
+können Dateien vom System auf externe Speichermedien (normalerweise
+Disketten) gebracht und von diesen ins System geholt werden.
+
+Das EUMEL-Archiv hat folgende Aufgaben:
+
+a) Das Archiv wird als Sicherheitsbereich benutzt, indem man von wichtigen
+ Dateien Kopien anlegt und diese außerhalb des EUMEL-Systems speichert.
+
+b) Man kann das Archiv-System aber auch benutzen, um Dateien, die nur selten
+ oder in größeren Zeitabständen benötigt werden, zu kopieren ("archi-
+ vieren") und im EUMEL-System zu löschen. Falls diese Dateien wieder
+ gebraucht werden, können sie wieder in das EUMEL-System geholt werden.
+ Damit wird erreicht, daß im EUMEL-System nur die wirklich notwendigen
+ Dateien stehen.
+
+c) Sollen Dateien von einer EUMEL-Installation auf eine andere übertragen
+ werden, so kann man ebenfalls Archive verwenden.
+
+d) Bei Versionswechsel des EUMEL-Systems sind Archive die einzige Möglich-
+ keit, Dateien in die neue Systemversion einzuspielen. Dabei wird garan-
+ tiert, daß zumindest Archive der letzten Version gelesen werden können.
+
+Merke: Durch das Archiv können Dateien außerhalb des Systems gesichert
+werden.
+
+
+
+Das Archiv reservieren
+
+Soll archiviert werden, muß man das dem Archiv-System mitteilen, damit nicht
+ein anderer Benutzer zur gleichen Zeit auf das Archiv zugreift. Dieser
+Vorgang wird "reservieren" genannt.
+
+Archiv-Disketten haben aus Sicherheitsgründen einen Namen. Dieser Name muß
+bei der Anmeldung einer Archivierung angegeben werden. Die Anmeldung einer
+Archivierung und gleichzeitige Reservierung erfolgt mit
+
+ archive ("name")
+
+Der Archiv-Name wird bei folgenden Archiv-Operationen zur Überprüfung mit
+dem eingelegten Archiv verwandt.
+
+Wichtig: Eine Diskette sollte erst nach dem 'archive'-Kommando in das
+Laufwerk geschoben werden, d.h. erst dann, wenn das Archiv-System reserviert
+ist. Sonst kann es geschehen, daß ein anderer Benutzer auf dieser Diskette
+archiviert.
+
+Archivierungen erfolgen durch die schon beschriebenen Transportkommandos
+'save' und 'fetch'. Dabei wird als Zieltask 'archive' angegeben. Beispiel:
+
+ save ("mein buch", archive)
+ fetch ("kapitel 1", archive)
+ save all (archive)
+ fetch all (archive)
+
+Das Archiv bleibt für den Nutzer solange reserviert, wie er Archivierungs-
+operationen vollzieht. Dann sollte er das Archiv wieder für andere Benutzer
+mit der Prozedur
+
+ release (archive)
+
+freigeben.
+
+Leitet ein Nutzer innerhalb von fünf Minuten nach der letzten Archiv-
+Operation keine neue ein und meldet sich ein anderer Nutzer mit 'archive'
+bei dem Archiv-System an, so wird dem ersten Nutzer die Archiv-Berechtigung
+entzogen, um Blockaden zu verhindern. Wenn der erste Nutzer eine erneute
+Archiv-Operation versucht, erhält er eine Fehlermeldung. Dadurch kann ein
+Nutzer das Archiv längere Zeit (ohne 'release') benutzen, ohne den Betrieb
+zu stören, da andere Nutzer bei Bedarf jederzeit eingeschoben werden.
+
+Wichtig: Muß die Archiv-Floppy gewechselt werden (weil etwa von einer
+Diskette eine Datei gelesen wurde und diese auf eine andere geschrieben
+werden soll), muß erneut das 'archive'-Kommando gegeben werden. Dies ist
+notwendig, um das Verzeichnis aller auf der Diskette befindlichen Dateien
+der neuen Diskette zu lesen.
+
+Merke: Mit 'archive' wird die Archiv-Verwaltung für einen Nutzer reserviert, mit 'release' wieder freigegeben. Mit 'archive' wird
+gleichzeitig ein Archiv-Name eingestellt, der bei Archiv-Operationen mit dem
+auf der Diskette gespeicherten Archiv-Namen verglichen wird.
+
+
+
+Archiv löschen und einen Namen geben
+
+Bevor ein Archiv-Diskette benutzt werden kann, muß sie den mit 'archive'
+eingestellten Namen bekommen.
+
+Bei der Erstbenutzung eines Archivs muß dieses mit einem Namen versehen
+werden. Als Archiv-Name wird der mit 'archive' eingestellte Name verwandt.
+Dies erfolgt mit der Prozedur
+
+ clear (archive)
+
+Gleichzeitig werden alle Dateien, die sich eventuell vorher auf dem Archiv-
+Träger befanden, gelöscht. Somit wird 'clear' auch für das Löschen von
+Archiven verwendet.
+
+
+Merke: Mit 'clear' wird die Archiv-Diskette gelöscht und gleichzeitig der
+mit 'archive' eingestellte Name gegeben.
+
+
+
+Einfache Archiv-Operationen
+
+In diesem Abschnitt werden einfache Archiv-Operationen beschrieben.
+
+Mit den Prozeduren
+
+ save ("datei", archive)
+ fetch ("datei", archive)
+ erase ("datei", archive)
+
+kann jeweils eine Datei auf die Archiv-Diskette ('save') und von dem Archiv
+in das EUMEL-System kopiert ('fetch') oder auf dem Archiv gelöscht ('erase')
+werden. Dabei bedeutet 'datei' die zu kopierende Datei und 'archive' der
+interne Task-Name für die Archiv-Verwaltung. Bei den ersten zwei Kommandos
+ist zu beachten, daß die Datei, die auf das Archiv geschrieben (bei 'save')
+oder die in die Benutzer-Task geholt werden soll (bei 'fetch'), immer
+kopiert wird. Dateien bleiben also im "Ursprung" immer erhalten.
+
+Ist eine Datei gleichen Namens bereits auf der Archiv-Diskette (bei 'save')
+oder in der Benutzer-Task (bei 'fetch') vorhanden, wird von der Archiv-Ver-
+waltung angefragt, ob diese Datei überschrieben werden darf. Es kann somit
+nicht zu einem unbeabsichtigten Löschen von Dateien kommen.
+
+Mit dem Kommando
+
+ list (archive)
+
+erhält man (wie bei dem "normalen" 'list'-Kommando) ein Namens-Verzeichnis
+aller Dateien, die sich auf der eingelegten Archiv-Diskette befinden.
+
+
+Merke: Nachdem ein Archiv mit 'archive' reserviert wurde, kann mit 'save'
+eine Datei auf das Archiv geschrieben und mit 'fetch' eine Datei von dem
+Archiv in die Benutzer-Task kopiert werden.
+
+
+
+Archiv-Operationen für mehrere Dateien
+
+Hier wird beschrieben, wie man mehrere Dateien auf einmal auf ein Archiv
+schreibt oder von einem Archiv liest.
+
+Mit den Kommandos
+
+ save all (archive)
+ fetch all (archive)
+
+werden alle Dateien der Benutzer-Task auf das Archiv geschrieben bzw. von
+dort geholt.
+
+Zusätzlich ist es möglich, die Operatoren 'ALL' und 'SOME' auf ein Archiv
+anzuwenden. Wie bereits geschildert, liefern diese Operatoren einen
+Thesaurus der angegebenen Task: 'ALL' liefert alle Dateinamen, während man
+bei 'SOME' eine Auswahl treffen kann. Damit ist es möglich, alle oder einige
+Dateien der Benutzer-Task auf eine Archiv-Diskette zu kopieren oder von der
+Archiv-Diskette in die Benutzer-Task zu holen:
+
+ fetch (SOME archive, archive) (* zeigt die Namen der Dateien der
+ Archiv-Diskette. Die nicht ge-
+ strichenen Dateien werden in die
+ Benutzer-Task geholt *)
+ save (SOME myself, archive) (* zeigt die Namen der Dateien der
+ Benutzer-Task. Die nicht ge-
+ strichenen Dateien werden auf die
+ Archiv-Diskette kopiert *)
+ save (ALL archive, archive) (* sichert alle Dateien der Benutzer-
+ Task, die sich schon auf dem Archiv
+ befinden (alte Version). Das
+ Kommando ist für Sicherungs-
+ Disketten gedacht, bei dem man immer
+ die gleichen Dateien auf dem Archiv
+ haben will *)
+
+Durch die Thesaurus-Operatoren '-' (Differenzmenge), '/' (Schnittmenge) und
+'+' (Vereinigungsmenge) kann man kompliziertere Wirkungen erzielen.
+Beispiele:
+
+ save (ALL myself - ALL archive, archive) (* Schreibt alle Dateien der
+ Benutzer-Task auf das Archiv,
+ die nicht bereits auf dem
+ Archiv stehen *)
+ save (ALL myself - ALL father - ALL archive, archive)
+ (* Schreibt alle Dateien der
+ Benutzer-Task auf das Archiv,
+ mit Ausnahme der Dateien, die
+ längerfristig in der Vater-
+ Task gespeichert sind und die
+ nicht bereits auf dem Archiv
+ stehen *)
+ fetch (ALL archive - ALL myself) (* Holt alle Dateien vom Archiv,
+ die sich nicht bereits in der
+ Benutzer-Task befinden *)
+
+Werden mehrere Dateien mittels eines Thesaurus bearbeitet, kann man nach
+einer Unterbrechung der Bearbeitung (d.h. Fehlermeldung) die Operation wieder
+aufsetzen. Dazu liefert das Kommando
+
+ remainder
+
+den "Rest"-Thesaurus. Er enthält alle nicht bearbeiteten Dateinamen.
+Beispiel:
+
+ save (SOME myself, archive) (* Unterbrechung, z.B. durch einen vom
+ Programm erzeugten 'errorstop' oder SV
+ und 'halt' *)
+ save (remainder, archive) (* bearbeitet die restlichen Dateien *)
+
+
+Merke: Mit 'save all' bzw. 'fetch all' kann man alle Dateien einer Benutzer-
+Task archivieren bzw. alle Dateien eines Archivs in die Benutzer-Task holen.
+Mit den Operatoren SOME und ALL sind weitere Operationen möglich.
+
+
+
+Fehlermeldungen des Archivs
+
+Bei Archiv-Operationen kann es zu Fehlersituationen kommen.
+
+Versucht man eine Datei vom Archiv zu lesen, kann es vorkommen, daß das
+Archiv-System
+
+ Lese-Fehler (Archiv)
+
+meldet und den Lese-Vorgang abbricht. Dies kann auftreten, wenn die Floppy
+beschädigt oder aus anderen Gründen nicht lesbar ist (z.B. nicht justierte
+Disketten-Geräte). In einem solchen Fall vermerkt das Archiv-System intern,
+daß die Datei nicht korrekt gelesen werden kann. Das sieht man z.B. beim
+'list (archive)'. Dort ist der betreffende Datei-Name mit dem Zusatz 'mit
+Lese-Fehler' gekennzeichnet. Um diese Datei trotzdem zu lesen, muß man sie
+im Datei-Namen mit dem Zusatz 'mit Lese-Fehler' versehen. Beispiel:
+
+ fetch ("dateiname mit Lese-Fehler")
+
+Die Datei wird in diesem Fall trotz Lese-Fehler (Informationsverlust!) vom
+Archiv gelesen.
+
+Um solche Fälle möglichst zu vermeiden, sieht das EUMEL-System die
+Möglichkeit vor, Archive bzw. Archiv-Dateien nach beschreiben zu prüfen. Das
+erfolgt mit dem Kommando
+
+ check ("dateiname", archive) (* oder *)
+ check (ALL archive, archive) (* fuer alle Archiv-Dateien *)
+
+Durch dieses Kommando werden eventuelle Lese-Fehler gemeldet.
+
+Weitere Fehlermeldungen des Archivs:
+
+* Lesen unmöglich (Archiv) Archiv-Floppy nicht eingelegt oder die Tür
+ des Laufwerks ist nicht geschlossen.
+
+* Schreiben unmöglich (Archiv) Floppy ist schreibgeschützt.
+
+* Archiv nicht angemeldet Archiv wurde nicht angemeldet
+ ('archive ("name")' geben).
+
+* Lese-Fehler (Archiv) Siehe obige Beschreibung.
+
+* Schreibfehler (Archiv) Die Floppy kann nicht (mehr) beschrieben
+ werden. Andere Floppy verwenden.
+
+* Speicherengpass Im System ist nicht mehr genügend Platz, um
+ eine Datei vom Archiv zu laden.
+ Ggf. Dateien löschen.
+
+* RERUN beim Archiv-Zugriff Das System wurde bei einer Archiv-Operation
+ durch Ausschalten bzw. Reset unterbrochen.
+
+* ... gibt es nicht Die Datei ... gibt es nicht auf dem Archiv.
+
+* Archiv heißt ... Die eingelegte Floppy hat einen anderen als
+ den eingestellten Archiv-Namen.
+
+* Archiv wird von Task ... benutzt Das Archiv wurde von einem anderen
+ Benutzer reserviert.
+
+* ... kann nicht geschrieben werden (Archive voll) Das Archiv ist voll.
+ Neue Archiv-Floppy
+ benutzen.
+
+* Archiv inkonsistent Die eingelegte Floppy hat nicht die Struk-
+ tur einer Archiv-Floppy ('clear (archive)'
+ vergessen).
+
+* save/erase wegen Lese-Fehler verboten Bei Archiven mit Lese-Fehler sind
+ Schreiboperationen verboten, weil
+ ein Erfolg nicht garantiert
+ werden kann.
+
+
+
+4. FILEs in Programmen
+
+Die bisher geschilderten Kommandos gelten für alle Datei-Arten. In diesem
+Kapitel wird der Standard Datei-Typ FILE beschrieben. Eine Datei von Daten-
+typ FILE ist eine sequentielle Datei, die das Lesen und Schreiben von Daten
+in strikter Aufeinanderfolge von Sätzen erlaubt (Betriebsrichtungen 'input'
+und 'output'). Die Betriebsrichtung 'modify' erlaubt das gleichzeitige Lesen
+und Schreiben sowie beliebiges Positionieren.
+
+
+
+Deklaration, Assoziierung und Betriebsrichtungen
+
+Für ELAN-Programme gibt es standardmäßig den Datentyp FILE. FILEs müssen
+deklariert werden. Die Kopplung einer FILE VAR im Programm mit einer Datei
+erfolgt durch eine Assoziierungsprozedur. Bei der Assoziierung muß man an-
+geben, wie die Datei bearbeitet werden soll.
+
+Dateien müssen in einem ELAN-Programm - wie alle anderen Objekte auch -
+deklariert werden. Beispiel:
+
+ FILE VAR f :: ...
+
+Mit der Deklaration wird dem ELAN-Compiler der Name der Datei-Variablen
+bekannt gemacht. Dabei ist zu beachten, daß im EUMEL-System alle FILEs mit
+VAR deklariert werden müssen, denn jede Lese/Schreib-Operation verändert
+einen FILE. FILE CONST Objekte sind also nicht erlaubt. Ähnlich wie bei
+anderen Datenobjekten werden FILEs initialisiert. In der Regel erfolgt dies
+mit einer Assoziierungsprozedur. Beispiele:
+
+ FILE VAR meine datei :: sequential file (output, "daten")
+ ...
+ (* oder: *)
+ TEXT VAR datei name;
+ put ("Dateiname bitte:"); get (datei name);
+ FILE VAR f :: sequential file (input, datei name);
+
+Die Assoziierungsprozedur 'sequential file' hat die Aufgabe, eine in einem
+Programm deklarierte FILE VAR mit einer bereits vorhandenen oder noch einzu-
+richtenden Datei (abhängig von der Betriebsrichtung, siehe unten) des
+EUMEL-Systems zu koppeln. Den Dateinamen gibt man als zweiten Parameter
+an. Dadurch können ELAN-Programme geschrieben werden, die Dateien
+bearbeiten, deren Namen man beim Erstellen des Programms noch nicht kennt.
+
+Der erste Parameter gibt die sog. Betriebsrichtung an. Sie bestimmt, in
+welcher Weise die assoziierte Datei bearbeitet wird. Es gibt folgende drei
+Betriebsarten:
+
+a) input:
+ Die Datei kann vom Programm nur gelesen werden. Durch 'input' wird bei
+ der Assoziierung automatisch auf den ersten Satz der Datei positioniert.
+ Ist die zu lesende Datei nicht vorhanden, wird ein Fehler gemeldet.
+
+b) output:
+ Die Datei kann vom Programm nur beschrieben werden. Durch 'output' wird
+ bei der Assoziierung automatisch hinter den letzten Satz der Datei
+ positioniert (bei einer leeren Datei also auf den ersten Satz). Ist die
+ Datei vor der Assoziierung nicht vorhanden, wird sie automatisch einge-
+ richtet.
+
+c) modify:
+ Die Datei kann vom Programm in beliebiger Weise gelesen und beschrieben
+ werden. Im Gegensatz zu den Betriebsrichtungen 'input' und 'output', bei
+ denen ausschließlich ein rein sequentielles Lesen oder Schreiben erlaubt
+ ist, kann bei 'modify' beliebig positioniert, gelöscht, eingefügt und neu
+ geschrieben werden. Hier ist nicht definiert, auf welchen Satz der Datei
+ man nach erfolgter Assoziierung steht. Die Datei wird automatisch einge-
+ richtet, wenn sie vor der Assoziierung nicht vorhanden war.
+
+Anmerkung:
+In jeder Betriebsrichtung sind nur bestimmte Operationen zugelassen. Z.B.
+sind bei 'input' keine Schreib-Prozeduren erlaubt. Vergl. dazu die nächsten
+Abschnitte.
+
+Neben der Betriebsrichtung 'input', 'output' oder 'modify' muß bei
+'sequential file' als zweiter Parameter der Name der zu bearbeitenden Datei
+angegeben werden. Beispiel:
+
+ TEXT VAR datei name, zeile;
+ put ("Bitte Name der zu bearbeitenden Datei eingeben:");
+ get (datei name);
+ FILE VAR f :: sequential file (input, dateiname);
+ ...
+ getline (f, zeile);
+ ...
+
+Hier wird der Name der zu bearbeitenden Datei zuerst eingelesen. Diese Datei
+wird mit 'f' in der Betriebsrichtung 'input' assoziiert, d.h. würde man z.B.
+die Prozedur
+
+ putline (f, irgendein text)
+
+an einer Stelle im Programm verwenden, wird ein Fehler gemeldet. Die Be-
+triebsrichtung hilft also, Fehler bei der Programmierung zu vermeiden.
+
+Mit den Prozeduren
+
+ modify (f)
+ input (f)
+ output (f)
+
+kann die Betriebsrichtung von Dateien geändert werden.
+
+Dateien brauchen im EUMEL-System vor Programmende nicht geschlossen zu
+werden, da sie vom System immer konsistent gehalten werden.
+
+Merke: Die Betriebsrichtung gibt an, wie man eine Datei bearbeiten will.
+'input' steht für Lesen, 'output' für Schreiben und 'modify' für Verändern.
+Jede Datei muß vor einer Benutzung mit 'sequential file' assoziiert werden.
+Die Assoziierungsprozedur stellt die Kopplung zwischen dem Programm und dem
+EUMEL-Betriebssystem her.
+
+
+
+Operationen der Betriebsrichtung 'output'
+
+In der Betriebsrichtung 'output' sind nur Schreib-Operationen gestattet.
+'output' ist also für das Bearbeiten von Ausgabedateien vorgesehen.
+
+Mit den Prozeduren
+
+ put
+
+können INT-, REAL- und TEXT-Werte in eine Datei geschrieben werden. Die
+Prozedur
+
+ line
+
+sorgt dafür, daß eine neue Zeile in der Datei begonnen wird. Beispiel:
+
+ FILE VAR f :: sequential file (output, "daten");
+ put (f, "Daten:");
+ line (f);
+ schreibe daten.
+
+ schreibe daten:
+ INT VAR intwert;
+ REAL VAR textwert;
+ put ("bitte Daten eingeben (INT, REAL):");
+ REP
+ get (intwert);
+ put (f, intwert);
+ get (realwert);
+ put (f, realwert);
+ line (f);
+ UNTIL yes ("fertig") END REP.
+
+Durch die Assoziierungsprozedur mit der Betriebsrichtung 'output' wird
+hinter den letzten Satz der Datei positioniert, bei einer leeren Datei also
+auf den ersten Satz. In dem ersten Satz in unserem Beispiel wird also
+'Daten:' geschrieben. Durch die Prozedur 'line' geht man auf den nächsten
+Satz. Dann werden jeweils ein INT- und ein REAL-Wert in eine Datei-Zeile
+geschrieben, bis die Frage 'fertig' mit 'j' beantwortet wird.
+
+Die 'put'-Prozeduren schreiben die Werte jeweils in die aktuelle Datei-Zeile.
+Zwischen den Werten wird von den 'put'-Prozeduren jeweils ein Leerzeichen
+eingefügt. Im Gegensatz zu den 'put'-Prozeduren schreibt die Prozedur 'write'
+einen TEXT ohne ein anschließendes Leerzeichen in die aktuelle Datei-Zeile.
+Beispiel:
+
+ ...
+ write (f, "meine Daten:");
+ write (f, " ");
+ write (f, text (17 + 4));
+ (* das Gleiche wie: put (f, "meine Daten:"); put (f, 17 + 4) *)
+
+Auf eine neue Datei-Zeile kann auf zwei verschiedene Arten positioniert
+werden:
+
+a) Prozedur 'line':
+ Diese darf auch mit einem Parameter angegeben werden, der die Anzahl
+ Zeilen angibt. Beispiel:
+
+ line (f); (* positioniert auf die naechste Zeile *)
+ line (f, 1) (* das Gleiche *)
+ line (f, 4) (* Vier Zeilen weiter; dazwischen sind 3 Leerzeilen *)
+
+b) Ãœberschreiten der Zeilengrenze:
+ Eine Datei-Zeile kann (voreingestellt) 77 Zeichen aufnehmen. Wird bei
+ einer Schreib-Operation diese Grenze überschritten, wird der auszugebende
+ Wert auf die nächste Zeile plaziert. Mit der Prozedur 'max line length'
+ kann die eingestellte Datei-Zeilenlänge gelesen oder verändert werden.
+ Beispiel:
+
+ FILE VAR f :: sequential file (output, "meine daten");
+ put (max line length (f)); (* ergibt 77 *)
+ max line length (f, 132);
+ put (max line length (f)) (* ergibt 132 *)
+
+ Ist die Länge des auszugebenden Textes größer als die verbleibende
+ Zeilenbreite, wird der Text auf der nächsten Zeile ausgegeben.
+
+Die 'putline'-Prozedur bietet die Möglichkeit, eine ganze Datei-Zeile auf
+einmal auszugeben. Eine Positionierung auf die nächste Datei-Zeile ('line')
+braucht dabei nicht vorgenommen werden. Beispiel:
+
+ TEXT VAR zeile :: "";
+ ...
+ zeile := ...;
+ putline (f, zeile);
+ ...
+
+Merke: In der Betriebsrichtung 'output' kann in eine Datei geschrieben
+werden. Dazu stehen die Prozeduren 'put', 'write' und 'putline' zur Verfü-
+gung. Die Prozedur 'line' positioniert auf die nächste Zeile der Ausgabe-
+datei. Mit 'max line length' kann die Länge einer Datei-Zeile verändert oder
+erfragt werden.
+
+
+
+Operationen der Betriebsrichtung 'input'
+
+In der Betriebsrichtung 'input' sind nur Lese-Operationen gestattet. 'input'
+ist also für das Bearbeiten von Eingabedateien vorgesehen.
+
+Analog der Betriebsrichtung 'output' sind bei 'input' 'get'-Prozeduren vor-
+handen, die INT-, REAL- oder TEXT-Werte aus einer Datei lesen. Beispiel:
+
+ FILE VAR f :: sequential file (input, "Betriebszeiten");
+ REAL VAR zeiten;
+ zeiten einlesen und berechnen.
+
+ zeiten einlesen und berechnen:
+ REP
+ get (f, zeiten);
+ IF zeiten = 0.0
+ THEN LEAVE zeiten einlesen und berechnen
+ FI; (* siehe auch 'eof'-Prozedur *)
+ berechne
+ END REP.
+
+ berechne:
+ ...
+
+Die 'get'-Prozeduren positionieren automatisch auf die nächste Zeile, sofern
+keine Werte mehr in der aktuellen Zeile vorhanden sind. Mit der Prozedur
+'line' kann explizit auf die nächste Zeile positioniert werden. Damit können
+die restlichen Daten einer Zeile überschlagen werden. Für die 'get'-Proze-
+duren gilt, daß jeder zu lesende Wert entweder beim nächsten Leerzeichen
+oder beim Zeilenende aufhört. Beispiel:
+
+ FILE VAR f :: sequential file (input, "text");
+ TEXT VAR wort;
+ lese worte.
+
+ lese worte:
+ REP
+ get (f, wort); (* Lesen eines Worts ohne Leerzeichen *)
+ put (wort); (* Schreiben eines Worts mit Leerzeichen *)
+ IF wort = "Ende"
+ THEN LEAVE lese worte
+ FI
+ END REP.
+
+
+Trennzeichen ("separator") zwischen den Worten sind also Leerzeichen, welche
+nicht eingelesen werden. Manchmal sollen jedoch Daten eingelesen werden, die
+durch andere Zeichen als dem Leerzeichen voneinander getrennt sind. Eine
+Möglichkeit, solche Daten zu behandeln, bietet die 'getline'-Prozedur. Sie
+liest (analog 'putline') eine ganze Zeile und positioniert auf die nächste
+Zeile. Dann kann man mit Hilfe von TEXT-Prozeduren solche Zeilen 'per Hand'
+auseinandernehmen. Als Beispiel zeigen wir ein Programm, welches den zweiten
+Wert einer Zeile lesen soll. Die Werte werden durch Kommata voneinander
+getrennt:
+
+ FILE VAR eingabe datei :: sequential file (input, "daten");
+ TEXT VAR zeile, wert;
+ lese jeweils zweiten wert;
+ verarbeite wert.
+
+ lese jeweils zweiten wert:
+ REP
+ getline (f, zeile);
+ IF zeile = "Ende"
+ THEN LEAVE lese jeweils zweiten wert
+ FI;
+ extrahiere zweiten wert
+ END REP.
+
+ extrahiere zweiten wert:
+ wert := subtext (zeile, anfang, ende).
+
+ anfang:
+ pos (zeile, ",") + 1.
+
+ ende:
+ pos (zeile, ",", anfang) + 1.
+
+ verarbeite wert:
+ ...
+
+Diese (etwas umständliche) Methode ist immer dann angebracht, wenn Zeilen
+unterschiedlich untersucht werden müssen. Eine einfachere Möglichkeit, die
+in vielen Fällen angewandt werden kann, bietet eine andere Form der 'get'-
+Prozedur, bei der man das oder die Trennzeichen angeben kann. Beispiel:
+
+ ...
+ extrahiere zweiten wert:
+ get (f, wert, ","); (* ersten Wert der Zeile ueberlesen *)
+ get (f, wert, ","). (* hier der richtige zweite Wert *)
+
+Hier wird also das Trennzeichen mit angegeben (dritter Parameter). Eine
+andere Methode müssen wir anwenden, wenn Daten nicht durch ein Trennzeichen
+unterschieden werden, sondern nur durch ihre Länge definiert sind. Beispiel:
+
+ ...
+ lese fuenfstellige werte:
+ REP
+ get (f, wort, 5);
+ verarbeite wert
+ ...
+ END REP.
+
+Bei dieser 'get'-Prozedur wird die Länge des einzulesenden Textes als
+dritter Parameter angegeben. Man beachte, daß die letzten zwei 'get'-Proze-
+duren nur TEXTe einlesen. Entsprechende Typwandlungen hat der Programmierer
+vorzunehmen.
+
+Merke: Die Betriebsrichtung 'input' erlaubt nur Lesen aus einer Eingabedatei.
+Für diesen Zweck gibt es die Prozeduren 'get', 'getline' und 'line'.
+
+
+
+Operationen der Betriebsrichtung 'modify'
+
+Die Betriebsrichtung 'modify' erlaubt das Lesen und Schreiben von Informa-
+tionen auf Dateien. Zusätzlich ist beliebiges Positionieren auf Dateien
+erlaubt. 'modify' ist also für Dateien gedacht, die man gleichzeitig als
+Ausgabe- und Eingabedateien behandeln will.
+
+Die Betriebsrichtung 'modify' erlaubt ein Ändern einer Datei ("updating"),
+wobei die sequentielle Natur der Datei erhalten bleibt.
+
+Eine Datei der Betriebsrichtung 'modify' muß ebenso mit 'sequential file'
+assoziiert werden, wie bei den zwei anderen Betriebsrichtungen. Während bei
+'input' auf den ersten bzw. bei 'output' auf den letzten Satz der Datei
+positioniert wird, ist bei 'modify' nicht definiert, auf welchem Satz der
+Datei nach erfolgter Assoziierung positioniert wird. Man muß also die erste
+Positionierung explizit vornehmen. Für die Zwecke der Positionierung gibt es
+die Prozeduren
+
+ to line (* auf eine bestimmte Zeile *)
+ col (* auf eine Spalte innerhalb der Zeile *)
+ down (* eine Zeile vorwaerts *)
+ up (* eine Zeile zurueck *)
+
+Neben diesen Positionierungsprozeduren gibt es die Informationsprozeduren:
+
+ lines (* Anzahl Zeilen in der Datei *)
+ line no (* aktuelle Zeilennummer *)
+ eof (* Dateiende? *)
+
+Beispiele:
+
+ down (f); (* wie: to line (f, line no (f) + 1) *)
+ (* Nicht über eof *)
+ up (f); (* wie: to line (f, line no (f) - 1) *)
+ (* Nicht über Zeile 1 *)
+
+Mit der Prozedur
+
+ read record
+
+kann der Satz, auf den aktuell positioniert wurde, gelesen werden. Mit
+
+ write record
+
+kann sein Inhalt geschrieben werden (also auch "überschreiben"). Mit den
+Prozeduren
+
+ insert record
+ delete record
+
+kann eine Zeile vor der aktuellen eingefügt (Position ist dann die einge-
+fügte Zeile) oder der aktuelle Satz gelöscht werden (Position ist dann der
+nächste Satz). Beispiele:
+
+ FILE VAR f :: sequential file (modify, "meine daten")
+ TEXT VAR zeile, neue zeile;
+ to line (f, 1);
+ read record (f, zeile); (* erste Zeile lesen *)
+ ...
+ insert record (f); (* neue erste Zeile *)
+ write record (f, neue zeile);
+ down (f); (* auf die 2. Zeile, die vorher die 1. war *)
+ delete record (f); (* diese loeschen, so dass die
+ Zeilenzahl wieder stimmt *)
+
+Das nächste Beispiel zeigt, wie hinter den letzten Satz einer Datei eine
+Zeile eingefügt werden kann (hier wird ausgenutzt, daß man in der Betriebs-
+richtung 'modify' hinter den letzten Satz der Datei positioniert werden
+kann):
+
+ FILE VAR f :: sequential file (modify, "test");
+ to line (f, lines (f)); (* auf die letzte Zeile *)
+ down (f);
+ insert record (f);
+ write record (f, "neue letzte Zeile");
+ ...
+
+Mit 'down' bzw. 'up' kann man auch um einige Zeilen auf einmal vorwärts oder
+rückwärts positionieren. Beispiele:
+
+ down (f, 17) (* 17 Zeilen vorwaerts *)
+ up (f, 13) (* 13 zeilen rueckwaerts *)
+
+Merke: In der Betriebsrichtung 'modify' können Dateien gelesen und/oder ge-
+schrieben werden ('read record' oder 'write record'). Positionierungen kön-
+nen mit 'down', 'up' oder 'to line' vorgenommen werden.
+
+
+
+Manipulationen von FILEs
+
+FILEs können im EUMEL-System auch als Einheiten behandelt werden. Dazu
+stehen die bereits erläuterten Prozeduren zur Verfügung, die wir hier der
+Vollständigkeit halber nochmals aufführen.
+
+Mit der Prozedur
+
+ exists
+
+kann erfragt werden, ob eine Datei bereits existiert. Beispiel:
+
+ TEXT VAR name;
+ REP
+ erfrage name;
+ UNTIL exists (name) END REP;
+ ...
+
+ erfrage name:
+ put ("Dateiname bitte:");
+ get (name);
+ line.
+
+Weitere Prozeduren:
+
+ forget (* Datei löschen *)
+ rename (* umbenennen *)
+ copy (* kopieren *)
+
+Für Programmierer ist eine Version der 'forget'-Prozedur interessant, die
+eine Datei ohne Kontroll-Anfrage löscht. Beispiel:
+
+ forget ("meine scratch datei", quiet)
+
+Merke: Mit 'exists' kann erfragt werden, ob ein FILE bereits existiert.
+
+
+
+Texte Suchen
+
+Mit den Prozeduren 'down' und 'up' kann man (ebenso wie im Editor) auch nach
+Texten suchen.
+
+Die Prozeduren 'down' bzw. 'up' suchen einen Text in der Datei. Beispiele:
+
+ down (f, "dieser text")
+ up (f, "noch'n text")
+
+Diese Prozeduren suchen direkt auf der Dateistruktur. Wird der gesuchte Text
+gefunden, steht man direkt auf dem gesuchten Text. Wird der Text nicht
+gefunden, steht man auf dem ersten (bei 'up') oder hinter dem letzten (bei
+'down') Zeichen der Datei. Die Position innerhalb der Zeile nach einer Suche
+kann mit
+
+ col (f)
+
+abgefragt werden. Um die Suche auf einen Bereich zu beschränken, kann man
+'down' bzw. 'up' mit einem weiterem Parameter versehen, der die max. Anzahl
+von Zeilen angibt. Beispiel:
+
+ FILE VAR f :: ...
+ ...
+ INT VAR akt zeilennr :: line no (f);
+ down (f, "pattern", 100);
+ (* sucht in den naechsten 100 Zeilen nach 'pattern' *)
+ IF line no (f) <> akt zeilen nr + 100
+ THEN gefunden
+ ELSE nicht gefunden
+ FI;
+ ...
+
+Achtung: 'down' bzw. 'up' beginnen die Suche immer mit dem nächsten Zeichen
+in Suchrichtung, so daß man mehrmals hintereinander suchen kann, ohne in
+eine Endlosschleife zu geraten (Erinnerung: wird ein Text gefunden, ist die
+Position innerhalb der Zeile das erste Zeichen des gesuchten Begriffs).
+
+Mit den Prozeduren (gleiche Parameterversorgung wie 'down' und 'up')
+
+ downety
+ uppety
+
+beginnt man mit der Suche immer auf der aktuellen Position. Darum sollte man
+diese Prozeduren mit Vorsicht verwenden. Mit der Prozedur
+
+ pattern found
+
+kann man anfragen, ob die letzte Suchoperation erfolgreich war oder nicht.
+Beispiel:
+
+ FILE VAR f :: ...
+ ...
+ INT VAR akt zeilennr :: line no (f);
+ down (f, "pattern", 100);
+ (* sucht in den naechsten 100 Zeilen nach 'pattern' *)
+ IF pattern found THEN gefunden
+ ELSE nicht gefunden
+ FI;
+ ...
+
+Mit der Prozedur
+
+ at
+
+kann man anfragen, ob man auf einem gewünschten Wort steht. Beispiel:
+
+ IF at (f, "pattern")
+ THEN ..
+ FI
+
+Die Prozedur
+
+ word
+
+liefert das aktuelle Wort der aktuellen Position einer Zeile. Beispiele:
+
+ TEXT VAR dieses wort :: word (f);
+ (* Zeichenkette von der aktuellen Position bis zum nächsten Blank oder
+ Zeilenende *)
+ dieses wort := word (f, "<");
+ (* Zeichenkette (Wort) von der aktuellen Position bis zum Zeichen '<'
+ oder Zeilenende *)
+ dieses wort := word (f, 13);
+ (* Zeichenkette (Wort) mit der Laenge 13 *)
+
+Merke: Die Prozeduren 'down' und 'up' suchen einen Text innerhalb einer
+Datei. Mit 'at' kann man anfragen, ob man auf dem gesuchten Begriff steht.
+'word' liefert das aktuelle Wort.
+
+
+
+FILE-Ausschnitte
+
+Hier wird erklärt, wie man mehrere Zeilen aus einer Datei auf einmal löschen
+und/oder verschieben und wie man nur einen Ausschnitt einer Datei zugänglich
+machen kann.
+
+Den einfachsten Zugang zu Datei-Abschnitten erhält ein Programmierer durch
+einige Anwendungsprozeduren, die u.a. auch im Editor verwandt werden. Dort
+gibt es die Möglichkeit, einen markierten Bereich "vorsichtig" zu löschen
+und u.U. an anderer Stelle wieder einzufügen (ESC RUBOUT und ESC RUBIN).
+Solche Prozeduren stehen auch einem Programmierer zur Verfügung. Beispiel:
+
+ FILE VAR f :: ....
+ ....
+ remove (f, 100); (* entfernt 100 Zeilen von der aktuellen
+ Position rueckwaerts (!) aus der Datei 'f' *)
+ to line (27); (* zum Beispiel *)
+ re insert (f) (* fuegt die "vorsichtig" geloeschten Zeilen vor
+ (!) die Zeile 27 ein *)
+
+Die Prozedur
+
+ remove
+
+löscht also eine angebbare Anzahl von Zeilen in der Datei (rückwärts von der
+aktuellen Zeilennummer ab) und schreibt diesen Datei-Abschnitt in einen
+internen Puffer. Man beachte, daß sich dabei natürlich die Zeilennummer der
+Datei ändert. Die entfernten Zeilen können aus dem internen Puffer an einer
+anderen Stelle durch
+
+ reinsert
+
+genau einmal wieder eingefügt werden. Sollen jedoch die mit 'remove' ent-
+fernten Zeilen wirklich gelöscht und nicht mehr an anderer Stelle eingesetzt
+werden, dann kann man die Prozedur
+
+ clear removed
+
+verwenden. Beispiel:
+
+ ...
+ remove (f, 50); (* loescht vorsichtig *)
+ clear removed (f); (* und endgueltig *)
+ ...
+
+Durch solche Löschungen oder Einfügungen entstehen Datei-Segmente.
+Innerhalb eines Segments kann direkt positioniert werden. Werden jedoch
+Löschungen oder Einfügungen vorgenommen (Sätze werden ein- oder ausgekettet),
+muß erst zu einem entsprechenden Segment positioniert und dann innerhalb des
+Segments auf den entsprechenden Satz positioniert werden. Das kann - je nach
+Anzahl der Segmente - zeitaufwendig sein. Deshalb existiert die Prozedur
+
+ segments
+
+mit der man feststellen kann, wieviel Datei-Segmente in der Datei existieren.
+(Sind es "zu viele", kann man die Datei "reorganisieren").
+
+Diese und die folgenden Prozeduren nutzen eine vom EUMEL-System bereitge-
+stellte Möglichkeit, Ausschnitte aus Dateien wie eigenständige Dateien zu
+behandeln. Beispiel:
+
+ FILE VAR f :: ...
+ ...
+ FRANGE VAR alter bereich;
+ set range (f, 200, 1, alter bereich);
+ (* Datei mit 200 Zeilen von der Spalte 1 der aktuellen Zeile *)
+ edit (f); (* Zeilen 1-200 editieren *)
+ set range (f, alter bereich); (* Datei zuruecksetzen *)
+ ...
+
+Von dem Beispiel-Programm wird die Datei 'f' bearbeitet. Die FRANGE-Variable
+dient hier dazu, sich den ursprünglichen Bereich der Datei 'f' (der auch
+schon eingeschränkt sein kann), zu merken. Mit der Prozedur 'set range' wird
+die Datei 'f' auf 200 Zeilen eingeschränkt (von der aktuellen Zeile 200
+Zeilen rückwärts). Mit der Prozedur 'edit' kann nun der Benutzer unseres
+Programms die (eingeschränkte) Datei beliebig editieren. Ihm steht am Anfang
+Zeilen 1 bis 200 zur Verfügung; die "ausgeblendeten" Datei-Teile kann er
+nicht verändern. Mit dem zweiten Aufruf von 'set range' wird der einge-
+schränkte (und u.U. veränderte) Datei-Bereich aufgehoben, so daß hier wieder
+alle ursprünglichen Datei-Zeilen zur Verfügung stehen.
+
+Solche Beschränkungen können natürlich mehrmals geschachtelt vorgenommen
+werden. Um nach Ablauf solcher Programmteile sicher wieder die ursprüngliche
+Datei (mit allen ihren Zeilen) zur Verfügung zu haben, gibt es die Prozedur
+
+ reset range (f)
+
+Sie setzt die Datei 'f' auf den größtmöglichen Bereich zurück.
+
+Merke: Mit 'remove' und 'reinsert' können Zeilen gelöscht und/oder ver-
+schoben werden. Mit dem Datentyp FRANGE und den Prozeduren 'set range'
+können Dateien eingeschränkt werden.
+
+
+
+5. Datenräume
+
+Die bis jetzt behandelten Dateien können nur TEXTe aufnehmen (bei einigen
+Schreib-/Lese-Operationen werden Daten in Texte umgewandelt, z.B. bei 'get'
+und 'put'). Damit ist gewährleistet, daß alle Programme im EUMEL-System
+(Editor, Drucker, Compiler, Benutzer-Programme usw.) auf gleiche Art und
+Weise auf Dateien zugreifen können, unabhängig davon, welche Daten wirklich
+gespeichert sind. Der folgende Abschnitt zeigt, wie man mit Dateien umgeht,
+die nicht vom Standardtyp FILE sind.
+
+
+
+Konzept des Datenraums
+
+Standarddateien (FILEs) können nur Texte aufnehmen, da sie ja hauptsächlich
+für die Kommunikation mit dem Menschen (vorwiegend mit Hilfe des Editors bzw.
+Ein-/Ausgabe) gedacht sind. Will man Zahlen in einen FILE ausgeben, so
+müssen diese zuvor in Texte umgewandelt werden. Hierfür stehen Standard-
+prozeduren zur Verfügung (z.B. 'put (f, 17)').
+
+Will man aber Dateien zur Kommunikation zwischen Programmen verwenden, die
+große Zahlenmengen austauschen, verursachen die Umwandlungen von Zahlen
+in TEXTe und umgekehrt unnötigen Rechenaufwand. Daher wurden in EUMEL� die
+Datenräume eingef�hrt, die es gestatten, beliebige Strukturen (Typen) in
+Dateien zu speichern. Solche Datenräume kann man weder mit dem Editor noch
+mit dem Standarddruckprogramm (print) bearbeiten, da diese ja den Typ des in
+der Datei gespeicherten Objektes nicht kennen.
+
+Einen Datenraum kann man sich als eine Sammlung von Daten vorstellen (u.U.
+leer), die ausschließlich von einem Programm her behandelt wird. Man kann
+einem Datenraum durch ein Programm einen Datentyp "aufprägen". Meist handelt
+es sich um Reihungen, weil die Benutzung von Datenräumen erst bei größeren
+Datenmengen lohnt. Nach einem solchen "Aufpräge"-Vorgang kann der Datenraum
+wie ein "normaler" Datentyp behandelt werden, mit dem Unterschied, daß die
+Daten in einem Datenraum (d.h. Datei) gespeichert werden. Somit können nach-
+folgende Programme auf die im Datenraum gespeicherten Daten zugreifen, so-
+fern sie den gleichen Datentyp auf den Datenraum aufprägen.
+
+Merke: Ein Datenraum ist eine Sammlung von Daten. Er kann ausschließlich
+durch ein Programm (und z.B. nicht durch den Editor) behandelt werden.
+Programme können Datenräumen Datentypen aufprägen und sie dann mit den ver-
+fügbaren Operationen dieses Datentyps manipulieren.
+
+
+Ein Beispiel
+
+Diesen etwas komplizierten Vorgang wollen wir an Hand eines Beispiels
+Schritt für Schritt erklären.
+
+Angenommen, Programmierer Meier hat ein Gehaltsprogramm zu erstellen. Er
+überlegt sich, das Programm in (mindestens) zwei Moduln (PACKETs) zu er-
+stellen:
+
+a) Berechnung der Gehaltssumme aus den Arbeitszeiten (also Bruttogehalt) und
+ dann
+b) Endgültige Berechnung der Gehälter durch Abzug von Steuern usw.
+
+Das Programm aus a) erstellt also eine Gehaltsliste für alle Beschäftigten
+des Betriebs. Die Gehaltsliste soll ebenfalls von Modul b) genutzt werden.
+
+Meier entschließt sich, die Gehaltsliste in einem Datenraum zu speichern.
+Das hat neben der effizienteren Bearbeitung noch den Vorteil, daß man die
+Gehaltsliste - ohne Programmierkenntnisse zu besitzen - nicht mit dem Editor
+bearbeiten kann (Datenschutz).
+
+Dem ELAN-Compiler muß Meier also mitteilen, daß die Reihung für die
+Gehaltsliste (oder irgendein anderer Datentyp) nicht im Speicherbereich des
+Programms, sondern in einem Datenraum gespeichert werden soll. Dies erfolgt
+mit dem Schlüsselwort BOUND, welches dem Datentyp bei der Deklaration
+vorangestellt wird. Beispiel:
+
+ BOUND ROW 1000 REAL VAR gehaltsliste
+
+Dieses BOUND-Objekt muß Meier noch mit einer Datei verbinden, man spricht
+von "ankoppeln". Die Ankopplung erfolgt durch den Operator ':='. Dies kann
+man gleich bei der Initialisierung vornehmen. Beispiel:
+
+ BOUND ROW 1000 REAL VAR gehaltsliste := new ("hugo")
+
+Die Prozedur 'new' kreiert dabei einen leeren Datenraum (hier mit dem Namen
+'hugo'), der mit Hilfe der Zuweisung (hier: Initialisierung) an die Variable
+'gehaltsliste' gekoppelt wird.
+
+Nun kann Meier mit der 'gehaltsliste' arbeiten wie mit allen anderen Feldern
+auch, mit dem Unterschied, daß die Daten, die er in 'gehaltsliste' speichert,
+eigentlich im Datenraum 'hugo' gespeichert sind. Beispiele:
+
+ gehaltsliste [5] := 10 000.0; (* Traumgehalt *)
+ gehaltsliste [index] INCR 200.0; (* usw. *)
+
+Meier kann auch Prozeduren schreiben, die auf der Gehaltsliste arbeiten.
+Beispiel:
+
+ PROC sort (ROW 1000 REAL VAR liste):
+ ...
+ END PROC sort;
+ ...
+ sort (gehaltsliste);
+ ...
+
+Man beachte, daß der formale Parameter der Prozedur 'sort' nicht mit BOUND
+spezifiziert werden darf (BOUND wird nur bei der Deklaration des Objekts
+angegeben). Das ist übrigens ein weiterer wichtiger Vorteil von BOUND-Objek-
+ten: man kann alle Prozeduren des EUMEL-Systems auch für BOUND-Objekte
+verwenden, nur die Datentypen müssen natürlich übereinstimmen.
+
+Nach der Bearbeitung des Moduls a) ist Meier nun sicher, daß seine Brutto-
+daten in dem Datenraum 'hugo' stehen. Meier braucht (genauso wie bei FILEs)
+den Datenraum nicht zu schließen. Im zweiten Modul muß Meier nun erneut ein
+BOUND-Objekt deklarieren.
+Deshalb deklariert Meier nun
+
+ BOUND ROW 1000 REAL VAR nettoliste :: old ("hugo");
+
+Hier muß Meier nun die Prozedur 'old' verwenden, weil der Datenraum bereits
+aus dem ersten Modul existiert. Nun kann Meier weiter programmieren, bis er
+letztendlich den Datenraum löscht:
+
+ forget ("hugo")
+
+Merke: Ein Datenobjekt eines beliebigen Datentyps kann mit einem vorange-
+stellten BOUND deklariert werden und an einen Datenraum gekoppelt werden.
+Der Datentyp ist dann auf den Datenraum aufgeprägt und man kann mit ihm
+arbeiten wie mit allen anderen Objekten dieses Datentyps.
+
+
+
+Datenräume als Datentyp
+
+Datenräume können auch als eigener Datentyp (DATASPACE) in einem Programm
+behandelt werden. Somit können Datenräume (als Ganzes) ohne Kenntnis eines
+eventuell (vorher oder später) aufgeprägten Typs verwandt werden.
+
+Als Operationen auf DATASPACE-Objekten sind nur Transporte, Löschen und
+Initialisieren zugelassen.
+
+ DATASPACE VAR ds :: old ("daten");
+
+Der Zuweisungsoperator bewirkt eine Kopie des Datenraums vom rechten auf
+den linken Operanden. Des weiteren gibt es eine DATASPACE Konstante 'nil-
+space', die eine leere Datenraum repräsentiert. Mit diesem Wert initialisiert
+der Datei-Manager Dateien, die neu kreiert werden.
+
+Eine neuer Datenraum kann durch
+
+ new ("name")
+
+eingerichtet werden. 'new' liefert gleichzeitig einen Datenraum und wird
+deshalb für Initialisierungen verwandt. Beispiel:
+
+ DATASPACE VAR datenraum :: new ("name1"); (* Kopie ! *)
+
+Ein bereits vorhandener Datenraum in der Benutzer-Task kann mit
+
+ old ("datei")
+
+erneut benutzt werden. 'old' liefert (wie 'new') einen DATASPACE, so daß
+'old' ebenfalls zur Initialisierung benutzt werden kann. Die Prozedur
+
+ nilspace
+
+liefert einen leeren Datenraum.
+
+Für Datenräume gelten zusätzlich einige der Prozeduren wie für FILEs, u.a.:
+
+ forget
+ fetch
+ save
+ rename
+
+Ausgenommen davon sind Prozeduren, die einen TEXT-File voraussetzen, wie
+z.B. 'crypt' und 'decrypt', 'put', 'putline' usw.
+
+Abschließend soll hier noch auf häufig gemachte Fehler hingewiesen werden:
+
+Wenn man an ein DATASPACE-Objekt zuweist (z.B.: DATASPACE VAR ds :=
+new ("mein datenraum")) so erhält man, wie oben erwähnt, eine Kopie des
+Datenraums in 'ds'. Koppelt man jetzt 'ds' an ein BOUND-Objekt an und führt
+Änderungen durch, so wirken diese nur auf die Kopie und nicht auf die Quelle
+(d.h. im Beispiel, daß die Datenraum 'hugo' nicht verändert wird, hier also
+leer bleibt). Für Änderungen in den vom Datei-Manager verwalteten Dateien
+ist also stets direkt anzukoppeln, wie es im Beispiel gezeigt wurde.
+
+Wenn man ein DATASPACE-Objekt benutzt, ohne den Datei-Manager zu verwenden,
+so muß man selbst dafür sorgen, daß dieses Objekt nach seiner Benutzung
+wieder gelöscht wird. Das Löschen geschieht durch die Prozedur 'forget'.
+Ferner ist zu beachten, daß vor der Ankopplung an ein BOUND-Objekt das
+DATASPACE-Objekt initialisiert wird (im Normalfall mit 'nilspace'). Beispiel:
+
+ DATASPACE VAR ds := nilspace;
+ BOUND ROW 1000 REAL VAR real feld := ds;
+ ....
+ real feld [index] := wert;
+ ....
+ forget (ds) (* Datei löschen, damit der Platz wieder verwendet wird *)
+
+Ein automatisches Löschen von DATASPACE-Objekten erfolgt auch nicht bei
+Programmende (sonst könnten sie ihre Funktion als Datei nicht erfüllen).
+Erst beim Löschen einer Task werden alle ihr gehörenden DATASPACE-Objekte
+freigegeben. Verboten ist weiterhin folgendes:
+
+ BOUND X ...;
+
+wobei 'X' mit BOUND deklariert wurde oder ein DATASPACE ist.
+
+Merke: Datenräume können durch 'new' erschaffen werden. Mit 'old' kann ein
+bereits vorhandener Datenraum angesprochen werden. Im Ãœbrigen gelten auch
+einige der für FILEs vorhandenen Operationen.
+
+
+
+Datei-Typen definieren
+
+Durch die Datenräume und die Datentyp-Definition von ELAN ist es für
+Programmierer relativ einfach, neue Datei-Datentypen zu definieren.
+
+In der Regel reicht der Datentyp FILE für "normale" Anwendungen aus, jedoch
+kann es manchmal sinnvoll und notwendig sein, neue Datei-Typen für spezielle
+Aufgaben zu definieren.
+
+In diesem Abschnitt zeigen wir an dem Beispiel DIRFILE (welcher zwar im
+ELAN-Standard definiert, aber nicht im EUMEL-System realisiert ist), wie ein
+neuer Datei-Datentyp definiert wird:
+
+ PACKET dirfiles DEFINES DIRFILE, :=, dirfile, getline, ...:
+
+ LET maxsize = 1000;
+
+ TYPE DIRFILE = BOUND ROW maxsize TEXT;
+ (* DIRFILE besteht aus TEXTen; Zugriff erfolgt ueber einen
+ Schluessel, der den Index auf die Reihung darstellt *)
+
+ OP := (DIRFILE VAR dest, DATASPACE CONST space):
+ CONCR (dest) := space
+ END OP :=;
+
+ DATASPACE PROC dirfile (TEXT CONST name):
+ IF exists (name)
+ THEN old (name)
+ ELSE new (name)
+ FI
+ END PROC dirfile;
+
+ PROC getline (DIRFILE CONST df, INT CONST index, TEXT VAR record):
+ IF index <= 0
+ THEN errorstop ("access before first record")
+ ELIF index > maxsize
+ THEN errorstop ("access after last record")
+ ELSE record := df [index]
+ FI
+ END PROC getline;
+
+ PROC putline (DIRFILE CONST df, INT CONST index, TEXT VAR record):
+ ...
+ END PROC putline;
+
+ ...
+ END PACKET dirfiles;
+
+Die Prozedur 'dirfile' ist die Assoziierungsprozedur für DIRFILEs (analog
+'sequential file' bei FILEs). 'dirfile' liefert entweder einen bereits vor-
+handenen Datenraum oder richtet einen neuen ein. Um eine Initialisierung mit
+der 'dirfile'-Prozedur vornehmen zu können, braucht man auch einen Zu-
+weisungsoperator, der den Datenraum an den DIRFILE-Datentyp koppelt.
+
+Zugriffe auf einen DIRFILE sind nun relativ einfach zu schreiben. Im obigen
+Beispiel wird nur die Prozedur 'getline' gezeigt.
+
+Nun ist es möglich, Programme zu schreiben, die den DIRFILE-Datentyp
+benutzen. Beispiel:
+
+ DIRFILE VAR laeufer ::
+ dirfile ("Nacht von Borgholzhausen");
+ INT VAR nummer;
+ TEXT VAR name;
+
+ REP
+ put ("Startnummer bitte:");
+ get (nummer);
+ line;
+ put ("Name des Laeufers:");
+ get (name);
+ putline (laeufer, nummer, name);
+ line
+ UNTIL no ("weiter") END REP;
+ ...
+
+Merke: Neue Datei-Typen für spezielle Anwendungen kann man leicht selbst
+programmieren.
+
+
+
+6. Beschreibung der Prozeduren
+
+In diesem Abschnitt werden alle Operationen, die für Dateien zur Verfügung
+stehen, aufgeführt. Dabei werden die Operationen für FILEs und Datenräume
+mit (F) gekennzeichnet.
+
++
+ THESAURUS OP + (THESAURUS CONST left, right)
+ Zweck: Vereinigungsmenge von 'left' und 'right'.
+
+ THESAURUS OP + (THESAURUS VAR left, TEXT CONST name)
+ Zweck: Nimmt den TEXT 'name' in den Thesaurus 'left' auf. Beispiel:
+
+ save (SOME father + "hugo", archive)
+
+-
+ THESAURUS OP - (THESAURUS CONST left, right)
+ Zweck: Differenzmenge von 'left' und 'right'.
+
+ THESAURUS OP - (THESAURUS VAR left, TEXT CONST name)
+ Zweck: Liefert einen Thesaurus aus left, aber ohne den Eintrag 'name'.
+ Beispiel:
+
+ save (ALL myself - "hugo", archive)
+
+/
+ THESAURUS OP / (THESAURUS CONST left, right)
+ Zweck: Schnittmenge von 'left' und 'right'.
+
+ TASK OP / (TEXT CONST task name)
+ Zweck: Liefert aus einem Tasknamen den internen Tasknamen. '/' kann über-
+ all dort eingesetzt werden, wo ein interner Taskname verlangt wird.
+
+ALL
+ THESAURUS OP ALL (TASK CONST task)
+ Zweck: Liefert einen Thesaurus, der alle Dateinamen der angegebenen Task
+ enthält (auch der Benutzer-Task: 'myself').
+
+ THESAURUS OP ALL (TEXT CONST file name)
+ Zweck: Liefert einen Thesaurus, der die in 'file name' vorhandenen Datei-
+ namen (jede Zeile ein Name) enthält.
+
+at (F)
+ BOOL PROC at (FILE VAR f, TEXT CONST word)
+ Zweck: Abfrage, ob man auf 'word' in der Datei 'f' positioniert ist.
+ Beispiel:
+
+ ...
+ down (f, "muster")
+ IF at (f, "muster")
+ THEN gefunden
+ ELSE nicht gefunden
+ FI;
+ ...
+
+archive
+ PROC archive (TEXT CONST archive name)
+ Zweck: Anmeldung von Archiv-Operationen. 'archive name' wird zur Ãœber-
+ prüfung für alle folgenden Archiv-Operationen verwandt, um die
+ unberechtigte Benutzung eines Archivs zu verhindern. Die Anmeldung
+ wird abgelehnt, wenn ein anderer Nutzer das Archiv belegt hat.
+
+ TASK PROC archive
+ Zweck: Liefert den internen Task-Bezeichner für die Verwendung in
+ Datei-Kommandos. Beispiel:
+
+ save ("datei", archive)
+
+brother
+ TASK PROC brother (TASK CONST task)
+ Zweck: Liefert den internen Task-Bezeichner der angegebenen "Bruder"-
+ Task.
+
+check
+ PROC check (TEXT CONST dateiname, TASK CONST task)
+ Zweck: Überprüft, ob die Datei 'dateiname' auf dem Archiv lesbar ist.
+ Beispiel:
+
+ check ("meine datei", archive)
+
+ PROC check (THESAURUS CONST t, TASK CONST task)
+ Zweck: Überprüft, ob die in dem Thesaurus 't' enthaltenen Dateien auf dem
+ Archiv lesbar sind. Beispiel:
+
+ check (ALL archive, archive)
+
+clear
+ PROC clear (TASK CONST task)
+ Zweck: Löscht alle Dateien der Task 'task'. Ist z.Z. nur für die Task
+ 'ARCHIVE' implementiert.
+
+clear removed (F)
+ PROC clear removed (FILE VAR f)
+ Zweck: Löscht die mit 'remove' "vorsichtig" gelöschten Zeilen aus der
+ Datei 'f' endgültig.
+
+close (F)
+ PROC close (FILE VAR file)
+ Zweck: Schließen der Datei 'file'. Im EUMEL-System ist der Aufruf von
+ 'close' nicht notwendig. 'close' wurde nur aufgenommen, um die
+ Kompatibilität zu Standard zu wahren.
+
+col (F)
+ PROC col (FILE VAR f, INT CONST position)
+ Zweck: Positionierung auf die Spalte 'position' innerhalb der aktuellen
+ Zeile.
+
+ INT PROC col (FILE CONST f)
+ Zweck: Liefert die aktuelle Position innerhalb der aktuellen Zeile.
+
+copy (F)
+ PROC copy (TEXT CONST source, destination)
+ Zweck: Kopiert die Datei 'source' in eine neue Datei mit dem Namen
+ 'destination' in der Benutzer-Task.
+ Fehlerfälle:
+ * destination file already exists
+ Eine Datei mit dem Namen 'destination' existiert bereits.
+ * source file does not exist
+ Die Ursprungsdatei mit dem Namen 'source' ist nicht vorhanden.
+ * directory overflow
+ Die Anzahl der zulässigen Dateien der Benutzer-Task ist über-
+ schritten.
+
+ PROC copy (DATASPACE CONST ds, TEXT CONST destination)
+ Zweck: Eintragen eines unbenannten DATASPACE in die Datei-Verwaltung.
+ Fehlerfälle:
+ * destination file already exists
+ Eine Datei mit dem Namen 'destination' existiert bereits.
+ * directory overflow
+ Die Anzahl der zulässigen Dateien der Benutzer-Task ist über-
+ schritten.
+
+create
+ PROC create (TEXT CONST name)
+ Zweck: Erschafft einen neuen Datenraum in der Benutzer-Task.
+ Fehlerfälle:
+ * file already exists
+ Eine Datei mit dem Namen 'name' existiert bereits in der Benutzer-
+ Task.
+ * directory overflow
+ Die Anzahl der zulässigen Dateien der Benutzer-Task ist über-
+ schritten.
+
+crypt (F)
+ PROC crypt (TEXT CONST name, parole)
+ Zweck: Verschlüsseln des Inhaltes der Datei 'name' mit Hilfe des Textes
+ 'parole' für Zwecke des Datenschutzes. Die Verschlüsselung ist
+ umso besser (bzw. umso schwieriger zu "knacken"), je länger der
+ Text 'parole' ist. Die Datei kann mit der Prozedur 'decrypt'
+ wieder entschlüsselt werden.
+
+ Eine Datei kann mehrfach verschlüsselt werden. Dabei gilt bei
+ einer Entschlüsselung das Klammerungsprinzip. Es muß also genau so
+ oft entschlüsselt werden, wie anfangs verschlüsselt wurde. Dabei
+ ist auf die richtige Angabe der 'parole'n zu achten. Beispiel:
+
+ crypt ("hugo", "verschluesselung1");
+ crypt ("hugo", "verschluesselung2");
+ ...
+ decrypt ("hugo", "verschluesselung2");
+ decrypt ("hugo", "verschluesselung1")
+
+ Achtung: 'crypt' und 'decrypt' sind nicht standardmäßig insertiert.
+
+decrypt (F)
+ PROC decrypt (TEXT CONST name, parole)
+ Zweck: Entschlüsselt die Datei 'name' mit Hilfe der angegebenen 'parole'.
+ Dabei ist darauf zu achten, daß die gleiche 'parole' anzugeben
+ ist, die verwendet wurde, um die Datei zu verschlüsseln (sonst
+ wirkt 'decrypt' wie ein erneuter Aufruf von 'crypt').Beim mehr-
+ fachen Ver- und Entschlüsseln ist das Klammerungsprinzip zu be-
+ achten (dazu vergl. 'crypt').
+
+delete record (F)
+ PROC delete record (FILE VAR file)
+ Zweck: Der aktuelle Satz der Datei 'file' wird gelöscht. Der folgende
+ Satz wird der aktuelle Satz. Die Datei 'file' muß mit der Verar-
+ beitungsart 'modify' assoziiert worden sein.
+
+do
+ PROC do (PROC (TEXT CONST) operate, THESAURUS CONST thesaurus)
+ Zweck: Ruft 'operate' mit allen im 'thesaurus' enthaltenen Dateinamen
+ nacheinander auf. Man beachte, daß bei Prozedur-Parametern der
+ Name der Prozedur hinter dessen Parametern geschrieben wird.
+ Beispiel:
+
+ do (PROC (TEXT CONST) reorganize, ALL myself)
+
+ PROC do (PROC (TEXT CONST, TASK CONST) operate,
+ THESAURUS CONST thesaurus, TASK CONST task)
+ Zweck: S.o.. Dabei ist zu beachten, daß 'task' als zweiter Parameter in
+ der Prozedur 'operate' eingesetzt wird. Beispiel:
+
+ do (PROC (TEXT CONST, TASK CONST) save,
+ SOME myself, father)
+ (* enspricht: *)
+ save (SOME myself, father)
+
+down (F)
+ PROC down (FILE VAR f)
+ Zweck: Positionieren um eine Zeile vorwärts in der Datei 'f'.
+
+ PROC down (FILE VAR f, INT CONST number)
+ Zweck: Positionieren um 'number' Zeilen vorwärts in der Datei 'f'.
+
+ PROC down (FILE VAR f, TEXT CONST pattern)
+ Zweck: Suche nach 'pattern' in der Datei 'f'. Wird 'pattern' gefunden,
+ ist die Position das erste Zeichen von 'pattern'. Andernfalls
+ steht man hinter dem letzten Zeichen der Datei. Achtung: 'down'
+ sucht vom nächsten Zeichen rechts ab, so daß wiederholtes Suchen
+ keine Endlosschleife ergibt.
+
+ PROC down (FILE VAR f, TEXT CONST pattern, INT CONST number)
+ Zweck: Wie obiges 'down', aber maximal nur 'number'-Zeilen weit.
+
+downety (F)
+ PROC downety (FILE VAR f, TEXT CONST pattern)
+ Zweck: Suche nach 'pattern' in der Datei 'f'. Wird 'pattern' gefunden,
+ ist die Position das erste Zeichen von 'pattern'. Andernfalls
+ steht man auf dem letzten Zeichen der Datei. Achtung: 'downety'
+ sucht (im Gegensatz zu 'down') vom aktuellen Zeichen.
+
+ PROC downety (FILE VAR f, TEXT CONST pattern, INT CONST number)
+ Zweck: Wie obiges 'downety', aber maximal nur 'number'-Zeilen weit.
+
+enter password
+ PROC enter password (TEXT CONST password)
+ Zweck: Einstellen eines Paßwortes in der Benutzer-Task für den Datei-
+ Verkehr mit einer Vater-Task. Der Parameter 'password' kann dabei
+ aus zwei Teilen bestehen, die durch ein "/"-Zeichen getrennt
+ werden müssen. Der erste Teil bedeutet das schreib-Passwort,
+ während der TEXT nach dem "/"-Zeichen das Lese-Paßwort beinhaltet.
+ Enthält der Parameter 'password' kein "/"-Zeichen, gilt der ange-
+ gebene TEXT sowohl für das Schreib- wie auch für das Lese-Paßwort.
+ Im Schreib- bzw. Lese-Teil des Paßworts kann man das "-"-Zeichen
+ angeben, um eine Datei vor überschreibendem oder lesendem Zugriff
+ zu schützen.
+
+ Die Paßwort-Überprüfung findet statt bei
+
+ - fetch (Überprüfung der Lese-Berechtigung)
+ - save (Überprüfung der Schreib-Berechtigung)
+ - erase (Überprüfung der Schreib-Berechtigung)
+
+eof (F)
+ BOOL PROC eof (FILE CONST file)
+ Zweck: Informationsprozedur auf das Ende eines FILEs. Liefert den Wert
+ TRUE, sofern hinter den letzten Satz eines FILEs positioniert
+ wurde.
+
+erase
+ PROC erase (TEXT CONST name)
+ Zweck: Löscht eine Datei mit dem Namen 'name' in der unmittelbaren
+ Vater-Task.
+ Fehlerfälle:
+ * ... gibt es nicht
+ Eine Datei mit dem Namen 'name' existiert in der unmittelbaren
+ Vater-Task nicht.
+ * wrong password
+ Es wurde mit der Prozedur 'enter password' nicht das richtige
+ Paßwort angegeben.
+
+ PROC erase (TEXT CONST name, TASK CONST task)
+ Zweck: Löscht eine Datei mit dem Namen 'name' in der Task 'task'. Bei-
+ spiel:
+
+ erase ("meine datei", father)
+
+ PROC erase (THESAURUS CONST thesaurus)
+ Zweck: Löscht die im 'thesaurus' angegebenen Dateien in der Vater-Task.
+ Beispiel (löscht alle Dateien in der Vater-Task, die in der Benut-
+ zer-Task vorhanden sind):
+
+ erase (ALL myself)
+
+ PROC erase (THESAURUS CONST thesaurus, TASK CONST manager)
+ Zweck: S.o..
+
+exists (F)
+ BOOL PROC exists (TEXT CONST name)
+ Zweck: Informationsprozedur zur Abfrage der Existenz einer Datei in der
+ Benutzer-Task. Beispiel:
+
+ IF exists ("dateiname")
+ THEN FILE VAR f :: sequential file ...;
+ ELSE errorstop ("Datei existiert nicht")
+ FI
+
+father
+ TASK PROC father
+ Zweck: Liefert den internen Task-Bezeichner der Vater-Task der Benutzer-
+ Task. Beispiel:
+
+ save ("datei", father)
+
+ TASK PROC father (TASK CONST task)
+ Zweck: Liefert den internen Task-Bezeichner von 'task'. Beispiel:
+
+ save ("datei", father (father)) (* Kopiert 'datei' zum "Opa" *)
+
+fetch
+ PROC fetch (TEXT CONST name)
+ Zweck: Einbringen einer Datei in die Benutzer-Task von dem "direkten"
+ Vater im Taskbaum.
+ Fehlerfälle:
+ * ... gibt es nicht
+ Die Datei existiert bei dem Vater nicht.
+ * directory overflow
+ Die Anzahl der zulässigen Dateien der Benutzer-Task ist über-
+ schritten.
+ * wrong password
+ Es wurde mit der Prozedur 'enter password' nicht das richtige
+ Paßwort angegeben.
+
+ PROC fetch (TEXT CONST name, TASK CONST task)
+ Zweck: Kopieren einer Datei in die Benutzer-Task von 'task'. Beispiel:
+
+ fetch ("datei", public)
+
+ PROC fetch (THESAURUS CONST thesaurus)
+ Zweck: Holt alle im 'thesaurus' enthaltenen Dateien von der Vater-Task.
+
+ PROC fetch (THESAURUS CONST thesaurus, TASK CONST manager)
+ Zweck: Holt alle im 'thesaurus' enthaltenen Dateien von der 'manager'-
+ Task.
+
+forget (F)
+ PROC forget (TEXT CONST name)
+ Zweck: Löschen einer Datei mit dem Namen 'name' in der Benutzer-Task.
+ Fehlerfälle:
+ * ... gibt es nicht
+ Die Datei mit dem Namen 'name' existiert nicht in der Benutzer-
+ Task.
+
+ PROC forget (DATASPACE VAR ds)
+ Zweck: Löschen des Datenraums 'ds'.
+
+ PROC forget (THESAURUS CONST thesaurus)
+ Zweck: Löscht die im 'thesaurus' enthaltenen Dateinamen in der Benutzer-
+ Task. Beispiel:
+
+ forget (SOME myself)
+
+ PROC forget (TEXT CONST file name, QUIET CONST q)
+ Zweck: Löschen der Datei 'file name' ohne Anfrage. Als zweiter Parameter
+ muß 'quiet' übergeben werden. Beispiel:
+
+ forget ("hugo", quiet)
+
+get (F)
+ PROC get (FILE VAR f, INT VAR number)
+ Zweck: Lesen eines INT-Wertes 'number' von der Datei 'f'.
+
+ PROC get (FILE VAR f, REAL VAR number)
+ Zweck: Lesen eines REAL-Wertes 'number' von der Datei 'f'.
+
+ PROC get (FILE VAR f, TEXT VAR text)
+ Zweck: Lesen eines TEXT-Wertes 'text' von der Datei 'f'.
+
+ PROC get (FILE VAR f, TEXT VAR text, TEXT CONST delimiter)
+ Zweck: Lesen eines TEXT-Wertes 'text' von der Datei 'f', bis das Zeichen
+ 'delimiter' angetroffen wird. Ein eventueller Zeilenwechsel in der
+ Datei wird dabei nicht übergangen.
+
+ PROC get (FILE VAR f, TEXT VAR text, INT CONST maxlength)
+ Zweck: Lesen eines TEXT-Wertes 'text' von der Datei 'f' mit 'maxlength'
+ Zeichen. Ein eventueller Zeilenwechsel in der Datei wird dabei
+ nicht übergangen.
+
+getline (F)
+ PROC get line (FILE VAR file, TEXT VAR record)
+ Zweck: Lesen einer Zeile 'record' von einer sequentiellen Datei 'file'.
+ Die Datei muß mit 'input' assoziiert sein (vergl. 'sequential
+ file').
+ Fehlerfälle:
+ * file not open
+ Die Datei 'file' ist gegenwärtig nicht assoziiert.
+ * input after end of file
+ Es wurde versucht, über die letzte Zeile einer Datei zu lesen.
+ * input access to output file
+ Es wurde versucht, von einem mit 'output' assoziierten FILE zu
+ lesen.
+
+global manager
+ PROC global manager
+ Zweck: Durch den Aufruf der Prozedur wird die Benutzer-Task zu einem
+ Datei-Manager. Danach können Söhne dieser Task eingerichtet
+ werden.
+
+input (F)
+ PROC input (FILE VAR f)
+ Zweck: Ändern der Verarbeitungsart von 'modify' oder 'output' in 'input'.
+ Dabei wird auf den ersten Satz der Datei positioniert.
+
+ TRANSPUTDIRECTION CONST input
+ Zweck: Assoziierung in Zusammenhang mit der Prozedur 'sequential file'
+ einer sequentiellen Datei mit der 'TRANSPUTDIRECTION' 'input' (nur
+ lesen).
+
+insert record (F)
+ PROC insert record (FILE VAR file)
+ Zweck: Es wird ein leerer Satz in die Datei 'file' vor die aktuelle
+ Position eingefügt. Dieser Satz kann anschließend mit 'write
+ record' beschrieben werden (d.h. der neue Satz ist jetzt der
+ aktuelle Satz). Die Datei 'file' muß mit der Verarbeitungsart
+ 'modify' assoziiert worden sein.
+
+line no (F)
+ INT PROC line no (FILE CONST file)
+ Zweck: Liefert die aktuelle Zeilennummer.
+
+line (F)
+ PROC line (FILE VAR file)
+ Zweck: Positionierung auf die nähhste Zeile der Datei 'file'. Die Datei
+ 'file' darf mit 'output' oder 'input' assoziiert sein. Wird ver-
+ sucht, über das Ende eines mit 'input' assoziierten FILEs zu
+ positionieren, wird keine Aktion vorgenommen.
+
+ PROC line (FILE VAR file, INT CONST lines)
+ Zweck: Positionierung auf 'lines' nächste Zeilen der Datei 'file'. Die
+ Datei 'file' darf mit 'output' oder 'input' assoziiert sein. Wird
+ versucht, über das Ende eines mit 'input' assoziierten FILEs zu
+ positionieren, wird keine Aktion vorgenommen. Ist 'lines' <= 0,
+ wird keine Aktion durchgeführt.
+
+lines (F)
+ PROC lines (FILE VAR f)
+ Zweck: Liefert die Anzahl der Zeilen der Datei 'f'.
+
+list
+ PROC list
+ Zweck: Listet alle Dateien der Benutzer-Task mit Namen und Datum des
+ letzten Zugriffs auf dem Terminal auf.
+
+ PROC list (FILE VAR f)
+ Zweck: Schreibt alle Dateien der Benutzer-Task mit Namen und Datum der
+ letzten Änderung in die Datei 'f'.
+
+ PROC list (TASK CONST task)
+ Zweck: Listet alle Dateien der angegebenen 'task' mit Namen und Datum der
+ letzten Änderung auf dem Terminal auf. Beispiel:
+
+ list (father)
+
+max line length (F)
+ INT PROC max line length (FILE CONST file)
+ Zweck: Informationsprozedur über die Anzahl von Zeichen in einer Zeile
+ der Datei 'file'. Standardmäßig sind die Anzahl der Zeichen einer
+ Zeile wie beim Editor 77 Zeichen.
+
+ PROC max line length (FILE VAR file, INT CONST number)
+ Zweck: Setzen der Anzahl von Zeichen einer Zeile in dem FILE 'file'.
+
+modify (F)
+ TRANSPUTDIRECTION CONST modify
+ Zweck: Diese Betriebsrichtung erlaubt das Vorwärts- und Rückwärts-Posi-
+ tionieren und das beliebige Einfügen und Löschen von Sätzen.
+ 'modify' wird für die Assoziierungsprozedur 'sequential file'
+ benötigt.
+
+ PROC modify (FILE VAR f)
+ Zweck: Ändern der Betriebsrichtung von 'input' oder 'output' in die Be-
+ triebsrichtung 'modify'.
+
+myself
+ TASK PROC myself
+ Zweck: Liefert den internen Task-Bezeichner der Benutzer-Task. Beispiel:
+
+ save (ALL myself, father)
+
+name
+ TEXT PROC name (TASK CONST task)
+ Zweck: Liefert den TEXT-Namen von 'task'. Beispiel:
+
+ put (name (myself))
+
+new (F)
+ DATASPACE PROC new (TEXT CONST name)
+ Zweck: Richtet eine neue Datei in der Benutzer-Task ein.
+ Fehlerfälle:
+ * file already exists
+ Die Datei mit dem Namen 'name' existiert bereits in der Benutzer-
+ Task.
+ * directory overflow
+ Die Anzahl der zulässigen Dateien in der Benutzer-Task ist über-
+ schritten.
+
+nilspace (F)
+ DATASPACE CONST nilspace
+ Zweck: Liefert einen leeren Datenraum.
+
+old (F)
+ DATASPACE PROC old (TEXT CONST name)
+ Zweck: Eine bereits vorhandene Datei der Benutzer-Task wird erneut zur
+ Bearbeitung angemeldet.
+ Fehlerfälle:
+ * ... gibt es nicht
+ Die Datei mit dem Namen 'name' ist nicht in der Benutzer-Task
+ vorhanden.
+
+output (F)
+ PROC output (FILE VAR file)
+ Zweck: Ändern der Verarbeitungsart von 'input' oder 'modify' in 'output'.
+ Dabei wird hinter den letzten Satz der Datei positioniert.
+
+ TRANSPUTDIRECTION CONST output
+ Zweck: In Verbindung mit der Prozedur 'sequential file' kann eine Datei
+ assoziiert werden mit der Betriebsrichtung 'output' (nur
+ schreiben).
+
+pattern found
+ BOOL PROC pattern found
+ Zweck: Liefert TRUE, sofern die letzte Suchoperation (siehe 'down' und
+ 'up') erfolgreich war, sonst FALSE.
+
+printer
+ TASK PROC printer
+ Zweck: Liefert den internen TASK-Bezeichner der SPOOLer-Task für den
+ Drucker. Beispiel:
+
+ save ("datei", printer)
+
+public
+ TASK PROC public
+ Zweck: Liefert den internen Task-Bezeichner von "PUBLIC". Beispiel:
+
+ fetch ("datei", public)
+
+put (F)
+ PROC put (FILE VAR f, INT CONST number)
+ Zweck: Ausgabe eines INT-Wertes 'number' in die Datei 'f'. Dabei wird ein
+ Leerzeichen an die Ausgabe angefügt.
+
+ PROC put (FILE VAR f, REAL CONST number)
+ Zweck: Ausgabe eines REAL-Wertes 'number' in die Datei 'f'. Dabei wird
+ ein Leerzeichen an die Ausgabe angefügt.
+
+ PROC put (FILE VAR f, TEXT CONST text)
+ Zweck: Ausgabe eines TEXT-Wertes 'text' in die Datei 'f'. Dabei wird ein
+ Leerzeichen an die Ausgabe angefügt.
+
+putline (F)
+ PROC putline (FILE VAR file, TEXT CONST record)
+ Zweck: Ausgabe eines TEXTes 'record' in die Datei 'file'. 'file' muß mit
+ 'output' assoziiert sein.
+ Fehlerfälle:
+ * file not open
+ Die Datei 'file' ist gegenwärtig nicht assoziiert.
+ * output access to input file
+ Es wurde versucht, auf einen mit 'input' assoziierten FILE zu
+ schreiben.
+
+read record (F)
+ PROC read record (FILE CONST file, TEXT VAR record)
+ Zweck: Liest den aktuellen Satz der Datei 'file' in den TEXT 'record'.
+ Die Position wird dabei nicht verändert. Die Datei 'file' muß mit
+ der Verarbeitungsart 'modify' assoziiert worden sein.
+
+reinsert (F)
+ PROC reinsert (FILE VAR f)
+ Zweck: Einfügen von "vorsichtig gelöschten" Zeilen (vergl. 'remove') an
+ der aktuellen Position.
+
+release
+ PROC release (TASK CONST task)
+ Zweck: Aufgabe der Reservierung des Archivs. Ein implizites 'release'
+ wird automatisch fünf Minuten nach der letzten Archiv-Operation
+ gegeben, sofern ein 'archive' eines anderen Nutzers vorliegt.
+ Beispiel:
+
+ release (archive)
+
+rename (F)
+ PROC rename (TEXT CONST oldname, newname)
+ Zweck: Umbenennen einer Datei von 'oldname' in 'newname'.
+
+remainder
+ THESAURUS PROC remainder
+ Zweck: Liefert nach der Unterbrechung einer Thesaurus-Operation den
+ "Rest"-Thesaurus.
+
+reorganize (F)
+ PROC reorganize (TEXT CONST filename)
+ Zweck: Reorganisiert eine Datei. Die durch eventuelles Einfügen und
+ Löschen entstandene Lücken werden eliminiert und die Anordung der
+ Sätze der Datei wird linearisiert.
+
+reset (F)
+ PROC reset (FILE VAR file)
+ Zweck: Positionieren in einem FILE auf den Anfang (bei mit 'input' asso-
+ ziierten FILEs) oder auf das Ende (bei mit 'output' assoziierten
+ FILEs).
+
+reset range (F)
+ PROC reset range (FILE VAR file)
+ Zweck: Setzt alle Einschränkungen auf 'file' zurück. Siehe auch 'set
+ range'.
+
+remove (F)
+ PROC remove (FILE VAR f, INT CONST anzahl)
+ Zweck: Löscht eine 'anzahl' von Zeilen "vorsichtig" aus der Datei 'f',
+ die mit 'reinsert' an anderer Stelle wieder eingesetzt werden
+ können.
+
+save
+ PROC save (TEXT CONST datei)
+ Zweck: Datei 'datei' wird an die unmittelbare Vater-Task übertragen.
+ Fehlerfälle:
+ * ... gibt es nicht
+ Eine Datei mit dem Namen 'datei' existiert nicht in der Benutzer-
+ Task.
+ * directory overflow
+ Die Anzahl der zulässigen Dateien in 'task' ist überschritten.
+ * wrong password
+ Es wurde mit der Prozedur 'enter password' nicht das richtige
+ Paßwort angegeben.
+
+ PROC save (TEXT CONST name, TASK CONST task)
+ Zweck: Datei mit dem Namen 'name' in Task 'task' kopieren. Beispiel:
+
+ save ("meine datei", father)
+
+ Fehlerfälle:
+ * ... gibt es nicht
+ Eine Datei mit dem Namen 'name' existiert nicht in der Benutzer-
+ Task.
+ * directory overflow
+ Die Anzahl der zulässigen Dateien in der angegebenen task ist
+ überschritten.
+ * wrong password
+ Es wurde mit der Prozedur 'enter password' nicht das richtige
+ Paßwort angegeben.
+
+ PROC save (THESAURUS CONST thesaurus)
+ Zweck: Kopiert die Dateien, die in 'thesaurus' enthalten sind, in die
+ Vater-Task. Beispiel:
+
+ save (SOME myself)
+
+ PROC save (THESAURUS CONST thesaurus, TASK CONST manager)
+ Zweck: Kopiert die Dateien, die in 'thesaurus' enthalten sind, in Task
+ 'manager'.
+
+segments (F)
+ INT PROC segments (FILE CONST f)
+ Zweck: Liefert die Anzahl der Datei-Segmente von 'f'. Nach 'reorganize'
+ besteht 'f' aus einem Segment. Einfügungen oder Löschungen
+ erhöhen die Segmentanzahl.
+
+sequential file (F)
+ FILE PROC sequential file (TRANSPUTDIRECTION CONST mode, DATASPACE VAR ds)
+ Zweck: Assoziierung einer sequentiellen Datei mit dem Dataspace 'ds' und
+ der Betriebsrichtung 'TRANSPUTDIRECTION' (vergl. 'modify', 'input'
+ bzw. 'output'). Diese Prozedur dient zur Assoziierung eines tempo-
+ rären Datenraums in der Benutzer-Task, der nach der Beendigung
+ des Programmlaufs nicht mehr zugriffsfähig ist (weil der Name des
+ Datenraums nicht mehr ansprechbar ist). Somit muß der Datenraum
+ explizit vom Programm gelöscht werden.
+
+ FILE PROC sequential file (TRANSPUTDIRECTION CONST mode, TEXT CONST name)
+ Zweck: Assoziierung einer sequentiellen Datei mit dem Namen 'name' und
+ der Betriebsrichtung 'TRANSPUTDIRECTION' (vergl. 'input' bzw.
+ 'output'). Existiert der FILE bereits, dann wird mit 'input' auf
+ den Anfang des FILEs, bei 'output' hinter den letzten Satz der
+ Datei positioniert. Existiert dagegen der FILE noch nicht und ist
+ die TRANSPUTDIRECTION 'output', wird ein neuer FILE eingerichtet.
+ Fehlerfall:
+ * input file not existing
+ Es wurde versucht, einen nicht vorhandenen FILE mit 'input' zu
+ assoziieren.
+
+set range (F)
+ PROC set range (FILE VAR f, INT CONST anz, INT CONST column, FRANGE VAR b)
+ Zweck: Schränkt die Datei 'f' auf 'anz' Zeilen beginnend bei der Position
+ 'column' der aktuellen Zeile. Der "alte" Datei-Bereich wird in 'b'
+ gespeichert.
+
+ PROC set range (FILE VAR f, FRANGE VAR b)
+ Zweck: Setzt die Datei 'f' auf die in 'b' gespeicherten Bereich zurück.
+
+son
+ TASK PROC son (TASK CONST task)
+ Zweck: Liefert den internen Task-Bezeichner der Sohn-Task. Beispiel:
+
+ put (name (son (myself)))
+
+SOME
+ THESAURUS OP SOME (THESAURUS CONST thesaurus)
+ Zweck: Bietet den angegebenen 'thesaurus' zum Editieren an. Dabei können
+ nicht erwünschte Namen gestrichen werden.
+
+ THESAURUS OP SOME (TASK CONST task)
+ Zweck: Bietet einen THESAURUS von 'task' zum Editieren an.
+
+ THESAURUS OP SOME (TEXT CONST file name)
+ Zweck: Bietet einen 'thesaurus', der aus 'file name' gebildet wird, zum
+ editieren an.
+
+to line (F)
+ PROC to line (FILE VAR f, INT CONST number)
+ Zweck: Positionierung auf die Zeile 'number'. Nur erlaubt in der
+ Betriebsrichtung 'modify'.
+
+task
+ TASK PROC task (TEXT CONST task name)
+ Zweck: Liefert den internen Task-Bezeichner von 'task name'. Beispiel:
+
+ save ("datei", task ("PUBLIC"))
+
+ (* das gleiche wie: *)
+
+ save ("datei", public)
+
+type (F)
+ INT PROC type (DATASPACE CONST ds)
+ Zweck: Liefert den frei wählbaren (INT-) Schlüssel des Datenraums 'ds'.
+ Wurde der Datenraum noch nie angekoppelt, so liefert die Prozedur
+ 'type' einen Wert < 0, erfolgte eine Ankopplung und hat ein
+ Programmierer für den Datenraum 'ds' noch keinen anderen Schlüssel
+ festgelegt, so liefert 'type' den Wert '0'.
+
+ PROC type (DATASPACE CONST ds, INT CONST type)
+ Zweck: Setzt den frei wählbaren Schlüssel 'type' für den Datenraum 'ds'
+ (vergl. obige Prozedur 'type').
+
+up (F)
+ PROC up (FILE VAR f)
+ Zweck: Positionieren um eine Zeile rückwärts in der Datei 'f'.
+
+ PROC up (FILE VAR f, INT CONST number)
+ Zweck: Positionieren um 'number' Zeilen rückwärts in der Datei 'f'.
+
+ PROC up (FILE VAR f, TEXT CONST pattern)
+ Zweck: Suche nach 'pattern' rückwärts in der Datei 'f'. Wird 'pattern'
+ gefunden, ist die Position das erste Zeichen von 'pattern'.
+ Andernfalls steht man auf dem ersten Zeichen der Datei. Achtung:
+ 'down' sucht vom nächsten Zeichen links ab, so daß wiederholtes
+ Suchen keine Endlosschleife ergibt.
+
+ PROC up (FILE VAR f, TEXT CONST pattern, INT CONST number)
+ Zweck: Wie obiges 'up', aber maximal nur 'number'-Zeilen weit.
+
+uppety (F)
+ PROC uppety (FILE VAR f, TEXT CONST pattern)
+ Zweck: Suche nach 'pattern' rückwärts in der Datei 'f'. Wird 'pattern'
+ gefunden, ist die Position das erste Zeichen von 'pattern'.
+ Andernfalls steht man auf dem ersten Zeichen der Datei. Achtung:
+ 'uppety' sucht (im Gegensatz zu 'up') vom aktuellen Zeichen.
+
+ PROC uppety (FILE VAR f, TEXT CONST pattern, INT CONST number)
+ Zweck: Wie obiges 'uppety', aber maximal nur 'number'-Zeilen weit.
+
+word (F)
+ TEXT PROC word (FILE CONST f)
+ Zweck: Liefert das aktuelle Wort (bis zum nächsten Leerzeichen oder
+ Zeilenende).
+
+ TEXT PROC word (FILE CONST f, TEXT CONST sep)
+ Zweck: Liefert einen Text von der aktuellen Position bis zum nächsten
+ 'sep-Zeichen oder Zeilenende.
+
+ TEXT CONST word (FILE CONST f, INT CONST len)
+ Zweck: Liefert einen Text von der aktuellen Position mit der Länge 'len'
+ bzw. bis zum Zeilenende.
+
+write (F)
+ PROC write (FILE VAR f, TEXT CONST text)
+ Zweck: Schreibt 'text' in die Datei 'f' (analog 'put (f, text)'), aber
+ ohne Trennblank.
+
+write record (F)
+ PROC write record (FILE VAR file, TEXT CONST record)
+ Zweck: Schreibt einen Satz in die Datei 'file' an die aktuelle Position.
+ Dieser Satz muß bereits vorhanden sein, d.h. mit 'write record'
+ kann keine leere Datei beschrieben werden, sondern es wird der
+ Satz an der aktuellen Position überschrieben. Die Position in der
+ Datei wird nicht verändert. Die Datei 'file' muß mit der Verar-
+ beitungsart 'modify' assoziiert worden sein.
+
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil8 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil8
new file mode 100644
index 0000000..16e4d07
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil8
@@ -0,0 +1,1345 @@
+ EUMEL-Benutzerhandbuch
+
+ TEIL 8: Standardpakete
+
+
+1. Ãœbersicht
+
+Hier werden die im EUMEL-System verfügbaren Prozeduren und Operatoren aufge-
+führt, die nicht bereits in anderen Teilen des Benutzerhandbuchs beschrieben
+wurden.
+
+Die meisten der hier beschriebenen Objekte werden nicht vom ELAN-Compiler,
+sondern von vorübersetzten Moduln (PACKETs) realisiert (vergl. dazu auch den
+Quellcode). Die in diesem Teil beschriebenen Prozeduren und Operatoren
+weisen einige wenige Modifikationen, aber beträchtliche Erweiterungen gegen-
+über dem Standard auf, um sie für die Zwecke des EUMEL-Systems anzupassen.
+Hier werden nur diejenigen Objekte aufgeführt, die bei einer System-Aus-
+lieferung dem EUMEL-System beigefügt sind. Jeder Installation ist es frei-
+gestellt, diesen "EUMEL-Standard" zu erweitern oder zu modifizieren.
+
+Die Operationen des EUMEL-Standards lassen sich in verschiedene Klassen -
+je nach Aufgabenbereich - ordnen.
+
+
+
+Ein-/Ausgabe
+
+Die Ein-/Ausgabe erfolgt im EUMEL-System in der Regel auf dem Terminal des
+Benutzers. Sie kann aber auch in einen File umgeleitet werden.
+
+Die Ein-/Ausgabe eines Programms erfolgt in der Regel auf dem Terminal des
+Benutzers, welches einem Prozeß zugeordnet ist. Die Eingabe vom Bildschirm
+kann man mit den Prozeduren
+
+ get
+
+programmieren, welche INT, REAL und TEXT-Werte einlesen. Bei der Eingabe
+kann der Eingabetext editiert werden (Zeichen löschen, einfügen, über-
+schreiben oder Lernsequenzen abrufen). Die Ausgabe erfolgt mit den Proze-
+duren
+
+ put
+
+(für INT-, REAL- und TEXT-Werte). Von den 'put'-Prozeduren wird ein Leer-
+zeichen an eine Ausgabe angefügt, um diese von der vorhergehenden zu trennen.
+Zusätzlich existiert die
+
+ write
+
+Prozedur, welche an die Ausgabe kein Leerzeichen anfügt. Mit
+
+ line
+
+kann man eine Positionierung auf eine neue Zeile bei der Ein-/Ausgabe er-
+wirken. Mit
+
+ getline
+ putline
+
+kann eine ganze Zeile eingelesen bzw. ausgegeben werden.
+
+Wie bereits erwähnt, erfolgt die Ein-/Ausgabe in der Regel auf dem Terminal
+des Benutzers. Es ist jedoch möglich, die Ein-/Ausgabe dieser Prozeduren
+"umzuleiten". Diese Umleitung erfolgt in eine oder von einer Datei. Dazu
+gibt es die Prozeduren
+
+ online (* liefert TRUE, wenn die Task an ein Terminal
+ gekoppelt ist *)
+ sysout ("name") (* Ausgabe erfolgt in die Datei 'name'. 'sysout
+ ("")' schaltet auf das Terminal zurück *)
+ sysout (* Liefert den Namen der eingestellten 'sysout'-
+ Datei. Wird "" geliefert, ist man an ein
+ Terminal gekoppelt *)
+ sysin ("name") (* Umschaltung der Eingabe vom Terminal auf die
+ Datei 'name'. sysin ("")' schaltet auf das
+ Terminal zurück *)
+ sysin (* Liefert den Namen der eingestellten 'sysin'-
+ Datei. Wird "" geliefert, ist man an ein
+ Terminal gekoppelt *)
+
+Wie bereits erwähnt, ist die Umschaltung nur für die Prozeduren 'get' und
+'put'/'write', sowie 'getline' und 'putline' und die Prozedur 'line' möglich.
+(Die folgenden Prozeduren haben immer eine Wirkung auf das Benutzer-
+Terminal). Die Prozedur
+
+ out
+
+schreibt wie 'write' einen Text auf den Bildschirm (läßt sich aber nicht
+"umleiten").
+
+ cout
+
+schreibt einen INT-Wert an die aktuelle Cursor-Position auf den Bildschirm
+und positioniert anschließend auf diese Position wieder zurück. Diese
+Prozedur wird vorwiegend für Kontroll-Ausgaben (z.B. Zeilennummern) benutzt.
+Ist die Task nicht angekoppelt, geht die Ausgabe ins "Leere"; das Programm
+der Task läuft also weiter (im Gegensatz zu 'put' auf den Bildschirm). Mit
+der Prozedur
+
+ cursor
+
+kann - neben der Möglichkeit des Arbeitens mit Steuerzeichen - auf eine
+bestimmte Position des Bildschirms positioniert werden. Mit
+
+ get cursor
+
+kann die aktuelle Position des Cursors auf dem Terminal des Benutzers er-
+fragt werden. Mit Hilfe der Prozedur
+
+ inchar
+
+kann ein Zeichen vom Bildschirm gelesen werden. Der Prozeß wartet solange,
+bis ein Zeichen eingegeben wird. Dagegen wird bei
+
+ incharety
+
+niltext geliefert, wenn kein Zeichen eingegeben wurde. Eine weitere 'inchare-
+ty'-Prozedur wartet zusätzlich noch eine angebbare Zeitdauer, ob ein Zeichen
+eingegeben wird. Der Operator
+
+ TIMESOUT
+
+stellt einen TEXT mehrfach auf dem Bildschirm dar. Die Prozedur
+
+ page
+
+positioniert auf einen "neuen Bildschirm": der Bildschirm wird gelöscht und
+der Cursor befindet sich anschließend in der linken oberen Ecke des Bild-
+schirms.
+
+
+
+Manipulation von Texten
+
+Ein Text kann im EUMEL-System bis zu 32 000 Zeichen haben. Für TEXTe
+stehen neben der Zuweisung die Vergleichsoperatoren
+
+ = , < , <= , > , >= , <>
+
+zur Verfügung. Dabei ist die lexikographische Reihenfolge der Zeichen (vergl.
+EUMEL-Zeichensatz) zu beachten. Zur Verkettung zweier TEXTe ist der
+
+ +
+
+Operator vorhanden. Der Operator
+
+ *
+
+nimmt eine Vervielfachung eines TEXTes vor. Der Operator
+
+ CAT
+
+konkateniert den linken mit dem rechten Operanden und weist das Resultat dem
+linken Operanden zu. Die Prozeduren
+
+ pos
+
+liefern die Position des ersten Auftretens eines TEXTes oder einer
+Zeichenklasse in einem anderen TEXT. Die Prozeduren
+
+ code
+
+konvertieren ein Zeichen in einen INT-Wert und umgekehrt (vergl. dazu den
+EUMEL-Zeichensatz) und dienen z.B. zur Behandlung von Zeichen, die nicht
+auf einer Tastatur zu finden sind. Die Prozedur
+
+ compress
+
+schneidet führende und nachfolgende Leerzeichen eines TEXTs ab, während
+
+ delete char (* ein Zeichen loeschen *)
+ insert char (* ein Zeichen einfuegen *)
+
+ein Zeichen einfügt bzw. löscht. Mit
+
+ change
+
+kann bei dem erstmaligen Auftreten eines Teiltextes in einem TEXT dieser
+ersetzt werden. Mit
+
+ change all
+
+kann jedesmal, wenn ein Teiltext in einem TEXT auftritt, dieser durch einen
+anderen Text ersetzt werden.
+
+ LENGTH (* oder *)
+ length
+
+liefert die Länge (d.h. die Anzahl der Zeichen in einem TEXT einschließlich
+der Leerzeichen) eines TEXTes. Mit
+
+ replace
+
+kann eine Ersetzung eines Teiltextes erzielt werden. Im Gegensatz zu
+'replace' kann sich bei 'change' die Länge des Textes ändern. Mit
+
+ SUB
+ subtext
+
+kann ein Zeichen ('SUB') oder ein Teiltext ('subtext') aus einem Text geholt
+werden.
+
+TEXTe werden im EUMEL-System über einen Heap realisiert, d.h. nicht wie
+andere Objekte auf einem Stack. Das hat u.a. zur Folge, daß TEXT-"Leichen"
+auf dem Heap nicht automatisch beseitigt werden. Darum kann der benötigte
+Speicherplatz durch TEXT-Operationen anwachsen. Der Heap kann nun von
+unnötigem Speicherplatz durch die Prozedur
+
+ collect heap garbage
+
+bereinigt werden. Die Größe des Heaps (in KB) kann durch die Prozedur
+
+ heap size
+
+erfragt werden. Übrigens überprüft der Standard-Monitor nach jedem Kommando
+die Heap-Größe und veranlaßt eine Bereinigung des Heaps, wenn dieser um
+mindestens 4 KB gewachsen ist.
+
+
+
+Mathematische Operationen
+
+Folgende mathematische Prozeduren bzw. Operatoren stehen im EUMEL zur Zeit
+zur Verfügung (manche Prozeduren stehen in mehr als einer Version zur
+Verfügung, z.B. die sin-Prozedur für Radiant und Winkelgrad):
+
+ ** (* Exponentiation *)
+ abs (* Absolutbetrag *)
+ arctan (* Arcus Tangens-Funktion *)
+ cos (* Kosinus-Funktion *)
+ e (* Eulersche Zahl (2.718282) *)
+ pi (* Die Zahl pi (3.141593) *)
+ exp (* Exponential-Funktion *)
+ floor (* REAL mit abgeschnittenen Nachkommastellen *)
+ frac (* Nachkommastellen eines REALs *)
+ random,
+ initialize random (* Zufallszahlen *)
+ ln, log2, log10 (* Logarithmus-Funktionen *)
+ max, min (* Minimum bzw. Maximum zweier Werte *)
+ MOD (* Modulo-Funktion *)
+ round (* Rundung *)
+ sign (* Vorzeichen feststellen *)
+ sin (* Sinus-Funktion *)
+ sqrt (* Wurzel-Funktion *)
+ tan (* Tangens-Funktion *)
+
+
+
+Konvertierungs-Operationen
+
+Mit den Prozeduren
+
+ text
+
+kann aus einem INT- bzw. REAL-Wert ein TEXT, während mit
+
+ int
+
+aus einem REAL- bzw. TEXT-Wert ein INT und mit
+
+ real
+
+aus einem INT- bzw. TEXT-Wert ein REAL gemacht werden kann. Mit
+
+ last conversion ok
+
+kann abgefragt werden, ob die letzte Umwandlung ohne Fehler bzw. fehlerhaft
+vorgenommen wurde. Mit
+
+ decimal exponent
+
+kann der Exponent eines REAL-Wertes ausgeblendet werden.
+
+
+
+Kommando-Dialog
+
+Die Prozeduren für den Kommando-Dialog dienen zur bequemen Programmierung
+von interaktiven Anfragen an einen Benutzer eines Programms. (Diese
+Prozeduren werden u.a. auch vom Monitor verwendet). Der Kommando-Dialog
+ist im Normalfall eingeschaltet. Mit der Prozedur
+
+ command dialogue
+
+kann man den Kommando-Dialog ein- bzw. ausschalten. Mit der Prozedur
+
+ say
+
+kann - sofern der Kommando-Dialog eingeschaltet ist - ein Text auf dem
+Bildschirm ausgegeben werden. Sofern der Kommando-Dialog eingeschaltet ist,
+schreibt die Prozedur
+
+ yes
+
+einen Text auf den Bildschirm des Benutzers. An den Text wird '(j/n) ?'
+angefügt. Die Prozedur 'yes' liefert den Wert TRUE, sofern der Benutzer auf
+die Frage mit dem Zeichen "j" antwortet und den Wert FALSE, sofern die
+Antwort "n" lautete. Die Prozedur
+
+ no
+
+arbeitet wie 'NOT yes'.
+
+
+
+Verschiedenes
+
+Mit den Prozeduren
+
+ stop
+ errorstop
+
+kann ein Abbruch (letztere mit Meldung; vergl. Fehlerbehandlung im System-
+handbuch) erreicht werden. Die Prozedur
+
+ clock
+
+liefert Zeitwerte als REAL-Wert, nämlich die verbrauchte CPU-Zeit einer Task
+oder die aktuelle Uhrzeit (inklusive Datum). Die Prozedur
+
+ time of day
+
+liefert die aktuelle Uhrzeit. Mit den Konvertierungsprozeduren
+
+ date
+ time
+
+können die Werte der Prozedur 'clock' in eine lesbare Form gebracht werden.
+Mit der Prozedur
+
+ pause
+
+kann eine bestimmte Zeitdauer gewartet werden, ohne den Prozessor zu be-
+lasten. Die Wartezeit wird abgebrochen, wenn die Zeitgrenze erreicht ist
+oder sobald ein Zeichen am Terminal des Benutzers eingegeben wurde. Dieses
+Zeichen wird nicht verarbeitet.
+
+
+
+2. Die EUMEL-Standardpakete
+
+Die elementaren Datentypen BOOL, INT, REAL, TEXT und die entsprechenden Zu-
+weisungsoperatoren werden hier nicht angegeben.
+
+=
+ BOOL OP = (INT CONST a, b)
+ Zweck: Vergleich.
+
+ BOOL OP = (REAL CONST a, b)
+ Zweck: Vergleich.
+
+ BOOL OP = (TEXT CONST left, right)
+ Zweck: Vergleich von zwei Texten auf Gleichheit (Texte mit ungleichen
+ Längen sind immer ungleich).
+
+<
+ BOOL OP < (INT CONST a, b)
+ Zweck: Vergleich auf kleiner.
+
+ BOOL OP < (REAL CONST a, b)
+ Zweck: Vergleich auf kleiner.
+
+ BOOL OP < (TEXT CONST left, right)
+ Zweck: Vergleich zweier Texte auf kleiner ('left' kommt lexikographisch
+ vor 'right').
+
+>
+ BOOL OP > (INT CONST a, b)
+ Zweck: Vergleich auf größer.
+
+ BOOL OP > (REAL CONST a, b)
+ Zweck: Vergleich auf größer.
+
+ BOOL OP > (TEXT CONST left, right)
+ Zweck: Vergleich zweier Texte auf größer ('left' kommt lexikographisch
+ nach 'right').
+
+<=
+ BOOL OP <= (INT CONST a, b)
+ Zweck: Vergleich auf kleiner gleich.
+
+ BOOL OP <= (REAL CONST a, b)
+ Zweck: Vergleich auf kleiner gleich.
+
+ BOOL OP <= (TEXT CONST left, right)
+ Zweck: Vergleich von zwei Texten auf kleiner gleich ('left' kommt
+ lexikographisch vor oder ist gleich 'right').
+
+>=
+ BOOL OP >= (INT CONST a, b)
+ Zweck: Vergleich auf größer gleich.
+
+ BOOL OP >= (REAL CONST a, b)
+ Zweck: Vergleich auf größer gleich.
+
+ BOOL OP >= (TEXT CONST left, right)
+ Zweck: Vergleich zweier Texte auf größer gleich ('left' kommt lexiko-
+ graphisch nach oder ist gleich 'right').
+
+<>
+ BOOL OP <> (INT CONST a, b)
+ Zweck: Vergleich auf Ungleichheit.
+
+ BOOL OP <> (REAL CONST a, b)
+ Zweck: Vergleich auf Ungleichheit.
+
+ BOOL OP <> (TEXT CONST left, right)
+ Zweck: Vergleich von zwei Texten auf Ungleichheit (Texte mit ungleichen
+ Längen sind stets ungleich).
+
++
+ INT OP + (INT CONST a)
+ Zweck: Monadischer Operator (Vorzeichen, ohne Wirkung).
+
+ REAL OP + (REAL CONST a)
+ Zweck: Monadischer Operator (Vorzeichen, ohne Wirkung).
+
+ INT OP + (INT CONST a, b)
+ Zweck: Addition.
+
+ REAL OP + (REAL CONST a, b)
+ Zweck: Addition.
+
+ TEXT OP + (TEXT CONST left, right)
+ Zweck: Verkettung der Texte 'left' und 'right' in dieser Reihenfolge. Die
+ Länge des Resultats ergibt sich aus der Addition der Längen der
+ Operanden.
+
+-
+ INT OP - (INT CONST a)
+ Zweck: Vorzeichen-Umkehrung.
+
+ REAL OP - (REAL CONST a)
+ Zweck: Vorzeichen-Umkehrung.
+
+ INT OP - (INT CONST a, b)
+ Zweck: Subtraktion.
+
+ REAL OP - (REAL CONST a, b)
+ Zweck: Subtraktion.
+
+*
+ INT OP * (INT CONST a, b)
+ Zweck: Multiplikation.
+
+ REAL OP * (REAL CONST a, b)
+ Zweck: Multiplikation.
+
+ TEXT OP * (INT CONST times, TEXT CONST source)
+ Zweck: 'times' fache Erstellung von 'source' und Verkettung. Dabei muß
+
+ times >= 0
+
+ sein, sonst wird 'niltext' geliefert.
+
+/
+ REAL OP / (REAL CONST a, b)
+ Zweck: Division.
+ Fehlerfall:
+ * Division durch 0
+
+**
+ INT OP ** (INT CONST arg, exp)
+ Zweck: Exponentiation mit 'exp' >= 0
+ Fehlerfälle:
+ * INT OP ** : negative exponent
+ Ein negativer Exponent ist nicht zugelassen.
+ * 0 ** 0 is not defined
+ 'arg' und 'exp' dürfen nicht beide 0 sein.
+
+ REAL OP ** (REAL CONST arg, exp)
+ Zweck: Exponentiation.
+ Fehlerfälle:
+ * hoch mit negativer basis
+ Der 'exp' muß >= 0.0 sein.
+ * 0**0 geht nicht
+ 'arg' und 'exp' dürfen nicht gleichzeitig 0.0 sein.
+
+ REAL OP ** (REAL CONST arg, INT CONST exp)
+ Zweck: Exponentiation.
+ Fehlerfall:
+ * 0.0 ** 0 geht nicht
+
+abs
+ INT PROC abs (INT CONST argument)
+ Zweck: Absolutbetrag eines INT-Wertes.
+
+ INT OP ABS (INT CONST argument)
+ Zweck: Absolutbetrag eines INT-Wertes.
+
+ REAL PROC abs (REAL CONST value)
+ Zweck: Absolutbetrag eines REAL-Wertes.
+
+ REAL OP ABS (REAL CONST value)
+ Zweck: Absolutbetrag eines REAL-Wertes.
+
+AND
+ BOOL OP AND (BOOL CONST a, b)
+ Zweck: Logisches und.
+
+arctan
+ REAL PROC arctan (REAL CONST x)
+ Zweck: Arcus Tangens-Funktion. Liefert einen Wert in Radiant.
+
+arctand
+ REAL PROC arctand (REAL CONST x)
+ Zweck: Arcus Tangens-Funktion. Liefert einen Wert in Grad.
+
+CAT
+ OP CAT (TEXT VAR left, TEXT CONST right)
+ Zweck: Hat die gleiche Wirkung wie
+
+ left := left + right
+
+ Hinweis: Der Operator 'CAT' hat eine geringere Heap-Belastung als
+ die Operation mit expliziter Zuweisung.
+
+change
+ PROC change (TEXT VAR destination, TEXT CONST old, new)
+ Zweck: Ersetzung des (Teil-) TEXTes 'old' in 'destination' durch 'new' bei
+ dem erstmaligen Auftreten. Ist 'old' nicht in 'source' vorhanden,
+ so wird keine Meldung abgesetzt (Abweichung vom Standard). Beachte,
+ daß sich dabei die Länge von 'destination' verändern kann.
+ Beispiel:
+
+ TEXT VAR mein text :: "EUMEL-Benutzerhandbuch";
+ change (mein text, "Ben", "N"); (* EUMEL-Nutzerhandbuch *)
+
+PROC change (TEXT VAR destination, INT CONST from, to, TEXT CONST new)
+ Zweck: Der TEXT 'new' wird in den TEXT 'destination' anstatt des TEXTes,
+ der zwischen 'from' und 'to' steht, eingesetzt. Beachte, daß sich
+ dabei die Länge von 'destination' ändern kann. Beispiel:
+
+ TEXT VAR mein text :: "EUMEL-Benutzerhandbuch";
+ change (mein text, 7, 9, "N"); (* wie oben *)
+
+change all
+ PROC change all (TEXT VAR destination, TEXT CONST old, new)
+ Zweck: Der Teiltext 'old' wird durch 'new' in 'destination' ersetzt. Im
+ Unterschied zur 'change'-Prozedur findet die Ersetzung nicht nur
+ bei dem erstmaligen Auftreten von 'old' statt, sondern so oft, wie
+ 'old' in 'destination' vorhanden ist. Beispiel:
+
+
+ TEXT VAR x :: "Das ist ein Satz";
+ change all (x, " ", ""); (* DasisteinSatz *)
+
+clock
+ REAL PROC clock (INT CONST index)
+ Zweck: Datum und Uhrzeit werden vom EUMEL-System für alle Tasks geführt.
+ Neben einer Uhr ('Realzeituhr'), die das Datum und die aktuelle
+ Uhrzeit enthält, wird eine Uhr für die von der Task verbrauchte
+ CPU-Zeit geführt ('CPU-Zeituhr'). Beide Zeiten werden vom System
+ als REALs realisiert. Die Prozedur 'clock' liefert die aktuellen
+ Werte dieser Uhren. Bei 'index = 0' wird die akkumulierte CPU-Zeit
+ der Task, bei 'index = 1' der Wert der Realzeituhr geliefert.
+
+ Mit den REAL-Werten der Uhren kann ohne weiteres gerechnet werden,
+ jedoch sind nur Werte > 0 definiert. Die REAL-Werte der Realzeit-
+ uhr beginnen beim 1.1.1900 um 0 Uhr. Es sind nur Werte für dieses
+ Jahrhundert zugelassen. Werte der Realzeituhr in lesbarer Form
+ kann man durch die Konvertierungsprozeduren 'date' (für den
+ aktuellen Tag) und 'time of day' (Uhrzeit) erhalten.
+
+ Um die benötigte CPU-Zeit eines Programms zu berechnen, muß man
+ die CPU-Zeituhr zweimal abfragen. Um solche Zeiten in lesbarer
+ Form zu erhalten, kann man die Konvertierungsprozedur 'time'
+ verwenden. Beispiel:
+
+ REAL CONST anfang :: clock (0);
+ berechnungen;
+ REAL CONST ende :: clock (0);
+ put ("benoetigte CPU-Zeit:");
+ put (time (ende - anfang))
+
+code
+ TEXT PROC code (INT CONST code)
+ Zweck: Wandelt einen INT-Wert 'code' in ein Zeichen um. 'code' muß
+
+ 1 <= code <= 254
+
+ sein.
+
+ INT PROC code (TEXT CONST text)
+ Zweck: Wandelt ein Zeichen 'text' in einen INT-Wert um. Ist
+
+ LENGTH text <> 1
+
+ dann wird der Wert -1 geliefert (also bei mehr als ein Zeichen
+ oder niltext).
+
+collect heap garbage
+ PROC collect heap garbage
+ Zweck: Bereinigung des Heaps von nicht mehr benötigten TEXTen.
+
+command dialogue
+ PROC command dialogue (BOOL CONST status)
+ Zweck: Ein- bzw. Ausschalten des Kommando-Dialogs. Ist der Kommando-
+ dialog eingeschaltet, dann funktionieren z.B. die Prozeduren 'yes'
+ bzw. 'no' und ein Aufruf der Prozedur 'errorstop' liefert eine
+ Fehlermeldung auf dem Terminal. Ist der Kommandodialog ausge-
+ schaltet, wird z.B. durch die Prozedur 'yes' kein Text ausgegeben
+ (es wird TRUE geliefert) und errorstop erzeugt keine Fehler-
+ meldungen.
+
+ BOOL PROC command dialogue
+ Zweck: Liefert den Wert TRUE, wenn der Kommando-Dialog eingeschaltet
+ ist, andernfalls FALSE.
+
+compress
+ TEXT PROC compress (TEXT CONST text)
+ Zweck: Liefert den TEXT 'text' ohne führende und nachfolgende Leerzeichen.
+
+cos
+ REAL PROC cos (REAL CONST x)
+ Zweck: Kosinus-Funktion. 'x' muß in Radiant angegeben werden.
+
+cosd
+ REAL PROC cosd (REAL CONST x)
+ Zweck: Cosinus-Funktion. 'x' muß in Winkelgrad angegeben werden.
+
+cout
+ PROC cout (INT CONST number)
+ Zweck: Schreibt 'number' an die aktuelle Cursor-Position auf den Bild-
+ schirm. Anschließend wird an diese Position wieder zurück positio-
+ niert. 'number' muß > 0 sein. Paßt 'number' nicht mehr auf die
+ Zeile, so ist die Wirkung von 'cout' nicht definiert. 'cout' gibt
+ den Wert von 'number' nur aus, wenn genügend freie Kanal-Kapazität
+ für diese Ausgabe vorhanden ist. Das hat zur Folge, daß Programme
+ nicht auf die Beendigung einer Ausgabe von 'number' warten müssen
+ und ggf. Ausgaben überschlagen werden.
+
+cursor
+ PROC cursor (INT CONST column, row)
+ Zweck: Positioniert den Cursor auf dem Bildschirm, wobei 'column' die
+ Spalte und 'row' die Zeile angibt. Die zulässigen Bereiche von
+ 'column' und 'row' sind geräteabhängig. Zur Zeit gilt auf allen
+ EUMEL-Geräten
+
+ 1 <= column <= 80
+ 1 <= row <= 24
+
+date
+ TEXT PROC date (REAL CONST time)
+ Zweck: Konvertierungsprozedur für das Datum, welches sich aus dem Aufruf
+ der Prozedur 'clock (1)' ergibt. Das Datum wird in der Form
+ 'tt.mm.jj' geliefert. Beispiel:
+
+ put (date (clock (1))) (* z.B.: 24.12.82 *)
+
+
+ REAL PROC date (TEXT CONST datum)
+ Zweck: Konvertierungsprozedur für ein Datum in der Form 'tt.mm.jj'.
+ Liefert einen REAL-Wert, wie ihn die Prozedur 'clock (1)' liefern
+ würde. Beispiel:
+
+ put (date ("24.12.82")) (* 6.270670e10 *)
+
+ TEXT PROC date
+ Zweck: Liefert das Tagesdatum. Wirkt wie 'date (clock (1))', ist jedoch
+ erheblich schneller.
+
+day
+ REAL CONST day
+ Zweck: Liefert die Anzahl der Sekunden eines Tages (86 400.0).
+
+decimal exponent
+ INT PROC decimal exponent (REAL CONST mantisse)
+ Zweck: Liefert aus einem REAL-Wert den dezimalen Exponenten als INT-Wert.
+
+DECR
+ OP DECR (INT VAR left, INT CONST right)
+ Zweck: Wirkt wie left := left - right
+
+ OP DECR (REAL VAR left, REAL CONST right)
+ Zweck: Wirkt wie left := left - right
+
+delete char
+ PROC delete char (TEXT VAR string, INT CONST delete pos)
+ Zweck: Löscht ein Zeichen aus dem Text 'string' an der Position 'delete
+ pos'. Für
+
+ delete pos <= 0
+
+ oder
+
+ delete pos > LENGTH string
+
+ wird keine Aktion vorgenommen.
+
+DIV
+ INT OP DIV (INT CONST a, b)
+ Zweck: INT-Division.
+ Fehlerfall:
+ * DIV by 0
+ Division durch Null.
+
+e
+ REAL CONST e
+ Zweck: Eulersche Zahl (2.718282).
+
+errorstop
+ PROC errorstop (TEXT CONST error message)
+ Zweck: Abbruch unter Ausgabe einer Fehlermeldung (vergl. Fehlerbehand-
+ lung).
+
+exp
+ REAL PROC exp (REAL CONST z)
+ Zweck: Exponentialfunktion.
+
+floor
+ REAL PROC floor (REAL CONST real)
+ Zweck: Schneidet die Nachkommastellen des REAL-Wertes 'real' ab.
+
+frac
+ REAL PROC frac (REAL CONST z)
+ Zweck: Liefert die Stellen eines REAL-Wertes hinter dem Dezimalpunkt.
+
+get
+ PROC get (INT VAR number)
+ Zweck: Einlesen eines INT-Wertes vom Bildschirm. Der einzulesende INT-
+ Wert kann bei der Eingabe vom Terminal editiert werden. Die
+ Eingabe kann vom Benutzer-Terminal so umgeleitet werden, daß sie
+ von einer Datei aus erfolgt (vergl. 'sysin').
+
+ PROC get (REAL VAR value)
+ Zweck: Einlesen eines REAL-Wertes vom Bildschirm. Der einzulesende
+ REAL-Wert kann bei der Eingabe vom Terminal editiert werden. Die
+ Eingabe kann vom Benutzer-Terminal so umgeleitet werden, daß sie
+ von einer Datei aus erfolgt (vergl. 'sysin').
+
+ PROC get (TEXT VAR word)
+ Zweck: Liest einen Text in die Variable 'word' mit maximal 255 Zeichen.
+ Es werden solange Zeichen vom Terminal gelesen, bis ein Leer-
+ zeichen oder ein Positionierungszeichen eingegeben wird. Dabei
+ werden führende Leerzeichen übergeben. Der einzulesende Text kann
+ bei der Eingabe editiert werden. Eine leere Eingabe ist nicht
+ erlaubt. Die Eingabe kann vom Benutzer-Terminal so umgeleitet
+ werden, daß sie von einer Datei aus erfolgt (vergl. 'sysin').
+
+ PROC get (TEXT VAR word, INT CONST laenge)
+ Zweck: Liest einen Text vom Bildschirm mit der Länge 'laenge' oder bis
+ ein Positionierungszeichen angetroffen wird. Der einzulesende Wert
+ kann bei der Eingabe editiert werden. Dabei gilt:
+
+ 1 <= laenge <= 255
+
+ PROC get (TEXT VAR word, TEXT CONST separator)
+ Zweck: Liest einen Text vom Bildschirm, bis ein Zeichen 'separator' ange-
+ troffen oder ein Positionierungszeichen eingegeben wird. Der ein-
+ zulesende Text kann bei der Eingabe editiert werden.
+
+get cursor
+ PROC get cursor (INT VAR x, y)
+ Zweck: Erfragung der aktuellen Cursor-Position. Die Koordinaten des Cur-
+ sors werden in 'x' und 'y' geliefert. Die aktuelle Cursor-Position
+ ist nach Ausgabe von 'HOME' (Code = 1) oder einer Positionierung
+ des Cursors mit der Prozedur 'cursor' stets definiert. Die Proze-
+ dur 'get cursor' liefert jedoch undefinierte Werte, wenn über den
+ rechten Rand einer Zeile hinausgeschrieben wurde (die Wirkung
+ einer solchen Operation hängt von der Hardware eines Terminals ab).
+
+getline
+ PROC get line (TEXT VAR line)
+ Zweck: Das System wartet auf eine Zeile vom Bildschirm (max. 255 Zeichen).
+ Eine leere Eingabe ist nicht möglich. Die Eingabe kann vom Benut-
+ zer-Terminal so umgeleitet werden, daß sie von einer Datei aus
+ erfolgt (vergl. 'sysin').
+
+heap size
+ INT PROC heap size
+ Zweck: Informationsprozedur für die Größe (in KB) des TEXT-Heaps.
+
+hour
+ REAL CONST hour
+ Zweck: Liefert die Anzahl der Sekunden einer Stunde (3600.0).
+
+inchar
+ PROC inchar (TEXT VAR character)
+ Zweck: Wartet solange, bis ein Zeichen von der Tastatur eingegeben wird,
+ und schreibt dieses Zeichen in die Variable 'character'.
+
+incharety
+ TEXT PROC incharety
+ Zweck: Versucht, ein Zeichen von der Tastatur zu lesen. Wurde kein
+ Zeichen eingegeben, wird niltext geliefert.
+
+ TEXT PROC incharety (INT CONST time limit)
+ Zweck: Versucht, ein Zeichen vom Bildschirm zu lesen. Dabei wird maximal
+ eine 'time limit' lange Zeit auf das Zeichen gewartet (gemessen in
+ Zehntel-Sekunden).
+
+INCR
+ OP INCR (INT VAR left, INT CONST right)
+ Zweck: Wirkt wie left := left + right
+
+ OP INCR (REAL VAR left, REAL CONST right)
+ Zweck: Wirkt wie left := left + right
+
+initialize random
+ PROC initialize random (INT CONST value)
+ Zweck: Initialisieren der 'random'-Prozedur, um nicht reproduzierbare
+ Zufallszahlen zu bekommen. Diese 'init random'-Prozedur gilt für
+ den "INT-Random Generator".
+
+ PROC initialize random (REAL CONST z)
+ Zweck: Initialisieren der 'random'-Prozedur mit verschiedenen Werten für
+ 'z', um nicht reproduzierbare Zufallszahlen zu bekommen. Diese
+ Prozedur gilt für den "REAL-Random Generator".
+
+insert char
+ PROC insert char (TEXT VAR string, TEXT CONST char, INT CONST insert pos)
+ Zweck: Fügt ein Zeichen 'char' in den Text 'string' an der Position
+ 'insert pos' ein. Für
+
+ insert pos > LENGTH string + 1
+
+ wird keine Aktion vorgenommen. Daher ist es möglich, mit dieser
+ Prozedur auch am Ende eines Textes (Position: LENGTH string + 1)
+ ein Zeichen anzufügen.
+
+int
+ INT PROC int (REAL CONST a)
+ Zweck: Konvertierungsprozedur.
+
+ INT PROC int (TEXT CONST number)
+ Zweck: Umwandlung eines Textes in einen INT-Wert. Der Text 'number' darf
+ ein "+"- oder "-"-Zeichen vor den Ziffern enthalten. Führende
+ Blanks werden überlesen. Enthält 'number' an einer Position ein
+ Zeichen, das nicht umgewandelt werden kann, so wird die Umwand-
+ lung gestoppt und der bis dahin umgewandelte Wert (bzw. der Wert 0)
+ geliefert.
+
+last conversion ok
+ BOOL PROC last conversion ok
+ Zweck: Liefert den Wert TRUE, sofern die letzte Konvertierungsprozedur
+ nicht auf einen Fehler bei der Umwandlung gestoßen ist, andernfalls
+ FALSE.
+
+length
+ INT PROC length (TEXT CONST text)
+ Zweck: Anzahl von Zeichen ("Länge") von 'text' einschließlich Leerzeichen.
+
+LENGTH
+ INT OP LENGTH (TEXT CONST text)
+ Zweck: Anzahl von Zeichen ("Länge") von 'text' einschließlich Leerzeichen.
+
+line
+ PROC line
+ Zweck: Es wird zum Anfang einer neuen Zeile positioniert.
+
+ PROC line (INT CONST number)
+ Zweck: Es werden 'number' Zeilenwechsel vorgenommen.
+
+ln
+ REAL PROC ln (REAL CONST x)
+ Zweck: Natürlicher Logarithmus.
+ Fehlerfall:
+ * ln mit nicht positiver Zahl
+ Nur echt positive Argumente sind zulässig.
+
+log2
+ REAL PROC log2 (REAL CONST z)
+ Zweck: Logarithmus zur Basis 2.
+ Fehlerfall:
+ * log2 mit negativer zahl
+ Nur echt positive Argumente sind zulässig.
+
+log10
+ REAL PROC log10 (REAL CONST x)
+ Zweck: Logarithmus zur Basis 10.
+ Fehlerfall:
+ * log10 mit negativer zahl
+ Nur echt positive Argumente sind zulässig.
+
+max
+ INT PROC max (INT CONST first, second)
+ Zweck: Liefert den Größten der beiden INT-Werte.
+
+ REAL PROC max (REAL CONST first, second)
+ Zweck: Liefert den Größten der beiden REAL-Werte.
+
+maxint
+ INT CONST maxint
+ Zweck: Größter INT-Wert im EUMEL-System (32 767).
+
+maxreal
+ REAL CONST maxreal
+ Zweck: Größter REAL-Wert im EUMEL-System (9.999999999999e126).
+
+max text length
+ INT CONST max text length
+ Zweck: Maximale Anzahl von Zeichen in einem TEXT (32 000).
+
+min
+ INT PROC min (INT CONST first, second)
+ Zweck: Liefert den Kleinsten der beiden INT-Werte. Beispiele:
+
+ min (3.0, 2.0) ==> 2.0
+ min (-2.0, 3.0) ==> -2.0
+
+ REAL PROC min (REAL CONST first, second)
+ Zweck: Liefert den Kleinsten der beiden REAL-Werte.
+
+MOD
+ INT OP MOD (INT CONST left, right)
+ Zweck: Liefert den Rest einer INT-Division. Beispiele:
+
+ 3 MOD 2 ==> 1
+ -3 MOD 2 ==> 1
+
+ Fehlerfall:
+ * DIV by 0
+ Division durch 0 ist verboten.
+
+ REAL OP MOD (REAL CONST left, right)
+ Zweck: Modulo-Funktion für REALs (liefert den Rest). Beispiele:
+
+ 5.0 MOD 2.0 ==> 1.0
+ 4.5 MOD 4.0 ==> 0.5
+
+no
+ BOOL PROC no (TEXT CONST question)
+ Zweck: Wirkt wie
+
+ NOT yes
+
+NOT
+ BOOL OP NOT (BOOL CONST a)
+ Zweck: Logische Negation.
+
+online
+ BOOL PROC online
+ Zweck: Liefert TRUE, wenn die Task mit einem Terminal gekoppelt ist.
+
+OR
+ BOOL OP OR (BOOL CONST a, b)
+ Zweck: Logisches oder.
+
+out
+ PROC out (TEXT CONST text)
+ Zweck: Ausgabe eines Textes auf dem Bildschirm. Im Unterschied zu 'put'
+ wird kein Blank an den ausgegebenen Text angefügt. 'out' kann
+ nicht umgeleitet werden (vergl. 'sysout').
+
+out subtext
+ PROC out subtext (TEXT CONST source, INT CONST from)
+ Zweck: Ausgabe eines Teiltextes von 'source' von der Position 'from' bis
+ Textende. Es wird keine Aktion vorgenommen für
+
+ from > LENGTH source
+
+ PROC out subtext (TEXT CONST source, INT CONST from, to)
+ Zweck: Ausgabe eines Teiltextes von 'source' von der Position 'from' bis
+ zur Position 'to'. Für
+
+ to > LENGTH source
+
+ wird für die fehlenden Zeichen Leerzeichen (blanks) ausgegeben.
+
+page
+ PROC page
+ Zweck: Es wird zum Anfang einer neuen Seite positioniert (hier: linke
+ obere Ecke des Bildschirms, wobei der Bildschirm gelöscht wird).
+
+pause
+ PROC pause (INT CONST time limit)
+ Zweck: Wartet 'time limit' in Zehntel-Sekunden. Bei negativen Werten ist
+ die Wirkung nicht definiert. Die Wartezeit wird nicht nur durch
+ das Erreichen der Grenze abgebrochen, sondern auch durch die
+ Eingabe eines beliebigen Zeichens.
+
+pi
+ REAL CONST pi
+ Zweck: Die Zahl pi (3.141593).
+
+pos
+ INT PROC pos (TEXT CONST source, pattern)
+ Zweck: Liefert die erste Position des ersten Zeichens von 'pattern' in
+ 'source', falls 'pattern' gefunden wird. Wird 'pattern' nicht
+ gefunden oder ist 'pattern' niltext, so wird der Wert '0' ge-
+ liefert. Beispiel:
+
+ TEXT VAR t1 :: "abcdefghijk...xyz",
+ t2 :: "cd";
+ ... pos (t1, t2) ... (* liefert 3 *)
+ ... pos (t2, t1) ... (* liefert 0 *)
+
+ INT PROC pos (TEXT CONST source, pattern, INT CONST from)
+ Zweck: Wie obige Prozedur, jedoch wird erst ab der Position 'from' ab
+ gesucht. Dabei gilt folgende Einschränkung:
+
+ length (pattern) < 255
+
+INT PROC pos (TEXT CONST source, low char, high char, INT CONST from)
+ Zweck: Liefert die Position des ersten Zeichens 'x' in 'source' ab der
+ Position 'from', so daß
+
+ low char <= x <= high char
+
+ 'low char' und 'high char' müssen TEXTe der Länge 1 sein. Wird
+ kein Zeichen in 'source' in dem Bereich zwischen 'low char' und
+ 'high char' gefunden, wird der Wert '0' geliefert. Beispiel:
+
+ (* Suche nach dem ersten Zeichen <> blank nach einer Leerspalte *)
+ TEXT VAR zeile :: "BlaBla Hier gehts weiter";
+ INT VAR pos erstes blank :: pos (zeile, " "),
+ ende leerspalte :: pos (zeile, ""33"", ""254"", pos erstes blank);
+
+put
+ PROC put (INT CONST number)
+ Zweck: Ausgabe eines INT-Wertes auf dem Bildschirm. Anschließend wird
+ ein Leerzeichen ausgegeben. Die Ausgabe kann umgeleitet werden
+ (vergl. 'sysout').
+
+ PROC put (REAL CONST real)
+ Zweck: Ausgabe eines REAL-Wertes auf dem Bildschirm. Anschließend wird
+ ein Leerzeichen ausgegeben. Die Ausgabe kann umgeleitet werden
+ (vergl. 'sysout')
+
+ PROC put (TEXT CONST text)
+ Zweck: Ausgabe eines Textes auf dem Bildschirm. Nach der Ausgabe von
+ 'text' wird ein Blank ausgegeben, um nachfolgenden Ausgaben auf
+ der gleichen Zeile voneinander zu trennen. Hardwareabhängig sind
+ die Aktionen, wenn eine Ausgabe über eine Zeilengrenze (hier:
+ Bildschirmzeile) vorgenommen wird. Meist wird die Ausgabe auf der
+ nächsten Zeile fortgesetzt. Die Ausgabe kann umgeleitet werden
+ (vergl. 'sysout').
+
+putline
+ PROC putline (TEXT CONST text)
+ Zweck: Ausgabe von 'text' auf dem Bildschirm. Nach der Ausgabe wird auf
+ den Anfang der nächsten Zeile positioniert. Gibt man TEXTe nur mit
+ 'putline' aus, so ist gesichert, daß jede Ausgabe auf einer neuen
+ Zeile beginnt. Hardwareabhängig sind die Aktionen, wenn eine Aus-
+ gabe über eine Zeilengrenze (hier: Bildschirmzeile) vorgenommen
+ wird. Meist wird die Ausgabe auf der nächsten Zeile fortgesetzt.
+ Die Ausgabe kann umgeleitet werden (vergl. 'sysout').
+
+random
+ INT PROC random (INT CONST lower bound, upper bound)
+ Zweck: Pseudo-Zufallszahlen-Generator im Intervall 'upper bound' und
+ 'lower bound' einschließlich. Es handelt sich hier um den "INT
+ Random Generator".
+
+ REAL PROC random
+ Zweck: Pseudo-Zufallszahlen-Generator im Intervall 0 und 1. Es handelt
+ sich hier um den "REAL Random Generator".
+
+real
+ REAL PROC real (INT CONST a)
+ Zweck: Konvertierungsprozedur.
+
+ REAL PROC real (TEXT CONST text)
+ Zweck: Konvertierung eines TEXTes 'text' in einen REAL-Wert. Achtung: Zur
+ Zeit werden keine Überprüfungen vorgenommen, d.h. in dem TEXT
+ muß ein REAL-Wert stehen.
+
+replace
+ PROC replace (TEXT VAR destination, INT CONST position, TEXT CONST source)
+ Zweck: Ersetzung eines Teiltextes in 'destination' durch 'source' an der
+ Position 'position' in 'destination'. Es muß gelten
+
+ 1 <= position <= LENGTH destination
+
+ d.h. 'position' muß innerhalb von 'destination' liegen und 'source'
+ muß von der Position 'position' ab in 'destination' einsetzbar
+ sein. Dabei bleibt die Länge von 'destination' unverändert.
+
+round
+ REAL PROC round (REAL CONST real, INT CONST digits)
+ Zweck: Runden eines REAL-Wertes auf 'digits' Stellen. Für positive Werte
+ wird auf Nachkommastellen gerundet. Beispiel:
+
+ round (3.14159, 3)
+
+ liefert '3.142'. Für negative 'digits'-Werte wird auf Vorkomma-
+ stellen gerundet. Beispiel:
+
+ round (123.456, -2)
+
+ liefert '100.0'. Abweichung vom Standard: Es wird mit 'digits'-
+ Ziffern gerundet.
+
+say
+ PROC say (TEXT CONST message)
+ Zweck: Sofern der Kommando-Dialog eingeschaltet ist (vergl. 'command
+ dialogue'), wird der TEXT 'message' an die augenblickliche Cursor-
+ Position geschrieben.
+
+sign
+ INT PROC sign (INT CONST argument)
+ Zweck: Feststellen des Vorzeichens eines INT-Wertes. Folgende Werte
+ werden geliefert:
+
+ argument > 0 ==> 1
+ argument = 0 ==> 0
+ argument < 0 ==> -1
+
+ INT OP SIGN (INT CONST argument)
+ Zweck: Feststellen des Vorzeichens eines INT-Wertes.
+
+ INT PROC sign (REAL CONST number)
+ Zweck: Feststellen des Vorzeichens eines REAL-Wertes.
+
+ INT OP SIGN (REAL CONST number)
+ Zweck: Feststellen des Vorzeichens eines REAL-Wertes.
+
+sin
+ REAL PROC sin (REAL CONST x)
+ Zweck: Sinus-Funktion. 'x' muß in Radiant (Bogenmaß) angegeben werden.
+
+sind
+ REAL PROC sind (REAL CONST x)
+ Zweck: Sinus-Funktion. 'x' muß im Winkelgrad angegeben werden.
+
+smallreal
+ REAL PROC smallreal
+ Zweck: Kleinster darstellbarer REAL-Wert im EUMEL-System für den
+
+ 1.0 - smallreal <> 1.0
+ 1.0 + smallreal <> 1.0
+
+ gilt (1.0E-12).
+
+sqrt
+ REAL PROC sqrt (REAL CONST z)
+ Zweck: Wurzel-Funktion.
+ Fehlerfall:
+ * sqrt von negativer Zahl
+ Das Argument muß größer gleich 0.0 sein.
+
+stop
+ PROC stop
+ Zweck: Abbruch (vergl. Fehlerbehandlung).
+
+SUB
+ TEXT OP SUB (TEXT CONST text, INT CONST pos)
+ Zweck: Liefert ein Zeichen aus 'text' an der Position 'pos'. Entspricht
+
+ subtext (text, pos, pos)
+
+ Anmerkung: Effizienter als obiger Prozedur-Aufruf. Für
+
+ pos <= 0
+ pos > LENGTH text
+
+ wird niltext geliefert.
+
+subtext
+ TEXT PROC subtext (TEXT CONST source, INT CONST from)
+ Zweck: Teiltext von 'source', der bei der Position 'from' anfängt. Die
+ Länge des Resultats ergibt sich also zu
+
+ LENGTH source - from + 1
+
+ d.h. von der Position 'from' bis zum Ende von 'source'. 'from' muß
+ innerhalb von 'source' liegen. Ist from < 1, dann wird 'source'
+ geliefert. Falls from > LENGTH source ist, wird niltext geliefert.
+
+ TEXT PROC subtext (TEXT CONST source, ITT CONST from, to)
+ Zweck: Teiltext von 'source' von der Position 'from' bis einschließlich
+ der Position 'to'. Die Länge des Resultats ist also
+
+ from - to + 1
+
+ Dabei muß gelten
+
+ 1 <= from <= to <= LENGTH source
+
+ d.h. die Positionen 'from' und 'to' müssen in dieser Reihenfolge
+ innerhalb von 'source' liegen. Ist
+
+ to >= LENGTH source
+
+ wird 'subtext (source, from)' ausgeführt. Für die Bedingungen für
+ 'from' siehe vorstehende Beschreibung von 'subtext'.
+
+sysin
+ PROC sysin (TEXT CONST file name)
+ Zweck: Eingabe-Routinen ('get', 'getline' und 'line') lesen nicht mehr
+ vom Benutzer-Terminal, sondern aus der Datei 'file name'.
+
+ TEXT PROC sysin
+ Zweck: Liefert den Namen der eingestellten 'sysin'-Datei. "" bezeichnet
+ das Benutzer-Terminal.
+
+sysout
+ PROC sysout (TEXT CONST file name)
+ Zweck: Ausgabe-Routinen ('put', 'putline', 'write', 'line') gehen nicht
+ mehr zum Benutzer-Terminal, sondern in die Datei 'file name'.
+
+ TEXT PROC sysout
+ Zweck: Liefert den Namen der eingestellten 'sysout'-Datei. "" bezeichnet
+ das Benutzer-Terminal.
+
+tan
+ REAL PROC tan (REAL CONST x)
+ Zweck: Tangens-Funktion. 'x' muß in Radiant angegeben werden.
+
+tand
+ REAL PROC tand (REAL CONST x)
+ Zweck: Tangens-Funktion. 'x' muß in Winkelgrad angegeben werden.
+
+text
+ TEXT PROC text (INT CONST number)
+ Zweck: Umwandlung eines INT-Wertes in einen Text. Negative Werte werden
+ mit einem "-"-Zeichen geliefert.
+
+ TEXT PROC text (INT CONST number, laenge)
+ Zweck: Umwandlung eines INT-Wertes 'number' in einen Text mit der Länge
+ 'laenge'. Für
+
+ LENGTH (text (number)) < laenge
+
+ werden die Ziffern rechtsbündig in einen Text mit der Länge
+ 'laenge' eingetragen. Fehlende Ziffern der gewünschten 'laenge'
+ werden im TEXT vorne mit Leerzeichen aufgefüllt. Für
+
+ LENGTH (text (number)) > laenge
+
+ wird ein Text mit der Länge 'laenge' geliefert, der mit
+ "*"-Zeichen gefüllt ist.
+
+ TEXT PROC text (REAL CONST real)
+ Zweck: Konvertierung eines REAL-Wertes in einen TEXT. Ggf. wird der TEXT
+ in Exponenten-Darstellung geliefert.
+
+ TEXT PROC text (REAL CONST real, laenge)
+ Zweck: Siehe oben. 'laenge' gibt die Anzahl von Zeichen an.
+
+ TEXT PROC text (REAL CONST real, INT CONST laenge, fracs)
+ Zweck: Konvertierung eines REAL-Wertes in einen TEXT. Dabei gibt 'laenge'
+ die Länge des Resultats einschließlich des Dezimalpunktes und
+ 'fracs' die Anzahl der Dezimalstellen an. Kann der REAL-Wert nicht
+ wie gewünscht dargestellt werden, wird
+
+ laenge * "*"
+
+ geliefert.
+
+ TEXT PROC text (TEXT CONST source, INT CONST laenge)
+ Zweck: Teiltext aus 'source' mit der Länge 'laenge', beginnend bei der
+ Position 1 von 'source'. Es muß gelten
+
+ 1 <= laenge <= LENGTH source
+
+ d.h. der gewünschte Teiltext muß aus 'source' ausblendbar sein.
+ Wenn
+
+ laenge > LENGTH source
+
+ die Länge des gewünschten Resultats ist größer als die Länge von
+ 'source' ist, wird der zu liefernde TEXT mit der an 'laenge'
+ fehlenden Zeichen mit Leerzeichen aufgefüllt.
+
+ TEXT PROC text (TEXT CONST source, INT CONST laenge, from)
+ Zweck: Teiltext aus 'source' mit der Länge 'laenge', beginnend an der
+ Position 'from' in dem TEXT 'source'. Entspricht
+
+ text (subtext (source, from, LENGTH source), laenge)
+
+ Es muß
+
+ laenge >= 0
+ 1 <= from <= LENGTH source
+
+ gelten, d.h. 'from' muß eine Position angeben, die innerhalb von
+ 'source' liegt. Für
+
+ laenge > LENGTH source - from + 1
+
+ also wenn die angegebene Länge 'laenge' größer ist als der auszu-
+ blendende Text, wird das Resultat rechts mit Leerzeichen aufge-
+ füllt. Wenn
+
+ laenge < LENGTH source - from + 1
+
+ d.h. wenn die angegebene Länge kleiner ist als der Teiltext von
+ 'from' bis zum letzten Zeichen von 'source', wird das Resultat mit
+ der Länge
+
+ LENGTH source - from + 1
+
+ geliefert.
+
+time
+ TEXT PROC time (REAL CONST time)
+ Zweck: Konvertierungsprozedur für die Zeiten der CPU-Zeituhr. Liefert die
+ Zeiten in der Form 'hh:mm:ss.s'. Vergl. dazu 'clock'.
+
+ TEXT PROC time (REAL CONST value, INT CONST laenge)
+ Zweck: Konvertiert die Zeit in externe Darstellung. Für die 'laenge'-
+ Werte ergibt sich:
+
+ laenge = 10 (* hh:mm:ss.s *)
+ laenge = 12 (* hhh:mm:ss.s *)
+
+REAL PROC time (TEXT CONST time)
+ Zweck: Konvertierungsprozedur für Texte der CPU-Zeituhr in REAL-Werte.
+
+time of day
+ TEXT PROC time of day (REAL CONST time)
+ Zweck: Konvertierungsprozedur für REALs, wie sie die Realzeituhr
+ liefert. Es wird die Tageszeit in der Form 'hh:mm' geliefert.
+ Beispiel:
+
+ put (time of day (clock (1))) (* z.B.: 17:25 *)
+
+
+ TEXT PROC time of day
+ Zweck: Liefert die aktuelle Tageszeit. Entspricht
+
+ time of day (clock (1))
+
+TIMESOUT
+ OP TIMESOUT (INT CONST times, TEXT CONST text)
+ Zweck: Ausgabe eines TEXTes 'text' 'times'mal. An die Ausgabe wird im
+ Gegensatz zu 'put' kein Leerzeichen angefügt. Es wird kein Text
+ ausgegeben für
+
+ times < 1
+
+write
+ PROC write (TEXT CONST text)
+ Zweck: Gibt 'text' ohne Trennblank aus ('put' mit Trennblank). Läßt sich
+ im Gegensatz zu 'out' in eine Datei umleiten (vergl. 'sysout').
+
+XOR
+ BOOL OP XOR (BOOL CONST a, b)
+ Zweck: Exklusives oder.
+
+yes
+ BOOL PROC yes (TEXT CONST question)
+ Zweck: Sofern der Kommando-Dialog (vergl. 'command dialogue') einge-
+ schaltet ist, wird der TEXT 'question' auf dem Bildschirm des
+ Benutzers geschrieben. Der TEXT 'question' wird dabei mit einem
+ Fragezeichen ergänzt. Der Benutzer kann nun am Terminal mit den
+ Zeichen 'j' oder 'n' antworten (oder: 'J', 'N', 'y', 'n', 'Y',
+ 'N'). Nach Eingabe eines dieser Zeichen wird von der Prozedur
+ 'yes' auf eine neue Zeile positioniert. Die Prozedur 'yes' liefert
+ den Wert TRUE bei der Eingabe von 'j' und den Wert FALSE bei der
+ Eingabe von 'n'. Ist der Kommando-Dialog nicht eingeschaltet,
+ liefert die Prozedur 'yes' den Wert TRUE.
+
diff --git a/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil9 b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil9
new file mode 100644
index 0000000..318dd06
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/pd.Handbuch.Teil9
@@ -0,0 +1,936 @@
+ EUMEL-Benutzerhandbuch
+
+ TEIL 9: Standard-Datentypen
+
+1. VECTOR und MATRIX
+
+Vektoren und Matrizen enthalten Elemente vom Datentyp REAL. Für beide Daten-
+typen sind die üblichen Operatoren definiert. Im Unterschied zu "normalen"
+'ROW n REAL' bzw. 'ROW n ROW m REAL' brauchen die Anzahl der Elemente, die
+sich in einem Vektor bzw. in einer Matrix befinden, nicht bereits zur Ãœber-
+setzungszeit deklariert, sondern können "dynamisch" zur Laufzeit eines ELAN-
+Programms festgelegt werden. Somit ist es möglich, eine zur Übersetzungszeit
+noch unbekannte Anzahl von REAL-Elementen zu bearbeiten und dabei nur soviel
+Speicherplatz wie notwendig zu verwenden. Bei beiden Datentypen ist die
+maximale Anzahl von Elementen jeweils 4 000.
+
+Bei VECTOR und MATRIX ist auf die üblichen Rundungsfehler bei der Verwendung
+von REALs zu achten, die bei umfangreicheren Rechnungen unvermeidlich ent-
+stehen. Rundungsfehler durch Ein- bzw. Ausgaberoutinen können z.Zt. im
+EUMEL-System jedoch nicht vorkommen, weil REAL-Werte dezimal im Rechner
+abgespeichert werden (13 Stellen, von denen jedoch nur 7 ausgegeben werden).
+
+
+
+VECTOR
+
+Folgende VECTOR-Operationen stehen zur Verfügung:
+
+vector Erzeugung eines VECTOR-Objekts
+get Eingabe der Elemente vom Terminal
+put Ausgabe der Elemente auf das Terminal
+replace Ersetzung eines Elementes eines VECTORs
+SUB Zugriff auf ein REAL-Element eines VECTORs
+LENGTH Anzahl der Elemente eines VECTORs
+length dito
+NORM Euklidische Norm
+ +
+ -
+ *
+ /
+ :=
+ =
+ <>
+
+
+
+Beschreibung der VECTOR-Operationen
+
+Aus Optimierungsgründen (Heapbelastung) wurde der Datentyp INITVECTOR ge-
+schaffen. Dieser wird im VECTOR-Paket intern gehalten (wird nicht über das
+Interface herausgereicht) und kann somit nicht in einer Deklaration benutzt
+werden. INITVECTOR wird nur für die Operationen
+
+ :=
+ vector
+
+verwendet. Bei Verwendung eines Datenobjekts vom Datentyp INITVECTOR wird
+nicht soviel Speicherplatz wie bei einem Objekt vom Datentyp VECTOR benötigt.
+
+=
+ BOOL OP = (VECTOR CONST a, b)
+ Zweck: Vergleich zweier Vektoren. Der Operator liefert FALSE, wenn die
+ Anzahl der Elemente von 'a' und 'b' ungleich ist oder wenn zwei
+ Elemente mit gleichem Index ungleich sind. Beispiel:
+
+ VECTOR VAR x :: vector (10, 1.0),
+ y :: vector (15, 2.0),
+ z :: vector (10, 1.0);
+ ... x = y ... (* FALSE *)
+ ... x = z ... (* TRUE *)
+
+<>
+ BOOL OP <> (VECTOR CONST a, b)
+ Zweck: Vergleich zweier Vektoren auf Ungleichheit (NOT (a = b)).
+
+:=
+ OP := (VECTOR VAR ziel, VECTOR CONST quelle)
+ Zweck: Zuweisung. Nach der Zuweisung gilt auch
+
+ length (quelle) = length (ziel)
+
+ d.h. der linke Operand besitzt nach der Zuweisung genauso viele
+ Elemente wie 'quelle', unabhängig davon, ob 'ziel' vor der Zu-
+ weisung mehr oder weniger Elemente als 'quelle' besaß. Beispiel:
+
+ VECTOR VAR y :: vector (10, 1.0),
+ z :: vector (15, 2.0);
+ ...
+ y := z; (* length (y) liefert nun 15 ! *)
+
+ OP := (VECTOR VAR ziel, INITVECTOR CONST quelle)
+ Zweck: Dient zur Initialisierung eines VECTORs. Beispiel:
+
+ VECTOR VAR x :: vector (17);
+
+ 'vector' erzeugt ein Objekt vom Datentyp INITVECTOR. Dieses
+ Objekt braucht nicht soviel Speicherplatz wie ein VECTOR-Objekt.
+ Dadurch wird vermieden, daß nach erfolgter Zuweisung nicht ein
+ durch 'vector' erzeugtes Objekt auf dem Heap unnötig Speicher-
+ platz verbraucht.
+
++
+ VECTOR OP + (VECTOR CONST a)
+ Zweck: Monadisches '+' für VECTOR. Keine Auswirkung.
+
+ VECTOR OP + (VECTOR CONST a, b)
+ Zweck: Elementweise Addition der Vektoren 'a' und 'b'. Beispiel:
+
+ VECTOR VAR x, (* 'x' hat undefinierte Laenge *)
+ a :: vector (10, 1.0),
+ b :: vector (10, 2.0);
+ ...
+ x := a + b; (* 'x' hat nun 10 Elemente mit Werten '3.0' *)
+ Fehlerfall:
+ * VECTOR OP + : LENGTH a <> LENGTH b
+ 'a' und 'b' haben nicht die gleiche Anzahl von Elementen.
+
+-
+ VECTOR OP - (VECTOR CONST a)
+ Zweck: Monadisches '-'.
+
+ VECTOR OP - (VECTOR CONST a, b)
+ Zweck: Elementweise Subtraktion der Vektoren 'a' und 'b'.
+ Fehlerfall:
+ * VECTOR OP - : LENGTH a <> LENGTH b
+ 'a' und 'b' haben nicht die gleiche Anzahl von Elementen.
+
+*
+ REAL OP * (VECTOR CONST a, b)
+ Zweck: Skalarprodukt zweier Vektoren. Liefert die Summe der element-
+ weisen Multiplikation der Vektoren 'a' und 'b'. Beachte even-
+ tuelle Rundungsfehler! Beispiel:
+
+ REAL VAR a;
+ VECTOR VAR b :: vector (10, 2.0),
+ c :: vector (10, 2.0);
+ ...
+ a := b * c; (* 40.0 *)
+ Fehlerfall:
+ * REAL OP * : LENGTH a <> LENGTH b
+ 'a' und 'b' haben nicht die gleiche Anzahl von Elementen.
+
+ VECTOR OP * (VECTOR CONST a, REAL CONST s)
+ Zweck: Multiplikation des Vektors 'a' mit dem Skalar 's'.
+
+ VECTOR OP * (REAL CONST s, VECTOR CONST a)
+ Zweck: Multiplikation des Skalars 's' mit dem Vektor 'a'.
+
+/
+ VECTOR OP / (VECTOR CONST a, REAL CONST s)
+ Zweck: Division des Vektors 'a' durch den Skalar 's'. Beispiel:
+
+ VECTOR VAR a, (* 'a' hat undefinierte Laenge *)
+ b :: vector (10, 4.0);
+ ...
+ a := b / 2.0;
+ (* 'a' hat nun 10 Elemente mit Werten '2.0' *)
+
+get
+ PROC get (VECTOR VAR a, INT CONST l)
+ Zweck: Einlesen der Elemente von 'a' vom Terminal, wobei 'l' die Anzahl
+ der Elemente angibt.
+ Fehlerfall:
+ * PROC get : size <= 0
+ Die angeforderte Elementanzahl 'l' muß > 0 sein.
+
+length
+ INT PROC length (VECTOR CONST a)
+ Zweck: Liefert die Anzahl der Elemente von 'a'. Beispiel:
+
+ VECTOR VAR a :: vector (10, 1.0),
+ b :: vector (15, 2.0);
+ ...
+ ... length (a) ... (* 10 *)
+ ... length (b) ... (* 15 *)
+
+LENGTH
+ INT OP LENGTH (VECTOR CONST a)
+ Zweck: Liefert die Anzahl der Elemente von 'a'.
+
+NORM
+ REAL OP NORM (VECTOR CONST v)
+ Zweck: Euklidische Norm (Wurzel aus der Summe der Quadrate der Elemente).
+
+put
+ PROC put (VECTOR CONST v)
+ Zweck: Ausgabe der Werte der Elemente von 'v' auf dem Terminal.
+
+replace
+ PROC replace (VECTOR VAR v, INT CONST i, REAL CONST r)
+ Zweck: Zuweisung des i-ten Elementes von 'v' mit dem Wert von 'r'.
+ Beispiel:
+
+ VECTOR VAR v :: ...;
+ ...
+ replace (v, 13, 3.14);
+ (* Das 13. Element von 'v' bekommt den Wert '3.14' *)
+ Fehlerfälle:
+ * PROC replace : subscript overflow
+ Der Index 'i' mit dem Wert 'm' liegt außerhalb des Vektors (i >
+ LENGTH v).
+ * PROC replace : subscript underflow
+ Der Index 'i' mit dem Wert 'm' liegt außerhalb des Vektors
+ (i < 1).
+
+SUB
+ REAL OP SUB (VECTOR CONST v, INT CONST i)
+ Zweck: Liefert das 'i'-te Element von 'v'.
+ Fehlerfälle:
+ * OP SUB : subscript overflow
+ Der Index 'i' mit dem Wert 'm' liegt außerhalb des Vektors (i >
+ LENGTH v).
+ * OP SUB : subscript underflow
+ Der Index 'i' mit dem Wert 'm' liegt außerhalb des Vektors
+ (i < 1).
+
+vector
+ INITVECTOR PROC vector (INT CONST l)
+ Zweck: Erzeugen eines Vektors mit 'l' Elementen. Ein INITVECTOR-Objekt
+ benötigt nicht soviel Speicherplatz wie ein VECTOR-Objekt. Die
+ Elemente werden mit dem Wert '0.0' initialisiert.
+ Fehlerfall:
+ * PROC vector : size <= 0
+ Die angeforderte Elementanzahl 'l' muß > 0 sein.
+
+ INITVECTOR PROC vector (INT CONST l, REAL CONST value):
+ Zweck: Erzeugen eines Vektors mit 'l' Elementen. Ein INITVECTOR-Objekt
+ benötigt nicht soviel Speicherplatz wie ein VECTOR-Objekt. Die
+ Elemente werden mit dem Wert 'value' initialisiert. Beispiel:
+
+ VECTOR VAR v := vector (17, 3.14159);
+ (* 'v' hat 17 Elemente mit den Wert '3.14159' *)
+ Fehlerfall:
+ * PROC vector : size <= 0
+ Die angeforderte Elementanzahl 'l' muß > 0 sein.
+
+
+
+MATRIX
+
+Folgende Operationen stehen für MATRIX zur Verfügung:
+
+matrix Erzeugung eines MATRIX-Objekts
+idn Erzeugung einer Einheitsmatrix
+put Ausgabe der MATRIX auf dem Terminal
+get Eingabe der Matrix vom Terminal
+replace row Ersetzung einer Zeile
+replace column Ersetzung einer Spalte
+replace element Ersetzung eines Elements
+row Liefert einen VECTOR (Zeile einer MATRIX)
+column Liefert einen VECTOR (Spalte einer MATRIX)
+sub Liefert ein REAL-Elemement
+COLUMNS Anzahl Spalten
+ROWS Anzahl Zeilen
+INV Inverse
+DET Determinante
+TRANSP Transponierte
+transp Transponierte (speicherfreundlich)
+ +
+ -
+ *
+ :=
+ =
+ <>
+
+
+
+Beschreibung der MATRIX-Operationen
+
+Aus Optimierungsgründen (Heapbelastung) wurde der Datentyp INITMATRIX
+geschaffen. Dieser wird im MATRIX-Paket intern gehalten (wird nicht über das
+Interface herausgereicht) und kann somit nicht in einer Deklaration benutzt
+werden. INITMATRIX wird nur für die Operationen
+
+ :=
+ idn
+ matrix
+
+verwendet. Bei Verwendung eines Objekts vom Datentyp INITMATRIX wird nicht
+der Speicherplatz für eine MATRIX benötigt.
+
++
+ MATRIX OP + (MATRIX CONST m)
+ Zweck: Monadisches '+'. Keine Auswirkungen.
+
+ MATRIX OP + (MATRIX CONST l, r)
+ Zweck: Addition zweier Matrizen. Die Anzahl der Reihen und der Spalten
+ muß gleich sein. Beispiel:
+
+ MATRIX VAR a :: matrix (3, 43, 1.0),
+ b :: matrix (3, 43, 2.0),
+ summe;
+ summe := a + b;
+ (* Alle Elemente haben den Wert '3.0' *)
+ Fehlerfälle:
+ * MATRIX OP + : COLUMNS l <> COLUMNS r
+ Die Anzahl der Spalten von 'l' und 'r' sind nicht gleich.
+ * MATRIX OP + : ROWS l <> ROWS r
+ Die Anzahl der Zeilen von 'l' und 'r' sind nicht gleich.
+
+-
+ MATRIX OP - (MATRIX CONST m)
+ Zweck: Monadisches Minus. Beispiel:
+
+ MATRIX VAR a :: matrix (3, 4, 10.0)
+ a := - a; (* Alle Elemente haben den Wert '-10.0' *)
+
+ MATRIX OP - (MATRIX CONST l, r)
+ Zweck: Subtraktion zweier Matrizen. Die Anzahl der Reihen und Spalten
+ muß gleich sein.
+ Fehlerfälle:
+ * MATRIX OP - : COLUMNS l <> COLUMNS r
+ Die Anzahl der Spalten von 'l' und 'r' sind nicht gleich.
+ * MATRIX OP - : ROWS l <> ROWS r
+ Die Anzahl der Zeilen von 'l' und 'r' sind nicht gleich.
+
+*
+ MATRIX OP * (REAL CONST r, MATRIX CONST m)
+ Zweck: Multiplikation einer Matrix 'm' mit einem Skalar 'r'. Beispiel:
+
+ MATRIX VAR a :: matrix (3, 4, 2.0);
+ ...
+ a := 3 * a; (* Alle Elemente haben den Wert '6.0' *)
+
+ MATRIX OP * (MATRIX CONST m, REAL CONST r)
+ Zweck: Multiplikation einer Matrix 'm' mit einem Skalar 'r'.
+
+ MATRIX OP * (MATRIX CONST l, r)
+ Zweck: Multiplikation zweier Matrizen. Die Anzahl der Spalten von 'l'
+ und die Anzahl der Zeilen von 'r' müssen gleich sein. Beispiel:
+
+ MATRIX VAR a :: matrix (3, 4, 2.0),
+ b :: matrix (4, 2, 3.0),
+ produkt;
+ produkt := a * b;
+ (* Alle Elemente haben den Wert '24.0' *)
+ Fehlerfall:
+ * MATRIX OP * : COLUMNS l <> ROWS r
+ Die Anzahl der Spalten von 'l' muß mit der Anzahl der Zeilen
+ von 'r' übereinstimmen.
+
+ VECTOR OP * (VECTOR CONST v, MATRIX CONST m)
+ Zweck: Multiplikation des Vektors 'v' mit der Matrix 'm'.
+ Fehlerfall:
+ * VECTOR OP * : LENGTH v <> ROWS m
+ Die Anzahl der Elemente von 'v' stimmt nicht mit den Anzahl der
+ Zeilen von 'm' überein.
+
+ VECTOR OP * (MATRIX CONST m, VECTOR CONST v)
+ Zweck: Multiplikation der Matrix 'm' mit dem Vektor 'v'.
+ Fehlerfall:
+ * VECTOR OP * : COLUMNS m <> LENGTH v
+ Die Anzahl der Spalten von 'm' stimmt nicht mit der Anzahl der
+ Elementen von 'v' überein.
+
+=
+ BOOL OP = (MATRIX CONST l, r)
+ Zweck: Vergleich zweier Matrizen. Der Operator '=' liefert FALSE, wenn
+ die Anzahl Spalten oder Reihen der Matrizen 'l' und 'r' ungleich
+ ist und wenn mindestens ein Element mit gleichen Indizes der zwei
+ Matrizen ungleiche Werte haben. Beispiel:
+
+ MATRIX VAR a :: matrix (3, 3),
+ b :: matrix (3, 3, 1.0),
+ c :: matrix (4, 4);
+ ... a = b ...
+ (* FALSE wegen ungleicher Werte *)
+ ... a = c ...
+ (* FALSE wegen ungleicher Groesse *)
+ ... b = c ...
+ (* FALSE wegen ungleicher Groesse *)
+
+<>
+ BOOL OP <> (MATRIX CONST l, r)
+ Zweck: Vergleich der Matrizen 'l' und 'r' auf Ungleichheit.
+
+:=
+ OP := (MATRIX VAR l, MATRIX CONST r)
+ Zweck: Zuweisung von 'r' auf 'l'. Die MATRIX 'l' bekommt u.U. eine neue
+ Anzahl von Elementen. Beispiel:
+
+ MATRIX VAR a :: matrix (3, 4, 0.0),
+ b :: matrix (5, 5, 3.0);
+ ...
+ a := b; (* 'a' hat jetzt 5 x 5 Elemente *)
+
+ OP := (MATRIX VAR l, INITMATRIX CONST r)
+ Zweck: Dient zur Initialisierung einer Matrix. Beispiel:
+
+ MATRIX VAR x :: matrix (17, 4);
+
+ 'matrix' erzeugt ein Objekt vom Datentyp INITMATRIX. Dieses
+ Objekt braucht nicht soviel Speicherplatz wie ein MATRIX-Objekt.
+ Dadurch wird vermieden, daß nach erfolgter Zuweisung nicht ein
+ durch 'matrix' erzeugtes Objekt auf dem Heap unnötig Speicher-
+ platz verbraucht.
+
+column
+ VECTOR PROC column (MATRIX CONST m, INT CONST i)
+ Zweck: Die 'i'-te Spalte von 'm' wird als VECTOR mit 'ROWS m' Elementen
+ geliefert. Beispiel:
+
+ MATRIX CONST a :: matrix (3, 4);
+ VECTOR VAR b :: column (a, 1);
+ (* 'b' hat drei Elemente mit den Werten '0.0' *)
+ Fehlerfälle:
+ * PROC column : subscript overflow
+ Der Index 'i' liegt außerhalb der Matrix 'm' (i > COLUMNS m).
+ * PROC column : subscript underflow
+ Der Index 'i' liegt außerhalb der Matrix 'm' (i < 1).
+
+COLUMNS
+ INT OP COLUMNS (MATRIX CONST m)
+ Zweck: Liefert die Anzahl der Spalten von 'm'. Beispiel:
+
+ MATRIX VAR a :: matrix (3, 4),
+ b :: matrix (7, 10);
+ put (COLUMNS a); (* 4 *)
+ put (COLUMNS b); (* 10 *)
+
+DET
+ REAL OP DET (MATRIX CONST m)
+ Zweck: Es wird der Wert der Determinanten von 'm' geliefert.
+ Fehlerfall:
+ * OP DET : no square matrix
+ Die Matrix ist nicht quadratisch, d.h. ROWS m <> COLUMNS m
+
+get
+ PROC get (MATRIX VAR m, INT CONST rows, columns)
+ Zweck: Einlesen von Werten für die Matrix 'm' vom Terminal mit 'rows'-
+ Zeilen und 'columns'-Spalten.
+
+idn
+ INITMATRIX PROC idn (INT CONST size)
+ Zweck: Erzeugen einer Einheitsmatrix vom Datentyp INITMATRIX. Beispiel:
+
+ MATRIX VAR a :: idn (10);
+ (* Erzeugt eine Matrix mit 10 x 10 Elementen,
+ deren Werte '0.0' sind, mit der Ausnahme der
+ Diagonalelemente, die den Wert '1.0' haben. *)
+ Fehlerfall:
+ * PROC idn : size <= 0
+ Die angeforderte 'size' Anzahl Spalten oder Zeilen muß > 0 sein.
+
+INV
+ MATRIX OP INV (MATRIX CONST m)
+ Zweck: Liefert als Ergebnis die Inverse von 'm' (Achtung: starke Run-
+ dungsfehler möglich).
+ Fehlerfälle:
+ * OP INV : no square matrix
+ Die Matrix 'm' ist nicht quadratisch, d.h. ROWS m <> COLUMNS m
+ * OP INV : singular matrix
+ Die Matrix ist singulär.
+
+matrix
+ INITMATRIX PROC matrix (INT CONST rows, columns)
+ Zweck: Erzeugen eines Datenobjekts vom Datentyp INITMATRIX mit 'rows'
+ Zeilen und 'columns' Spalten. Alle Elemente werden mit dem Wert
+ '0.0' initialisiert. Beispiel:
+
+ MATRIX CONST :: matrix (3, 3);
+ Fehlerfälle:
+ * PROC matrix : rows <= 0
+ Die angeforderte Zeilenanzahl 'rows' muß > 0 sein.
+ * PROC matrix : columns <= 0
+ Die angeforderte Spaltenanzahl 'columns' muß > 0 sein.
+
+ INITMATRIX PROC matrix (INT CONST rows, columns, REAL CONST value)
+ Zweck: Erzeugen eines Datenobjekts vom Datentyp MATRIX mit 'rows'
+ Zeilen und 'columns' Spalten. Alle Elemente der erzeugten MATRIX
+ werden mit dem Wert 'value' initialisiert. Beispiel:
+
+ MATRIX CONST :: matrix (3, 3, 3.14);
+ Fehlerfälle:
+ * PROC matrix : rows <= 0
+ Die angeforderte Zeilenanzahl 'rows' muß > 0 sein.
+ * PROC matrix : columns <= 0
+ Die angeforderte Spaltenanzahl 'columns' muß > 0 sein.
+
+put
+ PROC put (MATRIX CONST m)
+ Zweck: Ausgabe der Werte einer Matrix auf dem Terminal.
+
+replace column
+ PROC replace column (MATRIX VAR m, INT CONST column index,
+ VECTOR CONST column value)
+ Zweck: Ersetzung der durch 'column index' definierten Spalte in der
+ MATRIX 'm' durch den VECTOR 'column value'. Beispiel:
+
+ MATRIX VAR a :: matrix (3, 5, 1.0);
+ VECTOR VAR b :: vector (3, 2.0);
+ ...
+ replace column (a, 2, b);
+ (* Die zweite Spalte von 'a' wird durch die Werte von 'b'
+ ersetzt *)
+ Fehlerfälle:
+ * PROC replace column : LENGTH columnvalue <> ROWS m
+ Die Anzahl der Zeilen der MATRIX 'm' stimmt nicht mit der Anzahl
+ der Elemente von 'columnvalue' überein.
+ * PROC replace column : column subscript overflow
+ Der Index 'columnindex' liegt außerhalb von 'm'
+ (columnindex > COLUMNS m).
+ * PROC sub : column subscript underflow
+ Der Index 'columnindex' liegt außerhalb von 'm'
+ (columnindex < 1).
+
+replace element
+ PROC replace element (MATRIX VAR m , INT CONST row, column,
+ REAL CONST value)
+ Zweck: Ersetzung eines Elementes von 'm' in der 'row'-ten Zeile und
+ 'column'-ten Spalte durch den Wert 'value'. Beispiel:
+
+ MATRIX VAR a :: matrix (5, 5);
+ ...
+ replace element (1, 1, 3.14159);
+ Fehlerfälle:
+ * PROC replace element : row subscript overflow
+ Der Index 'row' liegt außerhalb von 'm' (row > ROWS m).
+ * PROC replace element : row subscript underflow
+ Der Index 'row' liegt außerhalb von 'm' (row < 1).
+ * PROC replace element : column subscript overflow
+ Der Index 'column' liegt außerhalb von 'm' (column > COLUMNS m).
+ * PROC replace element : row subscript underflow
+ Der Index 'column' liegt außerhalb von 'm' (column < 1).
+
+replace row
+ PROC replace row (MATRIX VAR m, INT CONST rowindex,
+ VECTOR CONST rowvalue)
+ Zweck: Ersetzung der Reihe 'rowindex' in der MATRIX 'm' durch den
+ VECTOR 'rowvalue'. Beispiel:
+
+ MATRIX VAR a :: matrix (3, 5, 1.0);
+ VECTOR VAR b :: vector (5, 2.0);
+ ...
+ replace row (a, 2, b);
+ (* Die 2. Reihe von 'a' wird durch Werte von 'b' ersetzt *)
+ Fehlerfälle:
+ * PROC replace row : LENGTH rowvalue <> COLUMNS m
+ Die Anzahl der Spalten der MATRIX 'm' stimmt nicht mit der Anzahl
+ der Elemente von 'rowvalue' überein.
+ * PROC replace row : row subscript overflow
+ Der Index 'rowindex' liegt außerhalb von 'm' (rowindex > ROWS m).
+ * PROC sub : row subscript underflow
+ Der Index 'rowindex' liegt außerhalb von 'm' (rowindex < 1).
+
+row
+ VECTOR PROC row (MATRIX CONST m, INT CONST i)
+ Zweck: Die 'i'-te Reihe von 'm' wird als VECTOR mit 'COLUMNS m'
+ Elementen geliefert. Beispiel:
+
+ MATRIX CONST a :: matrix (3, 4);
+ VECTOR VAR b :: row (a, 1);
+ (* 'b' hat vier Elemente mit den Werten '0.0'*)
+ Fehlerfälle:
+ * PROC row : subscript overflow
+ Der Index 'i' liegt außerhalb der Matrix 'm' (i > ROWS m).
+ * PROC row : subscript underflow
+ Der Index 'i' liegt außerhalb der Matrix 'm' (i < 1).
+
+ROWS
+ INT OP ROWS (MATRIX CONST m)
+ Zweck: Liefert die Anzahl der Zeilen von 'm'. Beispiel:
+
+ MATRIX VAR a :: matrix (3, 4),
+ b :: matrix (7, 10);
+ ...
+ put (ROWS a); (* 3 *)
+ put (ROWS b); (* 7 *)
+
+sub
+ REAL PROC sub (MATRIX CONST m, INT CONST row, column)
+ Zweck: Liefert den Wert eines Elementes von 'm', welches durch die
+ Indizes 'row' und 'column' bestimmt wird. Beispiel:
+
+ MATRIX VAR m :: matrix (5, 10, 1.0);
+ put (sub (m, 3, 7));
+ Fehlerfälle:
+ * PROC sub : row subscript overflow
+ Der Index 'row' liegt außerhalb von 'm' (row > ROWS m).
+ * PROC sub : row subscript underflow
+ Der Index 'row' liegt außerhalb von 'm' (row < 1).
+ * PROC sub : column subscript overflow
+ Der Index 'column' liegt außerhalb von 'm' (column > ROWS m).
+ * PROC sub : row subscript underflow
+ Der Index 'column' liegt außerhalb von 'm' (column < 1).
+
+TRANSP
+ MATRIX OP TRANSP (MATRIX CONST m)
+ Zweck: Liefert als Ergebnis die transponierte Matrix 'm'.
+
+transp
+ PROC transp (MATRIX VAR m)
+ Zweck: Transponieren der Matrix 'm', wobei kaum zusätzlicher Speicher-
+ platz benötigt wird.
+
+
+
+2. COMPLEX
+
+Das COMPLEX-Paket ist im ausgelieferten Standard-System noch nicht vorüber-
+setzt, sondern wird im Quellcode ausgeliefert und kann so bei Bedarf von
+jeder EUMEL-Installation in die implementationsabhängigen Standard-Pakete
+aufgenommen werden.
+
+Folgende Operationen stehen für COMPLEX zur Verfügung:
+
+put Ausgabe auf dem Terminal
+get Eingabe auf dem Terminal
+complex zero Denotierungsprozedur
+complex one dito
+complex i dito
+complex dito
+real part Realteil eines komplexen Werts
+imag part Imaginärteil eines komplexen Werts
+phi Winkel in der Polardarstellung (Radiant)
+dphi dito, in Winkelgrad
+CONJ Konjugiert komplexer Wert
+sqrt Wurzelfunktion
+ +
+ -
+ *
+ /
+ :=
+ =
+ <>
+
+
+
+Beschreibung der COMPLEX-Operationen
+
+=
+ BOOL OP = (COMPLEX CONST a, b)
+ Zweck: Vergleich von 'a' und 'b' auf Gleichheit.
+
+:=
+ OP := (COMPLEX VAR a, COMPLEX CONST b)
+ Zweck: Zuweisung.
+
+<>
+ BOOL OP <> (COMPLEX CONST a, b)
+ Zweck: Vergleich von 'a' und 'b' auf Ungleichheit.
+
++
+ COMPLEX OP + (COMPLEX CONST a, b)
+ Zweck: Summe von 'a' und 'b'.
+
+-
+ COMPLEX OP - (COMPLEX CONST a, b)
+ Zweck: Differenz von 'a' und 'b'.
+
+*
+ COMPLEX OP * (COMPLEX CONST a, b)
+ Zweck: Multiplikation von 'a' mit 'b'.
+
+/
+ COMPLEX OP / (COMPLEX CONST a, b)
+ Zweck: Division von 'a' mit 'b'.
+
+ABS
+ REAL OP ABS (COMPLEX CONST x)
+ Zweck: REAL-Betrag von 'x'.
+
+complex
+ COMPLEX PROC complex (REAL CONST re, im)
+ Zweck: Denotierungsprozedur. Angabe in kartesischen Koordinaten.
+
+complex i
+ COMPLEX PROC complex i
+ Zweck: Denotierungsprozedur für den komplexen Wert '0.0 + i 1.0'.
+
+complex one
+ COMPLEX PROC complex one
+ Zweck: Denotierungsprozedur für den komplexen Wert '1.0 + i 0.0'.
+
+complex zero
+ COMPLEX PROC complex zero
+ Zweck: Denotierungsprozedur für den komplexen Wert '0.0 + i 0.0'.
+
+CONJ
+ COMPLEX OP CONJ (COMPLEX CONST number)
+ Zweck: Liefert den konjugiert komplexen Wert von 'number'.
+
+dphi
+ REAL PROC dphi (COMPLEX CONST x)
+ Zweck: Winkel von 'x' (Polardarstellung).
+
+get
+ PROC get (COMPLEX VAR a)
+ Zweck: Einlesen eines komplexen Wertes vom Bildschirm in der Form
+ zweier REAL-Denoter. Die Eingabe kann editiert werden.
+
+imag part
+ REAL PROC imag part (COMPLEX CONST number)
+ Zweck: Liefert den Imaginärteil des komplexen Wertes 'number'.
+
+phi
+ REAL PROC phi (COMPLEX CONST x)
+ Zweck: Winkel von 'x' (Polardarstellung) in Radiant.
+
+put
+ PROC put (COMPLEX CONST a)
+ Zweck: Ausgabe eines komplexen Wertes auf dem Bildschirm in Form zweier
+ REAL-Werte. Hinter jedem REAL-Wert wird ein Leerzeichen angefügt.
+
+real part
+ REAL PROC real part (COMPLEX CONST number)
+ Zweck: Liefert den Real-Teil des komplexen Wertes 'number'.
+
+sqrt
+ COMPLEX PROC sqrt (COMPLEX CONST x)
+ Zweck: Wurzelfunktion für komplexe Werte.
+
+
+
+3. LONGINT
+
+LONGINT ist ein Datentyp, für den (fast) alle Prozeduren und Operatoren des
+Datentyps INT implementiert wurden. LONGINT unterscheidet sich von INT
+dadurch, daß erheblich größere Werte darstellbar sind.
+
+Für den Datentyp LONGINT stehen folgende Operationen zur Verfügung:
+
+get Eingabe vom Terminal
+put Ausgabe vom Terminal
+ABS, abs Absolutbetrag
+INCR, DECR Addition und Zuweisung bzw. Subtraktion und Zuweisung
+DIV Division ohne Rest
+int, text Konvertierungen
+longint dito
+max, min Maximum bzw. Minimum zweier LONGINTs
+MOD Modulo-Funktion
+random Zufallszahlen
+sign Vorzeichen
+ <
+ >
+ <=
+ <>
+ =
+ -
+ +
+ *
+ **
+
+
+
+Beschreibung der LONGINT-Operationen
+
+<
+ BOOL OP < (LONGINT CONST left, right)
+ Zweck: Vergleichen zweier LONGINTs auf kleiner.
+
+>
+ BOOL OP > (LONGINT CONST left, right)
+ Zweck: Vergleichen zweier LONGINTs auf größer.
+
+<=
+ BOOL OP <= (LONGINT CONST left, right)
+ Zweck: Vergleichen zweier LONGINTs auf kleiner gleich.
+
+>=
+ BOOL OP >= (LONGINT CONST left, right)
+ Zweck: Vergleichen zweier LONGINTs auf größer gleich.
+
+<>
+ BOOL OP <> (LONGINT CONST left, right)
+ Zweck: Vergleichen zweier LONGINTs auf Ungleichheit.
+
+=
+ BOOL OP = (LONGINT CONST left, right)
+ Zweck: Vergleichen zweier LONGINTs auf Gleichheit.
+
+-
+ LONGINT OP - (LONGINT CONST argument)
+ Zweck: Vorzeichenumkehrung.
+
+ LONGINT OP - (LONGINT CONST left, right)
+ Zweck: Subtraktion zweier LONGINTs.
+
++
+ LONGINT OP + (LONGINT CONST argument)
+ Zweck: Monadischer Operator. Ohne Wirkung.
+
+ LONGINT OP + (LONGINT CONST left, right)
+ Zweck: Addition zweier LONGINTs.
+
+*
+ LONGINT OP * (LONGINT CONST left, right)
+ Zweck: Multiplikation von zwei LONGINTs.
+
+**
+ LONGINT OP ** (LONGINT CONST argument, exponent)
+ Zweck: Exponentiation zweier LONGINTs mit positivem Exponenten.
+ Fehlerfälle :
+ * LONGINT OP ** : negative exponent
+ Der 'exponent' muß >= 0 sein.
+ * 0 ** 0 is not defined
+ 'argument' und 'exponent' dürfen nicht gleich 0 sein.
+
+
+ LONGINT OP ** (LONGINT CONST argument, INT CONST exponent)
+ Zweck: Exponentiation eines LONGINT mit positiven INT Exponenten.
+ Fehlerfälle :
+ * LONGINT OP ** : negative exponent
+ Der 'exponent' muß >= 0 sein.
+ * 0 ** 0 is not defined
+ 'argument' und 'exponent' dürfen nicht gleich 0 sein.
+
+ABS
+ LONGINT OP ABS (LONGINT CONST argument)
+ Zweck: Absolutbetrag eines LONGINT.
+
+abs
+ LONGINT PROC abs (LONGINT CONST argument)
+ Zweck: Absolutbetrag eines LONGINT.
+
+DECR
+ OP DECR (LONGINT VAR resultat, LONGINT CONST ab)
+ Zweck: resultat := resultat - ab
+
+DIV
+ LONGINT OP DIV (LONGINT CONST left, right)
+ Zweck: Division zweier LONGINTs.
+ Fehlerfall :
+ * divide by zero
+ 'right' muß <> 0 sein.
+
+get
+ PROC get (LONGINT VAR zahl)
+ Zweck: Eingabe eines LONGINTs vom Terminal.
+
+ PROC get (FILE VAR file, LONGINT VAR zahl)
+ Zweck: Einlesen von 'zahl' aus der sequentiellen Datei 'file'. Die
+ Datei muß mit 'input' assoziiert sein (vergl. 'sequential file').
+ Fehlerfälle :
+ * file not open
+ Die Datei 'file' ist gegenwärtig nicht assoziiert.
+ * input after end of file
+ Es wurde versucht, über die letzte Zeile einer Datei zu lesen.
+ * input access to output file
+ Es wurde versucht, von einem mit 'output' assoziierten FILE zu
+ lesen.
+
+INCR
+ LONGINT OP INCR (LONGINT VAR resultat, LONGINT CONST dazu)
+ Zweck: resultat := resultat + dazu
+
+int
+ INT PROC int (LONGINT CONST longint)
+ Zweck: Konvertierung von LONGINT nach INT.
+ Fehlerfall :
+ * integer overflow
+ 'longint' ist größer als 'maxint'.
+
+longint
+ LONGINT PROC longint (INT CONST int)
+ Zweck: Konvertierung von 'int' nach LONGINT.
+
+ LONGINT PROC longint (TEXT CONST text)
+ Zweck: Konvertierung von 'text' nach LONGINT.
+
+max
+ LONGINT PROC max (LONGINT CONST left, right)
+ Zweck: Liefert das Maximum zweier LONGINTs.
+
+min
+ LONGINT PROC min (LONGINT CONST left, right)
+ Zweck: Liefert das Minimum zweier LONGINTs.
+
+MOD
+ LONGINT OP MOD (LONGINT CONST left, right)
+ Zweck: Modulo-Funktion für LONGINTs. Der Rest einer LONGINT-Division
+ wird ermittelt.
+ Fehlerfall :
+ * text (left) + 'MOD 0'
+ 'right' muß ungleich null sein.
+
+put
+ PROC put (LONGINT CONST longint)
+ Zweck: Ausgabe eines LONGINTs auf dem Bildschirm. Anschließend wird
+ ein Leerzeichen ausgegeben. Hardwareabhängig sind die Aktionen,
+ wenn eine Ausgabe über die Bildschirmzeilengrenze vorgenommen
+ wird. Meist wird jedoch die Ausgabe auf der nächsten Zeile fort-
+ gesetzt.
+
+ PROC put (FILE VAR file, LONGINT CONST zahl)
+ Zweck: Ausgabe von 'zahl' in die sequentielle Datei 'file'. 'file' muß
+ mit 'output' assoziiert sein.
+ Fehlerfälle :
+ * file not open
+ Die Datei 'file' ist gegenwärtig nicht assoziiert.
+ * output access to input file
+ Es wurde versucht, auf einem mit 'input' assoziierten FILE zu
+ schreiben.
+
+random
+ LONGINT PROC random (LONGINT CONST lower bound, upper bound)
+ Zweck: Pseudo-Zufallszahlen-Generator im Intervall 'lower bound' und
+ 'upper bound' einschließlich. Es handelt sich hier um den
+ 'LONGINT Random Generator'.
+
+SIGN
+ INT OP SIGN (LONGINT CONST longint)
+ Zweck: Feststellen des Vorzeichens von 'longint'. Liefert:
+
+ 0 wenn 'longint' = 0,
+ 1 wenn 'longint' > 0,
+ -1 wenn 'longint' < 0.
+
+sign
+ INT PROC sign (LONGINT CONST longint)
+ Zweck: Feststellen des Vorzeichens von 'longint'. Liefert:
+
+ 0 wenn 'longitt' = 0,
+ 1 wenn 'longint' > 0,
+ -1 wenn 'longint' < 0.
+
+text
+ TEXT PROC text (LONGINT CONST longint)
+ Zweck: Konvertierung von 'longint' nach TEXT.
+
+ TEXT PROC text (LONGINT CONST longint, INT CONST laenge)
+ Zweck: Konvertierung von 'longint' nach TEXT. Die Anzahl der Zeichen
+ soll 'laenge' betragen. Für
+
+ LENGTH (text (longint)) < laenge
+
+ werden die Zeichen rechtsbündig in einen Text mit der Länge
+ 'laenge' eingetragen. Ist der daraus entstehende TEXT kleiner
+ als 'laenge', werden die an 'laenge' fehlenden Zeichen im TEXT
+ mit Leerzeichen aufgefüllt. Für
+
+ LENGTH (text (longint)) > length
+
+ wird ein Text mit der Länge 'length' geliefert, der mit
+ '*'-Zeichen gefüllt ist.
+
diff --git a/doc/user-manual/1.7.3-pd/doc/source-disk b/doc/user-manual/1.7.3-pd/doc/source-disk
new file mode 100644
index 0000000..f769920
--- /dev/null
+++ b/doc/user-manual/1.7.3-pd/doc/source-disk
@@ -0,0 +1 @@
+173_publicdomain/03_benutzerhandbuch.img
diff --git a/doc/user/benutzerhandbuch.1 b/doc/user-manual/1.8.7/doc/benutzerhandbuch.1
index 7c8fec7..7c8fec7 100644
--- a/doc/user/benutzerhandbuch.1
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.1
diff --git a/doc/user/benutzerhandbuch.2 b/doc/user-manual/1.8.7/doc/benutzerhandbuch.2
index 0153fae..0153fae 100644
--- a/doc/user/benutzerhandbuch.2
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.2
diff --git a/doc/user/benutzerhandbuch.3 b/doc/user-manual/1.8.7/doc/benutzerhandbuch.3
index eb1c762..eb1c762 100644
--- a/doc/user/benutzerhandbuch.3
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.3
diff --git a/doc/user/benutzerhandbuch.4 b/doc/user-manual/1.8.7/doc/benutzerhandbuch.4
index c13a091..c13a091 100644
--- a/doc/user/benutzerhandbuch.4
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.4
diff --git a/doc/user/benutzerhandbuch.5a b/doc/user-manual/1.8.7/doc/benutzerhandbuch.5a
index 1e907f0..1e907f0 100644
--- a/doc/user/benutzerhandbuch.5a
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.5a
diff --git a/doc/user/benutzerhandbuch.5b b/doc/user-manual/1.8.7/doc/benutzerhandbuch.5b
index 748e398..748e398 100644
--- a/doc/user/benutzerhandbuch.5b
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.5b
diff --git a/doc/user/benutzerhandbuch.5c b/doc/user-manual/1.8.7/doc/benutzerhandbuch.5c
index 010cacd..010cacd 100644
--- a/doc/user/benutzerhandbuch.5c
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.5c
diff --git a/doc/user/benutzerhandbuch.5d b/doc/user-manual/1.8.7/doc/benutzerhandbuch.5d
index 8a61f29..8a61f29 100644
--- a/doc/user/benutzerhandbuch.5d
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.5d
diff --git a/doc/user/benutzerhandbuch.5e b/doc/user-manual/1.8.7/doc/benutzerhandbuch.5e
index d515c6a..d515c6a 100644
--- a/doc/user/benutzerhandbuch.5e
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.5e
diff --git a/doc/user/benutzerhandbuch.6 b/doc/user-manual/1.8.7/doc/benutzerhandbuch.6
index 5e035d2..5e035d2 100644
--- a/doc/user/benutzerhandbuch.6
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.6
diff --git a/doc/user/benutzerhandbuch.anhang b/doc/user-manual/1.8.7/doc/benutzerhandbuch.anhang
index 5a58f95..5a58f95 100644
--- a/doc/user/benutzerhandbuch.anhang
+++ b/doc/user-manual/1.8.7/doc/benutzerhandbuch.anhang
diff --git a/doc/user-manual/1.8.7/doc/source-disk b/doc/user-manual/1.8.7/doc/source-disk
new file mode 100644
index 0000000..97500ef
--- /dev/null
+++ b/doc/user-manual/1.8.7/doc/source-disk
@@ -0,0 +1 @@
+grundpaket/09_handbuecher.1.img
diff --git a/doc/warenhaus/Anhang Warenhaus b/doc/warenhaus/Anhang Warenhaus
deleted file mode 100644
index 9388ceb..0000000
--- a/doc/warenhaus/Anhang Warenhaus
+++ /dev/null
@@ -1,65 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (100)#
-#headodd#
-#center#gs-Warenhaus#right#%
-
-#end#
-#headeven#
-%#center#gs-Warenhaus
-
-#end#
-#center#1
-
-#center##on("b")##Anhang#off("b")#
-
-#on("b")##center#Muster für Codekarten#off("b")#
-
- +-------------------+
- | O O O O O O O O |
- | |
- | |
- | |
- | |
- | |
- | |
- | |
- | ----------------- |
- +-------------------+
-
-
-
- +--------------------+
- | |
- | O O O O |
- | |
- | |
- |W A R E N K A R T E |
- | |
- | |
- | Artikel |
- | ---------------- |
- | |
- +--------------------+
-
-#page#
-
-
- +------------------------+
- | |
- | O O O O O O |
- | |
- | K U N D E N K A R T E |
- | |
- | |
- | Name |
- | ---------------------- |
- | |
- | |
- +------------------------+
-
-
-
-
-
-
diff --git a/doc/warenhaus/Inhalt Warenhaus b/doc/warenhaus/Inhalt Warenhaus
deleted file mode 100644
index a9b720d..0000000
--- a/doc/warenhaus/Inhalt Warenhaus
+++ /dev/null
@@ -1,50 +0,0 @@
-#limit (11.5)##pagelength (16.5)##pageblock#
-#start (1.8,0.0)#
-Inhaltsverzeichnis
-
-
-1 Was kann gs-Warenhaus 1-1
-
-2 Aufbau von gs-Warenhaus 2-1
-
-3 Installation von gs-Warenhaus 3-1
-3.1 Voraussetzungen 3-1
-3.2 Lieferumfang 3-1
-3.3 Installation 3-2
-3.4 Einrichten mehrerer Hauptstellen 3-8
-
-4 Anschluß eines Codekartenlesers 4-1
-4.1 Hardware-Voraussetzungen 4-1
-4.2 Verwendung des MUFI 4-2
-4.2.1 Einstellungen am MUFI 4-3
-4.2.2 MUFI im Terminalkanal 4-5
-4.2.3 MUFI als Endgerät 4-6
-4.3 Verwendung des AKTRONIC-Adapters 4-7
-4.4 Konfiguration der seriellen Schnittstelle 4-8
-4.5 Verbindung der Hardware-Komponenten 4-10
-
-5 Beschreibung der Menufunktionen 5-1
-5.1 Kurzhinweise zur Bedienung des Menus 5-1
-5.2 Menufunktionen zum Oberbegriff 'Info' 5-4
-5.3 Menufunktionen zum Oberbegriff 'Eingabeart' 5-7
-5.4 Menufunktionen zum Oberbegriff 'Kommandos' 5-9
-5.5 Menufunktionen zum Oberbegriff 'Programme' 5-18
-5.6 Menufunktionen zum Oberbegriff 'Filialdaten' 5-24
-5.7 Menufunktionen zum Oberbegriff 'Archiv' 5-28
-
-6 Beschreibung der Programmierschnittstelle 6-1
-6.1 Schreibweisen und Syntaxregeln in GRIN-Programmen 6-4
-6.2 Kontrollstrukturen 6-8
-6.3 Detailbeschreibung der Warenhaus-Grundbefehle 6-13
-
-7 Weitere Kommandos (für Systembetreuer) 7-1
-
-Anhang: Muster für Codekarten
-
-
-
-
-
-
-
-
diff --git a/doc/warenhaus/gs-Warenhaus handbuch.impressum b/doc/warenhaus/gs-Warenhaus handbuch.impressum
deleted file mode 100644
index 3fbb371..0000000
--- a/doc/warenhaus/gs-Warenhaus handbuch.impressum
+++ /dev/null
@@ -1,89 +0,0 @@
-____________________________________________________________________________
-
-
-#on("b")##on ("u")#
-#center#Betriebssystem E U M E L
-#off ("u")#
-
-
-#center#gs-Warenhaus
-
-
-
-
-#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#
-
-#free (4.0)##on("b")#
-#center#gs-Warenhaus
-
-
-#center#Benutzerhandbuch
-
-
-#center#Version 1.0
-
-
-#off("b")##center#copyright
-#center#Eva Latta-Weber
-#center#Software- und Hardware-Systeme, 1988
-#center#ERGOS GmbH, 1990
-#page#
-#block#
-#center#____________________________________________________________________________
-
-
-Copyright:  ERGOS GmbH   März 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.
-
-
-#center#____________________________________________________________________________
-
-Es kann keine Gewähr übernommen werden, daß das Programm für eine
-bestimmte Anwendung geeignet ist. Die Verantwortung dafür liegt beim
-Anwender.
-
-Das Handbuch wurde mit größter Sorgfalt erstellt. Für die Korrektheit und
-Vollständigkeit der Angaben kann keine Gewähr übernommen werden. Das
-Handbuch kann jederzeit ohne Ankündigung geändert werden.
-
-Texterstellung :  Dieser Text wurde mit der ERGOS-L3 Textverarbeitung
- erstellt und aufbereitet und auf einem Kyocera Laser­
- drucker gedruckt.
-
-
-
-
-#center#___________________________________________________________________________
-
-
-
-Ergonomic Office Software GmbH
-
-Bergstr. 7 Telefon: (02241) 63075
-5200 Siegburg Teletex: 2627-2241413=ERGOS
- Telefax: (02241) 63078
-
-
-#center#____________________________________________________________________________
-
-
diff --git a/doc/warenhaus/gs-Warenhaus-1 b/doc/warenhaus/gs-Warenhaus-1
deleted file mode 100644
index ca79094..0000000
--- a/doc/warenhaus/gs-Warenhaus-1
+++ /dev/null
@@ -1,124 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (3)#
-#headodd#
-#center#gs-warenhaus#right#%
-
-#end#
-#headeven#
-%#center#gs-warenhaus
-
-#end#
-#center#1  Was kann gs-Warenhaus
-
-
-Das Programmpaket #on("b")#gs-Warenhaus#off("b")# entstand auf der Grundlage der projekt­
-orientierten Unterrichtseinheit "WARENHAUS", die vom 'Landesinstitut für Schule
-und Weiterbildung' (LSW) in Soest für den Bereich der 'Informations- und
-kommunikationstechnologischen Grundbildung' (kurz: GRIN) entwickelt wurde.
-
-Unter #on("b")#1.1 Thema und Ziele #off("b")# ist in dem zugehörigen Begleitheft folgendes zu
-finden:
-
-#i1#"Die Schülerinnen und Schüler sollen in dieser Unterrichtseinheit die An­
-wendungen neuer Technologien im Warenhaus kennenlernen und dabei sowohl
-die grundlegenden technologischen Zusammenhänge erarbeiten als auch die
-Auswirkungen reflektieren, die sich durch ihren Einsatz ergeben. Sie werden
-dabei nicht nur die Rolle der Kunden einnehmen, sondern auch die Interessen
-der Angestellten und die der Geschäftsleitung in ihre Beurteilung mit einbe­
-ziehen.
-
-Diese komplexen Zusammenhänge werden den Schülerinnen und Schülern im 8.
-Schuljahr nähergebracht, indem sie veranlaßt werden, in einem Modell-Waren­
-haus selbst schrittweise das Modell eines Warenwirtschaftssystems aufzubauen
-und damit zu arbeiten.
-
-In diesem Modell-Warenhaus kommt dem Umgang mit dem Computer eine
-besondere Bedeutung zu. Mit Hilfe des Rechners, an den ein Codekartenleser
-angeschlossen ist, und des zugehörigen Programms werden die wesentlichen
-Bestandteile eines modernen Kassensystems abgebildet.
-
-Mit dem Codekartenleser kann das Merkmal des automatischen Dateneinlesens
-vereinfacht dargestellt werden. Programmabläufe, Bildschirmausgaben werden
-nicht nur über Tastatureingaben der Benutzer beeinflußt, sondern auch durch
-das Lesen verschlüsselter Informationen. Am Beispiel des Lesegerätes wird zum
-#page#
-einen der Rationalisierungseffekt an der Kasse verdeutlicht, es lassen sich zum
-anderen aber auch Fragen der Zugangsberechtigung durch maschinenlesbare
-Ausweiskarten ansprechen.
-
-Das zur Verfügung stehende Programm erlaubt es, daß die Schülerinnen und
-Schüler schrittweise die zentralen Funktionen eines modernen Warenwirtschafts­
-systems kennenlernen. Neben der maschinellen Datenerfassung mit Hilfe des
-Lesegeräts und der Decodierung von Informationen sind dies z.B.:
-
-- automatische Abrechnung,
-- Speicherung von Warendaten,
-- Kontrolle des Lagerbestandes,
-- Informationen über Verkaufszahlen,
-- automatische Nachbestellung,
-- Speicherung von Kundendaten,
-- Zusammenfassung von Informationen aus verschiedenen Filialen,
-- Erstellen von Ãœbersichten.
-
-Die Schülerinnen und Schüler arbeiten dabei mit einer benutzerfreundlichen
-Programmierumgebung. Diese bietet einerseits die Möglichkeit, die Befehle direkt
-aufzurufen, mit denen alle Funktionen dieses vereinfachten Warenwirtschafts­
-systems ausgeführt werden können, wie etwa Dateien aufbauen, einkaufen und
-Listen erstellen. Andererseits stellt die Programmierumgebung weitere Befehle
-zur Verfügung, mit denen einige dieser Funktionen auch 'programmiert' werden
-können."#off("b")#
-
-Soweit zu Thema und Zielen dieser Unterrichtseinheit. Für weitere didaktisch-
-methodische Informationen zu dieser Reihe verweisen wir auf das entsprechende
-Begleitheft des LSW.
-(Vertrieb: Soester Verlagskontor, Jakobistraße 46, 4770 Soest; Bestellnummer 1710)
-#page#
-Da bei der Software-Entwicklung für GRIN vom LSW das Betriebssystem EUMEL nicht
-mit berücksichtigt wird, erscheint es notwendig, durch Eigeninitiativen wenigstens
-einige GRIN - Projekte unter EUMEL zur Verfügung zu stellen, um den Schulen, die
-mit EUMEL arbeiten, nicht gänzlich den Zugang zu GRIN zu verwehren.
-
-Das Projekt WARENHAUS bietet sich dabei besonders an, weil die Vernetzungen
-innerhalb eines Warenwirtschaftssystems mit einem Mehrplatz-System und der
-Möglichkeit der Intertask-Kommunikation wesentlich wirklichkeitsnäher aufzeigbar
-sind als mit einem reinen Einzelplatz-System wie z.B. MS DOS, bei dem die
-Kommunikation nur über den Transport von Disketten geregelt wird. (Ein Netzwerk
-ist in der Software der LSW nicht vorgesehen.)
-
-#on("b")#gs-Warenhaus#off("b")# umfaßt die wesentlichen Funktionen der vom LSW für MS DOS
-erstellten Programmierumgebung WARENHAUS-2. Es ist jedoch keine genaue 'Nach­
-bildung' dieser Software, sondern eher eine Realisierung des 'Vorbildes' unter
-Berücksichtigung der besonderen Gegebenheiten des EUMEL-Systems, wobei sowohl
-am äußeren Erscheinungsbild als auch inhaltlich Änderungen und Erweiterungen
-vorgenommen wurden. Eingebettet ist #on("b")#gs-Warenhaus#off("b")# in die menüorientierte
-Benutzerschnittstelle #on("b")#gs-DIALOG#off("b")#.
-
-Ein Codekartenleser kann in Verbindung mit einem Interface (z.B. dem MUFI der
-Firma BICOS) verwendet werden, ist für die Nutzung des Programmes aber nicht
-unbedingt erforderlich.
-
-Da zur Zeit der Entstehung dieses Programms GRIN an den Schulen noch nicht
-etabliert ist und man mit (vorerst) nur einem Projekt dem Ansatz von GRIN sicher
-nicht gerecht werden kann, ist #on("b")#gs-Warenhaus#off("b")# flexibel angelegt. Es enthält neben
-einer Programmierumgebung, in der die vom LSW für GRIN entwickelten Befehle und
-Syntaxregeln benutzt werden, eine weitere, in der in gewohnter ELAN-Syntax ge­
-arbeitet werden kann, so daß es z.B. ebenfalls für den Unterricht in Klasse 9/10 (für
-spezielle Fragestellungen evtl. auch in der Sek. II) verwendbar ist.
-#page#
-Natürlich ist #on("b")#gs-Warenhaus#off("b")# #i1#kein#off("b")# Verwaltungsprogramm für 'echte' Warenhäuser
-oder gar ganze Warenwirtschaftssysteme, es ist vielmehr ein Simulationsprogramm,
-das die Vorgänge in solch einem System anhand eines stark vereinfachten Modells
-klarmachen soll. Aus diesem Grunde werden Ihnen beim Umgang mit diesem Pro­
-gramm wahrscheinlich eine ganze Reihe von Erweiterungsmöglichkeiten und
-Funktionen einfallen, die das Programm nicht bietet. Denken Sie dabei bitte aber
-immer daran, daß #on("b")#gs-Warenhaus#off("b")# in erster Linie für den Einsatz in GRIN oder im
-WP-Unterricht konzipiert wurde, vornehmlich also von absoluten 'Anfängern' auf dem
-Gebiet des Umgangs mit Rechnern genutzt wird, die von einer zu großen Fülle von
-Programmfunktionen nur verwirrt würden.
-
-Wir werden Ihnen in den folgenden Kapiteln dieses Handbuchs den Umgang mit den
-Funktionsangeboten von #on("b")#gs-Warenhaus#off("b")# erklären, auf die Umsetzungsmöglichkeiten
-der am Anfang dieses Kapitels erwähnten Ziele im Unterricht gehen wir jedoch nicht
-ein. Beschaffen Sie sich dafür bitte das bereits oben angegebene Begleitheft des LSW.
-
diff --git a/doc/warenhaus/gs-Warenhaus-2 b/doc/warenhaus/gs-Warenhaus-2
deleted file mode 100644
index f3f1284..0000000
--- a/doc/warenhaus/gs-Warenhaus-2
+++ /dev/null
@@ -1,72 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (5)#
-#headodd#
-#center#gs-warenhaus#right#%
-
-#end#
-#headeven#
-%#center#gs-warenhaus
-
-#end#
-#center##on("b")#2  Aufbau von gs-Warenhaus#off("b")#
-
-#on("b")#gs-Warenhaus#off("b")# bietet die Möglichkeit, nicht nur #us#ein#use# Warenhaus, sondern eine
-Warenhaus-Kette im Modell nachzubilden. Solch eine Warenhauskette besteht hier
-stets aus einer #us#Hauptstelle#use# und einer oder mehrerer (bis zu 10) #us#Filialen#use#. Damit die
-Filialen auf die zentralen Daten der Warenhauskette zugreifen können, verfügt jede
-Hauptstelle über eine #us#Zentrale#use#, die jederzeit angerufen werden kann. Für die
-Kommunikation untereinander gehört zu jeder Filiale eine (Filial-) #us#Verwaltung#use#, bei
-der die aktuellen Filialdaten erfragt werden können.
-
-
-Realisiert wird dieser Aufbau durch verschiedene Tasks und der Möglichkeit der
-Intertask-Kommunikation. Unter einer Task, in der #on("b")#gs-Warenhaus#off("b")# insertiert ist,
-können eine oder mehrere Tasks als Hauptstellen angemeldet werden (siehe '3.3
-Installation' und '7 Weitere Kommandos'). So kann man z.B. für verschiedene
-Klassen gleichzeitig Warenhausketten einrichten. Zu beachten ist, daß verschiedene
-Ketten untereinander völlig unabhängig sind und dadurch #us#nicht#use# miteinander
-kommunizieren können.
-
-
-Jede Hauptstellen-Task richtet sich automatisch eine Sohn-Task als Zentrale ein.
-Werden nun Sohn-Tasks einer Hauptstellen-Task angemeldet, so werden diese zu
-Filialen der entsprechenden Hauptstelle, wobei ihnen automatisch eine Filialnummer
-zugeteilt wird, die identisch ist mit der Kanalnummer des benutzten Terminals.
-(Steht keine Mehrplatzanlage zur Verfügung, so läßt sich nur #us#eine#use# Filiale einrichten;
-die Filialnummer ist dann in der Regel 1.)
-
-
-Die Filial-Tasks ihrerseits legen beim Starten von #on("b")#gs-Warenhaus#off("b")# automatisch jeweils
-eine Sohn-Task als (Filial-) Verwaltung an.
-#page#
-Insgesamt ergibt sich folgender schematischer Aufbau (die Pfeile zeigen die
-Kommunikationsmöglichkeiten an):
-
-
-#on("b")#
- W A R E N H A U S
- / | \
- Hauptstelle A Hauptstelle B Hauptstelle C . . .
-
- / | \
-Zentrale A Filiale A1 Filiale A2 . . .
- ^
- |
- | Verwaltg.A1 Verwaltg.A2 . . .
- | ^ ^
- | | |
- --------------------------- . . .
-#off("b")#
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/doc/warenhaus/gs-Warenhaus-3 b/doc/warenhaus/gs-Warenhaus-3
deleted file mode 100644
index ffef881..0000000
--- a/doc/warenhaus/gs-Warenhaus-3
+++ /dev/null
@@ -1,309 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (7)#
-#headodd#
-#center#gs-Warenhaus#right#%
-
-#end#
-#headeven#
-%#center#gs-Warenhaus
-
-#end#
-#center#1
-
-#center##on("b")#3  Installation von gs-Warenhaus#off("b")#
-
-
-Bevor Sie #on("b")#gs-Warenhaus#off("b")# auf Ihrem Computer benutzen können, müssen Sie das
-Programm zunächst installieren. Wenn #on("b")#gs-Warenhaus#off("b")# auf Ihrem System schon zur
-Verfügung steht, können Sie dieses Kapitel ruhig überspringen.
-
-
-
-#on("b")#3.1  Voraussetzungen#off("b")#
-
-Um #on("b")#gs-Warenhaus#off("b")# auf Ihrem Computer betreiben zu können, muß das EUMEL-
-Betriebssystem installiert sein. #on("b")#gs-Warenhaus#off("b")# setzt die Multi-User-Version voraus
-und ist lauffähig ab Version 1.8.0. #on("b")#gs-Warenhaus#off("b")# setzt weiterhin voraus, daß auf
-Ihrem Computer bereits das Programm #on("b")#gs-DIALOG#off("b")# (ab Version 1.1) installiert ist.
-
-
-
-#on("b")#3.2  Lieferumfang#off("b")#
-
-#on("b")#gs-Warenhaus#off("b")# wird auf einer Diskette geliefert, die alle notwendigen Programme
-enthält (die Installation von #on("b")#gs-DIALOG#off("b")# wird dabei vorausgesetzt!). Um den Inhalt
-der Diskette feststellen zu können, starten Sie Ihr System und bringen es dazu, daß
-'gib kommando:' erscheint. Dann legen Sie die Diskette ein und geben das
-Kommando:
-
-
-#on("b")#archive("gs-Warenhaus"); list(archive); release(archive) <RETURN>#off("b")#
-#page#
-Anschließend erscheint eine Übersicht der auf dem Archiv vorhandenen Programme.
-Folgende Dateinamen sollten sich in der Ãœbersicht befinden:
-
- "gs-MENUKARTE:Warenhaus"
- "gs-Warenhaus 0: ohne Kartenleser"
- "gs-Warenhaus 0: mit Kartenleser an AKTRONIC-Adapter"
- "gs-Warenhaus 0: mit Kartenleser an MUFI als Endgerät"
- "gs-Warenhaus 0: mit Kartenleser an MUFI im Terminalkanal"
- "--------------------------------------------"
- "gs-Warenhaus 1"
- "gs-Warenhaus 2"
- "gs-Warenhaus 3"
- "gs-Warenhaus 4"
- "gs-Warenhaus 5"
- "gs-Warenhaus/gen"
-
-Eventuell können noch weitere Namen auf der Diskette vorhanden sein. Wenn Sie den
-Inhalt der Diskette kontrolliert haben und diese Dateien auf der Diskette vorhanden
-sind, können Sie #on("b")#gs-Warenhaus#off("b")# installieren.
-
-Sollten Sie statt der Übersicht eine Fehlermeldung erhalten, überprüfen Sie bitte, ob
-die Diskette das richtige Format besitzt oder ob Ihr Diskettenlaufwerk Probleme
-macht. Sollten dagegen Programme fehlen, so reklamieren Sie die Diskette.
-
-
-
-#on("b")#3.3  Installation#off("b")#
-
-#on("b")#gs-Warenhaus#off("b")# muß in einer Task installiert werden, in der bereits das Programm
-#on("b")#gs-DIALOG#off("b")# zur Verfügung steht. Alle Söhne und Enkel der neuen Task können
-anschließend das Warenhaus-Modell aufrufen. Richten Sie also eine Task als Sohn
-#page#
-der Task ein, in der auf Ihrem Computer bereits #on("b")#gs-DIALOG#off("b")# installiert ist. Wir
-nehmen hier an, daß #on("b")#gs-DIALOG#off("b")# in der Task 'MENU' installiert ist und die neue
-Task den Namen 'WARENHAUS' erhalten soll. (Sie können für die Task auch einen
-beliebigen anderen Namen wählen):
-
-#on("b")#
- <SV> (Supervisor - Taste)
-
-#off("b")#
- --> gib supervisor kommando:
-#on("b")#
- begin ("WARENHAUS","MENU") <RETURN>
-#off("b")#
-
- --> gib kommando:
-
-(Arbeiten mehrere Personen mit dem Computer, dann ist es sinnvoll, diese Task vor
-unbefugtem Zugriff durch ein Passwort zu schützen. Wie das gemacht wird, können
-Sie in Ihrem EUMEL-Benutzerhandbuch erfahren.)
-
-Legen Sie dann die Archivdiskette ein, auf der sich #on("b")#gs-Warenhaus#off("b")# befindet, und
-geben Sie die folgenden Kommandos:
-
-#on("b")#
- archive ("gs-Warenhaus") <RETURN>
-
- fetch (ALL archive, archive) <RETURN>
-
- release (archive) <RETURN>
-
- run ("gs-Warenhaus/gen") <RETURN>
-#off("b")#
-
-Sie haben damit das Installationsprogramm gestartet und können die Diskette wieder
-aus dem Laufwerk nehmen. (Natürlich können Sie die Dateien auch mit Hilfe von
-#on("b")#gs-DIALOG#off("b")# von der Diskette holen. Achten Sie dann bitte darauf, daß sie #on("b")#alle#off("b")# oben
-angegebenen Dateien von der Diskette in Ihre Task holen).
-#page#
-Zunächst werden Sie nun aufgefordert, eine Interface-Anpassung für den Codekarten­
-leser auszuwählen. Dazu erscheint das folgende Menu auf dem Bildschirm:
-
-+----------------------------------------------------------------------+
-|center#Auswahl einer Interface-Anpassung für den Codekartenleser |
-|center#Wenn kein Kartenleser benutzt wird, <ESC><q> tippen! |
-| |
-| Auswahl  e i n e r  Datei durch Ankreuzen |
-| |
-| ==> � gs-Warenhaus 0: mit Kartenleser an AKTRONIC-Adapter |
-| � gs-Warenhaus 0: mit Kartenleser an MUFI als Endgerät |
-| � gs-Warenhaus 0: mit Kartenleser an MUFI im Terminalkanal |
-| |
-| |
-| |
-| |
-| Info: <?> Fertig: <ESC><q> Abbrechen: <ESC><h> |
-| |
-+-----------------------------------------------------------------------
-Soll kein Kartenleser benutzt werden, tippen Sie einfach <ESC><q>. Sonst fahren
-Sie den Pfeil mit den Cursor-Tasten in die gewünschte Zeile und drücken
-<RETURN>. Welche der angegebenen Anpassung für welchen Zweck die geeignete
-ist, wird in Kapitel 4 ("Anschluß eines Codekartenlesers") genauer beschrieben.
-
-Daraufhin wird die Installation automatisch durchgeführt. Haben Sie die Anpassung
-für den 'AKTRONIC-Adapter' oder für das 'MUFI als Endgerät' ausgewält, so erscheint
-nach der Insertierung dieser Datei die Aufforderung
-
-#center##on("b")#Gib Interface-Kanal:#off("b")#
-
-Hier muß angegeben werden, an welchen Kanal (serielle Schnittstelle) das Interface
-angeschlossen werden soll (vgl. wiederum Kapitel 4). Der Interface-Kanal läßt sich
-auch später noch umstellen (vgl. Kapitel 7).
-
-Wenn der Insertierungs-Vorgang abgeschlossen ist, müssen Sie noch einige Fragen
-beantworten:
-
-#on("b")#Frage 1:#off("b")# #on("b")#Version für GRIN (j/n)?#off("b")#
-
-Tippen Sie hier ein <j>, so werden später in der Programmierumgebung die
-'Soester' Befehle und Syntax-Regeln benutzt, ein <n> liefert die Programmier­
-umgebung für ELAN. Die Versions-Einstellung kann auch noch später geändert
-werden (vgl. Kapitel 7, Befehl 'grin').
-
-#on("b")#Frage 2:#off("b")# #on("b")#Soll diese Task Warenhaus-Hauptstelle sein (j/n)?#off("b")#
-
-Das Tippen von <j> macht Ihre momentan benutzte Task zur (einzigen!) Waren­
-haus-Hauptstelle; Sie können dann (nach Beantwortung mindestens einer weiteren
-Frage, s.u.) in Söhnen dieser Task das Warenhaus-Programm starten. Allerdings ist es
-dann nicht mehr möglich, Sohntasks dieser Task zu Hauptstellen zu machen!
-
-Möchten Sie aber mehrere Hauptstellen (evtl. für verschiedene Lerngruppen) ein­
-richten, so müssen Sie hier ein <n> tippen. In diesem Fall ist die Installation
-zunächst beendet und es erscheint der EUMEL-Eingangsbildschirm. Was Sie dann
-noch tun müssen, erfahren Sie in Kapitel 3.4; die folgenden Ausführungen können
-Sie überschlagen.
-
-#on("b")#Frage 3:#off("b")# #on("b")#Mit Direktstart (j/n)?#off("b")#
-
-Wenn Sie vor dem Benutzer die 'gib kommando:'-Ebene verbergen wollen, können
-Sie das System durch Tippen eines <j> so einstellen, daß sich sofort nach Ein­
-richten einer Sohntask das Menusystem meldet. Für den Anfänger kann das die
-Arbeit durchaus erleichtern. Wenn Sie das nicht möchten, tippen Sie hier ein <n>.
-Haben Sie die Frage mit <j> beantwortet, so erscheint noch eine (letzte) Abfrage:
-
-#on("b")#Frage 4:#off("b")# #on("b")#Mit automatischem Löschen (j/n)?#off("b")#
-
-Durch Tippen eines <j> legen Sie fest, daß in den Sohntasks nach Verlassen des
-Menus die jeweilige Task automatisch gelöscht wird. Tippen Sie ein <n>, dann wird
-nach Verlassen des Menus angefragt, ob die Task gelöscht werden soll. Wird die Frage
-bejaht, wird gelöscht - sonst wird die Task abgekoppelt (break) und kann durch
-'continue' wieder angekoppelt werden.
-
-#on("b")#Anmerkung:#off("b")# In Tasks, in denen Sie die Frage nach dem Direktstart mit <j> beant­
-wortet haben, sollte nicht das Kommando 'monitor' gegeben werden, da Sie durch
-dieses Kommando auch diese Task zu einer Task machen, die sich direkt mit dem
-Menu meldet und ggf. bei Verlassen des Menus automatisch gelöscht wird!
-
-
-Nachdem der EUMEL-Eingangsbildschirm zu sehen ist, können Sie nun #on("b")#gs-Waren­
-haus#off("b")# starten. Nehmen wir an, die Task 'WARENHAUS' sei Hauptstellen-Task. Sie ist
-damit automatisch Managertask, Sie können also Sohntasks anmelden:
-
-#on("b")#
- <SV> (Supervisor - Taste)
-
-#off("b")#
- --> gib supervisor kommando:
-#on("b")#
- begin ("Test","WARENHAUS") <RETURN>
-#off("b")#
-
-Statt 'Test' können Sie der Sohntask natürlich auch einen beliebigen anderen Namen
-geben. Wenn Sie einen Direktstart eingerichtet haben, erscheint nun sofort das
-#on("b")#gs-DIALOG#off("b")#-Emblem.
-
- +------------------------+
- | gs-DIALOG |
- +---------------------------+ |
- | Version 1.1 | |
- +-----------------------------+ | |
- | (C) 1987/88 Eva Latta Weber | | |
- +-------------------------------+ | |-----+
- | (C) 1988 ERGOS GmbH | | |
- | | |---+
- +------------------------------+ | |
- | gggggggg ssssssss | |-------+
- | ggg sss sss | |
- | ggg sss | --------+
- | ggg gggg ssssssss |
- | ggg ggg sss |
- | ggg ggg sss |
- | gggggggggg sssssssss |
- +------------------------------+
-
- W A R E N H A U S
-
- Filiale 1
-#off("b")#
-Andernfalls erscheint
-
-#on("b")#
- gib kommando:
-#off("b")#
-
-Mit dem Kommando
-
- #on("b")#warenhaus <RETURN>#off("b")#
-
-starten Sie #on("b")#gs-Warenhaus#off("b")# und erhalten zunächst ebenfalls das obige Emblem auf
-dem Bildschirm. Links unten sehen Sie, unter welcher Filialnummer diese Task nun
-von #on("b")#gs-Warenhaus#off("b")# geführt wird. Diese Nummer ist identisch mit der Kanalnummer,
-unter der das EUMEL-System Ihren Arbeitsplatz verwaltet.
-
-Kurze Zeit später erscheint das WARENHAUS-Eingangsmenu. Wie Sie nun weiter mit
-#on("b")#gs-Warenhaus#off("b")# arbeiten können, erfahren Sie in Kapitel 5.
-
-
-
-#on("b")#3.4  Einrichten mehrerer Hauptstellen#off("b")#
-
-Wir gehen hier davon aus, daß Sie die Installation von #on("b")#gs-Warenhaus#off("b")# gemäß den
-Beschreibungen in Kapitel 3.3 bereits durchgeführt und dabei die Frage 2 ("Soll diese
-Task Warenhaus-Hauptstelle sein (j/n)?") mit 'nein' beantwortet haben. (Falls Sie
-Frage 2 mit 'ja' beantwortet haben und nun den Hauptstellen-Status der Task wieder
-rückgängig machen wollen, so lesen Sie zunächst in Kapitel 7 nach.)
-
-Die Task, in der die Installation stattfand (wir nehmen weiterhin an, daß sie den
-Namen 'WARENHAUS' hat), wurde automatisch zur Managertask, das heißt, daß
-Söhne von ihr eingerichtet werden können. Bevor Sie in diesem Fall das Programm
-nutzen können, müssen Sie nun noch mindestens eine Sohntask zur Hauptstelle
-machen. Gehen Sie dabei folgendermaßen vor:
-
-#on("b")#
- <SV> (Supervisor - Taste)
-
-#off("b")#
- --> gib supervisor kommando:
-#on("b")#
- begin ("Hauptstelle A","WARENHAUS") <RETURN>
-#off("b")#
-
- --> gib kommando:
-
-
-Mit dem Kommando
-
-#center##on("b")#warenhaus hauptstelle (TRUE) <RETURN>#off("b")#
-
-wird die Task 'Hauptstelle A' zur Warenhaus-Hauptstelle.
-
-Zu beantworten sind dabei eine oder zwei Fragen; es sind dieselben, die auftauchen,
-wenn bei der Abfrage 'Soll diese Task Warenhaus-Hauptstelle sein (j/n)?' ein <j>
-getippt wird. Lesen Sie deshalb nun weiter in Kapitel 3.3 bei der Frage 3: 'Mit Direkt­
-start (j/n)?'.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/doc/warenhaus/gs-Warenhaus-4 b/doc/warenhaus/gs-Warenhaus-4
deleted file mode 100644
index 2c5d7dc..0000000
--- a/doc/warenhaus/gs-Warenhaus-4
+++ /dev/null
@@ -1,378 +0,0 @@
-limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (11)#
-#headodd#
-#center#gs-Warenhaus#right#%
-
-#end#
-#headeven#
-%#center#gs-Warenhaus
-
-#end#
-#center#1
-
-#center# #on("b")#4  Anschluß eines Codekartenlesers#off("b")#
-
-
-Ein 'echter' Scanner oder Barcodeleser ist als automatisches Lesegerät für den Ein­
-satz im Unterricht nicht geeignet und kann unter EUMEL/ELAN unseres Wissens nach
-auch nicht angesteuert werden. #on("b")#gs-Warenhaus#off("b")# benutzt stattdessen (ebenso wie die
-Soester Software) den von der Firma AKTRONIC vertriebenen Codekartenleser für
-einfache 8-Bit-Lochkarten (siehe Anhang).
-
-Die Verwendung eines Codekartenlesers ist für die Bedienung des Programms zwar
-nicht unbedingt notwendig, bietet jedoch beim Einsatz von #on("b")#gs-Warenhaus#off("b")# im Unter­
-richt neben den didaktischen Hintergründen (Modell für Scanner-Kasse) auch noch
-mancherlei Vorteile bezüglich des "Datenschutzes" (Änderungen an Kunden- oder
-Artikeldaten sowie Zugriffe auf Auskunftsfunktionen nur mit entsprechender Code­
-karte möglich), so daß sein Anschluß sehr empfohlen werden muß.
-
-Allerdings ist solch ein Gerät nur mittels eines (relativ teuren) Interface-Systems
-anschließbar, dessen Anschaffung sich nur lohnt, wenn das System auch sonst noch
-zum Messen, Steuern, Regeln (= "Prozeßdatenverarbeitung", "PDV") im Unterricht
-genutzt wird. (#on("b")#ERGOS#off("b")# bietet mit #on("b")#"gs-Prozess"#off("b")# auch ein Programmpaket zur PDV
-unter EUMEL/ELAN an!)
-
-
-
-#on("b")#4.1  Hardware-Voraussetzungen#off("b")#
-
-Der Codekartenleser wird an einen Steckplatz des Interface-Systems MODUL-BUS der
-Firma AKTRONIC angeschlossen, wobei ein Einzel- oder Mehrfachsteckplatz mit
-Kombi- oder E/A-Karte oder eine Compact-Box benutzt werden können.
-
-Da Eingaben von externen Geräten unter EUMEL in der Regel nur über eine serielle
-Schnittstelle möglich sind, benötigt man neben dem Kartenleser und dem MODUL-
-#page#
-BUS-Steckplatz noch einen 'Adapter', der die parallelen Signale des MODUL-BUS-
-Systems in serielle Signale wandelt, die der Computer über eine serielle Schnittstelle
-(auch RS232- oder V24-Schnittstelle genannt) empfangen kann. Für erfahrene
-Elektronik-Bastler ist das Erstellen solch eines Adapters sicher eine lösbare Aufgabe,
-unter den fix und fertig kaufbaren Geräten haben wir allerdings nur zwei geeignete
-gefunden: das 'Multifunktionale Interface' (kurz: MUFI) der Firma BICOS und den
-'RS232-Adapter für das MODUL-BUS-System' der Firma AKTRONIC. Diese beiden
-Geräte werden auch von #on("b")#gs-Warenhaus#off("b")# unterstützt.
-
-Die erforderliche Hardware-Konstellation stellt sich im Überblick also folgender­
-maßen dar:
-
-#on("b")#
- Computer <----> Adapter <----> Interface <----> Kartenleser
-
- (mit se- ('MUFI' ('MODUL-
- rieller oder BUS'-
- Schnitt- 'AKTRONIC- Steck-
- stelle) Adapter') platz)
-#off("b")#
-
-
-#on("b")#4.2  Verwendung des MUFI#off("b")#
-
-Das MUFI ist speziell für die Arbeit in einem Mehrplatz-System entwickelt worden. Es
-benötigt keine zusätzliche serielle Schnittstelle am Rechner, sondern kann einfach
-zwischen Rechner und Terminal 'in den Terminalkanal gesteckt' werden, sodaß man
-von diesem Terminal aus optimal auf das Interface-System zugreifen kann. Im Ideal­
-fall sollte jeder Arbeitsplatz mit der oben genannten Hardware ausgestattet sein, was
-aber momentan sicher nicht für jede Schule finanzierbar ist. Haben Sie zunächst nur
-ein (oder wenige) MUFI(s) zur Verfügung und möchten von verschiedenen Terminals
-(abwechselnd) auf ein Interface-System zugreifen oder verfügen Sie gar nicht über
-ein Terminal, sondern nur über einen Monitor (z.B. bei IBM-Kompatiblen), so
-können Sie das MUFI auch 'als Endgerät' an einer separaten seriellen Schnittstelle
-nutzen.
-#page#
-Für den Betrieb in einem Terminalkanal sollte das MUFI über eine sog. "Schnitt­
-stellen-Automatik" verfügen, die verhindert, daß das MUFI in ausgeschaltetem
-Zustand oder mit abgezogenem Netzstecker den Datenfluß vom Rechner zum
-Terminal unterbricht. Diese sehr sinnvolle Automatik wird von BICOS #on("b")#nicht#off("b")#
-standardmäßig eingebaut. Sie sollten bei eventuellen Bestellungen darauf achten.
-
-
-#on("b")#4.2.1  Einstellungen am MUFI#off("b")#
-
-Gleichgültig ob Sie das MUFI 'im Terminalkanal' oder 'als Endgerät' benutzen,
-müssen Sie zunächst am MUFI einige Einstellungen per DIP-Schalter im Inneren des
-MUFI vornehmen. Ziehen Sie dazu aber auf alle Fälle den Stecker aus der Steckdose!
-Lösen Sie dann die 4 Schrauben an der Unterseite des Gehäuses, heben das Oberteil
-vorsichtig ab und legen es neben das Unterteil, sodaß die Kabelverbindungen
-zwischen Unter- und Oberteil nicht belastet werden.
-
- +---------------------------------------------------+
- | +-------+ +------------+ |
- | | | | | +---------+ |
- | +-------+ | | | DIP- | |
- | +-------+ | | | Schalter| |
-Rück- | | | | | +---------+ | Vorder-
-seite | +-------+ | | +--------------+ | seite
- | +-------+ | SCN68000 | | | |
- | | | | | +--------------+ |
- | +-------+ | | |
- | +-------+ | | |
- | | | | | |
- | +-------+ +------------+ |
- +---------------------------------------------------+
-
-
-
-#center#Abb.1: MUFI geöffnet
-#page#
-Die kleine Plastikbox mit den DIP-Schaltern trägt die folgende Aufschrift:
-
-#center##on("b")#O N  
-#center#1 2 3 4#off("b")#
-
-Heben Sie den Deckel mit Hilfe eines kleinen Schraubendrehers o.ä. an der rechten
-Seite leicht an und klappen Sie ihn nach links um. Sie können nun die 4 DIP-
-Schalter sehen.
-
- +---------------------------------------+
- | +-----+ +-----+ +-----+ +-----+ |
- | |+++++| | | | | | | |
- | |+++++| | | | | | | | ON
- | |+++++| | | | | | | |
- | |+++++| | | | | | | |
- | | | | | | | | | |
- | | | | | | | | | |
- | | | | | | | | | |
- | | | |+++++| |+++++| |+++++| |
- | | | |+++++| |+++++| |+++++| |
- | | | |+++++| |+++++| |+++++| | OFF
- | | | |+++++| |+++++| |+++++| |
- | +-----+ +-----+ +-----+ +-----+ |
- +---------------------------------------+
-
- 1 2 3 4
-
-#center#Abb.2: Mögliche DIP-Schalter-Stellung beim MUFI
-
- Dabei haben die DIP-Schalter folgende Bedeutung:
-
- 1 ON : Modulbusbetrieb
- OFF : Parallelportbetrieb
- 2 ON : RTS/CTS-Hardware-Handshake
- OFF : XON/XOFF-Protokoll
- 3 ON : 9600 Baud
- OFF : 19200 Baud
- 4 ON : Even Parity
- OFF : No Parity
-
-In jedem Fall muß der DIP-Schalter 1 in Stellung #on("b")#ON#off("b")# gebracht werden.
-#page#
-Wenn Sie das MUFI im Terminalkanal betreiben wollen, müssen Sie die anderen
-Einstellungen so vornehmen, daß sie zu der Konfiguration des Terminals passen (vgl.
-auch Kapitel 4.4). Beträgt die Übertragungsrate 19200 Baud, so sollten Sie unbedingt
-mit dem XON/XOFF-Protokoll arbeiten - es sei denn, das Terminal unterstützt
-RTS/CTS! Wenn Sie das MUFI an einer separaten seriellen Schnittstelle als Endgerät
-betreiben wollen, #on("b")#muß#off("b")# der Datenaustausch mit dem RTS/CTS-Protokoll abgewickelt
-werden (Schalter 2 auf 'ON'!). Vergewissern Sie sich, daß Ihr Schnittstellen-Kabel
-auch darauf ausgelegt ist! Nach dieser Einstellung der DIP-Schalter ist das MUFI
-betriebsbereit. Fügen Sie die beiden Gehäuseteile wieder zusammen und ver­
-schrauben Sie sie wieder.
-
-
-#on("b")#4.2.2  MUFI im Terminalkanal#off("b")#
-
-Um das MUFI in den Terminalkanal einbauen zu können, müssen Sie zunächst am
-Terminal die Zuleitung vom Rechner lösen. Auf der Rückseite des MUFIs befinden
-sich zwei Stecker, die mit V24/1 und V24/2 bezeichnet sind. Stecken Sie an Stecker
-V24/2 das Kabel, das ursprünglich vom Computer zum Terminal führte. Sie
-benötigen jetzt noch ein weiteres (kurzes) V24-Kabel, um das MUFI mit dem
-Terminal zu verbinden. Dieses wird einerseits auf Stecker V24/1 am MUFI gesteckt
-und andererseits auf den Stecker am Terminal, von dem Sie das ursprüngliche Kabel
-zwischen Rechner und Terminal abgezogen haben.
-
- +--------------------------+
- | +----------------------+ |
- | | V24/1 V24/2 | |
- | | | | | |
- | +----|-----------|-----+ |
- +------|-----------|-------+
- | |
- | |
- ZUM <-----+ +-----> ZUM
- TERMINAL COMPUTER
-
-
-#center#Abb.3: Einbau des MUFIs in den Terminalkanal
-#page#
-Die Verschaltung der V24-Kabel ist in der Bedienungsanleitung zum MUFI erläutert,
-ggf. können Sie entsprechende Kabel von der Firma BICOS beziehen.
-
-Wenn alle Kabelverbindungen gesteckt sind, sollten Sie auf alle Fälle erst einmal #on("b")#bei
-ausgeschaltetem MUFI#off("b")# prüfen, ob das Terminal sich noch bedienen läßt. Wenn dieses
-keine Reaktion mehr zeigt, obwohl es vorher (ohne MUFI) reibungslos funktioniert
-hat, dann haben Sie entweder ein MUFI ohne "Schnittstellen-Automatik" vor sich
-(vgl. Kapitel 4.2, Seite 15), oder an den Kabelverbindungen stimmt irgendetwas nicht.
-In diesem Fall sollten Sie noch einmal alle Anschlüsse und evtl. auch die interne
-Verschaltung der Kabel überprüfen.
-
-Schalten Sie dann das MUFI ein. Bei ebenfalls eingeschaltetem Terminal können nun
-einige Zeichen auf dem Bildschirm erscheinen, dieser Effekt ist normal. Funktioniert
-Ihr Terminal bei eingeschaltetem MUFI reibungslos, so sind alle Einstellungen richtig
-und Sie brauchen erst bei Kapitel 4.5 weiterzulesen. Andernfalls studieren Sie Kapitel
-4.4 unter Beachtung von Kapitel 4.2.1!
-
-
-#on("b")#4.2.3  MUFI als Endgerät#off("b")#
-
-Wenn Sie das MUFI als Endgerät an einer separaten seriellen Schnittstelle betreiben
-wollen, dann stecken Sie das vom Computer kommende Kabel auf den mit V24/2
-bezeichneten Stecker des MUFI.
-
-Damit ein einwandfreier Betrieb gewährleistet ist, sollten Sie einen sog. 'Kurzschluß­
-stecker' auf den dann freien Stecker V24/1 des MUFIs stecken. Haben Sie einen
-solchen nicht zur Hand, können Sie auch zwei provisorische Drahtbrücken einsetzen:
-Verbinden Sie mit zwei kleinen Drähten einmal Pin (Öffnung) 2 mit Pin 3 und
-außerdem Pin 4 mit Pin 5.
-
-Die Anpassung 'gs-Warenhaus 0: mit Kartenleser an MUFI als Endgerät' unterstützt
-standardmäßig nur den Betrieb von #on("b")#einem#off("b")# MUFI als Endgerät. Wie Sie vorgehen
-müssen, wenn Sie mehrere MUFIs in dieser Betriebsart benutzen wollen, erfahren Sie
-in Kapitel 7.
-#page#
-#on("b")#4.3  Verwendung des AKTRONIC-Adapters#off("b")#
-
-Im Gegensatz zum MUFI ist der AKTRONIC-Adapter #on("b")#nicht#off("b")# für den Einbau in einen
-Terminalkanal geeignet, sondern kann nur als Endgerät an einer separaten seriellen
-Schnittstelle betrieben werden. Bevor Sie den Adapter an eine serielle Schnittstelle an­
-schließen, sollten Sie noch die eingestellte Baud-Rate überprüfen und gegebenenfalls
-neu einstellen.
-
-Öffnen Sie dazu das Gehäuse des Adapters, indem Sie die vier Schrauben an der
-Unterseite lösen. Drehen Sie den Adapter so vor sich, daß die 25-polige D-Sub­
-miniaturbuchse von Ihnen weg zeigt. Vorn rechts sind dann zwei parallele 8-polige
-Pfostensteckerleisten sichtbar.
-
-#center#25-pol. D-Subminiatur-Stecker
-
- +---------------+
- | |
- +---+ +---+
- | +------+ |
- | | | |
- | | | |
- | | | |
- | | | |
- | +------+ |
- | +------+ |
- | | | +-------+ |
- | +------+ | | |
- | +------+ +-------+ |
- | | | +-------+ |
- | +------+ | <-|---------Jumperleiste
- | +-------+ |
- +---+ +---+
- | Baudrate |
- +---------------+
-
-
-#center#Abb.4: AKTRONIC-Adapter geöffmet
-#page#
-Auf einem Pfostensteckerpaar steckt ein 'Jumper', der gegebenenfalls (passend zu
-der Schnittstellen-Konfiguration im Computer, vgl. Kapitel 4.4) umgesteckt werden
-muß.
-
- +---------+
- | ζ ζ | 300
- | ζ ζ | 600
- | ζ ζ | 1200
- | ζ ζ | 2400
- | ζ ζ | 4800
- | ζ ζ | 9600
- Jumper > | ζ ζ | 19200
- | ζ ζ | 38400
- +---------+
- Baudrate
-
-
-#center#Abb.5: Mögliche Jumperposition beim AKTRONIC-Adapter
-
-
-Am Adapter ist ein Kabel mit 25-poligem D-Subminiaturstecker bereits fest montiert.
-Sollte der Stecker nicht an Ihren Rechner passen, so müßten Sie ein entsprechendes
-Adapterkabel basteln oder kaufen.
-
-Die Anpassung 'gs-Warenhaus 0: mit Kartenleser an AKTRONIC-Adapter' unterstützt
-standardmäßig nur den Betrieb von #on("b")#einem#off("b")# Adapter. Wie Sie vorgehen müssen, wenn
-Sie mehrere dieser Adapter benutzen wollen, erfahren Sie in Kapitel 7.
-
-
-#on("b")#4.4  Konfiguration der seriellen Schnittstelle#off("b")#
-
-Sie müssen nun noch dafür Sorge tragen, daß die Einstellungen am MUFI bzw. am
-AKTRONIC-Adapter mit den Einstellungen im Computer übereinstimmen.
-#page#
-Koppeln Sie dazu die Task 'configurator' an Ihr Terminal an (mit 'continue
-("configurator") <RETURN>') und geben Sie dann das Kommando 'configurate
-<RETURN>'. Für alle vorhandenen Kanäle werden Sie nun nacheinander gefragt,
-ob Sie eine Konfiguration vornehmen wollen. Bei den "interessanten" Kanälen ant­
-worten Sie mit 'ja' (<j>). Wollen Sie sich nur die aktuelle Konfiguration ansehen, so
-beantworten Sie alle weiterhin gestellten Fragen zu diesem Kanal mit 'ja' (<j>),
-dann bleibt die aktuelle Einstellung erhalten. (Der Konfigurationsdialog ist im
-EUMEL-Systemhandbuch auf den Seiten 6 - 8 detailliert beschrieben.)
-
-Benutzen Sie ein MUFI, so müssen auf alle Fälle #on("b")#8 Datenbits#off("b")# und #on("b")#1 Stopbit#off("b")# einge­
-stellt sein und außerdem je nach DIP-Schalter-Stellung im MUFI (vgl. Kapitel 4.2.1)
-9600 oder 19200 Baud sowie 'no parity' oder 'even parity'.
-
-Benutzen Sie das MUFI im Terminalkanal, so müssen Sie bei einer eventuellen
-Änderung der Konfiguration an diesen Stellen auch das entsprechende Terminal auf
-diese Werte einstellen!
-
-Bei der Verwendung des MUFIs als Endgerät muß der Kanal, an den das MUFI ange­
-schlossen wird, darüberhinaus unbedingt auf die Betriebsarten
-
-#center#transparent und RTS/CTS-Protokoll
-
-eingestellt werden.
-
-Verwenden Sie einen AKTRONIC-Adapter, so müssen für den entsprechenden Kanal
-folgende Konfigurationsmerkmale eingestellt werden:
-
-#center#transparent, 8 Bit, 2 Stopbit, #on("b")#kein#off("b")# Protokoll
-
-Die Baud-Rate ist gemäß der Jumper-Position im Adapter (vgl. Kapitel 4.3) einzu­
-stellen.
-
-
-
-#on("b")#4.5  Verbindung der Hardware-Komponenten#off("b")#
-
-Der Anschluß des Kartenlesers an den MODUL-BUS-Steckplatz ist denkbar einfach:
-Stecken Sie den 8-poligen Platinenstecker des Codekartenlesers in die Buchse des
-Digital-Einganges der Steckkarte bzw. Compact-Box und den 3-poligen Platinen­
-stecker in die passende Spannungsversorgungsbuchse (12 V) am Steckplatz bzw. auf
-der Compact-Box, fertig. Bei eingeschalteter Betriebsspannung muß nun der Code­
-kartenleser beleuchtet sein. (Falls Sie einen Mehrfachsteckplatz benutzen, benötigen
-Sie ein passendes Netzteil für diesen Steckplatz! Achten Sie auch darauf, daß in
-diesem Fall die Kombi- oder E/A-Karte in Steckplatz (Slot) 1 installiert ist.)
-
-Nun müssen Sie noch die Verbindung zu dem verwendeten Adapter herstellen. Dabei
-ist es gleichgültig, ob Sie eine Compact-Box, einen Einzel- oder einen Mehrfachsteck­
-platz benutzen, denn alle diese Geräte verfügen über ein Anschlußkabel mit dem
-gleichen 25-poligen Stecker.
-
-Den AKTRONIC-Adapter können Sie damit direkt an den Steckplatz anschließen,
-denn er verfügt bereits über eine entsprechende 25-polige Buchse. Hier müssen Sie
-dann nur noch die Stromversorgung des Adapters sichern, indem Sie das Kabel mit
-dem 3-poligen Platinenstecker in die passende Spannungsversorgungsbuchse (12 V)
-am Steckplatz oder auf der Compact-Box stecken. (Damit Codekartenleser und
-Adapter hier gleichzeitig versorgt werden können, ist in den Stecker eine Verzweigung
-eingebaut.)
-
-Für das MUFI benötigen Sie ein weiteres Kabel, das an einem Ende einen 36-poligen
-Centronics-Stecker besitzt und an dem anderen einen 25-poligen D-Subminiatur­
-stecker (von der Firma BICOS zu beziehen).
-
-Zum Ausprobieren des Kartenlesers benutzen Sie am besten die Menupunkte
-'Dezimalwert lesen' und 'Bitmuster lesen' unter dem Oberbegriff 'Kommandos' des
-Warenhaus-Menus. Eine Beschreibung dieser Punkte finden Sie in Kapitel 5.4.
-
-
-
-
-
-
-
-
-
-
diff --git a/doc/warenhaus/gs-Warenhaus-5 b/doc/warenhaus/gs-Warenhaus-5
deleted file mode 100644
index c1164ad..0000000
--- a/doc/warenhaus/gs-Warenhaus-5
+++ /dev/null
@@ -1,1468 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (20)#
-#headodd#
-#center#gs-Warenhaus#right#%
-
-#end#
-#headeven#
-%#center#gs-Warenhaus
-
-#end#
-#center#1
-
-#center##on("b")#5  Beschreibung der Menufunktionen#off("b")#
-
-
-Nach Aufruf meldet sich #on("b")#gs-Warenhaus#off("b")# zunächst mit dem #on("b")#gs-DIALOG#off("b")#-Emblem
-(vgl. Kapitel 3.3). Kurze Zeit später erscheint das WARENHAUS-Eingangsmenu auf
-dem Bildschirm:
-
- +------------------------------------------------------------------------+
- | WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv|
- |------------------------------------------------------------------------|
- | | b  Befehlsvorrat | |
- | | ------------------ | |
- | | a  Artikeldaten | |
- | | k  Kundendaten | |
- | +--------------------+ |
- | |
- | |
- | |
- |------------------------------------------------------------------------+
- | |
- | Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> |
- +------------------------------------------------------------------------+
-
-#off("b")#
-
-
-Bevor wir Ihnen die Bedeutung der einzelnen Menu-Punkte erklären, geben wir erst
-noch einige grundsätzliche Hinweise zur Bedienung des Menus für diejenigen Leser,
-die im Umgang mit Menus unter #on("b")#gs-DIALOG#off("b")# nicht geübt sind.
-
-
-
-#on("b")#5.1  Kurzhinweise zur Bedienung des Menus#off("b")#
-
-Die Bedienung des Menus ist sehr einfach. Eine ausführliche Beschreibung dazu
-finden Sie in den Unterlagen zum Programmsystem #on("b")#gs-DIALOG#off("b")#. An dieser Stelle
-sollen nur die wesentlichen Bedienungsvorgänge beschrieben werden.
-#page#
-- Mit der Tastenfolge <ESC><?> können Sie sich Informationen zur Bedienung
- des Menusystems in das Menu einblenden lassen
-
-- Mit den Pfeiltasten <rechts> und <links> können Sie zwischen den "Ober­
- begriffen" in der Kopfzeile wählen. Der aktuelle Oberbegriff ist jeweils invers
- dargestellt. Das ausgeklappte 'Pull-Down-Menu' bezieht sich auf diesen invers
- dargestellten Oberbegriff.
-
-- Mit den Pfeiltasten <hoch> und <runter> können Sie zwischen den Menu­
- funktionen wählen, die Ihnen im aktuellen Pull-Down-Menu zur Auswahl ange­
- boten werden. Die aktuell angewählte Menufunktion wird jeweils invers darge­
- stellt. Die Trennlinien, die in einigen Pull-Down-Menus sichtbar sind, dienen nur
- der optischen Untergliederung; sie können nicht angewählt werden und werden
- deshalb automatisch übersprungen. Die einzelnen Menupunkte sind "zyklisch
- miteinander verknüpft", das heißt, man gelangt vom untersten Menupunkt
- wieder zum obersten und umgekehrt. Menupunkte, vor denen ein Minuszeichen
- steht ('-'), sind (zur Zeit) nicht aktivierbar; auch sie können nicht angewählt
- werden und werden einfach übersprungen.
-
-- Durch Tippen der Fragezeichentaste (<?>) können Sie sich jeweils zur
- aktuellen Menufunktion (invers im Pull-Down-Menu) Informationen in das Menu
- einblenden lassen.
-
-- Um eine Menufunktion ausführen zu lassen, bewegen Sie sich mit den Pfeiltasten
- auf die gewünschte Menufunktion im aktuellen Pull-Down-Menu und tippen
- dann die <RETURN>-Taste. Steht vor dem gewünschten Menupunkt ein
- einzelner Buchstabe oder eine Ziffer, so kann durch Tippen der entsprechenden
- Taste diese Menufunktion dadurch direkt aufgerufen werden. Sobald eine Menu­
- funktion aufgerufen worden ist, erscheint davor ein Stern ('*'). Daraus können
- Sie entnehmen, daß das System bereits den Auftrag ausführt.
-
-- An verschiedenen Stellen werden Fragen an Sie gerichtet, die Sie mit 'ja' oder
- 'nein' beantworten müssen. Tippen Sie dazu entsprechend der Entscheidung die
- Taste <j> (für 'ja') bzw. <n> (für 'nein').
-
-- Werden Ihnen vom Menu aus Dateinamen zur Auswahl angeboten, so können Sie
- den auf dem Bildschirm sichtbaren Pfeil vor den gewünschten Namen
-#page#
- positionieren. Mit den Tasten <x> oder <RETURN> können Sie den Namen
- ankreuzen. Ist die Auswahl mehrerer Dateinamen möglich, so können Sie den
- Vorgang wiederholen. Mit den Tasten <o> oder <RUBOUT> können Sie auch
- ein Kreuz vor einem Namen wieder löschen. Daneben gibt es noch einige Tasten­
- funktionen, die für die Bedienung recht hilfreich sein können. Tippen Sie
- während der Auswahl die Fragezeichentaste (<?>), so werden Ihnen alle
- Bedienungsmöglichkeiten auf dem Bildschirm angezeigt. Eine Auswahl, in der
- mehrere Dateien angekreuzt werden dürfen, wird durch die Tastenfolge
- <ESC><q> verlassen. Anschließend wird die eingestellte Operation mit den
- angekreuzten Dateien ausgeführt. Sind Sie versehentlich in eine solche Auswahl
- gelangt, so können Sie den Vorgang durch die Tastenkombination <ESC><h>
- abbrechen.
-
-- An einigen Stellen werden Sie aufgefordert, eine Eingabe zu machen (z.B. einen
- Dateinamen einzugeben). Wird Ihnen hier ein Vorschlag gemacht, den Sie
- akzeptieren, so brauchen Sie zur Bestätigung nur die <RETURN>-Taste zu
- tippen. Gefällt Ihnen der Vorschlag nicht oder wird Ihnen kein Vorschlag
- gemacht, so machen Sie bitte die gewünschte Eingabe. Zum Schreiben stehen
- Ihnen alle aus dem Editor bekannten Funktionen zur Verfügung. Mit der Taste
- <RUBOUT> können Sie Buchstaben löschen, mit <RUBIN> einfügen. Die
- Eingabe wird durch Tippen der <RETURN>-Taste abgeschlossen. Ist der von
- Ihnen gewünschte Name schon in Ihrer Task vorhanden und steht in der Fußzeile
- der Hinweis 'Zeigen: <ESC><z>', dann können Sie sich auch alle vor­
- handenen Namen zur Auswahl anbieten lassen und durch Ankreuzen den beab­
- sichtigten Namen auswählen.
-
-- Ihnen können auch mehrere Alternativen angeboten werden, zwischen denen Sie
- wählen müssen. In der untersten Zeile eines solchen Kastens, in denen Ihnen die
- Alternativen auf dem Bildschirm eingeblendet werden, sind die Möglichkeiten
- aufgeführt, die darüber beschrieben sind. Mit den Pfeiltasten können sie die
- Markierung auf die gewünschte Alternative positionieren und dann durch die
- <RETURN>-Taste zur Ausführung bringen. (Manchmal ist das auch durch
- Tippen der den Alternativen vorangestellten Buchstaben oder Ziffern möglich).
-#page#
-- Durch die Tastenfolge <ESC><q> kann das Menu insgesamt verlassen
- werden. Damit das nicht versehentlich geschieht, wird jeweils die Frage gestellt,
- ob Sie das Menu tatsächlich verlassen wollen. Diese Frage beantworten Sie bitte je
- nach Wunsch mit 'ja' oder 'nein' durch Tippen der Tasten <j> bzw. <n>.
-
-
-#on("b")#5.2  Menufunktionen zum Oberbegriff 'Info'#off("b")#
-
-Das auf dem Bildschirm sichtbare Pull-Down-Menu ist bereits oben abgebildet.
-
-#on("b")#b Befehlsvorrat#off("b")#
-
- Mit dieser Funktion können Sie sich die Befehle, die Ihnen von der jeweils
- eingestellten Programmierumgebung zur Verfügung gestellt werden, auf dem
- Bildschirm anzeigen lassen. Anhand dieser Informationen können Sie auch
- feststellen, ob in dem System, das Ihnen zur Verfügung steht, die 'GRIN-
- Version' oder die 'ELAN-Version' eingestellt ist.
-
- Je nach Version gelangen Sie zunächst in eines der folgenden beiden Auswahl­
- menus:
-#on("b")#
- GRIN-Version:
-
-
- +-------------------------------------------------+
- | d   Datei - Bearbeitung |
- | e   Einkaufen und Auskunft |
- | k   Kontroll - Strukturen |
- | |
- | z   Zurück zum Hauptmenü |
- | |
- | Datei   Kaufen/Auskunft   Kontroll   Zurück |
- | |
- +-------------------------------------------------+
-#off("b")#
-#page#
-#on("b")#
- ELAN-Version:
-
- +-------------------------------------------------+
- | d   Datei - Bearbeitung |
- | e   Einkaufen und Auskunft |
- | s   Sonstige Befehle |
- | |
- | z   Zurück zum Hauptmenü |
- | |
- | Datei   Kaufen/Auskunft   Sonstige   Zurück |
- | |
- +-------------------------------------------------+
-
-#off("b")#
-
- Von hier aus können Sie zu jedem dort angegebenen Bereich eine Informa­
- tionstafel abrufen.
-
- Aus jeder dieser Tafeln gelangen Sie wieder in die Auswahl zurück. Verlassen
- Sie die Auswahl selbst, gelangen Sie zurück ins Ausgangsmenu.
-
-
-#on("b")#a Artikeldaten#off("b")#
-
- Bei Aktivierung dieses Menupunktes erhalten Sie eine Kurzinformation über
- Aufbau und Umfang der Artikeldaten:
-#on("b")#
- +-------------------------------------------------------+
- | Ein Satz 'Artikeldaten' besteht aus: |
- | |
- | Artikelname |
- | Preis |
- | Mindestbestand |
- | Bestand |
- | |
- | Es können Daten für maximal 15 Artikel gespeichert |
- | werden. Die zugehörigen Artikelnummern sind 1...15. |
- | |
- +-------------------------------------------------------+
-
-
-#off("b")#
-
- In allen Filialen müssen zu einer Artikelnummer stets der Artikelname und
- Preis identisch sein, Bestand und Mindestbestand können beliebig gewählt
- werden. Artikeldateien werden nur in den jeweiligen Filialen gehalten und
- nicht in der Zentrale.
-#page#
- Gegenüber der Soester Warenhaus-Version sind Artikeldaten um den Punkt
- 'Mindestbestand' erweitert worden, weil sich damit unserer Meinung nach eine
- realistischere Nachbestellung realisieren läßt (vgl. auch Kapitel 5.4, 'Nachbe­
- stellen').
-
- Sollte Ihnen der Umfang des Warensortiments mit maximal 15 verschiedenen
- Artikeln sehr gering vorkommen, so denken Sie bitte daran, daß die Artikel­
- daten an jedem Arbeitsplatz erst einmal eingegeben werden müssen, was bei
- Computer-Anfängern recht lange dauert. Außerdem kommt es nur bei einem
- genügend kleinen Sortiment zu den methodisch-didaktisch erwünschten
- Einkaufshäufungen bei bestimmten Produkten.
-
-
-#on("b")#k Kundendaten#off("b")#
-
- Bei Aktivierung dieses Menupunktes erhalten Sie eine Kurzinformation über
- Aufbau und Umfang der Kundendaten:
-#on("b")#
- +----------------------------------------------------------+
- | Nachname |
- | Vorname |
- | Geschlecht |
- | |
- | Es können Daten für maxomal 31 Kunden gespeichert |
- | werden. Die zugehörigen Kundennummern sind 129...159. |
- | |
- +----------------------------------------------------------+
-#off("b")#
-
- Die Zuordnung Kundennummer ---> Kunde muß in allen Filialen gleich sein.
- Kundendateien werden von jeder Filiale und von der Zentrale geführt.
-
- Gegenüber der Soester Warenhaus-Version sind Kundendaten um die Punkte
- 'Nachname' und 'Geschlecht' erweitert worden, um dem Begriff Kunden#on("b")#daten#off("b")#
- etwas gerechter zu werden. Die maximale Kundenanzahl von 31 entspricht
- etwa der Größe einer Klasse.
-#page#
-#on("b")#5.3  Menufunktionen zum Oberbegriff 'Eingabeart'#off("b")#
-
-Die Funktionen unter diesem Oberbegriff sind nur dann für Sie interessant, wenn Sie
-einen Codekartenleser verwenden.
-#on("b")#
-+-------------------------------------------------------------------------+
-| WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv |
-|-------------+-----------------+-----------------------------------------|
-| | *  Anzeigen | |
-| | --------------- | |
-| | k  Kartenleser | |
-| | t  Tastatur | |
-| +-----------------+ |
-| |
-| |
-| +------------------------+ |
-| | Die Eingabeart ist auf | |
-| | | |
-| | Tastatur | |
-| | | |
-| | eingestellt | |
-| +------------------------+ |
-|-------------------------------------------------------------------------|
-| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> |
-+-------------------------------------------------------------------------+
-#off("b")#
-
-#on("b")#a Anzeigen#off("b")#
-
- Es wird die momentan eingestellte Eingabeart angezeigt. Möglich sind die
- Eingabearten #on("b")#Tastatur#off("b")# und #on("b")#Kartenleser#off("b")#. Die Standardeinstellung ist
- 'Tastatur'!
-
-
-#on("b")#k Kartenleser#off("b")#
-
- Die Eingabeart 'Kartenleser' wird eingestellt. Alle Artikelnummern, Kunden­
- nummern und sonstige Codenummern (für Auskünfte) können danach nur
- über den Kartenleser eingegeben werden.
-#page#
- Diese Eingabeart kann nur eingestellt werden, wenn ein Kartenleser mit
- funktionstüchtigem Interface angeschlossen ist. Sonst erfolgt eine ent­
- sprechende Fehlermeldung.
-
- Fehlerfälle:
-
- - Kein Interface vorhanden!
- Ursache: Bei der Installation von #on("b")#gs-Warenhaus#off("b")# wurde angegeben, daß
- kein Kartenleser benutzt werden soll.
-
- - Interface meldet sich nicht!
- Abhilfe: Überprüfen, ob der Adapter ordnungsgemäß angeschlossen und
- eingeschaltet ist (vgl. Kapitel 4). Notfalls Eingabeart auf
- 'Tastatur' schalten; wenn ein MUFI verwendet wird, MUFI aus-
- und nach kleiner Pause wieder einschalten; noch einmal die
- Eingabe 'Kartenleser' anwählen.
-
- - TASK für Interface ist besetzt!
- (Kann nur beim Betrieb von MUFI als Endgerät oder bei AKTRONIC-Adapter
- auftreten.)
- Abhilfe: Wenn irgendeine andere Task die Eingabeart 'Kartenleser' ein­
- gestellt hat, dort auf 'Tastatur' umstellen.
-
- - Interface-Kanal belegt!
- (Kann nur beim Betrieb von MUFI als Endgerät oder bei AKTRONIC-Adapter
- auftreten.)
- Abhilfe: Feststellen, welche Task an den Interface-Kanal angekoppelt ist
- ('taskinfo (2)'), und diese dann abmelden ('break' oder 'end').
- Die Nummer des Interface-Kanals kann mit dem Befehl 'put
- (interfacekanal)' erfragt werden.
-
- - TASK für Interface existiert nicht!
- (Kann nur beim Betrieb von MUFI als Endgerät oder bei AKTRONIC-Adapter
- auftreten.)
- Abhilfe: Task löschen; in der Vatertask das Kommando 'init interface­
- channel' geben; Task neu anmelden.
-#page#
-#on("b")#t Tastatur#off("b")#
-
- Die Eingabeart 'Tastatur' wird eingestellt. Alle Artikelnummern, Kunden­
- nummern und sonstige Codenummern (für Auskünfte) können danach nur
- über die Tastatur eingegeben werden. Ein etwa angeschlossener Codekarten­
- leser ist bei dieser Einstellung nicht mehr ansprechbar.
-
-
-
-#on("b")#5.4  Menufunktionen zum Oberbegriff 'Kommandos'#off("b")#
-
-Dieses ist das zentrale Menu für den Benutzer von #on("b")#gs-Warenhaus#off("b")#. Unter diesem
-Oberbegriff finden Sie alle Funktionen, die notwendig sind, um die Abläufe innerhalb
-des Modell-Warenhauses zu simulieren. (Die angebotenen Menufunktionen ent­
-sprechen etwa den "Direktbefehlen" der Soester Software.)
-#on("b")#
-+-------------------------------------------------------------------------+
-| WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv |
-|---------------------+-------------------------------+-------------------|
-| | w   Warendatei bearbeiten | |
-| | k   Kundendatei bearbeiten | |
-| | -------------------------- | |
-| | e   Einkaufen | |
-| | -------------------------- | |
-| | a   Auskunft einholen | |
-| | n   Nachbestellen | |
-| | -------------------------- | |
-| | -   Dezimalwert lesen | |
-| | -   Bitmuster lesen | |
-| +-------------------------------+ |
-| |
-|-------------------------------------------------------------------------|
-| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>|
-+-------------------------------------------------------------------------+
-#off("b")#
-
-Wird im Unterricht kein Kartenleser benutzt, so sind die eingegeben Daten völlig
-ungeschützt. Vor allem bei der Kundendatei muß sichergestellt werden, daß dort
-#page#
-keine unsinnigen Eintragungen oder Änderungen vorgenommen werden, da alle
-Neueintragungen und Änderungen in dieser Datei auch in der Warenhaus-Zentrale
-wirksam werden und von dort aus auf Anfrage jeder Filiale mitgeteilt werden.
-Korrekturen können dadurch sehr mühsam werden. Natürlich sind ohne Kartenleser
-(und dem damit verbundenen 'Ausweis' Codekarte) auch jederzeit Einkäufe mit jeder
-beliebigen Kundennummer möglich. Auch hier sollten Sie etwaigem Mißbrauch
-vorbeugen.
-
-
-#on("b")#w Warendatei bearbeiten#off("b")#
-
- Hiermit kann die Warendatei der Filiale aufgebaut und verändert werden. Der
- Bildschirm sieht dabei wie folgt aus:
-#on("b")#
-+------------------------------------------------------------------------+
-|WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv |
-|-----------------------------------+------------------------------------|
-| | Artikelnummer : 1 |
-| | |
-| | |
-| | Artikelname : Bier (Kasten)|
-| | |
-| | Preis : 16.85 |
-| | |
-| | Mindestbestand : 25 |
-| | |
-| | Bestand : 20 |
-| | |
-| | |
-| | Alles richtig ? |
-| | |
-| | Ja    Nein |
-|-----------------------------------+------------------------------------|
-| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> |
-+------------------------------------------------------------------------+
-#off("b")#
-
- Zunächst muß eine Artikelnummer (1...15) eingegeben werden (je nach
- Einstellung über die Tastatur oder mittels einer Warenkarte über den Code­
- kartenleser). Unzulässige Artikelnummern werden dabei nicht akzeptiert.
-#page#
- Ist unter dieser Nummer bereits ein Artikel gespeichert, so werden die ent­
- sprechenden Artikeldaten in dem rechten oberen Bildschirmfenster gezeigt
- und können dort geändert oder einfach übernommen werden. Gibt es noch
- keinen Artikel mit dieser Nummer, so sind neue Artikeldaten einzugeben.
-
- Dieser Vorgang wird solange wiederholt, bis bei der Eingabe der Artikelnummer
- die Tastenfolge <ESC><q> gedrückt wird.
-
- Achten Sie darauf, daß in jeder Filiale der zu einer Artikelnummer gehörige
- Artikel stets denselben Artikelnamen und -preis erhält. Bestand und Mindest­
- bestand können unterschiedlich sein.
-
-
-#on("b")#k Kundendatei bearbeiten#off("b")#
-
- Hiermit kann die Kundendatei der Filiale aufgebaut und verändert werden.
- Ähnlich wie bei der Funktion 'Warendatei bearbeiten' erfolgen die Eingaben im
- rechten oberen Bildschirmfenster.
-
- Zunächst muß eine Kundennummer (129...159) eingegeben werden (je nach
- Einstellung über die Tastatur oder mittels einer Kundenkarte über den Code­
- kartenleser). Unzulässige Kundennummern werden dabei nicht akzeptiert.
-
- Ist unter dieser Nummer bereits ein Kunde in der Filiale oder in der Zentrale
- gespeichert, so werden die entsprechenden Kundendaten in dem rechten
- oberen Bildschirmfenster gezeigt und können dort geändert oder einfach über­
- nommen werden. Gibt es noch keinen Kunden mit dieser Nummer, so sind
- neue Kundendaten einzugeben. (Neueingaben und Änderungen werden sofort
- der Zentrale, aber nicht automatisch den andern Filialen mitgeteilt!)
-
- Dieser Vorgang wird solange wiederholt, bis bei der Eingabe der Kunden­
- nummer die Tastenfolge <ESC><q> gedrückt wird.
-#page#
-#on("b")#e Einkaufen#off("b")#
-
- Zunächst wird eine Kundennummer (129...159) erfragt. Wird die Nummer
- eines Kunden eingegeben, dessen Daten in der Filiale oder Zentrale bereits
- gespeichert sind, so erscheint im linken Bildschirmfenster der Rechnungskopf
- mit dem Namen des Kunden. Ist unter der Nummer noch kein Kunde einge­
- tragen oder wird die Eingabe der Kundennummer durch die Tastenfolge
- <ESC><q> abgebrochen, so enthält der Rechnungskopf keinen Kunden­
- namen.
-
- Das eigentliche Einkaufen erfolgt nun durch die Eingabe von Artikelnummern
- (1...15). Der zugehörige Artikelname und der Preis werden daraufhin in die
- Rechnung eingetragen.
-#on("b")#
-+------------------------------------------------------------------------+
-|WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv |
-|----------------------------------+-------------------------------------|
-| RECHNUNG für Herrn B. Pollok | Artikelnummer :  1 |
-| | |
-| Bier (Kasten) 16.85 | |
-| Tageszeitung 0.80 | |
-| Pflaster 2.39 | |
-| Mehl 0.79 | |
-| Seife 1.80 | |
-| Weinbrand 12.75 | |
-| Zigaretten 3.80 | |
-| Brot 2.29 | |
-| Schallplatte 19.90 | |
-| Geodreieck 2.35 |-------------------------------------|
-| Videokassette 12.75 | Artikelnummer eingeben |
-| Schulheft 0.85 | |
-| | Stoptaste:  <ESC><q> |
-|----------------------------------+-------------------------------------|
-| Einkaufen |
-+------------------------------------------------------------------------+
-#off("b")# |
-
- Dieser Vorgang wird solange wiederholt, bis die Eingabe einer Artikelnummer
- durch Tippen der Tastenfolge <ESC><q> abgebrochen wird.
-
- Abschließend wird der Rechnungsgesamtbetrag ausgegeben und gefragt, ob die
- Rechnung gedruckt werden soll.
-#page#
-#on("b")#a Auskunft einholen#off("b")#
-
- Mit Hilfe dieses Kommandos lassen sich nach Einlesen einer Codenummer (je
- nach Einstellung über Tastatur oder Codekartenleser) verschiedene Auskünfte
- über die gespeicherten Daten abrufen. Es können #on("b")#Einzelauskünfte#off("b")# oder
- #on("b")#Listenauskünfte#off("b")# eingeholt werden. Bei Eingabe einer falschen Nummer wird
- die Auskunft abgebrochen!
-
-
- #on("b")#Einzelauskünfte:#off("b")#
-
- Codenummern 1...15 (Artikelnummern):
- Die zugehörigen Artikeldaten werden im rechten oberen Bild­
- schirmfenster angezeigt.
-
- Codenummern 129...159 (Kundennummern):
- Die zugehörigen Kundendaten werden im rechten oberen
- Bildschirmfenster angezeigt.
-
-
- #on("b")#Listenauskünfte:#off("b")#
-
- Hierbei liefern jeweils 3 benachbarte Codenummern von der Art her ähnliche
- Auskunfts-Listen, die auf Wunsch auch ausgedruckt werden können. Die
- mittlere Nummer bezieht die Auskünfte stets auf die eigene Filiale; die beiden
- anderen sind nur effizient, wenn mehrere Filialen angemeldet sind. Dabei
- werden bei Eingabe der linken Nummer die jeweiligen Daten #on("b")#aller#off("b")# Filialen
- 'aufaddiert' und in #on("b")#einer#off("b")# Gesamtliste ausgegeben. Bei Eingabe der rechten
- Nummer hingegen werden die jeweiligen Listen von allen angeschlossenen
- Filialen der Reihe nach abgerufen und #on("b")#hintereinander#off("b")# in eine Datei ge­
- schrieben, sodaß man eine Zusammenstellung der entsprechenden #on("b")#Einzel#off("b")#-
- Listen der Filialen erhält:
-#page#
- Codenummern 66, 67, 68:
- Die bisherigen Verkaufszahlen der einzelnen Waren werden
- gezeigt; die Listen sind sortiert nach diesen Zahlen ('Ver­
- kaufs-Hitlisten').
-
- Codenummern 73, 74, 75:
- Nach Eingabe einer Artikelnummer wird eine Liste aller
- Käufer dieses Artikels ausgegeben.
-
- Codenummern 77, 78, 79:
- Diese Codes liefern Kundenlisten der Filialen.
-
- Codenummern 84, 85, 86:
- Nach Eingabe einer Kundennummer wird eine Liste aller von
- diesem Kunden gekauften Artikel ausgegeben.
-
- Codenummern 89, 90, 91:
- Diese Codes liefern die Lagerbestandslisten der Filialen. Sollte
- sich bei der Auskunft '90' herausstellen, daß der Bestand
- mehrerer Artikel unter den Mindestbestand abgesunken ist, ist
- es sinnvoll, als nächstes den Menupunkt 'Nachbestellen'
- anzuwählen (s.u.).
-#page#
- Beispiel: Der Code '90' liefert bei entsprechend eingegebener Warendatei
- folgende Auskunft:
-#on("b")#
- +------------------------------------------------------------------------+
- | ............. Auskunft: Filiale 1 ................... Zeile 1 |
- | |
- | Lagerübersicht: |
- | ---------------------------------------------------------------------- |
- | ---------------------------------------------------------------------- |
- | | Art.Nr.| Artikelname | Preis | Min.Best. | Bestand | |
- | ---+---------+------------------+-------------+-----------+----------+ |
- | | | | | | | |
- | | 1 | Bier (Kasten) | 16.85 | 25 | 19 | |
- | | 2 | Tageszeitung | 0.80 | 15 | 16 | |
- | | 3 | Pflaster | 2.39 | 14 | 22 | |
- | | 4 | Mehl | 0.79 | 32 | 58 | |
- | | 5 | Seife | 1.80 | 27 | 49 | |
- | | 6 | Weinbrand | 12.75 | 24 | 41 | |
- | | 7 | Zigaretten | 4 +------------+--------+ | |
- | | 8 | Brot | 2 | Auskunft drucken ?| | |
- | | 9 | EMMA | 3 | | | |
- | | 10 | Schallplatte | 19 | Ja     Nein | | |
- | | 11 | Geodreieck | 2 +---------------------+ | |
- | | | | | | |
- | | | | | | |
- | | | | | | |
- |----------------------------------------------------------------------- |
- | | Ändern: <Pfeile>   Bestätigen: <RETURN> |
- + -----------------------------------------------------------------------+
-
-#off("b")#
-
- Hinweis: Nur die zu den jeweils mittleren Codenummern gehörigen Aus­
- kunftsfunktionen arbeiten mit Daten, die in der eigenen Task
- gespeichert sind. Bei den übrigen Auskünften müssen Daten aus
- anderen Filialverwaltungs-Tasks oder der Zentrale geholt werden,
- so daß die Erstellung solch einer Auskunft recht zeitaufwendig ist.
- Um zu lange Wartezeiten zu vermeiden, sollten nicht mehrere
- Filialen gleichzeitig Auskünfte dieser Art einholen.
-#page#
-#on("b")#n Nachbestellen#off("b")#
-
- Auf dem Bildschirm wird eine Bestelliste ausgegeben, die alle Artikel enthält,
- deren Bestand innerhalb der Filiale den Mindestbestand unterschritten hat.
-
- Die Nachbestellung ist so bemessen, daß diese Artikel wieder mit ihrem
- doppelten Mindestbestand vorrätig sind. Die neuen Bestände werden auto­
- matisch in die Warendatei der Filiale eingetragen.
-
- Auf Wunsch kann die Bestelliste ausgedruckt werden.
-
-
-#on("b")#d Dezimalwert lesen#off("b")#
-
- Der aktuelle Wert, der vom Codekartenleser gelesen wird, wird (ähnlich wie bei
- 'Bitmuster lesen', s.u.) auf dem Bildschirm ausgegeben, bis <ESC><q>
- gedrückt wird. Mit Hilfe dieses Kommandos kann man z.B. die Funktion des
- Codekartenlesers testen und den Zusammenhang zwischen Bitmuster und
- Dezimalwert klären.
-
- Dieser Menupunkt ist (ebenso wie der nächste) nur dann aufrufbar, wenn
- unter #on("b")#Eingabeart#off("b")# der #on("b")#Kartenleser#off("b")# eingestellt ist.
-
-
-#on("b")#b Bitmuster lesen#off("b")#
-
- Dieser Menupunkt ist nur dann aufrufbar, wenn unter #on("b")#Eingabeart#off("b")# der
- #on("b")#Kartenleser#off("b")# eingestellt ist (vgl. Kapitel 5.3).
-
- Ist das der Fall, so wird hier das aktuelle Bitmuster, das vom Codekartenleser
- gelesen wird, auf dem Bildschirm ausgegeben, bis <ESC><q> gedrückt
- wird.
-#on("b")#
-+-------------------------------------------------------------------------+
-| WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv |
-|-----------------------------------+-------------------------------------|
-| | |
-| | |
-| | Bitmuster :    0I00III0 |
-| | |
-| | |
-| | |
-| | |
-| | |
-| | |
-| | |
-| | |
-| | |
-| | Lesen beenden mit <ESC><q> |
-| +-------------------------------------|
-| |
-| Bitmuster lesen |
-+-------------------------------------------------------------------------+
-#off("b")#
-
- Ein Bitmuster besteht aus 8 Zeichen (z.B. 'OIOOIIIO'). Dabei zeigt jedes 'I' ein
- Loch an der entsprechenden Stelle der Codekarte an, die sich gerade im
- Kartenlesegerät befindet. Dieses Bitmuster entspricht der Dualzahl 01001110
- (im 'Zweiersystem'); zu ihr gehört die Dezimalzahl
-#on("b")#
-
- 0 * 128 + 1 * 64 + 0 * 32 + 0 * 16 + 1 * 8 + 1 * 4 + 1 * 2 + 0 * 1 = 78.
-#off("b")#
-
- Mit Hilfe dieses Kommandos können Sie z.B. die Funktion des Codekarten­
- lesers testen. Bei voller Beleuchtung aller 8 Sensoren muß das Bitmuster
- 'IIIIIIII' geliefert werden. Decken Sie einige Sensoren mit den Fingern oder
- einer Lochkarte ab, so muß sich das Bitmuster auf dem Bildschirm ent­
- sprechend verändern. Ist das nicht der Fall, so liegt ein Fehler vor.
-
- Prüfen Sie dann erst einmal, ob der Steckplatz mit Strom versorgt wird (Netz­
- kabel in der Steckdose? Compact-Box mit Netzteil richtig verbunden?) Ist dort
- alles in Ordnung, so könnte der Fehler noch in der Verbindung zum Adapter
- liegen. (Steckplatz ordnungsgemäß mit Adapter verbunden? Richtiges Kabel
- verwendet?)
-#page#
- Sollten Sie auf diese Weise nicht zum Erfolg kommen, so verlassen Sie diesen
- Menupunkt und wählen noch einmal den Oberbegriff 'Eingabeart' an. Stellen
- Sie dort die Eingabeart zunächst auf 'Tastatur um' und dann wieder auf
- 'Kartenleser'. Treten hier Fehlermeldungen auf, so lesen Sie in Kapitel 5.3
- nach. Läßt sich die Umstellung dagegen problemlos vornehmen, so müßte nun
- auch das 'Bitmuster lesen' wieder funktionieren.
-
-
-#on("b")#5.5  Menufunktionen zum Oberbegriff 'Programme'#off("b")#
-
-#on("b")#
-+-------------------------------------------------------------------------+
-| WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv |
-|---------------------+----------------------+----------------------------|
-| | n  Neu erstellen | |
-| | a  Ansehen/Ändern | |
-| | ------------------ | |
-| | s  Starten | |
-| | w  Wiederholen | |
-| | ------------------ | |
-| | v  Verzeichnis | |
-| | ------------------ | |
-| | l  Löschen | |
-| | d  Drucken | |
-| | ------------------ | |
-| | k  Kopieren | |
-| | u  Umbenennen | |
-| +----------------------+ |
-|-------------------------------------------------------------------------|
-| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> |
-+-------------------------------------------------------------------------+
-#off("b")#
-
-#on("b")#n Neu erstellen#off("b")#
-
- Mit dieser Funktion können Sie eine neue Programmdatei anlegen und
- beschreiben.
-
- Sie werden zunächst nach einem Namen für die #on("b")#neue#off("b")# Programmdatei gefragt.
- Geben Sie einen beliebigen Namen (#on("b")#ohne Anführungszeichen (!)#off("b")#) ein und
-#page#
- schließen Sie die Eingabe durch <RETURN> ab. Daraufhin wird Ihnen auf
- dem Bildschirm eine neue Datei zum Beschreiben angeboten.
-
- Sollte schon eine Programmdatei mit diesem Namen in der Task vorhanden
- sein, so werden Sie darauf aufmerksam gemacht.
-
- Sie können sich während des Schreibens die wichtigsten Tastenfunktionen des
- Editors einblenden lassen. Tippen Sie dazu die Tastenfolge <ESC><?>. Es
- erscheint dann das folgende Angebot aus dem Sie auswählen können:
-
-#on("b")#
- +-----------------------------------------------------+
- | Der EUMEL - Editor |
- | |
- | b ... Beschreibung desEditors |
- | w ... Wichtige Tasten |
- | p ... Positionieren der Schreibmarke |
- | k ... Korrigieren im Text (Einfügen/Löschen) |
- | m ... Markierte Textpassagen bearbeiten |
- | l ... Lernen im Editor |
- | a ... Anweisungen im Editor (Kommandodialog) |
- | |
- | z ... Zurück in den Schreibmodus |
- | |
- | b   w   p   k   m   l   a   z |
- | |
- +-----------------------------------------------------+
-#off("b")#
- Fehlerfälle:
- - Eine Programm-Datei mit dem vorgeschlagenen Namen existiert schon.
-
-
-#on("b")#a Ansehen/ändern#off("b")#
-
- Mit dieser Funktion können Sie sich Dateien, die schon in Ihrer Task
- existieren, ansehen oder auch verändern.
-
- Sie werden zunächst gefragt, ob Sie #on("b")#die zuletzt bearbeitete Programmdatei#off("b")#
- ansehen bzw. verändern möchten (sofern Sie schon vorher mit #on("b")#gs-Warenhaus#off("b")#
- in der Task gearbeitet haben).
-#page#
- Bejahen Sie diese Frage, dann wird Ihnen diese Programmdatei zur Bear­
- beitung angeboten. Verneinen Sie die Frage dagegen, so gelangen Sie in die
- 'Auswahl' (d.h es werden Ihnen alle Programmdateien in der Task zur Auswahl
- angeboten). Nachdem Sie einen der Namen angekreuzt haben, wird Ihnen die
- ausgewählte Programmdatei zur Bearbeitung auf dem Bildschirm angeboten.
-
- Fehlerfälle:
- - In der Task existiert noch keine Programmdatei.
-
-
-#on("b")#s Starten#off("b")#
-
- Mit dieser Menufunktion können Sie ein fertiggestelltes Programm übersetzen
- und ausführen lassen.
-
- Sie werden zunächst gefragt, ob #on("b")#das zuletzt bearbeitete Programm#off("b")# ausgeführt
- werden soll. Bejahen Sie die Frage, so wird dieses Programm gestartet; ver­
- neinen Sie die Frage dagegen, so gelangen Sie in die 'Auswahl'. Nach An­
- kreuzen des gewünschten Programmnamens wird das ausgewählte Programm
- ausgeführt.
-
- Sind im Programm noch Fehler enthalten, so werden das Programm und die
- Fehlermeldungen gleichzeitig auf dem Bildschirm dargestellt (Paralleleditor)
- und zur Korrektur angeboten. Für die Programmkorrektur stehen ebenfalls alle
- Editorfunktionen zur Verfügung.
-
- Sollte Ihnen beim Programmieren ein Fehler unterlaufen sein (z.B. eine
- Endlosschleife), so kann mit der Tastenfolge <ESC><h> der Programm­
- ablauf abgebrochen werden ("Notbremse").
-#page#
-#on("b")#w Wiederholen#off("b")#
-
- Mit dieser Funktion können Sie den Ablauf des zuletzt ausgeführten
- Programms wiederholen, ohne daß das Programm neu übersetzt wird.
-
- Beachten Sie aber bitte, daß Veränderungen am Programmtext, die seit dem
- letzten Programmlauf vorgenommen wurden, #on("b")#nicht#off("b")# berücksichtigt werden;
- dazu muß das Programm erneut mit der Menufunktion 'Starten' übersetzt
- werden.
-
- Ist die Wiederholung eines Programmlaufs nicht möglich, so erfolgt ein Hin­
- weis darauf.
-
-
-#on("b")#v Verzeichnis#off("b")#
-
- Mit dieser Funktion können Sie sich einen Überblick über die in Ihrer Task
- vorhandenen Programmdateien verschaffen.
-
- Nach Aufruf dieser Funktion wird eine Liste der Programmdateien auf dem
- Bildschirm ausgegeben, die sich in Ihrer Task befinden. Da die Liste selbst
- eine Text-Datei ist, kann Sie mit der Tastenkombination <ESC><q> ver­
- lassen werden - hierauf wird auch in der letzten Bildschirmzeile hingewiesen.
- Falls nicht alle Namen auf den Bildschirm passen, können Sie das Fenster mit
- <HOP><runter> und <HOP><hoch> verschieben.
-
-
-#on("b")#Löschen#off("b")#
-
- Mit dieser Funktion können Sie Programmdateien, die Sie nicht mehr
- benötigen, die unnötig Platz belegen, löschen. Aber Vorsicht! Die Dateien
- verschwinden durch diese Funktion unwiederbringlich!
-
- Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in
- Ihrer Task befinden, zur Auswahl angeboten. Hier können Sie die gewünschten
- Namen ankreuzen. Die Auswahl wird dann durch die Tastenfolge
- <ESC><q> verlassen.
-#page#
- Für jede einzelne Programmdatei wird noch einmal zur Sicherheit gefragt, ob
- sie auch tatsächlich gelöscht werden soll. Zur Bestätigung tippen Sie bitte die
- Taste <j> ('ja') - zur Verhinderung <n> ('nein').
-
- Fehlerfälle:
- - In der Task exsitiert noch keine Programmdatei
-
-
-#on("b")#d Drucken#off("b")#
-
- Mit dieser Funktion können Sie Programmdateien über einen angeschlossenen
- Drucker ausgeben lassen.
-
- Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in
- Ihrer Task befinden, zur Auswahl angeboten. Hier können Sie die gewünschten
- Namen ankreuzen. Die Auswahl wird dann durch die Tastenfolge
- <ESC><q> verlassen.
-
- Die angekreuzten Programmdateien werden anschließend zum Drucker ge­
- schickt. Der Vorgang wird auf dem Bildschirm protokolliert.
-
- Fehlerfälle:
- - In der Task existiert noch keine Programmdatei.
- - Der Drucker ist nicht funktionsbereit.
- - Der Drucker wird nicht über die Task 'PRINTER' betrieben.
- - Auf Ihrem System werden die Druckkosten abgerechnet. Sie müssen sich
- mit einer Codenummer identifizieren.
-
-
-#on("b")#k Kopieren#off("b")#
-
- Mit dieser Funktion können Sie sich eine Kopie einer bereits in der Task
- vorhandenen Programmdatei anlegen. Das ist z.B. dann sinnvoll, wenn Sie sich
- einen bestimmten 'Stand' aufbewahren wollen oder wenn Sie ein Programm
- schreiben wollen, das einem bereits vorhandenen ähnelt.
-#page#
- Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in
- Ihrer Task befinden, zur Auswahl angeboten. Nach Ankreuzen eines Namens
- wird die Auswahl automatisch verlassen.
-
- Anschließend wird der angekreuzte Name angezeigt und der Name für die
- Kopie erfragt. Es muß ein Name eingetragen werden, der in dieser Task noch
- nicht für eine Programmdatei vergeben wurde; ansonsten erfolgt ein Hinweis
- darauf und es wird nicht kopiert!
-
- Da man aber oft für die Kopie einen ähnlichen Namen wie für das Original
- wählt, wird der 'alte' Name vorgeschlagen. Aus genannten Gründen muß er
- aber verändert werden. Sie können diesen Namen mit den üblichen Editier­
- funktionen verändern oder mit <HOP><RUBOUT> löschen und ganz neu
- eingeben. Sie sparen aber eine Menge Tipparbeit, wenn Sie einen langen
- Namen nur an einer Stelle ändern wollen.
-
- Fehlerfälle:
- - Eine Programmdatei mit dem gewünschten Namen existiert bereits in der
- Task.
-
-
-#on("b")#u Umbenennen#off("b")#
-
- Mit dieser Funktion können Sie einer bereits vorhandenen Programmdatei
- einen neuen Namen geben.
-
- Nach Aufruf dieser Funktion werden Ihnen alle Programmdateien, die sich in
- Ihrer Task befinden, zur Auswahl angeboten. Nach Ankreuzen eines Namens
- wird die Auswahl automatisch verlassen.
-
- Anschließend wird dieser Name angezeigt und der zukünftige Name für die
- Programmdatei erfragt. Es muß ein Name eingetragen werden, der in dieser
- Task noch nicht für eine Programmdatei vergeben wurde - ansonsten erfolgt
- ein Hinweis darauf und die Programmdatei wird nicht umbenannt!
-#page#
- Da man aber oft den 'neuen' Namen in Anlehnung an den 'alten' Namen
- wählt, wird der 'alte' Name vorgeschlagen. Aus genannten Gründen muß er
- aber verändert werden. Sie können diesen Namen mit den üblichen Editier­
- funktionen verändern oder mit <HOP><RUBOUT> löschen und ganz neu
- eingeben. Sie sparen aber eine Menge Tipparbeit, wenn Sie einen langen
- Namen nur an einer Stelle ändern wollen.
-
- Fehlerfälle:
- - Eine Programmdatei mit dem gewünschten Namen existiert bereits in der
- Task.
-
-
-
-#on("b")#5.6  Menufunktionen zum Oberbegriff 'Filialdaten'#off("b")#
-#on("b")#
-+-------------------------------------------------------------------------+
-| WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv |
-|---------------------------------------+--------------------------+------|
-| | e   Eintragen/ergänzen | |
-| | z   Zusammenstellen | |
-| | ----------------------- | |
-| | v   Verzeichnis | |
-| | ----------------------- | |
-| | l   Löschen | |
-| | u   Umbenennen | |
-| +--------------------------+ |
-| |
-| |
-|-------------------------------------------------------------------------|
-| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q>|
-+-------------------------------------------------------------------------+
-
-#off("b")#
-
-#on("b")#e Eintragen/ergänzen#off("b")#
-
- Mit diesem Menupunkt können Sie Filialdaten-Dateien, die Sie z.B. von der
- Vatertask oder von der Diskette geholt haben, in Ihrer Task laden.
-#page#
- Ihnen werden zunächst alle vorhandenen Filialdaten-Dateien zur Auswahl
- angeboten. Anschließend werden die angekreuzten Dateien in der Reihenfolge,
- in der sie angekreuzt wurden, zur Filialverwaltung geschickt und die Daten
- dort zu den bereits vorhandenen hinzugefügt. Gegebenenfalls wird auch die
- zentrale Kundendatei ergänzt. Der Vorgang wird auf dem Bildschirm
- protokolliert.
-
- Beachten Sie bitte, daß in der Filiale etwa vorhandene Daten dadurch nicht
- überschrieben, sondern lediglich ergänzt werden. Ein gänzliches Beseitigen von
- alten Daten gelingt nur durch Löschen der Filialtask.
-
- Fehlerfälle:
- - In der Task exsitieren noch keine Filialdaten-Dateien.
-
-
-#on("b")#z Zusammenstellen#off("b")#
-
- Mit dieser Funktion können Sie eine Datei anlegen, in der die aktuell in der
- Filiale gehaltenen Daten zusammengestellt werden. Solch eine Datei kann man
- sich jedoch nicht ansehen!
-
- Zunächst wird der Name der Datei erfragt, in die die Filialdaten geschrieben
- werden sollen. Danach werden darin die aktuellen Daten gespeichert und es
- wird eine 'Vollzugsmeldung' ausgegeben.
-
- Die Daten können dann später mit Hilfe der Archiv-Funktionen (vgl. Kapitel
- 5.7) z.B. auf einer Diskette gespeichert werden, damit Sie beim eventuellen
- Löschen der Filialtask nicht verlorengehen. Eine Verwechselung mit
- Programmdateien ist nicht möglich, da Namen für Filialdaten-Dateien (intern)
- automatisch mit dem Präfix 'Filialdaten:' versehen werden.
-
- Fehlerfälle:
- - Eine Filialdaten-Datei mit dem gewünschten Namen existiert bereits in der
- Task.
-#page#
-#on("b")#v Verzeichnis#off("b")#
-
- Mit dieser Funktion können Sie sich einen Überblick über die in Ihrer Task
- vorhandenen Filialdaten-Dateien verschaffen.
-
- Nach Aufruf dieser Funktion wird eine Liste der Filialdaten-Dateien auf dem
- Bildschirm ausgegeben, die sich in Ihrer Task befinden. Da die Liste eine
- Text-Datei ist, kann Sie mit der Tastenkombination <ESC><q> verlassen
- werden - hierauf wird auch in der letzten Bildschirmzeile hingewiesen. Falls
- nicht alle Namen auf den Bildschirm passen, können Sie das Fenster mit
- <HOP><runter> und <HOP><hoch> verschieben.
-
-
-#on("b")#l Löschen#off("b")#
-
- Mit dieser Funktion können Sie Filialdaten-Dateien, die Sie nicht mehr
- benötigen und die unnötig Platz belegen, löschen. Aber Vorsicht! Die Dateien
- verschwinden durch diese Funktion unwiederbringlich!
-
- Nach Aufruf dieser Funktion werden Ihnen alle Filialdaten-Dateien, die sich in
- Ihrer Task befinden, zur Auswahl angeboten. Hier können Sie die gewünschten
- Namen ankreuzen. Die Auswahl wird dann durch die Tastenfolge
- <ESC><q> verlassen.
-
- Für jede einzelne Datei wird nachgefragt, ob sie auch tatsächlich gelöscht
- werden soll. Zur Bestätigung tippen Sie bitte die Taste <j> ('ja') - zur Ver­
- hinderung <n> ('nein').
-
- Fehlerfälle:
- - In der Task exsitiert noch keine Filialdaten-Datei.
-#page#
-#on("b")#u Umbenennen#off("b")#
-
- Mit dieser Funktion können Sie einer bereits vorhandenen Filialdaten-Datei
- einen neuen Namen geben.
-
- Nach Aufruf dieser Funktion werden Ihnen alle Filialdaten-Dateien, die sich in
- Ihrer Task befinden, zur Auswahl angeboten. Nach Ankreuzen eines Namens
- wird die Auswahl automatisch verlassen.
-
- Anschließend wird dieser Name angezeigt und der zukünftige Name für die
- Datei erfragt. Es muß ein Name eingetragen werden, der in dieser Task noch
- nicht für eine Filialdaten-Datei vergeben wurde - ansonsten erfolgt ein Hinweis
- darauf und die Datei wird nicht umbenannt!
-
- Da man aber oft den 'neuen' Namen in Anlehnung an den 'alten' Namen
- wählt, wird der 'alte' Name vorgeschlagen. Aus genannten Gründen muß er
- aber verändert werden. Sie können diesen Namen mit den üblichen Editier­
- funktionen verändern oder mit <HOP><RUBOUT> löschen und ganz neu
- eingeben. Sie sparen aber eine Menge Tipparbeit, wenn Sie einen langen
- Namen nur an einer Stelle ändern wollen.
-
- Fehlerfälle:
- - Eine Filialdaten-Datei mit dem gewünschten Namen existiert bereits in der
- Task.
-#page#
-#on("b")#5.7  Menufunktionen zum Oberbegriff 'Archiv'#off("b")#
-#on("b")#
-+--------------------------------------------------------------------------+
-| WARENHAUS:  Info  Eingabeart  Kommandos  Programme  Filialdaten  Archiv |
-|---------------------------------------------+------------------------+---|
-| | r  Reservieren | |
-| | -  Neue Diskette | |
-| | -------------------- | |
-| | -  Schreiben | |
-| | -  Checken | |
-| | -  Kombination | |
-| | -  Holen/Lesen | |
-| | -  Löschen | |
-| | -------------------- | |
-| | -  Verzeichnis | |
-| | -  Drucken | |
-| | -------------------- | |
-| +-----------------------+ | i  Initialisieren | |
-| | Dateiaustausch mit: | | z  Zieltask einstellen| |
-| | Archiv | +------------------------+ |
-| | Archivname: | |
-| | gs-Warenhaus | |
-| +-----------------------+ |
-|--------------------------------------------------------------------------|
-| Info:<ESC><?>/<?> Wahl:<Pfeile> Ausführen:<RETURN> Verlassen:<ESC><q> |
-+--------------------------------------------------------------------------+
-#off("b")#
-
-In diesem Kapitel werden alle die Menufunktionen beschrieben, die Ihnen unter dem
-Oberbegriff 'Archiv' im Menu angeboten werden. Mit den Funktionen in diesem Menu
-können Sie aber nicht nur Dateien auf dem Archiv behandeln, sondern auch in
-anderen Tasks im Multi-User-System oder über das EUMEL-Netz sogar auf anderen
-Rechnern!
-
-Wenn Sie dieses Pull-Down-Menu gerade aufgeschlagen haben, sind nicht alle
-Funktionen aktivierbar! Um weitere Funktionen zu aktivieren, muß erst einer der
-aktivierbaren Menupunkte gewählt werden.
-
-Bei der Archivbehandlung werden Ihnen jeweils alle in der Task vorhandenen Dateien
-zur Auswahl angeboten. Das System unterscheidet nicht von sich aus - wie unter den
-#page#
-Oberbegriffen 'Programme' und 'Filialdaten' - zwischen Programm- und Filial­
-daten-Dateien. In den hier gezeigten Listen können Sie aber Filialdaten-Dateien
-daran erkennen, daß ihnen das Präfix 'Filialdaten:' vorangestellt ist.
-
-
-#on("b")#r Reservieren#off("b")# (des Archivlaufwerks)
-
- Im EUMEL-Multi-User-System haben normalerweise mehrere Personen das
- Zugriffsrecht auf das Archivlaufwerk. Allerdings muß der Zugriff so geregelt
- werden, daß sich die Beteiligten dabei nicht gegenseitig "in die Quere
- kommen". Ein Zugriff auf das Archivlaufwerk erfordert zunächst eine An­
- meldung. Ist diese Anmeldung erfolgt, kann von den anderen Beteiligten so
- lange nicht mehr auf das Laufwerk zugegriffen werden, bis es wieder freige­
- geben worden ist.
-
- Diese Anmeldung des Archivlaufwerkes erfolgt über die Menufunktion 'r Reser­
- vieren'. Greift bereits eine andere Task auf das Laufwerk zu, so erhalten Sie
- darüber einen Hinweis auf dem Bildschirm. Ansonsten wird an Sie die Frage
- gestellt, ob die Diskette eingelegt und das Laufwerk geschlossen ist.
-
- Erst zu diesem Zeitpunkt ist sichergestellt, daß Sie den alleinigen Zugriff auf
- das Laufwerk haben. Deshalb sollten Sie, wenn Sie mit mehreren Personen am
- Computer arbeiten, erst zum Zeitpunkt der Fragestellung die Diskette ins Lauf­
- werk einlegen.
-
- Nachdem Sie die Diskette eingelegt und die Frage bejaht haben, ermittelt das
- System selbständig den Namen der eingelegten Diskette, zeigt den Namen auf
- dem Bildschirm (im kleinen Kasten links unten) an und aktiviert die anderen
- Menupunkte des Pull-Down-Menus.
-
- Beim Verlassen des Pull-Down-Menus, wenn eine andere Zieltask eingestellt
- wird oder wenn das Menu gänzlich verlassen wird, wird die Reservierung
- automatisch aufgehoben!
-#page#
- Fehlerfälle:
- - Das Laufwerk ist von einer anderen Task belegt.
- - Die Diskette ist falsch eingelegt oder das Laufwerk ist nicht richtig ge­
- schlossen.
- - Die Diskette ist nicht formatiert bzw. initialisiert.
- - Die Diskette kann nicht gelesen werden (keine EUMEL-Diskette, Diskette
- hat ein falsches Format, Diskette ist verschmutzt...).
-
-
-#on("b")#n Neue Diskette#off("b")# (anmelden)
-
- Der Dateiaustausch mit einer Diskette ist nur dann möglich, wenn der im
- System eingestellte Diskettenname (auf dem Bildschirm im kleinen Kasten
- unten links sichtbar) mit dem tatsächlichen Namen der Diskette überein­
- stimmt. Nach einem Diskettenwechsel ist das aber in der Regel nicht mehr der
- Fall. Greift man dann auf die neu eingelegte Diskette zu, so erscheint die
- Fehlermeldung: 'Falscher Archivname! Bitte neue Diskette anmelden!'.
-
- Das Anmelden einer neuen Diskette - ohne einen neuen Reservierungsvorgang
- - wird durch diese Menufunktion ermöglicht. Nach Aktivieren dieses Menu­
- punktes wird der Name der eingelegten Diskette ermittelt, im System eingestellt
- und auf dem Bildschirm angezeigt.
-
- Im Gegensatz zur Menufunktion 'r Reservieren' greift das System ohne Anfrage
- an den Benutzer auf das Archivlaufwerk zu (die Reservierung bleibt ja be­
- stehen). Ist das Archivlaufwerk reserviert, so ist die Neuanmeldung einer Dis­
- kette über diese Menufunktion weniger zeitaufwendig.
-
- Fehlerfälle:
- - wie unter 'r Reservieren'.
-#page#
-#on("b")#s Schreiben#off("b")# (Kopieren)
-
- Alle Dateien der eigenen Task werden zur Auswahl angeboten. Wenn Sie die
- Auswahl durch die Tastenfolge <ESC><q> verlassen, überprüft das System
- zunächst, ob die Dateien in der eingestellten Zieltask schon vorhanden sind. Ist
- das der Fall, wird erfragt, ob die dort vorhandenen Dateien überschrieben, d.h.
- gelöscht werden dürfen (s.u.). Anschließend werden alle angekreuzten Dateien
- in der Reihenfolge, in der Sie sie angekreuzt haben, in die eingestellte Zieltask
- kopiert. Der Vorgang wird auf dem Bildschirm protokolliert. Die Original­
- dateien in der eigenen Task bleiben dabei erhalten.
-
- Wenn in der Zieltask schon eine Datei existiert, die den gleichen Namen hat
- wie eine Datei, die Sie dorthin kopieren möchten, so wird angefragt, ob die
- vorher schon existierende Datei überschrieben (gelöscht!) werden soll. Bejahen
- Sie diese Frage, so wird die bereits in der Zieltask existierende Datei (un­
- wiederbringlich) gelöscht und die gewünschte Datei dorthin transportiert. Ein
- Überschreiben aus Versehen ist nicht möglich, wenn Sie die an Sie gestellte
- Frage sorgfältig beantworten.
-
- Verneinen Sie die Frage, so wird die Datei auch nicht hinübertransportiert! Sie
- können die Datei aber umbenennen (Menufunktion 'u Umbenennen' unter
- den Oberbegriffen 'Programme' bzw. 'Filialdaten') und anschließend mit
- anderem Namen hinüberschreiben.
-
- Beachten Sie, daß beim Überschreiben einer Datei auf einer Archivdiskette der
- Speicherplatz der alten (überschriebenen) Version im allgemeinen nicht
- wiederverwendet werden kann. In einem solchen Fall könnte die Diskette voll
- geschrieben werden, obwohl eigentlich genügend Platz vorhanden wäre. Zur
- Optimierung wird deshalb zuerst überprüft, ob die angekreuzten Dateien
- schon in der Zieltask vorhanden sind und löscht diese, wenn Sie Ihr Einver­
- ständnis geben. Erst anschließend werden die Dateien insgesamt kopiert.
-#page#
- Normalerweise ist als Zieltask das Archivlaufwerk der eigenen Station einge­
- stellt. Mit der Menufunktion 'z Zieltask einstellen' kann diese Einstellung aber
- verändert werden.
-
- Fehlerfälle:
- - Die Diskette ist falsch eingelegt oder beschädigt.
- - Die Diskette kann nicht beschrieben werden (Schreibfehler).
- - Die Diskette ist voll.
- - Sehen Sie auch unter 'r Reservieren'
- 'z Zieltask einstellen'.
-
-
-#on("b")#c Checken#off("b")#
-
- Diese Menufunktion kann nur ausgeführt werden, wenn der Dateiaustausch
- mit einem Archiv(manager) erfolgt - ansonsten ist diese Menufunktion auch
- nicht aktivierbar. Die Menufunktion dient dazu, auf Diskette geschriebene
- Dateien auf Lesefehler hin zu prüfen. Es empfiehlt sich, diese Prüfroutine auf
- neu auf die Diskette geschriebene Dateien anzuwenden. Sehen Sie dazu auch
- 'k Kombination'.
-
- Alle Dateien der eingestellten Zieltask (Archiv) werden zur Auswahl angeboten.
- Wenn Sie die Auswahl durch die Tastenfolge <ESC><q> verlassen, werden
- alle angekreuzten Dateien in der Reihenfolge, in der Sie sie angekreuzt haben,
- "gecheckt", d.h. auf Lesefehler hin überprüft. Der Vorgang wird auf dem Bild­
- schirm protokolliert.
-
- Fehlerfälle:
- - Lesefehler auf dem Archiv.
- - Sehen Sie auch unter 'r Reservieren'.
-#page#
-#on("b")#k Kombination#off("b")#
-
- Diese Menufunktion ist eine Kombination aus den beiden Menufunktionen 's
- Schreiben' und 'c Checken' (Sehen Sie weitere Informationen auch dort!).
-
- Alle Dateien der eigenen Task werden zur Auswahl angeboten. Wenn Sie die
- Auswahl durch die Tastenfolge <ESC><q> verlassen, werden alle ange­
- kreuzten Dateien in der Reihenfolge, in der Sie sie angekreuzt haben, in die
- eingestellte Zieltask kopiert (gegebenenfalls müssen bereits vorhandene
- Dateien gleichen Namens in der Zieltask gelöscht werden). Anschließend
- werden alle Dateien, die gerade geschrieben wurden, gecheckt, d.h. auf Lese­
- fehler hin untersucht. Beide Vorgänge werden auf dem Bildschirm
- protokolliert.
-
- Da die 'Check' - Operation nur bei Archivmanagern zulässig ist, ist diese Menu­
- funktionen ebenfalls nur bei Archivmanagern aktivierbar. Zur Erläuterung
- sehen Sie bitte auch unter 'z Zieltask einstellen'.
-
-
-#on("b")#h Holen/Lesen#off("b")#
-
- Die Menufunktion dient dazu, Dateien, die bereits auf einer Archivdiskette oder
- in einer anderen Task existieren, in die eigene Task zu kopieren.
-
- Alle Dateien der eingestellten Zieltask werden zur Auswahl angeboten. An­
- schließend werden Kopien der angekreuzten Dateien in der Reihenfolge des
- Ankreuzens in die eigene Task geholt. Das Original in der Zieltask bleibt dabei
- unverändert! Der Vorgang wird auf dem Bildschirm protokolliert.
-
- Sind in der eigenen Task schon Dateien mit gleichem Namen vorhanden, so
- wird gefragt, ob die 'alten' Dateien überschrieben (gelöscht) werden dürfen.
- Nur wenn Sie zustimmen, werden die in Ihrer Task existierenden Dateien
- (unwiederbringlich!) gelöscht und Kopien der gleichnamigen Dateien aus der
- Zieltask angefertigt.
-#page#
- Stimmen Sie dem Löschvorgang nicht zu, dann bleiben die bisherigen Dateien
- in Ihrer Task erhalten - die Dateien aus der Zieltask werden dann aber auch
- nicht in Ihre Task kopiert! Um dennoch die Kopien zu erhalten, können Sie die
- namensgleichen Dateien in Ihrer Task umbenennen und dann erst die Dateien
- aus der anderen Task anfordern.
-
- Normalerweise werden die Dateien vom Archiv der eigenen Station geholt. Mit
- dem Menupunkt 'z Zieltask einstellen' kann diese Einstellung verändert
- werden.
-
- Fehlerfälle:
- - Lesefehler auf dem Archiv.
- - Sehen Sie auch unter 'r Reservieren'
- 's Schreiben'
- 'z Zieltask einstellen'.
-
-
-#on("b")#l Löschen#off("b")#
-
- Die Menufunktion dient dazu, Dateien in der Zieltask (unwiederbringlich!) zu
- löschen. Dazu werden alle Dateien der eingestellten Zieltask zur Auswahl ange­
- boten. Anschließend werden die angekreuzten Dateien in der Reihenfolge ihres
- Ankreuzens gelöscht. Zur Sicherheit muß noch einmal für jede einzelne Datei
- bestätigt werden, daß sie auch tatsächlich gelöscht werden soll.
-
- Beachten Sie, daß beim Löschen einer Datei auf einer Archivdiskette der
- Speicherplatz im allgemeinen nicht wieder verwendet werden kann. In einem
- solchen Fall könnte die Diskette voll geschrieben werden, obwohl eigentlich
- genügend Platz vorhanden wäre. Diese Probleme treten bei anderen Tasks, die
- keine Archivmanager sind, nicht auf, da deren Speicherplatz intelligenter
- verwaltet wird.
-#page#
- Normalerweise ist als Zieltask das Archiv der eigenen Station eingestellt. Mit
- dem Menupunkt 'z Zieltask einstellen' kann diese Einstellung verändert
- werden.
-
- Fehlerfälle:
- - Sehen Sie auch unter 'r Reservieren'
- 's Schreiben'
- 'z Zieltask einstellen'.
-
-
-#on("b")#v Verzeichnis#off("b")#
-
- Mit dieser Menufunktion können Sie sich einen Überblick über die in der
- Zieltask (z.B. auf dem Archiv) vorhandenen Dateien verschaffen.
-
- Nach Aufruf der Funktion wird eine Liste der Dateien auf dem Bildschirm
- ausgegeben, die sich in der Zieltask (z.B. auf dem Archiv) befinden. Ist die
- Zieltask ein Archiv(manager), so wird auch angezeigt, wieviel Platz auf der
- Diskette belegt ist. Da die Liste selbst eine Datei ist, kann sie mit der Tasten­
- kombination <ESC><q> verlassen werden. Falls nicht alle Dateinamen auf
- den Bildschirm passen, können Sie das Fenster mit <HOP><hoch> und
- <HOP><runter> verschieben.
-
- Fehlerfälle:
- - Sehen Sie unter 'z Zieltask einstellen'.
-
-
-#on("b")#d Drucken#off("b")#
-
- Das Verzeichnis der Dateien in der Zieltask, das man mit der Menufunktion 'v
- Verzeichnis' auf dem Bildschirm angezeigt bekommt, kann mit dieser Menu­
- funktion ausgedruckt werden.
-#page#
- Zur Sicherheit wird angefragt, ob wirklich ein solches Dateiverzeichnis der
- Zieltask gedruckt werden soll. Bejaht man die Frage, so wird ein Dateiver­
- zeichnis erstellt und zum Drucker geschickt.
-
- Fehlerfälle:
- - Der Drucker ist nicht funktionsbereit.
- - Der Drucker wird nicht über die Task 'PRINTER' betrieben.
- - Auf Ihrem System werden die Druckkosten abgerechnet. Sie müssen sich
- mit einer Codenummer identifizieren.
-
-
-#on("b")#i Initialisieren#off("b")#
-
- Diese Menufunktion gestattet es, frische Disketten zu formatieren, zu initiali­
- sieren bzw. beschriebene Disketten vollständig zu löschen und ggf. dabei
- umzubenennen. Bei Aufruf dieser Menufunktion wird - sofern noch nicht
- geschehen - das Archivlaufwerk automatisch reserviert.
-
- Wenn Sie eine fabrikneue Diskette aus der Verpackung nehmen, müssen Sie
- diese zunächst #on("b")#formatieren#off("b")#. Dabei wird die Diskette auf ein festgelegtes
- physikalisches Format eingestellt. Ohne daß diese Operation vorausgegangen
- ist, kann eine Diskette weder beschrieben noch gelesen werden.
-
- Prinzipiell braucht eine Diskette nur ein einziges Mal formatiert zu werden. Sie
- können Sie jedoch jederzeit wieder formatieren - z.B. wenn Sie Disketten
- haben, von denen Sie nicht genau wissen, für welche Zwecke sie zuvor ver­
- wendet wurden.
-
- Wenn Sie diese Menufunktion aktivieren, werden Sie so zunächst gefragt, ob Sie
- die Diskette auch formatieren wollen. Bejahen Sie die Frage, so werden Ihnen
- mehrere Formate zur Auswahl angeboten:
-#page#
-#on("b")#
- +----------------------------------------+
- | Formatieren einer Diskette |
- | |
- | Dies sind die möglichen Formate: |
- | |
- | 1 .... 40 Spur - 360 KB |
- | 2 .... 80 Spur - 720 KB |
- | 3 .... 5 1/4" - 1,2 MB |
- | 4 .... 3 1/2" - 1,4 MB |
- | s .... Standard - Format |
- | |
- | |
- | 1   2   3   4   s |
- +----------------------------------------+
-
-#off("b")#
-
- Erkundigen Sie sich bei Ihrem Händler, welches Format Sie bei Ihrem Rechner
- und den von Ihnen verwendeten Disketten einstellen müssen. Manche Rechner
- unterstützen diese Operation innerhalb des EUMEL-Systems auch gar nicht,
- das Formatieren muß dann irgendwie anders außerhalb des EUMEL-Systems
- geschehen.
-
- Wenn Sie die Formatierung abgeschlossen oder auch übersprungen haben,
- beginnt die eigentliche Initialisierung der Diskette. Dabei wird als erstes der
- Archivname auf die Diskette geschrieben. Alle alten Daten, die sich ggf. auf der
- Diskette befinden, werden bei diesem Vorgang unwiederbringlich (!) gelöscht.
-
- Zur Sicherheit überprüft das System in jedem Falle, ob es sich um eine EUMEL
- - Diskette handelt, und erfragt Ihr Einverständnis, ob die Diskette wirklich
- initialisiert werden soll. Geben Sie hierzu Ihr Einverständnis, dann wird noch
- der (neue) Archivname erfragt. Hatte die Diskette schon einen Namen, dann
- wird dieser zum Ãœberschreiben angeboten. Wollen Sie den alten Archivnamen
- beibehalten, so brauchen Sie nur die <RETURN>-Taste zu tippen, ansonsten
- können Sie den Namen auch zuvor verändern oder einen ganz neuen Namen
- hinschreiben. Anhand des ausgegebenen Namens können Sie auch über­
- prüfen, ob Sie die richtige Diskette eingelegt haben.
-#page#
- Das Initialisieren funktioniert natürlich nur, wenn Sie als Zieltask einen
- Archivmanager eingestellt haben - ansonsten ist diese Menufunktion gesperrt
- (nicht aktivierbar!).
-
- Fehlerfälle:
- - Formatieren ist nicht auf dem System möglich.
- - Sehen Sie auch unter 'r Reservieren'
- 'z Zieltask einstellen'.
-
-
-#on("b")#z Zieltask einstellen#off("b")#
-
- Mit dieser Menufunktion können Sie festlegen, mit welcher Zieltask Sie
- kommunizieren, d.h. z.B. Dateien austauschen möchten. Normalerweise ist
- hier das Archiv am eigenen Rechner eingestellt. Das wird auch nach Auf­
- klappen des Pull-Down-Menus im Kasten links unten angezeigt.
-
- Diese Menufunktion kann im Unterricht z.B. dazu genutzt werden, um fertig­
- gestellte Hausaufgaben in eine bestimmte Task zu schicken (Vatertask) oder
- um von dort z.B. vorgefertigte Programme und/oder Filialdaten-Dateien abzu­
- holen.
-
- Sie können aber auch eine andere Task einstellen (z.B. die Vatertask oder die
- Task 'PUBLIC'), um mit diesen Dateien auszutauschen oder um sich auch nur
- einen Überblick über die dort vorhandenen Dateien zu verschaffen. Wenn Sie
- mit Ihrem Rechner in ein EUMEL-Netz integriert sind, können Sie auch auf
- Tasks anderer Rechner zugreifen oder auch Disketten von Laufwerken anderer
- Rechner einlesen (z.B. wenn Sie Disketten anderer Formate haben, die von
- Ihrem Rechner nicht gelesen werden können).
-
- Dabei werden zwei Anforderungen an die Zieltask gestellt: Sie muß existieren
- und bereit für den Dateiaustausch sein, d.h es muß eine Managertask sein, auf
- die Sie Zugriff haben. Versuchen Sie auf andere Tasks zuzugreifen, so erhalten
- Sie entsprechende (Fehler-)Meldungen.
-#page#
- Zu beachten ist noch, daß es im EUMEL-System verschiedene Arten von
- Managertasks gibt - Archivmanager und normale Dateimanager. Der Unter­
- schied besteht darin, daß ein Archivmanager vom Benutzer vor dem Zugriff
- reserviert werden muß - anschließend hat nur dieser Benutzer (bis zur Aufga­
- be der Reservierung) ein Zugriffsrecht auf den Manager. Normale Datei­
- manager können dagegen von mehreren Benutzern in beliebiger Reihenfolge
- angesprochen werden.
-
- Ein Archivmanager kann auch auf bestimmte Diskettenformate spezialisert
- sein (z.B. auf das Lesen von DOS-Disketten). Manche Rechner haben auch
- mehrere Archivmanager für verschiedene Laufwerke etc. Durch Einstellen
- unterschiedlicher Archivmanager können Sie dann auf verschiedenen Lauf­
- werken archivieren.
-
- Nach Aktivieren dieses Menupunktes werden Ihnen die folgenden Alternativen
- angeboten:
-#on("b")#
- +-------------------------------------------+
- | Dateiaustausch gewünscht mit: |
- | |
- | a ...    Archiv (Eigene Station) |
- | |
- | v ...   Vatertask |
- | |
- | p ...   'PUBLIC' (Eigene Station) |
- | |
- | s ...   Sonstige Task |
- | |
- | Archiv   Vatertask   PUBLIC   Sonstige |
- +-------------------------------------------+
-#off("b")#
-
- Da der Dateiaustausch mit dem Standardarchiv der eigenen Station (Task:
- 'ARCHIVE'), mit der Vatertask und der Task 'PUBLIC' recht häufig in Anspruch
- genommen wird, sind diese drei Optionen unter den Alternativen direkt ange­
- geben. Entscheiden Sie sich für eine dieser drei Tasks, so nimmt das System
- alle notwendigen Einstellungen vor. Möchten Sie dagegen in Kontakt mit einer
-#page#
- anderen Task treten, so wählen Sie die Alternative 's ... Sonstige Task'.
- In diesem Falle haben Sie noch 3 Angaben zu machen:
-
- - Zunächst werden Sie nach dem Namen der Zieltask gefragt. Geben Sie den
- Namen der Zieltask - ohne Anführungsstriche (!) - ein und schließen Sie
- die Eingabe mit der <RETURN>-Taste ab. (Den ausgegebenen Namen der
- z.Z. eingestellten Task können Sie dabei verändern bzw. überschreiben.)
-
- - Dann wird die Nummer der Station im EUMEL-Netz erfragt, auf der sich
- die Zieltask befindet. Die Nummer Ihrer Station wird als Vorschlag ausge­
- geben. Wollen Sie mit einer Task auf Ihrem Rechner kommunizieren, so
- brauchen Sie diesen Vorschlag nur durch Drücken der <RETURN>-Taste
- bestätigen - ansonsten tragen Sie zuvor die entsprechende Stationsnummer
- ein. Ist Ihr Rechner nicht in ein EUMEL-Netz integriert, so wird die
- Stationsnummer 0 (Null) ausgegeben. Bitte bestätigen Sie diese Stations­
- nummer durch Tippen der <RETURN>-Taste.
-
- - Zum Abschluß müssen Sie noch angeben, ob die eingestellte Zieltask ein
- Archivmanager ist oder nicht.
-
- Das System versucht dann den Kontakt herzustellen. Je nachdem, welche
- Einstellung Sie vorgenommen haben, sind bestimmte Funktionen innerhalb
- des Menus nicht aktivierbar. Das System läßt nur die Funktionen zu, die
- aufgrund Ihrer Einstellungen zulässig sind.
-
- Im Kasten links unten auf dem Bildschirm wird jeweils angezeigt, welche
- Zieltask eingestellt ist. Erscheint in diesem Kasten auch ein Hinweis auf den
- Archivnamen, so haben Sie einen Archivmanager eingestellt. Ist dagegen vor
- dem Namen der Zieltask noch eine Zahl und ein Schrägstrich angegeben, so
- haben Sie eine Zieltask auf einem anderen Rechner eingestellt.
-
- Bedenken Sie, daß Operationen mit Tasks auf anderen Stationen länger an­
- dauern können - werden Sie nicht ungeduldig!
-#page#
- Sie können die Einstellung der Zieltask jederzeit wieder verändern!
-
- Fehlerfälle:
- - Die eingestellte Zieltask existiert nicht.
- - Die eingestellte Zieltask existiert zwar, ist aber nicht empfangsbereit, d.h.
- ein Zugriff von Ihrer Task aus ist nicht möglich!
- - Das Netz ist nicht funktionsbereit (Collector-Task fehlt).
- - Die Kommunikation war nicht erfolgreich.
- - Die gewünschte Operation kann mit der eingestellten Zieltask nicht ausge­
- führt werden (Zieltask ist z.B. gar kein Archivmanager - Sie aber ver­
- suchen, das Laufwerk zu reservieren).
-
-
-
-
-
-
-
-
-
diff --git a/doc/warenhaus/gs-Warenhaus-6 b/doc/warenhaus/gs-Warenhaus-6
deleted file mode 100644
index 3edf312..0000000
--- a/doc/warenhaus/gs-Warenhaus-6
+++ /dev/null
@@ -1,589 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (61)#
-#headodd#
-#center#gs-Warenhaus#right#%
-
-#end#
-#headeven#
-%#center#gs-Warenhaus
-
-#end#
-#center#1
-
-#center##on("b")#6  Beschreibung der Programmierschnittstelle#off("b")#
-
-
-In allen GRIN-Projekten soll - zumindest als Erweiterung - der Aspekt des
-"algorithmischen Problemlösens" mit in den Unterricht eingebracht werden. Deshalb
-ist auch in dem Soester Programm zum Projekt WARENHAUS eine Programmier­
-schnittstelle realisiert, die es erlaubt, mit Hilfe eines eng begrenzten Befehlssatzes
-kleine Programme zur Steuerung der Abläufe im Modell-Warenhaus zu schreiben.
-
-Wir haben lange überlegt, ob wir diese Programmierschnittstelle überhaupt nach­
-bilden sollten, weil wir der Meinung sind, daß beim Projekt WARENHAUS das
-algorithmische Problemlösen, wenn überhaupt, nur eine sehr untergeordnete Rolle
-spielt. Als Randproblematik kann man hier vielleicht untersuchen, wie die Menu-
-Funktionen unter dem Oberbegriff 'Kommandos' (vgl. Kapitel 5.4) aufgebaut sind,
-und man kann versuchen, diese in eigenen kleinen Programmen nach- oder umzu­
-bilden.
-
-Unser zweites Problem war, ob wir uns bei einer eventuellen Nachbildung der
-Programmierschnittstelle auch wirklich streng an die Soester Vorgaben halten sollten,
-auch wenn sie unseren Vorstellungen und Konzepten teilweise zuwiderlaufen. Eigent­
-lich sind wir der Meinung, daß uns mit der Programmiersprache ELAN bereits ein
-ausgezeichnetes Hilfsmittel zur Verfügung steht, um auch in der Sekundarstufe I in
-das algorithmische Problemlösen einzuführen. Gerade das Refinementkonzept - die
-Methode der 'schrittweisen Verfeinerung' / der "Modularisierung im Kleinen" -
-scheint uns besonders geeignet, typische Denkweisen des algorithmischen Problem­
-lösens offenzulegen. Lediglich die Konstruktion einer Zählschleife und den Umgang
-mit den Fehlermeldungen des ELAN-Compilers halten wir bei Anfängern für etwas
-problematisch.
-
-Wir haben uns deshalb entschlossen, Ihnen die Programmierschnittstelle in zwei
-Versionen zur Verfügung zu stellen: In der 'ELAN-Version' können Sie in der üblichen
-#page#
-ELAN-Umgebung programmieren; das bietet sich z.B. an, wenn Sie #on("b")#gs-Warenhaus#off("b")#
-im Wahlpflichtbereich bzw. im Differenzierungsbereich 9/10 einsetzen möchten. Es
-ist dann dort nicht nötig, erst eine neue, weniger komfortable "Programmiersprache"
-zu erlernen.
-
-Für den GRIN-Bereich enthält #on("b")#gs-Warenhaus#off("b")# eine weitere Programmierebene
-('GRIN-Version'), die an die Soester Vorgaben angelehnt ist, und die es erlaubt, die
-dort benutzten Schreibweisen von Befehlen und Kontrollstrukturen zu übernehmen.
-Allerdings haben wir dabei eine grundsätzliche Änderung bezüglich der Modularisie­
-rungsmöglichkeit von 'GRIN-Programmen' vorgenommen, auf die wir in Kapitel 6.1
-näher eingehen werden.
-
-Ein 'GRIN-Programm' wird bei der Ausführung des Menupunktes 's Starten' (vgl.
-Kapitel 5.5) zunächst in ein ELAN-Programm übersetzt und dabei auf formale
-Korrektheit überprüft. Werden keine Fehler festgestellt, so wird nun seinerseits das
-ELAN-Programm vom Compiler übersetzt und anschließend ausgeführt. Als Benutzer
-werden Sie dabei nicht mit Fehlermeldungen des Compilers konfrontiert, da der
-#on("b")#gs-Warenhaus#off("b")#-Übersetzer vorher alle formalen Fehler abfängt und zum Korrigieren
-anbietet.
-
-Sollte das System nach erfolgreicher Ãœbersetzung und/oder Compilation bei der
-Ausführung des Programms einen Fehler "bemerken" (z.B. falscher Aufruf eines
-Befehles), so wird das Programm automatisch abgebrochen und die entsprechende
-Fehlermeldung mit der Nummer der Programmzeile, in der der Fehler bemerkt
-wurde, im unteren Teil des Bildschirmes in einem 'notebook' gezeigt. Im oberen Teil
-wird das Programm zum Verbessern angeboten, wobei der Cursor am Anfang der
-fehlerhaften Zeile steht (gilt auch für die 'ELAN-Version').
-
-In beiden Versionen der Programmierschnittstelle ist die Schreibweise der Befehle bis
-auf die Groß- und Kleinschreibung identisch. Folgende Befehle stehen zu Verfügung:
-#page#
- GRIN-Version | ELAN-Version
-------------------------+------------------------------
- Artikelnummer lesen | artikelnummer lesen
- Artikeldaten eingeben | artikeldaten eingeben
- Kundennummer lesen | kundennummer lesen
- Kundendaten eingeben | kundendaten eingeben
- neues Blatt | neues blatt
- Rechnungskopf | rechnungskopf
- Artikel kaufen | artikel kaufen
- Abrechnung | abrechnung
- Auskunft | auskunft
- Bildschirm neu | bildschirm neu
- | nachbestellen
- | dezimalwert lesen
- | bitmuster lesen
- |
-
-
-Die drei letzten Befehle der ELAN-Version haben wir in den GRIN-Befehlssatz nicht
-mit aufgenommen, weil wir hier den Befehlssatz möglichst klein (und damit über­
-sichtlich) halten wollten und diese Befehle bereits unter dem Oberbegriff
-'Kommandos' als Menu-Funktionen zur Verfügung stehen. (Ebenso könnte man bei
-dem Befehl 'Auskunft' argumentieren. Die entsprechende Menu-Funktion 'Auskunft
-einholen' liefert bei jeder Anwahl jedoch immer nur #on("b")#eine#off("b")# Auskunft; in einem
-Programm kann man nun die Ausgabe mehrerer Auskünfte hintereinander
-realisieren.)
-
-Die genaue Wirkung der Befehle werden wir in Kapitel 6.3 noch detailliert
-beschreiben. Sie entsprechen im wesentlichen den Soester Befehlen, die im
-WARENHAUS-Begleitheft des LSW (siehe Anhang) auf den Seiten 99/100 aufgelistet
-sind. (Die anderen dort zu findenden Befehle gehören eigentlich nicht in die Befehls­
-liste der Programmierschnittstelle, weil sie nicht von Programmen aus sondern nur in
-einem 'Direktbefehgs-Modus' als Kommando aufrufbar sind! Diese Befehle sind auch
-#page#
-#on("b")#keine#off("b")# Programmierbefehle im eigentlichen Sinne, sondern entweder "Macros" zum
-"Handling" des Warenhausmodells oder Systemkommandos. #on("b")#gs-Warenhaus#off("b")# stellt
-diese Befehle unter ähnlichen Namen als Menu-Funktionen zur Verfügung.)
-
-
-
-#on("b")#6.1  Schreibweisen und Syntaxregeln in GRIN-Programmen#off("b")#
-
-Die Regeln, die beim Schreiben eines ELAN-Programms zu beachten sind, werden im
-EUMEL/ELAN-Benutzerhandbuch beschrieben; wir werden uns daher hier auf die
-GRIN-Version konzentrieren.
-
-Beginnen wir mit einem Beispiel aus dem WARENHAUS-Begleitheft des LSW. Dort
-finden Sie auf Seite 70 (unten) das folgende Programm:
-
-#on("b")#
- PROGRAMM Rechnung schreiben
- neues Blatt
- Kundennummer lesen
- WENN nicht Stoptaste gedrückt
- Rechnungskopf
- WIEDERHOLE
- Artikelnummer lesen
- WENN nicht Stoptaste gedrückt
- Artikel kaufen
- ENDE WENN
- BIS Stoptaste gedrückt
- Abrechnung
- ENDE WENN
- ENDE PROGRAMM #off("b")#
-
-Sie können dieses Programm ohne Änderungen übernehmen und starten,
-#on("b")#gs-Warenhaus#off("b")# wird es ohne Beanstandungen ausführen. Bezüglich der Übersicht­
-lichkeit und des Programmierstils kann man hier sicher geteilter Meinung sein,
-darauf gehen wir später noch ein.
-#page#
-Wir möchten Ihnen zunächst einige Regeln zur Schreibweise und Syntax in 'GRIN-
-Programmen' aufzeigen, die sich im obigen Beispiel-Programm beobachten lassen:
-
-- In jeder Zeile darf nur #on("b")#ein#off("b")# Befehl stehen; Befehgs-Trennzeichen (wie etwa das
- Semikolon in ELAN) werden deshalb nicht verwendet. Leerzeichen können
- beliebig gesetzt werden, auch leere Zeilen sind zulässig, nicht jedoch
- Kommentare.
-
-- Das Arbeiten mit Variablen (gleich welcher Art) ist #on("b")#nicht#off("b")# möglich; alle Befehle
- sind datentypfrei.
-
-- Schlüsselworte für Kontrollstrukturen (wie z.B. WIEDERHOLE, WENN etc.)
- werden in GROSSBUCHSTABEN geschrieben, Ausführungsbefehle und
- Bedingungen hingegen klein und gemäß den Regeln der deutschen Sprache mit
- großem Anfangsbuchstaben bei Substantiven. Diese Festlegung bezüglich der
- Groß- und Kleinschreibung ist bei den von #on("b")#gs-Warenhaus#off("b")# zur Verfügung ge­
- stellten Befehlen #on("b")#verbindlich#off("b")#, d.h. alle Warenhaus-#on("b")#Grund#off("b")#befehle und Kontroll­
- strukturen müssen (bis auf Leerzeichen) genauso geschrieben werden, wie sie in
- den Kapiteln 6.2 und 6.3 vorgegeben werden! (In der Soester Software können
- dagegen Groß- und Kleinbuchstaben beliebig verwendet werden, sodaß dort z.B.
- neben 'neues Blatt' auch 'neues blatt', "NEueS BlaTT" u.ä. als identisch ange­
- sehen werden.)
-
-- Jedes 'GRIN-Programm' beginnt mit dem 'Schlüsselwort' <PROGRAMM>,
- gefolgt von einem Programmnamen, der beliebig gewählt werden kann, jedoch
- noch in diese Zeile passen muß. Sinnvoll ist es, hier z.B. den Namen der
- Programmdatei einzutragen.
-
-- Jedes 'GRIN-Programm' endet mit der Zeile <ENDE PROGRAMM>. Nach dieser
- Zeile dürfen nur noch leere Zeilen folgen, es sei denn zwischen <PROGRAMM
- Programmname> und <ENDE PROGRAMM> wurden Befehle benutzt, die
- nicht zum Warenhaus-Grundbefehlssatz gehören. Solche Befehle müssen in einer
- 'Befehlserklärung' nach Programmende definiert werden.
-#page#
-Das obige Programm befriedigt vom äußeren Erscheinungbild her einen PASCAL-
-Programmierer wahrscheinlich völlig, einen ELAN-Verwöhnten jedoch sicher nicht.
-Die Soester WARENHAUS-Software bietet keinerlei Möglichkeit der Modularisierung
-#on("b")#innerhalb#off("b")# eines Programms (Refinement-/Prozedurkonzept o.ä.). Es gibt dort nur die
-Möglichkeit, fertiggestellte Programme unter dem Programmnamen dem Basis­
-befehlssatz "hinzuzufügen" - ein Vorgang, der dem Insertieren unter EUMEL/ELAN
-ähnelt. Obwohl es unter EUMEL/ELAN ein leichtes gewesen wäre, diese Möglichkeit
-ebenfalls zu realisieren, haben wir davon Abstand genommen, weil auf diese Weise an
-jedem Arbeitsplatz eine "eigene" Programmierumgebung entstehen würde. Wir sind
-der Meinung, daß für Schüler der Sekundarstufe I eine #on("b")#feste Modellumgebung als
-Basis#off("b")# vorhanden sein muß. Außerdem erscheint uns bei der Programmierung "im
-Kleinen" die "Bottom-Up"-Technik unangemessen und für den Anfänger viel zu
-unübersichtlich zu sein; viel eher wäre hier die "Top-Down"-Methode angebracht. Wir
-haben daher die Programmierumgebung in anderer Richtung erweitert und eine
-Modularisierungsmöglichkeit realisiert, die dem Refinementkonzept nachempfunden
-ist und damit unseren didaktisch-methodischen Vorstellungen viel eher entspricht.
-
-Bei #on("b")#gs-Warenhaus#off("b")# werden etwa benutzte 'eigene' Befehle #on("b")#innerhalb derselben#off("b")#
-Programmdatei 'erklärt' und zwar #on("b")#nach#off("b")# dem Ende des eigentlichen 'Haupt­
-programms', d.h. also nach der Zeile <ENDE PROGRAMM>. Mit Hilfe dieser Mög­
-lichkeit könnte das obige Programm besser strukturiert etwa so aussehen:
-
-#on("b")#
- PROGRAMM Rechnung schreiben
- neues Blatt
- Kundennummer lesen
- WENN nicht Stoptaste gedrückt
- einkaufen mit Rechnung
- ENDE WENN
- ENDE PROGRAMM
-
- einkaufen mit Rechnung:
- Rechnungskopf
- WIEDERHOLE
- Artikelnummer lesen
- Artikel eventuell kaufen
- BIS Stoptaste gedrückt
- Abrechnung
-#page#
- Artikel eventuell kaufen:
- WENN nicht Stoptaste gedrückt
- Artikel kaufen
- ENDE WENN
-#off("b")#
-
-
-Sie sehen, das Programm ist so zwar etwas länger, aber erheblich übersichtlicher
-geworden. Für 'neue Befehle' und die zugehörigen 'Befehlserklärungen' gelten
-folgende Grundsätze:
-
-- Die 'Befehlserklärungen' müssen #on("b")#nach#off("b")# <ENDE PROGRAMM> aufgelistet
- werden. Die Reihenfolge ist beliebig.
-
-- Eine 'Befehlserklärung' besteht aus dem zu erklärenden Befehl in (bis auf Leer­
- zeichen) völlig identischer Schreibweise (!) und einem nachfolgenden Doppel­
- punkt (:).
-
-- Ein 'neuer Befehl' darf alle möglichen Zeichen enthalten außer einem Doppel­
- punkt (:). Außerdem darf solch ein Befehl #on("b")#nicht#off("b")# mit einem 'Schlüsselwort'
- beginnen (vgl. Kapitel 6.2).
-
-- In 'Befehlserklärungen' können neben den Grundbefehlen auch wieder 'neue
- Befehle' benutzt werden, die dann wiederum erklärt werden müssen.
-
-- Befehle dürfen nur #on("b")#einmal#off("b")# erklärt werden, auch wenn sie mehrfach benutzt
- werden.
-
-- Es dürfen nur Befehle erklärt werden, die irgendwo auch wirklich benutzt
- werden.
-
-- Befehlserklärungen sind nur möglich für #on("b")#Ausführungs-Befehle#off("b")#. Es lassen sich
- also z.B. keine neuen Bedingungen oder Kontrollstrukturen erklären!
-
-- Es dürfen innerhalb eines Programms maximal 20 verschiedene 'neue Befehle'
- verwendet werden. (Diese Grenze dürfte in Warenhaus-Programmen kaum ein­
- mal erreicht werden!)
-#page#
-Formale Verstöße gegen diese Regeln werden bei dem Übersetzungsvorgang sofort
-beim Auftauchen des ersten Fehlers zur Korrektur angeboten. Dabei wird in der
-oberen Bildschirmhälfte das Programm editiert, wobei der Cursor an den Anfang der
-Zeile gesetzt wird, in der sich der (erste) Fehler befindet. In der unteren Bildschirm­
-hälfte wird über den Paralleleditor in einem 'notebook' die Art des Fehlers mit An­
-gabe der Zeilennummer genauer beschrieben.
-
-In der Regel wird hier nur auf #on("b")#einen#off("b")# (nämlich den ersten auftauchenden) Fehler
-hingewiesen, so daß Sie das Programm evtl. mehrfach starten müssen, bis alle Fehler
-erkannt und beseitigt sind. Manchmal tauchen im Fehler-'notebook' aber auch
-mehrere Fehlermeldungen auf (z.B. wenn 'neue Befehle' nicht erklärt oder erklärte
-Befehle nicht benutzt wurden). In Extremfällen kann es dabei dazu kommen, daß
-nicht mehr das ganze Fehler-'notebook' auf dem Bildschirm sichtbar ist. In diesem
-Fall können Sie mit der Tastenfolge <ESC><w> den Cursor zwischen den beiden
-Bildschirmhälften hin- und herschalten und mit den Pfeiltasten evtl. nicht-sichtbare
-Teile des 'notebooks' oder der Programmdatei auf den Bildschirm holen. (Für
-genauere Informationen über den Umgang mit dem EUMEL-Editor lesen Sie bitte im
-EUMEL-Benutzerhandbuch nach.)
-
-
-#on("b")#6.2  Kontrollstrukturen#off("b")#
-
-Sowohl in ELAN-Programmen, als auch in GRIN-Programmen werden Kontroll­
-strukturen durch 'Schlüsselworte' gekennzeichnet, die grundsätzlich in
-GROSSBUCHSTABEN geschrieben werden müssen, um sie deutlich gegenüber Aus­
-führungsbefehlen und Bedingungen abzuheben. In GRIN-Programmen gibt es
-Schlüsselworte für den Anfang und das Ende eines Programms sowie für Schleifen
-und einseitige Abfragen. Wir notieren hier nur die in GRIN-Programmen möglichen
-Kontrollstrukturen und geben, wenn vorhanden, die zugehörige ELAN-Übersetzung in
-Klammern an.
-
-
-#on("b")#Programm-Anfang/Ende:#off("b")#
-
- #on("b")#PROGRAMM#off("b")# <Programmname>
- <Anweisung 1>
- <Anweisung 2>
- .
- .
- #on("b")#ENDE PROGRAMM#off("b")#
-
-
-Jedes GRIN-(Haupt-)Programm beginnt mit dem Schlüsselwort 'PROGRAMM', gefolgt
-von einem frei wählbaren Programmnamen, der jedoch in dieselbe Zeile passen
-muß. Die Zeile 'ENDE PROGRAMM' zeigt das Ende eines GRIN-(Haupt-)Programms
-an. Sowohl 'PROGRAMM', als auch 'ENDE PROGRAMM' dürfen in einer Programm­
-datei nur #on("b")#einmal#off("b")# verwendet werden. Entsprechende Schlüsselworte in ELAN-
-Programmen gibt es nicht.
-
-
-#on("b")#Schleifen:#off("b")#
-
-Schleifen müssen innerhalb des Hauptprogramms oder der Befehlserklärung, in der
-sie geöffnet werden, auch wieder geschlossen werden. Schachtelungen sind zwar
-zulässig, sollten aber aus Gründen der Übersichtlichkeit vermieden werden. Soll
-dennoch innerhalb einer Schleife eine weitere Schleife verwendet werden, so sollte die
-innere Schleife über einen 'neuen Befehl' in eine Befehlserklärung 'ausgelagert'
-werden. Folgende Schleifenarten sind möglich:
-
-a) Zählschleife:
-
- #on("b")#WIEDERHOLE#off("b")# <n> #on("b")#MAL#off("b")# (ELAN: INT VAR i;
- <Anweisung 1> FOR i FROM 1 UPTO n REPEAT
- <Anweisung 2> .
- . .
- . .
- #on("b")#ENDE WIEDERHOLE#off("b")# END REPEAT)
-
-
-Die Anweisungen innerhalb der Schleife werden <n> - mal ausgeführt.
-
-
-b) Schleife mit Ausgangsbedingung:
-
-
- #on("b")#WIEDERHOLE#off("b")# (ELAN: REPEAT
- <Anweisung 1> .
- <Anweisung 2> .
- . .
- . .
- #on("b")#BIS#off("b")# <Bedingung> UNTIL bedingung END REPEAT)
-
-
-Die Anweisungen innerhalb der Schleife werden mindestens einmal ausgeführt und
-dann solange wiederholt, bis die Bedingung erfüllt ist. Bei der Programmierung ist
-darauf zu achten, daß durch die Anweisungen die Bedingung erfüllt werden kann,
-denn sonst ist das Resultat eine 'Endlosschleife', deren Ausführung nur durch einen
-totalen Programmabbruch (<ESC><h>) beendet werden kann.
-
-
-c) Zählschleife mit Ausgangsbedingung:
-
-
- #on("b")#WIEDERHOLE#off("b")# <n> #on("b")#MAL#off("b")# (ELAN: INT VAR i;
- <Anweisung 1> FOR i FROM 1 UPTO n REPEAT
- <Anweisung 2> .
- . .
- . .
- #on("b")#BIS#off("b")# <Bedingung> UNTIL bedingung END REPEAT)
-
-
-Die Anweisungen innerhalb der Schleife werden <n>-mal ausgeführt. Im Gegensatz
-zur reinen Zählschleife können die Wiederholungen jedoch vorzeitig abgebrochen
-werden, nämlich dann, wenn nach irgendeinem Schleifendurchlauf die Bedingung
-erfüllt ist.
-
-
-d) Endlosschleife:
-
-
- #on("b")#WIEDERHOLE#off("b")# (ELAN: REPEAT
- <Anweisung 1> .
- <Anweisung 2> .
- . .
- . .
- #on("b")#ENDE WIEDERHOLE#off("b")# END REPEAT)
-
-
-Die Anweisungen innerhalb der Schleife werden immer wieder ausgeführt. Da keine
-begrenzte Anzahl von Durchläufen und auch keine Abbruchbedingung angegeben ist,
-kann diese Schleife nur durch einen totalen Programmabbruch (<ESC><h>)
-beendet werden.
-
-(Die Schleifenarten c) und d) sind in der Soester WARENHAUS-Software nicht vor­
- handen, ergaben sich bei der Konstruktion des #on("b")#gs-Warenhaus#off("b")#-Ãœbersetzers wegen
- der analogen Strukturen in ELAN jedoch quasi "von selbst", so daß wir sie auch
- zugelassen haben. Schleifen mit Eingangsbedingung (ELAN: WHILE bedingung
- REPEAT ... END REPEAT) sind für GRIN-Programme jedoch nicht realisiert.)
-
-
-#on("b")#Einseitige Abfragen:#off("b")#
-
-
- #on("b")#WENN#off("b")# <Bedingung> (ELAN: IF bedingung
- <Anweisung 1> THEN anweisung 1;
- <Anweisung 2> anweisung 2;
- . .
- . .
- #on("b")#ENDE WENN#off("b")# END IF)
-
-
-Die Anweisungen werden nur ausgeführt, wenn die Bedingung erfüllt ist. (Eine Ent­
-sprechung zu der in ELAN möglichen 'zweiseitigen Abfrage' (IF ... THEN ... ELSE ...
-END IF) gibt es in der GRIN-Version nicht!)
-
-Eine im Hauptprogramm oder in einer Befehlserklärung begonnene Abfrage ('WENN
-...') muß auch im selben Programmteil wieder beendet werden. Ähnlich wie bei
-Schleifen ist die Schachtelung von Abfragen innerhalb des Hauptprogramms oder
-einer Befehlserklärung zwar zulässig, führt aber zu unübersichtlichen Programmen.
-Auch hier sollte man innerhalb einer Abfrage eventuell notwendige weitere Abfragen
-durch 'neue Befehle' in Befehlserklärungen auslagern.
-
-
-#on("b")#Zulässige Bedingungen:#off("b")#
-
-#on("b")#Stoptaste gedrückt#off("b")# (ELAN: stoptaste gedrückt)
-
- Die Bedingung ist erfüllt (d.h. liefert den Wert 'wahr'), wenn während des bis­
- herigen Programmablaufs die Tastenfolge <ESC><q> getippt worden ist;
- sonst ist sie nicht erfüllt (Wahrheitswert 'falsch'). (Das Tippen von <ESC><q>
- beim Verlassen einer Datei hat jedoch #on("b")#keinen#off("b")# Einfluß auf den Wahrheitswert der
- Bedingung!)
-
- Bei jeder Ausführung der Befehle 'Artikelnummer lesen', 'Kundennummer lesen'
- und 'Auskunft' wird der Wahrheitswert der Bedingung zunächst immer auf
- 'falsch' gesetzt (siehe 6.3), so daß die Abfrage der Bedingung nach einem dieser
- Befehle nur dann 'wahr' liefert, wenn #on("b")#während#off("b")# oder #on("b")#nach#off("b")# der letztmaligen Aus­
- führung eines der drei Befehle <ESC><q> getippt wurde; ein etwa vorher
- erfolgtes Tippen dieser Tastenfolge ist somit wirkungslos!
-
-
-#on("b")#nicht Stoptaste gedrückt#off("b")# (ELAN: NOT stoptaste gedrückt)
-
- Dieses ist das logische Gegenteil von 'Stoptaste gedrückt': 'nicht Stoptaste ge­
- drückt' ist erfüllt, wenn 'Stoptaste gedrückt' #on("b")#nicht#off("b")# erfüllt ist und umgekehrt.
-
-Um Probleme bei der Arbeit mit Terminals zu vermeiden, die nicht über den
-deutschen Zeichensatz verfügen (Umlaute!), ist bei beiden Bedingungen auch die
-Schreibweise 'gedrueckt' erlaubt.
-
-
-
-#on("b")#6.3  Detailbeschreibung der Warenhaus-Grundbefehle#off("b")#
-
-Wie bereits in 6.1 erwähnt, ist die im folgenden vorgegebene Schreibweise der Grund­
-befehle bezüglich Groß- und Kleinschreibung verbindlich; Leerzeichen dagegen
-können beliebig eingefügt oder auch weggelassen werden. Fett gedruckt steht immer
-der GRIN-Befehl, in Klammern dahinter der zugehörige ELAN-Befehl.
-
-
-#on("b")#Artikelnummer lesen#off("b")# (ELAN: artikelnummer lesen)
-
- - Der Wahrheitswert der Bedingung 'Stoptaste gedrückt' wird zunächst auf
- 'falsch' gesetzt.
- - Der Benutzer wird aufgefordert, eine Artikelnummer einzugeben. Je nach
- Einstellung der 'Eingabeart' (vgl. Kapitel 5.3) erfolgt die Eingabe durch Ein­
- tippen einer Zahl über die Tastatur oder durch Einschieben einer Warenkarte
- in das Lesegerät. Eingaben über die Tastatur sind mit <RETURN> abzu­
- schließen. Akzeptiert werden nur Werte von 1 bis 15, ansonsten erfolgt eine
- Warnung, und die Eingabe wird wiederholt.
- - Durch Tippen der Tastenfolge <ESC><q> kann dieser Befehl abgebrochen
- werden, ohne daß eine Artikelnummer eingelesen wird. In diesem Falle wird
- der Wahrheitswert der Bedingung 'Stoptaste gedrückt' auf 'wahr' gesetzt, sonst
- bleibt der Wert auf 'falsch'.
- - Durch Tippen der Tastenfolge <ESC><h> wird die Ausführung des
- gesamten Programms abgebrochen.
-
-
-#on("b")#Artikeldaten eingeben#off("b")# (ELAN: artikeldaten eingeben)
-
- - Der Befehl setzt voraus, daß zuvor eine Artikelnummer eingelesen wurde,
- ansonsten erfolgt eine entsprechende Fehlermeldung.
- - Die Angaben zu einem Artikel (Name, Preis, Mindestbestand, Bestand) können
- eingegeben bzw. verändert werden.
- - Alle Eingaben sind mit <RETURN> oder der Tastenfolge <ESC><q>
- abzuschließen. Durch <ESC><q> wird der Wahrheitswert der Bedingung
- 'Stoptaste gedrückt' auf 'wahr' gesetzt.
- - Nach Abschluß der Eingaben werden die Artikeldaten in der Filial-Verwaltung
- gespeichert, worauf auch kurz hingewiesen wird.
- - Durch Tippen der Tastenfolge <ESC><h> während der Eingaben wird die
- Ausführung des gesamten Programms abgebrochen.
-
-
-#on("b")#Kundennummer lesen#off("b")# (ELAN: kundennummer lesen)
-
- - Der Wahrheitswert der Bedingung 'Stoptaste gedrückt' wird zunächst auf
- 'falsch' gesetzt.
- - Der Benutzer wird aufgefordert, eine Kundennummer einzugeben. Je nach
- Einstellung der 'Eingabeart' (vgl. Kapitel 5.3) erfolgt die Eingabe durch Ein­
- tippen einer Zahl über die Tastatur oder durch Einschieben einer Kundenkarte
- in das Lesegerät. Eingaben über die Tastatur sind mit <RETURN> abzu­
- schließen. Akzeptiert werden nur Werte von 129 bis 159, ansonsten erfolgt eine
- Warnung, und die Eingabe wird wiederholt.
- - Durch Tippen der Tastenfolge <ESC><q> kann dieser Befehl abgebrochen
- werden, ohne daß eine Kundennummer eingelesen wird. In diesem Falle wird
- der Wahrheitswert der Bedingung 'Stoptaste gedrückt' auf 'wahr' gesetzt, sonst
- bleibt der Wert auf 'falsch'.
- - Durch Tippen der Tastenfolge <ESC><h> wird die Ausführung des
- gesamten Programms abgebrochen.
-
-
-#on("b")#Kundendaten eingeben#off("b")# (ELAN: kundendaten eingeben)
-
- - Der Befehl setzt voraus, daß zuvor eine Kundennummer eingelesen wurde,
- ansonsten erfolgt eine entsprechende Fehlermeldung.
- - Die Angaben zu einem Kunden (Name, Vorname, Geschlecht) können einge­
- geben bzw. verändert werden.
- - Alle Eingaben sind mit <RETURN> oder der Tastenfolge <ESC><q>
- abzuschließen. Durch <ESC><q> wird der Wahrheitswert der Bedingung
- 'Stoptaste gedrückt' auf 'wahr' gesetzt.
- - Nach Abschluß der Eingaben werden die Kundendaten sowohl in der Filial-
- Verwaltung als auch in der Zentrale gespeichert, worauf auch kurz hingewiesen
- wird.
- - Durch Tippen der Tastenfolge <ESC><h> während der Eingaben wird die
- Ausführung des gesamten Programms abgebrochen.
-
-
-#on("b")#neues Blatt#off("b")# (ELAN: neues blatt)
-
- - Das Rechnungsfenster auf dem Bildschirm wird gelöscht.
- - Für die Ausgabe der nächsten Rechnung auf dem Drucker wird eine neue
- Rechnungsdatei bereitgestellt.
-
-
-#on("b")#Rechnungskopf#off("b")# (ELAN: rechnungskopf)
-
- - Ein Rechnungskopf wird auf dem Bildschirm ausgegeben. Falls zuvor eine
- Kundenummer eingelesen worden ist, unter der bereits Kundendaten einge­
- geben wurden, erscheint der Name des betreffenden Kunden im Rechnungs­
- kopf.
- - Der Rechnungskopf wird für einen eventuellen späteren Ausdruck in die
- Rechnungsdatei geschrieben.
-
-
-#on("b")#Artikel kaufen#off("b")# (ELAN: artikel kaufen)
-
- - Der Befehl setzt voraus, daß zuvor eine Artikelnummer eingelesen worden ist,
- ansonsten erfolgt eine entsprechende Fehlermeldung.
- - Artikelname und -preis werden auf den Bildschirm und in die Rechnungsdatei
- geschrieben.
- - Der Kauf wird intern in den entsprechenden Filial-Dateien registriert.
-
-
-#on("b")#Abrechnung#off("b")# (ELAN: abrechnung)
-
- - Die Preise der gekauften Artikel werden addiert.
- - Die Summe wird auf dem Bildschirm angezeigt und in die Rechnungsdatei
- geschrieben.
- - Der Benutzer wird gefragt, ob die Rechnung ausgedruckt werden soll.
-
-
-#on("b")#Auskunft#off("b")# (ELAN: auskunft)
-
- - Der Wahrheitswert der Bedingung 'Stoptaste gedrückt' wird zunächst auf
- 'falsch' gesetzt.
- - Der Benutzer wird aufgefordert, eine Codenummer einzugeben. Je nach Ein­
- stellung der 'Eingabeart' (vgl. Kapitel 5.3) erfolgt die Eingabe durch Eintippen
- einer Zahl über die Tastatur oder durch Einschieben einer Codekarte in das
- Lesegerät. Eingaben über die Tastatur sind mit <RETURN> abzuschließen.
- Akzeptiert werden nur zulässige Werte, ansonsten erfolgt eine Warnung, und
- die Eingabe wird wiederholt. Die Bedeutungen der einzelnen Auskunftscodes
- sind in Kapitel 5.4 unter der Menufunktion 'Auskunft einholen' beschrieben.
- - Durch Tippen der Tastenfolge <ESC><q> kann der Befehl abgebrochen
- werden, ohne daß eine Codenummer eingelesen wird. In diesem Falle wird der
- Wahrheitswert der Bedingung 'Stoptaste gedrückt' auf 'wahr' gesetzt, sonst
- bleibt der Wert auf 'falsch'.
- - Durch Tippen der Tastenfolge <ESC><h> wird die Ausführung des
- gesamten Programms abgebrochen.
-
-
-#on("b")#Bildschirm neu#off("b")# (ELAN: bildschirm neu)
-
- - Der Programm-Eingangsbildschirm wird neu aufgebaut. Der Befehl wird
- benötigt, wenn die Fenstereinteilung auf dem Bildschirm wiederhergestellt
- werden soll (z.B. nach Ausgabe einer Liste bei dem Befehl 'Auskunft').
- - Der Befehl wird beim Starten eines GRIN-Programms automatisch ausgeführt;
- bei ELAN-Programmen wird er automatisch am Anfang eines jeden Programms
- eingefügt, wenn das Programm nicht mit diesem Befehl beginnt.
-
-
-Neben diesen Befehlen stehen für ELAN-Programme noch drei weitere zur Verfügung,
-die nicht zum GRIN-Befehlssatz gehören:
-
- nachbestellen,
- dezimalwert lesen,
- bitmuster lesen.
-
-Diese Befehle entsprechen in ihrer Wirkung den gleichnamigen Menufunktionen
-unter dem Oberbegriff 'Kommandos', die in Kapitel 5.4 beschrieben sind.
-
-
-
diff --git a/doc/warenhaus/gs-Warenhaus-7 b/doc/warenhaus/gs-Warenhaus-7
deleted file mode 100644
index 3a55dfe..0000000
--- a/doc/warenhaus/gs-Warenhaus-7
+++ /dev/null
@@ -1,235 +0,0 @@
-#limit (11.0)##pagelength (16.5)##block#
-#start (2.0,0.0)#
-#page (69)#
-#headodd#
-#center#gs-Warenhaus#right#%
-
-#end#
-#headeven#
-%#center#gs-Warenhaus
-
-#end#
-#center#1
-
-#center##on("b")#7  Weitere Kommandos (für Systembetreuer)#off("b")#
-
-
-Wenn Sie #on("b")#gs-Warenhaus#off("b")# installiert haben und mit dem Aufbau des Systems nach
-der automatischen Generierung zufrieden sind, dann ist dieses Kapitel nicht wichtig
-für Sie. Wir erklären Ihnen hier die Befehle, mit denen Sie die Einstellungen, die bei
-der Installation vorgenommen wurden, auch nachträglich noch ändern können.
-Beachten Sie bitte, daß aus Sicherheitsgründen eine Einstellungs#on("b")#änderung#off("b")# i.a. nur in
-der Task möglich ist, in der die entsprechende Einstellung vorgenommen wurde, es
-sei denn, dort wurde eine Einstellung gänzlich aufgehoben. Außerdem werden Ein­
-stellungsänderungen stets nur an Sohntasks weitergegeben ("vererbt"), die #on("b")#nach#off("b")# der
-Änderung angemeldet werden!
-
-Die Standard-Installation sieht z.B. nur die Einrichtung #on("b")#einer#off("b")# Warenhaus-Hauptstelle
-vor. Wenn Sie tatsächlich nur eine Hauptstelle eingerichtet haben, nun aber doch
-mehrere Hauptstellen (für verschiedene Lerngruppen) betreiben wollen, so brauchen
-Sie das Programm nicht erneut zu insertieren! Machen Sie besser in der bisherigen
-Hauptstellen-Task den Hauptstellenstatus mit dem Kommando 'warenhaus haupt­
-stelle (FALSE)' rückgängig und richten Sie in Sohntasks mit dem Kommando 'waren­
-haus hauptstelle (TRUE)' wieder neue Hauptstellen ein. Außerdem können Sie in
-Hauptstellen-Tasks die Version für die Programmierschnittstelle umstellen ('grin
-(TRUE)' bzw. 'grin (FALSE)').
-
-Ähnlich verhält es sich mit dem Betrieb eines Adapters für das Kartenleser-Interface.
-Auch hier ist die Standard-Einstellung u.U. nur für den Betrieb #on("b")#eines#off("b")# Adapters ausge­
-legt. Möchten Sie mehrere Kartenleser anschließen, so sind bei der Verwendung von
-MUFIs im Terminalkanal keine Änderungen nötig, da hier jede Filialtask sowieso nur
-auf das MUFI zugreifen kann, das in den Kanal des Terminals geschaltet ist, an das
-die Task gekoppelt ist. Möchten Sie jedoch mehrere Kartenleser über Adapter an
-separaten seriellen Schnittstellen ansprechen, so müssen Sie dem System mehrere
-Kanalnummern mitteilen, die für verschiedene Filialtasks ja durchaus unterschied­
-lich sein können. Am geschicktesten erscheint es in diesem Fall, unter einer Haupt­
-stelle mehrere "Zwischentasks" einzurichten, in diesen jeweils die Interface-
-Kanalnummern festzulegen und die Filialtasks als Söhne dieser "Zwischentasks"
-anzumelden. Benennen Sie die "Zwischentasks" so, daß die eingestellte Kanal­
-nummer aus dem Namen ersichtlich ist, so ist gleich bei der Anmeldung einer Filial­
-task klar, welcher Kartenleser von dieser Task aus angesprochen werden kann.
-
-Um diesen Aufbau zu realisieren, sollten Sie zunächst in der entsprechenden Haupt­
-stellentask einen etwa eingerichteten Direktstart mit dem Kommando 'warenhaus
-direktstart (FALSE)' aufheben. Ebenfalls in der Hauptstellentask wird dann mit dem
-Kommando 'init interface channel' eine etwa vorhandene Kanaleinstellung gelöscht,
-wenn Sie bei der Aufforderung 'Gib Interface-Kanal:' eine '0' eingeben. Nun richten
-Sie für jeden vorhandenen Adapter (natürlich müssen auch entsprechend viele freie
-serielle Schnittstellen zur Verfügung stehen!) eine "Zwischentask" als Sohn der
-Hauptstellentask ein (z.B. 'Kanal 5', 'Kanal 6' etc.) und geben dort jeweils wieder das
-Kommando 'init interface channel'. Bei der Abfrage 'Gib Interface-Kanal:' geben Sie
-dann die entsprechende Kanalnummer ein (in unserem Beispiel 5 oder 6 etc.). Alle
-Söhne der Zwischentask 'Kanal 5' z.B. können dann (abwechselnd) den Kartenleser
-benutzen, der an den Adapter an Kanal 5 angeschlossen ist. In diesen Zwischentasks
-können Sie, wenn Sie möchten, mit dem Kommando 'warenhaus direktstart (TRUE)'
-einen Direktstart für die neu anzumeldenden Sohntasks (Filialen) einrichten.
-Ansonsten wird #on("b")#gs-Warenhaus#off("b")# in den Sohntasks aus der 'gib Kommando' - Ebene
-mit dem Befehl 'warenhaus' gestartet (vgl. Kapitel 3.3).
-
-Sollten Sie beim Betrieb eines Codekartenlesers feststellen, daß die Wartezeit beim
-Einlesen einer Codekarte zu kurz oder zu lang ist, so können Sie auch diese ändern.
-Da die Wartezeit durch eine Schleife realisiert ist, in der laufend Werte vom Interface
-gelesen werden, ist sie abhängig von der Geschwindigkeit des verwendeten Rechners
-und von der gewählten Interface-Anpassung. Die Veränderung der Wartezeit erfolgt
-mit dem Kommando 'eingabesicherheit (n)', wobei n eine 'Integer'-Zahl sein muß.
-Bei sehr langsamen Systemen hat sich ein Wert von 3 als sinnvoll herausgestellt; bei
-schnellen Rechnern muß n etwa 10 oder noch größer sein. Ermitteln Sie den für
-Ihren Rechner geeigneten Wert bitte durch Ausprobieren. (Standardmäßig eingestellt
-ist n = 5.)
-
-Mit Hilfe von drei Informationsprozeduren können Sie Informationen über den
-Systemzustand einholen: 'put (hauptstellenname)' liefert den Namen der zu­
-ständigen Hauptstellen-Task, 'put (interface anpassung)' zeigt den Namen der bei
-der Installation gewählten Interfaceanpassung für den Kartenleser, und 'put (inter­
-face channel)' liefert die Nummer des Kanals, über den ein Interface an separater
-serieller Schnittstelle angesprochen wird.
-
-
-
-#on("b")#Detailbeschreibung der Befehle#off("b")#:
-
-
-#on("b")#PROC eingabesicherheit (INT CONST n):#off("b")#
-
- - stellt die Wartezeit beim Einlesen einer Artikel-, Kunden- oder Auskunfts­
- codenummer in Abhängigkeit vom Absolutbetrag von n ein. Bei langsamen
- Rechnern sollte abs(n) klein (ca. 3), bei schnellen Rechnern größer (ca. 10)
- sein.
- - Standardeinstellung ist 5.
- - Der Befehl kann in jeder Task gegeben werden, in der #on("b")#gs-Warenhaus#off("b")#
- insertiert ist.
-
-
-#on("b")#PROC grin (BOOL CONST entscheidung):#off("b")#
-
- - ist nur in Hauptstellentasks aufrufbar und in Tasks, die keiner Hauptstellen­
- task untergeordnet sind.
- - stellt die Version für die Programmierschnittstelle gemäß der 'entscheidung'
- ein:
- TRUE ---> GRIN-Version, FALSE ---> ELAN-Version.
-
- Fehlerfälle:
- - Dieser Befehl darf nur von der Task '...' aus gegeben werden!
-
-
-#on("b")#TEXT PROC hauptstellenname:#off("b")#
-
- - liefert den Namen der zuständigen Hauptstellentask.
- - liefert 'niltext' (""), wenn in diesem Zweig des Taskbaumes noch keine
- Hauptstelle existiert; es ist dann kein Warenhaus-Betrieb möglich! (vgl.
- 'PROC warenhaus hauptstelle')
-
-
-#on("b")#PROC init interfacechannel:#off("b")#
-
- - initialisiert eine unbenannte Sohntask ("-") zum Ansprechen des Interface­
- systems über eine separate serielle Schnittstelle und existiert deshalb nur bei
- den Anpassungen für 'MUFI als Endgerät' und 'AKTRONIK-Adapter'.
- - erfragt zunächst eine Kanalnummer ('Gib Interface-Kanal:'); zulässig sind
- Eingaben von 0 bis 24.
- - löscht eine evtl. bereits vorhandene unbenannte Sohntask ("-").
- - richtet bei Eingabe einer Kanalnummer > 0 eine neue unbenannte Sohntask
- ein und sperrt dieses Kommando für Sohntasks, die danach angemeldet
- werden.
- - hebt eine etwa gesetzte Sperrung bei Eingabe von 0 als Kanalnummer wieder
- auf.
-
- Fehlerfälle:
- - Dieses Kommando kann nur von der Task '...' aus gegeben werden!
- - Unzulässige Kanalnummer!
-
-
-#on("b")#TEXT PROC interface anpassung:#off("b")#
-
- - liefert den Namen der bei der Installation ausgewählten Anpassung. Möglich
- sind zur Zeit:
-
- "ohne Kartenleser",
- "mit Kartenleser an AKTRONIC-Adapter",
- "mit Kartenleser an MUFI als Endgerät",
- "mit Kartenleser an MUFI im Terminalkanal".
-
-
-#on("b")#INT PROC interface channel:#off("b")#
-
- - existiert nur bei den Anpassungen für den AKTRONIC-Adapter und MUFI als
- Endgerät.
- - liefert die Kanalnummer der seriellen Schnittstelle, über die das Interface­
- system angesprochen wird.
- - wird der Wert 0 geliefert, so kann in der Task keine Eingabe über einen
- Kartenleser erfolgen (siehe 'PROC init interfacechannel').
-
-
-#on("b")#PROC warenhaus:#off("b")#
-
- - ist nicht in Hauptstellentasks aufrufbar.
- - startet #on("b")#gs-Warenhaus#off("b")# aus der 'gib Kommando' - Ebene oder wird bei einge­
- richtetem Direktstart automatisch aufgerufen.
- - richtet eine Sohntask als Filialverwaltung ein und kennzeichnet damit die
- eigene Task für das System als 'aktive' Filiale. Der Name dieser Sohntask
- enthält den Namen der zuständigen Hauptstellentask und die Filialnummer,
- unter der die Filiale geführt wird. Diese Filialnummer ist identisch mit der
- Kanalnummer des angekoppelten Terminals.
- - löscht die Filialverwaltungstask, wenn das Warenhaus-Menu geregelt mit
- <ESC><q> verlassen wird. Zu Kollisionen bezüglich der Filialnummer
- kann es somit nur kommen, wenn an einem Arbeitsplatz das WARENHAUS-
- Menu ungeregelt verlassen wird (z.B. durch Tippen der SV-Taste) und dann
- an demselben Arbeitsplatz eine neue Filiale angemeldet werden soll. In
- diesem Fall erhält die neue Task #on("b")#keine#off("b")# Filialverwaltung als Sohntask und ist
- damit für den Warenhaus-Betrieb nicht brauchbar. Deshalb wird hier nach
- Ausgabe einer Fehlermeldung sofort gefragt, ob die Task gelöscht werden soll.
-
- Fehlerfälle:
- - Dieser Befehl darf nur von Söhnen dieser Task aus gegeben werden!
- - Keine uebergeordnete Task ist 'warenhaus hauptstelle'!
- - Filiale <n> ist bereits besetzt durch TASK '...'!
- Es ist so kein geregelter Warenhaus-Betrieb möglich!
-
-
-#on("b")#PROC warenhaus direktstart (BOOL CONST entscheidung):#off("b")#
-
- - richtet gemäß dem Wahrheitswert der 'entscheidung' einen Direktstart ein
- oder hebt ihn wieder auf.
- Hat 'entscheidung' den Wert 'TRUE', so wird ein Direktstart eingerichtet. Es
- erscheint zunächst die Frage 'Mit automatischem Löschen (j/n)?'. Durch den
- Direktstart gelangt man beim Anmelden einer Sohntask nicht in die 'gib
- Kommando' - Ebene, sondern sofort in das WARENHAUS-Menu. Wird die
- obige Frage mit <j> beantwortet, so werden Sohntasks nach dem Ausstieg
- aus dem WARENHAUS-Menu sofort gelöscht; andernfalls wird erst noch ge­
- fragt, ob gelöscht werden soll. Bei Verneinung erfolgt ein 'break'. Die Ein­
- richtung eines Direktstarts wird vom System vermerkt und der Befehl darauf­
- hin in allen untergeordneten Tasks gesperrt. Sowohl der Direktstart als auch
- die Sperrung sind nur wirksam für Sohntasks, die #on("b")#nach#off("b")# Ausführung dieses
- Befehls angemeldet werden.
- Hat 'entscheidung' den Wert 'FALSE', so wird ein etwa eingerichteter Direkt­
- start und die damit verbundene Sperrung des Befehls für neue Sohntasks
- wieder aufgehoben. Die Aufhebung ist nur möglich in der Task, von der aus
- der Direktstart eingerichtet wurde.
-
- Fehlerfälle:
- - Der Direktstart kann nur aus der Task '...' geaendert werden!
-
-
-#on("b")#PROC warenhaus hauptstelle (BOOL CONST entscheidung):#off("b")#
-
- - macht je nach Wahrheitswert der 'entscheidung' eine Task zur Hauptstellen­
- task ('TRUE') bzw. hebt diesen Status wieder auf ('FALSE'). Eine Task kann
- nur Hauptstelle werden, wenn noch keine übergeordnete Task Hauptstelle ist.
- Der Hauptstellenstatus kann danach auch nur in dieser Task wieder aufge­
- hoben werden.
- - löscht bei der Einrichtung der Hauptstelle eine etwa bereits vorhandene
- "Zentrale" und richtet automatisch eine neue "Zentrale" in Form einer Sohn­
- task ein, die den Namen der Vatertask mit dem Zusatz ".Zentrale" erhält und
- in der später die zentrale Kundendatei gespeichert wird. Bei Aufhebung des
- Hauptstellenstatus wird diese Task wieder gelöscht.
- - fragt bei Einrichtung der Hauptstelle nach, ob ein Direktstart eingerichtet
- werden soll ('Mit Direktstart (j/n)?') und ruft die Prozedur 'warenhaus
- direktstart' entsprechend auf.
- - Hebt bei Löschen des Hauptstellenstatus einen in der Task etwa einge­
- richteten Direktstart automatisch auf.
-
- Fehlerfälle:
- - Hauptstelle ist bereits die Task '...'!
- - Dieses Kommando darf nur in der Task '...' gegeben werden!
-
-