Home- und Bürocomputer von Commodore

Einführung

Commodore war zuerst Reparaturwerkstatt, später dann Importeur und Lizenzhersteller von Schreibmaschinen. Auch elektromechanische Rechenmaschinen waren im Sortiment. Anfang der 70er Jahre kamen dann Taschenrechner hinzu, deren Innenleben jedoch von Texas Instruments stammte. 1975 kaufte Commodore den Halbleiter-Hersteller MOSTEK, welcher gerade seinen ersten Mikroprozessor fertiggestellt hatte, den damals sensationell günstigen 6502. Auf dieser Basis baute Commodore den PET, einen Heimcomputer, der alle Komponenten (Computer, Netzteil, Monitor, Tastatur und Kassettenlaufwerk) in einem Gehäuse vereinte.

Von diesem Urahn stammten alle späteren 8-Bit-Computer von Commodore ab - sowohl die Homecomputer VC-20, C-64 und seine Nachfolger als auch die Bürocomputer der 3000er, 4000er und 8000er Baureihe. Den Abschluss machten die nur noch wenig erfolgreichen CBM-II-Maschinen CBM 600 und 700.

Die Bürocomputer gab es mit einer Bildschirmdarstellung von 40 oder 80 Zeichen pro Zeile. Die Darstellung war monochrom und die Geräte waren nicht grafikfähig.

Commodore hat alle 8-Bit-Modelle, Home- wie Bürocomputer, mit einem Basic-Interpreter von Microsoft ausgestattet. Diesen gab es in verschiedenen Ausbaustufen. Das nahezu minimale „Basic V2“ gab es in den kleinen CBMs (PET, 3032) und den Homecomputern VC-20 und C-64. „Basic 4.0“ war mit deutlich komfortableren Diskettenbefehlen ausgestattet und in den größeren CBMs eingebaut (4032, 8032).

Sehr umfangreiche Basic-Interpreter gab es nur in den Homecomputern C-16 und plus/4 (Basic 3.5) und im C-128 (Basic 7.0). Diese Sprachen enthielten auch spezielle Befehle für Grafik und Sound.

Einschalten

Die Commodore-Computer brauchen nicht zu booten, sie benötigen nicht einmal ein Diskettenlaufwerk um zu starten. Direkt nach dem Einschalten erscheint in den ersten Bildschirmzeilen eine Einschaltmeldung, darunter steht „ready“ und in der darauffolgenden Zeile ein Cursor (Schreibmarke). Blinkend wartet er auf die Eingaben des Benutzers.

Hier zeigt sich eine Besonderheit, die die Commodore-Computer mit den meisten Basic-Computern verbindet: Man kann nun

  • anfangen, ein Programm zu schreiben. Man befindet sich also in einer Art Editor.
  • Basic-Befehle zur sofortigen Ausführung eingeben. Damit sind z.B. Berechnungen möglich.
  • Disketten-Befehle eingeben, mit denen man z.B. ein Programm in den Speicher laden kann.

Es gibt also keine klare Trennung zwischen Betriebssystembefehlen, Basicbefehlen und Programmierung.

Wenn man etwas über die Tastatur eintippt, so erscheint es am Bildschirm. Mit einem Druck auf die Eingabetaste („Return“) wird die aktuelle Zeile vom Computer verarbeitet. Tritt dabei ein Fehler auf, wird in der Folgezeile eine Fehlermeldung ausgegeben.

Alle Commodore-Computer haben Cursortasten, mit denen die Schreibmarke in alle vier Richtungen bewegt werden kann. Mit einer Löschtaste kann das Zeichen links des Cursors entfernt werden.

Direktmodus

Im Direktmodus kann man Basic-Befehle eintippen, die dann beim Druck auf die Eingabetaste sofort ausgeführt werden. Programmieren kann man so nicht, aber für kurze Berechnungen taugt der Direktmodus durchaus. Man kann sogar Variablen mit Werten belegen und mit diesen weiterrechnen.

Hier ein paar Beispiele:

print 7*9

erzeugt in der folgenden Zeile die Ausgabe „63“.

a=15
b=30
c=(a^2+b^2) - a*b
print c

erzeugt die Ausgabe „675“.

Diskettenbefehle

Hier ergeben sich die größten Unterschiede zwischen verschiedenen Computerherstellern, da der ursprüngliche Wortschatz von Basic nur simple Befehle zum Laden und Speichern enthielt. Alles weitere sind Ergänzungen, die sich die Hersteller ausgedacht haben und bei denen es fast keine Übereinstimmungen gibt. Bereits zwischen verschiedenen Versionen des Commodore-Basic gibt es hier gewaltige Unterschiede.

Um beispielsweise das Inhaltsverzeichnis einer Diskette anzuschauen, muss man in Basic V2 folgendes eintippen:

load “$“,8
list

Der erste Befehl lädt das Inhaltsverzeichnis als Pseudo-Programm in den Speicher. Dort kann es mit dem Befehl „list“ dann angezeigt werden. War zuvor bereits ein Programm im Speicher, so geht es verloren.

Basic 4.0 kennt einen speziellen Befehl hierfür. Es genügt die Eingabe von

catalog

Schon erscheint das Inhaltsverzeichnis, sogar ohne dass ein im Speicher liegendes Programm gelöscht wird.

Um ein Programm von Diskette zu laden verwendet man folgenden Befehl:

load „programmname“,8

Nun befindet sich das Programm im Speicher. Um es zu starten, gibt man „run“ ein.

Die Diskettenlaufwerke von Commodore sind mit einer Steuerplatine ausgestattet, auf der zwei 6502-Prozessoren sitzen. Anders gesagt: Das Diskettenlaufwerk hat doppelt so viel Rechenleistung wie der Computer, an dem es angeschlossen ist. Der eine Prozessor kümmert sich um die Ansteuerung der Laufwerke, der andere um die Kommunikation mit dem Computer.

Durch die Prozessorsteuerung sind die Diskettenlaufwerke sehr eigenständig. Ein DOS (Disk Operation System) ist in den Laufwerken eingebaut und daher benötigen die Computer im Gegensatz zu den meisten anderen Systemen keines mehr. Um eine Diskette zu formatieren oder in einem Doppellaufwerk eine Diskette zu kopieren muss man dem Laufwerk nur ein Kommando geben und den Rest erledigt dieses dann ganz alleine.

Um ein Kommando an das Laufwerk zu schicken, wird der Befehl

open 15,8,15,“Kommando“

verwendet. Nachdem das Laufwerk fertig ist, muss man den Befehl mit

close 15

wieder abschließen.

Das Kommando zum Formatieren einer Diskette lautet:

open 15,8,15,“N0:Diskettenname,ID“ close 15

Passiert bei der Arbeit mit dem Diskettenlaufwerk ein Fehler, z.B. weil keine Diskette eingelegt ist oder ein Fehler auf der Diskette vorliegt, beginnt eine Statusleuchte am Laufwerk zu blinken. Um herauszufinden, was genau das Problem ist, kann der Computer den sogenannten Fehlerkanal abfragen. In Basic 4.0 geht das sehr einfach mit dem Befehl

print ds$

Programmierung

Beginnt eine eingegebene Zeile mit einer Zahl, wird sie nicht ausgeführt, sondern als Programmzeile gespeichert. Die Zahl wird als Zeilennummer betrachtet und alle eingegebenen Zeilen nach ihren Zeilennummern aufsteigend sortiert. Um eine Zeile zu löschen, gibt man Ihre Nummer ein und drückt die Eingabetaste. Um eine Zeile zu ändern, tippt man sie einfach nochmals korrekt ein.

Das eingegebene Programm kann man sich mit dem Befehl

list 

anzeigen lassen. Dabei kann man auch angeben, welche Zeilennummer oder welchen Zeilennummernbereich man sehen möchte.

list 200      (zeigt Zeile 200)
list 200-300
  (zeigt Zeilen 200 bis 300)
