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 64er, wollen wir uns in die- sem Monat einmal um die Dateiverwaltung und die Programmierung der Floppy küm- mern. 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 be- stimmt. 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 64ers 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 wei- teren 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 Dis- kette, bleiben jedoch komplett erhalten. Es wird somit also NICHTS an den Pro- grammen 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 schrei- ben und sie hieraus wieder auszulesen. Dies ist sehr sinnvoll, wenn man eine Anwendung schreiben möchte, die irgend- welche Werte zwischenspeichern soll, oder wenn Sie bei einem Spiel die High- scoreliste der Nachwelt erhalten möch- ten. Damit wir dieses Problem jedoch richtig angehen können, muß ich erst etwas wei- ter ausholen und Sie einmal über die Ein-/Ausgabe in BASIC aufklären. Alle Geräte, die an Ihrem 64er 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 ei- ne 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 ei- ner eigenen Nummer zwischen 1 und 127 versehen, die dann quasi als Kennung dient, wenn man auf einen Kanal zu- greift. Tun Sie dies, so weiß unser C64 gleich, mit welchem Gerät er zu kommuni- zieren 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-)File- nummer 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 auseinander- halten 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 ar- beiten, 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 öff- nen. Dies ist leider nicht mehr ganz so einfach wie beim Drucker (daher auch zu- erst das Beispiel mit selbigem), denn der OPEN-Befehl verlangt für die Floppy mehr Parameter als nur File- und Geräte- nummer. Da wäre nämlich zunächst einmal noch die sogenannte "Sekundäradresse" und dann noch ein entsprechender File- name, damit das Laufwerk auch weiß, mit welchem File wir arbeiten wollen. Kommen wir zunächst einmal zur Sekundär- adresse. 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 insge- samt 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 Num- mern 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 sogenann- ten 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 ge- sandt 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 64ers 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 Dateiverwaltungs- programmen 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 na- türlich auch alle anderen Nummern von 2 bis 14 benutzen, dies wäre kein Unter- schied. 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, FILE- und 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 Komma- trennung 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 Ka- nals 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 aus- sieht: 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 le- sen, wählen Sie bitte den zweiten Teil des Basic-Kurses an.