Directory

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Begriffsklärung Der Titel dieses Artikels ist mehrdeutig. Directory (Begriffsklärung).
Beispiel eines Directorys einer Diskette.

Das englische Wort Directory bezeichnet das Inhaltsverzeichnis eines Mediums, üblicherweise das einer Diskette, aber der Begriff ist ebenso für RAM-Disks (etwa einer REU) und Festplatten geläufig. Auch ein Index aller auf einer Kassette aufgenommenen Datasette-Aufnahmen kann im weitesten Sinne als Directory gesehen werden.
Das Betriebssystem des Laufwerks, typischerweise Commodore DOS, speichert im Directory Verwaltungsdaten zu den auf der Diskette gespeicherten Dateien, insbesondere die Zuordnung von Dateinamen zu Position der Datei auf der Diskette; zur Verwaltung der freien Blöcke der Diskette wird die BAM benutzt (siehe auch CBM-Dateisystem). Auch der Name und die Disk-ID der Diskette wird in der BAM gespeichert.


Directory anzeigen[Bearbeiten | Quelltext bearbeiten]

Diskettenlaufwerke[Bearbeiten | Quelltext bearbeiten]

Eine für den Anwender bestimmte Directory-Darstellung kann z.B. mit der BASIC-Eingabe LOAD"$",8 in den Speicher des C64/116/128 oder VC20 geladen und mit einem anschließenden LIST angezeigt werden.

"DATENDISK 1"       99 2A   (Diskettenbezeichnung: Name, Disk-ID, gespeichert im BAM-Sektor)
0   "----------------" DEL  (Directory-Einträge: Genutzte Blöcke, Dateiname, Dateityp)
0   "- EIGENES SPIEL-" DEL
0   "----------------" DEL
100 "GEISTERJAGD",8:   PRG< (Manipulierter Directory-Eintrag)
64  "DATEN1"           SEQ<
44  "DATEN2"           REL<
56  "DATEN3"           USR<
100 "DATEN"           *SEQ 
350 BLOCKS FREE             (Anzahl freier Blöcke bzw. freier Diskettenspeicher)

Anmerkung: Hier ist das Directory einer 5,25"-Diskette zu sehen, die in einer 1541 formatiert und per Disketteneditor manipuliert wurde (insbesondere die ersten vier Directory-Einträge).

Technische Details: Das Commodore DOS des Diskettenlaufwerks liest beim LOAD"$",8 die interne Verwaltungsstruktur von Spur 18 (bei einer 1541) ein und bringt sie in eine Form, die vom BASIC-Interpreter des Computer dargestellt werden kann[1]). Hier handelt es sich also um einen "Hack", denn natürlich handelt es sich nicht um ein ausführbares BASIC-Programm, und z.B. sind die "Zeilennummern" völlig durcheinander.

Bedeutung des Dateityps (siehe auch CBM-Dateisystem):

  • PRG Programmdateien
  • SEQ Sequentielle Datei (typischerweise Daten, nicht ausführbarer Code)
  • USR User-Dateien (Sonderform der sequentiellen Dateien, per OPEN lassen sich diese Dateien ggf. direkt in der Floppy ausführen)
  • REL relative Dateien (enthalten mehrere gleichgroße Datensätze und besondere Verwaltungsblöcke)
  • DEL gelöschte Datei (normalerweise nicht sichtbar)
  • CBM Partition einer 1581-Disk
  • DIR Unterverzeichnis eines CMD-Laufwerks wie der CMD-HD/FD-2000/FD-4000/RAMLink

Zusätze zur Dateitypangabe:

  • < nach dem Dateityp: die Datei besitzt einen softwareseitigen Überschreibschutz (engl. lock). Dieser schützt aber nicht vor dem Formatieren der ganzen Diskette.
  • * vor dem Dateityp: auch engl. splat file genannt, markiert eine noch geöffnete oder nicht richtig geschlossene Datei. Das Entfernen einer solchen Datei funktioniert mit dem Floppy-Befehl SCRATCH nur unvollständig, sondern erst mittels VALIDATE werden tatsächlich alle schon reservierten Datenblöcke wieder freigegeben!

