Info
Sammeln
Dokumentation
Anleitungen
Schnittstellen
Prozessoren
Videochips
Soundchips
Computer
Videospiele


Commodore Basic V2 (C-64, VC-20, PET), Teil 3
6. Ein- / Ausgabe


6.1 Textausgabe auf dem Bildschirm


PRINT

PRINT [<Ausdruck>[;|,[<Ausdruck>]][...]]


Der PRINT-Befehl ermöglicht die Ausgabe beliebiger Informationen auf den Bildschirm Als <Ausdruck> können Sie entweder Strings, Stringvariablen oder numerische Ausdrücke angeben, wobei letztere vor der Ausgabe ausgerechnet werden. Werden zwei Ausdrücke durch Semikolon getrennt, hängt sie der Printbefehl direkt aneinander. Ein Komma als Trennzeichen fügt Leerzeichen bis zur nächsten 10er-Position am Bildschirm ein, arbeitet also als Tabulator. Komma oder Semikolon können auch am Ende des Printbefehls stehen, sie wirken sich darauf aus, wie die Ausgabe des nächsten Printbefehls angefügt wird.

Ein PRINT-Befehl alleine bewirkt einen Zeilenvorschub, d.h. der darauf folgende PRINT-Befehl beginnt mit der Ausgabe eine Zeile tiefer.


Eine Besonderheit in allen Commodore-Basicdialekten sind inverse Steuerzeichen in PRINT-Befehlen. Damit können alle Steuerfunktionen, die über die Tastatur erreichbar sind (Bildschirm löschen, Homeposition anspringen, Pfeiltasten, Farbwahl) auch in PRINT-Befehlen eingebaut werden. Das Verfahren ist denkbar einfach: Sobald Sie ein Anführungszeichen eingeben, wechselt der Editor in einen Spezialmodus, in dem die genannten Tastaturkommandos nicht mehr ausgeführt werden, sondern als Steuerzeichen am Bildschirm erscheinen.

PRINT "*"

Geben Sie im obigen Beispiel anstelle des Sternchens die CLR-Taste ein. Statt den Bildschirm zu löschen, erscheint ein inverses Herz auf dem Bildschirm. Bei der Ausführung des PRINT-Befehls wird der Bildschirm dann gelöscht.


Es gibt noch einige weitere Möglichkeiten, die den PRINT-Befehl noch universeller machen:


TAB


Die Funktion TAB ermöglicht eine tabularische Ausgabe, indem sie die nächste horizontale Ausgabeposition auf die als Argument angegebene Spaltennummer setzt. Natürlich kann das nur funktionieren, wenn die nächste Ausgabeposition vor dem Aufruf von TAB noch links der angegebenen Spalte gewesen wäre.

100 PRINT "NAME";TAB(8);"PUNKTE"
110 PRINT "KLAUS";TAB(8);"15"
120 PRINT "SANDRA";TAB(8);"18"
130 PRINT "PAUL";TAB(8);"9"
140 PRINT "MARGARETHE";TAB(8);"10"


Das Beispielprogramm produziert folgende Ausgabe:

NAME    PUNKTE
KLAUS   15
SANDRA  18
PAUL    9
MARGARETHE10


Die letzte Zeile zeigt, daß durch den langen Namen die Punktzahl bei Margarethe nicht mehr auf die Tabulatorposition 8 geschrieben werden kann.


SPC


Die SPC-Funktion fügt in der Printanweisung die angegebene Anzahl Leerzeichen ein:

100 PRINT " ----------------------------"
110 FOR I=1 TO 18
120 PRINT "|";SPC(28);"|"
130 NEXT I
140 PRINT " ----------------------------"


Dieses Beispiel zeichnet einen 30 Zeichen breiten und 20 Zeichen hohen Rahmen.


POS

POS(0)


Die Funktion POS liefert die Spaltenposition, an der die nächste Ausgabe mit PRINT beginnen würde. Das Argument der POS-Funktion ist ohne Bedeutung und wird normalerweise auf 0 gesetzt.


6.2 Eingaben über die Tastatur


INPUT

INPUT ["<Ausgabetext>";]<Variablenname>[,<Variablenname>][...]


