1CPM(5) File formats CPM(5)
2
3
4
6 cpm - CP/M disk and file system format
7
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
219 mkfs.cpm(1), fsck.cpm(1), fsed.cpm(1), cpmls(1)
220
221
222
223CP/M tools October 25, 2014 CPM(5)