@DATABASE "GALer"
@INDEX Index

@NODE MAIN "GALer"

                            @{B}GALer@{UB} V2.1

              Copyright © 1991/96 by Christian Habermann
                        All Rights Reserved


                         @{U}Inhaltsverzeichnis@{UU}

        Allgemeines

                @{"Was ist GALer" LINK GALer}
                @{"Shareware" LINK Shareware}
                @{"WICHTIG" LINK Important}
                @{"Systemvoraussetzungen" LINK SystemReq}
                @{"Danksagungen" LINK Thanks}



        Kapitel I     GRUNDLAGEN
                I.1       @{"Programmierbare Logikbausteine" LINK ProgLogik}

                I.2       @{"Interne Struktur der GALs" LINK IntStruktur}
                I.2.1        @{"Das GAL16V8 und GAL20V8" LINK GAL16_20V8}
                I.2.2        @{"Das GAL22V10" LINK GAL22V10}
                I.2.3        @{"Das GAL20RA10" LINK GAL20RA10}


        Kapitel II    @{"DIE SOFTWARE" LINK Software}
                II.1      @{"Das Source-File" LINK SourceFile}

                II.2      Das Programm GALer
                II.2.1       @{"Installation" LINK Installation}
                II.2.2       @{"Allgemeines zur Bedienung" LINK Usage}
                II.2.3       @{"Die Menüpunkte" LINK Menus}
                II.2.4       @{"Der Assembler" LINK Assembler}
                II.2.5       @{"Das Programmieren" LINK Program}
                II.2.6       @{"Austesten von programmierten GALs" LINK Testing}
                II.2.7       @{"Der Optimizer" LINK Optimizer}

                II.3      @{"Das JEDEC-File" LINK JEDECFile}

                II.4      @{"Beispiele" LINK Examples}
                II.4.1       @{"GAL16V8" LINK Example16V8}
                II.4.2       @{"GAL22V10" LINK Example22V10}
                II.4.3       @{"GAL20RA10" LINK Example20RA10}

                II.5      @{"Fehlermeldungen" LINK Errors}
                II.5.1       @{"Assembler" LINK AsmErr}
                II.5.2       @{"JEDEC-Datei" LINK JEDECErr}
                II.5.3       @{"Reassembler" LINK ReAsmErr}


        Kapitel III   DIE HARDWARE
                III.1   @{"Programmierung von GALs" LINK ProgGAL}
                III.2   @{"Schaltungsbeschreibungen" LINK SchaltBesch}
                III.3   @{"Aufbau" LINK Construction}


        @{"Schlußwort" LINK Closing}

        Anhang

                @{"Schlüsselwörter des Source-Files" LINK Keywords}
                @{"Stückliste des GAL-Brenners" LINK PartList}
                @{"Literaturhinweise" LINK Literature}
                @{"History" LINK History}
                @{"Index" LINK Index}

@ENDNODE




@NODE GALer  "Was ist GALer"

GALer ist ein GAL-Programmiergerät mit der dazu nötigen Software.
Das Projekt GALer besteht somit aus zwei Komponenten, einer Hardware
und einer Software.

@ENDNODE


@NODE Shareware "Shareware"

GALer ist SHAREWARE. Falls Sie dieses Programm und/oder die Hardware
gebrauchen können, senden Sie mir bitte 20,- DM zu. Den Schaltplan für
die Hardware und den Bestückungsplan für die Platine erhalten Sie umgehend
nach Erhalt der Shareware-Gebühr.

Art der Bezahlung:
   Inland:  Egal, das überlasse ich Ihnen.
   Ausland: Bar oder Postwechsel. Bei Schecks beträgt die Sharewaregebühr
            33,50 DM (13,50 DM Bearbeitungsgebühr für Auslandsschecks von
            Seiten der Bank).


Ein Update erhalten Sie, wenn Sie mir zusätzlich eine Diskette und 5 DM
(auch in Briefmarken, 5 x 1,- DM) für Porto und Verpackung schicken und
wenn ein Update fertig ist, das den Namen Update auch verdient. GALer wird
allerdings auch weiterhin in PD Serien veröffentlicht werden, so daß Sie
auch auf diesem Weg die neueste Version erhalten können.


Hier meine Adresse: Christian Habermann
                    Asamstr. 17
                    85356 Freising
                    Deutschland
                    EMail: Christian.Habermann@t-online.de



Der Vertrieb von GALer über PD-Serien und Mailboxen ist erlaubt.
Bedingung ist allerdings, daß dabei kein Gewinn gemacht wird und daß die
einzelnen Files unverändert und vollständig kopiert bzw. "upgeloaded"
werden.
Falls Sie den GAL-Brenner nachgebaut haben, dürfen Sie diesen einen zum
Bauteilepreis auch verkaufen. Der kommerzielle Vertrieb ist NICHT gestattet.
Der Schaltplan darf nur privat und KOSTENLOS weitergegeben werden.



****************************************************************************
Aufgrund der Tatsache, daß in Deutschland (und nicht nur dort) einige
Leute anscheinend den Intelligenzquotienten eines Wollpullis haben, sehe
ich mich zu der nachfolgenden Erklärung gezwungen:

Folgenden Personenkreisen ist die Benutzung meines Programms strikt
untersagt: Allen Mitgliedern von rechtsradikalen Parteien (DVU, Republikaner
usw.), allen Mitgliedern und Sympathisanten von neonazistischen oder
rassistischen Gruppierungen, allen "Bürgern(?)", die die krimminellen
Steine- und Brandsatzwerfer moralisch (sei es durch Applaudieren oder "nur"
durch Zuschauen) unterstützen sowie allen anderen, die meinen, mit Gewalt
gegen Schwächere etwas erreichen zu können.
****************************************************************************


Falls Sie GALer über einen PD-Händler bezogen haben und dafür mehr
als 5 DM bezahlt haben, sollten Sie sich schnell einen neuen Händler
suchen.


@ENDNODE



@NODE Important "Wichtig!!!"


ACHTUNG!!! Die Programme GALer und GALerTest senden über den Parallel-
Port des Amiga Daten. Das heißt: wenn Sie dort einen Drucker, Digitizer oder
sonstiges angeschlossen haben, sollten Sie diesen entweder ausschalten
oder abstecken, da es sonst unter Umständen zur Beschädigung des Gerätes
kommen kann.

Für eventuell entstandene Schäden durch die Hardware und/oder Software kann
ich natürlich keine Verantwortung übernehmen.

Ich habe meinen Prototypen genau nach den Schaltplan aufgebaut, den
auch Sie bestellen können. Das heißt, daß der Schaltplan 100%ig fehlerfrei
ist. Bei gewissenhaftem Nachbau kann also eigentlich gar nichts schief gehen.
Der Nachbau sollte aber dennoch nur von erfahrenen Elektronik-Freaks durch-
geführt werden (zumindest muß man Löterfahrung haben und Schaltpläne lesen
können). Näheres zur Hardware können Sie im Kapitel III dieser Anleitung
erfahren.



Hinweis:  Diese Anleitung dient lediglich der Einführung in die Materie
          der GAL-Programmierung. Sie kann weiterführende @{"Literatur" LINK Literature}
          nicht ersetzen.
          Wenn Sie sich jedoch schon länger mit Digitaltechnik beschäftigen
          und gar nicht wissen wollen wie ein GAL intern aufgebaut ist und
          wie es genau funktioniert, dann müßte diese Anleitung zusammen
          mit den Beispiel-"Listings" ausreichen, um GALs sinnvoll
          einzusetzen.

@ENDNODE



@NODE SystemReq "Systemvoraussetzungen"

Um mit GALer arbeiten zu können, wird ein Amiga mit mindestens 512 kByte
Speicher und Workbench 2.0 oder höher benötigt.

Desweiteren wird das MagicUserInterface (MUI) benötigt, das GALer NICHT
beiliegt.

Der Autor von MUI, Stefan Stuntz, verlangt, daß bei Programmen, die
MUI verwenden in der Programmdokumentation der nachfolgende Text
abgedruckt wird (was ich gerne tue, da MUI ein wirklich hervorragendes
Produkt ist):

------------------------------------------------------------------------------

                        Diese Applikation verwendet

                          MUI - MagicUserInterface

                  (c) Copyright 1993/94 by Stefan Stuntz

MUI ist ein System, um graphische Benutzeroberflächen zu erstellen. Mit
Hilfe eines Preference-Programms hat der Anwender die Möglichkeit, die
Oberfläche einer MUI-Applikation (z.B. GALer) nach eigenem Geschmack zu
gestalten.

MUI wird als Shareware vertrieben. Um das komplette MUI-System mit vielen
Beispielen und mit weiteren Informationen über die Registrierung zu erhalten,
suchen sie im AmiNet, in PD-Sammlungen usw. nach einem File Namens muiXXusr.lha
(xx steht dabei für die Versionsnummer von MUI).

Wenn Sie sich direkt registrieren lassen wollen, senden Sie 30 DM an

                             Stefan Stuntz
                        Eduard-Spranger-Straße 7
                             80935 München
                                GERMANY

------------------------------------------------------------------------------


@ENDNODE



@NODE History "Versionen"

 Versionsübersicht:

    V1.0: - Testversion

    V1.1: - Intuition-Umgebung hinzugefügt

    V1.2: - einige Fehler beseitigt

    V1.3: - Fehler im GAL-Assembler beseitigt
              /name.E ist jetzt nicht mehr erlaubt
          - Die Pinnamen des zuletzt assemblierten Files können an
            das gezeichnete GAL angefügt werden.

    V1.4: - an Kick2.0 angepaßt
          - neue Benutzerführung
          - A-Typen werden jetzt unterstützt
          - Automatische Erkennung ob A-Typ oder Standardtyp vorliegt
          - Format des JEDEC-Files kompatibel gemacht
          - Neue Funktionen: Optimizer für Boolesche Gleichungen
                             Verify
                             Test auf Security-Fuse
                             GALs Vergleichen
                             Reassembler
          - Fehler im Assembler beseitigt (war hoffentlich der letzte)
              Bei der Rückkopplung von kombinatorischen Ausgängen machte
              der Assembler einen Fehler (AC0 falsch gesetzt).
          - WICHTIGE ÄNDERUNG!!! Negationszeichen '/' in der Pin-Deklaration
            werden jetzt in den Gleichungen berücksichtigt! (siehe Abschnitt
            "Das Source-File")

    V1.41 - Verwendung der locale.library und gadtools.library
            Diese Version läuft daher nur noch unter WB2.1 oder höher.
          - req.library durch reqtools.library ersetzt
          - Hilfe-Funktion

    V1.5  - Unterstützung von GAL22V10 und GAL20RA10
          - lauffähig ab Workbench 2.0
          - nur noch automatische A-Typ-Erkennung, kein A-Typ-Menü mehr
          - Assembler erkennt jetzt auch #,& und ! für ODER, UND und NICHT
          - Shortcuts wurden überarbeitet
          - externer Text-Editor kann jetzt von GALer aus aufgerufen werden
          - im Source-File sind jetzt Kommentare erlaubt

    V1.5a - identisch mit V1.5
            zusätzlich aber ein Platinen-Layout als PostScript- und
            Gerber-File

    V1.5b - verbessertes Timing beim Zugriff auf die GALer-Hardware, 
            Programmieren und Lesen von GALs hat sich dadurch allerdings
            verlangsamt
 
    V1.5c - Fehler beim Löschen von GALs des Typs 22V10 beseitigt
          - Auslesen von GALs wurde beschleunigt

    V2.0  - neue Oberfläche (MUI)
          - Bugs im Reassembler entfernt
              JEDEC-Dateien des GAL22V10 wurden falsch übersetzt und
              das Handling der Negation von Enable-Gleichungen war falsch
          - Bug im Assembler entfernt
              Rückkopplung von GAL22V10-Register-Ausgängen war falsch

    V2.1  - Optimizer funktionierte in Version 2.0 nicht, da sich bei einer
            Umformatierung des Source-Codes ein Tippfehler eingeschlichen
            hatte - SORRY). Dieser Fehler wurde behoben.

@ENDNODE




@NODE Thanks "Danksagung"


 An dieser Stelle möchte ich mich bei folgenden Leuten für Ihre tatkräftige
 Unterstützung bedanken.

 Dank geht an:

  - alle diejenigen, die die Shareware-Gebühr bezahlt haben

  - alle diejenigen, die Verbesserungsvorschläge gemacht oder mich auf
    Fehler aufmerksam gemacht haben

  - Frank Stange für das Betatesting und für seine sehr konstruktive Kritik

  - Helmut Hohenwarter für das Durchforsten der Anleitungsfiles

  - Nico François für die reqtools.library
    (reqtools.library (c) by Nico François)

  - Thorsten Elle für das Platinen-Layout. Das Platinen-Layout von GALer
    ist (c) by Thorsten Elle.

  - Stefan Stuntz für das Magic User Interface (MUI)
    MUI ist (c) by Stefan Stuntz (siehe auch @{"Systemvoraussetzungen" LINK SystemReq})

@ENDNODE









@NODE ProgLogik "Programmierbare Logikbausteine"

@{U}I.1 Programmierbare Logikbausteine@{UU}


Beim Entwurf von Logik-Schaltungen stehen dem Entwickler inzwischen eine
Vielzahl an TTL- und CMOS-Logik-Bausteinen zur Verfügung. Baut man sich
eine etwas komplexere Schaltung aus diesen einzelnen Logik-Bausteinen auf,
ergibt sich schnell das befürchtete TTL/CMOS-Grab. Meistens sind dann
die verwendeten ICs nicht einmal voll beschaltet. Eine Fehlersuche in so
einer Schaltung wird zum Geduldspiel. Eine nachträgliche Änderung der
Schaltungsfunktion ist außerdem nur sehr schwer möglich.

Hier setzen die programmierbaren Logikbausteine (PLDs) an. Eine besondere
Gruppe unter den PLDs sind die GALs (Generic Array Logic). Durch entsprechende
Programmierung durch den Anwender, können eine Vielzahl von Standard-
gatterfunktionen in einem IC, dem GAL, verwirklicht werden. Dadurch kann
der Schaltungsaufwand erheblich reduziert werden.

Ein GAL kann bei entsprechender Programmierung fast alle Logik-Funktionen
ersetzen, wie z.B.: AND, OR, XOR, NAND, NOR, Inverter, FlipFlops, Decoder
(vor allem Adressdecoder), Multiplexer, Zähler usw. Außerdem kann das GAL
jederzeit neu programmiert werden, so daß sich Schaltungen nachträglich
wesentlich einfacher ändern lassen, vorausgesetzt das GAL ist gesockelt
und nicht fest eingelötet. Die Hauptaufgabe von GALs ist die Vereinfachung
von Digitalschaltungen, indem ein GAL (oder mehrere) eine Vielzahl von
herkömmlichen Logik-Bausteinen ersetzt.

@ENDNODE


@NODE IntStruktur "Interne Struktur der GALs"

@{U}I.2 Interne Struktur der GALs@{UU}

Inzwischen gibt es eine ganze Palette an unterschiedlichen GAL-Typen. Am
verbreitesten sind die GAL16V8, GAL20V8 und GAL22V10. Zusätzlich zu diesen
GALs unterstützt GALer auch noch das GAL20RA10. Wie diese GALs im einzelnen
aufgebaut sind, soll nachfolgend erklärt werden.

@REM @{"GAL16V8 und GAL20V8" GAL16_20V8}
@REM @{"GAL22V10" LINK GAL22V10}
@REM @{"GAL20RA10" LINK GAL20RA10}

@ENDNODE


@NODE GAL16_20V8 "Das GAL16V8 und GAL20V8"

@{U}I.2.1 Das GAL16V8 und GAL20V8@{UU}

Bei den GAL16V8 und GAL20V8 gibt es die sogenannten Standard- ,A- und
B-Typen. Die A- und B-Typen sind schneller und stromsparender als die
Standard-Typen. Wenn ab jetzt vom GAL16V8 oder GAL20V8 die Rede ist, so
sind damit auch die A- und B-Typen gemeint. Wenn es erforderlich ist
zwischen den einzelnen Typen zu unterscheiden, werde ich dies extra erwähnen.

Zunächst die Pinbelegungen:

GAL16V8
                           ---- ----
     Eingang oder Clock   1|       |20  +5V
                Eingang   2|       |19  konfigurierbare Ausgangszelle
                Eingang   3|       |18  konfigurierbare Ausgangszelle
                Eingang   4|       |17  konfigurierbare Ausgangszelle
                Eingang   5|       |16  konfigurierbare Ausgangszelle
                Eingang   6|       |15  konfigurierbare Ausgangszelle
                Eingang   7|       |14  konfigurierbare Ausgangszelle
                Eingang   8|       |13  konfigurierbare Ausgangszelle
                Eingang   9|       |12  konfigurierbare Ausgangszelle
                    GND  10|       |11  Eingang oder /OE
                           ---------

GAL20V8
                           ---- ----
     Eingang oder Clock   1|       |24  +5V
                Eingang   2|       |23  Eingang
                Eingang   3|       |22  konfigurierbare Ausgangszelle
                Eingang   4|       |21  konfigurierbare Ausgangszelle
                Eingang   5|       |20  konfigurierbare Ausgangszelle
                Eingang   6|       |19  konfigurierbare Ausgangszelle
                Eingang   7|       |18  konfigurierbare Ausgangszelle
                Eingang   8|       |17  konfigurierbare Ausgangszelle
                Eingang   9|       |16  konfigurierbare Ausgangszelle
                Eingang  10|       |15  konfigurierbare Ausgangszelle
                Eingang  11|       |14  Eingang
                    GND  12|       |13  Eingang oder /OE
                           ---------


Aus der Pinbelegung erkennt man, daß sich die GAL-Typen GAL16V8 und GAL20V8
nach außen hin nur durch die Anzahl der Eingänge unterscheiden. So hängt die
Wahl, ob man ein GAL16V8 oder GAL20V8 verwenden soll, nur von der Anzahl der
benötigten Eingänge ab.

Kernstück eines jeden GALs ist eine Matrix. Auf die Spalten dieser Matrix
werden alle Eingänge invertiert und nicht invertiert zugeführt. Im
unprogrammierten Zustand des GALs sind die Spalten und Zeilen miteinander
verbunden. Jede dieser Verbindungen zwischen einer Zeile und einer Spalte
entspricht einer UND-Verknüpfung. Durch Programmieren des GALs werden die
entsprechenden UND-Verknüpfungen gelöscht, so daß sich die gewünschte
Verknüpfung ergibt. Eine Zeile heißt Produktterm, da alle Eingänge (Spalten)
deren Kreuzung mit einer Zeile noch existiert eben UND-verknüpft werden.

Beim GAL16V8 und GAL20V8 werden jeweils acht dieser Zeilen (= Produktterme)
zu der sogenannten OLMC (Output Logic Macro Cell) geführt. In dieser
Zelle werden die acht Produktterme miteinander ODER-verknüpft. Die OLMC
ist eine "konfigurierbare Ausgangszelle".

