In XINU, interrupt servicing is divided into two halves, the low-level
routines, and the high-level routines.
The low-level routines are the ones invoked directly as a result of
the interrupt (their addresses are contained in the interrupt dispatch
table). These routines are responsible for saving registers, identifying
the interrupting device, calling the appropriate high-level routine, restoring
the registers, and then calling the RTI instruction. These routines are
written in assembly (hopefully the need for this is obvious), and are called
interrupt dispatchers (which makes sense as they dispatch or invoke
the high-level routines).
The high-level routines are the ones that do the real work of servicing
the device. While the low-level routines are largely device-independent,
the high-level routines are not. These routines can usually be written
in a high-level language.
Splitting the interrupt handling code into a low-level and high-level
halves, while not necessary, is a good idea. It enables us to minimize
the use of assembly code (good for obvious reasons), and to separate the
device dependant code from the device independent code.