3000 a244 0000 I ... ASM.COM DOC2
;
72
.mt 8
.mb 8
.pc 32
.fm 1
.hm 1
.pn 23
9.4.1.1._Pseudooperationen_zur_Auswahl_der_Anweisungsliste


Standard ist die 8080-Mnemonik.
Wenn nicht die richtige Pseudooperation zur Auswahl der Anwei-
sungsliste angegeben wurde,  gibt der Assembler einen schweren 
Fehler fuer jene Operationscodes zurueck, die fuer die aktuel-
le Anweisungsliste ungueltig sind. Das heisst, .Z80 uebersetzt 
nur Z80-Operationscodes und .8080 nur 8080-Operationscodes.
Deshalb muss bei einem im Z80-Code geschriebenen Assemblerpro-
gramm  die Pseudooperation zur Auswahl dieser Anweisungsliste, 
 .Z80, geschrieben werden.

Bemerkung:
Alle in diesem Kapitel aufgelisteten Pseudooperationen  werden 
bei beiden Anweisungslisten verarbeitet.

  .Z80

 .Z80 hat keine Argumente.
 .Z80 weist den Assembler auf die Uebersetzung  von Z80-Opera-
 tionscodes hin.

  .8080
 
 .8080 hat keine Argumente.
 .8080 weist den Assembler auf die Uebersetzung von 8080- Code 
 hin. Die Auswahl dieses Befehlssatzes ist Standard.

Alle Operationscodes,  die der Pseudooperation zur Auswahl des 
Befehlssatzes folgen,  werden entsprechend uebersetzt, bis die 
alternative Pseudooperation auftritt.
Tritt  ein  Operationscode auf,  der nicht  zum  ausgewaehlten 
Befehlssatz  gehoert,  gibt  der  Assembler  einen  "U-Fehler" 
zurueck.


9.4.1.2._Pseudooperation_zur_Daten-_und_Symboldefinition


Alle Programmoperationen zur Definition von Daten und Symbolen 
werden  fuer  beide Befehlssaetze unterstuetzt.  (Die  einzige 
Ausnahme  bildet SET,  das fuer die Z80-Anweisungsliste  nicht 
erlaubt ist.)

Zu beachten: Es gilt:

     * zeigt an, dass die Pseudooperation fuer .Z80 ist.

       Kein  Stern  zeigt an,  dass die  Pseudooperation  fuer 
       .8080 ist.

.pa
Definiere_Byte

      DB   <exp>[,<exp>...]
    * DEFB <exp>[,<exp ...]
      DB   <string>[,<string>...]
    * DEFM <string>[,<string>...]

Die  Argumente der DB's sind entweder Ausdruecke oder Zeichen-
ketten.Die Argumente der DEFB's sind Ausdruecke. Die Argumente 
der  DEFM's  sind  Ketten.  Ketten muessen  in  einfache  oder 
doppelte Anfuehrungszeichen eingeschlossen werden.

Bemerkung:
DB  wird  in den folgenden Erklaerungen  stellvertretend  fuer 
alle moeglichen Definiere-Byte-Pseudooperationen verwendet.

DB  wird verwendet,  um einen Wert (Kette oder  numerisch)  in 
einem  Speicherplatz abzulegen,  beginnend ab laufenden  Spei-
cherplatzzuordnungszaehler.
Ausdruecke  muessen sich auf ein Byte auswerten  lassen.  Wenn 
das hoehere Byte 0 oder 255 ergibt,  ergibt sich kein  Fehler, 
anderenfalls wird ein A-Fehler erzeugt.

Ketten  mit  3 oder mehr Zeichen koennen in Ausdruecken  nicht 
verwendet werden (sie muessen unmittelbar von einem Komma oder 
dem Ende der Zeile gefolgt werden).
Die  Zeichen einer 8080- oder Z80-Kette werden in der  Reihen-
folge  ihres Auftretens gespeichert,  jedes als ein  Ein-Byte-
Wert, das hoechstwertige Bit auf 0 gesetzt.

Beispiel:       DB   'AB'
                DB   'AB' AND 0FFH
                DB   'ABC'
erzeugt:

0000' 41 42     DB  'AB'
0002' 42        DB  'AB' AND 0FFH
0003' 41 42 43  DB  'ABC'


Definiere_Zeichen

     DC <string>
 
