1800 5067 0000 T ... ASSEMBLE.I
Monitoraufrufe:
keine:
Verwendete IO-Ports bzw. Hardware:
keine []
@3*Ol
*************************************************************
*                                                           *
*  E        A  S  S  E  M  B  L  E  R    5.3   Scf   F        *
*                                                           *
*************************************************************


ESystembedingungenF

Programmstandort:   0100H - 2FFFH   =>  CRC=0A175H

	0100H ... 05C0H    Zusatzmonitor
	0600H ... 07FFH    Bildschirmtreiber
	0800H ... 0FFFH    interne Symboltabelle
	1000H ... 2C6FH    Assembler
	2E00H ... 2F6FH    Arbeitszellen

	0100H	Kaltstart
	1006H	Warmstart

Ein Quelltext kann ab Adresse 3000H geladen werden, auch andere 
Standorte sind oberhalb 3000H möglich. Da der Quelltext im
ASCII-Code geschrieben wird, ist er im Speicher frei verschieb-
bar. Zum Schreiben wird daher ein Texteditor verwendet, z.B.
eignet sich der Editor "MicroWORD 1.5 O" (O=oben! ab CC00H)
dafür sehr gut, da er mit dem ASSEMBLER 5.3 zur gleichen Zeit
im Speicher stehen kann und den Text ab 3000H schreibt. Aber
auch mit anderen Editoren wie TEXTED 6.1, MTX, MicroWORD 1.5 U
usw. kann gearbeitet werden, wobei dann vorteilhaft eine RAM-
Floppy mit Headerdisk verwendet werden sollte, um das häufige
Wechseln von Assembler und Editor zu vereinfachen.
Wer über einen Drucker verfügt, kann sich die Quelle vor dem 
Übersetzen zur Dokumentation ausdrucken oder mit einem zusätz-
lichen logischen und physischen Druckertreiber ein Assemblerpro-
tokoll anfertigen lassen. Dabei ist zu beachten, daß die Version
5.3 zwischen den einzelnen Spalten ein TAB (09H) ausgibt, die
der logische Druckertreiber in eine der aktuellen Druckposition
entsprechenden Zahl >Space< wandeln muß. Auch eine Seitenforma-
tierung muß im logischen Druckertreiber erfolgen, da der Assem-
bler keinerlei Formatierungsfunktionen besitzt.
Bei sehr langen Quelltexten ist auch die Arbeit mit der RAM-
Floppy sehr vorteilhaft, da der ASSEMBLER das Nacheinander-
übersetzen von Teilen eines Quelltextes gestattet. 

EBeispielprogrammF

Um die Arbeit des ASSEMBLER's zu demonstrieren, arbeiten wir
mit einem kleinen Beispiel aus dem Z1013-Bedienhandbuch:

;Programmüberschrift
;
        PN      SF         ;Programmname "SF" (kann auch entf.)
;******************************
;Quelltext "Schachfiguren"
;******************************
;
	ORG	1000H	   ;vorgesehener Standort des Programms
;
;Vereinbarungsteil
;
BS:	EQU	0EE08H	   ;Adresse der Bildschirm-Position
;
;Programmtext
;
BEGIN: 	LD	B,6	   ;Zahl der Schachfiguren
	LD	IX,BS	   ;Position der ersten Figur auf
	LD	DE,TAB	   ;Adresse der Tabelle für den
			   ;Zeichencode der Schachfiguren
MARKE: 	LD	A,(DE)	   ;oberer Teil der Schachfigur
	LD	(IX+0),A   ;auf BS	
	INC	DE	   ;nächsten Zeichencode
	LD	A,(DE)	   ;unterer Teil der Schachfigur
	LD	(IX+20H),A ;auf BS
	INC	DE	   ;nächsten Zeichencode
	INC	IX	   ;Abstand zum nächsten Zei-
	INC	IX	   ;chen einstellen
	INC	IX	   ;
	DJNZ	MARKE-#	   ;nächste Figur, bis alle 6
			   ;abgebildet
	RST	38H	   ;Rücksprung in Monitor
;	
;Tabelle für Zeichencode auf dem BS:
;
TAB:	DB 	0EH,11H,0FH,11H,10H,11H,12H,13H,14H,16H,15H,16H
;
	END