list -1000
    (zeigt Programm von Anfang bis Zeile 1000)

Die Zeilennummern müssen nicht fortlaufend vergeben werden. Im Gegenteil: Da man die Zeilennummern nachträglich nicht mehr ändern kann, sollte man die Zeilen in größeren Schritten durchnummerieren. Nur so kann man noch nachträglich Zeilen einfügen.

Das fertige Programm kann man mit „RUN“ starten.

Ein einfaches Basicprogramm sieht beispielsweise so aus:

100 print „Quaderberechnungen“
110 input „Breite:“; b
120 input „Tiefe:“; t
130 input „Höhe:“; h
140 print „Der Quader hat eine Grundfläche von “; b*t
150 print „und ein Volumen von “; b*t*h
160 end

Das Programm kommt mit nur drei Befehlen aus:

„print“ schreibt Texte oder Zahlen auf den Bildschirm. Dabei werden Terme gleich ausgerechnet. Soll mit einer Programmzeile ein Text und eine Zahl ausgegeben werden, trennt man beides durch ein Semikolon.

„input“ schreibt einen Text auf den Bildschirm und wartet dann auf eine Eingabe. Diese wird dann in die angegebene Variable übergeben.

„end“ steht am Programmende. Der Befehl kann meist auch weggelassen werden, da ein Programm ohnehin beendet wird, wenn es die letzte Zeile erreicht.