Was bitte ist eine "konfigurierbare Ausgangszelle"?
16V8 und 20V8 GALs besitzt acht dieser  konfigurierbaren Ausgangszellen.
Diese Ausgangszellen können entweder als Eingang, als kombinatorischer Ausgang,
als Tristate-Ausgang oder als Register-Ausgang programmiert werden.

Kombinatorischer Ausgang: dieser Ausgang ist ständig aktiv (entweder HIGH oder
                          LOW) und wird nicht zurückgekoppelt

Tristate-Ausgang        : dieser Ausgang kann drei Zustände annehmen
                          HIGH, LOW und hochohmig
                          (hochohmig wäre mit dem Abklemmen des Pins zu
                          vergleichen).
                          Dies wird benötigt, wenn man mehrere Ausgänge
                          zusammenschalten will, dabei aber nur einer
                          dieser Ausgänge aktiv sein darf.

Register-Ausgang        : Bei diesem Ausgang gelangt das Verknüpfungser-
                          gebnis der Eingänge nicht direkt an den Ausgang,
                          sondern über ein D-FlipFlop.
                          Erst bei einem Clock-Impuls gelangt das Ergebnis
                          zu dem entsprechenden Ausgang. Wenn /OE auf HIGH
                          liegt, gehen alle Ausgänge in den hochohmigen
                          Zustand.


Neben der Matrix gibt es bei den 16V8 und 20V8 GALs noch weitere Bits, die
folgende Bedeutung haben:

XOR (n) : Mit diesem Bit kann das Ergebnis der Verknüpfung für jeden Ausgang
          invertiert werden.
          XOR (n) = 0 : Ergebnis invertieren
          XOR (n) = 1 : Ergebnis nicht invertieren

SYN, AC0, AC1(n):
          Mit diesen Bits wird bestimmt, in welchem Betriebsmodus sich das
          GAL befinden soll, das heißt, ob Register-Ausgänge und/oder Tristate-
          Ausgänge oder kombinatorische Ausgänge verwendet werden.
          Im wesentlichen gibt es drei Betriebsmodi:

  Betriebsmodus 1:      SYN    = 1        AC0 = 0

                        AC1(n) = 1 : OLMC als Eingang
                        AC1(n) = 0 : OLMC als kombinatorischer Ausgang

  Betriebsmodus 2:      SYN    = 1        AC0 = 1

                        AC1(n) = 1 : Tristate-Ausgang

  Betriebsmodus 3:      SYN    = 0        AC0 = 1

                        AC1(n) = 1 : OLMC als Tristate-Ausgang
                        AC1(n) = 0 : OLMC als Register-Ausgang


PT0...63: (PT = Produkttermfreigabe) 
          Diese Bits bestimmen, ob die Zeilen 0...63 in der Matrix
          des GALs gültig sein sollen oder nicht.
          PTx = 1: UND-Verknüpfungen in der Zeile x sind gültig
          PTx = 0: UND-Verknüpfungen in der Zeile x sollen nicht
                   berücksichtigt werden (haben also keine Auswirkung
                   auf den Ausgang)
          (x = zwischen 0 und 63; in der Matrix gibt es 64 Zeilen,
           so daß jede Zeile individuell aktiviert bzw. deaktiviert werden
           kann)

(n) bedeutet dabei, daß diese Bits für jeden Ausgang extra vorhanden sind.

All diese Bits (82 Stück) sind zum sogenannten Architektur-Kontroll-Wort
(ACW) zusammengefaßt. Der Aufbau dieses ACW wird im Kapitel III näher be-
schrieben.


Signatur:
        Hier stehen acht Bytes für eigene Anwendungen zur Verfügung. 
        In der Regel wird hier ein kleiner Kommentar oder die Versions-
        nummer des GALs als ASCII-Text abgelegt.

Sicherheitszelle: (Security-Bit)
        Durch Setzen dieses Bits wird das GAL gegen unerlaubtes Kopieren
        geschützt. Das Auslesen der Matrix ist nicht mehr möglich. Da
        aber die restlichen Bits noch gelesen werden können, ist dieser
        Schutz nicht sehr effektiv.

Bulk Erase:
        Durch Programmieren dieser Zelle wird das gesamte GAL gelöscht.
        Ein GAL kann so ca. einhundertmal(!) neu programmiert werden.



@{U}Die Betriebsmodi des GAL16V8 und GAL20V8@{UU}

Wie bereits erwähnt wurde bestimmen die Bits SYN, AC0 und AC1(n) in welchem
Modus sich das GAL befindet, d.h. welche Art von Ausgänge zur Verfügung
stehen. Von diesem Modus hängt die Pin-Belegung des GALs ab.



GAL16V8, GAL16V8A, GAL16V8B:

Betriebs-|Betriebs-|Betriebs-|             |Betriebs-|Betriebs-|Betriebs-|
modus 1  |modus 2  |modus 3  |             |modus 1  |modus 2  |modus 3  |
------------------------------             -------------------------------
         |         |             --- ---             |         |
   E     |    E    |  Clock     1|     |20    +5V    |   +5V   |   +5V
   E     |    E    |    E       2|     |19    E/K    |   T*    |  E/T/R  
   E     |    E    |    E       3|     |18    E/K    |   E/T   |  E/T/R
   E     |    E    |    E       4|     |17    E/K    |   E/T   |  E/T/R
   E     |    E    |    E       5|     |16     K     |   E/T   |  E/T/R
   E     |    E    |    E       6|     |15     K     |   E/T   |  E/T/R
   E     |    E    |    E       7|     |14    E/K    |   E/T   |  E/T/R
   E     |    E    |    E       8|     |13    E/K    |   E/T   |  E/T/R
   E     |    E    |    E       9|     |12    E/K    |   T*    |  E/T/R
  GND    |   GND   |   GND     10|     |11     E     |    E    |   /OE
                                 -------



GAL20V8, GAL20V8A, GAL16V8B:

Betriebs-|Betriebs-|Betriebs-|             |Betriebs-|Betriebs-|Betriebs-|
modus 1  |modus 2  |modus 3  |             |modus 1  |modus 2  |modus 3  |
------------------------------             -------------------------------
         |         |             --- ---             |         |
   E     |    E    |  Clock     1|     |24    +5V    |   +5V   |   +5V
   E     |    E    |    E       2|     |23     E     |    E    |    E  
   E     |    E    |    E       3|     |22    E/K    |   T*    |  E/T/R  
   E     |    E    |    E       4|     |21    E/K    |   E/T   |  E/T/R
   E     |    E    |    E       5|     |20    E/K    |   E/T   |  E/T/R
   E     |    E    |    E       6|     |19     K     |   E/T   |  E/T/R
   E     |    E    |    E       7|     |18     K     |   E/T   |  E/T/R
   E     |    E    |    E       8|     |17    E/K    |   E/T   |  E/T/R
   E     |    E    |    E       9|     |16    E/K    |   E/T   |  E/T/R
   E     |    E    |    E      10|     |15    E/K    |   T*    |  E/T/R
   E     |    E    |    E      11|     |14     E     |    E    |    E
  GND    |   GND   |   GND     12|     |13     E     |    E    |   /OE
                                 -------

Abkürzungen:  E  :  Eingang
              K  :  kombinatorischer Ausgang ohne Rückkopplung
              T  :  Tristate-Ausgang
              T* :  Tristate-Ausgang ohne Rückkopplung auf die Matrix, was
                    nur heißt, daß dieser Ausgang nicht als Eingang ver-
                    wendet werden kann
              R  :  Register-Ausgang
              Clock: Takt für D-FlipFlops; nur für die Pins interessant,
                     die als Register-Ausgang programmiert sind
              /OE  : Output Enable (low aktiv): aktiviert die Register-
                     ausgänge


Aus der Pinbelegung ist z.B. ersichtlich, daß die Pins 15 und 16 des
GAL16V8 bzw. die Pins 18 und 19 des GAL20V8 nicht als Eingänge
programmiert werden können, wenn sich das GAL im Betriebsmodus 1 be-
findet.

Das gleiche gilt für die Pins 12 und 19 bzw. 15 und 22 für den
Betriebsmodus 2.

Im Betriebsmodus 1 sind die Pins 1 und 11 (GAL16V8) bzw. die Pins 1 und
13 (GAL20V8) für Clock und /OE reserviert. Diese Pins können also nicht
wie in den anderen beiden Modi, als Eingänge verwendet werden.

Wie oben bereits erwähnt wurde, gehen über ein ODER-Gatter an jede OLMC
acht Zeilen der Logik-Matrix. Es können also für jede OLMC max. acht
Produktterme angegeben werden. Wenn eine OLMC aber als Tristate-Ausgang
verwendet wird, bleiben nur sieben Zeilen für die Ausgangsgleichung
übrig. Eine Zeile geht für die Tristate-Kontrolle verloren. Es muß ja
schließlich auch angegeben werden können, wann ein Tristate-Ausgang aktiv
sein soll und wann nicht. Und dafür wird ein Produktterm, also eine Zeile
der Logik-Matrix, benötigt.


Hier noch ein kurzer Überblick, wann welcher Modus vorliegt: Angenommen, Sie
brauchen für Ihr GAL zumindest einen Registerausgang. Dann ist bereits der
Betriebsmodus 3 festgelegt. Wenn Sie aber mindestens einen Tristate-Ausgang
benötigen und keinen Registerausgang, dann befindet sich das GAL im Betriebs-
modus 2. Wenn Sie weder einen Tristate- noch einen Register-Ausgang benötigen
und keine Rückkopplung eines Ausgangs, dann liegt Betriebsmodus 1 vor.

@ENDNODE



@NODE GAL22V10 "Das GAL22V10"

@{U}I.2.2 Das GAL22V10@{UU}

Das GAL22V10 ist ein Nachfolger der 16V8 und 20V8 GALs. Diese zweite
Generation der GALs bietet eine wesentlich erweiterte Programmierbarkeit.
Trotzdem ist das GAL22V10 geradliniger aufgebaut als seine Vorgänger.

Zunächst wieder die Pinbelegung:

GAL22V10
                           ---- ----
      Clock und Eingang   1|       |24  +5V
                Eingang   2|       |23  konfigurierbare Ausgangszelle
                Eingang   3|       |22  konfigurierbare Ausgangszelle
                Eingang   4|       |21  konfigurierbare Ausgangszelle
                Eingang   5|       |20  konfigurierbare Ausgangszelle
                Eingang   6|       |19  konfigurierbare Ausgangszelle
                Eingang   7|       |18  konfigurierbare Ausgangszelle
                Eingang   8|       |17  konfigurierbare Ausgangszelle
                Eingang   9|       |16  konfigurierbare Ausgangszelle
                Eingang  10|       |15  konfigurierbare Ausgangszelle
                Eingang  11|       |14  konfigurierbare Ausgangszelle
                    GND  12|       |13  Eingang
                           ---------



Das GAL22V10 bietet zehn konfigurierbare Ausgangszellen (OLMCs) an, beim
GAL16V8 und GAL20V8 sind es ja "nur" acht. Die OLMCs beim GAL22V10 sind
bei weitem nicht so komplex (und vielleicht kompliziert) wie beim GAL16V8
und GAL20V8 aufgebaut. Trotzdem unterliegen sie weniger Einschränkungen.

Beim GAL22V10 gibt es für jede OLMC nur zwei Bits, das S0- und S1-Bit.
Das S0 entspricht dem XOR-Bit beim GAL16V8, GAL20V8. Damit kann das
Ergebnis einer Verknüpfung negiert werden.

Nochmal zur Erinnerung: XOR bzw. S0 = 0: Ergebnis invertieren
                        XOR bzw. S0 = 1: Ergebnis nicht invertieren

Das S1-Bit entspricht dem AC1-Bit beim GAL16V8 und GAL20V8. Dieses Bit
bestimmt, ob die OLMC als Register-Ausgang verwendet werden soll oder
als reiner Tristate-Ausgang. Für jeden Ausgangstyp kann eine Tristate-
Kontrolle angegeben werden. Es lassen sich also auch die Register-Ausgänge
einzeln hochohmig schalten. Beim GAL16V8 und GAL20V8 existiert ja für
alle Register-Ausgänge nur ein gemeinsamer Output-Enable-Eingang (/OE).

Pin 1 hat eine Doppelfunktion. Er dient gleichzeitig, also nicht alternativ,
als Clock-Eingang für die Register-Ausgänge und als normaler Eingang.

Zusätzlich gibt es noch zwei interne Signale im GAL22V10, die nicht als
Pins nach außen geführt sind. Das sind AR (asynchronous reset) und SP
(synchronous preset). Mit diesen beiden Signalen lassen sich die
Register-Ausgänge steuern. AR setzt die Register zurück, sobald die
entsprechende Bedingung für AR erfüllt ist. SP setzt die Register-Ausgänge,
wenn die entsprechende Bedingung für SP erfüllt ist und ein Clock-Impuls
am Pin 1 anliegt.

Eine weitere Besonderheit der 22V10 GALs ist, daß nicht für jede OLMC
gleich viele Zeilen der Logik-Matrix zur Verfügung stehen. Die Anzahl
variiert zwischen 9 und 17(!).

Hier die genauen Zahlen:

        OLMC am Pin |  Anzahl der Zeilen aus
                    |    der Logik-Matrix
        ------------+----------------------
             23     |         9
             22     |        11
             21     |        13
             20     |        15
             19     |        17
             18     |        17
             17     |        15
             16     |        13
             15     |        11
             14     |         9



Dabei ist zu beachten, daß wieder eine Zeile für die Tristate-Kontrolle
verloren geht. Für die Ausgangsgleichung stehen also nur 8, 10, 12, 14
oder 16 Produktterme zur Verfügung. Dies dürfte aber für die meisten
Anwendungen mehr als ausreichend sein.

@ENDNODE


@NODE GAL20RA10 "Das GAL20RA10"

@{U}I.2.3 Das GAL20RA10@{UU}

Als nächstes und letztes GAL soll das GAL20RA10 vorgestellt werden. Während
die GALs 16V8, 20V8 und 22V10 für so ziemlich alles verwendet werden können,
außer vielleicht zum Kochen und Putzen, ist das GAL20RA10 eher als Spezial-GAL
zu bezeichnen.

Zunächst wieder die Pinbelegung:

GAL20RA10
                           ---- ----
                    /PL   1|       |24  +5V
                Eingang   2|       |23  konfigurierbare Ausgangszelle
                Eingang   3|       |22  konfigurierbare Ausgangszelle
                Eingang   4|       |21  konfigurierbare Ausgangszelle
                Eingang   5|       |20  konfigurierbare Ausgangszelle
                Eingang   6|       |19  konfigurierbare Ausgangszelle
                Eingang   7|       |18  konfigurierbare Ausgangszelle
                Eingang   8|       |17  konfigurierbare Ausgangszelle
                Eingang   9|       |16  konfigurierbare Ausgangszelle
                Eingang  10|       |15  konfigurierbare Ausgangszelle
                Eingang  11|       |14  konfigurierbare Ausgangszelle
                    GND  12|       |13  /OE
                           ---------


Das GAL20RA10 hat ebenfalls zehn konfigurierbare Ausgangszellen. Jeder
Ausganszelle stehen acht Produktterme zur Verfügung, wobei nur vier davon
für die jeweilige logische Verknüpfung genutzt werden können. Jeweils
ein Produktterm wird für die Tristate-Kontrolle, für Clock, für Asynchronous
Reset und für Asynchronous Preset benötigt.
Und das ist das Besondere am GAL20RA10. Jeder Register-Ausgang hat seinen
eigenen Takt-Eingang und kann einzeln asynchron zurückgesetzt oder asynchron
gesetzt werden.
Der Produktterm für die Tristate-Kontrolle wird mit dem Pegel am Pin
/OE UND-verknüpft. Im normalen Betrieb muß also /OE auf low liegen.

Für jede OLMC gibt es nur ein Bit, das S0-Bit (=XOR), das ja dazu dient,
festzulegen, ob ein Ausgang active high oder active low ist. Es gibt also
kein Bit, das eine OLMC als Register-Ausgang oder als normalen Tristate-
Ausgang programmiert. Das geschieht anders:

Wenn die Bedingungen für asynchronen Reset und asynchronen Preset gleichzeitig
wahr sind, ist der Ausgang ohne Register, ansonsten mit.

Durch Pin 1, /PL (preload), können die Register-Ausgänge mit einem
bestimmten Wert vorgeladen werden. Das geschieht wie folgt:

   1. /OE auf high, damit werden alle Ausgangstreiber hochohmig

   2. gewünschten Pegel an die entsprechenden Register-Ausgänge legen
      (Ausgänge sind ja hochohmig geschaltet, ist also erlaubt)

   3. Low-Impuls an /PL, damit werden die Daten in die Register
      übernommen

Im normalen Betrieb muß /PL auf high liegen.

@ENDNODE




@NODE Software "Die Software"

                          Kapitel II

                         @{U}Die Software@{UU}


Im Prinzip können Sie fast das ganze Kapitel I wieder vergessen. Im
Prinzip - wohlgemerkt. Was Sie sich merken sollten ist, welche Pins
bei welchem GAL wie verwendet werden können. Dadurch lassen sich
unnötige Fehler vermeiden. Die Bestimmung des Betriebsmodus beim GAL16V8
bzw. GAL20V8 und die anderen Parameter, die bei der GAL-Programmierung
zu berücksichtigen sind, nimmt Ihnen die Software GALer ab, die
nachfolgend beschrieben wird.

@ENDNODE


@NODE SourceFile "Das Source-File"

@{U}II.1 Das Source-File@{UU}

Um ein GAL dazu zubringen, das zu machen, was Sie wollen, müssen die im
vorigen Kapitel beschriebenen Bits entsprechend gesetzt werden. Beim GAL16V8
zum Beispiel sind das immerhin 2194 Bits, bei den anderen GAL-Typen sogar
noch mehr. Daß das Setzten all dieser Bits von Hand alles andere als eine
tolle Arbeit wäre, dürfte wohl jedem klar sein.

Das Programmieren eines GALs läßt sich in etwa mit dem Programmieren einer
CPU vergleichen. Man kann die CPU direkt in Maschinensprache programmieren,
also direkt Hex-Zahlen eingeben, oder man kann einen Assembler benutzen, der
die Assembler-Befehle (Mnemonics) in Maschinensprache übersetzt.

So ähnlich verhält es sich auch bei den GALs. Es gibt sogenannte @{"GAL-Assembler" LINK Assembler},
die es ermöglichen, die Funktion eines GALs in einer für den Menschen leicht
verständlichen Form einzugeben.
Nun, da GALs nur logische Funktionen "ausführen" können, liegt es natürlich
nahe, die Funktion eines GALs in Form von Boolescher Algebra zu beschreiben.

Wie jetzt das Source-File für den GAL-Assembler auszusehen hat, das ist
Gegenstand dieses Abschnitts.


