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
11 .importzp __ZP_START__
13 .include "zeropage.inc"
18 ; ---------------------------------------------------------------------------
22 irqvec: jmp $00FF ; Patched at runtime
24 ; ---------------------------------------------------------------------------
30 zpsave: .res zpsavespace
32 ; ---------------------------------------------------------------------------
36 ; Keep clevel_irq from being called right now
39 ; Set irq stack pointer to stack_addr + stack_size
49 ; Set irq vector to irq_handler
52 stx irqvec+2 ; Set the user vector
54 ; Restore interrupt requests and return
64 sta irqvec+2 ; High byte is enough
72 ; Is C level interrupt request vector set?
73 lda irqvec+2 ; High byte is enough
75 clc ; Interrupt not handled
78 ; Save our zero page locations
79 @L1: ldx #.sizeof(::zpsave)-1
80 @L2: lda __ZP_START__,x
85 ; Set C level interrupt stack
91 ; Call C level interrupt request handler
94 ; Copy back our zero page content
95 ldx #.sizeof(::zpsave)-1
101 ; Mark interrupt handled / not handled and return