Provided by: cpmtools_2.13-1_amd64 bug

NAME

       cpm - CP/M disk and file system format

DESCRIPTION

   Characteristic sizes
       Each CP/M disk format is described by the following specific sizes:

              Sector size in bytes
              Number of tracks
              Number of sectors
              Block size
              Number of directory entries
              Logical sector skew
              Number of reserved system tracks

       A  block  is  the  smallest  allocatable storage unit.  CP/M supports block sizes of 1024,
       2048, 4096, 8192 and 16384 bytes.  Unfortunately, this format specification is not  stored
       on  the  disk  and there are lots of formats.  Accessing a block is performed by accessing
       its sectors, which are stored with the given software skew.

   Device areas
       A CP/M disk contains three areas:

              System tracks (optional)
              Directory
              Data

       The system tracks store the boot loader and CP/M itself.  In order  to  save  disk  space,
       there  are  non-bootable  formats  which omit those system tracks.  The term disk capacity
       always excludes the space for system tracks.  Note that there is no  bitmap  or  list  for
       free  blocks.   When accessing a drive for the first time, CP/M builds this bitmap in core
       from the directory.

   Directory entries
       The 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
              Al Al Al Al Al Al Al Al Al Al Al Al Al Al Al Al

       St is the status; possible values are:

              0-15: used for file, status is the user number
              16-31: used for file, status is the user number (P2DOS) or used for password extent
              (CP/M 3 or higher)
              32: disc label
              33: time stamp (P2DOS)
              0xE5: unused

       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)
              F1: public file (P2DOS, ZSDOS), foreground-only command (Backgrounder II)
              F2: date stamp (ZSDOS), background-only commands (Backgrounder II)
              F7: wheel protect (ZSDOS)
              E0: read-only
              E1: system file
              E2: archived

       Public  files (visible under each user number) are not supported by CP/M 2.2, but there is
       a patch and some free CP/M clones support them without any patches.

       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.

       Al stores block pointers.  If the disk capacity is less than 256 blocks, Al is interpreted
       as  16  byte-values, otherwise as 8 double-byte-values.  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 necessarily 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.

   Time stamps
       P2DOS 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
              8 bytes time stamp for third-last directory entry
              2 bytes unused
              8 bytes time stamp for second-last directory entry
              2 bytes unused
              8 bytes time stamp for last directory entry

       A  time  stamp  consists  of  two  dates: Creation and modification date (the latter being
       recorded when the file is closed).  CP/M Plus further  allows  optionally  to  record  the
       access instead of creation date as first time stamp.

              2 bytes (little-endian) days starting with 1 at 01-01-1978
              1 byte hour in BCD format
              1 byte minute in BCD format

   Disc labels
       CP/M  Plus  support  disc  labels,  which are stored in an arbitrary directory entry.  The
       structure of disc labels is:

              1 byte status 0x20
              F0-E2 are the disc label
              1 byte mode: bit 7 activates password protection,  bit  6  causes  time  stamps  on
              access,  but  5  causes  time  stamps on modifications, bit 4 causes time stamps on
              creation and bit 0 is set when a label exists.  Bit 4 and 6 are exclusively set.
              1 byte password decode byte: To  decode  the  password,  xor  this  byte  with  the
              password  bytes  in reverse order.  To encode a password, add its characters to get
              the decode byte.
              2 reserved bytes
              8 password bytes
              4 bytes label creation time stamp
              4 bytes label modification time stamp

   Passwords
       CP/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)
              F0-E2 are the file name and its extension.
              1  byte password mode: bit 7 means password required for reading, bit 6 for writing
              and bit 5 for deleting.
              1 byte password decode byte: To  decode  the  password,  xor  this  byte  with  the
              password  bytes  in reverse order.  To encode a password, add its characters to get
              the decode byte.
              2 reserved bytes
              8 password bytes

SEE ALSO

       mkfs.cpm(1), fsck.cpm(1), fsed.cpm(1), cpmls(1)