Did CPM support custom hardware using device drivers?
Yes, of course, that's what the BIOS was for.
The title is somewhat misleading, as from the question body it seems you're asking about loadable device drivers, where loadable means that drivers were loaded at startup (or later) from separate binaries and linked into the system to offer their services. Further it seems as if the question is about CP/M prior to 1981, the time MS-DOS was introduced, thus CP/M 2.2 and MP/M. Right?
Did CPM have OS support for device drivers?
Yes, as part of the customized BIOS.
No, CP/M did not have loadable device drivers (*1).
All drivers were a part of the BIOS (Assembly) code. DR supplied sample code to customize the BIOS for system builders (buyers of a non dedicated CP/M licence).
Adding new devices worked much the same way on CP/M and MS-DOS 1.x. In both cases new devices had to fit the existing structure of BIOS calls (17 for CP/M 2.2) (*2). New devices must be compiled into the BIOS (*3)
Did DOS ver1 leave device drivers out, or was DOS v2 device support a new advancement over CPM?
Loadable drivers were newly added to MS-DOS 2.0. To some degree it was part of the step toward a unixoid system structure for DOS, like adding subdirectories even including a virtual /dev
directory for devices.
Except, it never went fully that way. Much was added (including IOCTRL), but device drivers still had to fit for most parts the existing structure, which wasn't always up to the task. For the CD-ROM driver this meant that it had to hook itself as a network driver (introduced with DOS 3.1) and present the disk as a remote directory assigned to a drive letter instead of simply a disk.
*1 - There's a 'yes but' part: With GSX, CP/M introduced loadable device drivers much like MS-DOS 2.0, but that's after MS-DOS was created.
*2 - Another 'but': With MP/M and later CP/M 3.0 (CP/M Plus), the Character Device Table was introduced. Here an arbitrary number of character devices could be added by system builders, using 6 character names to identify them. Assignment to the logical devices was done using the DEVICE utility and controlled by according BIOS calls.
So while for block devices system builders had to assign a hard disk number to a new device, they could use sounding names for character devices. The default table size was 12 entries for each (In/Out), enabling limited run time extension within the existing structure.
*3 - It was possible (and done) to add new devices during run time by hooking the BIOS entry table and catching/redirecting calls for a drive. Unlike MS-DOS, CP/M did not provide a TSR functionality, so everything dynamic was up to detailed system knowledge and patching.
IO.SYS
,MSDOS.SYS
andCOMMAND.COM
(or the PC-DOS filesIBMIO.SYS
,IBMDOS.SYS
andCOMMAND.COM
). Although there was another layer of system calls below the OS, still called the BIOS, MS-DOS was also available for clones without a PC BIOS, and came with a differentIO.SYS
. Windows 95 changedMSDOS.SYS
into a text configuration file.