
                               V E N T U R E

                               prsentiert:

                             ASM-ONE Anleitung

      Geschrieben von Pestilence, formatiert von Carnivore/BeerMacht

                                 ASM - ONE

Inhaltsverzeichnis

1.      Einfhrung                                              8
1.1     Mglichkeiten mit ASM-ONE                               9
1.2     Der ASM-ONE Makro-Assembler                             10

2.      Installation                                            12
2.1     Installation fr direktes Booten von der
        Programmdiskette                                        12
2.2     Installation auf der Workbench                          13

3.      Die ersten Schritte                                     14

4.      Einstiegskapitel                                        16
4.1     Warum Maschinensprache                                  16
4.2     Das Amiga-System                                        17
4.3     Die verschiedenen Zahlensysteme                         18
4.4     Die Speicherbelegung                                    21
4.5     Das Programm                                            22
4.6     Die Prozessorregister                                   24

5.      Der Editor von ASM-ONE                                  29
5.1     Zusammenfassung der Editor-Funktionen                   30
        Blockfunktionen                                         30
        Suchen und Ersetzen                                     30
        Sprungbefehle                                           31
        Cursor-Bewegung                                         31
        Schnelles Lschen                                       32
        Sonstige                                                32
        Zustzliche Informationen zu den Editor-Befehlen        32
                                                                        (3)
6.      Die Befehlszeile                                        34
        Projekt                                                 37
        Editor                                                  42
        Memory                                                  43
        Einfgen                                                46
        Assembler                                               46
        Monitor                                                 47
        Diskette                                                48
        Sonstige                                                51

7.      Der Assembler                                           53
7.1     Programme                                               55
7.1.1   Das Label-Feld                                          56
7.1.2   Das Befehlsfeld                                         57
7.1.3   Das Operandenfeld                                       58
7.1.4   Kommentare                                              58
7.1.5   Terme                                                   59
7.2     Direktiven                                              62
7.2.1   Direktiven zur Assemblierungskontrolle                  67
7.2.2   Direktiven zur Datendefinition                          73
7.2.3   Direktiven zur Symboldefinition                         76
7.2.4   Makro-Direktiven                                        79
7.2.5   Bedingte Assemblierung                                  83
7.2.6   Ausgabekontrolle                                        87
7.2.7   Externe Symbole                                         90
7.2.8   Allgemeine Direktiven                                   91

8.      Der Debugger                                            95
        Enter                                                   96
        Step n                                                  97
        Edit Regs                                               97
        DelWatch                                                98
        JumpAddr                                                99
        JumpMark                                                99
        B.P. Addr                                               99
        B.P. Mark                                               99
                                                                        (4)
9.      Der Monitor                                             101
        HexDump                                                 103
        AsciiDump                                               103
        Jump Addr                                               103
        Last Addr                                               103
        Mark 1..3                                               103
        QuickJump                                               104
        esc                                                     105

10.     Der Motorola MC68000                                    107
        Datenregister                                           107
        Adreregister                                           108
        Stapelzeiger                                            108
        Status- und Bedingungscoderegister                      109
10.1    Der Befehlssatz                                         110
10.1.1  Befehle zum Kopieren von Daten                          115
10.1.2  Befehle fr Integer Arithmetik                          116
10.1.3  Logische Operationen                                    118
10.1.4  Schiebe- und Rotationsbefehle                           119
10.1.5  Manipulationen auf Bit-Ebene                            123
10.1.6  Befehle zur BCD-Arithmetik                              124
10.1.7  Programm-Kontrollbefehle                                126
10.1.8  LINK                                                    127
10.1.9  System-Kontrollbefehle                                  128
10.2    Exceptions                                              129

11.     Programmbeispiele                                       133
11.1    Allgemein                                               135
11.1.1  Langwort-Multiplikation                                 135
11.1.2  Langwort-Division                                       138
11.1.3  Lschen, Kopieren und Vergleichen                       138
11.1.4  Sortieren                                               142
11.2    Systemprogrammierung                                    146
11.3    Hardwareprogrammierung                                  152
11.3.1  Erzeugung eines Objekts                                 160
                                                                        (5)
        Anhnge                                                 167
A.      Voreinstellungen                                        167
        Rescue                                                  168
        Level 7                                                 169
        NumLock                                                 171
        AutoAlloc                                               171
        ReqLibrary                                              172
        PrinterDump                                             172
        Interlace                                               172
        Source .S                                               173
        LineNumbers                                             173
        AutoIndent                                              174
        ShowSource                                              174
        ListFile                                                174
        Paging                                                  174
        Halt Page                                               174
        Debug                                                   175
        Label:                                                  175
        DisAssemble                                             176
        OnlyAscii                                               176
        Close WB                                                177
B.      Literaturempfehlungen                                   178
C.      Fehlermeldungen                                         180
D.      Taktzyklentabellen                                      190

        Indexverzeichnis                                        199
                                                                        (6)
Vorwort

Jetzt,  nachdem  die  Arbeit  getan  ist  und  Ihnen  mit  ASM_ONE ein Kom-
plettpacket  zur  Programmierung  des  Commodore  Amiga  vorliegt,  das mit
integriertem  Monitor und Debugger jeden Assembler-Programmierer zufrieden-
stellen  wird,  mchte ich mich bei allen Personen bedanken, die durch ihre
Untersttzung und Ermutigung ASM-ONE mglich gemacht haben.

Mit  ihren  Tips  und  Vorschlgen  haben  Jesper  Steen  Mller von Danish
Softtech  Aps,  Sune Trudslev, Mads Henriksen und Michael Nielsen geholfen.
Colin Fox (Pyramid Designs) und Bruce Dawson (CygnusSoft Software) wird fr
die Programmierung und Freigabe der Requester.Library gedankt.

Besonderen  Dank  mchte  ich  meinen Eltern aussprechen, die ausreichendes
Vertrauen  in  meine Fhigkeiten bewiesen haben, und ein Dankeschn auch an
Henrik  Brink,  Florian  Schroecker,  Jan  Densen  und Michael Holm fr ihr
Interesse an ASM-ONE.

Erwhnt sei auch mein Hund Jason, weil er mich bei den nchtlichen Arbeiten
wachgehalten und morgens durch sein Bellen wieder geweckt hat.

Ihnen  wnsche  ich  viel  Erfolg  mit ASM-ONE und viele ntzliche und gute
Assembler-Programme fr Ihren Commodore Amiga.

Im Oktober 1990

        Rune Gram-Madsen
                                                                        (7)
1.  Einfhrung

Willkommen bei ASM-ONE!  Dieses Programmpaket ist eine integrierte Entwick-
lungsumgebeung  aus einem Assembler, einem Editor, einem Debugger und einem
Monitor.   Damit haben Sie alle notwendigen Funktionen in einem Paket inte-
griert,  was  die  Entwicklung  neuer  Porgramme  sowohl  krzer  als  auch
benutzerfreundlicher  werden lt.  Sie knnen Programme jeder Art und jeg-
lichen  Umfangs  schreiben,  die  einzige Beschrnkung legt Ihnen dabei der
verfgbare Speicherplatz auf.

        Kurzer berblick ber den ASM-ONE-Makro-Assembler:

Integrierter   Source-Level-Debugger:    Er  bietet  die  Mglichkeit,  das
Programm  im Einzelschrittmodus abarbeiten zu lassen, whrend frei whlbare
Speicherbereiche  und  alle Register angezeigt, Breakpoints freigesetzt und
smtliche Register editiert werden knnen.

Kompatibilitt  mit  ALink  und BLink:  Hierdurch werden Hochsprachen- Pro-
grammierer  in die Lage versetzt, Assembler-Routinen in ihre Programme ein-
zubinden.

Schnelle Assemblierung mit 50000 bis 70000 Befehlszeilen pro Minute.

ASM-ONE ist Quellcode-kompatibel mit allen bisherigen Assemblern.

Viele  zustzliche  Direktiven  erlauben  benutzerfreundlichere  Quellcode-
Erstellung.
                                                                        (8)
Integrierter  superschneller Editor mit Befehlen zur Blockmanipulation, zum
Suchen, zum Erstzen, zum Markieren und mit Makrofhigkeit.

Echtzeit-Fullscreen-Monitor   mit   Disassemblierung,   Hexadezimalausgabe,
ASCII-Ausgabe, Sprungmglichkeit und Adremarkierung.

ASM-ONE  ist  benutzerfreundlich  durch  Mens mit Tastaturkrzeln fr alle
Funktionen.

ASM-ONE  bietet  alternativ  auch  absolute  Speicherbelegung,  wodurch der
Assembler zum optimalen Entwicklungswerkzeug fr Spiele und Demos wird.

Weiterhin Untersttzung binrer Includes mit INCBIN und EXTERN.

1.1 Mglichkeiten mit ASM-ONE

Die  Programmierung  in Assembler erfordert mehr Aufmerksamkeit auf winzige
Details als in allen anderen Programmiersprachen.  Andererseits ist es mg-
lich,  Assembler-Programme  durch Ausnutzung der genau passenden Assembler-
Befehle quasi mazuschneidern, wodurch schnellere Programme mglich werden.

Da  die  Programmierung  eine  so  zeitaufwendige Beschftigung ist, ist es
wichtig,  da die Entwicklungsumgebeung so schnell und flexibel wie mglich
ist.   Das  ist  der Grund, warum in ASM-ONE Assembler, Editor, Monitor und
Debugger integriert sind.  Dadurch sparen sie Zeit.  Alle Funktionen knnen
sowohl  ber  Mens  als auch ber die Tastatur angewhlt werden, wobei die
Tastaturbedienung  sich  anbietet,  sobald Sie mit diesem Programm vertraut
sind.
                                                                        (9)
ASM-ONE   ist   sowohl   zur  Systemprogrammierung  als  auch  zur  Spiele-
programmierung  besonders  geeignet.   Denn  ASM-ONE  ist  Makro-Assembler-
kompatibel  mit  Include-Files,  verschiedenen  Sektionen und so weiter und
erlaubt  auch  direkte  Speicherbelegung, Monitorfunktion etc.  fr System-
programmierer.   Dadurch  werden  beide  Programmieraufgaben optimal unter-
sttzt, ohne die jeweils andere auszuschlieen.

1.2 Der ASM-ONE-Makro-Assembler

Um  ASM-ONE  richtig  zu  benutzen,  ist  das  grundlegende Verstndnis der
Funktionsweise Vorrausetzung.

Die Basis der Konzeption von ASM-ONE ist der Kommandozeileninterpreter, der
in der Bedienung dem CLI verglichbar ist.  In ihn gelangen Sie automatisch,
nachdem  sie  Typ  und Gre des von ASM-ONE zu belegenden Arbeitsspeichers
gewhlt  haben.  Von dort aus knnen Sie alle Modi von ASM-ONE anwhlen und
alle Befehle eingeben.  ASM-ONE gliedert sich wie folgt:

                        Kommandozeileninterpreter

        Editor          Assembler       Debugger        Monitor
                                                                        (10)
Die   Vorgehensweise  beim  Erstellen  eines  Programmes  mit  ASM-ONE  ist
folgende:

1.  Schreiben  Sie einen Programmtext, oder laden Sie einen in den Editor.
2.  Assemblieren Sie diesen sogennaten Quelltext, und kehren Sie bei
    Syntaxfehlern in den Editor zurck.(1)
3.  Versuchen Sie, das assembleirte Programm zu starten. Falls sie logische
    Fehler im Programm bemerken, korrigieren Sie diese ebenfalls im Editor,
    oder wechseln Sie in den Debugger, wenn Sie die Fehler nicht auf Anhieb
    entdecken knnen.

Anmerkung:  Bevor Sie ein neu geschriebenes Programm zum erstenmal starten,
sollten  Sie alles abspeichern, da beim Start eines Assembler-Programms die
komplette Kontrolle ber den Computer an dieses Programm bergeben wird und
im  Falle  eines  Absturzes  der  Quelltext  im Editor und das assemblierte
Programm verloren sind.
                                                                        (11)
2.  Installation von ASM-ONE

Die  mitgelieferte Programmdiskette ist bootfhig.  Sie knnen die Diskette
also  statt  der Workbench-Diskette zum Starten Ihres Rechners benutzen und
sofort  mit  ASM-ONE  arbeiten.   Nachdem  Sie  ASM-ONE  ausprobiert haben,
mchten  Sie  ASM-ONE  vielleicht  von der Workbench starten, einen Drucker
benutzen oder ASM-ONE auf Ihrer Festplatte installieren.

Sie  haben  fr  die  weitere Benutzung von ASM-ONE zwei Mglichkeiten, von
denen Sie eine auswhlen sollten.

1.  Direktes Booten von der Programmdiskette
2.  Booten von der Workbench

2.1 Installation fr direktes Booten von der Programmdiskette

Falls  Sie  Ihren  Drucker  nach dem Booten von der ASM-ONE-Diskette nutzen
wollen,  mssen  Sie die folgenden Dateien von Ihrer Workbench-Diskette auf
die ASM-ONE-Diskette kopieren:

        devs/serial.device              nach    devs/
        devs/parallel.device            nach    devs/
        devs/printer.device             nach    devs/
        devs/system-configuration       nach    devs/
        devs/printers/<Ihr Drucker>     nach    devs/printers/
        l/Port-Handler                  nach    l/
                                                                        (12)
Das  Kopieren  dieser  Dateien auf einem virusinfizierten Computer oder von
einer  virusinfizierten Diskette knnte zu unerwnschten Modifikationen der
ASM-ONE-Diskette  fhren.  Wenn Sie nicht sicher sind, da Ihr Computer und
Ihre Workbench-Diskette virusfrei sind, fahren Sie mit Abschnitt 2.2 fort.

Stellen  Sie sicher, da Sie denjenigen Druckertreiber kopieren, der in der
Systemkonfiguration eingestellt ist.  Sie knnen dies berprfen, indem Sie
Preferences starten.  Schlagen Sie gegebenenfalls in Ihrem Amiga-Handbuch
nach, wie Sie Preferences bedienen.

Der   sicherste   Weg  ist,  den  gesamten  Inhalt  der  devs/  und  l/
Verzeichnisse  auf die ASM-ONE-Bootdiskette zu kopieren.  Zwar sind hierbei
mehr Dateien zu kopieren, dafr haben Sie danach alle auf einer Diskette.

Wenn  Sie  nicht vllig sicher sind, wie Sie dies anstellen, sollten Sie zu
Abschnitt 2.2 bergehen.

2.2 Installation fr das Booten von der Workbench

Dies  ist  viel  einfacher als die unter 2.1 beschriebene Methode, weil Sie
hierzu  nur  eine  einzige  Datei  von  der  ASM-ONE-Bootdiskette  auf Ihre
Workbench-Diskette kopieren mssen:

        libs/req.library                nach    libs/

Nun  knnen  Sie mit Ihrer Workbench-Diskette wie gewhnlich booten, danach
die ASM-ONE-Diskette einlegen und das ASM-ONE-Icon anklicken.
                                                                        (13)
3.  Die ersten Schritte

Nach dem Laden von ASM-ONE erscheint folgende Eingabeaufforderung:

        ALLOCATE Fast/Chip/Abs>

Wenn  sie ein Fast-Memory haben, geben Sie nun F ein, andernfalls C und
besttigen  mit  Return.  Nun werden Sie gefragt wieviel Speicher Sie fr
den  Programmtext  und  das  assemblierte  Programm  zur  Verfgung stellen
mchten.

        WORKSPACE (max. ???) Kb>

Geben  Sie  jetzt  die gewnschte Speichergre ein, und besttigen Sie mit
Return.   100  KByte  sind  fr  die  Beispiele  auf der ASM-ONE-Diskette
ausreichend.  Sie befinden sich nun im Kommandozeilen-Interpreter und sehen
den Eingabeprompt

        >

Nun  ist ASM-ONE aktiv und bereit zur Arbeit.  Ein guter Einstieg ist, wenn
Sie zum Kennenlernen die Datei

        GettingStarted.S

laden.   Whlen Sie im Men Project den Menpunkt Read-File an, und ein
groer Datei-Requester wird geffnet.  Klicken Sie einmal auf das Examples-
Verzeichnis und dann zweimal auf die Datei GettingStarted.S.
                                                                        (14)
Ist  die  Datei geladen, whlen Sie zum Ansehen die Funktion Edit im Men
Assembler  an.   Sie  knnen  nun  alle  Funktionen im Men Edit Funct.
benutzen.   Den  Editor  verlassen  SIe  mit der Taste Edit ode durch die
Funktion Exit im Men Edit Funct..

Von  der  Kommandozeile  aus  assemblieren  Sie den Quelltext des Beispiels
GettingStarted.S, indem Sie

        >A

eingeben und mit Return besttigen.

Die Antwort wird

        Pass1
        Pass2
        No Errors
        >

sein. Geben Sie nun

        >J

ein,  und besttigen Sie mit Return, um das assemblierte Beispielprogramm
zu starten, das Sie mit Leertaste wieder beenden knnen.

Um  ASM-ONE  richtig kennenzulernen, sollten Sie auch die brigen Beispiel-
programme  im  Verzeichnis  Examples  assemblieren.  Dabei schnuppern Sie
ruhig  einmal  durch  die  verschiedenen  Mens  von ASM-ONE und whlen Sie
Editor, Debugger oder Monitor im Men Assembler probehalber an.
                                                                        (15)
4.  Einstiegskapitel

Wenn  Sie  schon  etwas  ber  Maschinensprache  wissen sollten, knnen Sie
dieses  Kapitel  berspringen.   Es  ist  als  grundlegende  Einfhrung  in
Maschinensprache und die verschiedenen Zahlensysteme aufgebaut.

4.1 Warum Maschinensprache?

Maschinensprache  ist  die  einzige  Sprache, die der MC68000-Prozessor des
Amiga  versteht.  Auch wenn Sie Programme in Basic oder C verfassen, werden
diese  zur  Ausfhrung  in  Maschinensprache  umgesetzt.  In Basic wird ein
Programm  Zeile  fr  Zeile  bersetzt, was entsprechend lange dauert.  Ein
C-Programm  wird  zwar  durch  einen  Compiler an einem Stck in Maschinen-
sprache  bersetzt,  da  aber  jeder  C-Befehl in mehrere Maschinensprache-
Befehle bersetzt werden mu und diese Befehle je nach Gte des verwendeten
Compilers  nicht immer in der gnstigsten Weise aufeinander folgen, ist der
erzeugte Code nicht optimal.  Absolut optimalen Code erreicht man nur durch
die direkte Programmierung in Maschinensprache.

Und noch ein weiterer Vorteil von Maschinensprache ist zu nennen:  Wenn Sie
wissen   wollen,  wie  Ihr  Rechner  arbeitet  und  wie  zum  Beispiel  die
verschiedenen   Komponenten   der   Hardware   zusammenarbeiten,  dann  ist
Maschinensprache  ein  guter Weg, um zu diesem Verstndnis zu gelangen.  In
Maschinensprache knnen Sie jeden Teil Ihres Rechners genau steuern.  Daher
werden nicht nur die meisten Speile direkt in Maschinensprache geschrieben,
sondern  auch  viele  Utilities  und Anwendungsprogramme und natrlich auch
ASM-ONE.
                                                                        (16)
Auch  Programmierer,  die  normalerweise  mit Hochsprachen arbeiten, mssen
fters  Teile  des Codes in Maschinensprache einbinden, um in ihrer Sprache
unlsbare Probleme zu bewltigen oder um die Geschwindigkeit zeitkritischer
Routinen zu erhhen.

Ich   persnlich   habe   Maschinensprache  immer  allen  anderen  Sprachen
vorgezogen,  weil  ich es mag, die komplette Kontrolle ber die Maschine zu
haben, und zudem schnelle Programme sehr schtze.

4.2 Das Amiga-System

Der  Amiga  basiert  im Prinzip auf dem gleichen Konzept wie alle Computer:
Er  besitzt  einen  Prozessor  (MC 68000), einen Hauptspeicher (RAM, Random
Access  Memory)  und einige Spezialchips.  Diese Spezialchips sind es auch,
die den Amiga berhmt gemacht haben, denn er bekam gleich drei davon in die
Wiege  gelegt:   Agnus  ermglicht  mit  dem  Blitter schnelle Animationen,
Denise  sorgt  fr  Grafik mit bis zu 4096 Farben, und Paula produziert den
vierstimmigen Stereo-Sound und kontrolliert Ports und Diskettenlaufwerke.

Das  Betriebssystem  des Amiga befindet sich im Nur-Lese-Speicher, auch ROM
genannt.  Es kann als ein Programm erklrt werden, das sich um nahezu alles
kmmert,  was  im  Computer  abluft.   Das  Betriebssystem ldt Programme,
kontrolliert  die Maus und bewegt den Mauszeiger zur richtigen Stelle.  Der
Bildschirm  mit  Texten  und  Grafiken  wird  ebenfalls  vom Betriebssystem
aufgebaut.

Das  Betriebssystem  belegt derzeit 256 KByte Speicherplatz.  Exakt sind es
262144  Byte,  was  mit der digitalen Architektur eines Computers zusammen-
hngt,  in  der  es  nur die Schaltzustnde Ein und Aus gibt, statt der
gewohnten Ziffern 0
                                                                        (17)
bis 9.  Um 1000 Byte anzusprechen, braucht man in der digitalen Architektur
zehn Adreleitungen, mit denen sich

        2^10 = 2*2*2*2*2*2*2*2*2*2 = 1024 Byte

ansprechen lassen.  Im dezimalen Zahlensystem whren nur 1000 Byte mglich.

Der  Hauptspeicher  in  einem  Standard-Amiga mit 512 KByte ist daher exakt
512*1024 = 524288 Byte gro.  Jedes Byte setzt sich aus 8 Bit zusammen, die
nur  die  Zustnde Ein oder Aus annehmen knnen.  Daraus folgt, da ein
Byte  2^8 = 256 verschiedene Werte annehmen kann, also die Zahlen von 0 bis
255.  Definiert man die Zahl als vorzeichenbehaftet und das oberste Bit als
Vorzeichen-Bit, verschiebt sich der Wertebereich auf -128 bis +127.

4.3 Die verschiedenen Zahlensysteme

Haben   Sie  es  bereits  bemerkt?   Sie  wurden  soeben  mit  einem  neuen
Zahlensystem  bekanntgemacht.   Es  wurden  Bits erwhnt, die nur die Werte
Ein  und Aus annehmen knnen, whrend im dezimalen Zahlensystem Ziffern
von  0  bis 9 verwendet werden.  Das binre Zahlensystem unterscheidet sich
vom dezimalen dadurch, das es nur die Ziffern 0 und 1 kennt.

Nehmen  wir  zum Beispiel folgende Zahl, wobei das Prozentzeichen vor einer
Zahl gewhnlich eine Zahl im binren Zahlensystem markiert:

        n = %100111

Um  diesen Wert in eine Dezimalzahl umzuwandeln, knnen Sie den eingebauten
Rechner von ASM-ONE nutzen.  Geben Sie einfach

        >?%100111
                                                                        (18)
ein, und das Ergebnis sieht dann folgendermaen aus:

        Hex     Dezimal ASCII           Binr
     $00000027     39   "...'" %00000000.00000000.0000000.00100111

Sie knnen sehen, da %100111 im Dezimalsystem dem Wert 39 entspricht.

Ein  anderer  Weg,  die  Zahl  umzuwandeln,  ist  folgender:   Eine normale
Dezimalzahl  wird  aus  Einsern, Zehnern, Hundertern usw.  zusammengesetzt.
Die  Stellen  einer  Binrzahl  entsprechen  nicht Zehner-, sondern Zweier-
potenzen,  also 1,2,4 usw.  Um unser Beispiel umzuwandeln, rechnet man also
wie folgt:

        %100111 = 1*32 + 0*16 + 0*8 + 1*4 + 1*2 + 1*1 = 39

Eine Umwandlung in die andere Richtung ist natrlich ebenso mglich:

        39 = 39/32 = 1*32 + 7
             7/16  = 0*16 + 7
             7/8   = 0*8  + 7
             7/4   = 1*4  + 3
             3/2   = 1*2  + 1
             1/1   = 1*1  + 0
           = %100111

Ein  groer  Nachteil  binrer  Zhalen  ist,  da sie viel lnger und daher
schwerer zu lesen sind als dezimale Zahlen.  Wir mssen sie aber verwenden,
weil Zahlen in einem Computer binr gespeichert werden.

Um  binre  Zahlen  aber einfacher lesbar zu machen, benutzt man hufig die
hexadezimale Notation.  In Hex knnen einzelne Ziffern werde von 0 bis 15
annehmen,  doch  da die Ziffern 10 bis 15 im dezimalen Zahlensystem schon
zweistellig  wren,  benutzt  man  statt  dessen die Buchstaben A bis F wie
folgt:
                                                                        (19)
        Dezimal Hexadezimal     Dezimal Hexadezimal     Dezimal Hexadezimal
             0 = 0                   6 = 6                  12 = c
             1 = 1                   7 = 7                  13 = d
             2 = 2                   8 = 8                  14 = e
             3 = 3                   9 = 9                  15 = f
             4 = 4                  10 = a
             5 = 5                  11 = b

Nehmen wir nochmals die binre Zahl unseres Beispiels.

        n = %00100111

Sie  kann  ziemlich  einfach  in  das hexadezimale Zahlensystem umgewandelt
werden:

        0000 = 0        0100 = 4        1000 = 8        1100 = c
        0001 = 1        0101 = 5        1001 = 9        1101 = d
        0010 = 2        0110 = 6        1010 = a        1110 = e
        0011 = 3        0111 = 7        1011 = b        1111 = f

Also entspricht %00100111 = $27.
                                                                        (20)
4.4 Die Speicherbelegung

Jedes  einzelne  Byte hat im Speicher seine eigene Adresse.  Sie knnen zum
Beispiel  auf  die  Adresse 300000 zugreifen, die sich im Chip-Memory be-
findet,  dem Speicherbereich, auf den die Spezialchips des Amiga zugreifen.
Hier ist eine einfache Speicherbelegungstabelle des Amiga:

        $000000 - $07ffff Chip-Memory
        $080000 - $1fffff freier Adreraum fr zustzliches Chip-Memory
        $200000 - $9fffff freier Adreraum fr Fast-Memory
        $a00000 - $beffff reserviert
        $bfd000 - $bfdf00 CIA B gerade Adressen
        $bfe001 - $bfef01 CIA A ungerade Adressen
        $c00000 - $c7ffff Ranger-Memory (Speichererweiterung im A500)
        $c80000 - $dfefff reserviert
        $dff000 - $dfffff Register der Spezialchips
        $e00000 - $e7ffff reserviert
        $e80000 - $efffff Adreraum fr Autokonfiguration
        $f00000 - $f7ffff Erweiterungs-ROMs
        $f80000 - $fbffff Adreraum fr Kickstart-Erweit. auf 512 KByte
        $fc0000 - $ffffff Kickstart-ROM (256 KByte)

Wie  Sie  vielleicht sehen konnten, lt sich der Amiga auf bis zu 10 MByte
RAM  erweitern.  Um jedoch an die zustzlichen 1,5 MByte Chip-Memory heran-
zukommen, mu der Amiga mit dem Super Fat Agnus 8372 ausgerstet sein.
                                                                        (21)
4.5 Das Programm

Um ein Programm im Speicher abzulegen, benutzt der Amiga den Hauptspeicher.
Das  Programm  wird  im  Hauptspeicher  als  eine  lange  Liste  von Zahlen
abgelegt,  einer Serie von binren Einsen und Nullen.  Diese Werte sind fr
den  Prozessor die Instruktionen.  Die einzelnen Befehle des 68000er knnen
dabei zwischen 2 und 10 Byte lang sein.

Eine der krzesten Intruktionen ist RTS (Return from Subroutine, Rckkehr
aus  einem  Unterprogramm)  und  hat den Wert %01001111001110101 im binren
Zahlensystem,  $4e75  hexadezimal  und  20085 dezimal.  Die meisten anderen
Instruktionen   sind   komplizierter,  weil  viele  von  ihnen  zustzliche
Operanden besitzen.

Da es schwer mglich ist, sich all diese Nummern zu merken, benutzt man zur
Programmierung  in  Maschinensprache  ein  Assembler,  der  die Namen aller
Befehle  versteht.  Wenn Sie also beispielsweise RTS schreiben, bersetzt
der Assembler das automatisch in den oben erwhnten Wert $4e75.

Natrlich  gibt  es  noch  viel mehr Befehle, aber es ist schon mglich ein
kurzes Programm zu schreiben, ohne sie alle zu kennen.

Zwei neue Befehle neben RTS brauchen wir dennoch.

        MOVE    <Quelle>,<Ziel>
        ADD     <Quelle>,<Ziel>

Der  Befehl Move bertrgt einen Wert an eine andere Speicherstelle.  Der
Befehl Add addiert einen Wert zu dem einer anderen Speicherstelle.

Mit  diesen Befehlen schreiben Sie nun Ihr erstes Assembler-Programm.  Dazu
wechseln Sie in den Editor, lschen zuerst
                                                                        (22)
alles, was im Editor steht, mit dem Kommando Zap Source im Men Project
und  drcken dann Esc.  Ein einfaches Programm aus den drei vorgestellten
Kommandos:

        START   MOVE.L  #0,$000000      ; Lsche Adresse 0 (32 bit)
                ADD.L   #$1234,$000000  ; Addiere $1234 hinzu
                RTS

Dies  sollte  das  erste und einzige Mal bleiben, da Sie in einem Programm
den  Inhalt  der  Adresse 0 modifizieren.  Zwar wird sie vom System nicht
genutzt,  es  ist  aber nur zu wahrscheinlich, da die Adresse 0 aufgrund
von  Programmierfehlern  in  anderen Programmen berschrieben wird.  Es ist
bei  der  Programmierung  des  Amiga  sehr  schlechter Stil, sich auf feste
Speicheradressen zu verlassen.  (Anmerkung des bersetzers)

Nachdem  Sie das Programm in den Editor eingegeben haben, verlassen Sie ihn
durch  nochmaligen  Druck  auf  Esc.   Versuchen  Sie nun das Programm zu
assemblieren, indem Sie

        >A

eingeben. Das Ergebnis sollte folgendes sein:

        Pass 1..
        Pass 2..
        No Errors
        >

Falls  Sie  eine  Fehlermeldung  erhalten,  mssen Sie erneut in den Editor
wechseln,  um  den  Fehler  zu  finden  und  zu  korrigiren.   Bei einem so
einfachen Programm kann es sich eigentlich nur um einen Tipfehler handeln.
                                                                        (23)
Wenn Sie das Programm assembliert haben, knnen Sie es starten, indem Sie

        >J

eingeben. Geben Sie nun

        >H.L 0

ein,  um  das Ergebnis zu sehen.  Die erste Zeile der nun folgenden Ausgabe
sollte ungefhr so aussehen:

        00000000 00001234 00.....

Die  erste  Spalte gibt die Adresse an, an der Sie in den Speicher schauen.
Der nchste Wert ist 00001234, der Inhalt der Adresse 0.

Dieser  Wert  ist  korrekt.   Wenn  Sie  nun  wieder unser Beispielprogramm
betrachten, werden Sie sehen, da die Adresse 0000000 mit 0 beschrieben
wurde.   Dann  wurde  der  Wert  $1234  zum  Inhalt  der Adresse 00000000
addiert.  Als Endergebnis befindet sich $1234 in Adresse 00000000.

4.6 Die Prozessorregister

Beim  Schreiben  eines  Programms  werden  Sie sehr hufig Zwischenwerte in
Berechnungen  oder als Schleifenzhler bentigen.  Um einen solchen Wert zu
speichern,  knnen  Sie  eine Adresse im Hauptspeicher benutzen.  Aber wenn
Sie  diesen Wert hufig brauchen sollten, empfiehlt es sich,, statt desssen
ein Register zu verwenden, da dies schneller ist.

Sie  knnen  sich  die Register wie Speicheradressen vorstellen, die jedoch
innerhalb  des  Prozessors gehalten werden.  Auf dem Motorola MC 68000 sind
15 verschiedene Register fr die Programmierung verfgbar.
                                                                        (24)
Diese Register gliedern sich in zwei Gruppen.

        D0-D7   Datenregister   32 Bit
        A0-A6   Adreregister   32 Bit

Die  Datenregister sind dabei die flexibleren:  Sie knnen sowohl als Bytes
(8  Bit), Wrter (16 Bit) und Langwrter (32 Bit) angesprochen werden.  Mit
Datenregistern  knnen  Sie  alle  Arten  von  logischen und arithmetischen
Operationen ausfhren.  Die Adreregister dagegen knnen nur als Wrter und
Langwrter  angesprochen  werden,  aber dafr auch als Zeiger auf Speicher-
stellen benutzt werden.

Wir  fhren  nun  nochmals die Addition unseres Beispielprogramms aus, aber
berechnen  das  Ergebnis  diesmal  nicht  im  Speicher,  sondern  in  einem
Datenregister.


        START   MOVE.L  #0,D0           ; D0 lschen (32 bit)
                ADD.L   #$1234,D0       ; $1234 zu D0 addieren
                RTS

Assemblieren und starten Sie dieses kleine Beispiel genauso wie vorhin, und
schauen Sie sich das Register D0 an, nachdem die Routine beendet wurde:

 D0: 00001234 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 A0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

Die  Nummer  direkt  nach D0: ist der Inhalt des Registers D0, der Wert
daneben  der  des  Registers  D1  usw.  Schauen Sie auf D0 - stimmt der
Inhalt?   Alle  anderen  Register knnen auch andere Werte als 0 enthalten.
Das ist normal, schlielich werden die Register auch von anderen Programmen
benutzt und ab und zu unaufgerumt zurckgelassen.  Deshalb ist es auch bei
Registern  wichtig,  sie  vor  weiterer  Benutzung mit dem Befehl MOVE zu
laden.
                                                                        (25)
