3000 a838 0000 I ... ASM.COM DOC1
Hier fehlt zwischendurch immermal etwas vom Text. Ist die Datei korrekt digitalisiert worden?
;
72
.mt 8
.mb 8
.pc 32
.fm 1
.hm 1
.pn 6  
9.1._____Einleitung


Der  Assembler benoetigt 19 K Speicherplatz plus 4 K Pufferbe-
reich.


Syntax-Notation


 [ ]      Die Eingabe ist optional (wahlfrei).

 < >      Ein Text in Kleinbuchstaben in spitzen Klammern muss 
          durch   den  Anwender  bereitgestellt  werden  (Bsp. 
          <dateiname>).  Ein Text in Grossbuchstaben gibt eine 
          Tastenbedienung an (Bsp. <ENTER>).
          
 { }      Auswahl zwischen 2 oder mehreren Eintragungen

 ...      Die Eintragung kann wiederholt werden.

Alle anderen Interpunktionszeichen

          ,  :  =  / * $ .

werden unveraendert uebernommen.


9.2._____Ueberblick


a)  Der Assembler unterstuetzt 2 Assemblersprachen:

          - 8080-Mnemonik
          - Z80-Mnemonik

b)  Der Assembler erzeugt relativen und/oder  absoluten  Code.

c)  Der Assembler unterstuetzt das Schreiben von Makros.
    Der  Programmierer  schreibt einen Block fuer eine  Anzahl     
    Anweisungen. Dieser Block erhaelt einen Namen, mit dem der     
    Makro  aufgerufen wird.  Die Anweisungen sind  die  Makro-
    Definition.
    Wenn diese Befehle an irgendeiner Stelle benoetigt werden,     
    ruft  der  Programmierer den Makro auf.  Der  Makro-Aufruf 
    uebergibt  ausserdem  die Parameter an den Assembler  fuer 
    die Makro-Expansion.
    Das  Verwenden  von Makros reduziert den Umfang fuer  eine 
    Quelle,  da  die Makro-Definitionen in  einer  gesonderten 
    Datei auf der Diskette stehen koennen und nur in den Modul 
    uebernommen  werden,  wenn sie waehrend der  Assemblierung 
    gefordert werden.
    Makros koennen geschachtelt werden,  d.h.  in einem  Makro 
    kann ein anderer aufgerufen werden. Die Schachtelungstiefe 
    ist nur durch den Speicherplatz begrenzt.

d)  bedingte Assemblierung
    Der Assembler unterstuetzt die bedingte Assemblierung.
    Der  Programmierer  kann eine Bedingung  bestimmen,  unter 
    welcher  Teile  des Programms  entweder  assembliert  oder 
    nicht assembliert werden.
    Die  Moeglichkeiten  der  bedingten  Assemblierung  werden 
    durch  einen  kompletten Satz bedingter  Pseudooperationen 
    vergroessert,  welche das Testen der Assembler-Paesse, der 
    Symbol-Definitionen und der Makro-Parameter einschliessen.
    Die  Bedingungen koennen bis zu 255-mal geschachtelt  wer-
    den.


9.3._____Quelldatei-Organisation


9.3.1.___Formate


Eine Assembler-Quelldatei ist eine Anzahl von Zeilen geschrie-
ben in Assembler-Sprache.
Die letzte Zeile der Datei muss eine END-Anweisung sein.
Entsprechende Anweisungen, wie z.B. IF...ENDIF, muessen in der 
richtigen Reihenfolge stehen.  Anderenfalls koennen die Zeilen 
in beliebiger Reihenfolge des Programmentwurfs erscheinen.


9.3.1.1._Quellzeilen-Format


Eine   Eingabe-Quelldatei  fuer  den  Assembler  besteht   aus 
Anweisungs-Zeilen, die in Teile oder Felder unterteilt sind:

     Symbol    Operation    Argument    Kommentar