EAllgemeines Format eines Assembler-QuelltextesF

 - Die Marken sind max. 5 Zeichen lang und beginnen mit 
   Buchstaben (z.B. BEGIN und MARKE).
 - Marken/Namensvereinbarungen werden mit Doppelpunkt
   abgeschlossen.
 - SPACE und TAB werden als Trennzeichen gewertet. Sie
   können mehrfach auftreten.
 - Das Namensfeld kann entfallen.
 - Die Quellzeile darf ohne Kommentar max. 85 Zeichen
   lang sein. Der Kommentarteil wird bei der Übersetzung
   ausgeblendet.
 - Die Zeile kann mit NL oder CRLF abgeschlossen sein.
 - Eine leere Zeile wird als Kommentar gewertet, sie sollte
   aber mit einem Semikolon beginnen.
 - Registernamen gelten als vereinbarte Symbole,
   die Befehlsmnemonik nicht (d.h. Registernamen dürfen
   nicht als Marken verwendet werden).
 - Ein Kommentar oder eine Kommentarzeile muß mit einem
   Semikolon beginnen (z.B. ;Vereinbarungsteil)
 - jedes Assemblerprogramm muß mit END abgeschlossen
   werden. Das gilt auch für Einzelteile einer großen
   Quelle.  
       
-1Variablen:-0

Beispiele zu dem folgenden wieder am Ende dieses Abschnittes.

 - Alle 16-bit-Werte können durch einen mehrteiligen
   Ausdruck aus Variablen gebildet werden.
 - Alle 8-bit-Konstanten können mit einem Ausdruck 
   definiert werden. Es werden dabei die niederen 8 Bit
   der Variablen verwendet und die oberen 8 Bit geprüft -
   (ob obere 8-Bit vorhanden, damit kein 8-Bit-Wert!)
 - Ein Ausdruck kann durch + und - verknüpft werden.
   Er kann mit - anfangen.
 - Durch das Zeichen * werden die Teile und-verknüpft,
   durch / oder-verknüpft.
   Die Verknüpfungen werden von links nach rechts
   ohne Priorität abgearbeitet.
 - Als Variable / Konstante sind zugelassen :
	*  4-stellig Hex, mit Ziffer beginnend und mit 'H' 
	   abgeschlossen
	*  4-stellig oktal, mit 'Q' abgeschlossen
	*  4-stellig dezimal (ohne Kennzeichen)
	*  Namen
	*  # ergibt den Wert des PC vor Befehlsausführung
	*  1 / 2 Zeichen Literal in Hochkomma (Zeichenkette),
	   linkes Zeichen ist niederwertig
	*  8-stellig dual, mit 'B' abgeschlossen.
 - Die Werte können vorzeichenbehaftet sein.
 
-1Spezielle Formate:-0

 - Die Befehle	LD  r,H(nn)  
   und		LD  r,L(nn)
   ( r ist Registername, nn ein Ausdruck )
   sind zugelassen.
 - Bei den Anweisungen DA,ORG,EQU,BER darf nur ein
   Wert erscheinen, der durch einen Ausdruck gebildet 
   werden kann.
   z.B: BEGIN:  EQU     0C00H
                ORG     BEGIN

 - Beim Befehl DB sind numerische Werte, Marken und
   Textketten zugelassen. Sie sind durch Komma zu trennen,
   und auch folgendes ist möglich:

		DB	07BH,'Otto',22,0FFEDH,11001001B

-1Zusatzbefehle:-0

 - HEX
   Definition von 2-stelligen Hex-Konstanten, durch
   Komma getrennt. Der Buchstabe H und Führungsnullen
   entfallen.
   z.B.:	HEX	11,55,AA,1B,F3,00,DC

Es sollte aber nur in persönlichen Quellen Verwendung finden,
da es nicht dem SYPS-K1520-Standard entspricht.

Listensteuerung:
 - PRNT   volle Liste
 - PRNO   Fehlerliste
 - PRTH   Hex-Liste

Diese Zusatzbefehle, im Text eingearbeitet, steuern den AS-
SEMBLER in seiner Arbeit. Es lassen sich damit Teile des Textes
auflisten, die nochmals bei der Übersetzung geprüft werden 
sollen, andere Teile, die bereits sicher laufen, nicht.

 - PN und TITL, von anderen Assemblern oft gefordert, kön-
   nen erscheinen, sind aber weder störend, noch erforderlich.

 - alle Befehle mit LX,HX,LY,HY (low-/high-Teil der Doppel-
   register IX / IY)  
   z.B.: LD   B,LY   -  lade Register B mit dem Low-Teil
			des IY-Registers 
 
EFehlerausschriftenF

   M   Speicherfehler
   U   unbekannter Befehl
   K   Konstantenfehler (Wert zu groß)
   F   Formatfehler
   A   Adressenfehler
   N   unbekannter Name
   T   Tabellenüberlauf
   L   Befehlszeile zu lang
   V   Adressenversatz zwischen 1. und 2. DL
   I   Input-Fehler 


EErzeugen eines Maschinenfiles mit dem ASSEMBLERF

Nachdem wir unser Beispielprogramm mit einem Texteditor abge-
tippt und auf eine Adresse oberhalb 3000H gebracht haben,
können wir den Assembler laden und starten.

 Start:  J 100

