Top-Fragen
Zeitleiste
Chat
Kontext

Commodore Basic V2

Im System verankertes Betriebsprogramm Aus Wikipedia, der freien Enzyklopädie

Commodore Basic V2
Remove ads

Commodore BASIC V2 ist der auf dem Commodore 64 (C64) sowie dem Commodore VC 20 (VC20) primär eingesetzte BASIC-Dialekt. Beim C64 ist ein BASIC-V2-Interpreter fest im ROM enthalten und dient gleichzeitig als Benutzerschnittstelle; diese wird durch einen ebenfalls im ROM enthaltenen Bildschirm-Editor bereitgestellt – Kommandos können auf dem gesamten Bildschirm stehen (bleiben) und (auch nach Modifikation) wiederholt ausgeführt werden (also keine bloße Kommandozeile, sondern eine flächige Zeichenorientierte Benutzerschnittstelle). Als Eingabe akzeptiert der Editor die Angabe einer Programmzeile, was anhand einer vorangestellten Zeilennummer erkannt wird (die Zeile wird dann abgespeichert, aber noch nicht ausgeführt) oder – ohne Zeilennummer – die Angabe eines Befehls oder Systemkommandos (zum Beispiel RUN, LOAD, SYS, PRINT) oder einer durch Doppelpunkte separierten Folge davon (auch innerhalb einer Schleife), was direkt ausgeführt wird.

Thumb
Screenshot des Commodore BASIC V2 auf dem C64

BASIC V2 basiert auf Microsoft BASIC und wurde für den C64 angepasst.

Remove ads

Zeilen-Orientierung

Zusammenfassung
Kontext

BASIC V2 arbeitet zeilennummernorientiert, das heißt jeder Zeile muss eine Nummer vorangestellt werden, die auch als Parameter für Sprunganweisungen dient, sowie als Bezug bei Fehlermeldungen. Durch Änderung der Nummer einer Zeile wird diese unter Verwendung der neuen Nummer dupliziert. Das Löschen einer Zeile erfolgt ohne Rückfrage durch Eingabe der entsprechenden Zeilennummer und Drücken der Return-Taste.

Es ist üblich, Zeilennummern im Abstand von 10 (oder höher) zu vergeben; sollen dann später Zeilen eingefügt werden, können die verbleibenden Zahlen zwischen zwei Zeilennummern verwendet werden. Einen Befehl zur Neunummerierung gab es in dieser BASIC-Implementierung nicht.

In jeder Zeile können beliebig viele Befehle stehen, welche durch Doppelpunkte getrennt werden. Eine Programmzeile darf jedoch im Prinzip nicht länger als 255 Zeichen sein; in der Praxis begrenzt der Editor die Länge auf zwei Bildschirmzeilen (80 Zeichen). Der BASIC-Interpreter benötigt keinerlei Leer- oder sonstige Formatierungszeichen.

Strukturierung zur besseren Lesbarkeit ist möglich durch Leerzeichen zwischen Schlüsselwörtern und beliebiges Einrücken der Zeilen nach einem Doppelpunkt am Zeilenanfang.

Remove ads

Befehle

Zusammenfassung
Kontext

Bei den Befehlen wird nicht zwischen Groß- und Kleinschreibung unterschieden, wie es z.B. bei den Programmiersprachen C, Java oder C# üblich ist.

Neben den üblichen Ein- und Ausgabebefehlen (PRINT, INPUT) kann mittels GET der Wert eines einzelnen Tastendrucks ausgelesen werden.

Zur Verzweigung innerhalb eines Programms unterstützt BASIC V2 die Sprunganweisungen GOTO, GOSUB/RETURN sowie die bedingten Sprunganweisungen ON GOTO, ON GOSUB und IF ... THEN (statt einer Befehlsfolge kann hier auch ein Sprungziel folgen). Außerdem kann mit SYS direkt in ein Maschinenspracheprogramm eingesprungen werden. Die Funktion USR(x) ruft ein Maschinenspracheprogramm als Funktion auf und erhält von diesem einen Rückgabewert.

Als weitergehende Sprachelemente zur strukturierten Programmierung stehen lediglich Zählschleifen (FOR NEXT) zur Verfügung, die jedoch flexibel ausgestaltet sind (die Iterator-Variable ist nicht auf Ganzzahlen beschränkt und deren Änderung im Schleifenkörper ist gestattet).

