Info
Sammeln
Dokumentation
Anleitungen
Schnittstellen
Prozessoren
Videochips
Soundchips
Computer
Videospiele


Commodore Basic V2 (C-64, VC-20, PET), Teil 1
Commodore Basic V2
(CBM PET, VC-20, C-64)
Erstellt 1997 von Boris Jakubaschk, korrigiert und erweitert 2002 von Franz Kottira. (Vielen Dank!)

1. Einleitung


Basic ist eine sehr simple, dafür aber auch leicht erlernbare Programmiersprache. Im Gegensatz zu fast allen moderneren Sprachen ist Basic eine Interpretersprache. Das heißt, daß ein Programm, ein Programmteil oder auch nur ein einzelner Befehl jederzeit ausprobiert werden kann. Das Ergebnis kann sofort begutachtet werden.

So kann man Basic schon nach wenigen Minuten als Taschenrechner einsetzen, während andere Sprachen zuerst eine aufwendige Einarbeitung in Editor, Compiler und Entwicklungsumgebung voraussetzen.

Dadurch ist die Abarbeitungsgeschwindigkeit fertiger Basicprogramme aber auch nicht mit der von C- oder gar Assemblerprogrammen vergleichbar.

Die Homecomputer von Commodore sind allesamt mit einem Microsoft-Basic ausgestattet. Allerdings in sehr unterschiedlichen Ausbaustufen. Die einfachste Version findet sich im PET, im VC-20 und im C-64. Dieses Basic V2 enthält nur die notwendigsten Befehle und unterstützt weder Grafik noch Sound. Der einzige wirkliche Lichtblick ist der recht komfortable und intuitiv verstehbare Bildschirmeditor.


2. Befehlsmodus


Der einfachste Einstieg in den Umgang mit Basic ist der Befehlsmodus (=Direktmodus). Er ist bei fast jedem Homecomputer direkt nach dem Einschalten verfügbar. Sie tippen einen Befehl ein, drücken am Ende die Eingabetaste und schon wird der Befehl ausgeführt.

In der Praxis wird der Befehlsmodus hauptsächlich für zwei Aufgaben genutzt: Erstens können Programme vom Befehlsmodus aus von einem Speichergerät geladen bzw. auf einem Speichergerät abgelegt werden, zweitens ist der Befehlsmodus ein sehr schöner Taschenrechner.


2.1 Laden und Speichern von Programmen


An allen Commodore-Computern lassen sich sowohl Datenrecorder als auch Diskettenlaufwerke anschließen. In Basic V2 werden beide gleich angesteuert - die Unterscheidung des Geräts erfolgt durch die Geräteadresse.


LOAD

LOAD ["<Programmname>"[,<Gerätenummer>[,1]]]


LOAD alleine lädt das erstbeste Programm von der Datasette. Wird ein Dateiname angegeben, muß das von der Datasette eingespielte Programm genau diesen Namen haben. Die Datasette hat die Gerätenummer 1, die aber auch weggelassen werden darf. Der Zugriff auf die Floppy erfolgt über die Angabe der an der Floppy eingestellten Geräteadresse. Standardmäßig ist diese 8, kann aber auch auf 9, 10 oder 11 umgeschaltet werden.

Wird an die Gerätenummer noch die Sekundäradresse ",1" angehängt, wird das Programm in einen im Programmkopf angegebenen Speicherbereich geladen. Dies ist vor allem bei Maschinenspracheprogrammen notwendig. Beispiele:

LOAD "GAME",8 lädt ein Programm von der Floppy mit Gerätenummer 8, das nachher mit RUN gestartet werden muß.
LOAD "LOADER",8,1 lädt ein Maschinenprogramm, das in den meisten Fällen gleich selbst startet. Bei unbekannten Programmen müssen Sie eben beide Methoden probieren.

Wird von einer Doppelfloppy geladen, so wird der angegebene Programmname auf beiden eingelegten Disketten gesucht, es sei denn, Sie haben im Programmnamen durch ein vorangestelltes "0:" oder "1:" eines der beiden Laufwerke ausgewählt.


SAVE

SAVE ["<Programmname>"[,<Gerätenummer>]]


SAVE speichert das im Arbeitsspeicher befindliche Programm auf Kassette oder Diskette ab. Für die Gerätenummern gilt das beim LOAD-Befehl gesagte.


VERIFY

VERIFY ["<Programmname>"[,<Gerätenummer>[,1]]]


