APPLICATIONSPROGRAMMATION ★ MACRO: ein Utility für Z80 Programmierer ★

Macro (CPC Amstrad International)Applications Programmation
★ Ce texte vous est présenté dans sa version originale ★ 
 ★ This text is presented to you in its original version ★ 
 ★ Este texto se presenta en su versión original ★ 
 ★ Dieser Text wird in seiner Originalfassung präsentiert ★ 

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
BOOT EQU 0
CLS EQU 12
CR EQU 13
LOGEXT EQU &BCD1
TXTOUT EQU &BB5A etc,

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
LOCAL AROUND
JMP AROUND
DB TEXT
AROUND:
ENDM

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
DB 'Testprog V. 1 '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
IF NOT NUL ADR
JMP ADR
ELSE
JMP BOOT
ENDIF
ENDM

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
LOCAL AROUND.TXTS.TXTE
LXI H,TXTS
LXI D,TXTE-TXTS
CALL PRTSUB
JMP AROUND
TXTS:
DB TEXT
TXTE:
IF NOT F$PRIN
PRTSUB:
MOV A,M
TXTOUT INX H
DCX D
MOV A,D
ORA E
JNZ PRTSUB
RET

F$PRIN SET TRUE
ENDIF

AROUND:
ENDM

Alle Leser die den 8080 Code nicht verstehen, mögen mir verzeihen.
Beim ersten Aufruf des Macros PRINT wird nun folgender Code erzeugt:

LXI H,L$0002
LXI D,L$0003-L$0002
CALL PRTSUB
JMP L$0001
L$0002:
DB Text bei PRINT'
L$0003:
PRTSUB:
MOV A,M
TXTOUT INX H
DCX D
MOV A,D
ORA E
JNZ PRTSUB
RET
L$0001:

Der nächste Aufruf von PRINT erzeugt nur noch

LXI H,L$0005
LXI D,L$0006-L$0005
CALL PRTSUB
JMP L$0004
L$0005:
DB 'Text bei PRINT'
L$0006:
L$0004:

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
BOOT EQU 0
CONOUT EQU 2

ABORT MACRO ADR
(Definition wie o.a.)
;
PRINT MACRO TEXT
(Definition wie o.a.)
;
TXTOUT MACRO
PUSH H
PUSH D
PUSH B
MVI C, CONOUT
MOV E,A
CALL BDOS
POP B
POP D
POP H
RET
ENDM

Quellcode Datei TEST.MAC:

FALSE EQU 0
TRUE EQU NOT FALSE
;
F$PRIN SET FALSE
;
MACLIB CPMMAC
;
ORG 100H
;
START:

PRGNAM 'Test V. 1 Datum'
PRINT 'Ich funktioniere'
ABORT
;
END

Eingabe über ED.COM oder unter BASIC mit LINE INPUT und PRINT #9.
Start von MACRO.
Programmname ist TEST (ohne Erweiterung).
Anschließend unter CP/M folgende Befehle eingeben:

A> ASM TEST
A> LOAD TEST
(ASM.COM und LOAD.COM müssen auf der Diskette sein). Nun sind folgende Dateien vorhanden:

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.

(Jan Wieck), CPCAI

★ PUBLISHER: CPC Amstrad International
★ YEAR: 1987
★ CONFIG: ???
★ LANGUAGE:
★ LiCENCE: LISTING
★ COLLECTION: CPC AMSTRAD INTERNATIONAL 1987
★ AUTHOR: Jan Wieck
 

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listings:
» Macro    (CPC  Amstrad  International)    GERMANDATE: 2022-08-02
DL: 88
TYPE: ZIP
SiZE: 8Ko
NOTE: 40 Cyls
.HFE: Χ

» Macro    (CPC  Amstrad  International)    GERMAN    LISTINGDATE: 2022-08-02
DL: 98
TYPE: PDF
SiZE: 3962Ko
NOTE: 8 pages/PDFlib v1.6

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Applications » Sonderzeichen für CP/M (CPC Magazin)
» Applications » CPM+ : Extended Turbo Graphic Toolbox
» Applications » Cpm Shell (Amstrad Accion)
» Applications » Basic-Lader_fur_Deutscher_zeichensatz_unter_CPM
» Applications » CP/M Plus for PCW
» Applications » CP/M Plus mit 64 Hz (CPC Amstrad International)
Je participe au site:
» Vous avez des infos personnel ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 528 millisecondes et consultée 395 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.