Falls angegeben, schreibt der INPUT-Befehl zuerst den Ausgabetext auf den Bildschirm, gefolgt von einem Fragezeichen und dem Eingabecursor. Ohne Ausgabetext produziert INPUT nur ein Fragezeichen und den Cursor. Der Programmbenutzer muß nun die Werte für die angegebenen Variablen in der richtigen Reihenfolge eingeben.

Es ist eine gute Idee, mit jedem INPUT-Befehl nur eine Variable eingeben zu lassen. Das reduziert die Fehleranfälligkeit und gibt Ihnen die Möglichkeit, die Plausibilität jeder einzelnen Eingabe zu prüfen bevor die nächste erfolgt.


GET

GET <Stringvariable>


GET prüft, ob über die Tastatur ein Zeichen eingegeben wurde. Wenn ja, enthält die angegebene Stringvariable dieses Zeichen, andernfalls einen Leerstring. Im Gegensatz zum INPUT-Befehl wartet GET nicht auf eine Tastatureingabe.

Mit GET können Sie auf auf Tastendrücke prüfen, denen kein Bildschirmzeichen zugeordnet ist - die Pfeiltasten z.B. oder ESC, DEL und die Eingabetaste. Die Abfrage erfolgt dann über den ASCII-Code:

100 GET A$
110 IF A$<>CHR$(13) THEN 100


Dieses Miniaturprogramm bewegt sich in einer Endlosschleife - Solange bis jemand die Eingabetaste (ASCII-Code 13) betätigt. Das folgende Programm wartet auf Tastendrücke und zeigt die gedrückte Taste und ihren ASCII-Code:

100 GET A$
110 IF A$="" THEN 100
120 PRINT A$; " = "; ASC( A$ )
130 GOTO 100

Die Zeile 110 verhindert, daß die ASC() Funktion mit einer leeren Variable aufgerufen wird, was nämlich eine Fehlermeldung verursachen würde.

6.3 Ansteuerung von Peripheriegeräten


Abgesehen von den bekannten Befehlen zum Laden und Sichern vor Programmen basiert die Kommunikation mit Peripheriegeräten vor allem darauf, daß die zur Ein-/Ausgabe schon bekannten Befehle PRINT, INPUT und GET auf andere Kanäle als Bildschirm oder Tastatur umgelenkt werden. Dazu muß ein Kanal bzw. ein File geöffnet werden. Das bedeutet, daß der Computer eine Anweisung erhält, wohin er Ausgaben schicken oder von wo er Eingaben empfangen soll. Ist die Operation abgeschlossen, wird der Kanal wieder geschlossen.


OPEN

OPEN <Kanalnummer>,<Gerätenummer>[,<Sekundäradresse>][,<Dateiname>]

Öffnet einen Kanal auf einem bestimmten Gerät. Die Kanalnummer dient nur zur Kennzeichnung eines geöffneten Kanals und kann im Prinzip jeden Wert zwischen 1 und 127 haben. Die Gerätenummer bestimmt das angesprochene Gerät. Dabei können nicht nur "externe", sondern auch "interne" Kanäle festgelegt werden. Die Gerätenummern sind:

0 Tastatur
1 Datenrecorder
2 RS-232-Schnittstelle
3 Bildschirm
4-5 Drucker
8-15 Diskettenlaufwerk

Ob dem OPEN-Befehl eine Sekundäradresse mitgegeben wird, hängt vom Gerät ab. Für Drucker und Laufwerk übermittelt die Sekundäradresse eine zusätzliche Information. Ein Dateiname ist nur bei Speichergeräten (Datasette, Floppy) notwendig.


CLOSE

CLOSE <Kanalnummer>


Schließt einen mit OPEN geöffneten Kanal.


PRINT#

PRINT#<Kanalnummer>, <Argumentliste>


PRINT# funktioniert genau wie der normale PRINT-Befehl, die Ausgabe erfolgt aber auf den angegebenen Kanal. Ebenso wie beim normalen PRINT schickt der Befehl dem Ausdruck ein ASCII-13 ("carriage return") hinterher, was den Beginn einer neuen Zeile bedeutet, außer der Befehl wird mit einem Semikolon abgeschlossen. Das folgende Beispiel leitet die Ausgabe auf einen Drucker um:

