Commodore CBM 8032 User Manual

commodore - computer
Bedienungshandbuch
Dieses Handbuch wurde gescannt, bearbeitet und ins PDF-Format konvertiert von Rüdiger Schuldes
schuldes@itsm.uni-stuttgart.de (c) 2003
Dieses Handbuch wurde vollständig mit Text-Bearbeitungs-Programmen erstellt, die auf dem Markt für den CBM 8032 erhältlich sind und auf einem Typenraddrucker der gehobenen Klasse ausgedruckt, der über den IEC-Bus ganz regulär an den CBM 8032 angeschlossen ist. Daran können Sie die mögliche Leistungsfähigkeit Ihres Computers erkennen.
Leider brachte es der deutsche Zeichensatz mit sich, daß einige Zeichen, die auf dem Bildschirm und der Tastatur Ihres Computers dargestellt werden können, nicht auf dem verwendeten Typenrad enthalten waren.
Es sind dies folgende Zeichen:
Doppelkreuz ist das SHIFT-Zeichen der Ziffer 3 und wird bei PRINT, INPUT und GET verwendet. Dieses Zeichen wird als § (Paragraphenzeichen) dargestellt. Da andererseits das Paragraphenzeichen auf dem Computer nicht zu finden ist, kann es durch diese 'falsche' Darstellung zu keinen Verwechslungen kommen.
Pfeil nach oben ist das Symbol für die Rechenoperation 'Potenzierung'. Dieses Symbol konnte überhaupt nicht dargestellt werden. Da die Potenzierung auch mit 'hoch' bezeichnet wird, haben wir 'Pfeil nach oben' durch 'h' ersetzt.
Spitze Klammer auf bzw. zu wird in BASIC als Symbol für 'größer als' bzw. 'kleiner als' verwendet. Diese Symbole sind aus der Mathematik abgeleitet. Auch diese beiden Zeichen konnten wir nicht verwenden und haben sie deshalb durch 'k' für 'kleiner als' und 'g' für 'größer als' ersetzt.
Eckige Klammem sind durch die Umlaute belegt. Da sie aber auch in der BASIC-Syntax nicht Vorkommen, fällt ihr Verlust nicht ins Gewicht.
Wir bitten Sie um Verständnis für diese kleinen Unannehmlichkeiten.
II. Hinweise zum Inhalt
Der Teil A (Anwender-Handbuch) ist nur für Laien gedacht, die noch nicht mit Computern gearbeitet haben.
Teil B ist für den Programmierer geschrieben. Er setzt Programmier- und BASIC-Kenntnisse voraus und vermittelt nur detaillierte Fakten über das spezielle Commodore-BASIC.
Die Teile ab VII sind nur für speziell interessierte Personen gedacht, sie sind keinesfalls 'Pflichtlektüre' oder gehören zur Allgemeinbildung.
Im Übrigen dürfen wir noch auf das Vorwort zum Programmierer-Teil verweisen.
I. II.
Hinweise zur Typographie Inhaltsübersicht
A.
1.
1.1
1.2
1.3
1.4
2.
2.1
2.2
2.3
3.
3.1
3.2
3.3
3.4
3.4.1
3.4.2
3.4.3
3.4.4
3.4.3
4.
4.1
4.2
4.3
ANWENDER-HANDBUCH
Inbetriebname
Verpackung Installation Ein-/Aus Schalter Helligkeitsregler
Eigenschaften und Aufbau eines Computersystems
Einsatz und Eigenschaften Die Hardware Die Software
Aufbau Ihres Commodore-Systems
Der Computer Der Bildschirm Die Tastatur Die Peripheriegeräte Datasette C2N
Geräte am IEC-Bus Kabeltypen für den IEC-Bus-Anschluß Floppy-Disk Drucker
Bedienung der Tastatur
Tastenfunktionen der linken Seite Tastenfunktionen der rechten Seite Arbeiten mit der Tastatur
5.
6.
6.1
6.2
6.3
6.4
6.5
6.6
6.7
6.8
6.9
6.10
Rechenfunktionen
Systembefehle
Einführung Erstes Programm laden und starten Beliebiges Programm laden Programm starten Inhaltsverzeichnis der Diskette lesen Diskette duplizieren Neue Diskette anlegen Programm abspeichern Datei kopieren Datei löschen
5
B.
PROGRAMMIERER - HANDBUCH
Vorwort
I.
1.
1.1
1.2
1.2.1
1.2.2
1.2.3
1.2.4
1.2.3
1.2.6
1.3
2.
2.1
2.1.1
2.1.2
2.1.3
2.1.4
2.1.3
2.2
3.
3.1
3.2
3.3
Daten - Interpreter - Codes
Datenarten
Einführung Numerische Daten Gleitkomma-Zahlen Integer (ganze Zahl) Bytezahl Logische Daten Adressdaten BASIC-Zeilennummern Strings
Darstellungsweisen von Daten
Variable Variablennamen Variablentypen Indizierte Variable Platzbedarf von Variablen
Zugriffszeiten auf Variablen
Konstante
Umwandlungen zwischen Datenarten
Integer in Gleitkomma
Gleitkomma in Integer
Rundungsfehler und Integerzahlen
4.
4.1
4.2
4.2.1
4.2.2
4.2.3
4.2.4
4.2.5
4.2.6
4.3
5.
5.1
5.2
5.3
5.4
5.5
6.
6.1
6.2
6.3
Ausdrücke und Operatoren
Numerische Ausdrücke und Operatoren Logische Ausdrücke und Operatoren Vergleichsoperatoren Vergleich von Strings
Wahr und falsch
Verknüpfung von logischen Ausdrücken durch NOT, AND und OR
Hierarchie Beispiele zu logischen Operationen
String-Ausdrücke und -Operatoren
Interpreter und Organisation
Geschwindigkeit
Spaces im BASIC-Text BASIC-Zeilenformat und Platzbedarf
Speichereinteilung
Stack (Stapel)
Codes
ASCII
ASC BSC (Bildschirmcode)
6
IL
BASIC-Anweisungen
1.
1.1
1.2
1.3
1.4
2.
2.1
2.2
2.3
3.
3.1
3.2
3.3
3.4
3.5
4.
4.1
4.2
4.3
4.3.1
4.3.2
4.3.3
4.3.4
4.3.5
4.3.6
Programme laden und speichern
Einführung LOAD, DLOAD (Laden) SAVE, DSAVE (Abspeichern) VERIFY (Überprüfen)
Programme starten und stoppen
Einführung RUN / GOTO (Programm starten) STOP / CONT (Programm stoppen / fortsetzen)
Programm- und Speicherverwaltung
Einführung LIST (Programm auslisten) CLR (Variable löschen) NEW (BASIC-Programm löschen) FRE (freier Speicherplatz)
Wertzuweisungen
Einführung Allgemeine Zuweisung (LET) Zuweisung von Konstanten in DATA durch READ Einführung READ (Lesen aus DATA) DATA (Datenfeld) RESTORE (DATA-Zeiger zurücksetzen) Eigenschaften einer DATA-Datei F ehlermeldungen
5.
5.1
5.2
5.2.1
5.2.2
5.2.3
5.2.4
5.2.5
5.3
5.4
5.5
5.6
5.7
5.7.1
5.7.2
5.7.3
Ein- / Ausgabe - Anweisungen
Einführung OPEN (Datei öffnen) Logische Adresse Gerätenummer / Primäradresse Sekundäradresse Dateiname / Kommandostring OPEN-Tabelle (Für Fortgeschrittene) CLOSE (Datei schließen) CMD (Bildschirm-Ausgabe umlenken) PRINT (drucken) Strichpunkt Zahlenformat Stringformat Komma TAB( ) SPC( ) Hochschieben des Bildschirminhaltes Anmerkungen für Fortgeschrittene POS INPUT (Eingabe mehrerer Zeichen) Gemeinsame Eigenschaften Besonderheiten des Bildschirm-INPUT Besonderheiten des Datei-INPUT§
7
5.8
5.8.1
5.8.2
5.8.3
5.8.4
5.9
5.9.1
5.9.2
5.9.3
5.9.4
5.9.5
GET (Hole ein Zeichen) GET aus dem Tastaturpuffer GET§ aus Dateien GET§ aus dem Bildschirm GET§ von der Tastatur Status (Zustand von Peripheriegeräten / Dateien) Dateiende Zeitüberschreitung Gerät nicht angeschlossen Floppy-Datei geschlossen Abfrage des Status-Wertes
6.
6.1
6.2
6.3
6.4
6.5
6.6
6.7
7.
7.1
7.2
7.2.1
7.2.2
7.2.3
7.2.4
7.3
7.4
7.5
7.6
7.7
7.8
8.
8.1
8.2
Sprunganwe isungen
Einführung GOTO (Sprung zu Zeile) GOSUB / RETURN (Aufruf eines Unterprogrammes) END / STOP (Programm-Ende / -Unterbrechung)
REM (Anmerkung) IF ... THEN ... (Wenn ... dann ...) ON ... GOTO / GOSUB ... (Sprungverteiler)
Schleifenbefehle (FOR .. TO .. STEP .. NEXT)
Einführung
Die Parameter Laufvariable
Anfangswert Endwert
Schrittweite
NEXT
Aussprung aus Schleifen
Schleife und Stack
Schachtelung
Ausführungszeit
NEXT WITHOUT FOR ERROR
Dimensionierung von indizierten Variablen
Einführung in indizierte Variablen
DIM
9.
9.1
9.2
9.3
9.3.1
9.3.2
9.3.3
9.4
9.4.1
9.4.2
9.4.3
9.5
9.5.1
9.5.2
9.6
8
Stringfunktionen
Einführung
LEN (Länge des Strings)
Gleitkommaumwandlungen
Einführung
VAL (Zahlenwert eines Strings)
STR$ (Stringdarstellung einer Zahl)
Byteumwandlungen
Einführung
ASC (Code des ersten Stringzeichens)
CHR$ (Code in Stringzeichen umwandeln)
Teilstrings bilden: LEFT$ / MID$ / RIGHT$
Einführung und Zweck
Format
Strings als eindimensionale Bytefelder
10.
10.1 Einführung
10.2
10.2.1
10.2.2
10.2.3 SGN (Vorzeichen)
10.3 Logarithmische Funktionen
10.3.1 SQR (Quadratwurzel)
10.3.2 EXP (Exponentialfunktion)
10.3.3
10.4. Trigonometrische Funktionen
10.4.1
10.4.2
10.4.3 Die Zahl PI
10.4.4 Umrechnungen
Mathematische Funktionen
Zahlen zerlegen ABS (Absolutbetrag) INT (Ganzzahliger Wert)
LOG (Natürlicher Logarithmus)
TAN / SIN / COS (Tangens, Sinus, Cosinus) ATN (Arcus-Tangens)
11.
11.1 Einführung
11.2
12. Sonstige Funktionen
12.1
12.1.1 RND
12.1.2 Argumente
12.1.3 Verbesserung der statistischen Verteilung
12.1.4
12.2 Vom Programmierer definierbare Funktionen
12.2.1 Einführung
12.2.2 DEF FN (Funktion definieren)
12.2.3
12.3
12.3.1
12.3.2
12.4
12.4.1
12.4.2 ST (Peripherie-Status)
12.4.3
13.
13.1
13.2 POKE, PEEK
13.3
13.4 USR( )
13.5
BIT - Funktionen
Verknüpfungstabellen
Zufallzahl erzeugen
Bereich der Zufallszahl einschränken
FN( ) (Funktion auf ruf en) Zeitvariablen TI$ (Zeit in Stunden, Minuten, Sekunden) TI (Zeit als Zahlenwert) ST / DS / DS$ (Status-Variablen) Einführung
DS, DS$ (Disk-Status)
Maschinenprogramm Kopplung
Einführung
SYS
WAIT
14.
14.1
14.2
14.3
F ehlermeldungen
Einführung Übersicht Beschreibung der Fehlermeldungen
ra.
BILDSCHIRMVERWALTUNG UND TASTATURBEHANDLUNG
ï.
2.
2.1
2.2
2.3
2.4
2.5
2.6
3.
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
3.10
3.11
3.12
3.13
3.14
3.15
3.16
Einführung
Tasten, die nur als Tasten wirken
SHIFT RETURN REPEAT RUN / STOP Stoppen des Bildschirmrollens Verlangsamen des Bildschirmrollens
Steuertasten / Steuercodes
CURSOR NACH RECHTS
CURSOR NACH LINKS DELETE INSERT TAB (ausführen) TAB (setzen/löschen) Anführungszeichen (") ESC RVS ON RVS OFF SPACE CURSOR NACH UNTEN CURSOR NACH OBEN HOME CLR SHIFT-RETURN
4.
4.1
4.1.1
4.1.2
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
4.10
5.
6.
6.1
6.2
6.3
6.4
7.
Zusätzliche Funktionscodes
Bildschirm-F enster
Zweck und Eigenschaften Fenster definieren Definition durch CONTROL-Codes
Definition durch POKE Zeile löschen Zeile einfügen Zeilen-Ende löschen Zeilen-Anfang löschen
Bildschirm nach oben rollen
Bildschirm nach unten rollen
Klingel
Text-Modus
Graphik-Modus
REVERS-Modus
CONTROL-Modus
Zweck des CONTROL-Modus
Wirkung des CONTROL-Modus
Einschalten des CONTROL-Modus
Ausschalten des CONTROL-Modus
Programmeditierung
10
8.
8.1
8.2
8.3
Tastaturpuffer
Einführung Eigenschaften Simulierte Tastatur
9.
9.1
9.2
10.
IV.
1.
2.
3.
4.
4.1
4.2
4.2.1
4.2.2
4.3
4.4
4.5
V.
1.
2.
3.
4.
5.
6.
7.
8.
8.1
8.2
8.3
8.4
8.5
8.6
8.7
Anwählen von Zeile und Spalte
String-Methode POKE-Methode
Bildschirmbehandlung mit POKE und PEEK
OVERLAY
Einführung Wirkung von LOAD Kaltstart Warmstart Programmspeicher reservieren Overlay und Strings Stringverwaltung Konsequenzen der Stringverwaltung für Overlay Overlay und DEF FN( ) Overlay und Floppy-Dateien Overlay und Stack
REKORDERVERWALTUNG
Einführung Der Rekorder Dateinamen EOT PRESS PLAY AND RECORD SAVE LOAD/VERIFY Dateibehandlung OPEN Aus Datei lesen In Datei schreiben Datenübertragungsrate und Datenkapazität Rekorderpuffer Zugelassene Daten Unterbrechen des Rekorders
VL
1.
2.
3.
3.1
3.2
3.3
3.4
3.5
3.6
3.7
4.
TIM-MONITOR
Die TIM-Befehle TIM-Zahlensystem Beschreibung der Befehle M Anzeige des Speicherinhalts
R Anzeige der Registerinhalte G Programmausführung X Rückkehr zu BASIC L Laden eines Programms S Speichern eines Programms BREAK und Interrupts
Aufruf von TIM
11
VII. USER PORT
1. Was ist der USER-PORT?
2. Kontaktbelegung des Steckverbinders J2
3. Der Interface-Baustein VIA 6522
4. Die Adressen des 6522 im CBM-Computer
5. Programmierung des VIA 6522
VIII. IEC-BUS
1. Einführung
2. Kontaktbelegung der Steckverbindung J1
3. Eigenschaften des IEC-Bus
4. Die Funktion der einzelnen Leitungen
4.1 Der Datenbus
4.2 Der Kontrollbus
4.3 Der Management-Bus
5. Definition der Logiksignale
6. Registeradressen
7. Beschreibung der Bus-Signale
IX. INTERNER BUS (J4,J9) X. INTERPRETERCODE (mit Abkürzungen) XI. Technische Daten
12
A
1. Inbetriebname
Ihr CBM 8001 ist ein hochwertiges elektronisches Gerät, konstruiert und gefer tigt nach dem neuesten Stand der Microcomputer-Technologie. Wie bei allen technischen Anlagen, hängt auch bei diesem Computer ein großer Teil der Funk tionsfähigkeit von der richtigen Bedienung durch den Anwender ab. Deshalb soll ten Sie bei der Inbetriebnahme des Gerätes die folgenden Anweisungen genau
beachten.
1.1 Verpackung
Der CBM wird anschlußfertig mit Bedienungshandbuch ausgeliefert. Die Spezial verpackung garantiert einen sicheren Transport und sollte deshalb aufbewahrt werden. Können Sie trotzdem an der Verpackung oder am Gerät Transportschäden feststellen, so melden Sie diese bitte umgehend Ihrem CBM-Fachhändler!
Fassen Sie das Gerät beim Auspacken nicht am Bildschirmaufbau!
1.2 Installation
ANWENDER
HANDBUCH
Stecken Sie den Netzstecker in eine geerdete Steckdose (220 Volt). Achten Sie bitte darauf, daß am selben Stromkreis möglichst keine Geräte mit hoher Strom
aufnahme angeschlossen sind, da sich starke Netzschwankungen störend auf den Rechnerbetrieb auswirken können.
1.3 Ein-/Aus-Schalter
Den Netzschalter finden Sie an der Rückseite des Gerätes. Nach dem Einschalten erscheint auf dem Bildschirm die Art des Betriebs-Systemes und die Anzahl der freien Speicherplätze. Der Rechner ist betriebsbereit:
§§§ COMMODORE BASIC 4.0 §§§ 31743 BYTES FREE
READY.
Sollte der Bildschirm dunkel bleiben, so überprüfen Sie bitte nochmals den Netzanschluß und eventuell die Helligkeitseinstellung. Führt dies nicht zum Erfolg, so benachrichtigen Sie bitte Ihren Fachhändler.
1.4 Helligkeitsregler
Mit dem Helligkeitsregler an der Rückseite des Bildschirmaufbaues können Sie die Leuchtintensität der Bildröhre individuell nach Ihren Bedürfnissen einstellen. Beachten Sie dabei, daß ein zu hell eingestellter Bildschirm die Augen stark belastet und die Lebensdauer der Bildröhre reduziert!
13
2. Eigenschaften und Aufbau eines Computersystems
2.1
Ein Computer kann Aufgaben, die sich auf immer wiederkehrende Teilaufgaben
zurückführen lassen, sehr schnell und fehlerfrei lösen. Seine Vorteile gegenüber der menschlichen Arbeitsweise sind seine hohe Geschwindigkeit und Zuverlässigkeit.
Er eignet sich deshalb hervorragend für langwierige Sortier- und Vergleichs arbeiten oder umfangreiche Berechnungen, kann also den Menschen von nervtötenden Routinearbeiten befreien, oder ihn wenigstens dabei unterstützen. Damit kann der Computer gleichzeitig Arbeitsvorgänge rationalisieren und humanisieren.
Trotzdem kann er das menschliche Gehirn nicht ersetzen, da ihm die Fähigkeit des kreativen Denkens fehlt. Er kann also nicht denken, sondern nur rechnen und die Ergebnisse mit vorgegebenen Mustern vergleichen und aufgrund von vorprogrammier ten Entscheidungen bestimmte Reaktionen auswählen. Er ist deshalb immer auf die Funktionen beschränkt, auf die er von Menschen programmiert wurde.
Diese Funktionen sind dem Computer aber nicht fest eingebaut, sondern können
fast beliebig ausgewechselt werden. Das Computersystem ist dabei nur eine Maschine (Hardware), die zusammen mit den Programmen (Software) die vom Anwender gewünschte Leistung erbringt.
Als Vergleich könnte man eine Stereoanlage nehmen, die aus mehreren Geräten zusammengestellt ist. Diese Geräte entsprechen dem Computersystem (Hardware). Damit diese Maschinen aber Ihren Zweck erfüllen können, müssen Sie zusätzlich Schallplatten oder Tonbänder kaufen und in die Anlage 'einlegen'. Auf diesen Tonträgern, die den Datenträgern beim Computer entsprechen, befindet sich die austauschbare geistige Leistung (Software), die Sie eigentlich haben wollen.
Einsatz und Eigenschaften
Zuerst wollen wir nun allgemein die Bestandteile der Hardware vorstellen und
hinterher etwas auf Software aus Anwendersicht eingehen.
14
2.2
In der konventionellen EDV (Elektronische Daten Verarbeitung) unterscheidet man
beim Computer folgende Hauptbestandteile:
ZENTRALEINHEIT Hier werden die Informationen verarbeitet und
ARBEITSSPEICHER Hier werden die Informationen abgelegt, die der
EINGABEGERÄTE Sie dienen der Informationseingabe in den Rechner.
AUSGABEGERÄTE Ausgabe von Daten, Meldungen und Ergebnissen an
Die Hardware
die Steuerung des Informationsflusses zwischen Rechner, Speicher und Peripherie geregelt.
Zentraleinheit unmittelbar zur Verfügung stehen müssen (Programm und Daten).
(Tastatur, Meßgeräte)
den Benutzer (Bildschirm, Drucker).
MASSENSPEICHER Langzeitspeicher für Programme und Daten.
(Magnetband, Floppy-Disk, Magnet-Platte)
Während bei der Groß-EDV die einzelnen Einheiten meist in eigenen Gehäusen von beachtlicher Größe untergebracht sind, sind beim CBM Zentraleinheit, Arbeits speicher, Bildschirm und Eingabetastatur in einem Gerät mit der Stellfläche einer elektrischen Schreibmaschine vereint. Ermöglicht wurde dies durch konse quenten Einsatz der modernen Microprozessor-Technik, zu deren Entwicklung Firmen der COMMODORE-Unternehmensgruppe einen wesentlichen Beitrag geleistet haben.
2.2 Die Software
Wir unterscheiden zwischen Betriebs- und Anwender-Software.
Betriebs-Software sind jene Programme, die die technische Struktur des Computers ergänzen und seine Möglichkeiten erschließen. Die Betriebssoftware ist beim CBM fest in ROMs (Read Only Memory) im Gerät installiert. Dies hat den Vorteil, daß sie sofort nach dem Einschalten des Gerätes zur Verfügung steht und außerdem vor versehentlichem Löschen oder Überschreiben geschützt ist. Die Betriebssoftware wird auch Betriebssystem genannt. Für den Anwender ist allerdings weder ersicht lich noch wichtig, wo die Hardware aufhört und das Betriebssystem beginnt.
Anwender-Software sind die Programme, die als Bindeglied zwischen dem Computer und dem Anwender fungieren. In ihnen sind anwenderspezifische Arbeitsabläufe so festgelegt, daß sie vom Computer in der richtigen Reihenfolge abgearbeitet werden können. Diese Programme erst bringen den Computer dazu, die Funktionen zu übernehmen, die Sie von ihm erwarten (z.B. Buchhaltung, Lagerverwaltung).
15
Anwenderprogramme können Sie entweder selbst erstellen, oder erstellen lassen.
Ausserdem bietet sich die Möglicheit, fertige Standardprogramme zu kaufen. Da Ihr Computer aber nur so gut ist wie das Programm, mit dem er gefüttert wird, sollten Sie beim Softwarekauf besonders auf Qualität achten. Der Preis ist dabei nicht unbedingt ein aussagekräftiges Kriterium, denn auch gute Software kann bei entsprechend hoher Auflage günstig angeboten werden. Deshalb hier einige Bedingungen, die ein gutes Programm erfüllen sollte:
* Übersichtliche Bedienungsanleitung * Übersichtlicher Bildschirmaufbau * Gute Bedienerführung im Dialog * Absicherung gegen Fehlbedienung (Plausibilitätskontrollen) * Einfache Fehlerberichtigung
Ihr Commodore-Fachhändler ist gerne bereit, Sie in Softwarefragen zu beraten.
3. Aufbau Ihres Commodore-Systems
3.1 Der Computer
Wie erwähnt, enthält Ihr Computer bereits die Zentraleinheit und den Arbeits speicher, sowie die beiden wichtigsten Ein- / Ausgabe - 'Geräte', nämlich die Tastatur und den Bildschirm. Lediglich Massenspeicher und Drucker müssen zu sätzlich durch Kabel angeschlossen werden.
3.2 Der Bildschirm
Ihr CBM ist ein dialogorientiertes Gerät. Die Kommunikation mit dem Rechner erfolgt über Tastatur und Bildschirm. Dem Bildschirm fallen dabei zwei wesent liche Aufgaben zu.
Zum Ersten dient er als Kontrollmedium für Eingaben. Das heißt, jedes über die Tastatur eingegebene Zeichen erscheint sofort auf dem Bildschirm. Dabei werden die einzelnen Zeichen folgerichtig in einer Zeile ausgegeben, ähnlich, wie es bei einer Schreibmaschine der Fall wäre. Dies ermöglicht eine einfache Fehler korrektur.
Aber auch dem Rechner dient der Bildschirm als Instrument, um Meldungen an den Benutzer auszugeben. So werden zum Beispiel Fehlermeldungen unmittelbar auf den
Bildschirm geschrieben.
Bildschirmaufbau
Eine Bildschirmseite umfaßt 25 Zeilen mit je 80 Zeichen. Es lassen sich also maximal 2000 Zeichen gleichzeitig auf dem Bildschirm darstellen.
Am Zeilenende erfolgt ein automatischer Überlauf zum Anfang der nächsten Zeile.
Am Ende der unteren Bildschirmzeile wird der gesamte Text auf dem Bildschirm um eine Zeile hochgerückt. Dadurch verschwindet die erste Zeile. Dieses Durchrollen
des Bildes nennt man SCROLLING.
Die jeweilige Schreibposition für das nächste Zeichen wird durch ein blinkendes Feld angezeigt, dem CURSOR.
16
CBM 8032
2
1 BILDSCHIRM 12 Zoll 25 ZEILEN a 80 ZEICHEN 2 HAUPTTASTENFELD 3 NUMERISCHE ZEHNERTASTATUR 4 FUNKTIONSTASTEN
CBM 8032 RÜCKSEITE
10 11
5 6 7 8 9
EIN/AUS-SCHALTER GERÄTESICHERUNG
HELLIGKEITSREGLER IEC-BUS USER-PORT ANSCHLUßBUCHSE FÜR RECORDER ADRESS-BUS
3.3
Die Tastatur bietet dem Benutzer die Möglichkeit, dem Computer Befehle, Daten oder ganze Programme zu übermitteln. Deshalb ist es von Vorteil, sich mit diesem wichtigen Bestandteil des Gerätes vertraut zu machen. Die Tastenfunktionen können ohne Bedenken ausprobiert werden.
Die Tastatur des CBM 8032 besteht aus zwei getrennten Tastenfeldern, der alpha numerischen Tastatur, sie entspricht im wesentlichen dem Tastenfeld einer Schreibmaschine, und dem numerischen Zehnerblock zur schnellen Dateneingabe.
Neben den schon von der Schreibmaschine her bekannten Tasten findet man beim CBM noch zusätzliche Funktionstasten. Diese Tasten sind in das Haupttastenfeld integriert und haben Steuer- und Kontrollfunktionen. Eine Übersicht dieser Funktionen finden Sie einige Seiten weiter bei der Bedienung der Tastatur.
3.4 Die Peripheriegeräte
Beachten Sie bitte, daß der Anschluß externer Geräte nur im ausgeschalteten Zustand erfolgen darf.
3.4.1 Datasette C2N
Die Tastatur
Der Rekorder ist ein preiswerter Langzeitspeicher für Programme und kleine Datensätze. Er arbeitet mit normalen, handelsüblichen Bandkassetten. Die Anschlußbuchse finden Sie an der Rückseite des CBM. Der codierte Stecker kann nicht falsch angeschlossen werden.
3.4.2 Geräte am IEC-BUS
Der IEC-BUS, konzipiert nach der Norm IEEE 488, ist der wichtigste Anschluß am CBM. An ihm lassen sich bis zu 12 Geräte anschließen. Die Steckerleiste ist ebenfalls an der Geräterückseite des CBM zu finden.
17
3.4.3 Kabeltypen für den IEC-Bus-Anschluß
Das erste IEC-Gerät wird durch das Interfacekabel Computer-Peripherie mit dem CBM verbunden. Dieses Kabel hat an der einen Seite einen Flachstecker, der mit der Beschriftung nach oben in die Steckerleiste des CBM paßt. Der IEEE 488 Normstecker am anderen Ende des Kabels wird mit dem anzuschließenden Peripherie gerät verbunden. Sollen weitere IEC-Geräte angeschlossen werden, so kann das
mittels des Verbindungskabels Peripherie-Peripherie geschehen. Dieses Kabel hat
an beiden Enden Normstecker und wird einfach "huckepack" auf den Stecker am ersten Peripheriegerät aufgesteckt. Auf diese Weise lassen sich alle Geräte am Bus anschließen.
Kabel Computer-Peripherie
3.4.4 Floppy-Disk
Floppy-Laufwerke bieten im Gegensatz zum Recorder einen wesentlich schnelleren Zugriff auf Daten und Programme. Als Speichermedium dienen hier dünne, flexible Magnetplatten. Die Diskettenorganisation erfolgt über Spuren und Sektoren und wird über das fest eingebaute DOS (Disk Operating System) verwaltet. Der CBM Computer kann mit den folgenden Floppystationen gekoppelt werden:
TYP
CBM 3040 CBM 4040 CBM 8050 CBM 8060 CBM 8061
Bei der Arbeit mit Disketten sollten Sie folgendes beachten:
* Nur Qualitätsdisketten verwenden! * Gerät nie mit geschlossenen Laufwerksklappen aus- oder einschalten! * Disketten vor dem Einlegen von Hand vorzentrieren! * Disketten nur an der Schutzhülle anfassen!
* Disketten nie in die Nähe von Magnetfeldern bringen.
Anz. Laufwerke
2 170
2
2 2 2
KB/Diskette
170
512 750
1500
Kabel Peripherie-Peripherie
Diskettengröße
5.25"
5.25"
5.25" 8" 8"
18
3.5.5 Drucker
Als Ausgabeeinheiten werden von COMMODORE verschiedene Drucker angeboten. Auch
diese werden am IEC-BUS betrieben:
CBM 3022
CBM 8024 Matrixdrucker mit Traktorführung
CBM 8026 Typenraddrucker, auch als Schreibmaschine verwendbar
Ihr Commodore-Händler ist Ihnen gerne bei der Auswahl des für Sie optimalen Druckers behilflich.
Matrixdrucker mit Traktorführung 80 Zeichen pro Zeile max. 150 Zeichen pro Sekunde
132 Zeichen pro Zeile 170 Zeichen pro Sekunde mit Druckwegoptimierung
140 Zeichen pro Zeile ca. 25 Zeichen pro Sekunde
19
4. Bedienung der Tastatur
4.1 Tastenfunktionen der linken Seite
Taste ohne SHIFT mit SHIFT
OFF RVS
TAB
ESC Schaltet CONTROL-Modus ab wie ohne SHIFT
SHIFT Feststeller für SHIFT-Taste wie ohne SHIFT LOCK
Umschaltung auf negative Zeichen darstellung. (Dunkle Schrift auf hellem Grund)
Setzt den Cursor innerhalb der Zeile auf die nächste gesetzte T abulator-Marke.
Unterbricht Hochrollen auf dem Bildschirm. (z.B. für Listing) wie ohne SHIFT
Fortsetzung der durch : oder * unterbrochenen Bildschirmausgabe bzw. wie ohne SHIFT Reduzierte Geschwindigkeit bei
Bildschirmausgabe (z.B. Listing)
Umschaltung auf normale Zeichen darstellung. (Helle Schrift auf dunklem Grund)
Setzt oder löscht Tabulatormarke an der derzeitigen Cursorposition.
20
4.2
Tastenfunktionen der rechten Seite
Taste ohne SHIFT
Die eingegebene Information
RETURN wird an den Rechner übergeben.
Der Cursor wird an den Anfang der nächsten Zeile gesetzt.
RUN Laden und starten des ersten STOP Unterbricht den Programmablauf Programmes vom Laufwerk 0.
Bewegt den Cursor um eine Zeile CNO CNU
CNR CNL
CLR Cursor wird in die linke obere Bildschirm wird zusätzlich HOME Ecke des Bildschirmes gebracht. gelöscht.
nach unten. Ab der letzten Zeile wird der Bildschirminhalt um eine Zeile hochgeschoben.
Bewegt den Cursor um ein Zeichen nach rechts. Am Zeilenende wird der Cursor an den Anfang der nächsten Zeile gesetzt.
Die Information wird nicht vom Rechner übernommen. Der Cursor wird an den Anfang der nächsten Zeile gesetzt
(nicht bei 3040)
Bewegt der Cursor um eine Zeile nach oben.
Bewegt den Cursor um ein Zeichen nach links. Am Zeilenanfang wird der Cursor an das Ende der darü berliegenden Zeile gesetzt.
mit SHIFT
Löschen des Zeichens links neben
ein Zeichen nach links gezogen.
In Verbindung mit der Repeat-
REPEAT Taste arbeitet jede Taste mit wie ohne SHIFT
Dauerfunktion.
Einfügen eines Leerzeichens an der Stelle des Cursors. Der rechte Teil der Zeile wird um ein Zeichen nach rechts geschoben.
21
4.3
Um etwas mehr mit der Wirkungsweise der einzelnen Tasten vertraut zu werden, sollten Sie folgende Beispiele nachvollziehen.
Schreiben
Versuchen Sie Ihren Namen genau so zu schreiben, wie Sie es von der Schreib
maschine gewohnt sind. Beachten Sie dabei die Möglichkeit, groß und klein zu
schreiben. Alle Buchstaben, die Sie mit gleichzeitig gedrückter SHIFT-Taste
schreiben, werden als Großbuchstaben dargestellt.
Drücken Sie jetzt die Taste SHIFT LOCK. Die SHIFT-Taste ist jetzt festgestellt, alle Buchstaben kommen jetzt als Großbuchstaben auf den Bildschirm. Das Lösen
des SHIFT LOCK geschieht durch nochmaliges Drücken der Taste.
Achtung:
SHIFT kann beim Programmablauf zu Fehlern führen, wenn z.B. Eingaben mit einem SHIFT-RETURN abgeschlossen werden.
Tippen Sie einen Buchstaben, und drücken Sie dabei gleichzeitig die REPEAT-
-Taste. Wie Sie feststellen werden, wird der Buchstabe automatisch immer wieder geschrieben. Die REPEAT-Taste bewirkt Dauerfunktion für alle Tasten.
Arbeiten mit der Tastatur
Drücken Sie nun die Taste OFF RVS und schreiben Sie einen neuen Text. Dieser Text erscheint nun in Negativdarstellung (REVERSE) auf dem Bildschirm (Dunkle Schrift auf hellem Grund). Durch erneutes Betätigen der Taste gemeinsam mit SHIFT wird der Reverse-Modus wieder abgeschaltet.
Cursor horizontal bewegen (rechts / links)
Drücken Sie kurz die Taste CRSR (Cursor rechts). Der Cursor wandert im selben Moment eine Spalte nach rechts. Wenn Sie jetzt die Taste gedrückt halten, so schaltet diese auf Dauerfunktion. Der Cursor bewegt sich jetzt schnell auf das Ende der Zeile zu. 5 Zeichen vor dem Zeilenende verschwindet der Cursor kurz und es ertönt ein akustisches Vorwarnsignal. Bleibt jetzt die Taste weiter gedrückt, so setzt der Cursor nach dem Erreichen der 80. Stelle automatisch am Anfang der nächsten Zeile auf. Betätigen Sie jetzt gleichzeitig die SHIFT-
-Taste, so bewegt sich der Cursor genau in die entgegengesetzte Richtung. Bewegt man den Cursor über beschriebene Stellen des Bildschirmes, so wird der beste hende Text vom Cursor nicht gelöscht.
Tabulator
Versuchen Sie jetzt den Tabulator zu setzen. Fahren Sie den Cursor an eine
beliebige Stelle des Bildschirmes und drücken Sie die SHIFT und gleichzeitig die
TAB-Taste. Fahren Sie dann den Cursor einige Zeichen weiter nach rechts und setzen Sie eine zweite Tabulatormarke, indem Sie wieder TAB gemeinsam mit SHIFT drücken. Stellen Sie nun den Cursor an den linken Bildschirmrand. Wenn Sie jetzt
auf die TAB-Taste tippen, setzt der Cursor auf der ersten gesetzten Tabulator
marke auf. Ein weiteres Anschlägen der Taste läßt ihn auf die nächste Marke springen. Wenn Sie an dieser Stelle nochmals SHIFT und TAB drücken, so wird diese Tabulatormarke wieder gelöscht.
22
Cursor vertikal bewegen (unten / oben)
Betätigen Sie die Taste CRSR (Cursor nach unten). Sie werden feststellen, daß sich der Cursor in der Spalte, in der er sich gerade befindet, senkrecht nach unten über den Bildschirm bewegt. In Verbindung mit SHIFT kann er auch hier in die entgegengesetzte Richtung dirigiert werden. Um zu verdeutlichen, was geschieht, wenn der Cursor den unteren Bildschirmrand erreicht, tippen Sie einige Zahlen oder Buchstaben und fahren den Cursor anschließend in die untere
Bildschirmzeile. Wenn Sie die Taste noch weiter gedrückt halten, werden Sie sehen, daß der geschriebene Text Zeile für Zeile nach oben wandert, bis er am oberen Bildschirmrand verschwindet. Dieses zeilenweise Durchrollen des Textes nennt man SCROLLEN. Der Scroll-Modus wirkt nur in einer Richtung. Der Bild schirminhalt wandert also nicht nach unten, wenn der Cursor oben anstößt.
CLR / HOME
Drücken Sie jetzt die Taste CLR HOME. Der Cursor geht in die linke obere Ecke des Bildschirms (Home-Position).
Dieselbe Taste in Verbindung mit SHIFT löscht den Bildschirm und stellt den Cursor ebenfalls in Home-Position.
INST / DEL
Tippen Sie einen beliebigen Text, und stellen Sie dann den Cursor in die Mitte eines Wortes. Wenn Sie jetzt die Taste Delete drücken, so wird der Buchstabe, der sich vor dem Cursor befindet, gelöscht. Der Rest der Zeile wird um ein Zeichen nach links gezogen.
Wenn Sie dieselbe Taste gleichzeitig mit SHIFT drücken, so wird der Text ab dem Zeichen, über dem der Cursor steht, um eine Spalte nach rechts gesetzt. Der Cursor steht über einem leeren Platz, der wieder durch Zeichen belegt werden muß. Versucht man diese leere Stelle mit Funktionstasten zu verlassen z.B. mit Cursor hoch, so wird der Platz durch das entsprechende Kontrollzeichen aufge füllt. Der Rechner ist im "Control-" oder Einfügemodus. Dieser Modus besteht so lange, bis der mit INST geschaffene Platz wieder aufgefüllt ist.
Dieser Effekt läßt sich auch erzielen, wenn Sie Anführungszeichen eingeben. Tippen Sie ein " und anschließend die verschiedenen Cursortasten. Sie werden feststellen, daß statt der entsprechenden Cursorbewegungen reverse Zeichen auf den Bildschirm geschrieben werden. Erst wenn Sie erneut " eingeben, arbeiten die Funktionstasten wieder normal.
Vorsicht!
Da Tastenfunktionen durch Programme modifiziert oder zusätzlich generiert werden können, sollten Sie die Bedienungsanleitung des jeweiligen Programmes genau lesen. Vor allem sollten Sie die Tasten CRSR vertikal, CLR und HOME nicht ver wenden, sofern diese von der Bedienungsanleitung des Programmes nicht ausdrück lich zugelassen sind.
23
5. Rechenfunktionen
Ihr CBM läßt sich auch als Tischrechner verwenden. Die Rechenfunktionen sind vom Betriebssystem auch ohne Programm abrufbar.
Dabei gilt es zu beachten, daß in BASIC eine besondere Schreibweise für Rechen operationen vorgeschrieben ist. So werden hier an Stelle eines Kommas die Dezi malstellen durch einen Punkt getrennt.
Für die Darstellung arithmetischer Operationen gilt:
+
-
* /
Um eine Ausgabe des Ergebnisses auf dem Bildschirm zu erreichen, ist es nötig, an den Anfang der Rechenoperation ein ? einzugeben.
Beispiel:
? 4*5 (RETURN drücken)
Addition
Subtraktion
Multiplikation
Division
Potenzierung (Pfeil nach oben)
20
ready
Der Rechner schreibt sofort das Ergebnis (20) unter die Eingabe. Die Meldung READY besagt, daß der Computer für neue Anweisungen bereit ist.
Weitere mathematische Funktionen müssen in BASIC- Schreibweise eingegeben wer den. Die Funktion wird in diesem Fall als BASIC-Wort, der zu behandelnde Wert (Argument) in Klammern dahinter eingetippt.
Beispiel:
'Berechne Quadratwurzel aus 16' wird eingegeben mit
? sqr(16) (RETURN drücken)
4
ready
Folgende Funktionen stehen zur Verfügung:
sqr(x) Quadratwurzel von x sin(x) Sinus von x (Bogenmaß) cos(x) Cosinus von x tan(x) Tangens von x atn(x) Arcustangens von x (Umkehrfunktion des Tangens) log(x) Natürlicher Logarithmus zur Basis e=2,7182818 exp(x) Exponent zur Basis e int(x) Integer (Schneidet Nachkommastellen der Zahl x ab) abs(x) Absolutwert der Zahl x (Vorzeichenunterdrückung) sgn(x) Signum (Ermittelt das Vorzeichen der Zahl x)
24
6.
6.1 Einführung
Systembefehle sind Kommandos, die der Rechner direkt annimmt und ausführt. Diese
Befehle sind notwendig, um Programme laden, speichern, oder verändern zu können.
Befehle werden grundsätzlich ohne SHIFT geschrieben (nur klein im Textmodus oder nur groß im Graphikmodus) und mit der Taste RETURN zur Ausführung an den Rechner übergeben.
Als Anwender müssen Sie natürlich nicht alle Systembefehle beherrschen. Wir haben hier nur die allerwichtigsten zusammengestellt. Sie werden sehen, daß alle hier aufgeführten Befehle voraussetzen, daß Sie ein Floppy-Laufwerk angeschlos sen haben. Bitte beachten Sie, daß beim CBM 3040 geringfügige Abweichungen von den beschriebenen Methoden nötig sind, sie gelten also nur für 4040 und 8030.
Sollten Sie nur über einen Rekorder verfügen, so schlagen Sie bitte bei Rekorderverwaltung nach, dort sind alle benötigten Befehle speziell für den
Rekorder zusammengestellt.
Eine kurze Übersicht soll Ihnen zeigen, welche Befehle im folgenden erklärt werden:
Systembefehle
SHIFT/RUN DLOAD RUN DIRECTORY BACKUP HEADER DSAVE COPY SCRATCH
Die Befehle sind in der Reihenfolge erklärt, wie Sie von Ihnen am wahrschein lichsten benötigt werden. D.h. die weiter hinten beschriebenen Befehle benötigen
Sie eventuell am Anfang gar nicht.
6.2 Erstes Programm laden und starten
Wenn Sie die Tasten SHIFT und RUN drücken, nachdem Sie die Anlage eingeschaltet haben, wird das erste Programm der Diskette im rechten Laufwerk geladen und automatisch gestartet.
Bei qualitativ hochwertiger Software ist dieses erste Programm ein sogenannter Systemstart, der erstens alle benötigten Programme automatisch lädt und zweitens
ab sofort mit Ihnen in deutschem Dialog in Verbindung tritt. In der Regel können
Sie dann durch Drücken einer Taste ein bestimmtes Programm aus einer ganzen Anzahl von angebotenen Programmen laden und starten.
erstes Programm laden und starten beliebiges Programm laden Programm starten Inhaltsverzeichnis der Diskette lesen Diskette duplizieren (Sicherungsduplikat) Neue Diskette anlegen Programm abspeichern Datei kopieren Datei löschen
25
6.3
Falls Sie unabhängig von einem 'Systemstart-Programm' ein bestimmtes Programm einer Diskette laden wollen, können Sie dies durch
tun. Dieser Befehl lädt das Programm 'NAME' vom rechten Laufwerk in den Arbeits speicher. Er teilt den Ladevorgang durch 'LOADING' mit und meldet sich mit
'READY.' zurück.
Falls das gewünschte Programm auf der eingelegten Diskette nicht vorhanden ist oder irgendein Diskettenfehler auftritt, wird
gemeldet. Überprüfen Sie in diesem Fall die richtige Schreibweise des Namens und ob die richtige Diskette eingelegt ist.
Wollen Sie ein Programm vom linken Laufwerk laden, so fügen Sie an den oben beschriebenen Befehl noch durch Komma getrennt 'D1' an:
Beliebiges Programm laden
DLOAD "NAME"
FILE NOT FOUND ERROR
DLOAD "NAME" , Dl
6.4 Programm starten
Ein Programm, das Sie durch DLOAD in den Speicher geladen haben, müssen Sie noch durch
RUN
starten, damit es für Sie tätig werden kann.
6.5 Inhaltsverzeichnis der Diskette lesen
Wenn Sie wissen wollen, welche Programme oder Dateien auf einer Diskette sind, können Sie durch
DIRECTORY
die Inhaltsverzeichnisse beider Disketten nacheinander auf den Bildschirm bringen. Denken Sie dabei an die Funktion der beiden Tasten ':/*' bzw. 'Pfeil nach links'.
Durch Anfügen von 'D0' oder 'D1', wieder durch Komma getrennt, können Sie gezielt das Inhaltsverzeichnis der rechten oder linken Diskette lesen:
Dir DO
Dir Dl
Wenn Sie den dritten Buchstaben von DIRECTORY mit SHIFT eingeben, versteht dies der Rechner als Abkürzung und Sie müssen das furchtbar lange Wort nicht immer ausschreiben.
26
6.6 Diskette duplizieren
Von Datendisketten kann nie zu oft ein Sicherungsduplikat erstellt werden, um bösen Überraschungen durch Verlust wertvoller Daten vorzubeugen. Sie können
Disketten vollständig duplizieren mit
BACKUP DO TO Dl rechte Diskette auf linke übertragen
( BACKUP Dl TO DO linke Diskette auf rechte übertragen )
Die Form des BACKUP ist:
BACKUP (dupliziere von) D (Laufwerk) 0 TO (nach) D (Laufwerk) 1
Links von 'TO' steht also das Quellaufwerk, rechts das Ziellaufwerk.
Wenn Sie immer die gleiche Richtung (DO TO Dl) verwenden, laufen Sie weniger
Gefahr, irgendwann die Richtung zu verwechseln.
Die Diskette in dem Laufwerk, das rechts von TO aufgeführt ist, wird völlig gelöscht!
Da eine falsche Anwendung dieses Befehls die Vernichtung der Daten zur Folge haben kann, die Sie eigentlich sichern wollten, beachten Sie bitte die folgenden Hinweise genau:
Schützen Sie die 'Quelldiskette' immer mit einem 'Schreibschutzaufkleber'!
Vergewissern Sie sich, daß die 'Zieldiskette' wirklich leer ist bzw. gelöscht
werden darf!
6.7 Neue Diskette anlegen
Fabrikneue Disketten müssen erst durch einen speziellen Befehl 'sektoriert'
werden, ehe sie Programme bzw. Daten aufnehmen können.
Durch die Anweisung
HEADER "NAME" , IXX
wird die Frage
ARE YOU SHURE?
ausgelöst, die sicherstellen soll, daß Sie nicht aus Versehen eine Diskette
löschen, die bereits Daten enthält. Diese Frage ist mit 'Y' oder 'YES' zu beantworten, sonst wird die HEADER-Anweisung ignoriert.
'NAME' ist der Diskettenname, er darf maximal 16 Zeichen lang sein.
Die beiden XX hinter I stehen stellvertretend für die 'Identität' der Diskette.
Diese Kennzeichnung ist zwei Zeichen lang.
Lassen Sie den Zusatz 'IXX' weg, so wird die Diskette nur gelöscht, aber nicht
sektoriert. Dies geht nur bei Disketten, die bereits in Gebrauch waren.
Durch die oben angeführte Anweisung wird die Diskette im rechten Laufwerk
sektoriert. Wie schon bei den vorhergehenden Befehlen, kann durch Zusatz von
'D1' erreicht werden, daß die Diskette im linken Laufwerk sektoriert wird.
Die Reihenfolge der einzelnen Angaben NAME, I oder D ist unwichtig, wichtig ist
nur, daß sie jeweils durch Komma getrennt werden.
27
6.8
Ein im Arbeitsspeicher stehendes BASIC-Programm können Sie mit
auf die Diskette im rechten Laufwerk abspeichern. Auch hier kann durch Anfügen von Dl auf das linke Laufwerk abgespeichert werden.
6.9 Datei kopieren
Einzelne Dateien können von einem Laufwerk auf das andere durch
kopiert werden. Wie schon bei BACKUP steht links von TO das Quellaufwerk und rechts das Ziellaufwerk. Neu sind die beiden Namen. Auch hier steht links der Name der Datei, die kopiert werden soll und rechts der Name der neuen Datei. Sie können - müssen aber nicht - gleich sein.
Wenn kein Name angegeben wird, werden alle Dateien der Quelldiskette auf die Zieldiskette kopiert. Der Unterschied zu BACKUP besteht darin, daß bei COPY die Zieldiskette nicht gelöscht wird, sie kann also bereits Dateien enthalten, zu denen noch die Dateien der Quelldiskette hinzukopiert werden.
Programm abspeichern
DSAVE "NAME"
COPY "NAME" , DO TO "NAME" , Dl
6.10 Datei löschen
Einzelne Dateien können Sie durch die Anweisung
SCRATCH "NAME"
löschen. Wenn der Zusatz 'D1' fehlt, wird auf dem linken Laufwerk gelöscht. Wie bei HEADER wird mit
ARE YOU SHURE?
nachgefragt, ob Sie dies ernst meinen. Antworten Sie auch hier durch 'Y'. Nach erfolgreichem Löschen wird gemeldet:
01 FILES SCRATCHED 01 00
Die zweite Zahl von rechts sagt Ihnen, daß 1 Datei gelöscht wurde.
Eine gelöschte Datei kann nicht wieder zurückgeholt werden, wenden Sie diese Anweisung also ähnlich sorgfältig an wie BACKUP und HEADER.
28
B. PROGRAMMIERER
HANDBUCH
Vorwort
Dieser Abschnitt soll kein Leitfaden zum Erlernen von allgemeinen Programmier techniken sein und auch nicht zum Erlernen von BASIC, sondern ein Nachschlage werk, in dem alle wissenswerten Fakten über die Programmierung Ihres COMMODORE - Computers zusammengestellt sind.
Lassen Sie sich von der Informationsfülle nicht abschrecken, Sie haben ja ein Nachschlagewerk vor sich. Die Informationen wurden sehr sorgfältig ausgewählt. Grundlage war die große Erfahrung des SOFTWAREVERBUND-MICROCOMPUTER in der Programmierung von Commodore-Rechnern und die Erfahrung aus vielen Anwenderseminaren, die vom Autor durchgeführt wurden.
Der Abschnitt B. gliedert sich in einen Teil über Datenarten und Interpreter eigenschaften und einen Teil, der alle BASIC-Anweisungen behandelt. Zuerst sollten Sie unbedingt die ersten Kapitel über Datenarten usw. gelesen haben, da in den Befehlsbeschreibungen auf diese Definitionen zurückgegriffen wird.
Wenn Sie schon irgendeine Programmiersprache beherrschen, werden Sie sich sicher in diesem Handbuch schnell zurechtfinden.
Kurze Einführungen sollen aber auch dem Anfänger ermöglichen, sich in die Mate rie einzuarbeiten.
Für Anfänger wollen wir noch zwei Hinweise geben:
(1) Haben Sie Mut zur Lücke. Das soll heißen, daß Sie sich nicht beim ersten Durchlesen an irgendwelchen Einzelheiten verbeißen sollen, die Ihnen unver ständlich erscheinen.
Viele Details werden erst im Zusammenhang mit anderen Fakten verständlich, so daß Sie also mindestens einmal alles gelesen haben müssen, um beim nächsten Mal mehr verstehen zu können.
Einige Details und auch ganze Anweisungen werden Sie am Anfang nicht benötigen, vielleicht auch nie. Merken Sie sich bei solchen vernachlässigten Stellen aber an, daß Sie sie nicht gelesen oder nicht verstanden haben. Vielleicht schmökern Sie später nochmal alle Stellen durch, die Sie so gekennzeichnet haben und fin den doch noch den einen oder anderen wertvollen Hinweis.
(2) Erkundigen Sie sich bei Ihrem Commodore-Händler nach Schulungskursen. In der Regel ist es leichter, sich nach oder während einer Einführung in Seminarform mit dem Computer anzufreunden, als sofort ins kalte Wasser zu springen.
Wir hoffen, daß dieses Handbuch Sie möglichst effektiv mit den außerordentlich vielfältigen Möglichkeiten Ihres Computers vertraut macht und daß Sie an seiner Programmierung genausoviel Spaß und Befriedigung haben werden wie der Autor und seine Mitarbeiter.
München, im Oktober 1980
SM SOFTWAREVERBUND MICROCOMPUTER GmbH
Hannes Schießl
29
I. DATEN
1. Datenarten
1.1 Einführung
Da Ihr Computer nicht nur rechnen, was 'to compute' eigentlich bedeutet, son dern auch nichtnumerische Zeichenfolgen behandeln kann, unterscheidet er zwi schen zwei grundverschiedenen Datenarten, nämlich zwischen numerischen und nichtnumerischen Daten.
- numerische Daten:
Numerische Daten sind ganz einfach Zahlen. Ihr Computer kann mit Zahlen rech
nen, also alle arithmetischen und mathematischen Funktionen und Verknüpfungen
damit durchführen.
- nichtnumerische Daten:
Dies sind Zeichenfolgen, die für den Computer keinerlei Bedeutung haben, die er aber aufgrund Ihrer Anweisungen zerteilen oder zusammensetzen kann. Diese Zei chenfolgen ('Strings') werden oft nicht ganz exakt als 'Text' bezeichnet, ob wohl sie wesentlich mehr enthalten können, als Text.
INTERPRETER CODES
Zusätzlich zur Datenart ist eine Unterscheidung nötig, wie die Daten dargestellt werden, bzw. wo sie stehen. Hier sind Konstante und Variablen zu trennen.
Die einfachste Form sind Konstante. Sowohl Zahlen als auch Strings können als Konstante direkt im Programmtext auftreten.
Was dem Computer aber erst seine Leistungsfähigkeit gibt, sind Variable. Variable sind Namen von Speicherplätzen, in denen Zahlen oder Strings stehen können.
Nach dieser kurzen Einführung werden im folgenden alle verwendeten Datenarten und Darstellungsformen definiert und erläutert.
1.2 Numerische Daten
Ihr CBM unterscheidet sechs verschiedene numerische Datenarten, von denen fünf in jeder Form im Programm verwendet werden können.
1.2.1 Gleitkomma-Zahlen
Die Gleitkommadarstellung ist die mächtigste Zahlenart, da sie alle anderen drei Formen numerischer Daten als Sonderfälle enthält. In der allgemeinsten Form besteht eine Gleitkommazahl aus der Mantisse mit ihrem Vorzeichen und
aus dem Exponenten zur Basis
10 mit seinem Vorzeichen.
30
Beispiel -1.2345 E - 3 =
1.2345 E .057
125.03
-3
3 =
=
= =
-0.0012345
1234.5
0.057
125.03
-3
Der darstellbare Zahlenbereich liegt für den absoluten Betrag der Zahl zwischen
1.7 E 38 und 2.94 E -39
Die exakten Werte liegen
bei 2 h +127 = 1.70141183 E +38 und 2 h -128 = 2.93873594 E -39
('h' steht für 'Pfeil nach oben', lies 'hoch')
Wird der absolute Betrag überschritten, wird OVERFLOW ERROR gemeldet, wird er unterschritten, erfolgt keine Fehlermeldung, aber das Ergebnis ist Null.
WERT größer als 1.7 E +38 oder WERT kleiner als -1.7 E +38 ergibt OVERFLOW ERROR
WERT kleiner als 2.9 E -39 oder WERT größer als -2.9 E -39 ergibt 0
Die Mantisse wird mit einer Genauigkeit von 9 Dezimalstellen verarbeitet und ge speichert.
(Exakt kann die Mantisse +/- 2 exp 32 = 4294967296 Möglichkeiten darstellen, das sind fast 9.5 Dezimalstellen.)
Positive Vorzeichen müssen nicht geschrieben werden und werden nicht ausgegeben. Der Exponent kann entfallen, wenn man Zahlen hat, die sich durch 9 Stellen darstellen lassen. Wann bei der Ausgabe von der Darstellung ohne Exponent in die normalisierte Exponentialdarstellung (scientific notation) übergegangen wird,
ist bei PRINT beschrieben. Mögliche Eingabeformate sind bei INPUT bzw. STR$
beschrieben.
Das 'E' für Exponent muß immer ohne SHIFT getippt werden, unabhängig davon, ob dann ein großes oder kleines E auf dem Bildschirm steht.
Beachten Sie bitte, daß der Punkt in 1.234 nicht versehentlich zu einem Komma wird, ein SYNTAX ERROR bzw. EXTRA IGNORED wäre die Folge.
Alle Zwischenergebnisse in arithmetischen und mathematischen Ausdrücken werden intern im Gleitkommaformat ausgedrückt, unabhängig davon, ob das Ergebnis
vielleicht einen Integer- oder Bytewert darstellen muß!
Intern wird eine Gleitkommazahl in 5 Bytes dargestellt, wobei 1 Byte den Expo nenten und 4 Bytes die Mantisse enthalten.
1.2.2 Integer (ganze Zahl)
Der Integerbereich ist definiert von
-32767 bis +32767
In einer Integerzahl kann kein Punkt Vorkommen, weil nur ganze Zahlen zuge lassen sind.
Wird der Integerbereich über- oder unterschritten, so wird ILLEGAL QUANTITY ERROR gemeldet. Dagegen wird kein Fehler gemeldet, falls das Ergebnis eines Ausdrucks Nachkommastellen enthält:
31
Zahlen mit Nachkommastellen werden in die nächstkleinere Zahl umgewandelt. Bei positiven Zahlen ist dies gleichbedeutend mit dem Abschneiden des Nachkomma teils, bei negativen bedeutet es betragsmäßig aufrunden!
123.456 ergibt 123
-123.456 ergibt -124
Intern wird eine Integerzahi in 2 Bytes dargestellt, die in der Reihenfolge HIGH, LOW abgespeichert sind: WERT = 256*HIGH + LOW
1.2.3 Bytezahl
In vielen BASIC-Befehlen kommen Parameter vor, die nur die ganzzahligen Werte von
0 bis 255
annehmen dürfen. Wir bezeichnen sie als Byte-Werte, weil durch ein Byte genau dieser Wertebereich dargestellt werden kann.
Auch hier ist ILLEGAL QUANTITY ERROR die Folge, wenn negative Zahlen oder Zahlen größer als 255 verwendet werden. Etwaige Nachkommastellen werden abge
schnitten.
1.2.4 Logische Daten
Das Ergebnis von logischen Ausdrücken wird als wahr oder falsch bezeichnet, kann also nur zwei verschiedene Werte annehmen. Im Gegensatz zu anderen Sprachen wird in BASIC falsch als 0 und wahr als -1 dargestellt. Die Darstellung logischer Werte erfolgt also durch Zahlenwerte!
Während das Ergebnis von logischen Ausdrücken nur die beiden Werte 0 und -1 an nehmen kann, bedeutet für IF THEN nur der Wert 0 falsch und jeder andere Wert wahr.
1.2.5 Adressdaten
Bei den Befehlen PEEK, POKE, SYS, USR und WAIT müssen absolute Maschinen adressen angegeben werden. Diese 16-Bit-Adressen können Werte annehmen zwischen
0 und 65535 (2 h 16 - 1)
Verläßt man diesen Bereich, so wird ILLEGAL QUANTITY ERROR gemeldet.
32
1.2.6
BASIC Zeilennummern können ganze Zahlen sein zwischen
Versucht man eine größere Zeilennummer als 63999 oder eine negative einzugeben,
wird SYNTAX ERROR gemeldet!
Ein wesentlicher Unterschied zwischen BASIC Zeilennummern und den fünf vorher besprochenen Zahlenarten ist zu beachten:
BASIC-Zeilennummern können nicht durch arithmetische Ausdrücke berechnet werden und auch nicht in Variablen stehen. Sie müssen in den entsprechenden BASIC­Befehlen also immer als Konstante angegeben werden.
1.3 Strings
Ein String ist wörtlich übersetzt eine (Zeichen-) Kette. Ein String kann be liebige alphanumerische Zeichen enthalten. Meistens handelt es sich dabei um Text. Allgemeiner formuliert handelt es sich um druckbare Zeichen (-Codes). Allerdings kann der Inhalt einer Stringvariablen auch wesentlich allgemeiner definiert werden, nämlich als Bytefeld, in dem jedes Byte z.B. einen Dezimal wert von 0 bis 255 repräsentieren kann.
BASIC-Zeilennummern
0 und 63999
Ein sehr wichtiger Unterschied zwischen String- und Zahlendaten ist, daß der Computer den 'Sinn' eines Strings nicht verstehen kann, während er ja den Zah lenwert von Zahlen 'versteht', also damit rechnen kann.
Strings und Zahlen sind also grundverschiedene Datentypen, die nicht verwech selt werden dürfen. Passiert es doch, wird TYPE MISMATCH ERROR gemeldet.
33
2 . Dars t e 11 ungsweisen von Daten
2.1 Variable
Variable sind Namen für Speicherplätze, in denen sich der Computer Zwischen ergebnisse merken kann. Es gibt zwei Unterscheidungskriterien bei Variablen.
Einerseits gibt es Variablen für Gleitkomma- und Integerzahlen, sowie für Strings.
Andererseits gibt es einfache Variable, die nur 1 Zahlenwert oder 1 String enthalten können und im Gegensatz dazu indizierte Variable oder Variablen
felder, die mehrere Werte unter dem gleichen Namen enthalten. Die Werte sind
dann einfach 'durchnummeriert'.
2.1.1 Variablennamen
Die Regeln für die Variablennamen sind unabhängig vom Variablentyp folgende:
Ein Name besteht aus maximal zwei Zeichen. Das erste Zeichen ist immer ein Buchstabe, das zweite kann entfallen oder ist ein Buchstabe oder eine Ziffer.
Beispiel: AB
XI
C
Um Mißverständnissen vorzubeugen, sei auch hier erwähnt, daß Variablennamen immer ohne SUFT eingegeben werden müssen, auch wenn sie dann im Text modus als kleine Buchstaben auf dem Bildschirm erscheinen!
Grundsätzlich können Namen auch länger als zwei Zeichen sein, aber erstens wer den nur die ersten zwei zur Unterscheidung herangezogen, so daß VAR1 und VAR2 denselben Speicherplatz bezeichnen. Zweitens gibt es Konflikte mit BASIC-Befeh­len, wenn Befehlsworte im Namen enthalten sind, z.B. erzeugt 'UNSINN = 7' einen 'SYNTAX ERROR', weil SIN (Sinus) enthalten ist.
Da man bei längeren Namen oft nicht merkt, daß ein Befehl enthalten ist, und es nur Platz und Zeit kostet, aber keinen Gewinn bringt, wird empfohlen, nur Namen mit maximal zwei Zeichen zu verwenden.
Folgende Variablen sind für die angegebenen Zwecke reserviert und dürfen mit der Ausnahme TI$ nicht neue Werte zugewiesen bekommen:
DS Disk Status (Nummer) DS$ Disk Status (Text)
ST Peripherie-Status TI TIME (Zeit in 1/60 Sekunden) TI$ TIME (Zeit in Stunden, Minuten,
Die folgenden Namen sind für Variable nicht
Sekunden)
zugelassen (ergibt SYNTAX ERROR)!
FN Funktion
IF IF THEN
ON ON GOTO / GOSUB OR ODER
TO FOR ... TO
34
2.1.2 Variablentypen
Wie erwähnt, gibt es die drei Variablentypen Gleitkomma, Integer und String. Wenn nach dem Namen ein % (Prozentzeichen) steht, handelt es sich um eine Integervariable, wenn ein $ (Dollarzeichen) steht, um eine Stringvariable. Wenn keines dieser beiden Zeichen folgt, ist immer eine Gleitkommavariable gemeint.
Beispiel: AC Gleitkomma
AC% Integer AC$ String
Diese drei Variablen verweisen auf drei verschiedene Speicherplätze, obwohl sie denselben Namen haben!
Eine Gleitkommavariable kann als Inhalt jede Zahl haben, die der Definition der Gleitkommazahl genügt.
Entsprechend kann eine Integervariable nur eine Integerzahl aufnehmen.
Eine Stringvariable kann Strings bis zu einer maximalen Länge von 255 Zeichen (Bytes) aufnehmen. Dabei paßt sich die Variable der jeweils aktuellen String länge automatisch an. Man muß nicht wie in anderen BASIC-Dialekten den benötig ten Platz vorher belegen.
Wird die Länge von 255 überschritten, so wird STRING TOO LONG ERROR gemeldet und der entsprechende Befehl nicht ausgeführt.
Eine Stringvariable kann auch gar kein Zeichen enthalten, wir bezeichnen ihren Inhalt dann als den leeren String.
2.1.3 Indizierte Variable
Jede der drei Variablenarten kann nicht nur als einfache Variable auftreten, sondern auch als indizierte Variable. Andere Bezeichnungen dafür sind: Matrix, Vektor, Feld.
Gekennzeichnet sind indizierte Variable durch die Indizes, die in Klammern hinter dem Namen folgen.
Beispiel: AB (3) eindimensionales Gleitkommafeld
AB% (3,7) zweidimensionales Integerfeld AB$ (I) eindimensionales Stringfeld
Einzelheiten darüber sind bei DIM zu finden. Die Anzahl der Dimensionen ist nur durch den Platz in der BASIC Zeile begrenzt, die Anzahl der Elemente pro Dimen sion und insgesamt nur durch den Platz im Arbeitsspeicher.
35
2.1.4 Platzbedarf von Variablen
Jede einfache Variable belegt unabhängig vom Typ 7 Bytes im Arbeitsspeicher. Bei den Zahlenvariablen (Gleitkomma und Integer) ist darin schon der Zahlenwert
enthalten. Bei Strings hingegen kommen noch die Anzahl der Zeichen hinzu, die die Variable gerade enthält, sowie 2 Bytes zusätzlicher Verwaltungsbedarf für jeden nicht leeren String.
Bei Feldern hängt der Platzbedarf vom Typ ab:
Typ
Integer
Gleitkomma
String
Für die Verwaltung der Felder sind zwar auch einige Bytes nötig, aber nur ein
mal pro Feld, so daß man diesen Bedarf gegenüber dem Bedarf für jedes Element
vernachlässigen kann.
Variable können jederzeit eingeführt, aber nicht mehr einzeln gelöscht werden.
Vor allem bei Feldern muß diese Eigenschaft schon während der Planung der
Datenstruktur berücksichtigt werden.
2.1.5 Zugriffszeiten auf Variable
Einfache Variable werden in einer Variablentabelle abgelegt. Jede angesprochene Variable, die noch nicht in der Tabelle steht, wird am Tabellenende angehängt. Da Variablen bei jedem Aufruf vom Tabellenanfang her gesucht werden, erfolgt der Zugriff umso schneller, je früher (zeitlich) die Variable im Programm an gesprochen wurde.
Die Tabelle der Feldvariablen kommt unmittelbar anschließend an die einfachen Variablen. Sind bereits Felder definiert wenn noch zusätzliche einfache Varia ble im Programm auf tauchen, so müssen alle Felder mit ihrem Inhalt nach hinten
verschoben werden. Der Zeitbedarf dafür kann bei großen Feldern beträchtlich
sein. Bei Zeitproblemen sollten also große Felder erst dimensioniert werden,
nachdem alle einfachen Variablen im Programm angesprochen wurden.
Bytes pro Element
2
5 3 + 2 + Stringinhalt
2.2 Konstante
Sowohl Zahlen als auch Strings können als Konstante direkt im Programmtext
auftauchen.
Beispiel: A = 3
B%= 15 A$= "TEXT" D$= ""
Stringkonstante sind in der Regel durch Anführungszeichen einzurahmen. Eine
spezielle Stringkonstante sind zwei unmittelbar aufeinanderfolgende Anführungs
zeichen. Sie definieren den leeren String.
Bitte beachten Sie folgenden Unterschied zwischen Zahlen- und Stringkonstanten:
Während jeder mögliche Zahlenwert als Konstante ausgedrückt werden kann, sind bei Stringkonstanten einige Einschränkungen zu beachten:
36
Länge
In einer String-Variablen können maximal 255 Zeichen stehen, aufgrund der Beschränkungen der Bildschirmverwaltung können aber in einer String-Konstanten
nur maximal ca. 70 Zeichen stehen.
Codes
Nur die 128 ASC-Codes, die die nicht-reversen druckbaren Zeichen darstellen (32-95 und 160-223) und einige Steuerzeichen (0-31 und 128-159) können in Stringkonstanten dargestellt werden.
3. Umwandlungen zwischen Datenarten
Durch verschiedene Operationen sind Umwandlungen von einem Datentyp in einen
anderen möglich.
Die Umwandlungsbefehle zwischen Strings und Zahlen sind
ASC / CHR$ VAL / STR$
Sie sind unter diesen Namen beschrieben.
Hier soll nur auf die Umwandlung zwischen Gleitkomma- und Integerzahlen einge gangen werden:
3.1 Integer in Gleitkomma
Die Umwandlung von Integer in Gleitkomma ist immer möglich und hat auf den Wert keine Auswirkungen.
Beispiel: A = A%
3.2 Gleitkomma in Integer
Die Umwandlung von Gleitkomma in Integer ist nur möglich, wenn die Gleitkomma zahl im Integer-Bereich liegt:
Beispiel: 10 A = 20156
20 A%= A
Ist dies nicht der Fall, wird ILLEGAL QUANTITY ERROR gemeldet.
Beispiel: 10 A = 50000
20 A%= A RUN ergibt ILLEGAL QUANTITY ERROR IN 20
Wenn der (positive) Gleitkommawert Nachkommastellen enthält, werden diese abgeschnitten, es wird also nicht gerundet:
Beispiel: 10 A = 123.256
20 A%= A 30 PRINT A% RUN ergibt 123
37
Exakter ausgedrückt, wird die nächstkleinere ganze Zahl gebildet. Dies ist bei negativen gebrochenen Zahlen zu beachten:
Beispiel: 10 A = -123.256
20 A%= A
30 PRINT A% RUN ergibt -124
3.3 Rundungsfehler und Integerzahlen
(s. dazu auch den Abschnitt über numerische Ausdrücke)
Jede arithmetische und mathematische Operation wird auf Gleitkommabasis aus geführt, es existiert also kein gesondertes Integer-Arithmetik-Paket!
Viele BASIC-Anweisungen haben Parameter, die keine gebrochenen Zahlen sein dürfen. Diese ganzzahligen Parameter können Integer- oder Byteparameter sein. Da aber in BASIC jeder Parameter als beliebig komplexer Ausdruck auftreten kann, und Zahlenausdrücke auf Gleitkommobasis ausgewertet werden, wird das Ergebnis solcher Ausdrücke automatisch in Ganzzahl-Format umgewandelt. Da nun grundsätzlich nicht auszuschließen ist, daß in umfangreichen Gleitkomma operationen sich die zwangsläufigen Rundungsfehler aufgrund der endlichen Man
tisse bis in die neunte Stelle schleppen, können intern Ergebnisse wie
123.999999 anstatt 124
auftreten. Beim Abschneiden auf Integerformat wird aus einem Fehler von 1E-6, der zu vernachlässigen wäre, ein Fehler von 1, der einen Algorithmus 'zu Fall bringen kann'.
Am Beispiel des Indexes von Feldvariablen können Sie dies leicht einsehen.
Sobald also ein Algorithmus bei Zwischenergebnissen die ganze Genauigkeit der
Mantisse von 9 Stellen benötigt, muß an geeigneten Stellen durch Rundung (s.
INT) dafür gesorgt werden, daß sich Fehler nicht fortpflanzen können!
In den meisten Fällen wird dies allerdings nicht nötig sein, weil Algorithmen, die ein maximal fünfstelliges Ergebnis liefern, selten mit neunstelligen Zwischenergebnissen arbeiten.
38
4.
Bis jetzt sind die verschiedenen Datenarten (Zahlen, Strings) vorgestellt wor den, sowie ihre Erscheinungsformen (Konstante, Variable). Um bei den BASIC Befehlen möglichst einfach die einzelnen Parameter beschreiben zu können, wollen wir den Begriff des Ausdrucks einführen.
Ein Ausdruck kann bestehen aus Konstanten, Variablen, Verknüpfungsoperatoren und Funktionen.
Beispiel: SIN(7*Z/5) numerischer Ausdruck
Wir unterscheiden folgende Ausdrücke nach ihren Ergebnissen:
numerisch Gleitkomma-Ausdrücke
logisch logische Ausdrücke String String-Ausdrücke
Entsprechend den Datendefinitionen ergibt sich aus einem Gleitkomma-Ausdruck ein Gleitkomma-Ergebnis usw.
Ausdrücke und Operatoren
"abc"+A$+LEFT$(Z$,3) Stringausdruck A 3 AND B 5 logischer Ausdruck
Integer-Ausdrücke Byte-Ausdrücke
Äußerlich unterscheiden sich die drei numerischen Ausdrücke nicht. Dagegen unterscheiden sich numerische, logische und Stringausdrücke sehr stark.
Allen Ausdrücken ist gemeinsam, daß sie sehr komplexe Formen annehmen können. Allgemein kann ein Ausdruck so definiert werden:
Ausdruck := Ausdruckl Operator Ausdruck2
Ein Ausdruck kann also seinerseits wieder aus Ausdrücken zusammengesetzt sein.
Die einfachste Form eines Ausdrucks ist nur eine Konstante oder Variable oder Funktion:
Ausdruckl:= 5 Ausdruck2:= AC Ausdruck3:= SIN(5)
Die nächstkomplexere Form ist die Verknüpfung zweier Konstanten oder Variablen oder Funktionen
Ausdruckl:= 5+A Ausdruck2:= AC*BC Ausdruck3:= 2*SIN(A)
Im einfachsten Fall kann ein Ausdruck also aus nur einer Konstanten bestehen, im komplexesten aus mehreren geschachtelten Ausdrücken. Die Schachtelungstiefe
hängt auch von der Anzahl der GOSUBs und FOR NEXT Schleifen ab (s. Stack).
Bei der Behandlung der einzelnen BASIC Befehle werden die Parameter nur durch
die Art des Ausdrucks definiert. Es wird nicht jedesmal erwähnt, daß ein Aus druck beliebig einfach (Konstante) oder sehr komplex sein kann. Anders ausge drückt dürfen nur BASIC Zeilennummern nur als Konstante auftreten (z.B. LIST 10 - 20), während alle anderen Parameter von Befehlen allgemeine Ausdrücke
des jeweiligen Typs sind!
39
4.1
Numerische Ausdrücke und Operatoren
Numerische Operatoren
Operation Operator
Potenz
h (Pfeil n. oben)
Negation
Beispiel
X h Y
<
X
1
(unäres Minus)
Multiplikation Division
Addition
Subtraktion
* /
+
-
X*Y X/Y
X+Y X-Y
Entsprechend der mathematischen Definition bindet die Potenzierung stärker als die Multiplikation/Division und diese stärker als Addition/Subtraktion. Inner halb der gleichen Hirarchiestufe werden Ausdrücke von links nach rechts ausge wertet. Durch Klammern können die Standard-Hierarchien durchbrochen werden.
Beispiel:
Ausdruck Zwischen-Ergebn.
2+3 *5 = 2+13 = 17
(2+3)*5 = 3*3
= 25
2 h 3*2 = 8*2 = 16
2 h (3*2) = 2h6 = 64
Erläuterung
'Punkt vor Strich'
Klammern binden am stärksten
Exponentiation bindet stärker als Multiplikation Klammern binden stärker als Exponentiation
2 h -3 2 h (-3) = .125
-2 h 3
-2 h -3
-2*3 = -6
-2*-3 = 6
-2*3 = 6
= .125 2h-3 = l/(2h3)
überflüssige Klammern schaden nicht = -8 = -.125
-2h3 = (-2)*(-2)*(-2)
-2h-3= (-0.5)*(-0.5)*(-0.5)
minus mal plus ergibt minus
minus mal minus ergibt plus
-2 = (-l)*(-2)
Maximal kann ein Ausdruck 9 Klammerebenen enthalten. Wird diese Anzahl über
schritten, wird OUT OF MEMORY ERROR gemeldet.
Näheres ist unter Stack beschrieben. Abhilfe kann leicht geschaffen werden,
indem der Ausdruck in mehrere Teilausdrücke zerlegt wird, deren Ergebnisse in mehreren Variablen zwischengespeichert werden. Im nächsten Schritt werden dann
diese Variablen in der gewünschten Weise verknüpft. Natürlich kann diese Unter
teilung in beliebig viele Teilschritte erfolgen. Dieser Methode sind keine Gren zen gesetzt:
Beispiel A = (B+C) * (D+E)
kann ersetzt werden durch: Zl= B+C Z2= D+E A = ZI * Z2
Die Fehlermeldungen OVERFLOW ERROR und ILLEGAL QUANTITY ERROR sind bei den Datenarten beschrieben. Wird versucht, durch 0 zu dividieren, so wird DIVISION BY ZERO ERROR gemeldet.
40
4.2 Logische Ausdrücke und Operatoren
Der Computer kann zwei numerische oder String-Ausdrücke vergleichen, um festzu stellen, ob sie gleich bzw. ungleich sind, oder ob einer größer oder kleiner als der andere ist.
Mehrere solcher Entscheidungsergebnisse kann er durch die logischen Operatoren
NOT, AND und OR verknüpfen. Auf diese Weise können sehr komplexe Entscheidungen
getroffen werden, die mit Hilfe von
IF (logischer Ausdruck) THEN
den Programmablauf beeinflussen können. Dies ist bei IF THEN beschrieben.
Darüber hinaus kann aber das Ergebnis einer logischen Entscheidung auch in
Variablen zur späteren Verwendung aufbewahrt werden.
Ehe aber diese Feinheiten betrachtet werden, sollen die 3 Vergleichs-Operatoren mit ihren 6 Kombinationsmöglichkeiten vorgestellt werden:
Das Symbol für kleiner als ist spitze Klammer auf, und für größer als ist spitze Klammer zu.
Aus technischen Gründen können diese Symbole hier im Text nicht dargestellt werden, und
werden deshalb
durch k (kleiner als) bzw. g (größer als) ersetzt.
4.2.1
Operator
_
g
k =k oder k= =g oder
gk oder
Bei Zahlen ist die Bedeutung
Vergleichsoperatoren
Bedeutung
gleich
größer als
kleiner als kleiner/gleich A =k 3 größer/gleich A
g=
ungleich
kg
dieser
auf Strings bedarf aber einer Erklärung:
Beispiel
Bedeutung:
ist der Inhalt der Variablen A
A = 3 A
g 3
A k 3
identisch mit dem Wert 3
größer als 3 kleiner als 3 kleiner oder gleich 3
g= 3
A gk 3
größer oder gleich 3 ungleich 3 (größer oder kleiner als 3)
Entscheidung offensichtlich. Die Anwendung
41
4.2.2 Vergleich von Strings
'=' stellt fest, ob die Ergebnisse beider Stringausdrücke identisch sind, ob die Strings also in allen Zeichen übereinstimmen.
'gk' stellt fest, ob die Strings nicht in allen Zeichen übereinstimmen. Anders
ausgedrückt, wird hier mit 'wahr' geantwortet, wenn mindestens ein Zeichen verschieden ist.
'g' bzw. 'k' prüft die alphabetische Reihenfolge. Ist ein String 'kleiner' als der andere, so steht er im Alphabet weiter vorne.
Einige Beispiele sollen diesen leistungsfähigen Vergleich verdeutlichen. Die
angegebenen Vergleiche erzeugen eine wahre Aussage:
1) "ABC" = "ABC"
2) "ABC" gk "ABX"
3) "ABC" k "BCD"
4) "ABC" k "BC"
3) "ABC" g "AB"
Allgemein wird der ASC Code der 1., 2., 3. usw. Zeichen beider Strings ver glichen:
Solange die Codes identisch sind, werden die Strings als gleich bezeichnet (1).
Wird an einer Stelle ein Unterschied festgestellt, wird abgebrochen und das Ergebnis lautet 'ungleich' (2).
Falls kleiner oder größer gefragt war, wird ebenfalls anhand der ersten Un gleichheit entschieden, was zutrifft (3).
Grundsätzlich wird also nur bis zur ersten Ungleichheit verglichen! Ein Sonder fall wird durch diese Definition ebenfalls erklärt: Wenn ein String zu Ende
ist, aber beide so weit identisch waren, so ist der kürzere der kleinere, weil das leere Stringelement (für das es keinen ASC Code gibt!) als kleiner defi niert ist, als jeder andere ASC Code! (3)
Wie Beispiel (4) zeigt, ist nicht die Länge der Strings ausschlaggebend. Ein längerer String kann im Alphabet durchaus weiter vorne stehen, also 'kleiner' sein als ein kürzerer!
4.2.3 Wahr und falsch
Wenn nur innerhalb von IF ... THEN Entscheidungen getroffen werden, genügt es zu wissen, daß 'wahr' den Programmlauf hinter THEN fortsetzt, 'falsch' dagegen in der nächsten BASIC Zeile (s. IF THEN).
Für kompliziertere Entscheidungen ist es hilfreich zu wissen, wie der Computer die Werte 'wahr' und 'falsch' darstellt. Im Gegensatz zu anderen Computerspra chen kennt BASIC keine speziellen logischen (boolean) Werte und Variable, son dern stellt diese beiden Werte durch Integer-Zahlen dar:
42
Das Ergebnis eines logischen Ausdrucks ist
und
Beispiel:
0 für 'falsch'
-1 für
? 5 g 3
'wahr'
Fünf ist größer als 3 ist eine wahre Aussage.
(false / nein)
( true / ja )
-1
? 3 g 5
0
A = 3 g 3 ? A
Drei ist größer als 5 ist eine falsche Aussage.
Das Ergebnis des logischen Ausdrucks kann in eine Zahlenvariable übernommen werden.
-1
Intern wird ein logischer Wert wie jede Integer Zahl als 16-Bit-Zahl darge stellt. Bei '-1' sind alle Bits gesetzt, bei '0' entsprechend alle gelöscht.
4.2.4 Verknüpfung von logischen Ausdrücken durch NOT, AND und OR
NOT, AND und OR führen im Grunde bitweise logische Verknüpfungen mit zwei 16-Bit-Zahlen durch. Dies ist aber nicht wichtig zu wissen, wenn man nur logi sche Ausdrücke verknüpfen will. Für diesen Fall kann man diese drei Operatoren leicht verständlich definieren:
Werden zwei logische Ausdrücke durch AND verknüpft, so ist das Ergebnis genau dann 'wahr' (-1), wenn beide Ausdrücke 'wahr' sind.
Bei OR ist das Ergebnis schon dann 'wahr', wenn wenigstens einer der beiden Ausdrücke 'wahr' ist.
NOT verknüpft nicht zwei Ausdrücke, sondern ist ähnlich wie das arithmetische Vorzeichen (unäres Minus) einem logischen Ausdruck vorangestellt und kehrt seinen Wert ins Gegenteil um.
In der folgenden Tabelle sind alle Kombinationsmöglichkeiten nochmal zusammen gestellt.
Verknüpfung
falsch falsch AND wahr wahr AND wahr AND wahr wahr
falsch OR falsch falsch
falsch
wahr OR
wahr
AND
OR wahr wahr
OR wahr
falsch falsch
falsch falsch
falsch wahr
Ergebnis
falsch
wahr
NOT wahr
NOT falsch
Ergänzende Informationen zu den logischen Ausdrücken sind bei IF THEN, NOT,
AND, OR und WAIT zu finden.
falsch wahr
43
4.2.5 Hierarchie
Bei der Auswertung von logischen Ausdrücken bzw. von Zahlenausdrücken gelten gewisse Hierarchiestufen oder Bindungsregeln. In der folgenden Tabelle sind nochmal alle Operatoren geordnet von der stärksten zur schwächsten Bindung aufgeführt:
Mathematische Operatoren
Funktionen (SIN, FN, EXP usw)
(Vorzeichen, unäres Minus)
h (Exponentiation)
* /
Vergleichsoperatoren
= g k (alle Vergleichsoperatoren sind gleichberechtigt)
Logische Operatoren
NOT AND OR
Diese Hierarchien werden vom Computer sehr konsequent eingehalten. Da solche Strukturen erfahrungsgemäß Vorstellungsschwierigkeiten bereiten, und deshalb zu Programmierfehlern führen, sollten Sie folgenden Tip beherzigen: Solange Ihnen diese Regeln nicht wirklich geläufig sind, spendieren Sie lieber einige (über flüssige) Klammern, können aber dann sicher sein, daß der Rechner das tut, was Sie eigentlich wollen. Einige Beispiele sollen die Problematik verdeutlichen:
4.2.6 Beispiele zu logischen Operationen
Automatische Durch Klammem Hierarchie verdeutlicht/erzwungen
A=B AND C=D (A=B) AND (C=D) (1)
A=B OR C=D AND E=F (A=B) OR((C=D) AND(E=F)) (2)
((A=B) OR (C=D))AND(E=F)
A = B AND C (A= B)AND C (3)
A=(B AND C)
Fall (1) ist problemlos. In dieser Entscheidung wird lediglich gefragt, ob gleichzeitig A=B und C=D ist. Wenn man die jeweils zwei denkbaren Fälle (gleich oder nicht gleich) gegenüber stellt, ergeben sich insgesamt 4 Kombinationsmög lichkeiten. In der folgenden Art kann man diese Möglichkeiten sehr übersichtlich darstellen.
1100 A=B 1010 C=D 1000 AND
Die beiden Fälle wahr und falsch sind hier durch die Werte 1 und 0 repräsen tiert. Wenn man sich zu der 1 noch das Minus denkt (-1) stellen die Tabellen
gleich die internen Werte im Computer dar.
44
Etwas komplizierter werden die Überlegungen zum Fall 2. Je nach Klammersetzung werden die Operationen in verschiedener Reihenfolge durchgeführt. Wie die Tabel len zeigen, führt dies zu verschiedenen Ergebnissen:
A=B OR (C=D AND E=F) (A=B OR C=D) AND E=F
11001100 C=D 10101010 E=F 10001000 AND 11110000 A=B 11111000 OR
An diesem Beispiel sehen Sie schon sehr deutlich, daß eine unüberlegt gesetzte (oder weggelassene) Klammer das Ergebnis grundlegend verändern kann.
Das Beispiel 3 zeigt Ihnen, daß der Computer sogar mit Ausdrücken etwas anfangen kann, die mit der 'Alltagslogik' nicht mehr zu verstehen sind. Im Sinne der Boolschen Algebra sind diese Ausdrücke aber exakt definiert und deshalb hat der Computer damit keine Schwierigkeiten:
(A=B) AND C A = (B AND C)
11110000 A 11001100 B
11000011 =
10101010 C
11110000 A=B 11001100 C=D 11111100 OR 10101010 E=F 10101000 AND
11001100 B 10101010 C 10001000 AND 11110000 A
10000111 =10000010 AND
45
4.3 String-Ausdrücke und -Operatoren
Stringausdrücke sind wesentlich einfacher aufgebaut, als numerische und logi
sche Ausdrücke, da sie nur einen Operator kennen, also ohne Hierarchieregeln
einfach von links nach rechts abgearbeitet werden.
Der Operator für Stringausdrücke ist + und bewirkt die Aneinanderreihung von Teilstrings von links nach rechts. Diese Reihenfolge kann auch durch Klammern nicht geändert werden.
Eine häufige Fehlermeldung bei Stringausdrücken ist STRING TOO LONG ERROR, wenn
der Ergebnis-String oder ein Zwischenergebnis-String länger als 235 Zeichen
werden sollte.
Weiterhin kann es zum TYPE MISMATCH ERROR kommen, wenn anstatt eines Teilstrings ein Zahlenausdruck im Stringausdruck steht.
Beispiele von Stringausdrücken:
10 A$="abc"+"123" 20 ?A$ abcl23
10 A$="abc":B$="123":A$=B$+A$+"def" 20 ?A$ 123abcdef
10 A$="abc"+123 TYPE MISMATCH ERROR IN 10
10 FOR I = 0 TO 255 20 A$ = A$ + 30 NEXT STRING TOO LONG ERROR IN 20
Weitere Beispiele sind bei den Befehlen LEFT$, RIGHTS und MID$ zu finden.
Beachten Sie die Reihenfolge der Aneinanderreihung!
Weil 123 nicht in Anführungszeichen eingeschlossen ist, wird es als Zahlen-Konstante und nicht als String-Konstante interpretiert.
A$ soll mit aufgefüllt werden. Die Schleife durchläuft aber 256 Werte und will deshalb 256 Zeichen in den String schreiben. Anfangswert 1 statt 0 würde z.B. funktionieren.
46
5.
Das BASIC Programm im Arbeitsspeicher wird Zeichen für Zeichen vom Interpreter
abgetastet und ausgeführt. Dabei muß der Interpreter im ersten Schritt jeden
Befehl erst einmal analysieren. Erst nachdem dies geschehen ist, kann der Be
fehl ausgeführt werden.
Der Interpreter ist selbst ein Programm, allerdings in Maschinensprache ge schrieben. Dieses Programm ist in ROMs (nichtlöschbare Speicherbausteine) einge speichert und deshalb sofort beim Einschalten verfügbar.
Der Vorteil der Interpretersprache liegt darin, daß man relativ einfach im 'Dialog' mit dem Rechner Programme erstellen kann. Allerdings wird dies durch den Nachteil erkauft, daß Interpreterprogramme relativ langsam ablaufen.
5.1 Geschwindigkeit
Bei manchen Programmteilen wäre es wünschenswert, daß sie schneller laufen. Es ist nicht sinnvoll, exakte Laufzeiten von einzelnen Statements anzugeben, da sie oft von vielen Parametern abhängen. Trotzdem ist es oft hilfreich, wenig
stens die Größenordnung von Befehlsausführungszeiten zu kennen: Zwischen
Interpreter und Organisation
1 ms und 100 ms
können einfache BASIC Statements zur Ausführung brauchen. Sehr umfangreiche Ausdrücke können auch länger als 100 ms dauern.
Es können also sicher nicht mehr als 1000 BASIC Befehle pro Sekunde ablaufen. Als grobe Näherung ist der Wert 100 Befehle pro Sekunde ganz nützlich.
Soweit es sinnvoll ist, werden bei einzelnen Befehlen qualitative Hinweise zur Ausführungszeit gegeben.
Hier sollen einige generelle Hinweise gegeben werden, die sich nicht auf spe zielle Befehle beziehen:
Mehrere Befehle pro Zeile
Commodore-BASIC bietet im Gegensatz zu vielen anderen BASIC-Dialekten die Mög
lichkeit, mehrere Anweisungen durch Doppelpunkt getrennt in eine Zeile zu schreiben. Diese Möglichkeit sollte aus zwei Gründen ausgenützt werden: Erstens dauert der Übergang zu einer neuen Zeile länger, als der Übergang zu einem neuen
Statement und zweitens steigt die Zeit für Sprünge mit der Anzahl der Zeilen.
Außerdem braucht eine neue Zeile 5 Bytes an Verwaltung, während der Trenn-Dop­pelpunkt zwischen zwei Befehlen nur 1 Byte benötigt. Pro weiterem Statement in
einer Zeile spart man also vier Bytes ein.
Keine überflüssigen SPACEs
Wenn Zeit und Platz knapp sind, sollte nicht die Lesbarkeit des Listings durch
Spaces erhöht werden, weil jedes Space 1 Byte benötigt und vom Interpreter
gelesen werden muß.
47
Kurze Variablennamen
In zeitkritischen Schleifen sollten möglichst nur einbuchstabige Variablen
verwendet werden. Das bedeutet, daß auch keine Integervariablen verwendet werden
sollten, da das '%' auch gelesen werden muß. Außerdem muß erst das Integerformat
in Gleitkomma umgewandelt werden, was zusätzlich Zeit kostet.
5.2 Spaces im BASIC Text
Prinzipiell brauchen im BASIC Text keine Spaces als Trennzeichen stehen. Es gibt allerdings einige Ausnahmefälle, wo durch Spaces eindeutige Verhältnisse geschaffen werden müssen:
Beispiel:
10 IFSTAND64THEN... (IF ST AND 64 THEN) 20 IF64ANDSTTHEN... (IF 64 AND ST THEN) 30 IFSTOR64THEN
Zeile 10 meldet SYNTAX ERROR, Zeile 20 nicht. Eigentlich müßten beide Zeilen völlig identische Wirkung haben, da die beiden Operanden um AND vertauschbar sein müssen.
Des Rätsels Lösung: Der Interpreter findet nach dem S den Befehl TAN (Tangens), aber dahinter keine Klammer. Und schon kennt er sich nicht mehr aus und bringt
die Fehlermeldung. In Zeile 20 hat er keine Möglichkeit zu Fehlinterpretationen In Zeile 30 findet er nach S den Befehl TO (FOR..TO..NEXT). Ein Space nach ST in 10 und 30 behebt den Fehler.
________
(IF ST OR 64 THEN)
Sollte man sich also mit einem hartnäckigen SYNTAX ERROR herumschlagen, kann eine derartige Mißdeutung die Ursache sein!
5.3 BASIC-Zeilenformat und Platzbedarf
Jede BASIC-Zeile beginnt mit einer Zeilennummer und kann, durch Doppelpunkt ge trennt, mehrere Befehle aufnehmen.
Jedes BASIC-Befehlswort wird durch einen 1-Byte-Code komprimiert im Speicher gehalten. Jede andere Information innerhalb der Zeile braucht soviele Bytes, wie sie Zeichen umfaßt.
Jede BASIC-Zeile benötigt 5 Bytes für ihre Verwaltung. Im einzelnen sind das 2 Bytes für die Zeilennummer, 2 Bytes für einen Vorwärtszeiger auf die nächste BASIC-Zeile und der Code 0 als Abschluß der Zeile.
Durch die Beschränkung der Bildschirmeingabe kann eine BASIC-Zeile maximal ca. 80 Zeichen lang sein. Allerdings könnte der Interpreter BASIC-Zeilen bis zu einer internen (Interpretercode) Länge von 250 Bytes verarbeiten.
Es ist möglich, durch Verwendung der Befehlsabkürzungen mehr Information in die Zeile zu bringen, als die 80 Zeichen-Zeile normalerweise gestattet, aber dies sollte man nur in Ausnahmefällen nutzen, da LIST die betreffende Zeile ja nicht mit den Abkürzungen druckt, sondern durch Verwendung der vollen Befehlsworte die Zeile über mehr als 80 Zeilen auslistet. Zum Editieren müssen dann von Hand wieder alle Abkürzungen eingegeben werden, um die Zeile geändert wieder in der vollen Länge abspeichern zu können.
48
5.4
Der freiprogrammierbare BASIC-Arbeitsbereich des Rechners (34 K) gliedert sich in folgende Teile:
Die Zero Page ist ein 256 Bytes langer Bereich, auf den der Prozessor extrem schnell zugreifen kann. Alle besonders häufig benötigten Daten legt das Be triebssystem und der Interpreter dort ab.
Speichereinteilung
Zero Page
Stack
Page 2,3
BASIC-Text (Programm)
Einfache Variable
Indizierte Variable (Felder)
Strings
Bildschirm
Der Stack (Stapel) wird im nächsten Abschnitt mit seinen Konsequenzen für BASIC beschrieben.
Die folgenden 512 Bytes (Page 2,3) enthalten unter anderem die beiden Kassetten puffer mit zweimal 191 Bytes Länge, den BASIC-Eingabepuffer mit 80 Zeichen Länge, sowie den Tastaturpuffer mit 10 Zeichen Länge.
Ab dem Byte 1024 steht der Text des BASIC-Programms im komprimierten Inter preter-Code.
Sobald ein Programm (mit RUN) gestartet wird, wird automatisch der Anfang der Variablentabelle auf das Ende des BASIC Programms gesetzt. Das ist der Grund, warum andererseits nach einer Änderung im Programm die Variablen 'weg' sind.
Das Ende der Variablentabelle ist gleichzeitig der Anfang der Felder-Tabelle.
Dies hat zur Folge, daß der gesamte Feldbereich nach hinten verschoben werden
muß, wenn eine neue einfache Variable eingeführt wird.
Wichtig zu wissen ist, daß zwar jederzeit neue einfache und indizierte Variable
eingeführt werden können, daß aber nicht einzelne Variable oder Felder gelöscht werden können!
Die Stringinhalte 'wachsen' von der oberen Speichergrenze (32K) her nach
'unten'.
Der Speicher wird also optimal den jeweiligen Gegebenheiten angepaßt. Trotzdem
kann er natürlich irgendwann zu klein sein. Dies wird dann durch OUT OF MEMORY
ERROR gemeldet. Bei folgenden Gelegenheiten kann diese Meldung auftreten:
Tritt sie bei der Programmeingabe auf, so ist das Programm alleine schon zu
groß, könnte also nie laufen, da zu diesem Zeitpunkt noch keine Variable im
Speicher steht. In diesem Fall kann nur 'Overlay' (LOAD) helfen.
49
Tritt sie nach dem Start des Programms auf, ist die häufigste Ursache eine Dimensionierung von Feldern (DIM), da hiermit auf einmal sehr viel Speicherplatz
belegt werden kann. Man kann leicht nachprüfen, ob dies der Fall ist: Erstens
muß in der gemeldeten Zeile ein DIM stehen und zweitens muß der Platzbedarf des
Feldes (s. indizierte Variable) größer sein, als der noch freie Speicherplatz
(FRE).
Scheidet DIM aus, kann es ein String sein, da Strings immerhin auch auf einmal
255 Bytes belegen können. In diesem Fall muß in der gemeldeten Zeile eine
Stringzuweisung stehen.
Ist auch das nicht der Fall, könnte theoretisch eine neu eingeführte einfache Variable den Speicher gerade um 7 Bytes zu klein gefunden haben.
Wahrscheinlicher ist aber, daß der Stack 'übergelaufen' ist:
5.5 Stack (Stapel)
Der Stack ist ähnlich wie die Zero Page ein bevorzugter Speicherbereich des Prozessors. Der Stack eignet sich sehr gut zur Aufnahme von hierarchischen Strukturen, wie sie die Daten für Unterprogramme (GOSUB/RETURN), Schleifen (FOR NEXT) und Klammerebenen in Ausdrücken darstellen.
Deshalb legt der Interpreter die nötigen Verwaltungsinformationen für Unter programme, Schleifen und Ausdrücke im Stack ab. Dies hat den Vorteil, daß der Rücksprung aus Unterprogrammen (RETURN), der Rücksprung in Schleifen, sowie die Überprüfung des Endwertes und die Berechnung von Ausdrücken in sehr kurzer Zeit
durchgeführt werden kann. Andererseits ist der Stack ein endlicher Speicher bereich, der relativ schnell 'überläuft'.
Wie schon erwähnt, kann auch dies der Grund für OUT OF MEMORY ERROR sein. Die folgenden Werte sollen Ihnen einen Anhaltspunkt geben, wieviel Ebenen jeweils möglich sind.
GOSUB FOR NEXT Klammerebenen
Diese Werte sind exklusiv, d.h. wenn Sie z.B. 26 GOSUB Ebenen haben, kann keine Schleife und kein Ausdruck mehr existieren, ohne daß OUT OF MEMORY gemeldet wird.
Sollten Sie OUT OF MEMORY erhalten, helfen Ihnen vielleicht folgende Überlegun gen weiter:
Eine Ausdrucksebene benötigt im Stack genausoviel Platz, wie eine FOR NEXT Schleife (18 Bytes), eine GOSUB Ebene dagegen nur 5 Bytes. Sie können also durch Verzicht auf eine Ausdrucksebene eine Schleife gewinnen oder 3 GOSUB Ebenen gegen eine Schleife eintauschen.
26
10
10
50
Beispiele für die Stackgrenzen:
200 A=2*(2*(2*(2*(2*(2*(2*(2*(2*(2*2)))))))))
3 01 GOSUB 3 0 2 :RETURN 3 02 GOSUB 303 :RETURN
323 GOSUB 326 :RETURN 326 GOSUB 327:END 327 RETURN
401 FOR A = 0 TO 1 402 FOR B = 0 TO 1
409 FOR I = 0 TO 1 410 FOR J = 0 TO 1 420 PRINT A;B;C;D;E;F;G;H;I ;J 430 NEXT J,I,H,G,F,E,D,C,B,A
Die Beispiele in 200, 300 und 400 ... zeigen die jeweils maximal mögliche Schachtelungstiefe, nämlich 10, 26 und 10. Es sei nochmal betont, daß die drei Beispiele nicht kombiniert werden können, weil jedes für sich den Stack voll
kommen in Anspruch nimmt.
Wenn Sie jeweils eine Ebene mehr anfügen, wird OUT OF MEMORY IN ... gemeldet.
Lösungsvorschläge
Am leichtesten kann die Schachtelungstiefe von Ausdrücken vermindert werden, da
man sie nur in Teilausdrücke zu zerlegen braucht, deren Ergebnisse schrittweise zusammengefaßt werden (s. numerische Ausdrücke).
GOSUB-Ebenen kann man simulieren, indem das Unterprogramm statt mit GOSUB mit GOTO angesprungen wird. Anstatt des RETURN muß dann am Ende des Unterprogramms ein ON .. GOTO Verteiler dafür sorgen, daß das Unterprogramm wieder zum auf rufenden Programm zurückspringt. Das aufrufende Programm muß dem Unterprogramm dann lediglich in einer zusätzlichen Variable mitteilen, wer es gerufen hat (s. ON GOTO).
FOR NEXT Schleifen sind sehr leicht durch IF THEN usw. zu ersetzen.
Natürlich sollte man zu solchen 'Krücken' erst greifen, wenn es wirklich nötig
ist, weil sie die Programmstruktur verschlechtern und langsamer sind.
51
6. Codes
Ihr Computer kann 256 verschiedene Zeichen auf dem Bildschirm darstellen und kennt 256 verschiedene String-Codes. Der Code der Zeichen im Bildschirm ist allerdings nicht identisch mit dem Code im String. Wir unterscheiden deshalb den Bildschirmcode BSC und CBM-ASCII Code ASC. Zusätzlich soll noch der ASCII Code ASCII besprochen werden, da dieser von fast allen Peripheriegeräten verstanden wird, auch wenn sie von anderen Anbietern stammen.
6.1 ASCII
Der American Standard Code for Information Interchange (Amerikanischer Standard Code für Informations Austausch) ist ein 7-Bit Code, durch ihn können
also 128 verschiedene Zeichen dargestellt werden. Der ASCII-Code ist in 4 Grup pen zu je 32 Zeichen eingeteilt:
Dezimal Bereich
0-31 32 - 63 64 - 95 96 - 127
Wie bei ASC erklärt wird, verwendet Ihr Computer den Bereich von 0 bis 95 fast ohne Änderung. Auf einige Unregelmäßigkeiten, vor allem auch in Verbindung mit Druckern, die deutschen Zeichensatz haben, soll jedoch hingewiesen werden. Folgende Codes des ASCII-Zeichensatzes sind u.U. mit verschiedenen Zeichen belegt:
Code
35
60 62 spitze Klammer zu 64
91 92 Schrägstrich 93 eckige Klammer zu 94 Pfeil nach oben 95
Standardzeichen
Doppelkreuz
spitze Klammer auf
Klammeraffe ß
eckige Klammer auf
Unterstrich
Steuerzeichen (nichtdruckbar) Satz- und Sonderzeichen und Ziffern Große Buchstaben Kleine Buchstaben
Altemativzeichen (Beispiel)
Paragraphenzeichen
kein Zeichen (SPACE) kein Zeichen (SPACE)
Ü oder Ä ö
Ä oder Ü Abwandlungen davon oder SPACE Pfeil nach links
123 geschweifte Klammer auf 124 senkrechter Strich ö 125 126
Einige Auswirkungen dieser Zeichenalternativen sehen Sie in diesem Handbuch. Das
Doppelkreuz' (Dateinummer) wird vom Drucker als Paragraphenzeichen dargestellt und 'Pfeil nach oben' (Exponentiation) wird überhaupt nicht gedruckt. Deshalb wurde es im Text durch h ersetzt. Auch die beiden spitzen Klammern werden nicht gedruckt und deshalb durch g (größer als) und k (kleiner als) ersetzt.
52
geschweifte Klammer zu ä oder ü Schlange
ü oder ä
ASCII
■ 0
32 BLK
33 !
34
•—* 35 #
Q
36 $
.—( ■ ,i
1* • ■
38 &
4
5
b
i
40 (
41 >
10 11 12 13
42 *
43 +
44
45 14 46 15
1 <r
17 S « O o
à ‘-
1(5
J. «.*
£0 g £1 £
4
C-3
ah tA
a
CP
47
48 0
49 1
58 £ 51 3 52 4 53 5 54 6 55 7
£4 56 3
-er
£5
*7*7
57 3
58
53 ;
68 <r
22
36
31
61
fc-Z
k_
4
64 @
65 fl 66 E 67 C 68 2
63 E
78 F 71 G 72 H
“7;“; T
74 J
75 K
76 L
77 M
78 N
73 0 30 P 31 Q
82 R 114 r
■- £•
C*C* •-*
34 T
35 U
86
118
87 W
o O V
t’t
S3 V
:
30 Z 122 z
31 C
92
33 3
94 t
95 *•
36 e
37 a 33 b 33 c
100 d 101 e 162 4
103 3 184 h
105 i
106 j 107 k 108 1
183 m
110 n 111 o
112 K>
113 i
115 s
116 t 117 u
113 ui
128 x 121 y
123 4
124 3
125 I 126 S
127 ^
53
6.2 ASC
Da im Commodore-BASIC 256 verschiedene Stringcodes existieren, kann der ASCII-
Code intern nur mit einer Änderung verwendet werden:
Die kleinen Buchstaben werden von den großen unterschieden, indem zum ASCII-
Code der großen Buchstaben 128 addiert wird, was gleichbedeutend damit ist, daß Bit 7 gesetzt wird. Bit 7 enthält also die Information, ob die SHIFT-Taste gedrückt wurde oder nicht. Dies gilt nicht nur für die Buchstaben, sondern auch für alle Steuertasten.
Damit kann der ASC-Code folgendermaßen eingeteilt werden, was seine Darstellung auf dem Bildschirm betrifft, wenn mit PRINT gedruckt wird:
Zwischen 32 und 95 liegen die Sonderzeichen und großen Buchstaben und zwischen
160 und 223 Graphikzeichen und die kleinen Buchstaben.
Zwischen 0 und 31 liegen Steuerzeichen und zwischen 128 und 159 die entsprechen den SHIFT-Steuerzeichen.
Bleiben noch die beiden Bereiche 96-127 und 224-255. Sie enthalten, was die
Darstellung auf dem Bildschirm anbelangt, keine neue Information, weil sie
genauso dargestellt werden, wie die Bereiche 32-63 und 160-191. Ein Beispiel soll dies verdeutlichen: Sowohl CHR$(33) als auch CHR$(97) wird auf dem Bild schirm als M' dargestellt.
Im ASC Code sind also 2*64=128 druckbare Codes enthalten, sowie 2*32=64 nicht­druckbare Steuerzeichen. Die restlichen 2*32=64 Codes finden beim Drucken keine Verwendung. Sie werden erst interessant, wenn ein String als Bytefeld (Binär
feld) verwendet wird.
Mit der kommerziellen Tastatur können nicht alle druckbaren Codes eingegeben werden, sondern nur 32-95 und 192-223. Die Graphikzeichen zwischen 160 und 191
können also mit dieser Tastatur nicht eingegeben werden. Durch die Steuertasten
können noch einige Codes aus dem Bereich der Steuercodes eingegeben werden.
Durch Revers-Darstellung innerhalb von Anführungszeichen können alle Steuer
codes (0-31) und (128-159) eingegeben werden.
Einige Codes kommen sehr häufig im weiteren Text vor, oder werden allgemein oft
verwendet und sollen deshalb kurz vorgestellt werden:
Code Name im Text
0 NUL / CHR$(0) 10 LF (Line Feed) 13 CR (Carriage Return) 27 ESC (Escape)
32 SP / BL (Space / Blank)
64 Klammeraffe 141 SH-CR 160 SH-BL
Bedeutung
lauter Nullen, Füllzeichen
Zeilenvorschub
Wagenrücklauf Kommandos folgen Leerzeichen amerikanisches 'and'-Symbol CR gleichzeitig mit SHIFT gedrückt SP gleichzeitig mit SHIFT gedrückt
NUL hat in der ASCII-Norm die Funktion eines Füllzeichens, das keinerlei Funktion hat. In Verbindung mit GET und INPUT bzw. mit Binärdateien hat es eine Sonderstellung (s. GET/INPUT).
54
CR/LF hat (historisch) die Funktion der Wagenrücklaufes bzw. Zeilenvorschubes bei Druckern / Fernschreibern. Innerhalb von Computer-Dateien hat es davon abgeleitet die Funktion eines Trennzeichens zwischen einzelnen Datensätzen oder Datenfeldern. Allerdings wird als Trennzeichen in der Regel nur CR und nicht LF verwendet. Andererseits gibt es Drucker, die entweder bei Empfang von CR auto
matisch auch einen Zeilenvorschub machen (Auto-Linefeed) oder tatsächlich beide Steuerzeichen benötigen, um die beiden Funktionen ausführen zu können. CR/LF hat also zu tun mit Druckern einerseits und CR alleine hat zu tun mit Dateien und Ein- / Ausgabebefehlen andererseits (s. GET/INPUT/PRINT). Beachten Sie bei INPUT auch die spezielle Funktion von SH-CR.
ESC hat bei intelligenten Peripheriegeräten, die ASCII sprechen die Funktion einer Kommando-Einleitung. D.h. nach Empfang von ESC erwartet das Gerät eine bestimmte Anzahl von Kommando-Codes, die normalerweise gedruckt werden müssten,
aber nach ESC eben nur als Befehl interpretiert werden. Vor allem bei Druckern ist diese Art der Kommandoübermittlung weit verbreitet.
SP / SH-SP wird deshalb erwähnt, weil beide Codes auf dem Bildschirm das
gleiche Zeichen produzieren, nämlich einen leeren Fleck, aber für die Eingabe
vom Bildschirm mit INPUT trotzdem verschiedene Wirkung haben.
Klammeraffe ist ein Ausdruck aus dem Datenverarbeiter-Jargon für das kleine a mit dem Haken, der es fast ganz umschließt. Dieses Zeichen ist im deutschen Sprachraum meistens nicht bekannt, auch nicht seine diversen Namen, wird aber in Zusammenhang mit der Floppy-Verwaltung evt. gebraucht.
CONTROL
s 12s
ZEICHEN
32 160
: 123 33 161 1 1
2 130
•34 1 " m à- à- i y *4 3 131 STOP.. PUH 35 163 # ­4 132
36 164 $ _ i 133 37 165 i 3 134 •-‘3 133 3 M
7 133 BELL BELL
16 7
1 c-6 40 1 63
3 137 TflB TfiSECL
IO 138
41 163 V Z
42 170 $ 1
11 133 43 171 + ' 12 140 44 172 .. ,
13 141 CE SHCE
14 142 TEMT GRfiPH
15 143 SETTOP SETBOT
45 173 - -
46 174 . 1
47 175 7 -
18 144 4 b 1 re* H r 17 145 CBOWN CUP
18 146 SVSÖN pysnpF
13 147 HOME OLE 20 148 DEL INST 21 143 BELLIN IN8LIN 22 150 ERSEHB ERSBEG 23 151
24 152
43 177 1 -1­50 173 2 ­51 173 3 4 52 130 4 ! 53 181 5 I 54 132 6 1 55 183 7 “
56 134 3 “ 25 153 SCEUP SCRBÛW 57 135 3 ­26 154
58 186 K-
ci r* 135 E-I-ü 53 187 : a 23 158 23 157 CEIGHT CLEFT
60 188 < ­61 183 =
3G 153 62 130 > * 31 153
63 131 ? “a
BUCHSTABEN
TEXT
54 132
55 133
s —
-3. H
fc B 57 135 63 136
G 0
d D
63 137
76 133
71 1 yy
72 200
T
•>
h H
73 201
74 202
r
75 293
/S 204
”?7tcr
i « -L‘ w
73 206
•i J » . î
y.
1 L ;ïi M n N
73 287 38 288
31 203
32 210
S3 211
34 212 35 213 86 214 37 215
fo F
-t 3 r- E £
___
t T u U
.... y
•'.m W
S3 216
8 3 L1 i’’
3G 218
31 213
y V V !
T “y
4 [
32 228
J
33 221
34 222
i ]
S T
35 223 3 4-
•—
2
y
s
.
GRAPHIK
n î
;
B
B “
rr “
c
H ;
I •.
T
L L M \
N .
n r
F
Q #
E _
S *
r ; 1 !
W C
X 4
Z *
[ 4
J 1
T TT
t- ^
55
6.3
BSC (Bildschirmcode)
Der Vollständigkeit halber wird hier auch der BSC aufgeführt.
Der Bildschirmcode ist im Allgemeinen nur von Interesse, wenn im Assembler gearbeitet wird. Mit PEEK und POKE kann zwar auch von BASIC aus direkt auf den Bild-Wiederhol-Speicher zugegriffen werden, dann wird man aber ausschließlich im BSC arbeiten, so daß die angegebene Tabelle genügt.
Zur Tabelle muß nur noch hinzugefügt werden, daß die angegebenen Werte + 128 das entsprechende Revers-Zeichen auf den Bildschirm bringen.
Der algorithmische Zusammenhang zwischen ASC- und BSC - Code, der nur aus ein
fachen Bitmanipulationen besteht, ist im Rahmen eines BASIC-Handbuches nicht interessant.
Die Umschaltung zwischen Graphik und Kleinschreibung kann auf zwei verschiedene
Arten erfolgen:
Graphik PRINT CHR$(142) oder POKE 59468,12 Text PRINT CHR$( 14) oder POKE 59468,14
Die beiden POKEs ändern nur den Zeichensatz, während die PRINTs gleichzeitig bei Text zwei Dunkelzeilen zwischen zwei Textzeilen einfügt bzw. bei Graphik diese entfernt, so daß die Graphik vertikal nicht unterbrochen wird.
TEXT GRAPHIK
: d —
1 3. B
2 h B
*' C L-
4 d n
^ f=- E
6 f F
7 -1 3
S h H
T
1 p t
< -, 1 J
il k K J. _ L L_ 12 ru M
14 n N ‘ ’“i J • J
16 r-- P
17 -t U
18 r R
i:- s ‘-Z’
20 t T '1 N i!
22 y V
23 ui W
“• .4
23 y V
*-• ■ *-
-- C* ’ 1 * »
r r
28 j ]
•-f, ■+• -+•
-L i >
31
TEXT GRAPHIK
32 BLK
33 !
.4 II
. ■*« -+ 35 #
36 $
• ,»
■Z‘ i im
;C ÿ
;jQ
40 ( 72 H !
.4 4 \
-n x
64 — —
65 P *
66 E ! 6 7 r* —•
68 E ~ 63 E
79 F -
71 G 1
i •-* X t
42 * 74 J
43 +
-?«=: i/
1 !*•. t •-* L. tn
43
.*» ilT
*■ +6 ■ 78 N
47
77 M \
73 n r
48 O 80 F 1
43 1
50 2
p 1
er ■- .4
•-•u: ,-t
er--, er
54 -6
er er “7
er £
57 3
5 'ë*
SO < ”717 & %
üT 1
w X ““ 33 i 1
6 7 7
63 T'
SI G! • 82 R ­83 S * 84 T !
85 U
86 V X 87 W 0 88 X *
83 V 1
31 + +
34 1T 1T 35 ^ ’l
36 SHBL 37 1
180 _ 181 1
1 fV-< —
r
X
_.‘
T
104
185 %
186 1 187 k 188 .
L
183 110 -,
111 .
112 r 113 -L
114 T
115 -i 116 1
il* 1 118 1
113 -
120 “ 121 « 122 123 ■ 124 125 J 126 127 ■,
56
II.
Dieser Abschnitt beschreibt ausführlich die Eigenschaften aller BASIC-Anweisun gen. Vorausgesetzt ist, daß Sie die Abschnitte über Datenarten, Darstellungs weisen und Ausdrücke und Operatoren in den wesentlichen Zügen verstanden haben, bzw. daß Sie bei Bedarf in diesen Kapiteln nachschlagen.
Form
Zur Form in den Abschnitten 'Format' sollten Sie einige Hinweise beachten:
'GROSSBUCHSTABEN' kennzeichnen Worte der BASIC-Sprache, die exakt so und in dieser Reihenfolge vom Computer erwartet werden.
'kleinbuchstaben' kennzeichnen als Platzhalter Stellen, in die irgendwelche Parameter gehören. Die Art der Parameter ergibt sich entweder aus der Bezeich nung oder aus nachstehenden Erklärungen.
Das Format für die dargestellten Befehlsausdrücke ist folgendes:
Alle Befehle bzw. Zeichen in Fettdruck müssen so eingegeben werden, wie sie in der Beschreibung stehen.
Alle Zeichen in Normaldruck sind Teile, die unter Umständen wegfallen können. Beachten Sie aber bitte, daß dann die Ersatzwerte gelten, die jeweils angeführt
sind.
BASIC-Anweisungen
Blanks (Leerstellen) sind überall nur der Übersichtlichkeit halber eingestreut. Sie brauchen nicht mit eingegeben zu werden.
Abgesehen von Abkürzungen werden alle Buchstaben in BASIC-Zeilen ohne SHIFT eingegeben, unabhängig davon, ob sie dann auf dem Bildschirm groß oder klein erscheinen. Lediglich innerhalb von Anführungszeichen dürfen auch Buchstaben erscheinen, die mit SHIFT getippt wurden (Stringkonstante).
Eine Tabelle der Befehlsabkürzungen finden Sie im Anhang.
Reihenfolge
Innerhalb der Befehlsbeschreibungen gehen die Erklärungen von vorne nach hinten vom Prinzipiellen zu den Details. Viele dieser Details brauchen Sie sich nicht zu merken, Sie sollten aber eine Ahnung haben, wo sie stehen, um bei Bedarf
schnell nachschlagen zu können.
Die Einführungen zu Anweisungsgruppen sollen auf Zusammenhänge und gemeinsame Eigenschaften hinweisen. Solange Sie nicht mit diesen Zusammenhängen vertraut sind, sollten Sie auch beim Nachschlagen diese Einführung jeweils mitlesen.
Die einzelnen Befehlsgruppen und auch die einzelnen Befehlsbeschreibungen inner halb der Gruppen sind weitgehend unabhängig voneinander gehalten, so daß Sie nicht unbedingt die Gruppen in der Reihenfolge des Inhaltsverzeichnisses lesen müssen und auch innerhalb der Gruppen einzelne Teile auslassen können.
57
1. Programme laden und speichern
1.1 Einführung
Mit den Befehlen LOAD (DLOAD), SAVE (DSAVE) können Programme von Band oder Diskette geladen, bzw. dorthin abgespeichert werden. Durch VERIFY kann über prüft werden, ob die Aufzeichnung richtig erfolgt ist.
SAVE bezieht sich immer auf BASIC-Programme. LOAD und VERIFY dagegen kann auch beliebige Speicherinhalte behandeln.
Diese Befehle sind prinzipiell Systembefehle, werden also im Direktmodus ange wandt. Sie sind allerdings auch im Programm zugelassen, was bei SAVE und VERIFY nur in Ausnahmefällen sinnvoll sein wird, bei LOAD aber das Nachladen von Programmteilen durch 'Overlay' ermöglicht.
Die beiden Disk-Befehle DSAVE und DLOAD unterscheiden sich in der Wirkung kaum von den 'normalen' BASIC-Befehlen. Deshalb wird hier nur das Format vorgestellt. Bitte lesen Sie die Feinheiten im Floppy-Handbuch nach.
Folgende Parameter sind erforderlich:
dn Dateiname gn Gerätenummer ln Laufwerknummer (nur bei Floppy)
dn ist ein String-Ausdruck gn ist ein Byte-Ausdruck
ln ist bei LOAD/SAVE/VERIFY ein Teilstring, der vor dn stehen muß,
bei DLOAD und DSAVE ein Zahlenausdruck, der nur 0 oder 1 ergeben darf.
Der Dateiname darf nicht länger als 16 Zeichen sein.
Die Gerätenummer ist 1 oder 2 für die Rekorder bzw. 8 (Standard) für die Floppy.
Die Laufwerknummer kann nur 0 oder 1 sein.
Bei DLOAD und DSAVE ist zu beachten, daß Parametervariablen in Klammem stehen müssen.
1.2 LOAD, DLOAD (Laden)
Zweck
Mit LOAD bzw. DLOAD können Programme von Band oder Diskette in den Arbeits speicher geladen werden.
Format
LOAD ln: dn , gn
DLOAD dn , D ln , U gn
gn = 1 (Rekorder 1) ist Ersatzwert für nicht angegebene Gerätenummer bei LOAD gn = 8 (Floppy 8) ist Ersatzwert für nicht angegebene Gerätennummer bei DLOAD ln = 0 (Laufwerk 0) ist Ersatzwert für nicht angegebenes Laufwerk bei DLOAD
58
Beispiele
LOAD "l:PROGRAMMl",8 PROGRAMM1 von Gerät 8, Laufwerk 1 laden
DLOAD "PROGRAMM]",Dl,U8 identisch
LOAD DN$,GN Name (und Laufwerk) steht in DN$, Gerät in GN
DLOAD (DN$),U(GN),D(LN) Variable in Klammern!
DN$ enthält den Programmnamen, GN die Gerätenummer und LN die Laufwerknummer
LOAD DN$ vom Rekorder 1
LOAD vom Floppy
Nach LOAD "NAME",8 oder DLOAD "NAME" meldet der Rechner SEARCHING FOR NAME und LOADING, falls das Programm vorhanden ist, oder FILE NOT FOUND ERROR,
falls nicht. FILE NOT FOUND ERROR wird auch gemeldet, wenn wegen eines
beliebigen Floppy-Fehlers der Zugriff nicht möglich war.
Wird bei LOAD das Laufwerk nicht angegeben, so sucht das Floppy automatisch auf beiden Laufwerken, falls es das gewünschte Programm nicht auf dem ersten Lauf werk findet. Dagegen sucht es bei DLOAD nur auf Laufwerk 0, falls kein Laufwerk angegeben wurde und meldet dann schon FILE NOT FOUND, falls das Programm nicht
existiert.
Die Taste SHIFT/RUN lädt das erste Programm der Diskette im Laufwerk 0 und startet es sofort. (Dies gilt nicht, wenn ein Floppy 3040 angeschlossen ist.)
Der leere Name wird durch SYNTAX ERROR abgelehnt.
Die Behandlung des Rekorders erfolgt in einem gesonderten Kapitel.
LOAD im Direktmodus
Im Direktmodus bewirkt LOAD außer dem eigentlichen Laden des BASIC-Programms auch, daß die Zeiger der Speicherverwaltung auf das Ende des Programms einge
stellt werden. Das bedeutet, daß vorher vorhandene Programme und Variablen
vollständig gelöscht werden!
Hinter LOAD kann kein weiterer Befehl angegeben werden, er würde nicht ausge führt werden!
LOAD"NAME",8:RUN hat also nicht die Wirkung, daß das Programm geladen und sofort gestartet wird!
Die Wirkung von LOAD innerhalb eines Programms ist bei Overlay beschrieben.
Parametergrenzen / Fehlermöglichkeiten
Bei Gerätenummer 0 (Tastatur) oder 3 (Bildschirm) wird SYNTAX ERROR gemeldet, bei Werten außerhalb der Bytedefinition (gn kleiner als 0 oder größer als 253) ILLEGAL QUANTITY ERROR. Bei Gerätenummern von nicht vorhandenen Geräten wird FILE NOT FOUND ERROR oder DEVICE NOT PRESENT ERROR gemeldet.
59
1.3
SAVE, DSAVE (Abspeichern)
Zweck
Mit SAVE (DSAVE) können BASIC-Programme auf Band oder Floppy abgespeichert
werden.
Format
SAVE ln: dn , gn
DSAVE dn , D ln , U gn
Beispiele
SAVE "l:PROGRAMMl",8
DSAVE "PROGRAMM1",Dl,U8
SAVE DN$,GN
DSAVE (DN$),U(GN),D(LN)
SAVE "NAME"
Besonderheiten von SAVE beim Floppy
Im Gegensatz zu LOAD muß bei SAVE das Laufwerk unbedingt angegeben werden! Bei DSAVE wird automatisch auf 0 abgespeichert, wenn kein Laufwerk angegeben wird.
Falls irgendwelche Floppy-Fehler auftreten, wird dies nicht automatisch auf dem Bildschirm gemeldet, sondern lediglich die Fehlerlampe zeigt an, daß ein Fehler
aufgetreten ist. Achten Sie deshalb auf die Fehlerlampe des Floppy. Leuchtet
sie, können Sie durch
?DS$
fragen, welcher Fehler aufgetreten ist. Zwei Fehlermeldungen, die bei SAVE
Vorkommen können, wollen wir kurz vorstellen. Wegen anderen Fehlermeldungen
schlagen Sie bitte im Floppy-Handbuch nach.
PROGRAMM1 auf Gerät 8, Laufwerk 1 absp.
identische Wirkung
Name und Laufwerk steht in DN$, Gerät in GN
Variable in Klammern, LN enthält Laufwerk
auf Rekorder 1
63, FILE EXISTS bedeutet, daß schon ein Programm mit diesem Namen existiert. Ändern Sie deshalb entweder den Namen des neuen Programms oder löschen Sie das alte Programm (SCRATCH).
26, WRITE PROTECT ON weist Sie darauf hin, daß der Schreibschutz geklebt ist.
Der Dateiname muß mindestens ein Zeichen enthalten, sonst wird SYNTAX ERROR gemeldet.
Bei SAVE auf ein nicht vorhandenes Gerät wird keine Fehlermeldung gebracht,
sondern sofort READY gemeldet. Achten Sie also darauf, ob das Floppy wirklich
gelaufen ist!
Fehlermöglichkeiten
Die Gerätenummern 0 und 3 werden durch DEVICE NOT PRESENT ERROR abgelehnt. Soll auf nicht vorhandene Geräte abgespeichert werden, wird entweder DEVICE NOT PRESENT ERROR oder nichts gemeldet. Wenn die Gerätenummer kein Bytewert
ist, wird ILLEGAL QUANTITY gemeldet.
60
1.4
VERIFY (Überprüfen)
Zweck
Durch VERIFY kann die Aufzeichnung eines Programms auf Band oder Floppy über prüft werden. Dazu wird das gerade im Speicher stehende Programm mit dem ange gebenen Programm auf Floppy (Band) verglichen.
Format
Die Syntax von VERIFY und die Parameter sind identisch mit der von LOAD. Be achten Sie bitte, daß es für VERIFY keine spezielle Disk-Version gibt.
VERIFY ln: dn , gn
Beispiele
VERIFY "l:PROGRAMMl",8 PROGRAMM1 auf Laufwerk 1 im Gerät 8
VERIFY das erste Programm auf Rekorder 1
Anwendung
Die häufigste Anwendung sieht so aus, daß Sie ein Programm mit SAVE abspeichern und unmittelbar danach mit VERIFY überprüfen. Um sich die Arbeit zu erleich tern, merken Sie sich vielleicht folgendes Verfahren:
'Sa"0:NAME",8' oben links auf den Bildschirm schreiben und ausführen. Mit 'HOME' zurückgehen und mit 'Ve' 'Sa' überschreiben und wieder RETURN drücken. Dies können Sie schon tippen, während das Floppy abspeichert. Damit erledigen Sie SAVE und VERIFY in einem Arbeitsgang. Beim Rekorder müssen Sie allerdings war ten, bis er fertig ist, weil die Tastatur durch Rekorderoperationen lahmgelegt wird.
VERIFY meldet in jedem Fall VERIFYING und darunter entweder OK oder VERIFY
ERROR, falls keine Übereinstimmung festgestellt wurde.
Beim Band sollte bei VERIFY ERROR das Band bzw. die Einstellung des Schreib-/ Lesekopfes überprüft werden, falls sicher ist, daß nicht der falsche Programm
name angegeben wurde.
Beim Floppy ist normalerweise VERIFY ERROR nur möglich, wenn eine Fehlermeldung des Floppy übersehen wurde.
VERIFY funktioniert aber nicht nur unmittelbar nach SAVE, sondern vergleicht
immer das aktuelle BASIC-Programm im Speicher mit dem Inhalt der Programm-Datei auf Floppy oder Band. Wenn Sie also wissen wollen, ob das Programm im Speicher identisch ist mit einem beliebigen auf Floppy oder Band, beantwortet VERIFY
diese Frage.
Für Neugierige
VERIFY macht fast das gleiche wie LOAD: Es holt die Bytes eines Programms in den Rechner. Der Unterschied ist nur, daß LOAD diese Bytes dann im Speicher
ablegt, während VERIFY die geholten Bytes mit denen im Speicher vergleicht. Die Wirkung auf Floppy oder Rekorder ist daher identisch mit der Wirkung von LOAD.
61
2. Programme starten und stoppen
2.1 Einführung
Nachdem ein Programm in den Speicher geladen (oder eingetippt) wurde, kann es
durch RUN oder GOTO gestartet werden.
Durch den STOP-Befehl kann es an definierter Stelle unterbrochen werden, bzw.
durch die STOP-Taste irgendwo, wo es sich zu diesem Zeitpunkt gerade befindet.
Nach einem Abbruch durch STOP bzw. durch END kann das Programm durch CONT an
der dem Abbruch folgenden Stelle fortgesetzt werden.
2.2 RUN / GOTO (Programm starten)
Zweck
RUN dient dazu, ein Programm am Anfang oder einer bestimmten Zeile 'kalt' zu starten.
GOTO läßt das Programm an einer bestimmten Stelle 'warm' starten.
Format
RUN zeilennummer
GOTO zeilennummer
Beispiele:
RUN startet Programm im Speicher bei der ersten Zeile RUN 100 bei Zeile 100 GOTO 10 startet bei 10, löscht Variable nicht
Anmerkungen
RUN bewirkt immer einen sogenannten 'Kaltstart'. D.h. die gesamten Variabien­Listen werden gelöscht, so daß unmittelbar nach dem Start keine Variable exi stiert.
GOTO bewirkt prinzipiell einen 'Warmstart', d.h. alle Variablenwerte bleiben erhalten.
Der exakte Unterschied zwischen RUN und GOTO besteht darin, daß RUN die Funk tion von CLR beinhaltet, GOTO dagegen nicht.
Wenn hinter RUN keine Zeilennummer angegeben ist, wird das Programm in der ersten Zeile gestartet.
GOTO darf nicht ohne Zeilennummer verwendet werden.
62
2.3 STOP / CONT (Programm stoppen / fortsetzen)
STOP ist ausführlich bei END/STOP (s. Sprunganweisungen) beschrieben. Danach bewirken sowohl die Anweisung STOP im Programm als auch die Taste STOP während des Programmlaufes einen Abbruch des Programms.
Mit CONT kann der Programmlauf nach der Abbruchstelle fortgesetzt werden. CONT setzt bei der nächsten Anweisung auf, also nicht erst am Anfang der näch sten Zeile.
Auch nachdem das Programm verlassen wurde, weil während INPUT eine leere Ein gabe gemacht wurde, kann mit CONT dieses INPUT wiederholt werden. Man beachte den Unterschied zum Abbruch durch STOP: Nach STOP wird bei der nächsten An weisung weitergemacht, nach der leeren Eingabe wird die aktuelle Anweisung, nämlich das INPUT wiederholt!
Achten Sie darauf, daß Sie bei CONT keinen Fehler machen, sich also nicht ver schreiben und auch der Rest der Zeile leer ist, da sonst ein SYNTAX ERROR die Folge sein könnte und dann keine Möglichkeit mehr gegeben ist, mit CONT fortzu
fahren:
Nach Fehlermeldungen kann das Programm nicht mit CONT fortgesetzt werden. Der Computer meldet diesen Umstand durch CAN'T CONTINUE ERROR (keine Fortsetzung möglich). Der Grund liegt darin, daß nach Fehlermeldungen der Stack leer ist, also Unterprogramm-, Schleifen- und Ausdrucks-Hierarchien zerstört sind.
Dies ist nicht zu verwechseln damit, daß Variableninhalte gelöscht sind, was nämlich nicht der Fall ist. Das bedeutet, daß man nach dem Ausstieg durch eine Fehlermeldung mit GOTO an geeigneter Stelle das Programm warm starten kann. Während der Testphase tut man gut daran, solche Einstiegspunkte (Warmstart punkte) zu schaffen, falls sie nicht ohnehin vorhanden sind.
63
3.
3.1 Einführung
Etwas willkürlich wurden die folgenden vier Anweisungen unter dieser Überschrift zusammengefaßt:
Mit LIST können Sie das gerade im Arbeitsspeicher stehende BASIC-Programm ganz
oder teilweise auf den Bildschirm oder den Drucker (s. CMD) ausgeben.
Mit NEW löschen Sie ein BASIC-Programm aus dem Arbeitsspeicher, mit CLR nur alle Variablen.
FRE gibt Auskunft, wieviel Arbeitsspeicher noch frei ist.
Alle vier Anweisungen sind in erster Linie zum Gebrauch im Direktmodus bestimmt,
können aber prinzipiell auch in Programmen Vorkommen.
3.2 LIST (Programm auslisten)
Zweck
LIST gibt ein Listing des aktuellen BASIC-Programmes auf den Bildschirm, bzw. nach CMD auf einen Drucker aus.
Programm- und Speicherverwaltunq
Format
LIST von - bis
An Beispielen sollen die vier Möglichkeiten von LIST gezeigt werden:
LIST LIST 20 - 50
LIST 20 -
LIST - 50
Bitte beachten Sie, daß LIST 0 ebenfalls das ganze Programm auslistet.
Alle Zeilen, die nach LIST auf dem Bildschirm stehen, können ohne weiteres be
liebig verändert werden. Die geänderte Zeile wird aber nur durch Drücken der RETURN-Taste übernommen, nicht aber durch SHIFT/RETURN!
Listing verlangsamen / stoppen
Nachdem die unterste Bildschirmzeiie beschrieben wurde, rollt der Bildschirm hoch. Wenn Sie zu diesem Zeitpunkt die Taste 'Pfeil nach links' (links oben) gedrückt halten, wird nach jedem Hochschieben eine kleine Pause gemacht.
Durch Drücken der Taste mit Doppelpunkt/Stern während des Hochrollens, wird jede Aktivität des Rechners unterbrochen, bis entweder 'Pfeil nach links' oder
STOP gedrückt wird. Bei 'Pfeil nach links' wird das Listing fortgesetzt, bei
STOP mit BREAK abgebrochen.
listet das ganze Programm listet von Zeile 20 bis 50 einschließlich, sofern vorhanden listet ab 20 bis zum Programmende listet von der ersten Zeile bis 50
LIST im Programm
LIST kam zwar innerhalb eines Programms verwendet werden, das Programm wird aber nach dem Listing beendet, der Rechner meldet sich mit READY.
64
3.3
CLR (Variable löschen)
Zweck
CLR löscht alle Variablen.
Format
CLR (nicht mit der HOME/CLR - Taste verwechseln)
Anmerkungen für Fortgeschrittene
CLR löscht eigentlich die Variableninhalte nicht, sondern 'zerstört' nur die 4 Zeiger, die die Variablenlisten verwalten.
Im Einzelnen wird (44,45) (Ende einfache Variablen) und (46,47) (Ende indi zierte Variable) auf den Wert von (42,43) (Ende BASIC-Text) gesetzt. Entspre chend wird (48,49) und (50,51) (Anfang und Ende des letzten Strings) auf den
Wert von (52,53) (Speicherobergrenze) gebracht.
Dadurch finden alle Zugriffsroutinen leere Listen vor.
CLR kann ohne weiteres im Programm verwendet werden. Bedenken Sie aber, daß Sie nicht selektiv löschen können, sondern nur alle Variablen.
Eine spezielle Anwendung von CLR ist bei Overlay beschrieben.
3.4 NEW (BASIC-Programm löschen)
Zweck
NEW löscht das BASIC-Programm im Speicher.
Format
NEW
NEW beinhaltet die Funktion von CLR.
Anmerkungen für Fortgeschrittene
Ähnlich wie CLR löscht auch NEW nicht wirklich, sondern setzt nur (42,43) auf 0,4 (= 1024 = Beginn des BASIC-Speichers)
NEW im Programm bewirkt, daß sich das Programm selbst löscht. Die Meldung danach ist READY wie nach END.
65
3.5 FRE (freier Speicherplatz)
Zweck
FRE übergibt die Anzahl der noch freien Bytes des BASIC-Arbeitsspeichers.
Format
FRE (0)
Der Parameter in Klammern muß angegeben werden, weil FRE sonst nicht durch die SYNTAX-Prüfung kommt. Er hat aber weiter keinerlei Bedeutung.
Beispiel:
? FRE(O)
FRE(O) im Direktmodus
FRE wird im Direktmodus oft dann gebraucht, wenn das Programm mit OUT OF
MEMORY ERROR abgebrochen wurde. Wie bei Stack beschrieben, kann dann durch
FRE festgestellt werden, ob wirklich der Arbeitsspeicher oder aber der Stapel
'übergelaufen' ist.
FRE(O) im Programm
Falls Sie platzkritische Dimensionierungen haben, deren Platzbedarf sich im Dialog mit dem Anwender ergibt, können Sie mit FRE prüfen, ob der Platz noch reicht und dies gegebenenfalls dem Anwender schonender mitteilen als durch OUT OF MEMORY ERROR.
Anmerkungen für Fortgeschrittene
FRE muß erst die Garbage Collect Routine rufen (s. Stringverwaltung). Wenn sehr viele Strings im Speicher stehen, kann diese Routine bis zu einer Sekunde brauchen. Damit kann also auch FRE solange brauchen. Dies ist zu beachten, wenn FRE im Programm verwendet wird.
FRE berechnet die Differenz zwischen (48,49) (Anfang des letzten Strings) und (46,47) (Ende der indizierten Variablen).
66
4. Wertzuweisunqen
4.1 Einführung
Der wohl am häufigsten benötigte Befehl ist die Wertzuweisung an eine Variable. Wir unterscheiden drei Arten der Zuweisung. Die am häufigsten benutzte Art ist die Zuweisung des Ergebnisses eines Ausdrucks an eine Variable (=). Für die Zuweisung von Konstanten kann auch der Befehl READ benutzt werden, der in Zu
sammenhang mit DATA steht. Schließlich gibt es noch die sehr wichtige Möglich keit, einer Variable einen Wert zuzuweisen, der von außen kommt, also von einem Peripheriegerät. Dies wird durch INPUT bzw. GET ermöglicht. Diese beiden Be fehle haben wir allerdings dem Komplex der Ein- / Ausgabebefehle zugeordnet.
4.2 Allgemeine Zuweisung (LET)
Zweck
An die Variable auf der linken Seite des 'Gleichheitszeichens' wird das Ergebnis des Ausdrucks auf der rechten Seite übergeben.
Format
LET variable = ausdruck
LET kann entfallen. Da LET nur sinnvoll wäre, wenn Ihr BASIC Programm auch auf
einem anderen Rechner laufen muß, der LET verlangt, werden wir LET nicht ver wenden.
Trotzdem soll der Sinn kurz erklärt werden, weil dadurch gleichzeitig eine Fehlinterpretation des '=' vermieden wird: Die Zuweisung mit LET könnte über setzt werden mit: Lasse den Inhalt von 'variable' gleich werden mit dem Ergebnis von 'ausdruck'. Die Zuweisung ist also nicht zu verwechseln mit einer mathemati schen Gleichung. In LET steckt der Hinweis darauf, daß die beiden Seiten nicht
gleichzeitig gleich sind, sondern erst gleich werden.
Beispiel: A = A + 1
Als mathematische Gleichung wäre dies ein Widerspruch. Die Zuweisung aber be rechnet zuerst das Ergebnis des Ausdrucks auf der rechten Seite und speichert dann das Ergebnis in die Variable auf der linken Seite!
Um Mißverständnisse auszuschließen, ist es üblich, die Zuweisung im Beispiel
folgendermaßen zu lesen:
Der Wert von A ergibt sich aus A+l.
Alle Probleme, die sich bei der Zuweisung ergeben können, sind in den Abschnit ten 'Daten', 'Variable', 'Umwandlungen', 'Ausdrücke' und 'Stack' ausführlich
beschrieben. Wir wollen hier nur nochmal auf die wesentlichen Fehlermöglich
keiten aufmerksam machen.
67
Die Zuweisung muß im Typ übereinstimmen:
A = A$ bzw. A$ = A TYPE MISMATCH ERROR (bei der Zuweisung)
A = B + A$ TYPE MISMATCH ERROR (im Ausdruck)
Umwandlung von Integer in Gleitkomma ist immer möglich, umgekehrt nur im Werte bereich von Integer und mit Änderung des Wertes durch Abrunden.
Beispiele:
A = B% Integer in Gleitkomma ist immer möglich
A = -3.5 B% = A
? B%
-4 Wertänderung durch Abschneiden
A = 32768 B% = A
ILLEGAL QUANTITY ERROR kein Integer-Wert
Der Ausdruck darf nicht umfangreicher werden, als der Stack zuläßt, sonst wird
OUT OF MEMORY ERROR gemeldet (s. Stack).
68
4.3
4.3.1 Einführung
In DATA-Anweisungen können Zahlen- oder Stringkonstante abgelegt sein, die durch READ an Variable zugewiesen werden können.
Normalerweise verwendet man DATA und READ in erster Linie, um Variablenfelder mit Werten zu versorgen. Diese Werte können dann entweder der endgültige Inhalt dieses Feldes sein, oder nur sogenannte Anfangswerte.
Eine weitere Anwendung von DATA ist der Ersatz einer Band- oder Floppydatei durch eine DATA-Datei während der Entwicklung eines Programmes bzw. zu Test zwecken.
In der Regel ist es nicht sinnvoll, einfache Variable aus DATAs mit Anfangs werten zu versorgen, da dies mit einer normalen Zuweisung durch '=' genauso effektiv und übersichtlicher erreicht werden kann.
Die Anweisungen werden jetzt in der Reihenfolge READ, DATA, RESTORE vorgestellt.
Anschließend wird ihre Zusammenarbeit beschrieben.
Zuweisung von Konstanten in DATA durch READ
4.3.2 READ (Lesen aus DATA)
Zweck
READ übergibt Konstante aus DATA in Variable.
Format
READ variablel , variable2 , variable3 .... : weitere Anweisungen
Beispiel
READ A1,B%,C$,D(I),C$(J)
Hinter READ kann eine oder mehrere Variable stehen. Jeder Variablentyp ist zugelassen, die Anzahl ist nur durch die Zeilenlänge begrenzt. Die Variablen werden durch Komma getrennt. Durch Doppelpunkt getrennt können hinter READ weitere Anweisungen stehen.
Die Anordnung der Variablen ist identisch mit der bei INPUT. Dadurch kann zu Testzwecken INPUT sehr leicht durch READ ersetzt werden!
69
4.3.3
Zweck
In DATA Anweisungen werden Konstante innerhalb des BASIC-Programmes gespeichert, die mit READ in Variable übertragen werden.
Format
DATA konstante]. , konstante2 , .. : weitere Anweisungen
'konstante' kann eine Zahlen- oder Stringkonstante sein.
Hinter DATA können mehrere Konstanten stehen. Sie müssen durch Komma getrennt
werden.
Hinter einer DATA Anweisung können durch Doppelpunkt getrennt weitere Anweisun gen in der gleichen Zeile folgen. Wenn keine weitere Anweisung in der gleichen Zeile folgt, muß kein Doppelpunkt stehen.
Stringkonstante
Grundsätzlich müssen Stringkonstante in Anführungszeichen stehen. Bei DATA gibt es jedoch eine Ausnahme: Wenn keine SHIFT-Buchstaben oder Steuerzeichen oder Komma oder Doppelpunkt enthalten sind, können die Anführungsstriche entfallen.
DATA (Datenfeld)
Wenn zwei Kommas unmittelbar aufeinander folgen, wird dies als leerer String
bzw. die Zahl 0 interpretiert!
Wichtig ist, daß eine DATA Anweisung nicht versehentlich durch ein Komma abge
schlossen wird. Dies würde nämlich ein zusätzliches leeres Element bedeuten!
Blanks
Innerhalb von Anführungszeichen werden Blanks berücksichtigt, sie werden also durch READ in die Stringvariable mit übernommen.
Dagegen werden führende Blanks auch bei Strings ignoriert, wenn keine Anfüh rungszeichen verwendet werden. Nachfolgende Blanks werden aber mitgelesen.
Bei Zahlen haben Blanks keinerlei Bedeutung.
Sonderzeichen
Sonderzeichen, wie z.B. die Cursorbewegungen oder RVS ON/OFF müssen innerhalb von Anführungszeichen stehen.
Wird versucht, z.B. RVS ON ('R' revers) ohne Anführungszeichen einzugeben, so zeigt 'LIST' ein normales 'R', das dann natürlich nicht mehr die Bedeutung von
RVS ON hat!
SHIFT-Zeichen
Wenn SHIFT-Buchstaben (allgemein Zeichen mit ASC-Code größer als 128) ohne
Anführungszeichen eingegeben werden, zeigt 'LIST', daß sie nicht übernommen wurden!
70
4.3.4
Zweck
Der 'DATA-Zeiger' merkt sich, welche Konstante als letzte durch READ gelesen wurde. Er sorgt dadurch dafür, daß die Inhalte der einzelnen DATAs in ihrer Reihenfolge gelesen werden können.
RESTORE setzt den DATA-Zeiger auf die erste Konstante im ersten DATA des Pro
gramms. (RUN bewirkt automatisch RESTORE.)
Dadurch kann eine DATA-Datei öfter gelesen werden.
Format
RESTORE
Anmerkung
Es ist nicht möglich, auf das DATA in einer bestimmten Programmzeile zurückzu setzen.
RESTORE (DATA-Zeiger zurücksetzen)
4.3.5 Eigenschaften einer DATA-Datei
Die Daten hinter allen DATAs bilden eine serielle Datei. Die Eigenschaft dieser Datei ist vergleichbar mit Band- oder Floppydateien. Allerdings mit zwei Unter schieden.
Erstens kann man nur eine einzige serielle Datei in DATAs anlegen. Das kommt daher, daß das erste READ das erste Datenelement im ersten DATA liest und die weiteren READs das jeweils nächste Element. Wenn ein DATA erschöpft ist, wird beim nächsten DATA weitergelesen, sofern es vorhanden ist.
Man kann durch READ also nur alle Datenelemente vom ersten bis zum letzten einiesen, nicht aber z.B. bestimmte DATA-Zeilen anwählen. Durch den Befehl RESTORE hat man lediglich die Möglichkeit, wieder beim allerersten DATA mit dem Lesen zu beginnen.
Zweitens handelt es sich um eine 'Nur-Lese-Datei', weil es vom Programm aus keine Möglichkeit gibt, Daten z.B. vom Bildschirm aus in DATAs zu übernehmen.
Reihenfolge der DATAs
Die Reihenfolge der Daten wird nur durch die Reihenfolge der Zeilennummern der einzelnen DATAs bestimmt. Dagegen ist es unwichtig, ob das erste DATA vor dem ersten READ steht oder umgekehrt. Der Zeiger auf das nächste DATA-Element ist nämlich völlig unabhängig vom normalen Programmzeiger.
71
Beispiel
10 DATA 3 : REM ANZAHL DER STAEDTE
20 DATA 8000,"Muenchen" 2 2 DATA 1000,"Ber 1 in" 24 DATA 6000,"Frankfurt" 30 READ AZ: DIM PZ%(AZ),SN$(AZ)
40 FOR I = 1 TO AZ: READ PZ%(I),SN$(I): NEXT
Die erste Konstante der DATA-Datei gibt die Zahl der einzulesenden Elemente an (Beispiel!). Aufgrund dieser Information werden die beiden Felder für die Post
leitzahlen und die Städtenamen dimensioniert (30). Die Schleife in 40 liest dann alle DATA-Elemente in die beiden Felder ein.
4.3.6 Fehlermeldungen
Wenn mehr READs vorhanden sind, als DATA-Elemente, wird abgebrochen mit OUT
OF DATA ERROR IN ................
Diese Meldung würde auftauchen, wenn im Beispiel in Zeile 10 die Zahl 4 anstatt 3 stehen würde.
Diese Fehlermeldung kann nur durch READ verursacht werden, im folgenden häufigen Fall allerdings sehr versteckt:
Auf dem Bildschirm steht READY., der Computer befindet sich im sogenannten Direktmodus. Sie gehen mit dem Cursor in die Zeile mit dem READY, und drücken die RETURN-Taste. Der Computer bringt dann die OUT OF DATA Meldung. Er hat READY, als READ Y interpretiert, aber kein DATA gefunden!
Dies zeigt nebenbei, daß READ auch im Direktmodus zugelassen ist, wofür es aber kaum Anwendungen geben dürfte.
SYNTAX ERROR IN
Diese Meldung ist sehr bemerkenswert, weil sie erstens falsch ist und zweitens eine Zeilennummer meldet, die man nicht ohne weiters als Quelle des Fehlers erkennen kann: (Aber auch ein Computer ist manchmal nur ein Mensch.)
Wenn versucht wird, mit READ in eine Zahlenvariable ein Stringelement aus DATA zu lesen, meldet der Rechner SYNTAX ERROR. Die Zeilennummer, die dahinter ange
geben wird, ist die der DATA-Anweisung, nicht die der READ-Anweisung!
Die richtige Fehlermeldung müßte lauten: TYPE MISMATCH ERROR!
Beispiel
10 DATA "123" 20 DATA ABCD 30 READ A 40 RESTORE: READ A$ 30 READ A
_________
Nach RUN wird SYNTAX ERROR IN 10 gemeldet, nach RUN 40 dagegen SYNTAX ERROR
IN 20!
72
5. Ein- / Ausgabe - Anweisungen
5.1 Einführung
Ihr Computer ist in einer sehr leistungsfähigen und übersichtlichen Weise mit seiner Peripherie verbunden. Hardwaremäßig wurde dies durch Verwendung des IEC-Bus erreicht, durch den maximal 12 Peripheriegeräte an den Rechner ange schlossen werden können. Auf der Seite der Betriebssoftware wurde das Konzept des IEC-Bus konsequent zur Verwendung von logischen Dateien ausgebaut. Da die logische Datei zentrale Bedeutung im E/A-Konzept hat, soll zuerst dieser Be griff erläutert werden.
Die logische Datei
Zum Verkehr mit der Aussenwelt werden eigentlich nur zwei verschiedene Befehle
benötigt: Einer, der Daten vom Rechner zur Peripherie überträgt und ein ande
rer, der Daten von der Peripherie zum Rechner bringt. Dem Rechner ist es dabei gleichgültig, an wen er Daten schickt, bzw. wer ihm Daten übergibt, da die Norm des IEC-Bus dafür sorgt, daß die Datenübertragung für alle angeschlossenen Geräte einheitlich erfolgt.
U.a. sieht diese Norm vor, daß Byte für Byte nacheinander übertragen werden muß. Vom Rechnerbetriebssystem aus gesehen haben also alle 'Dateien' die Eigen
schaft, daß sie Bytes nacheinander aufnehmen, bzw. abgeben können. Man kann
also nicht ohne weiteres ein ganz bestimmtes Byte verlangen, sondern muß alle
Bytes vom Anfang der Datei bis zu diesem Byte lesen, ganz gleich welches Gerät
dahinter steht.
Konsequenterweise sprechen die E/A-Befehle (INPUT, GET, PRINT) nicht unmittel bar bestimmte Geräte an, sondern über die sogenannte logische Dateinummer eine symbolische Datei, die wir als logische Datei bezeichnen.
Natürlich muß jeder logischen Datei ein Gerät zugeordnet werden. Dies wird von
OPEN erledigt. OPEN verknüpft eine logische Dateinummer mit einer Gerätenummer
(Primäradresse) und einer Sekundäradresse. Was es mit diesen beiden Ausdrücken
auf sich hat, soll im folgenden kurz erklärt werden:
Gerätenummer und Sekundäradresse
Jedes Gerät am IEC-Bus wird durch eine Gerätenummer angesprochen, die zwischen
0 und 15 liegen kann. Nun gibt es aber Geräte, die selbst gewissermaßen mehrere
Geräte verkörpern, etwa verschiedene Betriebszustände (z.B. Drucker) oder ver schiedene Datenkanäle (z.B. Floppy). Solche Geräte benötigen deshalb eine soge nannte Sekundäradresse, durch die die Betriebsart bzw. der Datenkanal festge
legt wird. Der Begriff Sekundäradresse kommt daher, daß die Gerätenummer auch Primäradresse heißt. Die Sekundäradresse kann zwischen 0 und 31 liegen.
Weil Ihr Computer selbst vier Geräte ist, sind die ersten vier Gerätenummern
für ihn selbst reserviert. Im einzelnen sind dies:
Nummer
Gerät
0
1,2
3
Diese Geräte hängen nicht wirklich am IEC-Bus, werden aber vom Betriebssystem
für BASIC so dargestellt, als ob.
T astatur Rekorder 1,2 Bildschirm
73
Da der Computer es Ihnen mit sich selbst besonders einfach machen will, gibt es für Tastatur, Rekorder 1 und Bildschirm abgekürzte E/A-Befehle, nämlich INPUT und PRINT für den Bildschirm, GET für die Tastatur und SAVE/LOAD/VERIFY für Rekorder 1.
Nun wollen wir noch kurz auf die weiteren Anweisungen eingehen, die Sie in diesem Abschnitt erwarten.
Da ist einmal das sehr wichtige CLOSE, mit dem Dateien geschlossen, also abge meldet werden. CLOSE ist das Gegenstück zu OPEN.
Beim Verkehr mit Peripheriegeräten muß oft der Zustand des Gerätes durch den
Status ST abgefragt werden. Insbesondere meldet der Status beim Lesen, wann eine Datei zuende ist.
Die Funktionen DS und DS$ stehen zur Verfügung, um den Zustand des Floppy zu melden.
Das Kommando CMD sorgt u.a. dafür, daß Sie Ihr BASIC-Listing auch auf den Drucker ausgeben können.
Schließlich sind noch drei Funktionen vorhanden, um Ihnen die Formatierung von Bildschirmausgaben zu erleichtern (TAB, SPC, POS).
5.2 OPEN (Datei öffnen)
Zweck
Durch OPEN wird die Verbindung zwischen den Ein- / Ausgabebefehlen PRINT§ , INPUT§ und GET§ und einem Gerät am IEC - Bus hergestellt (s. logische Datei). Das gleiche gilt für DOPEN (Disk-OPEN). Die Syntax von DOPEN unterscheidet sich aber stark von der OPEN-Syntax. DOPEN ist im Floppy-Handbuch beschrieben, des
halb wird hier darauf verzichtet.
Format
OPEN la , gn , sa , dn
la: gn:
sa: dn:
--
j - j• — 7 — •
Logische-Adresse
Geräte-Nummer Sekundär-Adresse
(1 - 127 / 128 - 255) (0 - 15)
(0 - 31)
Datei-Name (Stringausdruck)
la, gn, sa sind jeweils Byteausdrücke, dn ist ein Stringausdruck.
la muß angegeben werden, die restlichen Parameter können entfallen. Wird aber
irgendein Parameter angegeben, müssen alle vor ihm auch angegeben werden.
Nicht angegebene Parameter erhalten automatisch folgende Werte zugewiesen:
gn 1 (Rekorder 1) sa 0 dn leerer String
Die Bedeutungen der Parameter werden in den folgenden Punkten ausführlich er klärt.
74
5.2.1
Die logische Adresse oder logische Dateinummer muß entspechend bei PRINT§la, INPUT§la und GET§la angegeben werden. Durch die logische Adresse la wird bei jedem dieser Befehle das Gerät mit der Gerätenummer gn und der Sekundäradresse
sa angesprochen.
Gleichzeitig kann nur eine Datei mit einer bestimmten la geöffnet sein. Wird versucht, zum zweiten Mal ein OPEN mit der gleichen la durchzuführen, ist die Folge ein FILE OPEN ERROR (IN ...) (Datei ist bereits geöffnet).
Vom CBM Betriebssystem sind maximal 10 Dateien gleichzeitig zugelassen. Wird diese Anzahl überschritten, erfolgt die Fehlermeldung TOO MANY FILES ERROR (IN...) (zu viele Dateien).
Bei beiden Fehlermeldungen werden gleichzeitig vom Betriebssystem alle anderen Dateien geschlossen!
Im Wertebereich für la sind zwei Bereiche zu unterscheiden:
Bei la von 1 - 127 wird hinter einem PRINT§ , das nicht mit abgeschlossen
ist, nur CR, bei la von 128 - 255 wird CR + LF gesendet (s. PRINT§).
5.2.2 Gerätenummer / Primäradresse (gn)
Logische Adresse (la)
Die Gerätenummer wird auch physikalische Adresse, Primäradresse oder Geräte adresse genannt. Folgende Adressen sind vom Betriebssystem fest belegt:
gn Gerät
0 1 Rekorder 1 2 Rekorder 2 3
Für das Floppy ist standardmäßig 8 und für den Drucker 4 vorgesehen.
Ist kein Gerät angeschlossen, so wird bei OPEN - sofern dn angegeben wurde ­bzw. bei PRINT§, INPUT§ oder GET§ gemeldet: DEVICE NOT PRESENT ERROR (Gerät
ist nicht vorhanden / nicht eingeschaltet)
Werte größer als 31 sollten Sie unbedingt vermeiden, da das Betriebssystem
dadurch 'abstürzen' kann oder sonst irgendwelche sonderbaren Reaktionen bringt.
5.2.3 Sekundäradresse (sa)
Die Sekundäradresse stellt bestimmte Betriebsarten ein (Drucker) oder wählt
Datenkanäle aus (Floppy). Die entsprechenden sa mit ihren Wirkungen sind in den jeweiligen Gerätehandbüchern beschrieben. Wegen der Bedeutung bei Banddateien schlagen Sie bitte bei 'Rekorder' nach. Bei der Tastatur (gn=0) und dem Bild schirm (gn=3) sind alle sa-Werte erlaubt, es ist aber sinnlos, eine sa anzuge ben, da sie keinerlei Wirkung hat.
Tastatur (für Sonderanwendungen)
Bildschirm
(für Sonderanwendungen)
75
5.2.4 Dateiname / Kommandostring (dn)
Der vierte Parameter des OPEN ist ein String. Die Bedeutung für das Floppy ist im Floppy-Handbuch beschrieben. Für die Rekorder enthält er den Dateinamen (s. Rekorder).
Bitte beachten Sie folgenden Hinweis zum Format: Falls Sie den Dateinamen bei Band oder Floppy nicht als 1 Konstante bzw. Variable angeben, müssen die ein zelnen Teile durch '+' verbunden werden, und nicht etwa durch wie bei PRINT, es handelt sich nämlich um einen Stringausdruck!
5.2.5 OPEN-Tabelle (Für Fortgeschrittene)
Die Zuordnung zwischen den einzelnen ln, gn und sa wird vom Betriebssystem in einer Tabelle verwaltet. Die Anzahl der offenen Dateien steht in 174. Falls nun eine der beiden Fehlermeldungen FILE (NOT) OPEN ERROR auf tritt, durch die ja alle Dateien geschlossen werden, kann man den Zeiger in 174 auf die Anzahl der offenen Dateien setzen und dadurch diese Dateien wieder öffnen. Dies ist deshalb
möglich, weil der Inhalt der eigentlichen Tabelle durch diese Fehlermeldungen nicht verändert wird, sondern nur durch CLOSE.
Beispiel:
Sie hatten zwei Dateien offen, ehe die Fehlermeldungen kamen, dann können Sie
durch
POKE 174 , 2
die Dateien wieder öffnen. Dieser Tip ist natürlich nur für das Arbeiten im Direktmodus sinnvoll oder für das Austesten von Programmen.
76
5.3
Zweck
CLOSE schließt die logische Datei la.
Format
CLOSE la
la ist die logische Adresse, also ein Byteausdruck. Pro CLOSE muß genau eine la angegeben werden.
Anwendung
'CLOSE' meldet die Datei ab, die durch 'OPEN' der logischen Adresse la zugeord net wurde. Man sagt auch, die Datei wird geschlossen. Jedem 'OPEN' muß im Programm ein 'CLOSE' zugeordnet werden, sobald die betreffende Datei nicht mehr gebraucht wird.
'CLOSE' wirkt auf das Rechner-Betriebssystem, kann aber auch auf das Peripherie gerät wirken. Im Rechner wird dadurch die betreffende logische Dateinummer wieder freigegeben. Im Floppy wird z.B. der entsprechende Kanal freigegeben. Beim Band wird eine Schreibdatei durch EOF (End Of File) abgeschlossen, bzw. bei sa=2 zusätzlich mit EOT.
CLOSE (Datei schließen)
Wichtiger Hinweis
Durch CLR, LOAD, RUN wird die Zuordnungstabelle von logischen Adressen zu Geräten und Sekundäradressen gelöscht. Für den Rechner sind dadurch alle Da teien geschlossen. Dies trifft aber nicht für das Peripheriegerät zu. Sollte
dadurch versehentlich eine Floppy- oder Band-Schreibdatei nicht mehr geschlossen
werden können, kann POKE 174 , anzahl offene Dateien (s. OPEN) weiterhelfen.
Wenn LOAD im BASIC Programm ausgeführt wird (Overlay), bleiben alle Dateien
geöffnet.
F ehlermöglichkeiten
CLOSE ohne la dahinter erzeugt SYNTAX ERROR. Dagegen kann man hinter CLOSE
mehrere la durch Komma getrennt angeben, von denen aber nur die erste berück sichtigt wird. Trotzdem wird kein Fehler gemeldet. Deshalb sei es nochmal aus drücklich gesagt:
Hinter CLOSE muß genau eine la stehen, nicht weniger und nicht mehr!
Durch CLOSE einer la, auf die keine Datei geöffnet wurde, wird kein Schaden angerichtet, dieser Befehl wird ignoriert.
DCLOSE
Disk-CLOSE hat die gleiche Wirkung und den gleichen Zweck wie CLOSE, kann sich aber nur auf Floppy-Dateien beziehen. Der Vorteil von DCLOSE ist, daß damit alle Floppy-Dateien mit einem Befehl geschlossen werden können. Näheres entnehmen Sie bitte dem Floppy-Handbuch.
77
5.4
Zweck
CMD adressiert das la zugeordnete Gerät als Listener (Datenempfänger) und meldet dieses Gerät erst dann wieder ab, wenn PRINT§ auf eine beliebige offene Datei
ausgeführt wird, jedoch nicht bei PRINT (Bildschirm).
Format
CMD la , string
Erklärungen
Alle Daten, die auf den Bildschirm geschrieben werden, werden durch CMD auf ein
beliebiges Peripheriegerät umgelenkt.
Dies gilt für alle Ausgaben, ganz gleich ob sie vom BASIC-Programm durch PRINT oder durch Meldungen des Betriebssystems oder z.B. durch LIST erzeugt werden. Dagegen werden Eingaben von der Tastatur während INPUT oder im Direktmodus wei terhin nur auf den Bildschirm geschrieben und können dort auch geändert werden.
CMD (Bildschirm-Ausgabe umlenken)
la Logische Adresse (s. OPEN)
string auszugebender String (Format wie bei PRINT, kann auch
entfallen
Folgende Befehlssequenz gibt das Listing an den Drucker aus:
Ausführliche Form:
OPEN 4 , 4 CMD 4
LIST
PRINT § 4
Kurzform:
Op4,4:Cm4:Li Pr4
Wir haben die Kurzform mit Abkürzungen zusätzlich mit aufgeführt, weil diese
Sequenz oft im Direktmodus gebraucht wird.
Statt der Datei auf den Drucker könnte auch eine auf das Floppy geöffnet wer
den. Dadurch könnte der Bildschirmtext statt auf den Drucker auf Floppy ausge geben werden.
Statt des Listings kann auch sonstiger Text ausgegeben werden. Ersetzen Sie z.B. Li durch DlrDl, so wird das Inhaltsverzeichnis des Laufwerks 1 an den Drucker ausgegeben.
78
Beendung des CMD-Zustandes
Solange nur Ausgaben auf den Bildschirm erfolgen, bleibt der CMD-Zustand eingeschaltet. Sie erkennen ihn im Direktmodus daran, daß nach Ausführung eines Befehls nicht wie gewöhnlich READY auf dem Bildschirm steht, sondern nur der Cursor. (Die Meldung READY wurde an das Peripheriegerät ausgegeben.)
Durch ein PRINT§la auf eine beliebige offene Datei wird CMD abgeschaltet! Deshalb steht in dem obigen Beispiel in der nächsten Zeile PRINT§4.
Eine etwas unfeinere Art ist, einen SYNTAX ERROR zu erzeugen, indem man Unsinn auf den Bildschirm schreibt und RETURN drückt. Diese Merthode ist natürlich nur
im Direktmodus sinnvoll.
Feinheiten
Falls Sie CMD innerhalb eines Programms anwenden wollen (zu Testzwecken), be achten Sie bitte, daß jedes PRINT§ den CMD-Zustand beendet. Der Inhalt dieses PRINT§ wird allerdings zusätzlich auf das CMD-Gerät ausgegeben, d.h. für diese eine Datenübertragung sind zwei Geräte gleichzeitig Empfänger.
Sie können also nicht eine Ausgabe auf Floppy mit CMD auf den Drucker umlenken,
jedenfalls nicht mehr als ein einziges PRINT§. Sollten Sie eine solche Umlenkung
wollen, brauchen Sie nur im OPEN anstatt des Floppy (z.B. 8) den Drucker (z.B.
4) angeben.
F ehlermöglichkeiten
Da CMD eine logische Adresse als Parameter hat, ist natürlich Voraussetzung für CMD, daß vorher durch OPEN die entsprechende Datei geöffnet wurde, anderenfalls wird FILE NOT OPEN ERROR gemeldet.
Versuchen Sie nicht, zwei CMD-Kanäle zur gleichen Zeit zu öffnen. Das Betriebs system reagiert darauf mit verkehrten Fehlermeldungen und der Cursor kann nach RETURN nicht in die nächste Zeile, sondern in die dritte Spalte der gleichen
Zeile gehen. Dieses Zustand können Sie durch einen SYNTAX ERROR beenden (s.o.).
79
5.5 PRINT (drucken)
Zweck
PRINT § la, gibt beliebige Daten an Peripheriegeräte oder speziell den Bildschirm aus.
Format
PRINT § la ,
ausgabedaten
oder
PRINT
ausgabedaten
bzw.
?
ausgabedaten
Die erste Form bewirkt die Ausgabe von Daten auf eine logische Datei. Dabei ist vorausgesetzt, daß eine Datei la mit OPEN geöffnet wurde.
Die zweite Form (ohne la) bewirkt die Ausgabe auf den Bildschirm. Die dritte Form zeigt lediglich die Abkürzung von PRINT (auf den Bildschirm).
Bitte verwechseln Sie nicht '?' und 'Pr', bzw. schreiben Sie nicht '?§', ein
SYNTAX ERROR wäre die Folge.
'la' ist die logische Adresse (s. OPEN)
'ausgabedaten' sind nach spezieller PRINT-Syntax aneinandergereihte numerische Ausdrücke oder Stringausdrücke. Diese Syntax ist für beide PRINT-Formen iden tisch und tritt sonst nur noch bei CMD auf. Das Besondere an der PRINT Syntax sind die Trennzeichen und Trennfunktionen zwischen den Ausdrücken.
Die Trennzeichen zwischen den Ausdrücken haben sehr unterschiedliche Wirkung
auf das Druckformat. Zusätzlich muß für die Wirkung des gleichen Trennzeichens unterschieden werden zwischen PRINT§la und PRINT. Um das ganze nicht zu kompli ziert werden zu lassen, wollen wir zuerst das Trennzeichen beschreiben, das für
beide PRINTs gleiche Wirkung hat.
Strichpunkt
Der Strichpunkt trennt die einzelnen Ausdrücke hinter PRINT voneinander.
Beispiel: PRINT A+3 ; B ; C$ ; "abcd"
Dieser Befehl gibt das Ergebnis von A+3, den Inhalt von B und C$, sowie die Zeichen 'abcd' unmittelbar hintereinander auf den Bildschirm aus.
Der Strichpunkt dient also nur für den Interpreter dem Zweck, die einzelnen
Ausdrücke auseinanderhalten zu können, fügt aber keine zusätzlichen Leerräume oder dergleichen beim Drucken ein.
80
Eine besondere Bedeutung kommt dem Strichpunkt am Ende des PRINT-Befehls zu:
Beispiel PRINT A$
PRINT A$;
Im ersten Fall wird nach dem Drucken des Inhalts von A$ sofort eine neue Zeile begonnen (auf dem Bildschirm), während im zweiten Fall der (gedachte) Cursor hinter dem letzten Zeichen von A$ stehen bleibt. Ein nächstes PRINT beginnt also im ersten Fall am Anfang der nächsten Zeile zu drucken, im zweiten Fall unmittelbar hinter der letzten Druckposition.
Bei PRINT§ muß diese Wirkung allgemeiner formuliert werden:
Wird PRINT§ nicht mit Strichpunkt (oder Komma) abgeschlossen, so wird automa tisch nach dem letzten Zeichen ein CR (Carriage Return = CHR$(13)) gesendet, sofern die logische Adresse kleiner als 128 ist. Bei la größer als 127 wird nach dem CR auch noch LF (Line Feed = CHR$(10)) gesendet. Bitte beachten Sie, daß bei Floppy und Rekorder deshalb nur la kleiner als 128 verwendet werden sollten (s. INPUT).
Zahlenformat
Allen Zahlen gemeinsam ist, daß sie an der ersten Stelle ein Blank (anstatt +) oder ein Minuszeichen haben. Nach der Zahl steht entweder 'Cursor nach rechts' (PRINT) oder Blank (PRINT§).
Gleitkommazahlen werden je nach Zahlenwert als normale Gleitkommazahl (ohne Exponent) oder als Mantisse mit Exponent (Exponentialdarstellung) ausgegeben. Die Regeln sind folgende:
Ist der Betrag der Zahl größer als 1, so wird in Exponentialdarstellung umge
schaltet sobald die Anzahl der Stellen 9 überschreitet:
100 000 000 ergibt 100000000
1000 000 000 ergibt 1E+09
Ist der Betrag kleiner als 1, so wird ab 1E-03 in Exponentialdarstellung umge­geschaltet:
.0111 ergibt .0111 .00111 ergibt 1.111E-03
Der Exponent wird in jedem Fall zweistellig und mit explizitem Vorzeichen ausgegeben, d.h. '+' wird nicht als Blank, sondern als '+' dargestellt.
Die Anzahl der Nachkommastellen bei Exponentialdarstellung kann zwischen 0 und 8 liegen. Im Fall von 0 Nachkommastellen entfällt auch der Punkt. Bei der Exponentialdarstellung steht immer genau eine Ziffer vor dem Punkt.
Bei Gleitkommadarstellung werden maximal 9 Stellen ausgegeben. Die Verteilung dieser 9 Stellen auf Vor- und Nachkommastellen kann von 1 Vorkomma- und 9 Nach kommastellen bis zu 9 Vorkomma- und 0 Nachkommastellen alle Stufen annehmen: Bei
0 Nachkommastellen entfällt auch der Punkt.
81
Der folgende Ausdruck zeigt alle möglichen Darstellungsformen:
1.23123123E-03 .0123123123 .123123123
1.23123123
12.3123123
123.123123
1231.23123
12312.3123
123123.123
1231231.23
12312312.3 123123123
1.23123123E+09
Es gibt keinen BASIC-Befehl, der Zahlen in ein bestimmtes Format bringt.
Stringformat
Strings werden ohne irgendwelche zusätzlichen Zeichen aneinandergereiht, solange nicht die speziellen Formatierungsbefehle z.B. Blanks dazwischenschreiben.
Komma
Trennt man Ausdrücke anstatt durch Strichpunkt durch Komma, so wird dadurch auf dem Bildschirm (PRINT) jeweils ab der nächsten erreichbaren 10-er-Spalte ge druckt, also ab Spalte 10, 20, 30 usw.
Die Spalten sind innerhalb einer Zeile von 0 bis 79 durchnummeriert.
Der Zwischenraum bis zur nächsten Druckposition wird nicht verändert, alle Zeichen, die vorher im Zwischenraum standen, stehen nach der Tabulierung durch Komma immer noch dort. Die Tabulierung auf dem Bildschirm wird also nicht durch Blanks, sondern durch 'Cursor nach rechts' erreicht. Dies gilt auch für TAB und SPC!
Bei PRINT§la (nicht auf den Bildschirm) sollte Komma als Trennzeichen zwischen Ausdrücken nicht verwendet werden, da die Tabulierung dort nicht funktioniert, sondern bei jedem Komma 10 Blanks (CHR$(32)) gesendet werden, was ja keine Tabulierung bewirkt.
TAB( )
Mit TAB kann jede Spalte einer Bildschirmzeile direkt erreicht werden.
In den Klammern hinter TAB kann ein Byte-Ausdruck stehen, dessen Ergebnis zwi schen 0 und 79 liegen sollte, aber theoretisch bis zu 255 groß sein darf.
TAB arbeitet nur von links nach rechts. Wenn der Cursor z.B. schon in Spalte 30 steht und im PRINT TAB(17) steht, so wird die TAB-Anweisung ignoriert. Der Cursor kann durch TAB also nicht nach links bewegt werden.
Innerhalb einer Bildschirmzeile können (in aufsteigender Reihenfolge) mehrere TABs verwendet werden.
82
Der Tabulator ist nur für die Verwendung innerhalb einer Bildschirmzeile (80 Spalten) gemacht. Wollen Sie mehrere Zeilen durch einen TAB-Sprung überbrücken,
so müssen Sie folgendes Verhalten berücksichtigen: Bei TAB-Werten größer als 79
wird der Sprung nur beim ersten Mal richtig ausgeführt, folgende TABs werden aber immer ab Beginn der Zeile berechnet, in der der Cursor gerade steht!
Bei PRINT§la (nicht auf den Bildschirm) hat TAB identische Wirkung wie SPC ,
fabuliert also nicht (s. Komma), sondern sendet soviele Blanks, wie der Ausdruck in den Klammern angibt!
SPC( )
SPC( ) überspringt bei PRINT (Bildschirm) soviele Spalten, wie der Byte-Ausdruck in Klammern angibt. Wie bei TAB werden dabei Zeichen im übersprungenen Bereich nicht gelöscht (Cursor nach rechts).
Bei PRINT§ werden soviele Blanks gesendet, wie in Klammern angegeben ist.
SPC( ) darf ebenso wie TAB( ) nur hinter PRINT auf treten. Man kann also z.B. nicht durch SPC( ) einer Stringvariablen Blanks zuweisen!
Hochschieben des Bildschirminhaltes
Wenn durch PRINT die letzte Bildschirmzeile überschritten werden soll, wird der gesamte Bildschirminhalt um eine Zeile nach oben geschoben, wobei die oberste Zeile verlorengeht.
Dieses Hochschieben kann der Anwender verhindern, wenn er gleichzeitig die Taste mit dem Doppelpunkt drückt. Genauer ausgedrückt, prüft die Betriebssystem routine, die den Bildschirminhalt hochschiebt, nachdem sie den Inhalt hochge
schoben hat, ob zu diesem Zeitpunkt die Taste mit dem Doppelpunkt gedrückt ist.
Wenn ja, wartet sie, bis entweder 'Pfeil nach links' gedrückt wird oder STOP. Bei 'Pfeil nach links' wird einfach das Programm normal fortgesetzt, bei STOP unterbrochen.
Falls der Anwender aus Versehen die Taste mit dem Doppelpunkt drückt, hält er dadurch das Programm an und Sie haben vom Programm aus keine Möglichkeit, dies
zu erkennen!
Der Vollständigkeit halber sei erwähnt, daß 'Pfeil nach links' nach jedem Hoch
schieben eine Pause bewirkt, wenn diese Taste während des Hochschiebens gedrückt
ist.
Anmerkungen für Fortgeschrittene
1) Strichpunkt kann entfallen:
Hinter folgenden Zeichen kann der Strichpunkt als Trennzeichen entfallen:
)
fl
%
$
Klammer zu
Anführungszeichen
Integervariable
Stringvariable
83
2) Zahlen werden als String ausgegeben:
Zahlen werden durch PRINT grundsätzlich als String ausgegeben. Dies gilt auch für die Ausgabe auf andere Geräte als den Bildschirm. Anders ausgedrückt, werden
Zahlen nicht komprimiert als 5 Bytes (Gleitkomma) oder 2 Bytes (Integer) ausge geben, sondern immer als String mit maximal 15 Zeichen.
3) PRINT £la auf Bildschirm:
Falls Sie über OPEN 3,3 und PRINT§3 mit einem PRINT§ auf den Bildschirm aus
geben, druckt Komma, TAB und SPC SPACE'S auf den Bildschirm, d.h. Zeichen in den Zwischenräumen werden gelöscht! Komma und Tabulator tabulieren aber richtig.
Sie können diese Wirkung ausnützen, falls Sie die Zwischenräume wirklich löschen wollen.
4) PRINT (auf Bildschirm):
Das 'Überspringen' auf dem Bildschirm bei Komma, TAB und SPC wird durch 'Druk ken' von 'Cursor nach rechts' bewirkt (s. Bildschirmverwaltung). Sie können dies sichtbar machen, indem Sie am Anfang des PRINT CHR$(34) drucken las sen. Dadurch wird die Bildschirmverwaltung in den Controlmodus geschaltet.
In diesem Zusammenhang sei auf eine Konsequenz des Zahlenformats auf dem Bild
schirm hingewiesen. Jede Zahl wird von 'Cursor nach rechts' gefolgt. Dies macht
sich manchmal negativ bemerkbar, wenn Zahlen revers gedruckt werden sollen, da zwar das führende Blank weiß gedruckt wird, aber nicht die Stelle nach der Zahl,
da sie ja nicht als Blank gedruckt wird.
Durch folgendes Anhängsel können Sie diesen 'negativen (Ein)Druck' verhindern: Hinter der Zahl bzw. dem numerischen Ausdruck öffnen Sie Anführungszeichen, drücken die Taste 'Cursor nach links' und SPACE und schließen die Anführungs zeichen. Dadurch wird rechts neben der Zahl ein Blank gedruckt. Sofern Sie vorher auf Revers-Druck geschaltet hatten, wird die Zahl mit nachfolgendem hellem Blank gedruckt.
5.6 POS( )
Zweck
POS meldet die Position (Spalte) des Cursors in der Bildschirmzeile, ist also nur in Zusammenhang mit PRINT sinnvoll. Das Ergebnis von POS ist ein ganz zahliger Wert zwischen 0 und 79.
Format
A = POS(O)
POS (0) ist eine Funktion mit Byte-Ergebnis. Der Parameter in Klammern hat keine Bedeutung, muß aber angegeben werden, um die Syntax-Prüfung zufriedenzu stellen.
Das Ergebnis kann jeder Gleitkomma- oder Integervariablen zugewiesen werden.
84
5.7
Zweck
INPUT bringt Zahlenwerte oder Strings von einem Peripheriegerät oder vom Bild schirm in eine oder mehrere Variablen.
Format
INPUT "hinweis"; vl , v2 , ....
INPUT§ la , vl , v2 , ...
hinweis Stringkonstante la logische Adresse (s. OPEN) vl, v2 beliebige Variablen
Vor INPUT§la muß mit OPEN eine Datei auf la geöffnet worden sein.
INPUT darf nur im Programm verwendet werden, nicht aber im Direktmodus.
5.7.1 Gemeinsame Eigenschaften
INPUT (Eingabe mehrerer Zeichen)
INPUT vom Bildschirm (INPUT) und von Peripheriegeräten (INPUT§,la) unterschei den sich in einigen Details. Beachten Sie aber folgende Gemeinsamkeiten, um den Überblick nicht zu verlieren.
INPUT kann maximal 80 Zeichen (81 einschließlich Carriage Return) verarbeiten.
Der Grund liegt darin, daß alle Daten (gleichgültig ob vom Bildschirm, vom
Rekorder oder vom IEC-Bus) in den BEP (BASIC-Eingabe-Puffer) gelegt wer
den. Erst von dort werden sie in die einzelnen Variablen übertragen. Dieser
Puffer ist genau 81 Bytes lang. Die Übertragung in diesen Puffer wird durch CR (CHR$(13)) unterbrochen.
Zusätzlich kennt INPUT noch die Trennzeichen Komma (CHR$(44)) und Doppelpunkt (CHR$(58)), sofern nicht seit dem letzten CR ein Anführungszeichen (CHR$(34)) gesendet wurde. Komma und Doppelpunkt wirken aber nur innerhalb des BEP, sind
also nicht mit CR vergleichbar, weil die Übertragung in den BEP durch sie nicht unterbrochen wird. Komma und Doppelpunkt trennen lediglich einzelne Variablen
inhalte voneinander ab.
INPUT kann in gemischter Reihenfolge Zahlendaten und Stringdaten lesen. In Stringvariable kann jeder String gelesen werden, insbesondere auch ein String, der eine Zahl darstellt. Umgekehrt können aber in Zahlenvariable nur Zeichen
folgen gelesen werden, die eine Zahl darstellen.
Falls Sie Zahlen und Strings mischen, müssen Sie also darauf achten, daß hinter INPUT Zahlen- und Stringvariable in der richtigen Reihenfolge kommen.
85
Zahlenformat:
Folgende Zeichen sind zugelassen: Ziffern, Blank, '+', 'E' (Exponent) (E muß ohne SHIFT eingegeben werden!)
Blanks können überall (auch zwischen Ziffern) auftreten, sie werden ignoriert.
Die Mantisse kann mehr als 9 Stellen haben, sie wird automatisch gerundet. Führende Nullen vor dem Komma werden ignoriert, nachfolgende Nullen nach dem Komma ebenfalls.
5.7.2 Besonderheiten des Bildschirm-INPUT
(1) Der Hinweisstring:
Um dem Benutzer mitzuteilen, welche Eingabe von ihm gefordert wird, kann un
mittelbar hinter INPUT ein Hinweisstring angegeben werden:
Beispiel: INPUT "Vorname";VN$
Der Hinweisstring kann nur eine Stringkonstante sein. Die erste Variable muß
durch Strichpunkt vom Hinweisstring abgetrennt werden.
Die Befehlsfolge: PRINT H$;:INPUT E$ ist in der Wirkung identisch mit der An gabe des Hinweisstrings in INPUT, hat aber den Vorteil, daß hinter PRINT auch Variable zugelassen sind.
Wird Bildschirm-INPUT im Programm angetroffen, so erscheint auf dem Bildschirm in der nächsten Druckposition ein Fragezeichen und zwei Spalten dahinter blinkt der Cursor. Falls ein Hinweisstring angegeben wurde, wird dieser vor dem Frage zeichen ausgegeben. Der Anwender kann nun die von ihm verlangte Eingabe tippen und beliebig verbessern. Sobald er die RETURN-Taste drückt, wird seine Eingabe
an die Variable(n) übergeben, die hinter INPUT aufgeführt sind.
Weil der Anwender völlige Freiheit auf dem Bildschirm hat, können Sie vom BASIC-
Programm aus nicht kontrollieren, was er tut. Falls Sie einen übersichtlichen und abgesicherten Dialogaufbau auf dem Bildschirm anstreben, sollten Sie sich mit folgenden Reaktionen des INPUT auseinandersetzen:
(2) Leere Eingabe:
Drückt der Anwender RETURN, ohne in der Zeile etwas geschrieben zu haben, so wird der Programmlauf beendet. Das Betriebssystem meldet sich dann mit READY. Diese Reaktion auf die leere Eingabe soll die STOP-Taste ersetzen, da diese während INPUT ignoriert wird.
Mit CONT könnte der Anwender das Programm bei dem INPUT wieder starten, wo er es verlassen hat. Da für einen unbedarften Anwender derlei Krücken aber nicht akzeptabel sind, sollte man diesen Zustand verhindern.
86
Abhilfe: Sie können entweder INPUT§ verwenden (s.u.) oder mit Hilfe des Hin weisstrings hinter das Fragezeichen Zeichen schreiben, die keine Blanks sind:
INPUT"EINGABE:rr*lll";E$
r = 'Cursor nach rechts' oder SPACE * = beliebiges Zeichen, auch SHIFT/SPACE 1 = 'Cursor nach links'
Wenn Sie für * SHIFT/SPACE einsetzen, sieht die Eingabe auf dem Bildschirm genauso aus, wie das normale INPUT.
Wenn der Anwender keine Eingabe macht, wird das Zeichen für * in E$ übergeben.
* können auch mehrere Zeichen sein, allerdings müssen dann entsprechend viele 1 angegeben werden.
Die 'leere Eingabe' müssen Sie dann durch eine Abfrage auf * gesondert behan deln, da sie ja kein vom Benutzer eingegebenes Zeichen ist.
(3) Zahlenvariable:
Haben Sie hinter INPUT eine Zahlenvariable angegeben, aber der Benutzer gibt eine nichtnumerische Zeichenfolge ein, so wird REDO FROM START gemeldet und das INPUT-Fragezeichen erscheint in der nächsten Zeile nochmal. Dies soll dem Anwender signalisieren, daß er die ganze Eingabe wiederholen soll.
Abhilfe: Generell nur Stringvariable verwenden und hinterher Strings in Zahlen umwandeln, falls Zahlen benötigt werden (VAL). Dadurch fällt aber ihrem Pro gramm die Aufgabe zu, die Eingabe zu überprüfen und entsprechend zu reagieren.
(4) Mehr Eingaben als Variablen:
Tippt der Anwender Komma oder Doppelpunkt und steht hinter INPUT nicht eine Variable mehr, als der Anwender Kommas und Doppelpunkt geschrieben hat, so wird EXTRA IGNORED gemeldet. Das soll dem Anwender andeuten, daß alles nach einem bestimmten Komma oder Doppelpunkt ignoriert wurde. Dem Anwender nützt diese Meldung aber nichts, da er es nicht ändern kann und das BASIC-Programm merkt nichts davon, so daß das Programm nicht auf derlei Eingabefehler reagieren kann.
Abhilfe: Entweder den Anwender ausdrücklich darauf hinweisen, daß er ',' und ':' nicht verwenden darf, oder (nur bei Stringvariablen) von ihm verlangen, daß er als erstes Zeichen ein Anführungszeichen schreibt.
(5) Weniger Eingaben als Variablen:
Stehen hinter INPUT mehrere Variable und gibt der Anwender nicht soviele Kommas oder Doppelpunkte ein, um entsprechend viele Datenfelder zu trennen, so werden in die nächste Zeile zwei Fragezeichen geschrieben und dahinter blinkt der Cursor. Dies soll dem Anwender signalisieren, daß mindestens noch eine Eingabe fehlt.
Abhilfe: Nicht mehr als eine Variable hinter INPUT verwenden. Das hat auch den Vorteil, daß Sie auf einzelne Falscheingaben gezielter reagieren können.
87
(6) Falsche Zeile:
Der Anwender kann aus Versehen mit Hilfe der vertikalen Cursorbewegungstasten die Eingabezeile verlassen. Ganz gleich, ob er dann wieder in die Eingabezeile
zurückkehrt oder nicht, gilt die folgende Eigenschaft des INPUT:
Ist (oder war!) der Cursor in einer anderen Zeile als das INPUT-Eragezeichen, so wird die ganze Zeile eingelesen, in der der Cursor steht, sobald RETURN gedrückt wird.
Ist diese Zeile leer, wird allerdings das Programm nicht abgebrochen, sondern eine Stringvariable hinter INPUT erhält den leeren String zugewiesen, bzw. eine
Zahlenvariable den Wert 0.
Abhilfe: Da in diesem Fall in der Stringvariablen mindestens das Fragezeichen enthalten ist, kann man durch eine Abfrage dies feststellen und z.B. durch eine nochmalige Eingabeaufforderung darauf reagieren. Angenommen, das INPUT-
-Eragezeichen steht ganz am Anfang der Zeile, dann können Sie durch folgende Abfrage den Eingabefehler korrigieren:
10 INPUT A$ 20 IF LEFT$(A$,1)="?" THEN A$ = MID$(A$,3) 30 ...
5.7.3 Besonderheiten des Datei-INPUT§
Im Betrieb mit Commodore-Peripheriegeräten kommt INPUT nur in Verbindung mit Floppy oder Rekorder vor. Da von diesen Geräten in der Regel nur solche Daten gelesen werden können, die vorher mit PRINT§ in eine Datei geschrieben wurden, werden die Eigenschaften des INPUT§ mit PRINT§ verglichen, um die Zusammenhänge zu verdeutlichen. Mit diesem Verständnis können Fehler leichter vermieden wer den.
Die übliche Anwendung von PRINT§ und INPUT§ bei Floppy oder Rekorder sieht vor, daß Variableninhalte mit PRINT§ in eine Datei geschrieben werden und mit INPUT§ zu einem späteren Zeitpunkt die Daten aus der Datei wieder in Variable gebracht werden müssen.
Folgende Hinweise sind zu beachten, um einen fehlerlosen Datenverkehr zu er halten:
(1) Reihenfolge der Daten:
Sie können die Inhalte von Zahlen- und Stringvariablen in beliebiger Reihen folge mit PRINT§ in eine Datei schreiben. Beim Lesen mit INPUT§ müssen Sie dann aber beachten, daß die Daten wieder in der gleichen Reihenfolge kommen, also in einander entsprechende Variablen gelesen werden müssen. (Meistens werden die Variablen hinter PRINT§ und INPUT§ sogar identisch sein, sie müssen es aber
nicht.)
Versuchen Sie, einen nichtnumerischen String in eine Zahlenvariable zu lesen,
erhalten Sie die Fehlermeldung FILE DATA ERROR. Meistens ist die Ursache ein
überflüssiges Trennzeichen in der Datei oder eben eine falsche Reihenfolge der
Variablen.
88
(2) Länge der Daten
Wie oben erwähnt, kann INPUT nur 80 Zeichen verarbeiten. Da CR die Übertragung in den Puffer beendet, müssen Sie darauf achten, bei PRINT§ nie mehr als 80 Zeichen ohne CR zu senden, da sonst STRING TOO LONG ERROR gemeldet wird.
Diese Einschränkung ist speziell bei Strings zu beachten, da der Inhalt von Stringvariablen ja 255 Zeichen lang sein kann.
Wie bei PRINT§ erklärt, werden Zahlen genauso wie Strings ausgegeben. Exakter ausgedrückt, sind Zahlen nur spezielle Strings. Wenn Sie sich nun noch daran erinnern, daß PRINT§ die Möglichkeit bietet, beliebig viele Zeichen ohne CR zu senden, indem einzelne Ausdrücke durch getrennt werden, bzw. die PRINT-An­weisung durch abgeschlossen wird, sehen Sie, daß auch ohne Stringvariable die 80 Zeichen-Grenze Beachtung verdient.
Für den Normalfall empfehlen wir, pro PRINT nur eine Variable (einen Ausdruck)
zu verwenden, bzw. die Ausdrücke durch CR zu trennen. Zwei Beispiele sollen Ihnen dies verdeutlichen:
(10 OPEN 1,1,1,"NAME") 20 PRINT§1,A$:PRINT§1,B*3
Durch den fehlenden Strichpunkt am Ende jedes PRINTs sendet das Betriebssystem
automatisch CR nach dem Variableninhalt zur Datei. Beachten Sie hierbei, daß
die logische Adresse kleiner als 128 sein muß! (s. OPEN)
Völlig gleiche Wirkung erzielen Sie durch folgende Anordnung:
15 CR$=CHR$(13) 20 PRINT§1,A$CR$B*3
Der Variablen CR$ wird in Zeile 15 der Code für CR (Carriage Return) zuge wiesen. In Zeile 20 wird dann nach A$ CR gesendet, dann das Ergebnis von B*3 und dann wieder CR (wegen des fehlenden Strichpunkts am Ende).
Bei beiden Beispielen muß sichergestellt sein, daß A$ nicht mehr als 80 Zeichen enthält. Dagegen kann B*3 (Gleitkommaausdruck) nie länger als knappe 20 Zeichen werden.
(3) Andere Trennzeichen:
Wie oben erwähnt, könnte auch Komma und Doppelpunkt verschiedene Variablenin halte voneinander trennen. Da dies aber das Pufferproblem nicht löst, empfehlen wir, nur CR als Trennzeichen zu verwenden!
Wollen Sie trotzdem Komma und Doppelpunkt verwenden, müssen Sie darauf achten, daß sich Ihre Daten nicht über mehr als 80 Zeichen erstrecken. Beachten Sie dabei, daß 6 Gleitkommazahlen schon länger als 80 Zeichen sein können.
89
(4) Sonder - Codes
PRINT§ kann in Zusammenhang mit Stringvariablen bzw. der Funktion CHR$() jeden Code zwischen 0 und 255 als ein Byte (Zeichen) in eine Datei schreiben. INPUT§ kann aber nicht jeden dieser Codes lesen. Folgende Codes können nicht gelesen werden oder nur bedingt:
Code Darstellung Bedeutung
0 CHR$(0)
13 CHR$(13) 32 "SPACE" 34 44 58
CHR$(34)
tt tf
9
tt« Vt
'Null' CR = Carriage Return Blank Anführungszeichen Komma Doppelpunkt
Die ersten drei Codes können von INPUT überhaupt nicht gelesen werden, d.h. ihr Wert wird nicht in eine Stringvariable übergeben.
Die letzten beiden werden nur dann übernommen, wenn seit dem letzten CR eine
ungerade Anzahl von Anführungszeichen gelesen wurde, da sie sonst als Trenn zeichen wirken, selbst aber nicht übernommen werden.
Blank wird im folgenden behandelt:
(5) Blanks (SPACE, Leerraum)
Bei Zahlen werden Blanks völlig ignoriert (s.o.). Bei Strings sind folgende
Fälle zu unterscheiden:
Führende Blanks werden nur an die Stringvariable übergeben, wenn vorher CHR$(34) gelesen wurde. Ist dies nicht der Fall, werden sie ignoriert, d.h. der
String wird ab dem ersten Code, der von 32 verschieden ist, übernommen.
Blanks zwischen anderen Zeichen werden immer übernommen, ebenso folgende Blanks.
Beachten Sie den Unterschied zwischen INPUT§ aus Dateien und INPUT vom Bild schirm bezüglich nachfolgender Blanks: Beim Bildschirm werden nachfolgende Blanks genauso wie führende ignoriert, falls nicht Anführungszeichen oder ein Trennzeichen die Blanks abschließt.
(6) Status:
Die Behandlung der Statusvariable ST ist bei Status beschrieben. Kurz zusammen
gefaßt ergeben sich für INPUT§ folgende Hinweise:
Solange ST = 0 ist, enthält die Datei weitere Daten.
Sobald ST 64 enthält ist der letzte Variableninhalt übertragen worden. Danach ist es sinnlos, weiterzulesen.
Versucht man es dennoch, enthält ST den Wert 2. In diesem Fall wird kein Wert an die INPUT-Variable übergeben, sie enthält also nach INPUT den Wert bzw. den
String, den sie vorher enthielt und nicht etwa unbedingt 0 oder den leeren String!
90
(7) INPUT§ von der Tastatur
Das Problem der leeren Eingabe bei INPUT kann man umgehen, indem auf die Tasta tur eine Datei geöffnet wird (OPEN 1,0) und dann durch INPUT§1 das normale
INPUT ersetzt wird.
INPUT§ druckt kein Fragezeichen auf den Bildschirm, sondern setzt einfach den Cursor bei der nächsten Druckposition auf.
Die leere Eingabe wird folgendermaßen verarbeitet:
(1) Wenn der Cursor nicht am Anfang einer Zeile aufgesetzt wird und auch vom Anwender nicht aus dieser Zeile gefahren wird, so ignoriert INPUT§ die leere Eingabe. D.h., der Cursor blinkt einfach weiter, INPUT§ gibt die Kontrolle in
diesem Fall also nicht an BASIC zurück.
(2) Wenn der Cursor am Zeilenanfang aufgesetzt wird, oder der Anwender die
Zeile mit dem Cursor verläßt, so übergibt INPUT§ den leeren String an die INPUT§-Variable, das Programm läuft aber weiter. Dadurch haben Sie im Programm die Möglichkeit, auf die leere Eingabe gezielt zu reagieren.
(8) INPUT § vom Bildschirm
OPEN 3,3 .... INPUT§3 liest den Rest einer Bildschirm-Zeile ab der aktuellen
Cursorposition bis maximal zur Spalte 78, also maximal 79 Zeichen. Die letzte
Spalte wird in keinem Fall gelesen.
Falls in der Zeile Doppelpunkt oder Komma enthalten sind, wird wie beim nor
malen INPUT ab einschließlich des Trennzeichens nicht weitergelesen. Im Unter
schied zum normalen INPUT werden folgende Blanks mit übernommen, führende dage
gen auch nicht. Durch Anführungszeichen können auch führende Blanks mit über
nommen werden.
Der Hauptunterschied dieses INPUT§ zu allen anderen INPUT-Versionen liegt darin,
daß eine Bildschirmzeile ohne Zutun des Anwenders gelesen werden kann.
5.8 GET (Hole ein Zeichen)
Zweck
GET holt genau ein Zeichen (Byte) aus einer Datei (GET§) oder aus dem Tastatur
puffer (GET) in eine Variable.
Format
GET §la, vl , v2 ,...
Im Gegensatz zu PRINT und INPUT hat GET§ kein eigenes Kurzzeichen, die Abkür
zung Ge kann also mit oder ohne § verwendet werden.
GET§la setzt OPEN voraus.
vl ist eine beliebige Variable.
v2 ... sind weitere Variable, die jeweils durch Komma getrennt werden.
GET darf nur im Programm verwendet werden, nicht aber im Direktmodus.
91
5.8.1
GET bietet wie INPUT die Möglichkeit, mit dem Anwender in Dialog zu treten, allerdings auf ganz andere Art. Bei Tastaturpuffer ist beschrieben, daß jede Taste, die während eines Programmlaufes gedrückt wird, automatisch in den Tasta
turpuffer übernommen wird. Maximal 10 Tasten können dort gespeichert werden. GET
holt nun das zuerst im Speicher abgelegte Zeichen bzw. den ASC-Code der zuerst
gedrückten Taste in die Stringvariable. Dabei bleibt aber weder das Programm stehen, noch wird dieses Zeichen automatisch auf den Bildschirm geschrieben, wie bei INPUT.
Die Hauptanwendung von GET liegt darin, einen sehr sicheren Dialog aufzubauen,
da GET im Gegensatz zu INPUT keine Fehlermeldungen bringen kann. Die einzige
Möglichkeit für den Anwender trotz GET das Programm zu stoppen ist die STOP-
Taste bzw. die Taste mit dem Doppelpunkt.
(Die Taste mit dem Doppelpunkt stoppt die Bildschirmausgabe, falls sie gedrückt
wird, wenn gerade der Bildschirminhalt nach oben geschoben wird, weil der Cursor
unten angestoßen ist. Durch Drücken von 'Pfeil nach links' wird weitergedruckt.)
GET kann jeden Code holen, der durch die Tastatur erzeugt werden kann, also
auch die Codes der Funktionstasten. Ist der Puffer leer, wird an die String-
variable der leere String übergeben.
Falls man auf eine Eingabe des Anwenders warten will, kann dies demnach durch
folgende Abfrage geschehen:
GET aus dem Tastaturpuffer
10 GET G$ : IF G$ = "" GOTO 10
20 REM VERARBEITUNG VON G$
Das Programm läuft dann solange in 10, bis eine Taste gedrückt wurde.
Auch der umgekehrte Fall kann eintreten, daß man nämlich wissen will, ob irgend
wann seit dem letzten GET eine Taste gedrückt wurde, um z.B. das Programm anzu
halten:
10 REM BELIEBIGE OPERATION 90 GET G$ : IF G$ = "" GOTO 10 : REM OPERATION WEITERMACHEN
95 REM ABBRUCHTASTE(N) BEHANDELN
In jedem Fall können Sie durch Abfragen jeden beliebigen Code herausfiltern, um
ihn dann z.B. auf den Bildschirm zu drucken oder aber, um gerade diesen Code
nicht zu drucken.
Zahlenvariable
Grundsätzlich kann hinter GET auch eine Zahlenvariable angegeben werden. Da
aber dann bei den meisten Tasten eigenartige Fehlermeldungen erscheinen, emp
fehlen wir, GET nur mit Stringvariablen zu verwenden. Die Reaktionen bei GET
(aus Tastaturpuffer) und Zahlenvariable sind im einzelnen:
Erlaubt sind alle Ziffern, '+', '-' und '.', Blank und 'E' (ohne SHIFT).
Bei der leeren Eingabe (kein Zeichen im Puffer), sowie bei '.', '+', '-', Blank
und 'E' wird 0 an die Variable übergeben, bei den anderen 9 Ziffern der ent
sprechende Zahlenwert.
92
Bei Komma und Doppelpunkt wird EXTRA IGNORED gemeldet und bei allen anderen nichterlaubten Tasten SYNTAX ERROR. Diese Meldungen erfolgen ohne Angabe der Zeilennummer!
Durch dieses Verhalten ist der große Vorteil des GET, nämlich seine Kontrollier­barkeit durch das BASIC-Programm weg.
5.8.2 GET§ aus Dateien
GET§ holt Byte für Byte aus einer Datei. Gegenüber INPUT§ bietet GET§ den Vor teil, keinerlei Trennzeichen zu benötigen. Deshalb kann GET jeden der 256 Codes lesen, den PRINT§ erzeugen kann. Der Code 0 kann allerdings nur über einen Umweg gelesen werden:
CHR$(0)
Anstatt des Codes 0 übergibt GET§ an die Stringvariable den leeren String. Da aber in einer Datei das leere Zeichen nicht Vorkommen kann, kann durch folgende Abfrage der Code 0 eindeutig rekonstruiert werden:
10 GET§1,G$ : IF G$ = "" THEN G$ = CHR$(0)
Status
Wie bei Status beschrieben ist ST 0 solange noch weitere Zeichen in der Datei stehen, geht mit dem letzten Zeichen auf 64 und dann auf 2, falls noch weiter gelesen wird.
Sobald ST 2 enthält, wird an die Stringvariable bei jedem GET§ CHR$(13), also CR übergeben!
5.8.3 GET§ aus dem Bildschirm
Durch OPEN 3,3 und GET §3,G$ kann ab einer bestimmten Stelle Zeichen für Zeichen aus dem Bildschirm gelesen werden.
Revers-Zeichen, die nicht durch Anführungszeichen eingeschlossen sind, werden dabei in die entsprechenden Normal-Zeichen gewandelt. Ansonsten wird der Bild schirminhalt völlig identisch in die Stringvariable abgebildet.
Gelesen wird ab der nächsten Druckposition. Durch Cursorbewegungen kann also
bestimmt werden, ab wo gelesen werden soll.
Da GET Spalte für Spalte überträgt, ohne sich um den Inhalt zu kümmern, wird
auch SPACE übertragen.
5.8.4 GET§ von der Tastatur
Der Vollständigkeit halber sei erwähnt, daß GET§ auf das Gerät Nr. 0 (Tastatur) identische Wirkung zeigt mit GET.
93
5.9 Status (Zustand von Peripheriegeräten / Dateien)
Die Variable ST (Status) enthält Information über den Zustand der Datei. Er wird
bei jedem E/A-Befehl neu in ST übertragen. ST stellt daher eigentlich eine
Funktion in Gestalt einer Variable dar.
Die Bedeutung der 8 Bits des Status, sowie ihr Dezimalwert sind in der folgenden Tabelle zusammengefaßt:
Bit
0
1 2 Zeitüberschr. b. Lesen
2 4
3 8
4
Dezimal
1 Zeitüberschr. b. Schreiben
IEC-Bus
Rekorder
-
-
-
zu kurzer Block
- zu langer Block
16 - nicht korrigierbarer
Lesefehler
5 32
6 64
7 -128
-
Dateiende (EOI)
Prüfsummenfehler
Dateiende (EOF)
DEVICE NOT PRESENT Bandende (EOT)
Die wichtigste Statusmeldung ist 'Dateiende' (EOI/EOF). Ehe sie aber ausführ lich erklärt wird, sollen noch kurz die anderen Meldungen vorgestellt werden.
Beim Band bedeuten die Bits 2,3,4,5 einfach Lesefehler, die durch schlechtes Band oder schlechte Kopfjustierung zustande kommen.
Wenn Bit 7 gesetzt ist, wird entweder FILE NOT FOUND (Band) oder DEVICE NOT PRESENT ERROR (IEC-Bus) gemeldet.
FILE NOT FOUND = Datei wurde nicht gefunden DEVICE NOT PRESENT = Gerät ist nicht vorhanden
5.9.1 Dateiende
In manchen Fällen wissen Sie nicht, wieviele Daten eine Datei enthält, wie oft Sie also mit INPUT oder GET lesen müssen, um alle Daten zu holen. Sie müssen dann mit Hilfe des Status feststellen, wann die Datei zu Ende ist.
Merken Sie sich dazu die Regel, daß der Status dann den Wert 64 enthält, wenn das letzte Byte der Datei gelesen wurde. Versuchen Sie dann noch weiterzulesen, wird Bit 1 (Wert 2) des Status gesetzt und vom Betriebssystem CR (Carriage
Return) geschickt.
94
Sehen Sie sich dazu folgendes Beispiel an:
10 OPEN 2,8,2,"0 :BSP1,W"
20 PRINT§2,1
25 PRINT§2,2
30 CLOSE 2 110 OPEN2,8,2,"0:BSP1,R" 120 GET§2,G$:EN=ST 130 PRINT ST,ASC(G$),G$ 140 IF EN= 0 GOTO 120 150 CLOSE 2 210 OPEN2,8,2,"0:BSP1,R" 220 INPUT § 2,G$:EN= S T 230 PRINT ST,G$
240 IF EN= 0 GOTO 220 250 CLOSE 2
In Zeile 10 wird eine Floppy-Datei zum Schreiben geöffnet. Die Zeilen 20 und 25
schreiben die Zahlen 1 und 2 in die Datei, die dann in 30 geschlossen wird.
In den Zeilen 110-150 wird die Datei mit GET gelesen und für jedes Zeichen der Status, der ASC-Code des Zeichens und das Zeichen selbst auf den Bildschirm
gedruckt.
In den Zeilen 210-250 wird die Datei mit INPUT gelesen und für jede Zahl der
Status und die Zahl auf den Bildschirm gedruckt.
Der Ausdruck sieht folgendermaßen aus (wir haben zusätzlich die Zeilen num meriert):
Zeile
1 0 2 0 49 3 4
5 6 0 7 8
9 10
In Zeile Datei auf 64 gesetzt wird. Zeile 10 zeigt, daß bei INPUT der Status mit der letzten Zahl auf 64 geht.
Status ASC
32
0 0 13 CR
0
0 64 13 CR
0 64
8 sehen Sie, daß
32
32 50 32 Blank
Zeichen
Blank 1 Blank
Blank 2
1
2
der Status
95
Daraus läßt sich folgendes 'Kochrezept' ableiten:
(1) Unmittelbar nach dem Lesen eines Datums weisen Sie den Wert von ST an eine andere Variable zu. Dies ist immer dann erforderlich, wenn vor der Abfrage dieses Wertes eine E/A-Operation kommt, also z.B. ein PRINT auf den Bildschirm, da der Status durch jede E/A-Operation neu gesetzt wird!
(2) Danach verarbeiten Sie das eben geholte Zeichen (GET), bzw. die Zahl oder den String (INPUT).
(3) Ehe Sie das nächstemal GET oder INPUT rufen, fragen Sie den gemerkten Sta
tus-Wert ab. Wenn er 0 ist, können Sie weitermachen, ansonsten ist die Datei zu Ende.
5.9.2 Zeitüberschreitung
Um zu verhindern, daß der Rechner sich an einem langsamen IEC-Bus-Teilnehmer 'aufhängt', bricht das Betriebssystem nach 65 ms den E/A-Versuch ab. Der Ab bruch wird dann im Status vermerkt, indem Bit 0 (PRINT) oder 1 (INPUT, GET) gesetzt wird.
Wünschen Sie nicht, daß das Betriebssystem abbricht, können Sie durch
POKE 1020, 128
erreichen, daß solange gewartet wird, bis sich das Peripheriegerät meldet. Meldet sich das Gerät allerdings nicht, kann nur von Hand durch die STOP-Taste unterbrochen werden, vom Programm aus besteht keine Möglichkeit dazu!
Bei Commodore-Geräten kann die Zeitüberschreitung nur im Fehlerfall auf treten. Wir wollen zwei typische Fehlersituationen schildern:
5.9.3 Gerät nicht angeschlossen
Das angesprochene Gerät ist nicht eingeschaltet oder gar nicht angeschlossen. Falls ein anderes Gerät angeschlossen und eingeschaltet ist, wird nicht DEVICE NOT PRESENT ERROR gemeldet.
Vielmehr treten bei INPUT und PRINT zwei verschiedene Zustände im Status auf: INPUT bzw. GET bewirkt die Meldung 'Zeitüberschreitung beim Lesen' (Status enthält den Wert 2) und das Betriebssystem schickt bei jedem INPUT bzw. GET ein CR (s. o.)
Bei PRINT wird dagegen Bit 7 im Status (Wert -128) gesetzt, was tatsächlich DEVICE NOT PRESENT bedeutet.
5.9.4 Floppy-Datei geschlossen
Durch Programmier- oder Bedienungsfehler, die im Floppy-Handbuch beschrieben sind, kann es Vorkommen, daß eine Floppy-Datei geschlossen ist, obwohl die zu geordnete logische Datei des Rechners offen ist.
In diesem Fall meldet der Status bei INPUT und GET wie oben den Wert 2. Bei PRINT dagegen wird der Wert -127 gemeldet, was bedeutet, daß Bit 0 und Bit 7 gesetzt sind. Der Status meldet also 'Zeitüberschreitung beim Schreiben', was richtig ist und gleichzeitig DEVICE NOT PRESENT, was falsch ist.
96
5.9.5 Abfrage des Status-Wertes
Sie haben gesehen, daß der Status-Wert nicht als eine Zahl, sondern als 8 Bits
zu interpretieren ist. Wollen Sie prüfen, ob der Status den Wert 64 enthält, ob
also Bit 6 gesetzt ist, ist das nicht gleichbedeutend damit, daß Sie fragen, ob der Status gleich 64 ist:
IF 64 AND ST THEN richtig IF ST = 64 THEN falsch
Am Beispiel -127 können Sie sehen, daß die Abfrage mit '=' schief geht:
IF -128 AND ST OR 1 AND ST THEN ...
Diese Abfrage prüft, ob Bit 0 oder Bit 7 gesetzt ist!
Wenn es Ihnen jetzt zu kompliziert geworden ist, lesen Sie vielleicht noch folgendes Rezept:
Von Spezialfällen und Spezialgeräten abgesehen, kann man die Statusabfrage folgendermaßen aufbauen:
Unmittelbar nach INPUT oder GET fragen Sie ab, ob der Status ungleich 0 ist und wenn ja, springen Sie zur Statusbehandlung. Ist er nicht 0, kommen Sie in die normale Datenbehandlung.
In der Statusbehandlung stellen Sie fest, ob 'Dateiende' aufgetreten ist und setzen in diesem Fall den Endeschalter EN auf ungleich 0.
Wenn nicht, laufen Sie in die Fehlerbehandlung, die hier nur angedeutet ist.
10 INPUT§LA,IN$ : IF ST GOTO 100 20 REM DATENBEHANDLUNG
50 IF EN = 0 GOTO 10
60 CLOSE LA : REM ENDE DER DATEIBEHANDLUNG
100 IF ST AND 64 THEN EN = 64 : GOTO 20 110 ?"FEHLER" : STOP
97
6. Sprunganweisungen
6.1 Einführung
Das BASIC-Programm wird normalerweise Zeile für Zeile abgearbeitet. Sehr oft braucht man aber Anweisungen, die den Programmablauf ändern, indem zu anderen Zeilen als zur nächsten 'gesprungen' wird. Wir unterscheiden solche Sprünge, die in jedem Fall ausgeführt werden (unbedingte Sprünge) und solche, die ab hängig von Bedingungen ausgeführt werden (bedingte Sprünge). Eine andere Unter scheidung kann danach gemacht werden, ob nach einem Sprung das Programm ein 'Unterprogramm' ausführt und danach an der Stelle weitermacht, von wo aus in das Unterprogramm gesprungen wurde, oder ob einfach an eine andere Stelle ge sprungen wird, ohne daß das Programm wieder an die alte Stelle zurückkehrt.
Der einfache unbedingte Sprung wird von GOTO ausgeführt, der Aufruf eines Unter programms von GOSUB.
Beide Befehle gibt es auch in bedingter Form als 'Sprungverteiler' (ON ..).
Schließlich existiert natürlich die wichtigste Form der Entscheidung, nämlich
die 'Wenn, dann .... ,sonst ...' (IF ... THEN ...).
Zwei Befehle, die ein Programm beenden bzw. unterbrechen werden auch unter dieser Überschrift behandelt, da sie einen Sprung aus dem BASIC-Programm zurück
zum Direktmodus (Kommandomodus) darstellen (END, STOP).
Weil sie sonst ganz alleine dastehen würde, wurde die REM-Anweisung auch als
Sprunganweisung angesehen, da sie eine Bemerkung überspringt.
Ehe Sie die folgenden Befehlsbeschreibungen lesen, erinnern Sie sich bitte daran, daß BASIC-Zeilennummern nur als Konstante existieren können und daß
in einer BASIC-Zeile mehrere Anweisungen durch Doppelpunkt getrennt stehen
können.
Hinweis für Fortgeschrittene
Wir wollen kurz erklären, wie intern ein Sprungbefehl behandelt wird, weil sich daraus Regeln für die Anordnung von Sprüngen ableiten lassen, um möglichst kurze Ausführungszeiten zu erhalten.
Die einzelnen BASIC-Zeilen sind durch sogenannte Vorwärtszeiger miteinander verknüpft. D.h. am Anfang jeder Zeile steht für den Interpreter in zwei Bytes die Information, wo die nächste BASIC-Zeile beginnt. Dadurch muß bei Sprüngen nicht die ganze Information aller übersprungenen Zeilen gelesen werden, sondern der Interpreter 'hangelt' sich bei Sprüngen über die Vorwärtszeiger von Zeilen anfang zu Zeilenanfang, bis er die richtige Zeile gefunden hat.
Nun 'weiß' der Interpreter aber, ob die Zielzeile eine kleinere oder größere Zeilennummer hat, als die Zeile, in der er gerade die Sprunganweisung gefunden hat. Wenn er zu einer Zeile springen muß, die weiter hinten steht (größere Zeilennummer), so sucht er diese Zeile ab seiner jetzigen Position. Muß er dagegen nach vorne springen, so sucht er sofort ab dem Programmanfang.
Zeilen werden also am schnellsten gefunden, wenn sie möglichst weit vorne stehen und zwar unabhängig von der Zeile, von der aus gesprungen wird - oder wenn sie möglichst knapp hinter der aufrufenden Zeile stehen.
98
Loading...