Erstellt: 23. Dezember 2012 (zuletzt geändert: 2. Januar 2025)

Das erste Programm

…damit ist nicht die ARD gemeint

Falls noch nicht geschehen, startet jetzt bitte euren C64 bzw. einen entsprechenden 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 Zeilennummern 10 und 20 benutzt haben. Durch diese „weiß“ der C64, dass er die Befehle nicht direkt ausführen soll, sondern dass diese Teil eines Programmes sind. Bei der Vergabe der Zeilennummern hat es sich als klug erwiesen, dass man diese in 10er (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, wie z. B. Simon‘s BASIC. Ihr könnt übrigens nur Zeilennummern von 0 bis 63999 verwenden!

Gebt nun RUN ein, um das Programm zu starten und erfreut euch an diesem unglaublichen Programm.

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 keine Abbruchbedingung haben und somit 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 Zeilennummer einfach die neue Nummer und bestätigt dies mit RETURN. Um eine Zeile zu löschen geht in einen leeren Bereich gebt nur die Zeilennummer 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, wie die Erzeugung der Zufallszahlen geschehen soll.

    • < 0: Es wird immer die selbe Zufallszahl ermittelt. Dies kann zu Testzwecken sinnvoll sein.
    • = 0: Es wird der Timer des C64 als Ausgangswert für die nächste Zufallszahl genommen.
    • > 0: Die letzte Zufallszahl wird als Ausgangswerte für die nächste genommen.
      Welchen Wert ihr angebt ist irrelevant, solange dieser größer als 0 ist.

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 könnt ihr 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.

Achtung: Durch die folgenden Anweisungen wird das BASIC-Programm überschrieben!
Ob das Speichern geklappt hat, kontrolliert ihr mit LOAD “$“,8 und anschließendem LIST.

Disketteninhalt
Überschreiben von Dateien

Mit dem SAVE-Befehl könnt ihr theoretisch auch eine bereits vorhandene Datei überschreiben.

Ich verzichte hier allerdings aus folgendem Grund auf den konkreten Befehl…

Achtung – Vorsicht – Warnung: Besser nicht überschreiben!
I
n den meisten Floppys (oder besser gesagt, in deren ROMs) ist dies fehlerhaft implementiert!

Daher rate ich euch dringend davon ab, Dateien so zu überschreiben!
Es kann euch sonst passieren, dass zufällig gewählte Dateien auf der Diskette zerstört werden!!!

Legt besser jedes Mal eine Datei mit neuem Namen an!
So habt ihr auch immer eine Sicherheitskopie der letzten Programmversion, falls mal etwas schief geht.


Mir fallen abschließend 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 zwei Gründe, die für diese Schreibweise sprechen:

    1. Speichersplatz ist knapp beim C64!
      Wie nach jedem Einschalten angezeigt wird (s. Bild oben), 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. Wie Fritz in den Kommentaren richtig anmerkt, müssen auch Leerzeichen vom Interpreter verarbeitet werden. Somit erhöht jedes gesparte Zeichen die Ausführungsgeschwindigkeit. Dies ist zwar nur minimal, sollte aber in Anbetracht des extrem langsamen BASICs doch bedacht werden.

  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 (s. folgendes Bild). Dies liegt daran, dass intern z. B. weder PRINT noch GOTO gespeichert werden, sondern nur ein sog. Token (ein einfacher Byte-Wert).

    Eingabe mit abgekürzten Befehlen.
    Befehle abkürzen
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! (23 Bewertungen | Ø 4,78 von 5 | 95,65%)

Loading...


ZurückWeiter

8 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