Comal 80 — die universelle Programmiersprache
Vergessen Sie alles, was Sie über die Programmierung Ihres C 64 wissen! Denn mit Comal 80 verwandelt sich der C 64 in einen neuen Computer.
Hand aufs Herz: Wie oft haben Sie sich als C 64-Programmierer schon über die Unzulänglichkeiten des eingebauten Basic 2.0 geärgert und sich ein komfortableres Basic gewünscht? Diese Zeiten sind jetzt endgültig vorbei. Mit Comal 80 nutzen Sie die enormen Hardware-Fähigkeiten des C 64 voll aus, und zwar ohne Maschinensprache, ohne PEEKs und POKEs, dafür schneller, komfortabler und übersichtlicher, als Sie es sich je vorgestellt haben. Comal vereinigt die leichte Erlernbarkeit von Basic mit der übersichtlichen Strukturierung von Pascal und den grafischen Fähigkeiten von Logo. Das Ergebnis ist eine neue Sprache, die alles, was es bisher an Programmiersprachen für den C 64 gibt, in den Schatten stellt.
64 KByte im ROM-Modul
Comal 80 ist für den C 64 nur als Steckmodul erhältlich. Dieses Modul enthält 64 KByte ROM, die in vier Speicherbänkenzuje 16 KByte organisiert sind. Die eingebaute Bank-Auswahl-Logik schaltet ganz nach Bedarf zwischen den vier Comal-ROM-Bänken, dem Basic-ROM und dem darunterliegenden RAM hin und her. Bild 1 zeigt die Speicheraufteilung des C 64 unter Comal 80. Der gesamte adressierbare Speicherbereich (RAM und ROM) beträgt 152 KByte (!), für Comal-Programme stehen davon 30 KByte zur Verfügung. Das entspricht dem auch bei Basic-Erweiterungen wie Simons Basic oder Exbasic Level II vorhandenen Programm-Speicherplatz. Dazu kommen nochmals 16 KByte RAM, die für selbstgeschriebene Spracherweiterung (User Packages) verfügbar sind. Wem dieser Speicherplatz noch nicht ausreicht, kann sich Comal-Erweiterungen mit einem Umfang von bis zu 32 KByte entweder in Assembler oder in Comal selbst schreiben und in ein EPROM brennen — das Comal-Modul enthält zu diesem Zweck einen freien EPROM-Steckplatz.

