Assembler

Im Emulator ist ein Assembler integriert, den Sie über den Texteditor aufrufen können, d.h., den Assembler-Quelltext öffnen, bearbeiten und assemblieren Sie im Texteditor.

Die Beschreibung des Assemblers unterteilt sich in folgende Rubriken:
  1. Assembler-Optionen
  2. Assembler-Ausgaben und Fehlermeldungen
  3. Allgemeine Syntax
  4. Mnemonik und Syntax: Zilog oder Robotron?
  5. Undokumentierte Befehle


1. Assembler-Optionen

Mit den Assembler-Optionen beeinflussen Sie die Arbeitsweise des Assemblers, insbesondere hinsichtlich der unterstützten Mnemonik und Syntax sowie was mit dem erzeugten Programmcode geschehen soll. Die Assembler-Optionen stellen Sie in einem Fenster ein, dass beim erstmaligen Starten des Assemblers erscheint. Außerdem können Sie die Optionen jederzeit mit dem Menüpunkt Assemblieren mit... aufrufen und verändern.

Wenn Sie mehrere Assembler-Quelltexte im Texteditor geöffnet haben, werden die Assembler-Optionen für jeden Quelltext separat verwaltet.

2. Assembler-Ausgaben und Fehlermeldungen

Alle Assembler-Ausgaben, d.h. Meldungen über den Abarbeitungsfortschritt, Fehlermeldungen, Warnungen und, sofern in den Assembler-Optionen angegeben, die Ausgabe der Markentabelle erscheinen in einem separaten Fenster, dass mit jedem Start des Assembler geöffnet beziehungsweise auf dem Desktop nach vorn geholt wird. Auf Fehlermeldungen und Warnungen können sie doppelt klicken, um direkt zu der betreffenden Stelle im Quelltext zu gelangen.

3. Allgemeine Syntax

3.1. Groß- und Kleinschreibung

Der Assembler unterscheidet außer bei Zeichen- und Zeichenkettenliteralen nicht zwischen Groß- und Kleinschreibung, d.h., die Mnemonik der Befehle und die Register können sowohl groß als auch klein geschrieben werden. Bei den Marken gibt man in den Assembler-Optionen an, ob zwischen Groß- und Kleinschreibung unterschieden werden soll.

3.2. Aufbau einer Assembler-Quelltextzeile

Die allgemeine Syntax einer Quelltextzeile lautet:

[Marke[:]] [Mnemonik [Argument_1[,Argument_2[,...]]]] [;Kommentar]


In eckigen Klammern stehende Ausdrücke sind optional. Eine Marke muss am Anfang einer Zeile beginnen. Ein Assembler-Befehl (angegeben durch eine Mnemonik) darf nicht am Anfang einer Zeile beginnen, d.h., wenn die Zeile keine Marke enthält, muss vor der Mnemonik mindestens ein Leerzeichen oder ein Tabulator stehen.

3.3. Numerische Ausdrücke

Bei numerischen Ausdrücken unterstützt der Assembler die Vorzeichen + und - sowie die arithmetischen Operationen Addition und Subtraktion, die ebenfalls durch + und - angegeben werden. Die einzelnen Elemente eines Ausdrucks sind entweder eine Marke, ein Zahlenliteral, ein Zeichenliteral oder der Zugriff auf das höherwerte beziehungsweise niederwertige Byte eines untergeordneten Ausdrucks.

3.4. Zahlenliteral

Zahlenliterale beginnen mit einer Ziffer und können mit einem Buchstaben enden, der die Basis der Zahl angibt. Folgende Buchstaben sind dabei möglich:
Abschließender Buchstabe Basis der Zahl Bemerkung
nicht vorhanden10Dezimalzahl
B, oder b2Binärzahl
O, o, Q oder q8Oktalzahl
H oder h16Hexadezimalzahl

Hexadezimalzahlen müssen auch mit einer Ziffer beginnen!

Beispiele:
BeispielDezimaler Wert
123123
101b5
123q83
0AFh175


3.5. Zeichenliteral

Ein Zeichenliteral ist ein in einfachen Hochkommas eingeschlossenes Zeichen, z.B. 'A'. Ein Zeichenliteral kann innerhalb eines numerischen Ausdrucks verwendet werden.

3.6. Zeichenkettenliteral

Ein Zeichenkettenliteral umfasst ein oder mehrere in einfachen oder doppelten Hochkommas eingeschlossene Zeichen. Zeichenkettenliterale können nur bei den Pseudobefehlen DB, DEFB und DEFM verwendet werden.

