On the first IBM PC INT 15h drove the cassette port. The AT reused the vector for everything new that did not fit elsewhere: services for memory above 1 MB, timing, the joystick, and hooks that the BIOS calls so that other software can watch what it does. Later machines kept adding functions, so what is available depends on the BIOS; an unknown function returns CF = 1, usually with AH = 86h (or 80h on some machines).
| AH | Service |
|---|---|
| 4Fh | keyboard intercept: called by INT 09h with each scan code |
| 83h | event wait: set a flag after a time |
| 84h | joystick |
| 86h | wait CX:DX microseconds |
| 87h | copy a block to or from extended memory |
| 88h | size of extended memory |
| 89h | switch to protected mode |
| 90h / 91h | device busy / ready hooks for multitasking |
| C0h | system configuration table |
| E8h (AX=E820h) | memory map, on 386 and later BIOSes |
The hooks work the other way round from the services: the BIOS calls INT 15h itself, and a program that hooks the vector gets a look first. The keyboard handler calls AH=4Fh with each scan code in AL, and a hook can change or swallow the key; the disk BIOS calls AH=90h before waiting for a drive so that a multitasker can run something else meanwhile. A hook passes everything it does not handle on to the old vector.
On an 8086 PC or XT there is little here: DOSBox-X's BIOS emulates an AT-class machine and has the functions above. Always test CF after the call before trusting a result.