// C-like pseudo code for interrupt handler // // Some of the things needed to write an interrupt handler cannot be // expressed in high-level languages (e.g., reading the cause // register, saving the assembler temporary, returning from an // exception). This is why this kind of code (usually part of the // operating system) has to be written in assembly). void interrupt_handler() { // save assembler temporary (so we don't accidentally overwrite it) // save $a0, $a1 registers (so we have some registers to work with) int cause_register = get_cause_register(); // read a coprocessor register if (((cause_register >> 2) & 0xf) != 0) { // handle exception return; } // otherwise it was an interrupt while (1) { cause_register = get_cause_register(); // it could have changed if (cause_register == 0) { break; // no more unhandled interrupts } if (cause_register & COLLISION_INTERRUPT_MASK) { // bonk interrupt (we ran into a wall) set_relative_angle(70); // write a couple I/O registers set_velocity(10); // write a different I/O register acknowledge_bonk_interrupt(); continue; } if (cause_register & OTHER_INTERRUPT_MASK) { // handle other interrupt // ... } } // restore $a0, $a1 // restore assembler temporary return_from_exception(); }