---------------------------------------- FLOPPY-KURS "Es rappelt in der Kiste..." (Teil 4) ----------------------------------------
Hallo und herzlich willkommen zum vier- ten Teil unseres Floppy-Kurses. Nachdem wir das letzte Mal die Direktzugriffsbe- fehle 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 wol- len 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 unter- scheiden zwischen DOS-internen Verwal- tungsblöcken und den reinen Datenblök- ken. 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 schnel- ler 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 festge- stellt und bei Zutreffen wird mit der Fehlermeldung "File Exists" abgebro- chen). Das DOS trägt nun im freien Ein- trag den Namen und Typ des zu speichern- den 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 able- gen kann. Wurde einer gefunden, so wird seine Track und Sektornummer ebenfalls im Directoryeintrag gespeichert. Im an- dern Fall wird mit der Meldung "Disk Full" abgebrochen. Nun wird damit begon- nen, die zu schreibenden Daten vom Rech- ner 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äm- lich für die Folgeblocknummer reser- viert. 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 festzu- stellen, 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 Wahr- scheinlichkeit 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 be- sonderen 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 ange- sprochen, nur wie funktioniert z.B. das Heraussuchen eines freien Directoryein- trags, 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 Direc- tory zuständig, wobei hier natürlich auch Informationen enthalten sind, die wir nicht beim üblichen LOAD"$",8 ange- zeigt bekommen. Außerdem ist in einem ganz speziellen Block die sogenannte "BAM" abgelegt, was für "Block Availa- billity Map" steht. Öbersetzt bedeutet das nichts anderes als "Block Verfügbar- keits 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 Dis- kette, da nur an ihm das DOS eine Dis- kette ü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 ange- geben 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' ent- spricht. 162-163 Hier ist die zweistellige ID der Diskette vermerkt. 164 Wert 160. 165-166 Formatangabe der Diskette. Die- se ist bei 1541-Disketten immer "2A". 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 wel- chem Block das Directory beginnt. Das ist in der Regel Sektor 1 von Track 18. Dieser Wert könnte jedoch mit Hilfe ei- nes 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 Format- kennzeichen wurde deshalb eingeführt, weil Commodore für ältere Bürorechner ebenfalls eigene Laufwerke gebaut hat, die wiederum eine andere Diskettenstruk- tur aufweisen (z.B. mehr Tracks und Sek- toren). Disketten von solchen Laufwerken können von der 1541 zwar teilweise gele- sen, nicht aber beschrieben werden. Des- halb 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 er- kennen 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 ange- sprochene BAM. Auf sie werden wir gleich zurückkommen. Es folgen zum Schluß noch zwei Informa- tionen über die Diskette. Zum einen der 16 Zeichen lange Diskettenname, zum an- deren die ID, gefolgt von einem 'SHIFT- SPACE' und der DOS-Versionsnummer (nor- malerweise "2A"). Auch diese beiden Be- reiche können verändert werden. Zusätz- lich sollten Sie wissen, daß Sie nicht nur die ID, sondern auch das SHIFT- SPACE-Zeichen, sowie das "2A" 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 kodie- ren. 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 unbe- legt. Zur besseren Öbersicht hier noch- mal 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) die- ser drei Bytes werden nun gezählt und in das 0. Byte der entsprechenden Track-BAM (für Track 1, Byte 4 des DHB), eingetra- gen. 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 ent- haltenen Filenamen und deren Typ gespei- chert. In einen Directoryblock passen 8 Fileeinträge. Sind alle Einträge voll, so wird ein neuer Directoryblock ange- legt. Track und Sektor des erste Direc- toryblocks 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 Track- und dem Wert 255 als Sektornummer markiert. Hier nun eine Öbersicht mit der genauen Bele- gung 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 wer- den immer nur die ersten 30 Bytes be- nutzt. 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-018 16 Bytes für den Filenamen. 019-020 Bei relativen Files stehen hier Track und Sektor des ersten Side-Sektor-Blocks (sonst unbe- nutzt). 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. Des- weiteren finden sich hier auch Informa- tionen 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 vorhan- den 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 Ma- gic-Disk anschauen, so werden Sie dort mehrere Trennstrich-Files finden, die schreibgeschützt sind. Im Filetyp-Byte werden die einzelnen Informationen nun folgendermaßen co- diert: Ist Bit 7 gesetzt, so ist ein File gültig, es wurde ordnungsgemäß ge- schlossen 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 Filecodie- rungen. Werte von 0 bis 4 sind sinnvoll. Bitte Teil 2 des Floppy-Kurses laden!!!