Der ASSEMBLER meldet sich mit der BS-Ausschrift:

ASSEMBLER Z80  V5.3


DURCHLAUF:  Bei Erststart wird hier "N" (new) ein-
	    gegeben (siehe Durchlaufsteuerung).
	    Danach erscheint die Abfrage:
>A 
 
Sollte dies nicht geschehen, so ist der Druckerruf (Initiali-
sierung) entweder nicht kurzgeschlossen (z.B. wenn nicht vor-
handen) oder der Drucker ist nicht eingeschaltet. 

>A	hier wird nun ein Buchstabe erwartet.
	Im Allgemeinen wird im N-Durchlauf sofort ein R (RUN)
	eingegeben, es kann aber durch Eingabe von Axxxx die
	ORG-Adresse ausgetauscht werden (z.B. zum Probelauf).
	Das >A (assign) wiederholt sich, bis mit "R" (run) der
	Durchlauf gestartet wird. Bei Durchlauf N und 1 fragt 
	der ASSEMBLER nun:

ANF.-ADR.QUELLE:

	hier wird jetzt die Anfangs-Adresse der Quelle abge-
	fragt, wo der Quelltext steht. (Nicht die ORG- oder
	Offsetadresse!). Wir geben also z.B. 3000 ein, wenn
	der Quelltext ab 3000H steht.

Der Cursor läßt sich bei Adresseingaben nicht zurücknehmen,
wenn man sich mal vertippt hat. Er hat keinen Eingabepuffer.
Es hilft nur >RESET<, bzw. man gibt die richtige Zahl ab
erkanntem Fehler einfach weiter ein. Der Assembler wertet die
letzten vier Ziffern. Im A-Modus (assign) ist es einfacher,
dieser Modus bleibt, bis "R" (run) eingegeben wird. Dabei kann
eine Anweisung wiederholt und dadurch berichtigt werden.
Es sind mehrere Durchläufe möglich, auch die gleichen.

Während des "N"-Durchlaufes können bereits Fehler erkannt
werden (z.B.: Markenfehler). Sie werden direkt mit einem * aus-
gegeben und sind vor dem 2. Durchlauf durch nochmaliges Editie-
ren mit dem Texteditor zu beseitigen.
Eine abschliessende Fehlersumme hat jedoch keine Bedeutung.
Sie kennzeichnet lediglich die Zahl der Marken, die bei ihrem
ersten Auftreten noch nicht definiert waren.
Der 1. Durchlauf wird nur angewendet, wenn mehrere Quelltexte
oder Quelltext-Teile übersetzt werden.
Beim N- und 1-Durchlauf wird eine Markentabelle durch den Assem-
bler erstellt, die im 2. Durchlauf zur eigentlichen Übersetzung
benötigt wird. Der N-Durchlauf löscht eine schon vorhandene
Markentabelle, wogegen der 1. Durchlauf gefundene Marken an eine
schon vorhandene Markentabelle anhängt. Wird also nur ein ein-
zelner geschlossener Quelltext übersetzt, entfällt der 1. 
Durchlauf.
Wenn sich der Assembler nach dem N-(1-)Durchlauf mit einer
Fehlerzahl und einer Durchlaufanforderung zurückgemeldet hat,
können wir den 2. Durchlauf starten. Der 2. Durchlauf ist der
eigentliche Übersetzungslauf.
Hier kann auch bei Mehrfachübersetzung die jeweilige Quelltext-
Anfangsadresse mit QXXXX neu festgelegt werden. 
Mit ^C kann der ASSEMBLER an dieser Stelle auch verlassen
werden. Es erscheint wieder das Assign-Promtsymbol >A.
Entsprechend der Durchlaufsteuerung können wir nun verschie-
dene Optionen einstellen. Da wir erst einmal nur eine einfache
Übersetzung möchten, verzichten wir auf ein Druckprotokoll
(kein P eingeben!).
Wir geben ein L ein, um eine volle Übersetzungsliste auf dem
Bildschirm zu erhalten und ein T200, damit es beim Übersetzen
nicht so schnell geht und das Protokoll noch lesbar ist.
Wenn wir später sicherer sind, können wir auch auf L und Txxxx
verzichten, und dafür ein F (nur Fehler werden ausgegeben) ein-
geben, worauf der Assembler mit maximaler Geschwindigkeit
arbeitet.
Nun muß noch der Offset zur Ablage des Maschinenprogramms
eingegeben werden, da wir wünschen, daß das fertige Programm
auf der Adresse 1000H laufen soll (ORG 1000H) und an dieser 
Stelle zur Zeit der Assembler selbst steht. Dieser Offset
berechnet sich aus der Differenz von ORG-Adresse und Ablage-
adresse (siehe Punkt Offset). Nehmen wir an, auf Adresse
6000H ist freier Speicher, so geben wir O5000 ein.
Bevor wir die Übersetzung starten, können wir mit dem
Kommado M die Markentabelle ausgeben lassen, um zu wissen,
bis zu welcher Adresse unser Maschinenprogramm geht (!Ori-
ginaladressen!). 
Mit R (RUN) starten wir den 2. Durchlauf und auf dem Bildschirm
läuft das Protokoll der Übersetzung. Da wir einen Zeitlauf
gewählt haben, können wir den Ablauf mit Space anhalten und
weiterlaufen lassen. Fehler werden entsprechend den Fehler-
meldungen mit einem Buchstaben angezeigt. Am Ende muß bei
einer fehlerfreien Übersetzung die Fehlerzahl 0000 stehen.
Die folgende Durchlaufanforderung quittieren wir mit ^C
und haben damit die Übersetzung beendet. Der
übersetzte Maschinencode steht nun aber auf Adresse 6000H,
auf der er nicht lauffähig ist. Mit dem T-Kommando des Moni-
tors schieben wir das Maschinenprogramm auf die ORG-Adresse
(in diesem Fall auf die 1000H). Die Länge konnten wir vorher
der Markentabelle entnehmen.
Ein Start des Programms mit J 1000 zeigt uns den Erfolg der
Übersetzung.