Im Falle eines Doppellaufwerks, lädt LOAD"$" das Verzeichnis beider Laufwerke oder mit Dateiname "$0" bzw. "$1" wird lediglich das gewünschte Laufwerk ausgewählt:

LOAD"$",8

SEARCHING FOR $
LOADING
READY.
LIST

 1 "DOPPELT         " JK 2A
 1    "DRIVE1"           SEQ
 1    "DRIVE0"           SEQ
 662 BLOCKS FREE.
 0 "LEER            " JK 2A
 1    "OUT"              SEQ
 1    "B"                SEQ
 1    "DRIVE0"           SEQ
 1    "DRIVE0 NEW"       SEQ
 660 BLOCKS FREE.
READY.

Kaum dokumentiert ist übrigens die Möglichkeit, das Directory quasi im Rohformat auszulesen, indem man es mit einer Sekundäradresse > 0 öffnet (z.B. OPEN 1,8,1,"$". In diesem Fall wird in den ersten 254 Bytes die BAM gesendet und anschließend die Directory-Einträge wie in Details beschrieben, allerdings ohne Verkettungszeiger. Joker-Zeichen und Dateitypeinschränkungen werden in diesem Modus ignoriert.

RAM-Disk[Bearbeiten | Quelltext bearbeiten]

Joker[Bearbeiten | Quelltext bearbeiten]

Die Auswahl der Directory-Einträge beim CBM-Dateisystem lässt sich mit einer Maske beeinflussen bzw. filtern, wobei die CBM DOS-üblichen Joker-Symbole * und ? Verwendung finden. Die Zusammensetzung der Maske ergibt sich aus den optionalen Angaben

  • einer optionale Laufwerksangabe (Drive), die unmittelbar dem Befehlszeichen "$" folgt und aus einer optionalen Ziffer und mit einem Doppelpunkt abgeschlossen ist,
  • eines Dateinamens oder Dateinamenmusters (enthalten Joker-Symbole), welche mehrfach jeweils durch ein Komma getrennt vorkommen können,
  • eines abschließenden Dateitypselektors eingeleitet mit dem "="-Symbol gefolgt von der Typkennung.

Beispiele:

LOAD "$0:*=P",8      Zeigt von Laufwerk 0 nur Programmdateien des Directorys (P für PRG,
LIST                 entsprechend mit S, U, R für SEQ, USR, REL).
LOAD "$:WA?R*",8     Alle Dateien, deren Name mit WA beginnt und an der 4. Stelle ein R besitzt,
LIST                 werden gelistet.
LOAD "$:?E,A*=S",8   Zeigt nur sequentielle Dateien, deren Name entweder 2-stellig auf E endet oder
LIST                 mit mit A beginnt.
LOAD"$$",8           Nur die Disketteninformation und die Anzahl freier Blöcke
LIST                 werden ausgegeben (sofern es keine Datei lautend auf "$" gibt).

Directory verlustfrei anzeigen[Bearbeiten | Quelltext bearbeiten]

Die Directory-Anzeige mit LOAD"$",8 und LIST überschreibt ein gerade im Speicher befindliches BASIC-Programm. Dies kann man mit Hilfe eines Maschinensprache-Programms vermeiden. Ein Beispiel dazu gibt es bei der Beschreibung des Assembler-Befehls STX.

Eine verlustfreie Directory-Anzeige mit Hilfe einer BASIC-Routine zeigt das Beispiel im Thema: C64 Basic: Directory auslesen und als Stringarray speichern auf Forum64.de.

Mit LOAD"$",8,1 kann zwar beim C64 unter BASIC V2 das Directory verlustfrei angezeigt werden, allerdings erscheint die Anzeige kompakt und überwiegend als Datenmüll, was bei weitem nicht so übersichtlich wie ein LOAD"$",8 ist. Der technische Hintergrund hierbei ist, dass das Commodore DOS als Ladeadresse der Datei "$" aus historischen Gründen die Adresse $0401 liefert (siehe 1541-ROM $ECBC); beim PET war das der BASIC-Start, beim C64 ist es aber der Bildschirmspeicher. LOAD beachtet die Ladeadresse, sofern eine Sekundäradresse angegeben wird; die Bytes, die das Directory als BASIC-Programm darstellen sollen, erscheinen dann beim C64 also als PETSCII-Code auf dem Bildschirm. Ist das Directory (als BASIC-Programm dargestellt) länger als 1023 Bytes, wird schließlich doch auch bei diesem "Trick" das aktuelle BASIC-Programm (ab $0801) überschrieben.

Einen eigenen Befehl oder eine spezielle Tastenbelegung bzw. -folge für die verlustfreie Directory-Anzeige bieten neuere BASIC-Dialekte, BASIC-Erweiterungen und Steckmodule. Einige Beispiele (sofern erforderlich mit Parameter für Geräteadresse 8 und Laufwerk 0):

Directory-Ausgabe unter BASIC V2 mit LOAD"$",8 (unten) und LOAD"$",8,1 (oben)


Name Typ Befehl
BASIC V2 BASIC-Dialekt LOAD"$",8,1 (siehe Text)
BASIC V3.5 BASIC-Dialekt DIRECTORY
F3  (C16, Plus/4)
BASIC V4.0, BASIC 7.0 BASIC-Dialekt CATALOG, DIRECTORY
F3  (C128)
Simons' Basic, TSB BASIC-Erweiterung DIR "$"
Commodore DOS Wedge 5.1 BASIC-Erweiterung @$ oder >$
@$0:* oder >$0:*
TEDMON (BASIC 4.0, BASIC 7.0) Maschinensprachemonitor @,$ oder @8,$
Supermon+64 Maschinensprachemonitor @,$ oder @8,$
Final Cartridge 3 Steckmodul DOS"$
F7  bzw.
CATALOG (alte Version)
Action Replay Steckmodul $
Turbo Trans Schnelllader CTRL  D 
Speed-DOS Schnelllader @$
>$
F7 
JiffyDOS Schnelllader @$:*
V-DOS Schnelllader CTRL  D 
Help, Help Plus Steckmodul $

Aufbau des Directorys[Bearbeiten | Quelltext bearbeiten]

Beschreibung[Bearbeiten | Quelltext bearbeiten]

Bei einer 1541 liegen die Dateieinträge des Directorys hinter der BAM auf Spur 18 ab Sektor 1, können alle weiteren 18 Sektoren der Spur (CBM-DOS verwendet hier immer einen festen Interleave bzw. Abstand von 3 Blöcken[2]) belegen und kann maximal 144 Einträge enthalten.
Bei Verwendung einer 3,5-Zoll-Diskette in einer 1581 hat die Directory-Spur 40 Blöcke, so dass abzüglich Header und BAM Platz bleibt, um bis zu 296 Einträge aufzunehmen.

Jeder Directory-Block enthält 8 Einträge mit einer Länge von 30 Bytes, dazu kommen noch 7 × 2 Füllbytes zwischen den Einträgen.

Ein verwendeter Directory-Block ist auch in der BAM entsprechend als belegt markiert. Alle Blöcke von Track 18 sind aber bei der Zählung der auf der Diskette befindlichen freien Blöcke ausgeklammert (daher maximal 664 Blöcke, von den 683 am Medium befindlichen). Die BAM wird bei der Erweiterung des Verzeichnisses herangezogen, um den nächsten freien Block im Abstand von drei Blöcken zu finden, wenn sonst keine unbelegten Einträge mehr vorhanden sind.[3] Ist kein Platz mehr vorhanden, wird die DOS-Fehlermeldung 72, DISK FULL gemeldet.
Block 18/0 und 18/1 sind nach einer Formatierung stets als belegt gekennzeichnet.
Beim Lesen eines Verzeichnisses sind lediglich die Verkettungszeiger ausschlaggebend, wobei eine Struktur wie bei jede anderen PRG-Datei gegeben ist.

Position Pos. hex. Beschreibung
0 $00 Spurnummer des nächsten Blocks (Verkettungszeiger) - gegebenenfalls 0, wenn kein Folgeblock
1 $01 Sektornummer des nächsten Blocks (Verkettungszeiger) - 255 bzw. $FF, wenn kein Folgeblock (= der letzte Sektor ist immer vollständig belegt)
2 - 31 $02 - $1F 1. Dateieintrag
34 - 63 $22 - $3F 2. Dateieintrag
66 - 95 $42 - $5F 3. Dateieintrag
98 - 127 $62 - $7F 4. Dateieintrag
130 - 159 $82 - $9F 5. Dateieintrag
162 - 191 $A2 - $BF 6. Dateieintrag
194 - 223 $C2 - $DF 7. Dateieintrag
226 - 255 $E2 - $FF 8. Dateieintrag

Insgesamt enthält das Directory somit 144 Einträge. Die einzelnen Einträge sind folgendermaßen aufgebaut:

Position Pos. hex. Beschreibung
0 $00 Dateityp-Kennung
1 $01 Spurnummer des ersten Datenblocks
2 $02 Sektornummer des ersten Datenblocks
3 - 18 $03 - $12 Dateiname (aufgefüllt mit SHIFT-SPACE)
19 $13 Spurnummer des ersten Side-Sector-Blocks (nur bei relativen Dateien)
20 $14 Sektornummer des ersten Side-Sector-Blocks (nur bei relativen Dateien)
21 $15 Datensatzlänge (nur bei relativen Dateien)
22 - 25 $16 - $19 Zwischenspeicher für DOS-Operationen
26 $1A Spurnummer des ersten Datenblocks der neuen Datei beim Überschreiben mit REPLACE ("@:DATEINAME")
27 $1B Sektornummer des ersten Datenblocks der neuen Datei beim Überschreiben mit REPLACE
28 $1C Anzahl der verwendeten Blöcke (Low)
29 $1D Anzahl der verwendeten Blöcke (High)

Unter GEOS haben die Bytes 21 bis 29 ($15 bis $1D) in den Dateieinträgen eine andere Bedeutung, die für das GEOS-spezifische VLIR-Format benötigt werden.
Für Details siehe dazu Hinweise und die entsprechenden Weblinks.

Die Dateitypkennung besitzt folgenden Aufbau:

Bit Beschreibung
0 - 2 Typ der Datei:
3 - 4 unbenutzt
5 1 = Datei befindet sich im REPLACE-Modus
6 1 = SCRATCH-Schutz (engl. lock flag)
7 0 = Datei noch geöffnet bzw. nicht richtig geschlossen (engl. splat file)

Der Titel mit dem Diskettennamen, der ID und dem DOS-Typ wird aus der BAM geholt.

Beispiel[Bearbeiten | Quelltext bearbeiten]

Directory der 64'er Diskette 1994/06:

Beginn des Inhaltsverzeichnisses der 64'er 94/06 Diskette
Der erste Sektor mit den ersten 8 Dateieinträgen im Diskettenmonitor


Beginn und Ende der Dateieinträge sind rot markiert.

Der Eintrag der 4. Datei "Archivator V2.1" ist gelb und orange unterlegt.

  • Typ-Byte = $82: Dateityp ist 2 = Programm; Bit 7 ist gesetzt, also ist die Datei nicht geöffnet.
  • Start Spur/Sektor = $11/$0A, also beginnt die Datei bei Spur 17, Sektor 10.
  • Eintrag des Dateinamens "ARCHIVATOR V2.1 ".
  • Anzahl der verwendeten Blöcke (letzte zwei Bytes im Dateieintrag) $01 $00, also 1 Block


Der Titel über den Directory-Einträgen wird aus der BAM genommen, die beim 1541-Laufwerk in Spur 18, Sektor 0 liegt (Darstellung hier in Klein-/Großschrift):

Dateiname, ID, DOS-Typ aus der BAM im Diskettenmonitor


  • $90 - $9F: Dateiname "64'er 06/94" aufgefüllt mit $A0
  • $A2 - $A3: Disk ID = "s1"
  • $A5 - $A6: DOS Typ = "2a"

Weblinks[Bearbeiten | Quelltext bearbeiten]


Quellen