★ APPLICATIONS ★ PROGRAMMATION ★ MACRO: ein Utility für Z80 Programmierer ★ |
Macro (CPC Amstrad International) | Applications Programmation |
Das Programm MACRO ist eine leistungsstarke Hilfe für die Entwicklung von Software in Maschinensprache. Durch den Einsatz eines Macro-Assemblers wird die Programmierung nicht nur schneller, sondern der Quellcode wird auch übersichtlicher. Wiederkehrende Funktionen werden nur einmal in einer Bibliotheks-Datei definiert und im Assembler-Programm mit Namen angegeben. Der Macro-Assembler ersetzt diesen Namen durch die entsprechenden Befehle. Macros (so nennt man die mit Namen definierten Programmteile) wie PRINT, OPEN, CLOSE, GETKEY etc. sind in fast jeder Macro-Bibliothek enthalten. Dadurch wird das Programmieren recht komfortabel und Fehler werden wesentlich seltener. Das Programm ist in der vorliegenden Fassung so eingestellt, daß das Assembler-Format des Digital Research Assemblers ASM.COM erwartet wird. Dieser fNTEL-8080 Assembler ist auf der CP/M- 2.2 System-Disc als Dienstprogramm vorhanden. MACRO ist aber leicht an jedes andere Format anzupassen, da alle wichtigen Zeichen als Parameter angegeben werden und daher nur an einer Stelle geändert werden müssen (siehe unter Anpassungen). Bedienung Der Assembler-Quellcode ist auf einer Diskette in der Datei *.MAC (*.MAC steht für alle Dateien mit der Extension MAC) abgelegt. Nach dem Start mit RUN“MACRO“ wird der Dateiname ohne den Zusatz .MAC eingegeben und mit < J > bestätigt. Nach dem Durchlauf ist eine Datei mit der Bezeichnung *. ASM vorhanden. Diese kann nun von einem normalen Assembler in ein lauffähiges Programm umgesetzt werden. Der bisher gewohnte Assembler, egal ob 8080 oder Z80, wird also weiterhin verwendet. Aufbau der Macro-Bibliothek Die Bibliothek muß als Datei *.LIB auf einer Diskette vorhanden sein. Der Name dieser Datei wird in der *.MAC Datei angegeben. Man kann also für verschiedene Probleme auch verschiedene Bibliotheken anlegen um die Verarbeitungs-Geschwindigkeit zu erhöhen. Am Anfang einer Macro-Bibliothek stehen meist wiederkehrende Konstanten oder Adressen wie z.B. BDOS EQU 5 Diese EQUates werden in die Datei *.ASM unverändert übernommen und stehen somit jedem Programm, das diese Bibliothek benutzt zur Verfügung ohne jedesmal neu definiert werden zu müssen. Danach folgen die Macro-Definitionen. Diese werden mit einer Zeile im Format name MACRO (var, var,...) eingeleitet und mit dem Befehl ENDM beendet. Den mit var angegebenen lokalen Variablen können bei Macro-Aufruf später Werte übergeben werden. Die Bezeichnung lokal bedeutet, daß dieser Variablenname in beliebig vielen Macros und auch im Quellprogramm Vorkommen kann, da er später durch den entsprechenden Wert ersetzt wird. Auch Sprungziele können in Macros für lokal erklärt werden. Dazu ein Beispiel. In der *.LIB-Datei ist folgendes Macro: PRGNAM MACRO TEXT wird nun im Quellcode (.MAC) der Pseudo-Befehl PRGNAM 'Testprog V. 1 ' angegeben, so erzeugt MACRO in der 'ASM-Datei die Befehle JMP L$0001 Wie Sie sehen tauchen weder die Variable TEXT noch das Label AROUND im Programm später auf. Da MACRO diese lokalen Labels durchnumeriert entsteht nie die gleiche Sprungadresse. Bei Anwendung der bedingten Assemblierung werden bestimmte Labels jedoch nicht als lokal erklärt. Bedingte Assemblierung bedeutet, daß unter bestimmten Voraussetzungen ein und dasselbe Macro völlig unterschiedliche Befehle erzeugt. Ein Beispiel: ABORT MACRO ADR Der Aufruf ABORT PGEXrr erzeugt JMP PGEXIT wogegen nur ABORT den Befehl JMP BOOT erzeugt. Die Bedingungen beziehen sich immer auf lokale Variablen oder Flags. Variablen werden mit NUL var oder NOT NUL var abgefragt, Flags mit Flag-Name oder NOT Flag-Name. Die Abfrage NUL var gilt als wahr, wenn der Variablen bei Mac-ro-Aufruf kein Wert zugewiesen wurde (siehe ABORT). Mehrere Einzelbedingungen können mit AND und OR verknüpft werden. Eine Verschachtelung von mehreren IF-ELSE-ENDIF Anweisungen ineinander ist selbstverständlich möglich. Als Beispiel für die Anwendung von Flags definieren wir das Macro PRINT. In PRINT ist eine Ausgabeschleife die als Unterprogramm angesprungen wird. Diese soll nur einmal generiert werden und von allen PRINT-Anweisungen zu benutzen sein. PRINT MACRO TEXT F$PRIN SET TRUE AROUND: Alle Leser die den 8080 Code nicht verstehen, mögen mir verzeihen. LXI H,L$0002 Der nächste Aufruf von PRINT erzeugt nur noch LXI H,L$0005 Die Sprungmarke PRTSUB ist global, d.h. sie wurde nicht ersetzt. Sie darf daher im * .MAC-Quellcode nicht auftauchen und nur in einem Macro global verwendet werden. Eine weitere lokale Verwendung in anderen Macros ist natürlich gestattet. Da MACRO nicht nur die Variablen bei der Definition von Macros durch Komma trennt, sondern auch die ihnen zuzuweisenden Werte in dieser Form erwartet, kann es bei bestimmten Parametern zu Problemen kommen. Angenommen Sie möchten der ersten Variablen (VAR1) 'tex'/t'+80H und der zweiten (VAR2) 'hallo' zuweisen. Der Aufruf NAME 'tex','t'+80h,'hallo ' würde bewirken,daß VAR1 = 'tex' VAR2 = 't'+80H gesetzt wird. Der Aufruf muß hier korrekt NAME < 'tex', 't'+80H >, 'hallo' lauten um das gewünschte Resultat zu liefern. Die < > -Zeichen werden von MACRO entfernt. Sie sollen nur anzeigen, daß es sich innerhalb von ihnen um »einen« Wert handelt, der nicht getrennt werden darf. Mit diesen Zeichen können Sie nach Herzenslust herumschachteln. Auch über Macro-Verschachtelungen hinweg. Alles klar? In der Macro-Bibliothek können Kommentare geschrieben werden, die nicht mit nach *.ASM übernommen werden. Diese werden dann nicht mit; sondern mit;; vom Programmcode getrennt. Leerzeilen werden ebenfalls nicht von *.LIB nach *.ASM übernommen. Aufbau des Quellcodes: Als erstes müssen im Quellcode die Werte für wahr und falsch als EQUates definiert werden. Danach müssen alle in den verwendeten Macros vorkommenden Flags auf ihren Ausgangszustand gesetzt werden. Zweckmäßig ist es, eine kleine Extradatei anzulegen, in der alle Flags definiert werden. Diese wird dann als Programmanfang eingeladen. Nun folgt die MACLIB-Anweisung, in der der Name der *.LIB-Datei angegeben wird. Der jetzt folgende Programmcode kann sowohl die üblichen Assembler-Anweisungen als auch die Macros als Befehle enthalten. Ein letztes Programm-Beispiel: Macro-Bibliothek CPMMAC.LIB: BDOS EQU 5 ABORT MACRO ADR Quellcode Datei TEST.MAC: FALSE EQU 0 PRGNAM 'Test V. 1 Datum' Eingabe über ED.COM oder unter BASIC mit LINE INPUT und PRINT #9. A> ASM TEST TEST.MAC, TEST.ASM, TEST.HEX, TEST.PRN und TEST.COM. Sehen Sie sich die Datei TEST.PRN doch ruhig einmal mit A/TYPE TEST.PRN an. Die Ausgabe können Sie mit <CTRL> + <S> stoppen und starten. Auch das Programm TEST sollte nun funktionieren. Fragen Sie es mal mit A > TEST Als Literatur zu empfehlen ist: Programmieren mit CP/M von Alan R. Miller, erschienen bei SYBEX. Das Buch behandelt Macros sehr intensiv und ist auch für Laien verständlich. Es werden dort ausschließlich 8080 Befehle verwendet, so daß der Assembler ASM.COM benutzt werden kann. Anpassungen: Wird z.B. der BASIC-Editor zur Eingabe der Zeilen verwendet, so ist vor jeder Zeile eine Zeilennr., die entfernt werden muß. Alle Zeilen, egal ob aus *.LIB oder aus *.MAC werden in der Routine ab Zeile 2860 eingelesen. Wird aus *. MAC gelesen so ist fm=-1, sonst 0. Die Zeüennummem können mit einem kleinen Zähler schnell bei der zentralen Ausgabe ab 3540 wieder eingefügt werden. Die wichtigsten Änderungen können in den Parametern ab Zeile 4420 vorgenommen werden, zl ist das Zeichen, in dem Texte eingeschlossen werden, zl =CHR$(34) ändert es von ' auf “,z2 (:) wird autom. an jedes Label angefügt.z3 (;) kennzeichnet Kommentare. Evtl. auf ' ändern.z4 evtl Eine Anpassung der RSX-Befehle ist normalerweise nicht erforderlich. Sie sollten auch mit anderen RSX-Erweiterungen zusammen funktioniem, da sie vom LINKER automatisch unter HIMEM eingeladen werden. Sie ermöglichen lediglich, daß von zwei Dateien abwechselnd gelesen werden kann (*.LIB und *.MAC) und daß in *.LIB die gewünschte Stelle direkt angesprungen wird und nicht erneut gesucht werden muß. Dazu wird lediglich der File-Control-Block OPENIN manipuliert.
|