100 OPEN 1,4
110 PRINT#1, "DIESER TEXT ERSCHEINT AUF DEM DRUCKER"
120 CLOSE 1

Bei dem Diskettenlaufwerk ist die Sache eine Spur komplizierter, da ja nicht auf Geratewohl irgendwohin auf die Disk geschrieben werden kann. Mehr dazu im übernächsten Kapitel.


Um Ausgaben des Direktmodus und vor allem Programmlistings auszudrucken, können Sie mit dem CMD-Befehl eine Umleitung der Standardausgabe erreichen:


CMD

CMD <Kanalnummer>


Der CMD-Befehl leitet die Standardausgabe, die normalerweise auf dem Bildschirm landet, in den Ausgabekanal um, der der Dateinummer entspricht. Die Umleitung bleibt erhalten, bis Sie mit PRINT# direkt in den Ausgabekanal schreiben und den Kanal dann mit CLOSE schließen:

OPEN 1,4
CMD 1
LIST
PRINT#1
CLOSE 1


Das obige Beispiel erzeugt ein Listing des im Arbeitsspeicher befindlichen Programms auf dem Drucker.

INPUT#

INPUT#<Kanalnummer>, <Variablenliste>


INPUT# entspricht dem INPUT-Befehl, die Daten werden allerdings aus dem angegebenen Kanal gelesen.


GET#

GET#<Kanalnummer>, <Stringvariable>


GET# liest aus dem angegebenen Kanal ein einzelnes Zeichen. Zu beachten ist unter Umständen, daß ein ASCII-Null als Leerstring empfangen wird.


7. Fortgeschrittene Programmierung


7.1 Manipulation von Speicherstellen


Die meisten Basicdialekte ermöglichen die Manipulation beliebiger Speicherstellen des Arbeitsspeichers. So auch das Basic V2. Während das Auslesen des Speicherinhalts noch recht ungefährlich ist, müssen Sie bei der Veränderung schon sehr genau wissen, was Sie tun.


POKE

POKE <Adresse>,<Wert>


POKE schreibt an der angegebenen Adresse den Wert (1 Byte) in den Arbeitsspeicher. Die Adresse muß im Bereich von 0 bis 65535, der Wert im Bereich 0 bis 255 liegen.


PEEK

PEEK( <Adresse> )


Die Funktion PEEK liefert den Inhalt der angegebenen Speicherstelle.


WAIT

WAIT <Adresse>,<Wert1>[,<Wert2>]


WAIT wartet solange, wie der Speicherinhalt der angegebenen Adresse, exklusiv-oder-verknüpft mit Wert2 (falls vorhanden) und und-verknüpft mit Wert 1 gleich Null ist.

WAIT 198,1

Das hält z.B. beim C64 das Programm an, bis eine Taste gedrückt wurde.


7.2 Einbindung von Maschinensprache


Programme in Maschinensprache arbeiten in der Regel um ein Vielfaches schneller als Basic. Kein Wunder, der Basic-Interpreter tut ja nichts anderes, als Basic in Maschinensprache zu übersetzen. Der Nachteil: Maschinensprache ist fast immer sehr gerätespezifisch. Der große Vorteil von Basic, im Prinzip von einem Computer auf einen anderen übertragbar zu sein, hört sich damit auf.


SYS

SYS <Adresse>


SYS ruft ein Maschinenspracheprogramm ab der angegebenen Adresse auf.


In Ihrem Computer sind bereits eine Menge nützlicher Maschinensprachroutinen fest gespeichert, die von Basic aus aufgerufen werden können. Näheres dazu erfahren Sie aber nur in einem guten, zu Ihrer Maschine passenden Programmierhandbuch. Ferner können eigene Maschinenspracheprogramme in Form von DATA-Zeilen in Basic gespeichert, an einer bestimmten Adresse abgelegt und dort aufgerufen werden. Das folgende Beispiel ist ein Mix aus beiden Methoden. Es funktioniert allerdings nur am C64. Für andere Computer müßte die DATA-Zeile anders aussehen.

100 DATA 32,230,225,76,12,229
110 CR=680
120 FOR I=0 TO 5
130 READ P
140 POKE CR+I,P
150 NEXT I
200 Z=15
210 S=20
220 SYS CR,Z,S
230 PRINT "HALLO WORLD"

