2 ; Oliver Schmidt, 2012-01-18
4 ; void __fastcall__ set_irq (irq_handler f, void *stack_addr, size_t stack_size);
5 ; void reset_irq (void);
8 .export _set_irq, _reset_irq
9 .interruptor clevel_irq, 1 ; Export as low priority IRQ handler
12 .include "zeropage.inc"
19 ; Keep clevel_irq from being called right now
22 ; Set irq stack pointer to stack_addr + stack_size
32 ; Set irq vector to irq_handler
35 stx irqvec+2 ; Set the user vector
37 ; Restore interrupt requests and return
47 sta irqvec+2 ; High byte is enough
55 ; Is C level interrupt request vector set?
56 lda irqvec+2 ; High byte is enough
58 clc ; Interrupt not handled
61 ; Save our zero page locations
68 ; Set C level interrupt stack
74 ; Call C level interrupt request handler
77 ; Copy back our zero page content
84 ; Mark interrupt handled / not handled and return
90 ; ---------------------------------------------------------------------------
94 irqvec: jmp $00FF ; Patched at runtime
96 ; ---------------------------------------------------------------------------