Der bildschirmorientierte Editor des C 64 wurde in vielen Punkten noch weiter verbessert. Zahlreiche Control-Funktionen wie »lösche ab Cursor-Position bis Zeilenende« oder »Cursor auf vorhergehendes Wort setzen« erleichtern die Programmeingabe. Spezielle Comal-Kommandos wie DEL (Zeilenbereich löschen), AUTO (automatische Zeilennummern-Vorgabe) oder RENUM (Neunumerierung eines Comal-Programms) bringen großen Komfort bei der Programm-Eingabe und -Änderung. Die Funktionstasten sind mit sinnvollen Kommandos belegt, können aber vom Anwender beliebig umdefiniert werden.
Komfortabler Editor
Comal ist genaugenommen weder ein Interpreter noch ein Compiler, sondern eine Zwischenstufe. Comal-Programme werden vor der Ausführung (die interpretativ erfolgt) in zwei Stufen »vor-übersetzt«. Die erste Stufe ist die Umsetzung der Comal-Schlüsselworte in sogenannte »Token«, also meist aus einem Byte bestehende Befehls-Abkürzungen. Eine solche Vorübersetzung findet auch beim normalen Basic 2.0 statt. Comal geht aber noch weiter: Wird ein Comal-Programm gestartet, dann führt Comal vor dem eigentlichen Programmlauf eine semantische Analyse durch, in deren Verlauf die effektiven Adressen von Variablen, Prozeduren und Funktionen ermittelt und gespeichert werden. Während des Programmlaufs braucht Comal daher nicht lange in Variablentabellen zu suchen, sondern findet die gesuchte Adresse praktisch unmittelbar vor. Dadurch werden Ausführungsgeschwindigkeiten erreicht, die in der Regel erheblich über denen vergleichbarer Basic-Programme liegen. Einen Compiler kann man bei Comal getrost vergessen, er würde keinen nennenswerten Geschwindigkeitsvorteil mehr bringen.
Von Basic zu Comal
In Comal 80 sind die besten Eigenschaften der drei Programmiersprachen Basic, Pascal und Logo zu einem sehr komfortablen Programmier-System zusammengefaßt. Auf der Kommando-Ebene braucht der von Basic kommende Comal-Anwender nur wenig umzulernen: Programme werden mit LOAD geladen, mit SAVE gespeichert und mit LIST gelistet. Auch Befehle wie NEW, RUN, AUTO, RENUM oder MERGE dürften dem Basic-Programmierer nicht unbekannt sein.
Viele im Programm-Modus verwendete Befehle sind an Basic angelehnt. Das geht so weit, daß Comal vielfach Basic-Befehle akzeptiert, wo eigentlich spezielle Comal-Schlüsselwörter stehen müßten. Ein Beispiel ist die FOR-Schleife, die in Comal statt mit NEXT mit ENDFOR abgeschlossen werden muß. Tippt man jedoch versehentlich »NEXT«, so macht das nichts aus: Das Comal-System ist intelligent genug, um zu erkennen, was der Benutzer mit NEXT meinte und ersetzt das NEXT stillschweigend durch ENDFOR.
Strukturiert wie Pascal
Comal 80 für den C 64 ist in vieler Hinsicht mit Pascal vergleichbar, ohne allerdings dessen in vielen Fällen unnatürliche Strenge und Kompliziertheit zu übernehmen. Comal versucht stets, dem Benutzer dort Arbeit abzunehmen, wo dies von einem intelligenten System auch getan werden kann. Beispielsweise zwingt Pascal dazu, alle Variablen, Konstanten oder Prozeduren vor der ersten Verwendung des entsprechenden Namens zu definieren. Bei Comal dagegen ist es gleichgültig, wo eine Prozedur im Programm definiert wird. Bevor das RUN-Kommando ausgeführt wird, ordnet Comal jedem Auftreten eines Prozedur-Namens die entsprechende Prozedur selbst zu, egal, ob diese vorne, hinten oder in der Mitte eines Programms steht.
Comal 80 ist eine blockstrukturierte Sprache und sorgt dadurch für Lesbarkeit der Programme. Die Sprachstruktur wird durch die Form der Bildschirmausgaben beim Listen noch unterstützt. Comal rückt verschachtelte Strukturen automatisch ein, ohne dafür zusätzlichen Speicherplatz zu brauchen. So werden schon optisch von vornherein klare Gliederungen und Strukturen geschaffen, die sich durch Kommentare und Leerzeilen noch vertiefen lassen.
Der Sprachumfang von Comal 80 umfaßt praktisch alle Elemente der strukturierten Programmierung:
Die von Basic her bekannte, vergleichsweise primitive IF-THEN-Abfrage ist in Comal dahingehend erweitert worden, daß ganze Programmteile bedingt ausgeführt werden können. Hierzu wird die IF-Anweisung in der Form IF-THEN-ENDIF verwendet, wobei zwischen THEN und ENDIF ein beliebig umfangreicher Programmteil stehen kann, der nur ausgeführt wird, wenn die Bedingung nach IF wahr ist. Im Falle zweier alternativer Möglichkeiten kann die IF-Anweisung durch ELSE zur Form IF-THEN-ELSE-ENDIF ergänzt werden. Weitere Alternativen lassen sich durch zusätzliche Abfragen mittels ELIF (eine Wortbildung aus ELSE IF) leicht abfragen. Der folgende Programmteil druckt einen Wetterbericht in Abhängigkeit vom Inhalt der Variablen »WETTER«:
100 IF WETTER = -1 110 PRINT "schlechtes Wetter" 120 ELIF WETTER = 1 130 PRINT "gutes Wetter" 140 ELSE 150 PRINT "veraenderlich" 160 ENDIF
Falls mehrere Bedingungen zu prüfen sind, ist die CASE-Konstruktion allerdings meist übersichtlicher. Der gleiche Wetterbericht mittels CASE-Anweisung formuliert, sieht so aus:
100 CASE WETTER 110 WHEN -1 120 PRINT "schlechtes Wetter" 130 WHEN 1 140 PRINT "gutes Wetter" 150 OTHERWISE 160 PRINT "veraenderlich" 170 ENDCASE
Für die Programmierung von Schleifen stehen neben der bereits angesprochenen FOR-ENDFOR-Schleife (entspricht FOR-NEXT in Basic) drei weitere Schleifen-Konstruktionen zur Verfügung:
LOOP-ENDLOOP ist eine Endlosschleife, die nur durch einen eingefügten EXIT-Befehl verlassen werden kann.
REPEAT-UNTIL wird durchlaufen, bis die Bedingung hinter UNTIL erfüllt ist.
WHILE-ENDWHILE dagegen prüft zuerst die hinter WHILE stehende Bedingung. Der Programmteil zwischen WHILE und ENDWHILE wird solange ausgeführt, wie die Bedingung wahr ist.
Für ganz spezielle Zwecke existiert auch noch ein Sprungbefehl (GOTO), jedoch nur auf ein mit einem Namen versehenes Sprungziel (LABEL).
Ebenfalls von Pascal übernommen wurde das Konzept der Prozeduren und Funktionen. Auch hier fällt wieder angenehm auf, daß auf einen puren Formalismus zugunsten erhöhter Anwenderfreundlichkeit verzichtet wurde.
Prozeduren und Funktionen
Eine Prozedur ist entfernt mit einem Unterprogramm in Basic verwandt, nur wird sie nicht über »GOSUB (Zeilennummer)«, sondern direkt mit einem Namen aufgerufen. Im Gegensatz zu Basic können dabei alle benötigten Parameter mit übergeben werden. Dies können Zahlen, Strings oder sogar ganze Felder sein. Die Prozedur legt sich dann lokale Variablen an, was bedeutet: Die Namen der Variablen sind nur innerhalb der Prozedur gültig, der gleiche Variablenname bezeichnet also in Prozedur und Hauptprogramm verschiedene Variable. Im übrigen wird, wie in Pascal, zwischen reinen Werteparametern und sogenannten Variablenparametern unterschieden.
Durch Prozeduren bietet Comal die Möglichkeit, den Sprachumfang praktisch beliebig zu erweitern. Ähnlich verhält es sich mit den Funktionen, die — anders als Basic-Funktionen — über beliebig viele Zeilen definiert werden können. Die Funktionsdefinition wird eingeleitet durch das Schlüsselwort FUNC und beendet durch ENDFUNC. Wie bei Prozeduren können beliebig viele Parameter an eine Funktion übergeben werden. Der Unterschied zu Prozeduren besteht darin, daß eine Comal-Funktion immer einen bestimmten Wert zurückliefert, der durch RETURN (Wert) ausgewählt wird. RETURN hat hier nichts zu tun mit dem Basic-Befehl RETURN, sondern definiert nur den von der Funktion zurück zu liefernden Wert.
Fehlerbehandlung leicht gemacht
Um eine möglichst weitgehende Benutzerfreundlichkeit zu realisieren und die Programmierung zu vereinfachen, wurde Comal mit komfortablen Möglichkeiten zur Behandlung von Fehlern versehen. Diese beschränken sich nicht nur auf das Abfangen aller möglichen Fehlerarten, sondern es sind auch automatische Korrekturen und die Weitergabe von Meldungen an übergeordnete Programm-Strukturen möglich. Dabei können sogar bewußt Fehler erzeugt oder übertragen werden. Die Fehlerbehandlung stellt selbst eine Programmstruktur dar. Der Teil des Programms, in dem Fehler abgefangen werden sollen, wird durch TRAP und ENDTRAP eingeklammert. Dieser Programmteil enthält auch die Fehlerbehandlungs-Routine (HANDLER), die im Fehlerfall aufgerufen wird. Ein Beispiel:
10 // Quadratwurzel 15 PRINT "bitte Zahl eingeben:" 20 TRAP 25 INPUT ZAHL 30 PRINT SQR(ZAHL) 35 HANDLER 40 CASE ERR 0F 45 WHEN 206 50 PRINT "nur Zahl eingeben !" 55 WHEN 1 60 PRINT "negative Zahl nicht erlaubt ! " 65 OTHERWISE 70 PRINT ERR, ERRTEXT$ 75 ENDCASE 80 ENDTRAP
Dieses Programm wartet auf die Eingabe einer Zahl und berechnet danach die Quadratwurzel aus dieser Zahl. Zwei Fehlermöglichkeiten sind dabei offensichtlich: Zum einen kann der Benutzer irrtümlich irgendwelche Buchstaben mit eingeben (Fehler 206, »numeric constant expected«), zum anderen darf das Argument der Quadratwurzel-Funktion nicht negativ werden (Fehler 1, »Argument Error«), Durch den TRAP-HANDLER werden diese beiden Fehler abgefangen und mit entsprechenden Meldungen quittiert. Falls wider Erwarten irgendein anderer Fehler auftreten sollte, so wird in Zeile 70 einfach die Fehlernummer samt dazugehörigem Fehlertext übergeben. Wenn Sie sich an den englischen Fehlermeldungen stören sollten — Comal ermöglicht es Ihnen, alle Fehlermeldungen neu zu formulieren und abzuspeichern.
Comal und die 1541
Ein Schwachpunkt im C 64-System ist bekanntlich die Floppy-Station 1541. Die meisten C 64-Besitzer haben sich wohl zähneknirschend daran gewöhnt, daß das Auflisten des Directorys mit Programmverlust bestraft wird und daß man zur Anzeige der DOS-Fehlermeldungen ein Programm benötigt. Mit Comal 80 hat es ein Ende mit dem Zähne knirschen: DIR oder CAT zeigen das Directory, PASS sendet Kommandos an die 1541. Der Fehlerkanal wird entweder sofort angezeigt — wobei dies mit Hilfe des TRAP-Handlers gesteuert werden kann — oder kann durch STATUS abgefragt werden. CREATE legt eine relative Datei an, mit GET$ kann eine beliebige Anzahl von Bytes von der Floppy-Station eingelesen werden.
Auch in Richtung Programmiertechnik hat man sich einiges einfallen lassen. Programmteile können mit CHAIN nachgeladen werden, wodurch Comal-Programme theoretisch bis zu 200 KByte lang sein können (30 KByte im RAM, 170 KByte auf Diskette). Außerdem können Comal-Prozeduren und -Funktionen als EXTERNAL deklariert werden. Dies bedeutet, daß im Programm nur der Prozedurkopf vorhanden sein muß. Die Prozedur selbst befindet sich in diesem Fall auf der Diskette und wird beim Aufruf automatisch nachgeladen und ausgeführt. Nach getaner Arbeit wird die Prozedur dann einfach wieder aus dem Speicher geworfen, um keinen Platz zu verschwenden.
Comal kann mit bis zu acht Laufwerken gleichzeitig arbeiten und unterstützt von vorneherein auch den Anschluß der »großen« Commodore-Laufwerke der 40xx- und 80xx-Serie.
Die Zusatz-Pakete
Natürlich läßt sich auch mit der Datasette arbeiten, allerdings mit den von Basic bekannten Einschränkungen hinsichtlich Bedienungskomfort und Leistungsfähigkeit.
Bisher war nur von dem international genormten Grundwortschatz von Comal die Rede. Es ist jedoch auch möglich, systemabhängige oder anwenderspezifische Spracherweiterungen zu integrieren. Eine solche Spracherweiterung wird in Comal als »Package« bezeichnet. Packages (Pakete) sind nichts anderes als Sammlungen von Comal-Prozeduren oder-Funktionen, die meist in Maschinensprache geschrieben sind, aber natürlich auch in Comal verfaßt sein können. Eine Reihe derartiger Spezial-Pakete sind in Comal 80 bereits fest eingebaut. Es bereitet aber nur wenig Mühe, sich weitere Packages selbst zusammenzustellen.
Ein fertig programmiertes Package kann auf Diskette abgelegt und bei Bedarf in einen reservierten 16-KByte-RAM-Bereich geladen werden, belastet also nicht den 30 KByte großen Comal-Programmspeicher. Fest eingebaut sind bereits elf Packages, mit denen sich die Fähigkeiten des Comal-Systems nochmals potenzieren:
1. English
Nach »USE ENGLISH« gibt Comal alle Fehlermeldungen im englischen Klartext aus.
2. Danish
Hiermit erscheinen alle Fehlermeldungen im dänischen Original.
3. Graphics
Dieses Package erweitert Comal um eine Reihe von speziell auf den C 64 zugeschnittenen Grafik-Befehlen.
4. Turtle Graphics
An diesem Package werden Logo-Freunde ihre helle Freude haben. Alle Grafikbefehle von Logo stehen hiermit zur Verfügung.
5. Sprites
Alles, was der C 64 in dieser Richtung hardwaremäßig zu bieten hat, ist hier in Form komfortabler Comal-Befehle verfügbar.
6. Sound
Es gibt wohl keine Funktion des SID-Chips, die nicht durch spezielle Comal-Befehle unterstützt wird. Als besonderer Komfort können Noten als Strings codiert und abgespielt werden. Dies geschieht interruptgesteuert, so daß Hintergrundmusik sehr einfach programmiert werden kann.
7. Paddles
Dieses Package enthält Prozeduren und Funktionen zur Abfrage der Controlports.
8. Joysticks
Hiermit wird die Joystick-Kontrolle zum Kinderspiel.
9. Lightpen
Wer einen Lightpen sein eigen nennt, der findet hier alle Spezial-Befehle, um damit optimal arbeiten zu können. Zusätzliche Treibersoftware wird damit überflüssig.
10. System
Mit dem System-Package können eine Vielzahl von speziellen Eigenschaften des C 64-Systems angesprochen werden.
11. Font
Mit einfachen Befehlen kann der Zeichensatz des C 64 geändert, geladen oder gespeichert werden. Es ist möglich, einen speziellen Zeichensatz fest mit einem Comal-Programm zu verbinden. Wird dieses Programm gespeichert, so wird auch der zugehörige Zeichensatz ohne weiteres Zutun automatisch mit abgespeichert. Bei jedem Laden eines derart präparierten Programms steht dieser Zeichensatz dann wieder zur Verfügung.
Fazit
Die hervorragenden Eigenschaften dieser neuen Programmiersprache lassen auf eine Durchsetzung auf breiter Front hoffen. Comal ist wie kaum eine andere Sprache dazu geeignet, strukturiertes und übersichtliches Programmieren interaktiv, im Dialog mit dem Computer zu lernen. Comal nimmt dem Benutzer im Gegensatz zu anderen Sprachen so leicht nichts übel, im Gegenteil: offensichtliche Fehleingaben werden vom System automatisch korrigiert. Der eingebaute Syntax-Check bereits bei der Eingabe von Programmzeilen, ist nicht nur für den Anfänger eine große Hilfe. Ausführliche Fehlermeldungen lassen den Benutzer nicht im unklaren, was er falsch gemacht hat. Die hohe Ausführungsgeschwindigkeit von Comal-Programmen ermöglicht Anwendungen, die beim C 64 sonst nur durch Maschinensprache zu realisieren sind. Der Komfort bei der Programmierung in Comal ist für C 64-Verhältnisse so enorm, daß man sich an einen anderen Computer versetzt glaubt. Alle, wirklich alle, Unzulänglichkeiten des C 64 sind durch Comal 80 behoben. Und wenn jemand doch noch etwas finden sollte — kein Problem, denn Comal ist durch das Package-Konzept flexibel genug, vom Anwender fast beliebig erweitert werden zu können. Mit einem Wort: Comal ist nicht eine, sondern die Programmiersprache für den C 64.
(S. Bauer/ev)Comal 80 gibt es derzeit nur als Steckmodul für den C 64 bei Commodore Data a/s, Bjerrevej 67, DK-8700 Horsens, Dänemark. Preis zirka 1000 DKr. (etwa 300 Mark).
