-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinterrupt.s
57 lines (48 loc) · 1.19 KB
/
interrupt.s
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
; ======[interrupt.s]======
;
; Interrupt handler
;
; Stops execution on BRK
;
; Handles ACIA receive on hardware interrupt
.include "athena.inc"
.export _irq_int, _nmi_int
.import _ACIA_RXBUF
.import _ACIA_RX_RPTR
.import _ACIA_RX_WPTR
.segment "CODE"
; Force 65C02 assembly
.PC02
; ======
; NMI service routine
; ======
_nmi_int:
rti ; Return from all NMIs
; ======
; IRQ service routine
; ======
_irq_int:
phx ; push X to stack
tsx ; transfer stack pointer to X
pha ; push A to stack
inx
inx ; inc X to point to status register on stack
lda $100,x ; load status register into A
and #$10 ; test B status bit (bit 4)
bne break ; if B=1, interrupt is software BRK
; IRQ detected
irq:
lda ACIA_STATUS
and #%10001000 ; test interrupt and Rx bits
beq endirq ; end if bits not set
lda ACIA_DATA ; a = Rx data
ldx _ACIA_RX_WPTR ; x = wptr
sta _ACIA_RXBUF,x ; rxbuf[wptr] = a
inc _ACIA_RX_WPTR ; ++wptr
endirq:
pla ; restore A
plx ; restore X
rti
; BRK detected
break:
stp ; something has gone wrong