Symbol:        Dieses  Feld  kann eines der  drei  Symboltypen 
               enthalten:
               . Label (Marke)
               . Public
               . External,
               gefolgt von einem Doppelpunkt,  ausser wenn das                
               Symbol Teil einer SET- ,EQU- oder  MAKRO-Anwei-
               sung ist.

Operation:     Dieses Feld enthaelt einen Operationscode, eine                
               Pseudooperation,  einen Makro-Namen  oder einen                
               Ausdruck.

Argument:      Dieses  Feld  enthaelt  Ausdruecke,   Variable, 
               Register-Namen, Operanden und Operatoren.

Kommentar:     Dieses Feld enthaelt Kommentartext,  der  immer 
               mit einem Semikolon beginnen muss.
.pa
Alle Felder sind optional. Auch Leerzeilen sind moeglich.
Die  Anweisungen beginnen in einer beliebigen Spalte.  Mehrere 
Leerzeichen oder Tabulatoren zwischen den Feldern koennen  zur 
besseren  Lesbarkeit  eingefuegt werden,  aber mindestens  ein 
Leerzeichen oder Tabulator ist zwischen zwei Feldern noetig.


9.3.1.2._Kommentar


Ein Kommentar beginnt immer mit einem Semikolon und endet  mit 
<ENTER>.
Fuer  lange  Kommentare kann man die  .COMMENT-Pseudooperation 
verwenden,  um das Einfuegen des Semikolons auf jeder Zeile zu 
vermeiden.


9.3.2.___Symbole


Symbole sind Namen fuer Teilfunktionen oder Werte. Symbolnamen 
werden  durch den Programmierer definiert.  Die  Symbole  fuer 
dieses  Programmpaket gehoeren zu einem  von drei  Typen,  ge-
maess ihrer Funktion. 
Diese 3 Typen sind:

     . Label
     . Public
     . External

Alle 3 Typen haben ein Modus-Attribut,  das mit dem  Speicher-
segment  korrespondiert,  welches  das  Symbol  repraesentiert
(siehe Pkt. 9.3.2.4.).

Alle 3 Typen der Symbole haben folgende Charakteristik:

1. Symbole koennen beliebige Laenge haben, aber die Anzahl der       
   signifikanten Zeichen,  die an den Programmverbinder ueber-
   geben werden, varriiert mit dem Typ des Symbols:

   a) Fuer Labels (Marken) sind die ersten 16 signifikant.
   b) Fuer  Public- und External-Symbole werden  die ersten  6 
      Zeichen an den Programmverbinder uebergeben.

   Zusaetzliche Zeichen werden "intern" abgeschnitten.

2. Ein gueltiges Symbol kann folgende Zeichen enthalten:
   A-Z  0-9  $  .  ?  @  _

3. Ein  Symbol darf nicht mit einer Ziffer oder  einem  Unter-
   streichungszeichen beginnen.

4. Beim  Lesen eines Symbols werden Kleinbuchstaben in  Gross-
   buchstaben  gewandelt.  Es  koennen  also  auch  Klein- und          
   Grossbuchstaben in einem Symbol gemischt auftreten.


9.3.2.1._Label_(Marke)


Ein  Label ist ein Referenzpunkt fuer eine Anweisung innerhalb 
des Programmoduls, in dem diese Marke definiert ist.
Eine  Marke  setzt  ihren Adresswert der Symbolmarke  auf  die 
Adresse der Daten, die der Marke zugeordnet sind.

Beispiel:

         BUFF: DS 10̷0̷0̷H

BUFF ist gleich der 1.  Adresse der 10̷0̷0̷H Bytes des reservier-
ten Platzes.

Ist   eine Marke einmal definiert,  kann sie als Eintragung im 
Argumentfeld verwendet werden.
Eine Anweisung mit einer Marke in ihrem Argument bezieht  sich 
auf die Anweisungszeile,  in welcher diese Marke im Symbolfeld 
als  Marke  definiert ist.  

Beispiel:

         STA   BUFF