Wir  versuchen  nun  ein etwas fortgeschritteneres Beispiel, indem auch die
Adreregister zusammen mit einigen neuen Befehlen benutzt werden.

Die neuen Befehle sind:

        LEA     Lade effektive Adresse
        TST     Teste auf null
        BEQ     Verzweige, wenn Ergebnis null ist
        BRA     Verzweige immer (wie GOTO in Basic)

Und hier ist das Programm - was tut es?

        START   LEA.L   BUFFER,A0       ; Lade Pufferadresse in A0
        LOOP    TST.B   (A0)            ; Teste, ob A0 auf ein Nullbyte zeigt
                BEQ     END             ; wenn 0, dann Ende
                ADD.B   #1,(A0)         ; addiere 1 zur Adresse, auf die
                                        ; A0 zeigt
                ADD.L   #1,A0           ; addiere 1 zum Zeiger A0
                BRA LOOP                ; Verzweige zum Schleifenbeginn
        END     RTS                     ; Rcksprung
        BUFFER  DC.B    'G@KKN',0       ; Der Puffer mit dem Geheimtext

Assemblieren  Sie  den  Quelltext,  und  starten  Sie das Programm mit J.
Geben Sie nun H BUFFER ein, und schauen Sie auf die Zeichen rechts.  Wenn
das  Programm  korrekt abgelaufen ist, steht dort eine kleine Nachricht fr
Sie.
                                                                        (26)
In  diesem Programm kam ein weiterer neuer Befehl hinzu:  DC.B.  Dies ist
kein  richtiger Maschinensprache-Befehl, sondern er teilt dem Asembler mit,
den  konstanten  Wert,  der dem Befehl folgt, in den Speicher zu schreiben.
So knnten Sie zum Beispiel schreiben:

        DC.W 1000

Die  Anweisung  schreibt  die Konstante 1000 in den peicher, und wie Sie in
unserem  Beispiel  sehen  konnten,  ist  es  so  auch  mglich, Text in den
Speicher  zu  schreiben.   Jeder  Buchstabe  wird  hierbei  in  eine Nummer
umgewandelt,  die  auch  ASCII-Codes  gennant  werden.   ASCII  steht fr
American  Standard  Comitee for Information Interchange, und ASCII-Code
bezeichnet  die von diesem Institut genormte Zuordnung des Zeichensatzes zu
den 8-Bit-Werten.

Den  gesamten  ASCII-Code  hier  aufzulisten,  lohnt  nicht,  da  Sie  eine
Zusammenstellung  des ASCII-Codes beispielsweise im Anhang des Amiga-Basic-
Handbuchs  finden.   Einige  Beispiele sollen an dieser Stelle zum besseren
Verstndnis dennoch gegeben werden:

        0 = $30         A = $41         a = $61         . = $2e
        1 = $31         B = $42         b = $62         ; = $3b
        2 = $32         C = $43         c = $63         ? = $3f
        3 = $33         D = $44         d = $64

Wenn  Sie  die  zugeordneten  ASCII-Codes anderer Buchstaben wissen wollen,
kann Ihnen auch hier der eingebaute Taschenrechner in ASM-ONE helfen.
                                                                        (27)
Geben Sie zum Beispiel

        >?'A'

ein, fhrt das zu folgender Ausgabe:

        Hex     Dezimal ASCII           Binr
     $00000041     65   "...A" %00000000.00000000.0000000.01000001

Nun  wissen  Sie  bereits  ber  einige  Grundlagen  der  Programmierung in
Maschinensprache  Bescheid,  und  wenn  Sie  mehr ber den Prozessor wissen
wollen, sollten Sie das Kapitel Der Motorola 68000 lesen.
                                                                        (28)
5.  Der Editor von ASM-ONE

Der  eingebaute Editor ist mit einer Textausgabe von ber 30000 Zeichen pro
Sekunde  recht  schnell.   Er  untersttzt zudem viele ntzliche Block- und
Cursor-Stuerungsbefehle.

Um  in den Editor zu wechseln, whlen Sie Edit im Assembler-Men, drcken
Amiga-Shift-E  oder  einfach  Esc.  Um das Editor-Fenster in der halben
Gre zu ffnen, knnen Sie Ctrl+Esc statt Esc drcken.

Vom  Editor  aus  knnen  Sie  alle  Funktionen  ber  das Men Edit oder
Shortcuts (Tastaturkrzel:  Amiga, Ctrl, Shift oder Alt plus eine
Taste)  erreichen.   Statt  der Amiga-Taste knnen Sie wahlweise auch die
Ctrl-Taste  benutzen,  so  da  die  meisten  Kommandos  mit  einer  Hand
eingegeben werden knnen.

Ein groer Buchstabe im Men bedeutet, da Sie zustzlich die Shift-Taste
drcken mssen, um diese Funktion anzusprechen.
                                                                        (29)
5.1 Zusammenfassung der Editor-Funktionen

        Blockfunktionen:

Amiga oder Ctrl plus

        b       - Block markieren
        c       - Block kopieren
        x       - Block ausschneiden
        i,f     - Block einfgen
        u       - Blockmarkierung lschen
        l       - Block in Kleinschreibung wandeln
        L       - Block in Groschreibung wandeln
        y       - Block rotieren
        k       - Benutzte Register anzeigen
        w       - Block schreiben (zum Drucken PRT: angeben)

        Suchen und Ersetzen:

Amiga oder Ctrl plus

        S       - Suchen
        s       - Suchen fortsetzen
        R       - Suchen und Ersetzen
        r       - Suchen und Ersetzen fortsetzen
                                                                        (30)
        Sprungbefehle

Amiga oder Ctrl plus

        !       - Markierung 1
        @       - Markierung 2
        #       - Markierung 3
        1       - Springe zu 1
        2       - Springe zu 2
        3       - Springe zu 3
        J       - Springe zur Markierung ;;
        j       - Springe zu Zeile ..

        Cursor-Bewegung:

Shift plus

        Hoch    - Seite hoch
        Runter  - Seite runter
        Links   - Zeilenbeginn          BOLN
        Rechts  - Zeilenende            EOLN

Amiga oder Ctrl plus

        a       - 100 Zeilen hoch
        z       - 100 Zeilen runter
        t       - Textbeginn
        T       - Textende

Alt plus

        Links   - Wort links            LWORD
        Rechts  - Wort rechts           RWORD
                                                                        (31)
        Schnelles Lschen:

Ctrl plus

        Del     - Lsche bis Zeilenanfang
        Back    - Lsche ab Zeilenanfang

Amiga oder Ctrl plus

        d       - Zeile lschen (restaurierbar)

        Sonstige:

Amiga oder Ctrl plus

        m       - Makro ausfhren
        M       - Beginne Makrodefinition
        g       - Wort in Puffer bertragen
                (das Wort kann mit Cursor-Up in der Eingabezeile in den
                Puffer geholt werden)
        DEL     - ein Zeichen lschen
        BACKSPC - Zeichen vor dem Cursor lschen

Wenn  NumLock  selektiert  ist,  knnen  Sie  auch die numerischen Tasten
benutzen, um den Cursor zu bewegen.
                                                                        (32)
        Zustzliche Informationen zu den Editor-Befehlen:

J - Springe zur Markierung ;;

Wenn  Sie  ;;-Markierungen  an  einer  oder  mehreren  STellen  in  ihrem
Programmtext  haben,  springt  Amiga+Shift+J zur nchsten folgenden ;;-
Markierung.   Sie  knnen  dies  anwenden,  um  einzelne  Hauptteile  Ihres
Programms zu trennen.

!,@,# - Markierung 1,2,3

Mit   diesen   Zeichen  knnen  Sie  drei  verschiedene  Stellen  in  Ihrem
Programmtext  markieren,  ohne ihn ndern zu mssen, denn die Position wird
nur  intern  gespeichert.   Wenn  Sie schnell zu einer bestimmten Stelle im
Programmtext  springen  wollen,  setzen  Sie dort eines dieser Markierungs-
zeichen, und springen Sie bei Bedarf direkt dorthin.

M - Beginne Makrodefinition

Die  Definition  eines  Makros  arbeitet wie ein Recorder, der alle Tasten-
drcke aufzeichnet.  Wenn Sie also mehrere nderungen gleicher Art vornemen
mssen,  zeichenen Sie die dazu ntigen Tastenbedienungen ab dem Aufruf von
Amiga+Shift+M  auf und drcken Sie in der Folge Amiga+M, um die anderen
nderungen ebenso vorzunehmen.
                                                                        (33)
6.  Die Befehlszeile

Die  Befehls-  oder Kommandozeileist die Kommandozentrale von ASM-ONE.  Sie
erkennen die Befehlszeile am Prompt.

        >

Folgende Befehle stehen Ihnen auf der Befehlszeile zur Verfgung:

        Projekt:

        ZS      - Programmtext lschen
        O       - Programmtext restaurieren
        R       - Programmtext laden
        RB      - Binre Daten laden
        RO      - Objektmodul laden
        W       - Programmtext speichern
        WB      - Binre Daten speichern
        WO      - Objektmodul speichern
        WL      - Linkerfile speichern
        I       - Einfgen
        U       - Letzte Datei aktualisieren
        ZF      - Datei lschen
        ZI      - Include-Speicher lschen
        WP      - Preferences speichern
        =M      - Zustzlichen Arbeitsspeicher belegen
        !       - Assembler beenden
                                                                        (34)
        Editor:

        T [Zeile]               - Anfang des Textes (bzw. Zeile n)
        B                       - Ende des Textes
        L [Text]                - Text suchen
        ZL [Zeilen]             - Zeilen ab Cursor-Position lschen
        P [Zeilen]              - Zeilen ab Cursor-Position ausgeben

        Speicher:

        M [.size] [addr]        - Speicher editieren
        D [addr]                - Disassemblieren
        H [.size] [addr]        - Speicher hexadezimal anzeigen
        N [addr]                - Speicher als ASCII-Text anzeigen
        @D [addr]               - Disassembliere zeilenweise
        @A [addr]               - Assembliere Zeilenweise
        @H [.size] [addr]       - Hex-Dump zeilenweise
        @N [addr]               - ASCII-Dump zeilenweise
        S [.size]               - Suchen
        F [.size]               - Fllen
        C [.size]               - Kopieren
        Q                       - Vergleichen

        Einfgen:

        ID              - Disassemblierung einfgen
        IH [.size]      - Hexadezimal einfgen
        IN              - ASCII einfgen
                                                                        (35)
        Assembler:

        A               - Programmtext im Editor assemblieren
        @A [addr]       - Assemblieren im Speicher
        AO              - Optimierend Assemblieren
        AD              - Mit Debug-Information assemblieren
        =S              - Symboltabelle erzeugen

        Monitor:

        J [addr]        - Subroutine anspringen (JSR)
        G [addr]        - Programm direkt starten (JMP)
        K [steps]       - Einzelschrittmodus
        X [register]    - Register anzeigen bzw. editieren
        ZB              - Breakpoints lschen

        Diskette:

        RS [drive]      - Sektor lesen
        RT [drive]      - Spur lesen
        WS [drive]      - Sektor schreiben
        WT [drive]      - Spur schreiben
        CC [drive]      - Bootblock-Checksumme berechnen
        W               - Externe Dateien laden
        V [path]        - Verzeichnis anzeigen

        Sonstige:

        >               - Ausgabe umleiten (z.B. zu PRT: oder DFx:)
        ? [expr]        - Numerischen Ausdruck berechnen
                                                                        (36)
Aus  hier  bedrfen  einige  der  aufgefhrten Befehle noch einer genaueren
Erluterung:

        Projekt:

ZS - Programmtext lschen / Zap Source

Lscht  den  Programmtext, den Kopierpuffer und den Code.  Der Programmtext
kann  mit  dem  Befehl  O (Old source) wiederhergestellt werden, jedoch
nur, wenn Sie den Editor danach noch nicht wieder aufgerufen haben.

O - Programmtext restaurieren / Old source

Dieser  Befehl ermglicht es Ihnen, das Kommando ZS rckgngig zu machen.
Er kann auch benutzt werden, um den Programmtext nach einem Programmabsturz
noch  zu  retten.   Ein  guter  Tip:   Dazu legen Sie Ihren Arbeitsspeicher
jedesmal an dieselbe absolute Adresse.

R - Programmtext laden / Read

Liest  eine  Datei in den Editor ein, die jede Art von Text enthalten kann.
Normalerweise wird die Extension .S (wie Source) an den Namen der Datei
angehngt,  wenn  Sie dies nicht wnschen, knnen Sie die Extension manuell
lschen, oder das Flag Source.S im Men Preferences zurcksetzen.

Der Befehl R (Read) lscht einen im Editor befindlichen Text.  Benutzen
Sie  I  (Insert),  um  Programmteile  in  bereits  im Edior befindliche
Textteile einzufgen.
                                                                        (37)
RB - Binre Daten laden / Read Binary

Mit diesem Befehl knnen Sie binre Daten an eine bestimmte Speicheradresse
laden.   Nachdem  Sie den Dateinamen eingegeben haben, werden Sie wie folgt
nach der Start- und Endadresse gefragt:

        BEG>
        END>

BEG  (Beginn)  ist  die  erste Speicheradresse, die von der Datei gefllt
werden soll, END (Ende) die letzte.

        BEG>$70000
        END>$71000


beispielsweise  liest die ersten $1000 = 4096 Byte des binren Files in den
Speicher,  beginnend  mit der Adresse $70000.  Wenn Sie die gesamte Datei
laden  wollen,  dann  ignorieren  Sie  die  Frage  END einfach, indem Sie
Return drcken:

        BEG>$70000
        END>

Die binre Datei wird so in ihrer ganzen Lnge geladen.

RO - Objektmodul laden / Read Object

Liest  eine  ausfhrbare  Datei  (Executable,  also  Programme wie DIR,
LIST,  ASM-ONE etc.).  Fr die Datei wird neuer Speicher belegt; sie wird
an  die  Speicheradresse geladen und fr diese reloziert, die anschliessend
ausgegeben wird.  In den meisten Fllen knnen Sie das geladene Programm an
dieser Adresse starten.

Programme  mit  Parametern  wie dem CLI-Befehl DIR und hnlichen erwarten
diese Parameter vom aufrufenden
                                                                        (38)
CLI,  so  da  diese bergabeparameter anhand der Register A0 (Zeiger auf
Parameter) und D0 (Lnge der Parameter) simuliert werden mssen.

Da  ein  auf diese Art nachgeladenes Programm Speicher belegt, wird der vom
letzten   Programm   belegte  Speicher  freigegeben,  wenn  Sie  ein  neues
Objekt-File  nachladen.  Sie knnene den Speicher ganz freigeben, indem Sie
ein Objekt ohne Namen ("") laden.

W - Programmtext speichern / Write

Dieser  Befehl  speichert  den  im  Editor  befindlichen  Programmtext  als
ASCII-Datei.   Nahezu  alle  anderen Editoren und Textverarbeitungen knnen
ASCII-Texte laden, so da Sie durchaus auch andere Texte als Programmtexte
mit dem Editor von ASM-ONE schreiben knnen.

Normalerweise  wird  die  Extension  .S  (wie Source) an den Dateinamen
angehngt.   Wenn Sie dies nicht wnschen, knnen Sie die Extension manuell
lschen,  oder das Flag Source.S im Men Preferences zurcksetzen.  Bei
zurckgesetztem  Flag  knnen  Sie  mit  dem  Befehl  ! und nachfolgender
Extension in der Preference-Datei einbe Extension Ihrer Wahl festlegen.

WB - Binre Daten speichern / Write Binary

Schreibt  binre  Daten  von der angegebenen Speicheradresse als Binr-File
auf Diskette.  Nach der Eingabe des Dateinamens fragt das Programm nach der
Start- und Endadresse:

        BEG>
        END>

BEG  ist  der  Start  des  zu speichernden Bereichs, END bezeichnet die
erste Adresse nach dem Bereich.
                                                                        (39)
        BEG>$70000
        END>$71000

schreibt beispielsweise $1000 = 4096 Bytes aus dem Speicher von $70000 an
in das Binr-File.

WO - Objektmodul speichern / Write Object

Wenn  ein  Programmtext  assembliert  wurde,  ist  es mit WO mglich, den
erzeugten  Code  als  ein  ausfhrbares Programm auf Diskette abzuspeichern
(auch   Loadfile  oder  Executable  genannt).   Wenn  Sie  ein  Linker-File
speichern wollen, knnen Sie WL (Write Linkfile) benutzen.

I - Einfgen / Insert

Dieser Befehl ermglicht es Ihnen, ein neues Stck Programmtext in einen im
Editor  befindlichen  Text einzufgen.  Der Name des im Editor befindlichen
Programmtextes  wird  dadurch  nicht  gendert.   Sehen Sie fr detailierte
Informationen unter R - Programmtext laden / Read nach.

U - Letzte Datei aktualisieren / Update file

Schreibt  eine im Editor befindliche Datei unter demselben Namen, unter dem
sie geladen wurde, auf Diskette; wie W (Write).

ZF - Datei lschen / Zap file

Lscht eine Datei von der Diskette.

ZI - Include-Speicher lschen / Zap Include memory

Include-Files  werden beim Assemblieren in den Speicher gelesen (siehe auch
unter  Assembler-Direktiven).   Um  wiederholte  Assemblierungen  zu  be-
schleunigen,  werden Sie danach im Speicher gehalten, um nicht jedesmal neu
nachgeladen   werden   zu  mssen.   Um  diesen  Speicher  zwischenzeitlich
freizugeben, knnen Sie ZI benutzen.
                                                                        (40)
WP - Preferences schreiben / Write preferences

Diese  Funktion  erzeugt die Datei ASM-ONE.Pref, die den Status der Flags
im  Men  Preferences enthlt.  Wenn Sie diese Datei in den Editor laden,
kann sie beispeilsweise so aussehen:

        -RS-L7+NL+AA+RL+WB

Sie knnen die Preferences-Datei ndern, so da sie mehr bewirkt, als nur
die Flags zu setzen.  Zum Beispiel wie folgt:

        -RS-L7+NL+AA+RL+WB\F\200\

Diese  Einstellung  belegt beim Start automatisch 200 KByte Fast-Memory als
Arbeitsspeicher.  Das Zeichen \ entspricht dabei einem Return.

=M - Zustzlichen Arbeitsspeicher belegen

Nehmen wir einmal an, da Sie 200 KByte Speicher als Arbeitsspeicher belegt
haben,  was  aber  nicht  ausreicht.   Mit  dieser  Funktion knnen Sie den
Arbeitsspeicher  nachtrglich  erweitern,  sofern  noch  ausreichend freier
Speicher,  angrenzend an den bereits reservierten, verfgbar ist.  Ist dies
jedoch  nicht mglich, mssen Sie ASM-ONE neu starten, um neuen Speicher zu
belegen.  Siehe dazu auch !  - Assembler beenden / Quit assembler.

! - Assembler beenden / Quit assembler

Wenn  Sie  diesen  Befehl  eingeben, stehen Ihnen zwei Mglichkeiten offen:
ASM-ONE  zu  verlassen  oder  neu  zu  starten.   In beiden Fllen wird der
belegte  Speicher wieder frei gegeben, und Ihr Text im Editor ist verloren.
Bei einem Neustart verhlt sich ASM-ONE, als ob er neu geladen wurde.
                                                                        (41)
        Editor:

T - Anfang des Textes (bzw. Zeile n)

Springt  zu  der  Zeilennummer,  die  nach T angegeben ist, ansonsten zum
Textbeginn.  Beispiele:

        T100            ; Springt zu Zeile 100
        T               ; Springt zum Anfang des Textes
        T-1             ; Springt zur letzten Zeile

L - Text suchen / Look for text

Sucht im Quelltext nach dem Text, der nach L angegeben ist. Beispiel:

        Lmove

sucht nach allen MOve-Befehlen im Programmtext.

Um nochmals nach demselben Begriff zu suchen, gengt die Eingabe von:

        L

ZL - Zeilen ab Cursor-Position lschen / Zap lines

Lscht  die  angegebene  Zahl  von Zeilen ab der aktuellen Cursor-Position.
Beispiel:

        ZL100           ; lscht 100 Zeilen von der Cursor-Position an.

        ZL-1            ; lscht alle Zeilen von der Cursor-Position an.
                                                                        (42)
P - Zeilen ab Cursor-Position ausgeben / Print lines

Gibt  von  der  Cursor-Position  an die Anzahl von Zeilen aus, die nach P
angegeben  wurde.   Um  diese Zeilen auf den Drucker auszugeben, whlen Sie
PrinterDump  im  Submen  Preferences  oder  drcken  Ctrl-P.  Infor-
mationen  zur  Installation  des  Druckertreibers  finden  Sie in Anhang A.
Beispiel:

        P100            ; gibt 100 Zeilen von der Cursor-Position an aus.
        P-1             ; gibt alle Zeilen nach der Cursor-Position aus.

        Memory:

M - Speicher editieren / Memory edit

Fgt Text oder Hexadezimalwerte an einer bestimmten Speicherstelle ein.

D - Disassemblieren / DisAssemble

Wechselt  in  den  Disassembler-Modus, der Ihnen einen Einblick in den Code
gibt.  Sie knnen, genauso wie bei Texten im Textmodus, hoch- und herunter-
scrollen,  springen  und  einzele  Befehle  ndern.   Wenn  Sie eine solche
nderung  rckgngig  machen wollen, reicht ein Druck auf Esc (siehe auch
Monitorfunktionen).
                                                                        (43)
H - Speicher hexadezimal anzeigen / HexDump

Wechselt  in  den Hexdump-Modus des Monitors.  Auch hier bekommen Sie einen
Einblick  in  die  Speicherbelegung  (hexadezimal  und im ASCII-Code).  Sie
knnen nach Belieben scrollen, springen und editieren.

Wenn   Sie   langwortweise  Werte  ndern  wollen,  ist  der  Befehl  M.L
interessanter,  da  Sie  damit  das  ganze Langwort auf einmal, anstatt nur
nibbleweise, ndern knnen (siehe auch hier Monitorfunktionen).

N - Speicher als ASCII-Text anzeigen / AsciiDump

Wechselt  in  den  ASCII-Modu  des  Monitors.   Sie knnen frei im Speicher
editieren,  der  in Reihen von je 64 ($40) Buchstaben angezeigt wird, indem
Sie  den  Cursor  auf  die  richtige  Stelle  bewegen  und  den Text normal
eingeben.

@D - Disassembliere zeilenweise / Disassemble Mem

Disassembliert  zwlf Zeilen Programmcode ab der angegebenen Adresse.  Wenn
keine  Adresse angegeben ist, wird mit der Disassemblierung bei der letzten
Adresse  fortgefahren.   Benutzen  Sie  die Funktion Disassemblierung ein-
fgen,  um  die so disassemblierten Code-Abschnitte in Ihr Programm einzu-
fgen.

@A - Assembliere zeilenweise / Assemble Mem

Assembliert Befehle direkt in den Speicher, wie bei den alten C64-Monitoren.

@N - ASCII-Dump zeilenweise / Ascii dump

Zum Einfgen eines ASCII-Dumps in Ihren Programmtext siehe auch bei Insert
ASCII Dump.
                                                                        (44)
@H - Hex-Dump zeilenweise / Hex dump

Zum  Einfgen  eines Hex-Dumps in Ihren Programmtext siehe auch bei Insert
Hex Dump.

S - Suchen / Search in memory

Die Eingabe geht wie folgt vor sich:

        >S
        BEG>$10000
        END>$20000

Nachdem  Sie  die  Start-  und Endadressen eingegeben haben, knnen Sie die
Daten eingeben, die Sie suchen wollen, also beispielsweise

        DATA>123 4321.l "HELLO" $5432.w %100101.b

Default beim Suchen ist die Byte-Gre.

F - Fllen / Fill memory

Seien  Sie  mit  diesem Befehl vorsichtig:  Wenn Sie den falschen Speicher-
bereich fllen, kann das Ihren Amiga zum Absturz bringen.

C - Kopieren / Copy memory

Kopiert  einen  Speicherbereich  an eine andere Adresse.  Auch hier sollten
Sie wie beim Befehl Fill vorsichtig sein.

Q - Vergleichen / Compare memory

Vergleicht zwei Speicherbereiche.  Wenn die Inhalte nicht gleich sind, wird
die Adresse des ersten ungleichen Bytes ausgegeben.
                                                                        (45)
        Einfgen:

ID - Disassemblierung einfgen / Insert DisAssemble

Dies  ist  ein sehr mchtiger Befehl, der es Ihnen ermglicht, den Speicher
zu  disassemblieren  und diesen Bereich direkt in Ihren Programmtext einzu-
fgen.  Der enue Code wir soweit wie mglich mit Labels versehen, damit Sie
ihn wie jeden anderen Programmtext direkt verwerten knnen.

IH - Hexadezimal einfgen / Insert Hexdump

Erlaubt Ihnen, einen Speicherbereich in Form von DC-Pseudo-Opcodes in Ihren
Programmtext einzubinden.

IN - ASCII einfgen / Insert Ascii

Erlaubt Ihnen, einen Textbereich als DC.B-String-Tabelle in Ihren Programm-
text  einzufgen.  Wenn Nicht-ASCII-Werte auftauchen, wird an dieser Stelle
das entsprechende Hex-Byte verwendet.

        Assembler:

A - Programmtext im Editor assemblieren

Der normale Assembler-Start, wie auf Amiga-Shift-A.

@A - Assemblieren im Speicher / Assemble to memory

Siehe hierzu die Memory-Sektion.

AO - Optimierend assemblieren / Assemble optimize

Assembliert  Ihren Programmtext normal, jedoch wird versucht, alle Branches
auf die krzere .S-Variante (Distanzangabe als Byte) zu optimieren.  Wenn
der Branch weiter als -128 bis +127 Bytes geht, wird er in einen Branch mit
Wortdistanz umgewandelt.
                                                                        (46)
AD - Mit Debug-Informationen assemblieren / Assemble debug

Assembliert  den Programmtext unter Erzeugung der Debug-Informationen.  Bei
aktiviertem Debugger wird automatisch auf diese Weise assembliert.

=S - Symboltabelle erzeugen / Symbol table print

Zeigt  Ihnen  nach der Assemblierung alle globalen Labels an.  Diese knnen
auch  auf dem Drucker ausgegeben werden, indem Sie die Option PrinterDump
aktivieren.   Die  Symboltabelle  wird  automatisch  erzeugt,  wenn Sie die
Option Listfile whlen.

        Monitor:

J - Subroutine anspringen / Jump to address

Springt  die  spezifizierte  Adresse  als  Subroutine an (per JSR).  Wenn
keine  Adresse  angegeben  ist, wird an den Start des Programms gesprungen.
Um zum Beispiel an das Label START zu springen, reicht die Anweisung

        >Jstart

G - Programm direkt starten / Go to address

Entspricht  dem  Befehl  J, allerdings kann den Programmlauf nur noch ein
Breakpoint  oder  ein  illegales  Kommando stoppen.  (g springt per JMP
statt JSR an die angegebene Adresse.)
                                                                        (47)
K - Einzelschrittmodus / Single step n steps

Fhrt  n Programmschritte vom aktuellen Programmzhler an im Einzelschritt-
modus  aus. In der  Beschreibung  des Debuggers wird diesem Thema mehr Raum
gewidmet.

X - Register anzeigen bzw. editieren

Kann in zwei verschiedenen Varianten angewendet werden:

        >X      ; Alle Register anzeigen
        >XD2    ; ein Register editieren (Hier: D2)

Wenn  Sie  X  alleine  eingeben,  werden  Ihnen  alle Register angezeigt,
inklusive  USP,  SSP,  SR  und PC.  Die Statusregister-Flags werden
auch   als   Buchstaben   angezeigt.   Alle  nderungen  seit  der  letzten
Registeranzeige  werden  invers  angezeigt  (in  der  Druckerausgabe unter-
strichen).

        Diskette:

RS - Sektor lesen / Read sector

Liest  einen  Sektor in den Speicher.  Eine Amiga-Diskette hat je 80 Spuren
auf  beiden Seiten, die jeweils in elf Sektoren unterteilt sind.  Das macht
80*2*11=1760  Sektoren zu jeweils 512 Byte.  Der Bootblock besteht aus zwei
Sektoren, beginnend mit Sektor 0.  Der Diskettenname befindet sich im Root-
Block  der  Diskette,  der sich normalerweise im Sektor 880 befindet.  Wenn
Sie  nun  den zwei Sektoren langen Bootblock vom Laufwerk DF1: an Adresse
$70000 in den Speicher einlesen wollen, geben Sie ein:
                                                                        (48)
        >RS1            ; Laufwerk 1
        RAM PTR>$70000  ; Zeiger auf RAM-Adresse
        DISK PTR>0      ; Nummer des ersten Sektors
        LENGTH>2        ; Anzahl der Sektoren

Eine  Einschrnkung  ist  zu beachten:  Daten aus direktem Diskettenzugriff
knnen nur ins Chip-Memory geladen werden.

RT - Spur lesen / Read track

Siehe RS

WS - Sektor schreiben / Write sector

Siehe RS

WT - Spur schreiben / Write track

Siehe RS

CC - Bootblock-Checksumme berechnen

Wie  unter  RS  erwhnt,  ist  der Boot-Block 1024 Byte lang und wird vom
System zuerst geladen.  Die Informationen des Boot-Blocks teilen dem System
mit, von welcher Art die Diskette ist.  (Kickstart, DOS\0 (Old File System)
oder DOS\1 (Fast File System)).

Der  Boot-Block  kann  auch ein Programm enthaten.  Um festzustellen, ob es
ausfhrbar  ist, berprft das System eine Checksumme.  Mit CC knnen Sie
diese  Checksumme  (zum  Beispiel nach nderungen) neu berechnen.  Dies ist
ntzlich,  wenn  Sie  einen eigenen Boot-Block auf die Diskette installiert
haben.

Um beispielsweise die Checksumme fr den Bootblock auf DF1: zu berechnen,
geben Sie ein:

        >CC1
                                                                        (49)
E - Externe Dateien laden / Extern files load

Dateien,  die im Programmtext mit einer Extern-Direktive markiert wurden,
werden  nachgeladen,  wenn Sie E eingeben.  Wenn Sie nur einige bestimmte
externe  Dateien  nachladen  wollen, knnen Sie hinter dem Befehl noch eine
Nummer angeben.  Nhere Informationen finden Sie unter Extern-Direktive.

V - Verzeichnis anzeigen / View directory

Zeigt  das Verzeichnis von dem nach V angegebenen Pfad an.  Dieser Befehl
ist  ntig,  weil  Sie  sonst bei abgeschalteter Req-Library keine andere
Mglichkeit  htten, um herauszufinden, was sich auf der Diskette befindet.
Wenn  Sie  beispielsweise den Inhalt der Diskette in DF0: wissen mchten,
geben Sie

        VDF0:

ein.   Wenn  Sie das Verzeichnis nicht angezeigt haben mchten, sondern nur
das  Hauptverzeichnis  wechseln  wollen, geben Sie ein Leerzeichen zwischen
Befehl und Pfad an.

        V DF0:

Wenn Sie sich das letzte angezeigte Verzeichnis nochmals in sortierter Form
ansehen mchten, reicht ein einfaches V.
                                                                        (50)
        Sonstige:

> - Ausgabe umleiten / Specify Output

Sie  knnen  diesen Befehl benutzen, um die Ausgabe des Programms auf einen
Drucker oder in eine Datei umzuleiten.  Wenn Sie als Datei ausgeben, erhlt
diese  die Extension .TXT.  Eine so erzeugte Datei ist ein Standard-Text-
file  und  kann  in  den Editor geladen werden.  Um eine solche Datei- oder
Druckerausgabe  zu beenden, mssen Sie den Befehl lediglich erneut (nun mit
einem leeren Ausgabepfad) eingeben.

Wenn  Sie  den  auf  den Bildschirm ausgegebenen Text ine eine Datei namens
DIARY speichern mchten, schreiben Sie

        >>
        FILENAME>DIARY

Um  die  Ausgabe  zu  beenden,  geben Sie beim nochmaligen Befehl lediglich
Return bei der Abfrage des Dateinamens ein.

? - Numerischen Ausdruck berechnen / Calculate value

Sie   knnen   mit  dieser  Funktion  alle  blichen  Operatoren  und  alle
definierten   Labels   verwenden.   Das  Resultat  wird  in  hexadezimaler,
dezimaler, binrer und in ASCII-Darstellung ausgegeben.

Um die Summe von 123 und 321 zu berechnen, schreiben Sie

        >?123+321

Um das Quadrat von D0 zu berechnen, schreiben Sie

        >?d0*d0
                                                                        (51)
                                                                        (52)
7.  Der Assembler

Der Assembler von ASM-ONE ist einer der schnellsten auf dem Markt.  ASM-ONE
assembliert mit einer Geschwindigkeit von 50000 bis 70000 Zeilen pro Minute
auf einem Standard-Amiga.  Er ist kompatibel zum Metacomco-Makro-Assembler,
wodurch  Sie  auch  alte Programmcodes ohne Probleme mit ASM-ONE bersetzen
knnen.

Haben  Sie  einen  Programmtext  in  den Editor eingelesen, starten Sie den
Assembliervorgang    durch    Assemble   im   Men   Assembler,   durch
Amiga-Shift-A oder folgende Eingabe in der Kommandozeile:

        >A

Wenn  beim  Assemblieren ein Fehler auftritt, werden Ihnen die Zeilennummer
und der Inhalt der fehlerhaften Zeile sowie eine Fehlermeldung ausgegeben.

Sie knnen die Assemblierung mit Ctrl-C vorzeitig beenden.

Mit folgenden Optionen, die als Flags gesetzt werden, lt sich der Vorgang
der Assemblierung beeinflussen:

        1 - Listfile erzeugen
        2 - Seitenweise anzeigen
        3 - Seitenweise stoppen
        4 - Alle Fehler anzeigen
        5 - Debug
        6 - Label:
        7 - UCase=LCase
                                                                        (53)
