TL;DR: MS-DOS is a vendor independent DOS and IO.SYS is its abstraction layer encapsulating all machine dependent parts.
If DOS would direct access the ROM BIOS it would be specific to the IBM-PC, unable to be ported to any other machine - at least not without emulating the IBM PC-BIOS.
The Details
IO.SYS is an essential part of MS-DOS that contains the default MS-DOS device drivers.
No, not really. DOS was made before 'device drivers' were a thing. IO.SYS contains the machine dependent part of DOS while MSDOS.SYS is the device independent part. Since the IBM-PC provides a ROM-BIOS, IO.SYS is barely a wrapper for ROM routines. On other computers the ROM only contained a boot-loader (and sometimes some diagnostics), so the IO.SYS was much larger, containing all low level services DOS needs.
But eventually applications started generating graphical interfaces and when they tried to use BIOS graphical routines in the original IBM PC BIOS they found that the routines were so slow (they were badly written) that they had no choice but to write into video memory directly to achieve acceptable performance.
These are routines of the ROM-BIOS the PC provided. Also, not really slow either (*1). DOS does not provide any graphical services, nor does it direct hardware access. After all, DOS is designed as a machine independent layer to allow portable programs (*2), thus covering all hardware dependent details for the services it provides.
So, the question is what are the drivers in the IO.SYS file for?
For all services DOS provides:
- Memory Management
- Disk access
- File system services
- File handling
- Console interface
- Serial interface(s)
- Printer interface (*3)
- Date/Time
Based on the argument of slow routines for video memory access the only drivers in the IO.SYS file should be for video memory access
IO.SYS does not provide video memory access. It provides a console (text) interface (*4) and a screen handling akin to a dumb terminal (*5).
If not, what was the need for the IO.SYS or the IBMBIO.COM file to include drivers for a device when BIOS already provided functionality to access that device(other than video memory)?
ROM-BIOS is an IBM-PC specific item. MS-DOS is device independent. It was developed on a different machine than the PC (*6) and intended to run on any 8086 compatible. MS-DOS never provided any graphics interface
There is a comment to the question linked above which claims that not all of BIOS was in ROM and a part of it might have instead been stored in the IO.SYS file. Is that accurate?
Sure. it contains everything DOS needs. How it's delivered depends on each implementation - after all, it is the implementation (hardware) dependent part of MS-DOS. But its job is only that, providing what DOS needs to deliver its services. If a machine (like the IBM-PC) contains ROMs with additional services, not used by DOS, then the IO.SYS for that machine will not contain any wrapppper. Likewise, all services where there are no ROM routines (or where they should be not used), are at whole or in part in IO.SYS
The important part stays: IO.SYS is the BIOS of DOS and encapsulates all machine specific code
In addition, all of that depends on your value of 'BIOS', as BIOS is a less sharp defined term, depending on the viewpoint taken when using it. For MSDOS.SYS IO.SYS is the file providing its BIOS. It had no assumption about another layer of BIOS in ROM (or where ever). When people talk about BIOS it usually means the ROM-BIOS. and so on.
Part of the confusion about this comes from CP/M days. Here the layers were clearly named.
- BDOS is the machine independent DOS, supplied by Digital Research, while
- BIOS is the machine dependent part, supplied by every manufacturer.
The convention was copied (like the whole DOS) by Paterson when creating 86-DOS. But then IBM named their ROM system as well BIOS, and confusion started.
In IBM's and Microsoft's defence it may be helpful to remember that IBM did develop this without telling Microsoft anything about - they created, in good faith, what they thought might be a good abstraction layer for all capabilities of the new machine. To ease adaption of an OS. Of course, as the hardware manufacturer they were, there was no intention to make this layer machine independent.
*1 - The ROM-BIOS routines were in them self not slow. They were only very basic. For graphics they provided nothing but
- set graphics mode
- clear screen
- set colour
- set pixel
- test pixel
And while CS-theory makes no difference between a routine drawing a 10x20 square at once, or calling the set pixel routine 200 times, real life application do notice. Anyone who has ever replaced 200 OS calls by storing 40 bytes will agree :)) The same is true for text display as well, albeit to a way lower degree.
Bottom line: PC-BIOS wasn't slow, it just did not supply any operations past the bare minimum, thus not supporting higher level optimizations.
*2 - As long as there's an 8086 compatible CPU.
*3 - Not necessary parallel.
*4 - Char-out/char-in, test for input, collect a line
*5 - I.e. a type ahead buffer and CR/LF/FF/BS handling.
*6 - SCP developed the base for MS-DOS, later 86-DOS (ala QDOS), on one of their 8086 S100 Boards.