home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------------------------- *)
- (* DIRCPTYP.PAS *)
- (* (c) 1987 Michael Ceol & PASCAL.INT *)
- (* Typ-Definitionen fuer die CP/M 2.x & 3.x Version der Directory-Biblioth.*)
- BYTE = 0..255;
- Dir_Chr0 = PACKED ARRAY[1..80] OF CHAR; (* fuer System-Parameter *)
- Dir_Str = STRING[80]; (* der Typ wird fuer vieles verwendet... *)
- Time_Str = STRING[6]; (* enthaelt Uhrzeit im Format "hhmmss" *)
- Date_Str = STRING[8]; (* enthaelt Datum im Format "yyyymmdd" *)
-
- FCB_Rec = RECORD (* CP/M File Control Block: *)
- (* Laufwerknummer: 0-16. 0 => angemeldetes Laufwerk,
- 1 => Laufwerk A, 2 => Laufwerk B, usw... *)
- drive : BYTE;
- (* Dateiname [1..8], Dateityp[9..11]. Beides ASCII-
- Grossbuchstaben, mit hochwertigem Bit = 0!
- Fehlende Zeichen sind mit Leerzeichen gefuellt.
- Die hochwertigen Bits aller Zeichen sind Attri-
- but-Bits (gesetzt=an/wahr,nichtgesetzt=aus/falsch)
- Die Bedeutung der Attribut-Bits der Zeichen 1..8
- bitte im "CP/M 3 Programmer's Guide", Kap. 2.3.4,
- nachlesen! Im folgenden die fuer DIR interessanten
- Bits der Zeichen 9..11:
- 9: Read-Only. Wenn gesetzt, koennen keine
- Schreib-Operationen in die Datei
- ausgefuehrt werden.
- 10: System. System-Datei, die normalerweise nicht
- mit dem CP/M-DIR-Kommando angezeigt
- wird.
- 11: Archive. Fuer selbst geschriebene Archivie-
- rungsprogramme. Ein solches setzt
- dieses Attribut, wenn eine Kopie der
- Datei auf ein Sicherungs-Medium ge-
- macht wurde. CP/M setzt dieses au-
- tomatisch wieder zurueck, sobald eine
- Schreib-Operation in die entspr.
- Datei ausgefuehrt wird. *)
- name : ARRAY[1..11] OF CHAR;
- (* akt. 'extend'-Nummer: Ein FCB kann max. 16 kB
- verwalten. Wird eine Datei groesser, werden von
- CP/M weitere "Extends" im Inhaltsverzeichnis be-
- reitgestellt. Wird beim Oeffnen etc. vom Benutzer
- normalerweise auf 0 gesetzt, kann waehrend der
- Dateibearbeitung aber Werte von 0 bis 31 annehmen.
- (Fuer unbedarfte: Haende weg!!) *)
- extend : BYTE;
- system : ARRAY[1..2] OF BYTE; (* wird von CP/M intern verw. *)
- (* Anz. von 128-Byte-Saetzen des akt. "Extends".
- Nimmt Werte von 0 bis 255 an, wobei Werte groesser
- 128 eine Anzahl von 128 Saetzen implizieren.
- (Haende weg!!): *)
- reccnt : BYTE;
- (* file allocation, wird von CP/M verwaltet. Haende
- weg! Ausnahme: Datei umbenennen: neuer Name und
- Typ wie 'name' ab Position 1 *)
- fat : ARRAY[0..15] OF BYTE;
- (* akt. zu lesender, schreibender Satz bei sequen-
- tiellen Datei-Operationen: *)
- currec : BYTE;
- (* Optionale Satznummer beim Direkt-Zugriff im Be-
- reich von 0 bis 262143 (18-Bit-Wert, [0]=low Byte,
- [1]=middle Byte, [2]=high Byte): *)
- ranrec : ARRAY[0..2] OF BYTE;
- (*------------ ^^^ bis hier hin geht der CP/M-FCB!! Was nun
- folgt, dient lediglich der "versteckten" Kommu-
- nikation der einzelnen DIR-Funktionen unter CP/M,
- um ein fast exaktes Verhalten wie MS-DOS bzw.
- TOS zu erlangen:
- 'DTAInx' erhaelt von den Funktionen 'FSFirst'
- und 'FSNext' in 'DIRCP.TUR' den Index des ge-
- fundenen Verzeichnis-Eintrages in die 'DirDTA': *)
- DTAInx : BYTE;
- (* 'DirUsr' erhaelt von 'FSFirst' die gewuenschte
- "User-Nummer", um die hierarchische Verzeichnis-
- struktur von MS-DOS und TOS zu simmulieren. Die
- 16 User-Nummern (0-15) werden jeweils als Unter-
- verzeichnisse behandelt. Die Angabe des ge-
- wuenschten Verzeichnisses in 'search' geschieht
- durch die Angabe der User-Nummer vor der Lauf-
- werks-Angabe, z.B.:
- *.* - default Laufwerk u. User
- 1:*.* - default Laufwerk, User 1
- A:*.* - Laufwerk A, default User
- B10:*.* - Laufwerk B, User 10 *)
- DirUsr : BYTE;
- DirDrv : BYTE;
- DirAtr : BYTE;
- END;
- (* Die Directory-Eintraege auf Disk haben die gleiche Struktur wie
- obiger FCB, jedoch fehlen 'currec' und 'ranrec'. Ebenso enthaelt
- das erste Byte ('drive') hier die "User"-Nummer, zu der die Datei
- gehoert bzw. einen den Eintrag identifizierenden Code. Desweiteren
- gibt es unter CP/M 3 "erweiterte" FCBs sowie "System"-FCBs fuer
- Password-Schutz und Datum-/Zeit-Stempel von Disketten und Dateien.
- Dies steht allerdings nur in der "banked version" von CP/M 3 zur Ver-
- fuegung. Der Vollstaendigkeit halber sind sie im folgenden mit
- aufgefuehrt: *)
- DIR_FCB = RECORD
- CASE dircod: BYTE OF (* identif. die folgenden Varianten *)
- (* normaler DIR-FCB: *)
- 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15:
- (fname : ARRAY[1..11] OF CHAR; (* Dateiname *)
- extend : BYTE;
- system : ARRAY[1..2] OF BYTE;
- reccnt : BYTE;
- fat : ARRAY[0..15] OF BYTE);
- (* eXtended FCB: *)
- 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31:
- (xfname : ARRAY[1..11] OF CHAR; (* wieder Dateiname! *)
- pasmod : BYTE; (* Password-Modus: bewirkt fuer Datei
- folgenden Schutz, wenn kein Password
- angegeben wird:
- Bit 7: kann nicht gelesen werden
- 6: lesen, aber nicht schreiben
- 5: obiges, aber nicht loeschen,
- umbenennen etc. *)
- xsystem: ARRAY[1..3] OF BYTE;
- fpassw : ARRAY[1..8] OF CHAR; (* das Datei-"Password" *)
- resvd : ARRAY[1..8] OF BYTE); (* reservierd *)
- 32: (* Directory-(Volume-) Label: *)
- (dname : ARRAY[1..11] OF CHAR; (* Directory-Name *)
- dirlab : BYTE; (* Bit 7: Password fuer geschuetzte Da-
- teien verlangen.
- 6: Zugriffszeit festhalten.
- 5: Updatezeit festhalten.
- 4: Erstellungszeit festhalten.
- 0: Directory-Label existiert *)
- systemd: ARRAY[1..3] OF BYTE;
- dpassw : ARRAY[1..8] OF CHAR; (* das Disk-"Password" *)
- cdate, (* Datum/Zeit der Erstellung *)
- ctime,
- udate, (* Datum/Zeit der Sicherung *)
- utime : INTEGER);
- 33: (* SFCB existierd an jeder 4. Position im Directory
- und enthaelt die Datum-/Zeitstempel der 3 vorher-
- gehenden Directory-Eintraege: *)
- (datim : ARRAY[0..2] OF
- RECORD
- cdate, ctime, (* s. o. *)
- udate, utime : INTEGER;
- pasmod,
- resvd : BYTE;
- END;
- rescd : BYTE);
- END; (* DIR_FCB *)
-
- DTA_Rec = ARRAY[0..3] OF DIR_FCB;
- (* aus Portabilitaets-Gruenden muss die DTA dynamisch verwaltet werden: *)
- DTA_Ptr = ^DTA_Rec;
- (* die von der Bibliothek verwendete, interne *)
- Dir_Rec = RECORD (* Representation eines Dateieintrages: *)
- name : STRING[8];
- ext : STRING[3];
- time : Time_Str;
- date : Date_Str;
- size : REAL;
- attr : BYTE;
- END;
- Dir_Typ = RECORD (* und ein ganzes Verzeichnis: *)
- num : 0..DirSizeMax; (* Anz. gefundener Eintraege *)
- items : ARRAY[1..DirSizeMax] OF Dir_Rec;
- END;
- (* ----------------------------------------------------------------------- *)
- (* DIRCPTYP.PAS *)