DC speichert die Zeichen der Kette in <string> in aufeinander-
folgende  Speicherplaetze,  beginnend ab laufenden Speicherzu-
weisungszaehler.
Wie  bei DB werden die Zeichen in der Reihenfolge  ihres  Auf-
tretens gespeichert, jedes als ein Ein-Byte-Wert, das hoechst-
wertige  Bit auf 0 gesetzt.  Jedoch wird beim letzten  Zeichen 
der Kette das hoechstwertige Bit auf 1 gesetzt.
Es  wird  ein Fehler erzeugt,  wenn das Argument von  DC  eine 
Nullkette ist.
.pa
Beispiel:

                           MARKE:  DC  "ABC"

          erzeugt:

          0000  41 42 C3   MARKE:  DC  "ABC"


Definiere_Speicher

     DS   <exp>[,<val>]
   * DEFS <exp>[,<val>]

Die  Pseudooperation  "Definiere  Speicher"  reserviert  einen 
Speicherbereich.  Der  Wert  von <exp> gibt die Anzahl der  zu 
reservierenden Bytes an.
Zum  Initialisieren des reservierten Bereiches setzt <val> den 
gewuenschten Wert.

Wenn  <val>  weggelassen ist,  wird der  reservierte  Speicher 
nicht  initialisiert.  Der  reservierte  Speicherbereich  wird 
nicht  automatisch auf 00H initialisiert.  Eine  Moeglichkeit, 
den  reservierten  Speicherbereich auf 00H zu  initialisieren, 
bietet  der /M-Schalter waehrend der Uebersetzung (siehe  Pkt. 
9.5.2.4.).

Alle  Namen,  die  in Ausdruecken  verwendet  werden,  muessen 
vorher definiert sein (alle Namen muessen im Pass 1 zu  diesem 
Zeitpunktpunkt bekannt sein).
Ansonsten wird waehrend des Pass 1 ein V-Fehler  erzeugt,  ein 
U-Fehler  kann  im 2.  Pass erzeugt werden;  ein  Phasenfehler 
ergibt  sich wahrscheinlich,  weil die Pseudooperation  "Defi-
niere Speicher" im Pass 1 keinen Code erzeugt hat.

Beispiel:

                    DS  100H

reserviert  100 Byte Speicherplatz nicht initialisiert,  d.h., 
es bleiben dort die Werte stehen,  die an dieser Stelle waren, 
bevor das Programm geladen wurde.

Soll  der Bereich auf 00H initialisiert werden,  kann waehrend 
der Uebersetzung der /M-Schalter verwendet werden.
Oder es kann die folgende Anweisung geschrieben werden, um den 
reservierten  Speicherbereich  auf 00H oder  einen  beliebigen 
anderen Wert zu setzen.
 
                    DS  100H,2

reserviert  100H  Bytes,  von denen jedes Byte mit dem Wert  2 
(02H) initialisiert wird.
.pa

Definiere_Wort
  
     DW    <exp>[,<exp>...]
    *DEFW  <exp>[,<exp>...]

Die  Pseudooperation "Definiere Wort" speichert den  Wert  des 
Ausdruckes  in aufeinanderfolgende Speicherplaetze,  beginnend 
ab laufenden Speicherzuordnungszaehler. Ausdruecke sind 2-Byte 
Werte (Wort).
Die  Werte werden,  das niederwertige Byte zuerst und dann das 
hoeherwertige Byte, gespeichert.Das ist ein Unterschied zu DB!

Beispiel:

                    MARKE:  DW     1234H

erzeugt:

        0000 1234   MARKE:  DW     1234H

Bemerkung:  Die Bytes werden in der Liste in Reihenfolge ihres             
            Auftretens gezeigt,  nicht in der Reihenfolge, wie 
            sie abgespeichert sind.


Equate

     <name> EQU <exp>

EQU weist <name> den Wert des Ausdruckes <exp> zu. <name> kann 
ein Label,  ein Symbol oder eine Variable sein und spaeter  in 
Ausdruecken verwendet werden.
Nach <name> darf kein Doppelpunkt(e) stehen.
Wenn <exp> ein External ist, wird ein Fehler erzeugt.
Wenn <name> schon einen anderen Wert als <exp> hat,  erscheint 
ein M-Fehler.
Wenn  <name>  spaeter im Programm wieder  (zurueck)  definiert 
werden soll, so ist die Pseudooperation SET oder ASET anstelle 
von EQU zu verwenden.
Das ist ein Unterschied zu SET.

Beispiel:

          BUF EQU 0F3H