Im einzelnen bedeuten die Flags folgendes:

(1)  Wenn  Sie dieses Flag setzen wird ein Listfile erzeugt.  Die Falgs (2)
und (3) beeinflussen die Ausgabe dieses Listfiles.

(2) und (3) Siehe Falg (1).

(4)  Wenn  dieses  Flag  gesetzt  ist,  assembliert  ASM-ONE  den  gesamten
Programmtext,  ohne  beim  ersten  Fehler  zu  stoppen.  Der Assembler gibt
Fehlerzeilen  und  Fehlermeldungen  wie  gewohnt  aus, fhrt jedoch mit der
Assemblierung   fort.    Sie   knnen  diese  Fehlerliste  mit  der  Option
PrinterDump zu Papier bringen (Ctrl-P).

(5)  Dieses  Flag  aktiviert  die Option Debug.  Hierdurch wird zwar mehr
Speicher  bentigt,  aber wenn Sie den Debugegr hufig benutzen, knnen Sie
ohne neue Assemblierung in den Debugger wechseln.

(6)  It  dieses  Flag gesetzt, mssen alle Labels mit einem Doppelpunkt :
enden.  Der Vorteil dieses Verfahrens ist, da die Assembler-Befehle direkt
in der ersten Spalte beginnen knnen.

Da  einige Assembler dieses Verfahren verwenden, knnen Sie einen Quellcode
von einem solchen Assembler auch mit ASM-ONE bersetzen.

(7)  Dieses  Flag  ist  normalerweise gesetzt.  Sie knnen es deaktivieren,
wenn  der  Assembler strikt zwischen Gro- und Keinschreibung unterscheiden
soll.

Ist  ein  Programm  fertig  assembliert,  knne  Sie  es  als  Executable
speichern,  indem  Sie die Funktion WO (Write Object) nutzen.  Wenn Sie
externe  Referencen  in  ihrem  Programm  angegeben  haben,  mssen Sie das
Programm mit WL als Linkfile speichern und anschliessend noch linken.
                                                                        (54)
7.1 Programme

Jede Zeile Ihres Quelltextes mu einem der folgenden Typen entsprechen:

        1 - Leere Zeile oder Kommentar
        2 - Befehl (Opcode)
        3 - Assembler-Steuerungsdirektive (Pseudo-Opcode)

Einige Beispiele fr Kommentare:

(A)  Eine  Zeile, die mit einem Sternchen beginnt, ist eine Kommentarzeile.
Zum Beispiel:

        * Dies ist mein Programm

(B)  Ein  Semikolon  ; an beliebiger STelle deklariert den Rest der Zeile
als Kommentar.  Zum Beispiel:

        subq.l  #1,d0           ; Rest = Rest -1
        cmp.l   d1,d0           ; gleich ?

(C)  Ein  Text-String,  der  einem  kompletten  Befehl oder einer Direktive
folgt, ist ein Kommentar:  Zum Beispiel:

        moveq   #0,d0           Zhler lschen

Im allgemeinen folgt eine Zeile dieser Struktur:

        [<Label>] <Opcode> [<Operanden[,<Operand>]...] [<Kommentar>]

Wie Sie sehen, lt sich eine Zeile in Felder unerteilen.

        Label   Opcode  Operanden       Kommentar

Die  Felder  mssen  mit  einem  oder mehreren Leerzeichen oder Tabulatoren
getrennt sein.
                                                                        (55)
7.1.1 Das Label-Feld

Ein Label ist ein vom Benutzer definiertes Symbol und beginnt entweder

        1. in der ersten Spalte
        2. oder in einer anderen Spalte, wenn es auf : endet

Labels  wird  die  Adresse  des  ersten  Bytes  der  folgenden  Instruktion
zugewiesen.   Zwei  Labels  darf  nicht  der  selbe Name zugewiesen werden,
andernfalls wird ASM-ONE die Fehlermeldung doppeltes Symbol ausgeben:

        ** Double Symbol

        Lokale Labels:

Ein  lokales  Label entspricht einem normalen Label, ist dem Assembler aber
nur in einem Teil des Programms bekannt.  Ein lokales Label wird ebenso wie
ein  globales  Label  definiert, jedoch mit einem Punkt als erstes Zeichen,
wie zum Beispiel

        .label1

Ein lokales Label darf nur zwischen dem ihm vorangehenden und dem folgenden
globalen Label angesprochen werden.  Ein Beispiel dafr:

        Label   Opcode  Operanden       Kommentar

        clear   moveq   #0,d0
                moveq   #100-1,d1
                lea     memory,a0       ; Zu lschender Speicher
        .loop   move.l  d0,(a0)+
                dbf     d1,.loop
        end     rts
                                                                        (56)
In  diesem  Beispiel  ist  das  lokale Label nur zwischen clear und end
bekannt,  so  da Sie .loop so auch an anderen Stellen in Ihrem Quelltext
verwenden knnen.

7.1.2 Das Befehlsfeld

Ein  Befehl  darf nicht in der ersten Spalte beginnen, es sei denn, da Sie
das  entsprchende  Label-Flag  (6)  bei  der Assemblierung setzen.  Ihm mu
mindestens  ein  Leerzeichen  oder ein Tabulator oder ein von einem solchen
gefolgtes Label vorangehen.

Der  Befehl ist entweder ein vor- oder benutzerdefiniertes Symbol.  Mglich
sind:

        1) ein Motorola-MC68000-Assembler-Befehl
        2) eine Assembler-Direktive
        3) ein Makro-Befehl

Dem  Befehl darf eine Grenangabe folgen.  Eine Grenangabe kann eine der
folgenden sein:

        .B      - Byte-Operand
        .W      - Wort-Operand
        .L      - Langwort-Operand

Bei Branches:

        .W      - Branch mit 16-Bit-Offset (auch .L fr Long Branch)
        .B      - Branch mit 8-Bit-Offset (auch .S fr Short Branch)

Anmerkung  des  bersetzers:   Die  alternativen .L und .S sind nur aus
Kompatibilittsgrnden  zu  lteren  Assemblern implementiert.  In Hinblick
auf  Aufwrtskompatibilitt  zu  Assemblern  fr  68020/30  und hhere Pro-
zessoren,  sollten Sie in Ihren Programmtexten auf .L verzichten, das auf
68020-Assemblern einen relativen Branch mit 32-Bit-Offset bezeichnet.
                                                                        (57)
Bei  der Grenangabe mu darauf geachtet werden, da der zugehrige Befehl
diese  untersttzt.  Adreregister lassen sich beispielsweise nur wort- und
langwortweise, nicht aber byteweise ansprechen.

7.1.3 Das Operandenfeld 

Dieses   Feld  kann  je  nach  Befehl  nur  einen  oder  mehrere  Operanden
beinhalten.  Jeder Operand mu dabei durch mindestens ein Leerzeichen, oder
einen  Tabulator vom Befehl getrennt sein, und jeder Operand wird mit einem
Komma  vom  vorhergehenden  getrennt.   Diesem Komma drfen in einer Erwei-
terung  des  Motorola-Standards  noch  weitere Leerzeichen oder Tabulatoren
folgen, da es oftmals angenehm ist, die Operanden in Spalten zu gruppieren.

Anmerkung  des  bersetzers:   Verwenden Sie dieses Feature nicht, wenn Ihr
Quelltext auch auf anderen Assemblern als ASM-ONE bersetzt werden soll.

7.1.4 Kommentare

Nach  einem syntaktisch korrekten und mit mindestens einem Leerzeichen oder
Tabulator beendeten Kommando wird alles weitere als Kommentar angesehen.

Anmerkung des bersetzers:  Die meisten anderen Assembler als ASM-ONE geben
in  diesem  Fall  einen  Fehler  aus.  Sie sollten daher eventuell folgende
Kommentare dennoch mit einem Semikolon beginnen.
                                                                        (58)
7.1.5 Terme

Ein  Term  ist  eine  Kombination  von algebraischen Operatoren, Operanden,
Konstanten   und  Klammern.   Er  kann  einen  konstanten,  relativen  oder
booleschen  Wert  annehmen.   In  letzterem  Fall  wird  Wahr durch -1,
Falsch durch 0 reprsentiert.

ASM-ONE kennt folgende Operatoren:

        1. Vorzeichenminus, logisches Nicht     -, ~
        2. Links-rechts-Verschiebung, Potenz    <<, >>, ^
        3. Logisches Uns, Oder, Exklusiv-Oder   &, !, ~
        4. Multiplikation, Division             *, /
        5. Addition, Subtraktion                +, -
        6. Vergleichsoperatoren                 >, >=, =, <=, <, <>

Bei  der  Auswertung  eines  Terms werden die Operatoren in der Reihenfolge
ihrer  Prioritt  behandelt.   In  der  vorausgegangenen  Liste  haben  die
niedrigsten Nummern die hchste Prioritt.

Um  diese Reihenfolge zu ndern, knnen Sie Klammern benutzen, wobei sowohl
eckige als auch runde Klammern erlaubt sind.

Anmerkung  des  bersetzers:   Die  eckigen  Klammern  sind zwar aus Kompa-
tibilittsgrnden  zulssig,  sollten  aber  nicht  verwendet  werden.  Zum
Beispiel

        [1+2]*3 = 9     oder    (1+2)*3 = 9

        aber

        1+2*3 = 7
                                                                        (59)
        Operanden oder Symbole:

Ein  Symbol ist ein String, der aus bis zu 100 Zeichen bestehen darf, wobei
jedes  einzelne einem der vier folgenden Typen zugehren mu.  Einzige Ein-
schrnkung  ist,  da jeweils der erste nur aus den Gruppen 1 bis 3 stammen
darf.

 1.  Buchstabe  von  A  bis  Z und a bis z; strikte  Unterscheidung
zwischen Gro- und Kleinbuchstaben ist optional ber ein Flag aktivierbar.

 2.  Unterstrich _

 3.  Punkt .

 4.  Ziffer von 0 bis 9

Symbole,  die  mit einem Punkt beginnen, werden als lokale behandelt (siehe
Lokale  Labels).   Ein  Symbol  kann  in  einer  der  folgenden Varianten
definiert werden.

        Absoluter Wert:

        EQU     - Das Symbol wird mit einem absoluten Wert gleichgesetzt.
        SET     - Das Symbol wird als absoluter Wert definiert.
        RS      - Definiert Offsets in Strukturen.
        <Label> - Das Symbol wird als Label in einem absoluten Programm
                  genutzt (ein Programm, das die Direktive ORG nutzt, ist
                  absolut).

        Relativer Wert:

        EQU     - Das Symbol wird mit einem relativen Wert gleichgesetzt.
        SET     - Das Symbol wird als reltiver Wert definiert.
        <Label> - Das Symbol wird als Label genutzt.
                                                                        (60)

        Registersymbole:

        EQUR    - Das Symbol wird mit einem Register gleichgesetzt.
        REG     - Das Symbol wird mit einer Registerliste gleichgesetzt.

        Zahlen:

Auch  Zahlen knnen wie jedes andere Konstantensymbol in Termen auftauchen.
Es  gibt  fnf  verschiedene Darstellungsweisen von numerischen Werten, zum
Beispiel:

        1. Dezimal      1234, -234
        2. Hexadezimal  $fab, -$fc
        3. Oktal        @176
        4. Binr        %1001001
        5. ASCII        'abcd', "abcd", `abcd`

ASCII-Strings  mit  weniger  als  vier  Zeichen  werden rechtsbndig inter-
pretiert.  Um Anfhrungszeichen in einem ASCII-String zu verwenden, sollten
Sie  sie  wie folgt in eins der beiden anderen Anfhrungszeichen einbetten,
oder einfach doppelt schreiben:

        Aus     '	wird	"'"      oder    `'`
        aus     "	wird	'"'      oder    `"`
        und aus `       wird    "`"     oder    '`'
                                                                        (61)
7.2 Direktiven

Die  Assembler-Direktiven (auch Pseudo-Opcodes genannt) sind keine Befehle,
die  Code erzeugen, sondern Anweisungen an den Assembler, Einzige Ausnahmen
sind DC und DCB.

Die Direktiven im berblick

        Zur Assemblierungskontrolle:

        SECTION         Beginn einer Programmsektion
        RORG            Relativer Programmstart
        ORG             Absoluter Programmstart
        LOAD            Ladeadresse (absolut) setzen
        OFFSET          Definiert Offsets
        ENDOFF          Beendet Offset-Tabelle
        END             Beendet Programm
        BASEREG         Setzt Basisregister

        Zur Datendefinition:

        DC              Definiert Konstante
        DCB             Definiert Konstantenblock
        DS              Defniert Freiram fr Variablenspeicherung
        BLK             Block (siehe DCB)
        DR              Definiert relativen Wert
                                                                        (62)
        Symboldefinition:

        EQU             Weist dauerhaften Wert zu
        SET             Weist temporren Wert zu
        EQUR            Weist Register zu
        REG             Weist Registerliste zu
        RS              Weist relativen Wert zu
        RSRESET         Setzt Zhler fr relative Offsets zurck
        RSSET           Setzt Zhler fr relative Offsets

        Makro-Direktiven:

        MACRO           Beginnt eine Makro-Definition
        NARG            Spezielles Symbol (Zahl der Parameter)
        ENDM            Beendet Makro-Definition
        MEXIT           Verlt Makro
        CMEXIT          Verlt Makro, wenn Rekursionstiefe erreicht
        REPT            Beginnt Code-Wiederholung
        ENDR            Beendet Code-Wiederholung
                                                                        (63)
        Bedingte Assemblierung:

        CNOP            Bedingtes NOP zur ausrichtung an Wort- oder
                        Langwortgrenzen
        EVEN            Erzwingt Fortsetzung auf gerader Adresse
        ODD             Erzwingt ungerade Adresse
        IFEQ            Assembliert, wenn Term  = 0     (EQual)
        IFNE            Assembliert, wenn Term <> 0     (Not Equal)
        IFGT            Assembliert, wenn Term  > 0     (Greater Than)
        IFGE            Assembliert, wenn Term >= 0     (Greater or Equal)
        IFLT            Assembliert, wenn Term  < 0     (Less Than)
        IFLE            Assembliert, wenn Term <= 0     (Less or Equal)
        IF              Assembliert, wenn Term logich wahr
        IFC             Assembliert, wenn Strings identisch sind
        IFNC            Assembliert, wenn Strings nicht identisch sind
        IFD             Assembliert, wenn Symbol definiert ist
        IFND            Assembliert, wenn Symbol nicht definiert ist
        IFB             Assembliert, wenn leer
        IFNB            Assembliert, wenn nicht leer
        IF1             Assembliert, wenn in Pass1
        IF2             Assembliert, wenn in Pass2
        ELSE            Alternativer Code, wenn Bedingung nicht erfllt
        ENDC            Beendet IF-Block
                                                                        (64)
        Ausgabekontrolle:

        PAGE            Beginnt neue Seite im Listfile
        NOPAGE          Schaltet Seitentrennung ab
        LIST            Aktiviert Listing
        NOLIST (NOL)    Beendet Listing
        LLEN            Setzt Zeilenlnge
        PLEN            Setzt Seitenlnge (Zeilenzahl)
        SPC             Erzeugt n leere Zeilen
        TTL             Setzt Programmtitel
        FAIL            Generiert Assembler-Fehler
        MASK2           (nur aus Kompatibilittsgrnden implementiert)
        PRINTT          Gibt String auf dem Bildschirm aus
        PRINTV          Ausgabe eines Wertes auf dem Bildschirm

        Externe Symbole:

        XDEF            Externe Definition
        XREF            Externe Referenz
        ENTRY           Siehe XDEF
        EXTRN           Siehe XDEF
        GLOBAL          Siehe XDEF
                                                                        (65)
        Allgemeine Direktiven:

        JUMPPTR         Setzt Startpointer
        INCBIN          Binrfile einfgen
        IMAGE           Siehe INCBIN
        INCLUDE         Sourcefile einfgen
        INCDIR          Pfad fr Includes eingeben
        >EXTERN         Daten-File laden
        IDNT            Programm benennen
        AUTO            Automatische Befehlsausfhrung
                                                                        (66)
7.2.1 Direktiven zur Assemblierungskontrolle

SECTION Beginn einer Programmsektion

Syntax: [<Label>] SECTION <NAME>[,<Typ>]

Diese  Direktive  erzeugt  eine  neue  Sektion  mit der Kennung Name, der
Programmzhler wird auf 0 gesetzt.  Falls <Name> bereits verwendet wurde,
wir der Programmzhler auf das Ende dieser Sektion gesetzt.

<Name>  ist ein String, der optional in Anfhrungsstriche gesetzt werden
        kann.
<Typ>   mu, wenn angegeben, einer der folgenden sein:

        CODE    erzeugt eine Sektion relozierbaren Codes
        DATA    erzeugt eine Sektion initialisierter Daten
        BSS     erzeugt eine Sektion nicht initialisierter Daten

Um  den erzeugten Programmteilen bereits beim Laden einen Speichertyp zuzu-
weisen, knnen die obigen Typen noch wie folgt erweitert werden:

        DATA_C  plaziert Daten im Chip-Memory
        DATA_F  plaziert Daten im Fast-Memory

Aus  Kompatibilittsgrnden  ist  auch  die  Extension  _P vorhanden, die
jedoch  keinen  expliziten  Speicher anfordert, also dem Typ ohne Extension
entspricht.  Analog knnen die Erweiterungen auch bei CODE und BSS ver-
wendet  werden.   Die explizite Angabe von Fast-Memory ist jedoch nicht un-
problematisch,  da  solche  Programme  auf  Rechnern ohne Fast-Memory nicht
laufen.  Benutzen Sie diese Angabe nur,
                                                                        (67)
wenn Sie fr das Programm unbedingt auf Fast-Memory angewiesen sind.

Fr  Sektionen,  die  die  Extension  _F  oder  _C  tragen, werden beim
Assemblieren  automatisch  entsprechende Speicherbereiche belegt, damit Sie
das  Programm  unmittelbar  testen  knnen.  Wenn das nicht automatisch bei
jedem   Assemblieren   eingestellt  werden  soll,  knnen  Sie  die  Option
AutoAlloc im Men Preferences ausschalten.

Sie  knnen  bis  zu 255 Sektionen erzeugen.  Als Default (Voreinstellung),
wenn  keine  Sektionsdirektive  das Programm einleitet, beginnt ASM-ONE mit
einer Code-Sektion namens TEXT.

Dem  Label,  das  der  Direktive  optional vorangehen darf, wird, wenn vor-
handen, die Startadresse der neuen Sektion zugewiesen.

RORG Relativer Programmstart

Syntax: [<Label>] RORG <AbsWert>

Diese  Direktive  modifiziert  den  Programmzhler  so,  da  er danach die
entsprechende  Anzahl Bytes hinter dem Sektionsbeginn zeigt, vorausgesetzt,
da AbsWert nicht kleiner als der aktuelle Offset war.

Dem Label wird, wenn vorhanden, der neue Wert des Programmzhlers zugewiesen.
                                                                        (68)
ORG Absoluter Programmstart

Syntax: [<Label>] ORG <AbsWert>

Diese Direktive setzt den Programmzhler auf den angegebenen absoluten Wert.

WARNUNG:   Der Amiga ist ein Multitasking-System, in dem theoretisch alles,
auer  der  Execbase  an  Adresse 4, auch an beliebigen Adressen liegen
kann.   Diese  Direktive sollte daher nur in begrndeten Ausnahmefllen und
auf  eigenes  Risiko eingesetzt werden.  Der Vorteil absoluter Adressierung
ist,  da Sie genau wissen, an welchen Adressen Ihr Programm und Ihre Daten
liegen.   Viele Hardware-orientierte Spiel- und Demo-Programmierer arbeiten
daher mit dieser Direktive.

LOAD Ladeadresse (absolut) setzen

Syntax: [<Label>] LOAD <AbsWert>

Diese  Direktive  ndert  die  Ausgabeadresse des assemblierten Codes.  Das
erlaubt  Ihnen,  ein Programm fr eine absolute Adresse zu assemblieren und
an eine andere abzulegen.  Fr weitere Einzelheiten siehe ORG.
                                                                        (69)
OFFSET Definiert Offsets

Syntax: [<Label>] OFFSET <AbsWert>

Die Direktive OFFSET beginnt eine Offset-Definition. Ein Beispiel:

        start   OFFSET  100
        dat0    ds.b    1
        dat1    dc.b    9
                ENDOFF

Dem   Label   start   wird   die  Startadresse  dieser  Offset-Definition
zugewiesen.   dat0  erhlt den Wert <AbsWert> = 100 und dat1 den Wert
dat0 +1 = 101.

Auch  die Daten werden hierbei in der aktuellen Sektion abgelegt.  In Ihrem
Quelltext knnen Sie die oben definierten Offsets wie folgt verwenden:

                lea     start,a4
                move.b  dat0(a4),d0
                lea     dat1(a4),a0
        .loop   clr.b   (a0)+
                dbf     d0,.loop

Der  Zugriff  auf Daten wird auf diese Weise schneller und krzer, da diese
Variante fr jeden Zugriff auf die Daten zwei Byte weniger Code braucht und
zustzliche  vier  Byte  in  der  Relozierungstabelle  spart.  Eine Offset-
Definition wird durch eine der folgenden Direktiven beendet:

        ENDOFF
        SECTION
        OFFSET
        END
                                                                        (70)
ENDOFF Beendet Offset-Tabelle

Syntax: [<Label>] ENDOFF

Siehe OFFSET.

END Beendet Programm

Syntax: [<Label>] END

Markiert  das Ende Ihres Quelltextes.  Wenn der Direktive END nichts mehr
folgt,  kann  sie  auch entfallen.  Andere Assembler erwarten die Direktive
END aber unter Umstnden zwingend.

BASEREG Setzt Basisregister

Syntax: [<Label>] BASEREG <Label2>,An

Definiert ein Register als Basisregister.  Davon werden die beiden
Adressierungsarten

        nn(An)  und     nn(An,Rn.s)

beeinflut.  Normalerweise ist nn hier eine vorzeichenbehaftete 16-Bit-
Ganzzahl.

Wenn  An  aber mit BASEREG als Basisregister definiert wurde, wird nn
als Offset von dieser Adresse angesehen.  Das folgende Beispiel

                        lea     DataArea,A4
                        move.w  d0,DataWord-DataArea(A4)
                        ---
        DataArea:       dcb.b   100
        DataWord:       dc.w    0
                                                                        (71)
lt sich unter Verwendung der Direktive BASEREG wie folgt schreiben:

                        BASEREG DataArea,A4
                        lea     DataArea,A4
                        move.w  d0,DataWord(A4)
                        ---
        DataArea:       dcb.b   100
        DataWord:       dc.w    0

Auf  diese  Weise  ist  es  viel  einfacher, ein Adreregister als globalen
Zeiger  auf  einen Datenbereich zu verwenden.  Alle Adreregister stehen zu
diesem  Zweck  (zum Beispiel fr verschiedene Datenbereiche) zur Verfgung,
allerdings  knnen Sie nach einmaliger Belegung im Quelltext nicht mehr neu
definiert werden.

Normalerweise  verwendet  man  eine BSS-Sektion, um Daten abzulegen.  Auf
diese  Weise  gewinnen  Sie  einen schnelleren und krzeren Zugriff auf die
dortigen Daten (A4 wird auch von C-Compilers normalerweise als Zeiger auf
den Datenbereich genutzt).
                                                                        (72)
7.2.2 Direktiven zur Datendefinition

DC Definiert Konstante

Syntax: [<Label>] DC[.Size] <Exp>[,<Exp>[...]]

Diese  Direktive  leitet eine Konstantendefinition ein.  Sie kann von einer
oder  mehreren  Zahlen gefolgt sein, die dadurch direkt in den Speicher ab-
gelegt werden.  Gltige Grenangaben sind:

        .B      - Byte
        .W      - Word          ; Wortgre ist gleichzeitig Default
        .L      - Long

Wenn  als  Gre  Byte  angegeben ist, knnen Sie auch Strings direkt und
ohne Kommata zwischen den Buchstaben angeben:

        DC.B    'Hallo, wie gehts ?'

Bei DC.W und DC.L werden ASCII-Werte rechtsbndig in ein Feld der ange-
gebenen Gre bertragen.

Wenn Sie Daten wort- oder langwortweise an einer ungeraden Adresse angeben,
erzeugt  der Assembler eine Warnung und pat die Adresse automatisch an die
folgende gerade Adresse an.

Um  die  Warnung  zu  vermeiden  und  zu  anderen  Assemblern kompatibel zu
bleiben,  die  in einer solchen Situation teilweise mit einer Fehlermeldung
abbrechen, sollten Sie die Direktive EVEN nutzen.
                                                                        (73)
DCB Definiert Konstantenblock

Syntax: [<Label>] DCB[.Size] <AbsWert>,<Wert>

Die Direktive erlaubt Ihnen, einen Block, der <AbsWert> Elemente enthlt,
zu definieren.  Jedes der Elemente hat die <Size> entsprechende Gre und
wird mit dem Wert <Wert> initialisiert.  Gltige Gren sind:

        .B      - Byte
        .W      - Word          ; Wortgre ist gleichzeitig Default
        .L      - Long

Wenn Sie Daten wort- oder langwortweise an einer ungeraden Adresse angeben,
erzeugt  der Assembler eine Warnung und pat die Adresse automatisch an die
folgende  gerade  Adresse  an.   Um die Warnung zu vermeiden und zu anderen
Assemblern  kompatibel zu bleiben, die in einer solchen Situation teilweise
mit einer Fehlermeldung abbrechen, sollten Sie die Direktive EVEN nutzen.

DS Definiert Freiraum fr Variablenspeicherung

Syntax: [<Label>] DS[.Size] <AbsWert>

Die  Direktive  DS  erlaubt  Ihnen, einen Block, der <AbsWert> Elemente
enthlt,  zu definieren.  Jedes der Elemente hat die <Size> entsprechende
Gre,  wird  jedoch  nicht  mit  einem Wert initialisiert.  Gltige Gren
sind:

        .B      - Byte
        .W      - Word          ; Wortgre ist gleichzeitig Default
        .L      - Long

Wenn Sie Daten wort- oder langwortweise an einer ungeraden Adresse angeben,
erzeugt  der Assembler eine Warnung und pat die Adresse automatisch an die
folgende gerade.
                                                                        (74)
Adresse  an.   Um die Warnung zu vermeiden und zu anderen Assemblern kompa-
tibel zu bleiben, sollten Sie die Direktive EVEN nutzen.

BLK Block (siehe DCB)

Syntax: [<Label>] BLK[.Size] <AbsWert>,<Wert>

Diese  Direktive  wurde  implementiert,  um  die Kompatibilitt mit einigen
Nicht-Standard-Assemblern  zu erhalten.  In Programmen, die sie mit ASM-ONE
schreiben, sollten Sie statt dessen DCB verwenden.

DR Definiert relativen Wert

Syntax: [<Label>] DR[.Size] <Wert>

Die  Direktive  DR  erlaubt  Ihnen, relative Werte zu definieren.  Der im
Speicher abgelegte Wert ist hierbei

        <Wert>-*        (* = current address)

Die  Gre  dieses  Wertes wird nochmals mit der angegeben Ge verglichen,
wobei  geprft  wird,  ob  er sich im zulssigen Wertebereich fr eine vor-
zeichenbehaftete  Ganzzahl  der  angegeben Gre befindet.  Ein Anwendungs-
beispiel:

        JUMP    LEA     DATA(pc),A0
                ADD.W   D0,D0
                ADD.W   D0,A0
                ADD.W   (A0),A0
                JMP     (A0)

        DATA    DR.W    ROUTINE_PRINT   ; D0 = 0
                DR.W    ROUTINE_CLEAR   ; D0 = 1
                                                                        (75)
Die Routine JUMP springt zu der Routine, deren Nummer in D0 steht.

Gltige Gren sind:

        .B      - Byte
        .W      - Word          ; Wortgre ist gleichzeitig Default
        .L      - Long

Wenn Sie Daten wort- oder langwortweise an einer ungeraden Adresse angeben,
erzeugt  der Assembler eine Warnung und pat die Adresse automatisch an die
folgende gerade Adresse an.

Um  die  Warnung  zu  vermeiden  und  zu  anderen  Assemblern kompatibel zu
bleiben,  die  in einer solchen Situation teilweise mit einer Fehlermeldung
abbrechen, sollten Sie die Direktive EVEN nutzen.

7.2.3 Direktiven zur Symboldefinition

EQU Weist dauerhaften Wert zu

Syntax: <Label> EQU <Wert>

Diese  Direktive  weist  dem Label <Label> einen Wert zu.  <Label> kann
nun als konstanter Wert in anderen Termen verwendet werden.

Diese Direktive entspricht dem Statement =.
                                                                        (76)
SET Weist temporren Wert zu

Syntax: <Label> SET <Wert>

Diese  Direktive  weist  einem Label ebenfalls einen Wert zu.  Dieses Label
kann  nun  ebenso  wie  ein mit EQU definiertes als Symbol in Gleichungen
verwendet, jedoch anders als ein solches auch neu definiert werden.

Anmerkung:  Sie sollten keine Vorwrtsreferenzen zu einem SET-Symbol ver-
wenden.

EQUR Weist Register zu

Syntax: <Label> EQUR <Rn>

Diese  Direktive  erlaubt,  einem  Register  einen symbolischen Namen zuzu-
weisen.   Sie knnen dies verwenden, wenn Sie kritische Bereiche Ihres Pro-
gramms bearbeiten, in denen sie viele Register verwenden.  Zum Beispiel:

        Bitplane1       EQUR    A3
                        MOVE.L  d0,(BitPlane1)+

Der  Name BitPlane1 kann nicht neu definiert werden, es ist aber mglich,
einem Register mehrere Namen zu geben.

Anmerkung: Sie haben hierbei nur die Daten- und Adreregister zur Verfgung.
                                                                        (77)
REG Weist Registerliste zu

Syntax: <Label> REG <Liste>

Diese  Direktive  wird  hnlich  wie  die Direktive EQUR angewendet, doch
knnen  Sie  hiermit einer Registerliste einen Namen zuweisen, wie sie beim
Befehl MOVEM verwendet wird.  Zum Beipiel:

        AllRegs         REG     D0-A6
                        MOVEM.L AllRegs,-(A7)

Der  Name  AllRegs kann auch hier nicht neu definiert werden, es ist aber
ebenfalls  mglich, derselben Registerliste mehrere Namen zu geben.

Anmerkung:  Sie haben auch hierbei nur die Daten- und Adreregister zur
Verfgung.

RS Weist relativen Wert zu

Syntax: [<Label>] RS[.Size] <AbsWert>

Die  Direktive  RS  weist  dem  Label  den  derzeitigen  Wert  des Assem-
bler-internen  RS-Zhlers  zu.  Anschlieend wird der Wert zu RS addiert.
Benutzen  Sie,  um RS zu lschen, die Direktive RSRESET.  Die Direktive
RS  gibt  Ihnen eine schnelle und einfache Methode, Listen und Offsets zu
definieren, beispielsweise Library-Offsets:

                RSRESET
                RS.B    -30     ; Startwert
        Open    RS.B    -6
        Close   RS.B    -6
        Read    RS.B    -6
        Write   RS.B    -6
        Input   RS.B    -6
        Output  RS.B    -6
                                                                        (78)
RSRESET Setzt Zhler fr relative Offsets zurck

Syntax: [<Label>] RSRESET

Eine genaue Beschreibung finden Sie beid der Direktive RS

RSSET Setzt Zhler fr relative Offsets

Syntax: [<Label>] RSSET <AbsWert>

Anstatt  RS  nur  zu  lschen,  knnen  Sie gleichzeitig auch einen neuen
Startwert zuweisen.  Dies entspricht der Befehlsfolge

                RSRESET
                RS.B    <AbsWert>

Eine genaue Beschreibung finden Sie bei der Direktive RS.

7.2.4 Makro-Direktiven

MACRO Beginnt eine Makro-Definition

Syntax: [<Label>] MACRO

Mit  dieser  Direktive  beginnt  eine  Makro-Definition, wobei <Label> in
diesem  Falle  der Name des Makros ist.  Benutzen Sie die Direktive ENDM,
um eine Makro-Definition zu beenden.

Makros werden verwendet, um einer kurzen Code-Sequenz einen Namen zuzuweisen.

Es  ist  mglich,  ein Makro mit Operanden, gleichsam als Parameter, aufzu-
rufen.  Ein Operand wird in einem Makro mit einem Backslash \ bezeichnet,
gefolgt von einer Zahl zwischen
                                                                        (79)
1  und  9, die die Nummer des Operanden angibt.  Ein von einem Klammeraffen
@  gefolgter  Backslash  wird  beim  Assemblieren  durch  die  Anzahl der
bisherigen Aufrufe dieses Makros ersetzt, so da Labels im Makro, denen ein
\@  angehngt  oder vorweggestellt wird, beim zweiten Aufruf eines Makros
keinen Double-Symbol-Fehler hervorrufen.

Ein Beispiel fr ein einfaches Makro:

        CoordsXYZ       MACRO
                        DC.W    \1,\2,\3
                        ENDM

In Ihrem Programm schreiben Sie dann einfach:

        CoordsXYZ       10,10,10
        CoordsXYZ       10,-10,10
        ---
        ---
        CoordsXYZ       -10,10,10

Falls  Sie die Koordinaten fr eine andere Anwendung mit einem Faktor, bei-
spielsweise 16, multiplizieren mssen, schreiben Sie das Makro einfach um:

        CoordsXYZ       MACRO
                        DC.W    \1*16,\2*16,\3*16
                        ENDM