Die DATA-Zeilen enthalten einen kurzen Maschinensprachecode, der zwei im Betriebssystem des C64 vorhandene Routinen miteinander verknüpft. Der Code wird mit READ gelesen, mit POKE an eine freie Stelle des Speiches geschrieben und mit SYS aufgerufen. Das Resultat besteht darin, daß Sie nun jederzeit ohne großen Aufwand mit SYS CR, Z, S der Cursor nach Zeile Z und Spalte S setzen können, was in Basic sonst nicht so ohne weiteres möglich wäre.


USR

USR( <Parameter> )


Die USR-Funktion ist eine benutzerdefinierbare Maschinensprachefunktion. Um sie aufrufen zu können, müssen Sie zuerst festlegen, ab welcher Position im Arbeitsspeicher das aufzurufende Maschinenprogramm abgelegt ist. Der Parameter kann dann vom Maschinenprogramm ausgewertet werden.


7.3 Programmoptimierung


Basicprogramme können in Hinblick auf ihre Übersichtlichkeit, ihr Tempo und ihren Speicherbedarf optimiert werden. Leider ist es so, daß sich diese Ziele untereinander ziemlich ausschließen. Es kommt also auf die Prioritäten an.

Um die Übersichtlichkeit eines Programms zu erhöhen, sollten reichlich graphische Hervorhebungen und REM-Zeilen verwendet werden. Ferner gibt es den Trick mit dem Doppelpunkt: während im normalen Listing genau ein Leerzeichen zwischen Zeilennummer und Befehl vorgesehen ist, lassen sich mit dem Doppelpunkt beliebig viele Leerzeichen erzwingen. Das erlaubt das Einrücken von Zeilen. Bedingte Verzweigungen und Schleifen lassen sich dadurch viel übersichtlicher darstellen. Den Programmablauf stört das nicht.


100 REM "*****************************
110 REM "*** ASCII-ZEICHEN AUF BS ****
120 REM "*****************************
130 FOR I=0 TO 128 STEP 128
140 : FOR J=32 TO 124 STEP 4
150 :   FOR K=0 TO 3
160 :     PRINT I+J+K; ":"; CHR$( I+J+K ); " ";
170 :   NEXT K
180 :   PRINT
190 : NEXT J
200 NEXT I


Allerdings braucht dieselbe Routine wie folgt programmiert 70% weniger Speicherplatz und ist um 15/60 Sekunden schneller. Auch hier wird der Doppelpunkt verwendet, allerdings um Befehle in einer Zeile aneinanderzureihen. Keine Frage, daß die Übersichtlichkeit darunter leidet.

100 FORI=0TO128STEP128:FORJ=32TO124STEP4:FORK=0TO3:PRINTI+J+K":"CHR$(I+J+K)" ";
110 NEXT:PRINT:NEXTJ:NEXTI


Um rechenintensive Programme zu beschleunigen, sollten die am häufigsten verwendeten Variablen als erstes definiert werden, indem man sie am Programmanfang 0-setzt. Das erscheint überflüssig, da beim Programmstart mit RUN alle Variablen 0 enthalten. Allerdings legt der Basic-Interpreter während des Laufs eine Liste der verwendeten Variablen an, und die Variablen, die am Anfang der Liste stehen, haben eine kürzere Zugriffszeit. Das können Sie leicht selbst ausprobieren:

100 TI$="000000"
110 FOR I=1 to 20
120 FOR J=1 to 20
130 FOR K=1 to 20
140 NEXT K
150 NEXT J
160 NEXT I
170 PRINT TI


Das Programm, das bloß drei verschachtelte Schleifen abarbeitet, wird um 5% schneller, wenn Sie die Zeile
105 K=0 einfügen. Warum? K wird für die innerste Schleife viel häufiger gebraucht als J oder I. Bei Programmen mit sehr vielen Variablen fällt dieser Effekt stärker ins Gewicht.

Oft verwendete Nummern- oder Stringkonstante sollten möglichst in Variablen vordefiniert werden, da der Zugriff schneller ist als auf Werte, die direkt im Programm stehen. Ein Beispiel:

