Magic Disk 64

home to index to text: MD9209-KURSE-FLOPPY-KURS_4-1.txt
----------------------------------------
               FLOPPY-KURS              
      "Es rappelt in der Kiste..."      
                (Teil 4)                
----------------------------------------

Hallo und herzlich willkommen zum vierten Teil unseres Floppy-Kurses. Nachdem wir das letzte Mal die Direktzugriffsbefehle kennengelernt haben, wollen wir uns dieses Mal mit der Struktur auf der Diskette beschäftigen. Dabei werden wir lernen, wie wir einzelne Diskettenblocks so manipulieren, daß zum Beispiel der Typ eines Files geändert ist, ein File nicht mehr gelöscht werden kann, etc.
WAS STEHT WO?
Sicherlich erinnern Sie sich noch daran, daß die 1541 eine Diskette in 35 Spuren zu je 17-21 Sektoren aufteilt. Wir wollen uns nun anschauen, wie das DOS ( so nennt man das Betriebssystem der Floppy) nun Daten auf diesen Blocks ablegt.
Dabei müssen wir gleich einmal unterscheiden zwischen DOSinternen Verwaltungsblöcken und den reinen Datenblökken. In ersteren stehen Informationen wie z. B. der Name der Diskette, ihre ID, welche Blocks belegt sind, und welche nicht, die Directoryeinträge, etc. Den Verwaltungsblöcken ist ausschließlich der gesamte 18 . Track vorreserviert.
Datenblöcke weden nie dort abgelegt, dazu dienen jedoch dann alle anderen Tracks (1-17 und 19-35) .
DIE DATENBLÜCKE Zunächst wollen wir uns mit der Struktur eines Datenblocks beschäftigen. Diese ist die einfachere, und demnach schneller erklärt. Dazu will ich Ihnen nun zunächst einmal beschreiben, was in der Floppy vorgeht, wenn ein File auf der Diskette gespeichert wird.
Zu aller erst erhält die Floppy vom C64 die Meldung, daß nun ein Schreibzugriff erfolgen soll. Gleichzeitig mit dieser Information wird der Filename des zu schreibenden Files, sowie sein Filetyp übertragen. Die Floppy schaut nun in den Blocks, die für die Directoryeinträge definiert sind nach, wo ein Eintrag noch frei ist, oder ob ein neuer hinzugefügt werden soll. Warum das so ist, wollen wir später bei den Verwaltungsblocks klären. Nehmen wir also einfach einmal an, daß Platz für einen Eintrag gefunden wurde, und daß der angegebene Filename noch nicht auf der Diskette existiert ( dies wird nämlich ebenfalls festgestellt und bei Zutreffen wird mit der Fehlermeldung " File Exists" abgebro- chen) . Das DOS trägt nun im freien Eintrag den Namen und Typ des zu speichernden Files ein. Anschließend macht es sich auf die Suche nach einem freien Block in den Tracks 1-17, bzw.19-35, in dem Sie die ersten Daten des Files ablegen kann. Wurde einer gefunden, so wird seine Track und Sektornummer ebenfalls im Directoryeintrag gespeichert. Im andern Fall wird mit der Meldung " Disk Full" abgebrochen. Nun wird damit begonnen, die zu schreibenden Daten vom Rechner zu empfangen und zu speichern. Da ein Diskettenblock nur 256 Bytes lang ist, und zu speichernde Daten in der Regel ein größeres Volumen haben, sucht sich die Floppy jedesmal wieder einen neuen freien Block, wenn der letzte vollgeschrieben ist. Diese Blocks werden anschließend als ' belegt' gekennzeichnet und auf der Diskette vermerkt.
Nun fragen Sie sich bestimmt schon, wie das DOS später wieder erkennt, welche Blocks zu welchem File gehören und in welcher Reihenfolge diese geladen werden sollen. Das ist nun ganz einfach gelöst.
Wie ich oben schon erwähnte kann ein Datenblock 256 Bytes fassen. Als reine Datenbytes werden davon jedoch nur 254 genutzt. Die ersten zwei Bytes sind nämlich für die Folgeblocknummer reserviert. Im ersten Byte steht der Track, im zweiten der Sektor des nächsten Blocks, der zu diesem File gehört. In diesem ist dann wiederum der nächste Block vermerkt und so weiter. Um festzustellen, wann ein File aufhört, enthält der letzte Block als Tracknummer den Wert 0 . Im Byte für die Sektornummer ist nun ein Wert enthalten, der die Anzahl der in diesem Block benutzten Bytes kennzeichnet, da am Ende, je nach Länge der gespeicherten Daten, mit hoher Wahrscheinlichkeit nicht alle Datenbytes des Blocks für das File benötigt werden.
Dieser Aufbau gilt übrigens für alle Filetypen. Ausnahmen bestätigen jedoch die Regel, und so ist es auch in diesem Fall. Relative Datenfiles benutzen eine andere Datenstruktur, was in Ihrer besonderen Funktion begründet ist. Sie benutzen sogenannte " Side-Sector- Blocks" um ihren relativen Aufbau verwalten zu können. Da die Manipulation an relativen Files jedoch wenig ratsam ist, und nur selten einen Sinn macht, wollen wir den Aufbau von Side-Sektor- Blöcken wegfallen lassen.

