---------------------------------------- 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! ! !