Sie  knnen keine Makros innerhalb eines Makros definieren, aber Sie knnen
andere  Makros  aufrufen oder rekursiv das selbe Makro erneut aufrufen.  Um
solche  Makros zu beenden, mssen Sie MEXIT oder CMEXIT verwenden.  Die
Grenze fr die Verschachtelung von Makros liegt bei 25 Rekursionen.
                                                                        (80)
NARG Spezielles Symbol (Zahl der Parameter)

Syntax: NARG

Dieses  spezielle Symbol bekommt beim Makro-Aufruf die Zahl der bergebenen
Parameter zugewiesen.  Auerhalb eines Makros hat NARG den Wert 0.

ENDM Beendet Makro-Definition

Syntax: ENDM

Beendet eine Makro-Definition.  Siehe auch bei MACRO, MEXIT und CMEXIT.

MEXIT Verlt Makro

Syntax: MEXIT

Beendet  ein Makro vorzeitig.  Wenn der Assembler diese Direktive erreicht,
wird  das  Makro  beendet,  auch wenn das regulre Ende noch nicht erreicht
war.

CMEXIT Verlt Makro, wenn Rekursionstiefe erreicht

Syntax: CMEXIT <AbsWert>

Beendet   ein   Makro,  wenn  die  derzeitige  Rekursionstiefe  <AbsWert>
entspricht.   Wenn  diese  Tiefe erreicht ist, wird das Makro beendet, auch
wenn das regulre Ende noch nicht erreicht war.
                                                                        (81)
REPT Beginnt Code-Wiederholung

Syntax: REPT <AbsWert>

Leitet  eine  wiederholte  Assemblierung eines Blocks ein.  Sie knnen dies
verwenden, um einen oder mehrere Befehle mehrfach zu wiederholen.  Das Ende
des Blocks wird durch ENDR markiert.

Wenn  Sie  beispielsweise  10 Byte sehr schnell kopieren wollen, knnen Sie
das wie folgt tun:

        REPT 10
        MOVE.B  (A0)+,(A1)+
        ENDR

ENDR Beendet Code-Wiederholung

Syntax: ENDR

Beendet die wiederholte Assemblierung; siehe auch REPT.
                                                                        (82)
7.2.5 Bedingte Assemblierung

CNOP Bedingtes NOP zur Ausrichtung an Wort- oder Langwortgrenzen

Syntax: [<Label>] CNOP <AbsWert1>,<AbsWert2>

Diese  Direktive  richtet  die Adresse auf eine durch <AbsWert2> teilbare
Adresse aus und addiert dann <AbsWert1> zu dieser Adresse.  Zum Beispiel:

        CNOP 0,4   ; richtet auf eine Langwortgrenze aus.
        CNOP 2,4   ; richtet auf ein Wort hinter einer Langwortgrenze aus.

<Label>  wird, wenn vorhanden, der neue Wert des Programmzhlers nach dem
CNOP zugewiesen.

Anmerkung: CNOP fhrt keine Initialisierung aus.

EVEN Erzwingt die Fortsetzung auf gerader Adresse

Syntax: [<Label>] EVEN

Diese Direktive hat dieselben Auswirkungen wie

        CNOP 0,2

<Label>  wird, wenn vorhanden, der neue Wert des Programmzhlers nach dem
EVEN zugewiesen.

Anmerkung: EVEN fhrt keine Initialisierung aus.
                                                                        (83)
ODD Erzwingt ungerade Adresse

Syntax: [<Label>] ODD

Kann auch ersetzt werden durch

        CNOP 1,2

ODD  ndert  einen bereits ungeraden Programmzhler nicht.  (Die Variante
CNOP wrde in diesem Falle zwei Byte addieren.)

<Label>  wird, wenn vorhanden, der neue Wert des Programmzhlers nach dem
ODD zugewiesen.

Anmerkung: ODD fhrt keine Initialisierung aus.

IFEQ Assembliert, wenn Term  = 0 (Equal)
IFNE Assembliert, wenn Term <> 0 (Not Equal)
IFGT Assembliert, wenn Term  > 0 (Greater Than)
IFGE Assembliert, wenn Term >= 0 (Greater or Equal)
IFLT Assembliert, wenn Term  < 0 (Less Than)
IFLE Assembliert, wenn Term <= 0 (Less or Equal)

Die obigen Varianten knnen auch ersetzt werden durch das allgemeinere

IF Assembliert, wenn logisch wahr

Syntax: IF <boolean>

Ein  solcher  boolescher  Wahrheitswert  besteht aus zwei Termen, die durch
einen der folgenden Vergleichsoperatoren in Relation gebracht werden:

        =, >, <, >=, <=, <>
                                                                        (84)
Wenn  eine  IF(cc)-Direktive  nicht  zutrifft,  wird  der  folgende  Code
bersprungen, bis ein ENDC oder ein ELSE-Statement erreicht wird.

IF(cc)-Direktiven knnen bis zu 25fach verschachtelt werden.

IFC Assembliert, wenn Strings identisch sind

Syntax: IFC <string1> <string2>

Siehe auch die allgemeine Erluterung zu IF.

IFNC Assembliert, wenn Strings nicht identisch sind

Syntax: IFNC <string1> <string2>

Siehe auch die allgemeine Erluterung zu IF.

IFD Assembliert, wenn ein Symbol definiert ist

Syntax: IFD <Symbol>

Siehe auch die allgemeine Erluterung zu IF.

IFND Assembliert, wenn ein Symbol nicht definiert ist

Syntax: IFND <Symbol>

Siehe auch die allgemeine Erluterung zu IF.
                                                                        (85)
IFB Assembliert, wenn leer

Syntax: IFB <Symbol>

Diese  Instruktion  testet das folgende <Symbol>, wenn dort nichts steht,
ist  die  Bedingung  leer  erfllt.   Dieser  Befehl findet Anwendung, um
herauszufinden, ob ein Makro-Parameter vorhanden ist oder nicht.

Siehe auch die allgemeine Erluterung zu IF.

IFNB Assembliert, wenn nicht leer

Syntax: IFNB <Symbol>

Diese  Instruktion  testet  das folgende <Symbol>, wenn dort etwas steht,
ist die Bedingung nicht leer erfllt.  Dieser Befehl findet Anwendung, um
herauszufinden, ob ein Makro-Parameter vorhanden ist oder nicht.

Siehe auch die allgemeine Erluterung zu IF.

IF1 Assembliert, wenn in Pass1

Syntax: IF1

Der Assembler arbeitet den folgenden Block nur in Pass1 ab.

Siehe auch die allgemeine Erluterung zu IF.
                                                                        (86)
IF2 Assembliert, wenn in Pass2

Syntax: IF2

Der Assembler arbeitet den folgenden Block nur in Pass2 ab.

Siehe auch die allgemeine Erluterung zu IF.

ELSE Alternativer Code, wenn Bedingung nicht erfllt

Syntax: ELSE

Siehe auch die allgemeine Erluterung zu IF.

ENDC Beendet IF-Block

Syntax: ENDC

Siehe auch die allgemeine Erluterung zu IF.

7.2.6 Ausgabekontrolle

PAGE Beginnt neue Seite im Listfile

Syntax: PAGE

Beginnt eine neue Seite und aktiviert die Seitentrennung.

NOPAGE Schaltet Seitentrennung ab

Syntax: NOPAGE
                                                                        (87)
LIST Aktiviert Listing

Syntax: LIST

Beginnt mit der Erzeugung des Listfiles.

NOLIST (NOL) Beendet Listing

Syntax: NOLIST (oder NOL)

Beendet Erzeugung des Listings.

LLEN Setzt Zeilenlnge

Syntax: LLEN <AbsWert>

Setzt die Zeilenlnge (zulssige Werte sind 60-132).

PLEN Setzt Seitenlnge (Zeilenzahl)

Syntax: PLEN <AbsWert>

Setzt die Seitenlnge (zulssige Werte sind 20-100).

SPC Erzeugt n leere Zeilen

Syntax: SPC <AbsWert>

Fgt n leere Zeilen in das Listfile ein.
                                                                        (88)
TTL Setzt Programmtitel

Syntax: TTL <String>

Setzt  den Programmtitel (fr Listfile).  Um dem Programm-Modul einen Namen
zu geben, verwenden Sie IDNT.

FAIL Generiert Assembler-Fehler

Syntax: FAIL

Erzeugt einen Fehler. Der Fehler taucht auch im Listing auf.

PRINTT Ausgabe eines Strings auf den Bildschirm

Syntax: PRINTT <String>[,<String>,...]

Gibt  whrend  des  Assemblierens einen String auf den Bildschirm aus.  Sie
knnen  diese  Anweisung  benutzen,  um anderen, die Ihren Quellcode assem-
blieren,  Informationen  oder  Hinweise zu geben.  Sie knnen sie aber auch
als Gedchtnissttze fr sich selbst benutzen, etwa in dieser Art:

        PRINTT "Diese Zeile wurde assembliert"

PRINTV Ausgabe eines Wertes auf den Bildschirm

Syntax: PRINTV <Ausdruck>[,<Ausdruck>,...]

Ausgabe  eines  Werts  auf den Bildshcirm whrend des Assemblierens.  Diese
Anweisung  lt  sich  sehr gut einsetzen, um zu berprfen, ob whrend des
Assembliervorgangs  alles  korrekt  abluft.   Besonders ntzlich ist dies,
wenn Sie bedingtes Assemblieren oder REPT-Statements benutzen.

        PRINTV ScreenAddress, ScreenWidth
                                                                        (89)
7.2.7 Externe Symbole

XDEF Externe Definition

Syntax: XDEF <Label>[,<Label>..]

Definiert  ein Symbol als extern.  Jedes Symbol darf nun auch aus anderen
Modulen referenziert werden, auch aus Hochsprachemodulen.

Ein Beipiel fr die Anwendung dieser Direktive finden Sie unter XREF.

Hinweis:   Programme, die XDEF oder XREF verwenden, knnen nicht direkt
ausgefhrt werden.

XREF Externe Referenz

Syntax: XREF <Label>[,<Label>..]

Importiert  Symbole, die in anderen Modulen definiert wurden.  Jedes Symbol
kann  nun  ebenso  wie  ein im Modul definiertes relatives Symbol behandelt
werden.

Ein Beispiel fr die Anwendung dieser Direktive im folgenden.

Geben  Sie  das Beispielprogramm ein, assemblieren und speichern Sie es als
Objektmodul.

                XDEF    ClearScreen
        ClearScreen
                CLR.L   Screen
                RTS
        Screen  DC.L    0
                                                                        (90)
Geben Sie dann das folgende Beispiel ein, assemblieren und speichern Sie es
ebenfalls.

                XREF    ClearScreen
        GoClear JMP     ClearScreen

Sie haben nun zwei Objektmodule.  Verwenden Sie einen Linker, um diese bei-
den Objektmodule zu einer ausfhrbaren Datei zusammenzubinden.

Hinweis:   Programme, die XDEF oder XREF verwenden, knnen nicht direkt
ausgefhrt werden.

7.2.8 Allgemeine Direktiven

JUMPPTR Setzt Startpointer

Syntax: JUMPPTR <Label>

Diese  Direktive  setzt  die Startadresse fr das Debuggen eines Programms.
Normalerweise  ist  die  Startadresse die Adresse des ersten Befehls in der
ersten  nicht  leeren  Programm-Sektion.   An  diese  Adresse  springt  der
Assembler, wenn Sie die Befehle J oder G ohne Adreangabe verwenden.

INCBIN Binr-File einfgen

Syntax: INCBIN <Filename>[,<AbsWert>]

Fgt  binre  Daten  in  Ihr  Programm ein.  Diese Daten werden beim Assem-
blieren nachgeladen.  Ein Beispiel:

        START:
                INCBIN  "datafile"
        END:
                                                                        (91)
Wenn  "datafile"  ein  binres File mit einer Lnge von 1000 Byte ist, wird
das  Label END einen Wert annehmen, der genau 1000 Byte hher ist als der
von START, und "datafile" wird an die Adresse START geladen.

INCLUDE Sourcefile einfgen

Syntax: INCLUDE <Filename>

Fgt  zustzlichen  Code in Ihren Quellltext ein.  Include-Dateien enthaten
normalerweise  Konstantendefinitionen  wie Library-Offsets oder symbolische
Parameter, knnen aber prinzipiell alle Arten von Code enthalten.

Sie  nutzen  Include-Dateien,  indem  Sie  Quelltext erstellen, der al Ihre
Definitionen (wie Konstanten, Makros etc.) enthlt.

Diese  fgen  Sie  dann  am  Beginn  Ihres Programms mit INCLUDE ein.  So
knnen  Sie  alle Definitionen in der Incude-Datei nutzen, als wenn Sie sie
tatschlich am Beginn Ihres Programms eingefgt htten.

Ein Beispiel fr diese Methode:

        INCDIR  DF0:INCLUDE\    ; Gibt den Pfad an, in dem sich Ihre
                                ; Includes befinden
        INCLUDE exec/exec.i     ; Der Name der einzufgenden Datei

Sie  knnen  mehrere  Include-Aufrufe hintereinander vornehmen und auch aus
Include-Dateien heraus andere Include-Dateien einbinden.  Die maximale Ver-
schachtelungstiefe ist 5.
                                                                        (92)
Um  die  Assemblierung  zu  beschleunigen,  werden  Include-Datein nach dem
erstmaligen Laden im Speicher gehalten.  Dadurch mssen sie nicht bei jedem
Assmblieren neu nachgeladen werden.

Um  den dafr benutzten Speicher manuell wieder freizugeben, knnen Sie das
Kommando ZI (Include-Speicher lschen) verwenden.

INCDIR Pfad fr Includes angeben

Syntax: INCDIR <Pfad>

Setzt den Pfad, unter dem nach den Include-Dateien gesucht wird. Default ist

        INCDIR  "DF0:Includes/"

>EXTERN Daten-File laden

Syntax: >EXTERN [<Num>,]<Filename>,<LadeAdr>[,<Lnge>]

Definiert  eine  Referenz  auf  ein externes File mit dem angegebenen File-
Namen.   Die  Datei  wird  an  die  Adresse  <LadeAdr>  geladen.   Sofern
<Lnge> angegeben wurde, werden maximal <Lnge> Byte geladen.

>EXTERN-Dateien  werden  nachgeladen,  wenn  Sie den Befehl e eingeben.
Wenn  Sie Ihren >EXTERN-Aufrufen den Parameter <Num> mit angeben, haben
Sie  die  Mglichkeit,  nur  bestimmte  >EXTERN-Files zu laden, indem Sie
E<Num> verwenden.
                                                                        (93)
IDNT Programm benennen

Syntax: IDNT <Name>

Ein  Programm,  das mehr als eine Sektion enthlt, mu mit einem Namen ver-
sehen  werden.   Normalerweise  wird  ein  Leerstring  zugewiesen, aber Sie
knnen dem Programm mit IDNT auch einen speziellen Namen geben.

AUTO Automatische Befehlsausfhrung

Syntax: AUTO <Befehl>[\<Befehl>..]

AUTO  erlaubt  Ihnen,  einen  oder mehrere Befehle fest einzustellen, zum
Beispiel

        AUTO    \E

wenn  Sie  alle externen Files automatisch bei jeder Assemblierung einladen
wollen.

Der Backslash \ bedeutet hier Return.
                                                                        (94)
8.  Der Debugger

Der  Debugger  von ASM-ONE bietet Ihnen neben den Funktionen eines normalen
Debuggers  auch  die  Mglichkeiten  einen Source-Level-Debuggers.  Das be-
deutet,  da  Sie Ihren Quelltext quasi direkt ausfhren und die Ausfhrung
zeilenweise  verfolgen knnen.  Sie sehen Ihren Quelltext im Debugger exakt
so wie im Editor, mit Zeilennummern, Kommentaren etc.

Sie   knnen   jedoch   gleichzeitig  alle  Registerinhalte  und  beliebige
Speicherstellen  unter Kontrolle behalten.  Wenn Sie ein Programm debuggen,
von  dem Sie keinen Quelltext haben, knnen Sie es im Einzelschrittmodus in
einem  normalen  Disassembler-Fenster  abarbeiten lassen.  Auch hier stehen
Ihnen  alle  Befehle  des Source-Level-Debuggers zur Verfgung.  Sie knnen
sogar beim Debuggen eines Programms zwischen beiden Modi wechseln.

Wenn  Sie  sich im Debugger befinden, stehen Ihnen alle Funktionen zur Ver-
fgung,  die  im  Men Debug Funct aufgelistet sind.  Die Funktionen sind
folgende:

        Step One

Fhrt  einen  einzelnen  Programmschritt aus, indem auf den folgeden Befehl
ein  Breakpoint  gesetzt  wird.   Subroutinen  werden  so  nicht im Einzel-
schrittmodus   ausgefhrt.   Wenn  Sie  auch  eine  Subroutine  im  Einzel-
schrittmodus verfolgen wollen, knnen Sie das Kommando Enter benutzen.
                                                                        (95)
Die  bedingten  Verzweigungen  Bcc, DBcc und der Befehl RTS werden im
Trace-Modus  abgearbeitet.   Daraus  folgt, da Sie diese Befehle nicht mit
dem  Befehl  Enter  abarbeiten  mssen,  um  zu verfolgen, wohin sie ver-
zweigen.   BRA  und  DBRA werden hier wie bedingte Verzweigungen behan-
delt.   Der  Befehl  JMP  wird  speziell behandelt.  Er wird ebenfalls in
einem Schritt abgearbeitet, die Return-Adresse wird jedoch vom Stack geholt
und als Breakpoint verwendet.

