Wer am C64 programmiert, stößt früher oder später auf eine Grundsituation: Bestimmte Dinge sollen sich innerhalb des Programmablaufs mehrfach wiederholen.
In der Programmierung löst man das mit Schleifen.
Die einfachste Form: die Endlosschleife
Die simpelste Schleife kennt jeder, der schon einmal ein Basic-Programm geschrieben hat: Eine Zeile gibt einen Text aus, die nächste springt per GOTO zurück an den Anfang.
10 PRINT "Hallo Welt!" 20 GOTO 10
Das Ergebnis ist eine Ausgabe, die sich unendlich oft wiederholt – bis man das Programm manuell abbricht. Praktisch ist das selten. Meist will man eine Ausgabe nicht endlos, sondern eine festgelegte Anzahl an Malen wiederholen.
Der Umweg: Zähler, IF und GOTO
Eine Möglichkeit, die Wiederholung zu begrenzen, wäre Folgendes:
- Eine Zählervariable (Z) vor der Schleife auf einen Startwert setzen.
- In der Schleife nach jeder Ausgabe den Zähler um eins erhöhen.
- Per IF-Abfrage prüfen, ob der Zähler die gewünschte Grenze erreicht hat, und bei Erfüllung aus der Schleife herausspringen.
10 Z = 1 20 PRINT "Hallo Welt" 30 Z = Z +1 40 IF Z=10 THEN END 50 GOTO 20
Das funktioniert, ist aber unnötig. Denn genau für solche Fälle gibt es einen einfacheren Weg.
FOR und NEXT: Schleifen mit eingebauter Endbedingung
FOR und NEXT wurden genau zu diesem Zweck in den Basic-Interpreter eingebaut: um Schleifen mit einer klaren Endbedingung zu bauen, ohne sie sich selbst zusammenbasteln zu müssen.
Die Syntax:
FOR Z = 1 TO 10 [Zu wiederholender Programmteil] NEXT
- Nach FOR folgt eine Zählervariable (hier Z).
- Danach wird der Bereich festgelegt – Startwert und Endwert, mit TO getrennt.
- Es folgt der Programmteil, der wiederholt werden soll.
- Abgeschlossen wird die Schleife immer mit NEXT.
Erst bei NEXT passieren zwei Dinge gleichzeitig: Der Zähler wird um eins erhöht (Z = Z + 1), und es wird geprüft, ob die Endbedingung erreicht ist (Z >= 10). Ist sie es noch nicht, läuft die Schleife weiter; ist sie erreicht, geht es im Programm hinter dem NEXT weiter.
Wichtig: Die Schleife läuft immer mindestens einmal
Weil die Prüfung erst am Ende (bei NEXT) erfolgt, wird der Schleifenkörper immer mindestens einmal ausgeführt – selbst wenn die Endbedingung beim Einsprung eigentlich schon erfüllt wäre. Das unterscheidet FOR/NEXT von Konstrukten wie einer WHILE-Schleife in moderneren Programmiersprachen, bei denen die Bedingung schon vor dem ersten Durchlauf geprüft wird und die Schleife im Zweifel gar nicht erst ausgeführt wird.
Das Beispiel
10 FOR Z = 1 TO 0 20 PRINT "Hallo Welt" 30 NEXT
– zeigt, dass die Schleife trotz erfüllter Endbedingung gleich zum Start (Z = 1 ist größer als die Endbedingung Z = 0) mindestens einmal durchläuft. Auf dem Bildschirm wird “Hallo Welt” ausgegeben.
Praxisbeispiel: Bildschirmspeicher füllen
Ein gutes Anwendungsbeispiel ist das direkte Beschreiben des Bildschirmspeichers. Die linke obere Ecke des Bildschirms beginnt bekanntlich bei Speicheradresse 1024, der Zeichencode (Screencode) für den Buchstaben „A“ ist 1.
Um die oberste Bildschirmzeile mit „A“ zu füllen, braucht man eine Schleife, die bei jedem Durchlauf die Zielspeicheradresse um eins erhöht – der Zähler der FOR-Schleife lässt sich dafür direkt in die POKE-Adresse einsetzen:
10 FOR Z = 0 TO 39 20 POKE 1024 + Z, 1 30 NEXT
Wichtig dabei: Der Zähler muss bei 0 beginnen, nicht bei 1 – sonst verschiebt sich die Ausgabe um eine Speicherstelle nach rechts und man beginnt nicht exakt in der linken oberen Ecke. Alternativ könnte man den Startwert auf 1 setzen, müsste dann aber bei der Speicheradresse 1023 beginnen.
Der STEP-Parameter: Schrittweite festlegen
Für Aufgaben wie das Füllen einer Bildschirmspalte (statt einer Zeile) reicht eine Schrittweite von eins nicht aus – der Bildschirm ist 40 Zeichen breit, jede neue Zeile beginnt also 40 Speicherstellen weiter. Genau dafür gibt es den optionalen STEP-Parameter bei FOR.
10 FOR Z = 1024 TO 1984 STEP 40 20 POKE Z, 1 30 NEXT
STEP legt fest, um wie viel sich der Zähler bei jedem NEXT verändert – standardmäßig ist es 1, wird STEP angegeben, zählt die Schleife entsprechend in größeren (oder kleineren) Schritten.
Auch negative Schrittweiten sind möglich. Damit lässt sich dieselbe Spalte auch rückwärts durchlaufen – man vertauscht dann lediglich Start- und Endwert:
10 FOR Z = 1984 TO 1024 STEP -40 20 POKE Z, 1 30 NEXT
❗ Ein Hinweis aus der Praxis: Beim Rechnen mit Bildschirmspeicheradressen lohnt sich Vorsicht. Rutscht man mit der Adresse aus dem eigentlichen Bildschirmspeicher heraus, kann es passieren, dass man versehentlich in sensible Speicherbereiche schreibt – etwa in den Basic-eigenen Speicher – was zu Fehlern oder einem eingefrorenen System führen kann.
Verschachtelte Schleifen: ein Ausblick
FOR/NEXT-Schleifen lassen sich auch ineinander verschachteln. Bei nur einer Schleife weiß der NEXT-Befehl automatisch, auf welchen FOR-Befehl er sich bezieht – bei mehreren verschachtelten Schleifen kann es dagegen nötig werden, die Zählervariable explizit anzugeben, also z. B. NEXT Z, damit klar ist, welche Schleife an dieser Stelle beendet wird.
Fazit
FOR und NEXT gehören zusammen und ermöglichen es, Schleifen mit einer klar definierten Endbedingung zu bauen, ohne sich diese Logik selbst mit Zählervariablen, IF und GOTO zusammenzubauen. Wer versteht, dass der Zähler erst bei NEXT erhöht und geprüft wird – und dass der Schleifenkörper deshalb immer mindestens einmal läuft –, hat das Wichtigste an diesem Grundbaustein der C64-Basic-Programmierung verstanden. Der optionale STEP-Parameter macht die Schleife darüber hinaus flexibel genug für Aufgaben wie das gezielte Beschreiben von Bildschirmspeicherbereichen in beliebiger Schrittweite und Richtung.
Diesen Artikel gibt es auch auf meinen Youtube-Kanal als Video-Tutorial