DIE DIRECTORY-BLOCKS                    

Nun wissen wir also, auf welche Weise Datenblocks miteinander verkettet sind.
Was uns nun interessieren soll, ist die Art und Weise, mit der das DOS nun eine Diskette verwaltet. Im Prinzip haben wir das in obigem Beispiel auch schon angesprochen, nur wie funktioniert z. B. das Heraussuchen eines freien Directoryeintrags, oder freien Blocks?
Nun, wie schon erwähnt, ist der Track 18 ausschließlich dem DOS vorbehalten. Im Prinzip ist er komplett für das Directory zuständig, wobei hier natürlich auch Informationen enthalten sind, die wir nicht beim üblichen LOAD"$",8 angezeigt bekommen. Außerdem ist in einem ganz speziellen Block die sogenannte " BAM" abgelegt, was für " Block Availabillity Map" steht. Öbersetzt bedeutet das nichts anderes als " Block Verfügbarkeits Karte", bzw. Liste. Hier steht eingetragen, welche Blocks der Diskette schon belegt sind, und welche nicht.

DER DISK-HEADER-BLOCK                   

Den Block, in dem die BAM enthalten ist, nennt man " Disk-Header- Block" . Er ist der wichtigste Block auf der ganzen Diskette, da nur an ihm das DOS eine Diskette überhaupt erkennt und bearbeiten kann. Er liegt im Sektor 0 des 18 .
Tracks. Außer der BAM sind hier noch viele andere Informationen gespeichert, wie z. B. Diskettenname und - ID. Wollen wir uns nun eine Liste anschauen, aus der Sie ersehen können, welche Bytes des Disk-Header- Blocks welche Informationen enthalten:

Byte    Aufgabe                         
000      Hier ist  die  Tracknummer  des
         ersten  Directoryblocks enthal-
         ten (normalerweise 18).        
001      Hier steht die Sektornummer des
         ersten  Diretoryblocks  (norma-
         lerweise 1)                    
002      Hier    steht     das     1541-
         Formatkenn-zeichen.    Selbiges
         entspricht  dem   ASCII-Zeichen
         "A" (Code: 65 = $41).          