Diese Datei muß folgende Informationen enthalten:

  1. den GAL-Typ (GAL16V8, GAL20V8, GAL22V10 oder GAL20RA10)

  2. einen 8 Byte langen Text, der als Kommentar in das GAL geschrieben
     werden soll (@{"Signatur" LINK GAL16_20V8})

  3. die Pinnamen - hier werden den Pinnummern Namen zugewiesen, was
     wesentlich anschaulicher ist als wie die bloßen Pinnummern

  4. die Booleschen Gleichungen, die beschreiben was das GAL eigentlich
     machen soll

  5. Das Schlüsselwort DESCRIPTION - nach diesem Wort kann ein beliebiger
     Text stehen. Dieser Text beschreibt in der Regel die Funktion des
     GALs. Dadurch weiß man auch nach Jahren noch, für was das GAL
     eigentlich programmiert wurde.


Bevor ich jetzt noch länger 'rum schwafle, hier ein BEISPIEL (freu, jubel).

Beispiel 1:
Angenommen, Sie benötigen für eine Schaltung folgende Gatter:
- ein AND  mit 3 Eingängen
- ein NAND mit 2 Eingängen
- ein OR   mit 2 Eingängen
- eine kleine Digitalschaltung, in der die Ausgänge von 2 AND-Gattern
  zu den Eingängen eines OR-Gatters führen

Schaltbilder:

    AND:                        +----+                  W = A * B * C
                          A ----|    |
                          B ----| &  |---- W
                          C ----|    |
                                +----+


    NAND:                       +----+                  /X = D * E
                          D ----|    |
                                | &  |o--- X
                          E ----|    |
                                +----+
    OR:
                                +----+                  Y = F + G
                          F ----|    |
                                | >1 |---- Y
                          G ----| =  |
                                +----+

    kleine Digital-             +----+                  Z = H * I + J * K
    schaltung:            H ----|    |
                                | &  |----+
                          I ----|    |    |   +----+
                                +----+    +---|    |
                                              | >1 |---- Z
                                +----+    +---| =  |
                          J ----|    |    |   +----+
                                | &  |----+
                          K ----|    |
                                +----+



  Legende: * : UND  - Verknüpfung
           + : ODER - Verknüpfung
           / : low aktiv



Um das Source-File zu erstellen, ist zuerst der GAL-Typ zu bestimmen.
Für die Verwirklichung der obigen Logik-Funktionen werden insgesamt 11
Eingänge und 4 Ausgänge benötigt. Da keine Register benötigt werden und
somit keine Pins für Clock und Output-Enable verloren gehen, stehen bei
einem GAL16V8 10 Eingänge und 8 konfigurierbare Ausgangszellen (OLMCs)
zur Verfügung.

Da nur 4 der 8 OLMCs als Ausgang benötigt werden, können die restlichen
vier OLMCs als Eingang programmiert werden. Das heißt, wir haben bei einem
GAL16V8 14 mögliche Eingänge und 4 Ausgänge, was ja für unsere Aufgabe mehr
als ausreichend ist.

Man könnte auch jedes andere GAL verwenden, das von GALer unterstützt
wird - dann wären aber wesentlich mehr Pins unbenutzt. Außerdem ist das
GAL16V8 das preiswerteste unter den GALs. Damit ist der erste Schritt getan,
der GAL-Typ ist festgelegt, ein GAL16V8 soll es sein.

Als zweites benötigen wir einen Text für die Signatur, der max. acht
Zeichen lang sein darf - z.B. "Beispiel".

Als nächstes kommen die Pin-Deklarationen. Hier werden einfach die Pins
1 bis 20 des GAL16V8 der Reihe nach mit ihrem Namen aufgelistet.
Nichtverwendete Pins müssen mit "NC" (not connected) gekennzeichnet werden,
Masse mit GND und +5V mit VCC.

Hier:    B  C   D   E   F  G  H  I  J  GND
         K  NC  NC  NC  Z  Y  X  W  A  VCC       

Das heißt:    Pin  1 := B       Eingang
              Pin  2 := C       Eingang
              Pin  3 := D       Eingang
              Pin  4 := E       Eingang
              Pin  5 := F       Eingang
              Pin  6 := G       Eingang
              Pin  7 := H       Eingang
              Pin  8 := I       Eingang
              Pin  9 := J       Eingang
              Pin 10 := GND
              Pin 11 := K       Eingang
              Pin 12 := NC      nicht verwendet
              Pin 13 := NC      nicht verwendet
              Pin 14 := NC      nicht verwendet
              Pin 15 := Z       kombinatorischer Ausgang
              Pin 16 := Y       kombinatorischer Ausgang
              Pin 17 := X       kombinatorischer Ausgang
              Pin 18 := W       kombinatorischer Ausgang
              Pin 19 := A       (konfigurierbarer Ausgang als Eingang def.)
              Pin 20 := VCC

                            GAL16V8
                           ---- ----
                       B  1|       |20  VCC
                       C  2|       |19  A
                       D  3|       |18  W
                       E  4|       |17  X
                       F  5|       |16  Y
                       G  6|       |15  Z
                       H  7|       |14  NC
                       I  8|       |13  NC
                       J  9|       |12  NC
                     GND 10|       |11  K
                           ---------


Der nächste Punkt sind die Booleschen Gleichungen. 

         W = A * B * C

        /X = D * E

         Y = F + G

         Z = H * I + J * K

Somit haben wir alle Dinge, die man für das Source-File benötigt. Nun
stellt sich aber die Frage wie dieses File aufgebaut ist:

In der 1. Zeile muß der GAL-Typ stehen. Hier "GAL16V8"

In der 2. Zeile muß die Signatur stehen. Hier "Beispiel"

Danach folgt die Pin-Deklaration:
         B  C   D   E   F  G  H  I  J  GND
         K  NC  NC  NC  Z  Y  X  W  A  VCC       

dann die Booleschen Gleichungen:
         W = A * B * C
        /X = D * E
         Y = F + G
         Z = H * I + J * K

und das Schlüsselwort DESCRIPTION.

Kommentare werden mit einem ';' eingeleitet.

Jetzt können Sie mit Hilfe eines Text-Editors das Source-File erstellen und
unter "beispiel.pld" abspeicheln (hi hi, lustig). Dabei dürfen Sie den
Anhang ".pld" NICHT weglassen.

So sollte das Eingabe-File schließlich aussehen:
(**** kennzeichnet File-Anfang und File-Ende, bitte nicht mit eingeben)

******************************************************
GAL16V8                 ; GAL-Typ
Beispiel                ; Signatur

B  C   D   E   F  G  H  I  J  GND
K  NC  NC  NC  Z  Y  X  W  A  VCC        


 W = A * B * C          ; hier stehen die Gleichungen
/X = D * E
 Y = F + G
 Z = H * I + J * K

DESCRIPTION:
  Ab hier darf ein beliebiger Text stehen, der am besten
  die Funktion des GALs näher beschreibt.
******************************************************


Bei der Pin-Deklaration ist folgendes zu beachten: Ab Version 1.4
von GALer werden Negationszeichen ('/') in der Pin-Deklaration auch in
den Gleichungen berücksichtigt. Das heißt: Wenn in der Pin-Deklaration
vor einem Pinnamen ein '/' steht und in einer Gleichung der Pinname ohne
'/' steht, hat dies die selbe Wirkung als wenn der Pinname in der Pin-
deklaration ohne '/' stehen würde und in der Gleichung mit '/'.

Steht sowohl in der Pin-Deklaration als auch in der Gleichung vor dem
Pinnamen ein '/', so heben sich die Negationszeichen auf (doppelte
Negation).


Wie erhält man aber jetzt aus dem Eingabe-File das programmierte GAL?
Dazu wird das Programm GALer benötigt. Die Software wird im folgenden
Abschnitt ausführlich und hoffentlich auch allgemeinverständlich erklärt.



@ENDNODE




@NODE Installation "Installation"

@{U}II.2.1 Installation@{UU}

Um GALer zu installieren, starten Sie am einfachsten das
Installationsskript, das sich auf der GALer-Diskette befindet.

Wenn Sie GALer zum ersten Mal starten, stellen Sie bitte gleich im Menü
"@{"Projekt - Hardware-Version" LINK MenHardVer}" die Hardware-Version von GALer ein, mit der Sie
arbeiten wollen und speichern diese Einstellung durch Anwählen von
"@{"Projekt - Konfig. sichern" LINK MenSaveConfig}" ab.



Für Leute, die die Installation unbedingt von Hand vornehmen wollen,
hier die benötigten Dateien:

GALer benötigt folgende Dateien bzw. Libraries:

   muimaster.library     Diese Library ist Teil von MUI ((c) by Stefan Stuntz)
                         und liegt GALer nicht bei (weitere Infos siehe
                         @{"Systemvoraussetzungen" LINK SystemReq})

   reqtools.library      befindet sich im Verzeichnis GALer/Libs/
                         und muß, wenn nicht bereits schon dort vorhanden,
                         ins libs: Verzeichnis kopiert werden

   GALer.config          befindet sich im Verzeichnis GALer/s/
                         und kann ins s: Verzeichnis kopiert werden

   GALer.catalog
   GALerTest.catalog     befinden sich im Verzeichnis GALer/Catalogs/


Die Konfigurationen werden im File "s:GALer.config" abgespeichert. Wird
dieses File beim Starten von GALer nicht gefunden, werden die Default-Werte
eingestellt.

Um GALer deutschsprachig zu machen, muß GALer/Catalogs/deutsch/GALer.catalog
und GALer/Catalogs/deutsch/GALerTest.catalog ins Locale:Catalogs/deutsch/
Verzeichnis kopiert werden und von der Workbench aus Deutsch als bevorzugte
Sprache eingestellt sein. Ansonsten "spricht" GALer nur englisch mit Ihnen.

Sie können GALer entweder von der Workbench oder von der Shell (bzw. CLI)
aus starten.

@ENDNODE



@NODE Usage "Allgemeines zur Bedienung"

@{U}II.2.2 Allgemeines zur Bedienung@{UU}

Zur Bedienung läßt sich eigentlich nur sagen, daß dieses überaus nette Wesen
häufig in Restaurants anzutreffen ist und dem Trinkgeld nicht abgeneigt ist.


GALer ist mit einer Online-Hilfe ausgestattet. Wenn Sie den Mauszeiger über
einen Menüpunkt, eine Gadget-Gruppe oder ein Fenster stellen und die
Help-Taste drücken, erscheint ein entsprechender Hilfstext.


Fast alle Requester (einzige Ausnahme ist der File-Requester) können 
mittels Return-Taste bestätigt bzw. mittels ESC-Taste verneint werden.


GALer verwaltet die Endungen an den File-Namen ".pld", ".jed", ".chp",
".pin", ".fus" selbstständig. Im File-Requester können Sie daher File-Namen
entweder mit oder ohne die entsprechenden Endungen eingeben.


Die Bedienung an sich dürfte nicht zu schwer sein. Befolgen Sie einfach
die Anweisungen von GALer. Bei jeder Aktion erscheinen entsprechende
Requester, die Sie darauf hinweisen, was gerade gemacht wird oder warum
ein bestimmte Funktion nicht ausgeführt werden kann bzw. wo ein Fehler
ist. Wenn Sie einmal nicht mehr weiter wissen, springen Sie nicht aus
dem Fenster, sondern bemühen Sie einfach die Online-Hilfe.

@ENDNODE



@NODE Menus "Die Menüpunkte"

@{U}II.2.3 Die Menüpunkte@{UU}


  Projekt
    @{" über GALer         " LINK MenAbout}
    @{" Hardware-Version   " LINK MenHardVer}
    @{" Konfig. sichern    " LINK MenSaveConfig}
    @{" Quit               " LINK MenQuit}

  GAL-Typ
    @{" GAL16V8            " LINK MenGALType}
    @{" GAL20V8            " LINK MenGALType}
    @{" GAL22V10           " LINK MenGALType}
    @{" GAL20RA10          " LINK MenGALType}
    @{" Typ-Requester      " LINK MenTypeReq}

  GAL
    @{" programmieren      " LINK MenProg}
    @{" kopieren           " LINK MenCopy}
    @{" löschen            " LINK MenErase}
    @{" vergleichen        " LINK MenCmp}
    @{" Leertest           " LINK MenEmpty}
    @{" setze Security-Bit " LINK MenSetSec}
    @{" teste Security-Bit " LINK MenTestSec}
    @{" Schreibverhalten   " LINK MenWriteAcc}

  GAL-Assembler
    @{" GAL-Assembler      " LINK MenAsm}

  GAL-Disassembler
    @{" Signatur lesen     " LINK MenReadSig}
    @{" ACW lesen          " LINK MenACW}
    @{" GAL-Info           " LINK MenGALInfo}
    @{" JEDEC erstellen    " LINK MenMakeJEDEC}
    @{" JEDEC Parameter    " LINK MenJEDECPar}
    @{" Reassembler        " LINK MenReAsm}

  Tools
    @{" Pinnamen zeigen    " LINK MenShowNames}
    @{" Pinnamen löschen   " LINK MenClearNames}
    @{" GAL-Checker        " LINK MenChecker}
    @{" Editor             " LINK MenEditor}
    @{" Editor aufrufen    " LINK MenCallEditor}
    @{" Optimizer          " LINK MenOptimizer}
    @{" Hilfe              " LINK MenHelp}

@ENDNODE



@NODE MenAbout "Projekt"

 über GALer             Sagt Ihnen, wer den ganzen Mist verbrochen hat.
                        Ich kann's Ihnen auch gleich so sagen:  Ich war's!

@ENDNODE



@NODE MenHardVer "Projekt"

 Hardware-Version       Hier können Sie wählen, welche Hardware-Version von
                        GALer verwendet wird. Die hier ausgewählte Version
                        muß mit der Ihres GALer-Schaltplans übereinstimmen.
                        Ist das nicht der Fall, funktioniert GALer nicht
                        einwandfrei.
@ENDNODE


@NODE MenSaveConfig "Projekt"

 Konfig. sichern        Hiermit können einige Einstellungen wie GAL-Typ usw.
                        abgespeichert werden (File "s:GALer.config").
                        Beim nächsten Start von GALer wird dieses File
                        geladen und die entsprechenden Werte werden wieder
                        eingestellt.

@ENDNODE


@NODE MenQuit "Projekt"

 Quit                   GALer verlassen (heul). Mit dieser Funktion sollten
                        Sie extrem vorsichtig sein: Wenn sie zu oft benutzt
                        wird, merkt sich das GALer und wird sehr sehr böse.
                        Die Folge: GALer hebelt den Prozessor 'raus und
                        verkauft ihn meistbietend - dann schaut Ihr Amiga und
                        versteht das RAM nicht mehr.
@ENDNODE


@NODE MenGALType "GAL-Typ"

 GAL16V8                Mit diesen Menüpunkten kann der zu verwendende
 GAL20V8                GAL-Typ eingestellt werden.
 GAL22V10
 GAL20RA10

@ENDNODE

@NODE MenTypeReq "GAL-Typ"

 Typ-Requester          Wenn dieser Menüpunkt aktiviert ist, erscheint vor
                        jeder Schreib- oder Lesefunktion auf ein GAL ein
                        Requester, in dem Sie nochmal den GAL-Typ auswählen
                        können.

                        Diese Auswahl hat eine globale Wirkung - die gleiche,
                        wie wenn Sie den GAL-Typ über den entsprechenden
                        Menüpunkt auswählen würden.

                        Das heißt: Wenn Sie z.B. im GAL-Typ-Menü ein GAL20V8
                        eingestellt haben und im Requester jetzt ein GAL16V8
                        auswählen, wird im GAL-Typ-Menü automatisch ein
                        GAL16V8 eingestellt.
                        Alle darauffolgende Aktionen beziehen sich dann auf
                        das GAL16V8.
@ENDNODE


@NODE MenProg "GAL"

 programmieren          GAL programmieren. Es erscheint ein File-Requester,
                        mit dem Sie die entsprechende @{"JEDEC-Datei" LINK JEDECFile} auswählen
                        können, die in das GAL gebrannt (programmiert) werden
                        soll.

                        Weitere Informationen: @{"Das Programmieren" LINK Program}
@ENDNODE

@NODE MenCopy "GAL"

 kopieren               GAL kopieren. Mit dieser Funktion haben Sie die
                        Möglichkeit GALs zu kopieren. Dies ist jedoch nur
                        sinnvoll, wenn das zu kopierende GAL nicht geschützt
                        (@{"Security-Fuse" LINK GAL16_20V8}) ist.
@ENDNODE


@NODE MenErase "GAL"

 löschen                GAL löschen. Bevor ein bereits programmiertes GAL
                        neu programmiert werden kann, muß es zuvor gelöscht
                        worden sein. Diese Aufgabe übernimmt diese Funktion.
@ENDNODE


@NODE MenCmp "GAL"

 vergleichen            Es gibt drei verschiedene Möglichkeiten des Ver-
                        gleichs, die Sie in einem entsprechenden Requester
                        auswählen können. Als da wären:

                        1. GAL mit GAL vergleichen: Es wird ein Quell-GAL
                        eingelesen, das dann mit mehreren, nacheinander in
                        die Textool-Fassung einzusetzenden GALs verglichen
                        werden kann.

                        2. GAL mit @{"JEDEC-File" LINK JEDECFile} vergleichen: Es wird wieder
                        zuerst ein Quell-GAL eingelesen. Anschließend
                        können Sie JEDEC-Files auswählen, die mit dem GAL
                        verglichen werden.

                        3. JEDEC-File mit GAL vergleichen: Es wird zunächst
                        ein JEDEC-File geladen, das dann anschließend mit
                        mehreren GALs verglichen werden kann.
@ENDNODE


@NODE MenEmpty "GAL"

 Leertest               Testen, ob das GAL leer ist.

@ENDNODE


@NODE MenSetSec "GAL"

   setze Security-Bit   Brennt die @{"Security-Fuse" LINK GAL16_20V8} in einem GAL (siehe I.2).

@ENDNODE


@NODE MenTestSec "GAL"

 teste Security-Bit     Diese Funktion testet ein GAL daraufhin, ob die
                        @{"Security-Fuse" LINK GAL16_20V8} gebrannt wurde oder nicht.

@ENDNODE


@NODE MenWriteAcc "GAL"

 Schreibverhalten       Nach Aufruf dieses Menüpunkts erscheint ein Requester.
                        In diesem Requester können Sie folgendes einstellen:

                        1. Programmieren mit oder ohne vorherigem Leertest und
                        mit oder ohne anschließendem Verify (Überprüfung, ob
                        die Daten richtig in das GAL programmiert worden sind)

                        2. GAL kopieren: Beim Ziel-GAL vorher Leertest durch-
                        führen oder nicht und nach dem Kopieren Verify
                        durchführen oder nicht.

                        3. GAL löschen: Nach dem Löschen des GALs einen Leertest
                        durchführen um festzustellen, ob das GAL auch
                        wirklich leer ist.
