Subroutinen erlauben es, einen relativ dynamischen Programmfluss zu erzeugen. Man könnte es mit den Funktionen, die man in anderen Programmiersprachen schreibt vergleichen.
Grundsätzliche Syntax
100 GOSUB 1000
110 PRINT"ZURUEK AUS 1000"
120 END
1000 PRINT"ICH BIN EIN UNTERPROGRAMM"
1010 RETURN
Die grundsätzliche Syntax sieht so aus:
Du schreibst z.B. eine Subroutine ab Zeile 1000.
Am Ende deiner Subroutine muss ein RETURN stehen. Basic merkt sich, aus welcher Zeile die Subroutine aufgerufen wurde und kehr beim Auftauchen von RETURN wieder dorthin zurück.
Aufgerufen wird eine Subroutine mit GOSUB
1000 REM ----- PLUS -----
1001 REM -----------------
1010 INPUT"WERT 1";A
1020 INPUT"WERT 2";B
1030 PRINT A;"+";B;"=";A+B
1040 RETURN
1050 :
2000 REM ----- MINUS -----
2001 REM -----------------
2010 INPUT"WERT 1";A
2020 INPUT"WERT 2";B
2030 PRINT A;"-";B;"=";A-B
2040 RETURN
Hier z.B. zwei Subroutinen. Die eine ab Zeile 1000 erfragt zwei Werte und addiert sie.
Die andere ab Zeile 2000 erfragt zwei Werte und subtrahiert sie.
Natürlich gibt es, genauso wie es bei GOTO auch ON … GOTO gibt, bei GOSUB auch ON … GOSUB. Das Prinzip ist genau das gleiche.
10 INPUT"AUSWAHL";M
20 ON M GOSUB 100,200,300,400
25 IF M<1 OR M>4 THEN END
30 GOTO 10
100 PRINT"MENU 1 AUFGERUFEN"
110 RETURN
200 PRINT"MENU 1 AUFGERUFEN"
210 RETURN
300 PRINT"MENU 1 AUFGERUFEN"
310 RETURN
400 PRINT"MENU 1 AUFGERUFEN"
410 RETURN
Je nachdem ob 1, 2, 3 oder 4 eingegeben wird, führt ON M GOSUB ... die jeweiligen Sprünge in die Subroutinen, die hinter GOSUB angegeben und mit Komma getrennt sind, aus.
Es ist lediglich darauf zu achten, dass nach dieser Zeile, bevor mit GOTO 10 wieder zurück gesprungen wird, eine Abbruchbedingung für nicht gültige Werte eingegeben wird. Ansonsten lässt sich das Programm nur schwer wieder beenden. Auch nicht mit RUN STOP
Außerdem ist es sehr wichtig, dass für jedes RETURN ein vorangegangenes GOSUB existiert, denn sonst weiß der C64 nicht, wohin er zurückspringen soll und beendet das Programm mit einer Fehlermeldung.?RETURN WITHOUT GOSUB ERROR IN ...