003      Dieses  Byte  kennzeichnet,  ob
         die eingelegte Diskette doppel-
         seitig  formatiert  ist   (dann

steht hier der Wert 1) . Das ist wichtig für die Benutzer einer 1571- Floppy, die in der Lage ist, Disketten beidseitig zu beschreiben. Die 1541 beachtet dieses Byte nicht.
004-007 In diesen 4 Bytes ist die Blockbelegung des ersten Tracks vermerkt.
008-139 Blockbelegungsbytes für die Tracks 2-34 .
140-143 Hier steht die Blockbelegung des letzten,35 . Tracks.
144-159 Hier steht der Diskettenname, der bei der Formatierung angegeben wurde, und zwar im AS-CII- Code. Ist ein Name kürzer als 16 Zeichen, so werden die restlichen Bytes mit dem Wert 160 aufgefüllt.
160-161 Hier steht zweimal der Wert 160, was übrigens dem ASCII-Zeichen ' SHIFT-SPACE' entspricht.
162-163 Hier ist die zweistellige ID der Diskette vermerkt.
164 Wert 160 .
165-166 Formatangabe der Diskette. Diese ist bei 1541- Disketten immer "2 A" . Sie sehen sie im normalen Directory, daß Sie mit LOAD"$",8 geladen haben, immer am Ende der ersten Zeile, in der auch Diskname und - ID zu finden sind.
167-170 Gefüllt mit ' SHIFT-SPACE'( Wert 160) .
171-255 Unbenutzer Bereich. Gefüllt mit Nullen.
Wie Sie sehen kann hier schon eine Fülle an Informationen abgelesen werden.
Zunächst einmal sehen wir hier, bei welchem Block das Directory beginnt. Das ist in der Regel Sektor 1 von Track 18 .
Dieser Wert könnte jedoch mit Hilfe eines Diskmonitors, oder eines kleinen Block-Lese- und-Schreibprogramms beliebig geändert werden.
Das Formatkennzeichen ist bei der Floppy 1541 das " A" . Es zeigt dem DOS an, daß dies eine von einer 1541( oder einem kompatiblen Laufwerk, z. B.1570,1571) formatierte Diskette ist. Dieses Formatkennzeichen wurde deshalb eingeführt, weil Commodore für ältere Bürorechner ebenfalls eigene Laufwerke gebaut hat, die wiederum eine andere Diskettenstruktur aufweisen ( z. B. mehr Tracks und Sektoren) . Disketten von solchen Laufwerken können von der 1541 zwar teilweise gelesen, nicht aber beschrieben werden. Deshalb verweigert die Floppy auch den Schreibzugriff auf Disketten mit anderem Formatkenneichen. Dies kann man sich aber auch zunutze machen: ändert man nämlich den Wert des 3 . Bytes, so kann man eine Diskette softwaremäßig schreibschützen. Ein Speichern, Löschen, oder Softformatieren ist nun nicht mehr möglich. Wohl aber kann von der Diskette geladen werden.
Das 4 . Byte ist für die 1541 nutzlos.
Hier steht in der Regel eine 0( nur sinnvoll in Verwendung von Laufwerken mit 2 Schreib/ Leseköpfen) .
Wie Sie weiterhin aus obiger Liste erkennen können, sind nun jeweils vier Bytes für die Blockbelegung eines jeden der 35 Tracks reserviert. Die Bytes 4 bis 143 enthalten die oben schon angesprochene BAM. Auf sie werden wir gleich zurückkommen.
Es folgen zum Schluß noch zwei Informationen über die Diskette. Zum einen der 16 Zeichen lange Diskettenname, zum anderen die ID, gefolgt von einem ' SHIFT-SPACE' und der DOS-Versionsnummer ( normalerweise "2 A") . Auch diese beiden Bereiche können verändert werden. Zusätzlich sollten Sie wissen, daß Sie nicht nur die ID, sondern auch das SHIFT-SPACE- Zeichen, sowie das "2 A" verändern können. Dadurch hat man die Möglichkeit eine 5- stellige " ID" herzustellen( natürlich zählen für das DOS immer nur noch die ersten beiden Zeichen) . Auf diese Art und Weise ist es z. B. Möglich, daß die Diskettenseiten der Magic-Disk die IDs " SIDE1" und " SIDE2" haben ( haben Sie einmal darauf geachtet?) .
DIE BAM Die BAM verwaltet, wie schon erwähnt, die freien und belegten Blocks einer Diskette.140 Bytes sind für sie im Disk-Header- Block reserviert. Wir haben ebenso gelernt, daß jeweils vier Bytes die Blockbelegungen eines Tracks kodieren. Wollen wir uns dies einmal anhand des ersten Tracks betrachten. Dieser verfügt ja über 21 Sektoren. Seine " BAM-Bytes" sind in den Bytes 4 bis 7 des Disk-Header- Blocks (18/0) zu finden.
Im ersten Byte dieser vier Bytes ist nun die Anzahl der freien Blöcke auf Track 1 vermerkt. In den folgenden drei Bytes sind nun die Zustände der Blocks 0-20 bitweise kodiert. Ist ein Bit in einem der drei Bytes gesetzt, so entspricht das der Information, daß der zugehörige Block frei ist. Ist es gelöscht, so ist der Block belegt. Die Verteilung der Sektoren auf die drei Bytes sieht nun folgendermaßen aus. Die Bits 7-0( in dieser Reihenfolge!) des ersten Bytes geben die Belegung der Sektoren 0-7 an.
Die Bits 7-0 des zweiten Bytes zeigen den Status für die Blocks 8-15 . Die Bits 7-3 des dritten Bytes stehen für die Blocks 16-20 . Bits 2-0 sind hier unbelegt. Zur besseren Öbersicht hier nochmal eine Tabelle (" DHB"= Disk-Header- Block) :

Byte 1 (für Track 1, Byte 5 des DHB)    
Bit      7   6   5   4   3   2   1   0  
Sektor  00  01  02  03  04  05  06  07  
--------------------------------------  
Byte 2 (für Track 1, Byte 6 des DHB)    
Bit      7   6   5   4   3   2   1   0  
Sektor  08  09  10  11  12  13  14  15  
--------------------------------------  
Byte 3 (für Track 1, Byte 7 des DHB)    
Bit      7   6   5   4   3   2   1   0  
Sektor  16  17  18  19  20  --  --  --  
--------------------------------------  

Alle gesetzten Bits (= freier Block) dieser drei Bytes werden nun gezählt und in das 0 . Byte der entsprechenden Track-BAM ( für Track 1, Byte 4 des DHB), eingetragen. So baut sich nun die gesamte BAM auf, wobei sich in Byte 3 die Belegung natürlich ändert, da es ja auch Tracks gibt, die nur 19,18 oder 17 Sektoren haben. In letztem Fall sind dann nur noch das 7 . und 6 . Bit von Byte 3 be- nutzt.

DIE DIRECTORY-BLOCKS                    

