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