von Frederik Holst Letztes Mal haben wir also herausgefunden, wie man einen einfachen POKE-Befehl in Maschinensprache umsetzt und dabei die wichtigsten Befehle des Assemblers kennengelernt. Heute muß es leider noch etwas theoretisch bleiben, aber nächstes Mal werden wir dafür auch in der Lage sein, einen Text auszugeben. Das Thema, das uns heute beschäftigen soll, ist die Umsetzung einer FOR-NEXT Schleife in Maschinensprache. Als BASIC Beispiel nehme ich eine Schleife, die einen bestimmten Speicherbereich löschen soll. FOR X=1536 TO 1791: POKE X,0: NEXT X Der Speicherbereich ist hier von 1536 bis 1791 angegeben, also die Page Six. Wie muß unser Assemblerprogramm schematisch aussehen ? Zu Anfang steht wie immer der Speicherbereich, ab dem das Programm stehen soll, wir nehmen wie immer $A800. Also lautet die erste Zeile schon mal ORG $A800 Als zweites muß eine Variable bereitgestellt werden, die die null aufnimmt, die ja in jede Speicherstelle geschrieben werden soll. Dazu verwenden wir den Akku, da er am flexibelsten ist. LDA #0 Nun muß noch eine Zählvariable definiert werden. Wir nehmen das X-Register, da wir im BASIC Beispiel auch das X verwendet haben. LDX #0 Hier müßten aufmerksame Leser verwundert fragen "Wieso denn null und nicht 1536 ?". Das Rätsels Lösung kommt in der nächsten Zeile: STA 1536,X Diese Version des STA Befehls bedeutet: Zähle zu dem Wert vor dem Komma den Wert des X-Registers hinzu und lege an dieser Position den Inhalt des Akkus ab. Beim ersten Durchlauf ist der X-Wert noch null, d.h., daß der Inhalt des Akkus (null) bei 1536+0=1536 abgelegt wird. Nun muß das X-Register um eins erhöht werden. Das passiert mit dem INX Befehl. INX steht für INcrease X-Register. Also schreiben wir: INX Jetzt fehlt aber noch eine Abschlußbedingung, denn das ganze soll ja nicht bis in alle Ewigkeit so weiterlaufen. Dazu vergleichen wir das X-Register mit dem Wert, bei dem die Schleife beendet werden soll. Wie bekommen wir den Wert heraus ? In der BASIC Schleife war 1791 der Endwert, also rechnen wir 1791-1536=255. Der X-Wert darf also 255 ncht überschreiten. Für den Vergleich benutzen wir den Befehl CPX, was für ComPare with X-Register steht. CPX #255 Hierauf muß ein bedingter Sprung erfolgen, denn entweder soll die Schleife weiter durchgeführt werden, oder es soll ein Abbruch erfolgen. Wir benutzen dafür den BNE-Sprung. BNE steht für Branch if Not Equal, d.h. Verzweige, wenn nicht gleich. BNE LOOP Der Computer verzweigt zur Marke LOOP wenn das X-Register ungleich 255 ist. Jetzt müssen wir nur noch die Marke positionieren. Das ist logischerweise vor dem STA-Befehl, sodaß diese Zeile nun so aussieht: LOOP STA 1536,X Wenn der X-Wert aber nun 255 erreicht hat, dann soll das Programm beendet werden. Also folgt dahinter ein einfaches RTS So sollte unser Listing nun aussehen: ORG $A800 LDA #0 LDX #0 LOOP STA 1536,X INX CPX #255 BNE LOOP RTS Mit diesem Programm können wir nächstes Mal dann auch Werte in den Bildschirmspeicher schreiben und somit Texte ausgeben. Bis zum nächsten Mal noch gutes Gelingen !