DRM contains the number of directory entries of the disk less one. Again, the directory entries
are numbered from 0 to DRM (0-127 or 0-7FH for the QDDS format).
AL0 and AL1 contain the first two bytes of the allocation vector for the drive for which the DPB
applies. These two bytes are copied into the allocation vector when the drive is logged in.
Remembering that the directory occupies the first block or two on the disk we need to reserve the
required number of blocks by filling in the appropriate bits in the allocation vector. In our case,
we only need to reserve one block and this has been done by setting bit 7 of AL0, hence the valve
80H. Clearly, we can now see that a maximum of 16 blocks may be reserved for directory entries (by
setting all 16 bits in AL0 and AL1). With a 1K block size, a maximum of 512 directory entries may
be allocated at 32 directory entries in each block. If a 16K block size is used, the maximum number
of directory entries will now be 8192.
CKS is known as the check size and simply tells the BDOS the length of the checksum vector for
the currently logged in drive. If fixed media drives are in use, the value of CKS may be set to
zero to prevent directory checking.
OFF is the number of system tracks on the disk. This figure depends upon the physical disk
format and the CP/M system size. Clearly, a single density disk will require more system tracks
than a double density disk in order to save the system. As an example, the SDDS format 3 system
tracks, the QDDS and QDSS formats have 2 and the DDDS format has 1. The discrepancy between the QD
and DD formats is again because of the apparent length of the tracks in the DD which uses the
cylindrical method of disk access. CP/M uses the OFF parameter when calculating track numbers for
pending read or write so that it effectively ignores system tracks. This is particularly useful
whee partitioning a high capacity drive (i.e. a Winchester) into a number of logical drives. If,
say, the first 50 tracks are defined as logical drive A, logical drive B could have a value of 50
for the OFF parameter so that it would start at the 51st track of the physical drive.
The CP/M 3 DPB
Now that we have exhausted the CP/M 2.2 Disk Parameter Block, we can now examine the CP/M 3 DPB.
An example of the later is given below:
|0028H||40||;||SPT||–||CP/M Sectors (128 bytes) per track|
|05H||5||;||BSH||–||Block Shift Factor|
|00C4H||196||;||DSM||–||Disk Size in blocks-1|
|007FH||127||;||DRM||–||Number of directory entries-1|
|0002H||2||;||OFF||–||Number of system tracks on disk|
|02H||2||;||PSH||–||Physical Record Shift Factor|
|03H||3||;||PHM||–||Physical Record Mask|
A brief examination of the CP/M 3 Disk Parameter Block will reveal that it is identical to the
CP/M 2.2 DPB apart from the last two entries so I shall only explain these additions.
PSH is the physical record shift factor and is described by Digital Research at being
LOG2(physical sector size/128). For the Gemini QDDS format which uses 512 byte physical sectors,
this value is 2.
PHM is the physical record mask and calculated to be (physical sector size/128)-1.
PSH and PHM are used in exactly the same way as BLM sod BSH except that instead of converting
CP/M records and extents to block numbers, they are now converting CP/M records to physical sector
numbers. Imagine that we have extracted a block and CP/M record number from the directory using
BSH, BLM and EXM. The value that we obtained when explaining BSH and BLM were block number 36 on
the disk and record number 11 within that block.
There are 32 CP/M record in the block numbered from 0 to 31 as described before. Additional,
we now know that there are eight physical sectors (of 512 bytes each) in the block, each containing