BASIC-Kurs:"Von Adam und Eva" (Teil 7) --------------------------------------
Hallöchen da draußen ! Weiter gehts in unserem Basickurs. Nachdem wir nun auch
schon ein bißchen Musik machen können
mit unserem 64 er, wollen wir uns in diesem Monat einmal um die Dateiverwaltung
und die Programmierung der Floppy kümmern. Gleichzeitig lernen Sie dann auch
noch etwas über das Ansteuern eines
Druckers, da diese beiden Themen nämlich
sehr nahe beieinander liegen und die
Programmierung von BASIC aus sogar
( fast) gleich ist. Man braucht halt nur
noch ein paar Backgroundinformationen zu
den einzelnen Geräten. Begeben wir uns
nun also in die Außenwelt unseres C64 in
die Welt der Peripherie. . .
Beginnen wir mit der Floppy. Die Befehle
LOAD und SAVE brauche ich Ihnen ja
bestimmt nicht mehr zu erklären. Wenn
Sie die nicht kennen würden, würden Sie ja diesen Kurs gar nicht lesen können.
Zu LOAD bleibt nur zu sagen, daß es 2 Arten gibt, diesen Befehl zu benutzen:
Die eine Möglichkeit kennen Sie bestimmt. Nachdem Sie ein BASIC-Programm
mit dem Befehl SAVE" PROGRAMM",8 gespeichert hatten, konnten Sie es immer
wieder mit LOAD" PROGRAMM",8 in den
Basicspeicher Ihres 64 ers laden. Wie
ich schon im 5 . Teil dieses Kurses
erwähnte, ist das der Bereich von 2048 bis 40960 . Ein BASIC-Programm wird also
immer an die Adresse 2048 und folgende
geladen. Wenn Sie allerdings einmal ein
Maschinenprogramm haben, das an eine
andere Speicheradresse geladen werden
soll, so müssen Sie LOAD folgendermaßen
benutzen :
LOAD"PROGRAMM",8,1
Wir haben also an das ",8" noch ein ",1" angehängt. Dieser Appendix teilt LOAD
mit, daß nun an eine absolute Adresse geladen wird. Das heißt, an eine Adresse
die in dem File schon angegeben wird.
Dies kann von Nutzen sein, wenn wir zum
Beispiel Grafikdaten an eine bestimmte
Adresse im Speicher laden wollen. Ich
werde in dem diesem Kurs anschließenden
Grafikkurs hierauf noch einmal näher
eingehen.
Im übrigen gibt es auch noch einen weiteren Befehl, der mit LOAD nahe verwandt
ist. Ich spreche von dem VERIFY-Befehl.
Diesen benutzen Sie ebenso wie LOAD, nämlich:
VERIFY"PROGRAMM",8
Dieser ist nur in Verbindung von BASIC-Programmen sinnvoll, daher auch kein
",1" am Ende.
VERIFY macht nun nichts anderes als ein
Programm auf der Diskette mit dem sich
im Speicher befindlichen BASIC-Programm
zu vergleichen. Sie können hiermit also
prüfen, ob auf der Diskette eine andere Version des Programms vorliegt. Sollte
das der Fall sein, so meldet sich VERIFY
mit " VERIFY ERROR ?" zurück.
Andernfalls schreibt es einfach nur ein
" OK" auf den Bildschirm. Das Programm im
Speicher, ebenso wie das auf der Diskette, bleiben jedoch komplett erhalten.
Es wird somit also NICHTS an den Programmen verändert!
So. Nach diesem kleinen " Vorgeplänkel" wollen wir uns nun um die " seriösen" Anwendungen in BASIC zusammen mit der
Floppy kümmern. Es besteht nämlich auch
die Möglichkeit, Daten, wie zum Beispiel
Variablen, DIREKT in ein File zu schreiben und sie hieraus wieder auszulesen.
Dies ist sehr sinnvoll, wenn man eine
Anwendung schreiben möchte, die irgendwelche Werte zwischenspeichern soll, oder wenn Sie bei einem Spiel die Highscoreliste der Nachwelt erhalten möchten.
Damit wir dieses Problem jedoch richtig angehen können, muß ich erst etwas weiter ausholen und Sie einmal über die
Ein-/ Ausgabe in BASIC aufklären.
Alle Geräte, die an Ihrem 64 er hängen, haben, wie Sie vielleicht wissen, eigene
Gerätenummern. Die Floppy zum Beipsiel
die 8, wie man das am LOAD-Befehl sehen
kann. Das ",8" gibt ihm nämlich an, daß
er von der Floppy laden soll. Wollten
Sie von der Datasette laden ( heutzutage
nur noch von wenigen benutzt), so müßten
Sie dies mit einem ",1" kenntlich machen
( also LOAD" PROGRAMM",1) . Hier einmal eine Liste aller möglichen Gerätenummern:
Nummer Gerät
0 Tastatur 1 Datasette 2 RS232 - Serielle Schnittstele am User- Port für Datenfernübertragung (DFÜ) 3 Bildschirm 4 Drucker 1 5 Drucker 2 (am Drucker selbst einstell- bar) 8 Diskettenlaufwerk 0 (normal) 9,10,11 Weitere Diskettenlaufwerke
Der C64 ist nun so ausgelegt, daß man
ihm zuerst einmal sagen muß, mit welchem
der oben erwähnten Geräte man arbeiten
möchte. Dies geschieht in BASIC mit dem
OPEN-Befehl. OPEN ist englisch und heißt
" Öffne" . Es heißt nämlich auch, man
" öffnet" einen sogenannten Filekanal für
ein Gerät.
Damit man nun mit mehreren Geräten
gleichzeitig arbeiten kann, ohne hierbei
jedesmal den Kanal wieder neu öffnen zu
müssen, kann man jeden Filekanal mit einer eigenen Nummer zwischen 1 und 127 versehen, die dann quasi als Kennung
dient, wenn man auf einen Kanal zugreift. Tun Sie dies, so weiß unser C64 gleich, mit welchem Gerät er zu kommunizieren hat und handhabt dies dann auch
entspechend, da alle Geräte ja in einer
besonderen Art und Weise " bedient" sein wollen. Diese Filenummern muß man also
ebenfalls dem OPEN-Befehl mit auf den
Weg geben, damit er die Gerätenummer
auch der richtigen ( Erkennungs-) Filenummer zuordnet. Bei einem Drucker zum
Beispiel ( mit der Geräteadresse 4) sähe
das dann etwa folgendermaßen aus:
OPEN 1,4
Schon hätten wir einen Filekanal für den
Drucker eröffnet, an den wir nun Daten
senden könnten. Hierzu wird dann eine
kleine Abwandlung unseres mittlerweile
altbekannten PRINT-Befehls benutzt - der
PRINT#- Befehl. Das Doppelkreuz (#) hier
ist sehr wichtig, da BASIC sonst die
beiden Befehle ja nicht auseinanderhalten könnte - PRINT ohne "#" gibt ja
ausschließlich auf den Bilschirm aus.
Daß PRINT " drucke" heißt, wissen Sie
mittlerweile ja auch schon. Das
Doppelkreuz ist eine im englischen
allgemein bekannte Abkürzung für" Nummer" . Die komlette Übersetzung von
PRINT# wäre demnach also " Drucke auf
Nummer" . Diese Nummer wird nun
anschließend angegeben und stellt die
oben erwähnte Filenummer dar. Um nun
also Daten an den Drucker zu senden
müßten wir, nachdem wir den oben
erwähnten OPEN-Befehl durchgeführt
haben, folgendes schreiben:
PRINT#1," Das ist eine Datenausgabe"
Hier haben wir einmal eine Zeichenkette, wie auch bei PRINT durch Gänsefüßchen
eingeklammert, ausgegeben. Ebenso können
Sie hier jedoch auch mit Variablen arbeiten, etwa so:
PRINT#1,a$ PRINT#1,x PRINT#1,z%
Beim Zugriff auf die Floppy ist diese
Vorgehenweise nun genau dieselbe. Wir müssen zuerst einen Kanal öffnen und
können anschließend mit PRINT# Daten
übergeben. Allerdings müssen wir hier
wieder ein wenig unterscheiden, denn die
Floppy kann nämlich in zwei Richtungen
bedient werden; zum einen " Daten
schreiben", hierzu benutzt man dann
PRINT#, und zum anderen " Daten Lesen" .
Da brauchen wir dann einen neuen Befehl, doch hierzu später. Zuerst einmal müssen
wir einen Filekanal für die Floppy öffnen. Dies ist leider nicht mehr ganz so
einfach wie beim Drucker ( daher auch zuerst das Beispiel mit selbigem), denn
der OPEN-Befehl verlangt für die Floppy
mehr Parameter als nur Fileund Gerätenummer. Da wäre nämlich zunächst einmal
noch die sogenannte " Sekundäradresse" und dann noch ein entsprechender Filename, damit das Laufwerk auch weiß, mit
welchem File wir arbeiten wollen.
Kommen wir zunächst einmal zur Sekundäradresse. Diese gibt an, auf welche Art
und Weise wir Daten verarbeiten möchten.
Sie wird in Form einen Zahl angegeben
und bezeichnet damit vorher vereinbarte
Funktionen. Die Floppy akzeptiert insgesamt 16 Sekundäradressen, die folgende
Funktionen belegen:
Sekundäradresse Funktion
0 Daten Lesen (LOAD) 1 Daten Schreiben (SAVE) 2-14 Daten Lesen ODER schreiben 15 Sek.adresse für Befehlskanal
Für uns sind im Augenblick nur die Nummern von 2 bis 14 wichtig, die anderen
werde ich Ihnen später erklären.
Zuerst muß ich Sie noch ein wenig über
die verschiedenen Filearten der Floppy
auflären. Es gibt derer fünf, von denen
wir allerdings nur 2 benutzen werden.
Jede der verschiedenen Arten wird in der
Fileliste einer Diskette, dem sogenannten Directory ( LOAD"$",8), mit einem
kleinen Kürzel versehen, so daß man er- kennt, welche Fileart man vor sich hat.
Programme haben zum Beispiel immer das
Kürzel " PRG" . Das kennen Sie ja bestimmt
aus vielen Directories. Hier nun eine
Liste aller weiteren Filearten:
1 .) PRG - PRoGramm. Diese Fileart ist
eigens für Programme reserviet. Die
Datenbytes, die an die Floppy gesandt werden, werden in sequentieller
Reihenfolge, also ein Byte nach dem
anderen, gespeichert. Das PRG-Kürzel
gibt an, daß man das Programm mit
LOAD in den Speicher des 64 ers
laden kann. Alle Programme, die Sie
mit SAVE abspeichern, erhalten
ebenfalls dieses Filekürzel zur
Erkennung.
2 .) SEQ - SEQuenz. Diese Fileart wird
genauso wie PRG gehandhabt. Die
Daten folgen also Byte für Byte auf
der Diskette, mit dem einzigen
Unterschied, daß Sie diese Daten
NICHT mit LOAD laden können. Es ist quasi ein Erkennungszeichen für
Datenfiles von Programmen, aus denen
auf diese Files zugegriffen wird.
3 .) REL - RELatives File. Relative Files
sind Files, in denen bestimmte
Datenblöcke, sogenannte " Records", gespeichert sind. Duch Angabe einer
Recordnummer wird NUR dieser Record
geladen, und nicht das ganze File.
Reltive Files werden auch " Files mit
Wahlfreiem Zugriff genannt" und sind
sehr häufig bei Dateiverwaltungsprogrammen zu finden, da durch
diese Fileart schnell auf einen
bestimmten Datensatz zugegriffen
werden kann, ohne gleich die ganze
Datei zu durchforsten. Leider ist
sie nicht sehr einfach in BASIC zu
Programmieren, weshalb wir sie an
dieser Stelle auch nicht behandeln
werden.
4 .) DEL - DELeted. Files mit diesem
Kürzel sehen Sie in der Regel NIE, da diese Fileart lediglich für floppyinterne Anwendungen reserviert
ist. Sie gibt an, daß ihr File
gelöscht wurde, daß also die von ihm
belegten Datenblöcke auf der
Diskette wieder benutzt werden
können.
5 .) USR - USeR File. Der Aufbau ist
derselbe wie bei PRG und SEQ. USR
gibt lediglich an, daß das hierin
gespeicherte Programm NUR von der
Floppy ausführbar ist, also für uns
uninteressant.
Wir wollen uns hier nur mit den ersten
beiden Arten beschäftigen. Zunächst
einmal die SEQuenz-Dateien. Wie Sie oben
ja schon lesen konnten ist diese Fileart
für Daten im Allgemeinen reserviert. Daß
wir das mit den Filearten zuerst noch
klären mußten ist deshalb wichtig, da
diese Angabe beim OPEN-Befehl ebenfalls
mitangegeben werden muß. Dies geschieht
zusammen mit dem Filenamen. Hier einmal
ein Beispiel, damit Sie wissen wie das öffnen eines Kanals für die Floppy
aussieht:
OPEN 1,8,2,"HIGHSCORE,S,W"
Dabei ist:
1 - die Filenummer 8 - die Geräteadresse (Floppy) 2 - die Sekundäradresse HIGHSCORE - der eigentliche Filename S - die Fileart W - die Betriebsart
Sie sehen also, zuerst kommen die uns
bisher schon bekannten Parameter dran, also Filenummer und Geräteadresse.
Anschließend, mit einem Komma vom Rest
getrennt, folgt die Sekundäradresse, in
unserem Beispiel die 2 . Sie könnten natürlich auch alle anderen Nummern von 2 bis 14 benutzen, dies wäre kein Unterschied. Jetzt jedoch zum Filenamen - nachdem Sie auch diesen mit einem Komma
vom Rest abgehoben haben folgt, in
Gänsefüßchen gesetzt, der eigentliche Filename. Wie Sie jedoch sehen, werden
zusammen mit dem Filenamen noch 2 weitere Parameter übergeben. Da wäre zum
einen die Fileart, markiert durch den
Buchstaben " S" und zum anderen die
Betriebsart, hier in unserem Beispiel
durch den Buchstaben " W" dargestellt.
Beide Parameter werden wieder mit
Kommata vom Filenamen abgetrennt, wobei
allerdings zu beachten ist, daß beide
sich zusammen mit dem eigentlichen
Filenamen in dem Filename-String
befinden, so daß die Parameter NAME, FILEund BETRIEBSART" alle in EIN
Gänsefüßchenpaar gefaßt sind.
Wie Sie vielleicht schon erraten haben, bezeichet das " S" die Fileart SEQenz.
Wir haben hier also ein sequentielles
File geöffnet. Bei einem Programmfile
hätten wir hier ein " P" einsetzen
müssen. Nun zur Betriebsartkennung. Der
Buchstabe " W" im Beispiel oben steht für
" Write", zu Deutsch " Schreibe" . Der
Kanal wurde also zum Schreiben geöffnet.
Die Floppy erwartet nun, daß Daten an
sie gesandt werden, die sie dann auf die
Diskette in das angegebene File
schreibt. Für uns heißt das nun, daß wir
mit Hile von PRINT# jetzt Daten auf den
Kanal 1 schicken können und diese auf
Diskette gespeichert werden. Senden wir
doch einfach einmal etwas an die Floppy:
na$="Fritz Meier" sc=100000 PRINT#1,"Highscoreliste" PRINT#1,pl$ PRINT#1,sc
Hier haben wir nun den Highscore von
Fritz Meier abgespeichert, der sich
auf 100000 Punkte beläuft, indem wir
die verschiedenen Werte erst einmal in
Variablen definierten und anschließend
nacheinander ( sequentiell !) an die
Floppy gesendet haben. Sie hätten
natürlich die Daten auch dirket
schreiben können, wobei der String na$
in Gänsefüßchen hätte stehen müssen und
die Zahl ohne, so wie das bei dem String
" HIGHSCRORELISTE" zu sehen ist. Wichtig
ist, daß Sie jedes einzelne Datum mit
einem EINZIGEN PRINT#- Befehl senden, und
nicht etwa von Kommata getrennt - wie
man das vielleicht nach der
Parametertrennung bei OPEN denken
könnte. Diese Kommatrennung ist zwar
auch möglich, doch bewirkt Sie hier
etwas anderes, wozu ich später kommen
werde. Außerdem könnten Sie mit Kommatrennung später die Daten nicht mehr so
einfach einlesen, doch hierzu ebenfalls
später mehr.
Unsere Daten wären jetzt also an die
Floppy geschickt und somit gespeichert.
Den Filekanal brauchen wir jetzt nicht
mehr. Deshalb müssen wir ihn zuerst noch
wieder schließen, bevor wir fortfahren.
Dies ist sehr sehr wichtig, da wir somit
nicht nur den Computer entlasten, weil
der sich jetzt auch nicht mehr den Kanal
" merken" muß, der mit der Floppy zu tun hat, sondern durch ein Schließen des
Kanals veranlassen wir gleichzeitig auch
die Floppy das File komplett und richtig
auf der Diskette anzulegen. Das heißt, daß sie jetzt auch den Eintrag in der
Fileliste der Diskette machen und diesem
Eintrag auch die entspechenden Daten
zuweisen kann. Das Schließen eines Kanals wird in BASIC mit dem Befehl CLOSE
durchgeführt. Als Parameter benötigt
CLOSE lediglich die Filenummer, in
unserem Fall also die 1 :
CLOSE 1
Nun haben wir also das File komplett
angelegt. Schauen Sie doch einfach
einmal ins Directory - hier sehen Sie
nun ein weiteres File, das etwa so aussieht:
1" HIGHSCORE" SEQ
Der CLOSE-Befehl muß übrigens ebenfalls beim Drucker, wie auch bei allen Geräten
bei denen Sie vorher einen Filekanal mit
OPEN öffneten, angewandt werden. Ich
hatte dies vorhin nur nicht erwähnt, da
es mir zunächst einmal um die Funktion
von OPEN ging.
Um die Fortsetzung dieses Kurses zu lesen, wählen Sie bitte den zweiten Teil
des Basic-Kurses an.