@ENDNODE


@NODE MenAsm "GAL-Assembler"

 Datei assemblieren     Durch Auswahl dieses Menüpunktes wird der
                        @{"Assembler" LINK Assembler} aufgerufen. Mit dem Assembler wird ein
                        @{"Source-File" LINK SourceFile} (".pld") in eine @{"JEDEC-Datei" LINK JEDECFile} (".jed")
                        umgewandelt. Die JEDEC-Datei wird zur Programmierung
                        des GALs benötigt.

                        Es erscheint zunächst wieder ein Requester. In diesem
                        Requester kann eingestellt werden, welche Files erzeugt
                        werden sollen, ob die Files automatisch (ohne extra
                        einen File-Requester zu öffnen) geschrieben werden
                        sollen und ob der im Source-File (".pld") angegebene
                        GAL-Typ (GAL16V8, GAL20V8,...) übernommen werden soll.

                        Durch Anklicken von "Weiter" erscheint ein File-
                        Requester mit dessen Hilfe Sie das zu assemblierende
                        Source-File (Endung ".pld") auswählen können.


                        Weitere Informationen siehe im Abschnitt @{"Der Assembler" LINK Assembler}.
@ENDNODE


@NODE MenReadSig "GAL-Disassembler"

 Signatur lesen         Liest die @{"Signatur" LINK GAL16_20V8} aus dem GAL aus und gibt
                        sie auf dem Bildschirm aus.
@ENDNODE


@NODE MenACW "GAL-Disassembler"

 ACW lesen              Liest das @{"Architektur-Kontroll-Wort" LINK GAL16_20V8} aus dem GAL aus
                        und gibt es auf dem Bildschirm aus.
@ENDNODE


@NODE MenGALInfo "GAL-Disassembler"

 GAL-Info               Diese Funktion gibt einige Informationen über das
                        GAL aus:

                        GAL-Typ (A-Typ oder Standard), Hersteller und ob das
                        GAL durch diese Version von GALer unterstützt wird
                        oder nicht.
@ENDNODE

@NODE MenMakeJEDEC "GAL-Disassembler"

 JEDEC-Datei erstellen  Diese Funktion liest ein bereits programmiertes
                        GAL aus und erstellt eine @{"JEDEC-Datei" LINK JEDECFile}.
@ENDNODE

@NODE MenJEDECPar "GAL-Disassembler"

 JEDEC-Datei Parameter  Die Einstellungen, die hier vorgenommen werden
                        können, beziehen sich auf das Schreiben  der
                        @{"JEDEC-Datei" LINK JEDECFile}. Diese Einstellungen gelten für alle
                        Funktionen, die eine JEDEC-Datei erzeugen.

                        Das sind: der @{"GAL-Assembler" LINK Assembler} und die Funktion
                        "@{"JEDEC-Datei erstellen" LINK MenMakeJEDEC}".

                        Folgende Einstellungen sind für das JEDEC-File-Schrei-
                        ben zuständig:

                        1. Security-Bit: Gibt an, ob im JEDEC-File das
                        Security-Bit gesetzt sein soll oder nicht. Wenn es
                        gesetzt ist und später ein GAL mit dieser JEDEC-Datei
                        programmiert wird, so werden Sie nach der Program-
                        mierung des GALs in einem Requester gefragt, ob die
                        @{"Security-Fuse" LINK GAL16_20V8} im GAL gebrannt werden soll oder nicht.

                        2. Fuse-Checksumme: Gibt an, ob eine Checksumme über
                        die verschiedenen Fuses (1en und 0en im JEDEC-File)
                        gebildet werden soll oder nicht. Diese Checksumme
                        wird dann beim späteren Einlesen der Datei überprüft.
                        Damit wird verhindet, daß versehentlich Fuses geändert
                        werden.

                        In der Datei kann aber z.B. ein Kommentar verändert
                        werden, ohne daß dies einen Einfluß auf die Checksumme
                        hätte, da diese ja nur über die 1en und 0en gebildet
                        wird - deshalb Fuse-Checksumme.

                        3. File-Checksumme: Gibt an, ob eine Checksumme über
                        das gesamte File erstellt wird. Dieses File darf
                        dann überhaupt nicht mehr geändert werden, auch
                        der Kommentar nicht. Ansonsten wird die Checksumme
                        verändert und beim Einlesen der JEDEC-Datei wird dann
                        darauf hingewiesen. Damit wird verhindert, daß die
                        Datei in irgendeiner Weise verändert wird.
@ENDNODE



@NODE MenReAsm "GAL-Disassembler"

 Reassembler            Diese Funktion liest eine @{"JEDEC-Datei" LINK JEDECFile} ein und er-
                        stellt daraus das entsprechende @{"Source-File" LINK SourceFile}.
                        In den String-Gadgets können Sie die Pinnamen
                        für die @{"Pinnamendeklaration" LINK SourceFile} im Source-File eingeben.

                        Mit "Clear" werden die voreingestellten Pinnamen
                        gelöscht. Mit "Set" werden diese wieder hergestellt.
@ENDNODE


@NODE MenShowNames "Tools"

 Pinnamen zeigen        Falls bereits ein Source-File erfolgreich assembliert
                        wurde und der eingestellte GAL-Typ mit dem GAL-Typ in
                        der @{"Source-Datei" LINK SourceFile} übereinstimmt, fügt diese Funktion
                        die entsprechenden Pinnamen an das symbolische GAL in
                        der Bildschirmmitte an.
@ENDNODE


@NODE MenClearNames "Tools"

 Pinnamen löschen       Setzt die Pinnamen am GAL auf Default-String.
@ENDNODE


@NODE MenChecker "Tools"

 GAL-Checker            Aktiviert den GAL-Checker. Der GAL-Checker ermöglicht das
                        Testen von programmierten GALs.

                        Weitere Informationen: @{"Das Austesten von GALs" LINK Testing}
@ENDNODE

@NODE MenEditor "Tools"

 Editor                 Diese Funktion öffnet ein Fenster, in dem Sie den
                        Editor eingeben können, der gestartet werden soll,
                        wenn Sie den Menüpunkt '@{"Editor aufrufen" LINK MenCallEditor}' anwählen.
                        Voreingestellt ist:   run c:ed "%s"
                        Beim Aufruf des Editors wird %s durch den Namen des
                        zuletzt assemblierten @{"Source-Files" LINK SourceFile} ersetzt.
@ENDNODE


@NODE MenCallEditor "Tools"

 Editor aufrufen        Diese Funktion startet den von Ihnen eingestellten
                        Editor. Dabei wird versucht, das zuletzt assemblierte
                        Source-File in den Editor zu laden. Der Editor kann,
                        wie eben beschrieben, durch Anwählen des Menüpunkts
                        '@{"Editor" LINK MenEditor}' gestartet werden.
@ENDNODE


@NODE MenOptimizer "Tools"

 Optimizer              Diese Funktion dient der Optimierung von Booleschen
                        Gleichungen im Source-File.

                        Weitere Informationen unter: @{"Der Optimizer" LINK Optimizer}
@ENDNODE


@NODE MenHelp "Tools"

 Hilfe                  Diese Funktion erklärt Ihnen, wie Sie Hilfe zu einem
                        bestimmten Menüpunkt erhalten können.
@ENDNODE




@NODE Assembler "Der Assembler"

@{U}II.2.4 Der Assembler@{UU}

Um ein GAL zu programmieren, muß zunächst das @{"Source-File" LINK SourceFile} in das so-
genannte @{"JEDEC-File" LINK JEDECFile} umgewandelt werden. Diese Aufgabe übernimmt der
GAL-Assembler.

Das JEDEC-File (Endung ".jed") ist ein "Text"-File, in dem sämtliche Bits,
die in einem GAL gesetzt werden können, der Reihe nach aufgelistet sind.
Den Zustand der Bits (0 oder 1) ermittelt der GAL-Assembler aus dem
Source-File.

Neben dem JEDEC-File kann der GAL-Assembler noch drei weitere Files generieren.
Diese Files dienen aber lediglich der Dokumentation:

- Das Fuse-File (Endung ".fus") zeigt den Zustand der Bits in der
Logik-Matrix.

- Das Chip-Diagramm (Endung ".chp") zeigt den Anschlußplan des GALs
und das

- Pin-Belegungs-File (Endung ".pin") listet alle Pins auf und zeigt,
ob diese als Eingang oder Ausgang programmiert sind.

Diese Files können von einem beliebigen Text-Editor gelesen und
eventuell nachbearbeitet werden.


Bei der Eingabe von Filenamen in GALer ist zu beachten, daß die Endungen
(".jed", ".chp", ".pin", ".pld") der einzelnen File-Typen (JEDEC-, Chip-,
Pin-, Eingabe-File) entweder weggelassen oder mit angegeben werden können.


Die Assemblierung eines Source-Files geschieht wie folgt:

Sie wählen einfach den Menüpunkt @{"Datei assemblieren" LINK MenAsm} an. Im daraufhin
erscheinenden Requester kann folgendes eingestellt werden:

 - Welche Files erzeugt werden sollen - JEDEC, Fuse, Chip, Pin.

 - Ob die zu erzeugenden Files automatisch abgespeichert werden sollen,
   das heißt, daß nach erfolgreicher Assemblierung des Source-Files der
   Name des Source-Files ("name.pld") mit den entsprechenden Endungen
   "name.jed", "name.fus", "name.chp" und "name.pin" versehen wird und
   anschließend ohne File-Requester in das selbe Directory geschrieben
   wird, in dem sich auch das Source-file ("name.pld") befindet oder ob
   für jedes zu erzeugende File ein eigener File-Requester erscheinen
   soll.

 - Ob der GAL-Typ aus dem Source-File übernommen werden soll. Wenn
   diese Funktion aktiviert ist, wird das symbolische GAL in der Bild-
   schirmmitte mit den Pinnamen aus dem Source-File versehen. Damit
   wird ein späteres Austesten mit der Funktion "GAL-Checker" erheblich
   erleichtert, da anstatt der selten bläden Pinnummern jetzt richtige
   Namen dastehen (ist doch toll, oder?). Anmerkung: "selten bläd" ist
   ein bayerischer Kraftausdruck und heißt soviel wie: nicht häufig
   unintelligent oder allgemein verständlicher: selten dämlich

Durch Anklicken von "Weiter" geht's weiter und mit "Abbruch" wird
abgebrucht (hi hi -- lustiger Spruch, muß ich mir merken).

Wenn Sie sich nach Abwägung sämtlicher Vor- und Nachteile und
nach Beseitigung sämtlicher Gewissenskonflikte zu einem "Weiter" durch-
gerungen haben, erscheint jetzt ein File-Requester. Mit diesem File-
Requester können Sie jetzt das Source-File auswählen, das assembliert
werden soll.

Wenn während der Assemblierung kein Fehler auftritt, erscheint erneut ein
File-Requester. Hier können Sie auswählen, unter welchem Namen die soeben
erzeugte @{"JEDEC-Datei" LINK JEDECFile} abgespeichert werden soll.

Mögliche @{"Fehlermeldungen" LINK AsmErr} des Assemblers werden in einem eigenen
Abschnitt ausführlich erklärt.

@ENDNODE



@NODE Program "Das Programmieren"

@{U}II.2.5  Das Programmieren@{UU}

Um ein GAL zu programmieren, muß, wie bereits erwähnt, zunächst aus dem
@{"Source-File" LINK SourceFile} die @{"JEDEC-Datei" LINK JEDECFile} erzeugt werden. Diese Aufgabe übernimmt,
wie ebenfalls bereits erwähnt, der @{"Assembler" LINK Assembler}.

Liegt die JEDEC-Datei vor, muß sichergestellt sein, daß das GAL leer ist.
Dies kann mit der Funktion @{"Leertest" LINK MenEmpty} überprüft werden. Wenn ein GAL nicht
leer ist, muß es vor der erneuten Programmierung mit der Funktion @{"löschen" LINK MenErase}
gelöscht werden.
Wenn es dann leer ist, kann die Funktion @{"programmieren" LINK MenProg} aufgerufen werden.
Im daraufhin erscheinenden File-Requester können Sie das JEDEC-File auswählen,
das in das GAL programmiert werden soll. Wenn dies geschehen ist, wird das
GAL programmiert.


Hier nochmal eine kurze Zusammenfassung der Vorgehensweise bei der
Programmierung von GALs:

  1. mit Text-Editor das Eingabe-File erstellen ("name.pld")

  2. Eingabe-File assemblieren => JEDEC-File ("name.jed")

  3. GAL-Typ einstellen

  4. GAL in die Fassung einsetzen
     Wenn das GAL nicht leer ist, muß es durch Anwählen von "löschen"
     zuerst gelöscht werden, bevor es programmiert werden kann.

  5. "programmieren" anwählen

  6. GAL aus der Fassung nehmen  -  fertig

@ENDNODE



@NODE Testing "Das Austesten von GALs"

@{U}II.2.6 Das Austesten von GALs@{UU}


Nachdem das GAL programmiert wurde stellt sich immer die Frage, ob sich
das GAL auch so verhält, wie man es sich eigentlich vorgestellt hat.
Dazu bietet GALer die Möglichkeit, GALs auszutesten.

Um ein GAL auf seine Funktion hin zu überprüfen, muß es in die Textool-
Fassung gesteckt werden und der Menüpunkt @{"GAL-Checker" LINK MenChecker} angewählt
werden.

In der Mitte des Bildschirms sehen Sie symbolisch ein GAL abgebildet. Im GAL
selbst sind einige 'I's und 'O's zu sehen. Das 'I' steht für Input (Eingang)
und das 'O' für Output (Ausgang). Das 'O' ist ein Gadget. Durch Anklicken
wird das 'O' zu einem 'I' und durch nochmaliges Anklicken wieder zu einem
'O'. Das heißt, Sie können bestimmen, ob dieser Pin als Eingang oder als
Ausgang behandelt werden soll.

Falls ein Pin ein Eingang ist, kann durch ein weiteres Gadget bestimmt werden,
ob der Eingang auf "High" ('H') oder auf "Low" ('L') gelegt werden soll.

Ein Ausgang kann drei Zustände annehmen: 'H' (High-Pegel), 'L' (Low-Pegel)
und 'Z' (hochohmig). Der momentane Zustand wird direkt neben dem Pin
dargestellt.


Wenn Sie das GAL aus dem obigen @{"Beispiel" LINK SourceFile} verwenden, muß zunächst Pin 19
(="O") durch Anklicken von 'O' (das bei Pin 19), als Eingang definiert
werden, da dieser Pin im obigen Beispiel eben als Eingang programmiert
wurde.

Die Eingänge des AND-Gatters sind: Pin 19 (="A"), Pin 1 (="B"), Pin 2 (="C")
Der Ausgang ist Pin 18 (="W"). Wenn Sie jetzt die Eingänge des AND-Gatters
durch Anklicken der Pegel-Gadgets auf HIGH legen, so muß der Ausgang
(=Pin 18) ebenfalls auf HIGH gehen. Tut er das nicht oder geht der Ausgang
auch bei anderen Kombinationen als bei "A"=HIGH, "B"=HIGH, "C"=HIGH auf
HIGH, liegt wahrscheinlich ein Fehler in der Eingabe-Datei vor. Diese
sollte dann nocheinmal überprüft und gegebenenfalls korrigiert werden.

Wurde ein Fehler gefunden, muß das GAL zuerst gelöscht werden bevor es neu
programmiert werden kann (ein GAL kann bis zu einhundertmal gelöscht und
neu programmiert werden).

Wenn das GAL vollständig getestet wurde und kein Fehler gefunden wurde,
kann es in die Schaltung eingebaut werden.



@ENDNODE


@NODE Optimizer "Der Optimizer"

@{U}II.2.7 Der Optimizer@{UU}

Es kann vorkommen, daß die Booleschen Gleichungen im @{"Source-File" LINK SourceFile} recht
komplex sind. Boolesche Gleichungen lassen sich aber häufig vereinfachen.
Dazu gibt es mehrere Möglichkeiten:

1. Karnaugh-Diagramm: Dies ist ein graphisches Verfahren, um Boolesche
   Gleichungen zu vereinfachen. Es eignet sich aber eher für einfachere
   Gleichungen und dann vor allem dazu, Gleichungen von Hand zu optimieren.

2. Quine-McCluskey: Dies ist für den Computer das weitaus bessere Verfahren.
   Hier werden soviele Produktterme wie möglich an die eigentliche Gleichung
   angehängt (getrennt durch '+'), die aber den Wahrheitsverlauf der
   Gleichung nicht verändern. Diese Produktterme werden als Resolventen
   bezeichnet.

   Durch diese zusätzlichen Produktterme ist es in der Regel möglich, andere
   Produktterme der Gleichung zu eliminieren. Wenn man Glück hat, wird die
   daraus enstehende Gleichung weniger komplex als die ursprüngliche.

   Wenn man Pech hat, ist das Ergebnis der Optimierung wieder die Ausgangs-
   gleichung. Wenn man absolut megagroßes Pech hat, wird die Gleichung sogar
   noch komplexer als die Ausgangsgleichung - da hilft dann nur noch der
   Sprung aus dem Fenster (hoffentlich haben Sie Ihren Amiga im Keller
   stehen).
   Der Optimizer von GALer verwendet genau diesen in der Regel überaus
   effizienten Algorithmus.


Nun zur Bedienung des Optimizers:

   Nachdem Sie die Menüpunkt @{"Optimizer" LINK MenOptimizer} angewählt haben, erscheint ein
   File-Requester. Dort können Sie das Source-File auswählen, dessen
   Booleschen Gleichungen Sie vereinfachen wollen. Wenn das Source-File
   ohne Fehlermeldung geladen werden konnte, wird ein neues Fenster geöffnet
   und GALer beginnt mit Optimierung der ersten Gleichungen.

   Unter "alte Gleichung:" steht die Boolesche Gleichung, so wie sie 
   im Source-File steht. Unter "optimierte Gleichung:" steht, unter
   Umständen nach einigen Sekunden (Minuten, Stunden, Tagen, Wochen,
   Jahren, nie...), das Ergebnis der Optimierung.

   Im Feld "Statistik:" ist eine Übersicht über die Anzahl der ANDs und ORs
   der jeweiligen Gleichung zu sehen.

   Wenn Ihnen das Ergebnis der Optimierung gefällt, klicken Sie das Gadget
   "Übernehmen" an. Wenn Ihnen das Ergebnis nicht gefällt, dann klicken Sie
   "verwerfen" an.
   Falls noch eine Gleichung vorhanden ist, wird die nächste optimiert solange
   bis bei allen Gleichungen eine Optimierung versucht wurde.

   Wenn alle Gleichungen verkasimatukelt wurden, erscheint wieder ein
   File-Requester. Dort können Sie jetzt angeben, unter welchem Namen
   das neue Source-File, das jetzt die optimierten Gleichungen enthält
   (soweit "übernehmen" angewählt wurde), abgespeichert werden soll.
   Dort sollten Sie immer einen anderen Namen angeben, als den Namen
   des ursprünglichen Source-Files.

   Z.B.: ursprüngliches Source-File:  name.pld
         optimiertes Source-File:     name_opt.pld

   Zum Schluß noch ein schönes Beispiel, das zeigt wie effektiv eine
   Optimierung sein kann:

   Gleichung:
     X = /A*/C + A*/C + C*/D + /B*/C + /A*C*D + B*/D

   Durch GALer optimierte Gleichung:
     X = /C + /D + /A

   Beide Gleichungen sind vom Wahrheitsverlauf her völlig identisch. Es
   wurde nichts weggelassen, was wichtig wäre.

