Erstellt: 23. Dezember 2012 (zuletzt geändert: 27. November 2018)

Das erste Programm

…damit ist nicht die ARD gemeint

Falls noch nicht geschehen, startet jetzt den C64 bzw. Emulator. Wir schauen uns zunächst mal ein ganz einfaches BASIC-Programm an.

10 PRINT “RETRO-PROGRAMMING “;
20 GOTO 10

Löscht mit dem NEW-Befehl den BASIC-Speicher, um sicher zu gehen, dass keine Reste das neue Programm stören. Nach einem RESET bzw. Neustart ist dies unnötig, schadet aber auch nicht. Gebt anschließend die beiden Zeilen direkt ein. Jede Zeile muss mit der RETURN-Taste bestätigt werden!
Als Erstes fällt auf, dass wir Zeilen-Nr. 10 und 20 benutzt haben. Durch diese weiß der C64, dass er die Befehle nicht direkt ausführen soll, sondern das diese Teil eines Programmes sind. Bei der Vergabe der Zeilen-Nr. hat es sich als klug erwiesen, dass man diese in 10 (oder noch größeren) Schritten eingibt und evtl. Blöcke bildet, so lassen sich später Ergänzungen oder Korrekturen leichter einfügen. Es gibt nämlich KEINE Möglichkeit die Zeilen neu zu nummerieren, abgesehen von speziellen Tools oder anderen BASIC-Versionen, z. B. Simon‘s BASIC. Ihr könnt übrigens nur Zeilen-Nr. von 0 bis 63999 verwenden!
Gebt nun RUN ein, um das Programm zu starten. Sobald ihr genug gesehen habt, drückt die RUN/STOP-Taste (bei Emulatoren meist die ESC-Taste), damit das Programm unterbrochen wird.

Was macht das Programm nun genau?
10 PRINT “RETRO-PROGRAMMING “;