Wir dieses Programm gestartet, passiert folgendes (Ausgaben des Computer fett geschrieben, Eingaben des Anwenders kursiv:

run
Quaderberechnungen
Breite:? 50
Tiefe:? 20
Höhe:? 15
Der Quader hat eine Grundfläche von 1000
und ein Volumen von 15000
ready.

In diesem einfachen Fall läuft das Programm einfach von der ersten bis zur letzten Programmzeile durch. Das muss aber nicht so sein. Basic kennt sogenannte Strukturbefehle, mit denen der Programmfluss verändert werden kann. Die wichtigsten sind:

if Bedingung then Zeilennummer
if Bedingung then Befehl
for Variable=Startwert to Endwert [...] next Variable
gosub Zeilennummer
goto Zeilennummer

Mit „if“ wird eine bedingte Verzweigung durchgeführt, d.h. wenn die Bedingung zutrifft wird entweder das Programm an der angegebenen Zeilennummer fortgesetzt oder der angegebene Befehl ausgeführt. Da Basic keine Blockbildung kennt, wird ein Programm rasch unübersichtlich.

Was in einer modernen Programmiersprache wie Java, PHP, Perl oder C so aussieht:

if( a>b ) {
  [Befehle, die ausgeführt werden, wenn die Bedingung zutrifft ...]
} else {
  [Befehle, die andernfalls ausgeführt werden...]
}
[hier geht das Programm weiter...]

wird in Basic zu einem ziemlichen Verhau:

1000 if a>b then 1100
1010 [Befehle, die ausgeführt werden, wenn die Bedingung nicht zutrifft ...]
1090 goto 1200
1100 [Befehle, die ausgeführt werden, wenn die Bedingung zutrifft ...]
1200 [hier geht das Programm weiter...]

Mit der Anweisung for [...] next wird eine sogenannte Schleife programmiert. Das heißt, dass der Programmcode zwischen „for“ und „next“ mehrfach ausgeführt wird.

Beispiel:

100 for x=1 to 10
110 for y=1 to 10
120 print x*y;
130 next y
140 print
150 next x
160 end

Dieses Programm enthält gleich zwei Schleifen. Die erste beginnt in Zeile 100 und endet in Zeile 150. Die Variable x erhält beim ersten Durchlauf der Zeilen 110 bis 140 den Wert 1, danach den Wert 2 und so weiter bis zum Wert 10. In jedem Durchlauf wird auch die Schleife ausgeführt, die in Zeile 110 beginnt und in Zeile 130 endet. In diesem Fall wird die Zeile 120 zehn mal ausgeführt. Zuerst mit dem Wert 1 in der Variable y, dann mit 2 und so weiter bis zum Wert 10.

Das Programm berechnet das kleine Einmaleins und zeigt es am Bildschirm an.

Mit dem Befehl gosub kann man ein Unterprogramm aufrufen. Das bedeutet, dass das Programm zunächst in der hinter gosub angegebenen Zeile fortgesetzt wird. Kommt nun der Befehl „return“, wird das Programm in der auf den gosub-Befehl folgenden Zeile fortgesetzt. Unterprogramme sind die Basic-Entsprechung der aus moderneren Sprachen bekannten Funktionen, allerdings ohne Parameterübergabe.

Der Befehl goto gilt als größte Sünde von Basic. Er sorgt dafür, dass das Programm an der angegebenen Zeilennummer fortgesetzt wird. Das ist in vielen Fällen notwendig, da Basic einige wichtige Strukturbefehle fehlen. Man kann mit goto aber auch völlig unstrukturierte Konstruktionen bauen, z.B. aus Schleifen oder Unterprogrammen herausspringen oder völlig wirren Programmcode fabrizieren. Was insbesondere ungeübte Programmierer mit Basic zustande brachten wurde früher häufig als „Spaghetticode“ bezeichnet.

Beispiel:

Was in einer modernen Sprache so aussieht:

 

while( a>b ) {
  [Programmzeilen, die ausgeführt werden, solange die Bedingung zutrifft]
}
[hier geht das Programm weiter...]

ist in Basic nur mit einem „goto“ zu lösen:

1000 if a<=b then 1100
1010 [Programmzeilen, die ausgeführt werden, solange die Bedingung zutrifft]
1090 goto 1000
1100 [hier geht das Programm weiter...]

Variablen, Operatoren und Funktionen

Im Gegensatz zu den meisten höheren Programmiersprachen muss man in Basic Variablen nicht deklarieren. Das heißt, dass man Variablen einfach verwenden kann. Beim ersten Auftauchen im Programm wird eine Variable automatisch mit dem Wert 0 vorbelegt. Einzige Ausnahme von dieser Regel sind Feldvariablen. Diese müssen vor der ersten Verwendung dimensioniert werden, d.h. es muss festgelegt werden, wie viele Elemente das Feld bekommen soll. Der Befehl zur Dimensionierung heißt „dim“. Um ein Feld für 50 Zahlenwerte in der Feldvariablen a zu dimensionieren muss folgender Befehl verwendet werden:

dim a(50)

Auf die Variablenwerte greift man durch Angabe des Feldindex in runden Klammern zu. Auf das sechste Element der Feldvariablen a wird also mit a(5) zugegriffen (die Indizes beginnen bei 0).

Es gibt drei Variablentypen, die sich durch ein Anhängsel am Variablennamen unterscheiden. Endet ein Variablenname mit „%“ kann die Variable nur ganzzahlige Werte zwischen -32768 und +32767 annehmen. Ist die Endung ein „$“, handelt es sich um eine Variable für Zeichenketten, sogenannte Strings. Ganz ohne Endung ist eine Variable für Gleitkommazahlen vorgesehen. Variablen können zwar lange Namen haben, es werden aber nur die ersten beiden Zeichen beachtet. Die Variablen „paris“ und „paderborn“ sind aus Sicht von Basic identisch!

Für Berechnungen beherrscht Basic die üblichen Rechenoperatoren +, -, * und /. Darüber hinaus sind auch Klammerungen möglich und mit ^ kann man einen Exponenten berechnen. Für Zeichenketten existiert nur der Operator „+“, mit dem zwei Zeichenketten aneinandergehängt werden.

Basic kennt zahlreiche mathematische Funktionen. Die wichtigsten sind:

sin(x)            Sinus
cos(x)
            Cosinus
tan(x)
            Tangens
atn(x)
            Arcustangens
sqr(x)
            Wurzel
exp(x)
            Exponentialfunktion
abs(x)
            Betrag
int(x)
            Ganzzahliger Anteil

Wichtig sind auch Funktionen für Zeichenketten:

left$(a$,x)       liefert die x ersten Zeichen von a$
right$(a$,x)
      liefert die x letzten Zeichen von a$
mid$(a$,x,y)      liefert y Zeichen ab der x. Position von a$
asc(a$)    
      liefert den ASCII-Code des ersten Zeichens von a$
chr$(x)
           liefert das Zeichen mit dem ASCII-Code x

Beispiel zur Programmierung

Es sollen die Nullstellen einer Parabel berechnet werden, d.h. an welchen Stellen der Funktionsgraph der Gleichung y = ax² + bx + c die x-Achse schneidet oder berührt. Es muss folglich der Wert oder die Werte für x berechnet werden, für den Fall, dass man y=0 einsetzt. Die Gleichung dafür lautet:

Das Programm muss zuerst die Werte der Koeffizienten a, b und c abfragen, dann die Berechnung durchführen und am Ende das Ergebnis ausgeben. Dabei soll eine Fallunterscheidung gemacht werden, ob es keine, eine oder zwei Nullstellen gibt. Dazu muss der Term unter der Wurzel betrachtet werden: Ist b²-4ac positiv, gibt es zwei Nullstellen. Ist es Null, gibt es nur eine. Ist es negativ, gibt es keine Nullstelle und die Wurzel darf nicht gezogen werden, da das Programm sonst mit einer Fehlermeldung abbricht.

Das Programm könnte folgendermaßen aussehen:

100 print ”Berechnung der Nullstellen der Funktion y = a*(x­2)+b*x+c”
110 print ”Bitte geben Sie die Koeffizienten ein (a=0 für Programmende):”
120 input ”a = ”; a
125 if a=0 then 600
130 input ”b = ”; b
140 input ”c = ”; c
150 print ”Berechnung von ”;a;”(x­2)+”;b;”*x+”;c;”=0”
160 z = b*b - 4*a*c
170 if z<0 then 400
180 if z=0 then 300
190 x1 = (-b + sqr(z))/(2*a)
200 x2 = (-b - sqr(z))/(2*a)
210 print ”Erste Nullstelle x1: ”; x1
220 print ”Zweite Nullstelle x2: ”; x2
230 goto 500
300 x1 = -b / (2*a)
310 print ”Es gibt nur eine Nullstelle.”
320 print ”Nullstelle x1: ”; x1
330 goto 500
400 print ”Es gibt keine Nullstelle.”
500 goto 110
600 end

Es wird nach dem Eintippen mit „run“ gestartet.

Fazit

Basic ist eine sehr einfache Sprache, die in wenigen Tagen zu erlernen ist. Anfang der 80er Jahre hatten die meisten Computerbesitzer zumindest rudimentäre Basic-Kenntnisse. Damit konnten viele Probleme bereits gelöst werden.

Die Kehrseite der Medaille ist die Abwesenheit modernerer Konzepte der Softwareentwicklung wie Strukturierung, Modularisierung und Objektorientierung. Wer den Einstieg in die Programmierung mit Basic macht, erlernt einen eher chaotischen Programmierstil. Das gilt in besonderem Maße für Autodidakten. Es ist auf Basis von Basic-Kenntnissen schwieriger eine moderne Programmiersprache zu lernen als wenn man noch gar nie programmiert hat.

Emulation der Home- und Bürocomputer von Commodore

Entsprechend der enormen Marktbedeutung vor allem des C-64 gibt es eine ganze Reihe von Projekten, die sich mit der Emulation dieses Systems befassen. Das vermutlich ausgereifteste ist „VICE“, das in der Fassung für Microsoft Windows „WinVICE“ heißt. Dieser Emulator lässt eine gewaltige Menge an Einstellungen zu, die man nur mit großer Systemkenntnis komplett ausschöpfen kann (und normalerweise auch nicht unbedingt braucht).

Das VICE-Paket besteht aus mehreren ausführbaren Programmen:

xvic.exe Emuliert den VC-20 Homecomputer
x64.exe Emuliert den C-64 Homecomputer
x128.exeEmuliert den C-128 Homecomputer
xplus4.exeEmuliert die Plus/4, C-116 und C-16 Homecomputer
xpet.exeEmuliert sämtliche CBM-Bürocomputer (30xx/40xx/80xx/8296)
xcbm2.exeEmuliert die Bürocomputer der CBM-II-Serie (6xx/7xx)

In allen Fällen öffnet sich ein Fenster, in dem man bereits die Einschaltmeldung des ausgewählten Modells sehen kann. Man kann nun noch einige Einstellungen vornehmen, um die genaue Systemkonfiguration festzulegen. Im Menü „Settings“ sind dazu vor allem die Punkte „PET Settings“ zur Auswahl des genauen Modells und „Drive Settings“ zur Auswahl des gewünschten Diskettenlaufwerks wichtig.

Sinnvolle Kombinationen:

PET 2001-8N mit 8KB RAM, ohne Diskettenlaufwerk
PET 4032 mit 32 KB RAM, Diskettenlaufwerk 4040
PET 8032 mit 32 KB RAM, Diskettenlaufwerk 8050 oder 8250

Bei den Diskettenlaufwerken sind auch andere Kombinationen möglich. Der PET 2001 kann aufgrund eines Fehlers im ROM gar keine Diskettenlaufwerke ansprechen. Hat man die Einstellung des Computers verändert, macht der emulierte Rechner automatisch einen Neustart.

Nun muss man noch eine Diskette einlegen. Da die originalen Disketten von einem PC aus technischen Gründen nicht gelesen werden können und die meisten PCs heute ohnehin kein DIskettenlaufwerk mehr eingebaut haben, geschweige denn eines mit 5,25“, arbeitet man in VICE mit sogenannten Diskimages. Dabei handelt es sich um Dateien, die in einer vorgeschriebenen Reihenfolge alle Datenblöcke einer Diskette enthalten. Wird so ein Diskimage mit VICE verknüpft, verhält sich der Emulator genau so, als ob man in das Diskettenlaufwerk die entsprechende Diskette eingelegt hätte. Um ein Diskimage zu verknüpfen, wählt man im Menü „File“->“Attach Disk Image“->“Drive 8“. Nun erscheint ein Dialog zur Dateiauswahl. Diskimages für VICE haben normalerweise die Endung „d64“, „d80“ oder „d82“. Dabei ist zu beachten, dass Images mit der Endung „d64“ nur in Laufwerken mit 170 KB Kapazität funktionieren (z.B. 1541, 2031, 3040, 4040), solche mit der Endung „d80“ nur in solchen mit 500 KB Kapazität (8050) und solche mit der Endung „d82“ in Laufwerken mit 1 MB Kapazität (8250, SFD1001). Das passende Laufwerk muss in den „Drive Settings“ ausgewählt werden, sonst ist ein Zugriff nicht möglich.

Ist alles richtig eingestellt, kann mit dem emulierten System genauso gearbeitet werden, wie mit dem Original. Etwas ungewöhnlich ist dabei gelegentlich die Tastaturbelegung, die weitgehend der Belegung der Originaltastatur entspricht. Auf einer PC-Tastatur muss man teilweise etwas suchen, bis man die richtige Taste gefunden hat. Bei PET und 3032 ist zu beachten, dass die Ziffern nur über den Ziffernblock erreichbar sind, die Ziffernreihe oberhalb der Buchstaben hat auch ohne Großschreibtaste bereits die Belegung mit Ausrufe-, Anführungszeichen etc.

Während der Emulation zeigt die Titelzeile des Fensters an, in welcher Geschwindigkeit der Emulator läuft. Unten rechts zeigt das Fenster an, ob das Diskettenlaufwerk aktiv ist (rotes Rechteck) und welche Spur der Diskette der emulierte Schreib-Lesekopf gerade ansteuert.