Dies  kann  ein  Problem  verursachen,  wenn vorher Parameter auf den Stack
geschoben  wurden,  die  von  der  mit  JMP angesprungenen Routine wieder
heruntergenommen  werden.  (Sie finden diese Vorgehensweise hufig in Hoch-
sprachenprogrammen,  die  Parameter  nicht  in  Registern, sondern ber den
Stack  bergeben.  In diesem Falle ist das zuletzt auf den Stack geschobene
Langwort  nmlich nicht die Return-Adresse.  Um eine solche Konstruktion zu
tracen, mssen Sie den Breakpoint selbst setzen oder den Befehl mit Enter
abarbeiten lassen.

        Enter

Dieser Befehl wird verwendet, um eine Subroutine, die normalerweise aneinem
Stck  abgearbeitet  werden  wrde,  dennoch  im  Einzelschrittmodus  abzu-
arbeiten.   Dies  sind  Routinen,  die  durch  einen  der folgenden Befehle
gestartet werden:  BSR, JSR oder JMP.

Wenn Sie im Modus ShowSource arbeiten (dies ist der Default-Modus, in dem
Sie  Ihren  Quelltext  beim  Tracen  mitverfolgen  knnen),  ist  es  nicht
empfehlenswert, eine Library-Routine auf diese Weise zu verfolgen, da diese
Adresse auerhalb Ihres Quelltextes liegt.
                                                                        (96)
Ist dies doch der Fall, knnen Sie nachtrglich einen Breakpoint setzen und
den  Rest  der  Library-Routine  in  einem Stck abarbeiten lassen oder den
Modus ShowSource ausschalten und den Rest der Routine anhand des normalen
Disassembler-Listings verfolgen.  Da es nicht mglich ist, einen Breakpoint
im ROM zu setzen, mssen Sie hier immer das Kommando Enter nutzen.

        Step n

Erlaubt  es  Ihnen, n Befehle in einem Schritt abzuarbeiten.  Dies kann ein
wenig unbersichtlich werden, weil es schwer vorherzusehen ist, wo das Pro-
gramm  beispielsweise  nach  143  Schritten sein wird.  Der bessere Weg ist
normalerweise, einen Breakpoint zu setzen.

        Edit Regs

Sie  knnen  whrend der Analyse eines Programms eim Einzelschrittmodus die
Inhalte  smtlicher  Register  nach belieben ndern.  Natrlich greifen Sie
dadurch  in  den  Programmablauf  ein,  so da die Ergebnisse des Programms
nicht  mehr denen entsprechen, die es normalerweise ausgegeben htte.  Doch
ist  es  manchmal  angenehmer,  einen  falschen  Wert  erst  einmal  nur zu
editieren,  anstatt  den  Fehler  sofort  zu  korrigieren  und das Programm
deswegen neu assemblieren zu mssen.
                                                                        (97)
        AddWatch

Hilft  Ihnen  bei  der  Beobachtung eines Peicherbereiches.  Sowohl direkte
Adressen  als  auch  Register  und  Symbole  knnen  dafr  genutzt werden.
Folgende Angaben sind fr den zu beobachtenden Bereich zulssig:

        BUFFER          A0+D0+10
        BUFFER+2+D1
        etc.

Dieser Zeiger kann wahlweise auf die folgenden Datentypen zeigen:

        ASCII, String, Hex, Decimal, Binary, Pointer

Ist der Typ des Pointers spezifiziert, sind folgende Typen erlaubt:

        DC.L            ; Absolut Lang (32 Bits)
        DC.W            ; Absolut Wort (16 Bits)
        DR.L            ; PC relativ Lang (32 Bits)
        DR.W            ; PC relativ Wort (16 Bits)

Dieser  Zeiger  kann wiederum auf alle der obigen Werte zeigen, ausgenommen
einen weiteren Pointer.

        DelWatch

Jedesmal  wenn  Sie eine neue Speicheradresse mit AddWatch spezifizieren,
wird deren Name im Men DelWatch abgelegt.  Es ist mglich, ein einzelnes
Element  wieder aus der AddWatch-Liste zu entfernen,indem Sie das zu ent-
fernende Element einfach anwhlen.
                                                                        (98)
        ZapWatch

Arbeitet  im  Prinzip  wie DelWatch, lscht jedoch nicht nur ein Element,
sondern alle Elemente aus der Watch-Liste.

        JumpAddr

Springt  zu  einer  absoluten  Adresse,  die  Sie in der Menzeile eingeben
knnen.   Diese  absolute  Adresse  kann dabei ein Label, ein Register oder
sogar A0+4 oder A0+D0+2 etc.  sein.

        JumpMark

Die  aktuelle  Monitorzeile wird farbig hinterlegt und kann mit den Cursor-
Tasten  hoch  und runter bewegt werden.  Durch Return springen Sie zu der
markierten Zeile.  Esc macht den Sprung wieder rckgngig.

        B.P. Addr

Setzt  einen Breakpoint auf eine absolute Adresse, die Sie auch hier wieder
in die Menzeile eingeben.

        B.P. Mark

Ihre  derzeitige Zeile wird hinterlegt.  Sie knnen diese Zeile nun mit den
Cursor-Tasten  bewegen.   Drcken Sie auch hier Return, um den Breakpoint
auf die markierte Zeile zu setzen, oder Esc , um den Vorgang abzubrechen.
                                                                        (99)
        Zap B.P.

Sie knnen insgesamt 16 verschiedene Breakpoints setzen.  Jedesmal wenn das
Programm  an  einem  Breakpoint  unterbrochen  wird, wird dieser Breakpoint
wieder  aus  der  Liste  entfernt.   Dieses  Kommando  ermglicht Ihnen das
Lschen aller Breakpoints.

Zustzliche Flags:

        DisAssem   - Zeigt eine disassemblierte Version der Zeile, an der
                     sich der Programmzhler gerade befindet.
        ShowSource - Zeigt den Quelltext

Um  die  Arbeitsweise dieser Befehle einmal auszuprobieren, sollten Sie das
Programm BinaryConv.S aus dem Beispielverzeichnis laden.
                                                                        (100)
9.  Der Monitor

Der  Monitor  ist im Unterschied zum Debugger nicht dazu gedacht, Programme
ablaufen  zu  lassen.  Mit dem Monitor haben Sie die Mglichkeit, Speicher-
inhalte anzusehen und zu editieren.  Der Monitor verhlt sich dabei wie ein
Editor,  Sie  knnen  den Speicher des Amiga durchlaufen und dessen Inhalte
direkt durch berschreiben ndern.

Mit  dem Monitor knnen Sie Speicherinhalte auf drei verschiedene Arten be-
trachten:

        1. Disassembliert
        2. In hexadezimaler Darstellung
        3. In ASCII-Darstellung

Jeder  dieser  Modi  hat  dieselben Grundfunktionen, bietet aber zustzlich
noch spezielle Mglichkeiten.

Im Disassemblierungsmodus sind das:

        Alle alphanumerischen Tasten

Aktivieren Sie den Zeilen-Assembler.  In diesem Modus haben Sie Zugriff auf
alle Editiermglichkeiten einer Zeileneingabe.  Wenn der eingegebene Befehl
unzulssig ist, wird keine nderung vorgenommen.

        Nicht-alphanumerische tasten (z.B. Cursor-Tasten)

Das   Drcken  der  nicht-alphanumerischen  Tasten  aktiviert  den  Zeilen-
assembler-Modus.   Anstatt aber in einer freien Zeile zu beginnen, wird die
aktuelle Zeile in den Zeilenpuffer gelegt.  Das verinfacht die nderung von
bestehendem Code.
                                                                        (101)
        Haupttasten:

        Ctrl-Shift-B:   ndert Hex-Ausgabe auf Byte-Gre
        Ctrl-Shift-W:   ndert Hex-Ausgabe auf Wort-Gre
        Ctrl-Shift-L:   ndert Hex-Ausgabe auf Langwort-Gre

        DEL

Fgt  eine  NOP-Instruktion  an  der  angegeben Adrsse ein und bewegt die
aktuelle Position auf die nchste Adresse.

Im  Hexadezimal-  und  im  ASCII-Anzeigemodus  knnen  Sie  folgende Tasten
verwenden:

        Cursor-Tasten links/rechts mit Shift

Springen an den Anfang beziehungsweise ans Ende der aktuellen Zeile

        Cursor-Tasten links/rechts mit Alt

Scrollen den Screen nach links beziehungsweise nach rechts.

Nun  folgen  die  allgemeinen  Kommandos,  die  Ihnen  in  allen  drei Modi
gleichermaen  zur  Verfgung  stehen  (Sie  finden  diese  Befehle auch im
Monitor-Men):
                                                                        (102)
        DisAssem

Wechselt  in den Disassemblierungsmodus.  Es ist mglich, unter den Modi zu
wechseln,  ohne den Monitor zu verlassen.  Falls Sie in einen Disassembler-
Listing  auf  einen  Bereich  stoen  sollten,  der nicht wie Maschinencode
aussieht,  knnen  Sie  direkt in den ASCII- oder Hex-Modus wechsel, um den
Bereich genauer zu untersuchen, und ebenso wieder zurck.

        HexDump

Wechselt in den Hexadezimal-Modus.

        AsciiDump

Wechselt in den ASCII-Modus.

        Jump Addr

Springt  an eine Adresse.  Geben Sie die gewnschte Adresse in der Eingabe-
zeile  ein.   Wenn  die  Adresse ungltig ist, wird der Sprung nicht ausge-
fhrt.  Die letzte Adresse wird in einem Puffer (siehe Last Addr) gespei-
chert,  soda  Sie  problemlos wieder an die Adresse zurckspringen knnen,
von der Sie ausgegangen sind.

        Last Addr

Kehrt  zu der letzten Adresse zurck, die Sie betrachteten.  Der Puffer des
Monitors kann bis zu 16 Positionen speichern.

        Mark 1..3

Markiert  eine  Position,  an  die Sie spter nochmals zurckkehren wollen.
Sie  knnen  Marken  benutzen,  um zwischen verschiedenen Speicherbereichen
hin- und herzuspringen.
                                                                        (103)
        Jump 1..3

Springt  an  eine gespeicherte Position.  Eine Anwendung dieses Befehls ist
die  stndige  berwachung  eines sich ndernden Speicherbereiches.  Setzen
Sie  dazu  eine  Marke  an  den  Anfang des Bereiches, und benutzen Sie den
Befehl  Jump,  um  zu  dieser  Marke  zu springen und eine Erneuerung der
Bildschirmanzeige auszulsen.

        QuickJump

Wenn  Sie  Sprnge  nutzen  wollen,  mssen  Sie  normalerweise die Adresse
angeben.  Diese Funktion arbeitet wie folgt:

        Beim Disassemblieren:

Suchen  Sie  das  als nchstes erreichbare Langwort, und bringen Sie es auf
die Current Line, soda es invers dargestellt wird.  Ist kein Langwort im
Text erreichbar, wird kein Sprung ausgefhrt.

ACHTUNG:  Es wird nicht geprft, ob die Speicheradresse der Langwortadresse
legal  ist.   Ist  dies  nicht  der Fall, kann dies einen Absturz zur Folge
haben.

        In Hexadezimal- oder ASCII-Form

Das  vom  Cursor  bernommene, in der am nchsten gelegenen geraden Adresse
liegende  Langwort  wird  in  das  gadget  Jump  Addr kopiert.  Wird dies
akzeptiert, braucht nur mit der Taste Return besttigt werden.
                                                                        (104)
        Esc

Verlt den Monitor und kehrt in die Befehlszeile zurck.

Zustzliche Flags:

        OnlyASCII - Unterdrckt bei de Anzeige im ASCII-Modus alle Nicht-
                    ASCII-Zeichen.  Normalerweise wird der gesamte Zeichen-
                    satz zur Anzeige genutzt.

WARNUNG:

Mit  dem  Monitor  knnen  Sie  smtliche  Speicherbereiche  beobachten und
ndern,  auch wenn diese Speicherbereiche im System des Amiga nicht als be-
schreibbarer Speicher verfgbar sind.

Zugriffe  auf  nicht  existierende  Speicherbereiche  oder  den I/O-Bereich
knnen das System zum Absturz bringen.

Auch  Modifikationen  in  Speicherbereichen,  die vom Betriebssystem belegt
sind,  knnen zum Absturz oder zu Fehlfunktionen des Computers fhren.  Sie
gehen  dabei  das  Risiko ein, den im Editor befindlichen Quelltext zu ver-
lieren.   Speichern  Sie  Ihren Quelltext also ab, bevor Sie in den Monitor
wechseln.
                                                                        (105)
                                                                        (106)
10. Der Motorola MC68000

Der  MC68000  ist  ein  16/32-Bit-Prozessor.  Das bedeutet, da der externe
Datenbus  nur  16  Bit  breit  ausgelegt ist, intern aber mit vollen 32 Bit
gearbeitet  wird.   Der  Adrebus  ist beim MC68000 24 Bit breit ausgelegt,
soda der maximale Adrebereich 2^24 Bytes = 16 MBytes umfat.

Da  die  niederwertigste  Adreleitung  nicht herausgefhrt ist, greift der
MC68000  immer  nur  wortweise und nur an geraden Adressen auf den Speicher
zu.

Der Prozessor hat folgende Register:

        Datenregister           D0 bis D7       8, 16, 32 Bit
        Adreregister           A0 bis A7       16, 32 Bit
        Benutzer-Stackpointer   USP             32 Bit
        Supervisor-Stackpointer SSP             32 Bit
        Programmzhler          PC              24 Bit
        Statusregister          SR              16 Bit
        Bedingungscodereister   CR              8 Bit

        Datenregister (D0-D7):

Diese  Register  knnen  sowohl  als Zhler als auch als Konstanten benutzt
werden.   Sie  knnen mit diesen Registern auch rechnen, wobei logische und
arithmetische Operationen zur Verfgung stehen.
                                                                        (107)
        Adreregister (A0-A6):

Diese  Register knen Sie als Zeiger und als Konstanten nutzen.  Sie knnen
mit  Adreregister  ebenfalls  rechnen,  wobei  Sie  jedoch  auf die arith-
metischen Operationen beschrnkt sind.

        Stapelzeiger (A7, USP, SSP):

Es  gibt zwei verschiedene Stapelzeiger, getrennt fr den Benutzer- und den
Supervisor-Stack.   Der  Stapel  speichert  beispielsweise  die Rcksprung-
adresse  aus  einer  Unterroutine  und  kann  ebenfalls  genutzt werden, um
Register zu sichern.

Ein  Bit  im  Statusregister  selektiert, welcher der beiden Stapel benutzt
wird.   Normalerweise  ist  das  der Benutzer-Stack, aber in Interrupts und
anderen   Ausnahmeroutinen   wird   der  Supervisor-Stack  verwendet.   Der
derzeitige  Stackpointer wird in A7 gesichert; es ist also nicht mglich,
dieses Register in eigenen Routinen zu verwenden.

Das   folgende   kleine  Beispielprogramm  gibt  die  Return-Adresse  einer
Subroutine in D0 aus:

        START   BSR     SUBROUT
        CONT    RTS
        SUBROUT MOVE.L  (A7),D0
                RTS

Assemblieren  Sie  dieses Beispiel, und starten Sie es mit J.  Betrachten
Sie  D0  nach  dem  Start.  Sehen Sie sich den Wert des Labels CONT mit
?CONT an.  Haben Sie dieselbe Adresse bekommen?

Sie  knnen auf dem Stapel auch Register sichern, wenn Sie deren Inhalt aus
irgendwelchen Grnden nicht einfach lschen drfen:
                                                                        (108)
        START   MOVEM.L D0-A6,-(A7)
                NOP             ;Hier knnen Sie nun Ihre Routine einfgen
                MOVEM.L (A7)+,D9-A6
                RTS

        Status- und Bedingungscoderegister (SR, CCR):

Das  CCR-Register  bezeichnet  nur die unteren 8 Bit des Statusregisters,
soda die Beschreibung dieser beiden Register sich zusammenfassen lt:

        Register SR und CCR:

        Bit     Name            Bedeutung

        0       C,Carry         Gesetzt, wenn Ergebnis Wertebereich ber-
                                schritt
        1       V,Overflow      Gesetzt, wenn berlauf (bei vorzeichen-
                                behafteten Zahlen)
        2       Z,Zero          Gesetzt, wenn das Ergebnis null war
        3       N,Negative      Gesetzt, wenn das Ergebnis negativ war
        4       X,Extended      Vergleichbar mit dem Carry-Bit, jedoch
                                anders beeinflut; fr mehrfachgenaue
                                Operationen
        5-7     unbenutzt
                                                                        (109)
        Das hherwertige Byte von SR:

        Bit     Name            Bedeutung

        8-10    I0-I2           Interrupt-Level (3-Bit-Wert)
        11-12   unbenutzt
        13      S,Supervisor    Gesetzt, wenn im Supervisor-Modus; erlaubt
                                die Ausfhrung aller privilegierten Befehle
                                und Verwendung des SSP-Stacks
        14      unbenutzt
        15      T,Trace         Gesetzt, wenn Trace-Modus aktiv; nach jedem
                                einzelnen Befehl wird eine Trace-Exception
                                ausgelst, soda immer nur ein Befehl aus-
                                gefhrt wird

10.1 Der Befehlssatz

Zunchst eine Beschreibung der verwendeten Abkrzungen:

        Label   bezeichnet ein Symbol oder eine Adresse
        Rn      Adre- oder Datenregister
        An      Adreregister
        Dn      Datenregister
        Source  Quelloperand
        Dest    Zieloperand
        <ea>    effektive Adresse
        #n      Integer-Wert
        <list>  Registerliste
                (Zum Beispiel D0/D2-D4/A0-A3. Dies wrde sich auf die
                Register D0 D2 D3 D4 A0 A1 A2 A3 beziehen, verwendet wird
                diese Bezeichung der Register beim Befehl MOVEM.)
                                                                        (110)
Wo  immer  Sie  den  Operanden  <ea>  sehen,  knnen  Sie  alle  normalen
Adressierungsarten nutzen.  Im einzelnen sind das folgende:

        Adressierungsart                                Assembler-Syntax

        Datenregister direkt                            Dn
        Adreregister direkt                            An
        Register indirekt                               (An)
        Register indirekt mit Postinkrementierung       (An)+
        Register indirekt mit Predekrementierung        -(An)
        Register indirekt mit Offset                    d16(An)
        Register indirekt mit Index                     d8(An,Rn)
        Absolut Kurz                                    xxxx.W
        Absolut Lang                                    xxxxxxxx
        PC-relativ mit Offset                           d16(PC)
        PC-relativ mit Index                            d8(PC,Rn)
        Unmittelbar                                     #xxxx

In  einigen  Instruktionen (Bcc, DBcc, Scc) steht das Krzel cc fr
den Bedingungscode.  Die mglichen Bedingungscodes:

        cc      Bedeutung                                       Bits

        T       True (wahr)
        F       False (falsch)
        HI      HIgher (grer)                             C' * Z'
        LS      Lower or Same (kleiner oder gleich)         C * Z
        CC,HS   Carry Clear, Higher or Same (grer gleich) C'
        CS,LO   Carry Set, LOwer than (kleiner als)         C
        NE      Not Equal (ungleich)                        Z'
        EQ      Equal (gleich)                              Z
        VC      oVerflow Clear (kein berlauf)              V'
        CS      oVerflow Set (berlauf)                     V
        PL      PLus (positiv)                              N'
        MI      MInus (negativ)                             N
        GE      Greater than or Equal (grer oder gleich)  N * V + N' * V'
        LT      Less Than (kleiner als)                     N * V' + N' * V
        GT      Greater Than (grer als)                   N*V*Z' + N'*V'*Z'
        LE      Less than or Equal (kleiner oder gleich)    Z + N*V'+ N'*V

* bedeutet hier logisches UND, + bedeutet logisches ODER, und ' steht
fr logisches NICHT.
                                                                        (111)
Die  folgende  Liste  fhrt  alle  Befehle auf, die der MC68000 kennt.  Fr
weitere  Informationen  sollten  Sie  auf  die  Original-Dokumentation  von
Motorola zurckgreifen.

        Mnemonic        Description

        ABCD            Add binary coded decimal with extend
        ADD             Add
        ADDQ            Add quick
        ADDX            Add with extend
        AND             Logical AND
        ASL             Arithmetic Shift Left
        ASR             Arithmetic Shift Right
        Bcc             Branch
        BCHG            Bit Test and Change
        BCLR            Bit Test and Clear
        BRA             Branch Allways
        BSET            Bit Test and Set
        BSR             Branch to Subroutine
        CHK             Check Register Against Bounds
        CLR             Clear Operand
        CMP             Compare
        CMPM            Compary memory
        DBcc            Test Condition, Decrement and Branch
        DIVS            Signed Divide
        DIVU            Unsigned Divide
        EOR             Exclusive OR
        EXG             Exchange Registers
        EXT             Sign Extend
        JMP             Jump
        JSR             Jump to Subroutine
        LEA             Load Effective Address
        LINK            Link Stack
        LSL             Logical Shift Left
        LSR             Logical Shift Right
        MOVE            Move
        MOVEM           Move Multiple Registers
                                                                        (112)
        Mnemonic        Description

        MOVEP           Move Peripheral Data
        MOVEQ           Move Quick
        MULS            Signed Multiply
        MULU            Unsigned Multiply
        NBCD            Negate Binary Coded Decimal with extend
        NEG             Negate
        NEGX            Negate with Extend
        NOP             No Operation
        NOT             One's Complement
        OR              Logical OR
        PEA             Push Effective Address
        RESET           Reset External Devices
        ROL             Rotate Left Without Extend
        ROR             Rotate Right Without Extend
        ROXL            Rotate Left With Extend
        ROXR            Rotate Right With Extend
        RTE             Return from Exception
        RTR             Return and Restore
        RTS             Return from Subroutine
        SBCD            Subtract Binary Coded Decimal with extend
        Scc             Set Conditional
        STOP            Stop
        SUB             Subtract
        SUBQ            Subtract quick
        SUBX            Subtract with extend
        SWAP            Swap data register halves
        TAS             Test and Set Operation
        TRAP            Trap
        TRAPV           Trap on overflow
        TST             Test
        UNLK            Unlink

Diese Befehle sind nur die 56 Grundbefehle des MC68000.
                                                                        (113)
In  dieser  Liste  sind  bereits  einige  Kommandos  in  mehreren Varianten
aufgefhrt, zum Beispiel ADD, ADDQ und ADDX.  In Wirklichkeit gibt es
noch  mehr  Variationen,  die  von  ASM-ONE  automatisch  umgesetzt werden.
Beipielsweise  behandelt ASM-ONE die folgenden Befehle gleich und verwendet
den jeweils richtigen:

        ADD             normales Addieren
        ADDA            Addiere zu einem Adreregister
        ADDI            Addiere unmittelbar

Alle  diese  Befehle  werden  von  Ihnen  einfach  wie  ein  normales ADD
behandelt  und  erlauben  dennoch  alle  Verwendungsmglichkeiten  der  In-
struktionen ADDA und ADDI.  Dies ist bequemer fr den Programmierer und
bringt  keine  Probleme mit sich, da ASM-ONE anhand der Parameter eindeutig
erkennen kann, welcher Befehl gemeint ist.  Wenn Sie also beispielsweise:

        ADDA.W  A0,A1

verwenden mchten, knnen Sie ebensogut schreiben:

        ADD.W   A0,A1

Die  einzige  Einschrnkung,  die  Sie  sich  merken  sollten:   Sie knnen
Adreregister   nur  wort-  und  langwortweise  verwenden.   Und  das  gilt
natrlich  auch  dann noch, wenn Sie statt ADDA nur noch ADD schreiben.
Hinzu  kommt noch, da bei einer wortweisen Addition zu einem Adreregister
das Wort zuvor auf ein Langwort erweitert wird, folgende Instruktionen also
gleichwertig sind:

        ADD.W   #1000,A0
        ADD.L   #1000,A0

Die obere Instruktion braucht alelrdings weniger Rechenzeit.
                                                                        (114)
10.1.1 Befehle zum Kopieren von Daten

Die  folgenden  Instruktionen finden Anwendung, um Daten zwischen Speicher,
Daten- und Adreregistern zu bewegen.

Der  grundlegende  Befehl  in  dieser Kategorie ist der Befehl MOVE.  Sie
knnen mit MOVE Bytes, Wrter und Langwrter aus dem Speicher in Register
bertragen,   aus  Registern  in  den  Speicher  schreiben,  innerhalb  des
Speichers an andere Stellen kopieren oder innerhalb der Register kopieren.

Einige  spezielle  Varianten  des  Befehls  MOVE  erlauben Ihnen, das Be-
dingungscoderegister   CCR  zu  beschreiben  (MOVE  <ea>,CCR)  und  das
Statusregister SR zu lesen (MOVE SR,<ea>).

WARNUNG:   Das  Auslesen  des  Statusregisters  ist auf hheren Prozessoren
(68010, 68020 und Nachfolger) ein privilegierter Befehl, der im Supervisor-
Modus   abgearbeitet   werden  mu  und  andernfalls  zu  einer  Privilege-
Violation-Exception mit entsprechendem Guru fhrt.

        Befehl  Syntax                  Gre

        EXG     EXG     Rx,Rx           L
        LEA     LEA     <ea>,An         L
        MOVE    MOVE    <ea>,<ea>       B W L
                MOVE    <ea>,CCR        W
                MOVE    <ea>,SR         W
                MOVE    SR,<ea>         W
                MOVE    USP,An          L
                MOVE    An,USP          L
        MOVEM   MOVEM   <list>,<ea>     W L
        MOVEM   MOVEM   <ea>,<list>     W L
                                                                        (115)
10.1.2 Befehle fr Integer-Arithmetik

Der  MC68000  kann  zwei  Operanden addieren, subtrahieren, multiplizieren,
dividieren  und vergleichen.  Einen einzelnen Operanden knnen Sie lschen,
auf  null  testen, vorzeichenrichtig erweitern und negieren.  Einige dieser
Befehle brauchen allerdings eine Erklrung.

Wenn  Sie  zwei  64-Bit-Zahlen  addieren  mchten,  ist  der  Befehl ADDX
praktisch,  da  Sie  wie folgt vorgehen knnen:  Angenommen, die erste Zahl
befindet  sich  in D0 und D1 und die zweite Zahl in D2 und D3.  Das
Ergebnis  mchten  wir  in D2 und D3 haben, das jeweils geringerwertige
Langwort  befinde  sich  in  D1 und D3.  Die Addition lt sich mit nur
zwei Befehlen ausfhren:

        ADD.L   D1,D3
        ADDX.L  D0,D2

Wenn  das Carry-Flag bei der ersten Addition gesetzt wurde, wird es bei der
zweiten ebenfalls hinzugefgt.

Auch  die  Divisionsbefehle  DIVS  und  DIVU  verdienen  eine kurze Er-
luterung.   Hiermit  knnen  Sie einen 32-Bit-Wert durch einen 16-Bit-Wert
dividieren.  Das Ergebnis wird danach in den unteren 16 Bit des Zieloperan-
den  abgelegt.   In  den oberen 16 Bit finden Sie danach den Rest der Ganz-
zahldivision.

Wenn  Sie  also  die  Funktion  MOD der Sprache Pascal nachbilden wollen,
knnen Sie das in wenigen Assembler-Befehlen tun.  In einem Pascal-Programm
wrde MOD ungefhr wie folgt angewendet werden:

        Result  :=      10 MOD 7

Natrlich  lautet  die Antwort 3, doch der Computer mu es auch berechnen
knnen:
                                                                        (116)
        START   MOVEQ   #10,D0
                MOVEQ   #7,D1
                DIVU    D1,D0
                CLR.W   D0
                SWAP    D0
                RTS             ; Rest 3 als Langwort in D0

Der   Unterschied   zwischen  DIVU  und  DIVS  ist,  da  DIVS  unter
Bercksichtigung  des Vorzeichens dividiert, whrend DIVU fr vorzeichen-
lose Zahlen gedacht ist.

        Befehl  Syntax                  Gre

        ADD     ADD     <ea>,Dn         B W L
                ADD     Dn,<ea>         B W L
        ADDA    ADDA    <ea>,An         W L
        ADDI    ADDI    #d,<ea>         B W L
        ADDQ    ADDQ    #d,<ea>         B W L
        ADDX    ADDX    Dy,Dx           B W L
                ADDX    -(Ay),-(Ax)     B W L
        CLR     CLR     <ea>            B W L
        CMP     CMP     <ea>,Dn         B W L
        CMPA    CMPA    <ea>,An         W L
        CMPI    CMPI    #d,<ea>         B W L
        CMPM    CMPM    (Ay)+,(Ax)+     B W L
        DIVS    DIVS    <ea>,Dn         W
        DIVU    DIVU    <ea>,Dn         W
        EXT     EXT     Dn              W L
        MULS    MULS    <ea>,Dn         W
        MULU    MULU    <ea>,Dn         W
        NEG     NEG     <ea>            B W L
        NEGX    NEGX    <ea>            B W L
        SUB     SUB     <ea>,Dn         B W L
                SUB     Dn,<ea>         B W L
        SUBA    SUBA    <ea>,An         W L
        SUBI    SUBI    #d,<ea>         B W L
        SUBQ    SUBQ    #d,<ea>         B W L
        SUBX    SUBX    Dy,Dx           B W L
                SUBX    -(Ay),-(Ax)     B W L
        TAS     TAS     <ea>            B
        TST     TST     <ea>            B W L
                                                                        (117)
10.1.3 Logische Operationen

Allen  logischen Operatoinen ist gemeinsam, da nur Datenregister und keine
Adreregister  verwendet  werden  drfen.   Auch  sind keine zwei Speicher-
adressen  als  Operanden  zulssig,  dennoch sind die logischen Befehle des
68000  sehr  ntzlich.  Erinnern wir uns nochmals an das Beispiel MOD aus
dem vorhergehenden Unterkapitel:

        Result  :=      10 MOD 7 = 3

Wenn die Frage

        Result  :=      10 MOD 8 = ?

gewesen  wre,  htten  wir das Problem auch mit einem logischen Befehl wie
folgt lsen knnen:

        START   MOVEQ   #10,D0  ; Zahl 1
                MOVEQ   #8,D1   ; Zahl 2
                SUBQ.L  #1,D1   ; minus 1
                AND.L   D1,D0   ; Bits ausmaskieren
                RTS

Diese Methode ist anwendbar, solange die zweite Zahl eine Zweierpotenz ist,
also  2, 4, 8, 16, 32 etc., und funktioniert, da sich diese Werte mit 1, 2,
3,  4, 5 etc.  Bits darstellen lassen, soda die darberliegendne Bits ein-
fach  ausmaskiert  werden  knnen, um den Rest herauszufinden.  Da nur eine
einzige  logische  Operation  statt  einer  zeitaufwendigen Division durch-
gefhrt werden mu, ist dieser Weg deutlich schneller.
                                                                        (118)
        Befehl  Syntax                  Gre

        AND     AND     <ea>,Dn         B W L
                AND     Dn,<ea>         B W L
        ANDI    ANDI    #d,<ea>         B W L
                ANDI    #d,SR           B W
        EOR     EOR     <ea>,Dn         B W L
                EOR     Dn,<ea>         B W L
        EORI    EORI    #d,<ea>         B W L
                EORI    #d,SR           B W
        NOT     NOT     <ea>            B W L
        OR      OR      <ea>,Dn         B W L
                OR      Dn,<ea>         B W L
        ORI     ORI     #d,<ea>         B W L
                ORI     #d,SR           B W

10.1.4 Schiebe- und Rotationsbefehle

Auch  diese  Befehlsgruppe  ist  sehr  wichtig.  Mit ihr knnen Sie 32-Bit-
Zahlen in ihre einzelnen Bits zerlegen und dann weiterverarbeiten.  Weiter-
hin knnen Sie mit ihr sehr schnell durch Zweierpotenzen dividieren, da bei
jedem  Shift  durch  zwei  geteilt  wird.   Sie  knnen  also die folgenden
Divisionsbefehle durch die schnelleren Schiebefehle ersetzen:

        DIVU    #8,D0   =       LSR.L   #3,D0
        DIVS    #8,D0   =       ASR.L   #3,D0

Hier  haben  Sie zustzlich den Vorteil, da LSR und ASR auch mit Lang-
wrtern  arbeiten,  whrend  ein Ergebnis von DIVU oder DIVS nur 16 Bit
anzubieten  htte.  Die Schiebebefehle schieben nur alle Bits in eine Rich-
tung, wobei das herausgeschobene Bit ins C- und X-Flag kopiert wird:

          abcdefgh
        = nabcdefg      C = h   X = h
                                                                        (119)
Bei ASL, LSL und LSR wird ein Null-Bit nachgeschoben, bei ASR hngt
das eingeschobene Bit (hier:  n) vom vormals hchstwertigen Bit ab.

Die  Rotationsbefehle arbeiten vergleichbar den Schiebebefehlen, allerdings
wird  hier das herausgeschobene Bit am anderen Ende wieder eingefgt.  Wenn
Sie also ein Byte um acht Bits nach links verschieben, haben Sie erneut das
selbe Byte.

          abcdefgh
        = habcdefg      C = h

Die  Befehle  ROXL  und  ROXR handhaben den Vorgang geringfgig anders.
Hier  wird  das  herausgeschobene Bit ins X-Flag geschoben, und das vormals
dort  befindliche  Bit wird hereingeschoben.  Hier mten Sie also ein Byte
neunmal schieben, um das selbe Byte wieder zu erhalten.

          abcdefgh
        = Xabcdefg      C = h   X = h

Nach der nchsten Rotation:

          Xabcdefg
        = hXabcdef      C = g   X = g

Es  ist mit den Rotationsbefehlen mglich, eine 32-Bit-Division zu program-
mieren:

Angenommen  wird,  da Sie die beiden Operanden in D0 und D1 bergeben,
zurckgegeben wird das Ergebnis der Division von D1 durch D0 in D1.

        DIVIDE32:
                MOVEQ   #32,D3
                MOVEQ   #0,D2
        .LOOP   SUB.L   D0,D2
                BCC.B   .OK
                ADD.L   D0,D2
                                                                        (120)
        .OK     ROXL.L  #1,D1
                ROXL.L  #1,D2
                DBF     D3,.LOOP
                NOT.L   D1
                RTS

Sie  sehen, da sich eine solche Routine bereits in wenigen Zeilen program-
mieren lt.

        Befehl  Syntax                  Gre

        ASL     ASL     Dx,Dy           B W L
                ASL     #d,Dn           B W L
                ASL     <ea>            W
        ASR     ASR     Dx,Dy           B W L
                ASR     #d,Dn           B W L
                ASR     <ea>            W
        LSL     LSL     Dx,Dy           B W L
                LSL     #d,Dn           B W L
                LSL     <ea>            W
        LSR     LSR     Dx,Dy           B W L
                LSR     #d,Dn           B W L
                LSR     <ea>            W
        ROL     ROL     Dx,Dy           B W L
                ROL     #d,Dn           B W L
                ROL     <ea>            W
        ROR     ROR     Dx,Dy           B W L
                ROR     #d,Dn           B W L
                ROR     <ea>            W
        ROXL    ROXL    Dx,Dy           B W L
                ROXL    #d,Dn           B W L
                ROXL    <ea>            W
        ROXR    ROXR    Dx,Dy           B W L
                ROXR    #d,Dn           B W L
                ROXR    <ea>            W
                                                                        (121)
Wenn  Sie  ein  Register  allerdings  nur  um ein oder zwei Bits nach links
schieben wollen, ist es schneller, eine Addition durchzufhren.

Wollen Sie beispielsweise das Wort in D0 verdoppeln, braucht

        LSL.W   #1,D0

acht Taktzyklen,

        ADD.W   D0,D0

aber nur vier Taktzyklen. Wollen Sie ine Wort in D0 vervierfachen, braucht

        LSL.W   #2,D0

zehn Taktzyklen,

        ADD.W   D0,D0
        ADD.W   D0,D0

aber nur acht Taktzyklen.

Wenn  Sie  aber  ein Langwort in D0 haben, ist die Addition nur noch beim
Verdoppeln schneller als das Schieben.
                                                                        (122)
10.1.5 Manipulationen auf Bit-Ebene

Die Befehle zur Bit-Manipulation werden verwendet, um ein bestimmtes Bit in
einer Speicherstelle oder einem Datenregister zu setzen, zu lschen oder zu
invertieren.

Beispielsweise  knnen  Sie  in  Ihren Programmen D7 als globales Status-
register verwenden, um verschiedene Zustnde zu speichern.

Beispiel:

        CursorAn = 0
                BSET    #CursorAn,D7    ; Der Cursor ist eingeschaltet

Sehr praktisch ist die Tatsache, da die Bit-Befehle die Flags entsprechend
dem  vorherigen  Status  des  ge#nderten  Bits setzen.  Sie knnen also wie
folgt abfragen:

                BCLR    #CursorAn,D7    ; Cursor lschen
                BNE     DerCursorWarAn

        Befehl  Syntax                  Gre

        BTST    BTST    Dn,<ea>         B L
                BTST    #d,<ea>         B L
        BSET    BSET    Dn,<ea>         B L
                BSET    #d,<ea>         B L
        BCLR    BCLR    Dn,<ea>         B L
                BCLR    #d,<ea>         B L
        BCHG    BCHG    Dn,<ea>         B L
                BCHG    #d,<ea>         B L

Langwortweise  drfen Sie diese Befehle nur in Bezug auf Datenregister ver-
wenden.
                                                                        (123)
10.1.6 Befehle zur BCD-Arithmetik

Das  BCD-Format  (Binary  Coded  Decimal)  ist  ein  spezielles Format, das
Rundungsfehler  bei der Umwandlung vermeiden hilft und es darberhinaus er-
leichtert, Zahlen im Speicher in ASCII-Form auf dem Bildschirm auszugeben.

Normalerweise  kann  ein Byte die Werte von 0 bis 255 annehmen, doch in der
binr  codierten Dezimmaldarstellung hat es nur noch den Wertebereich von 0
bis 99.  Wenn wir uns die zwei Nibbles (a vier Bits) in einem Byte ansehen,
stellen   wir   fest,  da  nur  die  ersten  zehn  der  16  mglichen  den
Dezimalzahlen  entsprechen,  denn  nur  diese werden in der BCD-Darstellung
verwendet.

          Binr   BCD-Darstellung

        0000 0000       0
        0000 0001       1
        0000 0010       2
        0000 0011       3
        0000 0100       4
        0000 0101       5
        0000 0110       6
        0000 0111       7
        0000 1000       8
        0000 1001       9
        0001 0000       10
        0001 0001       11
                                                                        (124)
Wenn  Sie  also  eine  binr codierte Dezimalzahl in einen ASCII-String zur
Bildschirmausgabe wandeln wollen, knnen Sie wie folgt verfahren:

        BCDToStr:
                MOVEQ   #0,D0           ; D0 lschen
                MOVE.B  BinByte,D0      ; Byte in D0 einlesen    D0 = $00xy
                LSL.W   #4,D0           ; 4 Bits links schieben  D0 = $0xy0
                LSR.B   #4,D0           ; 4 Bits rechts schieben D0 = $0x0y
                ADD.W   #'00',D0        ; Addiere ASCII '00'     D0 = $3x3y
                MOVE.W  D0,String       ; In Puffer ablegen
                RTS
        BinByte DC.B    4<<4+6          ; Das Byte, von dem wir ausgehen
                EVEN
        String  DC.W    0               ; Hier wird der String eingetragen

Wenn  Sie zwei achtstellige BCD-Zahlen im Speicher haben und diese addieren
wollen, knnen Sie wie folgt vorgehen:

        AddBCD: LEA.L   BCD1+3(PC),A0   ; Letztes Byte der ersten Zahl
                LEA.L   BCD2+3(PC),A0   ; Letztes Byte der zweiten Zahl
                MOVE.W  #4,CCR          ; X-Flag lschen
                ABCD    -(A0),-(A1)
                ABCD    -(A0),-(A1)
                ABCD    -(A0),-(A1)
                ABCD    -(A0),-(A1)
                RTS
        BCD1    DC.L    $12345678       ; erste BCD-Zahl
        BCD2    DC.L    $87654321       ; zweite BCD-Zahl
                                                                        (125)
        Befehl  Syntax                  Gre

        ABCD    ABCD    Dx,Dy           B
                ABCD    -(Ay),-(Ax)     B
        SBCD    SBCD    Dx,Dy           B
                SBCD    -(Ay),-(Ax)     B
        NBCD    NBCD    <ea>            B

10.1.7 Programm-Kontrollbefehle

Die  Kontrollbefehle  sind  sehr  hilfreich, und einige von ihnen haben wir
auch  schon  in den Beispielen verwendet.  Die neben dem Befehl MOVE wohl
am  meisten gebrauchte Instruktion in Assembler-Programmen ist die bedingte
Verzweigung.   Dies sind alle die Befehle, die in der Befehlsliste mit cc
enden.   Anstelle dieses cc setzen Sie bei der Anwendung des Befehls eine
der  logischen  Bedingungen  ein,  die  am Anfang dieses Kapitels erlutert
wurden,  also  zum  Beispiel  EQ  oder  NE.   Sie  verwenden  die  Kon-
trollbefehle folgendermaen:

        SUBQ.W  #1,D0
        BNE     NotFinished     ; weiter bis D0 = 0

        CMP.W   D0,D1
        BHI     Higher          ; D1 grer als D0 ?

        Bedingte Befehle:

        Befehl  Syntax                  Gre

        Bcc     Bcc <Label>             B W (S L)
        DBcc    DBcc Dn,<Label>         W
        Scc     Scc <ea>                B
                                                                        (126)
        Unbedingte Befehle (Verzweigungen):

        Befehl  Syntax                  Gre

        BRA     BRA <Label>             B W (S L)
        BSR     BSR <Label>             B W (S L)
        JMP     JMP <ea>                L
        JSR     JSR <ea>                L

        Rcksprungbefehle:

        Befehl  Syntax          Aktion

        RTR     RTR             MOVE.W (SP)+,CCR    MOVE.L (SP)+,PC
        RTS     RTS             MOVE.L (SP)+,PC

10.1.8 LINK und UNLINK

Diese  Instruktionen  werden  in  erster  Linie  von Hochsprachen-Compilern
benutzt,  beispielsweise  in  Compiler  fr C oder Pascal.  Sie werden nor-
malerweise  verwendet,  um  fr  Subroutinen Platz auf dem Stapel zu reser-
vieren.

Natrlich gibt es auch fr Assembler-Programmierer Situationen, in denen er
diese  Befehle  gut gebrauchen kann, beispielsweise wenn er rekursive Funk-
tionen  schreibt  und  nicht bei jedem Durchlauf extra Speicher reservieren
mchte.

        Befehl  Syntax          Vorgang

        LINK    LINK An,#d      MOVE.L An,-(SP)   MOVE.L SP,An   ADD.W #d,SP
        UNLK    UNLK An         MOVE.L An,SP      MOVE.L (SP)+,An
                                                                        (127)
10.1.9 System-Kontrollbefehle

Unter  den  Befehlen,  die in diese Kategorie fallen, ist der Befehl STOP
derjenige, der am ehesten Erklrung braucht.

Der Befehl STOP ist privilegiert, da er schreibend auf das Statusregister
zugreift.   Nach  der  Ausfhrung  des  Befehls  STOP  befindet  sich der
Prozessor  in  einem  Wartezustand,  aus  dem  er nur durch einen Interrupt
herausgeholt  werden  kann.  Diese Instruktionen ist ntzlich, um wertvolle
Buszyklen zu sparen.

Sehr  wichtig  ist  ebenfalls,  da  der  Befehl MOVE SR,<ea> nur auf dem
68000er  im  User-Modus  aufgerufen  werden kann, whrend alle anderen Pro-
zessoren  der  MC68000-Reihe  sich zu seiner Ausfhrung im Supervisor-Modus
befinden mssen.

        Privilegierte Befehle:

        Befehl  Syntax          Aktion

        RESET   RESET
        RTE     RTE             MOVE.W (SP)+,SR    MOVE.L (SP)+,PC
        STOP    STOP #d         MOVE.W #d,SR und Stop
        ANDI    ANDI #d,SR
        EORI    EORI #d,SR
        ORI     ORI #d,SR
        MOVE    MOVE <ea>,SR
                MOVE USP,An
                MOVE An,USP
                                                                        (128)
        Trap-erzeugende Instruktionen:

        Befehl  Syntax          Aktion

        TRAP    TRAP #<vector>
        TRAPV   TRAPV           Wenn V = 1 dann Trap
        CHK     CHK <ea>,Dn

        Statusregister-Instruktionen:

        Befehl  Syntax          Aktion

        ANDI    ANDI.B #d,CCR
        EORI    EORI.B #d,CCR
        ORI     ORI.B #d,CCR
        MOVE    MOVE <ea>,SR
                MOVE SR,<ea>    ; Privilegiert auf MC68010 und hher

10.2 Exceptions oder Ausnahmeroutinen

In  einem Programm fhrt man normalerweise eine bestimmte Unterroutine aus,
wenn  eine  spezielle Funktion bentigt wird.  Wenn dem Prozessor bestimmte
Umstnde  zustoen,  fhrt  er  automatisch  eingene  Unterroutine aus, die
Exceptions oder Ausnahmebehandlungen genannt werden.

Exceptions unterscheiden sich von normalen Unterprogrammen nur dadurch, da
sie  nicht durch einen RTS-Befehl, sondern durch den Befehl RTE (Return
from  Exception)  abgeschlossen  werden  mssen.   Die Ausnahmeroutinen des
68000 sind folgende:
                                                                        (129)
        Vektor  Adresse         Zuordnung

        0       $000            RESET: Initialwert SSP
        1       $004            RESET: Initialwert PC
        2       $008            Busfehler
        3       $00c            Adrefehler
        4       $010            illegale Instruktion
        5       $014            Division durch null
        6       $018            CHK-Vektor
        7       $01c            TRAPV-Vektor
        8       $020            Privilegverletzung
        9       $024            Trace
        10      $028            LINE_A-Emulation
        11      $02c            LINE_F-Emulation
        12-14   $030 - $03b     reserviert
        15      $3c             nicht initialisierter Interrupt
        16-23   $040 - $05f     reserviert
        24      $60             Spurious Interrupt
        25      $64             Level 1 Interrupt Autovektor
        26      $68             Level 2 Interrupt Autovektor
        27      $6c             Level 3 Interrupt Autovektor
        28      $70             Level 4 Interrupt Autovektor
        29      $74             Level 5 Interrupt Autovektor
        30      $78             Level 6 Interrupt Autovektor
        31      $7c             Level 7 Interrupt Autovektor
        32-47   $080 - $0bf     TRAP-Instruktionsvektoren
        48-63   $0c0 - $0ff     reserviert
        64-255  $100 - $3ff     Benutzer-Interrupts
                                                                        (130)
        RESET: Initialwert SSP

Von  hier  wird  der Initialwert fr den Supervisor-Stackpointer beim Reset
des  Systems  geholt.   Sie  werden  allerdings an dieser Adresse nicht den
SSP finden, da hier nur beim Start des Systems das Amiga-ROM eingeblendet
wird.  Danach ist die Adresse 0 unbenutzt.

        RESET: Initialwert PC

Von  hier  wird  der Initialwert fr den Supervisor-Stackpointer beim Reset
des  Systems  geholt.  Sie werden allerdings an dieser Adresse nicht den PC
finden, da hier nur beim Start des Systems das Amiga-ROM eingeblendet wird.
Danach ist die Adresse 4 die Adresse der Exec-Base.

        Busfehler

Diese  Exception  wird aufgerufen, wenn auf reservierten oder nicht zugng-
lichen Speicher zugegriffen wurde.

        Adrefehler

Tritt auf, wenn auf eine ungerade Adresse zugegriffen wird.

        Illegale Instruktion

Eine  illegale  Instruktion  ist  ein  16-Bit-Binrmuster,  dem  keiner der
gltigen  MC68000-Befehle  zugeordnet  ist.   Dazu  gehrt  auch der Opcode
$4afc, der in der Assembler-Sprache direkt als ILLEGAL verwendet werden
kann, um diese Exception gezielt auszulsen.

        Division durch null

Tritt auf, wenn durch null geteilt werden soll; zum Beispiel DIVS #0,D0.
                                                                        (131)
        CHK-Vektor

Ist  reserviert  fr  die  Instruktion CHK.  ber diesen Vektor kann eine
Fehlerbehandlung  gestartet werden, wenn eine CHK-Bereichsberprfung er-
gibt, da der zulssige Wertebereich berschritten ist.

        TRAPV-Vektor

Ist  reserviert  fr die TRAPV-Instruktion.  Die Instruktion TRAPV lst
diese  Exception  aus,  wenn das V-(Overflow-)Bit im Register CCR gesetzt
ist.

        Privilegverletzung

Wird  ausgelst,  wenn  Sie  einen privilegierten Befehl im User-Modus ver-
wenden, zum Beispiel RESET oder MOVE.W #xx,SR.

        Trace

Wird  bei gesetztem Trace-Bit im Supervisor-Register nach jedem Befehl auf-
gerufen, um eine Abarbeitung in Einzelschritten zu ermglichen.

        LINE_A-Emulation

Auf  dem  MC68000  sind  nicht  alle mglichen Opcodes verwendet worden, da
einige fr sptere Verwendung reserviert wurden.  Dies sind in erster Linie
die  Befehls-Opcodes,  die  mit $A oder $F beginnen.  Alle Opcodes, die
mit  $A beginnen, werden LINE_A-Befehle genannt.  Sie finden Verwendung
bei  der  Implementation  eigener  Befehle  oder  bei  der  Ansteuerung von
Coprozessoren.

        LINE_F-Emulation

Entspricht  der  LINE_A-Emulation, lediglich fr die Befehle deren Opcode
mit $F beginnt.
                                                                        (132)
11.  Programmbeispiele

In diesem Kapitel werden wir verschiedene Programmiertechniken und Mglich-
keiten zur Lsung von Programmierproblemen kennenlernen.

Auf  der  Programmdiskette befinden sich folgende Beispielprogramme im Ver-
zeichnis Examples.

        GettingStarted.S

Dies  ist  ein  Quelltext,  der auf der System-Startup-Routine basiert.  Er
zeigt einfach nur ein fraktales Bild an.

        SystemStartUp.S

Wenn  Sie ein Programm unter Verwendung der Betriebssystemroutien schreiben
(wie  zum Beispiel ASM-ONE), dann gibt es verschiedene Grundfunktionen, die
Sie  dabei  immer  brauchen.   Die  meisten  davon  finden  Sie  in  diesem
Startup-Modul.

        BinaryConv.S

Konvertiert  einen  Registerinhalt  in  einen binren ASCII-String.  Dieses
Beispiel ist fr die ersten Schritte mit dem Debugger gedacht.

        BootBlock.S

Erzeugt  einen  eigenen  Bootblock, den Sie mit einen eigenen Text versehen
knnen.

        NonSystemStartUp.S

Ntzlicher Startup-Code fr alle Hardware-nahen Programme und Routinen.
                                                                        (133)
        ScrollExample.S

Eine  kleine  Scrolltext-Routine,  die  auf  der Non-System-Startup-Routine
basiert.

        LineDraw.S

Basiert wie ScrollExample.S auf der Non-System-Startup-Routine.

        WindowExample.S

Ein  Beispiel  fr  die  Verwendung  von Includefiles.  ffnet ein Fenster,
liest einen String von der Tastatur ein und gibt ihn im Fenster aus.

        Directory.S

Basiert  auf Includes wie das Window-Beispiel.  ffnet ein Fenster und gibt
darin ein Directory aus.

Die  obigen Beispiele sind weitestgehend selbsterklrend und wurden auf die
Diskette  aufgenommen,  weil  sie  zu  lang zum Abdrucken sind.  Sie knnen
Teile  dieser  Quellcodes  auch in Ihren eigenen Programmen verwenden, aber
ich  rate Ihnen, da Sie nur versuchen, die Funktionsweise der Beispiele zu
verstehen und dieses Wissen in Ihren Programmen zu verwenden.

Zu  diesem  Zweck dienen auch die Beispielprogramme, die in diesem Handbuch
abgedruckt sind.  Es ist natrlich mglich, viele davon zu optimieren, aber
ich  fand  es  sinnvoller,  verschiedene  Programme  fr  mehrere  Probleme
vorzustellen als nur eine Handvoll hochoptimierter Algorithmen.
                                                                        (134)
Die  nun  folgenden  Programmierbeispiele  lassen  sich  in drei Kategorien
aufteilen:

        Allgemeine Beispiele:   Programme, die auf jedem MC68000-System
                                lauffhig sind
        Systemprogrammierung:   Programme, die auf das Amiga-Betriebssystem
                                zurckgreifen
        Hardwareprogrammierung: Programme, die die Amiga-Hardware direkt
                                nutzen

11.1 Allgemeine Beispiele

In  den  folgenden  Beispielen  werden wir verschiedene Methoden zur Lsung
einiger  einfacher Probleme diskutieren.  Die Ausfhrungszeit der einzelnen
Routinen  wird  angegeben,  um  zu  vergleichen,  welche  Problemlsung die
schnellste ist.

Wenn  Sie  ein absoluter Anfnger im Bereich Maschinensprache sind, sollten
Sie  dieses  Unterkapitel  berspringen und es erst durcharbeiten, wenn Sie
sich eigene Grundkenntnisse angeeignet haben.

11.1.1 Langwort-Multiplikation

Der  MC68000  kann  zwar  16-Bit-Werte  mit  einem  einzigen  Befehl multi-
plizieren,  aber in gewissen Anwendungen ist es erforderlich, 32-Bit-Zahlen
miteinander zu multiplizieren.  Zunchst ein wenig Theorie:

Wir  betrachten zwei zweistellige Zahlen, wobei wir jede Ziffer durch einen
anderen Buchstaben reprsentieren:

        xy * mn
                                                                        (135)
Wenn  wir  diese  beiden Zahlen miteinander multiplizieren wollen, aber nur
noch  wissen,  wie man einstellige Zahlen multipliziert (weil wir das groe
Einmaleins schon wieder vergessen haben), gehen wir wie folgt vor:

          | x | y |                     |  y*n  |
        * | m | n |     =           |  x*n  |   * 10
                                    |  y*m  |   * 10
                                |  x*m  |       * 100
                                -----------------
                        =       | a | b | c | d |

Wie  man  sieht,  erhalten  wir  eine  vierstellige  Zahl.  Anstatt nun die
einzelnen  Ziffern zu betrachten, gehen wir zu 16-Bit-Zahlen ber.  Das nun
folgende  Programm  multipliziert  zwei  32-BitZahlen  mittels vier 16-Bit-
Multiplikationen.

        Wir haben:              HiWord  LoWord
                        D0 =      x       y
                        D1 =      m       n

Das  Resultat  wid in D0 (hherwertige 32 Bit) und D1 (niederwertige 32
Bit) abgelegt:

        MULU32  MOVEM.L D2/D3/D4,-(A7)  ; Sichere verwendete Register
                MOVE.W  D1,D2           ; D2 = n
                MOVE.L  D1,D3           ; D1 = n
                SWAP    D3              ; D3 = m
                MOVE.W  D3,D4           ; D4 = m
                MULU    D0,D1           ; D1 = y*n
                MULU    D0,D3           ; D3 = y*m
                SWAP    D0
                MULU    D0,D2           ; D2 = x*n
                MULU    D4,D0           ; D0 = x*m
                                                                        (136)
                SWAP    D1
                ADD.W   D2,D1           ; D1 = D1 + D2<<16
                CLR.W   D2
                SWAP    D2
                ADDX.L  D2,D0           ; D0 = D0 + D2>>16 + Carry
                ADD.W   D3,D1
                CLR.W   D3
                SWAP    D3
                ADDX.L  D3,D0           ; D0 = D0 + D2>>16 + Carry
                SWAP    D1              ; D1 wieder in der richtigen
                                        ; Reihenfolge
                MOVEM.L (A7)+,D2/D3/D4
                RTS

Diese 32-Bit-Multiplikationsroutine braucht nur fnf Register.  Genauso ist
es  auch  mglich, zwei vorzeichenbehaftete 32-Bit-Werte zu multiplizieren,
aber das berlasse ich Ihnen als bung.

Ich  habe spaeshalber auch die Ausfhrungszeit fr dieses Beispielprogramm
ausgerechnet,  die 432 Taktzyklen betrgt.  Wenn Sie die Routine allerdings
als  ein Makro verwenden (also ohne das RTS) und erlauben, da D2, D3
und D4 verndert werden, braucht die Routine nur noch maximal 348 Zyklen.
(dies ist der Maximalwert fr den ungnstigsten Fall, da ein MULU maximal
70 Zyklen braucht.)

Natrlich  ist  es  nach  dieser  Methode  auch  mglich,  ein  Programm zu
schreiben,  das  Zahlen  mit  mehr als 32 Bit multipliziert, doch Werte mit
dieser  Genauigkeit werden nur sehr selten verwendet.  Normalerweise greift
man dann auf Fliekomma-Arithmetik zurck.
                                                                        (137)
11.1.2 Langwort-Division

Wo  wir  gerade bei der 32-Bit-Integerarithmetik sind, mchte ich nun noch-
mals  auf  die  Divisionsroutine zurckkommen, die bereits bei der Vorstel-
lung des Befehlssatzes angesprochen wurde.

Hier  ist  eine optimierte Version, die in D1 den Quotienten aus D1 und
D0 zurckgibt:

        DIVIDE32b:
                MOVEQ   #0,d2
                REPT    32
                 SUB.L  D0,D2
                 BCC.B  *+2     ; Springt zur aktuellen Adresse +2
                 ADD.L  D0,D2   ; wird gegenenfalls bersprungen
                 ADDX.L D1,D1
                 ADDX.L D2,D2
                ENDR
                NOT.L   D1
                RTS

Diese Routine braucht maximal 1288 und mindestens 1096 Zyklen.

11.1.3 Lschen, Kopieren und Vergleichen

Nachdem  wir  diese  einfachen mathematischen Routinen implementiert haben,
gehen  wir  zu  einem anderen wichtigen Gebiet ber:  das Lschen, Kopieren
und Vergleichen von Daten.  Zunchst das Lschen:
                                                                        (138)
Bevor  Sie  eine Methode zum Lschen von Daten auswhlen, sollten Sie einen
Moment  ber  den konkreten Fall nachdenken.  Gibt es eine oder gar mehrere
konstante Bedingungen?

Nehmen  wir einmal an, da Sie den Bildspeicher lschen wollen.  Sie knnen
hierzu  natrlich  auf  den  Blitter zurckgreifen - doch was ist, wenn der
Blitter  bereits  mit  etwas  anderem  beschftigt  ist?  Der erste Versuch
knnte eine Schleife sein:

        CLEAR1  LEA.L   SCREEN,A0
                MOVE.W  #80*200-1,D0    ; Bytes - 1
        .LOOP   CLR.B   (A0)+
                DBF     D0,.LOOP

Die  kann  bereits  betrchtlich verbessert werden, wenn Sie mit dem Befehl
MOVE.L  D1,(A0)+  ein  ganzes Langwort auf einmal lschen.  CLR.L (A0)+
sollten Sie nicht verwenden, da die CLR.L-Instruktion auf dem 68000er vor
dem Schreibzugriff ncoh lesend zugreift.

Sie  knnten die Instruktion auch viele Male hintereinander folegnb lassen,
soda Sie die Zyklen fr die DBF-Instruktion einsparen:

        CLEAR2  MOVEQ   #0,D0
                LEA.L   SCREEN,A0
                REPT    80*200/4
                 MOVE.L D0,(A0)+
                ENDR
                RTS

Dies erlaubt Ihnen, 2387000 Byte pro Sekunde zu lschen - aber das Programm
ist 12800 Byte lang.

Und  es  geht  noch  schneller.  Wenn Sie das Kommando MOVEM benutzen und
alle   (vorher  geleerten)  Register  mit  einem  Befehl  in  den  Speicher
schreiben, ist die vorher erreichte Geschwindigkeit noch zu berbieten.
                                                                        (139)
        CLEAR3  MOVEM.L  BLANK,D0-A1
                LEA.L    SCREENED,A2
                REPT     2*200
                 MOVEM.L D0-A1,-(A2)
                ENDR
                RTS

Diese  Routine  lscht  3240000 Byte pro Sekunde und belegt nur noch 1600
Byte.

Dieses  Beispiel  beschftigte sich mit einem Datenfeld, ber das sie alles
wuten  -  insbesondere  die Gre.  Nehmen wir nun ein Beispiel, indem Sie
gar  nichts wissen:  Die Routine bekommt eine Position und eine Lnge ber-
geben und kein Byte mehr.

Auch hier knnten wir wieder die Routine CLEAR1 verwenden, und auch unter
diesen  Umstnden  lt  sie  sich  ncoh beschleunigen.  Der naheleigendste
Schritt  lautet  auch  hier,  die Lschanweisung mehrfach hinterineander zu
schreiben:

(Die  Routine  wird  mit einem Pointer in A0 und der Lnge in D0 aufge-
rufen.)

        CLEAR1.2
                MOVEQ   #0,D1           ; Fllwert = 0
                SUBQ.L  #8,D0           ; Dekremntiere Zhler um 8
                BMI.B   .NOMORE         ; Keine ganzen 8 Byte mehr?
        .LOOP   REPT    8
                MOVE.B  D1,(A0)+        ; Lsche 8 Bytes
                ENDR
                SUBQ.L  #8,D0           ; noch 8 mehr
                BPL.B   .LOOP           ; fertig
                                                                        (140)
        .NOMORE ADDQ.L  #7,D0           ; wie viele noch?
                BMI.B   .FINI           ; keines?
        .LOOP2  MOVE.B  D1,(A0)+        ; Lsche die restlichen mit einer
                                        ; DBF-Schleife
        .FINI   RTS

Diese  Roustine  ist  schon recht schnell, aber auch sie lt sich noch be-
schleunigen,  wenn  die Adresse zunchst auf eine Wortgrenze justiert wird,
soda Sie die Langwort-Instruktionen verwenden knnen.

Ein  Schema  fr  ein  solches Programm folgt unten.  Das Programm ist noch
nicht  in  Assembler  umgesetzt,  da  dies  eine  bung  fr Sie darstellt.
Beachten  Sie bitte, da es besser ist, die Adresse auf ein Langwort, statt
nur  auf  ein  Wort  auszurichten,  weil auf dem MC68020 und hher MOVE.L
schneller  ist,  wenn  es  auf  eine Langwortgrenze ausgerichtet ist.  Dies
liegt  daran, da diese Prozessoren einen 32-Bit-Datenbus anbieten, und ein
Langowrtzugriff  auf eine nicht durch 4 teilbare Adresse dann trotzdem zwei
Speicherzugriffszyklen braucht.

        CLEAR1.3
                Adresse auf Langwortgrenze anpassen, indem die ersten 0 bis
                3 Bytes einzeln gelscht werden
                -----------------------------------------------------------
                Langwortweise lschen
                -----------------------------------------------------------
                Letzte 0 bis 3 Bytes wieder einzeln lschen
                -----------------------------------------------------------
                RTS

Diese  Routine  ist umso schneller, je grer der zu lschende Bereich ist.
Ab  10  bis 20 Byte (je nach Implementation) ist sie generell schneller als
die  erste  Routine.   In  der  optimalen Version ist diese Routine dreimal
schneller als die erste und siebenmal schneller als CLEAR1.
                                                                        (141)
Dieser  Algorithmus  ist auch verwendbar, um Speicherinhalte zu verschieben
oder zu vergleichen.

Ich  mchte  Ihnen  hier noch eine ntzliche Kopierroutine zeigen, die nach
dem Prinzip arbeitet, das in CLEAR1.2 verwendet wurde.

Sie  rufen  diese  Routine  mit  einem Zeiger auf die Quelladresse in A0,
einem Zeiger auf die Zieladresse in A1 und der Lnge in D0 auf:

        COPY1.2
                SUBQ.L  #8,D0
                BMI.B   .NOMORE
        .LOOP   REPT    8
                MOVE.B  (A0)+,(A1)+
                ENDR
                SUBQ.L  #8,D0
                BPL.B   .LOOP
        .NOMORE ADDQ.L  #7,D0
                BMI.B   .FINI
        .LOOP2  MOVE.B  (A0)+,(A1)+
                DBF     D0,.LOOP2
        .FINI   RTS

11.1.4 Sortieren

Sortieren  ist  eine  weitere  wichtige  Anwendung,  und es gibt viele ver-
schiedene  Algorithmen,  um  eine Sortierung durchzufhren.  Einer der ein-
fachsten  und bekanntesten ist der Bubblesort-Algorithmus.  Er funktioniert
wie folgt:

Wir betrachten die folgenden fnf Ziffern

        3 4 2 5 1
                                                                        (142)
Bubblesort  betrachtet  immer  nur  zwei  Ziffern und tauscht sie, wenn die
erste  grer ist als die zweite ist.  Nach dem ersten Paar wird das zweite
bearbeitet,  dann  das  dritte  und  so weiter.  Wenn nach einem kompletten
Durchlauf  kein  Tausch  mehr  ausgefhrt  werden  konnte, sind die Nummern
fertig sortiert.

        3 2 4 1 5       getauscht: 4-2 5-1
        2 3 1 4 5       getauscht: 3-2 4-1
        2 1 3 4 5       getauscht: 3-1
        1 2 3 4 5       getauscht: 2-1
        1 2 3 4 5       getauscht: keine

Wie  Sie  sehen  knnen,  braucht  der Algorithmus fnf Durchlufe, um fnf
Zahlen zu sortieren, also 5*5=25 Vergleiche.

Man  sagt,  da die Effizienz dieses Algorithmus 0(n*n) ist.  Das bedeutet,
da  n  Elemente  (n*n)-mal miteinander verglichen werden mssen, um sie zu
sortieren.   Wenn  dafr  jedesmal beispielsweise 72 Zyklen bentigt werden
(also  100000 Vergleichs- und Tauschoperationen in der Sekunde durchgefhrt
werden), dauert es zehn Sekunden, um 1000 Elemente zu sortieren.

Die  Bubblesort-Routine  kann  allerdings effizienter implementiert werden.
Zunchst  fllt  auf,  da  Listen  mit nur einer vertauschten Zahl je nach
Position in vllig verschiedenen Zeiten sortiert werden:

        5 1 2 3 4       sortiert in zwei Durchlufen
        2 3 4 5 1       sortiert in fnf Durchlufen

Es  gengt  eine  minimale  nderung, um dieses Manko zu beheben.  Wenn wir
beim  ersten  Durchlauf von links nach rechts, beim zweiten aber von rechts
nach links rckwrts vergleichen, erreicht Bubblesort schon bessere Zeiten:
                                                                        (143)
        5 1 2 3 4       sortiert in zwei Durchlufen
        2 3 4 5 1       sortiert in drei Durchlufen

Wenn wir diese Methode anwenden, erhalten wir fr das erste Beispiel 
3 4 2 5 1:

        3 2 4 1 5       getauscht: 4-2 5-1
        1 2 3 4 5       getauscht: 4-1 2-1 3-1
        1 2 3 4 5       getauscht: 3-2
        1 2 3 4 5       getauscht: keine

Nun braucht die Routine nur noch vier Durchlufe statt vorher fnf.

Wenn  wir  noch  weiter  optimieren  wollen, knnen wir folgendes tun:  Man
merkt  sich  bei einem Durchlauf, an welcher Position das erste Element ge-
tauscht  werden mute, und fhrt beim nchsten Durchlauf erst eine Position
vor dieser den ersten Vergleich durch.

Wir  knnen  noch  mehr  Umstnde  prfen,  doch darf dabei nicht vergessen
werden,  da  die  Routine, wenn sie sehr viele Tests durchfhrt, unter Um-
stnden  lnger  mit den Tests beschftigt ist, als das Sortieren ohne alle
Tests bentigt htte.

Die  Version von Bubblesort, die ich selbst blicherweise benutze, ist fol-
gende:

berprfe  die  beiden Elemente.  Wenn sie getauscht werden mssen, tausche
sie,  und  gehe  ein Paar zurck.  Wenn nicht getauscht wird, gehe ein Paar
vorwrts.  Die Reihe ist sortiert, wenn das Ende erreicht ist.

Die  Resultate  dieser  Routine sind recht gut.  Normalerweise arbeitet sie
vier-  bis  fnfmal  schneller  als  die  erste Routine, die ich Ihnen vor-
gestellt habe.

In 68000-Assembler sieht die Routine wie folgt aus:
                                                                        (144)
        BUBBLE_A_LA_RUNE:
                LEA     ListStart,A0    ; A0 = Startzeiger
                LEA     ListEnd,A1      ; A1 = Endzeiger
                MOVEQ   #ElemLen,D1     ; D1 = Elementlnge
                MOVE.L  A0,A2           ; A2 = Zeiger auf aktuelles Element
                MOVE.L  A0,A3
                ADD.L   D1,A3           ; A3 = Zeiger auf nchstes Element
        .LOOP   MOVE.B  (A3),D0
                CMP.B   (A2),D0         ; Element A <= Element B?
                BLO.B   .CHANGE         ; Nicht tauschen
                ADD.L   D1,A2
                ADD.L   D1,A3
                CMP.L   A3,A1           ; Ende erreicht?
                BNE.B   .LOOP           ; Sonst weiter
                RTS

        .CHANGE MOVE.L  D1,D2           ; Tausche Elemente
        .LOOP2  MOVE.B  (A2),D0
                MOVE.B  (A3),(A2)+
                MOVE.B  D0,(A3)+
                SUBQ.L  #1,D2
                BNE.B   .LOOP2

                SUB.L   D1,A2
                SUB.L   D1,A3
                CMP.L   A2,A0           ; Am ersten angekommen?
                BEQ.B   .LOOP           ; Ja, zurck zur Schleife

                SUB.L   D1,A2           ; Ein Element vor
                SUB.L   D1,A3           ; Ein Element zurck
                BRA.B   .LOOP           ; Und nochmals
                                                                        (145)
Diese  Implementation ist sehr allgemein gehalten.  Wenn Sie lediglich Ele-
mente  fester  Lnge  sortieren wollen und diese Lnge durch 2 teilbar ist,
knnen  Sie  eine  SWAP-Routine mit Langwort-Instruktionen schreiben.  Aber
natrlich wird auch die obenstehende Routine zuverlssig arbeiten.

Bubblesort  arbeitet  am besten, wenn Sie nur kleine Datenfelder haben oder
Datenfelder, die weitgehend vorsortiert sind.

11.2 Systemprogrammierung

Das  Amiga-Betriebssystem  bietet  viele  Mglichkeiten, die zu umfangreich
sind,  um  sie  hier  alle detailliert zu beschreiben.  Dieses Unterkapitel
wird  Ihnen  aber  anhand  einiger  Beispiele  aufzeigen,  was  Sie mit dem
Betriebssystem  erreichen  knnen.  Weitere Details entnehmen Sie am besten
den ROM Kernal Manuals von Commodore (vergleiche Literaturhinweise).

Das  System  des  Amiga  basiert  auf verschiedenen Libraries.  Die meisten
davon  befinden  sich  im  ROM, aber einige auch im Verzeichnis LIBS: auf
Diskette  und  mssen vor ihrer Verwendung geladen werden.  Die wichtigsten
sind:

        exec.library

Dies  ist  die  Basis-Library.  Mit ihr knnen Sie andere Libraries ffnen,
Speicher allozieren, Tasks erzeugen etc.

        dos.library

Enthlt  die Grundfunktionen zur Ein- und Ausgabe, gleich ob auf Laufwerke,
Drucker oder den Bildschirm.

        intuition.library

Handhabt Screens, Windows, Menus etc.
                                                                        (146)
        graphics.library

Enthlt  Routinen  zum Zeichnen, Fllen, Scrollen, und Lschen von Grafiken
und Grafikelementen.

        layers.library

Kmmert sich um berlappende Bildbereiche.

        diskfont.library

Diese  Library  ist  auf  der  Diskette  und  enthlt  Routinen,  um andere
Zeichenstze verwenden zu knnen.

        icon.library

Funktionen zum Erzeugen und Verndern von Icons auf dem Workbench-Screen.

        translator.library

Wird   zusammen  mit  dem  Software-migen  Sprachsynthesizer  (narrator.
device)   verwendet,  bersetzt  englischen  Text  in  die  entsprechenden
phonetischen Symbole.

        mathffp.library

Enthlt die einfachen Fliekommaroutinen.

        mathieedoubbas.library

Rechenroutinen mit doppelter Genauigkeit.

        mathtrans.library

Komplexere Fliekommafunktionen wie SIN, COS, LOG, EXP etc.
                                                                        (147)
Es  gibt  noch  weitere  Libraries,  die  aufgefhrten  sind  aber  die ge-
bruchlichsten.   Normalerweise  verwendet man bei der Benutzung von Libra-
ries  die  entsprechenden  Include-Files,  die  Sie  in einem eingenen Ver-
zeichnis  auf Ihrer ASM-ONE-Diskette vorfinden.  Sie enthalten die Konstan-
ten  (zum Beispiel Offsets, Flag-Definitionen) und Makrodefinitionen zu den
Libraries.

Bevor  Sie  allerdings  ein  Include-File nutzen knnen, mssen Sie ASM-ONE
verraten,  in  welchem  Pfad  er  sie  suchen soll.  Das erledigt folgendes
Kommando:

        INCDIR  df0:include/

Hier  befinden  sich  normalerweise  die  Include-Files, vorrausgesetzt Sie
haben die ASM-ONE-Diskette im Laufwerk DF0:.

Binden  Sie  nun  folgende  Include-Files ein, die wir in den nchsten Bei-
spielen brauchen werden:

        include exec/exec_lib.i
        include libraries/dos_lib.i
        include libraries/dos.i
        include intuition/intuition_lib.i
        include intuition/intuition.i

Um  eine  Library  zu  ffnen,  verfahren  Sie  wie  folgt - angenommen die
dos.library soll geffnet werden.

        DOS_LIBOPEN
                LEA.L    _DOSNAME(PC),A1        ; A1 => dos.library
                MOVEQ    #0,D0                  ; Version 0
                CALLEXEC OpenLibrary            ; Library ffnen
                MOVE.L   D0,_DOSBASE            ; _dosbase => library
                BEQ.L    ERROR_ERROR            ; Nullpointer = Fehler
                RTS
                                                                        (148)
        _DOSNAME DOSNAME                        ; Dosname ist ein Makro, das
                                                ; den String 'dos.library',0
                                                ; enthlt
        _DOSBASE DC.L   0                       ; Pointer auf die Library

Nach  dem  Aufruf  dieser  Routine  wird ein Zeiger auf die Library zurck-
gegeben.   Wenn  die  dos.library nicht geffnet werden konnte, wird eine
null   zurckgegeben.   Allerdings  ist  dann  etwas  sehr  schwerwiegendes
schiefgelaufen ...

Wenn   Sie  die  Include-Files  nicht  verwenden,  mssen  Sie  den  Offset
OpenLibrary wie folgt definieren

        OpenLibrary     = -552

und die Routine she so aus

        DOS_LIBOPEN_NO_INCLUDE:
                LEA.L    _DOSNAME(PC),A1        ; A1 => dos.library
                MOVEQ    #0,D0                  ; Version 0
                MOVE.L   4.W,A6                 ; Zeiger auf exec.library
                JSR      OpenLibrary(A6)        ; Library ffnen
                MOVE.L   D0,_DOSBASE            ; _dosbase => library
                BEQ.L    ERROR_ERROR            ; Nullpointer = Fehler
                RTS
        _DOSNAME DC.B   'dos.library'           ; Name (in Kleinschrift!)
        _DOSBASE DC.L   0                       ; Pointer auf die Library
                                                                        (149)
Der  Vorteil  bei  Include-Files ist, da Sie sich nicht mehr alle Library-
Offsets merken mssen.  Im obigen Beispiel war das der Offset OpenLibrary
mit einem Wert von -552.

Die   einzige   Lirbary,   deren   Adresse  direkt  bekannt  ist,  ist  die
exec.library.   Der  Zeiger  auf  die  exec.library  befindet  sich  im
Speicher  an  Adresse $4.  Exec erfllt eine Vielzahl von Aufgaben, smt-
liche  Exec-Routinen  finden  Sie in der Datei exec_lib.i.  Wenn Sie eine
solche  Exec-Routine  aufrufen  wollen,  mssen  Sie  das  an  der  Adresse
ExecBase+Offset  tun.   Da alle Offsets negativ sind, folgt, da die Ein-
sprungadressen  vor  der Basis der Library liegen.  Dort befinden sich tat-
schlich  nicht die Routinen, sondern nur Sprungbefehle, die in die Routine
springen.

Alle  Library-Offsets  folgen  in  Sechserschritten aufeinander, da ein ab-
soluter  Sprung  6  Bytes  belegt.  Die ersten EIntrge in der Exec-Offset-
Tabelle sind folgende:

        Supervisor      = -30
        ExitIntr        = -36
        Schedule        = -42

Und viel weiter unten in der Liste finden wir

        OpenLibrary     = -552

Wenn  wir  an  der  Adresse  ExecBase-552 nachsehen, finden wir etwas wie
dieses:

        $0000044e JMP $00005E3A ; Verlassen Sie sich nicht auf diesen Wert,
                                ; er knnte sich in zuknftigen Betriebs-
                                ; systemversionen ndern

Sie  sehen,  da  in Wirklichkeit nur ein Sprungbefehl aufgerufen wird, der
die Routine startet.
                                                                        (150)
In  den restlichen Beispielen werden die Definitionen aus den Include-Files
genutzt.   Wollen Sie sehen, was exakt mit Ihrem Quelltext passiert, disas-
semblieren Sie die Routinen.  Um alle Include-Definitionen zu sehen, assem-
blieren Sie mit =S.

Nachdem wir die Library geffnet haben, brauchen wir auch eine Routine, die
sie wieder schliet:

        DOS_LIBCLOSE
                MOVE.L   _DOSBASE(PC),A1        ; Pointer auf die Library
                CALLEXEC CloseLibrary           ; Schliee sie!
                RTS

Nach  dem  ffnen  der  dos.library  knnen wir sehr einfach ein Ausgabe-
fenster auf dem Workbench-Screen ffnen.

        WINDOW_OPEN
                MOVE.L  #_WINDOWNAME,D1         ; Window-Definition
                MOVE.L  #MOVE_OLDFILE,D2        ; CON: mu existieren
                CALLDOS Open
                MOVE.L  D0,_WINDOWHANDLE        ; Das Window-Handle
                BEQ.L   ERROR                   ; Null, wenn Fenster nicht
                                                ; geffnet werden konnte.
                RTS

        _WINDOWNAME     DC.B 'CON:10/10/600/100/Mein Fenster',0
        _WINDOWHANDLE   DC.L 0

Die Routine zum Schlieen des Fensters:

        WINDOW_CLOSE
                MOVE.L  _WINDOWHANDLE(PC),D1
                CALLDOS Close
                RTS
                                                                        (151)
Beachten Sie, da das geffnete Fenster auf dem Workbench-Screen hinter dem
ASM-ONE-Screen erscheint, den Sie mit der Maus herunterziehen mssen.

Mit  CON:-Fenstern knnen Sie schon einiges machen.  Die folgende Routine
gibt beispielsweise Text in das Fenster aus.

        TEXT_WRITE
                MOVE.L  #TEXT,D2                ; Pointer auf Text
                MOVE.L  #TEXT_END-TEXT,D3       ; Textlnge
                MOVE.L  _WINDOWHANDLE,D1        ; Window-Handle
                CALLDOS Write                   ; Text schreiben
                RTS

        TEXT    DC.B    'Hallo, dies ist ein Text'
        TEXT_END

Programme,  die  all  diese Funktionen nutzen, finden Sie in den Beispielen
WindowExample.S oder Directory.S.

11.3 Hardware-Programmierung

Wie  bereits  im  ersten  Kapitel erwhnt, ist einer der Grnde, Maschinen-
sprache  einzusetzen,  der  sehr  einfache  und  direkte  Zugriff  auf  die
Hardware.   Dieses  Kapitel  ber die Hardware-Programmierung wird sich auf
eine  Einfhrung beschrnken, fr weitere Informationen sollten Sie auf das
Amiga Hardware Reference Manual von Commodore zurckgreifen.

Sie werden das Betriebssystem in den meisten Fllen abschalten mssen, wenn
Sie die Hardware direkt programmieren wollen.
                                                                        (152)
Damit verhindern Sie, da merkwrdige Effekte auftreten, wenn das Betriebs-
system auch auf die Hardware zugreifen mchte.

Natrlich  knnen  Sie  auch mit Betriebssystemroutinen alles Machbare pro-
grammieren,  doch  manche Programmierer ziehen es vor, genau zu wissen, was
die  Maschine  tut.   Wenn Sie die Chips direkt ansprechen, knnen Sie Ihre
eigenen,   hochoptimierten   Routinen  schreiben,  die  eventuell  deutlich
schneller  als  die  des  Betriebssystems  sind.  Allerdings ist dann nicht
sicher,  da  Ihr Programm auch noch auf zuknftigen Versionen der Hardware
luft.

Andererseits  sind  einige  Erfahrungen  in der Programmierung der Hardware
aber  auch  dann  ntzlich,  wenn  Sie mit dem Betriebssystem programmieren
wollen,  denn  sie sind eine groe Hilfe beim Verstndnis der exakten Funk-
tion der Betriebssystemroutinen.

Auf  der ASM-ONE-Diskette befindet sich ein Programmtext namens NonSystem-
Startup.S,  der Routinen enthlt, die das Betriebssystem komplett abschal-
ten. Sie  knnen  Programmieren,  ohne  sich ber irgendwelche Nebeneffekte
Gedanken machen zu mssen.

Nach  einem Druck auf die linke Maustaste versetzt NonSystemStartup.S das
System wieder in seinen vorherigen Status.

Die nun folgende Liste enthlt alle Hardware-Register in Form ihrer Offsets
zur  Basisadresse  $DFF00.   Wenn  Sie  also beispielsweise BplCon0 an-
sprechen wollen, mssen Sie dazu die Adresse $DFF100 verwenden.
                                                                        (153)
        NAME            ADD     R/W     Function

        BLTDDAT         $000    ER      Blitter destination early read
        DMACONR         $002    R       DMA control read
        VPOSR           $004    R       Read Vert most sig. bit
        VHPOSR          $006    R       Read vert and horiz pos of beam
        DMSDATR         $008    ER      Disk data early read
        JOY0DAT         $00A    R       Joy-Mouse 0 data
        JOY1DAT         $00C    R       Joy-Mouse 1 data
        CLXDAT          $00E    R       Collision data reg (read & clear)
        ADKCONR         $010    R       Audio, disk controll read
        POT0DAT         $012    R       Pot counter pair 0 data
        POT1DAT         $014    R       Pot counter pair 1 data
        POTINP          $016    R       Pot pin data read
        SERDATR         $018    R       Serial port data status read
        DISKBYTR        $01A    R       Disk byte and status read
        INTENAR         $01C    R       Interrupt enable bits read
        INTREQR         $01E    R       Interrupt request bits read
        DSKPT           $020    W       Disk pointer (longword)
        DSKLEN          $024    W       Disk length
        DSKDAT          $026    W       Disk DMA data write
        REFPTR          $028    W       Refresh pointer
        VPOSW           $02A    W       Write vert most sig  bit
        VHPOSW          $02C    W       Write vert and horiz position
        COPCON          $02E    W       Coprocessor control register
        SERDAT          $030    W       Serial port data and stop bits write
        SERPER          $032    W       Serial port period and control
        POTGO           $034    W       Pot count start
        JOYTEST         $036    W       Write to all 4 mouse counters at once
        STREQU          $038    S       Strobe for horiz sync (VB & equ)
        STRVBL          $03A    S       Strobe for horiz sync (VB)
        STRHOR          $03C    S       Strobe for horiz sync
        STRLONG         $03E    S       Strobe for long horiz line
        BLTCON0         $040    W       Blitter control register 0
        BLTCON1         $042    W       Blitter control register 1
        BLTAFWM         $044    W       Blitter first word mask for source A
        BLTALWM         $046    W       Blitter last word mask for source A
        BLTCPT          $048    W       Blitter source C pointer (longword)
                                                                        (154)
        NAME            ADD     R/W     Function

        BLTBPT          $04C    W       Blitter source B pointer (longword)
        BLTAPT          $050    W       Blitter source A pointer (longword)
        BLTDPT          $054    W       Blitter dest. D pointer (longword)
        BLTSIZE         $058    W       Blitter start and size (width,hight)
        BLTCMOD         $060    W       Blitter source C modulo
        BLTBMOD         $062    W       Blitter source B modulo
        BLTAMOD         $064    W       Blitter source A modulo
        BLTDMOD         $066    W       Blitter dest. D modulo
        BLTCDAT         $070    W       Blitter source C data
        BLTBDAT         $072    W       Blitter source B data
        BLTADAT         $074    W       Blitter source A data
        DSKSYNC         $07E    W       Disk sync pattern register
        COP1LC          $080    W       Copper pointer 1 (longword)
        COP2LC          $084    W       Copper pointer 2 (longword)
        COPJMP1         $088    W       Restart at pointer 1
        COPJMP2         $08A    W       Restart at pointer 2
        COPINS          $08C    W       Copper int. fetch identify
        DIWSTRT         $08E    W       Display window start (vert-hor)
        DIWSTOP         $090    W       Display window stop (vert-hor)
        DDFSTRT         $092    W       Bitplane data fetch start
        DDFSTOP         $094    W       Bitplane data fetch stop
        DMACON          $096    W       DMA control write
        CLXCON          $098    W       Collision control
        INTENA          $09A    W       Interrupt enable bits
        INTREQ          $09C    W       Interrupt request bits
        ADKCON          $09E    W       Audio, disk, UART control
        AUD0            $0A0            Audio channel 0 start address
        AUD1            $0B0            Audio channel 1 start address
        AUD2            $0C0            Audio channel 2 start address
        AUD3            $0D0            Audio channel 3 start address
        AUDxPTR         +$00    W       Audio channel x pointer
        AUDxLEN         +$04    W       Audio channel x length
        AUDxPER         +$06    W       Audio channel x period
        AUDxVOL         +$08    W       Audio channel x volume
        AUDxDAT         +$0A    W       Audio channel x data
                                                                        (155)
        NAME            ADD     R/W     Function

        BPL1PT          $0E0    W       Bitplane 1 pointer
        BPL2PT          $0E4    W       Bitplane 2 pointer
        BPL3PT          $0E8    W       Bitplane 3 pointer
        BPL4PT          $0EC    W       Bitplane 4 pointer
        BPL5PT          $0F0    W       Bitplane 5 pointer
        BPL6PT          $0F4    W       Bitplane 6 pointer
        BPLCON0         $100    W       Bitplane ctrl reg (misc ctrl bits)
        BPLCON1         $102    W       Bitplane ctrl reg (scroll value)
        BPLCON2         $104    W       Bitplane ctrl reg (priority ctrl)
        BPL1MOD         $108    W       Bitplane modulo (odd planes)
        BPL2MOD         $10A    W       Bitplane modulo (even planes)
        BPL1DAT         $110    W       Bitplane 1 data (parallel to serial)
        BPL2DAT         $112    W       Bitplane 2 data (parallel to serial)
        BPL3DAT         $114    W       Bitplane 3 data (parallel to serial)
        BPL4DAT         $116    W       Bitplane 4 data (parallel to serial)
        BPL5DAT         $118    W       Bitplane 5 data (parallel to serial)
        BPL6DAT         $11A    W       Bitplane 6 data (parallel to serial)
        SPR0PT          $120    W       Sprite 0 pointer
        SPR1PT          $124    W       Sprite 1 pointer
        SPR2PT          $128    W       Sprite 2 pointer
        SPR3PT          $12C    W       Sprite 3 pointer
        SPR4PT          $130    W       Sprite 4 pointer
        SPR5PT          $134    W       Sprite 5 pointer
        SPR6PT          $138    W       Sprite 6 pointer
        SPR7PT          $13C    W       Sprite 7 pointer
        SPR0            $140            Sprite 0 area
        SPR1            $148            Sprite 1 area
        SPR2            $150            Sprite 2 area
        SPR3            $158            Sprite 3 area
        SPR4            $160            Sprite 4 area
        SPR5            $168            Sprite 5 area
        SPR6            $170            Sprite 6 area
        SPR7            $178            Sprite 7 area
                                                                        (156)
        NAME            ADD     R/W     Function

        SPRxPOS         +$00    W       Sprite x vert-horiz position
        SPRxCTL         +$04    W       Sprite x stop pos & control
        SPRxDATAA       +$06    W       Sprite x image data a
        SPRxDATAB       +$08    W       Sprite x image data b
        COLOR0          $180    W       Color 0
        COLOR1          $182    W       Color 1
        bis
        COLOR31         $1BE    W       Color 31
        SPECIAL         $1DC    W       NTSC control on Fatter Agnus

Zum Verstndnis des folgenden Porgrammierbeispiels sollten Sie parallel ein
Hardware-Referenzhandbuch  zur Verfgung haben (im Anhang befindet sich ein
Literaturverzeichnis).

Bevor  wir  mit  Non-System-Programmen  beginnen  mchte  ich  Ihnen anhand
einiger Beispiele die direkte Abfrage der Hardware erlutern.

Eine  der ersten und einfachsten Routinen ist hier die Routine zum Abfragen
der Maustasten und des Joystick-Buttons.

Dazu mssen wir noch ein weiteres Register betrachten.  Es befindet sich an
Adresse $BFE001 und weist folgende Belegung auf:

        Bit     Function

        7       Game port 1 (fire button)
        6       Game port 0 (fire button)
        5       Disk ready
        4       Disk track 0
        3       Write protect
        2       Disk change
        1       Led light (0=filter on)
        0       Memory overlay
                                                                        (157)
Bit  6  ist  der  linke  Mausknopf und Bit 7 der Joystick-Button.  Wenn das
jeweilige  Bit  0  ist,  bedeutet das, da der entsprechende Knopf gedrckt
ist.

        LeftMouseButton:
                BTST    #6,$BFE001
                BEQ     LeftMousePressed
        JoyButton:
                BTST    #7,$BFE001
                BEQ     JoyPressed

Um  die  rechte  Maustaste  abzufragen,  mssen wird in POTINP an Adresse
$DFF016 testen:

        RightButtonTest:
                BTST    #10,$DFF016
                BEQ     RightMousePressed

Wenn  Sie  Bits  in Registern setzen oder testen, sollten Sie daran denken,
da  BSET,  BTST  usw  nur  auf  Byte-Basis  arbeiten.   BTST  #10,??
entspricht also in Wirklichkeit BTST #10-8,??.

Wenn Sie Non-System-Programme schreiben, also Programme, die keine Library-
und  Kickstart-Routinen nutzen, empfehle ich Ihnen, NonSystemStartup.S zu
verwenden.   Dieses  Beispiel  stellt  Ihnen  eine  einfach  zu verwendende
Standard-Routine  zur  Verfgung.   Ein  einfaches  Beispiel zur Verwendung
dieses Startup-Moduls finden Sie in ScrollExample.S.

Die  Scroll-Routine  basiert  auf  einem Interrupt, der, Vertical Blanking
Interrupt (VBI) genannt, jedesmal aktiviert wird, wenn das Bild neu auf-
gebaut  wird.   Das  geschieht  fnfzigmal  in der Sekunde (auf NTSC-Amigas
sechzigmal  in  der  Sekunde).   Man  sagt,  da der Computer 50 Bilder pro
Sekunde  anzeigt.   (Lesen  Sie  hierzu  auch im Hardware-Handbuch ber die
Playfield-Hardware nach.)
                                                                        (158)
Mit  diesem Interrupt knne Sie eine oder mehrere Routinen starten.  In dem
bereits  erwhnten  Scroll-Beispiel wird der Text auf dem Bildschirm einmal
pro Bild bewegt.

In  einer  Sekunde  werden  Sie  den  Scroll-Text  also an 50 verschiedenen
Positionen  sehen,  jedesmal  ein wenig nach links verschoben.  Da das Auge
wechselnde  Bilder nur bis zu zirka 25 Bilder pro Sekunde auseinanderhalten
kann, erscheinen 50 Bilder pro Sekunde als flieende Animation.

Diese  Technik  kann  auch  mit  anderen  Routinen  kombiniert werden.  Sie
knnten  beispielsweise  einen  Ball zeichnen, ihn im nchsten Bild lschen
und  etwas  versetzt  neu  zeichnen.  Auf diese Weise ist es mglich, einen
hpfenden Ball darzustellen.  Oder auch eine kleine Animation, wenn Sie den
Ball selbst in jedem Bild etwas verndert zeichnen.

Damit  diese  Routinen  einwandfrei  arbeiten,  mssen  Sie  sie selbstver-
stndelich  an  der  richtigen  Stelle in das NonSystemStartup-Modul ein-
fgen.

Suchen Sie zunchst diese Zeilen:

        INTER:
                MOVEM.L D0-D7/A0-A6,-(A7)       ; Put registers on stack
                LEA.L   $DFF000,A6
                MOVE.L  #SCREEN,$E0(A6)

        ; --- Place your interrupt routine here ---

                MOVE.W  #$4020,$9C(A6)          ; Clear interrupt request
                MOVEM.L (A7)+,D0-D7/A0-A6       ; Get registers from stack
                RTE

Fgen Sie die Routine nach dem Text ; --- Place ... ein.
                                                                        (159)
Objekte  auf den Schirm zu zeichnen braucht Zeit.  Da das Objekt fnfzigmal
pro  Sekunde  neu gezeichnet werden mu, um einen weichen Ablauf zu gewhr-
leisten, darf die Routine natrlich nicht mehr als 1/50 Sekunde in Anspruch
nehmen.   Wenn  eine  Routine mehr Zeit braucht, sollte sie nicht aus einem
Interrupt heraus gestartet werden.

Nehmen wir an, da Sie eine Routine erstellt haben, die ein Bild berechnet,
dafr  aber  30 Sekunden bentigt.  Dann wrden Sie diese zwischen den fol-
genden Stellen in den Programmtext einfgen:

        ; ***** Your main routines *****
        ; ***** Main loop Test mouse button *****

Sie  sollten  erst  Programme,  die  direkt auf die Custom-Chips zugreifen,
schreiben,  wenn  Sie  einerseits  die Maschinensprache beherrschen und zum
anderen die Funktionsweise der Custom-Chips verstehen.

Eine genaue Einfhrung in dieses weite Feld kann hier nicht gegeben werden,
da  die  Amiga-Hardware sehr weit entwickelt ist.  Ich empfehle Ihnen, sich
durch  Literatur  ber  diese Thematik nher zu informieren.  Es folgt noch
ein kleines Beispiel, das ein Objekt auf den Bildschirm zeichnet.

11.3.1 Erzeugung eines Objekt

Um  Animationen auf dem Amiga zu programmieren, wird Ihnen der Blitter eine
ntzliche  Hilfe  sein.   Er  ist schnell und nicht sehr schwer zu program-
mieren.   Bevor  wir  zu  unserem Programmierbeispiel kommen, bentigen wir
einen  berblick  ber  die Register des Blitters.  (Auch hier mu zu allen
Offsets noch die Basisadresse $DFF000 hinzuaddiert werden.)
                                                                        (160)
        NAME            ADD     R/W     Function

        BLTCON0         $040    W       Blitter control register 0
        BLTCON1         $042    W       Blitter control register 1
        BLTAFWM         $044    W       Blitter first word mask for source A
        BLTALWM         $046    W       Blitter last word mask for source A
        BLTCPT          $048    W       Blitter source C pointer (longword)
        BLTBPT          $04C    W       Blitter source B pointer (longword)
        BLTAPT          $050    W       Blitter source A pointer (longword)
        BLTDPT          $054    W       Blitter dest. D pointer (longword)
        BLTSIZE         $058    W       Blitter start and size (width,hight)
        BLTCMOD         $060    W       Blitter source C modulo
        BLTBMOD         $062    W       Blitter source B modulo
        BLTAMOD         $064    W       Blitter source A modulo
        BLTDMOD         $066    W       Blitter dest. D modulo
        BLTCDAT         $070    W       Blitter source C data
        BLTBDAT         $072    W       Blitter source B data
        BLTADAT         $074    W       Blitter source A data

Die Bits der beiden Kontrollregister sind wie folgt belegt:

        Bit     BLTCON0 BLTCON1         Bit     BLTCON0 BLTCON1

        15      ASH3    BSH3            07      LF7     x
        14      ASH2    BSH2            06      LF6     x
        13      ASH1    BSH1            05      LF5     x
        12      ASH0    BSH0            04      LF4     EFE
        11      USEA    x               03      LF3     IFE
        10      USEB    x               03      LF2     FCI
        09      USEC    x               03      LF1     DESC
        08      USED    x               03      LF0     LINE
                                                                        (161)
        ASH0-3  - Source A shift value
        BSH0-3  - Source B shift value
        USEA-D  - Bit pattern to select source A - D
        LF0-7   - Logic function minterm select
        EFE     - Exclusive fill enable
        IFE     - Inclusive fill enable
        FCI     - Fill carry input
        DESC    - Descending bit
        LINE    - Line mode (1=on)

Der  Blitter  verarbeitet  drei  Quellen  (A,  B,  C) und ein Zeil (D).  Im
Prinzip  nimmt  der  Blitter  Datenworte  aus  den  drei  Quelladressen und
errechnet  aus diesen nach einem whlbaren Agorithmus das Zielwort.  Dieser
Algorithmus wird durch das LF-Byte (Bit 0 bis 7 in BLTCON0 festgelegt.

Angenommen,  wir haben ein Objekt (Pattern) und einen Screen mit der Breite
von  40 Byte.  Wir knnen Quelle A als Zeiger auf die Objektdaten verwenden
und das Ziel D als Zeiger auf die Bildschirmposition, an der das Objrkt er-
scheinen soll.  Wenn wir jedoch nur diese beiden htten, wrden wir einfach
den  Block kopieren, doch wir wollen den vorrigen Inhalt des Bildschirms ja
nicht  lschen, sondern nur das Objekt einfgen.  Also laden wir die Quelle
C  mit  der selben Afresse wie in Ziel D, damit an Stellen (Pixeln), die im
neuen Objekt nicht verwendet werden, wieder der alte Hintergrund erscheint.
Die folgenden drei Zeilen erledigen das:

        MOVE.L  #OBJECT,$DFF050 ; Quelle A
        MOVE.L  #SCREEN,$DFF048 ; Quelle C
        MOVE.L  #SCREEN,$DFF054 ; Ziel D
                                                                        (162)
Wen  das Objekt ein Wort breit ist (2 Bytes), mssen wir den Modulo auf der
Quelle  C  und  dem Ziel D auf 38 (40 minus 2) setzen.  Der Modulo-Wert von
Quelle A mu dann 0 sein.

        MOVE.W  #0,$DFF064      ; Modulo Quelle A
        MOVE.W  #38,$DFF060     ; Modulo Quelle C
        MOVE.W  #38,$DFF066     ; Modulo Ziel D

Nun   setzen  wir  die  Kontrollregister,  beginnend  mit  BLTCON0.   Der
Shiftwert  wird  auf  0  (%0000)  gesetzt, wir verwenden A, C und D, also
mssen die nchsten vier Bits auf %1011 gesetzt werden.  Das Byte fr die
logische  Funktion wird auf %11111010 gesetzt.  Wenn der Blitter die drei
Quellen  verknpft,  betrachtet er immer ein Bit zur Zeit.  Drei Bits geben
maximal  acht  Kombinationen,  daher  existieren  acht LF-Bits.  Diese Bits
werden gem der folgenden Liste gesetzt.

        Bit     A       B       C       Erwnschtes Ergebnis in D

        7       1       1       1               1
        6       1       1       0               1
        5       1       0       1               1
        4       1       0       0               1
        3       0       1       1               1
        2       0       1       0               0
        1       0       0       1               1
        0       0       0       0               0
                                                                        (163)
Wir  verwenden  die Quelle B hier nicht, mssen also nur ber die vier ver-
schiedenen  Kombinationen  aus A und C nachdenken (11=1, 10=1, 01=1, 00=0).
Fr  jedes Bit gilt:  Wenn ein Bit im Objektwort und im Hintergrund gesetzt
ist, soll das entsprechende Bit im Zielwort auch gesetzt werden ...  etc.

Das  Ergebnis  der  obigen  berlegung ist, da BLTCON0 wie folgt gesetzt
werden mu:

        MOVE.W  #%0000101111111010,$DFF040

Kontrollregister 1 mu auf 0 gesetzt werden

        MOVE.W  #%0000000000000000,$DFF042

Um  den  Blitter  zu starten, mssen Sie die Gre des Objektes im Register
BLTSIZE  eintragen.  Die Gre berechnet sich als 64 mal Hhe plus Breite
geteilt duch 2.

        MOVE.W  #64*8+2/2,$DFF058

Diese Zeilen knnen wir nun in einem kleinen Programm zusammenfgen:

        MAKE_OBJECT:
                LEA.L   $DFF000,A6      ; Basisadresse Customchips nach A6
        WAIT:   BTST    #14-8,$2(A6)    ; Ist der Blitter bereit?
                BNE.B   WAIT            ; Sonst auf Blitter warten

                MOVE.W  #%0000101111111010,$40(A6)
                MOVE.W  #%0000000000000000,$42(A6)

                MOVE.L  #OBJECT,$50(A6) ; Quelle A
                MOVE.L  #SCREEN,$48(A6) ; Quelle C
                MOVE.L  #SCREEN,$54(A6) ; Ziel D
                                                                        (164)
                MOVE.W  #0,$64(A6)      ; Modulo Quelle A
                MOVE.W  #38,$60(A6)     ; Modulo Quelle C
                MOVE.W  #38,$66(A6)     ; Modulo Ziel D

                MOVE.L  #$FFFFFFFF,$44(A6)      ; Keine Maskierung
                MOVE.W  #64*8+2/2,$58(A6)       ; Blitter starten
                RTS

        OBJECT: DC.W    %0000000110000000       ; Objektdaten
                DC.W    %0000001111000000
                DC.W    %0100011001100010
                DC.W    %0100111001110010
                DC.W    %0111111111111110
                DC.W    %0100011111100010
                DC.W    %0000001111000000
                DC.W    %0000011111100000

Weitere  Beipiele  zur  Nutzung  des  Blitters finden Sie in den Programmen
ScrollExample.S und LineExample.S.
                                                                        (165)
                                                                        (166)
        Anhnge

A.  Voreinstellungen

Um  sicherzustellen,  da  Sie  ASM-ONE so konfigurieren knnen, wie Sie es
mchten,  wurde  ein  Vielzahl von Optionen implementiert.  Sie finden fol-
gende Optionen in den Mens Project und Assembler.

        Option          Voreinstellung       Abkrzung

        Rescue               Aus                RS
        Level 7              Aus                L7
        NumLock              Ein                NL
        AutoAlloc            Ein                AA
        ReqLibrary           Aus                RL
        PrinterDump          Aus                PD
        Interlace            Aus                IL
        1 Bitplane           Aus                1B
        Source .S            Ein                .S
        LineNumbers          Aus                LN
        AutoIndent           Ein                AI
        ShowSource           Ein                SS
        ListFile             Aus                LF
        Pageing              Ein                PG
        Halt Page            Ein                HP
        All Errors           Aus                AE
        Debug                Aus                DB
        Label:               Aus                L:
        UCase=LCase          Ein                UL
        Offset(A4)           Aus                A4
        DisAssemble          Ein                DA
        OnlyAscii            Aus                OA
        Comment              Aus                C
        Close WB             Aus                CW
                                                                        (167)
Sie haben die Mglichkeit, die Voreinstellungen in einer Datei namens ASM-
One.Pref  auf S: zu speichern.  Diese Datei besteht aus Plus- und Minus-
zeichen, jeweils gefolgt von der Abkrzung der jeweiligen Option.

Beispielsweise:

        -RS-L7+NL+AA+RL etc.

Neben  diesen  Voreinstellungen knnen Sie in der Datei noch weitere Infor-
mationen unterbringen, zum Beispiel:

        -RS-L7+NL+AA+RL\c\200\

Dies  wrde beim Start von ASM-ONE automatisch 200 KByte Arbeitsspeicher im
Chip-Memory  reservieren.  Natrlich kann auch jeder andere Befehl nachfol-
gen.   Das Zeichen \ gilt als Return.  Zur Festlegung einer Dateiexten-
sion  beim  Abspeichern  ist  das  Zeichen  ! in der Voreinstellungsdatei
erlaubt (siehe Option Source.S).

        Beschreibung der Optionen:

        Rescue (Retten)

Die  Funktion  Rescue  restauriert  Ihren Programmtext, wenn Ihr Programm
abgestrzt  ist, auch wenn das System abgeschaltet war.  Ihr Programm ber-
steht  so auch zum Beispiel eine Division durch null whrend einer Level-3-
Interrupt-Routine.

WARNUNG:   Diese  Option  kann  das  Multitasking-System Ihres Amiga beein-
trchtigen.   Aber  wenn Sie Non-System-Programme schreiben und ein Absturz
auftritt,  mten  Sie  anderenfalls  Ihren Amiga neu starten und haben mit
dieser Option wenigstens eine Chance, den Programmtext noch zu speichern.
                                                                        (168)
        Level 7

Die  Option  Level  7  erlaubt  Ihnen, Ihre Programme zu einem beliebigen
Zeitpunkt  abzubrechen.  Nehmen wir zum Beispiel eine Endlosschleife.  Der-
artige  Programmierfehler  knnen  nur  so  umgangen  und das Porgramm ncoh
abgespeichert  werden.   Um die Level-7-Option nutzen zu knnen, mssen Sie
ein  wenig  Bastelarbeit  leisten.   Wenn Sie keine Kenntnisse in bezug auf
Hardware-Basteleien  besitzen,  sollten  Sie  jemanden  suchen, der sich in
diesem  Bereich  auskennt,  denn  Sie knnten hier durch einen Fehler Ihren
Computer irreparabel beschdigen!

Wenn  Sie  einen  Amiga  500 haben, gehen Sie wie folgt vor:  An der linken
Seite  Ihres  Computers  befindet sich ein 86poliger Verbinder hinter einer
Abdeckklappe.  Nachdem Sie diese entfernt haben, sehen Sie eine Steckleise,
die nach folgendem Schema belegt ist:

        GND     1       2
                3       4
                5       6       U
        O       7       8       N
        B       9       10      T
        E       11      12      E
        R       13      14      R
        S       15      16      S
        E                       E
        I       39      40_IPL0 I
        T       41      42_IPL1 T
        E       43      44_IPL2 E

                83      84
                85      86
                                                                        (169)
Nun  bentigen Sie noch drei Dioden und eine Taster.  Verbinden Sie je eine
Diode mit der Anode mit den IPL-Kontakten.  Die Kathoden der Dioden verbin-
den  Sie  miteinander  und  diese mit einem der Tasterkontakte.  Der andere
Tasterkontakt wird auf Masse (GND) gelegt.

        40      _IPL0   +Diode-
        42      _IPL1   +Diode-+-- Schalter  (1) GND
        44      _IPL2   +Diode-

Wenn Sie einen Amiga 2000 besitzen, gehen Sie folgendermaen vor:

ffnen  Sie  Ihren Rechner, und lokalisieren Sie die fnf 100poligen Expan-
sion-Slots.  Auf der Leiterplatte ist Pin 1 bezeichnent.  Der Verbinder ist
wie folgt belegt:

        GND     1       2
                3       4
                5       6       U
        O       7       8       N
        B       9       10      T
        E       11      12      E
        R       13      14      R
        S       15      16      S
        E                       E
        I       39      40EInt7 I
        T                       T
        E       97      98      E
                99      100
                                                                        (170)
Wenn  Sie  Pin  40  ber  einen Taster mit Pin 0 verbinden, lsen Sie einen
Level-7-Interrupt aus.

!!! Wichtig !!!

Wenn  Sie sich nicht vollstndig sicher sind, da Sie diese Bastelanleitung
nachvollziehen knnen, dann abuen Sie sie bitte nicht slebst nach.  Falsche
Verbindungen knnen schwerwiegende Schden zu Folge haben.

Der  DMV-Daten-  und  Medienverlag  bernimmt  keinerlei  Garantien fr die
Richtigkeit  der obigen Schaltung.  Wenn Sie deise Schaltung an Ihren Amiga
anschlieen, handeln Sie auf eigenes Risiko.

        NumLock

Mit dieser Option wird das numerische Tastenfeld wie folgt umdefiniert:

        7 Anfang        8 Hoch          9 Seite hoch
        4 Links                         6 Rechts
        1 Ende          2 Runter        3 Seite runter

        AutoAlloc

Wenn  Sie  zum  Beispiel  eine  DATA_C-Sektion  erzeugen,  wird diese mit
AutoAlloc  im  Chip-Memory  erzeugt.   Ohne AutoAlloc wird Ihr normaler
Arbeitsbereich  verwendet,  ohne Rcksicht darauf zu nehmen, ob es sich bei
diesem um Chip- oder Fast-Memory handelt.
                                                                        (171)
        ReqLibrary

Die  req.library  ist eine Library mit Funktionen, die den File-Requester
erzeugt.  Diese Requester sind einfach anzuwenden, doch die Library braucht
ungefhr  14  KByte  Speicherplatz.   Wenn Sie auf diese 14KByte nicht ver-
zichten  knnen, knnen Sie diese Option desaktivieren.  Wenn der Assembler
aber bereits einmal mit der req.library gestartet wurde, wird der von ihr
belegte Speicher erst beim nchsten Reset wieder freigegeben.

        PrinterDump

Diese  Option aktiviert die Ausgabe auf den Drucker.  Wenn sie gesetzt ist,
wird  smtlicher  Text  auch  auf dem Drucker ausgegeben.  Sie knnen diese
Option  auch  mit Amiga-P umschalten.  Wenn Sie den Drucker zum erstenmal
ansprechen, wird zunchst noch das printer.device nachgeladen.

        Interlace

Schaltet  die  Anzeige  auf  den Interlace-Modus um.  Wenn fr diese Aktion
nicht  gengend Speicher zur Verfgung steht, wird statt dessen ein Fenster
mit einer Bitplane in mittlerer Auflsung geffnet.
                                                                        (172)
        1 Bitplane

Schaltet  die  Anzeige  auf  nur  eine  Bitplane  um.  Dies spart ein wenig
Speicher,  aber  der  Cursor  nimmt  dieselbe Farbe wie der Text an und ist
somit unter Umstnden schwer zu finden.

        Source .S

Fgt,  wenn  gesetzt, beim Speichern automatisch ein .S an den Dateinamen
an.   Sie  knnen  das .S im Einzelfall manuell lschen oder generell mit
dieser Option ausschalten.

Wenn  die  Option  Source  .S  eingeschaltet ist, steht Ihnen in der Pre-
ference-Datei  die  Option  ! zur Verfgung, mit der Sie beliebige Exten-
sionen (Kennungen) beim Abspeichern an den Dateinamen anhngen knnen.

Syntax:         !.<Extension (maximal drei Zeichen)>
Beispiel:       !.ASM

Ist die Option nicht aktiviert, wird an die SHOW- beziehungsweise HIDE-
Gadgets in der Requester-Library keine Erweiterung angehngt.

        LineNumbers

Mit  dieser  Option  wird  jede Zeile im Editor mit einer Zeilennummer ver-
sehen.  Ansonsten ndert sich an der Arbeitsweise nichts.
                                                                        (173)
        AutoIndent

Rckt  jede  Zeile  automatisch  ebenso weit ein wie die jeweils vorherige.
Dies  ist  ntzlich, wenn Sie Ihren Programmtext stark mit Tabulatoren oder
hnlichem strukturiert haben.

        ShowSource

Mu  gelscht  werden,  wenn  Sie  Programme,  deren Programmtext Sie nicht
besitzen, mit der Trace-Funktion analysieren wollen.  Die Option ist auch
sehr  ntzlich, wenn Sie viele Makros verwenden und die bereits bersetzten
Makros betrachten wollen.

        ListFile

Wenn  diese  Option gesetzt ist, wird bei jedem Assembler-Lauf ein Listfile
erzeugt.   Dieses  Listfile  enthlt Zeilennummern, Speicheradressen, Spei-
cherinhalte  und  die  jeweiligen Assembler-Befehle und am Ende die Symbol-
tabelle.

        Paging

Wenn  Sie das Listfile seitenweise aufgeteilt haben mchten, knnen Sie das
mit dieser Option erreichen.

        Halt Page

Wenn  das Paging aktiviert ist, knnen Sie mit dieser Option erreichen, da
der Rechner nach jeder Seite auf einen Tastendruck wartet.
                                                                        (174)
        All Errors

Normalerweise  bricht  ASM-ONE nach dem ersten Fehler den Assembliervorgang
ab.  Mit dieser Option durchluft der Assembler in jedem Falle den gesamten
Programmtext.   Sie  knnen  mit  dieser Option zum Beispiel eine komplette
Fehlerliste  zur  Druckausgabe  erzeugen,  um  die Fahler dann gesammelt zu
korrigieren.

        Debug

Wenn  Sie  Ihren  Programmtext  hufig  debuggen,  knnen  Sie diese Option
setzen,  um Zeit zu sparen.  Zwar brauchen Sie dadurch etwas mehr Speicher,
doch mu der Debugger dann den Programmtext nicht neu assemblieren.

        Label:

Der  ASM-ONE-Assembler  ist  kompatibel zum Makro-Assembler.  Das bedeutet,
da Label nicht durch Doppelpunkte abgeschlossen werden mssen.  Ein Befehl
wird von einem Label alleine dadurch unterschieden, da ein Befehl nicht in
der ersten Spalte beginnt.

Da einige Assembler fr Label einen abschlieenden Doppelpunkt vorschreiben
und  so ermglichen, da auch Befehle in der ersten Spalte beginnen knnen,
wurde  die  Option  Label:  vorgesehen.  Wenn sie gesetzt ist, knnen Sie
auch  Programmtexte  dieser  (zumeist  lteren)  Assembler-Versionen assem-
blieren.
                                                                        (175)
        UCase=LCase

Manchmal  mchten  Sie  dasselbe  Symbol zweimal verwenden.  Wenn Sie diese
Option  desaktivieren,  ist  es  mglich,  zwei gleiche Namen einfach durch
unterschiedliche Gros- und Kleinschreibung zu trennen, zum Beispiel:

        DOSBase       und     DOSBASE

Diese  beiden  Symbole werden normalerweise als ein und dasselbe Symbol be-
trachtet,  doch  bei  desaktivierter Option sind die beiden Symbole fr den
Assembler unterschiedlich.

        DisAssemble

Im  Debugegr  ist  es manchmal vorteilhaft, beim Ansehen des Programmtextes
die  nchste  Zeile  disassembliert  zu  sehen.  Dadurch kann man einfacher
feststellen, ob die derzeitige Zeile korrekt disassembliert wurde.

        OnlyAscii

Wenn  Sie  einen  ASCII-Dump betrachten und dabei bestimmte Texte auffinden
mchten,  stren  fremde Sonerzeichen nur.  Mit OnlyAscii werden nur nor-
male  Buchstaben,  Ziffern  und  Zeichen  angezeigt und Sonderzeichen durch
einen Punkt ersetzt.
                                                                        (176)
        ;Comment

Normalerweise sit ein Kommentar alles das, was nach einer korrekt beendeten
Anweisung  folgt.   Eine Anweisung wird mit einem oder mehreren Leerzeichen
beendet.  Wenn aber durch Zufall ein Leerzeichen im Operandenfeld eingefgt
wurde,  so  behandelte  der Assmbler bisher den rechts nach dem Leerzeichen
folgenden Teil wie einen Kommentar.

Beispiel:

        MOVE.W  D0,DataPtr      +2

Hier  wird  +2  wie  ein Kommentar behandelt.  Setzen Sie das Flag ;Com-
ment, um diese gemeinen Fehler zu vermeiden.  (im Preference-File +;C)

        Close WB

Wenn Sie dies setzen, wird der Workbench-Screen geschlossen.  Es ist jedoch
nur  mglich, die Workbench zu schlieen, wenn kein Task-Window, beispiels-
weise das CLI-Fenster, geffnet ist.  Im Preference-File heit diese Option
CW.
                                                                        (177)
B.  Literaturempfehlungen

Dieses Handbuch wird nicht ausreichen, wenn Sie den Amiga und ASM-ONE wirk-
lich  ausreizen  wollen.  Die Bcher, die ich empfehle, lassen sich in zwei
Arten  teilen:   Amiga-spezifische  Bcher  und Bcher zur MC68000-Program-
mierung.

        Hardware Reference Manual (Commodore)

Wenn  Sie eine genaue Beschreibung der Amiga-Hardware suchen, dann ist dies
genau das richtige Buch.  Es enthlt auch einige Programmierbeispiele.  Fr
den  fortgeschrittenen Programmierer sollte es nicht allzu schwer sein, die
Fakten in eigenen Porgrammen anzuwenden.

        Libraries and Devices (Commodore)

Wenn  Sie das Betriebssystem des Amiga ausnutzen mchten, sagt Ihnen dieses
Buch  nahezu  alles  ber die verschiedenen Library-Funktionen.  Unabhngig
von  Ihren  Programmierabsichten,  ist  ein  grundlegendes  Verstndnis des
gesamten  Amiga-Systems  bei der Betriebssystemnutzung Vorraussetzung.  As-
sembler-Beispiele  sind  zwar  rar, denn vorwiegend sind die Beispiele in C
geschrieben, soda Sie hufig mit den Assembler-Includes verglichen mssen.

        Includes and Autodocs (Commodore)

Wenn  Sie Library and Devices bereits kennen, ist dieses Buch der nchste
Schritt.   Es ist detaillierter, schematischer und erklrt genauer, was bei
den  verschiedenen  Funktionsaufrufen  vor sich geht; zum Beispiel auch, in
welchen Registern die Argumente bergeben werden mssen.
                                                                        (178)
        Amiga System Programmers Guide (Abacus/Data Becker)

Deises  Buch  ist  eine  Mischung  aus  dem Hardware Reference Manual und
Libraries  and  Devices, wobei der thematische Schwerpunkt auf Hardware
liegt.  Das Buch erlutert alles anhand von Beispielen, wobei die Flle von
Beispielen  die  Vielfalt  der  Themen begrenzt.  Dieses Buch ist ein guter
Ersatz  fr  das  Hardware  Manual, doch wenn Sie ein ernsthafter System-
programmierer  sein wollen, dann knnen Sie auf Libraries and Devices und
Includes  and  Autodocs nicht verzichten.  Wenn Sie nur ein umfangreiches
Buch zum Thema Amiga-Programmierung durcharbeiten wollen, dann empfehle ich
Ihnen dieses.

        Amiga Machine Language (Abacus/Data Becker)

Dieses   Buch   beinhaltet   eine   Menge   Themen   ber   die  Maschinen-
sprache-Programmierung  auf  dem Amiga.  Es basiert auf vielen Routinen zur
Benutzung der Libraries.  Fast alle Routinen knnen zusammen verwendet wer-
den.  Das Buch ist leicht verstndlich geschrieben und preiswert.  Wenn Sie
an  einer  kleinen  Einfhrung  ber  die Erstellung von Windows, Mens und
Gadgets  interessiert  sind, dann kann ich Ihnen dieses Buch empfehlen.  Es
ist allerdings kein Ersatz fr das Hardware Manual.

        Programming the MC68000 (Sybex/Steve Williams)

Dies  ist wirklich ein gutes Buch ber die Programmierung des MC68000.  Vor
allem  bietet  es eine knappe Beschreibung aller Befehle und Adressierungs-
modi.   Zum  Umfang  gehren auch allgemeine Prozessor-Programmierbeispiele
und Vorschlge zur Erstellung strukturierter Programme.
                                                                        (179)
C.  Fehlermeldungen

Bei  der  Assemblierung  eines  neu  geschriebenen Programms werden Sie mit
Sicherheit die eine oder andere Fehlermeldung erhalten.  Um einen Fehler zu
korrigieren,  ist die Fehlermeldung, die kurz erklrt, wo der Fehler liegt,
von groen Nutzen.  Hier folgt eine detaillierte Beschreibung der verschie-
denen Fehlermeldungen von ASM-ONE.

        1. Workspace Memory full

Der  Assembler  braucht  fr  Labels, Reloc-Tabellen, Opcodes etc.  zustz-
lichen  Speicher,  den  er  sich  vom Workspace abzweigt.  Wenn nicht genug
Speicher reserviert wurde, erscheint diese Fehlermeldung.

        2. Address Reg. Byte/Logic

Ein  Adreregister  (An)  kann  nur  beschrnkt angespruchen werden.  Sie
knnen  Adreregister  nicht  als Bytes ansprechen, und Sie knnen Sie auch
nicht in logischen Operationen verwenden (wie OR.W A1,D2).

        3. Address Reg. expected

In  einigen  Adressierungsarten knnen Sie nur Adreregister verwenden, zum
Beispiel  (An),  (An)+,  -(An), nn(An,Rn).  In manchen Befehle, wie
zum  Beispiel LEA <ea>,An, knnen Sie auch nur ein Adreregister als Ziel
angeben.

        4. Data Reg. expected

Entsprechend  Fehlermeldung  Nummer 3 bei Adreregistern, gibt es auch ver-
schiedene Befehle, die ein Datenregister als Operanden erwarten.
                                                                        (180)
        5. Comma expected

Wenn ein Befehl zwei oder mehr Operanden erwartet, mssen Sie die einzelnen
Argumente  durch ein Komma trennen.  Manche Programmierer trennen Argumente
gerne  zustzlich durch einen Tabulator, dieser mu dann aber iummer hinter
dem Komma stehen und nicht davor.

        6. Double Symbol

Es  ist  nicht  mglich, denselben Namen mehr als einmal zu verwenden.  Die
einzigen  Symbole, die neu definiert werden knnen, sind die mit der Direk-
tive SET definierten.

        7. Unexpected end of file

Eine Makro-Definition, ein Wiederholungsblock oder eine If-Direktive mssen
mit  einem  ENDM, ENDR beziehungsweise ENDC beendet werden.  Wenn das
Ende  des  Programms  erreicht  ist,  bevor das entsprechende Ende der Kon-
struktion gefunden wurde, erscheint diese Fehlermeldung.

        8. User made FAIL

ASM-ONE  erkennt  eine  Direktive  namens FAIL und gibt die Fehlermeldung
Nummer 8 aus.  Sie knnen dies verwenden, um zum Beispiel die bergabepara-
meter  fr  ein  Makro  zu  testen  und  gegebenenfalls  eine Fehlermeldung
auszulsen.

        9. Illegal Command

Ein unbekannter Befehl wurde eingegeben.

        10. Illegal Address size

Sie  knnen  eine absolute Adresse explizit als Wort oder Langwort angeben,
zum  Beispiel MOVE.L $4.W,A6.  Die beiden zulssigen Gren sind .W und
.L,  der  Wertebereich  ist  einzuhalten.   Wenn das nicht geschieht, er-
scheint diese Fehlermeldung.
                                                                        (181)
        11. Illegal Operand

Eine  Zeile  Programmtext  lt  sich  in  verschiedene  Felder aufspalten:
Label,  Befehl,  Operand,  Kommentar.  Bei fehlerhaften Operanden erscheint
diese Fehlermeldung.

        12. Illegal Operator

Weist auf einen fehlerhaften Befehl hin.

        13. Illegal Section type

Es  gibt  drei Typen von Sektionen:  CODE, DATA und BSS.  Diese Typen
knnen wie folgt erweitert werden:

        CODE_P, CODE_C, CODE_F
        DATA_P, DATA_C, DATA_F
        BSS_P , BSS_C , BSS_F

Alle anderen Typen sind nicht zulsseig und erzeugen diese Fehlermeldung.

        14. Illegal Operator in BSS area

Es ist mglich, verschiedene Sektionen anzulegen (CODE, DATA und BSS,
siehe  oben).  Eine BSS-Sektion wird nicht initialisiert, kann also keine
definierten Werte aufnehmen.  Daher sind alle codeproduzierenden Statements
nicht  zugelasen,  auch  nicht  DC  und DCB, und erzeugen diese Fehler-
meldung.  Erlaubt ist nur DS.

        15. Illegal Order

Der  Befehl  MOVEM erwartet als Argument eine Registerliste, zum Beispiel
D0-D3/A4.   Die  Register  mssen  in  aufsteigender  Reihenfolge mit den
Datenregistern zu Beginn aufgezhlt werden.
                                                                        (182)
        16. Illegal reg. size

Die  Adressierungsart  nn(An,Rn)  erlaubt eine optionale Grenangabe auf
dem  Indexregister  Rn,  diese kann nur .W oder .L sein, zum Beispiel
10(A3,D0.W), andernfalls erfolgt diese Fehlermeldung.

        17. Illegal Size

Einige  Befehle  arbeiten  mit  einer  Grenangabe (.B, .W oder .L).
Aber  nicht  alle  knnen alle drei Gren verarbeiten.  Bei einer falschen
Grenangabe tritt diese Fehlermeldung auf.

        18. Illegal macro def.

Esist  nicht  mglich, ein Makro innerhalb eines makros zu definieren, auch
wenn Makros innerhalb eines Makros ausgerufen werden knnen.

        19. Immediate operand ex.

Dieser  Fehler  tritt auf, wenn Sie zum Beispiel einem ADDI- oder ADDQ-
Befehl  keine  Konstante,  sondern  ein Register als ersten Parameter ber-
geben.

        20. Include Jam

Eine sehr seltene Fehlermeldung, die nur dann auftreten kann, wenn Sie eine
Datei erst in Pass2 einbinden.

        21. Makro overflow

Sie  knnen  Makros  bis  zu einer Verschachtelungstiefe von 25 aus anderen
Makros  heraus  aufrufen.  Diese Restriktion ist in der limitierten Stapel-
kapazitt begrndet.
                                                                        (183)
        22. Conditional overflow

Auch konditionelle Abfragen knnen nur maximal 25fach verschachtelt werden.
Auch hier liegt der Grund in der limitierten Stapelkapazitt.

        23. Section overflow

Sie knnen nur maximal 255 Sektionen verwenden.  Diese Begrenzung begrndet
sich aus der Speicherkapazitt.

        24. Include overflow

Sie  knnen  Include-Dateien  nur maximal fnffach verschachteln.  Die nor-
malen  Include-Dateien  erreichen allerdings nur einen Include-Level von 3.
Diese  Restriktion  hngt  ebenfalls mit dem begrenzten Stapelspeicherplatz
zusammen.

        25. Repeat overflow

Sie  knnen  REPT..ENDR-Folgen nur maximal vierfach verschachteln.  Grund
hierfr ist ebenfalls die beschrnkte Speicherkapazitt des Stapels.

        26. Double definition

Es  ist  nicht  mglich, mit BASEREG daaselbe Register mehr als einmal zu
definieren.

        27. Invalid addressing mode

Dies  ist  der generelle Adressierungsfehler.  Wenn Sie diese Fehlermeldung
erhalten, ist entweder die Adressierungsart des ersten oder zweiten Operan-
den falsch oder nicht zulssig.

        28. LOAD without ORG

Sie  knnen  Ihr  Programm mit dem Statement ORG an eine absolute Adresse
assemblieren  lassen.   Mit dem Statement LOAD modifizieren Sie nicht die
Position, aber die
                                                                        (184)
Startadresse,  auf  dei  sich alle absoluten Referenzen beziehen.  Es macht
keinen  Sinn,  ein LOAD-Statement zu verwenden, ohne mit ORG eine Ziel-
adresse festgelgt zu haben.

        29. Missing Quote

Wenn  Sie Text-Strings verwenden, die mit einem der Anfhrungszeichen ('"`)
beginnen,  mssen  Sie  den  Text  mit  demselben  Zeichne beenden.  Um das
Zeichen im String selbst zu verwenden, mssen Sie es doppelt schreiben.

        30. NO operand space allowed

Es  ist  nicht  mglich,  Tabulatoren  beziehungsweise Leerstellen in einem
Operanden zu verwenden.

        31. NOT a constant/label

Tritt  auf, wenn in einem arithmetischen Ausdruck statt Labels und Konstan-
ten versehentlich ein Makro-Name verwendet wurde.

        32. Not in repeat area

ENDR ist nur nach einleitendem REPT zulssig.

        33. Not in macro

ENDM, MEXIT und CMEXIT sind nur in Makros zulssig.

        34. Out of range 1 bit

Diese  Fehlermeldung  wird  nur vom Befehl zum Schieben von Speicherstellen
ausgelst.   Speicherstellen knnen immer nur um ein Bit verschoben werden.
Wenn Sie mehr schieben, erhalten Sie diese Fehlermeldung.
                                                                        (185)
        35. Out of range 3 bit

Einige Befehle erlauben nur 3-Bit-Parameter (ADDQ, SUBQ), die Werte von
1 bis 8 annehmen knnen.  Andere Werte sind nicht zulssig.

        36. Out of range 4 bit

Das  Kommando TRAP enthlt einen 4-Bit-Wert, welcher Trap auszulsen ist.
zulssig sind nur Werte von 0 bis 15.

        37. Out of range 8 bit

Befehle  wie  MOVEQ  erlauben  nur  8-Bit-Werte,  die  als  signed byte
betrachtet  werden, also einen Wertebereich von -128 bis 127 haben.  Andere
8-Bit-Werte von -256 bis 255 annehmen.

        38. Out of range 16 bit

Signed  Words  haben  einen  Wertebereich  von -32768 bis 32767.  Normale
Worte drfen Werte von -65536 bis 65535 enthalten.

        39. Relative mode error

Wenn  Sie versuchen, einen relativen als eine Konstante zu verwenden (auer
in Adredistanzberechnungen), erhalten Sie diese Fehlermeldung.

        40. Reserved word

Sie  knnen  fr  Labels und Makros fast alle Namen verwenden.  Ausgenommen
sind lediglich die Namen der Register, um entscheiden zu knnen, ob nun das
Register  oder  der  Wert des Symbols gemeint ist, wenn der Registername in
einem Befehl auftaucht.

        41. Right parenthes expected

Sie haben eine schlieende Klammer vergessen.
                                                                        (186)
        42. String expected

Wenn  eine  Direktive  einen  String  als  Argument  erwartet, mu auch ein
solcher bergeben werden.

        43. Undefined Symbol

Die  Verwendung  eines  nicht  definierten Symbols lst diese Fehlermeldung
aus.   Die  einzigen immer definierten Symbole sind die Register und NARG
(siehe bei der MACRO-Direktive).

        44. Register expected

Einige  Befehle knnen nur mit Registern als Argumenten arbeiten.  Wenn Sie
etwas anderes angeben, erhalten Sie diese Fehlermeldung.

        45. Word at odd address

Bestraft  den  Versuch,  an  einer ungeraden Adresse einen Befehl zu assem-
blieren, da der MC68000 keine Befehle an ungeraden Adressen ausfhren kann.

        46. Not local area

Lokale  Labels  knnen  erst nach globalen Labels definiert werden.  Dieser
Fehler  tritt  auf,  wenn  Sie  in Ihrem Programmtxt als erstes ein lokales
Label verwenden.

        47. Code moved during pass 2

Dies  ist  ein  kritischer  Fehler, denn in Pass1 werden alle Label-Werte
ermittelt.  Wenn sich zwischen Pass1 und Pass2 daran etwas ndert, ging
irgendetwas  schief.   Dieser  Fehler kann auftreten, wenn Sie konditionale
Direktiven falsch verwenden.
                                                                        (187)
        48. Bcc.B out of range in Macro

Normalerweise  werden  Bcc.B-Befehle in .W umgewandelt, wenn der Branch
den  Offset-Bereich  berschreitet.   In Makros wird diese Umwandlung nicht
vorgenommen  und lst diese Fehlermeldung aus.  Sie knnen so fr bestimmte
Branches  sicherstellen,  da  sie  byte-sized  sind, wenn Sie sie in ein
Makro einbetten.

        49. Out of range (20 to 100)

PLEN akzeptiert nur Wertte zwischen 20 und 100.

        50. Out of range (60 to 132)

LLEN akzeptiert nur Werte zwischen 60 und 132.

        51. Linker limitation

Sie  knnen  keine  Kalkulationen  mit  zwei extern referenzierten Symbolen
durchfhren.

Fehlermeldungen, die bei der Eingabe beziehungweise Ausgabe auftreten knnen:

        52. File error

Tritt  auf, wenn die Datei entweder nicht gefunden wurde oder ein Fehler in
der Datei das korrekte Laden verhindert aht.

        53. No files

Tritt  auf,  wenn  das Directory einer leeren Disk mit V (View) angezeigt
werden soll.

        54. No object

Tritt  auf,  wenn  Sie einen Programmtext mit XREF und XDEF als Objekt-
File abspeichern wollen, oder den Programmtext seit der letzten Assemblier-
ung gendert haben.

        55. No file space

Die Diskette ist voll.
                                                                        (188)
        56. Printer device missing

Wenn  Sie  etwas ausdrucken wollen, mu der Amiga das printer.device, den
port-handler  und  das  parallel.device  beziehungsweise  das  serial.
device  von  Diskette nachladen.  Wenn eine der Dateien fehlt, tritt diese
Fehlermeldung auf.

        57. Req.Library not found

ASM-ONE  nutzt  die  req.libary.   Wenn  diese Library nachgeladen werden
soll,  aber  nicht  vorhanden ist, tritt diese Fehlermeldung auf.  Das kann
passieren,  wenn  Sie  ASM-ONE  nicht  gebootet  haben  und  vergaen,  die
req.library auf Ihre Boot-Diskette zu kopieren.

        58. Illegal path

Diese  Fehlermeldung  erhalten Sie, wenn Sie nach dem Befehl V (View) ein
nicht vorhandenes Directory angeben.

        59. Illegal device

Sie  knnen nur vier Diskettenlaufwerke ansprechen (0 bis 3).  Alle anderen
Laufwerksangaben sind nicht zulssig.

        60. Write protected

Es ist nicht mglich auf eine schreibgeschtzte Diskette zu schreiben.

        61. No disk in drive

Keine Diskette im Laufwerk.

        62. Not done

Tritt auf, wenn eine Operation durch ESC abgebrochen wurde.
                                                                        (189)
D.  Taktzyklentabellen

Wenn  Sie  zeitkritische Passagen eines Programms optimieren wollen, finden
Sie  in  diesem  Anhang  alles  Notwendige.  Die angegebenen Zeiten sind in
Taktzyklen  angegeben,  und  Sie  mssen  die Werte durch 7.09 MHz (Europa)
beziehungsweise 7,16 MHz (USA) teilen, um sie in Sekunden umzurechnen:

        ExeTime = Cycles/7090000

Wenn Ihre Routine also zum Beispiel 10000 Zyklen braucht, wird sie in 0,014
Sekunden ausgefhrt.

        Zur Verwendung der Tabellen:

Suchen  Sie  zunchst  Ihre Instruktion heraus, und stellen Sie sicher, da
Sie  die  richtige  Gre und die richtige Adressierungsart besitzen.  Wenn
nach  der  Zyklenangabe  ein + vermerkt ist, mssen Sie die Zeit, die zur
Berechnung  der  effektiven  Adresse  ntig  ist,  noch  addieren.   Einige
berechnete Ausfhrungszeiten:

        ADD.L   D0,10(A1,D1.W)          = 12 + 14 = 26 Zyklen
        MOVE.W  (A0)+,100(A2)           = 18 Zyklen
        ADD.L   D0,D0                   = 8 Zyklen
                                                                        (190)
        Tabelle D.1.
        Zeit zur Berechnung der effektiven Adresse

        <ea>        Byte/Word         Long

        Dn              0               0
        An              0               0
        (An)            4               8
        (An)+           4               8
        -(An)           6               10
        d16(An)         8               12
        d8(An,Rn)       10              14
        xxxx.W          8               12
        xxxx.L          12              16
        d16(PC)         8               12
        d8(PC,Rn)       10              14
        #xxxx           4               8

        Tabelle D.2.
        MOVE - Bytes und Worte

        Src\Dest  Dn  An  (An)  (An)+  -(An)  d16(An)  d8(An,Rn)  xxx.W  xxx.L

        Dn        4   4    8      8      8      12        14       12     16
        An        4   4    8      8      8      12        14       12     16
        (An)      8   8    12     12     12     16        18       16     20
        (An)+     8   8    12     12     12     16        18       16     20
        -(An)     10  10   14     14     14     18        20       18     22
        d16(An)   12  12   16     16     16     20        22       20     24
        d8(An,Rn) 14  14   18     18     18     22        24       22     26
        xxxx.W    12  12   16     16     16     20        22       20     24
        xxxx.L    16  16   20     20     20     24        26       24     28
        d16(PC)   12  12   16     16     16     20        22       20     24
        d8(PC,Rn) 14  14   18     18     18     22        24       22     26
        #xxxx     8   8    12     12     12     16        18       16     20
                                                                        (191)
        Tabelle D.3.
        MOVE - Langworte

        Src\Dest  Dn  An  (An)  (An)+  -(An)  d16(An)  d8(An,Rn)  xxx.W  xxx.L

        Dn        4   4    12     12     14     16        18       16     20
        An        4   4    12     12     14     16        18       16     20
        (An)      12  12   20     20     20     24        26       24     28
        (An)+     12  12   20     20     20     24        26       24     28
        -(An)     14  14   22     22     22     26        28       26     30
        d16(An)   16  16   24     24     24     28        30       28     32
        d8(An,Rn) 18  18   26     26     26     30        32       30     34
        xxxx.W    16  16   24     24     24     28        30       28     32
        xxxx.L    20  20   28     28     28     32        34       32     36
        d16(PC)   16  16   24     24     24     28        30       28     32
        d8(PC,Rn) 18  18   26     26     26     30        32       30     34
        #xxxx     12  12   20     20     20     24        26       24     28

        Tabelle D.4. Arithmetische, logische und Vergleichs-operationen

        Opcode  Size <ea>,An         <ea>,Dn          Dn,<ea>

        ADD     B W     8+              4+              8+
                L       6+**            6+**            12+
        AND     B W                     4+              8+
                L                       6+**            12+
        CMP     B W     6+              4+
                L       6+              6+
        DIVS    W                       158+*
        DIVU    W                       140+*
        EOR     B W                     4+              8+
                L                       8+              12+
        MULS    W                       70+*
        MULU    W                       70+*
        OR      B W                     4+              8+
                L                       6+**            12+
        SUB     B W     8+              4+              8+
                L       6+**            6+**            12+

        +  Addieren Sie die Zeit zur Berechnung der effektiven Adresse.
        *  Maximalwert
        ** Insgesamt 8 Zyklen, wenn <ea> Datenregister direkt ist.
                                                                        (192)
        Tabelle D.5.
        Immediate-Befehle

        Opcode  Size   #,Dn           #,An            #,<ea>

        ADDI    B W     8                               12+
                L       16                              20+
        ADDQ    B W     4               8               8+
                L       8               8               12+
        ANDI    B W     8                               12+
                L       16                              20+
        CMPI    B W     8               8               8+
                L       14              14              12+
        EORI    B W     8                               12+
                L       16                              20+
        MOVEQ   L       4
        ORI     B W     8                               12+
                L       16                              20+
        SUBI    B W     8                               12+
                L       16                              20+
        SUBQ    B W     4               8               8+
                L       8               8               12+

        +  Addieren Sie die Zeit zur Berechnung der effektiven Adresse.

        Tabelle D.6.
        Instruktionen mit nur einem Operanden

        Opcode  Size Register        Memory

        CLR     B W     4               8+
                L       6               12+
        NBCD    B       6               8+
        NEG     B W     4               8+
                L       6               12+
        NEGX    B W     4               8+
                L       6               12+
        NOT     B W     4               8+
                L       6               12+
        Scc     B false 4               8+
                B true  6               8+
        TAS     B       4               10+
        TST     B W     4               4+
                L       4               4+

        +  Addieren Sie die Zeit zur Berechnung der effektiven Adresse.
                                                                        (193)
        Tabelle D.7.
        Shift und Rotate

        Opcode  Size  Register       Memory

        ASR     B W     6+2n            8+
                L       8+2n
        ASL     B W     6+2n            8+
                L       8+2n
        LSR     B W     6+2n            8+
                L       8+2n
        LSL     B W     6+2n            8+
                L       8+2n
        ROR     B W     6+2n            8+
                L       8+2n
        ROL     B W     6+2n            8+
                L       8+2n
        ROXR    B W     6+2n            8+
                L       8+2n
        ROXL    B W     6+2n            8+
                L       8+2n

        +  Addieren Sie die Zeit zur Berechnung der effektiven Adresse.

        Tabelle D.8.
        Bitmanipulations-Instruktionen

        Opcode  Size  Dn,Dn  Dn,<ea>   #n,Dn  #n,<ea>

        BCHG    B               8+              12+
                L       8*              12*
        BCLR    B               8+              12+
                L       10*             14*
        BSET    B               8+              12+
                L       8*              12*
        BTST    B               4+              8+
                L       6*              10*

        +  Addieren Sie die Zeit zur Berechnung der effektiven Adresse.
        *  Maximalwert
                                                                        (194)
        Tabelle D.9.
        Branch and Trap Instruction Clock Periods

        Opcode  Disp   Taken Not Taken

        Bcc     B        10     8
                W        10     12
        BRA     B        10
                W        10
        BSR     B        18
                W        18
        DBcc    cc true         12
                cc false 10     14
        CHK              43+*   8+
        TRAP             34
        TRAPV            34     4

        +  Addieren Sie die Zeit zur Berechnung der effektiven Adresse.
        *  Maximalwert

        Tabelle D.10.
        JMP, JSR, LEA, PEA und MOVEM

  Opcode Size (An) (An)+ -(An) d16(An) d8(An,Rn) xx.W xx.L d16(PC) d8(PC,Rn)

  JMP           8                 10       14     10   12    10        14
  JSR           16                18       22     18   20    18        22
  LEA           4                 8        12     8    12    8         12
  PEA           12                16       20     16   20    16        20
  MOVEM   W   12+4n 12+4n       16+4n    18+4n  16+4n 20+4n 16+4n    18+4n
  M-R     L   12+8n 12+8n       16+8n    18+8n  16+8n 20+8n 16+8n    18+8n
  MOVEM   W    8+4n       8+4n  12+4n    14+4n  12+4n 16+4n
  R-M     L    8+8n       8+8n  12+8n    14+8n  12+8n 16+8n

        n  ist die Zahl der zu kopierenden Register
                                                                        (195)
        Tabelle D.11.
        Mehrfachgenaue Instruktionen

        Opcode  Size  Dn,Dn    M,M

        ADDX    B W     4       18
                L       8       30
        CMPM    B W             12
                L               20
        SUBX    B W     4       18
                L       8       30
        ABCD    B       6       18
        SBCD    B       6       18

        Tabelle D.12.
        Diverses

        Opcode        Size      Rn     <ea>  Rn,<ea> <ea>,Rn

        MOVE SR,?               6       8+
        MOVE ?,CCR              12      12+
        MOVE ?,SR               12      12+
        MOVEP           W                       16      16
                        L                       24      24
        EXG                     6
        EXT             W       4
                        L       4
        LINK                    16
        MOVE USP,?              4
        MOVE ?,USP              4
        NOP                     4
        RESET                   132
        RTE                     20
        RTR                     20
        RTS                     16
        STOP                    4
        SWAP                    4
        UNLK                    12

        +  Addieren Sie die Zeit zur Berechnung der effektiven Adresse.
                                                                        (196)
        Tabelle D.13.
        Ausnahmebedingungen

        Exception             Periods

        Address Error           50
        Bus Error               50
        Interrupt               44*
        Illegal Instruction     34
        Privileged Instruction  34
        Trace                   34

        *  Der Interrupt-Besttigungszyklus wird als 4 Zyklen angenommen.
                                                                        (197)
                                                                        (198)
                             Indexverzeichnis

        A                                       B

Absoluter Wert 60                       Bedingungscode 111
ADD-Befehl 114                          Bedingungscoderegister 109
Adressierungsart 111                    Befehlszeile
Adreregister 25; 26; 114                       Anfang des Textes 42
ASCII-Code 27                                   ASCII einfgen 46
Assembler 53                                    ASCII-Dump zeilenweise 44
        Allgemeine Direktiven 91                Assembler beenden 41
        Ausgabekontrolle 87                     Assembliere zeilenweise 44
        Bedingte Assemblierung 83               Assemblieren im Speicher 46
        Befehlsfeld 57                          Ausgabe umleiten 51
        Datendefinition 73                      Binre Daten laden 38
        Executable 54                           Binre Daten speichern 39
        Externe Symbole 90                      Datei lschen 40
        Kommentar 55                            Disassembliere zeilenweise 44
        Kommentare 58                           Disassemblieren 43
        Label-Feld 56                           Disassemblierung einfgen 46
        Linkfile 54                             Einfgen 40
        Lokale Labels 56                        Einzelschrittmodus 48
        Makro-Direktiven 79                     Externe Dateien laden 50
        Operandenfeld 58                        Fllen 45
        Optionen 53                             Hex-Dump zeilenweise 45
        Programme 55                            Hexadezimal einfgen 46
        Symboldefinition 76                     Include-Speicher lschen 40
        Terme 59                                Kopieren 45
Assemblerdirektiven 62                          Letzte Datei aktualisieren 40
Assemblierungskontrolle 67
                                                                        (199)
Befehlszeile                            Beispiele
        Mit Debug-Information assemblieren 47   NonSystemStartup.S 153
        Numerischen Ausdruck berechnen 51       Vertical Blanking Int. 158
        Objektmodul laden 38                    Abfrage der Hardware 157
        Objektmodul speichern 40                Allgemein 135
        Optimierend assemblieren 46             Animation 159
        Preferences schreiben 41                Bildspeicher lschen 139
        Programm direkt starten 47              Erzeugung eines Objekts 160
        Programmtext im Editor assemblieren 46  Hardware-Programmierung 152
        Programmtext laden 37                   Joystick 157
        Programmtext lschen 37                 Langwort-Division 138
        Programmtext restaurieren 37            Langwort-Multiplikation 135
        Programmtext speichern 39               Maustasten 157
        Register anzeigen 48                    Sortieren 142
        Sektor lesen 48                         Systemprogrammierung 146
        Speicher als ASCII-Text anz. 44 Blitter 160; 163
        Speicher editieren 43           Breakpoint 99
        Speicher hexadezimal anz. 44    Bubblesort 142
        Subroutine anspringen 47                D
        Suchen 45                       Datenregister 25
        Symboltabelle erzeugen 47       Debugger 95
        Text suchen 42                          AddWatch 97
        bersicht 34                            B.P. Addr 99
        Vergleichen 45                          B.P. Mark 99
        Verzeichnis anzeigen 50                 DelWatch 98
        Zeilen ab Cursor-Position ausgeben 43   Edit Regs 97
        Zeilen ab Cursor-Position lschen 42    JumpAddr 99
        Zustzlichen Arbeitsspeicher belegen 41 JumpMark 99
                                                Step n 97
                                                Zap B.P. 99
                                                ZapWatch 98
                                                                        (200)
Direktive 67; 76; 79; 83; 89; 90                NARG 80
        >EXTERN 93                              NOLIST 88
        AUTO 94                                 NOPAGE 87
        BASEREG 71                              ODD 83
        BLK 75                                  OFFSET 69
        CMEXIT 81                               ORG 68
        DC 73                                   PAGE 87
        DCB 73                                  PLEN 88
        DR 75                                   PRINTV 89
        DS 74                                   REG 77
        ELSE 87                                 REPT 81
        END 71                                  RORG 68
        ENDC 87                                 RS 78
        ENDM 81                                 RSRESET 78
        ENDOFF 70                               RSSET 79
        ENDR 82                                 SET 76
        EQUR 77                                 SPC 88
        EVEN 83                                 TTL 88
        FAIL 89                                 XREF 90
        IDNT 93                                 E
        IF 84                           Editor
        IF1 86                                  allgemein 29
        IF2 86                                  Beginne Makrodefinition 33
        IFB 85                                  Markierung 1,2,3 33
        IFC 85                                  Springe zur Markierung 32
        IFD 85                                  Zusammenfassung Funktionen 30
        IFNB 86                         Effektive Adresse, Berechnung 191
        IFNC 85                         Einzelschrittmodus 95; 96
        IFND 85                         Exception
        INCBIN 91                               Adrefehler 131
        INCDIR 93                               Busfehler 131
        INCLUDE 92                              CHK-Vektor 131
        JUMPPTR 91                              Division durch null 131
        LIST 87                                 Illegale Instruktion 131
        LOAD 89
        MEXIT 81
                                                                        (201)
Exception                               Motorola MC68000 107
        Initialwert PC 131                      BCD-Arithmetik 124
        Initialwert SSP 131                     Befehle 112
        LINE_A-Emulation 132                    Befehlssatz 110
        LINE_F-Emulation 132                    Bit-Manipulation 123
        Trace 132                               Divisionsbefehle 116
        TRAPV-Vektor 132                        Exceptions 129
        F                                       Integer-Arithemtik 116
Fehlermeldungen 180                             Kontrollbefehle 126
        Eingabe und Ausgabe 188                 Kopieren von Daten 115
        G                                       LINK 127
Grundlagen                                      Logische Operationen 118
        Amiga-System 17                         Rotationsbefehle 120
        Assemblerbefehle 22                     Schiebebefehle 119
        binres Zahlensystem 18                 System-Kontrollbefehle 128
        Prozessorregister 24                    UNLINK 127
        H                                       O
Hardware-Register 153                   Operanden 60
hexadezimale Notationen 19              Offset OpenLibrary 149
        I                                       P
Installation 12                         Programmierbeispiele 133
        Programmdiskette 12                     R
        Workbench 13                    Registersymbole 61
Literaturempfehlungen 178               Relativer Wert 60
        M                                       S
Monitor 101                             Shortcuts 29
        AsciiDump 103                   Speicherbelegung 21
        DisAssem 102                    Stapelzeiger 108
        Jump 1..3 103                   Start
        Jump Addr 103                           assemblieren 15
        Last Addr 103                           Beispiel 14
        Mark 1..3 103                           Speicherzuweisung 14
                                                                        (202)
Statusregister 109; 115
Suber Fat Agus 21
System
        exec.library 150
        Libraries 146
        T
Taktzyklentabellen 190
        V
Voreinstellungen 167; 177
        DOSBase und DOSBASE 176
        1 Bitplane 173
        All Errors 174
        AutoAlloc 171
        Close WB 177
        Debug 175
        DisAssemble 176
        Halt Page 174
        Interlace 172
        Label 175
        Level 7 169
        LineNumbers 173
        ListFile 174
        NumLock 171
        OnlyAscii 176
        Paging 174
        PrinterDump 172
        ReqLibrary 172
        Rescue 168
        ShowSource 174
        Source .S 173
        UCase=LCase 175
                                                                        (203)
*****************************************************************************
* E O F - All editing has been done by Pestilence                           *
* IF YOU LIKE THIS, PLEASE CONSIDER BUYING THE ORIGINAL - SUPPORT QUALITY ! *
*****************************************************************************
