diff options
| author | Lars-Dominik Braun <lars@6xq.net> | 2019-03-02 14:17:13 +0100 | 
|---|---|---|
| committer | Lars-Dominik Braun <lars@6xq.net> | 2019-03-02 14:17:13 +0100 | 
| commit | 50acf53648b6562853cb26aa4e7062a5ced66908 (patch) | |
| tree | 570243dba5597bdbe8d08ff931d53f006dfd62a3 /devel/debugger/doc | |
| parent | 98cab31fc3659e33aef260efca55bf9f1753164c (diff) | |
| download | eumel-src-50acf53648b6562853cb26aa4e7062a5ced66908.tar.gz eumel-src-50acf53648b6562853cb26aa4e7062a5ced66908.tar.bz2 eumel-src-50acf53648b6562853cb26aa4e7062a5ced66908.zip | |
Move debugger sources to version subdirectory
Diffstat (limited to 'devel/debugger/doc')
| -rw-r--r-- | devel/debugger/doc/DEBUGGER.PRT | 2021 | 
1 files changed, 0 insertions, 2021 deletions
| diff --git a/devel/debugger/doc/DEBUGGER.PRT b/devel/debugger/doc/DEBUGGER.PRT deleted file mode 100644 index 4379f4a..0000000 --- a/devel/debugger/doc/DEBUGGER.PRT +++ /dev/null @@ -1,2021 +0,0 @@ -*************************************************************************** 
 -***                                                                     *** 
 -***                      D o k u m e n t a t i o n                      *** 
 -***                          zum EUMEL-Debugger                         *** 
 -***                                                                     *** 
 -***                      Autor: Michael Staubermann                     *** 
 -***                      Stand der Dokumentation: 03.12.86              *** 
 -***                      Stand des Debuggers:     01.12.86              *** 
 -***                                                                     *** 
 -*************************************************************************** 
 - 
 -1.     Anwendung des Debuggers 
 -1.1    Code Disassembler (Decoder) 
 -1.1.1  Datenrepr„sentation 
 -1.1.2  Datenadressen 
 -1.1.3  Codeadressen 
 - 
 -1.2    Ablaufverfolgung (Tracer) 
 - 
 -2.     Die EUMEL0-Instruktionen 
 -2.1    Erl„uterung der Instruktionen (Thematisch sortiert) 
 -2.2    Alphabetische Liste der Instruktionen 
 - 
 -3.     Beschreibung der Pakete 
 -3.1    PACKET address 
 -3.2    PACKET table routines 
 -3.3    PACKET eumel decoder 
 -3.4    PACKET tracer 
 - 
 -#page# 
 -#ub#1.  Anwendung des Debuggers#ue# 
 - 
 -Der EUMEL-Debugger ist fr die Software-Entwickler und nicht fr die
 -Anwender dieser Software gedacht. Insbesondere bei der Entwicklung
 -systemnaher Software, wie z.B. Compiler, ist der Debugger hilfreich. 
 - 
 -(ELAN-)Programme werden wie bisher compiliert (z.B. insertiert), ohne daá
 -der Quelltext des Programmes vorher modifiziert werden máte. Um den
 -Sourcetext w„hrend der Ablaufverfolgung (Trace) beobachten zu k”nnen,
 -máen die Programme mit 'check on' bersetzt werden. 
 - 
 -Die sinnvolle Anwendung des Debuggers setzt allerdings Kenntnis der
 -EUMEL0-Instruktionen voraus, die im Kapitel 2 erl„utert werden (Der Debugger
 -setzt die Codierung BIT-A fr diese Instruktionen voraus, d.h. er l„uft
 -zumindest in der interpretativen EUMEL0-Version.).
 - 
 - 
 -#ub#1.1  Code Disassembler (Decoder)#ue# 
 - 
 -Der Decoder konvertiert die vom Compiler erzeugte Bitcodierung (16 Bit) in
 -Mnemonics (Textdarstellung der Instruktionen), die in eine FILE geschrieben,
 -bzw. optional auf dem Bildschirm ausgegeben werden k”nnen. Die Bitcodierung
 -kann zus„tzlich ausgegeben werden. 
 -Der Decoder wird mit 'decode' aufgerufen. W„hrend der Dekodierung stehen
 -folgende Tastenfunktionen zur Verfgung: 
 - 
 -Taste Funktion 
 ------------------------------------------------------------------------ 
 - ESC  Abbruch der Dekodierung. 
 -  e   Echo. Schaltet die parallel Bildschirmausgabe ein/aus. 
 -  l   Zeilennummern statt Hexadezimaladressen mitprotokollieren. 
 -  a   Hexadezimaladressen statt Zeilennummern mitprotokollieren. 
 -  f   Zeigt den Namen und die aktuelle Zeilennummer der Protokollfile. 
 -  d   getcommand ; docommand 
 -  s   storage info 
 -  m   Zeigt die aktuelle Modulnummer an (sinnvoll falls kein Echo) 
 -  Q,W Zeilennummern/Hexadressen mitprotokollieren (falls kein Echo) 
 -  S   Keine Zeilennummern/Hexadressen ausgeben (l„uft auch im Hintergrund) 
 - 
 - 
 -#ub#1.1.1  Datenrepr„sentation#ue# 
 - 
 -INT-Zahlen werden hexadezimal (xxxxH, xxH) oder dezimal dargestellt, 
 -TEXTe in Anfhrungszeichen ("..."), 
 -REALs im 20-Stellen scientific-Format, 
 -TASK-Objekte durch XX-YYYY/"name" mit XX als Taskindex und YYYY als Version,
 -   wenn die Stationsnummer nicht 0 ist, wird sie vor XX als SS- dargestellt. 
 -DATASPACE-Objekte werden durch XX-YY repr„sentiert (XX ist der eigene
 -   Taskindex, YY ist die Datenraumnummer), 
 -BOOL-Objekte durch TRUE oder FALSE. 
 -Module werden durch ihre Modulnummer, optional auch durch ihre
 -   Startadresse, und falls m”glich durch ihren Namen repr„sentiert. Die
 -   Parameterliste wird in den F„llen, wo das Modul in der Permanenttabelle
 -   vermerkt ist auch angegeben. 
 -Nicht weiter dereferenzierbare Adressen werden durch ein vorgestelltes '@'
 -gekennzeichnet (z.B. BOUND-Objekte). 
 -In den F„llen, wo es mehrere sinnvolle Darstellungen gibt, werden diese
 -durch ein '|' getrennt. 
 - 
 - 
 -#ub#1.1.2  Datenadressen#ue# 
 - 
 -Zus„tzlich zu den globalen Daten (statische Variablen und Denoter) kann auch
 -deren Adresse ausgegeben werden. Die Daten werden in einer, ihrem Typ
 -entsprechenden, Darstellung ausgegeben. Komplexe oder zusammengesetzte
 -Datentypen werden auf Repr„sentationen elementarer Datentypen (INT, REAL,
 -BOOL, TEXT, DATASPACE, TASK) abgebildet. 
 - 
 -Prozeduren, Operatoren und Paketinitialisierungen von Main-Packets werden
 -zusammenfassend als Module bezeichnet. Einem Modul geh”rt ein eigener
 -Stackbereich fr lokale Daten, Parameter und Rcksprungadresse etc. In
 -diesem Bereich stehen entweder die Datenobjekte selbst (z.B. lokale
 -Variablen) oder lokale Referenzadressen auf beliebige Objekte (lokale,
 -globale Daten, Fremddatenr„ume und sogar Module). 
 -Da die effektiven lokalen Adressen erst w„hrend der Runtime bekannt sind,
 -findet man im Decoder-Output nur die Adressoffsets relativ zum Stackanfang
 -des Moduls. 
 - 
 -Datenadressen werden in spitzen Klammern angegeben, Branch-Codeaddressen ohne
 -Klammern. Alle Adressen sind Wortaddressen. Der Adresstyp wird durch einen
 -Buchstaben nach '<' angezeigt: 
 -'G' kennzeichnet eine globale Adresse (Denoter oder statische Variable). Die
 -Representation der Daten kann immer angegeben werden (also nicht nur zur
 -Runtime). 
 -'L' kennzeichnet einen Adressoffset fr ein lokales Datenobjekt auf dem
 -Stack. Da die lokale Basis, d.h. die Anfangsadresse der Daten des aktuellen
 -Moduls, erst bei Runtime feststehen, kann hier weder die effektive
 -Datenadresse, noch der Inhalt des Datenobjekts angegeben werden. 
 -'LR' kennzeichnet eine lokale Referenzadresse, d.h. auf dem Stack steht
 -eine Adresse (32 Bit), die ein Datenobjekt adressiert. Žhnlich wie bei 'L'
 -kann auch bei 'LR' erst zur Runtime eine Representation des adressierten
 -Datenobjekts angegeben werden. Der Wert nach 'LR' bezeichnet den Offset, der
 -zur lokalen Basis addiert werden muá, um die Adresse der Referenzadresse zu
 -erhalten. Die niederwertigsten 16 Bit (das erste der beiden W”rter) k”nnen
 -128KB adressieren. Im h”herwertigsten Byte des zweiten Wortes steht die
 -Nummer des Datenraumes der eigenen Task, der das adressierte Datenobjekt
 -enth„lt (0 entspricht dem Standarddatenraum). Das niederwertigste Byte des
 -zweiten Wortes enth„lt die Segmentnummer (128KB-Segmente) mit dem
 -Wertebereich 0 bis 7 (maximal also 1MB/Datenraum). Im Standarddatenraum
 -(Datenraumnummer 4) enthalten die Segmente folgene Tabellen:
 - 
 -Segment Tabelle 
 -------------------------------------------------- 
 -   0    Paketdaten (high 120KB) und Moduladresstabelle
 -   1    Stack (low 64K), Heap (high 64K) 
 -   2    Codesegment
 -   3    Codesegment (120KB) u.a. fr eigene Module 
 -   4    Compilertabellen tempor„r 
 -   5    Compilertabellen permanent 
 -   6    nilsegment fr Compiler (FF's) 
 -   7    Compiler: Intermediate String 
 - 
 -Repr„sentationen von Datenobjekten, die in Fremddatenr„umen residieren
 -(BOUND-Objekte) k”nnen zur Zeit noch nicht ausgegeben werden, statt dessen
 -wird die Datenraumnummer und die Wortadresse innerhalb dieses Datenraums
 -ausgegeben. 
 - 
 - 
 -#ub#1.1.3  Codeadressen#ue# 
 - 
 -Module werden in der Regel (Ausnahme: Parameterprozeduren) ber ihre
 -Modulnummer angesprochen, aus der dann die Adresse des Moduls berechnet
 -werden kann (mithilfe der Moduladresstabelle). Die Adressen der
 -Parameterprozeduren sind vom Typ 'LR' (Local-Reference), kommen nur als
 -Parameter auf dem Stack vor und beeinhalten Codesegment und Codeadresse. 
 - 
 -Sprungadressen (von Branch-Befehlen) adressieren immer nur das eigene
 -Segment und davon auch nur eine Adresse innerhalb eines 8 KB groáen
 -Bereichs. 
 - 
 - 
 -#ub#1.2  Ablaufverfolgung (Tracer)#ue# 
 - 
 -Um den eigenen (!) Code im Einzelschrittbetrieb abzuarbeiten, wird der
 -Tracer benutzt. Auáer den Inhalten der globalen Daten kann man sich die
 -Inhalte der Stackobjekte (lokale Variablen) und der aktuellen Parameter
 -eines Prozeduraufrufs (auch von Parameterprozeduren) ansehen. Es k”nnen
 -keine Daten ver„ndert werden! 
 -Man hat die M”glichkeit 
 -- die Resultate der letzten ausgefhrten Instruktion oder 
 -- die aktuellen Parameter fr den n„chsten Instruktionsaufruf 
 -zu beobachten. 
 -Der Inhalt des Stacks kann sequentiell durchgesehen werden, Error- und
 -Disablestop-Zustand k”nnen gel”scht werden. 
 -Der Einzelschrittablauf kann protokolliert und die entsprechende
 -Sourceline parallel zum ausgefhrten Code beobachtet werden. 
 -Der Einzelschrittbetrieb kann, ber Teile des Codes hinweg, ausgeschaltet
 -werden, z.B. fr h„ufig durchlaufene Schleifen.
 -Fr die Repr„sentation der Daten und deren Adressen gilt das unter 1.1
 -gesagte. 
 -Der Tracer wird mit 'trace' aufgerufen. W„hrend der Aktivit„t des Tracers
 -stehen folgende Funktionen zur Verfgung (Nur der erste Buchstabe wird
 -getippt): 
 - 
 -Abkrzung Funktion 
 --------------------------------------------------------------------------- 
 -  Auto    Die Befehle werden im Einzelschrittbetrieb ausgefhrt, ohne daá
 -          eine Taste gedrckt werden muá. 
 -  Bpnt    Der n„chste Breakpoint wird an eine vom Benutzer festgelegte
 -          Codeadrese gesetzt. Damit k”nnen Teile des Codes abgearbeitet
 -          werden, ohne daá der Einzelschrittmodus aktiv ist. Nach der
 -          Eingabe der Adresse wird der Befehl an dieser Adresse angezeigt.
 -          Best„tigt wird die Richtigkeit mit <RETURN> oder 's'. 
 -  Clrr    Ein eventuell vorliegender Fehlerzustand wird gel”scht. 
 -  Dstp    'disable stop' wird fr das untersuchte Modul gesetzt. 
 -  Estp    'enable stop' wird fr das untersuchte Modul gesetzt. 
 -  File    Der Name der kompilierten Quelldatei wird eingestellt. 
 -  Go      Der Code wird bis zum Ende abgearbeitet, ohne daá der Tracer
 -          aktiviert wird. 
 -  Prot    Der Name der Protokollfile wird eingestellt. Die abgearbeiteten
 -          Instruktionen werden in dieser File protokolliert. 
 -  Rslt    Es wird umgeschaltet, ob die angezeigte Instruktion nach <RETURN>
 -          oder 's' abgearbeitet werden soll (Forward-Trace, 'F') oder ob das
 -          Ergebnis der letzten ausgefhrten Instruktion angezeigt werden soll
 -          (Result-Trace, 'R'). Der aktuelle Zustand dieses Switches wird in
 -          der ersten Bildschirmzeile durch 'R' oder 'F' gekennzeichnet. 
 -          Kurzzeitige Umschaltung, um das Ergebnis der letzten Operation
 -          anzusehen, ist auch m”glich (zweimal 'r' tippen). 
 -  Step/CR Mit <RETURN> oder 's' wird die n„chste Instruktion ausgefhrt.
 -          Dies ist bei Forward-Trace die angezeigte Instruktion. 
 -  Term    Bis zur n„chst 'h”heren' Prozedur der CALL-Sequence, die im
 -          'disable stop'-Zustand arbeitet, werden die Module verlassen. In
 -          der Regel bedeutet dies ein Programmabbruch. Alle Breakpoints sind
 -          anschlieáend zurckgesetzt. 
 -  -       Der Stackpointer auf den sichtbaren Stack (in der ersten
 -          Bildschirmzeile) wird um zwei verringert. Er zeigt auf die n„chst
 -          tiefere Referenzadresse. Der EUMEL-0-Stackpointer wird nicht
 -          ver„ndert.
 -  +       Der Stackpointer auf den sichtbaren Stack wird um zwei erh”ht. 
 -  <       Bei der Befehlsausgabe werden die Parameteradressen zus„tzlich
 -          ausgegeben (in spitzen Klammern).
 -  >       Bei der Befehlsausgabe werden keine Parameteradressen ausgegeben,
 -          sondern nur die Darstellungen der Parameter (z.B.
 -          Variableninhalte) 
 - 
 -#page# 
 -#ub#2.  EUMEL0-Instruktionen#ue# 
 - 
 - 
 -#ub#2.1  Erl„uterung der Instruktionen (Thematisch sortiert)#ue# 
 - 
 -Nach der H„ufigkeit ihres Vorkommens im Code unterscheidet man 3 Klassen von
 -Instruktionen: 30 Prim„rbefehle, 6 Spezialbefehle und z.Zt. 127
 -Sekund„rbefehle. 
 -Die Prim„rbefehle enthalten im ersten Wort den Opcode (5 Bit) und 11 Bit fr
 -die erste Parameteradresse d.h. den Wertebereich 0..2047. Liegt die
 -Parameteradresse auáerhalb dieses Bereichs, dann ersetzt ein
 -Umschaltprefix (LONGAddress) die Opcodebits und im lowbyte des
 -ersten Wortes wird der Opcode codiert. Die erste Parameteradresse befindet
 -sich dann als 16 Bit-Wert im zweiten Wort. 
 -Spezialbefehle enthalten im ersten Wort auáer dem Opcode (8 Bit) noch einen
 -8 Bit-Immediatewert (Bytekonstante). 
 -Sekund„rebefehle enthalten im ersten Wort nur den Opcode (16 Bit), der aus
 -einem Umschaltprefix (ESCape, wird im folgenden weggelassen) und im lowbyte
 -dem 8 Bit Sekndaropcode besteht. 
 - 
 -Im folgenden werden Datenadressen mit 'd', Immediatewerte mit 'v' (Value),
 -Codeadressen mit 'a' und Modulnummern mit 'm' bezeichnet. Die Anzahl dieser
 -Buchstaben gibt die L„nge der ben”tigten Opcodebits (DIV 4) an. Ausnahmsweise
 -bezeichnet .nn:dd einen 5 Bit Opcode ('nn') und eine 11 Bit Adresse ('dd'). 
 - 
 -Der Adresstyp ist in den Bits 14 und 15 codiert: 
 -15 14  Typ       Effektive Adresse 
 - 0  0  global    dddd + pbase (pbase wird mit PENTER eingestellt) 
 - 1  0  local     (dddd AND 7FFF) DIV 2 + lbase (lbase wird beim CALL gesetzt) 
 - 1  1  local ref  adr := ((dddd AND 7FFF) DIV 2 + lbase) ; (adr+1, adr)
 - 
 -Der Wert eines Wortes an der ersten Parameteradresse wird mit <d1>
 -bezeichnet. Ein Datentyp vor der spitzen Klammer gibt seinen Typ an. Fr die 
 -anderen Parameter gilt entsprechendes (<d2>, <d3>, ...). 
 - 
 - 
 -#ub#2.1.1  Datentransportbefehle#ue# 
 - 
 -MOV    .08:dd dddd           1 Wort (z.B. INT/BOOL) wird von der linken
 -                             Adresse zur rechten Adresse transportiert. 
 -                             <d2> := <d1> 
 - 
 -FMOV   .34:dd dddd           4 W”rter (z.B. REAL) von linker Adresse zur
 -                             rechten Adresse tranportieren (kopiert). 
 -                             <d2> := <d1> 
 - 
 -TMOV   .4C:dd dddd           Kopiert einen Text von der linken Adresse zur
 -                             rechten Adresse. 
 -                             TEXT<d2> := TEXT<d1> 
 - 
 -MOVi   FC vv dddd            Die Konstante vv (1 Byte) wird als positive
 -                             16 Bit-Zahl dem Wort an der Adresse dddd
 -                             zugewiesen. 
 -                             <d1> := vv 
 - 
 -MOVii  7F 23 vvvv dddd       Dem Wort an der Adresse dddd wird die 16-Bit
 -                             Konstante vvvv zugewiesen. 
 -                             <d1> := vvvv 
 - 
 -MOVx   7D vv dddd dddd       Von der linken Adresse zur rechten Adresse
 -                             werden vv (max. 255) W”rter transportiert. 
 -                             <d2> := <d1> (vv W”rter) 
 - 
 -MOVxx  7F 21 vvvv dddd dddd  Von der linken Adresse zur rechten Adresse
 -                             werden vvvv (max. 65535) W”rter transportiert. 
 -                             <d2> := <d1> (vvvv W”rter) 
 - 
 - 
 -#ub#2.1.2  INT-Operationen#ue# 
 - 
 -ARITHS 7F 5B                 Schaltet um auf vorzeichenbehaftete
 -                             INT-Arithmetik (Normalfall). 
 -                             ARITH := Signed 
 - 
 -ARITHU 7F 5C                 Schaltet um auf vorzeichenlose 16Bit-Arithmetik
 -                             (Compiler). 
 -                             ARITH := Unsigned 
 - 
 -CLEAR  .24:dd                Dem Wort an der Adresse dd wird 0 zugewiesen. 
 -                             <d1> := 0 
 - 
 -INC1   .0C:dd                Der Inhalt des Wortes an der Adresse dddd wird
 -                             um eins erh”ht. 
 -                             <d1> := <d1> + 1 
 - 
 -DEC1   .10:dd                Der Inhalt des Wortes an der Adresse dddd wird
 -                             um eins verringert. 
 -                             <d1> := <d1> - 1 
 - 
 -INC    .14:dd dddd           Der Inhalt des Wortes an der ersten Adresse wird
 -                             zum Inhalt des Wortes an der zweiten Adresse
 -                             addiert. 
 -                             <d2> := <d2> + <d1> 
 - 
 -DEC    .18:dd dddd           Der Inhalt des Wortes an der ersten Adresse wird
 -                             vom Inhalt des Wortes an der zweiten Adresse
 -                             subtrahiert. 
 -                             <d2> := <d2> - <d1> 
 - 
 -ADD    .1C:dd dddd dddd      Der Inhalt der Worte der beiden ersten
 -                             Adressen wird addiert und bei der dritten
 -                             Adresse abgelegt. 
 -                             <d3> := <d1> + <d2> 
 - 
 -SUB    .20:dd dddd dddd      Der Inhalt des Wortes an der zweiten Adresse
 -                             wird vom Inhalt des Wortes an der ersten Adresse
 -                             subtrahiert und das Resultat im Wort an der
 -                             dritten Adresse abgelegt. 
 -                             <d3> := <d1> - <d2> 
 - 
 -MUL    7F 29 dddd dddd dddd  Der Wert der W”rter an den beiden ersten
 -                             Adressen wird vorzeichenbehaftet multipliziert
 -                             und im Wort an der dritten Adresse abgelegt.
 -                             Ein šberlauf wird im Falle der vorzeichenlosen
 -                             Arithmetik ignoriert (<d3> MOD 65536). 
 -                             <d3> := <d1> * <d2> 
 - 
 -IMULT  7F 28 dddd dddd dddd  Der Wert der W”rter an den beiden ersten
 -                             Adressen wird vorzeichenlos multipliziert und
 -                             im Wort an der dritten Adresse abgelegt. 
 -                             Falls das Resultat ein Wert gr”áer 65535 w„re,
 -                             wird <d3> := FFFFH, sonst 
 -                             <d3> := <d1> * <d2> 
 - 
 -DIV    7F 2A dddd dddd dddd  Der Wert des Wortes an der ersten Adresse wird
 -                             durch den Wert des Wortes an der zweiten
 -                             Adresse dividiert und im Wort an der dritten
 -                             Adresse abgelegt. Eine Division durch 0 fhrt
 -                             zum Fehler. 
 -                             <d3> := <d1> DIV <d2> 
 - 
 -MOD    7F 2B dddd dddd dddd  Der Rest der Division (wie bei DIV) wird im
 -                             Wort an der dritten Adresse abgelegt. Falls
 -                             <d2> = 0 ist, wird ein Fehler ausgel”st. 
 -                             <d3> := <d1> MOD <d2>
 - 
 -NEG    7F 27 dddd            Der Wert des Wortes an der Adresse dddd wird
 -                             arithmetisch negiert (Vorzeichenwechsel). 
 -                             <d1> := -<d1> 
 - 
 -AND    7F 7C dddd dddd dddd  Der Wert der beiden W”rter an den beiden ersten
 -                             Adressen wird bitweise UND-verknpft und das
 -                             Resultat im Wort an der dritten Adresse
 -                             abgelegt. 
 -                             <d3> := <d1> AND <d2> 
 - 
 -OR     7F 7D dddd dddd dddd  Der Wert der beiden W”rter an den beiden ersten
 -                             Adressen wird bitweise ODER-verknpft und das
 -                             Resultat im Wort an der dritten Adresse
 -                             abgelegt. 
 -                             <d3> := <d1> OR <d2> 
 - 
 -XOR    7F 79 dddd dddd dddd  Der Wert der beiden W”rter an den beiden ersten
 -                             Adressen wird bitweise Exklusiv-ODER-verknpft
 -                             und das Resultat im Wort an der dritten Adresse
 -                             abgelegt. 
 -                             <d3> := <d1> XOR <d2> 
 - 
 -ROTATE 7F 53 dddd dddd       Der Wert an der ersten Adresse wird um soviele
 -                             Bits links oder rechts rotiert, wie es der Wert
 -                             des zweiten Parameters angibt (positiv =
 -                             links). 
 -                             IF <d2> < 0 
 -                                THEN <d1> := <d1> ROR <d2> 
 -                                ELSE <d1> := <d1> ROL <d2> 
 -                             FI 
 -  
 - 
 -#ub#2.1.3  REAL-Operationen#ue#
 - 
 -FADD   .38:dd dddd dddd      Die beiden ersten REAL-Werte werden addiert und
 -                             das Resultat an der dritten Adresse abgelegt. 
 -                             REAL<d3> := REAL<d1> + REAL<d2> 
 - 
 -FSUB   .3C:dd dddd dddd      Der zweite REAL-Wert wird vom ersten
 -                             subtrahiert und das Resultat an der dritten
 -                             Adresse abgelegt. 
 -                             REAL<d3> := REAL<d1> + REAL<d2> 
 - 
 -FMUL   .40:dd dddd dddd      Die beiden ersten REAL-Werte werden
 -                             multipliziert und das Resultat an der dritten
 -                             Adresse abgelegt. 
 -                             REAL<d3> := REAL<d1> * REAL<d2> 
 - 
 -FDIV   .44:dd dddd dddd      Der erste REAL-Wert wird durch den zweiten
 -                             dividiert und das Resultat an der dritten
 -                             Adresse abgelegt. 
 -                             REAL<d3> := REAL<d1> / REAL<d2> 
 - 
 -FNEG   7F 26 dddd            Das Vorzeichen des REAL-Wertes an der Adresse
 -                             dddd wird gewechselt. 
 -                             REAL<d1> := -REAL<d1> 
 - 
 -FSLD   7F 60 dddd dddd dddd  Die Mantisse des REAL-Wertes an der zweiten
 -                             Adresse wird um ein Digit (4 Bit BCD) nach
 -                             links verschoben, Vorzeichen und Exponent
 -                             bleiben unver„ndert. Das vorher h”herwertigste
 -                             Digit steht danach im Wort an der dritten
 -                             Adresse. Das neue niederwertigste Digit wurde
 -                             aus dem Wort der ersten Adresse entnommen. 
 -                             INT<d3> := digit1<d2> ; 
 -                             REAL<d2> := REAL<d2> SLD 1 ; 
 -                             digit13<d2> := INT<ÿ1> 
 - 
 -GEXP   7F 61 dddd dddd       Der Exponent des REAL-Wertes an der ersten
 -                             Adresse wird in das Wort an der zweiten Adresse
 -                             gebracht. 
 -                             INT<d2> := exp<d1> 
 - 
 -SEXP   7F 62 dddd dddd       Der Wert des Wortes an der ersten Adresse wird
 -                             in den Exponenten des REAL-Wertes an der zweiten
 -                             Adresse gebracht. 
 -                             exp<d2> := INT<d1> 
 - 
 -FLOOR  7F 63 dddd dddd       Der REAL-Wert an der ersten Adresse wird ohne
 -                             Dezimalstellen an der zweiten Adresse abgelegt. 
 -                             <d2> := floor<d1> 
 -   
 - 
 -#ub#2.1.4  TEXT-Operationen#ue# 
 - 
 -ITSUB  7F 2D dddd dddd dddd  Aus dem TEXT an der ersten Adresse wird das
 -                             Wort, dessen Position durch das Wort an der
 -                             zweiten Adresse beschrieben wird, im Wort an
 -                             der dritten Adresse abgelegt. 
 -                             INT<d3> := TEXT<d1>[INT<d2>,2] (Notation:
 -                             t[n,s] bezeichnet das n. Element mit einer
 -                             GrӇe von s Bytes, der Bytekette t an der
 -                             Byteposition n*s+1) 
 - 
 -ITRPL  7F 2E dddd dddd dddd  In dem TEXT an der ersten Adresse wird das
 -                             Wort, dessen Position durch das Wort an der
 -                             zweiten Adresse beschrieben wird, durch das Wort
 -                             an der dritten Adresse ersetzt. 
 -                             TEXT<d1>[INT<d2>,2] := INT<d3> 
 - 
 -DECOD  7F 2F dddd dddd       Der dezimale ASCII-Wert des Zeichens im TEXT an
 -                             der ersten Adresse wird im Wort an der zweiten
 -                             Adresse abgelegt. 
 -                             INT<d2> := code (TEXT<d1>) 
 - 
 -ENCOD  7F 30 dddd dddd       Dem der TEXT an der zweiten Adresse wird ein
 -                             Zeichen zugewiesen, das dem ASCII-Wert im Wort
 -                             an der ersten Adresse entspricht. 
 -                             TEXT<d2> := code (INT<d1>) 
 - 
 -SUBT1  7F 31 dddd dddd dddd  Dem TEXT an der dritten Adresse wird das
 -                             Zeichen des TEXTes an der ersten Adresse
 -                             zugewiesen, dessen Position durch das Wort an
 -                             der zweiten Adresse bestimmt ist. 
 -                             TEXT<d3> := TEXT<d1>[INT<d2>, 1] 
 - 
 -SUBTFT 7F 32 dddd dddd dddd dddd  Dem TEXT an der vierten Adresse wird ein
 -                             Teiltext des TEXTes an der ersten Adresse
 -                             zugewiesen, dessen Startposition im Wort an der
 -                             zweiten Adresse steht und dessen Endposition im
 -                             Wort an der dritten Adresse steht. 
 -                             TEXT<d3> := subtext (TEXT<d1>, INT<d2>, INT<d3>) 
 - 
 -SUBTF  7F 33 dddd dddd dddd  Dem TEXT an der dritten Adresse wird ein
 -                             Teiltext des TEXTes an der ersten Adresse
 -                             zugewiesen, der an der durch das Wort an der
 -                             zweiten Adresse beschriebenen Position beginnt
 -                             und bis zum Ende des Sourcetextes geht. 
 -                             TEXT<d3> := subtext (TEXT<d1>, INT<d2>, length
 -                             (TEXT<d1>)) 
 - 
 -REPLAC 7F 34 dddd dddd dddd  Der TEXT an der ersten Adresse wird ab der
 -                             Position, die durch das Wort an der zweiten
 -                             Position bestimmt wird, durch den TEXT an der
 -                             dritten Adresse ersetzt. 
 -                             replace (TEXT<d1>, INT<d2>, TEXT<d3>) 
 - 
 -CAT    7F 35 dddd dddd       Der TEXT an der zweiten Adresse wird an das
 -                             Ende des TEXTes an der ersten Adresse angefgt. 
 -                             TEXT<d1> := TEXT<d1> + TEXT<d2> 
 - 
 -TLEN   7F 36 dddd dddd       Die L„nge des TEXTes an der ersten Adresse wird
 -                             im Wort an der zweiten Adresse abgelegt. 
 -                             INT<d2> := length (TEXT<d1>) 
 - 
 -POS    7F 37 dddd dddd dddd  Die Position des ersten Auftretens des TEXTes
 -                             an der zweiten Adresse, innerhalb des TEXTes an
 -                             der ersten Adresse, wird im Wort an der dritten
 -                             Adresse abgelegt. 
 -                             INT<d3> := pos (TEXT<d1>, TEXT<d2>, 1, length
 -                             (TEXT<d1>))
 - 
 -POSF   7F 38 dddd dddd dddd dddd 
 -                             Die Position des ersten Auftretens des TEXTes
 -                             an der zweiten Adresse, innerhalb des TEXTes an
 -                             der ersten Adresse, ab der Position die durch
 -                             den Inhalt des Wortes an der dritten Adresse
 -                             bestimmt ist, wird im Wort an der vierten
 -                             Adresse abgelegt. 
 -                             INT<d4> := pos (TEXT<d1>, TEXT<d2>, INT<d3>,
 -                             length (TEXT<d1>)) 
 - 
 -POSFT  7F 39 dddd dddd dddd dddd dddd 
 -                             Die Position des ersten Auftretens des TEXTes
 -                             an der zweiten Adresse, innerhalb des TEXTes an
 -                             der ersten Adresse, ab der Position die durch
 -                             den Inhalt des Wortes an der dritten Adresse
 -                             bestimmt ist, bis zur Position die durch den
 -                             Inhalt des Wortes an der vierten Adresse
 -                             bestimmt ist, wird im Wort an der fnften
 -                             Adresse abgelegt. 
 -                             INT<d5> := pos (TEXT<d1>, TEXT<d2>, INT<d3>,
 -                             INT<d4>) 
 - 
 -STRANL 7F 3A dddd dddd dddd dddd dddd dddd dddd 
 -                             (ROW 256 INT CONST, INT VAR, INT CONST,
 -                             TEXT CONST, INT VAR, INT CONST, INT VAR): 
 -                             Vereinfachte funktionsweise: 
 -                             extension := FALSE ;
 -                             FOR INT<d5> FROM INT<d5> UPTO min (INT<d6>,
 -                                 length (TEXT<d4>)) WHILE INT<d2> < INT<d3> 
 -                             REP 
 -                               IF extension 
 -                                  THEN extension := FALSE
 -                                  ELSE INT<d7>:=ROW<d1>[TEXT<d4>[INT<d5>,1]];
 -                                       IF INT<d7> < 0 
 -                                          THEN extension := TRUE ; 
 -                                               INT<d2> INCR (INT<d7>-8000H)
 -                                          ELSE INT<d2> INCR INT<d7> 
 -                                       FI 
 -                               FI 
 -                             PER
 - 
 -POSIF  7F 3B dddd dddd dddd dddd dddd 
 -                             Die Position des ersten Auftretens des, durch
 -                             die beiden Zeichen des TEXTes an der zweiten
 -                             und dritten Adresse begrenzten ASCII-Bereichs
 -                             (lowchar, highchar), Zeichens innerhalb des
 -                             TEXTes an der ersten Adresse, wird ab der
 -                             Position, die durch das Wort an der vierten
 -                             Adresse beschrieben wird, im Wort an der
 -                             fnften Adresse abgelegt. 
 -                             INT<d5> := pos (TEXT<d1>, TEXT<d2>, TEXT<d3>,
 -                             INT<d4>). 
 - 
 -GARB   7F 5F                 Es wird eine Garbagecollection fr den
 -                             taskeigenen TEXT-Heap durchgefhrt. 
 - 
 -HPSIZE 7F 5E dddd            Die aktuelle GrӇe des TEXT-Heaps wird in dem
 -                             Wort an der Adresse dddd abgelegt. 
 -                             <d1> := heapsize 
 - 
 -RTSUB  7F 64 dddd dddd dddd  Aus dem TEXT an der ersten Adresse wird der
 -                             REAL-Wert, dessen Position durch das Wort an
 -                             der zweiten Adresse beschrieben wird, an der
 -                             dritten Adresse abgelegt. 
 -                             REAL<d3> := TEXT<d1>[INT<d2>, 8] 
 - 
 -RTRPL  7F 65 dddd dddd dddd  In dem TEXT an der ersten Adresse wird der
 -                             REAL-Wert, dessen Position durch das Wort an der
 -                             zweiten Adresse beschrieben wird, durch den
 -                             REAL-Wert an der dritten Adresse ersetzt. 
 -                             TEXT<d1>[INT<d2>, 8] := REAL<d3> 
 - 
 - 
 -#ub#2.1.5  DATASPACE-Operationen#ue# 
 - 
 -DSACC  .58:dd dddd           Die dsid an der ersten Adresse wird auf
 -                             Gltigkeit geprft und an der zweiten Adresse
 -                             eine Referenzaddresse abgelegt, die auf das
 -                             4. Wort des Datenraumes (den Anfang des
 -                             Datenbereichs) zeigt. 
 -                             IF valid ds (DS<d1>) 
 -                                THEN REF<d2> := DATASPACE<d1>.ds base 
 -                                ELSE "falscher DATASPACE-Zugriff" 
 -                             FI 
 - 
 -ALIAS  7F 22 vvvv dddd dddd  Dem BOUND-Objekt an der dritten Adresse wird
 -                             der Datenraum an der zweiten Adresse zugewiesen
 -                             (INT-Move). Zuvor wird geprft, ob dies der
 -                             erste Zugriff auf den Datenraum ist. Falls ja,
 -                             wird der Datenraumtyp auf 0 gesetzt. Falls ein
 -                             Heap aufgebaut werden muá und noch keiner
 -                             angelegt wurde, wird die Anfangsadresse des
 -                             Heaps auf den Wert vvvv+4 innerhalb des
 -                             Datenraumes gesetzt. 
 -                             IF DATASPACE<d1>.typ < 0 
 -                                THEN DATASPACE<d1>.typ := 0 
 -                             FI ; 
 -                             IF DATASPACE<d1>.heapanfang < 0 
 -                                THEN DATASPACE<d1>.heapanfang := vvvv+4 
 -                             FI ;
 -                             INT<d2> := INT<d1> 
 - 
 -NILDS  7F 45 dddd            Dem Datenraum an der Adresse dddd wird der
 -                             'nilspace' zugewiesen. 
 -                             INT<d1> := 0 
 - 
 -DSCOPY 7F 46 dddd dddd       Dem Datenraum an der ersten Adresse wird eine
 -                             Kopie des Datenraumes an der zweiten Adresse
 -                             zugewiesen (neue dsid). Es wird ein neuer
 -                             Eintrag in die Datenraumverwaltung aufgenommen. 
 -                             DATASPACE<d1> := DATASPACE<d2> 
 - 
 -DSFORG 7F 47 dddd            Der Datenraum, dessen dsid an der Adresse dddd
 -                             steht, wird aus der Datenraumverwaltung
 -                             gel”scht. 
 -                             forget (DATASPACE<d1>) 
 - 
 -DSWTYP 7F 48 dddd dddd       Der Typ des Datenraums, dessen dsid an der
 -                             ersten Adresse steht, wird auf den Wert des
 -                             Wortes an der zweiten Adresse gesetzt. 
 -                             DATASPACE<d1>.typ := INT<d2> ; 
 -                             IF DATASPACE<d1>.heapanfang < 0 
 -                                THEN DATASPACE<d1>.heapanfang := vvvv+4 
 -                             FI 
 - 
 -DSRTYP 7F 49 dddd dddd       Der Typ des Datenraums, dessen dsid an der
 -                             ersten Adresse steht, wird in dem Wort an der
 -                             zweiten Adresse abgelegt. 
 -                             INT<d2> := DATASPACE<d1>.typ ;
 -                             IF DATASPACE<d1>.heapanfang < 0 
 -                                THEN DATASPACE<d1>.heapanfang := vvvv+4 
 -                             FI 
 - 
 -DSHEAP 7F 4A dddd dddd       Die Endaddresse Textheaps des Datenraums, dessen
 -                             dsid an der ersten Adresse steht, in 1kB
 -                             Einehiten, wird in dem Wort an der zweiten
 -                             Adresse abgelegt. Falls dieser Wert = 1023 oder 
 -                             < 96 ist, ist kein Heap vorhanden, anderenfalls
 -                             ist seine GrӇe (in KB): <d2>-96. 
 -                             INT<d2> := DATASPACE<d1>.heapende DIV 1024 
 - 
 -NXTDSP 7F 4B dddd dddd dddd  Fr den Datenraum an der ersten Adresse wird
 -                             die Nummer der Seite, die auf die Nummer der
 -                             Seite folgt, die in dem Wort an der zweiten Adresse
 -                             steht an der zweiten Adresse abgelegt. Falls
 -                             keine Seite mehr folt, wird -1 geliefert. 
 -                             INT<d2> := nextdspage (DATASPACE<d1>, INT<d2>) 
 - 
 -DSPAGS 7F 4C dddd dddd dddd  Fr den Datenraum mit der Nummer, die im Wort
 -                             an der ersten Adresse steht, und der Task deren
 -                             Nummer im Wort an der zweiten Adresse steht,
 -                             wird die Anzahl der belegten Seiten im Wort an
 -                             der dritten Adresse abgelegt. 
 -                             INT<d3> := ds pages (INT<d2>, INT<d1>) 
 - 
 -SEND   7F 71 dddd dddd dddd dddd 
 -                             Der Datenraum an der dritten Adresse wird der
 -                             Task, deren id an der ersten Adresse steht, mit
 -                             dem Messagecode der an der zweiten Adresse
 -                             steht, gesendet. Der Antwortcode wird im Wort
 -                             an der vierten Adresse abgelegt. Vereinfachte 
 -                             Semantik: 
 -                             send (TASK<d1>, INT<d2>, DATASPACE<d3>, INT<d4>) 
 - 
 -WAIT   7F 72 dddd dddd dddd  Die eigene Task geht in einen offenen
 -                             Wartezustand, bei dem sie empfangsbereit ist fr
 -                             einen Datenraum einer anderen Task. Die id der
 -                             sendenden Task wird an der ersten Adresse
 -                             abgelegt, der Messagecode an der zweiten
 -                             Adresse, der gesendete Datenraum an der dritten
 -                             Adresse. Vereinfachte Semantik: 
 -                             wait (TASK<d1>, INT<d2>, DATASPACE<d3>) 
 - 
 -SWCALL 7F 73 dddd dddd dddd dddd 
 -                             Der Datenraum an der dritten Adresse wird der
 -                             Task, deren id an der ersten Adresse steht, mit
 -                             dem Messagecode der an der zweiten Adresse
 -                             steht, gesendet bis die Task empfangsbereit ist.
 -                             Dann wird auf einen zurckgesandten Datenraum
 -                             dieser Task gewartet, der an der dritten
 -                             Adresse abgelegt wird. Der zurckgesendete
 -                             Messagecode wird an der vierten Adresse
 -                             abgelegt. Vereinfachte Semantik: 
 -                             REP
 -                              send (TASK<d1>, INT<d2>, DATASPACE<d3>,INT<d4>) 
 -                             UNTIL INT<d4> <> task busy PER ; 
 -                             wait (TASK<d1>, INT<d4>, DATASPACE<d3>) 
 - 
 -PPCALL 7F 7A dddd dddd dddd dddd 
 -                             Wirkt wie SWCALL, wartet aber nicht bis die
 -                             Zieltask empfangsbereit ist, sondern liefert -2
 -                             an der vierten Adresse zurck, wenn die Task
 -                             nicht empfangsbereit ist. Vereinfachte
 -                             Semantik: 
 -                             send (TASK<d1>, INT<d2>, DATASPACE<d3>,INT<d4>); 
 -                             IF INT<d4> <> task busy 
 -                                THEN wait (TASK<d1>, INT<d4>, DATASPACE<d3>) 
 -                             FI 
 - 
 -SENDFT 7F 7F dddd dddd dddd dddd dddd 
 -                             Der Datenraum an der vierten Adresse wird der
 -                             Task, deren id an der zweiten Adresse steht,
 -                             mit dem Messagecode der an der dritten Adresse
 -                             steht, gesendet als ob er von der Task k„me,
 -                             deren id an der ersten Adresse steht. Der
 -                             Antwortcode wird im Wort an der vierten
 -                             Adresse abgelegt. Dieser Befehl setzt eine
 -                             Priviligierung >= 1 voraus und ist nur wirksam,
 -                             wenn die from-Task einer anderen Station
 -                             angeh”rt. Vereinfachte Semantik: 
 -                             IF station (TASK<d1>) = station (myself)
 -                                THEN send (TASK<d2>, INT<d3>, DATASPACE<d4>,
 -                                           INT<d5>) 
 -                                ELSE save myself := myself ;
 -                                     myself := TASK<d1> ; 
 -                                     send (TASK<d2>, INT<d3>, DATASPACE<d4>,
 -                                           INT<d5>) ; 
 -                                     myself := save myself
 -                             FI 
 - 
 - 
 -#ub#2.1.6  TASK-Operationen#ue# 
 - 
 -TWCPU  7F 52 dddd dddd       Die CPU-Zeit der Task, deren Nummer an der
 -                             ersten Adresse steht, wird auf den REAL-Wert,
 -                             der an der zweiten Adresse steht gesetzt. Dieser
 -                             Befehl setzt eine Privilegierung > 1 voraus
 -                             (Supervisor). 
 -                             pcb(INT<d1>).clock := REAL<d2> 
 - 
 -TPBEGIN 7F 5F dddd dddd dddd aaaaaa 
 -                             Als Sohn der Task, deren Nummer an der ersten
 -                             Adresse steht, wird eine Task eingerichtet,
 -                             deren Nummer an der zweiten Adresse steht. Die
 -                             neue Task erh„lt die Privilegierung, deren
 -                             Nummer in dem Wort an der dritten Adresse
 -                             steht und wird mit der Prozedur gestartet,
 -                             deren Code bei der durch den vierten Parameter
 -                             bergebenen Refereznadresse beginnt. Dieser
 -                             Befehl  setzt eine Privilegierung > 1 voraus
 -                             (Supervisor). 
 - 
 -TRPCB  7F 68 dddd dddd dddd  Der Wert des Leitblockfeldes der Task
 -                             deren Nummer an der ersten Adresse steht und
 -                             der Nummer, die in dem Wort an der zweiten
 -                             Adresse steht, wird an der dritten Adresse
 -                             abgelegt. 
 -                             INT<d3> := pcb(INT<d1>, INT<d2>) 
 - 
 -TWPCB  7F 69 dddd dddd dddd  Der Wert an der dritten Adresse wird in das
 -                             Leitblockfeld mit der Nummer an der zweiten
 -                             Adresse der Task bertragen, deren Nummer an der
 -                             ersten Adresse steht. Privilegierung: 
 -                             0: Nur linenumber-Feld (0), der eigenen Task 
 -                             1: linenumber-Feld der eigenen Task und
 -                                prio-Feld (5) jeder Task 
 -                             2: Alle Felder 
 -                             Fr den Fall, daá die Privilegierung ok ist
 -                             gilt: 
 -                             pcb (INT<d1>, INT<d2>) := INT<d3> 
 - 
 -TCPU   7F 6A dddd dddd       Die CPU-Zeit der Task, deren Nummer an der
 -                             ersten Adresse steht, wird als REAL-Wert an der
 -                             zweiten Adresse abgelegt.  
 -                             REAL<d2> := pcb (INT<d1>).clock 
 - 
 -TSTAT  7F 6B dddd dddd       Der Status (busy, i/o, wait) der Task, deren
 -                             Nummer an der ersten Adresse steht, wird im Wort
 -                             an der zweiten Adresse abgelegt. 
 -                             INT<d2> := pcb (INT<d1>).status 
 - 
 -ACT    7F 6C dddd            Die Task mit der Nummer, die an der Adresse dddd
 -                             steht wird aktiviert (entblockt). Dieser Befehl
 -                             setzt eine Privilegierung >= 1 voraus. 
 -                             activate (INT<d1>) 
 - 
 -DEACT  7F 6D dddd            Die Task, deren Nummer an der Adresse dddd
 -                             steht, wird deaktiviert (geblockt). Dieser
 -                             Befehl setzt eine Privilegierung >= 1 voraus. 
 -                             deactivate (INT<d1>) 
 - 
 -THALT  7F 6E dddd            In der Task, deren Nummer an der Adresse dddd
 -                             steht, wird ein Fehler 'halt vom Terminal' 
 -                             induziert. Dieser Befehl setzt eine 
 -                             Privilegierung > 1 voraus (Supervisor). 
 -                             halt process (INT<d1>) 
 - 
 -TBEGIN 7F 6F dddd aaaaaa     Eine neue Task wird eingerichtet, deren Nummer
 -                             an der ersten Adresse steht. Die Adresse der
 -                             Startprozedur wird als Referenzadresse im
 -                             zweiten Parameter bergeben. Der Datenraum 4
 -                             wird von der aufrufenden Task geerbt. Als
 -                             Privilegierung wird 0 eingetragen. 
 -                             Dieser Befehl setzt eine Privilegierung > 1
 -                             voraus (Supervisor). 
 - 
 -TEND   7F 70 dddd            Die Task, deren Nummer an der Adresse dddd
 -                             steht, wird gel”scht (alle Datenr„ume) und aus
 -                             der Prozessverwaltung entfernt. Dieser Befehl 
 -                             setzt eine Privilegierung > 1 voraus
 -                             (Supervisor). 
 - 
 -PNACT  7F 76 dddd            Die Nummer der n„chsten aktivierten Task
 -                             wird aus der Aktivierungstabelle gelesen. Die
 -                             Suche beginnt mit dem Wert+1 an der Adresse. Die
 -                             Nummer n„chsten aktivierten Task wird an dieser
 -                             Adresse abgelegt.  
 -                             INT<d1> := next active (INT<d1>) 
 - 
 -DEFCOL 7F 80 dddd            Die Task an der Adresse wird als Collectortask
 -                             (fr Datenaustausch zwischen Stationen)
 -                             definiert. Dieser Befehl setzt eine
 -                             Privilegierung >= 1 voraus. 
 -                             TASK collector := TASK<d1> 
 - 
 - 
 -#ub#2.1.7  Tests und Vergleiche#ue# 
 - 
 -Alle Tests und Vergleiche liefern ein BOOL-Resultat, welches den Opcode des
 -nachfolgenden Branch-Befehls bestimmt (Aus LN wird BT aus BR wird BF). 
 - 
 -TEST   .28:dd                Liefert TRUE, wenn das Wort an der Adresse 0
 -                             ist (Auch fr BOOL-Variablen gebraucht: TRUE=0,
 -                             FALSE=1). 
 -                             FLAG := <d1> = 0 
 - 
 -EQU    .2C:dd dddd           Liefert TRUE, wenn die W”rter der beiden
 -                             Adressen gleich sind. 
 -                             FLAG := <d1> = <d2> 
 - 
 -LSEQ   .30:dd dddd           Liefert TRUE, wenn der Wert des Wortes an der
 -                             ersten Adresse (vorzeichenbehaftet) kleiner oder
 -                             gleich dem Wert des Wortes an der zweiten
 -                             Adresse ist. 
 -                             FLAG := INT<d1> <= INT<d2> 
 - 
 -FLSEQ  .48:dd dddd           Liefert TRUE, wenn der REAL-Wert an der ersten
 -                             Adresse kleiner oder gleich dem REAL-Wert an der
 -                             zweiten Adresse ist. 
 -                             FLAG := REAL<d1> <= REAL<d2> 
 - 
 -FEQU   7F 24 dddd dddd       Liefert TRUE, wenn der REAL-Wert an der ersten
 -                             Adresse gleich dem REAL-Wert an der zweiten
 -                             Adresse ist. 
 -                             FLAG := REAL<d1> = REAL<d2> 
 - 
 -TLSEQ  7F 25 dddd dddd       Liefert TRUE, wenn der TEXT an der ersten
 -                             Adresse kleiner oder gleich dem TEXT an der
 -                             zweiten Adresse ist. 
 -                             FLAG := TEXT<d1> <= TEXT<d2> 
 - 
 -TEQU   .50:dd dddd           Liefert TRUE, wenn der TEXT an der ersten
 -                             Adresse gleich dem TEXT an der zweiten Adresse
 -                             ist. 
 -                             FLAG := TEXT<d1> = TEXT<d2> 
 - 
 -ULSEQ  .54:dd dddd           Liefert TRUE, wenn der Wert des Wortes an der
 -                             ersten Adresse (vorzeichenlos) kleiner oder
 -                             gleich dem Wert des Wortes an der zweiten
 -                             Adresse ist. 
 -                             FLAG := INT<d1> "<=" INT<d2> 
 - 
 -EQUIM  7C vv dddd            Liefert TRUE, wenn der Wert des Wortes an der
 -                             Adresse dddd gleich der 8 Bit Konstanten vv
 -                             ist. 
 -                             FLAG := INT<d1> = vv 
 - 
 -ISDIG  7F 12 dddd            Liefert TRUE, wenn der ASCII-Code im Wort an
 -                             der Adresse dddd einer Ziffer entspricht. 
 -                             FLAG := INT<d1> >= 48 AND INT<d1> <= 57 
 - 
 -ISLD   7F 13 dddd            Liefert TRUE, wenn der ASCII-Code im Wort an
 -                             der Adresse dddd einer Ziffer oder einem
 -                             Kleinbuchstaben entspricht. 
 -                             FLAG := INT<d1> >= 48 AND INT<d1> <= 57 OR 
 -                                     INT<d1> >= 97 AND INT<d1> <= 122 
 - 
 -ISLCAS 7F 14 dddd            Liefert TRUE, wenn der ASCII-Code im Wort an
 -                             der Adresse dddd einem Kleinbuchstaben
 -                             entspricht. 
 -                             FLAG := INT<d1> >= 97 AND INT<d1> <= 122 
 - 
 -ISUCAS 7F 15 dddd            Liefert TRUE, wenn der ASCII-Code im Wort an
 -                             der Adresse dddd einem Groábuchstaben
 -                             entspricht. 
 -                             FLAG := INT<d1> >= 65 AND INT<d1> <= 90 
 - 
 -ISSHA  7F 18 dddd            Liefert TRUE, wenn der Wert des Wortes an der
 -                             Adresse dddd im Bereich 0..2047 liegt, d.h.
 -                             eine Kurzadresse ist, die noch zusammen mit dem
 -                             Opcode im ersten Wort eines Prim„rbefehls
 -                             untergebracht werden kann. 
 -                             FLAG := INT<d1> < 2048 
 - 
 -ISERR  7F 4E                 Liefert TRUE, wenn ein Fehlerzustand vorliegt. 
 -                             FLAG := ERROR 
 - 
 -EXTASK 7F 7B dddd            Liefert TRUE, wenn die Task, deren id an der
 -                             Adresse dddd steht, existiert (nicht "dead" und
 -                             korrekte Versionsnummer). 
 -                             FLAG := TASK<d1>.version =
 -                                     pcb (TASK<d1>.nr).version AND 
 -                                     pcb (TASK<d1>.nr).status <> dead 
 - 
 - 
 -#ub#2.1.8  I/O-Operationen#ue# 
 - 
 -OUT    7F 3C dddd            Der Text an der Adresse wird ausgegeben. 
 -                             out (TEXT<d1>) 
 - 
 -COUT   7F 3D dddd            Falls der Kanal frei ist und die INT-Zahl an
 -                             der Adresse dddd positiv ist, wird sie als
 -                             Dezimalzahl ausgegeben. 
 -                             IF free (channel) 
 -                                THEN out (text (INT<d1>, 5) + 5 * ""8"") 
 -                             FI 
 - 
 -OUTF   7F 3E dddd dddd       Der Text an der ersten Adresse wird ab der
 -                             Position, die durch den Wert des Wortes an der
 -                             zweiten Adresse bestimmt wird, bis zum Ende
 -                             ausgegeben. 
 -                             out (subtext (TEXT<d1>, INT<d2>, length
 -                             (TEXT<d1>))) 
 - 
 -OUTFT  7F 3F dddd dddd dddd  Der Text an der ersten Adresse wird ab der
 -                             Position, die durch den Wert an der zweiten
 -                             Adresse bestimmt wird, bis zur Position die
 -                             durch den Wert an der dritten Adresse bestimmt
 -                             wird, ausgegeben. 
 -                             out (subtext (TEXT<d1>, INT<d2>, INT<d3>)) 
 - 
 -INCHAR 7F 40 dddd            Es wird auf ein Eingabezeichen gewartet,
 -                             welches dann im TEXT an der Adresse dddd
 -                             abgelegt wird. 
 -                             IF zeichen da (channel) 
 -                                THEN TEXT<d1> := incharety 
 -                                ELSE offener wartezustand (inchar) ; 
 -                                     TEXT<d1> := incharety 
 -                             FI
 - 
 -INCETY 7F 41 dddd            Falls kein Eingabezeichen vorhanden ist, wird
 -                             im TEXT an der Adresse dddd niltext geliefert,
 -                             sonst das Eingabezeichen. 
 -                             IF zeichen da (channel) 
 -                                THEN TEXT<d1> := incharety 
 -                                ELSE TEXT<d1> := "" 
 -                             FI
 - 
 -PAUSE  7F 42 dddd            Der Wert an der Adresse dddd bestimmt die
 -                             Wartezeit in Zehntelsekunden, die gewartet
 -                             werden soll. Die Pause kann durch eine Eingabe
 -                             auf dem Kanal abgebrochen werden. 
 -                             IF NOT zeichen da (channel) 
 -                                THEN modi := INT<d1> ;
 -                                     offener wartezustand (pause) 
 -                             FI
 - 
 -GCPOS  7F 43 dddd dddd       Die Cursorposition wird erfragt. Die x-Position
 -                             wird an der ersten Adresse abgelegt, die
 -                             y-Position an der zweiten Adresse. 
 -                             getcursor (INT<d1>, INT<d2>) 
 - 
 -CATINP 7F 44 dddd dddd       Aus dem Eingabepuffer werden alle Zeichen
 -                             gelesen und an den TEXT an der ersten Adresse
 -                             geh„ngt, bis entweder der Eingabepuffer leer
 -                             ist oder ein Zeichen mit einem Code < 32
 -                             gefunden wurde. Im ersten Fall wird niltext an
 -                             der zweiten Adresse abgelegt, im zweiten Fall
 -                             das Trennzeichen. 
 -                             REP 
 -                              IF zeichen da (channel) 
 -                                 THEN zeichen := incharety ; 
 -                                      IF code (zeichen) < 32 
 -                                         THEN TEXT<d2> := zeichen 
 -                                         ELSE TEXT<d1> CAT zeichen 
 -                                      FI 
 -                                 ELSE TEXT<d2> := "" ; 
 -                                      LEAVE CATINP 
 -                              FI 
 -                             PER 
 - 
 -CONTRL 7F 54 dddd dddd dddd dddd 
 -                             Der IO-Controlfunktion mit der Nummer, die
 -                             an der ersten Adresse steht, werden die beiden
 -                             Parameter bergeben, die an der zweiten und
 -                             dritten Adresse stehen. Die Rckmeldung wird
 -                             an der vierten Adresse abgelegt. 
 -                             IF channel > 0 
 -                                THEN iocontrol (INT<d1>, INT<d2>, INT<d3>,
 -                                                INT<d4>) 
 -                             FI 
 - 
 -BLKOUT 7F 55 dddd dddd dddd dddd dddd 
 -                             Die Seite des Datenraums, dessen dsid an der
 -                             ersten Adresse steht, mit der Seitennummer, die
 -                             an der zweiten Adresse steht, wird auf dem
 -                             aktuellen Kanal ausgegeben. Als Parameter
 -                             werden die Werte an der dritten und vierten
 -                             Adresse bergeben. Der Returncode wird an der
 -                             fnften Adresse abgelegt. 
 -                             IF channel > 0 
 -                                THEN blockout (DATASPACE<d1>[INT<d2>, 512],
 -                                     INT<d3>, INT<d4>, INT<d5>) 
 -                             FI 
 - 
 -BLKIN  7F 56 dddd dddd dddd dddd dddd 
 -                             Die Seite des Datenraums, dessen dsid an der
 -                             ersten Adresse steht, mit der Seitennummer, die
 -                             an der zweiten Adresse steht, wird an dem
 -                             aktuellen Kanal eingelesen. Als Parameter
 -                             werden die Werte an der dritten und vierten
 -                             Adresse bergeben. Der Returncode wird an der
 -                             fnften Adresse abgelegt. 
 -                             IF channel > 0 
 -                                THEN blockout (DATASPACE<d1>[INT<d2>, 512],
 -                                               INT<d3>, INT<d4>, INT<d5>) 
 -                             FI 
 - 
 - 
 -#ub#2.1.9  Ablaufsteuerung (Branch und Gosub)#ue# 
 - 
 -B      .70:aa bzw. .74:aa    Unbedingter Sprung an die Adresse. 
 -                             ICOUNT := aaaa (aaaa gilt nur fr den
 -                             Debugger/Tracer, da die Adressrechung intern
 -                             komplizierter ist) 
 - 
 -BF     .70:aa bzw. .74:aa    Wenn der letzte Befehl FALSE lieferte, Sprung an
 -                             die Adresse. 
 -                             IF NOT FLAG 
 -                                THEN ICOUNT := aaaa (aaaa s.o.) 
 -                             FI 
 - 
 -BT     .00:aa bzw. .04:aa    Wenn der letzte Befehl TRUE lieferte, Sprung an
 -                             die Adresse (auch LN-Opcode). 
 -                             IF FLAG 
 -                                THEN ICOUNT := aaaa (aaaa s.o.) 
 -                             FI 
 - 
 -BRCOMP 7F 20 dddd vvvv       Wenn das Wort an der Adresse dddd kleiner als 0
 -                             oder grӇer als die Konstante vvvv ist, wird mit
 -                             dem auf den BRCOMP-Befehl folgenden Befehl
 -                             (i.d.R. ein B-Befehl) fortgefahren. Sonst wird
 -                             die Ausfhrung an der Adresse des
 -                             BRCOMP-Befehls + 2 + (dddd) (auch ein B-Befehl)
 -                             fortgesetzt. 
 -                             IF <d1> >= 0 AND <d1> <= vvvv 
 -                                THEN ICOUNT INCR (<d1> + 1) 
 -                             FI 
 - 
 -GOSUB  7F 05 aaaa            Die aktuelle Codeadresse wird auf den Stack
 -                             gebracht und das Programm an der Adresse aaaa
 -                             fortgesetzt. 
 -                             <TOP>:=(LBASE, PBASE, ICOUNT, ENSTOP, ARITH) ;
 -                             LBASE := TOP ; 
 -                             ICOUNT := aaaa ; 
 -                             CMOD := high (ICOUNT) + 16 
 - 
 -GORET  7F 07                 Das Programm wird an der oben auf dem Stack
 -                             stehenden Returnadresse fortgesetzt. 
 -                             TOP := LBASE ; 
 -                             SP := TOP + 4 ; 
 -                             (LBASE, PBASE, ICOUNT, ENSTOP, ARITH) := <TOP>
 - 
 - 
 -#ub#2.1.10 Modul-Operationen#ue# 
 - 
 -PPV    .68:dd                Das Wort an der Adresse wird auf den Stack
 -                             gebracht. Dieser Befehl wird vom Compiler nicht
 -                             generiert. 
 -                             <SP> := INT<d1> ; 
 -                             SP INCR 2 
 - 
 -PP     .6C:dd                Die Referenzadresse des Objektes wird auf den
 -                             Stack gebracht (2 Worte). 
 -                             <SP> := REF d1 ; 
 -                             SP INCR 2 
 - 
 -PPROC  7F 1E mmmm            Die Adresse der Prozedur mit der Modulnummer
 -                             mmmm wird als Referenzadresse (Codesegment,
 -                             Codeadresse) auf den Stack gebracht. 
 -                             <SP> := mod addr (mmmm) ; 
 -                             SP INCR 2 
 - 
 -HEAD   vvvv (kein Opcode)    Der Speicherplatz fr lokale Variablen und
 -                             Parameter in diesem Modul wird vermerkt, indem
 -                             der Stacktop um vvvv erhoht wird. 
 -                             TOP INCR vvvv ; 
 -                             SP := TOP + 4 
 - 
 -PENTER FE vv                 Die Paketbasis (Basis der globalen Adressen
 -                             dieses Moduls) wird auf den Wert vv*256
 -                             gesetzt. 
 -                             PBASE := vv * 256 
 - 
 -CALL   .78:mm                Das Modul mit der Nummer mm wird aufgerufen. 
 -                             <TOP>:=(LBASE, PBASE, ICOUNT, ENSTOP, ARITH) ;
 -                             LBASE := TOP ; 
 -                             ICOUNT := mod addr (mm) ; 
 -                             CMOD := high (ICOUNT) + 16 
 - 
 -PCALL  7F 1F dddd            Die (Parameter-)Prozedur, deren Startadresse
 -                             als Referenzadresse auf dem Stack steht, wird
 -                             aufgerufen. 
 -                             <TOP>:=(LBASE, PBASE, ICOUNT, ENSTOP, ARITH) ;
 -                             LBASE := TOP ; 
 -                             ICOUNT := d1 ; 
 -                             CMOD := high (ICOUNT) + 16 . 
 - 
 -EXEC   7F 1D dddd            Das Modul dessen Nummer in dem Wort an der
 -                             Adresse dddd steht, wird aufgerufen. 
 -                             <TOP>:=(LBASE, PBASE, ICOUNT, ENSTOP, ARITH) ;
 -                             LBASE := TOP ; 
 -                             ICOUNT := <d1> ; 
 -                             CMOD := high (ICOUNT) + 16 . 
 - 
 -RTN    7F 00                 Das Modul wird verlassen, die
 -                             Programmausfhrung setzt an der, auf dem Stack
 -                             gesicherten, Adresse fort. 
 -                             TOP := LBASE ; 
 -                             SP := TOP + 4 ; 
 -                             (LBASE, PBASE, ICOUNT, ENSTOP, ARITH) := <TOP> 
 - 
 -RTNT   7F 01                 Das Modul wird verlassen und der BOOL-Wert TRUE
 -                             geliefert (fr den dem CALL/PCALL folgenden
 -                             BT/BF-Befehl). Die Programmausfhrung setzt an
 -                             der, auf dem Stack gesicherten, Adresse fort. 
 -                             TOP := LBASE ; 
 -                             SP := TOP + 4 ; 
 -                             (LBASE, PBASE, ICOUNT, ENSTOP, ARITH) := <TOP>;
 -                             FLAG := TRUE 
 - 
 -RTNF   7F 02                 Das Modul wird verlassen und der BOOL-Wert
 -                             FALSE geliefert (fr den dem CALL/PCALL
 -                             folgenden BT/BF-Befehl). Die Programmausfhrung setzt an
 -                             der, auf dem Stack gesicherten, Adresse fort. 
 -                             TOP := LBASE ; 
 -                             SP := TOP + 4 ; 
 -                             (LBASE, PBASE, ICOUNT, ENSTOP, ARITH) := <TOP>; 
 -                             FLAG := FALSE 
 - 
 - 
 -#ub#2.1.10 Datenadressrechnung#ue# 
 - 
 -REF    .5C:dd dddd           An der zweiten Adresse wird die Referenzadresse 
 -                             der ersten Adresse abgelegt (2 W”rt-MOV). 
 -                             REF<d2> := d1 
 - 
 -SUBS   .60:vv vvvv dddd dddd dddd 
 -                             Wenn der Inhalt des Wortes an der dritten
 -                             Adresse (ROW-Index) grӇer oder gleich der
 -                             Konstanten vvvv (limit-1) ist, wird "Subscript
 -                             šberlauf" gemeldet, falls der ROW-Index kleiner
 -                             als eins ist wird "Subscript šnterlauf"
 -                             gemeldet. Andernfalls wird der um eins
 -                             verringerte ROW-Index mit der Konstanten vv
 -                             (Size eines ROW-Elements) multipliziert,
 -                             zur Basisaddresse (vierter Parameter) addiert
 -                             und als Referenzadresse an der fnften Adresse
 -                             abgelegt. 
 -                             IF INT<d1> <= vvvv AND INT<d1> > 0
 -                                THEN REF<d3> := d2 + vv * (INT<d1>-1) 
 -                                ELSE "Fehler" s.o. 
 -                             FI 
 - 
 -SEL    .64:dd vvvv dddd      Die Konstante vvvv (Selektor-Offset einer
 -                             STRUCT) wird zur Adresse dd addiert und als
 -                             Referenzadresse auf dem Stack an der Adresse
 -                             dddd abgelegt. 
 -                             REF<d2> := vv + d1 
 - 
 -CTT    7F 0C dddd dddd       Die Adresse des Strings(!) an der ersten
 -                             Adresse wird an der zweiten Adresse als
 -                             Referenzadresse (Segment 0, DS 4) abgelegt.
 -                             CTT steht fr Compiler-Table-Text. 
 -                             REF<d2> := REF (0004, INT<d1>) 
 - 
 - 
 -#ub#2.1.12 Compiler-Spezialbefehle#ue#
 - 
 -PUTW   FD v1v2 dddd dddd     Das lowbyte des Opcode besteht aus den beiden
 -                             Nibbles v1 (Segment) und v2 (Wordoffset). Das
 -                             Wort an der zweiten dddd-Adresse wird an die
 -                             Adresse im Datenraum 4, Segment v1 geschrieben,
 -                             die durch den Wert des Wortes an der ersten
 -                             dddd-Adresse + v2 bestimmt ist. 
 -                             <v1 * 64KW + INT<d1> + v2> := INT<d2> 
 - 
 -GETW   7E v1v2 dddd dddd     Das lowbyte des Opcode besteht aus den beiden
 -                             Nibble v1 (Segment) und v2 (Wordoffset). Das
 -                             Wort im Datenraum 4, Segment v1 an der durch
 -                             den Wert des Wortes an der ersten dddd-Adresse
 -                             + v2 bestimmten Adresse wird an der zweiten
 -                             dddd-Adresse abgelegt. 
 -                             INT<d2> := <v1 * 64KW + INT<d1> + v2) 
 - 
 -PW     7F 6F dddd dddd dddd  Das Wort an der dritten Adresse wird im
 -                             Datenraum 4 an die Adresse geschrieben, die
 -                             durch das Segment (erste Adresse) und die
 -                             Adresse in diesem Segment (zweite Adresse)
 -                             bestimmt ist. 
 -                             <INT<d1> * 64KW + INT<d2>> := INT<d3> 
 - 
 -GW     7F 70 dddd dddd dddd  Das Wort im Datenraum 4, das durch das Segment
 -                             (erste Adresse) und die Adresse in diesem
 -                             Segment (zweite Adresse) bestimmt ist, wird an
 -                             der dritte Adresse abgelegt. 
 -                             INT<d3> := <INT<d1> * 64KW + INT<d2>> 
 - 
 -BCRD   7F 08 dddd dddd       Bereitet das Lesen einzelner Zeichen aus dem
 -                             Segment 4 des Datenraumes 4 vor (Nametable).
 -                             Das Wort an der ersten Adresse enth„lt die
 -                             Startadresse des Strings und zeigt auf das
 -                             L„ngenbyte. Nach dem Ausfhren des Befehls
 -                             enth„lt das Wort an der zweiten Adresse das
 -                             L„ngenbyte und der Pointer an der ersten
 -                             Adresse zeigt auf das erste Zeichen des Textes.
 -                             Das Bit 15 des Pointers ist gesetzt, wenn das
 -                             highbyte adressiert wird. 
 -                             INT<d2> := length (STRING<d1>) ; 
 -                             INT<d1> INCR 1/2 
 - 
 -CRD    7F 09 dddd dddd       Liest ein Zeichen aus dem String, dessen Lesen
 -                             mit BCRD vorbereitet wurde. Die erste Adresse
 -                             enth„lt einen Stringpointer, der nach jedem
 -                             Lesen erh”ht wird, die zweite Adresse enth„lt
 -                             nach dem Aufruf des Befehls den Code des 
 -                             gelesenen Zeichens. 
 -                             INT<d2> := code (STRING<d1>) ; 
 -                             INT<d1> INCR 1/2 
 - 
 -CWR    7F 0B dddd dddd dddd  Der Hashcode an der ersten Adresse wird mit dem
 -                             zu schreibenden Zeichencode (dritte Adresse)
 -                             verknpft und in den Bereich 0..1023 gemapt.
 -                             Das Zeichen wird an die Position des Pointers
 -                             geschrieben (Bit 15 des Pointers unterscheidet
 -                             lowbyte und highbyte). Anschlieáend wird der
 -                             Pointer auf die Adresse des n„chsten Zeichens
 -                             gesetzt. Der Pointer steht an der zweiten
 -                             Adresse. Vor dem Schreiben des ersten Zeichens 
 -                             muá der Hashcode auf 0 gesetzt werden. 
 -                             INT<d1> INCR INT<d1> ; 
 -                             IF INT<d1> > 1023 THEN INT<d1> DECR 1023 FI ; 
 -                             INT<d1> := (INT<d1> + INT<d3>) MOD 1024 ; 
 -                             STRING<INT<d2>> := code (INT<d3>) ; 
 -                             INT<d2> INCR 1/2 
 - 
 -ECWR   7F 0A dddd dddd dddd  Das Schreiben eines Strings wird beendet. Dazu
 -                             wird an der ersten Adresse der Stringpointer
 -                             bergegeben, an der zweiten Adresse wird die
 -                             endgltige Stringl„nge geliefert. An der
 -                             dritten Adresse wird die Adresse des n„chsten
 -                             freien Platzes nach diesem Stringende
 -                             geliefert. 
 - 
 -GETC   7F 0D dddd dddd dddd  Dieser Befehl liefert ein BOOL-Result und zwar
 -                             TRUE, wenn das Wort an der zweiten Adresse
 -                             gr”áer als 0 und kleiner als die L„nge des
 -                             TEXTes an der ersten Adresse ist. In diesem Fall
 -                             wird im Wort an der dritten Adresse der Code
 -                             des n. Zeichens des TEXTes geliefert. Die
 -                             Position des Zeichens wird durch das Wort an
 -                             der zweiten Adresse bestimmt. 
 -                             FLAG := INT<d2> > 0 AND INT<d2> <= length
 -                             (TEXT<d1>) ; 
 -                             INT<d3> := code (TEXT<d1>[INT<d2>, 1]) 
 - 
 -FNONBL 7F 0E dddd dddd dddd  Dieser Befehl liefert ein BOOL-Result.
 -                             zaehler := INT<d3> ; (* Stringpointer *) 
 -                             WHILE TEXT<d2>[zahler, 1] = " " REP 
 -                              zaehler INCR 1 
 -                             PER ;
 -                             IF zaehler > length (TEXT<d2>) 
 -                                THEN FLAG := FALSE 
 -                                ELSE INT<d1> := code (TEXT<d2>[zaehler, 1]);
 -                                     INT<d3> := zaehler + 1 
 -                             FI
 - 
 -DREM256 7F 0F dddd dddd      Das lowbyte des Wortes an der ersten Adresse
 -                             wird in das Wort an der zweiten Adresse
 -                             geschrieben, das highbyte des Wortes an der
 -                             ersten Adresse ersetzt das gesamte erste Wort. 
 -                             INT<d2> := INT<d1> MOD 256 ; 
 -                             INT<d1> := INT<d1> DIV 256
 - 
 -AMUL256 7F 10 dddd dddd      Umkerung von DREM256. 
 -                             INT<d1> := INT<d1> * 256 + INT<d2> 
 - 
 -GADDR   7F 16 dddd dddd dddd "Adresswort" mit Adresstyp generieren (z.B.<d1>
 -                             = pbase). 
 -                             IF INT<d2> >= 0 (* Global *) 
 -                                THEN INT<d3> := INT<d2> - INT<d1>
 -                             ELIF bit (INT<d2>, 14)    (* Local Ref *) 
 -                                THEN INT<d3> := (INT<d2> AND 3FFFH)*2 + 1 
 -                                ELSE INT<d3> := (INT<d2> AND 3FFFH)*2
 -                                     (* Local *) 
 -                             FI 
 - 
 -GCADDR  7F 17 dddd dddd dddd Diese Instruktion liefert ein BOOL-Result.
 -                             Mit <d2> = 0 wird sie eingesetzt, um die
 -                             Zeilennummer im LN-Befehl zu generieren, mit
 -                             <d2> <> 0 wird sie eingesetzt, um die Adresse im
 -                             Branchbefehl zu generieren. Beide Befehle gibt
 -                             es mit zwei Opcodes (00/04 bzw. 70/74). 
 -                             byte := high(INT<d1>)-high(INT<d2>) ; 
 -                             IF byte < 0 
 -                                THEN byte INCR 16 ; (* Bit fr LN1 bzw. B1
 -                                                    Opcode *) 
 -                                     rotate (byte, right) ; 
 -                             FI ; 
 -                             INT<d3> := byte * 256 + low (INT<d1>) ; 
 -                             FALSE, wenn irgendeins der Bits 11..14 = 1 ist 
 - 
 -GETTAB  7F 1A                Kopiert den Inhalt der unteren 64KB des
 -                             Segments 5 im DS 4 in das Segment 4.
 -                             (permanentes Segment --> tempor„res Segment) 
 -                             DS4: 50000..57FFF --> 40000..47FFF (Wortaddr) 
 - 
 -PUTTAB  7F 1B                Kopiert den Inhalt der unteren 64KB des Segments
 -                             4 im DS 4 in das Segment 5. (Tempor„re Daten
 -                             werden permanent) 
 -                             DS4: 40000..47FFF --> 50000..57FFF (Wortaddr) 
 - 
 -ERTAB   7F 1C                Kopiert den Inhalt des Segments 6 im DS 4
 -                             (besteht nur aus FF's) in die Segmente 4 und 7,
 -                             d.h. das tempor„re Segment (u.a. Symboltabelle)
 -                             und das Segment mit Compiler-Intermediatestring
 -                             werden gel”scht. 
 -                             DS4: 60000..6FDFF --> 40000..4FDFF ; 
 -                             DS4: 60000..6FDFF --> 70000..7FDFF 
 - 
 -CDBINT  7F 74 dddd dddd      Das Wort mit der Nummer <d1> wird aus dem
 -                             Segment 5 gelesen und in <d2> abgelegt. 
 -                             INT<d2> := <50000H + INT<d1>> 
 - 
 -CDBTXT  7F 74 dddd dddd      Der String(!) an der Adresse <d1> im Segment 5
 -                             wird in dem TEXT <d2> abgelegt. 
 -                             TEXT<d2> := ctt (<50000H + INT<d1>>) 
 - 
 - 
 -#ub#2.1.13 Instruktionen zur Programmsteuerung#ue# 
 - 
 -STOP   7F 04                 Alle (aufrufenden) Module werden verlassen, bis
 -                             das erste im 'disablestop'-Zustand angetroffen
 -                             wird (Žhnlich errorstop ("")) ; 
 -                             WHILE ENSTOP REP return PER .
 - 
 -                             return: 
 -                              TOP := LBASE ; 
 -                              SP := TOP + 4 ; 
 -                              (LBASE, PBASE, ICOUNT, ENSTOP, ARITH) := <TOP> 
 - 
 -ESTOP  7F 4B                 Der 'enable stop'-Zustand wird eingeschaltet. 
 -                             ENSTOP := TRUE 
 - 
 -DSTOP  7F 4C                 Der 'disable stop'-Zustand wird eingeschaltet. 
 -                             ENSTOP := FALSE 
 - 
 -SETERR 7F 4D dddd            Es wird der Fehlerzustand eingeschaltet, das
 -                             Wort an der Adresse dddd wird in das pcb-Feld
 -                             'error code' gebracht. Falls das Modul im
 -                             'enablestop'-Zustand ist, wird das Modul
 -                             verlassen.  
 -                             IF NOT ERROR 
 -                                THEN ERROR := TRUE ; 
 -                                     pcb.error line := pcb.line ; 
 -                                     pcb.error code := INT<d1> ; 
 -                                     WHILE ENSTOP REP return PER 
 -                             FI  
 - 
 -CLRERR 7F 4F                 Falls der Fehlerzustand vorliegt, wird der
 -                             Fehler gel”scht. 
 -                             ERROR := FALSE 
 - 
 -LN     .00:vv und .04:vv     Die Konstante vv wird in das pcb-Feld
 -                             'line number' gebracht (Zur Fehlerbehandlung). 
 -                             pcb.line := vv 
 - 
 -RPCB   7F 50 dddd dddd       Der Inhalt des pcb-Feldes der eigenen Task mit
 -                             der Nummer, die im Wort an der ersten Adresse
 -                             steht, wird in das Wort an der zweiten Adresse
 -                             gebracht. 
 -                             INT<d2> := pcb (myself, INT[<d1>) 
 - 
 -CLOCK  7F 66 dddd dddd       Die Systemuhr mit der Nummer, die durch den
 -                             Wert des Wortes an der ersten Adresse
 -                             spezifiziert wird, wird gelesen und deren
 -                             REAL-Wert an der zweiten Adresse abgelegt. 
 -                             Wenn <d1> = 0 ist, wird die CPU-Zeit der
 -                             eigenen Task geliefert, anderenfalls die
 -                             Systemuhr mit der Nummer 1..7 : 
 -                             Nummer Funktion 
 -                               1    REAL-Time
 -                               2    Paging Wait
 -                               3    Paging Busy
 -                               4    Foreground Tasks cpu-time
 -                               5    Background Tasks cpu-time 
 -                               6    System cpu-time
 -                               7    Reserviert
 - 
 -                             IF INT<d1> = 0 
 -                                THEN REAL<d2> := pcb.clock 
 -                                ELSE REAL<d2> := clock (INT<d1>) 
 -                             FI 
 -
 - 
 -#ub#2.1.14 Systemglobale Instruktionen#ue# 
 - 
 -KE     7F 06                 Der EUMEL0-Debugger 'Info' wird aufgerufen,
 -                             falls dies ein infof„higes System ist. 
 - 
 -SYSG   7F 19                 Sysgen (Nur beim Sysgen-Urlader). 
 - 
 -INFOPW 7F 51 dddd dddd dddd  Das bis zu 10 Zeichen lange Infopassword an der
 -                             zweiten Adresse (TEXT) wird eingestellt, falls
 -                             das alte Infopassword mit dem TEXT an der
 -                             ersten Adresse bereinstimmt. In diesem Fall
 -                             wird im Wort an der dritten Adresse eine 0
 -                             abgelegt, andernfalls eine 1. Dies ist kein
 -                             privilegierter Befehl, er funktioniert
 -                             allerdings nur, wenn das alte Infopasswort
 -                             bekannt ist. 
 -                             IF info password = TEXT<d1> 
 -                                THEN info password := TEXT<d2> ; 
 -                                     INT<d3> := 0 
 -                                ELSE INT<d3> := 1 
 -                             FI 
 - 
 -STORAGE 7F 5A dddd dddd      Die GrӇe des vorhandene Hintergrundspeichers
 -                             in KB wird im Wort an der ersten Adresse
 -                             abgelegt, die GrӇe des benutzten
 -                             Hintergrundspeichers an der zweiten Adresse. 
 -                             INT<d1> := size ; 
 -                             INT<d2> := used 
 - 
 -SYSOP  7F 5B dddd            Es wird eine Systemoperation mit der Nummer,
 -                             die an der Adresse dddd steht, aufgerufen
 -                             (1=Garbage Collection, 11=Savesystem, 4=Shutup,
 -                             2=Fixpoint). Dieser Befehl setzt eine
 -                             Privilegierung >= 1 voraus. 
 - 
 -SETNOW 7F 67 dddd            Die Realtime-Clock (clock(1)) des Systems wird
 -                             auf den REAL-Wert an der Adresse dddd gesetzt.
 -                             Dieser Befehl setzt eine Privilegierung >= 1
 -                             voraus. 
 -                             clock (1) := REAL<d1> 
 - 
 -SESSION 7F 7E dddd           Der aktuelle Wert des Systemlaufz„hlers wird
 -                             an der Adresse dddd abgelegt. 
 -                             INT<d1> := systemlaufzaehler 
 - 
 -ID     7F 81 dddd dddd       Der Wert des id-Feldes mit der Nummer, die an
 -                             der ersten Adresse steht, wird in das Wort an
 -                             der zweiten Adresse geschrieben. Fr dei
 -                             Nummern der id-Felder gilt: 
 -                             Feld    Inhalt 
 -                              0      Kleinste HG-Version fr EUMEL0 
 -                              1      CPU-Type (1=Z80,3=8086,4=68000,5=80286) 
 -                              2      Urlader-Version 
 -                              3      Reserviert 
 -                              4      Lizenznummer des Shards
 -                              5      Installationsnummer 
 -                              6      Frei fr Shard 
 -                              7      Frei fr Shard 
 -                             IF INT<d1> < 4 
 -                                THEN INT<d2> := eumel0 id (INT<d1>) 
 -                                ELSE INT<d2> := shard id (INT<d1>) 
 -                             FI 
 - 
 - 
 -#ub#2.1  Alphabetische Liste der Befehle#ue# 
 -
 -ACT     7F 6C dddd 
 -ADD    .1C:dd dddd dddd 
 -ALIAS   7F 22 vvvv dddd dddd 
 -AMUL256 7F 10 dddd dddd 
 -AND     7F 7C dddd dddd dddd 
 -ARITHS  7F 5B 
 -ARITHU  7F 5C 
 -B      .70:aa bzw. .74:aa 
 -BCRD    7F 08 dddd dddd 
 -BF     .70:aa bzw. .74:aa 
 -BLKIN   7F 56 dddd dddd dddd dddd dddd 
 -BLKOUT  7F 55 dddd dddd dddd dddd dddd 
 -BRCOMP  7F 20 dddd vvvv 
 -BT     .00:aa bzw. .04:aa 
 -CALL   .78:mm 
 -CAT     7F 35 dddd dddd 
 -CATINP  7F 44 dddd dddd 
 -CDBINT  7F 74 dddd dddd 
 -CDBTXT  7F 74 dddd dddd 
 -CLEAR  .24:dd 
 -CLOCK   7F 66 dddd dddd 
 -CLRERR  7F 4F 
 -CONTRL  7F 54 dddd dddd dddd dddd 
 -COUT    7F 3D dddd 
 -CRD     7F 09 dddd dddd 
 -CTT     7F 0C dddd dddd 
 -CWR     7F 0B dddd dddd dddd 
 -DEACT   7F 6D dddd 
 -DEC    .18:dd dddd 
 -DEC1   .10:dd 
 -DECOD   7F 2F dddd dddd 
 -DEFCOL  7F 80 dddd 
 -DIV     7F 2A dddd dddd dddd 
 -DREM256 7F 0F dddd dddd 
 -DSACC  .58:dd dddd 
 -DSCOPY  7F 46 dddd dddd 
 -DSFORG  7F 47 dddd 
 -DSHEAP  7F 4A dddd dddd 
 -DSPAGS  7F 4C dddd dddd dddd 
 -DSRTYP  7F 49 dddd dddd 
 -DSTOP   7F 4C 
 -DSWTYP  7F 48 dddd dddd 
 -ECWR    7F 0A dddd dddd dddd 
 -ENCOD   7F 30 dddd dddd 
 -EQU    .2C:dd dddd 
 -EQUIM   7C vv dddd 
 -ERTAB   7F 1C 
 -ESTOP   7F 4B 
 -EXEC    7F 1D dddd 
 -EXTASK  7F 7B dddd 
 -FADD   .38:dd dddd dddd 
 -FDIV   .44:dd dddd dddd 
 -FEQU    7F 24 dddd dddd 
 -FLOOR   7F 63 dddd dddd 
 -FLSEQ  .48:dd dddd 
 -FMOV   .34:dd dddd 
 -FMUL   .40:dd dddd dddd 
 -FNEG    7F 26 dddd 
 -FNONBL  7F 0E dddd dddd dddd 
 -FSLD    7F 60 dddd dddd dddd 
 -FSUB   .3C:dd dddd dddd 
 -GADDR   7F 16 dddd dddd dddd 
 -GARB    7F 5F 
 -GCADDR  7F 17 dddd dddd dddd 
 -GCPOS   7F 43 dddd dddd 
 -GETC    7F 0D dddd dddd dddd 
 -GETTAB  7F 1A 
 -GETW    7E v1v2 dddd dddd 
 -GEXP    7F 61 dddd dddd 
 -GORET   7F 07 
 -GOSUB   7F 05 aaaa 
 -GW      7F 70 dddd dddd dddd 
 -HEAD    vvvv (kein Opcode) 
 -HPSIZE  7F 5E dddd 
 -ID      7F 81 dddd dddd 
 -IMULT   7F 28 dddd dddd dddd 
 -INC    .14:dd dddd 
 -INC1   .0C:dd 
 -INCETY  7F 41 dddd 
 -INCHAR  7F 40 dddd 
 -INFOPW  7F 51 dddd dddd dddd 
 -ISDIG   7F 11 dddd 
 -ISERR   7F 4E 
 -ISLCAS  7F 13 dddd 
 -ISLD    7F 12 dddd 
 -ISSHA   7F 18 dddd 
 -ISUCAS  7F 14 dddd 
 -ITRPL   7F 2E dddd dddd dddd 
 -ITSUB   7F 2D dddd dddd dddd 
 -KE      7F 06 
 -LN     .00:vv und .04:vv 
 -LSEQ   .30:dd dddd 
 -MOD     7F 2B dddd dddd dddd 
 -MOV    .08:dd dddd 
 -MOVi    FC vv dddd 
 -MOVii   7F 23 vvvv dddd 
 -MOVx    7D vv dddd dddd 
 -MOVxx   7F 21 vvvv dddd dddd 
 -MUL     7F 29 dddd dddd dddd 
 -NEG     7F 27 dddd 
 -NILDS   7F 45 dddd 
 -NXTDSP  7F 4B dddd dddd dddd 
 -OR      7F 7D dddd dddd dddd 
 -OUT     7F 3C dddd 
 -OUTF    7F 3E dddd dddd 
 -OUTFT   7F 3F dddd dddd dddd 
 -PAUSE   7F 42 dddd 
 -PCALL   7F 1F dddd 
 -PENTER  FE vv 
 -PNACT   7F 76 dddd 
 -POS     7F 37 dddd dddd dddd 
 -POSF    7F 38 dddd dddd dddd dddd 
 -POSFT   7F 39 dddd dddd dddd dddd dddd 
 -POSIF   7F 3B dddd dddd dddd dddd dddd 
 -PP     .6C:dd 
 -PPCALL  7F 7A dddd dddd dddd dddd 
 -PPROC   7F 1E mmmm 
 -PPV    .68:dd 
 -PUTTAB  7F 1B 
 -PUTW    FD v1v2 dddd dddd 
 -PW      7F 6F dddd dddd dddd 
 -REF    .5C:dd dddd 
 -REPLAC  7F 34 dddd dddd dddd 
 -ROTATE  7F 53 dddd dddd 
 -RPCB    7F 50 dddd dddd 
 -RTN     7F 00 
 -RTNF    7F 02 
 -RTNT    7F 01 
 -RTRPL   7F 65 dddd dddd dddd 
 -RTSUB   7F 64 dddd dddd dddd 
 -SEL    .64:dd vvvv dddd 
 -SEND    7F 71 dddd dddd dddd dddd 
 -SENDFT  7F 7F dddd dddd dddd dddd dddd 
 -SESSION 7F 7E dddd 
 -SETERR  7F 4D dddd 
 -SETNOW  7F 67 dddd 
 -SEXP    7F 62 dddd dddd 
 -STOP    7F 04 
 -STORAGE 7F 5A dddd dddd 
 -STRANL  7F 3A dddd dddd dddd dddd dddd dddd dddd 
 -SUB    .20:dd dddd dddd 
 -SUBS   .60:vv vvvv dddd dddd dddd 
 -SUBT1   7F 31 dddd dddd dddd 
 -SUBTF   7F 33 dddd dddd dddd 
 -SUBTFT  7F 32 dddd dddd dddd dddd 
 -SWCALL  7F 73 dddd dddd dddd dddd 
 -SYSG    7F 19 
 -SYSOP   7F 5B dddd 
 -TBEGIN  7F 6F dddd aaaaaa 
 -TCPU    7F 6A dddd dddd 
 -TEND    7F 70 dddd 
 -TEQU   .50:dd dddd 
 -TEST   .28:dd 
 -THALT   7F 6E dddd 
 -TLEN    7F 36 dddd dddd 
 -TLSEQ   7F 25 dddd dddd 
 -TMOV   .4C:dd dddd 
 -TPBEGIN 7F 5F dddd dddd dddd aaaaaa 
 -TRPCB   7F 68 dddd dddd dddd 
 -TSTAT   7F 6B dddd dddd 
 -TWCPU   7F 52 dddd dddd 
 -TWPCB   7F 69 dddd dddd dddd 
 -ULSEQ  .54:dd dddd 
 -WAIT    7F 72 dddd dddd dddd 
 -XOR     7F 79 dddd dddd dddd 
 - 
 -#page# 
 -#ub#3.  Beschreibung der Pakete#ue# 
 - 
 -#ub#3.1  PACKET address#ue# 
 - 
 -Mit diesem Paket werden die Operationen fr 16 Bit Adressrechnung zur
 -Verfgung gestellt. 
 - 
 -TEXT PROC hex8 (INT CONST dez) : 
 -  Der INT-Parameter (0..255) wird in eine 2-Zeichen Hexdarstellung
 -  konvertiert. 
 - 
 - 
 -TEXT PROC hex16 (INT CONST dez) : 
 -  Der INT-Parameter (0..65535) wird in eine 4-Zeichen
 -  Hexdarstellung (ohne Vorzeichen) konvertiert. 
 - 
 - 
 -INT PROC integer (TEXT CONST hex) : 
 -  Der TEXT-Parameter (1-4 Byte Hexdarstellung, 0..9, a..f/A..F) wird in eine
 -  Dezimalzahl konvertiert. 
 - 
 - 
 -INT PROC getword (INT CONST segment, address) : 
 -  Das Wort an der Adresse 'address' (0..65535) im Segment 'segment' (0..7)
 -  wird gelesen. 
 - 
 - 
 -PROC putword (INT CONST segment, address, value) : 
 -  Der Wert 'value' wird in das Wort an der Adresse 'address' (0..65535) im
 -  Segment 'segment' (0..7) geschrieben. 
 - 
 - 
 -INT PROC cdbint (INT CONST address) : 
 -  Der Wert an der Adresse 'address' (0..32767 sinnvoll) im Segment 5
 -  (permanente Compilertabellen) wird gelesen. 
 - 
 - 
 -TEXT PROC cdbtext (INT CONST address) : 
 -  Der String, der an der Adresse 'address' im Segment 5 (permanente
 -  Compilertabellen) beginnt, wird als TEXT gelesen. 
 - 
 - 
 -PROC splitword (INT VAR word, lowbyte) : 
 -  Das Wort 'word' wird in den h”herwertigen und niederwertigen Teil zerlegt.
 -  Das highbyte steht nach dieser Operation in 'word', das lowbyte in
 -  'lowbyte'. 
 - 
 - 
 -PROC makeword (INT VAR word, INT CONST lowbyte) : 
 -  word := word * 256 + lowbyte 
 - 
 - 
 -BOOL PROC ulseq (INT CONST left, right) : 
 -  '<=' fr positive INT-Zahlen (0..65535). 
 - 
 - 
 -OP INC (INT VAR word) : 
 -  'word INCR 1' fr positive INT-Zahlen (0..65535), ohne daá ein šberlauf
 -  auftritt. 
 - 
 - 
 -OP DEC (INT VAR word) : 
 -  'word DECR 1' fr poistive INT-Zahlen (0..65535), ohne daá ein Unterlauf
 -  auftritt. 
 - 
 - 
 -INT OP ADD (INT CONST left, right) : 
 -  'left + right' fr positive INT-Zahlen (0..65535), ohne daá ein šberlauf
 -  auftritt. 
 - 
 - 
 -INT OP SUB (INT CONST left, right) : 
 -  'left - right' fr positive INT-Zahlen (0..65535), ohne daá ein šberlauf
 -  auftritt. 
 - 
 - 
 -INT OP MUL (INT CONST left, right) : 
 -  'left * right' fr positive INT-Zahlen (0..65535), ohne daá ein šberlauf
 -  auftritt. 
 - 
 - 
 -#ub#3.2  PACKET table routines#ue# 
 - 
 -PROC init module table (TEXT CONST name) : 
 -  Ein benannter Datenraum ('name') wird eingerichtet. Dieser enth„lt die
 -  aufbereitete Permanenttabelle fr schnelle Zugriffe. Die Datenstruktur
 -  beschreibt drei Tabellen (PACKETTABLE, MODULETABLE, TYPETABLE), ber die
 -  zu einer Modulnummer deren Name und deren Parameter, sowie der zugeh”rige
 -  Paketname gefunden werden kann, wenn sie in der Permanenttabelle steht. 
 -  Die TYPETABLE enth„lt zu jedem TYPE, der in der Permanenttabelle steht,
 -  seine GrӇe in Words. 
 - 
 - 
 -PROC add modules : 
 -  Module und Typen neu insertierter Pakete werden in die 'module table'
 -  aufgenommen. 
 - 
 - 
 -PROC dump tables (TEXT CONST name) : 
 -  Der Inhalt der geladenen Modultabelle wird in der FILE 'name' ausgedumpt. 
 - 
 - 
 -TEXT PROC module name and specifications (INT CONST module number) : 
 -  Der Name und die Parameter des Moduls mit der Nummer 'module number'
 -  (0..2047) wird als TEXT geliefert. Falls das Modul nicht in der
 -  Permanenttabelle steht, wird niltext geliefert. 
 - 
 - 
 -TEXT PROC packetname (INT CONST module number) : 
 -  Der Name des Pakets, das das Modul mit der Nummer 'module number'
 -  definiert, wird als TEXT geliefert. Falls das Modul nicht in der
 -  Permanenttabelle steht, wird der Name des letzten vorher insertierten
 -  Pakets geliefert (In manchen F„llen also nicht der wahre Paketname). 
 - 
 - 
 -INT PROC storage (TEXT CONST typename) : 
 -  Aus der Modultabelle wird GrӇe des TYPEs mit dem Namen 'typname' gelesen.
 -  Wenn der Typ nicht in der Permanenttabelle steht, wird 0 geliefert. 
 - 
 - 
 -PROC getmodulenumber (INT VAR module number) : 
 -  Erfragt eine Modulnummer am Bildschirm. Der Benutzer kann entweder eine
 -  Zahl eingeben oder den Namen einer PROC/OP. Wenn mehrere Module mit diesem
 -  Namen existieren, wird eine Auswahlliste angeboten. In 'module number'
 -  wird die ausgew„hlte Modulnummer bergeben. 
 -   
 - 
 -INT PROC codeaddress (INT CONST module number) : 
 -  Liefert die Anfangsadresse des Moduls mit der Nummer 'module number'. 
 - 
 - 
 -INT PROC codesegment (INT CONST module number) : 
 -  Liefert die Nummer des Codesegments, in dem der Code des Moduls mit der
 -  Nummer 'module number' steht. 
 - 
 - 
 -INT PROC hash (TEXT CONST object name) : 
 -  Berechnet den Hashcode des Objekts 'object name', um ber die Hashtable,
 -  Nametable, Permanenttable die Parameter eines Objekts zu suchen. 
 - 
 - 
 -#ub#3.3  PACKET eumel decoder#ue# 
 - 
 -#ub#3.3.1  Zugriff auf globale Parameter#ue# 
 - 
 -PROC default no runtime : 
 -  Bereitet den Decoder darauf vor, daá keine runtime vorliegt, d.h.
 -  Stackzugriffe nicht sinnvoll sind. Fr Parameter mit lokalen Adressen
 -  werden deshalb keine Variableninhalte dargestellt. Bei fast allen
 -  Decoderaufrufen mit 'decode'/'decode module' bis auf die 'decode' mit
 -  mehr als zwei Parametern, wird 'default no runtime' automatisch aufgerufen. 
 - 
 - 
 -PROC set parameters (INT CONST lbase, pbase, line number, c8k) : 
 -PROC get parameters (INT VAR lbase, pbase, line number, c8k) : 
 -  Einstell- und Informationsprozeduren (fr den Tracer). 'lbase' ist die
 -  lokale Basis (Stackoffset fr dies Modul), 'pbase' ist das highbyte der
 -  Paketbasis, 'line number' ist die letzte 'LN'-Zeilennummer, 'c8k' (cmod)
 -  wird von EUMEL0 beim Eintritt in ein Modul auf
 -  high (Modulstartaddresse + 16KB) gesetzt (fr Branch-Befehle). 
 - 
 - 
 -PROC pbase (INT CONST pbase highbyte) : 
 -INT PROC pbase : 
 -  Einstell- und Informationsprozeduren, nicht nur fr den Tracer. Die
 -  Paketbasis (Globale Daten) wird gesetzt. Dazu wird nur das Highbyte (z.B.
 -  nach 'PENTER') bergeben. 
 - 
 - 
 -PROC lbase (INT CONST local base) : 
 -  Einstellprozedur fr den Tracer. Stellt w„hrend der runtime die aktuelle
 -  Basis ein. Wird der Decoder nicht w„hrend runtime betrieben, sollte
 -  lbase(-1) eingestellt werden. 
 - 
 - 
 -INT PROC line number : 
 -  Liefert die letzte, mit 'LN' eingestellte, Zeilennummer. 
 - 
 -PROC list filename (TEXT CONST name) : 
 -  Stellt den Namens-Prefix der Outputfiles ein. Voreingestellt ist "". An
 -  den Filename wird ".n" angeh„ngt, wobei n mit '0' beginnt. 
 -
 -PROC bool result (BOOL CONST status) : 
 -BOOL PROC bool result : 
 -  Einstell- und Informationsprozeduren, die fr den Tracer ben”tigt werden.
 -  Lieferte der letzte disassemblierte Befehl ein BOOL-Result ? 
 - 
 -PROC with object address (BOOL CONST status) : 
 -BOOL with object address :
 -  Einstell- und Informationsprozeduren, nicht nur fr den Tracer. Sollen
 -  auáer den Darstellungen der Speicherinhalte auch die Parameteradressen (in
 -  spitzen Klammern) ausgegeben werden ? 
 - 
 -PROC with code words (BOOL CONST status) : 
 -BOOL PROC with code words : 
 -  Einstell- und Informationsprozeduren, nicht fr den Tracer. Sollen ab der
 -  80. Spalte in der Outputfile die Hexdarstellungen der dekodierten
 -  Codew”rter ausgegeben werden ? 
 - 
 - 
 -#ub#3.3.2  Aufruf des Disassemblers#ue# 
 - 
 -PROC decode : 
 -  Aufruf des Decoders. Die Modulnummer der ersten zu dekodierenden Prozedur
 -  wird erfragt. Die Modultabelle wird ggf. erg„nzt, es wird 'default no
 -  runtime' eingestellt. 
 - 
 - 
 -PROC decode (INT CONST first module number) : 
 -  Aufruf des Decoders. Die Modulnummer der ersten zu dekodierenden Prozedur
 -  wird bergeben. Die Modultabelle wird ggf. erg„nzt, es wird 'default no
 -  runtime' eingestellt. 
 - 
 - 
 -PROC decode (INT CONST segment, address) : 
 -  Aufruf des Decoders. Die Disassemblierung beginnt in dem
 -  Codesegment/Adresse, das/die als Parameter bergeben wird. Die Modultabelle
 -  wird ggf. erg„nzt, es wird 'default no runtime' eingestellt. 
 - 
 - 
 -PROC decode (INT CONST segment, INT VAR address, INT CONST to addr,
 -             BOOL CONST only one module) : 
 -  Dieser Decoderaufruf setzt kein 'default no runtime', erweitert aber ggf.
 -  die Modultabelle. Der bei 'address' beginnende und bei 'to addr' endende
 -  Adressbereich im Codesegment 'segment' wird dekodiert. Ist 'only one
 -  module' TRUE, wird nur bis zum Ende des aktuellen Moduls dekodiert.
 -  'address' zeigt nach dem Prozeduraufruf auf die n„chste Instruktion nach
 -  'to addr'.
 - 
 - 
 -PROC decode (INT CONST segment, INT VAR address, TEXT VAR words,
 -             instruction, INT PROC (INT CONST, INT VAR, TEXT VAR) next word)):
 -  Diese Prozedur ist das Herz des Decoders. Sie disassembliert eine
 -  Instruktion, die im Codesegment 'segment', Adresse 'address' beginnt und
 -  legt die mit 'nextword' gelesenen W”rter als Hexdarstellung in 'words' ab.
 -  Die dekodierte Instruktion steht dann in 'instruction'. Vor dem Aufruf
 -  dieser Prozedur sollte 'words' und 'instruction' niltext zugewiesen werden.
 -  Die passende Prozedur 'nextword' wird auch vom 'eumel decoder'
 -  herausgereicht. 'address' zeigt nach der Ausfhrung des Befehls auf die
 -  n„chste Instruktion. 
 - 
 - 
 -PROC decodemodule : 
 -  Wie 'decode', nur wird bis nur zum Ende des gewnschten Moduls
 -  disassembliert. 
 - 
 - 
 -PROC decodemodule (INT CONST module number) : 
 -  Wie 'decode', nur wird bis nur zum Ende des gewnschten Moduls
 -  disassembliert. 
 - 
 - 
 -#ub#3.3.3  Weitere Prozeduren#ue# 
 - 
 -PROC nextmoduleheader (INT CONST segment, INT CONST address,
 -                       INT VAR header address, module number) : 
 -  Diese Prozedur findet ab der angegeben Adresse ('segment'/'address') den
 -  Anfang des n„chsten Moduls. In 'header address' wird die Startadresse des
 -  gefundenen Moduls geliefert (bleibt im Segment 'segment'), in 'module
 -  number' die Nummer des gefundenen Moduls. 
 - 
 - 
 -INT PROC next word (INT CONST segment, INT VAR address, TEXT VAR words) : 
 - Diese Prozedur liefert das durch 'segment'/'address' angegeben Wort, h„ngt
 - die Hexdarstellung dieses Wortes an 'words' an und erh”ht 'address' um
 - eins. 
 - 
 - 
 -TEXT PROC data representation (INT CONST data addr, segment, address, type):
 -  Diese Prozedur liefert die Darstellung des Parameters 'data addr' ggf. mit
 -  Adresse (--> with object address).  'segment'/'address' bezeichnet die
 -  Position, an der die Instruktion fr diesen Parameter steht. 'type' ist
 -  ein (durch die Instruktion festgelegter) Typ des Parameters, mit dem die
 -  Art der Darstellung gew„hlt wird (TEXT, REAL, INT, ...). Im Gegensatz zu
 -  'object representation' braucht bei dieser Prozedur keine Darstellung
 -  vorhanden sein. In diesem Falle wird nur z.B. der Stackoffset '<L n>'
 -  ausgegeben. 
 - 
 - 
 -TEXT PROC object representation (INT CONST data segment, data address,
 -                                           segment, address, type) : 
 -  Diese Prozedur wird von 'data representation' aufgerufen und liefert die
 -  Darstellung des Parameters. In 'data segment'/'data address' wird die
 -  Anfangsadresse der darzustellenden Daten bergeben. Die anderen drei
 -  Parameter verhalten sich wie bei 'data representation'. 
 - 
 - 
 -TEXT PROC last actual parameter : 
 -  Liefert den Wert (nach TEXT konvertiert) des letzten dekodierten aktuellen
 -  Parameters (am sinnvollsten w„hrend runtime). Diese prozedur wird vom
 -  Tracer benutzt. 
 - 
 - 
 -#ub#3.4  PACKET tracer#ue# 
 - 
 -#ub#3.4.1  Zugriff auf globale Parameter#ue# 
 - 
 - 
 -PROC prot file (TEXT CONST filename) :
 -TEXT PROC prot file : 
 -  Einstell- und Informationsprozeduren fr den Namen der Protokollfile.
 -  Wird ein 'filename' ungleich niltext eingestellt, dann werden die
 -  dekodierten Instruktionen w„hrend der Ablaufverfolgung zus„tzlich in diese
 -  File geschrieben. 
 - 
 - 
 -PROC source file (TEXT CONST filename) : 
 -TEXT PROC source file : 
 -  Einstell- und Informationsprozeduren fr den Namen der Quelltextdatei.
 -  Wird ein 'filename' ungleich niltext eingestellt, dann wird nach dem
 -  Ausfhren eines 'LN'-Befehls (LineNumber) die Zeile mit dieser Nummer aus
 -  der Quelldatei gelesen und parallel zur dekodierten EUMEL0-Instruktion
 -  angezeigt. 
 - 
 - 
 -PROC tracer channel (INT CONST) :
 -INT PROC tracerchannel : 
 -  Einstell- und Informationsprozeduren fr den Kanal, an dem das Programm
 -  ausgefhrt werden soll. Die Ablaufverfolgung bleibt an dem Kanal, an dem
 -  die PROC/OP aufgerufen wurde. 
 - 
 - 
 -#ub#3.4.2  Aufruf des Tracers#ue# 
 - 
 -  Eine PROC/OP, in der ein Breakpoint gesetzt wurde, kann zum Beispiel im
 -  Monitor aufgerufen werden. Ab der Adresse, an der der Breakpoint gesetzt
 -  wurde, kann die Abarbeitung des Codes verfolgt werden. Das Setzen der
 -  Breakpoints geschieht mit 'set breakpoint'. 
 - 
 - 
 -PROC trace : 
 -  Diese Prozedur erfragt vom Benutzer die PROC/OP, bei der der die
 -  Ablaufverfogung beginnen soll. Anschlieáend muá der Aufruf der PROC/OP
 -  eingegeben werden. Der Benutzer wird auáerdem nach dem Namen der
 -  compilierten Quelldatei, dem Namen der Protokollfile und dem
 -  Abarbeitungskanal gefragt. Nachdem alle Angaben gemacht worden sind, wird
 -  der PROC/OP-Aufruf mit 'do' ausgefhrt. 
 - 
 - 
 -PROC set breakpoint : 
 -  Die Modultabelle wird ggf. erweitert, der Benutzer wird nach dem Namen
 -  einer PROC/OP gefragt, deren Codeabarbeitung verfolgt werden soll. Der Code
 -  dieser PROC/OP muá im Codesegment 3 stehen (sonst erfolgt ein 'errorstop').
 -  Der Protokoll- und Sourcefilename werden auf niltext gesetzt. 
 - 
 - 
 -PROC set breakpoint (INT CONST breakpointnr, address) : 
 -  Setzt an der bergebenen Codeadresse im Segment 3 einen Breakpoint der
 -  beiden Breakpoints (1 oder 2 als 'breakpointnr'). Der Benuzter ist selbst
 -  dafr verantwortlich daá 
 -  - dies nicht die Einsprungsadresse eines Moduls ist (HEAD-Instruktion), 
 -  - die bergebene Adresse das erste (Opcode-) Wort einer Instruktion ist, 
 -  - vor dem Aufruf des Moduls die Paketbasis korrekt gesetzt ist, falls
 -    vor der ersten Instruktion mit Parametern kein 'PENTER' ausgefhrt wird. 
 - 
 - 
 -PROC reset breakpoints : 
 -  Die Breakpoints werden zurckgesetzt und der (wegen des Breakpointhandler-
 -  CALLs) gesicherte Code wieder an seinen Originalplatz zurckgeschrieben. 
 - 
 - 
 -PROC reset breakpoint (INT CONST breakpointnr) : 
 -  Es wird nur gezielt der eine Breakpoint mit der Nummer 'breakpointnr'
 -  zurckgesetzt. 
 - 
 - 
 -PROC list breakpoints : 
 -  Der Status, die Adresse und der gesicherte Code (an dieser Adresse) werden 
 -  fr beide Breakpoints gelistet. 
 | 
