von Frederik Holst Diesmal kommen wir ein wenig ab von dem DLI und wollen uns dem Hauptvorteil des ATMAS-II gegenüber anderen Assemblerprogrammen widmen: Wie der Name des ATMAS schon sagt, ist er ein MACROASSEMBLER. Was sind Macros ? Macros sind Unterprogramme oder Prozeduren, die einen Namen bekommen. Dieser Name ist kein Assemblerbefehl, kann aber im späteren Programm wie ein solcher benutzt werden. Diese Sache hat den Vorteil, daß somit ein Assemblerprogramm sehr viel übersichtlicher wird, denn unter einem Macro wie PRINT oder POKE kann man sich sicherlich mehr vorstellen als unter einer Reihenfolge von LDAs, STAs, BNEs und JMPs. Der Nachteil dieser Methode soll aber nicht verschwiegen werden: Erstens wird jedesmal, wenn das Macro in den Quelltext eigefügt wird, der Code, der für dieses Macro steht eingesetzt. Bei kleinen Macros fällt dies nicht weiter ins Gewicht, hat man aber längere Macros, so ist der Speicherverbrauch schon recht groß. Der zweite Nachteil ist, daß wenn Sie jemand anderem Ihren Quellcode geben, daß dieser dann auch einen Macroassembler haben muß, ansonsten kann er mit dem Code nicht viel anfangen. Dies wirkt sich aber nur auf den Quelltext aus, das lauffähig compilierte Programm unterscheidet sich in keinster Weise (nur durch die Länge) von anderen. Kommen wir aber nun einmal zum ersten Beispiel: POKE MACRO ADDR,VAL LDA #VAL STA ADDR MEND ORG $A800 POKE 710,0 RTS Das soll unser erstes Macroprogramm sein. Es fällt als erstes auf, daß das Macro vor dem ORG also vor dem eigentlichen Programm steht. Vor dem Befehl MACRO steht ein Label, daß dem Macro einen Namen gibt, in unserem Fall also POKE. Bei den meisten Macroassemblern muß man beachten, bis auf welchen Buchstaben das Macro beachtet wird, d.h. bei einigen Programmen ist POKEA POKEB und POKEC das gleiche, ATMAS-II macht hierbei zum Glück Unterschiede. Hinter dem Befehl MACRO kommen die Argumente, die an das Macro übergeben werden können. Jeder Pokebefehl benötigt natürlich eine Adresse und einen Wert, den man an sie übergibt. Die Adresse habe ich ADDR und den Wert VAL genannt. Nun wird der Wert VAL in den Akku geladen und dieser dann bei der Adresse ADDR abgelegt. Zum Schluß wird das Macro mit MEND beendet. Unser eigentliches Programm besteht dann nur noch aus dem POKE Befehl und dem RTS, das zur Beendigung des Programms dient. Was passiert nun, wenn wir das Programm compilieren ? Sehen wir uns den Speicher im Monitor nach dem Compilieren an. Dort steht dann: $A800 LDA #0 $A802 STA 710 $A805 RTS Der Quelltext, für den das Macro steht, ist beim Compilieren einfach eingesetzt worden. Für die ersten Schritte, bei denen es ja noch nicht auf Speicherplatzminimierung ankommt, ist diese Art der Programmierung sicherlich von Vorteil. Im nächsten Teil werden wir uns neben den Konstanten auch dem Pendant der Macros, den Subroutinen widmen.