100 TI$="000000"
110 FOR I=1 TO 1000
120 IF I=500 THEN PRINT "HALLO"
130 NEXT
140 PRINT TI

Die folgende Variante, die in der Schleife Variable verwendet, spart ca. 40% Laufzeit ein:

100 TI$="000000"
105 I=0: N=500: A$="HALLO"
110 FOR I=1 TO 1000
120 IF I=N THEN PRINT A$
130 NEXT
140 PRINT TI


Niedere Zeilennummern werden vom Basic-Interpreter rascher gefunden. Besonders bei kurzen und häufig verwendeten Subroutinen kann es Zeit und Speicherplatz sparen, wenn die Subroutinen, entgegen der Gepflogenheit, nicht am Ende, sondern ganz vorne angelegt werden. Das Programm beginnt dann mit einem Sprung zum Hauptprogramm, und an den niedrigen Zeilennummern liegen viele kleine nützliche Subroutinen. Einen effektiven Gewinn bringt das aber nur bei wirklich langen Programmen.


8. Arbeiten mit dem Diskettenlaufwerk


8.1 Inhaltsverzeichnis einer Diskette


DIRECTORY

LOAD "$[<Laufwerk>]",<Gerätenummer>


Jede auf Commodore-Laufwerken formatierte Diskette verfügt über ein Inhaltsverzeichnis oder "Directory". In den Computer geladen wird es ebenso wie ein Programm. Achtung: ein eventuell bereits im Speicher befindliches Programm wird dabei überschrieben!

Das Zeichen $ im Filenamen weist die Floppy an, das Inhaltsverzeichnis in Form eines Pseudo-Basic-Programms an den Computer zu übermitteln. Das Programm ist zwar nicht lauffähig, aber es kann gelistet werden.

LOAD "$",8
LIST


Angezeigt wird der Diskettenname, die ID, eine Liste der gespeicherten Files, und am Schluß die Anzahl der freien Datenblöcke.


8.2 Disk- und Filemanagement


Die Floppy ist ein "intelligentes" Peripheriegerät, mit eigenem Prozessor, Speicher und Betriebssystem, das Befehle versteht und selbstständig ausführt. Der eigentliche Floppy-Befehl hat die Syntax:
<Befehl>[:<weitere Angaben>]

Zum Beispiel:

SCRATCH:TESTFILE

bewirkt das "scratchen" = Löschen eines Files namens "TESTFILE" auf der Diskette. In der Praxis wird der Befehl eigentlich immer mit dem Anfangsbuchstaben abgekürzt, da er von der Floppy nur anhand dessen erkannt wird, also z.B.:

S:TESTFILE

Bei Doppellaufwerken muß nach dem Befehl die Laufwerksnummer 0 oder 1 angegeben werden, bei Einzellaufwerken ist die Angabe der 0 optional, z.B:

SØ:TESTFILE

Bei den zusätzlichen Angaben im Befehl können Jokerzeichen benutzt werden. Das Fragezeichen ersetzt beliebige Teile des Namens, z.B. würde der Befehl

S:TEST????

sowohl "TESTFILE" als auch ein File namens "TESTDEMO" löschen. Der Stern als Joker ersetzt alles, was dahinter kommt. Der Befehl

S:*

würde schlicht alle Files auf der Diskette löschen. Bei der Verwendung der Jokerzeichen ist also eine gewisse Vorsicht angebracht.

Wenn Sie nun versucht haben, die Befehle durch Eintippen gleich auszuprobieren, werden Sie vermutlich nur einen SYNTAX ERROR geerntet haben. Das liegt daran, daß Sie nicht per Tastatur direkt mit der Floppy kommunizieren können. Die Floppy-Befehle müssen zuerst am Computer in Basic-Befehle "verpackt" werden, die den Computer anweisen, den entsprechenden Befehl an die Floppy weiterzuleiten.


Um Befehle in Basic an die Floppy zu übermitteln, muß ein File geöffnet, der Befehl gesendet, und das File wieder geschlossen werden.

OPEN <Filenummer>,<Gerätenummer>,<Sekundäradresse>
PRINT#<Filenummer>,"<Befehl>"
CLOSE <Filenummer>