3.7. Zugriff auf höher- oder niederwertiges Byte in einem Ausdruck

Zugriff aufSyntax
höherwertiges Byte: H(...)
HIGH(...)
niederwertiges Byte: L(...)
LOW(...)


3.8. Pseudobefehle

Der Assembler versteht folgende Pseudobefehle:
Mnemonik Anzahl der Argumente Typ der Argumente Beschreibung
CPU 1 Zeichenkette U880 oder Z80 Angabe des Prozessortyps,
Dieser Pseudobefehl ist aus Kompatibilitätsgründen vorhanden und hat keine Wirkung, da der Assembler sowieso nur einen Prozessortyp unterstützt.
DEFB
DEFM
DB
mindestens 1 Numerische Ausdrücke oder Zeichenketten Datenbytes erzeugen
DEFH
HEX
mindestens 1 Hexadezimalzahlen,
Es können Hexadezimalzahlen auch ohne führende Null und ohne abschließendes H angegeben werden.
Beispiel: DEFH AB
Datenbytes erzeugen
DEFS
DS
mindestens 1 Numerische Ausdrücke Speicherbereich reservieren,
Steht der Befehl am Anfang oder am Ende des Quelltextes, wird der Speicherbereich zwar reserviert, d.h. die Adressen mitgezählt, jedoch wird kein Programmcode erzeugt. Steht dagegen der Befehl mitten im Quelltext, wird der Bereich mit Null-Bytes aufgefüllt.
DEFW
DA
DW
mindestens 1 Numerische Ausdrücke Datenwörter (jeweils 2 Bytes) erzeugen
END 0 Ende des Quelltextes,
Alle weiteren Quelltextzeilen werden ignoriert.
ENT 0 Eintrittspunkt in das Programms,
Die aktuelle Adresse wird als Startadresse verwendet. Fehlt der Befehl im Quelltext, gilt die Anfangsadresse als Startadresse.
EQU 1 Numerischer Ausdruck Marke definieren,
Die Quelltextzeile muss eine Marke enthalten, die mit dem angegebenen Wert definiert wird.
ORG 1 Numerischer Ausdruck Programmzähler (Adresse) auf den angegebenen Wert setzen,
Steht der Befehl mitten im Quelltext, wird der Bereich zwischen der letzten und der neuen Adresse mit Null-Bytes aufgefüllt.

Alle Pseudobefehle können auch mit einem vorangestellten Punkt geschrieben werden, z.B. .ORG, .DB und so weiter.

4. Mnemonik und Syntax: Zilog oder Robotron?

Robotron hat bei einigen Assembler-Befehlen eine von Zilog abweichende Mnemonik eingeführt, teilweise auch eine abweichende Syntax. Der J1013-Assembler unterstützt beide Varianten. In den Assembler-Optionen können Sie aber auch einstellen, dass entweder nur die Zilog- oder nur die Robotron-Mnemonik/-Syntax zugelassen ist.

Die Mnemonik unterscheidet sich bei folgenden Befehlen:
Assembler-Befehl Zilog-Mnemonik Robotron-Mnemonik
bedingte CALL-Befehle CALL Z
CALL NZ
CALL C
CALL NC
CALL PE
CALL PO
CALL M
CALL P
CAZ
CANZ
CAC
CANC
CAPE
CAPO
CAM
CAP
Vergleichsbefehle CP CMP
Austauschbefehl mit AF EX AF,AF' EXAF
Eingabebefehl: Nur Flag-Register von Zilog nicht dokumentiert INF
unbedingter absoluter Sprung JP JMP
bedingte absolute Sprünge JP Z
JP NZ
JP C
JP NC
JP PE
JP PO
JP M
JP P
JPZ
JPNZ
JPC
JPNC
JPPE
JPPO
JPM
JPP
bedingte relative Sprünge JR Z
JR NZ
JR C
JR NC
JRZ
JRNZ
JRC
JRNC
bedingte Rückkehrbefehle RET Z
RET NZ
RET C
RET NC
RET PE
RET PO
RET M
RET P
RZ
RNZ
RC
RNC
RPE
RPO
RM
RP


Die Syntax unterscheidet sich bei folgenden Befehlen:
Assembler-Befehl Zilog-Syntax Robotron-Syntax Erläuterung
Eingabebefehle IN r,(C) IN r r: Register A, B, C, D, E, H oder L
Ausgabebefehle OUT (C),r
OUT (n),A
OUT r
OUT n
r: Register A, B, C, D, E, H oder L
n: numerischer Ausdruck
8-Bit-Befehle:
  • ADD
  • ADC
  • SBC
