Yah you would pretty much have to do it in C or ASM. On the Amiga for example you had to have a piece of executable binary which usually was coded in Assembler, and the pointer to it had to be placed in a particular memory location that acts as an interrupt jump register. Then the interrupt had to be activated. The piece of code had to preserve any registers it used and restore them after its processing and then trigger the interrupt to be cleared. Then processing would resume as normal. They were very handy for making things synchronized to the vertical blank interrupt. Also the blitter (gfx render hardware) had interrupts, as did the disk-drive DMA. It's something that's pretty close to the hardware so I don't know how easy it would be to implement in max given its a high level language.