Dienstag, September 29, 2026

C64 Basic Befehle: READ, DATA, RESTORE

Mit READ, DATA und RESTORE legt ihr feste Werte direkt im Programm ab, lest sie nacheinander ein und könnt sie bei Bedarf erneut von vorn einlesen. Die drei Befehle gehören zusammen und ergeben erst im Zusammenspiel ein rundes Werkzeug.

Ausgangslage: Werte hart codieren

Als Beispiel soll ein fester Wert von 100 durch verschiedene Teiler geteilt werden. Der naheliegende Weg ist, jede Rechnung einzeln hinzuschreiben:

10 A%=100
20 B=A%/2
21 PRINT B
25 C=A%/20
26 PRINT C

Das liefert 50 und 5 und ist korrekt. Bei zwei Teilern ist das noch überschaubar. Bei 100 Teilern müsstet ihr aber jeden Wert einzeln hart codieren, also fest in eine eigene Programmzeile schreiben. Genau hier setzen DATA und READ an.

DATA und READ: Werte ablegen und einlesen

Mit DATA legt ihr feste Werte im Programm ab, getrennt durch Kommas. READ liest diese Werte der Reihe nach in eine Variable ein. Jedes Komma markiert das Ende eines Wertes, danach beginnt der nächste.

Für unser Beispiel landen die fünf Teiler in einer DATA-Zeile am Programmende. Eine Schleife liest sie nacheinander ein und rechnet damit:

10 A%=100
20 FOR I=1 TO 5
25 READ T
30 E=A%/T
40 PRINT ”ERGEBNIS =”;E
100 NEXT I
500 DATA 50,2,1,4,10

So läuft das Programm ab:

  1. Zeile 10 setzt den Grundwert A% auf 100.
  2. Die Schleife in Zeile 20 läuft fünfmal, einmal pro Wert in der DATA-Zeile.
  3. Zeile 25 liest den jeweils nächsten Wert aus Zeile 500 in die Variable T.
  4. Zeile 30 teilt 100 durch T, Zeile 40 gibt das Ergebnis aus.
  5. Zeile 100 springt zurück nach Zeile 20, bis I den Wert 5 erreicht hat.
Jedes READ liest einen Wert aus der DATA-Zeile und rückt den Zeiger weiter
READ T in der Schleife

Jeder Schleifendurchlauf verbraucht genau einen DATA-Wert. Die Ausgabe lautet 2, 50, 100, 25 und 10.

DATA-Zeilen dürfen überall im Programm stehen. Üblich ist aber, sie ans Ende oder zumindest weit nach hinten zu legen. Sie enthalten nur feste Werte und stören dort den Lesefluss des eigentlichen Programms nicht.

In der Praxis nutzt man DATA-Zeilen oft für Werte, die per POKE in den Speicher geschrieben werden. Ein Sprite zum Beispiel besteht aus einem Bitraster. Die Bits werden zu Dezimalzahlen zusammengefasst, in DATA-Zeilen abgelegt, in einer Schleife eingelesen und in den Speicher gepoket.

Der DATA-Zeiger und der OUT OF DATA ERROR

Intern merkt sich der C64 mit einem Zeiger, welcher DATA-Wert als nächster gelesen wird. Beim Programmstart steht er auf dem ersten Wert der ersten DATA-Zeile. Jedes READ liest den Wert an dieser Stelle und rückt den Zeiger um eine Position weiter.

Nun sollen die fünf Ergebnisse dreimal ausgegeben werden. Dazu kommt eine äußere Schleife hinzu, die die bestehende I-Schleife umschließt:

10 A%=100
15 FOR X=1 TO 3
20 FOR I=1 TO 5
25 READ T
30 E=A%/T
40 PRINT ”ERGEBNIS =”;E
100 NEXT I,X
500 DATA 50,2,1,4,10

Startet ihr das Programm, erscheinen zunächst die fünf Ergebnisse. Danach bricht es ab mit:

?OUT OF DATA  ERROR IN 25