Externes_Symbol

     EXT            <name>[,<name>...]
     EXTRN          <name>[,<name>...]
   * EXTERNAL       <name>[,<name>...]
     BYTE EXT       <symbol>
     BYTE EXTRN     <symbol>
     BYTE EXTERNAL  <symbol>

Diese Pseudooperation erklaert,  dass der (die) Name(n) in der 
Liste  extern  (ist)  sind (d.h.  definiert in  einem  anderen 
Modul).
Ist   einer der in der Liste auftretenden Namen  im  laufenden 
Programm definiert, wird ein M-Fehler erzeugt.
Ein  Verweis auf einen Namen,  bei dem dem Namen unmittelbar 2 
Doppelkreuze folgen (z.B.  NAME##) wird ebenfalls als EXTERNAL 
erklaert.
EXTERNAL's  koennen auf ein oder zwei Byte ausgewertet werden. 
Bei allen externen Symbolnamen werden nur die ersten 6 Zeichen 
an den Programmverbinder uebergeben.
Zusaetzliche Zeichen werden intern abgeschnitten.

Beispiel:

         EXTRN      MARKEX

Der Assembler generiert fuer diese Anweisungszeile keinen Code 
beim  Uebersetzten dieses Moduls.  Wenn MARKEX als Argument in 
einer  CALL-Anweisung verwendet wird,  wird nur der Code  fuer 
CALL erzeugt und fuer MARKEX wird ein 0-Wert eingetragen.
Der  Programmverbinder durchsucht alle geladenen  Moduln  nach 
einer  PUBLIC  MARKEX-Anweisung und verwendet die  Definition, 
die er fuer MARKEX gefunden hat in der CALL MARKEX-Anweisung.


PUBLIC-Symbol

     ENTRY     <name>[,<name>...]
     GLOBAL    <name>[,<name>...]
     PUBLIC    <name>[,<name>...]

Die  Pseudooperation PUBLIC erklaert jeden Namen der Liste als 
intern  und deshalb verfuegbar fuer die Verwendung  in  diesem 
Programm  und  in anderen,  die gemeinsam geladen und mit  dem 
Programmverbinder gebunden sind.
Es wird ein M-Fehler erzeugt,  wenn der Name ein EXTERNAL oder 
ein Common-Block-Name ist.
Nur die ersten 6 Zeichen des PUBLIC-Symbolnamens werden an den 
Programmverbinder uebergeben.
Zusaetzliche Zeichen werden intern abgeschnitten.

Beispiel:

               PUBLIC     MARKEX
     MARKEX:   LD         HL,BER1

Der Assembler uebersetzt die LD-Anweisung wie ueblich, aber er 
generiert fuer die PUBLIC MARKEX-Anweisung keinen Code.
Wenn der Programmverbinder im anderen Modul die EXTERN MARKEX-
Anweisung  findet,  weiss  er,  dass er  suchen  muss,  bis er 
diese PUBLIC MARKEX-Anweisung gefunden hat. Dann verbindet der 
Programmverbinder   den  Adresswert  der  MARKEX:LD   HL,BER1-
Anweisung  mit der (den) CALL MARKEX-Anweisung(en) im (in den) 
anderen Modul(n).


SET
     
     <name>  SET  <exp>    (nicht fuer den .Z80-Modus)
   * <name>  DEFL  <exp>
     <name>  ASET  <exp>

Die  Pseudooperation SET weist <name> den Wert von  <exp>  zu. 
<name> kann ein Label,  ein Symbol oder eine Variable sein und 
kann spaeter in Ausdruecken verwendet werden.

Nach <name> duerfen keine Doppelpunkte stehen.  Wenn <exp> ein 
EXTERNAL ist, wird ein Fehler erzeugt.

Die  Pseudooperation  SET kann im .Z80-Modus  nicht  verwendet 
werden, weil SET ein Z80-Operationscode ist.

ASET  und  DEFL koennen in beiden  Anweisungslisten  verwendet 
werden.
Wenn <name> spaeter neu definiert werden soll,  muss eine  der 
SET-Pseudooperationen anstelle von EQU verwendet werden.
Zum  neu Definieren von <name> kann jede beliebige SET-Pseudo-
operation benutzt werden,  unabhaengig, mit welcher Pseudoope-
ration die urspruengliche Definition erfolgte (das Verbot  von 
SET im .Z80-Modus wird davon nicht beruehrt).
Das ist ein Gegensatz zu EQU.

Beispiel:

       MARKE   ASET  BER+1000H
 
Wann immer MARKE als Ausdruck (Operand) verwendet wird, wertet 
der Assembler den Ausdruck BER+1000H aus und setzt diesen Wert 
fuer MARKE.  Spaeter, wenn MARKE einen anderen Wert darstellen 
soll, wird einfach eine MARKE ASET-Anweisung mit einem anderen 
Ausdruck eingetragen.

     MARKE  ASET   BER+1000H
        .
        .
        .
     MARKE  ASET   3000H
        .
        .
        .
     MARKE  DEFL   6CDEH
    

9.4.1.3._Pseudooperation_zum_Zuweisen_des_Speicherplatz-
         zuordnungszaehler-Modus      


Viele  Pseudooperationen beziehen sich auf den aktuellen Spei-
cherplatzzuordnungszaehler.
Der  laufende Speicherplatzzuordnungszaehler ist  die  Adresse 
des naechsten Bytes, das zu erzeugen ist.
Im   Assembler   erhalten   Symbole   und   Ausdruecke   ihren 
zugewiesenen  Modus (siehe Pkt. 9.3.2.).

Jeder Modus fuer ein Speichersegment wird durch den  Programm-
verbinder  entsprechend  dem  Typ der  uebersetzten  Anweisung 
zugeordnet.

Es gibt 4 Modi:

     . absoluter Modus
     . datenrelativer Modus
     . coderelativer Modus
     . commonrelativer Modus.

Wenn  der  Speicherplatzzuordnungszaehler-Modus  absolut  ist, 
dann ist er eine absolute Adresse.

Wenn  der  Speicherplatzzuordnungszaehler-Modus  relativ  ist, 
dann ist er eine relative Adresse und kann einen Offset einbe-
ziehen  von  der absoluten Startadresse eines  relativen  Seg-
ments, das vom Programmverbinder geladen werden kann.

Die Pseudooperation zur Zuweisung des Speicherplatzzuordnungs-
zaehler-Modus wird fuer die Spezifizierung genutzt, in welchem 
Typ ein Programmteil zu uebersetzen ist.


Absolutes_Segment

     ASEG

ASEG hat niemals Operanden.  ASEG erzeugt nichtverschieblichen 
Code.
ASEG  setzt den Speicherplatzzuordnungszaehler auf ein absolu-
tes Speichersegment (aktuelle Adresse).  Der Standardwert  ist 
0,  das kann die Ursache sein,  dass Teile des Betriebssystems 
ueberschrieben werden.
Nach  ASEG  sollte  eine ORG-Anweisung mit  103H  oder  hoeher 
geschrieben werden.


Code-Segment

     CSEG

CSEG hat niemals Operanden.
Der  Code wird im coderelativen Modus uebersetzt und  kann  in 
den ROM oder PROM geladen werden.
CSEG  setzt den Speicherzuordnungszaehler auf das coderelative 
Segment des Speichers zurueck.
Die  Zuordnung  ist diejenige des letzten CSEG  (Standard  0), 
wenn nicht danach eine ORG-Anweisung folgt,  die die Zuordnung 
aendert.

Man muss jedoch beachten, dass die ORG-Anweisung im CSEG-Modus 
keine absolute Adresse setzt.
Eine ORG-Anweisung im CSEG-Modus veranlasst den Assembler,  zu 
der  letzten  fuer CSEG geladenen Adresse die im Argument  der 
ORG-Anweisung festgelegte Anzahl Bytes zu addieren.

Wenn   beispielsweise  ORG  50  angegeben  ist,   addiert  der 
Assembler 50 Bytes zu der aktuellen CSEG-Zuordnung,  und  dies 
ist dann die neue Zuordnung von CSEG.
Die  Wirkung der auf ein CSEG (oder DSEG) folgenden ORG-Anwei-
sung ist die, dass einem Modul ein Offset gegeben werden kann.
ORG  setzt  keine  absolute Adresse fuer  CSEG,  sondern  CSEG 
behaelt seine Verschieblichkeit.

Will man fuer CSEG eine absolute Adresse setzen, verwendet man 
den /P-Schalter im Programmverbinder.

CSEG  ist  der Standard-Modus des  Assemblers.  Der  Assembler 
beginnt  automatisch  mit  einem CSEG und  der  Speicherplatz-
zuordnungszaehler im coderelativen Modus weist auf den Platz 0 
des coderelativen Speichersegments. Alle folgenden Anweisungen 
werden  in das coderelative  Speichersegment  uebersetzt,  bis 
eine  ASEG-,  DSEG- oder COMMON- Pseudooperation  abgearbeitet 
wird.

CSEG wird folglich eingetragen,  damit der Assembler zum code-
relativen Modus zurueckkehrt, der Speicherplatzzuordnungszaeh-
ler  wird auf den Punkt des naechsten freien Platzes im  code-
relativen Segment zurueckgesetzt.


Daten-Segment

     DSEG

Die Pseudooperation DSEG hat keine Operanden.
DSEG  spezifiziert Segmente des  uebersetzten  verschieblichen 
Codes, die spaeter nur in den RAM geladen werden.

DSEG setzt den Speicherplatzzuordnungszaehler auf das datenre-
lative Speichersegment.
Die  Zuordnung des datenrelativen Zaehlers ist die des letzten 
DSEG (Standard 0),  wenn nicht eine folgende ORG-Anweisung die 
Zuordnung aendert.
Man muss jedoch beachten, dass die ORG-Anweisung im DSEG-Modus 
keine absolute Adresse setzt.

Eine ORG-Anweisung im DSEG-Modus veranlasst den Assembler,  zu 
der  letzten fuer DSEG geladenen Adresse die im  Argument  der 
ORG-Anweisung festgelegte Anzahl Bytes zu addieren.
Wenn   beispielsweise  ORG  50  angegeben  ist,   addiert  der 
Assembler 50 Bytes zu der aktuellen DSEG-Zuordnung,  und  dies 
ist dann die neue Zuordnung von DSEG.

Die  Wirkung der auf ein DSEG (oder CSEG) folgenden ORG-Anwei-
sung ist die, dass einem Modul ein Offset gegeben werden kann.
ORG  setzt  keine  absolute Adresse fuer  DSEG,  sondern  DSEG 
behaelt seine Verschieblichkeit.
Will  man eine absolute Adresse fuer DSEG  setzten,  verwendet 
man den /D-Schalter im Programmverbinder.


Common-Block_(gemeinsamer_Bereich)

     COMMON /[<blockname>]/

das   Argument  von  COMMON  ist  der  Name  des   gemeinsamen 
Bereiches.
COMMON legt einen  gemeinsamen Datenbereich fuer alle  COMMON-
Bloecke an, die in dem Programm benannt sind.
Wenn   <blockname>  weggelassen  wurde  oder  aus  Leerzeichen 
besteht, wird der Block als leerer Bereich betrachtet.

COMMON-Anweisungen sind nicht ausfuehrbare Speicherzuordnungs-
anweisungen.
COMMON  weist einem Speicherbereich,  genannt gemeinsamer  Be-
reich, Variable, Felder und Daten zu.
Das ermoeglicht,  dass sich verschiedene Programmoduln in den-
selben Speicherbereich teilen. 

Die  der COMMON-Anweisung folgenden Anweisungen werden in  den 
COMMON-Bereich unter <blockname> uebersetzt.
Die  Laenge eines COMMON-Bereiches ergibt sich aus der  Anzahl 
Bytes,  die erforderlich sind,  um die in diesem  COMMON-Block 
definierten  Variablen,  Felder und Daten unterzubringen.  Der 
COMMON-Block  wird beendet,  wenn eine andere  Pseudooperation 
zur  Zuweisung  des Speicherplatzzuordnungszaehler-Modus  auf-
tritt.
Gemeinsame  Bloecke desselben Namens koennen  unterschiedliche 
Laenge haben.
Ist die Laenge verschieden, dann muss der Programmodul mit dem 
laengsten gemeinsamen Block zuerst geladen werden (,  d.h., er 
muss der erste Modulname in der Kommandozeile des Programmver-
binders sein).
Siehe dazu auch die Beschreibung des Programmverbinders.

COMMON setzt den Speicherplatzzuordnungszaehler auf den ausge-
waehlten gemeinsamen Speicherblock.
Die  Zuweisung  ist immer der Beginn des  Bereiches,  so  dass 
Kompatibilitaet mit der FORTRAN COMMON-Anweisung besteht.

Beispiel:

          COMMON         /DATBIN/
BER2      EQU            100H
          DB             0FFH
          DW             1234H
          DC             'WERK'
          CSEG           

.pa
Set_Origin

     ORG <exp>

Der  Wert  des Speicherplatzzuordnungszaehlers kann  zu  jeder 
Zeit  durch die Verwendung von ORG geaendert werden.  Im ASEG-
Modus wird der Speicherplatzzuordnungszaehler auf den Wert von 
<exp>  gesetzt,  und  der Assembler weist den  erzeugten  Code 
beginnend mit diesem Wert zu.

Im CSEG-, DSEG- und COMMON- Modus wird der Speicherplatzzuord-
nungszaehler  in diesem Segment um den Wert von <exp> erhoeht, 
und  der Assembler weist den erzeugten Code beginnend mit  der 
letzten geladenen Segmentadresse plus dem Wert von <exp> zu.

Alle in <exp> verwendeten Namen muessen im Pass 1 bekannt sein 
und  der  Wert muss entweder absolut sein oder im  selben  Be-
reich, wie der Speicherplatzzuordnungszaehler.

Beispiel:
          
     DSEG
     ORG   50

Setzt  den datenrelativen  Speicherplatzzuordnungszaehler  auf 
50,  relativ  zum  Start des datenrelativen  Speichersegments. 
Diese Methode liefert Verschieblichkeit.  Die ORG <exp>  - An-
weisung  spezifiziert  im CSEG- oder DSEG- Modus  keine  feste 
Adresse,  vielmehr laedt der Programmverbinder das Segment auf 
eine  flexible  Adresse,  die fuer die gemeinsam  zu  ladenden 
Moduln verwendet wird.
Andererseits wird ein Programm, das mit den Anweisungen
                    
     ASEG
     ORG 800H

beginnt  und vollstaendig im absoluten Modus  uebersetzt  ist, 
immer beginnend ab 800H geladen,  es sei denn,  die ORG-Anwei-
sung wird in der Quelldatei geaendert.
Das heisst,  die dem ASEG folgende ORG <exp> - Anweisung setzt 
das Segment auf eine feste (im Beispiel absolute) Adresse, die 
durch <exp> bestimmt wird.

Das  gleiche  Programm - im coderelativen Modus,  ohne  ORG  - 
Anweisung uebersetzt - kann auf jede beliebige Adresse geladen 
werden,  wenn  an die Kommandokette des Programmverbinders der 
Schalter /P:<address> angehaengt wird.

   
Verschieben

     .PHASE <exp>
     .DEPHASE

 .PHASE ermoeglicht es,  Code in einen Bereich zu laden,  aber 
nur   in  einem anderen Bereich mit der durch  <exp>  spezifi-
zierten  Adresse  abzuarbeiten.
<exp>  muss ein absoluter Wert sein.  .DEPHASE wird verwendet, 
um   anzuzeigen, dass der verschobene Codeblock zu Ende ist.
Der Modus innerhalb eines .Phase-Blockes ist absolut. Der Code  
wird  in den Bereich geladen,  wenn die  .PHASE-Anweisung  er-
reicht  wird.
Der  Code  innerhalb eines Blockes wird spaeter auf die  durch 
<exp>   fuer die Ausfuehrung spezifizierte  Adresse  transpor-
tiert.

 Beispiel:
                            
                       .PHASE       100H
              MARKE:   CALL         UP1
                       JMP          MARKE1
                UP1:   RET
                       .DEPHASE
              MARKE1:  JMP          5

erzeugt folgende Uebersetzung:

                       .PHASE       100H
0100  CD 0106 MARKE:   CALL         UP1
0103  C3 0007          JMP          MARKE1
0106  C9        UP1:   RET 
                       .DEPHASE
0007' C3 0005 MARKE1:  JMP          5
                       END

 .PHASE-....  .DEPHASE-Block sind eine Moeglichkeit, den Code-
block ab  einer spezifischen absoluten Adresse auszufuehren.


9.4.1.4._Dateibezogene_Pseudooperationen
 

Die dateibezogenen Pseudooperationen:
 
     . fuegen lange Kommentare ein
     . geben dem Modul einen Namen
     . beenden den Modul oder
     . transportieren andere Dateien in das laufende Programm


Comment-Anweisung

     .COMMENT <delim><text><delim>

Das erste nichtleere Zeichen, das nach .COMMENT gefunden wird,  
wird als Begrenzer genommen. Der dem Begrenzer folgende <text>  
wird ein Kommentarblock,  der fortgesetzt wird bis zum  naech-
sten  Auftreten des Begrenzers <delim>.
 .COMMENT  wird fuer lange Kommentare verwendet.  Es ist nicht  
notwendig,  das  Semikolon  zum  Anzeigen  des  Kommentars  zu 
schreiben.

Waehrend  der  Uebersetzung wird der .COMMENT-Block  ignoriert  
und  nicht uebersetzt.

 Beispiel:

     .COMMENT * hier kann jeder beliebige Text
                eingetragen sein
                .
                .
                .
              * ; Rueckkehr zur normalen Uebersetzung


Programmende

     END [<exp>]

Die  End-Anweisung  bezeichnet das  Programmende.  Wenn  diese 
Anweisung fehlt, wird folgende Warnung erzeugt:

          "%NO END statement".

<exp> kann ein Label,  ein Symbol, eine Zahl oder jedes andere 
gueltige Argument sein,  das der Programmverbinder als  Start-
punkt fuer das Pogramm laden kann.

Wenn <exp> angegeben wurde, schreibt der Programmverbinder auf 
die  Adresse 100H eine Sprunganweisung im 8080-Code zu der  in 
<exp> angegebenen Adresse.
Wenn <exp> nicht angegeben wurde,  wird an den Programmverbin-
der fuer dieses Programm keine Startadresse uebergeben und die 
Ausfuehrung beginnt mit dem ersten geladenen Modul.
(Das heisst,  wenn kein <exp> spezifiziert wurde,  ist der /G-
Schalter im Programmverbinder unwirksam.)
<exp>  teilt dem Programmverbinder mit,  dass das Programm ein 
Hauptprogramm ist, sonst wird es als Unterprogramm angesehen.
Wenn nur Assemblerprogramme gebunden werden,  von denen keines 
eine END-Anweisung mit <exp> enthaelt,  wird der  Programmver-
binder nach dem Hauptprogramm fragen.
Haben  zwei oder mehr Programme eine END-Anweisung mit  <exp>, 
so kann der Programmverbinder nicht unterscheiden, welches das 
Hauptprogramm ist.

Wenn  zwei  oder mehr Programme gebunden werden  sollen,  muss 
/G:Name - oder /E:Name - Schalter im Programmverbinder benutzt 
werden.
Name  ist der <exp> der END-Anweisung des  Programms,  welches 
als Hauptprogramm angesehen werden soll.
Wenn ein Programm in einer hoeheren Programmiersprache gemein-
sam mit einem Assemblerprogramm geladen werden soll,  wird vom 
Programmverbinder  automatisch  das Programm in  der  hoeheren 
Sprache als Hauptprogramm genommen.
Das  kann man aendern mit dem /G:Name - oder /E:Name  - Schal-
ter, dabei muss Name der Name des Assemblerprogramms sein.
.pa
Eine  andere  Moeglichkeit  ist das  Setzen  eines  CALL  oder 
INCLUDE  an den Anfang des Programms in der hoeheren  Program-
miersprache, um das Assemblerprogramm zuerst abzuarbeiten.


INCLUDE-Anweisung

     INCLUDE   <dateiname>
     $INCLUDE  <dateiname>
     MACLIB    <dateiname>

Alle drei Pseudooperationen sind sinnverwandt.
Waehrend  der Assemblierung fuegen die INCLUDE-Pseudooperatio-
nen  Quellcode  aus einer anderen Quelldatei in  die  laufende 
Quelldatei ein.

Durch  die Verwendung der INCLUDE-Pseudooperation ist es nicht 
erforderlich,  haeufig gebrauchte Anweisungsfolgen in der lau-
fenden Quelldatei wiederholt zu schreiben.

<dateiname>   ist  jede  fuer  das   Betriebssystem   gueltige 
Dateispezifikation  und muss in grossen Buchstaben geschrieben 
werden.
Wenn der Dateityp und/oder die Geraetezuweisung andere als die 
zugewiesenen  sind,  muss die  Quelldatei-Spezifikation  diese 
enthalten.
Der  zugewiesene  Dateityp  fuer Quelldateien  ist  .MAC.  Die 
Standard-Geraetezuweisung ist das aktuelle (current)  Laufwerk 
bzw. Geraet.

Die INCLUDE-Datei wird eroeffnet und in die  aktuelle Quellda-
tei  uebersetzt,  unmittelbar  anschliessend an  die  INCLUDE-
Anweisung.  Wenn das Dateiende erreicht worden ist,  setzt der 
Assembler mit der auf INCLUDE folgenden Anweisung fort.
Geschachtelte  INCLUDE's sind nicht erlaubt.  Fuer  den  Fall, 
dass  dies auftritt,  wird ein Objektcode-Syntax-Fehler,  "O", 
erzeugt.
Die  im   Operandenfeld spezifizierte Datei  muss  existieren, 
ansonsten  wird  ein "V"-Fehler erzeugt und das  INCLUDE  wird 
ignoriert.  Es  wird  auch ein "V"-Fehler  erzeugt,  wenn  der 
Dateityp der INCLUDE-Datei nicht .MAC ist.

Im  Assemblerprotokoll  wird der Buchstabe  "C"  zwischen  den 
uebersetzten  Code und die Quellzeile  gedruckt   (Siehe  Pkt. 
9.5.3.).


Modulname

     NAME ("modulname")

Name  definiert den Namen fuer den Modul.  Die runden Klammern 
und  Anfuehrungszeichen um den Modulnamen  sind  erforderlich. 
Nur die ersten 6 Zeichen des Modulnamens sind signifikant.
Ein  Modulname  kann auch mit der Pseudooperation TITLE  defi-
niert  werden.  Wenn keine der beiden  Pseudooperationen  NAME 
oder  TITLE vorhanden sind,  wird der Modulname aus dem  Namen 
der Quellcodedatei erzeugt.


RADIX_(Zahlenbasis)
     
             .RADIX <exp>

<exp>  in einer .RADIX-Anweisung ist immer eine dezimale nume-
rische Konstante,  ohne Ruecksicht auf die aktuelle  Zahlenba-
sis.
Die .RADIX-Anweisung erlaubt die Aenderung der Standardzahlen-
basis in irgendeine beliebige zwischen 2 und 16.

 .RADIX  aendert nicht die Zahlenbasis auf der Liste,  sondern 
ermoeglicht die Eingabe numerischer Werte in der  gewuenschten 
Basis ohne spezielle Schreibweise. (Werte in anderen Zahlenba-
sen erfordern spezielle Schreibweisen, erlaeutert im Abschnitt 
"Operanden")

Die  Werte im erzeugten Code erscheinen immer in der hexadezi-
malen Zahlenbasis.

Beispiel:

          DEC:      DB     20
                    .RADIX 2
          BIN:      DB     00011110
                    .RADIX 16
          HEX:      DB     0CF
                    .RADIX 8
          OCT:      DB     73
                    .RADIX 10
          DECI:     DB     16
          HEXA:     DB     0CH

erzeugt folgende Uebersetzung:

0000' 14  DEC:      DB     20
0002                .RADIX 2
0001' 1E  BIN:      DB     00011110
0010                .RADIX 16
0002' CF  HEX:      DB     0CF
0008                .RADIX 8
0003' 3B  OCT:      DB     73
000A                .RADIX 10
0004' 10  DECI:     DB     16
0005' 0C  HEXA:     DB     0CH
 

Request_(Anforderung)

     .REQUEST <dateiname>[,<dateiname>...]

 .REQUEST stellt an den Programmverbinder die  Forderung,  die 
in   der  Liste  enthaltenen  Dateinamen  nach   undefinierten 
externen  Symbolen zu durchsuchen (externe Symbole,  fuer  die 
zum  gleichen Zeitpunkt kein korrespondierendes  PUBLIC-Symbol 
geladen ist).
Die  vom  Programmverbinder gefundenen  undefinierten  Symbole 
werden  benoetigt,  um einen oder mehrere zusaetzliche  Moduln 
fuer einen kompletten Programmverbinderlauf zu laden.

Die Dateinamen in der Liste sollten gueltige Symbole sein  und 
weder Dateityp noch Geraetezuweisung beinhalten.
Der  Programmverbinder setzt den Standarddateityp .REL und das 
aktuelle Laufwerk voraus.
   
Beispiel:

          .
          .
          .
        .REQUEST SUBR1
          .    
          .
          .


Der Programmverbinder durchsucht SUBR1 nach externen Symbolen, 
fuer  die kein korrespondierendes PUBLIC-Symbol in den bereits 
geladenen Moduln definiert ist.


9.4.1.5_Pseudooperationen_zur_Listensteuerung


Die Pseudooperationen zur Listensteuerung fuehren 2 allgemeine 
Funktionen aus:

     . Formatsteuerung
     . Listensteuerung.

Die  Pseudooperationen  zur Formatsteuerung  ermoeglichen  dem 
Programmierer Seitenwechsel und Kopfzeilen einzufuegen.
Das  Protokollieren gesamter Assemblerdateien oder von  Teilen 
davon  wird mit den Pseudooperationen zur Listensteuerung ein- 
und ausgeschaltet.


Pseudooperationen_zur_Formatsteuerung


Diese Pseudooperationen erlauben das einfuegen von Seitenwech-
seln  und  das Festlegen von  Titel- und  Untertitelzeilen  im 
Assemblerprotokoll.