VERIFY prüft ein zuvor gespeichertes Programm auf Identität mit dem im Arbeitsspeicher befindlichen. Abgesehen davon, daß nicht geladen, sondern verglichen wird, funktioniert der Befehl wie LOAD.


2.2 Kommandos im Befehlsmodus


RUN

RUN [<Zeilennummer>]


RUN alleine führt das im Arbeitsspeicher befindliche Programm ab dem Programmanfang aus. Wird eine Zeilennummer angegeben, startet das Programm bei dieser Zeilennummer. Ein laufendes Basicprogramm kann mit der STOP-Taste unterbrochen werden.


LIST

LIST [<Zeilennummer>][-[<Zeilennummer]]


Um das Programm im Arbeitsspeicher oder einen Teil davon zu betrachten, benötigen Sie den LIST-Befehl. Für sich alleine zeigt er das ganze Programm an. Es kann aber auch eine einzelne Zeilennummer, ein Zeilennummernbereich (<von>-<bis>) oder alles bis zu einer bestimmten Zeilennummer (-<bis>) oder alles ab einer bestimmten Zeilennummer (<von>-) angezeigt werden.

Der Befehl
LIST 240-
zeigt also alle Befehlszeilen ab 240 bis zum Programmende an. Wenn Sie noch nicht wissen, was eine Zeilennummer ist - keine Bange, im Kapitel "Programmieren" erfahren Sie's.


NEW

NEW


NEW löscht das im Arbeitsspeicher befindliche Programm. Anschließend steht also wieder der gesamte Hauptspeicher zur Verfügung.


CLR

CLR


CLR löscht alle Variablen, aber nicht das im Arbeitsspeicher befindliche Programm. Bei RUN wird automatisch auch ein CLR ausgeführt.


CONT

CONT


Mit CONT können Sie ein abgebrochenes Programm fortsetzen.


2.3 Basic als Taschenrechner


Wenn der Computer etwas ausrechnen soll, brauchen Sie nur ein Fragezeichen, gefolgt von einem Leerzeichen und der Rechenaufgabe einzutippen und danach die Eingabetaste zu drücken. Das Ergebnis erscheint sofort auf dem Bildschirm.

Sie tippen ein:
? (23-7)*3
Der Computer antwortet mit: 48


Sie sehen, daß in Basic die normale mathematische Notation funktioniert. Ein paar Besonderheiten sollten Sie aber wissen:

- Als Multiplikationszeichen wird der Stern (*) verwendet. - Für Divisionen geben Sie den Schrägstrich (/) an. - Falls Sie keine Klammern angeben gilt "Punkt vor Strich".

Basic beherrscht die meisten mathematischen Funktionen, die auch auf einem besseren Taschenrechner zu finden sind. Dazu aber mehr im Kapitel "Arithmetik".


3. Programmieren


Der Befehlsmodus ist recht nützlich für einfache Rechenaufgaben - mit Basic-Programmierung hat seine Verwendung aber noch nichts zu tun.

Ein Programm ist eine Abfolge von Befehlen, die durch den Basicinterpreter abgearbeitet werden. Die Befehle stehen dabei in sogenannten Befehlszeilen, wobei jede Zeile normalerweise nur einen Befehl enthält. Die Reihenfolge, in der die Befehlszeilen abgearbeitet werden, wird durch Zeilennummern am Zeilenanfang bestimmt. Das Programm startet bei der kleinsten Zeilennummer und endet bei der größten. Die Nummern müssen nicht fortlaufend sein, es empfiehlt sich sogar, ein Programm zunächst z.B. in Zehnerschritten zu numerieren, um später Zeilen einfügen zu können.


3.1 Eingeben eines Programmes


Wenn Sie im Befehlsmodus eine Zeile mit einer Zeilennummer am Anfang eingeben, wird diese nicht sofort ausgeführt sondern gemäß ihrer Zeilennummer an der richtigen Stelle in das im Speicher befindliche Programm eingefügt. Ist der Speicher leer, wird das Programm mit der Eingabe der ersten Programmzeile angelegt.

Existiert bereits eine Zeile mit der Nummer der neu eingegebenen Zeile, so wird die alte kommentarlos durch die neue Zeile ersetzt. Die Eingabe einer Zeilennummer solo löscht eine bereits vorhandene Zeile mit dieser Nummer.

