|
NAMEcpm - CP/M disk and file system formatDESCRIPTIONCharacteristic sizesEach CP/M disk format is described by the following specific sizes:Sector size in bytes
Device areasA CP/M disk contains four areas:Volume offset (optional and not covered by operating system, but
disk driver specific)
A hard disk can have the additional notion of a volume offset to locate the start of the drive image (which may or may not have system tracks associated with it). The base unit for volume offset is byte count from the beginning of the physical disk, but specifiers of K, M, T or S may be appended to denote kilobytes, megabytes, tracks or sectors. If provided, a specifier must immediately follow the numeric value with no whitespace. For convenience upper and lower case are both accepted and only the first letter is significant, thus 2KB, 8MB, 1000trk and 16sec are valid values. The offset must appear subsequent to track, sector and sector length values for the sector and track units to work. Note that it is possible to reserve space between the directory and the beginning of data. Although typically data follows the directory, some systems used this to store extra data instead of using more system tracks (see the fields ALV0 and ALV1 in the DPB). Directory entriesThe directory is a sequence of directory entries (also called extents), which contain 32 bytes of the following structure:St F0 F1 F2 F3 F4 F5 F6 F7 E0 E1 E2 Xl Bc Xh Rc
0-15: used for file, status is the user number. CP/M 2.2 only
documents 0-15 and CCP and PIP only offer those, but the BDOS allows to use
0-31.
F0-E2 are the file name and its extension. They may consist of any printable 7 bit ASCII character but: < > . , ; : = ? * [ ]. The file name must not be empty, the extension may be empty. Both are padded with blanks. The highest bit of each character of the file name and extension is used as attribute. The attributes have the following meaning: F0: requires set wheel byte (Backgrounder II)
The wheel byte is (by default) the memory location at 0x4b. If it is zero, only non-privileged commands may be executed. Xl and Xh store the extent number. A file may use more than one directory entry, if it contains more blocks than an extent can hold. In this case, more extents are allocated and each of them is numbered sequentially with an extent number. If a physical extent stores more than 16k, it is considered to contain multiple logical extents, each pointing to 16k data, and the extent number of the last used logical extent is stored. Note: Some formats decided to always store only one logical extent in a physical extent, thus wasting extent space. CP/M 2.2 allows 512 extents per file, CP/M 3 and higher allow up to 2048. Bit 5-7 of Xl are 0, bit 0-4 store the lower bits of the extent number. Bit 6 and 7 of Xh are 0, bit 0-5 store the higher bits of the extent number. Rc and Bc determine the length of the data used by this extent. The physical extent is divided into logical extents, each of them being 16k in size (a physical extent must hold at least one logical extent, e.g. a blocksize of 1024 byte with two-byte block pointers is not allowed). Rc stores the number of 128 byte records of the last used logical extent. Bc stores the number of bytes in the last used record. The value 0 means 128 for backward compatibility with CP/M 2.2, which did not support Bc. ISX records the number of unused instead of used bytes in Bc. This only applies to files with allocated blocks. For an empty file, no block is allocated and Bc 0 has no meaning. Al stores block pointers. If the disk capacity minus boot tracks but including the directory area is less than 256 blocks, Al is interpreted as 16 byte-values, otherwise as 8 double-byte-values. Since the directory area is not subtracted, the directory area starts with block 0 and files can never allocate block 0, which is why this value can be given a new meaning: A block pointer of 0 marks a hole in the file. If a hole covers the range of a full extent, the extent will not be allocated. In particular, the first extent of a file does not neccessarily have extent number 0. A file may not share blocks with other files, as its blocks would be freed if the other files is erased without a following disk system reset. CP/M returns EOF when it reaches a hole, whereas UNIX returns zero-value bytes, which makes holes invisible. Native time stampsP2DOS and CP/M Plus support time stamps, which are stored in each fourth directory entry. This entry contains the time stamps for the extents using the previous three directory entries. Note that you really have time stamps for each extent, no matter if it is the first extent of a file or not. The structure of time stamp entries is:1 byte status 0x21
2 bytes (little-endian) days starting with 1 at 01-01-1978
DateStamper time stampsThe DateStamper software added functions to the BDOS to manage time stamps by allocating a read only file with the name "!!!TIME&.DAT" in the very first directory entry, covering the very first data blocks. It contains one entry per directory entry with the following structure of 16 bytes:5 bytes create datefield
1 byte BCD coded year (no century, so it is sane assuming any year
< 70 means 21st century)
Disc labelsCP/M Plus support disc labels, which are stored in an arbitrary directory entry. The structure of disc labels is:1 byte status 0x20
PasswordsCP/M Plus supports passwords, which are stored in an arbitrary directory entry. The structure of these entries is:1 byte status (user number plus 16)
SEE ALSOmkfs.cpm(1), fsck.cpm(1), fsed.cpm(1), cpmls(1)
Visit the GSP FreeBSD Man Page Interface. |