Commodore 128D PC

Tipps und Tricks zum Commodore 128

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:

0Text mit 40 Zeichen/Zeile. (VIC, Ausgabe auf dem 40-Zeichen-Monitor)
1hochauflösende Grafik (320×200 Punkte) (VIC, Ausgabe auf dem 40-Zeichen-Monitor)
2hochauflösende Grafik, geteilter Bildschirm für Grafik und Text (VIC, Ausgabe auf dem 40-Zeichen-Monitor)
3Mehrfarbengrafik (160×200 Punkte) (VIC, Ausgabe auf dem 40-Zeichen-Monitor)
4Mehrfarbengrafik, geteilter Bildschirm für Grafik und Text. (VIC, Ausgabe auf dem 40-Zeichen-Monitor)
5Text 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
CodeQuelle
0
1
2
3
4
5
6
Hintergrund (40-Zeichen-Anzeige)
Vordergrund
Mehrfarbenmodus 1
Mehrfarbenmodus 2
Rand
Textfarbe
Hintergrund (80-Zeichen-Anzeige)
Farbmodus
CodeFarbeCodeFarbe
1
2
3
4
5
6
7
8
schwarz
weiß
rot
türkis
violett
grün
blau
gelb
9
10
11
12
13
14
15
16
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