Für die Beispiele in diesem und den folgenden Kapiteln sollen drei einfache Basicbefehle schon an dieser Stelle vorgestellt werden. Sie werden in einem späteren Kapitel noch detailliert besprochen. Den ersten haben Sie schon kennengelernt: Das Fragezeichen im Direktmodus ist eigentlich die Abkürzung eines Basicbefehls, der ausgeschrieben "PRINT" heißt und für Bildschirmausgaben zuständig ist.

Eingaben des Benutzers kann ein Basicprogramm mit dem Befehl "INPUT" anfordern und der Befehl "LET" wird verwendet, um einer Variablen einen Wert zuzuweisen.

Am besten verstehen Sie diese drei Befehle anhand Ihres ersten Basicprogramms:

100 INPUT "GEBEN SIE EINE ZAHL EIN"; A
110 LET B=A*A
120 PRINT "DAS QUADRAT VON "; A; " IST "; B


Die erste Zeile (Nummer 100) veranlasst den Computer, den Text "GEBEN SIE EINE ZAHL EIN" gefolgt von einem Fragezeichen und einem Eingabecursor auszugeben. Nun wartet der Computer auf die Eingabe einer Zahl. Diese wird dann in der Variablen "A" gespeichert.

In der zweiten Zeile (Nummer 110) wird einer neuen Variable "B" der Wert "A*A" zugewiesen. "B" enthält nun also den Wert von "A" im quadrat.

Die dritte Zeile schließlich gibt den Text "DAS QUADRAT VON ", den Wert der Variable "A", den Text " IST " und den Wert der Variable "B" nacheinander aus. Das Semikolon als Trennzeichen bewirkt, daß die Texte und Variableninhalte nahtlos aneinandergehängt werden.

Wenn Sie das Programm mit "RUN" ausführen, passiert auf dem Bildschirm zunächst folgendes:

GEBEN SIE EINE ZAHL EIN? _


Nun wartet der Computer auf Ihre Eingabe. Geben Sie nun z.B. eine 5 ein und drücken Sie dann die Eingabetaste. Folgendes steht nun auf dem Bildschirm:

GEBEN SIE EINE ZAHL EIN? 5
DAS QUADRAT VON 5 IST 25


3.2 Editieren eines Programms


Der Bildschirmeditor von Basic V2 ist ausgesprochen unkompliziert: Alles, was an Programmzeilen auf dem Bildschirm steht - egal ob es direkt zuvor eingetippt worden ist oder mit dem LIST-Befehl angezeigt wurde - kann mit den Pfeiltasten angesteuert, bearbeitet und mit der Eingabetaste erneut abgeschickt werden.

Wer einmal mit diesem Editor gearbeitet hat, fragt sich wieso andere Hersteller so furchtbar komplizierte und gleichzeitig undurchsichtige Basiceditoren gebaut haben...



Selten wird ein Programm auf Anhieb funktionieren. In manchen Fällen werden Sie Fehlermeldungen erhalten, die Ihnen einen Hinweis auf das Problem geben. In anderen Fällen produziert das Programm falsche Resultate, und sie müssen sich auf die Spurensuche begeben.

STOP

STOP unterbricht die Programmausführung. Der Unterschied zum END-Befehl besteht darin, daß ein per STOP beendetes Programm durch Eingabe von CONT im Direktmodus in der Folgezeile fortgesetzt werden kann und daß beim Abbruch die Bildschirmmeldung "BREAK IN <zeilennummer>" erscheint.

Somit sollte die Anwendung des STOP-Befehls auf die Fehlersuche und den Test von Programmen beschränkt bleiben.

Die Vorgehensweise ist dabei ganz einfach: In jenem Programmteil, das den Fehler mutmaßlich verursacht streuen Sie an geeigneten Stellen STOP-Befehle ein. Immer wenn das Programm nun abbricht, können Sie im Direktmodus Variablenwerte abfragen und so prüfen, ob alle Variablen die erwarteten Inhalte haben. Wenn ja, setzen Sie das Programm bis zur nächsten STOP-Stelle fort (mit CONT). Wenn nein, wird sich der Fehler wahrscheinlich zwischen dem aktuellen und dem vorhergehenden STOP-Befehl eingeschlichen haben.


REM

REM <Kommentartext>


REM leitet einen Kommentartext ein. EIne Zeile, die mit dem REM-Befehl beginnt, wird vom Basicinterpreter ignoriert. Dies gibt Ihnen die Möglichkeit, Ihr Programm mit Erklärungen auszustatten, die Ihnen oder anderen hilft, das Programm zu verstehen. Ein gutes Programm hat am Anfang ein paar REM-Zeilen, in denen der Sinn und Zweck des Programms erklärt wird. Ebenso stehen erklärende Kommentare am Anfang jedes Unterprogramms und überall dort, wo das Programm erklärungsbedürftig ist. Je nach Komplexität des Programms sollte sich der Anteil an REM-Zeilen zwischen 5% und 20% bewegen.


