started working on interrupts
[psx_test1] / src / intr.h
1 #ifndef INTR_H_
2 #define INTR_H_
3
4 #include "psxregs.h"
5
6 #define NUM_IRQS        11
7
8 struct intr_frame {
9         uint32_t sr, cause, epc;
10         uint32_t r[29];         /* 29 regs, don't save zero, k0, and k1 */
11         uint32_t lo, hi;
12 } __attribute__ ((packed));
13
14 void intr_init(void);
15
16 /* set CP0 SR (reg 12) IM bits (8-15) to enable all interrupts */
17 #define enable() \
18         asm volatile ( \
19                 "mfc0 $12, $8\n\t" \
20                 "nop\n\t" \
21                 "ori $8, $8, 0xff00\n\t" \
22                 "nop\n\t" \
23                 "mtc0 $12, $8\n\t" \
24                 ::: "$8")
25
26 /* clear CP0 SR (reg 12) IM bits (8-15) to disable all interrupts */
27 #define disable() \
28         asm volatile ( \
29                 "lui $9, 0xffff\n\t" \
30                 "mfc0 $12, $8\n\t" \
31                 "ori $9, $9, 0x00ff\n\t" \
32                 "nop\n\t" \
33                 "and $8, $8, $9\n\t" \
34                 "nop\n\t" \
35                 "mtc0 $12, $8\n\t" \
36                 ::: "$8", "$9")
37
38 #define mask_all()              (REG_IMASK = 0x7ff)
39 #define unmask_all()    (REG_IMASK = 0)
40
41 #define mask_irq(n)             (REG_IMASK &= ~(1 << (n)))
42 #define unmask_irq(n)   (REG_IMASK |= 1 << (n))
43
44 #define ack_irq(n)              (REG_ISTAT = 1 << (n))
45 #define irq_status(n)   (REG_ISTAT & (1 << (n)))
46
47 void set_irq_handler(int irq, void (*func)(struct intr_frame*));
48
49 #endif  /* INTR_H_ */