***************************************************************** * * * " **** * * **** * * * * * * * * * * * * * * * * **** * * **** * * * * * * * * * * * * * * **** * **** * * * ***************************************************************** ================================================================= = = = Programmsystem zur Entwicklung von Anwenderprogrammen = = Autor H. Blume Karl-Marx-Stadt = = Copyright (C) 1986 = = Ingenieurbuero Bauwesen = = = ================================================================= 0. Inhaltsverzeichnis: ======================= Seite 1. Einleitung 1 1.1. Dateien 1.1 1.2. Dateibezeichnung 1.2 1.2.1. Geraetezuweisung 1.2 1.2.2. Dateiname 1.2 1.2.3. Namenserweiterung 1.2 1.3. Ein- und Ausgaben 1.3 1.4. Systemkomponenten 1.3 2. Editor 2 2.1. Aufruf des Editors 2.1 2.2. Bedienung des Editors 2.1 2.3. Edit-Kommandos 2.2 2.4. Fehler 2.5 3. Assembler Z80/U880 3 3.1. Einleitung 3.1 3.2. Aufruf des Assemblers 3.1 3.3. Optionen 3.2 3.4. Assemblersprache 3.2 3.4.1. Zeichenvorrat 3.2 3.4.2. Format des Quellcodes 3.3 3.4.3. Symbole und Marken 3.4 3.4.4. Numerische Konstante 3.4 3.4.5. Ketten und Kettenkonstante 3.4 3.4.6. Befehlszaehler 3.5 3.4.7. Kommentar 3.5 3.4.8. Sofortbefehle 3.5 3.5. Ausdruecke 3.6 3.5.1. Register 3.6 3.5.2. Variable 3.6 3.5.3. Operatiosnzeichen 3.6 3.5.4. Bildung eines Ausdruckes 3.7 3.5.5. Typ eines Ausdruckes 3.7 3.5.6. Externe Symbole 3.7 3.6. Pseudooperationen 3.7 3.7. Fehlermitteilungen 3.11 3.8. Protokoll des Assemblers 3.11 3.9. Objektcode 3.12 3.10. Symboltabelle 3.12 3.11. Symboldatei 3.12 4. Z8000 Cross Assembler 4 4.1. Aufruf des Assemblers 4.1 4.2. Sprachelemente 4.2 4.3. Pseudooperationen 4.3 4.4. Operandenstrukturen 4.6 4.5. Arithmetik 4.6 4.5.1. Zahlen 4.6 4.5.2. Symbolische Konstante 4.6 4.5.3. Zeichenketten 4.6 4.6. Ausdruecke 4.7 4.7. Adressierungsformen 4.7 4.7.1. Segmentierung 4.7 4.7.2. Adressierungsformen 4.8 4.7.3. -IM- Daten Adressierung 4.8 4.7.4. -R- Register Adressierung 4.8 4.7.5. -IR- Indirekte Register Adressierung 4.9 4.7.6. -DA- direkte Adresse 4.9 4.7.7. -X- 4.10 4.7.8. -RA- 4.10 4.7.9. -BA- 4.11 4.7.10. -BX- 4.11 4.8. Reservierter Wortschatz 4.12 4.9. Fehlercodes 4.12 4.10 Ausgaben 4.13 4.10.1 Listing 4.13 4.10.2. Objektcode 4.14 4.10.3. Symboltabelle 4.14 5. Crossassembler Z8 5 5.1. Einleitung 5.1 5.2. Aufruf des Assemblers 5.1 5.3. Optionen 5.1 5.4. Assemblersprache 5.2 5.4.1. Zeichenvorrat 5.2 5.4.2. Format des Quellcodes 5.3 5.4.3. Symbole und Marken 5.3 5.4.4. Numerische Konstante 5.4 5.4.5. Ketten und Kettenkonstante 5.4 5.4.6. Befehlszaehler 5.4 5.4.7. Kommentar 5.5 5.4.8. Sofortbefehle 5.5 5.5 Ausdruecke 5.5 5.5.1. Register 5.5 5.5.2 Variable 5.6 5.5.3. Operationszeichen 5.6 5.5.4. Bildung eines Ausdruckes 5.7 5.5.5. Typ eines Ausdruckes 5.7 5.5.6. Externe Symbole 5.7 5.6. Pseudooperationen 5.7 5.7 Fehlermitteilungen 5.9 5.8 Protokoll des Assemblers 5.10 5.9. Objektcodes 5.10 5.10 Symboltabelle 5.11 6. Crossassembler 8086 6 6.1. Einleitung ****fehlt noch *** 7. Macros 7 7.1. Definitionen 7.1 7.1.1. Macrokopf 7.1 7.1.2. Macrokoerper 7.2 7.2 Ende des Macrokoerpers 7.2 7.3 Aufruf des Macros 7.3 7.4 Verschachtelung von Macros 7.3 8. Linker 8 8.1. Wirkungsweise 8.1 8.2. Aufruf des Linkers 8.1 8.3. Kommandofile 8.1 8.4. Programmanordnung 8.1 8.5. Dateiangeben 8.2 8.6. Programmangaben 8.2 8.7. Kommentare 8.3 8.8 Listing 8.3 8.9. Fehler 8.3 9. Verschiebelader 9 9.1. Wirkungsweise 9.1 9.2. Aufruf des Verschiebeladers 9.1 9.3. Optionen 9.1 9.4. Fehler 9.2 10. Turbo-Pascal Parser 10 A N H A N G =========== A. Mnemonik Z80 A B. Mnemonik Z8000 B 1. Notation B.1 1.1. Adressierungsarten B.1 1.2. Steuerregister (CTRL) B.1 1.3. Die Statusflags B.2 1.4. Interruptsteuerflags B.2 1.5. Register B.2 1.6. Bedingungscodes B.2 1.7. Abkuerzungen in der Befehlsbeschreibung B.3 2. Mnemonics B.4 2.1. Lade- und Austauschbefehle B.4 2.2. Arithmetische Operationen B.5 2.3. Logische Operationen B.7 2.4. Programmsteuerung B.7 2.5. Bitmanipulation B.8 2.6. Verschiebebefehle B.9 2.7. Blocktransporte, Kettenmanipulationen B.11 2.8. Ein- und Ausgabe B.15 2.9. Steueranweisungen B.18 C Z8 Mnemonik C D 8086 Mnemonik D 1. Einleitung ============== Das Programmsystem SYS beinhaltet eine Reihe von Programmen, die eine schnelle Herstellung von Anwenderprogrammen fuer Rechner mit folgenden CPU: U880 (Z80) U8000 (Z8001, Z8002) U881..883 (Z8) 8086, iAPX286 mit allen CP/M kompatiblen Betriebssystemen gestatten. Die Bedie nung erfolgt von einem Minimalmonitor aus durch entsprechende Aufrufe. Fuer alle Programmteile ist eine einheitliche Bedienung moeglich. 1.1. Dateien ------------ Fuer die Arbeit des gesamten Systems ist die Dateiarbeit wie folgt organisiert: Der Editor erzeugt eine Quelldatei, die maximal m-12 K Byte lang sein kann. m ist der zur Verfuegung stehende RAM-Bereich, der z.B. bei 64k CP/B 52 K betraegt. Diese Quelle befindet sich staendig im Speicher und wird vom Assembler ohne Datentransporte uebernommen. Ist eine Quelle laenger als 30k bei CP/B, so kann mit der Option "L" jede beliebige Quelle assembliert werden. Der Assembler erzeugt aus dieser Quelle eine Objektdatei, die recordweise ausgegeben wird. Der Linker bzw. Lader erzeugt dann eine abarbeitungsfaehige Objektdatei im Intel-Hex-Code bzw. eine COM-Datei. Die Definitionen der verschiedenen Dateien ist: Objektdatei beinhaltet ein ausfuehrbares, absolut adressiertes Maschinenprogramm im Intel-Hex-Code. Der erste Befehl einer Objektdatei ist ein Sprung zum Programmbeginn oder der Programmbeginn selbst. Quelldatei beinhaltet eine beliebige Darstellung im ASCII- Code. Die Quelldatei ist zeilenweise orientiert und enthaelt keine Zeilennummern. Eine Zeile wird mit CR (RETURN, ET1) beendet. Eine Quelldatei ist stets mit 1AH abgeschlossen. Link-Datei hat einen speziellen Aufbau in ASCII-Code. Sie enthaelt bei externen Marken deren Namen und ermoeglicht damit dem Linker die Adressen zuweisung. Listdatei enthaelt alle notwendigen ASCII-Zeichen fuer die Ausgabe eines Protokolls einschl. Seitennumme rierung und Blattwechsel. Markendatei enthaelt alle Marken eines absoluten Programmes zur spaeteren Verwendung im symbolischen Debugger. 1.2. Dateibezeichnung --------------------- Jede Datei hat einen Namen, der durch das Betriebssystem bedingt folgende Konstruktion hat: dev:name.ext Hierin bedeuten dev: Geraetezuweisung name Dateiname ext Namenserweiterung 1.2.1. Geraetezuweisung ----------------------- Fuer die Auswahl eines Diskettenlaufwerkes, auf dem eine bestim mte Datei existieren soll, ist eine zusaetzliche Angabe moeglich durch dev: vor dem Dateinamen. dev: kann mit A: fuer Laufwerk 1, B: fuer Laufwerk 2 usw. angegeben werden. Ist dev: nicht gegeben, wird das aktuelle Laufwerk benutzt. Die Zuweisung eines logischen Geraetes erfolgt ueber die Angabe CON: Console LST: Drucker AUX: Auxilary-Ein-Ausgabe Der Doppelpunkt ist unbedingt anzugeben, er dient dem Rechner zur Kennzeichnung des Laufwerkes bzw. logischen Geraetes. 1.2.2. Dateiname ---------------- Der Dateiname kann aus einem bis 8 Zeichen bestehen, wobei das erste Zeichen ein Buchstabe sein muss. Ausser Alfazeichen ist noch das Zeichen "$" (24 Hex) zulaessig. Zwischen Gross- und Kleinschreibung wird nicht unterschieden. Ein Dateiname kann beliebig gewaehlt werden. 1.2.3. Namenserweiterung ------------------------ Die Namenserweiterung dient der Unterscheidung von Dateien gleichen Namens und ist vom Namen durch einen Punkt zu trennen. Sie darf aus 3 Zeichen bestehen, weitere Zeichen sind ungueltig. Fehlt diese Angabe (einschliesslich dem Punkt!), setzt das System einen Standard: Quelldateien .ASM Linkdateien .HXL Objektdateien .HEX Rueckkehrdateien .BAK Listing Assembler .PRN Listing Linker .PRL Hilfsdateien .$$$ Markendateien .SYS 1.3. Ein- und Ausgaben ---------------------- Bei der Definition eines Dateinamens bzw. eines logischen Gerae tes wird der Ein- oder Ausgabekanal festgelegt. Eingaben erfolgen Zeichen fuer Zeichen, bei Disketten ueber einen 128 Byte langen Puffer. Die Zeichen werden bei ASCII-Code ohne Paritaetsbitpruefung jedoch mit 8 Bits gelesen. Die Zeichen 0aH und 7FH werden ueberlesen, ein Zeichen ^Z (1AH) dient als Ende kennzeichen einer Datei. Ausgaben werden ebenso behandelt, jedoch wird nach jedem RETURN (0DH) ein Line Feet (0AH) hinzugefuegt. Das Zeichen 1AH dient wieder als Endekennzeichen der Datei. Wird bei der Ausgabe ein Fehler festgestellt oder steigt das gewaehlte Geraet aus oder ist nicht vorhanden, wird nach einer Fehlerausschrift: Write Error, Abort (Y/N): der Fehler mit der Eingabe von N uebergangen und die Ausgabe erfolgt auf dem Bildschirm. Bei der Eingabe von Y wird das momen tan laufende Programm abgebrochen und der Monitor eingeschaltet. Alle Dateien ausser .COM Dateien sind in ASCII-Code dargestellt. 1.4. Systemkomponenten ---------------------- Der Minimalmonitor verwaltet die einzelnen Systembestandteile Editor Assembler fuer verschiedene Prozessoren Linker fuer Z80 und Z8 -Programme Verschiebelader fuer U880-Rechner Parser fuer Turbopascal Diese Systemkomponenten koennen mit folgenden Kommandos aufgerufen werden, nach dem auf dem Display das Menue zur Auswahl erscheint. Eine falsche Angabe wird ignoriert, bei der Auswahl eines Assemblers ist darauf zu achten, dass die Angabe ohne Typ auf den U880 schaltet. Edit Auswahl Editor Assembler Auswahl Z80- Assembler Assembler z8 Auswahl Z8- Assembler Assembler z80 Auswahl Z80- Assembler Assembler z86 Auswahl 8086- Assembler Assembler z8000 Auswahl Z8000-Assembler Assembler 86 Auswahl 8086- Assembler Linker Auswahl Linker fuer Z80 und Z8 Shiftloader Auswahl Verschiebelader fuer Z80 Parser Auswahl TurboPascal Parser Der erste Buchstabe des Aufrufes ist signifikant. Alle andern Buchstaben duerfen entfallen. Ausser bei Z80-Assembler sind die Ziffern vollstaendig einzugeben. Fehler bei der Eingabe werden angezeigt, fehlende Ueberlagerungs- programme fuehren ebenfalls zu Fehleranzeigen. Die Eingabe kann dann richtig wiederholt werden. Soll das Programmsystem verlassen werden, ist im Monitor nur RETURN statt eines Kommandos zu geben. Das Betriebssystem wird dann ueber einen Warmstart aktiv. 2. EDITOR =========== 2.1. Aufruf ----------- Vom Monitor oder von jedem Assembler aus kann der Editor mit dem Kommando Edit aufgerufen werden. Der erste Buchstabe ist signifikant. Der Editor meldet sich und durchsucht zuerst den Speicher nach einem Quellfile. Ist ein solches vorhanden, wird gefragt: dateiname found in Buffer, accept? (Y/N): dateiname ist der Name der gefundenen Quelldatei. Bei der Antwort mit Y wird dieses File fuer gueltig erklaert, bei N als Eingabe wird dieses File im Speicher geloescht und nach dem Namen des Quellfiles gefragt: Filename: Hier ist ein Filename der Form dev:name.erw einzugeben. Die Angabe von CON: gestattet die direkte Eingabe einer Quelle von der Tastatur aus. Sonst wird auf dem angegebenen Laufwerk nach diesem Namen gesucht und eine Quelldatei in den Arbeitsspeicher geladen. Existiert eine solche Datei nicht, wird der Inputmodus eingestellt und eine neue Quelldatei unter diesem Namen kann eingegeben werden. Ist eine einzugebende Quelldatei groesser, als der Speicherplatz dies zulaesst, wird die Fehlermitteilung *** MAX *** ausgegeben und die Eingabe abgebrochen. Die Datei kann trotzdem in gekuerzter Form bearbeitet werden. Quellen sollen nie so lang werden, denn die Bearbeitungszeit steigt dann wesentlich an. 2.2. Bedienung des Editors -------------------------- Der Editor meldet sich mit seinem Systemzeichen > Danach befindet er sich im Kommandoeingabe-Modus. Ein Kommando kann eingegeben und durch Parameter naeher spezifiziert werden. Fehlen Parameter, wird fuer die Anzahl 1 und fuer Ketten die Nullkette gesetzt. Ist der letzte Parameter ein Dezimalwert, so bezieht er sich auf die Anzahl, die Nummer der Zeile o.ae. Bei Angabe eines * (Sternchen) ist fuer diesen der Dezimalwert 65535 gesetzt. Fehlt ein Kommando vollstaendig (nur ET1 druecken), so wird das letzte Kommando vollstaendig mit allen Parametern wiederholt. Dies gilt nicht fuer Macro-Kommandos. Alle Antworten auf eine Kommandoeingabe erfolgen ueber den Bildschirm. Die Ausgabe einer Quellzeile erfolgt mit einer vorangestellten 5 stelligen Zeilennummer, die dynamisch verwaltet wird. 2.3. EDIT-Kommandos ------------------- Ein Kommando ist durch seinen ersten Buchstaben gekennzeichnet. Weitere Buchstaben sind unwirksam. Das erste Leerzeichen, Stern oder die erste Ziffer oder ein Escape zeigen den Beginn eines Parameters an. In der folgenden Beschreibung ist das Escape aus drucktechnischen Gruenden durch ^[ dargestellt, n ist eine Dezi malzahl. A n ASSEMBLER Der Editor wird verlassen und der Assembler aufgerufen. n ist in diesem Fall die genauere Auswahl des Assemblers. Fehlt n, wird der Z80-Assembler aufgerufen. Die Quelldatei bleibt im Speicher erhalten. n = 8 Z8- Assembler n = 80 Z80- Assembler n = 8000 Z8000-Assembler n = 86 8086- Assembler B BOTTOM Der Zeilenzeiger wird auf die letzte Zeile der Quelldatei gesetzt und diese Zeile auf der Konsole ausgegeben. C^[kette1^[kette2^[n CHANGE Ab der aktuellen Zeile wird auf n Zeilen, die die Kette kette1 enthalten, diese durch die Kette kette2 ersetzt. Entfaellt n, ist das Kommando nur fuer die erste Zeile wirksam, die die Kette kette1 enthaelt. Fehlt kette2, so wird kette1 geloescht. Ist kette1 in einer Zeile nicht enthalten, wird diese Zeile nicht veraendert. Steht * fuer n, wird das Auswechseln fuer die gesamte restliche Datei vorgenommen. Dn DELETE D^[kette Ab der aktuellen Zeile werden n Zeilen geloescht bzw. ab der Zeile bis zu der Zeile, die die angegebene Kette kette enthaelt, werden alle Zeilen geloescht. Diese letzte Zeile mit der ge suchten Kette wird nicht geloescht. Wird dieses Kommando vor der ersten Zeile (vor dem Dateianfang) gegeben, ist es wirkungslos. E dev:name.erw EXIT Die generierte Quelldatei wird unter dem angegebenen Namen auf das angegebene Laufwerk ausgegeben. Fehlt .erw, ist die Erweiterung standardmaessig .ASM. Eine evtl. vorhandene Datei dev:name.$$$ wird vorher geloescht, falls dies gewuenscht wird. Die neue Quelldatei wird mit der Erweiterung .$$$ erzeugt. Es folgt eine Kontrolle auf richtige Uebertragung und dann die Umbenennung von .ASM in .BAK fuer die alte Quelldatei und von .$$$ in .ASM fuer die neue Quelldatei. Wird kein Dateiname angegeben, so ist der beim Aufruf des Editors angegebene Name gueltig. Nach diesem Kommando wird der Editor verlassen und der Monitor aktiv. F^[kette FIND In der Datei wird ab der naechsten Zeile nach der aktuellen Zeile nach einer Zeile gesucht, die die angegebene Kette enthaelt und diese Zeile angezeigt. Die Datei wird bis zum Ende durchsucht, falls die Kette nicht gefunden wird. Gn GO G^[kette Es wird der Zeilenzeiger auf die n. Zeile bzw. auf die Zeile mit der angegebenen Kette gesetzt und diese Zeile angezeigt. Die Suche erfolgt vom Dateianfang an. I Input-Modus. Hier kann eine Datei aufgebaut werden. Nach der J@usgabe der aktuellen Zeilennummer kann eine satzweise Eingabe von Quellzeilen erfolgen. Es werden alle ASCII-Zeichen akzeptiert. Zweimalige Eingabe von ET1 (RETURN) beendet den Inputmodus. Alle eingegebenen Zeichen werden nach der aktuellen Zeile eingefuegt, die gerade einzugebende Zeile wird dann die aktuelle Zeile. Zeilen nach dieser Einfuegung bleiben erhalten. I kette INSERT Der Abschluss des I-Kommandos mit einem Leerschritt gestattet die Einfuegung einer Zeile nach der aktuellen Zeile. Alle Zeichen nach diesem 1. Leerschritt werden bis zum abschliessenden ET1 eingefuegt. K KURSOR Die aktuelle Zeile wird angezeigt und der Kursor auf das erste Zeichen dieser Zeile gesetzt. Nun kann mit den Kursorsteuertasten der Kursor beliebig bewegt werden. An beliebiger Stelle koennen dann Zeichen eingefuegt (einfach eintippen) oder geloescht werden. Mit der Angabe von ^D wird das Zeichen, unter dem der Kursor steht, geloescht. ^Q beendet dieses Kommando, ohne die angezeigte Zeile im Speicher zu veraendern. Ein RETURN speichert die veraenderte Zeile. Ebenso wirken die Kursortasten -Kursor hoch, -Kursor runter. Ein TAB in der Zeile wird als Leerzeichen dargestellt. Ln LADE Ab der aktuellen Zeile werden aus einer externen Datei n Zeilen in die Quelldatei eingefuegt. Alle L-Kommandos laden stets ab der ersten Zeile der externen Datei. Nach dem Dateinamen wird gefragt. Er muss eingegeben werden. Die Namenserweiterung ist standardmaessig .$$$. Alle logische Eingabegeraete sind als dev: zulaessig. M&>kom1&>kom2&>...&>komi MACRO Die Kommandos kom1 bis komi werden gekettet und spaeter mit dem Kommando Xecute nacheinander ausgefuehrt. Es sind alle Kommandos ausser dem MACRO-Kommando selbst zulaessig. N^[kette NEXT Nn Der Zeilenzeiger wird um n Zeilen weiter in Richtung Dateiende bzw. bis zur Kette verschoben und diese Zeile angezeigt. O^[kette OUTPUT On Ausgabe von n Zeilen bzw. bis zu der Zeile mit der angegebenen Kette ab der aktuellen Zeile auf eine externe Datei. Nach dem Namen dieser Datei wird gefragt. Die Namenserweiterung ist standardmaessig .$$$. Es ist jedes logische Geraet angebbar. L- und O-Kommandos dienen der kurzfristigen Auslagerung einzelner Quellzeilen. Sie eroeffnen eine Zwischendatei und nach dem Daten transport wird diese Datei wieder geschlossen. Bei Anwendung des O-Kommandos wird eine Datei unter diesem Namen vorher geloescht. Pn PRINT P^[kette Ab der aktuellen Zeile werden n Zeilen auf der Konsole ausgege ben. Bei der Angabe einer Kette sind alle Zeilen bis zu der Zeile, die diese Kette enthaelt, auf der Konsole sichtbar. Das Bild wird zeilenweise gerollt. Unterbrechungen der Ausgabe koen nen durch Druecken von ^S unterbrochen werden (Halt) und nach erneutem Betaetigen von ^S weiter ausgegeben werden. Ein ^C nach einem Halt bricht das gesamte Programm SYS ab, das Betriebssystem ist aktiv! Q QUIT Die Datei im Speicher wird nicht mehr veraendert und auch keine Datei ausgegeben. Das Editieren ist beendet und der Monitor wieder aktiv. Fuer eine Speicheruebersicht wird die Anzahl der editierten Bytes angegeben. R kette REPLACE Die aktuelle Zeile wird durch die angegebene Kette ersetzt. Die Kette muss vom Kommando durch genau ein Leerzeichen getrennt sein. Alle ASCII-Zeichen wie bei Input sind bis zum abschliessen den RETURN gueltig. T TOP Der Zeilenzeiger wird vor den Dateianfang gesetzt Un UP Der Zeilenzeiger wird um n Zeilen nach oben in Richtung Dateian fang verschoben und diese Zeile angezeigt. X XECUTE Ausfuehrung der mit dem MACRO-Kommando eingegebenen Kommandos in der Reihenfolge, wie dort angegeben. 2.4. Fehler ----------- Alle Fehler, die waehrend der Editierung auftreten, sind auf der Konsole im Klartext dargestellt. Dabei bedeuten: *** ???*** es wurde ein falsches Kommando oder eine falscher Parameter gegeben ***MAX*** Das Speicherende ist erreicht, weitere Eingaben sind fehlerhaft. 3. ASSEMBLER Z80 ================== 3.1. Einleitung --------------- Der Assembler gestattet es, die Mnemoniks von robotron oder ZILOG zu verwenden. Bei genuegend kleinen Quellen bleibt die Quelldatei im Speicher und es sind sehr kurze Bearbeitungszeiten zur Fehlerkorrektur moeglich. Zum vollstaendigen Ablauf der Assemblierung gehoeren 2 Laeufe. Im ersten Pass wird ein Adressbuch angelegt und im 2. Pass der Objektcode erzeugt, ein Listing ausgegeben und weitere Informationen mitgeteilt. Die Beendigung des 1. Passes wird durch eine Ausschrift mitgeteilt. Die Uebersetzung wird bei Auftreten von Fehlern nicht abgebrochen, sondern weiter versucht und alle Fehler werden auf der Konsole angezeigt. 3.2. Aufruf des Assemblers -------------------------- Der Assembler wird vom Monitor oder vom Editor mit dem Kommando Assembler z80 aufgerufen. Der erste Buchstabe ist fuer den Aufruf signifikant, weitere Angaben brauchen nicht gemacht werden. Der Assembler meldet sich und erwartet die Eingabe von Optionen. Ist im Speicher bereits eine Quelldatei vorhanden, wird sie verwendet. Andernfalls wird nach dem Namen der Quelldatei gefragt und diese geladen, wenn nicht die Option L verwendet wird. 3.3. Optionen ------------- Optionen sind durch Kommata getrennte Angaben zur naeheren Bestimmung des Uebersetzungslaufes. Abschluss der Kommandozeile ist ET1. Die Uebersetzung wird nach ET1 sofort begonnen. Wird kein Kommando eingegeben, setzt das System einen Standard: -absolut assemblieren -keine Objekt-, Link- oder MAP-Datei erzeugen -keine Listdatei erzeugen -Fehler ueber Konsole ausgeben -Die Quelle hat im Speicher vollstaendig Platz Nach einem Uebersetzungslauf erscheint ebenfalls die Aufforderung nach der Eingabe von Optionen und es koennen neue Optionen einge geben werden. Bei einer Wiederholung des Uebersetzungslaufes wird der erste Pass nicht nochmal abgearbeitet. Dadurch kann ein Wechsel von relativer zu absoluter Uebersetzung und umgekehrt nicht erfolgen. Die Optionen koennen sein: E Editor. Der Editor wird geladen. Falls die Quelle im Speicher steht, wird sie beibehalten. H Header, es wird die Kopfzeile mit dieser Angabe ergaenzt. Maximal 68 Zeichen moeglich. Diese Angabe wird jedoch durch die Assembleranweisungen *H oder TITLE ueberschrieben. L Long, die Quelldatei wird von Diskette gelesen und darf deshalb beliebig lang sein. Eine Quelldatei im Speicher muss vorher gerettet werden, deshalb wird der Editor nachgeladen und die Ausgabe vor der Assemblierung ver langt. M Macros sind erlaubt. Je Angabe von M (auch mehrfach moeglich) werden im RAM 400H Bytes (1k Byte) fuer die Macros reserviert. Macros sollten ohne Kommentar geschrieben werden, da dieser ebenfalls gespeichert wird. O Ausgabe des Objektcodes. Spaeter wird nach dem File namen fuer den Objektcode gefragt. P Ausgabe des Listings Q Rueckkehr in den Monitor R relative Uebersetzung S Ausgabe der Symboltabelle Y Ausgabe der Markendatei. Die Uebersetzung erfolgt absolut, falls nicht die Option R gege ben wurde. Die Option Y muss nach! einem vorherigen 1. Pass gegeben werden, sonst ist sie wirkungslos. Bei den Optionen O, S, P und Y wird nach einem Dateinamen gefragt, ebenso, wenn die Quelle noch nicht im Speicher steht. Die Fragen sind mit der Namensangabe dev:name.erw zu beantworten. Siehe auch Angaben im Kapitel 1. Bei den Optionen S und Y wird nach der Abarbeitung des Passes 2 der Pass 2 nicht nochmals wiederholt, sondern sofort die gewuenschte Liste erzeugt. 3.4. Assemblersprache --------------------- Die vom Assembler akzeptierten Mnemoniks sind im Anhang angege ben. Die Uebersetzung erfolgt fuer beide Sprachen. 3.4.1. Zeichenvorrat -------------------- Buchstaben sind die Zeichen des Alphabets: A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z Ausser in Zeichenketten wird nicht zwischen Gross- und Kleinschreibung unterschieden. Die Ausgabe des Listings erfolgt ausser in Zeichenketten nur in Grossbuchstaben. Ziffern sind die Dezimalziffern: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 und bei hexadezimaler Schreibweise die Buchstaben A, B, C, D, E und F. Trennzeichen dienen der Trennung von Bezeichnungen und Ausdruek- ken und bestehen aus den Zeichen SP Space, Leerschritt HT Horizontaltabulator sie koennen in beliebiger Menge stehen. Endezeichen dienen der Beendigung des signifikanten Teils einer Quellzeile: ; Semikolon, es kann ein Kommentar folgen CR ET1, RETURN, Ende einer Zeile Sonderzeichen werden in Ausdruecken verwendet: &> logisches Und ( Klammer auf ) Klammer zu, paarweise verwenden! * Multiplikationszeichen / Divisionszeichen # Doppelkreuz und $ Dollar fuer den aktuellen Befehlszaehlerstand . Punkt zur Kennzeichnung logischer Operationen + Pluszeichen - Minuszeichen , Komma, Trennzeichen zwischen Registern, Listentrenn zeichen : Doppelpunkt, wahlweiser Markenbegrenzer Begrenzer, werden je nach Notwendigkeit benutzt: : , . ) SP HT ; Alle anderen druckbaren Zeichen aus dem ASCII-Vorrat koennen in Zeichenketten Verwendung finden. VT (Vertikaltabulation) und FF (Blattwechsel) sind verboten. 3.4.2. Format des Quellcodes ---------------------------- Jede Anweisung wird auf einer Zeile geschrieben. Ist das erste Zeichen einer Zeile ein Endezeichen, wird diese Zeile nicht assembliert. Ist das erste Zeichen ein *, so ist ein Sofortkommando auszufuehren. Alle anderen Anweisungen erfolgen nach dem Schema: MARKE[:] OPCODE AUSDRUCK Wird keine Marke angegeben, muss die Zeile mit mindestens einem Trennzeichen beginnen. Zwischen MARKE und OPCODE muss entweder mindestens ein Trennzeichen oder der Doppelpunkt stehen, falls kein Endezeichen die Zeile abschliesst. Eine Marke muss nicht ab der ersten Position beginnen, wenn sie mit einem Doppelpunkt abgeschlossen wird. 3.4.3. Symbole und Marken ------------------------- Eine Marke dient der Markierung einzelner Anweisungen, wobei ihr Wert der Befehlszaehlerstand des ersten Bytes dieser Anweisung ist. Marken koennen maximal aus 6 Alfazeichen bestehen, das erste Zeichen muss ein Buchstabe sein. Innerhalb einer Marke duerfen einige Sonderzeichen stehen: $ ? = _ (Unterstreichung) Die Marke wird durch ein Trennzeichen oder den Doppelpunkt oder ein Endezeichen abgeschlossen. Mehr als 6 Zeichen werden ueberlesen. Ein Symbol ist eine Marke, deren aktueller Wert in einem Ausdruck verwendet wird. Hier sind die Registernamen nicht gestattet! 3.4.4. Numerische Konstante --------------------------- Numerische Konstante sind Zahlen, die in Ausdruecken Verwendung finden. Es gibt verschiedene Darstellungen: 0101101B ---binaere Darstellung Verwendung finden die Ziffern 0 und 1. Die Binaerzahl muss mit dem Buchstaben B abgeschlossen sein. 7213O oder 72130Q ---oktale Darstellung Verwendung finden die Ziffern 0 bis 7. Die Oktalzahl muss mit dem Buchstaben O oder Q abgeschlossen sein. 1250 oder 1250D ---dezimale Darstellung Verwendung finden die Ziffern 0 bis 9. Die Dezimalzahl kann mit dem Buchstaben D abgeschlossen werden. 0FF5CH ---hexadezimale Darstellung Verwendung finden die Ziffern 0 bis 9 und die Buchstaben A bis F fuer die Pseudodezimalen 10 - 15. Eine Hexadezimal zahl muss mit dem Buchstaben H abgeschlossen sein und mit einer Ziffer beginnen (Null evtl. voranstellen). Der Zahlenbereich ist vorzeichenloses Byte 0 bis 0FFH Byte mit Vorzeichen -7FH bis +7FH Wort 0 bis 0FFFFH 3.4.5. Ketten und Kettenkonstante --------------------------------- Ketten sind eine Folge von beliebigen druckbaren ASCII-Zeichen. Die Zeichen werden in Hochkomma eingeschlossen, das Hochkomma selbst muss doppelt angegeben werden, um es einmal darzustellen. In Ketten sind CR, LF, VT und FF nicht erlaubt. Die Abspeicherung erfolgt im Programm von links nach rechts, jedes Zeichen belegt ein Byte. Kettenkonstante sind Ketten mit einem oder zwei Zeichen, deren ASCII-Wert interpretiert wird und als Zahl in einem Ausdruck Verwendung findet. 3.4.6. Befehlszaehler --------------------- In einem Ausdruck kann der Befehlszaehlerstand als ein 16-Bit- Wert Verwendung finden. Zur Kennzeichnung werden die Zeichen $ oder # verwendet. Ein solches Zeichen in einem Ausdruck repraesentiert damit die 16 Bit des Befehlszaehlers zu diesem Zeitpunkt. Der Typ dieses Wertes ist relativ. 3.4.7. Kommentar ---------------- In jeder Zeile kann ein Kommentar angegeben werden. Er ist gekennzeichnet durch ein beginnendes Semikolon und endet mit einem ET1. Kommentare sind bei der Uebersetzung wirkungslos. 3.4.8. Sofortbefehle -------------------- Folgende Sofortkommandos sind implementiert, die bei einem Auftreten im Programm sofort ausgefuehrt werden: *Eject Blattwechsel im Listing *Head txt Erzeugen eines Kopftextes auf Zeile 1 des Listings. Es werden bis 64 Zeichen akzeptiert. Ausserdem wird ein Blattwechsel ausgefuehrt. *LISTOFF Die Listing-Ausgabe wird unterdrueckt *LISTON Die Listing-Ausgabe wird weitergefuehrt. Beide Kommandos sind auszuschreiben! *INCLUDE name Die mit name bezeichnete Datei wird an dieser Stelle in den Quellcode zusaetzlich in voller Laenge eingefuegt und mit uebersetzt. name ist ein nach den oben angegebenen Regeln konstruierter Dateiname (mit d:name.erw, wobei die Angabe von name unbedingt erfor derlich ist). *PRINTX text Der angegebene Text wird auf dem Bildschirm angezeigt. Die Ausgabe erfolgt sowohl bei Pass1 als auch bei Pass2. Sofortkommandos beginnen mit einem * und sind mit dem ersten Buchstaben signifikant ausser LISTON und LISTOFF 3.5. Ausdruecke --------------- Ausdruecke sind beliebige, mit arithmetischen oder logischen Operationen verknuepfte Konstante, Symbole oder Variable sowie Registernamen. 3.5.1. Register --------------- Als Operanden koennen die Register der CPU 880 sowohl als Einzel- wie auch als Doppelregister verwendet werden. Einzelregister sind: A, B, C, D, E, H, L, I, R und die Teile der Indexregister LX, LY fuer den LOW-Teil und HX, HY fuer den HIGH-Teil Doppelregister sind: AF, BC, DE, HL, SP, IX, IY und PC (dargestellt durch die Zeichen # oder $) 3.5.2. Variable --------------- Variable sind Werte, die sich auf RAM-Plaetzen befinden und 8 oder 16 Bit lang sein koennen. Bei 16 Bit langen Variablen befinden sich auf dem addressierten Speicherplatz die unteren 8 Bit und auf dem folgenden Speicherplatz die oberen 8 Bit. Variable werden in einem Ausdruck durch ein Symbol beschrieben. 3.5.3. Operationszeichen ------------------------ Folgende Operationszeichen koennen verwendet werden: Rang Zeichen Wirkung 1 .LOW. nur die niederen 8 Bit eines Wortes 1 .HGH. nur die oberen 8 Bit eines Wortes, als untere 8 Bit interpretiert 1 .SHL. Verschiebung des links vom Operationszeichen stehenden Ausdruckes um soviel Stellen nach links, wie der rechts stehende Ausdruck angibt 1 .SHR. wie vor, jedoch Verschiebung nach rechts 2 * Multiplikation 16 Bit ohne Beruecksichtigung des Ueberlaufes 2 / Division 16 Bit ganzzahlig ohne Runden 2 .MOD. Rest einer ganzzahligen Division 3 + Addition 16 Bit ohne Ueberlauf 3 - Subtraktion 16 Bit ohne Ueberlauf 4 .NOT. Negation 16 Bit des folgenden Ausdruckes 5 .AND. logische Konjunktion 16 Bit 6 .XOR. logische Inhibition 16 Bit 7 .OR. logische Disjunktion 16 Bit Die Zeichen +, -, .NOT., .LOW. und .HGH. koennen allein vor einem Ausdruck stehen, alle anderen Operationszeichen muessen zwischen zwei Operanden stehen. 3.5.4. Bildung eines Ausdruckes ------------------------------- Ein Ausdruck wird durch die Verknuepfung von Zahlen, Variablen, numerischen- und Kettenkonstanten gebildet. Die Verknuepfung mittels Operationszeichen wird innerhalb des gleichen Ranges von links nach rechts ausgefuehrt, sonst die Operationen mit dem hoechsten Rang zuerst. Runde Klammern, die stets paarweise stehen muessen, durchbrechen diese Reihenfolge. Ein geklammerter Ausdruck wird wie ein Operand verwendet. Die Klammertiefe ist nicht unbegrenzt, ein entsprechender Fehler wird angezeigt. Ein Ausdruck besitzt nach seiner Bildung einen 16 Bit langen Wert, die vorderen Bits evtl. mit Null aufgefuellt. Negative Werte werden im Zweierkomplement dargestellt. 3.5.5. Type eines Ausdruckes ---------------------------- Ein Ausdruck kann sowohl absolut als auch relativ sein. Dies haengt davon ab, ob in ihm programmrelative Werte vorhanden sind. Der Typ des Ausdruckes wird im Listing mit dargestellt durch die Zeichen: R relativ A absolut E external Bei der Berechnung des Ausdruckes wird eine Typueberwachung durchgefuehrt und Verknuepfungen zwischen nicht zulaessigen Typen verhindert. Die Differenz zweier relativer Werte ergibt dabei einen absoluten Wert! 3.5.6. Externe Symbole ---------------------- Sind bestimmte Symbole in einem Programm noch nicht bekannt und koennen diese nur von anderen Programmen bestimmt werden, so sind diese Symbole mit der Pseudoanweisung EXTERNAL zu deklarieren. 3.6. Pseudooperationen ---------------------- Zur Steuerung des Uebersetzungslaufes werden bestimmte Operatio nen benoetigt, die nicht zum Befehlssatz der CPU gehoeren. Diese Pseudooperationen werden nachfolgend erlaeutert: DW ausdruck DEFW ausdruck DA ausdruck Das den Wert des Ausdruckes repraesentierende Wort wird gespei chert. DB ausdruck,ausdruck,... DEFB ausdruck,ausdruck,... Die Folge von durch Kommata getrennten Ausdruecken wird als Byte erwartet und abgespeichert. Die Anzahl der Ausdruecke ist auf Zeilenlaenge beschraenkt (max 64). DB 'text' DEFM 'text' Diese Anweisung erzeugt beliebigen Text im ASCII-Code. Der Text muss als Zeichenkette angegeben werden, deren Laenge 64 Zeichen nicht uebersteigen darf. DEFT 'text' Diese Anweisung wirkt die DEFM, jedoch wird die Laenge des Textes als erstes Byte ausgegeben. BER Ausdruck DEFS Ausdruck Diese Anweisung reserviert innerhalb des Programmes Speicher plaetze, deren Anzahl durch den Wert des Ausdruckes bestimmt wird. Dieser Wert muss bereits im ersten Pass vorher bekannt sein. Im Programm haben diese Speicherplaetze einen undefinierten Inhalt. name DEF ausdruck name DEFL ausdruck Der Wert des Ausdruckes wird einmalig! dem Symbol name zugewiesen. Fehlt name, entsteht ein Fehler wie auch bei einer nochmaligen Verwendung des Namen als Marke an einer anderen Stelle. PN text NAME text Es werden maximal 6 Zeichen als Programmname akzeptiert. EJEC EJECT Innerhalb des Listings wird ein Blattwechsel ausgefuehrt END Ausdruck Mit dieser Anweisung wird das Programm beendet, weitere Zeilen werden nicht mehr gelesen. Der Wert des Ausdruckes wird bei absoluter Assemblierung im Endeblock des Intel-Hex-Codes als Einsprungadresse angegeben. Der Ausdruck muss deshalb auf eine Marke fuer den Programmstart hinweisen. Fehlt der Ausdruck, ist dieser Wert Null. IF Ausdruck COND Ausdruck Wenn der Wert des Ausdruckes Null ist, wird die Assemblierung bis zum Auftreten der Anweisung ENIF unterbrochen (die entsprechenden Zeilen werden ueberlesen). ENIF ENDIF ENDC Ende der bedingten Assemblierung. IF1 Die Bedingung ist wahr, wenn der Pass 1 abgearbeitet wird IF2 Die Bedingung ist wahr, wenn der Pass 2 abgearbeitet wird ELSE Die mit IF, IF1 oder IF2 gestellte Bedingung wird umgekehrt Alle IF-Anweisungen duerfen bis 16-fach geschachtelt werden. LISTOFF Das Listing wird ab hier unterdrueckt NLIST ausdruck Ist der Wert des Ausdruckes Null oder fehlt er, wird das Listing ab diesem Zeitpunkt unterdrueckt. LIST ausdruck LISTON ausdruck Ist der Wert des Ausdruckes Null oder fehlt er, so wird das Listing ab diesem Zeitpunkt nach einem Ausschalten des Listings weitergefuehrt, sonst ist die Anweisung wirkungslos. PRINTX text Der angegebene Text wird auf dem Bildschirm angezeigt. Zur Unterscheidung zwischen Pass1 und Pass2 koennen die bedingten Anweisungen IF1 und IF2 verwendet werden. ORG Ausdruck Dem Befehlszaehler wird der Wert des Ausdruckes zugewiesen. Dieser Wert muss bereits im ersten Pass vorher bekannt sein. Bei relativer Assemblierung sollte diese Anweisung nicht verwendet werden. EXTE Liste EXTERNAL Liste Liste ist eine Aufzaehlung von Markennamen, durch Komma getrennt. Diese Marken werden in die Markenliste aufgenommen und mit dem Wert Null belegt. Sie koennen erst beim Linken mit einem Wert belegt werden. Ihr Typ ist E (External). Wird eine Marke angegeben, die bereits im Programm enthalten ist, wird Fehler angezeigt und diese Marke nicht nochmals aufgenommen. GLOB Liste GLOBAL Liste Liste ist eine Aufzaehlung von Markennamen, durch Komma getrennt. Diese Anweisung zeigt anderen Programmen die Adressen von Marken, die in diesem Programm definiert sind. Die Marken werden gesam melt und stehen dann dem Linker zur Verfuegung. Ist eine Marke angegeben, die nicht im Programm enthalten ist, wird Fehler angezeigt. name EQU ausdruck Der Wert des Ausdrucks ausdruck wird der Marke name zugewiesen und bleibt bis zu einer evtl. neuen Wertzuweisung erhalten. TITL text TITLE text Diese Pseudoanweisung wirkt wie das Sofortkommando *H text (siehe dort). name MACR dummylist Vereinbarung eines Makrokoerpers mit Parametern (dummy) unter dem Namen name. Die Parameter duerfen entfallen, mehrere Parameter werden durch Komma getrennt. ENDM Abschluss einer Makrovereinbarung Makros siehe Kapitel 7 mit genauer Beschreibung 3.7. Fehlermitteilungen ----------------------- Entsteht waehrend der Assemblierung ein Fehler auf einem externen Geraet, wird die Assemblierung abgebrochen oder die Ausgabe auf Display versucht. Alle anderen Fehler werden auf der Konsole angezeigt mit der Ausgabe der fehlerhaften Zeile und einem vorangestellten Buchsteben, der auf den Fehler hinweist. Buchst. Art des Fehlers A Ueberlauf des Makropuffers *Abort B Ungueltiger Operator C nicht verschiebbarer Ausdruck D falsches Zeichen in einer Zahl (Digit) E externes Symbol in einem Ausdruck F Symboltabelle voll *Abort G INCLUDE ist geschachtelt H unzulaessiger Typ des Operanden I Unzulaessiger Operand J Unzulaessiger Begrenzer K Sprungweite zu gross bei relativen Spruengen L Unzulaessige Markenkonstruktion M mehrfach definiertes Symbol N Marke erforderlich bei DEFL, EQU O ungueltiger Operationscode (Mnemonik) Q Hochkommas oder IF-ENDIF nicht geradzahlig R Zahlenbereichsfehler S Syntaxfehler allgemein T Eingabezeile zu lang, abgeschnitten U Undefiniertes Symbol V Ausdruck ausserhalb des darstellbaren Bereiches W MACRO vorhanden und nicht erlaubt *Abort X Symboltabellen Fehler *Abort Y Undefinierte Bedingung Die mit *Abort gekennzeichneten Fehler fuehren zum Abbruch der Uebersetzung und zur Rueckkehr in den Monitor. 3.8. Protokoll des Assemblers ----------------------------- Das Listing ist ein Protokoll des Assemblierungsvorganges. Es wird formatiert ausgegeben in der folgenden Form: Erste Zeile mit Modulnamen und Anwendertext aus *H oder TITLE Kopfzeile mit einer Ueberschriftenzeile und in der 3. Zeile der Dateiname und das Datum, falls es vorher im Betriebssystem vereinbart wurde. Nach einer Leerzeile beginnt der Assemblertext. Es wird je Zersetzung und zur Rueckkehr in den Monitor. 3.8. Protokoll des Assemblers ----------------------------- Das Listing ist ein Protokoll des Assemblierungsvorganges. Es wird formatiert ausgegeben in der folgenden Form: Erste Zeile mit Modulnamen und Anwendertext aus *H oder TITLE Kopfzeile mit einer Ueberschriftenzeile und in der 3. Zeile der Dateiname und das Datum, falls es vorher im Betriebssystem vereinbart wurde. Nach einer Leerzeile beginnt der Assemblertext. Es wird je Zeile der aktuelle Befehlszaehlerstand und der uebersetzte Objektcode ausgegeben. Danach erfolgt die Darstellung des Quelltextes in Grossbuchstaben. Zur Darstellung des Types eines Ausdruckes wird noch ein Buchstabe vor dem Opcode ausgegeben. Fehler werden in der ersten Spalte durch den Fehlerbuchstaben angezeigt. Je Seite werden 72 Druckzeilen ausgegeben, Blatt wechsel erfolgt automatisch einschl. der Seitenzaehlung. 3.9. Objektkode --------------- Der Objektkode wird im Intel-Hex-Code ausgegeben, der bei relativer Assemblierung noch modifiziert wird. Um Kompatibilitaet zu erreichen, werden alle Sonderausgaben mit $ statt : markiert. Am Anfang wird der Modulname mit KZ 5 ausgegeben. Danach folgen die globalen Marken mit KZ 2. Der folgende Programmtext wird normal ausgegeben. Je nach Erfordernis wird bei relativer Assemblierung noch eine Liste der relativen Adressen und bei Auftreten einer externen Marke deren Name und die Adresse ihres Auftretens mit KZ 4 bzw. 3 ausgegeben. Der Intel-Endeblock (KZ 1) beschliesst die Ausgabe. Bei relativer und absoluter Assemblierung sind die Daten ohne weiteres mit DDT oder LOAD lesbar, die Sonderausgaben werden dort ueberlesen. Deshalb brauchen absolut assemblierte Programme nicht gelinkt zu werden, sie koennen sofort mit DDT oder LOAD geladen werden. 3.10. Symboltabelle ------------------- Die Symboltabelle wird auf dem mit LIST gewaehlten Geraet ausgegeben. Die Ausgabe erfolgt 4 spaltig mit Name der Marke, deren Typ und deren Adresse. 3.11 Symboldatei ---------------- Fuer die Testung des Programmes mit dem symbolischen Debugger SDT kann eine Liste aller Marken mit deren Adresse ausgegeben werden. Die Ausgabe erfolgt nach der Abarbeitung des 2. Passes bei einer anschliessenden Eingabe der Option Y. Der Dateiname wird abge- fragt. Es muss fuer SDT der gleiche Name wie das Objektprogramm gewaehlt werden.