schreibt den Inhalt des A-Registers auf den Speicherplatz, den 
die Marke definiert.

Eine Marke kann ein beliebiges gueltiges Symbol mit bis zu  16 
Zeichen Laenge sein.
Wenn eine Marke definiert werden soll,  so muss sie als erstes 
in der Anweisungszeile stehen.
Sowohl  bei  Z80- als auch bei 8080-Mnemonik muss  nach  einer 
Marke sofort ein Doppelpunkt (kein Leerzeichen) folgen; es sei 
denn,  die Marke ist Teil einer SET- oder EQU-Anweisung  (dann 
kein Doppelpunkt).
(Folgen  der Marke 2 Doppelpunkte,  dann wird sie zum  Public-
Symbol!)


9.3.2.2._Public


Ein  Public-Symbol ist als Marke  definiert.  Der  Unterschied 
zur  Marke  besteht darin,  dass ein  Public-Symbol  auch  als 
Referenzpunkt in anderen Programmoduln verfuegbar ist.

Es gibt 2 Moeglichkeiten, ein Symbol als Public zu erklaeren:
 
1.  2 Doppelpunkte (::) folgen dem Namen

          MARKE:: RET
.pa
2.  Verwendung einer der Pseudo-Operationen
    PUBLIC, ENTRY oder GLOBAL

          
          PUBLIC MARKE

Beispiel:

Das Resultat beider Moeglichkeiten ist identisch:

          MARKE:: RET

ist aequvalent zur Anweisungsfolge

          PUBLIC  MARKE
          MARKE:  RET


9.3.2.3._External


Ein externes Symbol ist ausserhalb des aktuellen Programmoduls 
in  einem  anderen,  separaten  Modul als Public-Symbol  defi-
niert.

Die  Wertzuweisung  erfolgt waehrend  der  Programmverbindung. 
Dabei wird dem externen Symbol der Wert des Public-Symbols aus 
dem anderen Programmodul uebergeben.

Beispiel:

     MODUL1

     MARKE::    DB         7         ;PUBLIC  MARKE=7

     MODUL2

                BYTE EXT   MARKE     ;EXTERNAL MARKE

Waehrend  der Programmverbindung wird fuer EXTERNAL MARKE  der 
Wert von PUBLIC MARKE verwendet.

Ein Symbol wird zum External erklaert durch:

