Magic Disk 64

home to index to text: MD9203-KURSE-FLOPPY-KURS_1-A.txt
              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 64 ers erklären. Beginnend mit den Grundlagen 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 sequentiellen Fileprogrammierung gewidmet sein.
Kommen wir zunächst einmal zu den Grundbegriffen der Dateneinund ausgabe des 64 ers. Wenn Sie sich mit BASIC auskennen, 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 ( BASICorientierten) Lesen von einem Datenkanal, und
* CLOSE, zum abschließenden Schließen eines Datenkanals.
Dateneinund ausgaben werden nun prinzipiell mit drei verschiedenen Parametern 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 angesprochen werden soll. Diese drei Parameter sind die " logische Filenummer", die " Sekundäradresse" und die " Gerätenummer" .
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 Datenkanal zur Floppy mit der logischen Filenummer 1 und ein Datenkanal zum Drucker mit der logischen Filenummer 2 geöffnet, so weiß das Betriebssystem des 64 ers immer, wohin es Daten mit einer der beiden Filenummern senden soll. Ein " PRINT#1, A$" sendet so die Stringvariable A$ an den momentan offenen Floppykanal ( nachdem die Filenummer 1 so durch ' OPEN' definiert wurde), wohingegen der Befehl " PRINT#2, A$" dieselbe Stringvariable 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 diese Nummer deshalb, weil die verschiedenen Peripheriegeräte mit unterschiedlichen 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 zwischen 0 und 15 annehmen, wobei es folgende 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 Adressen 0,1 und 15 sind spezielle Adressen, die eingens für die Verwaltung von Massenspeichern gedacht sind. Normalerweise muß man nämlich beim Zugriff auf einen Massenspeicher ( so wie auch das Floppylaufwerk einer ist) grundsätzlich die Art des Zugriffs explizit im Filenamen angeben. Möchte man aber ein Programmfile ( dazu später mehr) lesen oder schreiben, so kann man sich die Angabe im Filenamen 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 Floppybefehlskanal 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 Artverwandter des 6510, der im 64 er seinen Dienst verrichtet) und eigene Ein-/ Ausgabechips. Sie stellt im Prinzip einen autonomen Computer dar, der richtig Programmiert werden kann. Die wichtigsten Funktionen sind in spezeillen Floppybefehlen zusammengefasst und werden über den erwähnten Befehlskanal aufgerufen ( wie z. B. der Befehl, die einliegende Diskette zu formatieren, oder ein spezielles File von der einliegenden Diskette zu löschen) . Der Floppybefehlskanal hat später, wenn wir die Direktzugriffbefehle behandeln, und in Zusammenhang 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 Syntaxdefinition) :
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 Befehlskanal ö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äradresse 15( eben dem Befehlskanal derselbigen) . Nun können Sie der Floppy Befehle senden, die diese dann unabhängig vom 64 er bearbeiten wird. Sie können also Ihren 64 er währenddessen in seinem aktuellen Programm fortfahren lassen. Er arbeitet, solange die Floppy selbst arbeitet, unabhängig von ihr. Nur, wenn während dieser Zeit ein weiterer Diskettenzugriff notwendig wird, wird der 64 er angehalten ( s. u.) Ich will Ihnen nun die Standard- Floppybefehle auflisten, die wir einfach benutzen können. Später beim Direktzugriff und bei der relativen Dateiverwaltung werden wir ebenfalls über den Befehlskanal 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 mehreren Buchstaben, sowie den zu jedem Befehl 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 Identifikationskennung (" ID") . Floppybefehle werden nach dem Üffnen des Befehlskanals immer mit einem " PRINT# lfn"( lfn= logische Filenummer) an die Floppy geschickt. 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öffnet ( 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 Formatierung der Diskette. Der 64 er meldet sich mit einem " READY." zurück, und Sie können während der Formatierung mit ihm arbeiten. Sie können den Befehlskanal nun offen halten und weitere Floppybefehle 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 64 er 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 unweigerlich zu einem zwischenzeitlichen Stop des Rechners.
Der NEW-Befehl kennt übrigens zwei Syntaxen. Ö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 Spuren 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 " softformatiert" . 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 enthalten und können evtl. gerettet werden.
Ausserdem ist das softformatieren weitaus schneller als ein " hardformatieren" . Es funktioniert allerdings nur bei schon einmal hardformatierten Disketten, da diese die grundlegende Diskettenstruktur 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 64 er 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 umbenennen. 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 glauben, daß die Diskettenstruktur durcheinandergekommen 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 Directory. Er benötigt keinerlei Parameter und kann folgendermaßen aufgerufen werden:
PRINT#1," V" Die Floppy beginnt nun mit der Validierung. Diese kann je nach dem wie voll und wieviele einzelne Files auf der Diskette enthalten sind, bis zu mehrere Minuten in Anspruch nehmen.

* Der SCRATCH-Befehl:
Dieser Befehl löscht ein File auf Diskette. 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:" eingeleitet, gefolgt von dem oder den Filenamen, 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ürzen. 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 vierten 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 Einmal 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 einzelnen 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 sequentiellen 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 programmieren, so sollten Sie Ihre Adressen in einer SEQ-Datei speichern. Dies kennzeichnet Ihre Daten eben als Daten und nicht als ausführbares Programm ( obwohl Sie genausogut eine PRG-Datei verwenden könnten!) . Die Unterscheidung ist besonders wichtig für den LOAD-Befehl, der SEQ-Dateien gar nicht erst liest, sondern ausschließlich PRG-Dateien in den Speicher des 64 ers 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 zusammengefasst und mit einer fortlaufenden Satznummer versehen. Wenn Sie zum Beispiel die Adressen Ihrer Adressverwaltung in relativen Datensätzen speichern, und sich merken, unter welchen Datensatznummern Sie die einzelnen Adressen wiederfinden, so können Sie direkt auf einen Datensatz zugreifen. Die Vorteile gegenüber sequentieller Speicherung liegen auf der Hand: durch den Direktzugriff sind die Daten erstens schneller erreichbar, weil nicht eine komplette Datei eingelesen werden muß, sondern eben immer nur ein einziger Datensatz, und sie können zweitens extern gelagert werden, so daß Sie kostbaren Arbeitsspeicher im 64 er sparen. Die Programmierung von relativen Dateien wird uns im 2 .
Teil dieses Kurses noch näher beschäftigen.
Bitte Teil 2 laden. . .

Valid HTML 4.0 Transitional Valid CSS!