Here's a "mostly complete" summary of the BIOS's device support:
DISK IO:
- Disk IO for floppy and hard disk. This mostly works most of the time. In some cases it doesn't work - for example, if you've got 2 different SCSI cards then the ROMs in both the SCSI cards "fight" and you can expect one to lose.
- Disk IO for CD-ROM. This mostly only works if you've booted from CD-ROM (but even when you have booted from CD-ROM it may only work for one CD-ROM when there's 2 or more). If you didn't boot from CD-ROM most BIOSs won't provide any CD-ROM support (but in theory you might be lucky for some BIOSs).
- Disk IO for USB devices. This mostly only works if you've booted from a USB device (but even when you have booted from a USB device it may only work for one when there's 2 or more). If you didn't boot from USB most BIOSs won't provide any support.
- Network cards. This mostly only works if you've booted from network (but even when you have booted from network it only works for one network card when there's 2 or more). If you didn't boot from network there is no support.
- Serial ports and parallel ports. These are supported by the BIOS, but the BIOS services are virtually unusable. The problem is that the BIOS uses polling (no input/output buffering or IRQs) which causes data loss if you have to do anything with the data you've received due to the (potentially) high number of "bytes per second".
- Modems (including data, voice and fax). No support (beyond unusable serial port support).
- PS/2 keyboard. This should work (but I do have one computer here where the BIOS doesn't support it); but only when the keyboard layout is "US QWERTY" (which mostly means that it is supported but doesn't work for most people).
- PS/2 mouse. Not supported (there are no services like "int 0x16" provided for mouse).
- USB keyboard. This may or may not be supported by BIOS (depends on how old the BIOS is); but if it is supported it doesn't work for most people ("US QWERTY" only).
- USB mouse. Not supported (there are no services like "int 0x16" provided for mouse).
- All other input devices (touchpad, touchscreen, trackball, joystick, bar-code scanner, etc). Not supported.
- Sound cards (recording digitized sound). Not supported.
- Cameras (recording video or just taking pictures). Not supported.
- Scanners. Not supported.
- Video cards. Sort of supported, but only one. Poor control over video modes (e.g. normally you can't even set the video mode to suit the monitor's native resolution, and the monitor's EDID is typically ignored so it's a pain in the neck just making sure a video mode is usable). No support for anything else (2D/3D acceleration, hardware pointer, MPEG decoder, etc). Note: There was a "VESA VBE/AF" specification designed to try to provide support for some things (hardware pointer, polygons), but nobody ever implemented it
- Braille displays. No support. For some, you can sort of make them work by throwing ASCII at the serial port.
- "PC speaker". The BIOS sort of supports this a little bit (usually you can ask the BIOS to print an ASCII bell character and get a beep). There's no control over pitch/frequency or duration.
- Sound cards (playback of digitized sound or midi). Not supported. Note: There was a "VESA VBE/AI" specification designed to try to provide support for some things, but like a lot of VESA's standards nobody ever implemented it
- Printers. No support. For old printers that connect to parallel port or serial port, you can sort of make them work sometimes by throwing ASCII at the parallel/serial port (no graphics, no colour, no page layout control, etc).
- Timer. There's support for "ticks since midnight", but this is very low precision (55 ms) and can have problems each day at midnight. It doesn't support delays (e.g. put the computer into a power saving state for some amount of time).
- Time and date. This is supported, but it has the same problems as the RTC (you can't know which time zone and daylight savings support is a complete disaster). If you want both the time and date, then it's racey (e.g. there's no "get time and date" so you have to be careful near midnight and need to get the date, then time, then get the date again).
- IRQ controllers. The PIC is supported sort of. No support for IO APIC, MSI, etc.
- Memory. Almost no support for memory above 0x00100000, except for a "Copy Extended Memory" function. Ironically this function is so hard to use that it's easier (and more reliable) to do it yourself.
- Other CPUs. Not supported (everything is "boot CPU only", and there isn't even any "tell other CPU to execute foo" service).
- A20. Usually supported by BIOS (but it's best to have fall-back "do it yourself" code in case BIOS doesn't support it).
- PCI. Minimal support for reading/writing to PCI configuration space (but it's easier to do it yourself).
- Any sort of hot-plug (e.g. including inserting/removing PS/2 devices, and USB devices if the BIOS happens to actually support any USB devices). Not supported.
- Power management. Minimal support (mostly just "self protection" rather than actual power management).
Cheers,
Brendan