Kommen wir nun zu den Directoryblocks.
In ihnen sind die auf der Diskette enthaltenen Filenamen und deren Typ gespeichert. In einen Directoryblock passen 8 Fileeinträge. Sind alle Einträge voll, so wird ein neuer Directoryblock angelegt. Track und Sektor des erste Directoryblocks können aus dem Disk-Header- Block entnommen werden. Normalerweise ist das Block 18/1 . Kommen wir nun zum Aufbau eines Directoryblocks.
Zunächst einmal sind diese Blocks ebenso wie normale Datenblocks über die Angabe des jeweils nächsten Blocks miteinander verkettet. Deshalb stehen in den ersten beiden Bytes jeweils Track und Sektor des nächsten Directoryblocks. Der Letzte ist mit dem Wert 0 als Trackund dem Wert 255 als Sektornummer markiert. Hier nun eine Öbersicht mit der genauen Belegung eines Directoryblocks:

ByteNr.  Aufgabe                        
000      Track des Folgeblocks          
001      Sektor des Folgeblocks         
002-033  Fileeintrag Nr. 1              
034-065  Fileeintrag Nr. 2              
066-097  Fileeintrag Nr. 3              
098-129  Fileeintrag Nr. 4              
130-161  Fileeintrag Nr. 5              
162-193  Fileeintrag Nr. 6              
194-225  Fileeintrag Nr. 7              
226-255  Fileeintrag Nr. 8              

Jeder einzelne Eintrag belegt also 32 Bytes im Directoryblock. Ich muß dies allerdings korrigieren. Im Prinzip werden immer nur die ersten 30 Bytes benutzt. Die letzten beiden Bytes eines Eintrags sind immer unbenutzt. Daher ist Eintrag Nr.8 auch nur 30 Bytes lang.
Die 2 unbenutzten Bytes fehlen hier ein- fach, was auch keinen Unterschied macht.
Nun wollen wir uns einmal anschauen, welche Informationen in den 30 Bytes eines File-Eintrags zu finden sind. Auch hier will ich Ihnen eine Tabelle geben, damit die Öbersichtlichkeit gewahrt bleibt:

000 Byte für den Filetyp.
001-002 Track und Sektor des ersten Datenblocks dieses Files.
003-01816 Bytes für den Filenamen.
019-020 Bei relativen Files stehen hier Track und Sektor des ersten Side-Sektor- Blocks ( sonst unbenutzt) .
021 Bei relativen Files seht hier die Länge eines Datensatzes ( sonst unbenutzt) .
022-025 unbenutzt 026-027 Zwischenspeicher des Tracks und

         Sektors beim Öberschreiben  mit
         dem  Klammeraffen (" ") vor dem
         Filenamen.  Dies  ist  nur  ein
         temporärer  Speicher. Normaler-
         weise werden diese Bytes  nicht
         beschrieben.                   
028-029  Hier  steht die Länge des Files
         in  Blocks  als   16-Bit-Lo/Hi-
         Zahl.                          

In Byte 0 ist der Filetyp kodiert. Desweiteren finden sich hier auch Informationen darüber, ob das entsprechende File ordnungsgemäß geschlossen wurde und ob es schreibgeschützt ist. In ersterem Fall ist das File im normalen Directory mit einem "*" markiert. Das zeigt an, daß das File ungültig ist. Ein File ist z. B. ungültig, wenn Sie versuchen etwas auf eine volle Diskette zu speichern.
Die Floppy erkennt nun während des Schreibens, das kein Platz mehr vorhanden ist, und bricht ab. Zuletzt wird das fehlerhafte File noch als ungültig erklärt, damit man es nicht mehr laden kann. Mit einem Validate-Befehl an die Floppy wird ein solches File dann aus dem Directory entfernt.
Ein schreibgeschütztes File kann nicht mehr überschrieben oder gelöscht werden, solange es geschützt ist. Dadurch können Sie das ungewollte Löschen von Daten verhindern. Ein so geschütztes File ist im Directory mit einer spitzen Klammer nach links ("<") markiert. Wenn Sie sich einmal das Inhaltsverzeichnis der Magic- Disk anschauen, so werden Sie dort mehrere Trennstrich-Files finden, die schreibgeschützt sind.
Im Filetyp-Byte werden die einzelnen Informationen nun folgendermaßen codiert: Ist Bit 7 gesetzt, so ist ein File gültig, es wurde ordnungsgemäß geschlossen und kann geladen werden. Wenn Bit 6 gesetzt ist, so ist das File schreibgeschützt ( normalerweise ist es gelöscht, also ungeschützt) . Die Bits 0 bis 2 enthalten die möglichen Filecodierungen. Werte von 0 bis 4 sind sinnvoll.
Bitte Teil 2 des Floppy-Kurses laden! ! !

Valid HTML 4.0 Transitional Valid CSS!