]> git.sur5r.net Git - cc65/blob - libsrc/common/interrupt.s
Added docs to set_irq / reset_irq.
[cc65] / libsrc / common / interrupt.s
1 ;
2 ; Oliver Schmidt, 2012-01-18
3 ;
4 ; void __fastcall__ set_irq (irq_handler f, void *stack_addr, size_t stack_size);
5 ; void reset_irq (void);
6 ;
7
8         .export         _set_irq, _reset_irq
9         .interruptor    clevel_irq, 1           ; Export as low priority IRQ handler
10         .import         popax
11
12         .include        "zeropage.inc"
13
14         .macpack        generic
15
16
17 .proc   _set_irq
18
19         ; Keep clevel_irq from being called right now
20         sei
21
22         ; Set irq stack pointer to stack_addr + stack_size
23         sta     irqsp
24         stx     irqsp+1
25         jsr     popax
26         add     irqsp
27         sta     irqsp
28         txa
29         adc     irqsp+1
30         sta     irqsp+1
31
32         ; Set irq vector to irq_handler
33         jsr     popax
34         sta     irqvec+1
35         stx     irqvec+2        ; Set the user vector
36
37         ; Restore interrupt requests and return
38         cli
39         rts
40
41 .endproc
42
43
44 .proc   _reset_irq
45
46         lda     #$00
47         sta     irqvec+2        ; High byte is enough
48         rts
49
50 .endproc
51
52
53 .proc   clevel_irq
54
55         ; Is C level interrupt request vector set?
56         lda     irqvec+2        ; High byte is enough
57         bne     @L1
58         clc                     ; Interrupt not handled
59         rts
60
61         ; Save our zero page locations
62 @L1:    ldx     #zpspace-1
63 @L2:    lda     sp,x
64         sta     zpsave,x
65         dex
66         bpl     @L2
67
68         ; Set C level interrupt stack
69         lda     irqsp
70         ldx     irqsp+1
71         sta     sp
72         stx     sp+1
73
74         ; Call C level interrupt request handler
75         jsr     irqvec
76
77         ; Copy back our zero page content
78         ldx     #zpspace-1
79 @L3:    ldy     zpsave,x
80         sty     sp,x
81         dex
82         bpl     @L3
83
84         ; Mark interrupt handled / not handled and return
85         lsr
86         rts
87
88 .endproc
89
90 ; ---------------------------------------------------------------------------
91
92 .data
93
94 irqvec: jmp     $00FF           ; Patched at runtime
95
96 ; ---------------------------------------------------------------------------
97
98 .bss
99
100 irqsp:  .res    2
101
102 zpsave: .res    zpspace