2 ; 2012-01-18, Oliver Schmidt
3 ; 2015-08-22, Greg King
5 ; void __fastcall__ set_irq (irq_handler f, void *stack_addr, size_t stack_size);
6 ; void reset_irq (void);
9 .export _set_irq, _reset_irq
10 .interruptor clevel_irq, 1 ; Export as low priority IRQ handler
11 .import popax, __ZP_START__, jmpvec
13 .include "zeropage.inc"
18 ; ---------------------------------------------------------------------------
22 irqvec: jmp $00FF ; Patched at runtime
24 ; ---------------------------------------------------------------------------
30 zpsave: .res zpsavespace
32 ; ---------------------------------------------------------------------------
38 ; Keep clevel_irq from being called right now
41 ; Set irq stack pointer to stack_addr + stack_size
51 ; Set irq vector to irq_handler
54 stx irqvec+2 ; Set the user vector
56 ; Restore interrupt requests and return
66 sta irqvec+2 ; High byte is enough
74 ; Is C level interrupt request vector set?
75 lda irqvec+2 ; High byte is enough
77 clc ; Interrupt not handled
80 ; Save our zero page locations
81 @L1: ldx #.sizeof(::zpsave)-1
82 @L2: lda <__ZP_START__,x
93 ; Set C level interrupt stack
99 ; Call C level interrupt request handler
102 ; Mark interrupt handled / not handled
105 ; Restore our zero page content
106 ldx #.sizeof(::zpsave)-1
112 ; Restore jmpvec and return