Wenn nur ein einziger Befehl gesendet werden soll, kann dies auch gemeinsam mit dem OPEN erfolgen:

OPEN <Filenummer>,<Gerätenummer>,<Sekundäradresse>,"<Befehl>"
CLOSE <Filenummer>

Die Filenummer (zwischen 1 und 127) dient lediglich dazu, verschiedene gleichzeitig offene Files auseinanderzuhalten. Die Gerätenummer ist hardwaremäßig durch das Laufwerk vorgegeben, in den meisten Fällen ist es die Nummer 8. Die Sekundäradresse ist beim Senden von Befehlen 15, das ist die Nummer des Kommando- und Fehlerkanals der Floppy.


NEW

Eine völlig neue Diskette muß vor dem ersten Gebrauch formatiert werden. Bei benutzten Disketten werden alle Dateien durch diesen Befehl unwiederbringlich gelöscht.

OPEN 1,8,15
PRINT#1,"N:<neuer Diskettenname>,<ID>"
CLOSE 1

Der Name darf bis zu 16 Zeichen lang sein, die durch ein Komma davon getrennte zweistellige ID (Buchstaben oder Zahlen) dient für die Floppy zur Identifizierung der eingelegten Disk.


INITIALIZE

Der Befehl veranlaßt die Floppy, die Belegung der eingelegten Disk zu lesen. Bei Verwendung von Disketten mit unterschiedlicher ID ist dieser Befehl in der Regel überflüssig, in keinem Fall aber richtet er Schaden an.

OPEN 1,8,15
PRINT#1,"I"
CLOSE 1



VALIDATE

Die Floppy verwaltet die Daten auf der Diskette anhand eines Belegungsplans "BAM" der freien und belegten Blöcke. Das geschieht an sich automatisch. Bei fehlerhaften bzw. abgebrochenen Vorgängen kann es jedoch nötig sein, diesen Belegungsplan neu zu erstellen. Dies geschieht durch den Befehl VALIDATE. Dabei ist jedoch Vorsicht angebracht: Disketten, die mit einem abweichenden DOS erstellt wurden, können dadurch unbrauchbar werden!

OPEN 1,8,15
PRINT#1,"V"
CLOSE 1



SCRATCH

Mit diesem Befehl können einzelne oder mehrere Files auf der Diskette gelöscht werden.

OPEN 1,8,15
PRINT#1,"S:<Filename>[,<Filename2>][...]"
CLOSE 1

Anmerkung: Wird versucht, ein Programm unter gleichem Namen erneut auf Disk zu speichern, gibt die Floppy eine Fehlermeldung aus. Das kann umgangen werden, indem beim Sichern dem Filenamen ein Klammeraffe mit Doppelpunkt vorangestellt wird.

SAVE:"@:<Programmname>",<Gerätenummer>

Der Klammeraffe mit Doppelpunkt vor dem Filenamen wird von der Floppy als Befehl interpretiert, das bestehende File ohne Fehlermeldung zu überschreiben, was das vorherige Löschen überflüssig macht - bzw. machen würde. Leider hat nämlich die VC-1541 einen Systemfehler, durch den beim Überschreiben die Gefahr von Datenverlust besteht. Bei diesem Laufwerk muß also dringend dazu geraten werden, vor dem Neuspeichern eines Programms den SCRATCH-Befehl zu verwenden, und das Programm dann ohne @: zu sichern.


RENAME

Mit diesem Befehl können Files auf der Diskette umbenannt werden.

OPEN 1,8,15
PRINT#1,"R:<neuer Filename>=<alter Filename>"
CLOSE 1



COPY

Der COPY-Befehl bewirkt, daß ein File innerhalb der Diskette kopiert wird. Das kopierte File muß einen neuen Namen erhalten.

OPEN 1,8,15
PRINT#1,"C:<Name Kopie>=<Name Original>"
CLOSE 1



8.3 Datenzugriff


Die Befehle zum Laden und Sichern von Programmen wurden bereits im Zusammenhang mit dem Befehlsmodus vorgestellt. Darüberhinaus gestatten Floppys einen sehr weitgehenden Zugriff. Von breitestem Nutzen ist dabei die Möglichkeit, in Basicprogrammen Daten auf Disk abzulegen und abzurufen. Die dafür vorgesehene Möglichkeit ist der Typ des sequentiellen Files mit der Kennzeichnung SEQ im Directory.