@ENDNODE



@NODE JEDECFile "Das JEDEC-File"

@{U}II.3 Das JEDEC-File@{UU}

Da das JEDEC-File inzwischen 9327 Mal erwähnt wurde, wird dieses
wundersame File an dieser Stelle näher erklärt. JEDEC steht übrigens für
(J)oint (E)lectron (D)evice (E)ngineering (C)ouncil.

Zunächst einmal ist das JEDEC-File nichts anderes als ein "Text"-File, in
dem sämtliche Sicherungen, die in einem GAL enthalten sind, der Reihe nach
aufgelistet sind. Den Zustand der Bits (0 oder 1) ermittelt der oben
bereits erklärte @{"GAL-Assembler" LINK Assembler}.

Am File-Anfang kann ein fast beliebiger Text stehen. Das einzige Zeichen
das in diesem Text nicht vorkommen darf ist ein ein Asterix (*) - nicht
zu verwechseln mit dem bekannten Gallier. Nach dem ersten '*' werden
die eigentlichen Steuerzeichen erwartet. Jedes Steuerzeichen MUß wieder mit
einem '*' abgeschlossen werden, wobei das '*' auch erst in einer der nächsten
Zeilen stehen kann.

Mögliche Steuerzeichen sind:

 N: Das Steuerzeichen N leitet einen Kommentar ein. Das Ende des Kommentars
    wird mit einem '*' gekennzeichnet.
    Beispiel:    N  das ist ein Kommentar *

 F: Wenn nicht alle Zustände der Sicherungen aufgelistet sind, muß der Wert
    der fehlenden Zustände angegeben werden. Dazu dient das Steuerzeichen F.
    Direkt hinter dem F muß eine 0 oder 1 stehen. Diese 0 oder 1 gibt den
    Wert der fehlenden Zustände an. Das hat den Vorteil, daß nicht alle
    Sicherungen des GALs aufgelistet werden müssen. Damit wird das JEDEC-
    File erheblich kürzer und übersichtlicher. Das GAL22V10 hat immerhin
    5892 Sicherungen, was ein ganz schön langes File ergeben würde, wenn
    für jede Sicherung eine "0" oder "1" angegeben werden müßte.
    Beispiel:    F0 *

 G: G bestimmt, ob beim späteren Programmieren eines GALs die Security-Fuse
    gebrannt werden soll oder nicht.
    G0 *    : Security-Fuse nicht brennen -> Auslesen der Fuse-Matrix möglich
    G1 *    : Security-Fuse brennen -> Auslesen der Fuse-Matrix nicht mehr
              möglich. Bevor die Security-Fuse gebrannt wird, werden Sie
              aber durch einen Requester gefragt, ob Sie das auch wirklich
              wollen.

 L: Das L leitet die eigentliche Fuse-Liste ein. Direkt hinter dem L muß
    die Adresse der nachstehenden Sicherungen stehen. Hinter dieser Adresse
    folgt dann die Liste der Sicherungen ("0", "1").
    Beispiel:  L0000  10110111111111111111111111011111 *
        Das heißt: in die Adresse 0000 des GALs wird eine 1 geschrieben, in
                   die Adresse 0001 eine 0, in die Adresse 0002 wieder
                   eine 1 usw....

    Die Adressen haben folgende Bedeutung:

        GAL16V8
          0000-2047: Fuse-Matrix (AND-Array)
          2048-2055: XOR-Bits der Ausgangszellen
          2056-2119: Signatur
          2120-2127: AC1-Bits der Ausgangszellen
          2128-2191: Produkttermfreigabe
          2192     : SYN-Bit
          2193     : AC0-Bit

        GAL20V8
          0000-2559: Fuse-Matrix (AND-Array)
          2560-2567: XOR-Bits der Ausgangszellen
          2568-2631: Signatur
          2632-2639: AC1-Bits der Ausgangszellen
          2640-2703: Produkttermfreigabe
          2704     : SYN-Bit
          2705     : AC0-Bit

        GAL22V10
          0000-5807: Fuse-Matrix (AND-Array)
          5808-5827: S0/S1-Bits der Ausgangszellen
          5828-5891: Signatur

        GAL20RA10
          0000-3199: Fuse-Matrix (AND-Array)
          3200-3209: S0-Bits der Ausgangszellen
          3210-3273: Signatur


 QF: QF gibt an, wieviele Fuses (Sicherungen) in der JEDEC-Datei enthalten
     sind. Beim GAL16V8 sind es 2194, beim GAL20V8 2706, beim GAL22V10
     5892 und beim GAL20RA10 3274 Fuses. Damit wird klar definiert für
     welchen GAL-Typ dieses JEDEC-File bestimmt ist.
     Beispiel:   QF2194 *

 C: Dem C folgt eine Checksumme (hexadezimale 16-Bit-Zahl) über die verschie-
    denen Fuses (1en und 0en im JEDEC-File). Diese Checksumme wird dann beim
    späteren Einlesen der Datei überprüft. Damit wird verhindet, daß ver-
    sehentlich Fuses geändert werden. In der Datei kann aber z.B. ein
    Kommentar verändert werden, ohne daß dies einen Einfluß auf die Checksumme
    hätte, da die Checksumme ja nur über die 1en und 0en gebildet wird,
    deshalb Fuse-Checksumme.
    Beispiel: C6402 *


 <STX>, <ETX>: Diese Zeichen sind Kontrollzeichen:
    <STX>: 0x02 = CTRL-B
    <ETX>: 0x03 = CTRL-C

    In Text-Editoren sehen dieses Zeichen in der Regel so aus:
      <STX>  
      <ETX>  
    Das <STX> kennzeichnet den Fileanfang und das <ETX> das Fileende.
    Direkt hinter dem <ETX> muß eine File-Checksumme (hexadez. 16-Bit-Zahl)
    stehen. Nach der File-Checksumme darf kein Zeichen mehr stehen, also
    auch KEIN '*'. Diese Checksumme ist die Summe aller ASCII-Zeichen des
    Files ab dem <STX> bis zum <ETX> einschließlich des <STX> (0x02) und des
    <ETX> (0x03). Da diese Checksumme in der Regel über das ganze File
    gebildet wird, ist eine nachträgliche Änderung des Files nicht mehr
    erlaubt. Dieses File darf überhaupt nicht mehr geändert werden, auch
    der Kommentar nicht. Ansonsten wird die File-Checksumme verändert und
    beim Einlesen der JEDEC-Datei (durch GALer) erscheint dann eine
    entsprechende Warnung, daß die File-Checksumme nicht mehr stimmt.


 V: Nach dem V folgt ein sogenannter Testvektor. Testvektoren werden
    hier noch nicht unterstützt. Sie werden wie ein normaler Kommentar
    behandelt (wie ein N).

@ENDNODE



@NODE Examples "Beispiele"

@{U}II.4 Beispiele@{UU}

Beispiele sagen mehr als Worte - oder so ähnlich. Deshalb folgen hier einige
zu den verschiedenen GAL-Typen. 

@ENDNODE



@NODE Example16V8 "GAL16V8"

@{U}II.4.1 GAL16V8@{UU}

Im folgenden Beispiel wird die Verwendung von Tristate-Ausgängen gezeigt.
Es soll folgende Schaltung mit einem GAL16V8 realisiert werden:


       A ---------+
                  |
                |\\o
                | \\
       B -------|  +------------------------ Y1
                | /
                |/
                                  VCC
                                   |
                +----+           |\\|
       C -------|    |           | \\
                | >1 |-----------|  +------- Y2
       D -------| =  |           | /
                +----+           |/


                +----+
       E -------|    |
                | &  |------+
       F -------|    |      |
                +----+      |
                          |\\|
                          | \\
       G -----------------|  +o------------- Y3
                          | /
                          |/


Y1 soll nur dann den Zustand von "B" annehmen, wenn "A" = LOW ist.
Y2 soll ständig aktiv sein (entweder H oder L - abhängig von "C" und "D").
Dies entspricht einem kombinatorischen Ausgang.
Y3 soll nur dann aktiv sein, wenn "E" UND "F" = HIGH sind. 


                            GAL16V8

                           ---- ----
                       A  1|       |20  VCC
                       B  2|       |19  Y1
                       C  3|       |18  Y2
                       D  4|       |17  Y3
                       E  5|       |16  NC
                       F  6|       |15  NC
                       G  7|       |14  NC
                      NC  8|       |13  NC
                      NC  9|       |12  NC
                     GND 10|       |11  NC
                           ---------


Im Source-File werden die Tristate-Ausgänge durch ein ".T" gekennzeichnet.
Die Tristate-Freigabe erfolgt anschließend mit einem ".E". Fehlt die
Tristate-Freigabe, so wird ständige Freischaltung angenommen (=VCC).
Tristate-Freigabe = GND entspricht ständigem Sperren (=hochohmig).
Achtung: Bei Tristate-Ausgängen können maximal sieben Produktterme verwendet
werden (bei allen anderen Ausgangsarten sind es maximal acht).
In der Tristate-Freigabe darf nur EIN Produktterm verwendet werden (kein OR).

Das Eingabe-File sieht wie folgt aus:
******************************************************
GAL16V8
Bsp.2

A  B  C  D  E  F  G  NC NC GND
NC NC NC NC NC NC Y3 Y2 Y1 VCC


Y1.T = B

Y2.T = C + D

Y3.T = /G


Y1.E = /A

Y3.E = E * F


DESCRIPTION
******************************************************




Im letztes Beispiel zum GAL16V8 wird die Verwendung von Register-Ausgängen
anhand eines 4-Bit-Zählers gezeigt werden.


                            GAL16V8

                           ---- ----
        (Input)    Clock  1|       |20  VCC
        (Input)       D0  2|       |19  Q0              (Output)
        (Input)       D1  3|       |18  Q1              (Output)
        (Input)       D2  4|       |17  Q2              (Output)
        (Input)       D3  5|       |16  Q3              (Output)
        (Input)      Set  6|       |15  NC              (nicht verwendet)
        (Input)    Clear  7|       |14  NC              (nicht verwendet)
        (Input)       NC  8|       |13  NC              (nicht verwendet)
        (Input)       NC  9|       |12  NC              (nicht verwendet)
                     GND 10|       |11  /OE             (Input)
                           ---------

Da Register verwendet werden heißt das, daß sich das GAL im Betriebs-
modus 3 befindet. Dies bedeutet, daß die Pins 1 und 13 für Clock und
/OE reserviert sind.

Wenn /OE auf HIGH liegt, gehen alle Register-Ausgänge (hier Q0-Q3) auf
"hochohmig" (=Z). Wenn Clear = HIGH ist und ein Clock-Impuls (LOW-HIGH)
anliegt, werden die Ausgänge auf 0 zurückgesetzt.

Durch die Eingänge D0-D3 kann der Zähler vorgeladen werden. Durch
Set = HIGH und einem Clock-Impuls werden die Werte von D0-D3 in Q0-Q3
übernommen. Ein Clock-Impuls bei Clear und Set gleich LOW bewirkt, daß
der Zähler um eins weiterzählt.

Im Eingabe-File werden Register-Ausgänge mit ".R" gekennzeichnet.
Es sind maximal acht Produktterme pro Register-Ausgang erlaubt.

******************************************************
GAL16V8                 ; 4-Bit-Counter
Counter


Clock D0    D1    D2    D3    Set   Clear NC    NC   GND
/OE   NC    NC    NC    NC    Q3    Q2    Q1    Q0   VCC



Q0.R =   /Clear *  Set *  D0
       + /Clear * /Set * /Q0

Q1.R =   /Clear *  Set *  D1
       + /Clear * /Set * /Q1 *  Q0
       + /Clear * /Set *  Q1 * /Q0

Q2.R =   /Clear *  Set *  D2
       + /Clear * /Set *  Q2 * /Q1
       + /Clear * /Set *  Q2 * /Q0
       + /Clear * /Set * /Q2 *  Q1 *  Q0

Q3.R =   /Clear *  Set *  D3
       + /Clear * /Set *  Q3 * /Q2
       + /Clear * /Set *  Q3 * /Q1
       + /Clear * /Set *  Q3 * /Q0
       + /Clear * /Set * /Q3 *  Q2 *  Q1 *  Q0


DESCRIPTION
******************************************************

@ENDNODE


@NODE Example22V10 "GAL22V10"

@{U}II.4.2 GAL22V10 @{UU}

Die nachfolgende Schaltung läßt sich nicht mit einem GAL16V8 oder GAL20V8
realisieren. Der Grund ist der, daß zwei verschiedene Tristate-Freigabe-
bedingungen für die beiden Register-Ausgänge benötigt werden. Wir
erinnern uns: beim GAL16V8 und GAL20V8 existiert nur eine gemeinsames
Output-Enable für alle Register-Ausgänge - und das ist der Pin /OE im
Betriebsmodus 3.



 Enable1 ---------------------------------+
                                          |
                                        |\\|
                            +----+      | \\
   Clock ---o---------------|>  Q|------|  +------- Y1
            |  +----+       |    |      | /
       A ---+--|    |   +---|D   |      |/
            |  | &  |---+   +----+
       B ---+--|    |          
            |  +----+                   |\\
            |               +----+      | \\
            +---------------|>  Q|------|  +------- Y2
                            |    |      | /   
       C -------------------|D   |      |/|   
                            +----+        |   
                                          |
                            +----+        |
 Enable2 -------------------|    |        |
                            | &  |--------o-------- Y3
                        +---|    |
                        |   +----+
             +----+     |
       D ----|    |     |
             |    |     |
       E ----| >1 |-----o-------------------------- Y4
             | =  |      
       F ----|    |      
             +----+


     Zusätzlich sollen noch beide Register asynchron zum Takt zurück-
     gesetzt werden, wenn F und der Eingang AsyncRe high sind und
     synchron zum Takt gesetzt werden, wenn der Eingang SyncPre high
     ist. Diese Signale sind aus Gründen der Übersichtlichkeit nicht
     eingezeichnet worden.


Bevor Sie über den tieferen Sinn der Schaltung nachdenken, da ist keiner. Sie
soll lediglich als Beispiel dienen.

So, und so sollen die Pins am GAL belegt sein:


                           GAL22V10

                           ---- ----
                   Clock  1|       |24  +5V
                       A  2|       |23  Y1
                       B  3|       |22  Y2
                       C  4|       |21  Y3
                       D  5|       |20  Y4
                       E  6|       |19  Enable1
                       F  7|       |18  Enable2
                      NC  8|       |17  NC
                      NC  9|       |16  NC
                      NC 10|       |15  NC
                      NC 11|       |14  AsyncRe
                    GND  12|       |13  SyncPre
                           ---------

Das einzige was bei der Pinbelegung zu beachten ist, ist, daß Clock am Pin 1
liegt und daß die Ausgänge Y1 bis Y4 an einem OLMC-Pin (Pin 14-23) liegen.

Für die Definition des asynchronen Resets und des synchronen Presets für die
Register stellt Ihnen der Assembler die beiden Schlüsselwörter AR (Asyn. Reset)
und SP (Synch. Preset) zur Verfügung. Wenn ein GAL22V10 verwendet wird, darf
AR und SP nicht als Pinname verwendet werden.

Für die obige Schaltung sieht das Source-File wie folgt aus:


******************************************************
GAL22V10
22V10

Clock   A       B  C  D  E       F       NC NC NC NC GND
SyncPre AsyncRe NC NC NC Enable2 Enable1 Y4 Y3 Y2 Y1 VCC


Y1.R  = A * B                   ; Y1 ist ein Register-Ausgang => .R
Y1.E  = Enable1

Y2.R  = C
Y2.E  = Enable2 * Y4            ; Achtung: hier wird Y4 zurückgekoppelt, d.h.
                                ; wieder als Eingang benutzt

Y3    = Enable2 * Y4            ; hier wird ebenfalls zurückgekoppelt

Y4    = D + E + F


AR    = F * AsyncRe             ; asynchron Reset definieren

SP    = SyncPre                 ; synchron Preset definieren


DESCRIPTION
******************************************************

Statt der Gleichung Y3 = Enable2 * Y4 könnte man auch schreiben:
Y3 = Enable2*D + Enable2*E + Enable2*F. Mit der Rückkopplung von Y4
geht es aber wesentlich elaganter. Außerdem wäre dies bei der
Tristate-Freigabe Y2.E = Enable2 * Y4 gar nicht möglich, da ja hier
keine OR-Verknüpfungen zugelassen sind.

@ENDNODE




@NODE Example20RA10 "GAL20RA10"

@{U}II.4.3 GAL20RA10@{UU}

Das nachfolgende Beispiel kann nur mit einem GAL20RA10 realisiert werden.
Der Grund dafür ist, daß jeder Register-Ausgang seinen eigenen Takt benötigt.
Beim GAL16V8, GAL20V8 und GAL22V10 gibt es aber nur einen Clock-Eingang für
alle Register. Außerdem wird wieder für jedes Register eine eigene Tristate-
Freigabe benötigt.



 Enable1 ----------------------------------+
                  +----+                   |
 ResetA1 ---------|    |                   |
                  | &  |-------+           |
 ResetB1 ---------|    |       |         |\\|
                  +----+    +-----+      | \\
  Clock1 -------------------|> R Q|------|  +------- Y1
                            |     |      | /   
      D1 ---o---------------|D S  |      |/   
            |               +-----+
            |                  |
     Set ---+--o---------------+
            |  |  +----+
            |  +--|    |
            |     | >1 |---------------------------- Y2
            o-----| =  |
            |     +----+                 |\\
            |               +-----+      | \\
  Clock2 ---+---------------|>   Q|------|  +o------ Y3
            |               |     |      | /   
      D2 ---+--o------------|D    |      |/|   
            |  |            +-----+        |
 Enable2 ---+--+---------------------------o
            |  |                           |
            |  |                           |
            |  |  +----+                 |\\o
            |  +--|    |                 | \\
            |     | &  |o----------------|  +------- Y4
            +-----|    |                 | /
                  +----+                 |/



Auch diese Schaltung ist nur wieder als Beispiel gedacht, erfüllt also
auch keine richtige Funktion.

