Der Commodore128 war der Nachfolger des legendären C64 und wurde ab 1985 zunächst als reiner Tastaturcomputer gebaut, ab 1986 auch mit eingebauten Diskettenlaufwerk 1571 als C128D/DCR. Der C128D gleicht optisch eher einem Desktop-PC der 1990er Jahre. Er war im Vergleich zu seinem Vorgänger sehr vielseitig und konnte sowohl im C64-, als auch im nativen C128- und im CP/M-Modus betrieben werden. Eins seiner herausstechenden Features ist sein 40/80-Zeichen-Modus für die Bildschirmdarstellung.
Im C128-Modus verfügt der Commodore 128 über das für seine Zeit sehr mächtige CBM BASIC 7.0, mit dem schon damals fast prozedurale, strukturierte Programmierung möglich war.
Neben dem Commodore Amiga ist der Commodore 128 meine zweite, gerne benutzte Plattform fürs Retro-Programmieren. Hier findest du in loser Sammlung Tipps und Tricks rund um diese tolle Maschine.
CBM BASIC 7.0
Der FAST-Modus
Mit der FAST-Anweisung wird der C128 in den 2 MHz-Modus versetzt. Er arbeitet dann schneller, allerdings kann dann nur der 80-Zeichen-Bildschirmmodus genutzt werden. Um wieder beide Bildschirm-Modi nutzen zu können, verwendet man die SLOW-Anweisung – die schaltet den Rechner zurück in den 1 MHz-Modus.
5 SCNCLR 10 PRINT "SCHALTE IN DEN 2 MHZ MODUS..." 20 FAST 30 PRINT "DER 40-ZEICHEN-MODUS KANN NUN NICHT MEHR BENUTZT WERDEN" 40 PRINT "WEITER MIT BELIEBIGER TASTE" 50 GET A$ : IF A$ = "" THEN GOTO 50 60 PRINT "SCHALTE WIEDER IN DEN 1 MHZ MODUS..." 70 SLOW 80 PRINT "DER 40-ZEICHEN-MODUS KANN WIEDER BENUTZT WERDEN" 90 PRINT "ENDE MIT BELIEBIGER TASTE" 100 GET A$ : IF A$ = "" THEN GOTO 100 110 END
Groß-/Kleinschreibung umschalten und sperren
Das Umschalten zwischen dem 1. Zeichensatz (nur Großschreibung) und dem 2. Zeichensatz (Groß-/Kleinschreibung) funktioniert am Einfachsten per Übergabe der jeweiligen ASCII-Steuercodes mittels dem PRINT-Befehl. Um ein versehentliches Umschalten per Tastatur zu unterbinden, sollte nach dem Umschalten auf Zeichensatz 2 die Umschalttaste vorübergehend gesperrt werden.
- Groß-/Kleinschreibung: CHR$(14)
- Großschreibung: CHR$(142)
- Umschalttaste sperren: CHR$(8)
- Umschalttaste entsperren: CHR$(9)
5 REM -- UMSCHALTEN AUF GROSS-/KLEINSCHREIBUNG -- 10 SCNCLR 20 PRINT "NUR GROSSBUCHSTABEN:" 30 PRINT "Aa Bb Cc Dd Ee Ff Gg" : PRINT 40 PRINT "UMSCHALTEN ZU KLEINBUCHSTABEN: TASTE" : PRINT 50 GET A$:IF A$ = "" THEN GOTO 50 60 PRINT CHR$(14) : REM KLEINSCHREIBUNG 65 PRINT CHR$(8) : REM UMSCHALTUNG SPERREN 70 PRINT : PRINT "Gross-/Kleinbuchstaben:" 80 PRINT "Aa Bb Cc Dd Ee Ff Gg" : PRINT 90 PRINT "Programm beenden: TASTE" : PRINT 100 GET A$:IF A$ = "" THEN GOTO 100 110 PRINT CHR$(142) : REM GROSSCHREIBUNG 120 PRINT CHR$(9) : REM UMSCHALTUNG ENTSPERREN 130 END
Bildschirm löschen ohne SCNCLR
Wenn man Programme schreibt, die kompatibel zum BASIC 2.0 des Commodore 64 sein sollen, dann kann der SCNCLR-Befehl nicht verwendet werden. Auch hier kann man sich sich aber per Übergabe des zugehörigen ASCII-Steuercodes (147) mittels dem PRINT-Befehl behelfen:
10 PRINT CHR$(147):REM BILDSCHIRM LOESCHEN OHNE SCNCLR 20 PRINT "ICH BIN EIN BEDEUTUNGSLOSER TEXT." 30 END
INPUT ohne Fragezeichen
Manchmal stört das Fragezeichen nach einer INPUT-Anweisung das Auge – hier schafft eine POKE-Anweisung Abhilfe:
- Fragezeichen abschalten: POKE 21, 1
- Fragezeichen anschalten: POKE 21, 0
Allerdings gilt es bei der Verwendung darauf zu achten, dass mit dem Abschalten des Fragezeichens auch kein Zeilenvorschub nach der INPUT-Anweisung mehr erfolgt! Um einen Zeilenvorschub zu erzwingen, ist ein zusätzlicher PRINT-Befehl erforderlich:
10 PRINT CHR$(147):REM BILDSCHIRM LOESCHEN OHNE SCNCLR 20 PRINT "INPUT OHNE FRAGEZEICHEN":PRINT 30 POKE 21,1:REM FRAGEZEICHEN AUS 40 INPUT "DEIN NACHNAME: ";N$:PRINT:REM EXTRA ZEILENVORSCHUB 50 INPUT "DEIN VORNAME: ";V$:PRINT:REM EXTRA ZEILENVORSCHUB 60 POKE 21,0:REM FRAGEZEICHEN AN 70 PRINT "SOSO, DU BIST ALSO "; 80 PRINT V$;" ";N$;"...":REM NAME AUSGEBEN 90 END
Benutzereingabe ohne <ENTER>
Üblicherweise verwenden wir in BASIC den INPUT-Befehl, um eine Eingabe vom Benutzer anzufordern. Der Nachteil bei der Methode: Um die Eingabe abzuschließen, muss der Benutzer die <ENTER>-Taste drücken. Wenn man nur ein einzelnes Zeichen von der Tastatur abfragen möchte, dann stellt der GET-Befehl eine zwar etwas aufwendigere, aber praktikable Alternative zur Eingabe per INPUT dar, bei der das Drücken von <ENTER> überflüssig ist.
Der GET-Befehl holt ein einzelnes Zeichen von Tastatur und legt es in einem String ab. Dieser 1-Zeichen-String kann dann nach Bedarf weiterverarbeitet werden. Damit das funktioniert, muss GET in einer Endlosschleife aufgerufen werden, die erst verlassen wird, wenn der Benutzer wirklich ein Zeichen eingegeben hat:
5 REM -- EINZELNES ZEICHEN EINLESEN MIT GET -- 10 SCNCLR 20 PRINT "GIB EIN ZEICHEN EIN: "; 30 GET Z$:IF Z$ = "" GOTO 30:REM ENDLOSSCHLEIFE 40 PRINT Z$ 50 PRINT "DER ASCII-CODE VON ";Z$;" IST";ASC(Z$) 60 PRINT "DER NUMMERISCHE WERT IST ";VAL(Z$) 70 PRINT:PRINT "WEITERE EINGABE (J/N)" 80 REM --- WEITERE EINGABE GEWUENSCHT? --- 90 GET A$:IF A$ = "" GOTO 90 100 IF A$="J" GOTO 10:REM ZURUECK ZUM ANFANG 110 END
Eine kürzere Alternative zu GET ist der GETKEY-Befehl – auch er holt ein einzelnes Zeichen von Tastatur, legt es in einem String ab und verzichtet auf die <ENTER>-Taste:
5 REM -- EINZELNES ZEICHEN EINLESEN MIT GETKEY -- 10 SCNCLR 20 PRINT "GIB EIN ZEICHEN EIN: "; 30 GETKEY Z$:REM ZEICHEN EINLESEN 40 PRINT Z$ 50 PRINT "DER ASCII-CODE VON ";Z$;" IST";ASC(Z$) 60 PRINT "DER NUMMERISCHE WERT IST ";VAL(Z$) 70 PRINT:PRINT "WEITERE EINGABE (J/N)" 80 REM --- WEITERE EINGABE GEWUENSCHT? --- 90 GETKEY A$ 100 IF A$="J" GOTO 10:REM ZURUECK ZUM ANFANG 110 END
Auswahl-Menü mit ON … GOSUB
BASIC-Programme auf 8-Bit-Computern der 70er und 80er Jahre verfügten (wenn man von GEOS einmal absieht) noch nicht über hübsche Pulldown-Menus zur benutzerfeundlichen Auswahl von Optionen. Um unter BASIC 7.0 ein solches Auswahlmenü zu implementieren, bedient man sich eines ON … GOSUB-Konstrukts. Dabei springt das Programm in Abhängigkeit zum gewählten Menüeintrag in ein Unterprogramm. Dieses erledigt die ihm zugeordneten Aufgaben und kehrt danach an die aufrufenden Stelle im Programm zurück. Die Sprungadresse wird per Zeilennummer übergeben:
10 PRINT CHR$(147):REM SCNCLR 20 PRINT "============================" 30 PRINT " COMMODORE 128 AUSWAHLMENUE":PRINT 40 PRINT " (1) OPTION 1 (2) OPTION 2" 50 PRINT " (3) OPTION 3 (4) OPTION 4" 60 PRINT " (5) PROGRAMM BEENDEN" 70 PRINT "============================" 80 PRINT "DEINE WAHL: "; 90 REM 100 REM --- AUSWAHL ABFRAGEN --- 110 GET W$:IF W$="" GOTO 110 120 ON VAL(W$) GOSUB 300, 400, 500, 600, 700:REM UNTERPROGRAMME 130 GOTO 10:REM MENUE IN ENDLOSSCHLEIFE 140 END:REM PROGRAMM ENDET HIER 150 REM 300 REM --- OPTION 1 --- 310 PRINT "OPTION 1":PRINT 320 PRINT "WEITER: TASTE" 330 GOSUB 800 340 RETURN 350 REM 400 REM --- OPTION 2 --- 410 PRINT "OPTION 2":PRINT 420 PRINT "WEITER: TASTE" 430 GOSUB 800 440 RETURN 450 REM 500 REM --- OPTION 3 --- 510 PRINT "OPTION 3":PRINT 520 PRINT "WEITER: TASTE" 530 GOSUB 800 540 RETURN 550 REM 600 REM --- OPTION 4 --- 610 PRINT "OPTION 4":PRINT 620 PRINT "WEITER: TASTE" 630 GOSUB 800 640 RETURN 650 REM 700 REM --- PROGRAMMENDE --- 710 PRINT "PROGRAMM BEENDEN":PRINT 711 PRINT "WIRKLICH? (J/N)?" 712 GET Q$:IF Q$="" GOTO 712 713 IF Q$="J" THEN END:REM PROGRAMM BEENDEN 740 RETURN 750 REM 800 REM --- TASTENDRUCK ABFRAGEN --- 810 GET A$:IF A$="" GOTO 800 820 RETURN
Rand- und Arbeitsbereich, farbiger und invertierter Text
Ein hervorstechendes Merkmal des C128 ist seine grafische Programmierbarkeit. Er kann bis zu 16 verschiedene Farben gleichzeitig erzeugen. Beim Thema „Farben“ muss man beim Commodore 128 etwas weiter ausholen: Grundsätzlich besitzt der 128er zwei unterschiedliche Bildschirm-Betriebsarten, nämlich den 40-Zeichen- und den 80-Zeichen-Modus. Für beide Modi kann ein eigener Monitor angeschlossen werden:
- 40-Zeichen: Anschluss per S-VIDEO (Audio/Video Buchse)
oder
Anschluss per RF-Kabel (TV) - 80-Zeichen: Anschluss per RGBi Kabel
Außerdem besitzt er noch 5 verschiedene grafische Modi und kann 8 verschiedene bewegliche Objekte, genannt Sprites, verwalten.
Folgende grafische Modi sind wählbar:
0 | Text mit 40 Zeichen/Zeile. (VIC, Ausgabe auf dem 40-Zeichen-Monitor) |
1 | hochauflösende Grafik (320×200 Punkte) (VIC, Ausgabe auf dem 40-Zeichen-Monitor) |
2 | hochauflösende Grafik, geteilter Bildschirm für Grafik und Text (VIC, Ausgabe auf dem 40-Zeichen-Monitor) |
3 | Mehrfarbengrafik (160×200 Punkte) (VIC, Ausgabe auf dem 40-Zeichen-Monitor) |
4 | Mehrfarbengrafik, geteilter Bildschirm für Grafik und Text. (VIC, Ausgabe auf dem 40-Zeichen-Monitor) |
5 | Text mit 80 Zeichen/Zeile (VDC, Ausgabe auf dem 80-Zeichen-Monitor). |
Diese Modi werden mit dem GRAPHIC-Befehl angewählt:
- GRAPHIC 0 – 40-Zeichen Text-Modus auf dem 40-Zeichen-Monitor (16 Farben)
- GRAPHIC 1 – hochauflösende Grafik (320×200 Pixel) auf dem 40-Zeichen Monitor, 2 Farben (monochrom, Vordergrund-/Hintergrundfarbe)
- GRAPHIC 2 – hochauflösende Grafik, geteilter Bildschirm für Grafik und Text auf dem 40-Zeichen-Monitor, (monochrom, Vordergrund-/Hintergrundfarbe)
- GRAPHIC 3 – Mehrfarbengrafik (160×200 Pixel, 4 Farben) auf dem 40-Zeichen-Monitor
- GRAPHIC 4 – Mehrfarbengrafik, (4 Farben) geteilter Bildschirm für Grafik und Text auf dem 40-Zeichen-Monitor
- GRAPHIC 5 – 80-Zeichen Text-Modus auf dem 80-Zeichen-Monitor (16 Farben)
Der vollständige Syntax des GRAPHIC-Befehls lautet:
GRAPHIC Modus[,[Löschbyte],[Textzeile]]
- Modus: siehe oben
- Löschbyte: 1 = Bildschirm löschen, 0 = nicht löschen.
- Textzeile: Dieser Parameter gibt für die Modi mit geteiltem Bildschirm die Anzahl an Zeilen, die für Text reserviert werden sollen, an. Für die übrigen Modi ist er wirkungslos und nicht erforderlich.
Rand-, Hintergrund- und Textfarbe verändern:
Die jeweils zugewiesene Farbe wird für die Text-Modi mit dem COLOR-Befehl gesetzt.Der Syntax lautet:
COLOR Farbquelle, Farbmodus
Der zu verwendende Farbcode ist dabei davon abhängig, ob es sich um den 40- oder den 80-Zeichen-Modus handelt. Die Farbquelle beschreibt den Teil des Bildschirm, den du farblich verändern willst. Farbcode ist die Zahl, mit der du die Farbe bei der gewählten Farbquelle bestimmst (siehe Tabellen unten):
Farbquelle | |
Code | Quelle |
0 1 2 3 4 5 6 | Hintergrund (40-Zeichen-Anzeige) Vordergrund Mehrfarbenmodus 1 Mehrfarbenmodus 2 Rand Textfarbe Hintergrund (80-Zeichen-Anzeige) |
Farbmodus | ||||
Code | Farbe | Code | Farbe | |
1 2 3 4 5 6 7 8 | schwarz weiß rot türkis violett grün blau gelb |
| orange braun hellrot dunkelgrau grau hellgrün hellblau hellgrau |
Um z.B. den Hintergrund im 80-Zeichen-Textmodus auf „hellblau“ und die Textfarbe auf „weiß“ zu setzen, gibst du die folgenden COLOR-Befehle ein:
GRAPHIC 5:REM 80 ZEICHEN TEXT COLOR 6, 15:REM HINTERGRUND COLOR 5,2:REM TEXTFARBE WEISS
Das folgende Programm schaltet zunächst auf den 40-Zeichen-Text-Bildschirm, verändert dort die Rand-, Hintergrund- und Textfarbe, gibt dann ein paar Texte aus, schaltet danach in den 80-Zeichen-Textbildschirm, verändert dort die Farben für Hintergrund und Text und listet im Anschluss den Quellcode zum Programm auf:
10 GRAPHIC 0,1:REM 40 ZEICHEN, LOESCHEN 20 COLOR 4,16:REM RAND HELLGRAU 30 COLOR 0,12:REM HINTERGRUND DUNKELGRAU 40 COLOR 5,2:REM TEXTFARBE 50 PRINT:PRINT:PRINT:PRINT 60 PRINT " 40-ZEICHEN-MODUS" 70 PRINT " RAHMEN : HELLGRAU" 80 PRINT " HINTERGRUND: DUNKELGRAU" 90 PRINT " TEXTFARBE : WEISS" 100 GRAPHIC 5:REM 80 ZEICHEN 110 SCNCLR 120 COLOR 6,15:REM 80Z HINTERGRUND HELLBLAU 130 COLOR 5,2:REM 80Z TEXT WEISS 140 LIST 150 END
Texte invers darstellen
Um Zeichen oder Zeichenketten invers darzustellen, verwendet man zwei POKE-Anweisung mit den folgende Parameter:
- POKE 243,1 – inverse Darstellung AN
- POKE 243,0 – inverse Darstellung AUS
Beispiel:
5 REM -- INVERS AN/AUS -- 10 SCNCLR 20 PRINT "ICH BIN EIN NORMALER TEXT" 30 POKE 243,1:REM INVERS AN 40 PRINT "...UND ICH BIN INVERS!" 50 POKE 243,0:REM INVERS AUS 60 PRINT:PRINT "TSCHUESS!" 70 END