1CPM(5)                           File formats                           CPM(5)
2
3
4

NAME

6       cpm - CP/M disk and file system format
7

DESCRIPTION

9   Characteristic sizes
10       Each CP/M disk format is described by the following specific sizes:
11
12              Sector size in bytes
13              Number of tracks
14              Number of sectors
15              Block size
16              Number of directory entries
17              Logical sector skew
18              Number of reserved system tracks (optional)
19              Offset to start of volume (optional and not covered by operating
20              system, but disk driver specific)
21
22       A block is the smallest allocatable storage unit.  CP/M supports  block
23       sizes  of  1024, 2048, 4096, 8192 and 16384 bytes.  Unfortunately, this
24       format specification is not stored on the disk and there  are  lots  of
25       formats.   Accessing  a  block  is  performed by accessing its sectors,
26       which are stored with the given software skew.  cpmtools always  counts
27       sectors  starting  with 0, as it deals with logical sectors.  CP/M uses
28       physical sectors in the skew table, which often start with 1.
29
30   Device areas
31       A CP/M disk contains four areas:
32
33              Volume offset (optional and not covered by operating system, but
34              disk driver specific)
35              System tracks (optional)
36              Directory
37              Data
38
39       The  system  tracks store the boot loader and CP/M itself.  In order to
40       save disk space, there are non-bootable formats which omit those system
41       tracks.   The  term  disk capacity always excludes the space for system
42       tracks.  Note that there is no bitmap or list for  free  blocks.   When
43       accessing  a  drive for the first time, CP/M builds this bitmap in core
44       from the directory.
45
46       A hard disk can have the additional notion of a volume offset to locate
47       the  start  of the drive image (which may or may not have system tracks
48       associated with it).  The base unit for volume  offset  is  byte  count
49       from the beginning of the physical disk, but specifiers of K, M, T or S
50       may be appended to denote kilobytes, megabytes, tracks or sectors.   If
51       provided, a specifier must immediately follow the numeric value with no
52       whitespace.  For convenience upper and lower case are both accepted and
53       only  the first letter is significant, thus 2KB, 8MB, 1000trk and 16sec
54       are valid values.  The offset must appear subsequent to  track,  sector
55       and sector length values for the sector and track units to work.
56
57       Note that it is possible to reserve space between the directory and the
58       beginning of data.  Although typically data follows the directory, some
59       systems  used  this  to  store  extra data instead of using more system
60       tracks (see the fields ALV0 and ALV1 in the DPB).
61
62   Directory entries
63       The directory is a sequence of directory entries (also called extents),
64       which contain 32 bytes of the following structure:
65
66              St F0 F1 F2 F3 F4 F5 F6 F7 E0 E1 E2 Xl Bc Xh Rc
67              Al Al Al Al Al Al Al Al Al Al Al Al Al Al Al Al
68
69       St is the status; possible values are:
70
71              0-15:  used  for file, status is the user number.  CP/M 2.2 only
72              documents 0-15 and CCP and PIP only offer those,  but  the  BDOS
73              allows to use 0-31.
74              16-31:  used  for  file,  status is the user number (P2DOS, CP/M
75              2.2) or used for password extent (CP/M 3 or higher)
76              32: disc label
77              33: time stamp (P2DOS)
78              0xE5: unused
79
80
81       F0-E2 are the file name and its extension.  They  may  consist  of  any
82       printable  7  bit ASCII character but: < > . , ; : = ? * [ ].  The file
83       name must not be empty, the extension may be empty.   Both  are  padded
84       with  blanks.   The  highest bit of each character of the file name and
85       extension is used as attribute.   The  attributes  have  the  following
86       meaning:
87
88              F0: requires set wheel byte (Backgrounder II)
89              F1:  public  file  (P2DOS, ZSDOS), forground-only command (Back‐
90              grounder II)
91              F2: date stamp (ZSDOS), background-only  commands  (Backgrounder
92              II)
93              F7: wheel protect (ZSDOS)
94              E0: read-only
95              E1: system file
96              E2: archived
97
98       Public files (visible under each user number) are not supported by CP/M
99       2.2, but there is a patch and some free CP/M clones support them  with‐
100       out any patches.
101
102       The  wheel  byte is (by default) the memory location at 0x4b.  If it is
103       zero, only non-privileged commands may be executed.
104
105       Xl and Xh store the extent number.  A file may use more than one direc‐
106       tory  entry,  if  it  contains more blocks than an extent can hold.  In
107       this case, more extents are allocated and each of them is numbered  se‐
108       quentially  with  an  extent  number.  If a physical extent stores more
109       than 16k, it is considered to contain multiple  logical  extents,  each
110       pointing  to  16k  data, and the extent number of the last used logical
111       extent is stored.  Note: Some formats decided to always store only  one
112       logical  extent  in a physical extent, thus wasting extent space.  CP/M
113       2.2 allows 512 extents per file, CP/M 3 and higher allow  up  to  2048.
114       Bit 5-7 of Xl are 0, bit 0-4 store the lower bits of the extent number.
115       Bit 6 and 7 of Xh are 0, bit 0-5 store the higher bits  of  the  extent
116       number.
117
118       Rc  and  Bc  determine the length of the data used by this extent.  The
119       physical extent is divided into logical extents, each of them being 16k
120       in  size (a physical extent must hold at least one logical extent, e.g.
121       a blocksize of 1024 byte with two-byte block pointers is not  allowed).
122       Rc  stores  the number of 128 byte records of the last used logical ex‐
123       tent.  Bc stores the number of bytes in  the  last  used  record.   The
124       value  0  means 128 for backward compatibility with CP/M 2.2, which did
125       not support Bc.  ISX records the number of unused instead of used bytes
126       in Bc.  This only applies to files with allocated blocks.  For an empty
127       file, no block is allocated and Bc 0 has no meaning.
128
129       Al stores block pointers.  If the disk capacity minus boot  tracks  but
130       including the directory area is less than 256 blocks, Al is interpreted
131       as 16 byte-values, otherwise as 8 double-byte-values.  Since the direc‐
132       tory area is not subtracted, the directory area starts with block 0 and
133       files can never allocate block 0, which is why this value can be  given
134       a  new  meaning:  A  block pointer of 0 marks a hole in the file.  If a
135       hole covers the range of a full extent, the extent will  not  be  allo‐
136       cated.  In particular, the first extent of a file does not neccessarily
137       have extent number 0.  A file may not share blocks with other files, as
138       its  blocks  would be freed if the other files is erased without a fol‐
139       lowing disk system reset.  CP/M returns EOF when  it  reaches  a  hole,
140       whereas UNIX returns zero-value bytes, which makes holes invisible.
141
142   Native time stamps
143       P2DOS  and  CP/M  Plus  support  time  stamps, which are stored in each
144       fourth directory entry.  This entry contains the time  stamps  for  the
145       extents  using the previous three directory entries.  Note that you re‐
146       ally have time stamps for each extent, no matter if it is the first ex‐
147       tent of a file or not.  The structure of time stamp entries is:
148
149              1 byte status 0x21
150              8 bytes time stamp for third-last directory entry
151              2 bytes unused
152              8 bytes time stamp for second-last directory entry
153              2 bytes unused
154              8 bytes time stamp for last directory entry
155
156       A time stamp consists of two dates: Creation and modification date (the
157       latter being recorded when the file is closed).  CP/M Plus further  al‐
158       lows  optionally to record the access instead of creation date as first
159       time stamp.
160
161              2 bytes (little-endian) days starting with 1 at 01-01-1978
162              1 byte hour in BCD format
163              1 byte minute in BCD format
164
165       All time stamps are stored in local time.
166
167   DateStamper time stamps
168       The DateStamper software added functions to the  BDOS  to  manage  time
169       stamps  by  allocating a read only file with the name "!!!TIME&.DAT" in
170       the very first directory entry, covering the very  first  data  blocks.
171       It  contains one entry per directory entry with the following structure
172       of 16 bytes:
173
174              5 bytes create datefield
175              5 bytes access datefield
176              5 bytes modify datefield
177              1 byte magic number/checksum
178
179       The magic number is used for the  first  7  entries  of  each  128-byte
180       record  and contains the characters !, !, !, T, I, M and E.  The check‐
181       sum is used on every 8th entry (last entry in 128-byte record)  and  is
182       the  sum of the first 127 bytes of the record.  Each datefield has this
183       structure:
184
185              1 byte BCD coded year (no century, so it is  sane  assuming  any
186              year < 70 means 21st century)
187              1 byte BCD coded month
188              1 byte BCD coded day
189              1  byte BCD coded hour or, if the high bit is set, the high byte
190              of a counter for systems without real time clock
191              1 byte BCD coded minute, or the low byte of the counter
192
193
194   Disc labels
195       CP/M Plus support disc labels, which are stored in an arbitrary  direc‐
196       tory entry.  The structure of disc labels is:
197
198              1 byte status 0x20
199              F0-E2 are the disc label
200              1  byte  mode: bit 7 activates password protection, bit 6 causes
201              time stamps on access, but 5 causes  time  stamps  on  modifica‐
202              tions,  bit  4  causes  time stamps on creation and bit 0 is set
203              when a label exists.  Bit 4 and 6 are exclusively set.
204              1 byte password decode byte: To decode the  password,  xor  this
205              byte  with  the  password  bytes  in reverse order.  To encode a
206              password, add its characters to get the decode byte.
207              2 reserved bytes
208              8 password bytes
209              4 bytes label creation time stamp
210              4 bytes label modification time stamp
211
212
213   Passwords
214       CP/M Plus supports passwords, which are stored in an  arbitrary  direc‐
215       tory entry.  The structure of these entries is:
216
217              1 byte status (user number plus 16)
218              F0-E2 are the file name and its extension.
219              1 byte password mode: bit 7 means password required for reading,
220              bit 6 for writing and bit 5 for deleting.
221              1 byte password decode byte: To decode the  password,  xor  this
222              byte  with  the  password  bytes  in reverse order.  To encode a
223              password, add its characters to get the decode byte.
224              2 reserved bytes
225              8 password bytes
226
227

SEE ALSO

229       mkfs.cpm(1), fsck.cpm(1), fsed.cpm(1), cpmls(1)
230
231
232
233CP/M tools                       Jan 22, 2021                           CPM(5)
Impressum