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

SEE ALSO

219       mkfs.cpm(1), fsck.cpm(1), fsed.cpm(1), cpmls(1)
220
221
222
223CP/M tools                     October 25, 2014                         CPM(5)
Impressum