Das folgende Beispiel speichert eine Anzahl von N Daten aus einem Variablenfeld D() in einem sequentiellen File ab.

100 OPEN 1,8,15, "S:DATENFILE"
110 CLOSE 1
120 OPEN 2,8,2, "DATENFILE,S,W"
130 FOR I=1 TO N
140 PRINT#2, D(I)
150 NEXT I
160 CLOSE 2

Der Befehl in Zeile 100 löscht (S=Scratch) zunächst die alten Daten auf der Diskette - sofern dort welche waren - über den Floppy-Kommandokanal. Der Befehl in 120 veranlaßt die Floppy, ein neues sequentielles File (S=Sequentiell) zum Schreiben (W=Write) anzulegen. Die gewählte Sekundäradresse 2 ist insofern nicht ganz gelanglos, als die Nummern 0,1 und >=15 spezielle Bedeutung für die Floppy haben. Im Bereich 2-14 ist die Sekundäradresse beliebig. In Zeile 130-150 werden die Daten aus dem numerischen Feld in das Diskfile geschrieben. In 160 wird das File geschlossen, was von größer Wichtigkeit ist, da erst damit die Daten gesichert sind.


Die Daten können nun jederzeit wieder in den Computer eingelesen werden.

200 N=0
210 OPEN 2,8,2, "DATENFILE,S,R"
220 N=N+1
230 INPUT#2, D(N)
240 IF ST=0 THEN GOTO 220
250 CLOSE 2
260 PRINT N "DATEN GELESEN"

Da im ersten Beispiel vergessen wurde, die Anzahl der Daten mitzuspeichern, bedienen wir uns der Systemvariable ST, die den Wert 64 annimmt, wenn alle Daten eines Files gelesen wurden. Die Anzahl der Daten N wird zunächst 0 gesetzt. In Zeile 210 wird das sequentielle File (S=Sequentiell) namens "DATENFILE" zum Lesen (R=Read) geöffnet. Nun werden Daten in die Feldvariable D() eingelesen, bis das Fileende erreicht ist. Die Variable N enthält nun die Anzahl der gelesenen Daten. (Die Feldvariable muß natürlich vorher entsprechend dimensioniert werden.)


8.4 Fehlerkanal abfragen


Ein Laufwerksfehler wird durch ein blinkendes LED angezeigt. Die Floppy hat jedoch auch eine genaue Fehlerbeschreibung parat, die vom Computer abgerufen werden kann. Da der Basic-Befehl INPUT im Direktmodus nicht funktioniert, ist das nur in Form eines kleinen Programmes möglich, das als Einzeiler eingegeben werden kann.

10 OPEN 1,8,15: INPUT#1,A,B$,C,D: CLOSE 1: PRINT A,B$,C,D
RUN

Angezeigt wird nun die Fehlernummer, der Fehlertext, und gegebenenfalls Spur und Sektor des Fehlers.

Zu beachten ist bei der Eingabe dieses kleinen Programms natürlich, nicht in Konflikt mit einem bereits im Speicher befindlichen Programm zu kommen.

Übrigens sollte jedes Programm mit Diskettenzugriff die Abfrage des Fehlerkanals selbstverständlich beinhalten. Analog zur Beobachtung des blinkenden LEDs kann das Programm die Statusvariable ST abfragen. Bit 6 der Statusvariable zeigt an, daß das Fileende erreicht wurde, was keinen Fehler darstellt. Wenn die Bedingung
IF (ST AND 191) <>0 zutrifft, liegt ein Fehler vor, und das Programm sollte gleich zur Abfrage und Ausgabe des Floppy-Fehlerkanals verzweigen. Bereits vor dem Zugriff kann getestet werden, ob ein Gerät mit Gerätenummer DV eingeschaltet ist: OPEN 7,DV,7: CLOSE 7 liefert ein ST von -128 wenn das Gerät offline ist. So kann das Programm ohne Basic-Error mit einer entsprechenden Einschaltaufforderung reagieren.


9. Befehlsindex