CP/M Disc Parameter Header
In CP/M, the DPH is a BIOS structure containing information about a disc drive. The actual format of the DPH is version-dependent.
Individual BIOSes may add extra fields to a DPH, before the start or after the end.
CP/M 2 DPH
This is the format of the DPH in CP/M 2 and CP/M-86 v1.x. The DPH in CP/M-8000 and CP/M-68K is similar but all the addresses are 32 bits wide.
0000 DW xlt ;Address of sector translation table 0002 DW 0,0,0 ;Used as workspace by CP/M 0008 DW dirbuf ;Address of a 128-byte sector buffer; this is ;the same for all DPHs in the system. 000A DW dpb ;Address of the DPB ;giving the format of this drive. 000C DW csv ;Address of the directory checksum vector ;for this drive. 000E DW alv ;Address of the allocation vector ;for this drive.
CP/M 3 DPH
This is the format of the DPH in 8-bit CP/M 3:
0000 DW xlt ;Address of sector translation table 0002 DW 0,0,0,0 ;Used as workspace by CP/M 000A DB mf ;Media flag. If the BIOS has an interrupt-driven ;'disc changed' system, then changing a disc in this ;drive should set this flag (and the 'media changed' ;flag in the SCB) to 0FFh. 000B DB 0 ;Workspace 000C DW dpb ;Address of the DPB ;giving the format of this drive. 000E DW csv ;Address of the directory checksum vector ;for this drive (in bank 0). 0010 DW alv ;Address of the allocation vector ;for this drive (in bank 0). 0012 DW dirbcb ;Address of the directory buffer chain. 0014 DW dtabcb ;Address of the data buffer chain. 0016 DW hash ;Address of the hash buffer for this drive. 0018 DB hbank ;Bank number of the hash buffer.
CP/M-86 Plus DPH
This is the format of the DPH in the documentation for CP/M-86 Plus; the same format is used by Personal CP/M-86 and DOS Plus.
0000 DW xlt ;Address of sector translation table 0002 DB 0,0,0 ;Used as workspace by CP/M 0005 DB dopen ;Driver door opened. If the BIOS has an ;interrupt-driven 'disc changed' system, then ;changing a disc in this drive should set this flag ;(and the 'media changed' flag in the XIOS header). 0006 DW 0 ;Workspace 0008 DW dpb ;Address of the DPB ;giving the format of this drive. 000A DW csv ;Address of the directory checksum vector ;for this drive (in bank 0). 000C DW alv ;Address of the allocation vector ;for this drive (in bank 0). 000E DW dirbcb ;Address of the directory buffer chain. 0010 DW dtabcb ;Address of the data buffer chain. 0012 DW hash ;Segment of the hash buffer for this drive. 0014 DW init ;Offset of drive INIT routine in XIOS code segment. ;Entered with BX pointing at the DPH. 0016 DW login ;Offset of drive LOGIN routine in XIOS code segment. ;Entered with BX pointing at the DPH. 0018 DW read ;Offset of drive READ routine in XIOS code segment. ;Entered with BX pointing at the DPH and BP pointing ;to an I/O parameter block. 001A DW write ;Offset of drive WRITE routine in XIOS code segment. ;Entered with BX pointing at the DPH and BP pointing ;to an I/O parameter block. 001C DB unit ;The number of this drive as the controller sees it. 001D DB chnnl ;The number of the controller on which this drive is. 001E DB nflags ;The number of system flags used by this drive. If ;several drives share a controller, the DPH of the ;first drive should have this value set and the ;others should leave it as 0.
Checksum Vector
This is a buffer which CP/M will use to hold the checksum of each 128-byte record in the directory. If the checksum of a sector changes unexpectedly, the disc is assumed to have been changed.
If the disc is not removable, then there will be no such buffer, and its address in the DPH is 0.
Allocation Vector
This is a bitmap of used/free blocks on the drive. Under CP/M 2, there is one bit per block. Under CP/M 3, there may be one bit per block, or two.
Buffer Chains
In a non-banked CP/M 3, each BCB pointer (DIRBCB/DTABCB) points straight at a single Buffer Control Block. In a banked system, they each point at a word, which in turn points to the first BCB in a linked list.
The two BCB pointers can only be the same if this is a nonbanked version of CP/M 3 and the drive is a fixed disk.
The format of a BCB in 8-bit CP/M is:
0000 DB drive ;The drive using this buffer, 0FFh if empty. 0001 DB rec# ;Sector number using this buffer (24-bit). 0004 DB wflg ;Nonzero if buffer is dirty and must be written back. 0005 DB 0 ;Scratch byte. 0006 DW track ;Track the buffer comes from. 0008 DW sector ;Sector the buffer comes from. 000A DW buffer ;Address of the buffered data. 000C DB bank ;Bank of the buffered data (banked CP/M only). ;BCBs in the directory chain must be in bank 0. ;Data BCBs can be in any bank that the XMOVE/MOVE ;BIOS calls support. 000D DW link ;Address of next BCB in chain, 0 for none. ;(banked CP/M only).
In CP/M-86 Plus, Personal CP/M-86 and DOS Plus, it's similar:
0000 DB drive ;The drive using this buffer, 0FFh if empty. 0001 DB rec# ;Sector number using this buffer (24-bit). 0004 DB wflg ;Nonzero if buffer is dirty and must be written back. 0005 DB 0 ;Scratch byte. 0006 DW track ;Track the buffer comes from. 0008 DW sector ;Sector the buffer comes from. 000A DW buffer ;Address of the buffered data in the CP/M-86 data ;segment. 000C DW link ;Address of next BCB in chain, 0 for none. 000E DW rsvd ;Documented as "reserved". Holds the segment of a ;process table entry.
Hash Buffer
This is an optional hash table with 4 bytes per directory entry, used to speed up file access. If it is 0FFFFh there is no hash table.
I/O Parameter Block
The I/O Parameter Block is passed to the READ and WRITE routines in CP/M-86 Plus, Personal CP/M-86 and DOS Plus. It is formed:
bp+6 DD address ;Transfer address to read/write bp+10 DW sector ;First sector to read/write bp+12 DW track ;First track to read/write bp+14 DB drive ;Drive number bp+15 DB count ;Number of sectors to read/write.