EDurchlaufsteuerungF

N    Neustart (löscht Symboltabelle)
1    1. DL  (nur bei mehreren Teilen, ansonsten entfällt er)
2    2. DL  (Übersetzung)
^C   Ende der Nutzung

Es können mehrere Programme hintereinander übersetzt
werden. Ein Programm kann dabei auf Marken aus dem an-
deren Programmen zugreifen.

ELaufsteuerung (Anforderung mit 'A >')F

Ausgabeformat:
	S   Symbolliste  
	    (Zeile - Name - Wert) 
	H   Hexliste (ohne Quelliste)
	F   Fehlerliste
	L   volle Liste
	M   Symboltabelle ausgeben (ohne Lauf)
	    (Name - Wert
	     Symboltabelle ist die Markentabelle)
	P   Zuschalten des Druckprotokolls 
	    während des Laufes
	V   Seitenvorschub und Abschalten des 
	    Druckers 
	I   Initialisierung des Druckers 

Zeitsteuerung:
	N   max. Geschwindigkeit, dabei keine
	    Tastaturabfrage.
	Tnn Zuschaltung einer Zeitschleife 
	    (Zeit in ms bis max. 1000)

Bei Zeitsteuerung = T kann die Übersetzung durch SPACE nach 
jeder Zeile unterbrochen werden. Fortgesetzt wird durch 
Betätigen einer beliebigen Taste.

Adressen:
	Ann Zwangsadr. für ORG
	    (Änderung der ORG-Anweisung im Dialog) 

Die Eingabe von ORG-Adressen wird gekellert . Es können
max. 10 Adressen mit dem A-Kommando eingegeben werden. 
Die Adresse 0000 ruft dabei keine Wirkung hervor.

	Onn Offset zu ORG
	    (ORG+Offset ergibt Speicherbereich,
	    auf dem der MC abgelegt wird)

	Qnn Quellanf.-Adr. (nur bei Mehrfach-
	    übersetzungen im 2. DL)

	K   Aufhebung der A-Anweisung

Lauf:
	R   Run

	^C  Ende der Nutzung

EInterne FunktionenF

	Marken mit "*" als erstes Zeichen können mehrfach 
	verwendet werden. Ihr Wert wird auch im 2.DL verändert,
	wodurch sie nur für Rückwärtssprünge zu verwenden oder
	unmittelbar vor ihrer Nutzung zu definieren sind.

EModifikationenF

Wichtig!
  1) Bei fehlendem Druckeranschluß muß auf den Adressen
     447H/448H und 449H/44AH  0D4H/03H eingetragen werden.
     Adresse Druckertreiber in 449H/44AH eintragen.
     Adresse Druckersynchr. in 447H/448H eintragen.
     Im Original ist die Druckerschnittstelle über den
     Sprungverteiler (SV) realisiert.

DRAKK:  0FFE8H  ;übergibt Zeichen in AKKU an log. Druckertreib.
DRINI:  0FFCDH  ;Initialisierung des log. Druckertreiber

Der Druckertreiber muß das Steuerzeichen "TAB" (09H) verarbei-
ten können.

  2) Falls die Länge des Symboltabellenbereiches nicht
     ausreicht (bei längeren Programmen), kann die Lage und 
     Größe der Symboltabelle durch Veränderung der folgenden
     Zellen geändert werden: 

     (2C02H/2C03H) = Anfangsadresse	(0800H)
     (2C04H/2C05H) = Länge		(07D0H)