4. Programmstruktur


Im letzten Kapitel wurde ausgeführt, daß ein Programm immer in der Reihenfolge aufsteigender Zeilennummern ausgeführt wird. Das trifft aber nur für sehr einfache Programme zu, die z.B. beim Start ein paar Informationen abfragen und daraus irgendetwas berechnen.

Die meisten Programme erfordern jedoch ein deutlich komplexeres Verhalten. Oft muß ein Programm aufgrund vorgegebener Bedingungen unterschiedlich reagieren, d.h. verschiedene Programmteile abarbeiten. Dies wird als "bedingte Verzweigung" bezeichnet.

Eine andere Form der Strukturierung sind Schleifen, also die mehrfache Abarbeitung eines Programmteils bis zur Erfüllung einer Bedingung.

Eine letzte Variante bei den Strukturbefehlen ermöglicht die Nutzung von Unterprogrammen. Diese können dann jederzeit und von mehreren Stellen des Hauptprogramms aus aufgerufen werden.

Doch eins nach dem anderen:


4.1 Verzweigungen


Im folgenden wird immer wieder von Bedingungen die Rede sein. Sie sollten daher wissen, wie eine Bedingung aussieht. Basic verfügt für Bedingungen über ein großes Repertoir an Vergleichsoperatoren:

> größer < kleiner = gleich >= größer oder gleich <= kleiner oder gleich <> ungleich

Diese funktionieren nicht nur mit Zahlen sondern auch mit Zeichenketten, wobei hier "größer" gleichbedeutend ist mit "steht weiter hinten im Lexikon".

Mehrere Vergleiche können mit den logischen Operatoren "AND", "OR" und "NOT" verknüpft werden. Die Hierarchie der Vergleiche wird im Bedarfsfall mit Klammern festgelegt.

Am besten verstehen Sie die Möglichkeiten auch hier mit Hilfe einiger Beispiele:

A>=5
...ist wahr, wenn der Wert der Variable A größer oder gleich 5 ist.

"Klaus"<"Peter"
...ist wahr, weil "Klaus" lexikalisch vor "Peter" kommt

( A>=5 AND A<=10 ) OR B=1
...ist wahr, wenn A zwischen 5 und 10 liegt oder B gleich 1 ist.


GOTO / GO TO

GOTO <Zeilennummer>


Die einfachste Verzweigungsanweisung ist der GOTO-Befehl. Wenn die Programmabarbeitung auf einen GOTO-Befehl stößt, wird das Programm in der angegebenen Zeile fortgesetzt, ohne wenn und aber.

Bei gutem Programmierstil sollte der Einsatz des GOTO-Befehls auf den Ausgleich der Defizite bei anderen Strukturbefehlen in einfachen Basicdialekten beschränkt bleiben (siehe die Beispiele bei IF / THEN und ON GOTO). Wildes Herumspringen im Programm macht es sehr unübersichtlich - dem Basicinterpreter macht das nichts aus, aber der Autor des Programms wird sich nach ein paar Wochen in seinem eigenen Werk nicht mehr zurechtfinden.

GOTO kann alternativ auch GO TO geschrieben werden.


IF / THEN

IF <Bedingung> THEN <Anweisung>


Trifft die nach IF genannte Bedingung zu, wird die Anweisung nach THEN ausgeführt, andernfalls läuft das Programm in der nächsten Zeile (also ganz normal) weiter.

Hinter dem THEN kann jede beliebige Anweisung stehen. Am wichtigsten ist aber die Verzweigung GOTO, denn sie erlaubt es, das Programm abhängig von der Bedingung an der einen oder anderen Stelle fortzusetzen. Dabei kann auf das Schreiben von GOTO verzichtet werden, der Interpreter erkennt anhand der Zeilennummer, daß er an dieser Stelle einen Sprung durchführen soll, wenn die Bedingung zutrifft.


IF <Bedingung> THEN <Zeilennummer>


Das folgende Programm berechnet die Quadratwurzel der eingegeben Zahl. Ist die Zahl kleiner als Null, erscheint eine Warnung und das Programm ermöglicht einen neuen Versuch, eine Zahl einzugeben:

