aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/avr8/drivers/generic-isr.asm
blob: e0aeaed6618859d1795cd8cea0383f6905c436e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
; ISR routines
.eseg
intvec: .byte INTVECTORS * CELLSIZE
.dseg
intcnt: .byte INTVECTORS
.cseg

; interrupt routine gets called (again) by rcall! This gives the
; address of the int-vector on the stack.
isr:
    st -Y, r0
    in r0, SREG
    st -Y, r0
.if (pclen==3)
    pop r0 ; some 128+K Flash devices use 3 cells for call/ret
.endif
    pop r0
    pop r0          ; = intnum * intvectorsize + 1 (address following the rcall)
    dec r0
.if intvecsize == 1 ;
    lsl r0
.endif
    mov isrflag, r0
    push zh
    push zl
    ldi zl, low(intcnt)
    ldi zh, high(intcnt)
    lsr r0 ; we use byte addresses in the counter array, not words
    add zl, r0
    adc zh, zeroh
    ld r0, Z
    inc r0
    st Z, r0
    pop zl
    pop zh

    ld r0, Y+
    out SREG, r0
    ld r0, Y+
    ret ; returns the interrupt, the rcall stack frame is removed!
    ; no reti here, see words/isr-end.asm