PRINT (drucke) Daten ausgeben
Der PRINT-Befehl wird verwendet, um Daten auszugeben. Dies kann wie hier der Bildschirm sein, aber auch Drucker oder Speichermedien sind möglich (dann heißt der Befehl PRINT#). Das Semikolon ; am Ende sorgt dafür, dass der Cursor hinter RETRO-PROGRAMMING stehen bleibt und der nächste Text direkt dahinter ausgegeben wird.

20 GOTO 10
GOTO (gehe nach) zu einer anderen Programmzeile „springen“
Der GOTO-Befehl wird benutzt, um das Programm an der angegebenen Zeile fortzusetzen. Hier springen wir also wieder in die Zeile 10 und geben das nächste RETRO-PROGRAMMING , direkt hinter dem ersten aus. Dies nennt man eine Schleife.
Genau genommen handelt es sich hier um eine klassische Endlos-Schleife. So bezeichnet man Schleifen, die nicht von selbst aufhören. Wir können aber zum Glück, wie oben erwähnt, mit RUN/STOP unsere Endlos-Schleife abbrechen.

Um Zeilen zu korrigieren, könnt ihr einfach mit den Cursor-Tasten in jede auf dem Bildschirm sichtbare Zeile (z. B. nach einem LIST) gehen, die neuen Angaben eintippen und abschließend die RETURN-Taste drücken, während ihr noch in der Zeile steht. Soll die Zeile verschoben werden schreibt über die aktuelle Zeilen-Nr. einfach die neue Zeilen-Nr und bestätigt dies mit RETURN. Um eine Zeile zu löschen geht in einen leeren Bereich gebt nur die Zeilen-Nr. ein und drückt RETURN.

Etwas Farbe

Ergänzen wir unser Programm um eine weitere Zeile.

15 POKE 646,RND(1)*16
POKE OK. – Na gut. – Die Übersetzungen hierfür gehen schon ins Unanständige. Ich entscheide mich fürs „(hinein)stecken“, im Sinne von „setzen/schreiben“.
Mit diesem Befehl kann man den Inhalt einer Speicherzelle setzen. Allgemein lautet der Befehl POKE Speicherstelle,Wert.

RND() (random = zufällig)
Eine Zufallszahl zwischen 0 und 1 ermitteln, wobei weder genau 0 noch 1 vorkommen. Es handelt sich also um eine Zahl mit Nachkommastellen (Fließkommazahl).

Der POKE-Befehl wird hier benutzt, um die aktuelle Schriftfarbe zu verändern. Diese steht in der Speicherzelle 646. Um eine Farbe zu wählen, nutzen wir den RND-Befehl. Dieser ermittelt, wie oben erwähnt, eine Zufallszahl zwischen 0 und 1. Da wir gerne eine der 16 möglichen Farben hätten (0 – 15), multiplizieren wir das Ergebnis von RND(1) mit der Anzahl, der möglichen Farben, beim C64 also 16. Das Ergebnis wird als ungerundete Ganzzahl betrachtet. Da deshalb auch 15,99999 eine glatte 15 ergibt (es wird ja nicht gerundet, sondern einfach abgeschnitten), erhalten wir Zahlen zwischen 0 und 15.
Die Zahl in den runden Klammern beim RND(1) gibt an, wo die Erzeugung der Zufallszahlen beginnen soll. Hiermit lassen sich z. B. zu Testzwecken, durch eine negative Zahl beim ersten Aufruf immer dieselben „Zufallszahlen“ erzeugen.

Startet das Programm und alles wird bunt. Abbruch wieder mit RUN/STOP.

Noch Bunter

Bevor wir zu einem Highlight des C64 kommen, noch eine letzte Änderung. Falls ihr auf Lichtreize mit epileptischen Anfällen reagiert, lasst das besser aus.

16 POKE 53280,RND(1)*16 : POKE 53281,RND(1)*16

Nach Eingabe von RUN geht es so richtig ab 😉 .

VICE-Screenshot: Wow – Diese Farben.

Die einzigen Besonderheiten hier sind die beiden neuen Speicherzellen 53280 (Rahmenfarbe) und 53281 (Hintergrundfarbe), so wie die Möglichkeit, mehrere Befehle in eine Zeile zu schreiben. Dazu einfach alle Befehle mit einem Doppelpunkt : trennen. Eine BASIC-Zeile darf dabei aber nie länger als 80 Zeichen, also zwei Zeilen, werden!

Zum Schluß noch mal das komplette Listing:

10 PRINT “RETRO-PROGRAMMING “;
15 POKE 646,RND(1)*16
16 POKE 53280,RND(1)*16 : POKE 53281,RND(1)*16
20 GOTO 10

Wer möchte, kann das Programm nun speichern.

Speichern

Legt dazu eine formatierte Diskette ins Floppy-Laufwerk ein.

Im Emulator könnt ihr bei Bedarf einfach eine leere – formatierte Diskette erzeugen.
Verwendet ihr WinVICE, dann klickt auf den Menüpunkt „Datei -> Disk Image einlegen -> Laufwerk 8“ oder drückt einfach Alt+8.

Menüpunkt auswählen

Es öffnet sich ein neues Fenster…

D64-Image erzeugen und einlegen.

Wechselt im oberen Bereich (1) in das gewünschte PC-Verzeichnis z. B. „C:\C64\Basic“. Gebt dann einen Windows-Dateinamen (2) ein z. B. „Retro-Programming-BASIC.d64“. Weiter unten gibt es den Bereich „Neue Image Datei“. Unter Name (3) gebt ihr den C64-Namen für die Diskette ein z. B. „basic programme“. Klickt danach zunächst auf „Image Datei erzeugen“ (4) (es tut sich anscheinend erstmal nichts, aber die .d64-Datei wurde erzeugt und erscheint auch nach einige Sekunden im oberen Bereich). Wenn ihr jetzt die neue Datei oben (5) markiert, dann seht ihr unten links (6), deren Inhalt. Aktuell ist die Diskette leer, aber ihr könnt den von euch eingegebenen C64-Diskettennamen erkennen. Klickt abschließend auf „Einlegen“ (7) und schon befindet sich die leere Diskette im virtuellen Laufwerk 8.

Jetzt könnt ihr eure Arbeit mit SAVE “BEISPIEL1“,8 speichern. Ob das Speichern geklappt hat, kontrolliert ihr mit LOAD “$“,8 und anschließendem LIST. Achtung: Dadurch wird das BASIC-Programm überschrieben und wir sehen nur noch den Inhalt der Diskette.

Disketteninhalt

Mir fallen noch zwei Besonderheiten ein:

  1. Man muss keine Leerzeichen eingeben.
    Ihr könntet z. B. 10PRINTRND(1) schreiben. Die 10 und das PRINT werden nachträglich zwar getrennt. Der Rest klebt aber weiterhin aneinander. Probiert es aus und kontrolliert meine Behauptung dann mit einem LIST.
    Dass dies nicht sonderlich übersichtlich ist, sollte jedem klar sein und wer so programmiert, viel Spass bei der Fehlersuche.
    Es gibt in meinen Augen nur einen Grund für diese Schreibweise, der aber äußerst selten auftreten sollte: Speichersplatz ist knapp beim C64! Wie nach jedem Einschalten angezeigt wird (s. Bild), stehen von den 64KB RAM, die der C64 besitzt, nur 38911 Bytes für BASIC-Programme zur Verfügung. Da jedes Leerzeichen Speicherplatz kostet, kann man durch einen Verzicht darauf, etwas Platz für weitere Befehle gewinnen.
  2. Für Tippfaule gibt es die Möglichkeit Befehle abzukürzen, meist indem man den ersten Buchstaben eingibt und den zweiten dann mit SHIFT+Buchstabe aufruft. LOAD lässt sich also auch durch drücken von L gefolgt von SHIFT+O, eingeben. Auf dem Bildschirm sieht das dann so aus L. Eine Ausnahme bildet PRINT, der Befehl lässt sich durch ein einfaches Fragezeichen ? abkürzen. Gebt ihr so Programmzeilen ein, erscheinen die Befehle nach einem LIST wieder ausgeschrieben. Dies liegt daran, dass z. B. intern weder PRINT noch GOTO gespeichert werden, sondern nur ein sog. Token (ein einfacher Byte-Wert).
Laden

Gebt nun NEW ein und schaut anschließend mit LIST nach, ob wirklich nichts mehr angezeigt wird. Alternativ könnt ihr den C64 auch aus und wieder anschalten, bzw. wenn vorhanden, den Reset-Knopf drücken (ALT+R bei WinVICE). Um das Programm erneut zu starten gebt LOAD “BEISPIEL1“,8 ein. Sobald es geladen wurde, könnt ihr euch mit LIST davon überzeugen, dass das Programm wieder da ist und es mit RUN erneut starten.

Das Programm wurde erfolgreich geladen.

Wenn ihr das Programm laufen lasst, könnt ihr schon eines der Probleme von BASIC erkennen. Es ist unsäglich langsam. Man kann ja förmlich zusehen, wie der Text auf dem Bildschirm erscheint. Aber die bereits erwähnten und noch kommenden Speicherstellen (siehe POKE), werden im Assembler-Teil wiederkehren, daher war nicht alles vergebens.

VICE Snapshot

Im Emulator gibt es noch eine weitere Möglichkeit, seinen Fortschritt zu speichern. Der Emulator kann einen sog. Snapshot erzeugen. Dabei wird der aktuelle Zustand des Emulators in einer Datei gespeichert. Wenn ihr den Snapshot wieder ladet, findet ihr den emulierten C64 so vor, wie ihr ihn verlassen habt. Allerdings benötigt ein Snapshot etwas mehr Festplattenspeicher und das Format unterliegt keinem Standard. Ein Disketten-Image, z. B. *.d64 könnt ihr mit jedem Emulator öffnen, den Snapshot nur mit dem, der diesen erstellt hat.

Nun, zugegeben was wir bisher gemacht haben war nicht sonderlich spektakulär, aber es schafft die Basis für eins der Highlights des C64…


Schrott!!Naja...Geht so...Ganz gut...SUPER! (22 Bewertungen | Ø 4,95 von 5 | 99,09%)

Loading...


ZurückWeiter

7 Gedanken zu „Das erste Programm“

  1. “Es gibt in meinen Augen nur einen Grund für diese Schreibweise”

    Speicher, ja. Aber der wohl wichtigste Grund ist, dass der Interpreter den Quellcode schneller liest. Man SOLLTE sogar BASIC ohne Leerzeichen programmieren, wenn man auf Geschwindigkeit wert legt. Da BASIC eh arschlangsam ist, macht das also durchaus Sinn.

  2. Erstmal: Ich liebe diese Website! Vielen Dank für Dein Enthusiasmus.

    Bei den Abkürzungen der Basic-Befehle hat sich ein Fehler eingeschlichen.
    Beim Load-Befehl sollte ein ‘Winkel’-Symbol erscheinen, kein Fragezeichen.

  3. Man sollte hierbei vielleicht darauf aufmerksam machen, dass eine Überschreibung einer bestehende Datei mit dem “Save” Befehl nicht möglich ist. Hat mich gerade eine 3/4 Std. meines Lebens gekostet.

    1. Schon wahr, aber zwischen 0 und 1 (die ja nie vorkommen), liegen bekanntlich noch eine ganze Menge weiterer Zahlen.
      Du solltest also evtl. die obige Erklärung des RND()-Befehls nochmal lesen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Protected by WP Anti Spam