ADD A,x
ADC A,x
SBC A,x
ADD x
ADC x
SBC x
x: entweder:
  • numerischer Ausdruck oder
  • Register A, B, C, D, E, H, L oder
  • (HL) oder
  • (IX+d) oder
  • (IY+d)


5. Undokumentierte Befehle

Einige Operationscodes führen im Mikroprozessor Befehle aus, die vom Hersteller nicht dokumentiert sind. Dabei verhält sich der im Z1013 eingesetzte Prozessor U880 genau so wie die Z80 CPU.

Der Assembler unterstützt diese undokumentierten Befehle, wenn Sie das in den Assembler-Optionen so festlegen. Da die Befehle weder von Zilog noch von Robotron dokumentiert sind, existiert auch keine offizielle Mnemonik beziehungsweise Syntax. Aus diesem Grund sind Mnemonik und Syntax dieser undokumentierten Prozessorbefehle spezifische Eigenheiten des J1013-Assemblers und werden nachfolgend beschrieben.

5.1. Zugriff auf die einzelnen Bytes der Index-Register

Viele 8-Bit-Register-Befehle können auch auf das niederwertige beziehungsweise höherwertige Byte der beiden Indexregister angewendet werden. Dabei versteht der Assembler folgende Namen für die Index-Teilregister:
TeilregisterName
Niederwertiges Byte von IX: IXL oder LX
Höherwertiges Byte von IX: IXH oder HX
Niederwertiges Byte von IY: IYL oder LY
Höherwertiges Byte von IY: IYH oder HY


Folgende Befehle sind möglich:
Mnemonik und Syntax mit IXH Erläuterung
LD IXH,n
LD IXH,r
LD IXH,IXH
LD IXH,IXL
n: numerischer Ausdruck
r: Register A, B, C, D oder E
LD r,IXH r: Register A, B, C, D oder E
ADD A,IXH
ADC A,IXH
SUB IXH
SBC A,IXH
AND IXH
XOR IXH
OR IXH
CP IXH
INC IXH
DEC IXH

Anstelle von IXH sind auch IXL, IYH, IYL sowie die alternativen Schreibweisen HX, LX, HY und LY möglich.

5.2. Eingabebefehl: Nur Flag-Register setzen

Der Befehl liest ein Byte vom Eingabetor, dessen Adresse im Register C steht und setzt das Flag-Register entsprechend. Der eingelesene Wert selbst wird nicht behalten.
Mnemonik und Syntax
IN F,(C)
IN (C)

Achtung: Robotron hat diesen Befehl mit der Mnemonik INF dokumentiert. Diese Mnemonik wird vom Assembler somit auch als ein offizieller Befehl verstanden.

5.3. Logischer Linksschiebebefehl

Der Befehl schiebt das Argument um ein Bit nach links, wobei das Bit 0 danach auf 1 gesetzt ist.
Mnemonik und Syntax Erläuterung
SLL r
SLL (HL)
SLL (IX+d)
SLL (IY+d)
r: Register A, B, C, D, E, H oder L


5.4. Rotations-, Schiebe- und Einzelbitbefehle mit Indexregistern, die auch auf ein anderes Register wirken

Die offiziell dokumentierten Rotations-, Schiebe- und Einzelbitbefehle, die auf ein Byte im Arbeitsspeicher angewendet werden, welches durch indirekte Adressierung mit einem Indexregister und Distanzangabe bestimmt wird, können auch auf ein Register wirken, welches als zusätzliches Argument anzugegeben ist. Das gilt auch für den undokumentierten SLL-Befehl.
Mnemonik und Syntax Erläuterung
RLC (IX+d),r
RRC (IX+d),r
RL (IX+d),r
RR (IX+d),r
SLA (IX+d),r
SRA (IX+d),r
SLL (IX+d),r
SRL (IX+d),r
RES b,(IX+d),r
SET b,(IX+d),r
r: Register A, B, C, D, E, H oder L
b: 0 bis 7

Anstelle von IX kann auch IY angegeben werden. Die Befehle haben die gleiche Wirkung wie die offiziell dokumentierten Befehle ohne die zusätzliche Registerangabe, nur mit dem Unterschied, dass sie auch auf das zusätzlich angegebene 8-Bit-Register wirken.