-------------------------------
Dokumentation zum Modula-System                         Stand 12.04.89
-------------------------------

Vorwort:
========
Dieses Modula-2-System wurde fr Ausbildungszwecke konzipiert und wird
zur Programmierausbildung fr Studenten der Fakult„t Elektrotechnik und
Informationstechnik eingesetzt.

Mit dieser Public-Domain-Version soll nun allen an Modula-2 Interessierten
die M”glichkeit geboten werden, sich mit dieser Sprache zu besch„ftigen.

Allerdings muž an dieser Stelle erw„hnt werden, daž von Seiten des
Lehrstuhls keine Dokumentation oder ausfhrliche Anleitung zur Verfgung
steht und daž keinerlei Beratung (weder telefonisch noch schriftlich)
durchgefhrt werden kann.


Die folgenden Hinweise k”nnen natrlich kein komplettes Handbuch ersetzen,
sollten aber fr die normale Bedienung des Systems ausreichen.


1.0 Zusammenstellung der Diskette :
-----------------------------------

   - AUTO         (Ordner, mit RAM-Disk)
   - DEF          (Ordner, mit den DEFINITION-Modulen zur Bibliothek)
   - GEMLIB       (Ordner, mit SBM- & OBM-Files fr GEM)
   - STDLIB       (Ordner, mit SBM- & OBM-Files der Standardmodule)
   - SYSTEM       (Ordner, mit SBM- & OBM-Files der Systemumgebung)
   - STANDALO.NE  (Ordner, mit OBM-Files, die der Linker ben”tigt)
   - SBM          (Ordner, mit SBM-Files, die in die RAM-Disk kopiert
                   werden)
   - OBM          (Ordner, mit OBM-Files,            -"-              )
   - WORK         (Ordner, mit den Files, die bearbeitet werden sollen)
   - COPY.LST     (Liste der Files die in die Ramdisk berspielt werden)
   - RAMDISK.INF  (Infodatei der RAM-Disk, Gr”že, Laufwerksbuchstabe ...)
   - (EDITOR.PRG) (eigener Editor z.B. Tempus)
   - M2PATH.TXT   (Suchpfade der MODULA-SHELL)
   - ERROR.IND    (Fehlermeldungen fr den Compiler)
   - MK_COPY.PRG  (Kopierprogramm. Es wird von der RAM-Disk aufgerufen)
   - M2LOADER.PRG (hiermit wird die Shell gestartet)
   - DEBUG.RSC
   - M2SHELL.RSC
   - DESKTOP.INF
   - READ.ME
   - COPYRIGH.T


2.0 Modula-Shell :
------------------

2.1 Hochfahren des Systems

    - ATARI einschalten
    - Modula-Diskette einlegen
      ... Der ATARI bootet und installiert die RAM - Disk
      ... Einige Files entsprechend der Datei COPY.LST werden in die
          RAM - Disk geladen
      Jetzt wird der M2LOADER durch Sie auf der RAM-DISK gestartet.
      (Der M2LOADER liest M2Paths.txt; man kann daher auch M2Loader als
       Anwendung anmelden und dann M2LOADER durch Doppelklick auf M2Paths
       starten. Dazu braucht M2LOADER.PRG nicht auf der RAM-Disk sein)
      Im LOADER starten Sie M2SHELL.OBM durch bet„tigen der RETURN-Taste.
      ...Die Modula-Shell wird nun geladen.
      Jetzt mssen Sie nur noch das DATUM eingeben, falls dies noch nicht
      geschehen ist und schon kann's losgehen.


2.1 Bedienung der Shell

    - Das Men 'Desk':
      - M2-Shell: ein paar Informationen zum Modula-2 System.
    - Das Men 'Modul':
      - Editieren, šbersetzen & Starten bezieht sich jeweils auf die
      Arbeitsdatei (wird in der Desktop-Box angezeigt). Ist noch keine
      Arbeitsdatei ausgew„hlt, so geschieht dies nach dem Anw„hlen ber
      die Fileselectorbox. Entsprechend wird nun der Editor, der Com-
      piler oder die Datei selbst geladen und ausgefhrt.
      Diese Funktionen k”nnen auch ber die Tastenkombinationen
      <control> E, š & S erreicht werden.
      - Editiere ..., šbersetze ... & Starte ... beziehen sich jeweils
      auf eine Datei, die erst noch mit der Fileselectorbox ausgew„hlt
      wird. Diese Funktionen k”nnen auch ber die Tastenkombinationen
      <alternate> E, š & S erreicht werden.
      - PRG erzeugen bezieht sich auf die aktuelle Arbeitsdatei und ruft
      den Linker auf, der die importierten Module zusammenbindet und ein
      lauff„higes Programm erzeugt. Erraten, das geht auch mit <control> L.
      - Ende oder <control> X und die Shell wird verlassen, in der File-
      selectorbox des M2LOADER muž dann <Abbruch> gew„hlt werden.
    - Das Men 'Optionen':
      - Mit Modul ausw„hlen oder <control> A kann die Arbeitsdatei festge-
      legt werden.
      - Mit Suchpfade „ndern oder <control> P k”nnen die Pfade auf welchen
      die Shell oder der Compiler die ben”tigten SBM- bzw. OBM-Files sucht
      ge„ndert werden.
      - Mit Terminal ”ffnen bzw. <control> T k”nnen z.B. die letzten
      Ausgaben eines Programms noch einmal untersucht werden, dazu wird das
      Terminal-Window ge”ffnet.
      - Compiler, Debug: ein paar Parameter k”nnen hier ge„ndert werden,
      die voreingestellten Werte sind Erfahrungswerte und mssen in den
      wenigsten F„llen ge„ndert werden.
      - Editor: Hier kann der verwendete Editor gew„hlt werden, wobei gilt:
                linker  Eintrag: Editor als PRG-File
                rechter Eintrag: Editor als OBM-File
                Der gew„hlte Editor wird unter dem angezeigten Namen
                gesucht. Beim 'PRG-Editor' wird er auf dem Pfad erwartet,
                von dem aus der M2LOADER gestartet wurde.
                Editor resident bezieht sich auf den 'OBM-Editor'.
      - Backup: Der gerade bearbeitete Text (beim Aufruf des Editors) wird
        auf dem angegebenen Pfad noch einmal abgespeichert, wenn ein Backup
        gewnscht wird. Das ist besonders zu empfehlen, wenn sich die
        Arbeitsdatei in der RAM-Disk befindet.
      - mit *.DEF, *.MOD bearbeiten (<control> D, M) kann man einstellen ob
      ein DEFINITION oder (IMPLEMANTATION) MODUL bearbeitet werden soll.
      Das bezieht sich im besonderen auf den Compiler (existiert TEST.DEF
      und TEST.MOD und soll TEST.DEF bersetzt werden, dann *.DEF bearbeiten
      w„hlen und den Compiler aufrufen), aužerdem werden dann in der File-
      selectorbox nur *.DEF bzw. *.MOD angezeigt.
    - Das Men 'Datei':
      - Kopieren, L”schen & Umbenennen: Es wird jeweils ber die File-
      selectorbox das entsprechende File ausgew„hlt und danach entweder
      das Zieldirectory oder der neue Name bestimmt.
      - Ausfhren: Es kann ein Programm (*.PRG) gestartet werden.



3.0 Informationen ber Linker, Debugger und Compiler :
------------------------------------------------------

3.1 Allgemeines:

- Die Arbeitsumgebung ist in Schichten aufgebaut. Unterste Schicht ist
  der M2LOADER. Auf M2LOADER liegt dann (normalerweise) M2SHELL. Dies
  ist ein Objektmodul d.h. es kann nicht ohne den M2LOADER laufen.
  M2SHELL ruft dann ihrerseits Editor und Compiler auf.
  Wird ein compiliertes Programm gestartet, so l„uft es, wenn es
  noch nicht gelinkt ist, wie alle ".OBM"- Programme unter Kontrolle
  von M2LOADER, der bei Laufzeitfehlern den Debugger starten kann.
  M2SHELL, der Compiler, der Editor und der Debugger bleiben, wenn sie
  einmal geladen sind, resident.

- M2PATHS.TXT.
  Diese Datei kann wie jede Textdatei mit dem Editor bearbeitet werden.
  In ihr stehen Suchpfade, die der Compiler, der Debugger, die Shell
  und M2LOADER auf der Suche nach Dateien benutzen.
  Aužerdem kann der Defaultaufruf des M2LOADER eingetragen werden. D.h.
  diejenige Objekt-Datei, deren Name in der letzten Zeile nach @M steht,
  wird vom M2LOADER vorgew„hlt und kann durch Anklicken von [OK] gestartet
  werden.
  In der vorletzten Zeile dieser Datei steht der Suchpfad (der letzte
  Suchpfad) der als Default fr Funktionen wie Modul ausw„hlen usw.
  verwendet wird.
  Der vorletzte Suchpfad wird als Voreinstellung fr den Backup-Pfad
  verwendet und sollte sinnigerweise keine RAM-Disk als Ziel haben.
  Fehlt die Angabe des Laufwerkes in einem Pfad, so bezieht sich dieser
  auf den aktuellen Pfad des GEMDOS, im allgemeinen der Pfad von dem aus
  der M2LOADER gestartet wurde.
  Jeder Pfad muž mit '\' enden, denn intern wird nur noch der Filename an
  den Pfad angeh„ngt.
  Maximal 15 Pfadnamen k”nnen angegeben werden.


3.2 Der Linker (Standalone Programme):

- Da man, wenn man "ernsthaft" programmieren will Programme ohne
  den Schutz von M2LOADER laufen lassen will, muž man die compi-
  lierten Objektmodule binden (linken). Dazu muž sich der Ordner
  STANDALO.NE auf dem Laufwerk befinden, von dem M2LOADER geladen
  wurde, d.h. Benutzer einer RAM-Disk mssen diesen Ordner mit Inhalt
  per Maus, oder per COPY.LST automatisch, in die RAM-Disk kopieren.
  Der Inhalt von STANDALO.NE sollte auf keinen Fall ver„ndert werden!
  Der Linker wird durch "PRG erzeugen" gestartet. Er sucht sich
  dann alles zusammen, was er braucht (GEMX.OBM, PATH.OBM, HEAP.OBM, ...)
  und erzeugt dann ein lauff„higes PRG-File aus allen n”tigen OBM-Files.
  (Diese mssen dann auch auf den Suchpfaden vorhanden sein). Der Linker
  berprft dabei die Module auch auf Versionskonflikte.  Findet der
  Linker ein OBM-File nicht, so gibt er dem Benutzer die Chance,
  per "Hand" die gesuchten Module zu finden. Die fertigen Programme
  werden, wenn keine Fehler auftraten, im gleichen Ordner wie das
  OBM-File abgelegt.
  Wichtig: Programme k”nnen nach dem Linken ein anderes Verhalten zeigen
           wie beim Aufruf aus der Shell. Das liegt daran, daž von der
           Shell bzw. Loader (vom Programmierer oft nicht wahrgenommen)
           eine Reihe von Funktionen zur Verfgung gestellt werden, die nun
           fehlen bzw. selbst eingerichtet werden mssen (z.B. Textausgabe,
           Exceptionbehandlung usw.).


3.3 Der Debugger:

- Der Debugger ist ein Source-Level-Debugger, der nach einem "Programm-
  absturz" aktiv wird (Post-Mortem-Debugger). Dazu wird er nach einem
  Laufzeitfehler vom M2LOADER gestartet und zeigt im Textfenster den
  Programmsourcetext; die Fehlerzeile ist dabei  fett gedruckt.
  Alle beim Fehlerauftritt sichtbaren Variablen k”nnen angezeigt werden.
  Sichtbar sind alle gobalen Variablen und die lokalen Variablen aller
  Prozeduren der aktuellen Prozeduraufrufkette.
  Dazu bedarf es aber der RFM-Files der entsprechenden Module.
  Es gibt fnf Fenster:

    - Quelltext:
    Da steht (hoffentlich) der Quelltext drin, in dem der Fehler auf-
    trat. Ist das Fenster leer, so ist der Quelltext zum entsprechenden
    Modul nicht erreichbar. Wenn der Quelltext in einem der Suchpfade
    liegt, fhrt das Anklicken des Modulnamens im Modulfenster (meistens)
    zum Erfolg.

    - Prozeduraufrufkette und Datenfenster 1:
    Diese beiden Fenster geh”ren zusammen. Das linke Fenster (Proze-
    duraufrufkette) zeigt, in welcher Reihenfolge die Prozeduren auf-
    gerufen wurden. Die oberste ist die Prozedur in der der Fehler auf-
    getreten ist. Im rechten Fenster k”nnen die Variablen, die in der
    ausgew„hlten Prozedur sichtbar sind, auf ihren Inhalt hin untersucht
    werden.

    - Modulliste und Datenfenster 2:
    Hier gilt gleiches wie oben, nur daž hier alle Module angezeigt werden,
    die sich gerade im Speicher befinden. Sofern die RFM-Files der Module
    auf den Suchpfaden liegen, k”nnen die dort sichtbaren Variablen
    untersucht werden.

  - Durch Anklicken von Prozedur bzw. Modulnamen kann man diese
  Prozedur bzw. dieses Modul betrachten, d.h. die dort sichtbaren
  Variablen.

  - Zu den Datenfenstern ist die Darstellung strukturierten Datentypen
  (Arrays , Records) und die Darstellung der Pointer auf diese Datentypen
  zu erw„hnen. Beide sind durch "*" gekenzeichnet. Klickt  man diesen an,
  so "betritt" man das Array/Record. In der ersten Zeile des Fensters
  erscheint nach einem "." der Name der angeklickten  Variablen. Bei
  tiefer strukturierten Datentypen k”nnen dort durchaus mehrere Bezeichner
  durch "." getrennt hintereinander stehen (z.B. bei der Analyse einer
  verketteten Liste ). Durch Anklicken der Bezeichner kann man dann
  wieder "herauf"steigen.

  - Variablen vom Typ BITSET, SET OF ... bzw. ADDRESS werden in hexa-
  dezimaler Form ausgegeben.

  - Die Meneintr„ge erkl„ren sich, wenn ein wenig mit ihnen 'gespielt'
  wird, bald von selbst.

  Hinweis: Error Process
  Modula bietet eine Schnittstelle zum Arbeiten mit Coroutinen
  (= Multitasking). Dazu wird der Datentyp "PROCESS" verwendet. Der
  Debugger analysiert beim Doppelklick auf eine Variable vom Typ PROCESS
  den lokalen Stack dieser Task. Soll auf den Stack der "abgestrzten" Task
  zurckgekehrt werden, so muž der Menpunkt Error Process angew„hlt werden.


  - FEHLER: Wenn in einer WITH-Anweisung der Programmablauf gestoppt wird,
  strzt der Rechner beim Fortsetzen des Programmes ab, sofern auf die
  dereferenzierte Variable noch innerhalb dieser WITH-Anweisung zugegriffen
  wird.
  Nach Aufruf des Debuggers kann es passieren, daž anschliežend mit Tempus
  abgespeicherte Dateien mehrfach unter dem gleichen Namen abgelegt werden.
  Bei der Rckkehr in die Shell werden diese in *.X?? umbenannt, wobei X fr
  den ursprnglichen Buchstaben der Extension steht und ? fr eine Ziffer,
  Es wird durch eine Alertbox darauf hingewiesen.
  Dieser Test beschr„nkt sich allerdings auf das aktuelle File das vor dem
  Aufruf des Editors bestimmt wurde.
  (Dieser Fehler sollte nun behoben sein!)

3.3 Der Compiler:

  - Der Compiler ist ein Single-Pass-Compiler, alle Bezeichner mssen vor
  ihrer Verwendung deklariert werden. Sollte dies fr Prozeduren nicht
  m”glich sein, so ist eine FORWARD Anweisung zu verwenden, die auf der
  gleichen Schachtelungstiefe wie die anschliessende Deklaration selbst
  erfolgen muž. Syntax: wie bei der Prozedur-Deklaration und dabei
  den BEGIN-END; - Block durch FORWARD; ersetzen.
  - Werden beim bersetzten einer Datei importierte Module nicht auf den
  Suchpfaden gefunden, so k”nnen Sie diese von Hand aufsuchen.
  - Wenn Fehler gefunden wurden, so wird eine Datei *.ERR erzeugt, in der
  neben Zeile und Spalte des Fehlers auch die Fehlermeldung zu finden ist.
  - Die SBM-, RFM- und OBM-Files werden im gleichen Ordner wie die
  Quelltexte abgelegt.
  - Wird der Compiler mit einer Datei mit Extension *.CM? (? = beliebiges
  Zeichen) aufgerufen, so erwartet er darin eine Liste von Modulnamen
  (mit Extension). Die Module werden dann in dieser Reihenfolge ber-
  setzt. Dies eignet sich, wenn in einem gr”žeren Programmpaket ein
  DEFINITION MODUL ge„ndert werden mužte, um ein komplettes Update zu er-
  zeugen („hnlich einem Make).



4.0 Allgemeine Hinweise:
------------------------

  - Diese Diskette enth„lt einen zum Modula-System passenden Editor
    (M2Editor). Da aber zum einen dieser Editor noch nicht 100 % ausge-
    testet ist und zum anderen ein Editor Geschmacksache ist, kann jeder
    andere Editor verwendet werden.
  - Als Editor eignet sich (neben dem beiliegenden Editor) Tempus ausge-
    zeichnet.
  - Die Voreinstellungen k”nnen mit einem Resource-Construction-Set leicht
  an eigene Wnsche angepažt werden. Es ist nur darauf zu achten, daž der
  Objektbaum nicht neu konstruiert wird (die Shell geht natrlich weiter-
  hin von ihrer Objektstruktur aus).
  Der Name des Editors kann ebenfalls ge„ndert werden (max. 8 Zeichen).
  Der Editor wird dann unter diesem Namen mit Extension *.PRG (linker
  Eintrag) bzw. *.OBM (rechter Eintrag) gesucht.
  - Wenn ein 1040'er verwendet wird, empfiehlt es sich das System wie folgt
  einzurichten:
    - Die RAM-Disk mit etwa 200 kByte installieren.
    - Die SBM-Files in den Ordner SBM in der RAM-Disk.
    - Die oft ben”tigten OBM-Files in den Ordner OBM in der RAM-Disk
    - den Ordner WORK mit den Files die gerade von Ihnen bearbeitet werden
    auf die RAM-Disk.
    - ohne Ordner auf der RAM-Disk den Editor (mit *.RSC), die Datei
    ERROR.IND sowie M2PATH.TXT.
    - Nun auf M2LOADER.PRG eine Anwendung mit Extension *.TXT anmelden.
    - DESKTOP.INF sichern.
    - nun kann durch Doppelklick auf M2PATH.TXT in der RAM-Disk der M2LOADER
    gestartet werden.
    - M2LOADER glaubt sich von der RAM-Disk gestartet, und es werden
    zus„tzlich 25 kByte in der RAM-Disk frei.

  - Das Pseudo-Modul SYSTEM exportiert folgende Bezeichner:
    VAL, ADR, ADDRESS, LONG, SHORT, BYTE, WORD,
    SETREG, REG, INLINE, CODE.
    In aller Krze:
    - VAL und ADR wie bei N. Wirth.
    - LONG und SHORT wandeln zwischen den verschiedenen Datenl„ngen um.
      Bsp. mit Typen: LONG(CARDINAL) = LONGCARD.
    - BYTE und WORD sind 'Universaltypen' der entsprechenden L„nge.
    - SETREG und REG setzen und lesen die Register des MC68000
      dabei gilt die Zuordnung der Registernummern:
        D0 -> 0, D1 -> 1, ... A0 -> 8, ... A7 -> 15.
      In die Register werden nur 32 Bit Worte geschrieben.
      Aufruf: SETREG( RegisterNummer, 32BitWort )
              32BitWort := REG( RegisterNummer )
      als 32 BitWort wird LONGINT und ADDRESS akzeptiert.
    - INLINE es kann Maschinensprache Code integriert werden.
      Bsp. INLINE( Zahl1, Zahl2, Zahl3 ) oder INLINE( Zahl1 ).
      Zahl? muž vom Typ CARDINAL und eine Konstante sein.

  - LONG-Konstanten mssen durch Anfgen von D als solche gekennzeichnet
  werden (323.0E23D ist eine LONGREAL-Konstante).

  - Zahlen in hexadezimaler Form k”nnen durch Anfgen von H gekennzeichnet
  werden, die erste Ziffer muž dennoch eine Zahl sein, also nicht FFH,
  sondern 0FFH

  - Aufz„hlungstypen haben maximal 256 Elemente.
  - Die Set-Gr”sse ist auf 16 (Wortgr”že) beschr„nkt.

Zum Schluž wnsch' ich allen Benutzern viel Spaž.

                                                    M.Bayer

===========================================================================

Kurze Anleitung des beiliegenden Editors :
==========================================

Editorfunktionen                                    Referenzliste
==================================================================

Funktionsname ! Men   ! Code     ! Beschreibung
--------------+--------+----------+------------------------------------
ProgInfo      ! Desk   ! CA ~ I   ! Infobildschirm zeigen
ProgQuit      ! File   ! CA ~ Q   ! Programm verlassen
FileOpen      ! File   ! CA ~ O   ! Datei in neues Fenster laden
FileLoad      ! File   ! CA ~ L   ! Datei in aktuelles Fenster laden
FileMerge     ! File   ! CA ~ M   ! Datei im aktuellen Fenster einfgen
FileSave      ! File   ! CA ~ S   ! Text mit neuem Namen speichern
FileUpdate    ! File   ! CA ~ U   ! Text direkt speichern
FileBackup    ! File   ! CA ~ B   ! Text speichern, altes File -> .BAK
FileDelete    ! File   ! CA ~ D   ! Datei l”schen
--------------+--------+----------+------------------------------------
WindowOpen1   ! Window !  C ~ (   ! Fenster 1 ”ffnen
WindowOpen2   ! Window !  C ~ )   ! Fenster 2 ”ffnen
WindowOpen3   ! Window !  C ~ /   ! Fenster 3 ”ffnen
WindowOpen4   ! Window !  C ~ *   ! Fenster 4 ”ffnen
WindowFull1   ! -      !  S ~ (   ! Fenster 1 auf volle Gr”že bringen
WindowFull2   ! -      !  S ~ )   ! Fenster 2 auf volle Gr”že bringen
WindowFull3   ! -      !  S ~ /   ! Fenster 3 auf volle Gr”že bringen
WindowFull4   ! -      !  S ~ *   ! Fenster 4 auf volle Gr”že bringen
WindowClose1  ! Window !  A ~ (   ! Fenster 1 schliežen
WindowClose2  ! Window !  A ~ )   ! Fenster 2 schliežen
WindowClose3  ! Window !  A ~ /   ! Fenster 3 schliežen
WindowClose4  ! Window !  A ~ *   ! Fenster 4 schliežen
--------------+--------+----------+------------------------------------
TextDelete    ! Edit   ! CA ~ DEL ! Text eliminieren, Fenster schliežen
SearchDefine  ! Edit   ! SC ~ S   ! Suchparameter definieren
SearchStart   ! Edit   !  C ~ S   ! Suchen starten
ReplaceDefine ! Edit   ! SC ~ R   ! Ersetzparameter definieren
ReplaceStart  ! Edit   !  C ~ R   ! Ersetzen starten
--------------+--------+----------+------------------------------------
TextStart     ! Jump   ! SC ~ CU  ! Textanfang anspringen
TextEnd       ! Jump   ! SC ~ CD  ! Textende anspringen
TextLine      ! Jump   !  C ~ G   ! Textzeile anspringen
ErrorFirst    ! Jump   !  C ~ F   ! ersten Fehler anspringen
ErrorLast     ! Jump   !  C ~ L   ! letzten Fehler anspringen
ErrorNext     ! Jump   !  C ~ N   ! n„chsten Fehler anspringen
ErrorPrevious ! Jump   !  C ~ P   ! vorherigen Fehler anspringen
--------------+--------+----------+------------------------------------
BlockMark     ! Block  !  A ~ B   ! Zeilenblock markieren
BlockHide     ! Block  !  A ~ H   ! Markierung l”schen
BlockDelete   ! Block  !  A ~ D   ! Block l”schen
BlockMove     ! Block  !  A ~ M   ! Block verschieben
BlockCopy     ! Block  !  A ~ C   ! Block kopieren
--------------+--------+----------+------------------------------------
ModeIndent    ! Mode   !  C ~ I   ! Indentmodus ein/ausschalten
ModeInsert    ! Mode   !  S ~ INS ! Insertmodus ein/ausschalten
ModeTab       ! Mode   !  C ~ TAB ! Tab-Weite definieren
--------------+--------+----------+------------------------------------
CharRight     ! -      !      CR  ! ein Zeichen nach rechts
CharLeft      ! -      !      CL  ! ein Zeichen nach links
CharReduce    ! -      !      BSP ! ein Zeichen links l”sch.
CharDelete    ! -      !      DEL ! ein Zeichen ausl”schen
CharInsert    ! -      !      INS ! ein Zeichen einfgen
--------------+--------+----------+------------------------------------
LineRight     ! -      !  S ~ CR  ! an das Zeilenende
LineLeft      ! -      !  S ~ CL  ! an den Zeilenanfang
LineDown      ! -      !      CD  ! Zeile runter
LineUp        ! -      !      CU  ! Zeile rauf
LineTailDelete! -      !  S ~ DEL ! Zeile ab Cursor l”schen
LineReduce    ! -      !  C ~ BSP ! Zeile vorher l”schen
LineDelete    ! -      !  C ~ DEL ! Zeile herausl”schen
LineInsert    ! -      !  C ~ INS ! Zeile einfgen
LineDownSwap  ! -      !  C ~ +   ! Zeile runter schieben
LineUpSwap    ! -      !  C ~ -   ! Zeile rauf schieben
LineDouble    ! -      !  C ~ ENT ! Zeile verdoppeln
LineUndo      ! -      !     UNDO ! Zeile restaurieren
--------------+--------+----------+------------------------------------
Eol           ! -      !      RET ! Zeile abschliežen
EolLineInsert ! -      !  S ~ RET ! Return + neue Zeile
EolBackspace  !        ! SC ~ BSP ! Zeile(n)+Zeile(n-1)
EolDelete     !        ! SC ~ DEL ! Zeile(n)+Zeile(n+1)
EolInsert     !        ! SC ~ INS ! (C~RET) Zeilenrest in neue Zeile
--------------+--------+----------+------------------------------------
TabRight      ! -      !      TAB ! n„chste TAB-Position anspringen
TabLeft       ! -      !  S ~ TAB ! vorherige TAB-Position anspringen
ScrollUp      ! -      !  S ~ CU  ! Text nach unten schieben
ScrollDown    ! -      !  S ~ CD  ! Text nach oben schieben
ScreenUp      ! -      !  C ~ CU  ! ein Bildschirm rauf
ScreenDown    ! -      !  C ~ CD  ! ein Bildschirm runter




         M o d u l a - U n t e r s t  t z u n g :



Da der Altex-Editor speziell fr das Modula-2-System entwickelt
wurde, enth„lt er einige Besonderheiten, die das Schreiben von
Modula-Programmen erleichtern.


Modula-Assistent:


Bei der Eingabe eines Modula-Programmes befindet man sich wegen
der Variablen und Kommentare normalerweise im Kleinschriftmodus.
Soll nun ein Modula-Schlsselwort eingegeben werden, so muž man
entweder in den Grožschriftmodus umschalten, oder die SHIFT-Taste
gedrckt halten. Dieses und die Eingabe des Schlsselwortes
selbst kann man sich nun vom 'Modula-Assistenten' abnehmen
lassen. Fr jedes bekannte Schlsselwort existiert eine maximal
zwei Buchstaben lange Abkrzung, die nach Drcken der HELP-Taste
(Der Cursor muž dazu genau hinter der eingegebenen Abkrzung
stehen!) in die korrekte, ausfhrliche Modula-Schreibweise umge-
wandelt wird.

Beispiel: p <HELP> wird zu 'PROCEDURE' expandiert ...
Beispiel: ew <HELP> wird zu 'END(*WHILE*);' umgewandelt ...

Nachfolgend eine Liste der Modula-Schlsselw”rter und ihrer
Abkrzungen:

Schlsselwort         | Krzel      Schlsselwort | Krzel
 -----------------------+--------   --------------+--------
ABS(                  | AB          LONGINT;_     | LI
ADDRESS;_             | AS          LONGREAL;_    | LR
ADR(                  | AD          LOOP_         | L
AND_                  | A           MOD_          | M
ARRAY_                | AR          MODULE_       | MO
BEGIN                 | B           NEW(          | NE
BITSET;_              | BS          NIL_          | NI
BOOLEAN;_             | BL          NOT_          | N
BY_                   | BY          ODD(          | OD
BYTE;_                | BT          OF_           | OF
CAP(                  | CP          OR_           | O
CARDINAL;_            | CD          ORD(          | OR
CASE_                 | CS          POINTER_TO_   | PT
CHAR;_                | C           PROC;_        | PR
CHR(                  | CR          PROCEDURE_    | P
CONST_                | CN          QUALIFIED_    | Q
DEC(                  | DC          REAL;_        | RA
DEFINITION_MODULE_    | DM          RECORD        | RE
DISPOSE(              | DP          REG(          | RG
DIV_                  | DV          REPEAT_       | RP
DO_                   | D           RETURN_       | R
ELSE_                 | E           Read(         | RD
ELSIF_                | ES          ReadCard(     | RC
END_                  | EN          ReadInt(      | RI
END(*CASE*);_         | EC          ReadReal(     | RR
END(*FOR*);_          | EF          ReadStr(      | RS
END(*IF*);_           | EI          SET_OF_       | S
END(*LOOP*);_         | EL          SETREG(       | SR
END(*RECORD*);_       | ER          SHIFT(        | SF
END(*WHILE*);_        | EW          SHORT(        | SH
END(*WITH*);_         | EH          SIZE(         | SI
EXCL(                 | EX          THEN_         | TH
EXIT;_                | ET          TO_           | TO
EXPORT_               | EP          TRUE          | T
FALSE                 | F           TRUNC(        | TC
FLOAT(                | FL          TSIZE(        | TS
FOR_                  | FO          TYPE_         | TY
FROM_                 | FR          UNTIL_        | U
HALT;_                | H           VAL(          | V
HIGH(                 | HI          VAR_          | VR
IF_                   | I           WHILE_        | W
IMPLEMENTATION_MODULE_| IM          WITH_         | WT
IMPORT_               | IP          WORD;_        | WO
IN_                   | IN          Write(        | WE
INC(                  | IC          WriteCard(    | WC
INCL(                 | IL          WriteInt(     | WI
INLINE(               | II          WriteLn;_     | WL
INTEGER;_             | IT          WriteReal(    | WR
LONG(                 | LO          WriteStr(     | WS
LONGCARD;_            | LC                        |


Compiler aufrufen:


Um den Zyklus 'bearbeiten, bersetzen, bearbeiten' zu beschleuni-
gen, besteht die M”glichkeit, den Compiler vom Editor aus zu
starten.


Exit 0........: Altex verlassen und Text speichern
Tastatur......: CTRL + ALT + 0 (Ziffernblock)

Altex wird ohne Sicherheitsabfrage verlassen und der aktuelle
Text (nur dieser!) unter seinem augenblicklichen Namen auf
Diskette gespeichert.


Exit 1........: Altex verlassen und bersetzen
Tastatur......: CTRL + ALT + 1 (Ziffernblock)

'Exit 1' funktioniert wie 'Exit 0', nur daž nach dem Verlassen
des Editors automatisch der Compiler zum šbersetzen des Textes
gestartet wird. šbersetzt wird allerdings nur ein Text, der
bereits in der Shell als aktueller Text angew„hlt wurde!


Exit 2........: Altex verlassen, bersetzen und starten
Tastatur......: CTRL + ALT + 2 (Ziffernblock)

'Exit 2' l„uft genauso ab wie 'Exit 1'. Zus„tzlich wird das
bearbeitete Programm nach dem (fehlerfreien!) šbersetzen sofort
gestartet.

Anmerkung: Sollte beim šbersetzen ein Fehler auftreten, so wird
automatisch wieder in den Editor gesprungen.

Fehler bearbeiten:

Auch bei der sorgf„ltigsten Programmierung ist man nicht v”llig
gegen 'Fehler beim šbersetzen' gefeit. Um das Auffinden der
Fehlerstellen zu erleichtern, erhielt Altex vier spezielle Funk-
tionen.

FirstError.: zeige erste Fehlermeldung
Men.......: Jump / FirstError
Tastatur...: CTRL + F

LastError..: zeige letzte Fehlermeldung
Men.......: Jump / LastError
Tastatur...: CTRL + L

NextError..: zeige n„chste Fehlermeldung
Men.......: Jump / NextError
Tastatur...: CTRL + N

PrevError..: zeige vorherige Fehlermeldung
Men.......: Jump / PreviousError
Tastatur...: CTRL + P



Beim Aufruf des Editors mit Angabe eines Dateinamens wird eine
evtl. vorhandene Fehlerdatei automatisch mitgeladen. Diese befin-
det sich dann im Fenster 1, die eigentliche Quellcode-Datei im
Fenster 2.
Sobald in das Fenster 1 eine Datei mit der Endung .ERR geladen
wird, wechselt Altex in den Fehlermodus. Nun erscheint in der
Infozeile von Fenster 2 die aktuelle Zeile aus der Fehlerdatei.
Mit den vorhandenen Funktionen kann man sich nun in der Fehlerda-
tei bewegen, w„hrend man die Sourcecode-Datei bearbeitet (ohne
dabei das Fenster wechseln zu mssen!). Wenn sich in der
aktuellen Zeile der Fehlerdatei eine Positionierungsangabe befin-
det, so wird diese Position im Sourcetext automatisch angesprun-
gen.



Versions-Update:


Fr die t„gliche Arbeit bei der Programmentwicklung w„re es oft
sehr ntzlich, wenn man wžte, wann man in welchem Programmteil
zuletzt Žnderungen vorgenommen hat. Einige Programmierer schrei-
ben sich deshalb einen sauberen Programmkopf, in dem sie das
Datum der letzten Žnderung eintragen. Das Problem bei dieser
Methode liegt nun darin, daž man leider in sch”ner Regelm„žigkeit
vergižt, dieses Datum zu aktualisieren.

Um diesem Mižstand wirkungvoll zu begegnen, besitzt Altex eine
spezielle Funktion.

Wenn innerhalb der ersten zehn Zeilen eines Programmtextes die
Zeichenfolge

'Version*:'

gefunden wird, so ersetzt Altex diese Zeichenfolge durch

'Version*: TT.MM.JJJJ   SS:MM'

'*'          steht fr beliebig viele beliebige Zeichen.
'TT.MM.JJJJ' steht fr das aktuelle Datum (z.B. 23.05.1989).
'SS:MM'      steht fr die aktuelle Zeit (z.B. 22:17).

Achtung: Hinter 'Version*:' sollte gengend Platz vorhanden sein,
da das Datum und die Zeit einfach berschreibend in den Text
plaziert werden.
