Floppy-Kurs: "Es rappelt in der Kiste..." (Teil 1) ----------------------------------------
In Anlehnung an diverse Geräusche die das Laufwerk unseres Computerlieblings an und wann von sich gibt, wünsche ich Sie herzlich willkommen zum ersten Teil unseres neuen Floppykurses. In den nächsten Monaten will ich Ihnen hier die Funktionsweise und effektive Benutzung des Floppylaufwerks 1541 des 64ers erklären. Beginnend mit den Grund- lagen zur Datenspeichrung auf Diskette werden wir uns über sequentielle und relative Dateiverwaltung immer mehr an die 'Innereien' der Floppy herantasten, und uns auch mit dem Diskettenaufbau und Direktzugriff beschäftigen. Danach will ich Ihnen zeigen, wie einfach es ist die Floppy in Assembler zu programmieren und Ihnen desweiteren meine gesammelten Tips und Tricks zur Floppy offenbaren. Ich wünsche Ihnen also viel Spaß bei diesem Kurs und will gleich zu Sache kommen...
GRUNDLAGEN DER DATENEIN-/AUSGABE
Dieser erste Teil des Floppy-Kurses soll ganz den Grundlagen und der sequentiel- len Fileprogrammierung gewidmet sein. Kommen wir zunächst einmal zu den Grund- begriffen der Datenein- und ausgabe des 64ers. Wenn Sie sich mit BASIC ausken- nen, so wissen Sie, daß es prinzipiell 5 BASIC-Befehle gibt, mit denen wir Daten an externe, oder von externen Geräten senden und empfangen können. Diese sind: * OPEN, zum Üffnen eines Datenkanals, * PRINT#, zum Senden von Daten in einen Datenkanal, * GET#, zum Lesen von Daten von einem Datenkanal, * INPUT#, zum einfacheren (BASIC- orientierten) Lesen von einem Datenka- nal, und * CLOSE, zum abschließenden Schließen eines Datenkanals. Datenein- und ausgaben werden nun prin- zipiell mit drei verschiedenen Parame- tern zu den obigen Befehlen gesteuert. Sie geben an, welchem logischen Kanal der aktuelle Datenaustausch zugeordnet wird und geben Informationen über die Art des Zugriffs (lesen/schreiben) und über das entsprechende Gerät, das ange- sprochen werden soll. Diese drei Parame- ter sind die "logische Filenummer", die "Sekundäradresse" und die "Gerätenum- mer". Die logische Filenummer ist eine Zahl zwischen 1 und 127, die als Kennung für eine Ein-/Ausgabeoperation dient. Durch den OPEN-Befehl wird ihr eine bestimmte Fileoperation zugewiesen, die sie ein- deutig definiert. Wird also ein Datenka- nal zur Floppy mit der logischen File- nummer 1 und ein Datenkanal zum Drucker mit der logischen Filenummer 2 geöffnet, so weiß das Betriebssystem des 64ers immer, wohin es Daten mit einer der bei- den Filenummern senden soll. Ein "PRINT#1,A$" sendet so die Stringvaria- ble A$ an den momentan offenen Floppyka- nal (nachdem die Filenummer 1 so durch 'OPEN' definiert wurde), wohingegen der Befehl "PRINT#2,A$" dieselbe Stringva- riable an den Drucker sendet (nachdem ihm die Filenummer 2 zugeordnet wurde). Die Gerätenummer spezifiziert nun das Gerät, mit dem Daten ausgetauscht werden sollen. Sie kann Werte zwischen 0 und 15 annehmen. Hierzu gibt es eine Liste, die die verschiedenen Geräte spezifiziert. Das Betriebssystem des C64 benötigt die- se Nummer deshalb, weil die verschiede- nen Peripheriegeräte mit unterschiedli- chen Betriebssystemroutinen angesprochen werden müssen. Die Verteilung der Gerä- tenummern an die entsprechenden Geräte ist wiefolgt festgelegt:
Ger.num. Gerät ----------------------
0 Bildschirm 1 Datasette 2 RS232-Schnittstelle 4 Drucker 1 5 Drucker 2 8 Floppylaufwerk 1 9 Floppylaufwerk 2 10 Floppylaufwerk 3 11 Floppylaufwerk 4
Die restlichen Nummern sind unbelegt. Wie Sie sehen ist es also möglich bis zu 4 Floppylaufwerke und 2 Drucker an den C64 anzuschließen, die alle getrennt voneinander angesprochen werden können. Ebenso ist die Kommunikation mit dem Bildschirm über die Gerätenummer 0 mö- glich. Hierbei empfangen Sie direkt die Eingaben, die gerade vom Benutzer auf den Bildschirm geschrieben werden. Die Sekundäradresse einer Ein- /Ausgabeoperation gibt nun die Art einer Datenoperation an. Sie kann Werte zwi- schen 0 und 15 annehmen, wobei es fol- gende Bedeutungen gibt:
SAdr. Bedeutung ------------------------
0 Programm laden 1 Programm speichern 2-14 Daten Lesen oder Schreiben 15 Floppybefehlskanal
In der Regel werden die Sekundäradressen zwischen 2 und 14 verwendet. Die Adres- sen 0, 1 und 15 sind spezielle Adressen, die eingens für die Verwaltung von Mas- senspeichern gedacht sind. Normalerweise muß man nämlich beim Zugriff auf einen Massenspeicher (so wie auch das Floppy- laufwerk einer ist) grundsätzlich die Art des Zugriffs explizit im Filenamen angeben. Möchte man aber ein Programmfi- le (dazu später mehr) lesen oder schrei- ben, so kann man sich die Angabe im Fi- lenamen sparen und die Adressen 0 oder 1 benutzen. Die Floppy weiß in dem Fall direkt, daß sie ein Programmfile lesen, bzw. schreiben soll. Dazu will ich Ihnen später noch ein paar Beispiele liefern. Die Sekundäradresse 15 ist ausschließ- lich für das Floppylaufwerk reserviert. Mit ihr wird der sogenannte Floppybe- fehlskanal geöffnet. Dieser ist nicht an ein spezielles File gebunden und dient der Öbertragung von Befehlen an die Floppy selbst. Die 1541 verfügt nämlich, wie der C64 auch, über einen eigenen Mikroprozessor (den 6502, ein Artver- wandter des 6510, der im 64er seinen Dienst verrichtet) und eigene Ein- /Ausgabechips. Sie stellt im Prinzip einen autonomen Computer dar, der rich- tig Programmiert werden kann. Die wich- tigsten Funktionen sind in spezeillen Floppybefehlen zusammengefasst und wer- den über den erwähnten Befehlskanal auf- gerufen (wie z.B. der Befehl, die ein- liegende Diskette zu formatieren, oder ein spezielles File von der einliegenden Diskette zu löschen). Der Floppybefehls- kanal hat später, wenn wir die Direktzu- griffbefehle behandeln, und in Zusammen- hang mit der relativen Dateiverwaltung eine große Bedeutung. Die obig beschriebenen Parameter, die der OPEN-Befehl benötigt müssen wiefolgt angewandt werden (Praxisbeispiele werden wir im Laufe dieses Kurses noch genügend kennenlernen, deshalb hier nur eine Syn- taxdefinition): OPEN (log.Filenr.),(Ger.nr.),(Sek.adr.)
DER FLOPPYBEFEHLSKANAL
Wir wollen uns nun mit der Benutzung des Floppybefehlskanals beschäftigen und einmal die alltäglichen Floppybefehle durchgehen. Bevor Sie also einen Befehl an die Floppy schicken, müssen Sie den Befehls- kanal öffnen. Dies geschieht mit dem Befehl "OPEN 1,8,15". Wir öffnen hier einen Kanal mit der logischen Filenummer 1, verbunden mit dem Gerät Nummer 8 (der Floppy nämlich) und mit der Sekundära- dresse 15 (eben dem Befehlskanal dersel- bigen). Nun können Sie der Floppy Befeh- le senden, die diese dann unabhängig vom 64er bearbeiten wird. Sie können also Ihren 64er währenddessen in seinem ak- tuellen Programm fortfahren lassen. Er arbeitet, solange die Floppy selbst ar- beitet, unabhängig von ihr. Nur, wenn während dieser Zeit ein weiterer Disket- tenzugriff notwendig wird, wird der 64er angehalten (s.u.) Ich will Ihnen nun die Standard- Floppybefehle auflisten, die wir einfach benutzen können. Später beim Direktzu- griff und bei der relativen Dateiverwal- tung werden wir ebenfalls über den Be- fehlskanal der Floppy Anweisungen geben, uns die Daten, die wir von ihr verlangen entprechend vorzubereiten. Kommen wir jedoch erst einmal zu den einfachen Befehlen: * Der NEW-Befehl: Mit diesem Befehl formatieren wir eine neue Diskette. Grundsätzlich bestehen die Floppybefehle aus einem oder mehre- ren Buchstaben, sowie den zu jedem Be- fehl variierenden Parametern. Beim NEW- Befehl ist die Befehlskennung ein "N:", nach diesen beiden Zeichen folgt nun der Name, den die Diskette erhalten soll, sowie eine zwei Zeichen lange Identifi- kationskennung ("ID"). Floppybefehle werden nach dem Üffnen des Befehlskanals immer mit einem "PRINT#lfn" (lfn=logi- sche Filenummer) an die Floppy ge- schickt. Mit dem folgenden BASIC- Kommando fordern wir die Floppy also dazu auf, die einliegende Diskette mit dem Namen "MEINE DISK" und der ID "MD" zu formatieren. Der Befehlskanal wurde unter der logischen Filenummer 1 geöff- net (wie in obigem Beispiel), also sen- den wir den Befehl auch an Kanal 1:
PRINT#1,"N:MEINE DISK,MD"
Die Floppy beginnt nun mit der Formatie- rung der Diskette. Der 64er meldet sich mit einem "READY." zurück, und Sie kön- nen während der Formatierung mit ihm arbeiten. Sie können den Befehlskanal nun offen halten und weitere Floppybe- fehle senden, oder aber auch irgend eine andere Tätigkeit mit dem Rechner tun. Achten Sie allerdings darauf, daß beim weiteren Senden eines Befehls, sowie dem Schließen des Befehlskanals, der Rechner blockiert wird. Das liegt daran, daß die Floppy während einer internen Operation dem 64er signalisiert, daß sie gerade "BUSY", also am Arbeiten ist. Soll der C64 nun mit der Floppy kommunizieren, so wartet er solange, bis die Floppy wieder frei wird. Demnach führt jeder weitere Befehl, der die Floppy anspricht unwei- gerlich zu einem zwischenzeitlichen Stop des Rechners. Der NEW-Befehl kennt übrigens zwei Syn- taxen. Öbergeben Sie einen Namen UND eine ID, dann wird die Diskette physisch formatiert. Das heißt, sie wird Spur um Spur neu angelegt, wobei die neuen Spu- ren mit Nullen aufgefüllt werden. Daten, die sich evtl. auf ihr befanden werden somit komplett gelöscht. Öbergeben Sie aber nur einen Diskettennamen, und keine ID, so wird die Diskette "softforma- tiert". Es wird lediglich der neue Name über den alten geschrieben, und alle Blocks als unbelegt gekennzeichnet. Die ID bleibt die alte. Die alten Daten sind jedoch immer noch auf den Spuren enthal- ten und können evtl. gerettet werden. Ausserdem ist das softformatieren wei- taus schneller als ein "hardformatie- ren". Es funktioniert allerdings nur bei schon einmal hardformatierten Disketten, da diese die grundlegende Diskettens- truktur schon enthalten. Sie schließen den oben geöffneten Be- fehlskanal übrigens wieder mit "CLOSE 1". Tun Sie das bitte immer, wenn Sie ein Datenfile, oder den Befehlskanal nicht mehr brauchen, da der 64er intern immer nur 10 offene Kanäle verwalten kann. * Der RENAME-Befehl: Mit dem Rename-Befehl können Sie den Namen eines schon bestehenden Files um- benennen. Die Syntax ist eigentlich recht einfach. Das Kürzel für RENAME ist "R:" es folgen nun der neue und der alte Filename getrennt durch ein "="-Zeichen. Hier ein Beispiel:PRINT#1,"R:MAGIC DISK=GAME ON" Dieser Befehl benennt das File "GAME ON" in "MAGIC DISK" um. Wieder benutzten wir die log. Filenummer 1, die oben im OPEN-Befehl definiert wurde. * Der VALIDATE-Befehl: VALIDATE bedeutet "überprüfen", und sel- biges tut der Validate-Befehl der Floppy. Haben Sie nämlich Grund zu glau- ben, daß die Diskettenstruktur durchei- nandergekommen ist, so zum Beispiel wenn Sie ein, oder mehrere Files speichern wollten, für die aber nicht ausreichend Platz vorhanden war, dann sollten Sie diesen Befehl verwenden. Er untersucht die Diskette auf ihre korrekte Struktur und korrigiert alles, was nicht einer normalen Diskettenstruktur entspricht. In dem Beispiel mit einem nur teilweise gespeicherten Programm sind die schon geschiebenen Blocks dieses Files als belegt gekennzeichnet, obwohl das File im Directoryeintrag mit "0 Blocks" und einem "*" als unbrauchbar gekennzeichnet ist. Der Validate-Befehl erkennt nun die fälschlicherweise belegten Blocks und gibt sie wieder frei. Desweiteren löscht er den markierten Eintrag aus dem Direc- tory. Er benötigt keinerlei Parameter und kann folgendermaßen aufgerufen wer- den: PRINT#1,"V" Die Floppy beginnt nun mit der Validie- rung. Diese kann je nach dem wie voll und wieviele einzelne Files auf der Dis- kette enthalten sind, bis zu mehrere Minuten in Anspruch nehmen. * Der SCRATCH-Befehl: Dieser Befehl löscht ein File auf Dis- kette. Englisch "to scratch" bedeutet "kratzen" und im Öbertragenen Sinne "kratzt" die Floppy tatsächlich ein File von der Diskettenoberfläche. Der Scratch-Befehl wird mit "S:" einge- leitet, gefolgt von dem oder den Filena- men, die gelöscht werden sollen. Hierbei dürfen Sie sogar sogenannte Filepatterns benutzen, die eine Fileangabe abkürzen. Ein "Pattern" ist eine Maske, die man der Floppy für einen Filenamen übergibt. Alle Files, deren Namen dieser Maske entsprechen sind damit angesprochen, werden in unserem Fall also durch den Scratch-Befehl gelöscht. Hier einige Beispiele:
PRINT#1,"S:FILE1" PRINT#1,"S:TEST1,TEST2,TEST10,TEST11" PRINT#1,"S:TEST?" PRINT#1,"S:TEST*"
Im ersten Beispiel wird das File namens "FILE1" gelöscht. Das zweite Beispiel löscht die Files "TEST1", "TEST2", "TEST10", und "TEST11". Selbiges können wir aber auch mit Filepatterns verkür- zen. So können wir zum Beispiel mit dem Fragezeichen eine Fileangabe abkürzen. es steht für ein beliebiges Zeichen. Das dritte Beispiel löscht also gleichzeitig die Files "TEST1" und "TEST2". Im vier- ten Beispiel benutzen wir den Asterisk ("*") als Abkürzung. Er steht für alles, was hinter den Zeichen "TEST" folgt. Wir löschen mit diesem Befehl also auf Ein- mal alle vier Files aus dem zweiten Bei- spiel.
DIE VERSCHIEDENEN DATEITYPEN
Nachdem wir nun Grundsätzliches über die Kommunikation mit der Floppy gelernt haben, möchte ich Sie nun in die einzel- nen File-Arten selbiger einführen. Das benötigen wir, um die unterschiedliche Programmierung der einzelnen File-Typen zu verstehen. Insgesamt kennt die 1541 fünf verschiedene File-Typen. Diese sind:* Programm-Dateien (PRG): In diesen Files sind Daten sequentiell, also Byte hinter Byte abgespeichert. Sie enthalten ausschließlich Programmdaten, also direkt ausführbare BASIC-, oder Maschinenprogramme. * Sequentielle Dateien (SEQ): Diese Fileart unterscheidet sich in nichts mit der vorherigen. Die Daten liegen hier ebenfalls sequentiell auf der Diskette vor. Der einzige Grund, warum man zwei Filearten zur sequentiel- len Speicherung gewählt hat, ist der, daß in SEQ-Files immer nur Daten von und zu Programmen gespeichert werden sollen und keine Programme selbst. Wenn Sie also eine Adressverwaltung programmie- ren, so sollten Sie Ihre Adressen in einer SEQ-Datei speichern. Dies kenn- zeichnet Ihre Daten eben als Daten und nicht als ausführbares Programm (obwohl Sie genausogut eine PRG-Datei verwenden könnten!). Die Unterscheidung ist beson- ders wichtig für den LOAD-Befehl, der SEQ-Dateien gar nicht erst liest, son- dern ausschließlich PRG-Dateien in den Speicher des 64ers transferiert. * Relative Dateien (REL): In relativen Dateien liegen die Daten für uns Anwender nicht hintereinander, sondern relativ zueinander vor. Hierbei wird beim Anlegen einer REL-Datei eine Datensatzlänge vorgegeben, die für ein REL-File immer gleich bleibt. Wenn Sie nun Daten in die Datei scheiben, werden selbige zu einem Datensatz zusammenge- fasst und mit einer fortlaufenden Satz- nummer versehen. Wenn Sie zum Beispiel die Adressen Ihrer Adressverwaltung in relativen Datensätzen speichern, und sich merken, unter welchen Datensatznum- mern Sie die einzelnen Adressen wieder- finden, so können Sie direkt auf einen Datensatz zugreifen. Die Vorteile ge- genüber sequentieller Speicherung liegen auf der Hand: durch den Direktzugriff sind die Daten erstens schneller er- reichbar, weil nicht eine komplette Da- tei eingelesen werden muß, sondern eben immer nur ein einziger Datensatz, und sie können zweitens extern gelagert wer- den, so daß Sie kostbaren Arbeitsspei- cher im 64er sparen. Die Programmierung von relativen Dateien wird uns im 2. Teil dieses Kurses noch näher beschäfti- gen. Bitte Teil 2 laden...