Magic Disk 64

home to index to html: MD9209-KURSE-FLOPPY-KURS_4-1.html
----------------------------------------
               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!!! 
Valid HTML 4.0 Transitional Valid CSS!