Nicht enthalten sind Befehle zur komfortablen Erstellung von Sound, HiRes-Grafiken und Sprites: So ist z.B. selbst das Ändern der Textfarbe nicht einfach möglich. Zum direkten Zugriff auf die Hardware (Speicher und in den Adressraum eingeblendete Prozessor-Register) werden der Befehl POKE und die Funktion PEEK(x) bereitgestellt; so lassen sich dann jedoch wieder Sound- und Grafikprozessor (inklusive Sprites) programmieren, wenn auch nicht trivial und nicht in kompakter Form.

Auf dem C64 wurden jedoch von früheren Commodore-Geräten vielseitige Grafikzeichen (PETSCII) übernommen, die sich mit der entsprechend bedruckten Tastatur eingeben lassen. Hierdurch lassen sich auch grafische Effekte in BASIC-Programmen erstellen, wenn auch eingeschränkt.

Einfache Variablen müssen vor ihrer Verwendung nicht deklariert werden, der Variablentyp wird über deren Suffix definiert („$“ für Zeichenketten (Strings), „%“ für Ganzzahlen, ohne Suffix für Fließkommazahlen). Bei indizierten Variablen (Feldern, Arrays) ist jedoch eine Dimensionierung mit DIM erforderlich, sofern mehr als 11 Elemente (Indizes 0–10) pro Dimension verwendet werden sollen. Komplexere Variablentypen sind nicht implementiert.

