trusty (5) cpm.5.gz

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)