100 INPUT "GEBEN SIE EINE POSITIVE ZAHL EIN"; A
110 IF A>=0 THEN 140
120 PRINT "DIE ZAHL "; A; "IST NEGATIV!"
130 GOTO 100
140 PRINT "DIE WURZEL VON "; A; " IST "; SQR( A )


ON / GOTO

ON <Ausdruck> GOTO <Zeilennummer>[, <Zeilennummer][...]


Mit ON / GOTO können Sie eine Mehrfachverzweigung realisieren. Der Ausdruck wird ausgewertet. Ist das Ergebnis gleich eins, wird zur ersten Zeilennummer der Liste hinter dem GOTO-Befehl gesprungen. Ist das Ergebnis zwei, erfolgt der Sprung zur zweiten der in der Liste aufgeführten Zeilennummern und so weiter.

Das folgende Beispiel zeigt ein einfaches Menü. Sie treffen Ihre Auswahl durch Eingabe einer Nummer:

100 PRINT "WAS MÖCHTEN SIE BESTELLEN?"
110 PRINT "1. ETWAS ZU TRINKEN"
120 PRINT "2. EIN HAUPTGERICHT"
130 PRINT "3. EINEN NACHTISCH"
140 INPUT "GEBEN SIE EINE NUMMER EIN"; A
150 ON A GOTO 200, 300, 400
200 PRINT "SIE BEKOMMEN EINE HALBE BIER"
210 GOTO 500
300 PRINT "SIE BEKOMMEN EINE SCHWEINSHAXE MIT SAUERKRAUT"
310 GOTO 500
400 PRINT "SIE BEKOMMEN NOCH EINE HALBE BIER"
500 PRINT "WOHL BEKOMM'S"


4.2 Schleifen


FOR / TO / NEXT / STEP

FOR <Variable>=<Ausdruck> TO <Ausdruck> [STEP <Ausdruck>]
...
NEXT <Variable>


Bei einer Schleife werden ein oder mehrere Befehle mehrfach ausgeführt. Diese Befehlsgruppe wird eingerahmt durch einen Schleifenbefehl am Anfang und einen am Ende. Bei der FOR/NEXT-Schleife handelt es sich um eine Zählschleife, d.h. bereits der Schleifenbefehl am Anfang legt die Zahl der Schleifendurchläufe fest. Dazu wird einer Variablen das Ergebnis eines Ausdrucks zugewiesen. Diese Variable wird dann mit jedem Durchlauf der Schleife um den hinter "STEP" angegeben Wert erhöht. Fehlt die Angabe von "STEP", wird um eins erhöht.

Die Schleife endet mit dem Erreichen des Wertes, der hinter "TO" angegeben ist.

Zwei Beispiele:

1. Der Computer soll die 7er-Reihe aufsagen:

100 FOR I=7 to 70 STEP 7
110 PRINT I
120 NEXT I


In der ersten Zeile wird der Variablen "I" zunächst der Wert 7 zugewiesen. Dieser wird in der zweiten Zeile dann auf dem Bildschirm ausgegeben. Die dritte Zeile veranlasst, daß "I" um die Schrittweite 7 erhöht wird und prüft, ob der Endwert 70 bereits erreicht ist. Da dem nicht so ist, wird die Schleife erneut durchlaufen und so der neue Wert von "I", also 14, ausgegeben. Das wird nun so fortgesetzt, bis "I" nach der Erhöhung um 7 den Wert 77 annimmt. Der Endwert 70 ist nun überschritten und die Schleife endet.

2. Der Computer soll das gesamte kleine Einmaleins anzeigen:

100 FOR A=1 TO 10
110 FOR B=1 TO 10
120 PRINT A*B;
130 NEXT B
140 PRINT
150 NEXT A


Jetzt wird klar, warum beim NEXT-Befehl nochmal der Variablenname steht: Er macht klar, welcher NEXT-Befehl zu welchem FOR-Befehl gehört. (Fehlt die Variablenangabe beim NEXT, nimmt der Computer an, daß es sich um die Variable der zuletzt geöffneten Schleife handelt.)