Zur Übertragung von Daten von und zu Peripheriegeräten stehen besondere Varianten der Ein- und Ausgabebefehle zur Verfügung (PRINT#, INPUT#, GET#). Dazu kommen OPEN, CLOSE und CMD zur Ansteuerung von Drucker, Datasette und Floppy.

Eine Besonderheit stellen Abkürzungen für die Befehle dar. Statt PRINT konnte auch nur kurz ? geschrieben werden. Dies konnte zur Lesbarkeit und zum Sparen von Speicherplatz beitragen.

Remove ads

Technische Aspekte

Zusammenfassung
Kontext

Der Quelltext des momentanen BASIC-Programms (also nicht des BASIC-Interpreters selbst!) steht im Arbeitsspeicher in den Bereichen $0800 bis $9FFF als verkettete Liste. Dies geht mit den auf dem Start-Bildschirm gemeldeten 38611 Bytes einher. Jedes Listenelement besteht dabei aus dem Zeiger (engl. Pointer) zur Adresse des nächsten Listenelements, der Zeilennummer und dem (null-terminierten) Zeileninhalt. Für die letzte Zeile ist der Wert des Zeigers auf das nächste Element 0. Der Programmstart und Einstiegspunkt für den Interpreter ist dabei stets $0801.

BASIC-Programme werden mit dem Befehl LOAD ohne den Parameter ,1 geladen: Damit wird bewirkt, dass der Datei-Inhalt in einen Bereich beginnend mit der Speicherstelle $0801 geladen wird. Mit diesem Parameter hingegen wird der Inhalt der Datei an einen Bereich beginnend mit der Speicherstelle geladen, der durch die ersten beiden Bytes in der Datei definiert ist. Das Programm muss dann durch den Befehl SYS mit der Angabe dieser Speicherstelle gestartet werden. Der unbedarfte Anwender kennt diese Möglichkeit nicht und müsste diese Speicherstelle kennen, wofür er Dokumentation oder Fachwissen benötigt. Aus diesem Grund werden meist auch Maschinensprache-Programme an die Speicherstelle $0801 geladen mit einem in BASIC implementierten Start-Programm, welches den entsprechenden Befehlt SYS aufruft („BASIC-Header“)

Die eigentlichen BASIC-Befehle werden dabei im Speicher nicht im Klartext gespeichert, sondern als Bytes mit besonderem Wert („BASIC-Tokens“ durch „Magical Numbers“). Dies ist nicht mit der erwähnten Kurzform zu verwechseln, die ebenfalls auf diese „BASIC-Tokens“ abgebildet werden.

Das ROM des BASIC-Interpreters selbst wird in RAM-Bereiche zwischen $A000 und $BFFF gespiegelt und dort ausgeführt. Dieses Einblenden kann jedoch über den Speicherkontroller (PLA) gesteuert werden. Jeder BASIC-Befehl geht mit einem eigenen (Unter-)Programm in diesem Bereich einher, das an seiner jeweils eigenen Speicheradresse lag. Der BASIC-Interpreter analysiert, welcher Befehl nun vorliegt und verzweigt dann in die entsprechende Einsprung-Adresse des jeweiligen Befehls. Es ist sogar möglich, aus eigenen Maschinencode-Programmen heraus entsprechende Implementierungen einzelner BASIC-Befehle zu nutzen. Dies wird sogar gern für Gleitkomma-Arithmetik genutzt, die sonst hätte selbst implementiert werden müssen, da der Prozessor des Systems (MOS 6510) diese nicht unterstützte.

Der BASIC-Interpreter des C64 beinhaltet auch diverse Fehler (engl. Bugs), die nie von Commodore oder Microsoft behoben wurden. Die Kombination spezieller Befehle bewirkte sogar ein dauerhaftes Einfrieren des Systems, welches nur durch einen Neustart behoben werden konnte.

Die Implementierung des BASIC-Interpreters bedingt auch, dass Variablennamen immer mit einem Buchstaben anfangen müssen.

Wenn auch über BASIC angesprochen, ist dennoch eine Unterscheidung von den Befehlen des Diskettenlaufwerks zu unterscheiden. Letztere werden vom Diskettenlaufwerk eigenständig ausgeführt und nicht vom BASIC-Interpreter. Die dort auszuführenden Befehle werden dabei als Parameter des Befehls PRINT übergeben, z.B. PRINT# 15,"RO:FILE2=FILE1" für das Umbenennen einer Datei. Fehler im dortigen Befehlssatz wurden anders als im BASIC selbst mehrfach durch Commodore behoben. Zu beachten ist dabei allerdings, dass seinerzeit Aktualisierungen der Firmware für den normalen Anwender schwierig, zeitaufwändig, fehlerträchtig und teuer waren, sich Aktualisierungen also damals nicht auf die Bestandsgeräte verbreiteten. Deshalb wird um schwerwiegende (auch historische) Fehler auf BASIC-Ebene herum programmiert: Bei Veränderungen einer Datei wird stattdessen eine neue Datei gespeichert und dann umbenannt, weil das einfache Aktualisieren in manchen Software-Versionen die Datei zerstören kann.

Schwierig ist auch die grafische Ausgabe auf Druckern (in den 1980er Jahren in Deutschland meist „Hardcopy“ genannt). Der Befehl PRINT kann auf triviale Weise nur übliche Zeichen wie Zahlen oder lateinische Buchstaben und Satzzeichen ausgeben; schon deutsche Umlaute sind dadurch herausfordernd. Für Grafik muss sogar auf Ebene des BASIC-Programms der entsprechende Drucker in seiner Ansteuerungssprache angesprochen werden (z.B. ESC/P für Modelle des Herstellers Epson und damit kompatible Geräte). Da sich Anfang der 1980er Jahre immer noch verschiedene Ansteuerungssprachen etablierten, bedeutete dies damals, dass entsprechende Ausgabe dann an einem anderen Drucker-Modell eventuell nicht möglich war. Ferner geht diese Ausgabe einher mit der eigenen Implementierung von z.B. Rastering-Funktionen für das Drucken von Linien. Auch Wissen darüber war seinerzeit nicht so einfach und schnell wie heute im Internet verfügbar, und manche Algorithmen waren teilweise erst kurz vor Einführung des Geräts erfunden wurden (z.B. die Methode von Horn) und noch nicht bei Entwicklern verbreitet oder bekannt.

Remove ads

Einordnung

Zusammenfassung
Kontext

Die Geschwindigkeit der BASIC-Programme ist durch den Interpretations-Ansatz prinzipbedingt langsam. Als Software von Drittherstellern gibt es deshalb auch Compiler, die BASIC-Programme in Maschinensprache umsetzten, was für erheblich mehr Geschwindigkeit sorgte.

Die fehlenden, ineffizienten und langsamen Möglichkeiten für Sound und Grafik verlängern weiterhin den Programmtext und erschweren dessen Erstellung und dessen Verständnis. Für IT-Anfänger, für die BASIC ja gedacht ist, ist diese Programmierung weiterhin nicht trivial, da hier viel Kenntnis über die Gegebenheiten des Systems und dessen Funktionsweise vonnöten ist.

Erst in BASIC V3.5 der nachfolgenden Plus-4-Reihe wurde beispielsweise Unterstützung für Sound und Grafik angeboten. Allerdings gib es für den Commodore 64 Erweiterungen wie Simon's Basic, welche Sound und Grafik mit unterstützen. Die damit erzeugten Programme sind allerdings nicht portabel, da entsprechende Erweiterung auch bei der Ausführung auf einem anderen Commodore 64 benötigt wurde.

Die fehlende Möglichkeiten zur Neunummerierung macht auch die Erweiterung von Programmen anspruchsvoll: Zeilennummern in 10-er Sprüngen sind üblich. Hierdurch kann man neun Zeilen bei Bedarf später dazwischen einordnen. Werden jedoch mehr benötigt, muss mit Befehlen wie GOTO oder GOSUB gearbeitet werden. Resultat ist, dass die Logik über den kompletten Quellcode verteilt ist (salopp „Spaghetti-Code“ genannt). Größere Vorhaben wurden hierdurch schnell sehr übersichtlich und schlecht wartbar und erweiterbar. Eine manuelle Neunummerierung ist zwar möglich, ist aber zeitaufwändig und fehleranfällig. Auch mangelndes Wissen über gute Praktiken in der Programmierung führte (insbes. von Neueinsteigern) dazu, dass BASIC-Programme schnell unübersichtlich und unstrukturiert wurden.

Die erwähnten Einschränkungen und Herausforderungen (insbes. die mangelnde Geschwindigkeit des BASIC-Interpreters) und die Schwierigkeit für alles was über die reine Algorithmik und Basis-Ausgaben hinausgeht, macht die Erstellung von Programmen, die schnell laufen und eine ansprechende Darstellung haben, also sehr schwierig. Professionelle, komplexe und hochqualitative Software ist deshalb nur sehr schwer bis faktisch unmöglich zu realisieren. So gut wie jede Software (Spiele, Anwendungssoftware) wurde und wird darum in Maschinensprache ausgeliefert und meist auch erstellt.

Anfang der 1980er Jahre wurde manchmal auch ein damals sogenannter „List-Schutz“ für BASIC-Programme implementiert, insbesondere von Hobby-Programmierern. Es ging hierbei darum, das Anzeigen des Quelltextes durch den Befehl LIST zu unterbinden. Durch Ausnutzung von Fehlern in der BASIC-Implementierung oder durch Veränderung der erwähnten zugehörigen aufzurufenden Einsprung-Adresse dieses Befehls wurde Entsprechendes realisiert. Retrospektiv betrachtet zeigt sich aber, dass entsprechende Ansätze leicht zu umgehen waren und somit keinerlei effektiven Schutz bewirkten.

Der Interpreter ist Turing-vollständig. Das BASIC V2, welches ja mit dem Computer ausgeliefert, automatisch und schnell gestartet wurde und nicht separat gekauft werden musste, brachte damit dennoch alles mit, um als Anfänger einen Einstieg in die Prinzipien der Programmierung machen zu können. Für viele Schüler dieser Zeit, die mit dem Gerät nicht nur spielen wollten, war dies der Einstieg in die Programmierung und für einige wegweisend in der beruflichen Laufbahn.

Remove ads

Codebeispiel

 10 input "Geben Sie bitte Ihren Namen ein"; a$
 20 print "Guten Tag "; a$
 30 input "Wie viele Sterne möchten Sie?"; s
 40 for i = 1 to s
 50 s$ = s$ + "*"
 55 next i
 60 print s$
 70 input "Möchten Sie noch mehr Sterne?"; q$
 80 if len(q$) = 0 goto 70
 90 l$ = left$(q$, 1)
 100 if (l$ = "J") or (l$ = "j") then goto 30
 110 print "Auf Wiedersehen";
 120 for i = 1 to 200
 130 print a$; " ";
 140 next i
 150 print
Remove ads
Zusammenfassung
Kontext
Remove ads
Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads