von Frederik Holst Wie versprochen wenden wir uns nun endlich den Subroutinen und den Konstanten zu. Um an den Teil mit den Macros anknüpfen zu können, beginne ich mit den Subroutinen. Wie schon gesagt, muß man mit der Verwendung von Macros recht vorsichtig sein, denn ein Macro von einem halben KB an Länge sieht im Quelltext recht wenig aus. Wird dieses Macro aber zehn Mal eingesetzt sind schon fünf KB an wertvollem Speicher verloren. Dies kann man aber auf folgende Art und Weise vermeiden: Wir denken uns, daß wir ein Macro haben, daß ohne Parameter aufgerufen wird, also nicht wie in unserem Beispiel POKE 710,10 oder so ähnlich sondern meinetwegen CLRLINE, das die erste Zeile des Bildschirms löschen soll. Das Programm dazu sieht so aus: CLR LDA #32 STA (88),X INX CPX #40 BNE CLR Wenn wir diese Routine nun als Macro verwenden wollten, dann würden wir als erste Zeile einfügen CLRLINE MACRO und als letzte Zeile MEND Nun würden beim Assemblieren aber jedesmal diese fünf Zeilen neu als Programmcode in den Speicher kommen. Das wollen wir vermeiden, indem wir Subroutinen verwenden. Dazu machen wir im Hauptprogramm folgendes: Immer wenn die erste Zeile des Bildschirms gelöscht werden soll, fügen wir ein JSR CLR (Jump to SubRoutine) ein. Als Zeile hinter dem BNE CLR muß dann noch ein RTS eingefügt werden (ReTurn from Subroutine). Nachdem die Subroutine durchlaufen worden ist, kehrt das Programm an die Stelle zurück, an der die Subroutine aufgerufen worden ist. Wenn nun diese Prozedur wie oben erwähnt zehn Mal aufgerufen wird, dann wird nur der Speicher für die zehn Sprungbefehle (je 3 Byte) und einmal der Speicher für die Routine benötigt. Man sieht also, wenn man Subroutinen verwendet, kann man Speicher sparen, besonders bei langen Programmen. Nun werden einige aber sagen, daß man ja keine Parameter wie bei dem POKE-Macro übergeben kann. Das ist zwar beim ersten Hinsehen richtig, aber auch das kann man umgehen, nämlich mittels der Konstanten: Konstanten sind Labels, denen eine bestimmte Speicherstelle zugewiesen wird. So kann ich z.B. der Speicherstelle 1536 ($0600) das Label PAGE6 zuweisen. Das geht wie folgt: PAGE6 EQU 1536 oder PAGE6 EQU $600 Wenn ich nun im Programm der Speicherstelle 1536 den Wert 10 zuweisen will, dann muß ich nicht mehr schreiben: LDA #10 STA 1536 sondern ich kann schreiben LDA #10 STA PAGE6 Dies macht ein Programm sehr viel übersichtlicher, wenn man oft benutzten Speicherstellen, sinnvolle Namen gibt. Von ATARI ist auch eine Namensrichtlinie herausgegeben worden, in der PEEKS und POKES Ecke des USER-Mag finden Sie die offiziellen Namen der dokumentierten Speicherstellen. Genau wie MACROS müssen Konstanten (EQUates) vor dem ORG-Befehl stehen, und wenn sie in Macros schon Verwendung finden sollen, auch vor diesen, am Besten immer ganz am Anfang. An einem kleinen Beispiel können wir nun noch sehen, wie die Übergabe von Parametern mit Subroutinen erfolgen kann: VAL EQU $601 ORG $A800 ... LDA #10 STA VAL JSR SCRNCOL ... SCRNCOL LDA #VAL STA 710 RTS Auch wenn dieses Beispiel speichertechnisch sinnlos ist, so soll es doch zeigen, wie Werte übergeben werden können: Im Hauptprogramm wird der Wert 10 in die Konstante VAL geschrieben und dann das Unterprogramm aufgerufen. Hier wird VAL wieder in den Akku gelesen und in 710 abgelegt. Sinn machen würde dieses Programm erst, wenn mit VAL mehr angestellt würde als es bloß in eine Speicherstelle abzulegen. Viel Spaß noch !