Das Programm beginnt in Zeile 100 mit der Zuweisung des Werts 1 an die Variable "A". In Zeile 110 erhält "B" ebenfalls den Wert 1. Zeile 120 gibt nun den Wert von 1*1 auf dem Bildschirm aus. Das Semikolon am Zeilenende bewirkt, daß die nächste Ausgabe mit PRINT in der gleichen Zeile angehängt wird. In der folgenden Zeile (130) wird nun "B" um eins erhöht, mit dem Endwert 10 verglichen und das Programm in Zeile 120 fortgesetzt. Nun erscheint das Ergebnis von 1*2 auf dem Bildschirm. Dies wiederholt sich nun solange, bis die Schleife mit einem Wert von 10 in der Variable "B" durchlaufen wurde. Nun ist der Endwert erreicht und das Programm geht mit Zeile 140 weiter. Diese macht keine Ausgabe, sondern veranlaßt, daß der nächste PRINT-Befehl seine Ausgabe in einer neuen Bildschirmzeile beginnt. Nun wird in Zeile 150 der Wert von "A" um eins erhöht, mit dem Endwert für "A" verglichen und das Programm in Zeile 110 fortgesetzt. Dort erhält "B" wieder den Wert 1 und die innere Schleife (Zeilen 110 - 130) läuft wieder von 1 bis 10 und gibt dabei die Zeierreihe auf dem Bildschirm aus. Das Spiel wiederholt sich solange, bis auch "A" den Endwert erreicht hat und das geamte kleine Einmaleins auf dem Bildschirm steht.


4.3 Unterprogramme


GOSUB / RETURN

GOSUB <Zeilennummer>
RETURN


Der Befehl "GOSUB" springt zunächst genauso wie "GOTO" einfach zu der angegebenen Zeilennummer und setzt das Programm dort fort. Der Basicinterpreter merkt sich aber, welche Zeile auf die mit dem GOSUB-Befehl folgt. Falls das Programm nun auf einen "RETURN"-Befehl stößt, wird die Programmausführung in der gemerkten Zeile fortgesetzt.

Als Beispiel soll ein Unterprogramm dienen, das einen Text nacheinander zeichenweise auf den Bildschirm schreibt. Machen Sie sich nichts daraus, wenn Sie die folgenden Zeilen noch nicht ganz verstehen - es genügt für's erste zu wissen, daß sie den Inhalt der Stringvariablen "A$" zeichenweise auf den Bildschirm schreiben. Eine Stringvariable ist eine Variable, die Text enthalten kann.

1000 FOR I=1 TO LEN(A$)
1010 PRINT MID$(A$,I,1);
1020 NEXT I
1030 RETURN


Dieses Unterprogramm für sich auszuführen macht keinen Sinn: Erstens hat A$ noch keinen Inhalt, es wird also auch nichts auf den Bildschirm geschrieben. Zweitens würde der Basicinterpreter in Zeile 1030 auf den RETURN-Befehl stoßen, ohne daß er zuvor bei einem GOSUB vorbeigekommen wäre. Das Programm würde daher mit einer Fehlermeldung abbrechen.

Wir benötigen daher noch ein Hauptprogramm, das unser Unterprogramm nutzt. Es kann es nicht nur einmal, sondern beliebig oft und von verschiedenen Stellen aus aufrufen:

100 A$="ACHTUNG! ACHTUNG! HIER SPRICHT DEIN COMPUTER!"
110 GOSUB 1000
120 PRINT
130 A$="IN MEINEM SPEICHER HAT SICH EIN BIT VERKLEMMT."
140 GOSUB 1000
150 PRINT
160 A$="BITTE DREH MICH UM UND KLOPF MIR AUF DEN RUECKEN!"
170 GOSUB 1000
180 PRINT
190 END


Zeile 190 enthält einen weiteren neuen Befehl:


END

END führt dazu, daß das Programm an dieser Stelle beendet wird. Es gilt als ordentlicher Programmierstil, alle Unterprogramme am Ende des Programmes (d.h. bei den hohen Zeilennummern) unterzubringen. Das davorstehende Hauptprogramm endet dann mit dem END-Befehl, andernfalls wird zuletzt das erste Unterprogramm nach dem Hauptprogramm ausgeführt und der Basicinterpreter scheitert am RETURN-Befehl, der dieses Unterprogramm abschließt.


ON / GOSUB / RETURN

ON <Ausdruck> GOSUB <Zeilennummer>[, <Zeilennummer>][...]
...
RETURN


ON / GOSUB funktioniert genauso wie ON / GOTO, allerdings wird nicht einfach zu eine der in der Liste angegebenen Zeilennummern gesprungen, sondern an der angesprungenen Zeilennummer wird ein Unterprogramm erwartet, das dann irgendwann mit "RETURN" zu der auf den ON/GOSUB-Befehl folgenden Zeile zurückkehrt.