Und so könnten die Pins am GAL belegt sein:

                           GAL20RA10

                           ---- ----
                     /PL  1|       |24  +5V
                     Set  2|       |23  Y1
                 Enable1  3|       |22  Y2
                 Enable2  4|       |21  Y3
                  Clock1  5|       |20  Y4
                  Clock2  6|       |19  D1
                      NC  7|       |18  D2
                      NC  8|       |17  ResetA1
                      NC  9|       |16  ResetB1
                      NC 10|       |15  NC
                      NC 11|       |14  NC
                    GND  12|       |13  /OE
                           ---------


Die Pins 1 und 13 sind beim GAL20RA10 für /PL (preload) und /OE
(output enable) reserviert und können daher nicht frei verwendet werden.
Da Y1 bis Y4 Ausgänge sind, müssen sie an einem OLMC-Pin (Pin 14-23) liegen.
Ansonsten ist die Wahl der Pins für die restlichen Signale frei.

Für das GAL20RA10 gibt es bei Register-Ausgängen zusätzlich die Suffixes
.CLK, .ARST und .APRST. Mit .CLK wird das Clock-Signal für den entsrechenden
Register-Ausgang definiert. Es muß für jeden Register-Ausgang eine solche
Clock-Definition vorgenommen werden. .ARST (asynchronous reset) und .APRST
(asynchronous preset) sind hingegen optinal.

Für .CLK, .ARST und .APRST steht wieder nur ein Produktterm zur Verfügung,
es darf also keine ODER-Verknüpfung vorkommen. Bei der Definition des
Ausgangs sind max. vier Produktterme erlaubt.

Es ist zu beachten, daß wenn die Bedingung für asynchronen Reset und
asynchronen Preset gleichzeitig wahr sind, daß dann das Register deaktiviert
wird und der Register-Ausgang zu einem "normalen" Tristate-Ausgang wird (siehe
Abschnitt I.2.3).

Und so sieht das Source-File für das obige Beispiel aus:

******************************************************
GAL20RA10
20RA10

/PL Set Enable1 Enable2 Clock1  Clock2 NC NC NC NC NC GND
/OE NC  NC      ResetB1 ResetA1 D2     D1 Y4 Y3 Y2 Y1 VCC


Y1.R     =  D1                          ; Register-Ausgang definieren
Y1.E     =  Enable1                     ; Tristate-Kontrolle def.
Y1.CLK   =  Clock1                      ; Clock für Reg. def.
Y1.ARST  =  ResetA1 * ResetB1           ; async. Reset definieren
Y1.APRST =  Set                         ; async. Preset definieren

Y2  =  Set + D1                         ; Y2 ist "normaler" Ausgang

/Y3.R  =  D2                            ; Y3 active low und Reg.-Ausgang
Y3.E   =  Enable2
Y3.CLK =  Clock2

Y4.T   =  /D1 + /D2                     ; Y4 ist Tristate-Ausgang
Y4.E   =  /Enable2


DESCRIPTION
******************************************************

@ENDNODE



@NODE Errors "Fehlermeldungen"

@{U}II.5 Fehlermeldungen@{UU}

In den folgenden Abschnitten werden alle möglichen Fehlermeldungen,
die GALer erzeugen kann aufgelistet und genau beschrieben.

@ENDNODE


@NODE AsmErr "Fehlermeldungen"

@{U}II.5.1 Assembler@{UU}

"Zeile 1: GAL-Typ erwartet"
  In der 1. Zeile des Source-Files wird der GAL-Typ erwartet. Wenn in
  der ersten Zeile etwas anderes als GAL16V8, GAL20V8, GAL22V10 oder
  GAL20RA10 steht, erscheint diese Fehlermeldung.

"unerwartetes Ende der Eingabe-Datei"
  Diese Meldung erscheint dann, wenn im Source-File (=Eingabe-Datei)
  das Schlüsselwort "DESCRIPTION" fehlt.

"habe nach '/' Pinnamen erwartet"
  Es wurde ein Negations-Zeichen "/" gefunden, hinter dem aber nicht
  unmittelbar ein Pinname folgt.

"Pinname hat mehr als 8 Buchstaben und Ziffern"
   Pinnamen dürfen nicht aus mehr als 8 Zeichen bestehen. Wird diese maximale
   Länge der Pinnamen überschritten, erscheint diese Meldung.

"unerlaubtes Zeichen bei der Pin-Deklaration"
   In den Pinnamen kommt ein Zeichen vor, das nicht erlaubt ist. Erlaubte
   Zeichen sind: a..z, A..Z, 0..9, / bzw. !

"VCC/GND-Zuweisung nur an den entsprechenden Pins erlaubt"
   VCC und GND sind Schlüsselwörter, die nur zur Kennzeichnung  der
   entsprechenden Pins am GAL erlaubt sind. Wenn in der Pin-Deklaration
   ein VCC oder GND als Pinname auftritt und dieser Pin nicht der VCC-Pin
   bzw. GND-Pin des GALs ist, dann erscheint diese Meldung.

"für VCC-Pin Zuweisung VCC erwartet"
   Dem VCC-Pin des GALs wurde ein anderer Name als VCC zugeordnet.
   Eine häufige Ursache für diese Fehlermeldung ist, daß in der Auf-
   zählung der Pinnamen in der Pin-Deklaration ein Pin vergessen wurde.

"für GND-Pin Zuweisung GND erwartet"
   Dem GND-Pin des GALs wurde ein anderer Name als GND zugeordnet.
   Eine häufige Ursache für diese Fehlermeldung ist, daß in der Auf-
   zählung der Pinnamen in der Pin-Deklaration ein Pin vergessen wurde.

"gleicher Pinname kommt mehrfach vor"
   In der Pin-Deklaration kommt der selbe Pinname mehrfach vor.

"unerlaubte Verwendung von '/'"
   Es wurde ein Negationszeichen gefunden, das nicht VOR einem Pinnamen
   steht, sondern irgendwo in der Gegend herumlungert.

"unbekannter Pin-Name in den Boolean-Gleichungen"
   In den Gleichungen tritt ein Pinname auf, der nicht deklariert wurde.

"NC (Not Connected) in Booleschen Gleichungen nicht erlaubt"
   NC ist ein Schlüsselwort, das nur zu Kennzeichnung von nicht-
   verwendeten Pins dient. Kommt NC in den Booleschen Gleichungen vor,
   erscheint diese Meldung.

"unbekanntes Suffix gefunden nach '.'"
   Diese Fehlermeldung tritt auf, wenn nach einem '.' etwas Anderes
   als 'T', 'E', 'R', 'CLK', 'ARST' oder 'APRST' steht.

"'=' wurde erwartet"
   Diese Fehlermeldung erscheint, wenn zwei Pinnamen hintereinander stehen
   und nach dem zweiten Pinnamen kein '=' folgt. Die Ursache für eine solche
   Fehlermeldung ist häufig ein vergessenes '+' oder '*'.

"Pin kann nicht als Ausgang programmiert werden"
   Der Pin der vor dem '='-Zeichen steht, kann nicht als Ausgang definiert
   werden.

"gleicher Pin ist mehrfach als Ausgang definiert worden"
   Diese Fehlermeldung tritt bei folgender Konstellation auf:
     X = ...
     X = ...

"Tristate-Kontrolle: Tristate-Ausgang noch nicht definiert"
   Bevor ein 'name.E' erfolgen darf, muß der entsprechende Tristate-Ausgang
   definiert worden sein.
   Also:  name.T = ...
          name.E = ...

"GAL22V10: AR und SP sind als Pinname nicht erlaubt"
   Bei 22V10 GALs sind AR und SP reservierte Schlüsselwörter, die deshalb
   nicht als Pinname erlaubt sind.

".E, .CLK, .ARST und .APRST können nicht negiert werden"
   Es wurde versucht, eine der obigen Definitionen zu negieren. Dies
   ist jedoch nicht möglich.

"Betriebsmodus 2: Pins 12,19 können nicht als Eingang verwendet werden"
   Bei einem GAL16V8 können die Pins 12 und 19 nicht als Eingang definiert
   werden, wenn sich das GAL im Betriebsmodus 2 (siehe Einführung) befindet.
   Diese Pins können auch nicht zurückgekoppelt werden.
   
"Betriebsmodus 2: Pins 15,22 können nicht als Eingang verwendet werden"
   Bei einem GAL20V8 können die Pins 15 und 22 nicht als Eingang definiert
   werden, wenn sich das GAL im Betriebsmodus 2 (siehe Einführung) befindet.
   Diese Pins können auch nicht zurückgekoppelt werden.

"Tristate-Kontrolle wurde mehrfach angegeben"
   Es wurde eine Tristate-Kontrolle für einen Ausgang mehrfach angegeben.
   Beispiel:   name.E = A * B
               name.E = C

"GAL16V8/20V8: Tristate-Kontrolle bei Registerausgang nicht erlaubt"
   Bei den GAL-Typen GAL16V8 und GAL20V8 kann für Registerausgänge
   keine Gleichung für Tristate-Enable angegeben werden.

"Tristate-Kontrolle ohne vorheriges '.T'"
   Es wurde eine Tristate-Kontrolle für einen kombinatorischen Ausgang
   angegeben.
   Beispiel:    name   = ...
                name.E = ...

"statt /VCC, /GND bitte GND, VCC verwenden"
   Diese Fehlermeldung erklärt sich von selbst.
   Oder doch nicht?  Also: Irgendwo im Source-File kommt ein /VCC oder
   /GND vor. Statt dieser komischen Konstruktion, geben Sie bitte ein
   GND bzw. VCC ein.

"Betriebsmodus 3: Pins 1,11 für 'Clock' und '/OE' reserviert"
   Wenn Registerausgänge verwendet werden, befindet sich das GAL im Modus 3.
   In diesem Modus sind beim GAL16V8 die Pins 1 und 11 reserviert und können
   nicht als Eingang verwendet werden.

"Betriebsmodus 3: Pins 1,13 für 'Clock' und '/OE' reserviert"
   Wenn Registerausgänge verwendet werden, befindet sich das GAL im Modus 3.
   In diesem Modus sind beim GAL20V8 die Pins 1 und 13 reserviert und können
   nicht als Eingang verwendet werden.

"VCC und GND nicht in Booleschen Ausdrücken erlaubt"
   Ausdrücke wie "X = A * VCC" sind nicht erlaubt.

"nur ein Produktterm erlaubt (kein OR)"
   In dieser Gleichung ist nur ein Produktterm erlaubt, das heißt es darf
   keine ODER-Verknüpfung vorkommen.

"zuviele Produktterme in der Gleichung"
   In dieser Gleichung sind zuviele ODER-Verknüpfungen enthalten. Beim
   GAL16V8 und GAL20V8 stehen max. 7 oder 8 Produktterme zur Verfügung, beim
   GAL20RA10 max. 4 und beim GAL22V10 ist die Anzahl der zur Verfügung
   stehenden Produktterme vom Ausgangspin abhängig. Versuchen Sie am besten
   die Gleichung zu optimieren, um den einen oder anderen Produktterm zu
   eliminieren.

"GAL22V10: AR und SP dürfen nicht in Gleichungen vorkommen"
   AR bzw. SP darf nur definiert werden (AR=.., SP=...), selber in Termen
   vorkommen darf es nicht.

"AR und SP können nicht negiert werden"
   Es wurde versucht, AR oder SP zu negieren. Dies ist nicht möglich.

"keine Booleschen Gleichungen vorhanden"
   Es wurde versucht, ein Source-File zu assemblieren, in dem keine
   Booleschen Gleichungen vorhanden sind.

".CLK kann bei diesem GAL-Typ nicht angewendet werden"
   Die Clock-Definition ist nur beim GAL20RA10 erlaubt.

".ARST kann bei diesem GAL-Typ nicht angewendet werden"
   Die Asynchronous Reset Definition ist nur beim GAL20RA10 erlaubt.

".APRST kann bei diesem GAL-Typ nicht angewendet werden"
   Die Asynchronous Preset Definition ist nur beim GAL20RA10 erlaubt.

"GAL20RA10: Pin 1 kann nicht verwendet werden (/PL)"
   Beim GAL20RA10 ist Pin 1 für Preload reserviert und darf somit
   in keiner Gleichung verwendet werden.

"GAL20RA10: Pin 13 kann nicht verwendet werden (/OE)"
   Beim GAL20RA10 ist Pin 13 für Output Enable reserviert und darf
   somit in keiner Gleichung verwendet werden.

"an AR und SP ist kein Suffix erlaubt"
   Wenn GAL22V10 verwendet wird, darf an AR und SP kein Suffix
   angefügt werden (kein .E, .R, ...)

"AR oder SP wurde doppelt definiert"
   AR oder SP wurde doppelt definiert, das heißt, es kommt mehrfach
   der Ausdruck AR=... oder SP=... vor.

"an einem Registerausgang fehlt die Clock-Definition (.CLK)"
   Wenn beim GAL20RA10 ein Ausgang als Registerausgang definiert
   worden ist, MUß eine Clock-Definition angegeben werden.

".CLK gefunden bevor der Ausgang definiert wurde"
   Zuerst muß der Ausgang definiert werden bevor die Clock-Definition
   vorgenommen werden kann.

".ARST gefunden bevor der Ausgang definiert wurde"
   Zuerst muß der Ausgang definiert werden bevor die Asynchronous Reset
   Definition vorgenommen werden kann.

".APRST gefunden bevor der Ausgang definiert wurde"
   Zuerst muß der Ausgang definiert werden bevor die Asynchronous Preset
   Definition vorgenommen werden kann.

"mehrfache Clock-Definition für den selben Ausgang (.CLK)"
   Für jeden Register-Ausgang ist nur jeweils eine Clock-Definition erlaubt.

"mehrfache Asynchron-Reset-Definition für den selben Ausgang (.ARST)"
   Für jeden Register-Ausgang ist nur jeweils eine Asynchronous Reset
   Definition erlaubt.

"mehrfache Asynchron-Preset-Definition für den selben Ausgang (.APRST)"
   Für jeden Register-Ausgang ist nur jeweils eine Asynchronous Preset
   Definition erlaubt.

".CLK, .ARST und .APRST dürfen nur auf Registerausgänge angewendet werden"
   Es wurde versucht, .CLK, .ARST oder .APRST auf einen Tristate-Ausgang
   anzuwenden.

@ENDNODE



@NODE JEDECErr "Fehlermeldungen"

@{U}II.5.2 JEDEC-Datei@{UU}

"unerwartetes Dateiende"
   Am Ende eines JEDEC-Files wird entweder die File-Checksumme oder ein
   '*' erwartet. Wenn keines von beiden vorhanden ist, erscheint diese
   Fehlermeldung.

"unbekannte Anweisung gefunden"
   Es wurde eine unbekanntes Steuerzeichen gefunden. Die Ursache dafür ist
   meistens ein vergessenes '*'.

"falsches Zahlenformat nach Anweisung"
   Es konnte eine hex. oder dez.-Zahl nicht korrekt interpretiert werden.

"erwarte unmittelbar nach einer Anweisung eine Zahl"
   Nach einer Anweisung muß direkt eine Zahl folgen. Wenn nach der Anweisung
   z.B. ein Space steht, tritt diese Fehlermeldung auf.

"habe unmittelbar nach der Anweisung eine 0 oder 1 erwartet"
   Nach einer Anweisung muß direkt eine Zahl folgen. Diese Zahl muß in diesem
   Fall eine "0" oder "1" sein. Ist das nicht der Fall, erscheint diese
   Fehlermeldung.

"keine eindeutige GAL-Typ-Bestimmung möglich"
   Aus der JEDEC-Datei geht nicht eindeutig hervor, für welchen GAL-Typ
   diese Datei bestimmt ist. Für die auszuführende Funktion ist dies
   jedoch nötig. Abhilfe kann durch Einfügen einer entsprechenden
   QF-Anweisung erreicht werden.

"Anweisung QF mehrfach vorhanden"
   Na ja, QF ist eben mehrfach vorhanden, und das ist nicht erlaubt.

"Anweisung QP mehrfach vorhanden"
   Na ja, QP ist eben mehrfach vorhanden, und das ist nicht erlaubt.

"habe abschließendes '*' erwartet"
   Am JEDEC-Datei-Ende fehlt ein '*'.

"nach 'C' keine weiteren 'L' mehr erlaubt"
   Nach der Fuse-Checksumme darf keine Sicherung mehr verändert werden,
   da ja sonst die Checksumme nicht mehr stimmt.

"Fuse-Checksumme stimmt nicht"
   Die Fuse-Checksumme stimmt nicht mehr. Die Ursache für diese Fehlermeldung
   kann nur sein, daß einige Fuses mit einem Text-Editor nachträglich (nach
   der Assemblierung des Source-Files mit GALer) verändert wurden.

"<STX> Steuerzeichen (= CTRL-B, 0x02) mehrfach vorhanden"
   Das <STX> Steuerzeichen sollte nur einmal am Datei-Anfang stehen.

"<ETX> Steuerzeichen (= CTRL-C, 0x03) mehrfach vorhanden"
   Das <ETX> Steuerzeichen sollte nur einmal am Datei-Ende (aber vor
   der File-Checksumme) stehen.

"Reihenfolge der Steuerzeichen <STX> und <ETX> stimmt nicht"
   Die Reihenfolge der Steuerzeichen stimmt nicht.

"nach der File-Checksumme wird das Datei-Ende erwartet"
   Nach der File-Checksumme wurde noch ein Zeichen gefunden, das kein
   Space, TAB oder Carriage Return ist.

"Überlappung von Fuse-Adressen (L... zu klein)"
   Beispiel:  L0010 1011 *
              L0013 0111 *
   Adresse 13 wurde zweimal definiert.

"Fuse-Adressen übersprungen, aber kein Default-Wert (F0/1) angegeben"
   Es wurden nicht alle Sicherungen angegeben. Da GALer aber wissen muß
   auf welchen Wert er die fehlenden Sicherungen setzen soll, muß
   ein F0/1 Steurerzeichen vorhanden sein. Das fehlt aber leider, wenn
   Sie diese Fehlermeldung erhalten.

"habe '*' erwartet"
   Es wurde ein '*' erwartet aber keines gefunden. Ja wo ist es denn?

"Diskrepanz zwischen QF... und letzter Fuse-Adresse L..."
   QF gibt die Anzahl der vorhandenen Sicherungen an. Wenn diese Anzahl
   nicht mit dem letzten L-Kommando übereinstimmt, erscheint diese
   Fehlermeldung.

"keine Fuses (weder F0/1 noch L...) vorhanden"
   Die Datei ist praktisch sinnlos, da keine Angaben über den Zustand
   der Fuses (Sicherungen) gemacht wurden. Daher hat GALer keinen
   Bock, diese Datei weiter zu bearbeiten.

"nur QF2194 *, QF2706 *, QF3274 *, QF5892 * erlaubt"
    Es wurde ein QF... gefunden, das zu keinem GAL-Typ paßt, der von
    GALer unterstützt wird.

"es sind zu viele Sicherungen im JEDEC-File"
    Im JEDEC-File wurden zu viele Sicherungen angegeben.