1.  2 Doppelkreuze (##) nach dem Namen des Symbols.

    Beispiel:     
    
          CALL  MARKE##

    erklaert MARKE als ein Symbol mit einem 2-Byte-Adresswert, 
    definiert in einem anderen Modul.
.pa
2.  Fuer 2-Byte-Werte eine der Pseudo-Operationen

          EXT, EXTRN oder EXTERNAL

    Beispiel:
          
          EXT MARKE

    erklaert MARKE als ein 2-Byte-Symbol,  definiert in  einem 
    anderen Modul.

3.  Fuer 1-Byte-Werte eine der Pseudooperationen

          BYTE EXT ,BYTE EXTRN oder BYTE EXTERNAL
          
    Beispiel:
          
          BYTE EXT   MARKE

    erklaert MARKE als 1-Byte-Wert, definiert in einem anderen 
    Programmodul.

Das  Ergebnis  aller Moeglichkeiten der Vereinbarung ist  das-
selbe.

          CALL  MARKE##

ist aequivalent zur Anweisungsfolge

          EXT   MARKE
          CALL  MARKE


9.3.2.4._Speicherzuordnungszaehler-Modus_(Typenarten)


Ein  Symbol bezieht sich beim Auftreten seines Namens im Argu-
mentfeld auf eine Anweisungszeile.
Der Wert des Symbols ist die Adresse der Anweisung,  die durch 
das  Symbol  markiert wird.  Wenn das Symbol  im  Argumentfeld 
auftritt, wird es druch seinen Wert ersetzt  und in der Opera-
tion verwendet.  

Der Wert eines Symbols wird gemaess seinem Speicherzuordnungs-
zaehler (PC)-Modus bestimmt.

Durch den Speicherzuordnungszaehler-Modus ist eine Teilung des 
Speichers  in  4 Segmente moeglich.  Er bestimmt,  in  welches 
Segment der Programmteil geladen wird.

Die 4 Segmente sind:

    . absolutes Segment
    . coderelatives Segment
    . datenrelatives Segment
    . commonrelatives Segment 
Der PC-Modus legt fest, ob ein Programmteil

- in  den  Speicher  auf  eine  absolute,   vom  Programmierer 
  festgelegte Adresse, geladen wird (absoluter Modus)  

- oder auf relative Adressen, die sich aendern, abhaengig  von 
  der  Groesse  und der Anzahl  der  Programme  (coderelativer 
  Modus) und dem Umfang der Daten (datenrelativer Modus)  
   
- oder auf Adressen,  die gemeinsame Bereiche mit anderen Pro-
  grammen  darstellen (commonrelativer Modus).

Wurde nichts angegeben, ist der Modus coderelativ (standard).
Ein Programm kann Programmteile fuer verschiedene Speicherseg-
mente enthalten.


Absoluter_Modus


Der absolute Modus erzeugt nichtverschiebbaren Code.  Der Pro-
grammierer waehlt den absoluten Modus,  wenn ein Programmblock 
stets  auf festgelegte absolute Adressen zu laden  ist,  unab-
haengig  von sonstigen zu ladenden Segmenttypen  (DSEG,  CSEG, 
COMMON).


Datenrelativer_Modus


Der  datenrelative  Modus erzeugt  verschieblichen  Code  fuer 
einen  Programmteil,  der veraenderlichen Code enthalten  kann 
und  folglich  in den RAM-Bereich geladen  werden  muss.  Dies 
bezieht  sich besonders auf Programmdatenbereiche.  Symbole im 
datenrelativen Modus sind verschieblich.


Coderelativer_Modus


Der  Code- (programm-) relative Modus erzeugt Code fuer  einen 
verschieblichen  Programmteil,  dessen Codeinhalt  sich  nicht 
veraent-Wt.  Programmteile  fuer PROM-Abspeicherung muessen im 
coderelativen Modus erzeugt werden.


Common-relativer_Modus


Der Common-relative Modus erzeugt Code, der in einem definier-
ten Common-Bereich (gemeinsamen Datenbereich) geladen wird.
Das ermoeglicht,  den Programmodul in einen Speicherblock  und 
gemeinsame Werte zu teilen.
.pa
Zum  Aendern des Modus wird in einer Anweisungszeile eine  PC-
Modus-Pseudooperation verwendet.

ASEG           absoluter Modus
DSEG           datenrelativer Modus
CSEG           coderelativer Modus (zugewiesener Modus)
COMMON         commonrelativer Modus

Diese  Pseudooperationen  sind  in  Pkt.  9.4.1.3.  detailiert 
beschrieben.
Die PC-Modus-Faehigkeit im Assembler gestattet dem Programmie-
rer, verschiebbare Assemblerprogramme zu entwickeln. 

Verschieblich bedeutet,  der Programmodul kann auf jede belie-
bige  Adresse auf verfuegbaren Speicher geladen  und  getestet 
werden, unter Verwendung des /P- und /D-Schalters (Spezialkom-
mandos) des Programmverbinders.


9.3.3.___Operationscodes_und_Pseudooperationen
 

Operationscodes  sind mnemonische Namen fuer die  Maschinenan-
weisungen (CPU-Befehle).
Pseudooperationen sind Vorschriften fuer den Assembler,  nicht 
fuer den Mikroprozessor.
Operationscodes  und Pseudooperationen werden (meist)  in  das 
Operationsfeld der Anweisungszeile eingetragen. 

Eine Operation kann sein:

     . jede beliebige Z80- oder 8080-Mnemonik
     . eine Assembler-Pseudooperation
     . ein Makro-Aufruf
     . ein Ausdruck
   
Die   Eintragungen  im Operationsfeld werden vom Assembler  in 
der folgenden Reihenfolge ausgewertet:

     1. Makro-Aufruf
     2. Operationscode/Pseudooperation
     3. Ausdruck

Der Assembler vergleicht die Eintragung im Operationsfeld  mit 
einer  internen Liste von Makronamen.  Wenn der Name  gefunden 
wurde,  wird die Makroexpansion durchgefuehrt und die  entste-
henden  Anweisungen  in den Modul eingefuegt (siehe dazu  auch 
Abschnitt 9.4.2.). Ist die Eintragung kein Makro, versucht der 
Assembler die Eintragung als Operationscode auszuwerten.

War die Eintragung kein Operationscode, versucht der Assembler 
die Eintragung als Pseudooperation auszuwerten. 
Wenn die Eintragung auch keine Pseudooperation ist, wertet der 
Assembler die Eintragung als Ausdruck.
.pa
Wenn  ein  Ausdruck als Anweisungszeile  ohne  vorangestelltem 
Operationscode,  Pseudooperation  oder  Makroname  geschrieben 
wurde,  meldet der Assembler keinen Fehler.  Vielmehr setzt er 
voraus,  dass  ein definiertes Byte (Pseudooperation) vor  den 
Ausdruck gehoert und uebersetzt diese Zeile.

Wegen der Auswertungsreihenfolge verhindert ein Makroname, der 
identisch  einem  Operationscode ist,  desses  Verwendung  als 
Operationscode.  Dieser  Name  wird dann  ausschliesslich  als 
Makroaufruf  gebraucht.  Wurde z.B.  einem  Makro der Name ADD 
zugewiesen,  kann in diesem Programm ADD nicht mehr als Opera-
tionscode verwendet werden!


9.3.4.___Argumente_(Ausdruecke)


Die  Argumente fuer die Operationscodes und  Pseudooperationen 
werden gewoehnlich als Ausdruecke bezeichnet, da sie  mathema-
tischen Ausdruecken aehneln, 

     wie z.B. 5+4*3.

Die  Teile  eines  Ausdruckes werden Operanden (5,4 und  3  in 
diesem  mathematischen Ausdruck) und Operatoren (+ und *  sind 
Beispiele)  genannt.  Ausdruecke  koennen einen  oder  mehrere 
Operanden beinhalten.

Ein-Operand-Ausdruecke  sind  die am  haeufigsten  gebrauchten 
Argumente.
Wenn  ein  Ausdruck  mehr als einen Operanden  hat,  sind  die 
Operanden miteinander durch einen Operator verbunden.

Beispiel:      5+4  6-3  7*2  8/7  9>8  usw.

Im  Assembler sind die Operanden numerische  Werte,  vertreten 
durch Zahlen,  Zeichen, Symbole oder 8080-Operationscodes. Die 
Operatoren koennen arithmetische oder logische sein.

Die  folgenden Abschnitte  definieren die vom Assembler  zuge-
lassenen Operanden und Operatoren.


9.3.4.1._Operanden


Operanden koennen sein

     . Zahlen
     . Zeichen
     . Symbole
     . 8080-Operationscodes
.pa
Zahlen

Mit diesem Assembler kann in unterschiedlichen  Zahlensystemen 
gearbeitet werden.
Die  zugewiesene  Basis fuer Zahlen  ist  dezimal  (Standard). 
Diese  Basis  kann durch die Pseudooperation .RADIX  geaendert 
werden.  Jede  Basis von 2 (binaer) bis 16 (hexadezimal)  kann 
ausgewaehlt  werden.  Wenn die Grundzahl groesser als 10̷  ist, 
werden  fuer die auf 9 folgenden Ziffern A-F  verwendet.  Wenn 
das  erste Zeichen einer Zahl nicht numerisch  ist,  muss  der 
Zahl eine 0̷ vorausgehen.
Eine Zahl wird immer in der augenblicklich zugewiesenen Grund-
zahl  ausgewertet,  falls  keine der  folgenden  Bezeichnungen 
verwendet wurden:

     nnnnB          binaer
     nnnnD          dezimal
     nnnnO          oktal
     nnnnH          hexadezimal
     Xnnnn          hexadezimal
 
Zahlen  sind vorzeichenlose binaere 16-Bit-Werte (im  Wertebe-
reich 0...65535). Der Ueberlauf einer Zahl beim Ueberschreiten 
von  2 Byte wird ignoriert,  das Ergebnis bilden  die  nieder-
wertigen 16 Bits.


ASCII-Zeichen-Ketten


Eine Zeichenkette wird gebildet aus null oder mehr Zeichen und 
begrenzt durch Anfuehrungsstriche (") oder Apostroph (').

Wenn eine durch  " begrenzte Kette als Argument auftritt, wird 
der  Wert der Zeichen einer nach dem anderen im Speicher abge-
legt.

Beispiel:      DB  "ABC"

speichert  den Code von A auf die erste Adresse,  B auf Adres-
se+1 und C auf Adresse+2.

Die Begrenzer koennen als Zeichen verwendet werden,  wenn  sie 
fuer jedes gewuenschte Vorkommen zweifach erscheinen.

Beispiel:
     
     "Heute ist ein ""schoener"" Tag"
     
     speichert die Zeichenkette

     Heute ist ein "schoener" Tag.

Stehen  keine Zeichen zwischen den Anfuehrungszeichen,wird die 
Kette als Nullkette ausgtige Byte in  die  zweite 
    Adresse.

     Beispiel:
          
      DW 'AB'+0̷

    wertet  4142H aus und speichert 42H in die erste  Adresse 
    und 41H in die zweite Adresse.

Eine Zeichenkonstante, die nur ein Zeichen beinhaltet, bekommt 
den Code des Zeichens zugeordnet.  Das heisst,  das hoeherwer-
tige Byte des Wertes ist Null,  das niederwertige Byte ist der 
Code des Zeichens.

Beispiel: Der Wert der Zeichenkonstanten 'A' ist 410̷0̷H.

Eine Zeichenkonstante,  die aus zwei Zeichen besteht,  hat als 
ihren  Wert  den ASCII-Wert des 1.Zeichens  im  hoeherwertigen 
Byte  und  den ASCII-Wert des 2.  Zeichens  im  niederwertigen 
Byte.

Zum Beispiel ist der Wert der Zeichenkonstanten

         'AB'+0̷  gleich 41H*256+42H+0̷.

Die  ASCII-Werte dezimal und hexadezimal fuer Zeichen sind  im 
Anhang zusammengefasst.
.pa
Symbole_in_Ausdruecken

Ein  Symbol kann als Operand in einem Ausdruck verwendet  wer-
den.
Das Symbol wird ausgewertet und der Wert wird fuertige Byte in  die  zweite 
    Adresse.

     Beispiel:
          
      DW 'AB'+0̷

    wertet  4142H aus und speichert 42H in die erste  Adresse 
    und 41H in die zweite Adresse.

Eine Zeichenkonstante, die nur ein Zeichen beinhaltet, bekommt 
den Code des Zeichens zugeordnet.  Das heisst,  das hoeherwer-
tige Byte des Wertes ist Null,  das niederwertige Byte ist der 
Code des Zeichens.

Beispiel: Der Wert der Zeichenkonstanten 'A' ist 410̷0̷H.

Eine Zeichenkonstante,  die aus zwei Zeichen besteht,  hat als 
ihren  Wert  den ASCII-Wert des 1.Zeichens  im  hoeherwertigen 
Byte  und  den ASCII-Wert des 2.  Zeichens  im  niederwertigen 
Byte.

Zum Beispiel ist der Wert der Zeichenkonstanten

         'AB'+0̷  gleich 41H*256+42H+0̷.

Die  ASCII-Werte dezimal und hexadezimal fuer Zeichen sind  im 
Anhang zusammengefasst.
.pa
Symbole_in_Ausdruecken

Ein  Symbol kann als Operand in einem Ausdruck verwendet  wer-
den.
Das Symbol wird ausgewertet und der Wert wird fueriert,  ist das Ergebnis unbekannt. Der Assembler uebergibt 
   den  Ausdruck  an den Programmverbinder als  unbekannt  und 
   dieser loest den Ausdruck.


Der_laufende_Speicherzuordnungszaehler


Ein zusaetzliches Symbol fuer das Argumentfeld ist:

        der Speicherzuordnungszaehler.

Der Speicherzuordnungszaehler ist die Adresse der naechsten zu 
uebersetzenden Anweisung.
Der  Speicherzuordnungszaehler  ist oft ein passender  Bezugs-
punkt fuer die Berechnung neuer Adressen.

Anstatt  sich die laufende Programmadresse zu merken  oder  zu 
berechnen,  kann  der Programmierer ein Symbol verwenden,  das 
dem  Assembler den Wert des aktuellen  Speicherzuordnungszaeh-
lers mitteilt.

Das laufende Speicherzuordnungszaehlersymbol ist $.


8080-Operationscodes_als_Operanden


8080-Operationscodes sind nur im 8080-Modus gueltige Ein-Byte-
Operanden.

Waehrend  der  Uebersetzung  wird der  hexadezimale  Wert  des 
Operationscodes berechnet und als Operand verwendet.

Beiiert,  ist das Ergebnis unbekannt. Der Assembler uebergibt 
   den  Ausdruck  an den Programmverbinder als  unbekannt  und 
   dieser loest den Ausdruck.


Der_laufende_Speicherzuordnungszaehler


Ein zusaetzliches Symbol fuer das Argumentfeld ist:

        der Speicherzuordnungszaehler.

Der Speicherzuordnungszaehler ist die Adresse der naechsten zu 
uebersetzenden Anweisung.
Der  Speicherzuordnungszaehler  ist oft ein passender  Bezugs-
punkt fuer die Berechnung neuer Adressen.

Anstatt  sich die laufende Programmadresse zu merken  oder  zu 
berechnen,  kann  der Programmierer ein Symbol verwenden,  das 
dem  Assembler den Wert des aktuellen  Speicherzuordnungszaeh-
lers mitteilt.

Das laufende Speicherzuordnungszaehlersymbol ist $.


8080-Operationscodes_als_Operanden


8080-Operationscodes sind nur im 8080-Modus gueltige Ein-Byte-
Operanden.

Waehrend  der  Uebersetzung  wird der  hexadezimale  Wert  des 
Operationscodes berechnet und als Operand verwendet.

Beiperatoren.
Operatoren,  die wahre oder falsche Bedingungen melden,  geben 
wahr  zurueck,  wenn  das Ergebnis ungleich 0̷ ist und  falsch, 
wenn das Ergebnis gleich 0̷ ist.
Die folgenden arithmetischen und logischen Operatoren sind  in 
Ausdruecken erlaubt:
.pa
Operator        Definition
-------------------------------------------------------------- 
NUL           - Gibt  wahr  zurueck,  wenn das  Argument  (ein 
                Parameter) null ist.
                Der  Rest der Zeile nach NUL wird als Argument 
                zu NUL genommen.

                Die  Bedingung  IF NUL <argument> ist  falsch, 
                wenn  das  erste Zeichen des  Arguments  alles 
                andere als ein Semikolon oder ein <ENTER> ist.

                Bemerkung: IFB und IFNB fuehren dieselbe Funk-
                tion aus,  aber sie sind einfacher zu  verwen-
                den (siehe Pkt.  9.4.1.5. ).
  

TYPE          - Der TYPE-Operator gibt ein Byte  zurueck,  das 
              peratoren.
Operatoren,  die wahre oder falsche Bedingungen melden,  geben 
wahr  zurueck,  wenn  das Ergebnis ungleich 0̷ ist und  falsch, 
wenn das Ergebnis gleich 0̷ ist.
Die folgenden arithmetischen und logischen Operatoren sind  in 
Ausdruecken erlaubt:
.pa
Operator        Definition
-------------------------------------------------------------- 
NUL           - Gibt  wahr  zurueck,  wenn das  Argument  (ein 
                Parameter) null ist.
                Der  Rest der Zeile nach NUL wird als Argument 
                zu NUL genommen.

                Die  Bedingung  IF NUL <argument> ist  falsch, 
                wenn  das  erste Zeichen des  Arguments  alles 
                andere als ein Semikolon oder ein <ENTER> ist.

                Bemerkung: IFB und IFNB fuehren dieselbe Funk-
                tion aus,  aber sie sind einfacher zu  verwen-
                den (siehe Pkt.  9.4.1.5. ).
  

TYPE          - Der TYPE-Operator gibt ein Byte  zurueck,  das 
                Das Definitionsbit ist das 5. Bit.  Dieses Bit 
                ist 1, wenn der Ausdruck lokal definiert wurde 
                und  es ist 0̷,  wenn der Ausdruck  undefiniert 
                oder extern ist.


                TYPE  wird meistens innerhalb von Makros  ver-
                wendet,  wo der Modus eines Arguments getestet 
                werden  muss,  um Entscheidungen betreffs  des 
                Programmablaufs zu treffen, z.B. wenn bedingte 
                Assemblierung enthalten ist.
                        
.pa
Operator        Definition
--------------------------------------------------------------

                Beispiel:       
                        
                MARKE     MACRO    X             
                          LOCAL    Z
                Z         SET TYPE X
                IF        Z...
 
                TYPE testet den Modus und die Zuordnung von X.
                Abhaengig  von  der Auswertung von X wird  der 
                angibt,  um die  der 
                Wert nach links verschoben werden soll.
 
- (Vorzeichen - zeigt an,  dass der folgende Wert negativ  ist 
  -Minus)       (negative ganze Zahl).

+             - Addition

-             - Subtraktion  des rechten Operanden vom  linken 
                Operanden.

EQ            - Gleichheit.
                Gibt wahr zurueck, wenn die Operanden einander 
                gleich sind.


Operator        Definition
--------------------------------------------------------------
NE            - Nicht gleich.
                Gibt wahr zurueck, wenn die Operanden einander 
                nicht gleich sind.

LT            - Kleiner als.
                Gibt  wahr  zurueck,  weno der  linke  Operand 
                kleiner als der rechte Operand ist.

LE            - Kleiner als oder gleich.
                Gibt  wahr  zurueck,  wenn der  linke  Operand 
                kleiner oder gleich dem rechten Operanden ist.

GT            - Groesser als.
                r sind.  Gibt falsch  zurueck,  wenn 
                beide Operanden falsch sind.
                Beide Operanden muessen absolute Werte sein.
                
XOR           - Exklusives Oder.
                Gibt  wahr zurueck,  wenn einer der  Operanden 
                wahr und der andere falsch ist.
                Gibt falsch zurueck, wenn beide Operanden wahr 
                oder beide Operanden falsch sind.
                Beide Operanden muessen absolute Werte sein.

.pa
Die_Reihenfolge_fuer_diese_Operatoren_ist:


                 NUL,TYPE
                 LOW,HIGH
                 *,/,MOD,SHR,SHL
                 Vorzeichen Minus
                 +,(...hier fehlt etwas Text...)GT,GE
                 NOT
                 AND
                 OR,XOR

Wenn  Unterausdruecke  Operatoren  hoeherer  Rangordnung  ein-
schliessen, dann wird dieser Ausdruck zuerst berechnet.
Die  Abarbeitungsreihenfolge  kann durch das Verwenden  runder 
Klammern um den Teil des Ausdrucks, 
     . Speicherzuordnungszaehler-Modus
     . Dateibezogene Pseudooperationen
     . Listensteuerung