Verwendete IO-Ports bzw. Hardware:
@3*Ol
*************************************************************
* *
* E A S S E M B L E R 5.3 Scf F *
* *
*************************************************************
ESystembedingungenF
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.
EBeispielprogrammF
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-QuelltextesF
- 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
EFehlerausschriftenF
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 ASSEMBLERF
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.
EDurchlaufsteuerungF
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 FunktionenF
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.
EModifikationenF
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)