"es sind mehrere Fuse-Checksummen vorhanden"
    Es wurden mehrere Fuse-Checksummen (C...) angegeben, erlaut ist aber
    nur eine.

"eingestellter GAL-Typ paßt nicht zum JEDEC-File"
   Die JEDEC-Datei ist für einen anderen GAL-Typ bestimmt als den ein-
   gestellten.
   Diese Meldung tritt z.B. dann auf, wenn Sie ein GAL16V8 programmieren
   wollen, aber ein GAL20V8 zur Programmierung eingestellt haben.

@ENDNODE



@NODE ReAsmErr "Fehlermeldungen"

@{U}II.5.3 Reassembler@{UU}

"der Modus AC0 = SYN = 0 wird nicht unterstützt"
   Im JEDEC-File ist AC0 = 0 und SYN = 0. Dieser Modus wird von GALer
   nicht unterstützt und verursacht daher die obige Fehlermeldung.

"Pin xx: Pinname doppelt"
   Bei der Pinnamendeklaration ist der Pin mit der Nummer xx mehrfach
   vorhanden.

"Pin xx: illegales Zeichen"
   Der Pin mit der Nummer xx enthält ein nicht zugelassenes Zeichen.
   Zugelassene Zeichen sind alle Ziffern, Buchstaben und das '/' vor(!)
   dem Pinnamen. Illegale Zeichen sind z.B. SPACE,#,*,....

"Pin xx: kein Pinname vorhanden"
   Für den Pin mit der Nummer xx ist kein Pinname angegeben worden.

"Pin xx: VCC/GND am falschen Pin"
   VCC und GND sind nur an den entsprechenden Pins erlaubt. Wenn VCC und/oder
   GND an einem anderen Pin vorkommt, erscheint diese Fehlermeldung.

"Pin xx: illegales '/'"
   Diese Fehlermeldung erscheint, wenn mehrere '/' angegeben worden sind oder
   wenn das '/' nicht unmittelbar vor dem Pinnamen steht.

"Pin xx: GND erwartet"
   Am Pin 10 des GAL16V8 bzw. Pin 12 des GAL20V8, 22V10, 20RA10 wird
   "GND" als Pinname erwartet. Zuwiderhandlung wird mit Amiga-Entzug
   und MS-DOS-Zwang für eine Dauer von fünf Minuten bestraft (länger
   hält's eh keiner aus).

"Pin xx: VCC erwartet"
   Am Pin 20 des GAL16V8 bzw. Pin 24 des GAL20V8, 22V10, 20RA10 wird
   "VCC" als Pinname erwartet. Zuwiderhandlung wird mit Amiga-Entzug
   und Atari-Zwang für eine Dauer von sechs Jahren bestraft.

"Pin xx: AR ist als Pinname nicht erlaubt"
   Bei 22V10 GALs sind AR und SP reservierte Schlüsselwörter, die bei
   diesem GAL-Typ nicht als Pinname verwendet werden dürfen.
 
"Pin xx: SP ist als Pinname nicht erlaubt"
   Bei 22V10 GALs sind AR und SP reservierte Schlüsselwörter, die bei
   diesem GAL-Typ nicht als Pinname verwendet werden dürfen.

@ENDNODE




@NODE ProgGAL "Programmierung von GALs"

@{U}III.1 Programmierung von GALs@{UU}

Als erstes stellt sich die Frage wie ein GAL programmiert werden kann,
wenn bereits alle Pins belegt sind und keine weiteren mehr für die
Programmierung zur Verfügung stehen. Legt man am Pin 2 eines GALs jedoch eine
sogenannte Edit-Spannung an, die je nach GAL-Typ und je nachdem, ob das GAL
ausgelesen oder programmiert werden soll, zwischen 12 Volt und 16,5 Volt
betragen muß, so wird das GAL in den Edit-Mode geschaltet. In diesem Mode
ändert sich die Pinbelegung des GALs. Diese Pinbelegung ist vom GAL-Typ
abhängig und soll im folgenden am Beispiel der 16V8 und 20V8 GALs erklärt
werden.

Legt man also am Pin 2 eines GAL16V8 oder GAL20V8 die Edit-Spannung an,
so ändert sich die Pinbelegung des GALs wie folgt:


                             GAL16V8

                            ---- ----
                     VIL   1|       |20  +5V
                    EDIT   2|       |19  P,/V
                    RAG1   3|       |18  RAG0
                    RAG2   4|       |17  VIL
                    RAG3   5|       |16  VIL
                    RAG4   6|       |15  VIL
                    RAG5   7|       |14  VIL
                    SCLK   8|       |13  VIL
                    SDIN   9|       |12  SDOUT
                     GND  10|       |11  /STR
                            ---------


                             GAL20V8

                            ---- ----
                     VIL   1|       |24  +5V
                    EDIT   2|       |23  VIL
                    RAG1   3|       |22  P,/V
                    RAG2   4|       |21  RAG0
                    RAG3   5|       |20  VIL
                     VIL   6|       |19  VIL
                     VIL   7|       |18  VIL
                    RAG4   8|       |17  VIL
                    RAG5   9|       |16  VIL
                    SCLK  10|       |15  SDOUT
                    SDIN  11|       |14  VIL
                     GND  12|       |13  /STR
                            ---------


Ob das GAL programmiert oder ausgelesen werden soll, hängt vom
Pegel von P,/V ab. Ein HIGH bedeutet programmieren, ein LOW lesen.
An den Pins RAG0-RAG5 wird die zu lesende/programmierende Adresse
angelegt.

Das Programmieren geschieht wie folgt: nach Anlegen der zu programmierenden
Adresse an RAG0-RAG5 müssen die zu schreibenden Bits an SDIN (seriell)
angelegt und durch einen LOW-HIGH-Impuls an SCLK in ein internes Schiebe-
register getaktet werden. Ein LOW-Impuls am /STR-Pin programmiert schließlich
die adressierte Zeile. Dies wiederholt man solange, bis das gesamte GAL
programmiert ist.

Das Auslesen eines GALs geschieht ähnlich: Nach Anlegen der Adresse an
RAG0-RAG5 werden die Bits der auszulesenden Adresse durch einen LOW-Impuls
an /STR in das interne Schieberegister geholt. Durch LOW-HIGH-Impulse
am SCLK-Eingang werden die einzelnen Bits aus dem Schieberegister zu
SDOUT, einem Open-Collector-Ausgang, getaktet.
Die Bit-Breite einer Adresse bestimmt die Anzahl der SCLK-Impulse, die
nötig sind, um die Adresse vollständig zu programmieren bzw. auszulesen.

Die Bezeichnung VIL bedeutet Input Voltage Low. Die mit VIL gekennzeich-
neten Pins müssen im Edit-Mode entweder direkt auf Masse oder auf Low-Pegel
liegen.

Bei GALs gibt es unterschiedliche Programmieralgorithmen. Über die
Funktion @{"GAL-Info" LINK MenGALInfo} von GALer kann man die Algorithmusnummer des
eingesetzten GALs erfahren. Diese Algorithmusnummer ist für den Anwender
eigentlich unwichtig. GALer benötigt sie aber, um GALs richtig auszulesen
oder zu programmieren.


            |           LESEN            |           PROGRAMMIEREN
------------+----------------------------+----------------------------
Algorithmus | Edit-Spannung | STR-Impuls | Edit-Spannung  | STR-Impuls
          0 |  12 ± 0,25 V  |    5 us    | 15,75 ± 0,25 V | 80 ± 5 ms
          1 |  12 ± 0,25 V  |    5 us    | 15,75 ± 0,25 V | 80 ± 5 ms
          2 |  12 ± 0,25 V  |    5 us    | 16,50 ± 0,25 V | 10 ± 1 ms
          3 |  12 ± 0,25 V  |    5 us    | 14,50 ± 0,25 V | 40 ± 5 ms
          4 |  12 ± 0,25 V  |    5 us    | 14,00 ± 0,25 V |100 ± 5 ms

Beim Löschen eines GALs muß die STR-Impulsbreite 100 ms betragen.



Die interne Organisation der GALs (Adressen der Zeilen) sieht wie folgt aus:


GAL16V8:
Adresse                                         Breite

 0-31           Fuse-Matrix                     jeweils 64 Bit
   32           Signatur                        64 Bit
33-59           reservierter Bereich            jeweils 64 Bit
   60           Architektur-Kontroll-Wort ACW   82 Bit
   61           Sicherheitszelle
   62           reserviert
   63           Bulk Erase


GAL20V8:
Adresse                                         Breite

 0-39           Fuse-Matrix                     jeweils 64 Bit
   40           Signatur                        64 Bit
41-59           reservierter Bereich            jeweils 64 Bit
   60           Architektur-Kontroll-Wort ACW   82 Bit
   61           Sicherheitszelle
   62           reserviert
   63           Bulk Erase


Das Architektur-Kontroll-Wort der Standard-GALs unterscheidet sich im
Aufbau von dem der A- bzw. B-Typen.
Es hat folgenden Aufbau (82 Bit breit):
GAL16V8:
Bits  0-31: 32 Bit Produkttermfreigabe 0-31
Bits 32-35: 4 Bit XOR(n) für OLMC-Pins 19-16
Bit     36: AC0-Bit
Bits 37-44: 8 Bit AC1(n) für OLMC-Pins 19-12
Bit     45: SYN-Bit
Bits 46-49: 4 Bit XOR(n) für OLMC-Pins 15-12
Bits 50-81: 32 Bit Produkttermfreigabe 32-63

GAL16V8A und GAL16V8B:
Bits  0-3: 4 Bit XOR(n) für OLMC-Pins 19-16
Bit     4: AC0
Bit   5-8: 4 Bit AC1(n) für OLMC-Pins 19-16
Bit  9-72: 64 Bit Produkttermfreigabe PT0 - PT63
Bit 73-76: 4 Bit AC1(n) für OLMC-Pins 15-12
Bit    77: SYN
Bit 78-81: 4 Bit XOR(n) für OLMC-Pins 15-12


GAL20V8:
Bits  0-31: 32 Bit Produkttermfreigabe 0-31
Bits 32-35: 4 Bit XOR(n) für OLMC-Pins 22-19
Bit     36: AC0-Bit
Bits 37-44: 8 Bit AC1(n) für OLMC-Pins 22-15
Bit     45: SYN-Bit
Bits 46-49: 4 Bit XOR(n) für OLMC-Pins 18-15
Bits 50-81: 32 Bit Produkttermfreigabe 32-63

GAL20V8A und GAL20V8B:
Bits  0-3: 4 Bit XOR(n) für OLMC-Pins 22-19
Bit     4: AC0
Bit   5-8: 4 Bit AC1(n) für OLMC-Pins 22-19
Bit  9-72: 64 Bit Produkttermfreigabe PT0 - PT63
Bit 73-76: 4 Bit AC1(n) für OLMC-Pins 18-15
Bit    77: SYN
Bit 78-81: 4 Bit XOR(n) für OLMC-Pins 18-15




Bei den anderen GALs, z.B. GAL22V10 oder GAL20RA10, funktioniert das Auslesen
und Programmieren ähnlich.


@ENDNODE




@NODE SchaltBesch "Schaltungsbeschreibung"

@{U}III.2 Schaltungsbeschreibung@{UU}

Im folgenden Abschnitt werde ich auf die Funktionsweise meines GAL-
Progammiergerätes eingehen. Dabei werde ich mich auf den Schaltplan
beziehen. Sollten Sie diesen noch nicht besitzen, so können Sie diesen
Abschnitt überspringen.

Die Hardware wird am Parallelport des Amiga angeschlossen. Die verwendeten
Datenleitungen sind dabei D0-D4 und die BUSY-Leitung.

IC1, IC3, IC4 und IC5 sind achtstufige "seriell ein/parallel aus" Schiebe-
register. Die Ausgänge der Schieberegister von IC3, IC4 und IC5 führen zu
der Textool-Fassung für das GAL. Dadurch ist es möglich, an jedem Pin
(außer VCC und GND) des GALs, einen beliebigen Pegel (HIGH oder LOW)
anzulegen. Die möglichen Ausgänge des GALs (Pin 14 bis 23) können über IC7
und IC6 ausgelesen werden. IC7 ist ein achtstufiges "parallel ein/seriell
aus" Schieberegister.

IC1 ist sozusagen die Schaltzentrale. Dieses IC steuert IC3, 4 und 5 (OE).
Desweiteren werden über dieses IC die Spannungen für das GAL (VCC, Edit-
Spannungen) ein- bzw. ausgeschaltet.
Damit die ICs 1, 3, 4, 5, 7 individuell angesprochen werden können, ist für
jedes dieser ICs eine eigene Takt-Leitung (Clk) vorhanden. Diese Clock-
Leitungen werden über IC2, einem 1-aus-4-Decoder, aus den Datenleitungen D0
und D1 des Parallelports erzeugt.

D3 bestimmt, ob gelesen (low) oder geschrieben (high) werden soll.
Dabei ist folgendes zu beachten:
D3 darf nur dann low werden, wenn durch D0 und D1 das IC, das angesprochen
werden soll bereits selektiert ist. Ansonsten bekommt ein IC einen ungewollten
Clock-Impuls und beim nächsten Strobe-Impuls (D2) liegen dann die falschen
(um eins nach links geschobenen) Daten an den Ausgängen an.

Der Strobe-Impuls für die Schieberegister wird aus D2 gewonnen. Wenn D2
auf high geht, werden die Daten in den Schieberegistern in die Ausgangs- 
Register der ICs 1, 3, 4, 5 übernommen. Bei IC7 bewirkt ein D2 = high,
daß die Daten an den Pins P1-P8 in das interne Schieberegister über-
nommen werden und anschließend durch entsprechende Clock-Impulse über
BUSY ausgelesen werden können.

Über D4 gelangen die einzelnen Bits vom Amiga zum GAL-Brenner.
Da an den Pins 2 und 4 der Textool-Fassung eine Spannung von weit über
5 Volt anliegen kann, muß IC4 durch die Dioden D2 und D3 vor
Überspannung geschützt werden. Die Edit-Spannung wird von IC9, einem
frequenzgesteuerten Sperrwandler, erzeugt. Die verschiedenen Spannungen
können über die Spindeltrimmer R40 bis R44 eingestellt werden.

Das Relais K1 legt die Versorgungsspannung des GALs auf Pin 24 des Textool-
Sockels. Relais K2 legt entweder den Ausgang Q7 von IC3 oder +5V Ver-
sorgungsspannung (je nach GAL-Typ) an Pin 22 des Textool-Sockels. Beide
Relais werden über IC1 angesteuert.

Die LED zeigt an, ob am Textool-Sockel eine Spannung anliegt oder nicht
(wird über die Software angesteuert). Wenn die LED an ist, darf weder ein
GAL in die Fassung gesteckt, noch aus der Fassung heraus genommen werden.


Zusammenfassung:

Parallel-Port:
 D0-D1:  Selektion der einzelnen ICs über Clk
 D2:     Strobe-Impuls für IC 1, 3, 4, 5
 D3:     schreiben = low, lesen = high
 D4:     Datenleitung für "Bits schreiben"
 BUSY:   Datenleitung für "Bits lesen"

IC1:    Q1      Programmierspannung aufbauen (noch nicht anlegen!)
        Q2      an Pin 2 Edit-Spannung für GAL20V8, 22V10, 20RA10 anlegen
        Q3      an Pin 4 Eidt-Spannung für GAL16V8 anlegen
        Q5      Vcc anlegen
        Q6      OE für IC3, 4, 5
        Q7      steuert LED an : high = on, low = off
        Q8      selektiert über IC10 die Programmierspannung

IC3:    Q1-Q8   Pin 16-23 des Textool-Sockels über R3-R8

IC4:    Q1-Q8   Pin 1-8 des Textool-Sockels

IC5:    Q1-Q3   Pin 9-11 des Textool-Sockels
        Q4      Pin 13 des Textool-Sockels
        Q5,Q6   Pins 14, 15 des Textool-Sockels über R9, R10
        Q7,Q8   selektiert über IC10 die Programmierspannung

IC6:    a       Pegel am Pin 22 des Textool-Sockels auslesenlesen
        b       IC7 auslesen
        c       Pegel am Pin 23 des Textool-Sockels auslesen

IC7:    P1-P8   Pegel an Pins 14-21 des Textool-Sockels auslesen


@ENDNODE


@NODE Construction "Aufbau"

@{U}III.3 Aufbau@{UU}

Im Anhang finden Sie die Stückliste. Die Kosten für die Bauteile (ohne
Platine und Textool-Sockel) dürften um die 45 DM liegen. Wenn Sie sich
den Textool-Sockel sparen wollen (ca. 15 DM), können Sie auch eine normale
24polige schmale(!) IC-Fassung verwenden.
Als IC-Fassungen sollten Sie nur Präzisions-Fassungen verwenden.

Die 25polige Sub-D-Buchse (A1000) bzw. der Sub-D-Stecker (sonstige Amiga
Modelle) wird wie folgt beschaltet:

  D0   = Pin 2
  D1   = Pin 3
  D2   = Pin 4
  D3   = Pin 5
  D4   = Pin 6
  BUSY = Pin 11

  GND  =  Pin 14 für A1000
          Pin 17 für A500, A2000, A3000 und was weiß ich nicht noch alles

Die Spannungsversorgung (+5V) müssen Sie sich entweder vom Expansion-Port
des Amiga holen oder von einem externen Netzteil (das auf 5V stabilisiert
ist!). Der GAL-Brenner hat eine maximale Stromaufnahme von ca. 220 mA.

Wer einen Amiga 1000 besitzt, kann die 5V auch direkt vom Parallel-Port holen.
Dies hat den Vorteil, daß keine zusätzlichen Kabel herum liegen. Ich habe
mich für diese Variante entschlossen und bis jetzt hat sich mein A1000 nicht
in Rauch aufgelöst. DIES GEHT ABER NUR BEIM A1000. Bei allen anderen
Amiga-Modellen sind die 5V über einen 47 Ohm Widerstand nach außen geführt.
Wenn Sie dort den GAL-Brenner anschließen, dann sendet dieser Widerstand mit
Sicherheit immer größer werdende Rauchzeichen aus und es riecht sehr nach
Strom.
Wenn die Garantie für Ihren Amiga bereits abgelaufen ist, können Sie den
47 Ohm Widerstand herauslöten und durch eine 500 mA Schmelzsicherung ersetzen.
Dann können die 5V vom Parallel-Port als Spannungsversorgung verwendet werden.

Das Hauptproblem beim Aufbau des GAL-Brenners ist wahrscheinlich die Platine.
Da die wenigsten in der Lage sein dürften eine doppelseitige, durch-
kontaktierte Platine herzustellen, ist die beste Lösung die, daß man
die Schaltung mit Hilfe der Fädeltechnik auf eine einseitige
Euro-Lochrasterplatine aufbaut.

Dazu werden die Bauteile einfach auf die Platine gelötet und anschließend
durch dünne Drähte miteinander verbunden. Wenn das Ganze auch einen
einigermaßen sauberen Eindruck machen soll, kann man auch Fädelleisten
(Verdrahtungskämme) verwenden. Entlang dieser Leisten können die Drähte
dann geführt werden, so daß nicht alles drunter und drüber geht. Wer
die Fädeltechnik noch nicht kennt, der kann sie sich ja einmal im
Fachgeschäft erklären lassen.

Falls Sie jedoch die Möglichkeit haben sollten, Platinen herzustellen, so
finden Sie im Verzeichnis "Layout" die entsprechenden PostScript- oder
Gerber-Files. Das Platinen-Layout wurde von Thorsten Elle erstellt, bei
dem ich mich an dieser Stelle nocheinmal dafür bedanken will, daß er mir
erlaubt hat, sein Layout zusammen mit GALer zu vertreiben.

Den Bestückungsplan der Platine konnte ich leider nicht als PostScript-File
beilegen, da die Bauteilebezeichnungen des Bestückungsplans von Thorsten
nicht mit denen auf meinem Schaltplan übereinstimmten. Deshalb habe ich
einen neuen Bestückungsplan gezeichnet, den Sie zusammen mit dem Schaltplan
erhalten.

Auf der Platine ist statt der Widerstände R28 bis R32 ein 8*1,8kOhm
Widerstands-Array vorgesehen, das im Bestückungsplan als R28 bezeichnet ist.
Wenn Sie einen Amiga besitzen, der mit einem IBM-PC-kompatiblen Parallel-Port
ausgestattet ist, das sind alle Amigas bis auf den A1000, können Sie für
X1 (X1 siehe Bestückungsplan) eine 26polige Steckerleisten-Wanne einsetzen.
Die Verbindung zum Amiga kann dann durch ein Flachbandkabel hergestellt
werden, bei dem ein Ende mit einem 26poligen Pfosten-Steckverbinder und das
andere Ende mit einem 25poligen Sub-D-Stecker versehen ist. Der Stecker und
die Buchse können mittels Schneidklemmtechnik direkt am Flachbandkabel
befestigt werden. Achten Sie aber darauf, daß Pin 1 des Sub-D-Steckers mit
Pin 1 des Pfosten-Steckverbinders verbunden wird.

Auf der Platine sind Abblock-Kondenstatoren für die ICs vorgesehen. Diese
Kondensatoren, C5 bis C14 (jeweils 100nF), sind nicht im Schaltplan einge-
zeichnet und daher auch nicht in der Stückliste aufgelistet. Beachten Sie
dies bitte, wenn Sie sich die Bauteile für den GALer kaufen.


Wenn Sie die Schaltung aufgebaut und an den Amiga angeschlossen haben
und dieser NICHT explodiert ist, können Sie das Testprogramm "GALerTest"
starten. Das Programm legt verschiedene Pegel an die Pins der Textool-Fassung,
die Sie mit einem Meßgerät überprüfen können. Die Programmierspannungen
können dann mit R40-R44 eingestellt werden. Sollte die Programmierspannung
nicht stabil anliegen, müssen Sie C1 um ein paar pF erhöhen.


NICHT VERGESSEN: Programmierspannungen einstellen (mit den Spindeltrimmern),
                 sonst funktioniert der GAL-Brenner NICHT!
                 ("GALerTest" starten und bis zu den entsprechenden
                 Testpunkten durchklicken)


Falls sich Ihr GAL-Brenner genau so verhält wie es das Testprogramm ver-
langt, können Sie probeweise ein GAL brennen und mit dem GAL-Checker über-
prüfen. Wenn es funktioniert, dann dürfte in der Hardware kein Fehler
sein. GALs vom Typ GAL16V8 müssen so in die Textool-Fassung gesteckt werden,
daß Pin 1 des GALs mit Pin 3 der Fassung übereinstimmt. Bei GALs vom Typ
GAL20V8, GAL22V10 und GAL20RA10 muß Pin 1 des GALs mit Pin 1 der Fassung
übereinstimmen.


Und hier noch die Pinbelegung der beiden Transistoren (Ansicht von unten):


                       BC 237 und BC 327
                               _  
                             -   - 
                            -     -
                            -o o o-
                             -----

                             E B C 



@ENDNODE
      






@NODE Keywords "Schlüsselwörter"

@{U}Schlüsselwörter des Source-Files:@{UU}

GAL16V8                 bestimmt den GAL-Typ
GAL20V8
GAL22V10
GAL20RA10

NC                      nichtverwendeter Pin
GND                     Masse   (=LOW)
VCC                     +5V     (=HIGH)

.T                      Ausgangspin ist Tristate-Ausgang
.E                      Tristate-Freigabe durch Produktterm
.R                      Ausgangspin ist Register-Ausgang
.CLK                    Clock-Definition für GAL20RA10
.ARST                   Async. Reset Definition für GAL20RA10
.APRST                  Async. Preset Definition für GAL20RA10

AR                      Asnchronous Reset für GAL22V10
SP                      Synchronous Preset für GAL22V10

=                       Ausgangspin wird eine Gleichung zugewiesen

+, #                    ODER - Verknüpfung
*, &                    UND  - Verknüpfung
/, !                    NICHT

DESCRIPTION             kennzeichnet das Ende der Booleschen Gleichungen


@ENDNODE




@NODE PartList "Stückliste"

@{U}Stückliste:@{UU}


        @{U}ICs:@{UU}

         IC1, IC3, IC4, IC5   :   4 x   4094
         IC2                  :   1 x   4555
         IC6                  :   1 x   74HC126
         IC7                  :   1 x   4021
         IC8                  :   1 x   74LS06
         IC9                  :   1 x   TL 497
         IC10                 :   1 x   74LS145


        @{U}Dioden:@{UU}

         D1-D4                :   4 x   1N4148
         LED                  :   1 x   rot


        @{U}Transistoren:@{UU}

         T2, T4, T5           :   3 x   BC237B
         T1, T3               :   2 x   BC327


        @{U}Widerstände (1/4 Watt, 5%):@{UU}

         R1, R2, R35-39       :   7 x   1   KOhm
         R3-13, R16, R19-26   :  20 x   10  KOhm
         R28-32               :   5 x   1,8 KOhm
         R14                  :   1 x   1   Ohm
         R15                  :   1 x   27  KOhm
         R34                  :   1 x   220 Ohm
         R18                  :   1 x   4,7 Ohm
         R27                  :   1 x   47  Ohm
         R33                  :   1 x   22  KOhm
         R40-44               :   5 x   2   KOhm Spindeltrimmer
         (R17 gibt es nicht)


        @{U}Relais:@{UU}

         K1, K2               :   2 x   Siemens V23101A3A101 oder 
                                        Reed-Relais z.B. Hamlin
                                        (1 x Wechselkontakt)

        @{U}Spule:@{UU}

         L1                   :   1 x   100 uH, Miniatur-Festinduktivität


        @{U}Kondensatoren:@{UU}

         C1                   :   1 x   100 pF
         C2                   :   1 x   4,7 uF, Tantal
         C3                   :   1 x   100 nF
         C4                   :   1 x   220 uF, 25V


        @{U}Sonstiges:@{UU}

         IC-Fassungen
           7 x 16polig
           3 x 14polig
           1 x Textool-Fassung 24polig, schmal!
         25polige  Sub-D-Buchse  (für Amiga 1000)
         bzw. 25poligen Sub-D-Stecker (für alle anderen Amiga-Typen)



Legende: u = mikro


Wenn Sie sich die Platine ätzen wollen, dessen PostScript- und Gerber-File
sich im Verzeichnis "Layout" befindet, beachten Sie bitte folgendes:

Statt den einzelnen Widerständen R28 bis R32 ist für die Platine ein
8*1,8kOhm Widerstands-Array vorgesehen. Außerdem ist auf der Platine für
jedes IC ein 100nF Abblock-Kondensator vorgesehen (siehe C5 bis C14 im
Bestückungsplan), die nicht im Schaltplan eingezeichnet sind.
Die Verbindung zwischen Amiga und GAL-Brenner kann auf unterschiedliche Art
und Weise hergestellt werden. Lesen Sie sich dazu am besten den Abschnitt
III.3 durch und ergänzen Sie, je nachdem wie Sie diese Verbindung realisieren
wollen, die Stückliste.

@ENDNODE




@NODE Literature "Literatur"

@{U}Literaturhinweise:@{UU}


  1) GALs - Programmierbare Logikbausteine in Theorie und Praxis
     Bitterle
     Franzis-Verlag

  2) Das GAL Buch - Grundlagen, Entwurf, Selbstbau-Brenner
     elektor

  3) Programmable Logic Manual - GAL Products
     SGS-Thomson

  4) Logikbausteine - Grundlagen, Programmierung und Anwendung
     Hans-Joachim Blank
     Markt&Technik Verlag

  5) GAL Handbook
     Lattice