Die Ursache ist der Zeiger. Im ersten Durchlauf der X-Schleife hat READ alle fünf Werte gelesen, der Zeiger steht hinter dem letzten Wert. Im zweiten Durchlauf versucht Zeile 25 erneut zu lesen, findet aber keine Daten mehr.

Nach fünf READs zeigt der Zeiger ins Leere und löst OUT OF DATA ERROR aus
Zweiter X-Durchlauf ohne RESTORE

Man könnte die DATA-Zeile einfach dreimal so lang machen. Das ist aber umständlich und nicht nötig, denn BASIC bietet dafür einen eigenen Befehl.

RESTORE: den Zeiger zurücksetzen

RESTORE setzt den DATA-Zeiger zurück auf den ersten Wert der ersten DATA-Zeile im Programm. Das nächste READ beginnt dann wieder von vorn.

Der Befehl muss zwischen die beiden Schleifen, also nachdem die innere Schleife alle fünf Werte gelesen hat und bevor die äußere Schleife den nächsten Durchlauf startet. Mit dem kombinierten NEXT I,X gibt es dafür keinen Platz, deshalb werden die Schleifen wieder getrennt geschlossen. Das vollständige Programm:

10 A%=100
15 FOR X=1 TO 3
20 FOR I=1 TO 5
25 READ T
30 E=A%/T
40 PRINT ”ERGEBNIS =”;E
100 NEXT I
105 RESTORE
110 NEXT X
500 DATA 50,2,1,4,10
Programmablauf: RESTORE setzt den Zeiger vor jedem neuen X-Durchlauf zurück
Ablauf mit RESTORE

Die innere Schleife liest die fünf Werte, RESTORE stellt den Zeiger zurück, dann beginnt der nächste X-Durchlauf. Jetzt läuft das Programm sauber durch und gibt dreimal dieselben fünf Ergebnisse aus, insgesamt 15 Zeilen. Dass sich die Werte wiederholen, ist hier Absicht: Es zeigt, dass die DATA-Zeile bei jedem Durchlauf von vorn gelesen wird.

Im C64-BASIC V2 springt RESTORE immer an den Anfang aller DATA-Werte. Eine Zeilennummer als Ziel, wie RESTORE 500, kennen erst spätere BASIC-Versionen ab V3.5 (C64-Wiki: DATA).

Zeichenketten in DATA-Zeilen

DATA-Zeilen können neben Zahlen auch Zeichenketten enthalten, zum Beispiel Farbnamen. Wichtig ist dann, dass READ in eine String-Variable liest:

10 FOR I=1 TO 3
20 READ F$
30 PRINT F$
40 NEXT I
500 DATA ”ROT”,”GRUEN”,”BLAU”

Trifft READ dagegen mit einer Zahlenvariable wie A% auf eine Zeichenkette, bricht das Programm ab. Der C64 meldet dabei einen ?SYNTAX ERROR und verweist auf die Nummer der DATA-Zeile, nicht auf die Zeile mit dem READ (C64-Wiki: READ). Bei der Fehlersuche lohnt sich also ein Blick in die DATA-Zeilen.

In Anführungszeichen gesetzte Zeichenketten dürfen auch Steuerzeichen enthalten, etwa SHIFT+CLR/HOME zum Löschen des Bildschirms oder einen Farbwechsel. Das funktioniert genauso wie bei PRINT.

Zusammenfassung

  • DATA legt feste Werte im Programm ab, durch Kommas getrennt, üblicherweise am Programmende.
  • READ liest den nächsten DATA-Wert in eine Variable passenden Typs und rückt den Zeiger weiter.
  • RESTORE setzt den Zeiger auf den ersten DATA-Wert zurück, damit die Werte erneut gelesen werden können.

Wer das Prinzip des Zeigers verstanden hat, kann mit den drei Befehlen gut arbeiten.
Alle Beispiele zeige ich auch Schritt für Schritt im Video:

Kommentar hinzufügen

Die Felder Name und Kommentar sind Pflichtfelder.