Directory

Aus C64-Wiki
Wechseln zu: Navigation, Suche
Begriffsklärung Der Titel dieses Artikels ist mehrdeutig. Directory (Begriffsklärung).
(thumbnail)
Beispiel eines Directorys einer Diskette

Das englische Wort Directory bezeichnet das Inhaltsverzeichnis einer Diskette. 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).

Inhaltsverzeichnis

[Bearbeiten] Anzeige des Directorys

Eine für den Anwender bestimmte Ansicht des Directorys 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)
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 (1541 ROM $EC9E). 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 Subdirectory bei einer 1581-Disk
  • DIR Subdirectory auf CMD-Speichermedien

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.

[Bearbeiten] Joker

Die Auswahl der Directory-Einträge 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).

[Bearbeiten] Directory verlustfrei anzeigen

Die Anzeige des Directorys mit LOAD"$",8 und LIST zerstört 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.

Mit LOAD"$",8,1 kann zwar beim C64 unter BASIC 2.0 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 "$" die Adresse $0401 liefert; beim VC20 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):

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


Name Typ Befehl
BASIC V2.0 BASIC-Dialekt LOAD"$",8,1 (siehe Text)
BASIC V3.5 BASIC-Dialekt DIRECTORY
F3  (C16, Plus4)
BASIC V4.0, BASIC 7.0 BASIC-Dialekt CATALOG, DIRECTORY
F3  (C128)
Simons' Basic 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 $

[Bearbeiten] Aufbau des Directorys

Bei einer 1541 liegen die Einträge des Directorys auf Spur 18 ab Sektor 1, können alle weiteren 18 Sektoren der Spur belegen und kann maximal 144 Einträge enthalten. Bei Verwendung einer 3,5" Zoll-Diskette in einer 1581 hat die Directory-Spur 40 Blocks, 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.

Position Beschreibung
0 Spurnummer des nächsten Blocks (Verkettungszeiger) - gegebenenfalls 0, wenn kein Folgeblock)
1 Sektornummer des nächsten Blocks (Verkettungszeiger)
2 - 31 1. Dateieintrag
34 -63 2. Dateieintrag
66 - 95 3. Dateieintrag
98 - 121 4. Dateieintrag
130 -159 5. Dateieintrag
162 - 191 6. Dateieintrag
194 - 223 7. Dateieintrag
226 - 255 8. Dateieintrag

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

Position Beschreibung
0 Dateityp-Kennung
1 Spurnummer des ersten Datenblocks
2 Sektornummer des ersten Datenblocks
3 -18 Dateiname (aufgefüllt mit SHIFT-SPACE)
19 Spurnummer des ersten Side-Sector-Blocks (nur bei relativen Dateien)
20 Sektornummer des ersten Side-Sector-Blocks (nur bei relativen Dateien)
21 Datensatzlänge (nur bei relativen Dateien)
22 - 25 Zwischenspeicher für DOS-Operationen
26 Spurnummer des ersten Datenblocks der neuen Datei beim Überschreiben mit REPLACE ("@:DATEINAME")
27 Sektornummer des ersten Datenblocks der neuen Datei beim Überschreiben mit REPLACE
28 Anzahl der verwendeten Blöcke (Low)
29 Anzahl der verwendeten Blöcke (High)

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)

[Bearbeiten] Weblinks