@ENDNODE




@NODE Closing "Schlußwort"

 Schlußwort? Schlußwort! Tja, das war's dann wohl. An dieser Stelle möchte
 ich mich ganz herzlich bei meinem linken Cowboy-Stiefel dafür bedanken, daß
 sich das darin befindliche Loch nicht weiter vergrößert hat und ich somit
 meine Arbeit an dieser Anleitung nicht unterbrechen mußte, um mir neue
 Latschen zu kaufen. Ich werde mich jetzt dann durch die leeren Cola-Dosen
 und Kartoffelchip-Tüten Richtung Fenster kämpfen und die Rolläden
 hochziehen -- welche Jahreszeit haben wir eigentlich gerade? Danach werde
 ich zum ersten Mal seit langem das Zimmer verlassen -- wo ist eigentlich
 meine Katze hin? Sobald ich wieder in die Gesellschaft integriert bin -- da
 fällt mir ein, ich habe ja gar keine Katze -- werde ich mich auf ein neues
 Projekt stürzen.

 Ich möchte mich auch bei Ihnen dafür bedanken, daß Sie es geschaft haben, diese
 Anleitung tatsächlich bis zum Ende durchzulesen. Falls Sie sie
 von hinten her durchlesen, möchte ich mich trotzdem bedanken und Ihnen
 schon Mal im voraus gratulieren, daß Sie sie bis zum Anfang (?!) durchlesen.


 Vielen Dank und Grüße an alle.

 Tschau, Tschüß,.... bis zum nächsten Update oder bis zum nächsten Projekt,
 Euer

   Christian Habermann

@ENDNODE




@NODE Index "Index"

    @{B}A@{UB}                                              
       @{" AC0                       " LINK GAL16_20V8}     
       @{" AC1                       " LINK GAL16_20V8}     
       @{" ACW                       " LINK GAL16_20V8}     
       @{"   Aufbau                  " LINK ProgGAL}        
       @{"   lesen                   " LINK MenACW}
       @{" AND-Matrix                " LINK GAL16_20V8}     
       @{" AR                        " LINK GAL22V10}       
       @{" Architektur-Kontroll-Wort " LINK GAL16_20V8}     
       @{" Assembler                 " LINK Assembler}
       @{" Asynchronous Preset       " LINK GAL22V10}       
       @{" Asynchronous Reset        " LINK GAL22V10}       
       @{" Ausgang, kombinatorisch   " LINK GAL16_20V8}
       @{" Ausgangszelle, konfig.    " LINK GAL16_20V8}     
       @{" Austesten                 " LINK Testing}        

    @{B}B@{UB}                                              
       @{" Beispiel                  " LINK Examples}       
       @{"   GA16V8                  " LINK Example16V8}    
       @{"   GAL22V10                " LINK Example22V10}   
       @{"   GAL20RA10               " LINK Example20RA10}
       @{" Betriebsmodus             " LINK GAL16_20V8}     
       @{" Bulk Erase                " LINK GAL16_20V8}     
                                                            
    @{B}C@{UB}                                              
       @{" Chip-Diagramm             " LINK Assembler}      
                                                            
    @{B}D@{UB}                                              
       @{" DESCRIPTION               " LINK SourceFile}     
                                                            
    @{B}E@{UB}
       @{" Edit-Mode                 " LINK ProgGAL}        
       @{" Edit-Spannung             " LINK ProgGAL}        
       @{" Editor, aufrufen          " LINK MenCallEditor}
       @{" Editor, auswählen         " LINK MenEditor}
       @{" Einschränkungen           " LINK GAL16_20V8}

    @{B}F@{UB}
       @{" Fehlermeldungen           " LINK Errors}         
       @{" File-Checksumme           " LINK MenJEDECPar}
       @{" Fuse-Checksumme           " LINK MenJEDECPar}
       @{" Fuse-File                 " LINK Assembler}
                                                            
    @{B}G@{UB}                                              
       @{" GAL                       " LINK ProgLogik}      
       @{" GAL-Assembler             " LINK Assembler}      
       @{" GAL-Checker               " LINK Testing}        
       @{" GAL-Info                  " LINK MenGALInfo}
       @{" GAL-Typen                 " LINK IntStruktur}
       @{" GAL16V8                   " LINK GAL16_20V8}     
       @{"   interne Struktur        " LINK GAL16_20V8}
       @{"   OLMC                    " LINK GAL16_20V8}     
       @{"   Pinbelegung             " LINK GAL16_20V8}     
       @{"     Modus                 " LINK GAL16_20V8}     
       @{"   Security-Bit            " LINK GAL16_20V8}     
       @{"   Signature               " LINK GAL16_20V8}     
       @{" GAL20RA10                 " LINK GAL20RA10}      
       @{"   Asynchronous Preset     " LINK GAL20RA10}      
       @{"   Asynchronous Reset      " LINK GAL20RA10}      
       @{"   interne Struktur        " LINK GAL20RA10}      
       @{"   OLMC                    " LINK GAL20RA10}      
       @{"   Pinbelegung             " LINK GAL20RA10}      
       @{"   Preload                 " LINK GAL20RA10}      
       @{"   Tristate-Kontrolle      " LINK GAL20RA10}      
       @{" GAL20V8                   " LINK GAL20RA10}      
       @{"   interne Sturktur        " LINK GAL16_20V8}     
       @{"   OLMC                    " LINK GAL16_20V8}     
       @{"   Pinbelegung             " LINK GAL16_20V8}     
       @{"     Modus                 " LINK GAL16_20V8}     
       @{"   Security-Bit            " LINK GAL16_20V8}     
       @{"   Signature               " LINK GAL16_20V8}
       @{" GAL22V10                  " LINK GAL22V10}       
       @{"   interne Struktur        " LINK GAL22V10}       
       @{"   OLMC                    " LINK GAL22V10}       
       @{"   Pinbelegung             " LINK GAL22V10}
       @{"   Security-Bit            " LINK GAL22V10}       
       @{"   Signature               " LINK GAL22V10}       
       @{" GALerTest                 " LINK Construction}
                                                            
    @{B}H@{UB}                                              
       @{" Hardware                  " LINK SchaltBesch}    
       @{" Hardware-Version          " LINK MenHardVer}
       @{" Hilfe                     " LINK Usage}          
       @{" History                   " LINK History}        

    @{B}I@{UB}
       @{" Installation              " LINK Installation}

    @{B}J@{UB}
       @{" JEDEC-Datei               " LINK JEDECFile}
       @{"    erstellen              " LINK MenMakeJEDEC}
       @{"    Parameter              " LINK MenJEDECPar}

    @{B}K@{UB}
       @{" Karnaugh-Diagramm         " LINK Optimizer}
       @{" Kommentar                 " LINK SourceFile}
       @{" Konfiguration, sichern    " LINK MenSaveConfig}
       @{" kopieren                  " LINK MenCopy}

    @{B}L@{UB}
       @{" löschen                   " LINK MenErase}
       @{" Leertest                  " LINK MenEmpty}

    @{B}M@{UB}
       @{" Matrix, UND-, AND-        " LINK GAL16_20V8}

    @{B}N@{UB}
       @{" Negation                  " LINK SourceFile}

    @{B}O@{UB}
       @{" OLMC                      " LINK GAL16_20V8}
       @{"   Aufbau                  " LINK GAL16_20V8}
       @{" Optimizer                 " LINK Optimizer}

    @{B}P@{UB}
       @{" P,/V                      " LINK ProgGAL}
       @{" Pin-Belegungs-File        " LINK Assembler}
       @{" Pin-Deklaration           " LINK SourceFile}
       @{" Pinnamen                  " LINK SourceFile}
       @{"   löschen                 " LINK MenClearNames}
       @{"   zeigen                  " LINK MenShowNames}
       @{" Platine                   " LINK Construction}
       @{" PLD                       " LINK ProgLogik}
       @{" Preload                   " LINK GAL20RA10}
       @{" Produktterm               " LINK GAL16_20V8}
       @{" Programmieralgorithmus    " LINK ProgGAL}
       @{" programmieren             " LINK MenProg}
       @{"   Vorgehensweise          " LINK Program}
       @{" PT                        " LINK GAL16_20V8}

    @{B}Q@{UB}
       @{" Quine-McCluskey           " LINK Optimizer}
       @{" Quit                      " LINK MenQuit}

    @{B}R@{UB}
       @{" Rückkopplung              " LINK GAL16_20V8}
       @{" RAG0-RAG5                 " LINK ProgGAL}
       @{" Reassembler               " LINK MenReAsm}
       @{" Register-Ausgang          " LINK GAL16_20V8}
       @{" Resolvente                " LINK Optimizer}

    @{B}S@{UB}
       @{" S0                        " LINK GAL22V10}
       @{" S1                        " LINK GAL22V10}
       @{" Schaltungsbeschreibung    " LINK SchaltBesch}
       @{" Schlüsselwörter           " LINK Keywords}
       @{" Schreibverhalten          " LINK MenWriteAcc}
       @{" SCLK                      " LINK ProgGAL}
       @{" SDIN                      " LINK ProgGAL}
       @{" SDOUT                     " LINK ProgGAL}
       @{" Security-Fuse             " LINK GAL16_20V8}
       @{"   setzen                  " LINK MenSetSec}
       @{"   testen                  " LINK MenTestSec}
       @{" Shareware                 " LINK Shareware}
       @{" Sicherheitszelle          " LINK GAL16_20V8}
       @{" Signature                 " LINK GAL16_20V8}
       @{"   lesen                   " LINK MenReadSig}
       @{" Source-File               " LINK SourceFile}
       @{" SP                        " LINK GAL22V10}
       @{" Steuerzeichen             " LINK JEDECFile}
       @{" SYN                       " LINK GAL16_20V8}
       @{" Synchronous Preset        " LINK GAL22V10}

    @{B}T@{UB}
       @{" Tristate-Ausgang          " LINK GAL16_20V8}
       @{" Typ-Requester             " LINK MenTypeReq}

    @{B}U@{UB}
       @{" UND-Verknüpfung           " LINK GAL16_20V8}

    @{B}V@{UB}
       @{" vergleichen               " LINK MenCmp}
       @{" VIL                       " LINK ProgGAL}

    @{B}X@{UB}
       @{" XOR                       " LINK GAL16_20V8}




@ENDNODE


